{"assets/corner-core.js":"/* soooks-theme:corner:169557:f0936d16eeb03eeb */\n/* Corner — storefront core: overlays, header, search, announcement, cart drawer, add to cart, forms, reveals.\n   Commerce goes through window.Soooks (the platform's theme runtime): storefront API, cart (+ the soooks:cart:change\n   event), money, products and variants, forms, search, in-place navigation, design mode, motion, the shared scan.\n   Loads first (alphabetical: corner-core → corner-product → corner-sections); helpers the other files share are on\n   window.Corner. Hooks are data-cn-* attributes; state classes are is-*.\n\n   HOOKS\n   Overlays   [data-cn-overlay]#id (a full-screen layer; .is-open shows it) · [data-cn-open=\"id\"] opens it (focus moves\n              to [data-cn-autofocus] or the first control, Tab stays inside, Esc / [data-cn-close] / the scrim close it\n              and focus returns to the opener; the page stops scrolling while one is open).\n   Cart       [data-cn-drawer] cart drawer · a[data-cn-open-cart] (the header's cart link) opens it · [data-cn-cart-count] badge\n              · [data-cn-cart-count-label] \"(n)\" · [data-cn-checkout] (disabled in the theme editor).\n   Add        form[data-cn-atc][data-product-id] with input[name=\"variant_id\"], [data-cn-qty-input], [data-cn-atc-btn]\n              (data-label-adding/-added/-default/-soldout/-unavailable), [data-cn-atc-note], [data-cn-buynow].\n              [data-cn-quickadd][data-product-id][data-variant-id][data-slug][data-has-variants=\"true|false\"].\n   Qty        [data-cn-qty] > [data-cn-qty-step=\"-1|1\"] + [data-cn-qty-input] (data-available caps it).\n   Cart page  [data-cn-cart-page] (data-msg-stock) > [data-cn-cart-line=\"id\"] ([data-cn-qty-input], [data-cn-remove],\n              [data-cn-line-total], [data-cn-line-note]) · [data-cn-subtotal] · [data-cn-cart-note] · [data-cn-checkout].\n   Search     [data-cn-search] overlay > form[data-cn-search-form] > [data-cn-search-input] · [data-cn-search-results]\n              · [data-cn-search-quick] (hidden while results show).\n   Forms      form[data-cn-newsletter] / form[data-cn-contact] (+ [data-cn-form-note], data-msg-success) · [data-cn-auth]\n              ([data-cn-auth-tab], form[data-cn-auth-form=\"login|register\"]).\n   Header     [data-cn-header][data-sticky][data-transparent] · [data-cn-nav-item].has-children (is-open).\n   Announce   [data-cn-announce][data-mode][data-speed][data-key] · [data-cn-announce-prev/-next/-close].\n   Reveal     .cn-reveal (is-in when seen, is-settled after) · [data-cn-stagger] children rise in turn.\n   Language   details[data-cn-lang] (snippets/language-picker.liquid): closes on an outside click and on Esc.\n   Links      every store address the script builds goes through url() — \"/cart\" → \"/fr/cart\" on a French page.\n\n   window.Corner = { addToCart(payload) → Promise<cart>, refreshCart(), getCart(), openCart(), closeCart(),\n     openOverlay(elOrId, opener), closeOverlay(el), money(cents), toast(text, { error, link: { href, label } }),\n     api(path, init), motion(), isRtl(el), inPreview(), url(path) }\n   EVENTS (on document)  cn:overlay:open / cn:overlay:close { overlay }. Cart changes: soooks:cart:change (the runtime). */\n(function () {\n  'use strict';\n  var S = window.Soooks;\n  if (!S) return;\n\n  /* ---------- motion ----------\n     How much moves: Theme settings → Animation and the visitor's reduce-motion preference (S.motion). Durations and\n     easings are the --cn-dur-* / --cn-ease-* tokens in corner-base.css. */\n  function token(name) { var r = S.root() || document.documentElement; return getComputedStyle(r).getPropertyValue('--cn-' + name).trim(); }\n  function dur(name, fallback) {\n    var v = token('dur-' + name), n = parseFloat(v);\n    return isNaN(n) ? fallback : (/ms$/.test(v) ? n : n * 1000);\n  }\n  function rootRtl() { var r = S.root(); return !!(r && r.closest('[dir=\"rtl\"]')) || document.documentElement.dir === 'rtl'; }\n  // A value that just changed in place (price, total) settles in.\n  function pulse(el) {\n    S.animate(el, [{ opacity: 0.3, transform: 'translateY(3px)' }, { opacity: 1, transform: 'none' }],\n      { duration: dur('base', 220), easing: token('ease-out') || 'ease-out' });\n  }\n  // A row on its way out (cart line removed): fades and slides toward the reading end; resolves when done.\n  function leave(el) {\n    var dx = S.motion() === 'subtle' ? 0 : (rootRtl() ? -14 : 14);\n    var a = S.animate(el, [{ opacity: 0, transform: 'translateX(' + dx + 'px)' }],\n      { duration: dur('exit', 200), easing: token('ease-in') || 'ease-in', fill: 'forwards' });\n    return a && a.finished ? a.finished.catch(function () {}) : Promise.resolve();\n  }\n  /* Add-to-cart buttons: busy while the request runs (a spinner, never the sold-out look), then a short \"added\"\n     state before the label comes back. */\n  function setBusy(btn, on) {\n    btn.classList.toggle('is-busy', on);\n    if (on) btn.setAttribute('aria-busy', 'true'); else btn.removeAttribute('aria-busy');\n  }\n  function clearDone(btn) {\n    var st = btn.__cnDone;\n    if (!st) return;\n    clearTimeout(st.timer);\n    btn.classList.remove('is-added');\n    if (st.label != null && btn.textContent === st.text) btn.textContent = st.label;\n    btn.__cnDone = null;\n  }\n  function showDone(btn, text) {\n    clearDone(btn);\n    var st = { label: text ? btn.textContent : null };\n    if (text) btn.textContent = text;\n    st.text = btn.textContent;\n    btn.classList.add('is-added');\n    st.timer = setTimeout(function () { if (btn.__cnDone === st) clearDone(btn); }, dur('done', 1200));\n    btn.__cnDone = st;\n  }\n\n  /* ---------- helpers ---------- */\n  function esc(s) {\n    return String(s == null ? '' : s).replace(/[&<>\"']/g, function (c) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]; });\n  }\n  function emit(name, detail) {\n    try { document.dispatchEvent(new CustomEvent(name, { detail: detail })); } catch (e) { /* old browsers */ }\n  }\n  function store(kind) { try { return window[kind]; } catch (e) { return null; } }\n  /** Writing direction of an element (sliders, galleries and zoom follow it). */\n  function isRtl(el) { return getComputedStyle(el || document.documentElement).direction === 'rtl'; }\n  /** The demo and the theme editor preview route in place (the seam S.navigate uses): no history edits there. */\n  function inPreview() { return typeof window.__soooksNavigate === 'function'; }\n  /** A store page's address in the page's language (\"/products/x\" → \"/fr/products/x\" on a French page). Requests\n      (the storefront API, the cart) never go through it. */\n  function url(path) { return S.url ? S.url(path) : path; }\n\n  var noteIcons = {\n    error: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 8v4m0 4h.01\"/></svg>',\n    success: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" aria-hidden=\"true\"><path d=\"m5 13 4 4L19 7\"/></svg>',\n  };\n  function setNote(el, kind, text) {\n    if (!el) return;\n    if (!text) { el.hidden = true; el.innerHTML = ''; return; }\n    el.className = 'cn-note cn-note--' + kind;\n    el.setAttribute('role', kind === 'error' ? 'alert' : 'status');\n    el.innerHTML = noteIcons[kind] + '<span></span>';\n    el.querySelector('span').textContent = text;\n    el.hidden = false;\n    clearTimeout(el.__cnTimer);\n    if (kind === 'success') el.__cnTimer = setTimeout(function () { el.hidden = true; }, 4000);\n  }\n\n  var toastEl = null, toastTimer = null;\n  function toast(text, opts) {\n    opts = opts || {};\n    if (!toastEl || !toastEl.isConnected) {\n      toastEl = document.createElement('div');\n      toastEl.className = 'cn-toast';\n      toastEl.setAttribute('role', 'status');\n      (S.root() || document.body).appendChild(toastEl);\n    }\n    toastEl.classList.toggle('cn-toast--error', !!opts.error);\n    toastEl.innerHTML = '';\n    var span = document.createElement('span');\n    span.textContent = text;\n    toastEl.appendChild(span);\n    if (opts.link && opts.link.href) {\n      var a = document.createElement('a');\n      a.href = opts.link.href; a.textContent = opts.link.label || '';\n      toastEl.appendChild(a);\n    }\n    void toastEl.offsetWidth;\n    toastEl.classList.add('is-visible');\n    clearTimeout(toastTimer);\n    toastTimer = setTimeout(function () { toastEl.classList.remove('is-visible'); }, 3600);\n  }\n\n  /* ---------- overlays: open / close, focus trap, Esc, scroll lock ---------- */\n  var openStack = [];\n  var FOCUSABLE = 'a[href], button:not([disabled]), details > summary, input:not([disabled]):not([type=\"hidden\"]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n  function focusables(el) {\n    return Array.prototype.filter.call(el.querySelectorAll(FOCUSABLE), function (f) {\n      return f.offsetWidth > 0 || f.offsetHeight > 0 || f.getClientRects().length > 0;\n    });\n  }\n  function syncLock() {\n    openStack = openStack.filter(function (o) { return o.el.isConnected && o.el.classList.contains('is-open'); });\n    document.documentElement.classList.toggle('cn-locked', openStack.length > 0);\n  }\n  function setOpeners(el, open) {\n    if (!el.id) return;\n    document.querySelectorAll('[data-cn-open=\"' + el.id + '\"]').forEach(function (b) { b.setAttribute('aria-expanded', open ? 'true' : 'false'); });\n  }\n  function openOverlay(el, opener) {\n    if (typeof el === 'string') el = document.getElementById(el);\n    if (!el) return false;\n    if (el.classList.contains('is-open')) return true;\n    // One overlay at a time, except a layer opened from inside another (the menu drawer's search button).\n    openStack.slice().forEach(function (o) { if (!o.el.contains(opener || null)) closeOverlay(o.el, true); });\n    el.classList.add('is-open');\n    el.setAttribute('aria-hidden', 'false');\n    openStack.push({ el: el, opener: opener || document.activeElement });\n    setOpeners(el, true);\n    syncLock();\n    var header = el.closest('[data-cn-header]');\n    if (header) header.classList.add('is-solid');\n    // Focus after the layer turns visible (visibility flips this frame).\n    setTimeout(function () {\n      if (!el.classList.contains('is-open')) return;\n      var target = el.querySelector('[data-cn-autofocus]') || focusables(el).filter(function (f) { return !f.closest('.cn-overlay__scrim'); })[0];\n      if (target) try { target.focus({ preventScroll: true }); } catch (e) { target.focus(); }\n    }, 30);\n    emit('cn:overlay:open', { overlay: el });\n    return true;\n  }\n  function closeOverlay(el, keepFocus) {\n    if (!el || !el.classList.contains('is-open')) return;\n    el.classList.remove('is-open');\n    el.setAttribute('aria-hidden', 'true');\n    setOpeners(el, false);\n    var entry = null;\n    openStack = openStack.filter(function (o) { if (o.el === el) { entry = o; return false; } return true; });\n    syncLock();\n    var header = el.closest('[data-cn-header]');\n    if (header) updateHeaderState(header);\n    if (!keepFocus && entry && entry.opener && entry.opener.isConnected && entry.opener.focus) {\n      try { entry.opener.focus({ preventScroll: true }); } catch (e) { /* gone */ }\n    }\n    emit('cn:overlay:close', { overlay: el });\n  }\n  function topOverlay() { syncLock(); return openStack.length ? openStack[openStack.length - 1].el : null; }\n\n  document.addEventListener('click', function (ev) {\n    var opener = ev.target.closest('[data-cn-open]');\n    if (opener) {\n      var target = document.getElementById(opener.getAttribute('data-cn-open'));\n      if (target) {\n        ev.preventDefault();\n        if (target.classList.contains('is-open')) closeOverlay(target); else openOverlay(target, opener);\n        return;\n      }\n    }\n    var closer = ev.target.closest('[data-cn-close]');\n    if (closer) {\n      var layer = closer.closest('[data-cn-overlay]');\n      if (layer) {\n        // A real link (Continue shopping) still navigates; buttons and the scrim only close.\n        var href = closer.tagName === 'A' ? closer.getAttribute('href') : null;\n        if (!href || href === '#') ev.preventDefault();\n        closeOverlay(layer, !!href && href !== '#');\n      }\n    }\n  });\n  document.addEventListener('keydown', function (ev) {\n    if (ev.key === 'Escape') {\n      var top = topOverlay();\n      if (top) { closeOverlay(top); return; }\n      closeNavItems(true);\n      return;\n    }\n    if (ev.key !== 'Tab') return;\n    var layer = topOverlay();\n    if (!layer) return;\n    var list = focusables(layer).filter(function (f) { return !f.closest('.cn-overlay__scrim'); });\n    if (!list.length) return;\n    var first = list[0], last = list[list.length - 1];\n    if (!layer.contains(document.activeElement)) { ev.preventDefault(); first.focus(); return; }\n    if (ev.shiftKey && document.activeElement === first) { ev.preventDefault(); last.focus(); }\n    else if (!ev.shiftKey && document.activeElement === last) { ev.preventDefault(); first.focus(); }\n  });\n\n  /* ---------- skip link: jumps past the header to the page's first own section ---------- */\n  document.addEventListener('click', function (ev) {\n    var skip = ev.target.closest('[data-cn-skip]');\n    if (!skip) return;\n    var first = document.querySelector('.soooks-section[data-section-scope=\"page\"]');\n    if (!first) return;\n    ev.preventDefault();\n    if (!first.hasAttribute('tabindex')) first.setAttribute('tabindex', '-1');\n    first.focus();\n    first.scrollIntoView({ block: 'start', behavior: S.motion() === 'none' ? 'auto' : 'smooth' });\n  });\n\n\n  /* ---------- announcement bar ---------- */\n  function initAnnouncements(root) {\n    root.querySelectorAll('[data-cn-announce]').forEach(function (bar) {\n      if (!S.once(bar)) return;\n      var key = 'cn-announce-hidden:' + (bar.getAttribute('data-key') || '');\n      var session = store('sessionStorage');\n      if (!S.designMode() && session) { try { if (session.getItem(key)) { bar.hidden = true; return; } } catch (e) { /* blocked */ } }\n      var close = bar.querySelector('[data-cn-announce-close]');\n      if (close) close.addEventListener('click', function () {\n        bar.hidden = true;\n        if (!S.designMode() && session) try { session.setItem(key, '1'); } catch (e) { /* blocked */ }\n      });\n      if (bar.getAttribute('data-mode') !== 'rotate') return;\n      var msgs = Array.prototype.slice.call(bar.querySelectorAll('.cn-announce__msg'));\n      if (msgs.length < 2) return;\n      var i = 0, timer = null, paused = false;\n      function show(n) {\n        i = (n + msgs.length) % msgs.length;\n        msgs.forEach(function (m, k) {\n          var on = k === i;\n          m.classList.toggle('is-active', on);\n          if (on) m.removeAttribute('aria-hidden'); else m.setAttribute('aria-hidden', 'true');\n          m.querySelectorAll('a').forEach(function (a) { if (on) a.removeAttribute('tabindex'); else a.setAttribute('tabindex', '-1'); });\n        });\n      }\n      function stop() { clearInterval(timer); timer = null; }\n      function start() {\n        stop();\n        // Autoplay is the one loop Corner keeps — and it stops for reduced motion and Animation: None.\n        if (S.motion() === 'none' || paused) return;\n        var speed = Math.max(3, Number(bar.getAttribute('data-speed')) || 5) * 1000;\n        timer = setInterval(function () { if (!bar.isConnected) { stop(); return; } show(i + 1); }, speed);\n      }\n      var prev = bar.querySelector('[data-cn-announce-prev]'), next = bar.querySelector('[data-cn-announce-next]');\n      if (prev) prev.addEventListener('click', function () { show(i - 1); start(); });\n      if (next) next.addEventListener('click', function () { show(i + 1); start(); });\n      bar.addEventListener('mouseenter', function () { paused = true; stop(); });\n      bar.addEventListener('mouseleave', function () { paused = false; start(); });\n      bar.addEventListener('focusin', function () { paused = true; stop(); });\n      bar.addEventListener('focusout', function (e) { if (!bar.contains(e.relatedTarget)) { paused = false; start(); } });\n      // Theme editor: the selected message shows and the rotation holds until it's deselected.\n      function onEditor(ev) {\n        if (!bar.isConnected) { document.removeEventListener(ev.type, onEditor); return; }\n        if (!bar.contains(ev.target)) return;\n        if (ev.type === 'soooks:block:select') {\n          var at = msgs.findIndex(function (m) { return m === ev.target || m.contains(ev.target); });\n          paused = true; stop();\n          if (at > -1) show(at);\n        } else { paused = false; start(); }\n      }\n      document.addEventListener('soooks:block:select', onEditor);\n      document.addEventListener('soooks:block:deselect', onEditor);\n      show(0);\n      start();\n    });\n  }\n\n  /* ---------- header: sticky, transparent, height, menus ---------- */\n  function headerEl() { return document.querySelector('[data-cn-header]'); }\n  function updateHeaderState(header) {\n    header = header || headerEl();\n    if (!header) return;\n    var scrolled = (window.scrollY || window.pageYOffset || 0) > 4;\n    header.classList.toggle('is-scrolled', scrolled);\n    var busy = header.__cnHover || !!header.querySelector('.cn-nav__item.is-open, [data-cn-overlay].is-open');\n    header.classList.toggle('is-solid', header.getAttribute('data-transparent') !== 'true' || scrolled || busy);\n  }\n  function measureHeader(header) {\n    var h = Math.round(header.getBoundingClientRect().height);\n    var sticky = header.getAttribute('data-sticky') === 'true';\n    [document.documentElement, S.root()].forEach(function (el) {\n      if (!el) return;\n      el.style.setProperty('--cn-header-h', h + 'px');\n      el.style.setProperty('--cn-sticky-offset', sticky ? h + 'px' : '0px');\n    });\n  }\n  function closeNavItems(refocus, except) {\n    document.querySelectorAll('[data-cn-nav-item].is-open').forEach(function (item) {\n      if (item === except) return;\n      item.classList.remove('is-open');\n      var link = item.querySelector('.cn-nav__link');\n      if (link) {\n        link.setAttribute('aria-expanded', 'false');\n        if (refocus && item.contains(document.activeElement)) link.focus();\n      }\n    });\n    var header = headerEl();\n    if (header) updateHeaderState(header);\n  }\n  function initHeader() {\n    var header = headerEl();\n    if (!header) return;\n    var wrap = header.closest('.soooks-section');\n    if (wrap) wrap.classList.toggle('cn-sticky', header.getAttribute('data-sticky') === 'true');\n    if (!S.once(header)) return;\n    measureHeader(header);\n    if ('ResizeObserver' in window) new ResizeObserver(function () { if (header.isConnected) measureHeader(header); }).observe(header);\n    updateHeaderState(header);\n    header.addEventListener('mouseenter', function () { header.__cnHover = true; updateHeaderState(header); });\n    header.addEventListener('mouseleave', function () { header.__cnHover = false; closeNavItems(false); updateHeaderState(header); });\n    var lastPointer = 'mouse';\n    header.addEventListener('pointerdown', function (e) { lastPointer = e.pointerType || 'mouse'; });\n    header.querySelectorAll('[data-cn-nav-item].has-children').forEach(function (item) {\n      var link = item.querySelector('.cn-nav__link');\n      var open = function () {\n        closeNavItems(false, item);\n        item.classList.add('is-open');\n        if (link) link.setAttribute('aria-expanded', 'true');\n        updateHeaderState(header);\n      };\n      var shut = function () {\n        item.classList.remove('is-open');\n        if (link) link.setAttribute('aria-expanded', 'false');\n        updateHeaderState(header);\n      };\n      item.addEventListener('mouseenter', function () { if (lastPointer === 'mouse') open(); });\n      item.addEventListener('mouseleave', function () { if (lastPointer === 'mouse') shut(); });\n      item.addEventListener('focusout', function (e) { if (!item.contains(e.relatedTarget)) shut(); });\n      if (link) {\n        link.addEventListener('click', function (e) {\n          // Touch: the first tap opens the menu, the second follows the link.\n          if (lastPointer !== 'mouse' && !item.classList.contains('is-open')) { e.preventDefault(); open(); }\n        });\n        link.addEventListener('keydown', function (e) {\n          if (e.key === 'ArrowDown') { e.preventDefault(); open(); var f = item.querySelector('.cn-dropdown a, .cn-mega a'); if (f) f.focus(); }\n        });\n      }\n      // A choice made inside the menu closes it (in-place navigation keeps the header on screen).\n      item.querySelectorAll('.cn-dropdown a, .cn-mega a').forEach(function (a) {\n        a.addEventListener('click', function () { shut(); if (a.blur) a.blur(); });\n      });\n    });\n  }\n  window.addEventListener('scroll', function () { var h = headerEl(); if (h) updateHeaderState(h); }, { passive: true });\n  document.addEventListener('click', function (ev) {\n    if (!ev.target.closest('[data-cn-nav-item]')) closeNavItems(false);\n  });\n\n  /* ---------- language picker ----------\n     A <details> that opens and closes by itself; an open list closes when the shopper clicks elsewhere or presses Esc\n     (focus goes back to its button). One open at a time. */\n  document.addEventListener('click', function (ev) {\n    document.querySelectorAll('details[data-cn-lang][open]').forEach(function (d) {\n      if (!d.contains(ev.target)) d.removeAttribute('open');\n    });\n  });\n  // Captured first, so Esc inside the mobile menu's list closes the list, not the whole menu.\n  document.addEventListener('keydown', function (ev) {\n    if (ev.key !== 'Escape') return;\n    var open = ev.target.closest && ev.target.closest('details[data-cn-lang][open]');\n    if (!open) return;\n    ev.stopPropagation();\n    open.removeAttribute('open');\n    var toggle = open.querySelector('summary');\n    if (toggle) toggle.focus();\n  }, true);\n\n  /* ---------- predictive search (S.search) ---------- */\n  function initSearch(root) {\n    root.querySelectorAll('[data-cn-search]').forEach(function (layer) {\n      if (!S.once(layer)) return;\n      var panel = layer.querySelector('[data-label-products]') || layer;\n      var form = layer.querySelector('[data-cn-search-form]');\n      var input = layer.querySelector('[data-cn-search-input]');\n      var results = layer.querySelector('[data-cn-search-results]');\n      var quick = layer.querySelector('[data-cn-search-quick]');\n      if (!form || !input || !results) return;\n      var label = function (k, fb) { return panel.getAttribute('data-label-' + k) || fb; };\n      var timer = null, seq = 0;\n      function clear() { results.innerHTML = ''; if (quick) quick.hidden = false; }\n      function priceHtml(p) {\n        var sale = p.compare_at_price && p.compare_at_price > p.price;\n        return '<span class=\"cn-sresult__price\"><span' + (sale ? ' class=\"is-sale\"' : '') + '>' + esc(S.money(p.price)) + '</span>'\n          + (sale ? '<s>' + esc(S.money(p.compare_at_price)) + '</s>' : '') + '</span>';\n      }\n      function render(q, data) {\n        var products = (data && data.products) || [];\n        var cols = (data && data.collections) || [];\n        if (quick) quick.hidden = true;\n        if (!products.length && !cols.length) {\n          results.innerHTML = '<p class=\"cn-search__empty\">' + esc(label('empty', 'Nothing found for')) + ' “' + esc(q) + '”</p>';\n          return;\n        }\n        var html = '<div class=\"cn-search__grid\">';\n        if (products.length) {\n          html += '<div><p class=\"cn-search__label\">' + esc(label('products', 'Products')) + '</p><div class=\"cn-search__products\">';\n          products.slice(0, 6).forEach(function (p) {\n            html += '<a class=\"cn-sresult\" href=\"' + esc(url('/products/' + encodeURIComponent(p.slug || ''))) + '\">'\n              + (p.image ? '<img class=\"cn-sresult__img\" src=\"' + esc(p.image) + '\" alt=\"\" loading=\"lazy\" width=\"56\" height=\"56\">' : '<span class=\"cn-sresult__img\"></span>')\n              + '<span><span class=\"cn-sresult__name\">' + esc(p.name) + '</span>' + priceHtml(p) + '</span></a>';\n          });\n          html += '</div></div>';\n        }\n        if (cols.length) {\n          html += '<div><p class=\"cn-search__label\">' + esc(label('collections', 'Collections')) + '</p><div class=\"cn-search__cols\">';\n          cols.forEach(function (c) {\n            html += '<a class=\"cn-sresult\" href=\"' + esc(url('/collections/' + encodeURIComponent(c.slug || ''))) + '\"><span class=\"cn-sresult__name\">' + esc(c.name) + '</span></a>';\n          });\n          html += '</div></div>';\n        }\n        html += '</div><a class=\"cn-btn cn-btn--secondary cn-search__all\" href=\"' + esc(url('/search?q=' + encodeURIComponent(q))) + '\">'\n          + esc(label('view-all', 'View all results')) + '</a>';\n        results.innerHTML = html;\n      }\n      input.addEventListener('input', function () {\n        clearTimeout(timer);\n        var q = input.value.trim();\n        if (q.length < 2) { seq++; clear(); return; }\n        timer = setTimeout(async function () {\n          var mine = ++seq;\n          if (!results.innerHTML) results.innerHTML = '<p class=\"cn-search__loading\">' + esc(label('loading', 'Searching…')) + '</p>';\n          try {\n            var data = await S.search(q, 6);\n            if (mine === seq) render(q, data);\n          } catch (e) { if (mine === seq) clear(); }\n        }, 220);\n      });\n      form.addEventListener('submit', function (e) {\n        e.preventDefault();\n        var q = input.value.trim();\n        if (!q) return;\n        closeOverlay(layer, true);\n        S.navigate('/search?q=' + encodeURIComponent(q));\n      });\n      // Following a result closes the panel (in-place navigation keeps the page underneath).\n      results.addEventListener('click', function (e) { if (e.target.closest('a')) closeOverlay(layer, true); });\n      if (quick) quick.addEventListener('click', function (e) { if (e.target.closest('a')) closeOverlay(layer, true); });\n    });\n  }\n\n  /* ---------- cart state + drawer ----------\n     Every cart request goes through S.cart; the page follows its soooks:cart:change event (badge, drawer, cart page). */\n  var cartState = null;\n  var countShown = false;\n  var recsCache = null, recsLoading = false;\n  var leavingRow = null; // a drawer line being removed slides out before the cart redraws\n\n  function updateCount(cart) {\n    var count = S.cart.count(cart);\n    var label = count > 99 ? '99+' : String(count);\n    document.querySelectorAll('[data-cn-cart-count]').forEach(function (el) {\n      var changed = el.textContent !== label;\n      if (changed) el.textContent = label;\n      el.classList.toggle('is-visible', count > 0);\n      // A small bump when the count changes — not for the count the page loads with.\n      if (changed && countShown && count > 0) {\n        var s = S.motion() === 'subtle' ? 1.1 : 1.25;\n        S.animate(el, [{ transform: 'scale(1)' }, { transform: 'scale(' + s + ')' }, { transform: 'scale(1)' }],\n          { duration: dur('bump', 300), easing: token('ease-out') || 'ease-out' });\n      }\n    });\n    document.querySelectorAll('[data-cn-cart-count-label]').forEach(function (el) { el.textContent = count > 0 ? '(' + label + ')' : ''; });\n    countShown = true;\n  }\n\n  function drawerEl() { return document.querySelector('[data-cn-drawer]'); }\n  function dlabel(name, fallback) { var d = drawerEl(); return (d && d.getAttribute(name)) || fallback; }\n  var ICON_MINUS = '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M5 12h14\"/></svg>';\n  var ICON_PLUS = '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M12 5v14M5 12h14\"/></svg>';\n\n  function renderShipping(drawer, items) {\n    var box = drawer.querySelector('[data-cn-drawer-ship]');\n    var note = drawer.querySelector('[data-cn-drawer-note]');\n    var fs = cartState && cartState.free_shipping;\n    var show = !!(fs && fs.threshold && items.length);\n    if (box) {\n      box.hidden = !show;\n      if (show) {\n        var done = Number(fs.remaining || 0) <= 0;\n        box.classList.toggle('is-done', done);\n        var text = box.querySelector('[data-cn-drawer-ship-text]');\n        if (text) text.textContent = done ? dlabel('data-msg-shipping-done', 'Your order ships free')\n          : dlabel('data-msg-shipping-left', \"You're {amount} away from free shipping\").replace('{amount}', S.money(fs.remaining));\n        var bar = box.querySelector('[data-cn-drawer-ship-bar]');\n        var pct = Math.max(0, Math.min(100, Number(fs.progress || 0)));\n        if (bar) {\n          bar.setAttribute('aria-valuenow', String(pct));\n          var fill = bar.querySelector('span');\n          if (fill) fill.style.setProperty('--p', String(pct / 100));\n        }\n      }\n    }\n    if (note) note.hidden = show;\n  }\n\n  function renderDrawer() {\n    var drawer = drawerEl();\n    if (!drawer) return;\n    var linesEl = drawer.querySelector('[data-cn-drawer-lines]');\n    var footEl = drawer.querySelector('[data-cn-drawer-foot]');\n    var emptyEl = drawer.querySelector('[data-cn-drawer-empty]');\n    var items = (cartState && cartState.items) || [];\n    if (!linesEl) return;\n    linesEl.innerHTML = '';\n    var hasItems = items.length > 0;\n    if (emptyEl) emptyEl.hidden = hasItems;\n    if (footEl) footEl.hidden = !hasItems;\n    renderShipping(drawer, items);\n    items.forEach(function (item) { linesEl.appendChild(drawerLine(drawer, item)); });\n    var discEl = drawer.querySelector('[data-cn-drawer-discounts]');\n    if (discEl) {\n      var disc = (cartState && cartState.discounts) || [];\n      discEl.innerHTML = '';\n      discEl.hidden = !disc.length;\n      disc.forEach(function (d) {\n        var p = document.createElement('p');\n        p.className = 'cn-drawer__discount';\n        var t = document.createElement('span'); t.textContent = d.title || dlabel('data-label-discount', 'Discount');\n        var a = document.createElement('span'); a.textContent = '−' + S.money(d.amount);\n        p.appendChild(t); p.appendChild(a); discEl.appendChild(p);\n      });\n    }\n    var totalEl = drawer.querySelector('[data-cn-drawer-total]');\n    if (totalEl && cartState) totalEl.textContent = S.money(S.cart.subtotal(cartState));\n    var noteInput = drawer.querySelector('[data-cn-drawer-note-input]');\n    if (noteInput && cartState && document.activeElement !== noteInput) noteInput.value = cartState.note || '';\n    renderRecs(drawer, items);\n  }\n\n  /* One drawer line: picture, name + line total, variant, quantity stepper, remove, note. */\n  function drawerLine(drawer, item) {\n    var href = url('/products/' + encodeURIComponent(item.slug || ''));\n    var row = document.createElement('div');\n    row.className = 'cn-dline';\n    row.setAttribute('data-cn-line', item.id);\n    var media = document.createElement('a');\n    media.className = 'cn-dline__media';\n    media.href = href;\n    media.tabIndex = -1;\n    media.setAttribute('aria-hidden', 'true');\n    var img = document.createElement('img');\n    img.className = 'cn-dline__img';\n    img.alt = '';\n    img.loading = 'lazy';\n    img.src = item.image || drawer.getAttribute('data-placeholder') || '';\n    media.appendChild(img);\n    row.appendChild(media);\n    var body = document.createElement('div');\n    var top = document.createElement('div');\n    top.className = 'cn-dline__top';\n    var name = document.createElement('a');\n    name.className = 'cn-dline__name';\n    name.href = href;\n    name.textContent = item.name || item.product_name || '';\n    var price = document.createElement('span');\n    price.className = 'cn-dline__price';\n    price.textContent = S.money(S.cart.lineTotal(item));\n    top.appendChild(name); top.appendChild(price);\n    body.appendChild(top);\n    if (item.variant_title && item.variant_title !== 'Default Title') {\n      var vt = document.createElement('p');\n      vt.className = 'cn-dline__variant';\n      vt.textContent = item.variant_title;\n      body.appendChild(vt);\n    }\n    var rowBottom = document.createElement('div');\n    rowBottom.className = 'cn-dline__row';\n    var qty = document.createElement('div');\n    qty.className = 'cn-qty';\n    qty.setAttribute('data-cn-qty', '');\n    var minus = document.createElement('button');\n    minus.type = 'button'; minus.setAttribute('data-cn-qty-step', '-1'); minus.setAttribute('aria-label', dlabel('data-label-decrease', 'Decrease quantity'));\n    minus.innerHTML = ICON_MINUS;\n    var input = document.createElement('input');\n    input.type = 'number'; input.min = '0'; input.value = item.quantity; input.inputMode = 'numeric';\n    input.setAttribute('data-cn-qty-input', '');\n    input.setAttribute('aria-label', dlabel('data-label-quantity', 'Quantity'));\n    if (item.available != null) input.setAttribute('data-available', item.available);\n    var plus = document.createElement('button');\n    plus.type = 'button'; plus.setAttribute('data-cn-qty-step', '1'); plus.setAttribute('aria-label', dlabel('data-label-increase', 'Increase quantity'));\n    plus.innerHTML = ICON_PLUS;\n    if (item.available != null && Number(item.quantity) >= Number(item.available)) plus.disabled = true;\n    qty.appendChild(minus); qty.appendChild(input); qty.appendChild(plus);\n    var remove = document.createElement('button');\n    remove.type = 'button';\n    remove.className = 'cn-dline__remove';\n    remove.textContent = dlabel('data-label-remove', 'Remove');\n    rowBottom.appendChild(qty); rowBottom.appendChild(remove);\n    body.appendChild(rowBottom);\n    var note = document.createElement('div');\n    note.className = 'cn-note';\n    note.hidden = true;\n    body.appendChild(note);\n    row.appendChild(body);\n\n    async function setQty(wanted) {\n      var max = input.getAttribute('data-available');\n      if (max !== null && max !== '' && wanted > Number(max)) {\n        wanted = Number(max);\n        input.value = wanted;\n        setNote(note, 'error', dlabel('data-msg-stock', 'Only {count} in stock.').replace('{count}', max));\n      } else {\n        setNote(note, 'error', '');\n      }\n      input.disabled = true;\n      row.classList.add('is-pending');\n      try {\n        // A removed line slides out before the list is redrawn; a changed one shows its new price settling in.\n        if (wanted === 0) leavingRow = row;\n        await S.cart.update(item.id, wanted);\n        if (wanted > 0) {\n          pulse(drawer.querySelector('[data-cn-line=\"' + item.id + '\"] .cn-dline__price'));\n          pulse(drawer.querySelector('[data-cn-drawer-total]'));\n          var again = drawer.querySelector('[data-cn-line=\"' + item.id + '\"] [data-cn-qty-input]');\n          if (again && document.activeElement === document.body) again.focus();\n        }\n      } catch (e) {\n        if (leavingRow === row) leavingRow = null;\n        row.classList.remove('is-pending');\n        setNote(note, 'error', e.message);\n        input.disabled = false;\n        try { await S.cart.get(); } catch (e2) { /* keep note */ }\n      }\n    }\n    minus.addEventListener('click', function () { setQty(Math.max(0, Number(input.value || 0) - 1)); });\n    plus.addEventListener('click', function () { setQty(Number(input.value || 0) + 1); });\n    input.addEventListener('change', function () { setQty(Math.max(0, Number(input.value || 0))); });\n    remove.addEventListener('click', function () { setQty(0); });\n    return row;\n  }\n\n  /* Suggestions under the lines: store products not already in the cart (Theme settings → Cart). */\n  function renderRecs(drawer, items) {\n    var box = drawer.querySelector('[data-cn-drawer-recs]');\n    var list = drawer.querySelector('[data-cn-drawer-recs-list]');\n    if (!box || !list) return;\n    if (drawer.getAttribute('data-recommend') === 'false' || !items.length) { box.hidden = true; return; }\n    if (!recsCache) {\n      if (!recsLoading) {\n        recsLoading = true;\n        S.product.list({ limit: 12 }).then(function (data) {\n          recsCache = Array.isArray(data) ? data : ((data && data.data) || []);\n        }).catch(function () { recsCache = []; }).then(function () { recsLoading = false; renderRecs(drawer, (cartState && cartState.items) || []); });\n      }\n      return;\n    }\n    var inCart = {};\n    items.forEach(function (i) { inCart[String(i.product_id)] = true; inCart[String(i.slug)] = true; });\n    var picks = recsCache.filter(function (p) { return p && !inCart[String(p.id)] && !inCart[String(p.slug)] && p.in_stock !== false; }).slice(0, 3);\n    box.hidden = !picks.length;\n    list.innerHTML = '';\n    picks.forEach(function (p) {\n      var variants = p.variants || [];\n      var multi = p.has_variants === true || variants.length > 1;\n      var href = url('/products/' + encodeURIComponent(p.slug || ''));\n      var row = document.createElement('div');\n      row.className = 'cn-drec';\n      row.innerHTML = '<a href=\"' + esc(href) + '\" tabindex=\"-1\" aria-hidden=\"true\">'\n        + '<img class=\"cn-drec__img\" src=\"' + esc(p.image || drawer.getAttribute('data-placeholder') || '') + '\" alt=\"\" loading=\"lazy\" width=\"56\" height=\"56\"></a>'\n        + '<div><a class=\"cn-drec__name\" href=\"' + esc(href) + '\">' + esc(p.name) + '</a><span class=\"cn-drec__price\">' + esc(S.money(p.price)) + '</span></div>';\n      var btn;\n      if (multi) {\n        btn = document.createElement('a');\n        btn.href = href;\n        btn.className = 'cn-btn cn-btn--secondary cn-btn--sm';\n        btn.textContent = dlabel('data-label-choose', 'Choose options');\n      } else {\n        btn = document.createElement('button');\n        btn.type = 'button';\n        btn.className = 'cn-btn cn-btn--secondary cn-btn--sm';\n        btn.textContent = dlabel('data-label-add', 'Add');\n        btn.addEventListener('click', async function () {\n          btn.disabled = true; setBusy(btn, true);\n          var payload = { product_id: p.id, quantity: 1 };\n          if (variants.length === 1 && variants[0].id != null) payload.variant_id = variants[0].id;\n          try { await addToCart(payload); } catch (e) { toast(e.message, { error: true }); }\n          finally { if (btn.isConnected) { setBusy(btn, false); btn.disabled = false; } }\n        });\n      }\n      row.appendChild(btn);\n      list.appendChild(row);\n    });\n  }\n\n  function applyCart(cart) {\n    cartState = cart || cartState;\n    updateCount(cartState);\n    renderDrawer();\n    syncCartPage();\n  }\n  document.addEventListener('soooks:cart:change', function (ev) {\n    var d = ev.detail || {};\n    // The note saves as it is typed; nothing else on the page changes with it.\n    if (d.reason === 'note') return;\n    var row = d.reason === 'remove' ? leavingRow : null;\n    leavingRow = null;\n    if (row && row.isConnected) leave(row).then(function () { applyCart(d.cart); });\n    else applyCart(d.cart);\n  });\n\n  function cartType() { var r = S.root(); return (r && r.getAttribute('data-cart-type')) || 'drawer'; }\n  function openDrawer(opener) {\n    var drawer = drawerEl();\n    if (!drawer) return false;\n    return openOverlay(drawer, opener);\n  }\n  function closeDrawer() { var d = drawerEl(); if (d) closeOverlay(d); }\n\n  function initDrawer(root) {\n    var drawer = drawerEl();\n    if (drawer && S.once(drawer)) {\n      var checkout = drawer.querySelector('[data-cn-checkout]');\n      if (checkout) {\n        checkout.addEventListener('click', function (ev) {\n          if (S.designMode()) { ev.preventDefault(); toast(dlabel('data-msg-editor-checkout', 'Checkout is turned off in the theme editor.')); }\n        });\n      }\n      var noteInput = drawer.querySelector('[data-cn-drawer-note-input]');\n      if (noteInput) {\n        var noteTimer = null;\n        noteInput.addEventListener('input', function () {\n          clearTimeout(noteTimer);\n          noteTimer = setTimeout(function () { S.cart.note(noteInput.value).catch(function () {}); }, 700);\n        });\n      }\n      if (cartState) renderDrawer();\n    }\n    // Header cart icon opens the drawer instead of navigating (unless the store sends shoppers to the cart page).\n    // Not by its address: on a page in another language the link reads \"/fr/cart\".\n    root.querySelectorAll('a[data-cn-open-cart]').forEach(function (a) {\n      if (!S.once(a)) return;\n      a.setAttribute('aria-haspopup', 'dialog');\n      a.addEventListener('click', function (ev) {\n        if (cartType() === 'page' || !drawerEl()) return;\n        ev.preventDefault();\n        openDrawer(a);\n      });\n    });\n  }\n\n  async function refreshCart() {\n    try { await S.cart.get(); } catch (e) { /* guest without a cart */ }\n    countShown = true;\n    return cartState;\n  }\n  /* The cart the page opens with: none is asked for when the visitor has no cart (the count and the drawer are\n     already drawn empty). */\n  async function loadCart() {\n    try { if (!(await S.cart.load())) applyCart(null); } catch (e) { /* guest without a cart */ }\n    countShown = true;\n  }\n\n  /* Add, then open the drawer (or go to the cart page when the store uses one). */\n  async function addToCart(payload) {\n    var cart = await S.cart.add(payload);\n    if (cartType() === 'page' && !S.designMode()) { S.navigate('/cart'); return cart; }\n    if (cartType() === 'page' || !openDrawer()) {\n      toast(dlabel('data-msg-added', 'Added to your cart'), { link: { href: url('/cart'), label: dlabel('data-label-view-cart', 'View cart') } });\n    }\n    return cart;\n  }\n  // Theme editor: the cart drawer opens while its section is selected (it's otherwise hidden), and closes after.\n  document.addEventListener('soooks:section:select', function (ev) { if (ev.detail && ev.detail.sectionType === 'cart-drawer') openDrawer(); });\n  document.addEventListener('soooks:section:deselect', function (ev) {\n    if (ev.detail && ev.detail.sectionType === 'cart-drawer') { var d = drawerEl(); if (d) closeOverlay(d); }\n  });\n\n  /* ---------- buy it now: add, then straight to checkout ---------- */\n  function initBuyNow(root) {\n    root.querySelectorAll('[data-cn-buynow]').forEach(function (btn) {\n      if (!S.once(btn, 'buynow')) return;\n      btn.addEventListener('click', function () {\n        var form = btn.closest('form[data-cn-atc]') || document.getElementById(btn.getAttribute('form') || '');\n        var atc = form && form.querySelector('[data-cn-atc-btn]');\n        if (!form || (atc && atc.disabled)) return;\n        form.setAttribute('data-buy-now', '');\n        if (form.requestSubmit) form.requestSubmit();\n        else form.dispatchEvent(new Event('submit', { cancelable: true }));\n        setTimeout(function () { form.removeAttribute('data-buy-now'); }, 4000);\n      });\n    });\n  }\n\n  /* ---------- add-to-cart forms + quick add ---------- */\n  function initAtcForms(root) {\n    root.querySelectorAll('form[data-cn-atc]').forEach(function (form) {\n      if (!S.once(form)) return;\n      form.addEventListener('submit', async function (ev) {\n        ev.preventDefault();\n        var btn = form.querySelector('[data-cn-atc-btn]');\n        var note = form.querySelector('[data-cn-atc-note]');\n        var payload = {\n          product_id: form.getAttribute('data-product-id'),\n          quantity: Math.max(1, Number((form.querySelector('[data-cn-qty-input]') || {}).value || 1)),\n        };\n        var variantInput = form.querySelector('input[name=\"variant_id\"]');\n        if (variantInput && /^\\d+$/.test(variantInput.value)) payload.variant_id = variantInput.value;\n        var buyNow = form.hasAttribute('data-buy-now');\n        if (btn) clearDone(btn);\n        var label = btn ? btn.textContent : '';\n        var added = false;\n        if (btn) { btn.disabled = true; setBusy(btn, true); btn.textContent = btn.getAttribute('data-label-adding') || label; }\n        setNote(note, 'error', '');\n        try {\n          if (buyNow) {\n            await S.cart.add(payload);\n            added = true;\n            if (!S.designMode()) { S.navigate('/checkout'); return; }\n          } else {\n            await addToCart(payload);\n            added = true;\n          }\n        } catch (e) {\n          setNote(note, 'error', e.message);\n        } finally {\n          if (btn) {\n            setBusy(btn, false);\n            btn.disabled = false;\n            btn.textContent = label;\n            if (added) showDone(btn, btn.getAttribute('data-label-added'));\n          }\n        }\n      });\n    });\n  }\n\n  /* ---------- quick add window (products with options) ----------\n     Built once and appended to <body>; filled from S.product.get (the demo answers it too). Text goes in as\n     textContent — never as markup. Variant choice: S.product.resolve / valueState / available / image. */\n  var qaEl = null;\n  function el(tag, cls, text) { var n = document.createElement(tag); if (cls) n.className = cls; if (text != null) n.textContent = text; return n; }\n  function quickAddLayer() {\n    if (qaEl && qaEl.isConnected) return qaEl;\n    qaEl = el('div', 'cn-qa'); // the scheme goes on the panel: a scheme class paints its element's background\n    qaEl.id = 'cn-quickadd';\n    qaEl.setAttribute('data-cn-overlay', '');\n    qaEl.setAttribute('aria-hidden', 'true');\n    var scrim = el('div', 'cn-overlay__scrim'); scrim.setAttribute('data-cn-close', '');\n    var panel = el('div', 'cn-qa__panel scheme-1');\n    panel.setAttribute('role', 'dialog'); panel.setAttribute('aria-modal', 'true'); panel.setAttribute('aria-labelledby', 'cn-qa-title');\n    var close = el('button', 'cn-header__icon cn-qa__close');\n    close.type = 'button'; close.setAttribute('data-cn-close', ''); close.setAttribute('aria-label', dlabel('data-label-close', 'Close'));\n    close.innerHTML = '<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\"/></svg>';\n    panel.appendChild(close);\n    panel.appendChild(el('div', 'cn-qa__body'));\n    qaEl.appendChild(scrim); qaEl.appendChild(panel);\n    document.body.appendChild(qaEl);\n    return qaEl;\n  }\n  function renderQuickAdd(layer, product, startVariantId) {\n    var body = layer.querySelector('.cn-qa__body');\n    body.textContent = '';\n    var variants = product.variants || [];\n    var start = variants.find(function (v) { return String(v.id) === String(startVariantId); })\n      || variants.find(function (v) { return v.in_stock !== false; }) || variants[0] || {};\n    var chosen = Object.assign({}, start.option_values || {});\n\n    var media = el('div', 'cn-qa__media');\n    var img = el('img'); img.alt = product.name || ''; media.appendChild(img);\n    var info = el('div', 'cn-qa__info');\n    var title = el('a', 'cn-qa__title', product.name || ''); title.id = 'cn-qa-title'; title.href = url('/products/' + product.slug);\n    var price = el('p', 'cn-qa__price');\n    info.appendChild(title); info.appendChild(price);\n\n    var groups = [];\n    (product.options || []).forEach(function (opt) {\n      var fs = el('fieldset', 'cn-qa__option');\n      var legend = el('legend', 'cn-qa__legend'); legend.appendChild(document.createTextNode(opt.name + ': '));\n      var current = el('span', 'cn-muted'); legend.appendChild(current); fs.appendChild(legend);\n      var row = el('div', 'cn-qa__values');\n      (opt.values || []).forEach(function (val) {\n        var b = el('button', 'cn-chip', String(val)); b.type = 'button';\n        b.addEventListener('click', function () { chosen[opt.name] = val; update(); });\n        row.appendChild(b);\n      });\n      fs.appendChild(row); info.appendChild(fs);\n      groups.push({ opt: opt, current: current, buttons: row.querySelectorAll('button') });\n    });\n\n    var add = el('button', 'cn-btn cn-btn--wide cn-quickadd'); add.type = 'button';\n    var more = el('a', 'cn-link cn-qa__more', dlabel('data-label-view-details', 'View full details')); more.href = url('/products/' + product.slug);\n    info.appendChild(add); info.appendChild(more);\n    body.appendChild(media); body.appendChild(info);\n    more.addEventListener('click', function (ev) { ev.preventDefault(); closeOverlay(layer, true); S.navigate(more.getAttribute('href')); });\n    title.addEventListener('click', function (ev) { ev.preventDefault(); closeOverlay(layer, true); S.navigate(title.getAttribute('href')); });\n\n    function update() {\n      var v = S.product.resolve(variants, chosen);\n      groups.forEach(function (g) {\n        g.current.textContent = chosen[g.opt.name] || '';\n        g.buttons.forEach(function (b) {\n          b.setAttribute('aria-pressed', String(chosen[g.opt.name]) === b.textContent ? 'true' : 'false');\n          b.classList.toggle('is-unavailable', S.product.valueState(variants, chosen, g.opt.name, b.textContent) !== 'available');\n        });\n      });\n      var cents = v && v.price != null ? v.price : product.price;\n      var was = v ? v.compare_at_price : product.compare_at_price;\n      price.textContent = S.money(cents);\n      if (was && was > cents) { var s = el('s', 'cn-muted', S.money(was)); price.appendChild(document.createTextNode(' ')); price.appendChild(s); }\n      img.src = S.product.image(v) || product.image || (product.images && product.images[0] && (product.images[0].url || product.images[0])) || '';\n      var ok = S.product.available(v);\n      add.disabled = !ok;\n      add.textContent = ok ? dlabel('data-label-add-to-cart', 'Add to cart') : dlabel('data-label-sold-out', 'Sold out');\n      add.dataset.variantId = v ? String(v.id) : '';\n    }\n    add.addEventListener('click', async function () {\n      if (add.disabled) return;\n      setBusy(add, true); add.disabled = true;\n      try {\n        var payload = { product_id: product.id, quantity: 1 };\n        if (/^\\d+$/.test(add.dataset.variantId)) payload.variant_id = add.dataset.variantId;\n        closeOverlay(layer, true);\n        await addToCart(payload);\n      } catch (e) {\n        toast(e.message, { error: true });\n      } finally { setBusy(add, false); add.disabled = false; }\n    });\n    update();\n  }\n  async function openQuickAdd(slug, opener) {\n    var layer = quickAddLayer();\n    setBusy(opener, true);\n    try {\n      var product = await S.product.get(slug);\n      renderQuickAdd(layer, product, opener.getAttribute('data-variant-id'));\n      openOverlay(layer, opener);\n    } catch (e) {\n      S.navigate('/products/' + slug); // the product page always works\n    } finally { setBusy(opener, false); }\n  }\n\n  function initQuickAdd(root) {\n    root.querySelectorAll('[data-cn-quickadd]').forEach(function (btn) {\n      if (!S.once(btn)) return;\n      btn.addEventListener('click', async function (ev) {\n        var slug = btn.getAttribute('data-slug');\n        if (btn.getAttribute('data-has-variants') === 'true') {\n          // Products with options: pick them in a small window, without leaving the page.\n          ev.preventDefault();\n          openQuickAdd(slug, btn);\n          return;\n        }\n        ev.preventDefault();\n        clearDone(btn);\n        btn.disabled = true;\n        setBusy(btn, true);\n        var added = false;\n        try {\n          var payload = { product_id: btn.getAttribute('data-product-id'), quantity: 1 };\n          var vid = btn.getAttribute('data-variant-id') || '';\n          if (/^\\d+$/.test(vid)) payload.variant_id = vid;\n          await addToCart(payload);\n          added = true;\n        } catch (e) {\n          toast(e.message, { error: true });\n        } finally {\n          setBusy(btn, false);\n          btn.disabled = false;\n          if (added) showDone(btn);\n        }\n      });\n    });\n  }\n\n  /* ---------- qty steppers (product page + cart page; the drawer builds its own) ---------- */\n  function initQtySteppers(root) {\n    root.querySelectorAll('[data-cn-qty]').forEach(function (qty) {\n      if (qty.closest('[data-cn-drawer]') || !S.once(qty)) return;\n      var input = qty.querySelector('[data-cn-qty-input]');\n      if (!input) return;\n      qty.querySelectorAll('[data-cn-qty-step]').forEach(function (b) {\n        b.addEventListener('click', function () {\n          var min = Number(input.getAttribute('min') || 1);\n          var next = Math.max(min, Number(input.value || min) + Number(b.getAttribute('data-cn-qty-step')));\n          var max = input.getAttribute('data-available');\n          if (max !== null && max !== '' && Number(max) >= 0) next = Math.min(next, Math.max(min, Number(max)));\n          if (Number(input.value) !== next) {\n            input.value = next;\n            input.dispatchEvent(new Event('change', { bubbles: true }));\n          }\n        });\n      });\n    });\n  }\n\n  /* ---------- cart page ---------- */\n  function syncCartPage() {\n    var page = document.querySelector('[data-cn-cart-page]');\n    if (!page || !cartState) return;\n    var items = cartState.items || [];\n    var hadRows = page.querySelectorAll('[data-cn-cart-line]').length > 0;\n    var leaving = [];\n    page.querySelectorAll('[data-cn-cart-line]').forEach(function (row) {\n      var id = row.getAttribute('data-cn-cart-line');\n      var item = items.find(function (i) { return String(i.id) === String(id); });\n      if (!item) {\n        // Gone from the cart: the row slides out, then leaves the page.\n        if (!row.__cnLeaving) { row.__cnLeaving = true; leaving.push(leave(row).then(function () { row.remove(); })); }\n        return;\n      }\n      var input = row.querySelector('[data-cn-qty-input]');\n      if (input && document.activeElement !== input) {\n        input.value = item.quantity;\n        if (item.available != null) input.setAttribute('data-available', item.available);\n      }\n      var total = row.querySelector('[data-cn-line-total]');\n      if (total) total.textContent = S.money(S.cart.lineTotal(item));\n    });\n    var sub = page.querySelector('[data-cn-subtotal]');\n    if (sub) sub.textContent = S.money(S.cart.subtotal(cartState));\n    // Reload only when the cart was just EMPTIED on this page (rows were rendered and are now gone) so the server\n    // renders the empty state. A cart that LOADS empty must never reload: the guard flag lives on a DOM node the\n    // reload destroys, which made this an endless loop.\n    if (!items.length && hadRows && !S.designMode() && !page.__cnReloaded) {\n      page.__cnReloaded = true;\n      Promise.all(leaving).then(function () { window.location.reload(); });\n    }\n  }\n\n  function initCartPage(root) {\n    var page = root.querySelector('[data-cn-cart-page]');\n    if (!page) return;\n    page.querySelectorAll('[data-cn-cart-line]').forEach(function (row) {\n      if (!S.once(row)) return;\n      var id = row.getAttribute('data-cn-cart-line');\n      var input = row.querySelector('[data-cn-qty-input]');\n      var note = row.querySelector('[data-cn-line-note]');\n      if (input) {\n        input.addEventListener('change', async function () {\n          var wanted = Math.max(0, Number(input.value || 0));\n          var max = input.getAttribute('data-available');\n          if (max !== null && max !== '' && wanted > Number(max)) {\n            wanted = Number(max);\n            input.value = wanted;\n            setNote(note, 'error', (page.getAttribute('data-msg-stock') || 'Only {count} in stock.').replace('{count}', max));\n          } else {\n            setNote(note, 'error', '');\n          }\n          input.disabled = true;\n          row.classList.add('is-pending');\n          try {\n            await S.cart.update(id, wanted);\n            if (wanted > 0) { pulse(row.querySelector('[data-cn-line-total]')); pulse(page.querySelector('[data-cn-subtotal]')); }\n          } catch (e) {\n            setNote(note, 'error', e.message);\n            try { await S.cart.get(); } catch (e2) { /* keep note */ }\n          } finally {\n            input.disabled = false;\n            if (!row.__cnLeaving) row.classList.remove('is-pending');\n          }\n        });\n      }\n      var remove = row.querySelector('[data-cn-remove]');\n      if (remove) {\n        remove.addEventListener('click', async function () {\n          remove.disabled = true;\n          row.classList.add('is-pending');\n          try { await S.cart.remove(id); }\n          catch (e) { setNote(note, 'error', e.message); remove.disabled = false; row.classList.remove('is-pending'); }\n        });\n      }\n    });\n    var noteArea = page.querySelector('[data-cn-cart-note]');\n    if (noteArea && S.once(noteArea)) {\n      var noteTimer = null;\n      noteArea.addEventListener('input', function () {\n        clearTimeout(noteTimer);\n        noteTimer = setTimeout(function () { S.cart.note(noteArea.value).catch(function () {}); }, 700);\n      });\n    }\n    var checkout = page.querySelector('[data-cn-checkout]');\n    if (checkout && S.once(checkout)) {\n      checkout.addEventListener('click', function (ev) {\n        if (S.designMode()) { ev.preventDefault(); toast(dlabel('data-msg-editor-checkout', 'Checkout is turned off in the theme editor.')); }\n      });\n    }\n  }\n\n  /* ---------- newsletter + contact + sign-in (S.forms) ---------- */\n  function initSimpleForms(root) {\n    root.querySelectorAll('form[data-cn-newsletter]').forEach(function (form) {\n      if (!S.once(form)) return;\n      form.addEventListener('submit', async function (ev) {\n        ev.preventDefault();\n        var email = form.querySelector('input[type=\"email\"]');\n        var note = form.parentElement.querySelector('[data-cn-form-note]') || form.querySelector('[data-cn-form-note]');\n        var btn = form.querySelector('button[type=\"submit\"]');\n        if (!email || !email.value) return;\n        if (btn) { btn.disabled = true; setBusy(btn, true); }\n        try {\n          await S.forms.newsletter(email.value);\n          setNote(note, 'success', form.getAttribute('data-msg-success') || 'Thank you — you\\'re on the list.');\n          form.reset();\n        } catch (e) { setNote(note, 'error', e.message); }\n        finally { if (btn) { setBusy(btn, false); btn.disabled = false; } }\n      });\n    });\n    root.querySelectorAll('form[data-cn-contact]').forEach(function (form) {\n      if (!S.once(form)) return;\n      form.addEventListener('submit', async function (ev) {\n        ev.preventDefault();\n        var note = form.querySelector('[data-cn-form-note]');\n        var btn = form.querySelector('button[type=\"submit\"]');\n        if (btn) { btn.disabled = true; setBusy(btn, true); }\n        try {\n          await S.forms.contact(S.forms.values(form));\n          setNote(note, 'success', form.getAttribute('data-msg-success') || 'Thank you — we\\'ll reply soon.');\n          form.reset();\n        } catch (e) { setNote(note, 'error', e.message); }\n        finally { if (btn) { setBusy(btn, false); btn.disabled = false; } }\n      });\n    });\n  }\n\n  function initAccount(root) {\n    var auth = root.querySelector('[data-cn-auth]');\n    if (!auth || !S.once(auth)) return;\n    auth.querySelectorAll('[data-cn-auth-tab]').forEach(function (tab) {\n      tab.addEventListener('click', function () {\n        var kind = tab.getAttribute('data-cn-auth-tab');\n        auth.querySelectorAll('[data-cn-auth-tab]').forEach(function (t) { t.classList.toggle('is-active', t === tab); });\n        auth.querySelectorAll('form[data-cn-auth-form]').forEach(function (f) {\n          f.hidden = f.getAttribute('data-cn-auth-form') !== kind;\n        });\n      });\n    });\n    auth.querySelectorAll('form[data-cn-auth-form]').forEach(function (form) {\n      form.addEventListener('submit', async function (ev) {\n        ev.preventDefault();\n        var note = form.querySelector('[data-cn-form-note]');\n        try {\n          await S.forms.account(form.getAttribute('data-cn-auth-form'), S.forms.values(form));\n          if (!S.designMode()) S.navigate('/account');\n        } catch (e) { setNote(note, 'error', e.message); }\n      });\n    });\n  }\n\n  /* ---------- reveal ---------- */\n  var revealObserver = ('IntersectionObserver' in window)\n    ? new IntersectionObserver(function (entries) {\n        entries.forEach(function (en) {\n          if (en.isIntersecting) {\n            en.target.classList.add('is-in'); revealObserver.unobserve(en.target);\n            var sec = en.target.closest('.soooks-section'); if (sec) sec.setAttribute('data-revealed', '');\n            settle(en.target);\n          }\n        });\n      }, { rootMargin: '0px 0px -6% 0px', threshold: 0.05 })\n    : null;\n  // Once a reveal has played it is done for good: cards added or re-rendered inside it later appear at once.\n  function settle(el) { setTimeout(function () { el.classList.add('is-settled'); }, 900); }\n  /* Every content section arrives with the theme's reveal: one with none of its own gets it on the section\n     itself (never the header, footer, announcement bar or an overlay). It plays in the theme editor too — and a\n     section that has already appeared stays shown when the editor re-renders it, so edits never replay it. */\n  var REVEAL_SKIP = /(^|[-_])(header|footer|announce|announcement|drawer|search|popup|modal|sticky|toast|backtop|compare|cookie|age|password)([-_]|$)/i;\n  function revealsOff() { return token('reveal') === 'off'; }\n  function revealSections(root) {\n    root.querySelectorAll('.soooks-section:not([data-reveal-checked])').forEach(function (sec) {\n      // The section's own root, through the renderer's plain wrapper; not rendered yet → decided on a later scan.\n      var first = sec.firstElementChild;\n      while (first && first.tagName === 'DIV' && !first.className && first.children.length === 1) first = first.firstElementChild;\n      if (!first || (!first.children.length && !first.textContent.trim())) return;\n      sec.setAttribute('data-reveal-checked', '');\n      if (REVEAL_SKIP.test(sec.getAttribute('data-section-type') || '') || /^(HEADER|FOOTER|DIALOG|ASIDE)$/.test(first.tagName)) return;\n      var pos = getComputedStyle(first).position;\n      if (pos === 'fixed' || pos === 'sticky' || sec.querySelector('.cn-reveal')) return;\n      sec.classList.add('cn-reveal');\n    });\n  }\n  function initReveals(root) {\n    var off = revealsOff();\n    if (!off) revealSections(root);\n    root.querySelectorAll('.cn-reveal:not(.is-in)').forEach(function (el) {\n      var sec = el.closest('.soooks-section');\n      if (off || !revealObserver || (S.designMode() && sec && sec !== el && sec.hasAttribute('data-revealed'))) { el.classList.add('is-in', 'is-settled'); return; }\n      if (S.once(el, 'reveal')) revealObserver.observe(el);\n    });\n  }\n\n  /* ---------- shared with corner-product.js and corner-sections.js ---------- */\n  window.Corner = {\n    addToCart: addToCart,\n    refreshCart: refreshCart,\n    getCart: function () { return cartState; },\n    openCart: function () { return openDrawer(); },\n    closeCart: closeDrawer,\n    openOverlay: openOverlay,\n    closeOverlay: closeOverlay,\n    money: S.money,\n    toast: toast,\n    api: S.api,\n    motion: S.motion,\n    isRtl: isRtl,\n    inPreview: inPreview,\n    url: url,\n  };\n\n  /* ---------- boot: one scan (first load, editor re-renders, demo page swaps); every element binds once ---------- */\n  var booted = false;\n  S.scan(function (root) {\n    syncLock();\n    initAnnouncements(root);\n    initHeader();\n    initSearch(root);\n    initReveals(root);\n    initDrawer(root);\n    initAtcForms(root);\n    initBuyNow(root);\n    initQuickAdd(root);\n    initQtySteppers(root);\n    initCartPage(root);\n    initSimpleForms(root);\n    initAccount(root);\n    if (!booted) { booted = true; loadCart(); }\n  });\n})();\n","assets/corner-product.js":"/* soooks-theme:corner:169557:f0936d16eeb03eeb */\n/* Corner — page templates: product gallery, variants, zoom and sticky bar; collection filters, sorting and\n   \"Load more\"; search controls; cart page extras; share buttons.\n   Hooks are data-cn-* attributes; state classes are is-*. Cart requests (add to cart, buy now, quick add, cart\n   page lines) stay in corner-core.js — this file reads the variant JSON (S.product) and mirrors the cart from the\n   runtime's soooks:cart:change event. Bound by the runtime's one scan (S.scan), every element once (S.once).\n   Loads after corner-core.js (window.Corner). */\n(function () {\n  'use strict';\n  var S = window.Soooks, C = window.Corner;\n  if (!S || !C) return;\n\n  /* ---------- shared ---------- */\n  var isRtl = C.isRtl;\n  var inPreview = C.inPreview;\n  function behavior() { return S.motion() === 'none' ? 'auto' : 'smooth'; }\n  /* Relative \"?query\" URLs resolve against the current storefront page; inside the demo and the editor preview the\n     runtime routes in place. The theme editor without that routing stays where it is. */\n  function navTo(url) {\n    if (!inPreview() && S.designMode()) return;\n    S.navigate(url);\n  }\n\n  function pulse(el) {\n    S.animate(el, [{ opacity: 0.35 }, { opacity: 1 }], { duration: 220, easing: 'ease-out' });\n  }\n\n  /* Locks page scroll under an open drawer or zoom view. */\n  var locks = 0;\n  function lockScroll(on) {\n    locks = Math.max(0, locks + (on ? 1 : -1));\n    document.documentElement.classList.toggle('cn-scroll-lock', locks > 0);\n  }\n\n  var FOCUSABLE = 'a[href], button:not([disabled]), input:not([disabled]):not([type=\"hidden\"]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n  function trapFocus(container, e) {\n    if (e.key !== 'Tab') return;\n    var items = Array.prototype.filter.call(container.querySelectorAll(FOCUSABLE), function (el) { return el.offsetParent !== null; });\n    if (!items.length) return;\n    var first = items[0], last = items[items.length - 1];\n    if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); }\n    else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); }\n  }\n\n  /* ---------- product gallery ---------- */\n  var galleries = new WeakMap();\n  function initGallery(sec) {\n    var g = sec.querySelector('[data-cn-gallery]');\n    if (!g) return null;\n    if (galleries.has(g)) return galleries.get(g);\n    var track = g.querySelector('[data-cn-gallery-track]');\n    var slides = Array.prototype.slice.call(g.querySelectorAll('[data-cn-slide]'));\n    var thumbs = Array.prototype.slice.call(g.querySelectorAll('[data-cn-gallery-thumb]'));\n    var dots = Array.prototype.slice.call(g.querySelectorAll('[data-cn-gallery-dot]'));\n    var prev = g.querySelector('[data-cn-gallery-prev]');\n    var next = g.querySelector('[data-cn-gallery-next]');\n    var index = 0;\n\n    function scrollable() { return track && track.scrollWidth > track.clientWidth + 2; }\n    function keepVisible(rail, el) {\n      if (!rail || !el) return;\n      var r = rail.getBoundingClientRect(), e = el.getBoundingClientRect();\n      if (rail.scrollWidth > rail.clientWidth + 1) {\n        if (e.left < r.left) rail.scrollLeft -= (r.left - e.left) + 8;\n        else if (e.right > r.right) rail.scrollLeft += (e.right - r.right) + 8;\n      }\n      if (rail.scrollHeight > rail.clientHeight + 1) {\n        if (e.top < r.top) rail.scrollTop -= (r.top - e.top) + 8;\n        else if (e.bottom > r.bottom) rail.scrollTop += (e.bottom - r.bottom) + 8;\n      }\n    }\n    function setActive(i) {\n      index = i;\n      slides.forEach(function (s, k) { s.classList.toggle('is-active', k === i); });\n      [thumbs, dots].forEach(function (list) {\n        list.forEach(function (b, k) {\n          b.classList.toggle('is-active', k === i);\n          if (k === i) b.setAttribute('aria-current', 'true'); else b.removeAttribute('aria-current');\n        });\n      });\n      if (prev) prev.disabled = i <= 0;\n      if (next) next.disabled = i >= slides.length - 1;\n      if (thumbs[i]) keepVisible(thumbs[i].parentElement, thumbs[i]);\n    }\n    function go(i, smooth) {\n      if (!slides.length) return;\n      i = Math.max(0, Math.min(slides.length - 1, i));\n      if (scrollable()) {\n        // Offsets relative to the first slide: negative in right-to-left, which is exactly scrollLeft there.\n        var left = slides[i].offsetLeft - slides[0].offsetLeft;\n        track.scrollTo({ left: left, behavior: smooth ? behavior() : 'auto' });\n      } else if (smooth && i !== index) {\n        // Stacked / grid on desktop: bring the image into view only when it is off screen.\n        var rect = slides[i].getBoundingClientRect();\n        if (rect.bottom < 80 || rect.top > window.innerHeight - 80) slides[i].scrollIntoView({ block: 'center', behavior: behavior() });\n      }\n      setActive(i);\n    }\n    function nearest() {\n      var best = 0, bestDist = Infinity, base = slides[0] ? slides[0].offsetLeft : 0;\n      slides.forEach(function (s, k) {\n        var d = Math.abs((s.offsetLeft - base) - track.scrollLeft);\n        if (d < bestDist) { bestDist = d; best = k; }\n      });\n      return best;\n    }\n    var raf = 0;\n    if (track) {\n      track.addEventListener('scroll', function () {\n        if (raf) return;\n        raf = requestAnimationFrame(function () { raf = 0; if (scrollable()) { var n = nearest(); if (n !== index) setActive(n); } });\n      }, { passive: true });\n      track.addEventListener('keydown', function (e) {\n        var rtl = isRtl(track);\n        if (e.key === 'ArrowRight') { e.preventDefault(); go(index + (rtl ? -1 : 1), true); }\n        else if (e.key === 'ArrowLeft') { e.preventDefault(); go(index + (rtl ? 1 : -1), true); }\n        else if (e.key === 'Home') { e.preventDefault(); go(0, true); }\n        else if (e.key === 'End') { e.preventDefault(); go(slides.length - 1, true); }\n      });\n    }\n    thumbs.forEach(function (b) { b.addEventListener('click', function () { go(Number(b.getAttribute('data-cn-gallery-thumb')), true); }); });\n    dots.forEach(function (b) { b.addEventListener('click', function () { go(Number(b.getAttribute('data-cn-gallery-dot')), true); }); });\n    if (prev) prev.addEventListener('click', function () { go(index - 1, true); });\n    if (next) next.addEventListener('click', function () { go(index + 1, true); });\n    setActive(0);\n\n    var api = {\n      go: go,\n      index: function () { return index; },\n      slides: slides,\n      indexOfSrc: function (src) {\n        if (!src) return -1;\n        for (var k = 0; k < slides.length; k++) if (slides[k].getAttribute('data-src') === src) return k;\n        return -1;\n      },\n    };\n    galleries.set(g, api);\n    return api;\n  }\n\n  /* ---------- zoom view ---------- */\n  function initLightbox(sec, gallery) {\n    var dlg = sec.querySelector('[data-cn-lightbox]');\n    if (!dlg || !gallery || !S.once(dlg)) return;\n    var img = dlg.querySelector('[data-cn-lightbox-img]');\n    var stage = dlg.querySelector('[data-cn-lightbox-stage]');\n    var count = dlg.querySelector('[data-cn-lightbox-count]');\n    var urls = gallery.slides.map(function (s) { return s.getAttribute('data-src'); });\n    var alts = gallery.slides.map(function (s) { var i = s.querySelector('img'); return i ? i.getAttribute('alt') || '' : ''; });\n    var n = urls.length, cur = 0, lastFocus = null;\n\n    function unzoom() { stage.classList.remove('is-zoomed'); stage.scrollTop = 0; stage.scrollLeft = 0; }\n    function show(i) {\n      cur = (i + n) % n;\n      img.src = urls[cur];\n      img.alt = alts[cur];\n      if (count) count.textContent = (cur + 1) + ' / ' + n;\n      unzoom();\n    }\n    function open(i) {\n      lastFocus = document.activeElement;\n      show(i);\n      if (typeof dlg.showModal === 'function') { try { dlg.showModal(); } catch (e) { dlg.setAttribute('open', ''); } }\n      else dlg.setAttribute('open', '');\n      lockScroll(true);\n      var closeBtn = dlg.querySelector('[data-cn-lightbox-close]');\n      if (closeBtn) closeBtn.focus();\n    }\n    function close() {\n      if (typeof dlg.close === 'function' && dlg.open) dlg.close();\n      else { dlg.removeAttribute('open'); onClosed(); }\n    }\n    function onClosed() {\n      lockScroll(false);\n      gallery.go(cur, false);\n      if (lastFocus && lastFocus.focus) lastFocus.focus();\n    }\n    dlg.addEventListener('close', onClosed);\n    sec.querySelectorAll('[data-cn-zoom-open]').forEach(function (b) {\n      b.addEventListener('click', function () { open(Number(b.getAttribute('data-cn-zoom-open'))); });\n    });\n    var closeBtn = dlg.querySelector('[data-cn-lightbox-close]');\n    if (closeBtn) closeBtn.addEventListener('click', close);\n    var p = dlg.querySelector('[data-cn-lightbox-prev]'), nx = dlg.querySelector('[data-cn-lightbox-next]');\n    if (p) p.addEventListener('click', function () { show(cur - 1); });\n    if (nx) nx.addEventListener('click', function () { show(cur + 1); });\n    dlg.addEventListener('click', function (e) { if (e.target === dlg) close(); });\n    dlg.addEventListener('keydown', function (e) {\n      var rtl = isRtl(dlg);\n      if (e.key === 'ArrowRight' && n > 1) { e.preventDefault(); show(cur + (rtl ? -1 : 1)); }\n      else if (e.key === 'ArrowLeft' && n > 1) { e.preventDefault(); show(cur + (rtl ? 1 : -1)); }\n    });\n    // Click the picture to see it at full size (scroll or drag to look around); click again to fit it.\n    img.addEventListener('click', function (e) {\n      if (stage.classList.contains('is-zoomed')) { unzoom(); return; }\n      var r = img.getBoundingClientRect();\n      var fx = (e.clientX - r.left) / (r.width || 1), fy = (e.clientY - r.top) / (r.height || 1);\n      stage.classList.add('is-zoomed');\n      requestAnimationFrame(function () {\n        stage.scrollLeft = fx * stage.scrollWidth - stage.clientWidth / 2;\n        stage.scrollTop = fy * stage.scrollHeight - stage.clientHeight / 2;\n      });\n    });\n    // Swipe between pictures when not zoomed in.\n    var sx = null, sy = null;\n    stage.addEventListener('pointerdown', function (e) { sx = e.clientX; sy = e.clientY; });\n    stage.addEventListener('pointerup', function (e) {\n      if (sx === null || stage.classList.contains('is-zoomed') || n < 2) { sx = null; return; }\n      var dx = e.clientX - sx, dy = e.clientY - sy;\n      sx = null;\n      if (Math.abs(dx) > 50 && Math.abs(dx) > Math.abs(dy)) {\n        var forward = dx < 0;\n        if (isRtl(dlg)) forward = !forward;\n        show(cur + (forward ? 1 : -1));\n      }\n    });\n  }\n\n  /* ---------- variants ---------- */\n  function initVariants(sec, gallery) {\n    var variants = S.product.read(sec.querySelector('script[data-cn-pdp-data]'));\n    var form = sec.querySelector('form[data-cn-atc]');\n    var hidden = form && form.querySelector('input[name=\"variant_id\"]');\n    var options = Array.prototype.slice.call(sec.querySelectorAll('[data-cn-pdp-option]'));\n    var labelSold = sec.getAttribute('data-label-soldout') || 'Sold out';\n    var labelUnavailable = sec.getAttribute('data-label-unavailable') || 'Unavailable';\n\n    function optName(o) { return o.getAttribute('data-cn-pdp-option'); }\n    function chosen() {\n      var c = {};\n      options.forEach(function (o) {\n        var sel = o.querySelector('select');\n        if (sel) { c[optName(o)] = sel.value; return; }\n        var r = o.querySelector('input:checked');\n        if (r) c[optName(o)] = r.value;\n      });\n      return c;\n    }\n    var STATE = { available: 'available', 'sold-out': 'soldout', missing: 'unavailable' }; // data-state values the CSS reads\n    function setText(sel, text) { sec.querySelectorAll(sel).forEach(function (el) { el.textContent = text; }); }\n    function setHidden(sel, hide) { sec.querySelectorAll(sel).forEach(function (el) { el.hidden = hide; }); }\n\n    function markAvailability(c) {\n      options.forEach(function (o) {\n        var name = optName(o);\n        var check = function (value) { return STATE[S.product.valueState(variants, c, name, value)]; };\n        o.querySelectorAll('input[data-cn-pdp-radio]').forEach(function (input) {\n          input.setAttribute('data-state', check(input.value));\n        });\n        o.querySelectorAll('select option').forEach(function (opt) {\n          var state = check(opt.value), base = opt.getAttribute('data-label') || opt.value;\n          opt.textContent = state === 'available' ? base : base + ' — ' + (state === 'soldout' ? labelSold : labelUnavailable);\n        });\n        var cur = o.querySelector('[data-cn-pdp-current]');\n        if (cur && c[name] != null) cur.textContent = c[name];\n      });\n    }\n\n    function apply(fromUser) {\n      var c = chosen();\n      var v = variants.length ? S.product.resolve(variants, c) : null;\n      var ok = S.product.available(v);\n      if (hidden) hidden.value = v ? v.id : '';\n      if (v) {\n        var sale = v.compare_at_price && Number(v.compare_at_price) > Number(v.price);\n        sec.querySelectorAll('[data-cn-pdp-price]').forEach(function (el) {\n          el.textContent = S.money(v.price);\n          el.classList.toggle('is-sale', !!sale);\n          if (fromUser) pulse(el);\n        });\n        sec.querySelectorAll('[data-cn-pdp-compare]').forEach(function (el) {\n          el.hidden = !sale;\n          if (sale) el.textContent = S.money(v.compare_at_price);\n        });\n        setHidden('[data-cn-pdp-sale]', !sale);\n        setText('[data-cn-sticky-price]', S.money(v.price));\n        setText('[data-cn-sticky-variant]', v.title || '');\n      }\n      setHidden('[data-cn-pdp-soldout-badge]', ok);\n      var btn = sec.querySelector('[data-cn-pdp-atc]');\n      if (btn) {\n        btn.disabled = !ok;\n        btn.textContent = !v ? (btn.getAttribute('data-label-unavailable') || labelUnavailable)\n          : (ok ? (btn.getAttribute('data-label-default') || 'Add to cart') : (btn.getAttribute('data-label-soldout') || labelSold));\n      }\n      setHidden('[data-cn-pdp-buynow]', !ok);\n      updateStock(v, ok);\n      markAvailability(c);\n      if (v && v.image && gallery && fromUser) {\n        var idx = gallery.indexOfSrc(S.product.image(v));\n        if (idx > -1) gallery.go(idx, true);\n      }\n      if (fromUser && v && !S.designMode() && !inPreview() && window.history && window.history.replaceState) {\n        try {\n          var url = new URL(window.location.href);\n          url.searchParams.set('variant', v.id);\n          window.history.replaceState(window.history.state, '', url.toString());\n        } catch (e) { /* ignore */ }\n      }\n      sec.dispatchEvent(new CustomEvent('cn:variant-change', { bubbles: true, detail: { variant: v } }));\n    }\n\n    function updateStock(v, ok) {\n      sec.querySelectorAll('[data-cn-pdp-stock]').forEach(function (el) {\n        var threshold = Number(el.getAttribute('data-threshold') || 5);\n        var showIn = el.getAttribute('data-show-in-stock') !== 'false';\n        var qty = v && v.stock_quantity != null ? Number(v.stock_quantity) : null;\n        var kind = '', text = '';\n        if (!ok) { kind = 'out'; text = el.getAttribute('data-label-out') || labelSold; }\n        else if (qty != null && qty > 0 && qty <= threshold) { kind = 'low'; text = (el.getAttribute('data-label-low') || 'Only {count} left').replace('{count}', qty); }\n        else if (showIn) { kind = 'in'; text = el.getAttribute('data-label-in') || 'In stock'; }\n        el.innerHTML = '';\n        if (!text) return;\n        var dot = document.createElement('span');\n        dot.className = 'cn-stock__dot' + (kind === 'out' ? ' cn-stock__dot--out' : kind === 'low' ? ' cn-stock__dot--low' : '');\n        var span = document.createElement('span');\n        span.setAttribute('data-cn-pdp-stock-text', '');\n        span.textContent = text;\n        el.appendChild(dot); el.appendChild(span);\n      });\n    }\n\n    options.forEach(function (o) {\n      o.addEventListener('change', function () { apply(true); });\n    });\n\n    // A shared link with ?variant= opens on that variant.\n    var preset = null;\n    try { preset = new URL(window.location.href).searchParams.get('variant'); } catch (e) { preset = null; }\n    var start = preset && variants.filter(function (v) { return String(v.id) === String(preset); })[0];\n    if (start && start.option_values && !inPreview()) {\n      options.forEach(function (o) {\n        var val = start.option_values[optName(o)];\n        if (val == null) return;\n        var sel = o.querySelector('select');\n        if (sel) { sel.value = val; return; }\n        o.querySelectorAll('input[data-cn-pdp-radio]').forEach(function (r) { r.checked = r.value === String(val); });\n      });\n      apply(false);\n      if (start.image && gallery) { var si = gallery.indexOfSrc(start.image); if (si > -1) gallery.go(si, false); }\n    } else if (variants.length) {\n      apply(false);\n    }\n  }\n\n  /* ---------- quantity stepper (product page) ---------- */\n  function initSteppers(scope) {\n    scope.querySelectorAll('[data-cn-stepper]').forEach(function (box) {\n      if (box.hasAttribute('data-cn-qty') || !S.once(box)) return; // [data-cn-qty] steppers belong to corner-core.js\n      var input = box.querySelector('input');\n      box.querySelectorAll('[data-cn-step]').forEach(function (b) {\n        b.addEventListener('click', function () {\n          var min = Number(input.getAttribute('min') || 1), max = Number(input.getAttribute('max') || 99);\n          var v = Math.min(max, Math.max(min, Number(input.value || min) + Number(b.getAttribute('data-cn-step'))));\n          if (String(v) !== input.value) { input.value = v; input.dispatchEvent(new Event('change', { bubbles: true })); }\n        });\n      });\n      input.addEventListener('change', function () {\n        var min = Number(input.getAttribute('min') || 1), max = Number(input.getAttribute('max') || 99);\n        var v = Math.round(Number(input.value));\n        if (!isFinite(v) || v < min) v = min;\n        if (v > max) v = max;\n        if (String(v) !== input.value) input.value = v;\n      });\n    });\n  }\n\n  /* ---------- sticky add to cart ---------- */\n  function initSticky(sec) {\n    var bar = sec.querySelector('[data-cn-sticky-atc]');\n    if (!bar || !S.once(bar)) return;\n    var main = sec.querySelector('[data-cn-pdp-atc]');\n    var btn = bar.querySelector('[data-cn-sticky-btn]');\n    if (!main || !btn || !('IntersectionObserver' in window)) { bar.hidden = true; return; }\n    function mirror() {\n      btn.disabled = main.disabled;\n      btn.textContent = main.textContent.trim();\n      btn.classList.toggle('is-busy', main.classList.contains('is-busy'));\n      btn.classList.toggle('is-added', main.classList.contains('is-added'));\n    }\n    // The bar's button mirrors the main one (label, disabled, busy, added) whatever changes it.\n    new MutationObserver(mirror).observe(main, { attributes: true, childList: true, characterData: true, subtree: true });\n    mirror();\n    function setShown(show) {\n      bar.classList.toggle('is-visible', show);\n      bar.setAttribute('aria-hidden', show ? 'false' : 'true');\n      btn.tabIndex = show ? 0 : -1;\n      document.documentElement.classList.toggle('cn-has-sticky-atc', show);\n    }\n    new IntersectionObserver(function (entries) {\n      var e = entries[entries.length - 1];\n      setShown(!e.isIntersecting && e.boundingClientRect.top < 0);\n    }).observe(main);\n    btn.addEventListener('click', function () { if (!main.disabled) main.click(); });\n  }\n\n  /* ---------- share ---------- */\n  function initShare(scope) {\n    scope.querySelectorAll('[data-cn-share]').forEach(function (box) {\n      if (!S.once(box)) return;\n      var nativeBtn = box.querySelector('[data-cn-share-native]');\n      var copyBtn = box.querySelector('[data-cn-share-copy]');\n      var title = box.getAttribute('data-title') || document.title;\n      function pageUrl() {\n        try { var u = new URL(window.location.href); u.hash = ''; return u.toString(); } catch (e) { return window.location.href; }\n      }\n      if (nativeBtn && navigator.share) {\n        nativeBtn.hidden = false;\n        nativeBtn.addEventListener('click', function () { navigator.share({ title: title, url: pageUrl() }).catch(function () {}); });\n      }\n      if (copyBtn) {\n        var label = copyBtn.querySelector('[data-cn-share-copy-label]');\n        var original = label ? label.textContent : '';\n        copyBtn.addEventListener('click', function () {\n          var done = function () {\n            if (!label) return;\n            label.textContent = box.getAttribute('data-label-copied') || 'Link copied';\n            clearTimeout(copyBtn.__cnT);\n            copyBtn.__cnT = setTimeout(function () { label.textContent = original; }, 2000);\n          };\n          var text = pageUrl();\n          if (navigator.clipboard && navigator.clipboard.writeText) navigator.clipboard.writeText(text).then(done, function () { fallbackCopy(text); done(); });\n          else { fallbackCopy(text); done(); }\n        });\n      }\n    });\n  }\n  function fallbackCopy(text) {\n    var ta = document.createElement('textarea');\n    ta.value = text; ta.setAttribute('readonly', ''); ta.style.position = 'fixed'; ta.style.opacity = '0';\n    document.body.appendChild(ta); ta.select();\n    try { document.execCommand('copy'); } catch (e) { /* ignore */ }\n    ta.remove();\n  }\n\n  function initProducts(root) {\n    root.querySelectorAll('[data-cn-pdp]').forEach(function (sec) {\n      if (!S.once(sec)) return;\n      var gallery = initGallery(sec);\n      initLightbox(sec, gallery);\n      initVariants(sec, gallery);\n      initSticky(sec);\n    });\n  }\n\n  /* ---------- collection + search: filters, sorting, load more ---------- */\n  /* The page's query is read from its own controls (never from window.location, which is the editor's or\n     the demo's address inside a preview) and applied as a relative \"?…\" navigation. */\n  function readFilterState(sec) {\n    var params = new URLSearchParams();\n    var q = sec.getAttribute('data-q');\n    if (q) params.set('q', q);\n    var sort = sec.querySelector('[data-cn-sort-by]');\n    if (sort && sort.value && sort.value !== 'featured') params.set('sort', sort.value);\n    var scope = sec.querySelector('[data-cn-search-scope]');\n    if (scope && scope.value) params.set('c', scope.value);\n    var instock = sec.querySelector('[data-cn-filter-instock]');\n    if (instock && instock.checked) params.set('in_stock', '1');\n    var priceForm = sec.querySelector('[data-cn-filter-price]');\n    if (priceForm) {\n      ['price_min', 'price_max'].forEach(function (k) {\n        var input = priceForm.querySelector('[name=\"' + k + '\"]');\n        var v = input && input.value !== '' ? Number(input.value) : NaN;\n        if (isFinite(v) && v >= 0) params.set(k, String(Math.round(v * 100)));\n      });\n    }\n    sec.querySelectorAll('[data-cn-filter-list]').forEach(function (list) {\n      var vals = [];\n      list.querySelectorAll('input:checked').forEach(function (i) { vals.push(i.value); });\n      if (vals.length) params.set(list.getAttribute('data-cn-filter-list'), vals.join(','));\n    });\n    // Filters the page shows as chips only (no control of their own on this page, e.g. ?vendor= on search).\n    sec.querySelectorAll('[data-cn-filter-remove]').forEach(function (chip) {\n      var key = chip.getAttribute('data-cn-filter-remove');\n      if (key === 'in_stock') { if (!instock) params.set('in_stock', '1'); return; }\n      if (key === 'price') {\n        if (priceForm) return;\n        if (chip.getAttribute('data-min')) params.set('price_min', chip.getAttribute('data-min'));\n        if (chip.getAttribute('data-max')) params.set('price_max', chip.getAttribute('data-max'));\n        return;\n      }\n      if (params.has(key)) return;\n      if (sec.querySelector('[data-cn-filter-list=\"' + (window.CSS && CSS.escape ? CSS.escape(key) : key) + '\"]')) return;\n      var val = chip.getAttribute('data-value');\n      if (val) params.set(key, params.has(key) ? params.get(key) + ',' + val : val);\n    });\n    var perPage = sec.getAttribute('data-per-page');\n    if (perPage) params.set('per_page', perPage);\n    return params;\n  }\n  function go(params) {\n    params.delete('page');\n    var qs = params.toString();\n    navTo(qs ? '?' + qs : '?');\n  }\n\n  function initFilters(sec) {\n    if (!S.once(sec, 'filters')) return;\n    var panel = sec.querySelector('[data-cn-facets]');\n    var openBtn = sec.querySelector('[data-cn-facets-open]');\n    var dirty = false, lastFocus = null;\n\n    function isDrawer() { return panel && getComputedStyle(panel).position === 'fixed'; }\n    function open() {\n      if (!panel) return;\n      lastFocus = document.activeElement;\n      panel.classList.add('is-open');\n      panel.setAttribute('role', 'dialog');\n      panel.setAttribute('aria-modal', 'true');\n      if (openBtn) openBtn.setAttribute('aria-expanded', 'true');\n      lockScroll(true);\n      var first = panel.querySelector('.cn-facets__close');\n      if (first) setTimeout(function () { first.focus(); }, 30);\n    }\n    function close() {\n      if (!panel || !panel.classList.contains('is-open')) return;\n      panel.classList.remove('is-open');\n      panel.removeAttribute('role');\n      panel.removeAttribute('aria-modal');\n      if (openBtn) openBtn.setAttribute('aria-expanded', 'false');\n      lockScroll(false);\n      if (dirty) { dirty = false; go(readFilterState(sec)); return; }\n      if (lastFocus && lastFocus.focus) lastFocus.focus();\n    }\n    function changed() {\n      // In the sidebar every change applies at once; in the drawer they apply together when it closes.\n      if (panel && panel.classList.contains('is-open') && isDrawer()) { dirty = true; return; }\n      go(readFilterState(sec));\n    }\n\n    if (openBtn) openBtn.addEventListener('click', open);\n    if (panel) {\n      panel.querySelectorAll('[data-cn-facets-close]').forEach(function (b) { b.addEventListener('click', close); });\n      panel.addEventListener('keydown', function (e) {\n        if (!panel.classList.contains('is-open')) return;\n        if (e.key === 'Escape') { e.preventDefault(); close(); }\n        else trapFocus(panel, e);\n      });\n      var instock = panel.querySelector('[data-cn-filter-instock]');\n      if (instock) instock.addEventListener('change', changed);\n      panel.querySelectorAll('[data-cn-filter-list]').forEach(function (list) { list.addEventListener('change', changed); });\n      var priceForm = panel.querySelector('[data-cn-filter-price]');\n      if (priceForm) priceForm.addEventListener('submit', function (e) { e.preventDefault(); dirty = false; go(readFilterState(sec)); });\n      // Leaving desktop width with the drawer open: close it cleanly.\n      window.addEventListener('resize', function () { if (panel.classList.contains('is-open') && !isDrawer()) close(); });\n    }\n    sec.querySelectorAll('[data-cn-sort-by], [data-cn-search-scope]').forEach(function (sel) {\n      sel.addEventListener('change', function () { go(readFilterState(sec)); });\n    });\n    sec.querySelectorAll('[data-cn-filter-remove]').forEach(function (chip) {\n      chip.addEventListener('click', function () {\n        var params = readFilterState(sec);\n        var key = chip.getAttribute('data-cn-filter-remove');\n        var val = chip.getAttribute('data-value');\n        if (key === 'price') { params.delete('price_min'); params.delete('price_max'); }\n        else if (val && params.has(key)) {\n          var rest = params.get(key).split(',').filter(function (x) { return x !== val; });\n          if (rest.length) params.set(key, rest.join(',')); else params.delete(key);\n        } else params.delete(key);\n        go(params);\n      });\n    });\n    sec.querySelectorAll('[data-cn-filters-clear]').forEach(function (b) {\n      b.addEventListener('click', function () {\n        var params = new URLSearchParams();\n        var cur = readFilterState(sec);\n        ['q', 'sort', 'c'].forEach(function (k) { if (cur.has(k)) params.set(k, cur.get(k)); });\n        dirty = false;\n        if (panel && panel.classList.contains('is-open')) { panel.classList.remove('is-open'); lockScroll(false); }\n        go(params);\n      });\n    });\n  }\n\n  function initLoadMore(sec) {\n    var box = sec.querySelector('[data-cn-loadmore]');\n    if (!box || !S.once(box)) return;\n    var grid = sec.querySelector('[data-cn-collection-grid]');\n    var btn = box.querySelector('[data-cn-loadmore-btn]');\n    var countEl = box.querySelector('[data-cn-loadmore-count]');\n    var bar = box.querySelector('[data-cn-loadmore-bar]');\n    if (!grid || !btn) return;\n    var total = Number(countEl && countEl.getAttribute('data-total')) || 0;\n    function sync() {\n      var shown = grid.children.length;\n      if (countEl && total) {\n        countEl.textContent = (countEl.getAttribute('data-template') || '{shown} / {total}')\n          .replace('{shown}', Math.min(shown, total)).replace('{total}', total);\n      }\n      if (bar && total) bar.style.width = Math.min(100, Math.round(shown / total * 100)) + '%';\n      if (!box.getAttribute('data-next')) btn.hidden = true;\n    }\n    btn.addEventListener('click', async function () {\n      var next = box.getAttribute('data-next');\n      if (!next) return;\n      // Inside a preview the next page is a navigation of its own.\n      if (inPreview() || S.designMode()) { navTo(next); return; }\n      btn.disabled = true;\n      btn.classList.add('is-busy');\n      try {\n        // The next page's collection section alone (no header, footer or other sections); the whole page if that\n        // answer has no grid.\n        var url = new URL(next, window.location.href);\n        var wrap = box.closest('[data-section-id]');\n        var doc = null;\n        var newGrid = null;\n        if (wrap) {\n          try {\n            var only = new URL(url.toString());\n            only.searchParams.set('soooks_section', wrap.getAttribute('data-section-id'));\n            var part = await fetch(only.toString(), { headers: { Accept: 'text/html' }, credentials: 'same-origin' });\n            if (part.ok) {\n              doc = new DOMParser().parseFromString(await part.text(), 'text/html');\n              newGrid = doc.querySelector('[data-cn-collection-grid]');\n            }\n          } catch (e1) { /* the whole page below */ }\n        }\n        if (!newGrid) {\n          var res = await fetch(url.toString(), { headers: { Accept: 'text/html' }, credentials: 'same-origin' });\n          if (!res.ok) throw new Error(String(res.status));\n          doc = new DOMParser().parseFromString(await res.text(), 'text/html');\n          newGrid = doc.querySelector('[data-cn-collection-grid]');\n        }\n        var newBox = doc.querySelector('[data-cn-loadmore]');\n        if (!newGrid) throw new Error('no grid');\n        var first = null;\n        Array.prototype.slice.call(newGrid.children).forEach(function (child) {\n          var node = document.adoptNode(child);\n          if (!first) first = node;\n          grid.appendChild(node);\n        });\n        box.setAttribute('data-next', (newBox && newBox.getAttribute('data-next')) || '');\n        // Keyboard users continue from the first new card.\n        var link = first && first.querySelector('a[href]');\n        if (link) link.focus({ preventScroll: true });\n      } catch (e) {\n        navTo(next);\n        return;\n      } finally {\n        btn.disabled = false;\n        btn.classList.remove('is-busy');\n      }\n      sync();\n    });\n    sync();\n  }\n\n  function initCollections(root) {\n    root.querySelectorAll('[data-cn-collection], [data-cn-search-page]').forEach(function (sec) {\n      initFilters(sec);\n      initLoadMore(sec);\n    });\n  }\n\n  /* ---------- cart page extras ---------- */\n  /* Line quantities and removals run in corner-core.js. Every cart change (soooks:cart:change, which carries the\n     whole cart) refreshes the free-shipping bar and the discount lines here (they depend on the new subtotal). */\n  function renderCartExtras(cart) {\n    var page = document.querySelector('[data-cn-cart-extras]');\n    if (!page || !cart || !page.querySelector('[data-cn-subtotal]')) return;\n    var ship = page.querySelector('[data-cn-ship-bar]');\n    if (ship && cart.free_shipping) {\n      var fs = cart.free_shipping;\n      var text = ship.querySelector('[data-cn-ship-text]');\n      var prog = ship.querySelector('[data-cn-ship-progress]');\n      if (text) text.textContent = fs.remaining > 0\n        ? (page.getAttribute('data-label-remaining') || '{amount}').replace('{amount}', S.money(fs.remaining))\n        : (page.getAttribute('data-label-reached') || '');\n      if (prog) prog.style.width = Math.max(0, Math.min(100, Number(fs.progress) || 0)) + '%';\n    }\n    var rows = page.querySelector('[data-cn-cart-discounts]');\n    if (rows && rows.getAttribute('data-show') !== 'false') {\n      var discounts = cart.discounts || [];\n      rows.innerHTML = '';\n      if (discounts.length) {\n        var row = function (cls, label, amount) {\n          var p = document.createElement('p');\n          p.className = cls;\n          var x = document.createElement('span'), y = document.createElement('span');\n          x.textContent = label; y.textContent = amount;\n          p.appendChild(x); p.appendChild(y);\n          rows.appendChild(p);\n        };\n        row('cn-cart-summary__row', rows.getAttribute('data-label-subtotal') || 'Subtotal', S.money(cart.subtotal));\n        discounts.forEach(function (d) {\n          row('cn-cart-summary__row cn-cart-summary__row--discount', d.label || d.code || '', '\\u2212' + S.money(d.amount));\n        });\n      }\n    }\n  }\n  document.addEventListener('soooks:cart:change', function (ev) {\n    var d = ev.detail || {};\n    if (d.reason !== 'note') renderCartExtras(d.cart);\n  });\n\n  /* Sign-in tabs: corner-core.js switches the forms; this keeps the tabs' selected state announced. */\n  function initAuthTabs(root) {\n    root.querySelectorAll('[data-cn-auth]').forEach(function (auth) {\n      if (!S.once(auth, 'tabs')) return;\n      auth.addEventListener('click', function (e) {\n        var tab = e.target.closest && e.target.closest('[data-cn-auth-tab]');\n        if (!tab) return;\n        auth.querySelectorAll('[data-cn-auth-tab]').forEach(function (t) { t.setAttribute('aria-selected', t === tab ? 'true' : 'false'); });\n      });\n    });\n  }\n\n  /* ---------- boot: the runtime's one scan (first load + editor re-renders) ---------- */\n  S.scan(function (root) {\n    initProducts(root);\n    initSteppers(root);\n    initShare(root);\n    initCollections(root);\n    initAuthTabs(root);\n  });\n})();\n","assets/corner-sections.js":"/* soooks-theme:corner:169557:f0936d16eeb03eeb */\n/* Corner — section behaviour: slideshow, sliding rows (testimonials…), FAQ accordion, product-card swatches.\n   Hooks are data-cn-* attributes; state classes are is-*. The theme editor replaces a section's DOM when it is\n   edited: the runtime's one scan (S.scan) binds new markup, every element once (S.once); timers stop on detached\n   nodes. How much moves: S.motion() (Theme settings → Animation, lowered by reduced motion). Loads after corner-core.js. */\n(function () {\n  'use strict';\n  var S = window.Soooks, C = window.Corner;\n  if (!S || !C) return;\n  var isRtl = C.isRtl;\n  function toArray(list) { return Array.prototype.slice.call(list || []); }\n\n  /* ---------- slideshow ---------- */\n  var slideshows = []; // { el, schedule } — visibility changes re-check their autoplay\n  function initSlideshow(el) {\n    if (!S.once(el)) return;\n    var viewport = el.querySelector('.cn-ss__viewport');\n    var track = el.querySelector('[data-cn-ss-track]');\n    var slides = toArray(el.querySelectorAll('[data-cn-slide]'));\n    var n = slides.length;\n    if (!track || n < 2) return;\n    var dots = toArray(el.querySelectorAll('[data-cn-ss-dot]'));\n    var prev = el.querySelector('[data-cn-ss-prev]');\n    var next = el.querySelector('[data-cn-ss-next]');\n    var toggle = el.querySelector('[data-cn-ss-toggle]');\n    var fade = el.getAttribute('data-transition') === 'fade';\n    var loop = el.getAttribute('data-loop') !== 'false';\n    var autoplay = el.getAttribute('data-autoplay') === 'true';\n    var swipe = el.getAttribute('data-swipe') !== 'false';\n    var delay = Math.max(2, parseInt(el.getAttribute('data-speed'), 10) || 5) * 1000;\n    var i = 0, timer = null, paused = false, hovering = false, focused = false, editing = false;\n\n    function place(dragPx) {\n      if (fade) return;\n      var pct = -i * 100 * (isRtl(el) ? -1 : 1);\n      track.style.transform = 'translateX(' + pct + '%)' + (dragPx ? ' translateX(' + dragPx + 'px)' : '');\n    }\n    function go(to, byUser) {\n      to = loop ? (to + n) % n : Math.max(0, Math.min(n - 1, to));\n      var changed = to !== i;\n      i = to;\n      slides.forEach(function (s, k) {\n        var on = k === i;\n        s.classList.toggle('is-active', on);\n        // Off-screen slides leave the tab order and the accessibility tree.\n        if (on) { s.removeAttribute('inert'); s.removeAttribute('aria-hidden'); }\n        else { s.setAttribute('inert', ''); s.setAttribute('aria-hidden', 'true'); }\n      });\n      place(0);\n      dots.forEach(function (d, k) {\n        d.classList.toggle('is-active', k === i);\n        if (k === i) d.setAttribute('aria-current', 'true'); else d.removeAttribute('aria-current');\n      });\n      if (!loop) {\n        if (prev) prev.disabled = i === 0;\n        if (next) next.disabled = i === n - 1;\n      }\n      if (changed) enter(slides[i]);\n      if (byUser) schedule();\n    }\n    // The arriving slide's text rises in (CSS .is-entering), unless motion is off.\n    function enter(slide) {\n      slides.forEach(function (s) { s.classList.remove('is-entering'); });\n      if (S.motion() === 'none') return;\n      void slide.offsetWidth;\n      slide.classList.add('is-entering');\n    }\n    function canPlay() {\n      return autoplay && !paused && !hovering && !focused && !editing && !document.hidden && S.motion() !== 'none' && el.isConnected;\n    }\n    function schedule() {\n      clearTimeout(timer);\n      timer = null;\n      if (!canPlay()) return;\n      timer = setTimeout(function () {\n        if (!el.isConnected) return; // re-rendered by the theme editor\n        if (!loop && i === n - 1) return;\n        go(i + 1);\n        schedule();\n      }, delay);\n    }\n    function setPaused(on) {\n      paused = on;\n      el.classList.toggle('is-paused', on);\n      if (toggle) toggle.setAttribute('aria-label', toggle.getAttribute(on ? 'data-label-play' : 'data-label-pause') || '');\n      schedule();\n    }\n\n    if (prev) prev.addEventListener('click', function () { go(i - 1, true); });\n    if (next) next.addEventListener('click', function () { go(i + 1, true); });\n    // Theme editor: the selected slide shows and autoplay holds while the slideshow is being edited; a slide picked\n    // itself also pauses the slideshow (the play button shows) until the merchant plays it again.\n    function onEditor(ev) {\n      if (!el.isConnected) { document.removeEventListener(ev.type, onEditor); return; }\n      var t = ev.target;\n      if (ev.type === 'soooks:block:select' && el.contains(t)) {\n        var at = slides.findIndex(function (s) { return s === t || s.contains(t); });\n        editing = true;\n        if (at > -1) go(at);\n        if (at > -1 && slides[at] === t) setPaused(true);\n        schedule();\n      } else if (ev.type === 'soooks:section:select' && t.contains(el)) { editing = true; schedule(); }\n      else if (ev.type === 'soooks:section:deselect' && t.contains(el)) { editing = false; schedule(); }\n    }\n    ['soooks:block:select', 'soooks:section:select', 'soooks:section:deselect'].forEach(function (name) { document.addEventListener(name, onEditor); });\n    dots.forEach(function (d) {\n      d.addEventListener('click', function () { go(parseInt(d.getAttribute('data-cn-ss-dot'), 10) || 0, true); });\n    });\n    if (toggle) toggle.addEventListener('click', function () { setPaused(!paused); });\n    // Pause while the visitor is pointing at or working inside the slideshow.\n    el.addEventListener('mouseenter', function () { hovering = true; schedule(); });\n    el.addEventListener('mouseleave', function () { hovering = false; schedule(); });\n    el.addEventListener('focusin', function () { focused = true; schedule(); });\n    el.addEventListener('focusout', function (e) { if (!el.contains(e.relatedTarget)) { focused = false; schedule(); } });\n    el.addEventListener('keydown', function (e) {\n      if (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight') return;\n      if (/^(INPUT|TEXTAREA|SELECT)$/.test(e.target.tagName)) return;\n      var forward = (e.key === 'ArrowRight') !== isRtl(el);\n      go(i + (forward ? 1 : -1), true);\n      e.preventDefault();\n    });\n\n    // Swipe on touch, drag with a mouse. Vertical moves stay page scrolls (touch-action: pan-y).\n    if (swipe && viewport) {\n      var startX = null, startY = 0, dx = 0, dragging = false, pointerId = null, swallowClick = false;\n      viewport.addEventListener('pointerdown', function (e) {\n        if (e.pointerType === 'mouse' && e.button !== 0) return;\n        if (e.target.closest('.cn-ss__inner a, .cn-ss__inner button')) return;\n        startX = e.clientX; startY = e.clientY; dx = 0; dragging = false; pointerId = e.pointerId;\n      });\n      viewport.addEventListener('pointermove', function (e) {\n        if (startX === null || e.pointerId !== pointerId) return;\n        dx = e.clientX - startX;\n        var dy = e.clientY - startY;\n        if (!dragging) {\n          if (Math.abs(dx) > 8 && Math.abs(dx) > Math.abs(dy)) {\n            dragging = true;\n            el.classList.add('is-dragging');\n            try { viewport.setPointerCapture(pointerId); } catch (err) { /* not capturable */ }\n          } else if (Math.abs(dy) > 10) { startX = null; return; }\n        }\n        if (dragging) place(dx);\n      });\n      var end = function () {\n        if (startX === null) return;\n        var wasDragging = dragging;\n        startX = null; dragging = false;\n        el.classList.remove('is-dragging');\n        if (!wasDragging) return;\n        swallowClick = true;\n        setTimeout(function () { swallowClick = false; }, 0);\n        var forward = isRtl(el) ? dx > 0 : dx < 0;\n        if (Math.abs(dx) > Math.min(80, viewport.clientWidth * 0.15)) go(i + (forward ? 1 : -1), true);\n        else place(0);\n      };\n      viewport.addEventListener('pointerup', end);\n      viewport.addEventListener('pointercancel', end);\n      viewport.addEventListener('lostpointercapture', end);\n      viewport.addEventListener('click', function (e) { if (swallowClick) { e.preventDefault(); e.stopPropagation(); } }, true);\n      viewport.addEventListener('dragstart', function (e) { e.preventDefault(); });\n    }\n\n\n    if (autoplay && S.motion() === 'none') el.classList.add('is-paused');\n    go(0);\n    slideshows.push({ el: el, schedule: schedule });\n    schedule();\n  }\n  document.addEventListener('visibilitychange', function () {\n    slideshows = slideshows.filter(function (s) { return s.el.isConnected; });\n    slideshows.forEach(function (s) { s.schedule(); });\n  });\n\n  /* ---------- sliding rows: arrows, dots and \"is there anything to scroll\" ---------- */\n  function initSlider(box) {\n    var track = box.querySelector('[data-cn-slider-track]');\n    if (!track || !S.once(box)) return;\n    var prev = box.querySelector('[data-cn-slider-prev]');\n    var next = box.querySelector('[data-cn-slider-next]');\n    var dotsWrap = box.querySelector('[data-cn-slider-dots]');\n    var label = dotsWrap ? (dotsWrap.getAttribute('data-label') || '{n}') : '';\n    var frame = 0;\n\n    function step() {\n      var first = track.children[0];\n      if (!first) return track.clientWidth;\n      var gap = parseFloat(getComputedStyle(track).columnGap) || 0;\n      return first.getBoundingClientRect().width + gap;\n    }\n    function maxScroll() { return Math.max(0, track.scrollWidth - track.clientWidth); }\n    function pos() { return Math.abs(track.scrollLeft); }\n    function sign() { return isRtl(track) ? -1 : 1; }\n    function scrollToPos(px) { track.scrollTo({ left: px * sign(), behavior: S.motion() === 'none' ? 'auto' : 'smooth' }); }\n    function update() {\n      frame = 0;\n      var max = maxScroll();\n      var scrollable = max > 2;\n      if (scrollable) box.setAttribute('data-scrollable', ''); else box.removeAttribute('data-scrollable');\n      if (prev) prev.disabled = pos() <= 2;\n      if (next) next.disabled = pos() >= max - 2;\n      if (!dotsWrap) return;\n      var st = step();\n      var count = scrollable ? Math.round(max / st) + 1 : 0;\n      if (dotsWrap.children.length !== count) {\n        dotsWrap.textContent = '';\n        for (var k = 0; k < count; k++) {\n          var b = document.createElement('button');\n          b.type = 'button';\n          b.setAttribute('aria-label', label.replace('{n}', k + 1));\n          (function (idx) { b.addEventListener('click', function () { scrollToPos(Math.min(idx * step(), maxScroll())); }); })(k);\n          dotsWrap.appendChild(b);\n        }\n      }\n      var at = pos() >= max - 2 ? count - 1 : Math.round(pos() / st);\n      toArray(dotsWrap.children).forEach(function (d, k) { d.classList.toggle('is-active', k === at); });\n    }\n    function later() { if (!frame) frame = requestAnimationFrame(update); }\n    if (prev) prev.addEventListener('click', function () { scrollToPos(Math.max(0, pos() - step())); });\n    if (next) next.addEventListener('click', function () { scrollToPos(Math.min(maxScroll(), pos() + step())); });\n    track.addEventListener('scroll', later, { passive: true });\n    if ('ResizeObserver' in window) new ResizeObserver(later).observe(track);\n    else window.addEventListener('resize', later);\n    update();\n  }\n\n  /* ---------- FAQ: one answer open at a time (unless data-multi) ---------- */\n  function initAccordion(list) {\n    if (!S.once(list)) return;\n    if (list.hasAttribute('data-multi')) return;\n    list.addEventListener('toggle', function (e) {\n      var opened = e.target;\n      if (!opened.open || opened.parentElement !== list) return;\n      toArray(list.querySelectorAll(':scope > details[open]')).forEach(function (d) { if (d !== opened) d.open = false; });\n    }, true);\n  }\n\n  /* ---------- product-card colour swatches: show that colour's picture, link to that variant ---------- */\n  function pickSwatch(sw) {\n    var card = sw.closest('[data-cn-card]');\n    if (!card) return;\n    toArray(card.querySelectorAll('[data-cn-swatch]')).forEach(function (s) { s.classList.toggle('is-active', s === sw); });\n    var img = card.querySelector('[data-cn-card-img]');\n    var src = sw.getAttribute('data-image');\n    if (img && src) {\n      if (!img.__cnOriginal) img.__cnOriginal = img.getAttribute('src');\n      if (img.getAttribute('src') !== src) img.setAttribute('src', src);\n    }\n    var variant = sw.getAttribute('data-variant');\n    toArray(card.querySelectorAll('[data-cn-card-link]')).forEach(function (a) {\n      var base = (a.getAttribute('href') || '').split('?')[0];\n      a.setAttribute('href', variant && /^\\d+$/.test(variant) ? base + '?variant=' + variant : base);\n    });\n  }\n  document.addEventListener('click', function (e) {\n    var sw = e.target.closest && e.target.closest('[data-cn-swatch]');\n    if (sw) { e.preventDefault(); pickSwatch(sw); }\n  });\n  document.addEventListener('pointerover', function (e) {\n    if (e.pointerType !== 'mouse') return;\n    var sw = e.target.closest && e.target.closest('[data-cn-swatch]');\n    if (sw) pickSwatch(sw);\n  });\n\n  /* ---------- boot: the runtime's one scan (first load + editor re-renders) ---------- */\n  S.scan(function (root) {\n    toArray(root.querySelectorAll('[data-cn-slideshow]')).forEach(initSlideshow);\n    toArray(root.querySelectorAll('[data-cn-slider]')).forEach(initSlider);\n    toArray(root.querySelectorAll('[data-cn-accordion]')).forEach(initAccordion);\n  });\n  /* Theme editor: a selected block that sits off-screen in a horizontal row (sliders, scrolling cards) comes into view. */\n  document.addEventListener('soooks:block:select', function (ev) {\n    var t = ev.target;\n    for (var p = t.parentElement; p && p !== document.body; p = p.parentElement) {\n      var ox = getComputedStyle(p).overflowX;\n      if ((ox === 'auto' || ox === 'scroll') && p.scrollWidth > p.clientWidth) {\n        var pr = p.getBoundingClientRect(), tr = t.getBoundingClientRect();\n        if (tr.left < pr.left || tr.right > pr.right) p.scrollBy({ left: tr.left - pr.left - (pr.width - tr.width) / 2, behavior: S.motion() === 'none' ? 'auto' : 'smooth' });\n        return;\n      }\n    }\n  });\n})();\n","layouts/theme.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Corner — body-level layout. The platform manages the document shell and\n  mounts global sections (announcement, header, footer, cart drawer)\n  around this file. Assets under assets/ load automatically.\n  Fonts: every offered family has 400–700, so one weight list fits all.\n{%- endcomment -%}\n{%- assign heading_font = settings.typography.heading_font | default: 'Plus Jakarta Sans' -%}\n{%- assign text_font = settings.typography.text_font | default: 'Inter' -%}\n{%- capture font_families -%}family={{ heading_font | replace: ' ', '+' }}:wght@400;500;600;700{% if text_font != heading_font %}&family={{ text_font | replace: ' ', '+' }}:wght@400;500;600;700{% endif %}{%- endcapture -%}\n<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n<link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css2?{{ font_families }}&display=swap\">\n{% render 'theme-vars' %}\n<a href=\"#cn-main\" class=\"cn-skip-link\" data-cn-skip>{{ 'general.skip_to_content' | t }}</a>\n<main id=\"cn-main\" class=\"cn-main\" tabindex=\"-1\">\n{{ content_for_layout }}\n</main>\n","locales/ar.json":"{\n  \"general\": {\n    \"skip_to_content\": \"انتقل إلى المحتوى\",\n    \"search\": \"بحث\",\n    \"search_placeholder\": \"ابحث في المتجر\",\n    \"menu\": \"القائمة\",\n    \"close\": \"إغلاق\",\n    \"cart\": \"السلة\",\n    \"account\": \"الحساب\",\n    \"continue_shopping\": \"متابعة التسوق\",\n    \"view_all\": \"عرض الكل\",\n    \"newsletter_placeholder\": \"البريد الإلكتروني\",\n    \"newsletter_button\": \"اشترك\",\n    \"newsletter_success\": \"شكرًا لك، تم تسجيلك في القائمة.\",\n    \"not_found_title\": \"الصفحة غير موجودة\",\n    \"not_found_text\": \"الصفحة التي تبحث عنها غير موجودة هنا. ربما نُقلت، أو أن الرابط لم يعد صالحًا.\",\n    \"back_home\": \"العودة إلى الصفحة الرئيسية\",\n    \"quick_add\": \"أضف\",\n    \"choose_options\": \"اختر الخيارات\",\n    \"added_to_cart\": \"أُضيف إلى سلتك\",\n    \"editor_checkout\": \"إتمام الشراء غير متاح في محرر القالب.\",\n    \"previous\": \"السابق\",\n    \"next\": \"التالي\",\n    \"pagination\": \"التنقل بين الصفحات\",\n    \"language\": \"اللغة\"\n  },\n  \"products\": {\n    \"add_to_cart\": \"أضف إلى السلة\",\n    \"sold_out\": \"نفدت الكمية\",\n    \"unavailable\": \"غير متوفر\",\n    \"adding\": \"جارٍ الإضافة…\",\n    \"added\": \"أُضيف إلى السلة\",\n    \"view_cart\": \"عرض السلة\",\n    \"quantity\": \"الكمية\",\n    \"vendor\": \"الصانع\",\n    \"from\": \"ابتداءً من\",\n    \"sale\": \"تخفيض\",\n    \"new\": \"جديد\",\n    \"related_title\": \"قد يعجبك أيضًا\",\n    \"description\": \"الوصف\",\n    \"details\": \"التفاصيل\",\n    \"shipping\": \"الشحن والإرجاع\",\n    \"low_stock\": \"بقي {count} فقط\",\n    \"in_stock\": \"متوفر\",\n    \"buy_now\": \"اشترِ الآن\",\n    \"out_of_stock\": \"غير متوفر في المخزون\",\n    \"share\": \"مشاركة\",\n    \"copy_link\": \"نسخ الرابط\",\n    \"link_copied\": \"تم نسخ الرابط\",\n    \"gallery_label\": \"صور المنتج\",\n    \"show_image\": \"عرض الصورة {index}\",\n    \"zoom_image\": \"تكبير الصورة {index}\",\n    \"previous_image\": \"الصورة السابقة\",\n    \"next_image\": \"الصورة التالية\",\n    \"decrease_quantity\": \"تقليل الكمية\",\n    \"increase_quantity\": \"زيادة الكمية\",\n    \"reviews_count\": \"التقييمات: {count}\",\n    \"no_related\": \"ستظهر المنتجات المشابهة هنا عندما يضم متجرك منتجات أكثر.\",\n    \"view_details\": \"عرض التفاصيل كاملة\"\n  },\n  \"collections\": {\n    \"products_count\": \"{count} منتج\",\n    \"empty\": \"لا توجد منتجات في هذه المجموعة بعد.\",\n    \"sort_label\": \"ترتيب\",\n    \"sort_newest\": \"الأحدث\",\n    \"sort_price_asc\": \"السعر: من الأقل إلى الأعلى\",\n    \"sort_price_desc\": \"السعر: من الأعلى إلى الأقل\",\n    \"sort_name\": \"أبجديًا\",\n    \"filter_in_stock\": \"المتوفر فقط\",\n    \"load_prev\": \"السابق\",\n    \"load_next\": \"التالي\",\n    \"all_products\": \"كل المنتجات\",\n    \"filters\": \"عوامل التصفية\",\n    \"filter_and_sort\": \"تصفية\",\n    \"availability\": \"التوفر\",\n    \"price\": \"السعر\",\n    \"price_min\": \"من\",\n    \"price_max\": \"إلى\",\n    \"price_range\": \"تتراوح الأسعار هنا بين {min} و{max}.\",\n    \"brand\": \"العلامة التجارية\",\n    \"collections\": \"المجموعات\",\n    \"apply\": \"تطبيق\",\n    \"clear_all\": \"مسح الكل\",\n    \"remove_filter\": \"إزالة عامل التصفية\",\n    \"show_results\": \"عرض النتائج\",\n    \"no_matches\": \"لا توجد منتجات تطابق عوامل التصفية هذه.\",\n    \"sort_featured\": \"المميزة\",\n    \"sort_best_selling\": \"الأكثر مبيعًا\",\n    \"sort_name_desc\": \"أبجديًا، ي–أ\",\n    \"load_more\": \"عرض المزيد\",\n    \"load_error\": \"تعذّر تحميل المزيد من المنتجات.\",\n    \"showing\": \"عرض {shown} من {total}\"\n  },\n  \"cart\": {\n    \"title\": \"سلة التسوق\",\n    \"empty\": \"سلة التسوق فارغة.\",\n    \"empty_hint\": \"كل ما تضيفه سيظهر هنا.\",\n    \"subtotal\": \"المجموع الفرعي\",\n    \"total\": \"الإجمالي\",\n    \"checkout\": \"إتمام الشراء\",\n    \"remove\": \"إزالة\",\n    \"note_label\": \"ملاحظة على الطلب\",\n    \"note_placeholder\": \"هل هناك ما يجب أن نعرفه؟\",\n    \"shipping_note\": \"تُحتسب رسوم الشحن والضرائب عند إتمام الشراء.\",\n    \"update_error\": \"تعذّر تحديث السلة. يُرجى المحاولة مرة أخرى.\",\n    \"stock_max\": \"المتوفر {count} فقط.\",\n    \"drawer_title\": \"سلة التسوق\",\n    \"drawer_empty\": \"سلة التسوق فارغة\",\n    \"view_cart\": \"عرض السلة\",\n    \"decrease\": \"تقليل الكمية\",\n    \"increase\": \"زيادة الكمية\",\n    \"free_shipping_left\": \"يتبقى {amount} للحصول على الشحن المجاني\",\n    \"free_shipping_done\": \"طلبك مؤهل للشحن المجاني\",\n    \"discount\": \"الخصم\",\n    \"product\": \"المنتج\",\n    \"summary\": \"ملخص الطلب\",\n    \"gift_card_for\": \"إلى\",\n    \"free_shipping_remaining\": \"يتبقى {amount} للحصول على الشحن المجاني.\",\n    \"free_shipping_reached\": \"طلبك مؤهل للشحن المجاني.\"\n  },\n  \"search\": {\n    \"title\": \"بحث\",\n    \"results_for\": \"نتيجة عن\",\n    \"no_results\": \"لا توجد نتائج عن\",\n    \"no_results_hint\": \"تحقّق من الإملاء، أو جرّب كلمة أعم.\",\n    \"placeholder\": \"ابحث عن المنتجات\",\n    \"products\": \"المنتجات\",\n    \"collections\": \"المجموعات\",\n    \"view_all\": \"عرض كل النتائج\",\n    \"loading\": \"جارٍ البحث…\",\n    \"popular\": \"عمليات البحث الشائعة\",\n    \"results_count\": \"{count} نتيجة عن «{terms}»\",\n    \"in_collection\": \"في\",\n    \"all_collections\": \"كل المجموعات\",\n    \"search_everywhere\": \"البحث في كل المنتجات\",\n    \"start_hint\": \"اكتب كلمة في الأعلى للبحث في المتجر.\"\n  },\n  \"blog\": {\n    \"read_more\": \"اقرأ المزيد\",\n    \"reading_time\": \"{minutes} دقائق للقراءة\",\n    \"back_to_journal\": \"العودة إلى المدونة\",\n    \"empty\": \"لم تُنشر أي قصص بعد.\",\n    \"all\": \"الكل\",\n    \"categories\": \"التصنيفات\",\n    \"by_author\": \"بقلم {author}\",\n    \"back_to_blog\": \"العودة إلى المدونة\",\n    \"related\": \"تابع القراءة\"\n  },\n  \"account\": {\n    \"sign_in\": \"تسجيل الدخول\",\n    \"create_account\": \"إنشاء حساب\",\n    \"email\": \"البريد الإلكتروني\",\n    \"password\": \"كلمة المرور\",\n    \"first_name\": \"الاسم الأول\",\n    \"last_name\": \"اسم العائلة\",\n    \"password_confirm\": \"تأكيد كلمة المرور\",\n    \"sign_out\": \"تسجيل الخروج\",\n    \"orders_title\": \"سجل الطلبات\",\n    \"orders_empty\": \"لا توجد طلبات بعد.\",\n    \"order\": \"الطلب\",\n    \"date\": \"التاريخ\",\n    \"status\": \"الحالة\",\n    \"total\": \"الإجمالي\",\n    \"show_password\": \"إظهار كلمة المرور\",\n    \"hide_password\": \"إخفاء كلمة المرور\",\n    \"forgot_password\": \"هل نسيت كلمة المرور؟\"\n  },\n  \"contact\": {\n    \"name\": \"الاسم\",\n    \"email\": \"البريد الإلكتروني\",\n    \"message\": \"الرسالة\",\n    \"send\": \"إرسال الرسالة\",\n    \"success\": \"شكرًا لك، سنرد عليك قريبًا.\"\n  },\n  \"footer\": {\n    \"rights\": \"جميع الحقوق محفوظة.\",\n    \"social_hint\": \"أضف روابط التواصل الاجتماعي من Theme settings → Social media.\",\n    \"payment_methods\": \"طرق الدفع\",\n    \"cash_on_delivery\": \"الدفع عند الاستلام\",\n    \"bank_transfer\": \"تحويل بنكي\"\n  },\n  \"onboarding\": {\n    \"product\": \"اسم المنتج\",\n    \"collection\": \"اسم المجموعة\",\n    \"article\": \"عنوان المقال\",\n    \"article_text\": \"اكتب نصًا عن مقالك في المدونة.\",\n    \"brand\": \"اسم العلامة التجارية\",\n    \"customer\": \"اسم العميل\",\n    \"author\": \"اسم الكاتب\",\n    \"page\": \"عنوان الصفحة\",\n    \"category\": \"اسم التصنيف\",\n    \"location\": \"اسم الموقع\"\n  },\n  \"editor\": {\n    \"collection_unavailable\": \"المجموعة غير متاحة\",\n    \"product_unavailable\": \"المنتج غير متاح\",\n    \"select_another\": \"اختر غيره من المحرر\"\n  },\n  \"header\": {\n    \"main_menu\": \"القائمة الرئيسية\",\n    \"view_all\": \"عرض الكل\"\n  },\n  \"announcement\": {\n    \"label\": \"إعلان\",\n    \"previous\": \"الرسالة السابقة\",\n    \"next\": \"الرسالة التالية\",\n    \"close\": \"إغلاق الإعلان\"\n  },\n  \"slideshow\": {\n    \"label\": \"عرض الشرائح\",\n    \"previous\": \"الشريحة السابقة\",\n    \"next\": \"الشريحة التالية\",\n    \"go_to\": \"الانتقال إلى الشريحة {n}\",\n    \"pause\": \"إيقاف عرض الشرائح مؤقتًا\",\n    \"play\": \"تشغيل عرض الشرائح\"\n  },\n  \"popup\": {\n    \"label\": \"النشرة البريدية\",\n    \"close\": \"إغلاق\",\n    \"email_placeholder\": \"البريد الإلكتروني\",\n    \"subscribe\": \"اشترك\",\n    \"success\": \"شكرًا لك، تم تسجيلك في القائمة.\",\n    \"copy\": \"نسخ\",\n    \"copied\": \"تم النسخ\",\n    \"continue\": \"متابعة التسوق\"\n  }\n}\n","locales/en.json":"{\n  \"general\": {\n    \"skip_to_content\": \"Skip to content\",\n    \"search\": \"Search\",\n    \"search_placeholder\": \"Search the shop\",\n    \"menu\": \"Menu\",\n    \"close\": \"Close\",\n    \"cart\": \"Cart\",\n    \"account\": \"Account\",\n    \"continue_shopping\": \"Continue shopping\",\n    \"view_all\": \"View all\",\n    \"newsletter_placeholder\": \"Email address\",\n    \"newsletter_button\": \"Subscribe\",\n    \"newsletter_success\": \"Thank you — you're on the list.\",\n    \"not_found_title\": \"Page not found\",\n    \"not_found_text\": \"The page you were looking for isn't here. It may have moved, or the link may be out of date.\",\n    \"back_home\": \"Back to the homepage\",\n    \"quick_add\": \"Add\",\n    \"choose_options\": \"Choose options\",\n    \"added_to_cart\": \"Added to your cart\",\n    \"editor_checkout\": \"Checkout is turned off in the theme editor.\",\n    \"previous\": \"Previous\",\n    \"next\": \"Next\",\n    \"pagination\": \"Pagination\",\n    \"language\": \"Language\"\n  },\n  \"products\": {\n    \"add_to_cart\": \"Add to cart\",\n    \"sold_out\": \"Sold out\",\n    \"unavailable\": \"Unavailable\",\n    \"adding\": \"Adding…\",\n    \"added\": \"Added to cart\",\n    \"view_cart\": \"View cart\",\n    \"quantity\": \"Quantity\",\n    \"vendor\": \"Maker\",\n    \"from\": \"From\",\n    \"sale\": \"Sale\",\n    \"new\": \"New\",\n    \"related_title\": \"You may also like\",\n    \"description\": \"Description\",\n    \"details\": \"Details\",\n    \"shipping\": \"Shipping & returns\",\n    \"low_stock\": \"Only {count} left\",\n    \"in_stock\": \"In stock\",\n    \"buy_now\": \"Buy it now\",\n    \"out_of_stock\": \"Out of stock\",\n    \"share\": \"Share\",\n    \"copy_link\": \"Copy link\",\n    \"link_copied\": \"Link copied\",\n    \"gallery_label\": \"Product images\",\n    \"show_image\": \"Show image {index}\",\n    \"zoom_image\": \"Open image {index} in zoom view\",\n    \"previous_image\": \"Previous image\",\n    \"next_image\": \"Next image\",\n    \"decrease_quantity\": \"Decrease quantity\",\n    \"increase_quantity\": \"Increase quantity\",\n    \"reviews_count\": \"{count} reviews\",\n    \"no_related\": \"Related products appear here once your store has more products.\",\n    \"view_details\": \"View full details\"\n  },\n  \"collections\": {\n    \"products_count\": \"{count} products\",\n    \"empty\": \"There are no products in this collection yet.\",\n    \"sort_label\": \"Sort\",\n    \"sort_newest\": \"Newest\",\n    \"sort_price_asc\": \"Price, low to high\",\n    \"sort_price_desc\": \"Price, high to low\",\n    \"sort_name\": \"Alphabetical\",\n    \"filter_in_stock\": \"In stock only\",\n    \"load_prev\": \"Previous\",\n    \"load_next\": \"Next\",\n    \"all_products\": \"All products\",\n    \"filters\": \"Filters\",\n    \"filter_and_sort\": \"Filter\",\n    \"availability\": \"Availability\",\n    \"price\": \"Price\",\n    \"price_min\": \"From\",\n    \"price_max\": \"To\",\n    \"price_range\": \"Prices here range from {min} to {max}.\",\n    \"brand\": \"Brand\",\n    \"collections\": \"Collections\",\n    \"apply\": \"Apply\",\n    \"clear_all\": \"Clear all\",\n    \"remove_filter\": \"Remove filter\",\n    \"show_results\": \"Show results\",\n    \"no_matches\": \"No products match these filters.\",\n    \"sort_featured\": \"Featured\",\n    \"sort_best_selling\": \"Best selling\",\n    \"sort_name_desc\": \"Alphabetical, Z–A\",\n    \"load_more\": \"Load more\",\n    \"load_error\": \"Could not load more products.\",\n    \"showing\": \"Showing {shown} of {total}\"\n  },\n  \"cart\": {\n    \"title\": \"Your cart\",\n    \"empty\": \"Your cart is empty.\",\n    \"empty_hint\": \"Everything you add ends up here.\",\n    \"subtotal\": \"Subtotal\",\n    \"total\": \"Total\",\n    \"checkout\": \"Check out\",\n    \"remove\": \"Remove\",\n    \"note_label\": \"Order note\",\n    \"note_placeholder\": \"Anything we should know?\",\n    \"shipping_note\": \"Shipping and taxes are calculated at checkout.\",\n    \"update_error\": \"Could not update the cart. Please try again.\",\n    \"stock_max\": \"Only {count} in stock.\",\n    \"drawer_title\": \"Your cart\",\n    \"drawer_empty\": \"Your cart is empty\",\n    \"view_cart\": \"View cart\",\n    \"decrease\": \"Decrease quantity\",\n    \"increase\": \"Increase quantity\",\n    \"free_shipping_left\": \"You're {amount} away from free shipping\",\n    \"free_shipping_done\": \"Your order ships free\",\n    \"discount\": \"Discount\",\n    \"product\": \"Product\",\n    \"summary\": \"Order summary\",\n    \"gift_card_for\": \"For\",\n    \"free_shipping_remaining\": \"You're {amount} away from free shipping.\",\n    \"free_shipping_reached\": \"Your order ships free.\"\n  },\n  \"search\": {\n    \"title\": \"Search\",\n    \"results_for\": \"results for\",\n    \"no_results\": \"Nothing found for\",\n    \"no_results_hint\": \"Check the spelling, or try a broader word.\",\n    \"placeholder\": \"Search products\",\n    \"products\": \"Products\",\n    \"collections\": \"Collections\",\n    \"view_all\": \"View all results\",\n    \"loading\": \"Searching…\",\n    \"popular\": \"Popular searches\",\n    \"results_count\": \"{count} results for “{terms}”\",\n    \"in_collection\": \"In\",\n    \"all_collections\": \"All collections\",\n    \"search_everywhere\": \"Search all products\",\n    \"start_hint\": \"Type a word above to search the store.\"\n  },\n  \"blog\": {\n    \"read_more\": \"Read more\",\n    \"reading_time\": \"{minutes} min read\",\n    \"back_to_journal\": \"Back to the journal\",\n    \"empty\": \"No stories published yet.\",\n    \"all\": \"All\",\n    \"categories\": \"Categories\",\n    \"by_author\": \"By {author}\",\n    \"back_to_blog\": \"Back to the blog\",\n    \"related\": \"Keep reading\"\n  },\n  \"account\": {\n    \"sign_in\": \"Sign in\",\n    \"create_account\": \"Create account\",\n    \"email\": \"Email\",\n    \"password\": \"Password\",\n    \"first_name\": \"First name\",\n    \"last_name\": \"Last name\",\n    \"password_confirm\": \"Confirm password\",\n    \"sign_out\": \"Sign out\",\n    \"orders_title\": \"Order history\",\n    \"orders_empty\": \"No orders yet.\",\n    \"order\": \"Order\",\n    \"date\": \"Date\",\n    \"status\": \"Status\",\n    \"total\": \"Total\",\n    \"show_password\": \"Show password\",\n    \"hide_password\": \"Hide password\",\n    \"forgot_password\": \"Forgot your password?\"\n  },\n  \"contact\": {\n    \"name\": \"Name\",\n    \"email\": \"Email\",\n    \"message\": \"Message\",\n    \"send\": \"Send message\",\n    \"success\": \"Thank you — we'll reply soon.\"\n  },\n  \"footer\": {\n    \"rights\": \"All rights reserved.\",\n    \"social_hint\": \"Add social links in Theme settings → Social media.\",\n    \"payment_methods\": \"Payment methods\",\n    \"cash_on_delivery\": \"Cash on delivery\",\n    \"bank_transfer\": \"Bank transfer\"\n  },\n  \"onboarding\": {\n    \"product\": \"Product title\",\n    \"collection\": \"Collection title\",\n    \"article\": \"Article title\",\n    \"article_text\": \"Write text about your blog post.\",\n    \"brand\": \"Brand name\",\n    \"customer\": \"Customer name\",\n    \"author\": \"Author name\",\n    \"page\": \"Page title\",\n    \"category\": \"Category title\",\n    \"location\": \"Location name\"\n  },\n  \"editor\": {\n    \"collection_unavailable\": \"Collection unavailable\",\n    \"product_unavailable\": \"Product unavailable\",\n    \"select_another\": \"Select another in the editor\"\n  },\n  \"header\": {\n    \"main_menu\": \"Main menu\",\n    \"view_all\": \"View all\"\n  },\n  \"announcement\": {\n    \"label\": \"Announcement\",\n    \"previous\": \"Previous message\",\n    \"next\": \"Next message\",\n    \"close\": \"Close announcement\"\n  },\n  \"slideshow\": {\n    \"label\": \"Slideshow\",\n    \"previous\": \"Previous slide\",\n    \"next\": \"Next slide\",\n    \"go_to\": \"Go to slide {n}\",\n    \"pause\": \"Pause slideshow\",\n    \"play\": \"Play slideshow\"\n  },\n  \"popup\": {\n    \"label\": \"Newsletter\",\n    \"close\": \"Close\",\n    \"email_placeholder\": \"Email address\",\n    \"subscribe\": \"Subscribe\",\n    \"success\": \"Thank you — you’re on the list.\",\n    \"copy\": \"Copy\",\n    \"copied\": \"Copied\",\n    \"continue\": \"Continue shopping\"\n  }\n}\n","locales/es.json":"{\n  \"general\": {\n    \"skip_to_content\": \"Saltar al contenido\",\n    \"search\": \"Buscar\",\n    \"search_placeholder\": \"Buscar en la tienda\",\n    \"menu\": \"Menú\",\n    \"close\": \"Cerrar\",\n    \"cart\": \"Carrito\",\n    \"account\": \"Cuenta\",\n    \"continue_shopping\": \"Seguir comprando\",\n    \"view_all\": \"Ver todo\",\n    \"newsletter_placeholder\": \"Correo electrónico\",\n    \"newsletter_button\": \"Suscribirme\",\n    \"newsletter_success\": \"¡Gracias! Ya estás en la lista.\",\n    \"not_found_title\": \"Página no encontrada\",\n    \"not_found_text\": \"La página que buscas no está aquí. Puede que se haya movido o que el enlace esté desactualizado.\",\n    \"back_home\": \"Volver a la página de inicio\",\n    \"quick_add\": \"Añadir\",\n    \"choose_options\": \"Elegir opciones\",\n    \"added_to_cart\": \"Añadido a tu carrito\",\n    \"editor_checkout\": \"El pago está desactivado en el editor de temas.\",\n    \"previous\": \"Anterior\",\n    \"next\": \"Siguiente\",\n    \"pagination\": \"Paginación\",\n    \"language\": \"Idioma\"\n  },\n  \"products\": {\n    \"add_to_cart\": \"Añadir al carrito\",\n    \"sold_out\": \"Agotado\",\n    \"unavailable\": \"No disponible\",\n    \"adding\": \"Añadiendo…\",\n    \"added\": \"Añadido al carrito\",\n    \"view_cart\": \"Ver carrito\",\n    \"quantity\": \"Cantidad\",\n    \"vendor\": \"Fabricante\",\n    \"from\": \"Desde\",\n    \"sale\": \"Oferta\",\n    \"new\": \"Nuevo\",\n    \"related_title\": \"También te puede gustar\",\n    \"description\": \"Descripción\",\n    \"details\": \"Detalles\",\n    \"shipping\": \"Envíos y devoluciones\",\n    \"low_stock\": \"Solo quedan {count}\",\n    \"in_stock\": \"En stock\",\n    \"buy_now\": \"Comprar ahora\",\n    \"out_of_stock\": \"Sin stock\",\n    \"share\": \"Compartir\",\n    \"copy_link\": \"Copiar enlace\",\n    \"link_copied\": \"Enlace copiado\",\n    \"gallery_label\": \"Imágenes del producto\",\n    \"show_image\": \"Mostrar imagen {index}\",\n    \"zoom_image\": \"Ampliar imagen {index}\",\n    \"previous_image\": \"Imagen anterior\",\n    \"next_image\": \"Imagen siguiente\",\n    \"decrease_quantity\": \"Reducir cantidad\",\n    \"increase_quantity\": \"Aumentar cantidad\",\n    \"reviews_count\": \"{count} reseñas\",\n    \"no_related\": \"Aquí aparecerán productos relacionados cuando tu tienda tenga más productos.\",\n    \"view_details\": \"Ver todos los detalles\"\n  },\n  \"collections\": {\n    \"products_count\": \"{count} productos\",\n    \"empty\": \"Todavía no hay productos en esta colección.\",\n    \"sort_label\": \"Ordenar\",\n    \"sort_newest\": \"Más recientes\",\n    \"sort_price_asc\": \"Precio: de menor a mayor\",\n    \"sort_price_desc\": \"Precio: de mayor a menor\",\n    \"sort_name\": \"Alfabéticamente\",\n    \"filter_in_stock\": \"Solo en stock\",\n    \"load_prev\": \"Anterior\",\n    \"load_next\": \"Siguiente\",\n    \"all_products\": \"Todos los productos\",\n    \"filters\": \"Filtros\",\n    \"filter_and_sort\": \"Filtrar\",\n    \"availability\": \"Disponibilidad\",\n    \"price\": \"Precio\",\n    \"price_min\": \"Desde\",\n    \"price_max\": \"Hasta\",\n    \"price_range\": \"Los precios van de {min} a {max}.\",\n    \"brand\": \"Marca\",\n    \"collections\": \"Colecciones\",\n    \"apply\": \"Aplicar\",\n    \"clear_all\": \"Borrar todo\",\n    \"remove_filter\": \"Quitar filtro\",\n    \"show_results\": \"Ver resultados\",\n    \"no_matches\": \"Ningún producto coincide con estos filtros.\",\n    \"sort_featured\": \"Destacados\",\n    \"sort_best_selling\": \"Más vendidos\",\n    \"sort_name_desc\": \"Alfabéticamente, Z–A\",\n    \"load_more\": \"Cargar más\",\n    \"load_error\": \"No se pudieron cargar más productos.\",\n    \"showing\": \"Mostrando {shown} de {total}\"\n  },\n  \"cart\": {\n    \"title\": \"Tu carrito\",\n    \"empty\": \"Tu carrito está vacío.\",\n    \"empty_hint\": \"Todo lo que añadas aparecerá aquí.\",\n    \"subtotal\": \"Subtotal\",\n    \"total\": \"Total\",\n    \"checkout\": \"Finalizar compra\",\n    \"remove\": \"Eliminar\",\n    \"note_label\": \"Nota del pedido\",\n    \"note_placeholder\": \"¿Hay algo que debamos saber?\",\n    \"shipping_note\": \"Los gastos de envío y los impuestos se calculan al finalizar la compra.\",\n    \"update_error\": \"No se pudo actualizar el carrito. Inténtalo de nuevo.\",\n    \"stock_max\": \"Solo hay {count} en stock.\",\n    \"drawer_title\": \"Tu carrito\",\n    \"drawer_empty\": \"Tu carrito está vacío\",\n    \"view_cart\": \"Ver carrito\",\n    \"decrease\": \"Reducir cantidad\",\n    \"increase\": \"Aumentar cantidad\",\n    \"free_shipping_left\": \"Te faltan {amount} para el envío gratis\",\n    \"free_shipping_done\": \"Tu pedido tiene envío gratis\",\n    \"discount\": \"Descuento\",\n    \"product\": \"Producto\",\n    \"summary\": \"Resumen del pedido\",\n    \"gift_card_for\": \"Para\",\n    \"free_shipping_remaining\": \"Te faltan {amount} para el envío gratis.\",\n    \"free_shipping_reached\": \"Tu pedido tiene envío gratis.\"\n  },\n  \"search\": {\n    \"title\": \"Buscar\",\n    \"results_for\": \"resultados para\",\n    \"no_results\": \"No encontramos nada para\",\n    \"no_results_hint\": \"Revisa la ortografía o prueba con una palabra más general.\",\n    \"placeholder\": \"Buscar productos\",\n    \"products\": \"Productos\",\n    \"collections\": \"Colecciones\",\n    \"view_all\": \"Ver todos los resultados\",\n    \"loading\": \"Buscando…\",\n    \"popular\": \"Búsquedas populares\",\n    \"results_count\": \"{count} resultados para «{terms}»\",\n    \"in_collection\": \"En\",\n    \"all_collections\": \"Todas las colecciones\",\n    \"search_everywhere\": \"Buscar en todos los productos\",\n    \"start_hint\": \"Escribe una palabra arriba para buscar en la tienda.\"\n  },\n  \"blog\": {\n    \"read_more\": \"Leer más\",\n    \"reading_time\": \"{minutes} min de lectura\",\n    \"back_to_journal\": \"Volver al diario\",\n    \"empty\": \"Aún no hay historias publicadas.\",\n    \"all\": \"Todo\",\n    \"categories\": \"Categorías\",\n    \"by_author\": \"Por {author}\",\n    \"back_to_blog\": \"Volver al blog\",\n    \"related\": \"Sigue leyendo\"\n  },\n  \"account\": {\n    \"sign_in\": \"Iniciar sesión\",\n    \"create_account\": \"Crear cuenta\",\n    \"email\": \"Correo electrónico\",\n    \"password\": \"Contraseña\",\n    \"first_name\": \"Nombre\",\n    \"last_name\": \"Apellidos\",\n    \"password_confirm\": \"Confirmar contraseña\",\n    \"sign_out\": \"Cerrar sesión\",\n    \"orders_title\": \"Historial de pedidos\",\n    \"orders_empty\": \"Aún no tienes pedidos.\",\n    \"order\": \"Pedido\",\n    \"date\": \"Fecha\",\n    \"status\": \"Estado\",\n    \"total\": \"Total\",\n    \"show_password\": \"Mostrar contraseña\",\n    \"hide_password\": \"Ocultar contraseña\",\n    \"forgot_password\": \"¿Olvidaste tu contraseña?\"\n  },\n  \"contact\": {\n    \"name\": \"Nombre\",\n    \"email\": \"Correo electrónico\",\n    \"message\": \"Mensaje\",\n    \"send\": \"Enviar mensaje\",\n    \"success\": \"¡Gracias! Te responderemos pronto.\"\n  },\n  \"footer\": {\n    \"rights\": \"Todos los derechos reservados.\",\n    \"social_hint\": \"Añade tus redes sociales en Theme settings → Social media.\",\n    \"payment_methods\": \"Métodos de pago\",\n    \"cash_on_delivery\": \"Pago contra reembolso\",\n    \"bank_transfer\": \"Transferencia bancaria\"\n  },\n  \"onboarding\": {\n    \"product\": \"Título del producto\",\n    \"collection\": \"Título de la colección\",\n    \"article\": \"Título del artículo\",\n    \"article_text\": \"Escribe un texto sobre tu entrada del blog.\",\n    \"brand\": \"Nombre de la marca\",\n    \"customer\": \"Nombre del cliente\",\n    \"author\": \"Nombre del autor\",\n    \"page\": \"Título de la página\",\n    \"category\": \"Título de la categoría\",\n    \"location\": \"Nombre de la ubicación\"\n  },\n  \"editor\": {\n    \"collection_unavailable\": \"Colección no disponible\",\n    \"product_unavailable\": \"Producto no disponible\",\n    \"select_another\": \"Elige otra opción en el editor\"\n  },\n  \"header\": {\n    \"main_menu\": \"Menú principal\",\n    \"view_all\": \"Ver todo\"\n  },\n  \"announcement\": {\n    \"label\": \"Anuncio\",\n    \"previous\": \"Mensaje anterior\",\n    \"next\": \"Mensaje siguiente\",\n    \"close\": \"Cerrar anuncio\"\n  },\n  \"slideshow\": {\n    \"label\": \"Presentación\",\n    \"previous\": \"Diapositiva anterior\",\n    \"next\": \"Diapositiva siguiente\",\n    \"go_to\": \"Ir a la diapositiva {n}\",\n    \"pause\": \"Pausar la presentación\",\n    \"play\": \"Reproducir la presentación\"\n  },\n  \"popup\": {\n    \"label\": \"Boletín\",\n    \"close\": \"Cerrar\",\n    \"email_placeholder\": \"Correo electrónico\",\n    \"subscribe\": \"Suscribirme\",\n    \"success\": \"¡Gracias! Ya estás en la lista.\",\n    \"copy\": \"Copiar\",\n    \"copied\": \"Copiado\",\n    \"continue\": \"Seguir comprando\"\n  }\n}\n","locales/fr.json":"{\n  \"general\": {\n    \"skip_to_content\": \"Aller au contenu\",\n    \"search\": \"Rechercher\",\n    \"search_placeholder\": \"Rechercher dans la boutique\",\n    \"menu\": \"Menu\",\n    \"close\": \"Fermer\",\n    \"cart\": \"Panier\",\n    \"account\": \"Compte\",\n    \"continue_shopping\": \"Continuer vos achats\",\n    \"view_all\": \"Tout voir\",\n    \"newsletter_placeholder\": \"Adresse e-mail\",\n    \"newsletter_button\": \"S'abonner\",\n    \"newsletter_success\": \"Merci ! Votre inscription est confirmée.\",\n    \"not_found_title\": \"Page introuvable\",\n    \"not_found_text\": \"La page que vous cherchez n'est pas ici. Elle a peut-être été déplacée, ou le lien n'est plus à jour.\",\n    \"back_home\": \"Retour à l'accueil\",\n    \"quick_add\": \"Ajouter\",\n    \"choose_options\": \"Choisir les options\",\n    \"added_to_cart\": \"Ajouté à votre panier\",\n    \"editor_checkout\": \"Le paiement est désactivé dans l'éditeur de thème.\",\n    \"previous\": \"Précédent\",\n    \"next\": \"Suivant\",\n    \"pagination\": \"Pagination\",\n    \"language\": \"Langue\"\n  },\n  \"products\": {\n    \"add_to_cart\": \"Ajouter au panier\",\n    \"sold_out\": \"Épuisé\",\n    \"unavailable\": \"Indisponible\",\n    \"adding\": \"Ajout…\",\n    \"added\": \"Ajouté au panier\",\n    \"view_cart\": \"Voir le panier\",\n    \"quantity\": \"Quantité\",\n    \"vendor\": \"Fabricant\",\n    \"from\": \"À partir de\",\n    \"sale\": \"Promo\",\n    \"new\": \"Nouveau\",\n    \"related_title\": \"Vous aimerez aussi\",\n    \"description\": \"Description\",\n    \"details\": \"Détails\",\n    \"shipping\": \"Livraison et retours\",\n    \"low_stock\": \"Plus que {count} en stock\",\n    \"in_stock\": \"En stock\",\n    \"buy_now\": \"Acheter maintenant\",\n    \"out_of_stock\": \"Rupture de stock\",\n    \"share\": \"Partager\",\n    \"copy_link\": \"Copier le lien\",\n    \"link_copied\": \"Lien copié\",\n    \"gallery_label\": \"Images du produit\",\n    \"show_image\": \"Afficher l'image {index}\",\n    \"zoom_image\": \"Agrandir l'image {index}\",\n    \"previous_image\": \"Image précédente\",\n    \"next_image\": \"Image suivante\",\n    \"decrease_quantity\": \"Diminuer la quantité\",\n    \"increase_quantity\": \"Augmenter la quantité\",\n    \"reviews_count\": \"{count} avis\",\n    \"no_related\": \"Des produits similaires apparaîtront ici dès que votre boutique en comptera davantage.\",\n    \"view_details\": \"Voir tous les détails\"\n  },\n  \"collections\": {\n    \"products_count\": \"{count} produits\",\n    \"empty\": \"Cette collection ne contient encore aucun produit.\",\n    \"sort_label\": \"Trier\",\n    \"sort_newest\": \"Nouveautés\",\n    \"sort_price_asc\": \"Prix croissant\",\n    \"sort_price_desc\": \"Prix décroissant\",\n    \"sort_name\": \"Ordre alphabétique\",\n    \"filter_in_stock\": \"En stock uniquement\",\n    \"load_prev\": \"Précédent\",\n    \"load_next\": \"Suivant\",\n    \"all_products\": \"Tous les produits\",\n    \"filters\": \"Filtres\",\n    \"filter_and_sort\": \"Filtrer\",\n    \"availability\": \"Disponibilité\",\n    \"price\": \"Prix\",\n    \"price_min\": \"De\",\n    \"price_max\": \"À\",\n    \"price_range\": \"Les prix vont de {min} à {max}.\",\n    \"brand\": \"Marque\",\n    \"collections\": \"Collections\",\n    \"apply\": \"Appliquer\",\n    \"clear_all\": \"Tout effacer\",\n    \"remove_filter\": \"Retirer le filtre\",\n    \"show_results\": \"Voir les résultats\",\n    \"no_matches\": \"Aucun produit ne correspond à ces filtres.\",\n    \"sort_featured\": \"En vedette\",\n    \"sort_best_selling\": \"Meilleures ventes\",\n    \"sort_name_desc\": \"Ordre alphabétique, Z–A\",\n    \"load_more\": \"Afficher plus\",\n    \"load_error\": \"Impossible de charger plus de produits.\",\n    \"showing\": \"Affichage de {shown} sur {total}\"\n  },\n  \"cart\": {\n    \"title\": \"Votre panier\",\n    \"empty\": \"Votre panier est vide.\",\n    \"empty_hint\": \"Tout ce que vous ajoutez arrive ici.\",\n    \"subtotal\": \"Sous-total\",\n    \"total\": \"Total\",\n    \"checkout\": \"Passer la commande\",\n    \"remove\": \"Supprimer\",\n    \"note_label\": \"Note de commande\",\n    \"note_placeholder\": \"Quelque chose à nous signaler ?\",\n    \"shipping_note\": \"Les frais de livraison et les taxes sont calculés lors du paiement.\",\n    \"update_error\": \"Impossible de mettre à jour le panier. Veuillez réessayer.\",\n    \"stock_max\": \"Seulement {count} en stock.\",\n    \"drawer_title\": \"Votre panier\",\n    \"drawer_empty\": \"Votre panier est vide\",\n    \"view_cart\": \"Voir le panier\",\n    \"decrease\": \"Diminuer la quantité\",\n    \"increase\": \"Augmenter la quantité\",\n    \"free_shipping_left\": \"Plus que {amount} pour profiter de la livraison gratuite\",\n    \"free_shipping_done\": \"La livraison de votre commande est offerte\",\n    \"discount\": \"Réduction\",\n    \"product\": \"Produit\",\n    \"summary\": \"Récapitulatif de la commande\",\n    \"gift_card_for\": \"Pour\",\n    \"free_shipping_remaining\": \"Plus que {amount} pour profiter de la livraison gratuite.\",\n    \"free_shipping_reached\": \"La livraison de votre commande est offerte.\"\n  },\n  \"search\": {\n    \"title\": \"Recherche\",\n    \"results_for\": \"résultats pour\",\n    \"no_results\": \"Aucun résultat pour\",\n    \"no_results_hint\": \"Vérifiez l'orthographe ou essayez un terme plus général.\",\n    \"placeholder\": \"Rechercher des produits\",\n    \"products\": \"Produits\",\n    \"collections\": \"Collections\",\n    \"view_all\": \"Voir tous les résultats\",\n    \"loading\": \"Recherche…\",\n    \"popular\": \"Recherches populaires\",\n    \"results_count\": \"{count} résultats pour « {terms} »\",\n    \"in_collection\": \"Dans\",\n    \"all_collections\": \"Toutes les collections\",\n    \"search_everywhere\": \"Rechercher dans tous les produits\",\n    \"start_hint\": \"Saisissez un mot ci-dessus pour rechercher dans la boutique.\"\n  },\n  \"blog\": {\n    \"read_more\": \"Lire la suite\",\n    \"reading_time\": \"{minutes} min de lecture\",\n    \"back_to_journal\": \"Retour au journal\",\n    \"empty\": \"Aucun article publié pour le moment.\",\n    \"all\": \"Tous\",\n    \"categories\": \"Catégories\",\n    \"by_author\": \"Par {author}\",\n    \"back_to_blog\": \"Retour au blog\",\n    \"related\": \"À lire aussi\"\n  },\n  \"account\": {\n    \"sign_in\": \"Se connecter\",\n    \"create_account\": \"Créer un compte\",\n    \"email\": \"E-mail\",\n    \"password\": \"Mot de passe\",\n    \"first_name\": \"Prénom\",\n    \"last_name\": \"Nom\",\n    \"password_confirm\": \"Confirmer le mot de passe\",\n    \"sign_out\": \"Se déconnecter\",\n    \"orders_title\": \"Historique des commandes\",\n    \"orders_empty\": \"Aucune commande pour le moment.\",\n    \"order\": \"Commande\",\n    \"date\": \"Date\",\n    \"status\": \"Statut\",\n    \"total\": \"Total\",\n    \"show_password\": \"Afficher le mot de passe\",\n    \"hide_password\": \"Masquer le mot de passe\",\n    \"forgot_password\": \"Mot de passe oublié ?\"\n  },\n  \"contact\": {\n    \"name\": \"Nom\",\n    \"email\": \"E-mail\",\n    \"message\": \"Message\",\n    \"send\": \"Envoyer le message\",\n    \"success\": \"Merci ! Nous vous répondrons très vite.\"\n  },\n  \"footer\": {\n    \"rights\": \"Tous droits réservés.\",\n    \"social_hint\": \"Ajoutez vos réseaux sociaux dans Theme settings → Social media.\",\n    \"payment_methods\": \"Moyens de paiement\",\n    \"cash_on_delivery\": \"Paiement à la livraison\",\n    \"bank_transfer\": \"Virement bancaire\"\n  },\n  \"onboarding\": {\n    \"product\": \"Titre du produit\",\n    \"collection\": \"Titre de la collection\",\n    \"article\": \"Titre de l'article\",\n    \"article_text\": \"Rédigez un texte sur votre article de blog.\",\n    \"brand\": \"Nom de la marque\",\n    \"customer\": \"Nom du client\",\n    \"author\": \"Nom de l'auteur\",\n    \"page\": \"Titre de la page\",\n    \"category\": \"Titre de la catégorie\",\n    \"location\": \"Nom du lieu\"\n  },\n  \"editor\": {\n    \"collection_unavailable\": \"Collection indisponible\",\n    \"product_unavailable\": \"Produit indisponible\",\n    \"select_another\": \"Faites un autre choix dans l'éditeur\"\n  },\n  \"header\": {\n    \"main_menu\": \"Menu principal\",\n    \"view_all\": \"Tout voir\"\n  },\n  \"announcement\": {\n    \"label\": \"Annonce\",\n    \"previous\": \"Message précédent\",\n    \"next\": \"Message suivant\",\n    \"close\": \"Fermer l'annonce\"\n  },\n  \"slideshow\": {\n    \"label\": \"Diaporama\",\n    \"previous\": \"Diapositive précédente\",\n    \"next\": \"Diapositive suivante\",\n    \"go_to\": \"Aller à la diapositive {n}\",\n    \"pause\": \"Mettre le diaporama en pause\",\n    \"play\": \"Lancer le diaporama\"\n  },\n  \"popup\": {\n    \"label\": \"Newsletter\",\n    \"close\": \"Fermer\",\n    \"email_placeholder\": \"Adresse e-mail\",\n    \"subscribe\": \"S'abonner\",\n    \"success\": \"Merci ! Votre inscription est confirmée.\",\n    \"copy\": \"Copier\",\n    \"copied\": \"Copié\",\n    \"continue\": \"Continuer vos achats\"\n  }\n}\n","locales/it.json":"{\n  \"general\": {\n    \"skip_to_content\": \"Vai al contenuto\",\n    \"search\": \"Cerca\",\n    \"search_placeholder\": \"Cerca nel negozio\",\n    \"menu\": \"Menu\",\n    \"close\": \"Chiudi\",\n    \"cart\": \"Carrello\",\n    \"account\": \"Account\",\n    \"continue_shopping\": \"Continua lo shopping\",\n    \"view_all\": \"Vedi tutto\",\n    \"newsletter_placeholder\": \"Indirizzo email\",\n    \"newsletter_button\": \"Iscriviti\",\n    \"newsletter_success\": \"Grazie! Sei nella lista.\",\n    \"not_found_title\": \"Pagina non trovata\",\n    \"not_found_text\": \"La pagina che cerchi non è qui. Potrebbe essere stata spostata, oppure il link non è più aggiornato.\",\n    \"back_home\": \"Torna alla home page\",\n    \"quick_add\": \"Aggiungi\",\n    \"choose_options\": \"Scegli le opzioni\",\n    \"added_to_cart\": \"Aggiunto al carrello\",\n    \"editor_checkout\": \"Il checkout è disattivato nell'editor del tema.\",\n    \"previous\": \"Precedente\",\n    \"next\": \"Successivo\",\n    \"pagination\": \"Paginazione\",\n    \"language\": \"Lingua\"\n  },\n  \"products\": {\n    \"add_to_cart\": \"Aggiungi al carrello\",\n    \"sold_out\": \"Esaurito\",\n    \"unavailable\": \"Non disponibile\",\n    \"adding\": \"Aggiunta in corso…\",\n    \"added\": \"Aggiunto al carrello\",\n    \"view_cart\": \"Vedi carrello\",\n    \"quantity\": \"Quantità\",\n    \"vendor\": \"Produttore\",\n    \"from\": \"Da\",\n    \"sale\": \"Saldi\",\n    \"new\": \"Novità\",\n    \"related_title\": \"Potrebbe piacerti anche\",\n    \"description\": \"Descrizione\",\n    \"details\": \"Dettagli\",\n    \"shipping\": \"Spedizioni e resi\",\n    \"low_stock\": \"Ne restano solo {count}\",\n    \"in_stock\": \"Disponibile\",\n    \"buy_now\": \"Acquista ora\",\n    \"out_of_stock\": \"Non disponibile in magazzino\",\n    \"share\": \"Condividi\",\n    \"copy_link\": \"Copia link\",\n    \"link_copied\": \"Link copiato\",\n    \"gallery_label\": \"Immagini del prodotto\",\n    \"show_image\": \"Mostra immagine {index}\",\n    \"zoom_image\": \"Ingrandisci immagine {index}\",\n    \"previous_image\": \"Immagine precedente\",\n    \"next_image\": \"Immagine successiva\",\n    \"decrease_quantity\": \"Diminuisci quantità\",\n    \"increase_quantity\": \"Aumenta quantità\",\n    \"reviews_count\": \"{count} recensioni\",\n    \"no_related\": \"I prodotti correlati appariranno qui quando il tuo negozio avrà più prodotti.\",\n    \"view_details\": \"Vedi tutti i dettagli\"\n  },\n  \"collections\": {\n    \"products_count\": \"{count} prodotti\",\n    \"empty\": \"In questa collezione non ci sono ancora prodotti.\",\n    \"sort_label\": \"Ordina\",\n    \"sort_newest\": \"Più recenti\",\n    \"sort_price_asc\": \"Prezzo crescente\",\n    \"sort_price_desc\": \"Prezzo decrescente\",\n    \"sort_name\": \"Ordine alfabetico\",\n    \"filter_in_stock\": \"Solo disponibili\",\n    \"load_prev\": \"Precedente\",\n    \"load_next\": \"Successivo\",\n    \"all_products\": \"Tutti i prodotti\",\n    \"filters\": \"Filtri\",\n    \"filter_and_sort\": \"Filtra\",\n    \"availability\": \"Disponibilità\",\n    \"price\": \"Prezzo\",\n    \"price_min\": \"Da\",\n    \"price_max\": \"A\",\n    \"price_range\": \"I prezzi vanno da {min} a {max}.\",\n    \"brand\": \"Marca\",\n    \"collections\": \"Collezioni\",\n    \"apply\": \"Applica\",\n    \"clear_all\": \"Cancella tutto\",\n    \"remove_filter\": \"Rimuovi filtro\",\n    \"show_results\": \"Mostra risultati\",\n    \"no_matches\": \"Nessun prodotto corrisponde a questi filtri.\",\n    \"sort_featured\": \"In evidenza\",\n    \"sort_best_selling\": \"Più venduti\",\n    \"sort_name_desc\": \"Ordine alfabetico, Z–A\",\n    \"load_more\": \"Carica altri\",\n    \"load_error\": \"Impossibile caricare altri prodotti.\",\n    \"showing\": \"Mostrati {shown} di {total}\"\n  },\n  \"cart\": {\n    \"title\": \"Il tuo carrello\",\n    \"empty\": \"Il tuo carrello è vuoto.\",\n    \"empty_hint\": \"Tutto ciò che aggiungi finisce qui.\",\n    \"subtotal\": \"Subtotale\",\n    \"total\": \"Totale\",\n    \"checkout\": \"Procedi all'acquisto\",\n    \"remove\": \"Rimuovi\",\n    \"note_label\": \"Nota per l'ordine\",\n    \"note_placeholder\": \"C'è qualcosa che dovremmo sapere?\",\n    \"shipping_note\": \"Spedizione e tasse vengono calcolate al momento del pagamento.\",\n    \"update_error\": \"Impossibile aggiornare il carrello. Riprova.\",\n    \"stock_max\": \"Solo {count} disponibili.\",\n    \"drawer_title\": \"Il tuo carrello\",\n    \"drawer_empty\": \"Il tuo carrello è vuoto\",\n    \"view_cart\": \"Vedi carrello\",\n    \"decrease\": \"Diminuisci quantità\",\n    \"increase\": \"Aumenta quantità\",\n    \"free_shipping_left\": \"Ti mancano {amount} per la spedizione gratuita\",\n    \"free_shipping_done\": \"Il tuo ordine ha la spedizione gratuita\",\n    \"discount\": \"Sconto\",\n    \"product\": \"Prodotto\",\n    \"summary\": \"Riepilogo dell'ordine\",\n    \"gift_card_for\": \"Per\",\n    \"free_shipping_remaining\": \"Ti mancano {amount} per la spedizione gratuita.\",\n    \"free_shipping_reached\": \"Il tuo ordine ha la spedizione gratuita.\"\n  },\n  \"search\": {\n    \"title\": \"Cerca\",\n    \"results_for\": \"risultati per\",\n    \"no_results\": \"Nessun risultato per\",\n    \"no_results_hint\": \"Controlla l'ortografia o prova con una parola più generica.\",\n    \"placeholder\": \"Cerca prodotti\",\n    \"products\": \"Prodotti\",\n    \"collections\": \"Collezioni\",\n    \"view_all\": \"Vedi tutti i risultati\",\n    \"loading\": \"Ricerca in corso…\",\n    \"popular\": \"Ricerche popolari\",\n    \"results_count\": \"{count} risultati per «{terms}»\",\n    \"in_collection\": \"In\",\n    \"all_collections\": \"Tutte le collezioni\",\n    \"search_everywhere\": \"Cerca in tutti i prodotti\",\n    \"start_hint\": \"Scrivi una parola qui sopra per cercare nel negozio.\"\n  },\n  \"blog\": {\n    \"read_more\": \"Leggi di più\",\n    \"reading_time\": \"{minutes} min di lettura\",\n    \"back_to_journal\": \"Torna al journal\",\n    \"empty\": \"Nessuna storia pubblicata per ora.\",\n    \"all\": \"Tutti\",\n    \"categories\": \"Categorie\",\n    \"by_author\": \"Di {author}\",\n    \"back_to_blog\": \"Torna al blog\",\n    \"related\": \"Continua a leggere\"\n  },\n  \"account\": {\n    \"sign_in\": \"Accedi\",\n    \"create_account\": \"Crea un account\",\n    \"email\": \"Email\",\n    \"password\": \"Password\",\n    \"first_name\": \"Nome\",\n    \"last_name\": \"Cognome\",\n    \"password_confirm\": \"Conferma password\",\n    \"sign_out\": \"Esci\",\n    \"orders_title\": \"Cronologia ordini\",\n    \"orders_empty\": \"Nessun ordine per ora.\",\n    \"order\": \"Ordine\",\n    \"date\": \"Data\",\n    \"status\": \"Stato\",\n    \"total\": \"Totale\",\n    \"show_password\": \"Mostra password\",\n    \"hide_password\": \"Nascondi password\",\n    \"forgot_password\": \"Password dimenticata?\"\n  },\n  \"contact\": {\n    \"name\": \"Nome\",\n    \"email\": \"Email\",\n    \"message\": \"Messaggio\",\n    \"send\": \"Invia messaggio\",\n    \"success\": \"Grazie! Ti risponderemo presto.\"\n  },\n  \"footer\": {\n    \"rights\": \"Tutti i diritti riservati.\",\n    \"social_hint\": \"Aggiungi i tuoi social in Theme settings → Social media.\",\n    \"payment_methods\": \"Metodi di pagamento\",\n    \"cash_on_delivery\": \"Pagamento alla consegna\",\n    \"bank_transfer\": \"Bonifico bancario\"\n  },\n  \"onboarding\": {\n    \"product\": \"Titolo del prodotto\",\n    \"collection\": \"Titolo della collezione\",\n    \"article\": \"Titolo dell'articolo\",\n    \"article_text\": \"Scrivi un testo sul tuo articolo del blog.\",\n    \"brand\": \"Nome del brand\",\n    \"customer\": \"Nome del cliente\",\n    \"author\": \"Nome dell'autore\",\n    \"page\": \"Titolo della pagina\",\n    \"category\": \"Titolo della categoria\",\n    \"location\": \"Nome della sede\"\n  },\n  \"editor\": {\n    \"collection_unavailable\": \"Collezione non disponibile\",\n    \"product_unavailable\": \"Prodotto non disponibile\",\n    \"select_another\": \"Fai un'altra scelta nell'editor\"\n  },\n  \"header\": {\n    \"main_menu\": \"Menu principale\",\n    \"view_all\": \"Vedi tutto\"\n  },\n  \"announcement\": {\n    \"label\": \"Annuncio\",\n    \"previous\": \"Messaggio precedente\",\n    \"next\": \"Messaggio successivo\",\n    \"close\": \"Chiudi annuncio\"\n  },\n  \"slideshow\": {\n    \"label\": \"Presentazione\",\n    \"previous\": \"Slide precedente\",\n    \"next\": \"Slide successiva\",\n    \"go_to\": \"Vai alla slide {n}\",\n    \"pause\": \"Metti in pausa la presentazione\",\n    \"play\": \"Avvia la presentazione\"\n  },\n  \"popup\": {\n    \"label\": \"Newsletter\",\n    \"close\": \"Chiudi\",\n    \"email_placeholder\": \"Indirizzo email\",\n    \"subscribe\": \"Iscriviti\",\n    \"success\": \"Grazie! Sei nella lista.\",\n    \"copy\": \"Copia\",\n    \"copied\": \"Copiato\",\n    \"continue\": \"Continua lo shopping\"\n  }\n}\n","locales/tr.json":"{\n  \"general\": {\n    \"skip_to_content\": \"İçeriğe geç\",\n    \"search\": \"Ara\",\n    \"search_placeholder\": \"Mağazada arayın\",\n    \"menu\": \"Menü\",\n    \"close\": \"Kapat\",\n    \"cart\": \"Sepet\",\n    \"account\": \"Hesap\",\n    \"continue_shopping\": \"Alışverişe devam et\",\n    \"view_all\": \"Tümünü gör\",\n    \"newsletter_placeholder\": \"E-posta adresi\",\n    \"newsletter_button\": \"Abone ol\",\n    \"newsletter_success\": \"Teşekkürler, listemize katıldınız.\",\n    \"not_found_title\": \"Sayfa bulunamadı\",\n    \"not_found_text\": \"Aradığınız sayfa burada değil. Taşınmış olabilir ya da bağlantı güncel olmayabilir.\",\n    \"back_home\": \"Ana sayfaya dön\",\n    \"quick_add\": \"Ekle\",\n    \"choose_options\": \"Seçenekleri belirleyin\",\n    \"added_to_cart\": \"Sepetinize eklendi\",\n    \"editor_checkout\": \"Tema düzenleyicide ödeme kapalıdır.\",\n    \"previous\": \"Önceki\",\n    \"next\": \"Sonraki\",\n    \"pagination\": \"Sayfalar\",\n    \"language\": \"Dil\"\n  },\n  \"products\": {\n    \"add_to_cart\": \"Sepete ekle\",\n    \"sold_out\": \"Tükendi\",\n    \"unavailable\": \"Mevcut değil\",\n    \"adding\": \"Ekleniyor…\",\n    \"added\": \"Sepete eklendi\",\n    \"view_cart\": \"Sepeti görüntüle\",\n    \"quantity\": \"Adet\",\n    \"vendor\": \"Üretici\",\n    \"from\": \"Başlangıç fiyatı\",\n    \"sale\": \"İndirim\",\n    \"new\": \"Yeni\",\n    \"related_title\": \"Bunları da beğenebilirsiniz\",\n    \"description\": \"Açıklama\",\n    \"details\": \"Ayrıntılar\",\n    \"shipping\": \"Kargo ve iade\",\n    \"low_stock\": \"Son {count} ürün\",\n    \"in_stock\": \"Stokta\",\n    \"buy_now\": \"Hemen satın al\",\n    \"out_of_stock\": \"Stokta yok\",\n    \"share\": \"Paylaş\",\n    \"copy_link\": \"Bağlantıyı kopyala\",\n    \"link_copied\": \"Bağlantı kopyalandı\",\n    \"gallery_label\": \"Ürün görselleri\",\n    \"show_image\": \"{index}. görseli göster\",\n    \"zoom_image\": \"{index}. görseli yakınlaştır\",\n    \"previous_image\": \"Önceki görsel\",\n    \"next_image\": \"Sonraki görsel\",\n    \"decrease_quantity\": \"Adedi azalt\",\n    \"increase_quantity\": \"Adedi artır\",\n    \"reviews_count\": \"{count} değerlendirme\",\n    \"no_related\": \"Mağazanızda daha fazla ürün olduğunda benzer ürünler burada görünür.\",\n    \"view_details\": \"Tüm ayrıntıları gör\"\n  },\n  \"collections\": {\n    \"products_count\": \"{count} ürün\",\n    \"empty\": \"Bu koleksiyonda henüz ürün yok.\",\n    \"sort_label\": \"Sırala\",\n    \"sort_newest\": \"En yeniler\",\n    \"sort_price_asc\": \"Fiyat: düşükten yükseğe\",\n    \"sort_price_desc\": \"Fiyat: yüksekten düşüğe\",\n    \"sort_name\": \"Alfabetik\",\n    \"filter_in_stock\": \"Yalnızca stoktakiler\",\n    \"load_prev\": \"Önceki\",\n    \"load_next\": \"Sonraki\",\n    \"all_products\": \"Tüm ürünler\",\n    \"filters\": \"Filtreler\",\n    \"filter_and_sort\": \"Filtrele\",\n    \"availability\": \"Stok durumu\",\n    \"price\": \"Fiyat\",\n    \"price_min\": \"En az\",\n    \"price_max\": \"En çok\",\n    \"price_range\": \"Buradaki fiyatlar {min} ile {max} arasında.\",\n    \"brand\": \"Marka\",\n    \"collections\": \"Koleksiyonlar\",\n    \"apply\": \"Uygula\",\n    \"clear_all\": \"Tümünü temizle\",\n    \"remove_filter\": \"Filtreyi kaldır\",\n    \"show_results\": \"Sonuçları göster\",\n    \"no_matches\": \"Bu filtrelere uyan ürün yok.\",\n    \"sort_featured\": \"Öne çıkanlar\",\n    \"sort_best_selling\": \"Çok satanlar\",\n    \"sort_name_desc\": \"Alfabetik, Z–A\",\n    \"load_more\": \"Daha fazla yükle\",\n    \"load_error\": \"Daha fazla ürün yüklenemedi.\",\n    \"showing\": \"{total} üründen {shown} tanesi gösteriliyor\"\n  },\n  \"cart\": {\n    \"title\": \"Sepetiniz\",\n    \"empty\": \"Sepetiniz boş.\",\n    \"empty_hint\": \"Eklediğiniz her şey burada görünür.\",\n    \"subtotal\": \"Ara toplam\",\n    \"total\": \"Toplam\",\n    \"checkout\": \"Ödemeye geç\",\n    \"remove\": \"Kaldır\",\n    \"note_label\": \"Sipariş notu\",\n    \"note_placeholder\": \"Bilmemiz gereken bir şey var mı?\",\n    \"shipping_note\": \"Kargo ve vergiler ödeme adımında hesaplanır.\",\n    \"update_error\": \"Sepet güncellenemedi. Lütfen tekrar deneyin.\",\n    \"stock_max\": \"Stokta yalnızca {count} adet var.\",\n    \"drawer_title\": \"Sepetiniz\",\n    \"drawer_empty\": \"Sepetiniz boş\",\n    \"view_cart\": \"Sepeti görüntüle\",\n    \"decrease\": \"Adedi azalt\",\n    \"increase\": \"Adedi artır\",\n    \"free_shipping_left\": \"Ücretsiz kargo için {amount} kaldı\",\n    \"free_shipping_done\": \"Siparişinizin kargosu ücretsiz\",\n    \"discount\": \"İndirim\",\n    \"product\": \"Ürün\",\n    \"summary\": \"Sipariş özeti\",\n    \"gift_card_for\": \"Alıcı:\",\n    \"free_shipping_remaining\": \"Ücretsiz kargo için {amount} kaldı.\",\n    \"free_shipping_reached\": \"Siparişinizin kargosu ücretsiz.\"\n  },\n  \"search\": {\n    \"title\": \"Arama\",\n    \"results_for\": \"sonuç:\",\n    \"no_results\": \"Sonuç bulunamadı:\",\n    \"no_results_hint\": \"Yazımı kontrol edin ya da daha genel bir kelime deneyin.\",\n    \"placeholder\": \"Ürün arayın\",\n    \"products\": \"Ürünler\",\n    \"collections\": \"Koleksiyonlar\",\n    \"view_all\": \"Tüm sonuçları gör\",\n    \"loading\": \"Aranıyor…\",\n    \"popular\": \"Popüler aramalar\",\n    \"results_count\": \"“{terms}” için {count} sonuç\",\n    \"in_collection\": \"Koleksiyon\",\n    \"all_collections\": \"Tüm koleksiyonlar\",\n    \"search_everywhere\": \"Tüm ürünlerde ara\",\n    \"start_hint\": \"Mağazada aramak için yukarıya bir kelime yazın.\"\n  },\n  \"blog\": {\n    \"read_more\": \"Devamını oku\",\n    \"reading_time\": \"{minutes} dk okuma\",\n    \"back_to_journal\": \"Günlüğe dön\",\n    \"empty\": \"Henüz yayımlanmış yazı yok.\",\n    \"all\": \"Tümü\",\n    \"categories\": \"Kategoriler\",\n    \"by_author\": \"Yazar: {author}\",\n    \"back_to_blog\": \"Bloga dön\",\n    \"related\": \"Okumaya devam edin\"\n  },\n  \"account\": {\n    \"sign_in\": \"Giriş yap\",\n    \"create_account\": \"Hesap oluştur\",\n    \"email\": \"E-posta\",\n    \"password\": \"Şifre\",\n    \"first_name\": \"Ad\",\n    \"last_name\": \"Soyad\",\n    \"password_confirm\": \"Şifreyi onaylayın\",\n    \"sign_out\": \"Çıkış yap\",\n    \"orders_title\": \"Sipariş geçmişi\",\n    \"orders_empty\": \"Henüz siparişiniz yok.\",\n    \"order\": \"Sipariş\",\n    \"date\": \"Tarih\",\n    \"status\": \"Durum\",\n    \"total\": \"Toplam\",\n    \"show_password\": \"Şifreyi göster\",\n    \"hide_password\": \"Şifreyi gizle\",\n    \"forgot_password\": \"Şifrenizi mi unuttunuz?\"\n  },\n  \"contact\": {\n    \"name\": \"Ad\",\n    \"email\": \"E-posta\",\n    \"message\": \"Mesaj\",\n    \"send\": \"Mesajı gönder\",\n    \"success\": \"Teşekkürler! En kısa sürede size dönüş yapacağız.\"\n  },\n  \"footer\": {\n    \"rights\": \"Tüm hakları saklıdır.\",\n    \"social_hint\": \"Sosyal medya bağlantılarınızı Theme settings → Social media bölümünden ekleyin.\",\n    \"payment_methods\": \"Ödeme yöntemleri\",\n    \"cash_on_delivery\": \"Kapıda ödeme\",\n    \"bank_transfer\": \"Banka havalesi\"\n  },\n  \"onboarding\": {\n    \"product\": \"Ürün adı\",\n    \"collection\": \"Koleksiyon adı\",\n    \"article\": \"Yazı başlığı\",\n    \"article_text\": \"Blog yazınız hakkında bir metin yazın.\",\n    \"brand\": \"Marka adı\",\n    \"customer\": \"Müşteri adı\",\n    \"author\": \"Yazar adı\",\n    \"page\": \"Sayfa başlığı\",\n    \"category\": \"Kategori adı\",\n    \"location\": \"Konum adı\"\n  },\n  \"editor\": {\n    \"collection_unavailable\": \"Koleksiyon kullanılamıyor\",\n    \"product_unavailable\": \"Ürün kullanılamıyor\",\n    \"select_another\": \"Düzenleyicide başka bir tane seçin\"\n  },\n  \"header\": {\n    \"main_menu\": \"Ana menü\",\n    \"view_all\": \"Tümünü gör\"\n  },\n  \"announcement\": {\n    \"label\": \"Duyuru\",\n    \"previous\": \"Önceki mesaj\",\n    \"next\": \"Sonraki mesaj\",\n    \"close\": \"Duyuruyu kapat\"\n  },\n  \"slideshow\": {\n    \"label\": \"Slayt gösterisi\",\n    \"previous\": \"Önceki slayt\",\n    \"next\": \"Sonraki slayt\",\n    \"go_to\": \"{n}. slayta git\",\n    \"pause\": \"Slayt gösterisini duraklat\",\n    \"play\": \"Slayt gösterisini başlat\"\n  },\n  \"popup\": {\n    \"label\": \"Bülten\",\n    \"close\": \"Kapat\",\n    \"email_placeholder\": \"E-posta adresi\",\n    \"subscribe\": \"Abone ol\",\n    \"success\": \"Teşekkürler, listemize katıldınız.\",\n    \"copy\": \"Kopyala\",\n    \"copied\": \"Kopyalandı\",\n    \"continue\": \"Alışverişe devam et\"\n  }\n}\n","sections/announcement-bar.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Announcement bar: one or more short messages. Static shows them side by side; Rotate shows one at a time\n  (autoplay pauses on hover/focus and never runs with reduced motion or Animation: None). The close button\n  hides the bar for the rest of the visit (sessionStorage, see corner-core.js initAnnouncements).\n{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign mode = s.mode | default: 'static' -%}\n{%- assign messages = section.blocks | where: 'type', 'message' -%}\n{%- if messages.size > 0 -%}\n<div class=\"cn-announce {{ s.color_scheme | default: 'scheme-3' }} cn-announce--{{ mode }} cn-announce--align-{{ s.alignment | default: 'center' }}\"\n  role=\"region\" aria-label=\"{{ 'announcement.label' | t }}\"\n  data-cn-announce data-mode=\"{{ mode }}\" data-speed=\"{{ s.speed | default: 5 }}\" data-key=\"{{ section.id }}\">\n  <div class=\"cn-wrap cn-announce__inner\">\n    {%- if mode == 'rotate' and messages.size > 1 -%}\n      <button type=\"button\" class=\"cn-announce__nav\" data-cn-announce-prev aria-label=\"{{ 'announcement.previous' | t }}\">{% render 'icon', name: 'chevron-left', size: 16 %}</button>\n    {%- endif -%}\n    <div class=\"cn-announce__track\" {% if mode == 'rotate' %}aria-live=\"polite\"{% endif %}>\n      {%- for block in messages -%}\n        {%- assign b = block.settings -%}\n        <p class=\"cn-announce__msg{% if mode == 'rotate' and forloop.first %} is-active{% endif %}\" {{ block.soooks_attributes }} {% if mode == 'rotate' and forloop.first == false %}aria-hidden=\"true\"{% endif %}>\n          {%- if b.link != blank -%}\n            <a href=\"{{ b.link }}\">{{ b.text | default: 'Announcement' }}{% render 'icon', name: 'arrow', size: 14 %}</a>\n          {%- else -%}\n            <span>{{ b.text | default: 'Announcement' }}</span>\n          {%- endif -%}\n        </p>\n      {%- endfor -%}\n    </div>\n    {%- if mode == 'rotate' and messages.size > 1 -%}\n      <button type=\"button\" class=\"cn-announce__nav\" data-cn-announce-next aria-label=\"{{ 'announcement.next' | t }}\">{% render 'icon', name: 'chevron-right', size: 16 %}</button>\n    {%- endif -%}\n    {%- if s.show_close -%}\n      <button type=\"button\" class=\"cn-announce__close\" data-cn-announce-close aria-label=\"{{ 'announcement.close' | t }}\">{% render 'icon', name: 'close', size: 16 %}</button>\n    {%- endif -%}\n  </div>\n</div>\n{%- endif -%}\n\n{% schema %}\n{\n  \"name\": \"Announcement bar\",\n  \"icon\": \"lucide:megaphone\",\n  \"settings\": [\n    {\n      \"key\": \"mode\",\n      \"type\": \"select\",\n      \"segmented\": true,\n      \"label\": \"Messages\",\n      \"default\": \"static\",\n      \"options\": [\n        {\n          \"value\": \"static\",\n          \"label\": \"Side by side\"\n        },\n        {\n          \"value\": \"rotate\",\n          \"label\": \"Rotate\"\n        }\n      ],\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"speed\",\n      \"type\": \"range\",\n      \"label\": \"Change message every\",\n      \"min\": 3,\n      \"max\": 10,\n      \"step\": 1,\n      \"unit\": \"s\",\n      \"default\": 5,\n      \"visible_if\": \"{% if section.settings.mode == 'rotate' %}true{% endif %}\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"alignment\",\n      \"type\": \"select\",\n      \"segmented\": true,\n      \"label\": \"Text alignment\",\n      \"default\": \"center\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Start\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        },\n        {\n          \"value\": \"end\",\n          \"label\": \"End\"\n        }\n      ],\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"show_close\",\n      \"type\": \"checkbox\",\n      \"label\": \"Close button\",\n      \"info\": \"Shoppers can hide the bar for the rest of their visit.\",\n      \"default\": false,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"default\": \"scheme-3\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    }\n  ],\n  \"blocks\": [\n    {\n      \"type\": \"message\",\n      \"name\": \"Message\",\n      \"settings\": [\n        {\n          \"key\": \"text\",\n          \"type\": \"text\",\n          \"label\": \"Text\",\n          \"default\": \"Free shipping on orders over $50\"\n        },\n        {\n          \"key\": \"link\",\n          \"type\": \"link\",\n          \"label\": \"Link\"\n        }\n      ]\n    }\n  ],\n  \"max_blocks\": 6,\n  \"presets\": [\n    {\n      \"name\": \"Announcement bar\",\n      \"blocks\": [\n        {\n          \"type\": \"message\"\n        }\n      ]\n    }\n  ]\n}\n{% endschema %}\n","sections/blog-posts.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Blog posts: the latest articles as cards, optionally with the first one featured large. Blocks: the platform\n  \"Header\" and ONE \"Blog post card\" definition (Image, Date and category, Post title, Excerpt, Read more link)\n  drawn for every article — each card is that article's resource context.\n{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign cn_limit = s.limit | default: 3 -%}\n{%- if s.animate != false -%}{%- assign cn_rv = 'cn-reveal' -%}{%- else -%}{%- assign cn_rv = 'cn-reveal is-in is-settled' -%}{%- endif -%}\n{%- assign cn_card = nil -%}{%- assign cn_img = nil -%}\n{%- for block in section.blocks -%}{%- if block.type == 'article-card' -%}{%- assign cn_card = block -%}{%- endif -%}{%- endfor -%}\n{%- for part in cn_card.blocks -%}{%- if part.type == 'card-image' -%}{%- assign cn_img = part -%}{%- endif -%}{%- endfor -%}\n{%- assign cn_ratio = cn_img.settings.ratio | default: 'landscape' -%}\n{%- comment -%} A section saved before blocks (no blocks at all) keeps the classic card: picture, date, title. {%- endcomment -%}\n{%- assign cn_classic = false -%}\n{%- if section.blocks_count == 0 -%}{%- assign cn_classic = true -%}{%- endif -%}\n{%- assign cn_ph_img = 'ph-image-wide.svg' -%}\n{%- if cn_ratio == 'square' -%}{%- assign cn_ph_img = 'ph-image-square.svg' -%}{%- endif -%}\n{%- assign cn_align = cn_card.settings.text_alignment | default: 'left' -%}\n{%- if cn_align == 'left' -%}{%- assign cn_align = 'start' -%}{%- endif -%}\n<section class=\"cn-sec cn-blog-sec {{ s.color_scheme | default: 'scheme-1' }} cn-pt-{{ s.spacing_top | default: 'default' }} cn-pb-{{ s.spacing_bottom | default: 'default' }}\">\n  <div class=\"cn-container\">\n    {%- for block in section.blocks -%}\n      {%- if block.type == 'header' -%}{% render 'block-head', head: block, link: '/blog' %}{%- endif -%}\n    {%- endfor -%}\n    {%- if cn_card or cn_classic -%}\n    <div class=\"cn-posts{% if s.featured_first %} cn-posts--featured{% endif %} cn-posts--{{ s.card_style | default: 'plain' }} cn-ta-{{ cn_align }} {{ cn_rv }}\" data-cn-stagger style=\"--cn-cols-d:{{ s.columns | default: 3 }}\">\n      {%- for post in posts limit: cn_limit -%}\n        {%- assign cn_url = post.url | default: '' -%}\n        {%- if cn_url == '' -%}{%- assign cn_url = '/blog/' | append: post.slug -%}{%- endif -%}\n        {% resource post %}\n        <article class=\"cn-post\" {{ cn_card.soooks_attributes }}>\n          {%- if cn_img or cn_classic -%}\n            <a class=\"cn-post__media\" href=\"{{ cn_url }}\" tabindex=\"-1\" aria-hidden=\"true\" {{ cn_img.soooks_attributes }}>\n              {% render 'image', url: post.image, alt: post.title, ratio: cn_ratio, fit: 'cover', placeholder: cn_ph_img %}\n            </a>\n          {%- endif -%}\n          <div class=\"cn-post__body\">\n            {%- for part in cn_card.blocks -%}\n              {%- case part.type -%}\n                {%- when 'card-meta' -%}\n                  <p class=\"cn-post__meta\" {{ part.soooks_attributes }}>\n                    {%- if post.published_at != blank -%}<time datetime=\"{{ post.published_at }}\">{{ post.published_at | date: '%b %-d, %Y' }}</time>{%- endif -%}\n                    {%- if part.settings.show_category != false and post.category != blank -%}<span>{{ post.category }}</span>{%- endif -%}\n                    {%- if part.settings.show_reading_time != false and post.reading_time -%}<span>{{ 'blog.reading_time' | t | replace: '{minutes}', post.reading_time }}</span>{%- endif -%}\n                    {%- if s.show_author and post.author != blank -%}<span>{{ post.author }}</span>{%- endif -%}\n                  </p>\n                {%- when 'card-title' -%}\n                  <h3 class=\"cn-post__title cn-post__title--{{ part.settings.title_size | default: 'md' }}\" {{ part.soooks_attributes }}><a href=\"{{ cn_url }}\">{{ post.title }}</a></h3>\n                {%- when 'card-excerpt' -%}\n                  {%- if post.excerpt != blank -%}<p class=\"cn-post__excerpt cn-lines-{{ part.settings.lines | default: '3' }}\" {{ part.soooks_attributes }}>{{ post.excerpt | strip_html | truncate: 220 }}</p>{%- endif -%}\n                {%- when 'card-link' -%}\n                  <a class=\"cn-link cn-post__more\" href=\"{{ cn_url }}\" {{ part.soooks_attributes }}>{{ part.settings.label | default: 'Read more' }} <span class=\"cn-arrow\" aria-hidden=\"true\">{% render 'icon', name: 'arrow', size: 15 %}</span></a>\n              {%- endcase -%}\n            {%- endfor -%}\n            {%- if cn_classic -%}\n              {%- if post.published_at != blank -%}<p class=\"cn-post__meta\"><time datetime=\"{{ post.published_at }}\">{{ post.published_at | date: '%b %-d, %Y' }}</time></p>{%- endif -%}\n              <h3 class=\"cn-post__title\"><a href=\"{{ cn_url }}\">{{ post.title }}</a></h3>\n            {%- endif -%}\n            {%- if s.show_tags and post.tags.size > 0 -%}\n              <p class=\"cn-post__tags\">{%- for tag in post.tags limit: 3 -%}<span class=\"cn-tag\">{{ tag }}</span>{%- endfor -%}</p>\n            {%- endif -%}\n          </div>\n        </article>\n        {% endresource %}\n      {%- else -%}\n        {%- comment -%} No articles yet: placeholder cards from the same card block. {%- endcomment -%}\n        {%- for cn_i in (1..cn_limit) -%}\n          <article class=\"cn-post cn-post--ph\" {{ cn_card.soooks_attributes }}>\n            {%- if cn_img -%}<div class=\"cn-post__media\" {{ cn_img.soooks_attributes }}>{% render 'image', ratio: cn_ratio, placeholder: cn_ph_img %}</div>{%- endif -%}\n            <div class=\"cn-post__body\">\n              {%- for part in cn_card.blocks -%}\n                {%- case part.type -%}\n                  {%- when 'card-meta' -%}<p class=\"cn-post__meta\" {{ part.soooks_attributes }}><span>{{ 'now' | date: '%b %-d, %Y' }}</span>{%- if part.settings.show_category != false -%}<span>{{ 'onboarding.category' | t }}</span>{%- endif -%}{%- if s.show_author -%}<span>{{ 'onboarding.author' | t }}</span>{%- endif -%}</p>\n                  {%- when 'card-title' -%}<h3 class=\"cn-post__title\" {{ part.soooks_attributes }}>{{ 'onboarding.article' | t }}</h3>\n                  {%- when 'card-excerpt' -%}<p class=\"cn-post__excerpt\" {{ part.soooks_attributes }}>{{ 'onboarding.article_text' | t }}</p>\n                {%- endcase -%}\n              {%- endfor -%}\n            </div>\n          </article>\n        {%- endfor -%}\n      {%- endfor -%}\n    </div>\n    {%- endif -%}\n  </div>\n</section>\n{% schema %}\n{\n  \"name\": \"Blog posts\",\n  \"icon\": \"lucide:newspaper\",\n  \"settings\": [\n    {\n      \"key\": \"limit\",\n      \"type\": \"range\",\n      \"label\": \"Number of articles\",\n      \"min\": 1,\n      \"max\": 12,\n      \"step\": 1,\n      \"default\": 3\n    },\n    {\n      \"key\": \"columns\",\n      \"type\": \"range\",\n      \"label\": \"Columns on desktop\",\n      \"min\": 2,\n      \"max\": 4,\n      \"step\": 1,\n      \"default\": 3,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"featured_first\",\n      \"type\": \"checkbox\",\n      \"label\": \"Feature the first article\",\n      \"default\": false,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"card_style\",\n      \"type\": \"select\",\n      \"label\": \"Card style\",\n      \"options\": [\n        {\n          \"value\": \"plain\",\n          \"label\": \"Plain\"\n        },\n        {\n          \"value\": \"bordered\",\n          \"label\": \"Bordered\"\n        },\n        {\n          \"value\": \"filled\",\n          \"label\": \"Filled\"\n        }\n      ],\n      \"default\": \"plain\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"show_author\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show author\",\n      \"default\": false,\n      \"group\": \"cards\",\n      \"group_label\": \"Article cards\"\n    },\n    {\n      \"key\": \"show_tags\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show tags\",\n      \"default\": false,\n      \"group\": \"cards\",\n      \"group_label\": \"Article cards\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"default\": \"scheme-1\",\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"spacing_top\",\n      \"type\": \"select\",\n      \"label\": \"Top spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"spacing_bottom\",\n      \"type\": \"select\",\n      \"label\": \"Bottom spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"animate\",\n      \"type\": \"checkbox\",\n      \"label\": \"Reveal on scroll\",\n      \"default\": true,\n      \"group\": \"animation\",\n      \"group_label\": \"Animation\"\n    }\n  ],\n  \"presets\": [\n    {\n      \"name\": \"Blog posts\",\n      \"settings\": {},\n      \"blocks\": [\n        {\n          \"type\": \"header\",\n          \"settings\": {\n            \"alignment\": \"left\"\n          },\n          \"blocks\": [\n            {\n              \"type\": \"eyebrow\",\n              \"settings\": {\n                \"text\": \"Subtitle\"\n              }\n            },\n            {\n              \"type\": \"heading\",\n              \"settings\": {\n                \"text\": \"Title\"\n              }\n            },\n            {\n              \"type\": \"view-all\",\n              \"settings\": {\n                \"label\": \"View all\",\n                \"link\": \"/blog\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"article-card\",\n          \"settings\": {\n            \"text_alignment\": \"left\"\n          },\n          \"blocks\": [\n            {\n              \"type\": \"card-image\",\n              \"settings\": {\n                \"ratio\": \"landscape\"\n              }\n            },\n            {\n              \"type\": \"card-meta\",\n              \"settings\": {\n                \"show_category\": false,\n                \"show_reading_time\": false\n              }\n            },\n            {\n              \"type\": \"card-title\"\n            },\n            {\n              \"type\": \"card-excerpt\"\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"blocks\": [\n    \"@block:section-header\",\n    \"@block:article-card\"\n  ]\n}\n{% endschema %}\n","sections/cart-drawer.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Cart drawer (global). corner-core.js fills the lines, totals, free-shipping progress and suggestions from the\n  storefront cart API and opens it after every add to cart (Theme settings → Cart → When something is added).\n  Labels travel as data-* attributes so the script stays translatable.\n{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign cart_settings = settings.cart -%}\n<div class=\"cn-drawer\" id=\"cn-cart-drawer\" data-cn-drawer data-cn-overlay aria-hidden=\"true\"\n  data-placeholder=\"{{ 'ph-product-1.svg' | asset_url }}\"\n  data-label-remove=\"{{ 'cart.remove' | t }}\"\n  data-label-quantity=\"{{ 'products.quantity' | t }}\"\n  data-label-decrease=\"{{ 'cart.decrease' | t }}\"\n  data-label-increase=\"{{ 'cart.increase' | t }}\"\n  data-label-add=\"{{ 'general.quick_add' | t }}\"\n  data-label-choose=\"{{ 'general.choose_options' | t }}\"\n  data-label-add-to-cart=\"{{ 'products.add_to_cart' | t }}\"\n  data-label-sold-out=\"{{ 'products.sold_out' | t }}\"\n  data-label-view-details=\"{{ 'products.view_details' | t }}\"\n  data-label-close=\"{{ 'general.close' | t }}\"\n  data-msg-stock=\"{{ 'cart.stock_max' | t }}\"\n  data-msg-added=\"{{ 'general.added_to_cart' | t }}\"\n  data-label-view-cart=\"{{ 'cart.view_cart' | t }}\"\n  data-msg-editor-checkout=\"{{ 'general.editor_checkout' | t }}\"\n  data-label-discount=\"{{ 'cart.discount' | t }}\"\n  data-msg-shipping-left=\"{{ 'cart.free_shipping_left' | t }}\"\n  data-msg-shipping-done=\"{{ 'cart.free_shipping_done' | t }}\"\n  data-recommend=\"{% if cart_settings.show_recommendations == false %}false{% else %}true{% endif %}\">\n  <div class=\"cn-overlay__scrim\" data-cn-close></div>\n  <aside class=\"cn-drawer__panel {{ s.color_scheme | default: 'scheme-1' }}\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"cn-cart-title\">\n    <div class=\"cn-drawer__head\">\n      <p class=\"cn-drawer__title\" id=\"cn-cart-title\">{{ 'cart.drawer_title' | t }} <span class=\"cn-drawer__count\" data-cn-cart-count-label></span></p>\n      <button type=\"button\" class=\"cn-header__icon\" data-cn-close aria-label=\"{{ 'general.close' | t }}\">{% render 'icon', name: 'close', size: 22 %}</button>\n    </div>\n    <div class=\"cn-drawer__ship\" data-cn-drawer-ship hidden>\n      <p class=\"cn-drawer__ship-text\" data-cn-drawer-ship-text></p>\n      <div class=\"cn-progress\" role=\"progressbar\" aria-valuemin=\"0\" aria-valuemax=\"100\" data-cn-drawer-ship-bar><span></span></div>\n    </div>\n    {%- if cart_settings.free_shipping_note != blank -%}\n      <p class=\"cn-drawer__note\" data-cn-drawer-note>{% render 'icon', name: 'truck', size: 18 %} <span>{{ cart_settings.free_shipping_note }}</span></p>\n    {%- endif -%}\n    <div class=\"cn-drawer__body\">\n      <div class=\"cn-drawer__empty\" data-cn-drawer-empty>\n        <span class=\"cn-drawer__empty-icon\">{% render 'icon', name: 'bag', size: 28 %}</span>\n        <p class=\"cn-drawer__empty-title\">{{ 'cart.drawer_empty' | t }}</p>\n        <a class=\"cn-btn\" href=\"{{ s.empty_link | default: '/' }}\" data-cn-close>{{ 'general.continue_shopping' | t }}</a>\n      </div>\n      <div class=\"cn-drawer__lines\" data-cn-drawer-lines></div>\n      <div class=\"cn-drawer__recs\" data-cn-drawer-recs hidden>\n        <p class=\"cn-drawer__recs-title\">{{ s.recommendations_heading | default: 'You may also like' }}</p>\n        <div class=\"cn-drawer__recs-list\" data-cn-drawer-recs-list></div>\n      </div>\n    </div>\n    <div class=\"cn-drawer__foot\" data-cn-drawer-foot hidden>\n      <div class=\"cn-drawer__discounts\" data-cn-drawer-discounts hidden></div>\n      <p class=\"cn-drawer__total\"><span>{{ 'cart.subtotal' | t }}</span><span data-cn-drawer-total>—</span></p>\n      <p class=\"cn-drawer__hint\">{{ 'cart.shipping_note' | t }}</p>\n      {%- if s.show_note -%}\n        <details class=\"cn-drawer__notebox\">\n          <summary>{{ 'cart.note_label' | t }} {% render 'icon', name: 'chevron-down', size: 16 %}</summary>\n          <textarea class=\"cn-input\" rows=\"3\" placeholder=\"{{ 'cart.note_placeholder' | t }}\" aria-label=\"{{ 'cart.note_label' | t }}\" data-cn-drawer-note-input></textarea>\n        </details>\n      {%- endif -%}\n      <a class=\"cn-btn cn-btn--wide\" href=\"/checkout\" data-cn-checkout>{% render 'icon', name: 'lock', size: 16 %} {{ 'cart.checkout' | t }}</a>\n      {%- if s.show_view_cart != false -%}\n        <a class=\"cn-btn cn-btn--secondary cn-btn--wide\" href=\"/cart\">{{ 'cart.view_cart' | t }}</a>\n      {%- endif -%}\n    </div>\n  </aside>\n</div>\n\n{% schema %}\n{\n  \"name\": \"Cart drawer\",\n  \"icon\": \"lucide:shopping-bag\",\n  \"settings\": [\n    {\n      \"type\": \"paragraph\",\n      \"content\": \"Open it from the cart icon or by adding a product. Choose drawer or cart page in Theme settings → Cart.\"\n    },\n    {\n      \"key\": \"show_note\",\n      \"type\": \"checkbox\",\n      \"label\": \"Order note\",\n      \"default\": false\n    },\n    {\n      \"key\": \"show_view_cart\",\n      \"type\": \"checkbox\",\n      \"label\": \"\\\"View cart\\\" button\",\n      \"default\": true\n    },\n    {\n      \"key\": \"recommendations_heading\",\n      \"type\": \"text\",\n      \"label\": \"Suggestions heading\",\n      \"default\": \"You may also like\",\n      \"info\": \"Turn suggestions on or off in Theme settings → Cart.\"\n    },\n    {\n      \"key\": \"empty_link\",\n      \"type\": \"link\",\n      \"label\": \"\\\"Continue shopping\\\" link\",\n      \"default\": \"/\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"default\": \"scheme-1\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    }\n  ]\n}\n{% endschema %}\n","sections/collection-list.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Collection list: picked collections (or the latest ones) as image tiles, cards, or one featured tile with\n  smaller ones beside it; text below the picture or over it. Blocks: the platform \"Header\" and ONE \"Collection\n  card\" definition (Image, Collection title, Product count, Button) drawn for every collection — each card is that\n  collection's resource context, so the editor selects the exact card.\n{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign cn_layout = s.layout | default: 'grid' -%}\n{%- assign cn_place = s.text_placement | default: 'below' -%}\n{%- assign cn_cols = s.columns_desktop | default: 4 -%}\n{%- assign cn_limit = s.limit | default: 4 -%}\n{%- if s.animate != false -%}{%- assign cn_rv = 'cn-reveal' -%}{%- else -%}{%- assign cn_rv = 'cn-reveal is-in is-settled' -%}{%- endif -%}\n{%- assign cn_card = nil -%}{%- assign cn_img = nil -%}\n{%- for block in section.blocks -%}{%- if block.type == 'collection-card' -%}{%- assign cn_card = block -%}{%- endif -%}{%- endfor -%}\n{%- for part in cn_card.blocks -%}{%- if part.type == 'card-image' -%}{%- assign cn_img = part -%}{%- endif -%}{%- endfor -%}\n{%- assign cn_ratio = cn_img.settings.ratio | default: 'square' -%}\n{%- comment -%} A section saved before blocks (no blocks at all) keeps the classic tile: picture + title. {%- endcomment -%}\n{%- assign cn_classic = false -%}\n{%- if section.blocks_count == 0 -%}{%- assign cn_classic = true -%}{%- endif -%}\n{%- assign cn_align = cn_card.settings.text_alignment | default: 'left' -%}\n{%- if cn_align == 'left' -%}{%- assign cn_align = 'start' -%}{%- endif -%}\n<section class=\"cn-sec cn-clist-sec {{ s.color_scheme | default: 'scheme-1' }} cn-pt-{{ s.spacing_top | default: 'default' }} cn-pb-{{ s.spacing_bottom | default: 'default' }}\">\n  <div class=\"cn-container\">\n    {%- for block in section.blocks -%}\n      {%- if block.type == 'header' -%}{% render 'block-head', head: block, link: '/collections' %}{%- endif -%}\n    {%- endfor -%}\n    {%- if cn_card or cn_classic -%}\n    <div class=\"cn-clist cn-clist--{{ cn_layout }} cn-clist--text-{{ cn_place }} cn-ta-{{ cn_align }} cn-ccards--hover-{{ cn_card.settings.hover | default: 'zoom' }}{% if s.mobile_scroll %} cn-clist--mscroll{% endif %} {{ cn_rv }}\" data-cn-stagger\n      style=\"--cn-cols-d:{{ cn_cols }};--cn-cols-t:{{ cn_cols | at_most: 3 }};--cn-cols-m:{{ s.columns_mobile | default: 2 }};--cn-grid-gap:{{ s.gap | default: 20 }}px;--cn-card-radius:{{ cn_img.settings.radius | default: 8 }}px;--cn-overlay:{{ s.overlay_opacity | default: 30 | divided_by: 100.0 }}\">\n      {%- assign cn_shown = 0 -%}\n      {%- if s.source != 'picked' or s.collections.size > 0 -%}\n        {%- for cn_c in collections limit: cn_limit -%}\n          {%- assign cn_ph = forloop.index0 | modulo: 3 | plus: 1 -%}\n          {% resource cn_c %}\n          {%- if cn_c.missing -%}\n            <div class=\"cn-ccard cn-ccard--missing\" {{ cn_card.soooks_attributes }}>\n              <span class=\"cn-ccard__media cn-ratio cn-ratio--{{ cn_ratio }}\"><span class=\"cn-pcard__missing\">{{ 'editor.collection_unavailable' | t }}</span></span>\n              <span class=\"cn-ccard__body\"><span class=\"cn-ccard__desc\">{{ 'editor.select_another' | t }}</span></span>\n            </div>\n          {%- else -%}\n            <a class=\"cn-ccard\" href=\"/collections/{{ cn_c.slug }}\" {{ cn_card.soooks_attributes }}>\n              {%- capture cn_body -%}\n                {%- for part in cn_card.blocks -%}\n                  {%- case part.type -%}\n                    {%- when 'card-title' -%}\n                      <span class=\"cn-ccard__title cn-ccard__title--{{ part.settings.title_size | default: 'md' }}{% if part.settings.uppercase %} cn-upper{% endif %}\" {{ part.soooks_attributes }}>{{ cn_c.name }}</span>\n                      {%- if s.show_description and cn_c.description != blank -%}<span class=\"cn-ccard__desc\">{{ cn_c.description | strip_html | truncate: 120 }}</span>{%- endif -%}\n                    {%- when 'card-count' -%}\n                      {%- if cn_c.products_count -%}<span class=\"cn-ccard__count\" {{ part.soooks_attributes }}>{% if part.settings.format == 'short' %}{{ cn_c.products_count }}{% else %}{{ 'collections.products_count' | t | replace: '{count}', cn_c.products_count }}{% endif %}</span>{%- endif -%}\n                    {%- when 'card-button' -%}\n                      <span class=\"cn-ccard__btn\" {{ part.soooks_attributes }}>{{ part.settings.label | default: 'Shop now' }} <span class=\"cn-arrow\" aria-hidden=\"true\">{% render 'icon', name: 'arrow', size: 15 %}</span></span>\n                  {%- endcase -%}\n                {%- endfor -%}\n              {%- endcapture -%}\n              {%- if cn_classic -%}{%- capture cn_body -%}<span class=\"cn-ccard__title\">{{ cn_c.name }}</span>{%- endcapture -%}{%- endif -%}\n              {%- if cn_img or cn_classic -%}\n                <span class=\"cn-ccard__media cn-ratio cn-ratio--{{ cn_ratio }} cn-fit--cover\" {{ cn_img.soooks_attributes }}>\n                  {%- if cn_c.image -%}\n                    <img src=\"{{ cn_c.image.url | default: cn_c.image }}\" alt=\"{{ cn_c.name | escape }}\" loading=\"lazy\">\n                  {%- else -%}\n                    <img src=\"{{ 'ph-collection-PCN.svg' | replace: 'PCN', cn_ph | asset_url }}\" alt=\"\" loading=\"lazy\">\n                  {%- endif -%}\n                </span>\n              {%- endif -%}\n              {%- if cn_body != blank -%}<span class=\"cn-ccard__body\">{{ cn_body }}</span>{%- endif -%}\n            </a>\n          {%- endif -%}\n          {% endresource %}\n          {%- assign cn_shown = cn_shown | plus: 1 -%}\n        {%- endfor -%}\n      {%- endif -%}\n      {%- if cn_shown == 0 -%}\n        {%- comment -%} No collections yet (or none picked): placeholder tiles from the same card block. {%- endcomment -%}\n        {%- for cn_i in (1..cn_limit) -%}\n          {%- assign cn_ph = forloop.index0 | modulo: 3 | plus: 1 -%}\n          <div class=\"cn-ccard cn-ccard--ph\" {{ cn_card.soooks_attributes }}>\n            {%- if cn_img -%}<span class=\"cn-ccard__media cn-ratio cn-ratio--{{ cn_ratio }} cn-fit--cover\" {{ cn_img.soooks_attributes }}><img src=\"{{ 'ph-collection-PCN.svg' | replace: 'PCN', cn_ph | asset_url }}\" alt=\"\" loading=\"lazy\"></span>{%- endif -%}\n            <span class=\"cn-ccard__body\">\n              {%- for part in cn_card.blocks -%}\n                {%- case part.type -%}\n                  {%- when 'card-title' -%}<span class=\"cn-ccard__title cn-ccard__title--{{ part.settings.title_size | default: 'md' }}\" {{ part.soooks_attributes }}>{{ 'onboarding.collection' | t }}</span>\n                  {%- when 'card-button' -%}<span class=\"cn-ccard__btn\" {{ part.soooks_attributes }}>{{ part.settings.label | default: 'Shop now' }}</span>\n                {%- endcase -%}\n              {%- endfor -%}\n            </span>\n          </div>\n        {%- endfor -%}\n      {%- endif -%}\n    </div>\n    {%- endif -%}\n  </div>\n</section>\n{% schema %}\n{\n  \"name\": \"Collection list\",\n  \"icon\": \"lucide:layout-panel-left\",\n  \"settings\": [\n    {\n      \"key\": \"source\",\n      \"type\": \"select\",\n      \"label\": \"Collections\",\n      \"options\": [\n        {\n          \"value\": \"picked\",\n          \"label\": \"Picked collections\"\n        },\n        {\n          \"value\": \"all\",\n          \"label\": \"All collections\"\n        }\n      ],\n      \"default\": \"all\"\n    },\n    {\n      \"key\": \"collections\",\n      \"type\": \"collection_list\",\n      \"label\": \"Collections\",\n      \"visible_if\": \"{% if section.settings.source == 'picked' %}true{% endif %}\"\n    },\n    {\n      \"key\": \"limit\",\n      \"type\": \"range\",\n      \"label\": \"Number of collections\",\n      \"min\": 2,\n      \"max\": 12,\n      \"step\": 1,\n      \"default\": 4\n    },\n    {\n      \"key\": \"show_description\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show description\",\n      \"default\": false\n    },\n    {\n      \"key\": \"layout\",\n      \"type\": \"select\",\n      \"label\": \"Layout\",\n      \"options\": [\n        {\n          \"value\": \"grid\",\n          \"label\": \"Grid\"\n        },\n        {\n          \"value\": \"cards\",\n          \"label\": \"Cards\"\n        },\n        {\n          \"value\": \"featured\",\n          \"label\": \"Featured + smaller\"\n        }\n      ],\n      \"default\": \"grid\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"columns_desktop\",\n      \"type\": \"range\",\n      \"label\": \"Columns on desktop\",\n      \"min\": 2,\n      \"max\": 6,\n      \"step\": 1,\n      \"default\": 4,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"text_placement\",\n      \"type\": \"select\",\n      \"label\": \"Text placement\",\n      \"options\": [\n        {\n          \"value\": \"below\",\n          \"label\": \"Below image\"\n        },\n        {\n          \"value\": \"overlay\",\n          \"label\": \"On the image\"\n        }\n      ],\n      \"default\": \"below\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"overlay_opacity\",\n      \"type\": \"range\",\n      \"label\": \"Overlay opacity\",\n      \"min\": 0,\n      \"max\": 80,\n      \"step\": 5,\n      \"default\": 30,\n      \"unit\": \"%\",\n      \"visible_if\": \"{% if section.settings.text_placement == 'overlay' %}true{% endif %}\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"gap\",\n      \"type\": \"range\",\n      \"label\": \"Space between items\",\n      \"min\": 0,\n      \"max\": 48,\n      \"step\": 4,\n      \"default\": 20,\n      \"unit\": \"px\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"columns_mobile\",\n      \"type\": \"range\",\n      \"label\": \"Columns on mobile\",\n      \"min\": 1,\n      \"max\": 2,\n      \"step\": 1,\n      \"default\": 2,\n      \"group\": \"mobile\",\n      \"group_label\": \"Mobile\"\n    },\n    {\n      \"key\": \"mobile_scroll\",\n      \"type\": \"checkbox\",\n      \"label\": \"Scroll sideways on mobile\",\n      \"default\": false,\n      \"group\": \"mobile\",\n      \"group_label\": \"Mobile\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"default\": \"scheme-1\",\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"spacing_top\",\n      \"type\": \"select\",\n      \"label\": \"Top spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"spacing_bottom\",\n      \"type\": \"select\",\n      \"label\": \"Bottom spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"animate\",\n      \"type\": \"checkbox\",\n      \"label\": \"Reveal on scroll\",\n      \"default\": true,\n      \"group\": \"animation\",\n      \"group_label\": \"Animation\"\n    }\n  ],\n  \"presets\": [\n    {\n      \"name\": \"Collection list\",\n      \"settings\": {},\n      \"blocks\": [\n        {\n          \"type\": \"header\",\n          \"settings\": {\n            \"alignment\": \"left\"\n          },\n          \"blocks\": [\n            {\n              \"type\": \"eyebrow\",\n              \"settings\": {\n                \"text\": \"Subtitle\"\n              }\n            },\n            {\n              \"type\": \"heading\",\n              \"settings\": {\n                \"text\": \"Title\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"collection-card\",\n          \"settings\": {\n            \"hover\": \"zoom\",\n            \"text_alignment\": \"left\"\n          },\n          \"blocks\": [\n            {\n              \"type\": \"card-image\",\n              \"settings\": {\n                \"ratio\": \"square\",\n                \"radius\": 8\n              }\n            },\n            {\n              \"type\": \"card-title\"\n            },\n            {\n              \"type\": \"card-count\"\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"blocks\": [\n    \"@block:section-header\",\n    {\n      \"use\": \"@block:collection-card\",\n      \"source\": \"collections\"\n    }\n  ]\n}\n{% endschema %}\n","sections/contact-form.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%} Contact form: name, email, message → the store's contact endpoint (corner-core.js form[data-cn-contact]). {%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign cn_layout = s.layout | default: 'side' -%}\n{%- if s.animate != false -%}{%- assign cn_rv = 'cn-reveal' -%}{%- else -%}{%- assign cn_rv = 'cn-reveal is-in is-settled' -%}{%- endif -%}\n<section class=\"cn-sec cn-contact-sec {{ s.color_scheme | default: 'scheme-1' }} cn-pt-{{ s.spacing_top | default: 'default' }} cn-pb-{{ s.spacing_bottom | default: 'default' }}\">\n  <div class=\"cn-container\">\n    <div class=\"cn-contact cn-contact--{{ cn_layout }} {{ cn_rv }}\">\n      {%- if s.eyebrow != blank or s.heading != blank or s.text != blank -%}\n        <div class=\"cn-contact__intro\">\n          {%- if s.eyebrow != blank -%}<p class=\"cn-contact__eyebrow\">{{ s.eyebrow }}</p>{%- endif -%}\n          {%- if s.heading != blank -%}<h2 class=\"cn-contact__title\">{{ s.heading }}</h2>{%- endif -%}\n          {%- if s.text != blank -%}<div class=\"cn-contact__text cn-rte\">{{ s.text }}</div>{%- endif -%}\n        </div>\n      {%- endif -%}\n      <form class=\"cn-contact__form\" data-cn-contact data-msg-success=\"{{ 'contact.success' | t }}\">\n        <div class=\"cn-contact__row\">\n          <div class=\"cn-field\">\n            <label for=\"cn-c-name-{{ section.id }}\">{{ 'contact.name' | t }}</label>\n            <input class=\"cn-input\" id=\"cn-c-name-{{ section.id }}\" name=\"name\" autocomplete=\"name\" required>\n          </div>\n          <div class=\"cn-field\">\n            <label for=\"cn-c-email-{{ section.id }}\">{{ 'contact.email' | t }}</label>\n            <input class=\"cn-input\" id=\"cn-c-email-{{ section.id }}\" name=\"email\" type=\"email\" autocomplete=\"email\" required>\n          </div>\n        </div>\n        <div class=\"cn-field\">\n          <label for=\"cn-c-msg-{{ section.id }}\">{{ 'contact.message' | t }}</label>\n          <textarea class=\"cn-input\" id=\"cn-c-msg-{{ section.id }}\" name=\"message\" rows=\"6\" required></textarea>\n        </div>\n        <div class=\"cn-note\" data-cn-form-note hidden></div>\n        <div class=\"cn-actions\"><button class=\"cn-btn cn-btn--primary\" type=\"submit\">{%- if s.button_label != blank -%}{{ s.button_label }}{%- else -%}{{ 'contact.send' | t }}{%- endif -%}</button></div>\n      </form>\n    </div>\n  </div>\n</section>\n\n{% schema %}\n{\n  \"name\": \"Contact form\",\n  \"icon\": \"lucide:mail-open\",\n  \"settings\": [\n    {\n      \"key\": \"eyebrow\",\n      \"type\": \"text\",\n      \"label\": \"Subtitle\",\n      \"default\": \"Subtitle\"\n    },\n    {\n      \"key\": \"heading\",\n      \"type\": \"text\",\n      \"label\": \"Heading\",\n      \"default\": \"Title\"\n    },\n    {\n      \"key\": \"text\",\n      \"type\": \"richtext\",\n      \"label\": \"Text\",\n      \"default\": \"<p>Description</p>\"\n    },\n    {\n      \"key\": \"layout\",\n      \"type\": \"select\",\n      \"label\": \"Layout\",\n      \"options\": [\n        {\n          \"value\": \"side\",\n          \"label\": \"Text beside the form\"\n        },\n        {\n          \"value\": \"stacked\",\n          \"label\": \"Text above the form\"\n        }\n      ],\n      \"default\": \"side\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"button_label\",\n      \"type\": \"text\",\n      \"label\": \"Button label\",\n      \"default\": \"\",\n      \"info\": \"Leave empty for \\\"Send message\\\".\",\n      \"group\": \"buttons\",\n      \"group_label\": \"Buttons\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"default\": \"scheme-1\",\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"spacing_top\",\n      \"type\": \"select\",\n      \"label\": \"Top spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"spacing_bottom\",\n      \"type\": \"select\",\n      \"label\": \"Bottom spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"animate\",\n      \"type\": \"checkbox\",\n      \"label\": \"Reveal on scroll\",\n      \"default\": true,\n      \"group\": \"animation\",\n      \"group_label\": \"Animation\"\n    }\n  ],\n  \"presets\": [\n    {\n      \"name\": \"Contact form\"\n    }\n  ]\n}\n{% endschema %}\n","sections/faq.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%} FAQ: questions that open to show their answer (one at a time, unless several may stay open). {%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign cn_layout = s.layout | default: 'stacked' -%}\n{%- if s.animate != false -%}{%- assign cn_rv = 'cn-reveal' -%}{%- else -%}{%- assign cn_rv = 'cn-reveal is-in is-settled' -%}{%- endif -%}\n{%- assign cn_head_align = 'center' -%}\n{%- if cn_layout == 'side' -%}{%- assign cn_head_align = 'start' -%}{%- endif -%}\n<section class=\"cn-sec cn-faq-sec {{ s.color_scheme | default: 'scheme-1' }} cn-pt-{{ s.spacing_top | default: 'default' }} cn-pb-{{ s.spacing_bottom | default: 'default' }}\">\n  <div class=\"cn-container\">\n    <div class=\"cn-faq cn-faq--{{ cn_layout }} cn-faq--{{ s.style | default: 'lines' }} {{ cn_rv }}\">\n      {% render 'section-head', eyebrow: s.eyebrow, title: s.heading, text: s.description, align: cn_head_align %}\n      <div class=\"cn-faq__list\" data-cn-accordion{% if s.allow_multiple %} data-multi{% endif %}>\n        {%- for block in section.blocks -%}\n          <details class=\"cn-faq__item\" {{ block.soooks_attributes }}{% if forloop.first and s.open_first != false %} open{% endif %}>\n            <summary class=\"cn-faq__q\"><span>{{ block.settings.question }}</span><span class=\"cn-faq__icon\" aria-hidden=\"true\"></span></summary>\n            <div class=\"cn-faq__a cn-rte\">{{ block.settings.answer }}</div>\n          </details>\n        {%- endfor -%}\n      </div>\n    </div>\n  </div>\n</section>\n\n{% schema %}\n{\n  \"name\": \"FAQ\",\n  \"icon\": \"lucide:list-collapse\",\n  \"settings\": [\n    {\n      \"key\": \"eyebrow\",\n      \"type\": \"text\",\n      \"label\": \"Subtitle\",\n      \"default\": \"Subtitle\"\n    },\n    {\n      \"key\": \"heading\",\n      \"type\": \"text\",\n      \"label\": \"Heading\",\n      \"default\": \"Title\"\n    },\n    {\n      \"key\": \"description\",\n      \"type\": \"textarea\",\n      \"label\": \"Description\",\n      \"default\": \"\"\n    },\n    {\n      \"key\": \"layout\",\n      \"type\": \"select\",\n      \"label\": \"Layout\",\n      \"options\": [\n        {\n          \"value\": \"stacked\",\n          \"label\": \"Heading above\"\n        },\n        {\n          \"value\": \"side\",\n          \"label\": \"Heading beside\"\n        }\n      ],\n      \"default\": \"stacked\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"style\",\n      \"type\": \"select\",\n      \"label\": \"Style\",\n      \"options\": [\n        {\n          \"value\": \"lines\",\n          \"label\": \"Divider lines\"\n        },\n        {\n          \"value\": \"boxed\",\n          \"label\": \"Boxes\"\n        }\n      ],\n      \"default\": \"lines\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"open_first\",\n      \"type\": \"checkbox\",\n      \"label\": \"Open the first question\",\n      \"default\": true,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"allow_multiple\",\n      \"type\": \"checkbox\",\n      \"label\": \"Let several stay open\",\n      \"default\": false,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"default\": \"scheme-1\",\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"spacing_top\",\n      \"type\": \"select\",\n      \"label\": \"Top spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"spacing_bottom\",\n      \"type\": \"select\",\n      \"label\": \"Bottom spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"animate\",\n      \"type\": \"checkbox\",\n      \"label\": \"Reveal on scroll\",\n      \"default\": true,\n      \"group\": \"animation\",\n      \"group_label\": \"Animation\"\n    }\n  ],\n  \"blocks\": [\n    {\n      \"type\": \"item\",\n      \"name\": \"Question\",\n      \"settings\": [\n        {\n          \"key\": \"question\",\n          \"type\": \"text\",\n          \"label\": \"Question\",\n          \"default\": \"Title\"\n        },\n        {\n          \"key\": \"answer\",\n          \"type\": \"richtext\",\n          \"label\": \"Answer\",\n          \"default\": \"<p>Description</p>\"\n        }\n      ]\n    }\n  ],\n  \"max_blocks\": 24,\n  \"presets\": [\n    {\n      \"name\": \"FAQ\",\n      \"blocks\": [\n        {\n          \"type\": \"item\"\n        },\n        {\n          \"type\": \"item\"\n        },\n        {\n          \"type\": \"item\"\n        },\n        {\n          \"type\": \"item\"\n        }\n      ]\n    }\n  ]\n}\n{% endschema %}\n","sections/featured-content.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Featured content: cards with an image, eyebrow, heading, text and a link. A card can point at a product,\n  collection or article instead: its title and link then come from that resource, and its picture too unless\n  the card has an image of its own.\n{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign cn_ratio = s.image_ratio | default: 'landscape' -%}\n{%- if s.animate != false -%}{%- assign cn_rv = 'cn-reveal' -%}{%- else -%}{%- assign cn_rv = 'cn-reveal is-in is-settled' -%}{%- endif -%}\n<section class=\"cn-sec cn-fc-sec {{ s.color_scheme | default: 'scheme-1' }} cn-pt-{{ s.spacing_top | default: 'default' }} cn-pb-{{ s.spacing_bottom | default: 'default' }}\">\n  <div class=\"cn-container\">\n    {% render 'section-head', eyebrow: s.eyebrow, title: s.heading, text: s.description, align: s.heading_alignment %}\n    <div class=\"cn-fc cn-fc--{{ s.card_style | default: 'plain' }} cn-fc--m-{{ s.mobile_layout | default: 'slider' }} cn-ta-{{ s.text_alignment | default: 'start' }} {{ cn_rv }}\" data-cn-stagger\n      style=\"--cn-cols-d:{{ s.columns | default: '3' }}\">\n      {%- for block in section.blocks -%}\n        {%- assign b = block.settings -%}\n        {%- assign cn_res = nil -%}{%- assign cn_res_img = '' -%}{%- assign cn_res_title = '' -%}{%- assign cn_res_url = '' -%}\n        {%- if b.product != blank and products_by_slug[b.product] and products_by_slug[b.product].missing != true -%}\n          {%- assign cn_res = products_by_slug[b.product] -%}\n          {%- assign cn_res_img = cn_res.image | default: '' -%}{%- assign cn_res_title = cn_res.name -%}{%- assign cn_res_url = '/products/' | append: cn_res.slug -%}\n        {%- elsif b.collection != blank -%}\n          {%- assign cn_res = collections | where: 'slug', b.collection | first -%}\n          {%- if cn_res and cn_res.missing != true -%}\n            {%- assign cn_res_img = cn_res.image.url | default: cn_res.image | default: '' -%}{%- assign cn_res_title = cn_res.name -%}{%- assign cn_res_url = '/collections/' | append: cn_res.slug -%}\n          {%- else -%}{%- assign cn_res = nil -%}{%- endif -%}\n        {%- elsif b.article != blank -%}\n          {%- for post in posts -%}\n            {%- if post.slug == b.article -%}{%- assign cn_res = post -%}{%- break -%}{%- endif -%}\n          {%- endfor -%}\n          {%- if cn_res -%}\n            {%- assign cn_res_img = cn_res.image.url | default: cn_res.image | default: '' -%}{%- assign cn_res_title = cn_res.title -%}\n            {%- assign cn_res_url = cn_res.url | default: '' -%}{%- if cn_res_url == '' -%}{%- assign cn_res_url = '/blog/' | append: cn_res.slug -%}{%- endif -%}\n          {%- endif -%}\n        {%- endif -%}\n        {%- assign cn_img = b.image | default: '' -%}\n        {%- if cn_res -%}\n          {%- assign cn_title = cn_res_title -%}{%- assign cn_url = cn_res_url -%}\n        {%- else -%}\n          {%- assign cn_title = b.heading -%}{%- assign cn_url = b.link -%}\n        {%- endif -%}\n        {%- assign cn_ph_img = 'ph-image-wide.svg' -%}\n        {%- if cn_ratio == 'square' -%}{%- assign cn_ph_img = 'ph-image-square.svg' -%}{%- elsif cn_ratio == 'portrait' -%}{%- assign cn_ph_img = 'ph-image-portrait.svg' -%}{%- endif -%}\n        <article class=\"cn-fc__item\" {{ block.soooks_attributes }}>\n          {%- if cn_url != blank -%}<a class=\"cn-fc__media\" href=\"{{ cn_url }}\" tabindex=\"-1\" aria-hidden=\"true\">{%- else -%}<div class=\"cn-fc__media\">{%- endif -%}\n            {% render 'image', src: cn_img, url: cn_res_img, alt: cn_title, ratio: cn_ratio, fit: 'cover', placeholder: cn_ph_img %}\n          {%- if cn_url != blank -%}</a>{%- else -%}</div>{%- endif -%}\n          <div class=\"cn-fc__body\">\n            {%- if b.eyebrow != blank -%}<p class=\"cn-fc__eyebrow\">{{ b.eyebrow }}</p>{%- endif -%}\n            {%- if cn_title != blank -%}\n              <h3 class=\"cn-fc__title\">{%- if cn_url != blank -%}<a href=\"{{ cn_url }}\">{{ cn_title }}</a>{%- else -%}{{ cn_title }}{%- endif -%}</h3>\n            {%- endif -%}\n            {%- if b.text != blank -%}<div class=\"cn-fc__text\">{{ b.text }}</div>{%- endif -%}\n            {%- if b.link_label != blank and cn_url != blank -%}\n              <a class=\"cn-fc__link\" href=\"{{ cn_url }}\">{{ b.link_label }} <span class=\"cn-arrow\" aria-hidden=\"true\">{% render 'icon', name: 'arrow', size: 15 %}</span></a>\n            {%- endif -%}\n          </div>\n        </article>\n      {%- endfor -%}\n    </div>\n  </div>\n</section>\n\n{% schema %}\n{\n  \"name\": \"Featured content\",\n  \"icon\": \"lucide:layout-dashboard\",\n  \"settings\": [\n    {\n      \"key\": \"eyebrow\",\n      \"type\": \"text\",\n      \"label\": \"Subtitle\",\n      \"default\": \"Subtitle\"\n    },\n    {\n      \"key\": \"heading\",\n      \"type\": \"text\",\n      \"label\": \"Heading\",\n      \"default\": \"Title\"\n    },\n    {\n      \"key\": \"description\",\n      \"type\": \"textarea\",\n      \"label\": \"Description\",\n      \"default\": \"\"\n    },\n    {\n      \"key\": \"heading_alignment\",\n      \"type\": \"select\",\n      \"label\": \"Heading alignment\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Left\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        }\n      ],\n      \"default\": \"start\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"columns\",\n      \"type\": \"select\",\n      \"label\": \"Columns on desktop\",\n      \"options\": [\n        {\n          \"value\": \"2\",\n          \"label\": \"2\"\n        },\n        {\n          \"value\": \"3\",\n          \"label\": \"3\"\n        },\n        {\n          \"value\": \"4\",\n          \"label\": \"4\"\n        }\n      ],\n      \"default\": \"3\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"card_style\",\n      \"type\": \"select\",\n      \"label\": \"Card style\",\n      \"options\": [\n        {\n          \"value\": \"plain\",\n          \"label\": \"Plain\"\n        },\n        {\n          \"value\": \"bordered\",\n          \"label\": \"Bordered\"\n        },\n        {\n          \"value\": \"filled\",\n          \"label\": \"Filled\"\n        }\n      ],\n      \"default\": \"plain\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"text_alignment\",\n      \"type\": \"select\",\n      \"label\": \"Text alignment\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Left\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        },\n        {\n          \"value\": \"end\",\n          \"label\": \"Right\"\n        }\n      ],\n      \"default\": \"start\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"image_ratio\",\n      \"type\": \"select\",\n      \"label\": \"Image ratio\",\n      \"options\": [\n        {\n          \"value\": \"landscape\",\n          \"label\": \"Landscape (4:3)\"\n        },\n        {\n          \"value\": \"square\",\n          \"label\": \"Square (1:1)\"\n        },\n        {\n          \"value\": \"portrait\",\n          \"label\": \"Portrait (4:5)\"\n        }\n      ],\n      \"default\": \"landscape\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"mobile_layout\",\n      \"type\": \"select\",\n      \"label\": \"On mobile\",\n      \"options\": [\n        {\n          \"value\": \"slider\",\n          \"label\": \"Slider\"\n        },\n        {\n          \"value\": \"stack\",\n          \"label\": \"Stacked\"\n        }\n      ],\n      \"default\": \"slider\",\n      \"group\": \"mobile\",\n      \"group_label\": \"Mobile\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"default\": \"scheme-1\",\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"spacing_top\",\n      \"type\": \"select\",\n      \"label\": \"Top spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"spacing_bottom\",\n      \"type\": \"select\",\n      \"label\": \"Bottom spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"animate\",\n      \"type\": \"checkbox\",\n      \"label\": \"Reveal on scroll\",\n      \"default\": true,\n      \"group\": \"animation\",\n      \"group_label\": \"Animation\"\n    }\n  ],\n  \"blocks\": [\n    {\n      \"type\": \"item\",\n      \"name\": \"Card\",\n      \"settings\": [\n        {\n          \"key\": \"image\",\n          \"type\": \"asset\",\n          \"label\": \"Image\"\n        },\n        {\n          \"key\": \"eyebrow\",\n          \"type\": \"text\",\n          \"label\": \"Subtitle\",\n          \"default\": \"\"\n        },\n        {\n          \"key\": \"heading\",\n          \"type\": \"text\",\n          \"label\": \"Heading\",\n          \"default\": \"Title\"\n        },\n        {\n          \"key\": \"text\",\n          \"type\": \"textarea\",\n          \"label\": \"Text\",\n          \"default\": \"Description\"\n        },\n        {\n          \"key\": \"link_label\",\n          \"type\": \"text\",\n          \"label\": \"Link label\",\n          \"default\": \"Button label\"\n        },\n        {\n          \"key\": \"link\",\n          \"type\": \"link\",\n          \"label\": \"Link\",\n          \"default\": \"/collections\"\n        },\n        {\n          \"type\": \"header\",\n          \"label\": \"Fill from a resource\"\n        },\n        {\n          \"type\": \"paragraph\",\n          \"content\": \"Pick a product, collection or article: the card then shows its title and links to it, with its picture unless the card has an image of its own.\"\n        },\n        {\n          \"key\": \"product\",\n          \"type\": \"product\",\n          \"label\": \"Product\"\n        },\n        {\n          \"key\": \"collection\",\n          \"type\": \"collection\",\n          \"label\": \"Collection\"\n        },\n        {\n          \"key\": \"article\",\n          \"type\": \"article\",\n          \"label\": \"Article\",\n          \"info\": \"Any published article.\"\n        }\n      ]\n    }\n  ],\n  \"max_blocks\": 8,\n  \"presets\": [\n    {\n      \"name\": \"Featured content\",\n      \"blocks\": [\n        {\n          \"type\": \"item\"\n        },\n        {\n          \"type\": \"item\"\n        },\n        {\n          \"type\": \"item\"\n        }\n      ]\n    }\n  ]\n}\n{% endschema %}\n","sections/footer.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Footer: blocks are columns (menu, text, newsletter, social icons, logo) laid out in a grid; a bottom bar\n  carries the copyright, optional legal links, the language picker (two published languages or more) and payment\n  icons. Social links come from\n  Theme settings → Social media.\n{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign soc = settings.social -%}\n{%- capture social_icons -%}\n  {%- assign networks = 'instagram,facebook,tiktok,pinterest,x,youtube' | split: ',' -%}\n  {%- for n in networks -%}\n    {%- if soc[n] != blank -%}\n      <li><a class=\"cn-footer__social-link\" href=\"{{ soc[n] }}\" target=\"_blank\" rel=\"noopener\" aria-label=\"{{ n | capitalize }}\">{% render 'icon', name: n, size: 20 %}</a></li>\n    {%- endif -%}\n  {%- endfor -%}\n{%- endcapture -%}\n{%- assign cols = s.columns | default: 'auto' -%}\n{%- if cols == 'auto' -%}\n  {%- comment -%} Auto: one column per block shown (an empty social block is hidden on the storefront). {%- endcomment -%}\n  {%- assign cols = section.blocks.size -%}\n  {%- if social_icons == blank and request.design_mode != true -%}\n    {%- for block in section.blocks -%}{%- if block.type == 'social' -%}{%- assign cols = cols | minus: 1 -%}{%- endif -%}{%- endfor -%}\n  {%- endif -%}\n  {%- assign cols = cols | at_most: 5 | at_least: 1 -%}\n{%- endif -%}\n<footer class=\"cn-footer {{ s.color_scheme | default: 'scheme-2' }}\">\n  <div class=\"cn-wrap\">\n    {%- if section.blocks.size > 0 -%}\n      <div class=\"cn-footer__grid\" style=\"--cn-footer-cols: {{ cols }}\">\n        {%- for block in section.blocks -%}\n          {%- assign b = block.settings -%}\n          {%- comment -%} No social links set: shoppers see no empty column (the editor shows a hint instead). {%- endcomment -%}\n          {%- if block.type == 'social' and social_icons == blank and request.design_mode != true -%}{%- continue -%}{%- endif -%}\n          <div class=\"cn-footer__col cn-footer__col--{{ block.type }}\" {{ block.soooks_attributes }}>\n            {%- case block.type -%}\n              {%- when 'logo' -%}\n                <a class=\"cn-footer__logo\" href=\"/\" style=\"--cn-logo-w: {{ b.width | default: 120 }}px\">\n                  {%- if b.image -%}<img src=\"{{ b.image | asset_url }}\" alt=\"{{ shop.name | escape }}\" loading=\"lazy\" width=\"{{ b.width | default: 120 }}\" height=\"40\">{%- else -%}{{ shop.name }}{%- endif -%}\n                </a>\n                {%- if b.text != blank -%}<div class=\"cn-footer__text cn-rte\">{{ b.text }}</div>{%- endif -%}\n              {%- when 'menu' -%}\n                {%- if b.heading != blank -%}<p class=\"cn-footer__heading\">{{ b.heading }}</p>{%- endif -%}\n                {%- assign bmenu = menus[b.menu] -%}\n                <ul class=\"cn-footer__links\" role=\"list\">\n                  {%- for item in bmenu.items -%}\n                    <li><a href=\"{{ item.url | default: '#' }}\">{{ item.label }}</a></li>\n                  {%- endfor -%}\n                </ul>\n              {%- when 'text' -%}\n                {%- if b.heading != blank -%}<p class=\"cn-footer__heading\">{{ b.heading }}</p>{%- endif -%}\n                {%- if b.text != blank -%}<div class=\"cn-footer__text cn-rte\">{{ b.text }}</div>{%- endif -%}\n              {%- when 'newsletter' -%}\n                {%- if b.heading != blank -%}<p class=\"cn-footer__heading\">{{ b.heading }}</p>{%- endif -%}\n                {%- if b.text != blank -%}<p class=\"cn-footer__text\">{{ b.text }}</p>{%- endif -%}\n                <form class=\"cn-footer__form\" data-cn-newsletter data-msg-success=\"{{ 'general.newsletter_success' | t }}\">\n                  <input class=\"cn-input\" type=\"email\" name=\"email\" required autocomplete=\"email\" placeholder=\"{{ 'general.newsletter_placeholder' | t }}\" aria-label=\"{{ 'general.newsletter_placeholder' | t }}\">\n                  <button class=\"cn-btn\" type=\"submit\">{{ b.button_label | default: 'Subscribe' }}</button>\n                </form>\n                <div class=\"cn-note\" data-cn-form-note hidden></div>\n              {%- when 'social' -%}\n                {%- if b.heading != blank -%}<p class=\"cn-footer__heading\">{{ b.heading }}</p>{%- endif -%}\n                {%- if social_icons != blank -%}\n                  <ul class=\"cn-footer__social\" role=\"list\">{{ social_icons }}</ul>\n                {%- elsif request.design_mode -%}\n                  <p class=\"cn-footer__text\">{{ 'footer.social_hint' | t }}</p>\n                {%- endif -%}\n            {%- endcase -%}\n          </div>\n        {%- endfor -%}\n      </div>\n    {%- endif -%}\n    <div class=\"cn-footer__bottom\">\n      <p class=\"cn-footer__copy\">© {{ 'now' | date: '%Y' }} {{ s.copyright | default: shop.name }}</p>\n      {%- assign legal = menus[s.legal_menu] -%}\n      {%- if legal and legal.items.size > 0 -%}\n        <ul class=\"cn-footer__legal\" role=\"list\">\n          {%- for item in legal.items -%}<li><a href=\"{{ item.url | default: '#' }}\">{{ item.label }}</a></li>{%- endfor -%}\n        </ul>\n      {%- endif -%}\n      {% render 'language-picker', up: true, class: 'cn-footer__lang' %}\n      {%- if s.show_payment_icons != false -%}\n        <ul class=\"cn-footer__payments\" role=\"list\" aria-label=\"{{ 'footer.payment_methods' | t }}\">\n          <li title=\"Visa\"><svg width=\"38\" height=\"24\" viewBox=\"0 0 38 24\" aria-hidden=\"true\"><rect x=\".5\" y=\".5\" width=\"37\" height=\"23\" rx=\"3.5\" fill=\"#fff\" stroke=\"#d9dce1\"/><text x=\"19\" y=\"16\" text-anchor=\"middle\" font-family=\"Arial, sans-serif\" font-size=\"9\" font-style=\"italic\" font-weight=\"700\" fill=\"#1a1f71\">VISA</text></svg><span class=\"cn-visually-hidden\">Visa</span></li>\n          <li title=\"Mastercard\"><svg width=\"38\" height=\"24\" viewBox=\"0 0 38 24\" aria-hidden=\"true\"><rect x=\".5\" y=\".5\" width=\"37\" height=\"23\" rx=\"3.5\" fill=\"#fff\" stroke=\"#d9dce1\"/><circle cx=\"16\" cy=\"12\" r=\"6\" fill=\"#eb001b\"/><circle cx=\"22\" cy=\"12\" r=\"6\" fill=\"#f79e1b\" fill-opacity=\".85\"/></svg><span class=\"cn-visually-hidden\">Mastercard</span></li>\n          <li title=\"American Express\"><svg width=\"38\" height=\"24\" viewBox=\"0 0 38 24\" aria-hidden=\"true\"><rect width=\"38\" height=\"24\" rx=\"4\" fill=\"#2e77bc\"/><text x=\"19\" y=\"15.5\" text-anchor=\"middle\" font-family=\"Arial, sans-serif\" font-size=\"8\" font-weight=\"700\" fill=\"#fff\">AMEX</text></svg><span class=\"cn-visually-hidden\">American Express</span></li>\n          <li title=\"{{ 'footer.cash_on_delivery' | t }}\"><svg width=\"38\" height=\"24\" viewBox=\"0 0 38 24\" aria-hidden=\"true\"><rect x=\".5\" y=\".5\" width=\"37\" height=\"23\" rx=\"3.5\" fill=\"#fff\" stroke=\"#d9dce1\"/><rect x=\"9\" y=\"7\" width=\"20\" height=\"10\" rx=\"1.5\" fill=\"none\" stroke=\"#1f8a4c\" stroke-width=\"1.4\"/><circle cx=\"19\" cy=\"12\" r=\"2.4\" fill=\"none\" stroke=\"#1f8a4c\" stroke-width=\"1.4\"/></svg><span class=\"cn-visually-hidden\">{{ 'footer.cash_on_delivery' | t }}</span></li>\n          <li title=\"{{ 'footer.bank_transfer' | t }}\"><svg width=\"38\" height=\"24\" viewBox=\"0 0 38 24\" aria-hidden=\"true\"><rect x=\".5\" y=\".5\" width=\"37\" height=\"23\" rx=\"3.5\" fill=\"#fff\" stroke=\"#d9dce1\"/><path d=\"M11 10h16l-8-4-8 4Zm1.5 1v5m4-5v5m5-5v5m4-5v5M11 17.5h16\" fill=\"none\" stroke=\"#16181d\" stroke-width=\"1.2\" stroke-linejoin=\"round\"/></svg><span class=\"cn-visually-hidden\">{{ 'footer.bank_transfer' | t }}</span></li>\n        </ul>\n      {%- endif -%}\n    </div>\n  </div>\n</footer>\n\n{% schema %}\n{\n  \"name\": \"Footer\",\n  \"icon\": \"lucide:panel-bottom\",\n  \"settings\": [\n    {\n      \"key\": \"copyright\",\n      \"type\": \"text\",\n      \"label\": \"Copyright text\",\n      \"info\": \"Shown after © and the year. Defaults to the store name.\"\n    },\n    {\n      \"key\": \"legal_menu\",\n      \"type\": \"menu\",\n      \"label\": \"Bottom links\",\n      \"info\": \"Optional small links in the bottom bar, such as privacy, terms or shipping policy pages.\"\n    },\n    {\n      \"key\": \"columns\",\n      \"type\": \"select\",\n      \"label\": \"Columns on desktop\",\n      \"default\": \"auto\",\n      \"options\": [\n        {\n          \"value\": \"auto\",\n          \"label\": \"Automatic (one per block)\"\n        },\n        {\n          \"value\": \"2\",\n          \"label\": \"2\"\n        },\n        {\n          \"value\": \"3\",\n          \"label\": \"3\"\n        },\n        {\n          \"value\": \"4\",\n          \"label\": \"4\"\n        },\n        {\n          \"value\": \"5\",\n          \"label\": \"5\"\n        }\n      ],\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"show_payment_icons\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show payment icons\",\n      \"default\": true,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"default\": \"scheme-2\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    }\n  ],\n  \"blocks\": [\n    {\n      \"type\": \"logo\",\n      \"name\": \"Logo\",\n      \"settings\": [\n        {\n          \"key\": \"image\",\n          \"type\": \"image_picker\",\n          \"label\": \"Logo image\",\n          \"info\": \"Without an image, the store name shows.\"\n        },\n        {\n          \"key\": \"width\",\n          \"type\": \"range\",\n          \"label\": \"Logo width\",\n          \"min\": 60,\n          \"max\": 260,\n          \"step\": 4,\n          \"unit\": \"px\",\n          \"default\": 120\n        },\n        {\n          \"key\": \"text\",\n          \"type\": \"richtext\",\n          \"label\": \"Text\",\n          \"default\": \"<p>Share a sentence about your store.</p>\"\n        }\n      ]\n    },\n    {\n      \"type\": \"menu\",\n      \"name\": \"Menu\",\n      \"settings\": [\n        {\n          \"key\": \"heading\",\n          \"type\": \"text\",\n          \"label\": \"Heading\",\n          \"default\": \"Shop\"\n        },\n        {\n          \"key\": \"menu\",\n          \"type\": \"menu\",\n          \"label\": \"Menu\",\n          \"default\": \"footer\"\n        }\n      ]\n    },\n    {\n      \"type\": \"text\",\n      \"name\": \"Text\",\n      \"settings\": [\n        {\n          \"key\": \"heading\",\n          \"type\": \"text\",\n          \"label\": \"Heading\",\n          \"default\": \"About us\"\n        },\n        {\n          \"key\": \"text\",\n          \"type\": \"richtext\",\n          \"label\": \"Text\",\n          \"default\": \"<p>Share contact details, store hours or a short story about your brand.</p>\"\n        }\n      ]\n    },\n    {\n      \"type\": \"newsletter\",\n      \"name\": \"Newsletter\",\n      \"settings\": [\n        {\n          \"key\": \"heading\",\n          \"type\": \"text\",\n          \"label\": \"Heading\",\n          \"default\": \"Stay in the loop\"\n        },\n        {\n          \"key\": \"text\",\n          \"type\": \"textarea\",\n          \"label\": \"Text\",\n          \"default\": \"New arrivals and offers, now and then.\"\n        },\n        {\n          \"key\": \"button_label\",\n          \"type\": \"text\",\n          \"label\": \"Button label\",\n          \"default\": \"Subscribe\"\n        }\n      ]\n    },\n    {\n      \"type\": \"social\",\n      \"name\": \"Social icons\",\n      \"settings\": [\n        {\n          \"type\": \"paragraph\",\n          \"content\": \"Add your links in Theme settings → Social media.\"\n        },\n        {\n          \"key\": \"heading\",\n          \"type\": \"text\",\n          \"label\": \"Heading\",\n          \"default\": \"Follow us\"\n        }\n      ]\n    }\n  ],\n  \"max_blocks\": 6,\n  \"presets\": [\n    {\n      \"name\": \"Footer\",\n      \"blocks\": [\n        {\n          \"type\": \"logo\"\n        },\n        {\n          \"type\": \"menu\"\n        },\n        {\n          \"type\": \"text\"\n        },\n        {\n          \"type\": \"newsletter\"\n        }\n      ]\n    }\n  ]\n}\n{% endschema %}\n","sections/header.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Header: logo, main menu (dropdown or mega menu), search / language / account / cart icons. Holds its own search\n  overlay and the mobile menu drawer (both are [data-cn-overlay] dialogs driven by corner-core.js). The language\n  picker (snippets/language-picker.liquid) shows only when the store publishes two languages or more.\n  Sticky: the section wrapper sticks (corner-base.css). Transparent: only on the home page, over the first section,\n  until the page scrolls or a menu opens.\n{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign menu = menus[s.menu] | default: menus['main-menu'] -%}\n{%- comment -%} The handle actually rendered: names each menu item in the theme editor (\"<handle>.<position>\"). {%- endcomment -%}\n{%- assign menu_handle = s.menu | default: 'main-menu' -%}{%- unless menus[s.menu] -%}{%- assign menu_handle = 'main-menu' -%}{%- endunless -%}\n{%- assign scheme = s.color_scheme | default: 'scheme-1' -%}\n{%- assign layout = s.layout | default: 'logo_left_menu_center' -%}\n{%- assign menu_style = s.menu_style | default: 'dropdown' -%}\n{%- assign transparent = false -%}\n{%- if s.transparent == true and request.page_type == 'index' -%}{%- assign transparent = true -%}{%- endif -%}\n{%- capture search_id -%}cn-search-{{ section.id }}{%- endcapture -%}\n{%- capture menu_id -%}cn-menu-{{ section.id }}{%- endcapture -%}\n\n{%- capture search_button -%}\n  <button type=\"button\" class=\"cn-header__icon\" data-cn-open=\"{{ search_id }}\" aria-controls=\"{{ search_id }}\" aria-expanded=\"false\" aria-label=\"{{ 'general.search' | t }}\">{% render 'icon', name: 'search', size: 22 %}</button>\n{%- endcapture -%}\n\n{%- capture nav -%}\n  <nav class=\"cn-nav cn-nav--{{ menu_style }}\" aria-label=\"{{ 'header.main_menu' | t }}\">\n    <ul class=\"cn-nav__list\" role=\"list\">\n      {%- for item in menu.items -%}\n        {%- capture item_id -%}{{ menu_handle }}.{{ forloop.index0 }}{%- endcapture -%}\n        {%- assign has_children = false -%}{%- if item.children.size > 0 -%}{%- assign has_children = true -%}{%- endif -%}\n        <li class=\"cn-nav__item{% if has_children %} has-children{% endif %}\" data-cn-nav-item>\n          {% resource item, 'link', item_id %}\n            <a class=\"cn-nav__link\" href=\"{{ item.url | default: '#' }}\" data-resource-node{% if has_children %} aria-haspopup=\"true\" aria-expanded=\"false\"{% endif %}>\n              <span>{{ item.label }}</span>\n              {%- if has_children -%}{% render 'icon', name: 'chevron-down', size: 14, class: 'cn-nav__caret' %}{%- endif -%}\n            </a>\n          {% endresource %}\n          {%- if has_children -%}\n            {%- if menu_style == 'mega' -%}\n              <div class=\"cn-mega {{ scheme }}\">\n                <div class=\"cn-wrap cn-mega__inner\">\n                  <ul class=\"cn-mega__cols\" role=\"list\">\n                    {%- for child in item.children -%}\n                      <li class=\"cn-mega__col\">\n                        <a class=\"cn-mega__title\" href=\"{{ child.url | default: '#' }}\">{{ child.label }}</a>\n                        {%- if child.children.size > 0 -%}\n                          <ul class=\"cn-mega__links\" role=\"list\">\n                            {%- for grand in child.children -%}\n                              <li><a href=\"{{ grand.url | default: '#' }}\">{{ grand.label }}</a></li>\n                            {%- endfor -%}\n                          </ul>\n                        {%- endif -%}\n                      </li>\n                    {%- endfor -%}\n                  </ul>\n                  {%- if s.mega_image -%}\n                    <a class=\"cn-mega__promo\" href=\"{{ s.mega_link | default: item.url | default: '#' }}\">\n                      <span class=\"cn-mega__promo-media\"><img src=\"{{ s.mega_image | asset_url }}\" alt=\"{{ s.mega_heading | escape }}\" loading=\"lazy\" width=\"480\" height=\"360\"></span>\n                      {%- if s.mega_heading != blank -%}<span class=\"cn-mega__promo-title\">{{ s.mega_heading }} {% render 'icon', name: 'arrow', size: 16 %}</span>{%- endif -%}\n                    </a>\n                  {%- endif -%}\n                </div>\n              </div>\n            {%- else -%}\n              <ul class=\"cn-dropdown {{ scheme }}\" role=\"list\">\n                {%- for child in item.children -%}\n                  <li>\n                    <a href=\"{{ child.url | default: '#' }}\">{{ child.label }}</a>\n                    {%- if child.children.size > 0 -%}\n                      <ul class=\"cn-dropdown__sub\" role=\"list\">\n                        {%- for grand in child.children -%}\n                          <li><a href=\"{{ grand.url | default: '#' }}\">{{ grand.label }}</a></li>\n                        {%- endfor -%}\n                      </ul>\n                    {%- endif -%}\n                  </li>\n                {%- endfor -%}\n              </ul>\n            {%- endif -%}\n          {%- endif -%}\n        </li>\n      {%- endfor -%}\n    </ul>\n  </nav>\n{%- endcapture -%}\n\n<header class=\"cn-header {{ scheme }} cn-header--{{ layout }} cn-header--{{ s.spacing | default: 'normal' }} cn-header--icons-{{ s.icon_style | default: 'outline' }}{% if transparent %} cn-header--transparent cn-header--text-{{ s.transparent_text | default: 'light' }}{% endif %}\"\n  data-cn-header data-sticky=\"{% if s.sticky == false %}false{% else %}true{% endif %}\" data-transparent=\"{{ transparent }}\"\n  style=\"--cn-logo-w: {{ s.logo_width | default: 120 }}px\">\n  <div class=\"cn-wrap cn-header__row\">\n    <div class=\"cn-header__start\">\n      <button type=\"button\" class=\"cn-header__icon cn-header__burger\" data-cn-open=\"{{ menu_id }}\" aria-controls=\"{{ menu_id }}\" aria-expanded=\"false\" aria-label=\"{{ 'general.menu' | t }}\">{% render 'icon', name: 'menu', size: 22 %}</button>\n      {%- if s.show_search != false -%}<span class=\"cn-header__search-start\">{{ search_button }}</span>{%- endif -%}\n    </div>\n    <a class=\"cn-header__logo\" href=\"/\">\n      {%- if s.logo -%}\n        <img src=\"{{ s.logo | asset_url }}\" alt=\"{{ shop.name | escape }}\" width=\"{{ s.logo_width | default: 120 }}\" height=\"40\">\n      {%- else -%}\n        <span class=\"cn-header__logo-text\">{{ shop.name }}</span>\n      {%- endif -%}\n    </a>\n    {%- if layout != 'logo_center' -%}{{ nav }}{%- endif -%}\n    <div class=\"cn-header__end\">\n      {%- if s.show_search != false -%}<span class=\"cn-header__search-end\">{{ search_button }}</span>{%- endif -%}\n      {%- comment -%} Two published languages or more: the picker (desktop; the mobile menu has its own). {%- endcomment -%}\n      {% render 'language-picker', class: 'cn-header__lang' %}\n      {%- if s.show_account != false -%}\n        <a class=\"cn-header__icon cn-header__account\" href=\"/account\" aria-label=\"{{ 'general.account' | t }}\">{% render 'icon', name: 'user', size: 22 %}</a>\n      {%- endif -%}\n      {%- if s.show_cart != false -%}\n        <a class=\"cn-header__icon cn-header__cart\" href=\"/cart\" data-cn-open-cart aria-label=\"{{ 'general.cart' | t }}\">\n          {% render 'icon', name: 'bag', size: 22 %}\n          <span class=\"cn-header__count\" data-cn-cart-count aria-hidden=\"true\"></span>\n        </a>\n      {%- endif -%}\n    </div>\n  </div>\n  {%- if layout == 'logo_center' -%}\n    <div class=\"cn-header__navrow\"><div class=\"cn-wrap\">{{ nav }}</div></div>\n  {%- endif -%}\n\n  {%- if s.show_search != false -%}\n    <div class=\"cn-search\" id=\"{{ search_id }}\" data-cn-overlay data-cn-search aria-hidden=\"true\">\n      <div class=\"cn-overlay__scrim\" data-cn-close></div>\n      <div class=\"cn-search__panel {{ scheme }}\" role=\"dialog\" aria-modal=\"true\" aria-label=\"{{ 'general.search' | t }}\"\n        data-label-products=\"{{ 'search.products' | t }}\" data-label-collections=\"{{ 'search.collections' | t }}\"\n        data-label-view-all=\"{{ 'search.view_all' | t }}\" data-label-empty=\"{{ 'search.no_results' | t }}\"\n        data-label-loading=\"{{ 'search.loading' | t }}\">\n        <div class=\"cn-wrap\">\n          <form class=\"cn-search__form\" action=\"/search\" method=\"get\" role=\"search\" data-cn-search-form>\n            {% render 'icon', name: 'search', size: 22 %}\n            <input class=\"cn-search__input\" type=\"search\" name=\"q\" autocomplete=\"off\" placeholder=\"{{ 'search.placeholder' | t }}\" aria-label=\"{{ 'general.search' | t }}\" data-cn-search-input data-cn-autofocus>\n            <button type=\"button\" class=\"cn-header__icon\" data-cn-close aria-label=\"{{ 'general.close' | t }}\">{% render 'icon', name: 'close', size: 22 %}</button>\n          </form>\n          {%- assign quick = menus[s.search_menu] -%}\n          {%- if quick and quick.items.size > 0 -%}\n            <div class=\"cn-search__quick\" data-cn-search-quick>\n              <p class=\"cn-search__label\">{{ 'search.popular' | t }}</p>\n              <ul class=\"cn-search__chips\" role=\"list\">\n                {%- for item in quick.items -%}<li><a class=\"cn-chip\" href=\"{{ item.url | default: '#' }}\">{{ item.label }}</a></li>{%- endfor -%}\n              </ul>\n            </div>\n          {%- endif -%}\n          <div class=\"cn-search__results\" data-cn-search-results aria-live=\"polite\"></div>\n        </div>\n      </div>\n    </div>\n  {%- endif -%}\n\n  <div class=\"cn-mdrawer cn-mdrawer--{{ s.drawer_side | default: 'start' }}\" id=\"{{ menu_id }}\" data-cn-overlay aria-hidden=\"true\">\n    <div class=\"cn-overlay__scrim\" data-cn-close></div>\n    <div class=\"cn-mdrawer__panel {{ scheme }}\" role=\"dialog\" aria-modal=\"true\" aria-label=\"{{ 'general.menu' | t }}\">\n      <div class=\"cn-mdrawer__head\">\n        <span class=\"cn-mdrawer__title\">{{ 'general.menu' | t }}</span>\n        <button type=\"button\" class=\"cn-header__icon\" data-cn-close aria-label=\"{{ 'general.close' | t }}\">{% render 'icon', name: 'close', size: 22 %}</button>\n      </div>\n      <nav class=\"cn-mdrawer__nav\" aria-label=\"{{ 'header.main_menu' | t }}\">\n        <ul role=\"list\">\n          {%- for item in menu.items -%}\n            <li>\n              {%- if item.children.size > 0 -%}\n                <details class=\"cn-mdrawer__group\">\n                  <summary>{{ item.label }} {% render 'icon', name: 'chevron-down', size: 18 %}</summary>\n                  <ul role=\"list\">\n                    {%- if item.url != blank and item.url != '#' -%}<li><a class=\"cn-mdrawer__all\" href=\"{{ item.url }}\">{{ 'header.view_all' | t }}</a></li>{%- endif -%}\n                    {%- for child in item.children -%}\n                      <li>\n                        <a href=\"{{ child.url | default: '#' }}\">{{ child.label }}</a>\n                        {%- if child.children.size > 0 -%}\n                          <ul class=\"cn-mdrawer__sub\" role=\"list\">\n                            {%- for grand in child.children -%}<li><a href=\"{{ grand.url | default: '#' }}\">{{ grand.label }}</a></li>{%- endfor -%}\n                          </ul>\n                        {%- endif -%}\n                      </li>\n                    {%- endfor -%}\n                  </ul>\n                </details>\n              {%- else -%}\n                <a class=\"cn-mdrawer__link\" href=\"{{ item.url | default: '#' }}\">{{ item.label }}</a>\n              {%- endif -%}\n            </li>\n          {%- endfor -%}\n        </ul>\n      </nav>\n      <div class=\"cn-mdrawer__foot\">\n        {% render 'language-picker', style: 'inline' %}\n        {%- if s.show_account != false -%}\n          <a class=\"cn-mdrawer__account\" href=\"/account\">{% render 'icon', name: 'user', size: 20 %} {{ 'general.account' | t }}</a>\n        {%- endif -%}\n        {%- if s.show_search != false -%}\n          <button type=\"button\" class=\"cn-mdrawer__account\" data-cn-open=\"{{ search_id }}\">{% render 'icon', name: 'search', size: 20 %} {{ 'general.search' | t }}</button>\n        {%- endif -%}\n      </div>\n    </div>\n  </div>\n</header>\n\n{% schema %}\n{\n  \"name\": \"Header\",\n  \"icon\": \"lucide:panel-top\",\n  \"settings\": [\n    {\n      \"key\": \"logo\",\n      \"type\": \"image_picker\",\n      \"label\": \"Logo image\",\n      \"info\": \"Without a logo, the store name shows.\"\n    },\n    {\n      \"key\": \"logo_width\",\n      \"type\": \"range\",\n      \"label\": \"Logo width\",\n      \"min\": 60,\n      \"max\": 260,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 120\n    },\n    {\n      \"key\": \"menu\",\n      \"type\": \"menu\",\n      \"label\": \"Menu\",\n      \"default\": \"main-menu\"\n    },\n    {\n      \"key\": \"show_search\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show search\",\n      \"default\": true\n    },\n    {\n      \"key\": \"search_menu\",\n      \"type\": \"menu\",\n      \"label\": \"Popular searches\",\n      \"info\": \"Optional links shown in the search panel before the shopper types.\",\n      \"visible_if\": \"{% if section.settings.show_search != false %}true{% endif %}\"\n    },\n    {\n      \"key\": \"show_account\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show account\",\n      \"default\": true\n    },\n    {\n      \"key\": \"show_cart\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show cart\",\n      \"default\": true\n    },\n    {\n      \"key\": \"layout\",\n      \"type\": \"select\",\n      \"label\": \"Layout\",\n      \"default\": \"logo_left_menu_center\",\n      \"options\": [\n        {\n          \"value\": \"logo_left_menu_center\",\n          \"label\": \"Logo left, menu center\"\n        },\n        {\n          \"value\": \"logo_left_menu_left\",\n          \"label\": \"Logo left, menu left\"\n        },\n        {\n          \"value\": \"logo_center\",\n          \"label\": \"Logo center, menu below\"\n        }\n      ],\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"menu_style\",\n      \"type\": \"select\",\n      \"segmented\": true,\n      \"label\": \"Menu style\",\n      \"default\": \"dropdown\",\n      \"options\": [\n        {\n          \"value\": \"dropdown\",\n          \"label\": \"Dropdown\"\n        },\n        {\n          \"value\": \"mega\",\n          \"label\": \"Mega menu\"\n        }\n      ],\n      \"info\": \"The mega menu shows second-level links as columns, with their own links below.\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"mega_image\",\n      \"type\": \"image_picker\",\n      \"label\": \"Mega menu image\",\n      \"visible_if\": \"{% if section.settings.menu_style == 'mega' %}true{% endif %}\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"mega_heading\",\n      \"type\": \"text\",\n      \"label\": \"Mega menu image heading\",\n      \"default\": \"Shop the collection\",\n      \"visible_if\": \"{% if section.settings.menu_style == 'mega' %}true{% endif %}\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"mega_link\",\n      \"type\": \"link\",\n      \"label\": \"Mega menu image link\",\n      \"info\": \"Without a link, the image opens the menu item's own page.\",\n      \"visible_if\": \"{% if section.settings.menu_style == 'mega' %}true{% endif %}\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"sticky\",\n      \"type\": \"checkbox\",\n      \"label\": \"Sticky header\",\n      \"default\": true,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"transparent\",\n      \"type\": \"checkbox\",\n      \"label\": \"Transparent on the home page\",\n      \"info\": \"The header sits over the first section until the page scrolls.\",\n      \"default\": false,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"transparent_text\",\n      \"type\": \"select\",\n      \"segmented\": true,\n      \"label\": \"Text over the first section\",\n      \"default\": \"light\",\n      \"options\": [\n        {\n          \"value\": \"light\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"dark\",\n          \"label\": \"Dark\"\n        }\n      ],\n      \"visible_if\": \"{% if section.settings.transparent %}true{% endif %}\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"icon_style\",\n      \"type\": \"select\",\n      \"segmented\": true,\n      \"label\": \"Icon style\",\n      \"default\": \"outline\",\n      \"options\": [\n        {\n          \"value\": \"outline\",\n          \"label\": \"Outline\"\n        },\n        {\n          \"value\": \"bold\",\n          \"label\": \"Bold\"\n        }\n      ],\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"spacing\",\n      \"type\": \"select\",\n      \"segmented\": true,\n      \"label\": \"Header height\",\n      \"default\": \"normal\",\n      \"options\": [\n        {\n          \"value\": \"compact\",\n          \"label\": \"Compact\"\n        },\n        {\n          \"value\": \"normal\",\n          \"label\": \"Normal\"\n        }\n      ],\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"drawer_side\",\n      \"type\": \"select\",\n      \"segmented\": true,\n      \"label\": \"Menu drawer opens from\",\n      \"default\": \"start\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Start\"\n        },\n        {\n          \"value\": \"end\",\n          \"label\": \"End\"\n        }\n      ],\n      \"info\": \"Start is the left side, or the right side in right-to-left stores.\",\n      \"group\": \"mobile\",\n      \"group_label\": \"Mobile\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"default\": \"scheme-1\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    }\n  ]\n}\n{% endschema %}\n","sections/hero.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Hero: one image with a heading, text and up to two buttons.\n  Layouts: text panel at the start / centre / end over the image, text straight on a full-width image, or\n  image and text side by side. Text position = vertical × horizontal (horizontal is set by the panel layouts).\n{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign cn_layout = s.layout | default: 'text_start' -%}\n{%- assign cn_pos = s.text_position | default: 'middle-start' | split: '-' -%}\n{%- assign cn_v = cn_pos[0] | default: 'middle' -%}\n{%- assign cn_x = cn_pos[1] | default: 'start' -%}\n{%- case cn_layout -%}\n  {%- when 'text_start' -%}{%- assign cn_x = 'start' -%}\n  {%- when 'text_center' -%}{%- assign cn_x = 'center' -%}\n  {%- when 'text_end' -%}{%- assign cn_x = 'end' -%}\n{%- endcase -%}\n{%- assign cn_kind = 'panel' -%}\n{%- if cn_layout == 'full' -%}{%- assign cn_kind = 'over' -%}{%- elsif cn_layout == 'split' -%}{%- assign cn_kind = 'split' -%}{%- endif -%}\n{%- assign cn_height = s.height | default: 'medium' -%}\n{%- assign cn_overlay = false -%}\n{%- if s.overlay != false and cn_kind != 'split' -%}{%- assign cn_overlay = true -%}{%- endif -%}\n{%- assign cn_mobile_src = '' -%}\n{%- if s.use_mobile_image and s.mobile_image != blank -%}{%- assign cn_mobile_src = s.mobile_image -%}{%- endif -%}\n{%- assign cn_ratio = 'fill' -%}\n{%- if cn_height == 'adapt' -%}{%- assign cn_ratio = 'natural' -%}{%- endif -%}\n{%- if s.animate != false -%}{%- assign cn_rv = 'cn-reveal' -%}{%- else -%}{%- assign cn_rv = 'cn-reveal is-in is-settled' -%}{%- endif -%}\n<section class=\"cn-hero cn-hero--{{ cn_kind }} cn-hero--h-{{ cn_height }} cn-hero--mh-{{ s.mobile_height | default: 'medium' }} cn-hero--v-{{ cn_v }} cn-hero--x-{{ cn_x }} cn-hero--w-{{ s.content_width | default: 'medium' }} cn-ta-{{ s.text_alignment | default: 'start' }} cn-mta-{{ s.mobile_text_alignment | default: 'start' }}{% if cn_overlay %} cn-hero--overlay{% endif %} {{ s.color_scheme | default: 'scheme-1' }}\"\n  style=\"--cn-overlay:{{ s.overlay_opacity | default: 30 | divided_by: 100.0 }}\">\n  <div class=\"cn-hero__media\">\n    {% render 'image', src: s.image, mobile_src: cn_mobile_src, alt: s.heading, ratio: cn_ratio, fit: 'cover', position: s.image_position, eager: true, placeholder: 'ph-slide-1.svg' %}\n  </div>\n  <div class=\"cn-hero__inner cn-container\">\n    <div class=\"cn-hero__content {{ cn_rv }}\">\n      {%- if s.eyebrow != blank -%}<p class=\"cn-hero__eyebrow\">{{ s.eyebrow }}</p>{%- endif -%}\n      {%- if s.heading != blank -%}<h2 class=\"cn-hero__title\">{{ s.heading }}</h2>{%- endif -%}\n      {%- if s.description != blank -%}<div class=\"cn-hero__text\">{{ s.description }}</div>{%- endif -%}\n      {%- if s.button_label != blank or s.button2_label != blank -%}\n        <div class=\"cn-actions\">\n          {%- if s.button_label != blank -%}<a class=\"cn-btn cn-btn--{{ s.button_style | default: 'primary' }}\" href=\"{{ s.button_link | default: '/collections' }}\">{{ s.button_label }}</a>{%- endif -%}\n          {%- if s.button2_label != blank -%}<a class=\"cn-btn cn-btn--{{ s.button2_style | default: 'secondary' }}\" href=\"{{ s.button2_link | default: '/collections' }}\">{{ s.button2_label }}</a>{%- endif -%}\n        </div>\n      {%- endif -%}\n    </div>\n  </div>\n</section>\n\n{% schema %}\n{\n  \"name\": \"Hero\",\n  \"icon\": \"lucide:panel-top\",\n  \"settings\": [\n    {\n      \"key\": \"eyebrow\",\n      \"type\": \"text\",\n      \"label\": \"Subtitle\",\n      \"default\": \"Subtitle\"\n    },\n    {\n      \"key\": \"heading\",\n      \"type\": \"text\",\n      \"label\": \"Heading\",\n      \"default\": \"Title\"\n    },\n    {\n      \"key\": \"description\",\n      \"type\": \"textarea\",\n      \"label\": \"Description\",\n      \"default\": \"Description\"\n    },\n    {\n      \"key\": \"layout\",\n      \"type\": \"select\",\n      \"label\": \"Layout\",\n      \"options\": [\n        {\n          \"value\": \"text_start\",\n          \"label\": \"Text panel left\"\n        },\n        {\n          \"value\": \"text_center\",\n          \"label\": \"Text panel center\"\n        },\n        {\n          \"value\": \"text_end\",\n          \"label\": \"Text panel right\"\n        },\n        {\n          \"value\": \"full\",\n          \"label\": \"Full-width image\"\n        },\n        {\n          \"value\": \"split\",\n          \"label\": \"Split image + text\"\n        }\n      ],\n      \"default\": \"text_start\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"text_position\",\n      \"type\": \"select\",\n      \"label\": \"Text position\",\n      \"options\": [\n        {\n          \"value\": \"top-start\",\n          \"label\": \"Top left\"\n        },\n        {\n          \"value\": \"top-center\",\n          \"label\": \"Top center\"\n        },\n        {\n          \"value\": \"top-end\",\n          \"label\": \"Top right\"\n        },\n        {\n          \"value\": \"middle-start\",\n          \"label\": \"Middle left\"\n        },\n        {\n          \"value\": \"middle-center\",\n          \"label\": \"Middle center\"\n        },\n        {\n          \"value\": \"middle-end\",\n          \"label\": \"Middle right\"\n        },\n        {\n          \"value\": \"bottom-start\",\n          \"label\": \"Bottom left\"\n        },\n        {\n          \"value\": \"bottom-center\",\n          \"label\": \"Bottom center\"\n        },\n        {\n          \"value\": \"bottom-end\",\n          \"label\": \"Bottom right\"\n        }\n      ],\n      \"default\": \"middle-start\",\n      \"info\": \"Panel layouts take left/right from the layout; the split layout uses top/middle/bottom.\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"text_alignment\",\n      \"type\": \"select\",\n      \"label\": \"Text alignment\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Left\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        },\n        {\n          \"value\": \"end\",\n          \"label\": \"Right\"\n        }\n      ],\n      \"default\": \"start\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"height\",\n      \"type\": \"select\",\n      \"label\": \"Height\",\n      \"options\": [\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"medium\",\n          \"label\": \"Medium\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        },\n        {\n          \"value\": \"full\",\n          \"label\": \"Full screen\"\n        },\n        {\n          \"value\": \"adapt\",\n          \"label\": \"Adapt to image\"\n        }\n      ],\n      \"default\": \"medium\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"content_width\",\n      \"type\": \"select\",\n      \"label\": \"Content width\",\n      \"options\": [\n        {\n          \"value\": \"narrow\",\n          \"label\": \"Narrow\"\n        },\n        {\n          \"value\": \"medium\",\n          \"label\": \"Medium\"\n        },\n        {\n          \"value\": \"wide\",\n          \"label\": \"Wide\"\n        }\n      ],\n      \"default\": \"medium\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"image\",\n      \"type\": \"asset\",\n      \"label\": \"Image\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"image_position\",\n      \"type\": \"select\",\n      \"label\": \"Image focal point\",\n      \"options\": [\n        {\n          \"value\": \"center center\",\n          \"label\": \"Center\"\n        },\n        {\n          \"value\": \"center top\",\n          \"label\": \"Top\"\n        },\n        {\n          \"value\": \"center bottom\",\n          \"label\": \"Bottom\"\n        },\n        {\n          \"value\": \"left center\",\n          \"label\": \"Left\"\n        },\n        {\n          \"value\": \"right center\",\n          \"label\": \"Right\"\n        }\n      ],\n      \"default\": \"center center\",\n      \"info\": \"The part of the picture that stays in view when it is cropped.\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"use_mobile_image\",\n      \"type\": \"checkbox\",\n      \"label\": \"Use a different image on mobile\",\n      \"default\": false,\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"mobile_image\",\n      \"type\": \"asset\",\n      \"label\": \"Mobile image\",\n      \"visible_if\": \"{% if section.settings.use_mobile_image %}true{% endif %}\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"overlay\",\n      \"type\": \"checkbox\",\n      \"label\": \"Darken the image\",\n      \"default\": true,\n      \"info\": \"Not used by the split layout.\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"overlay_opacity\",\n      \"type\": \"range\",\n      \"label\": \"Overlay opacity\",\n      \"min\": 0,\n      \"max\": 90,\n      \"step\": 5,\n      \"default\": 30,\n      \"unit\": \"%\",\n      \"visible_if\": \"{% if section.settings.overlay != false %}true{% endif %}\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"button_label\",\n      \"type\": \"text\",\n      \"label\": \"Button label\",\n      \"default\": \"Button label\",\n      \"info\": \"Leave empty to hide the button.\",\n      \"group\": \"buttons\",\n      \"group_label\": \"Buttons\"\n    },\n    {\n      \"key\": \"button_link\",\n      \"type\": \"link\",\n      \"label\": \"Button link\",\n      \"default\": \"/collections\",\n      \"group\": \"buttons\",\n      \"group_label\": \"Buttons\"\n    },\n    {\n      \"key\": \"button_style\",\n      \"type\": \"select\",\n      \"label\": \"Button style\",\n      \"options\": [\n        {\n          \"value\": \"primary\",\n          \"label\": \"Solid\"\n        },\n        {\n          \"value\": \"secondary\",\n          \"label\": \"Outline\"\n        },\n        {\n          \"value\": \"link\",\n          \"label\": \"Link\"\n        }\n      ],\n      \"default\": \"primary\",\n      \"group\": \"buttons\",\n      \"group_label\": \"Buttons\"\n    },\n    {\n      \"key\": \"button2_label\",\n      \"type\": \"text\",\n      \"label\": \"Second button label\",\n      \"default\": \"\",\n      \"info\": \"Leave empty to hide the button.\",\n      \"group\": \"buttons\",\n      \"group_label\": \"Buttons\"\n    },\n    {\n      \"key\": \"button2_link\",\n      \"type\": \"link\",\n      \"label\": \"Second button link\",\n      \"default\": \"/collections\",\n      \"group\": \"buttons\",\n      \"group_label\": \"Buttons\"\n    },\n    {\n      \"key\": \"button2_style\",\n      \"type\": \"select\",\n      \"label\": \"Second button style\",\n      \"options\": [\n        {\n          \"value\": \"primary\",\n          \"label\": \"Solid\"\n        },\n        {\n          \"value\": \"secondary\",\n          \"label\": \"Outline\"\n        },\n        {\n          \"value\": \"link\",\n          \"label\": \"Link\"\n        }\n      ],\n      \"default\": \"secondary\",\n      \"group\": \"buttons\",\n      \"group_label\": \"Buttons\"\n    },\n    {\n      \"key\": \"mobile_height\",\n      \"type\": \"select\",\n      \"label\": \"Mobile height\",\n      \"options\": [\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"medium\",\n          \"label\": \"Medium\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        },\n        {\n          \"value\": \"full\",\n          \"label\": \"Full screen\"\n        },\n        {\n          \"value\": \"adapt\",\n          \"label\": \"Adapt to image\"\n        }\n      ],\n      \"default\": \"medium\",\n      \"group\": \"mobile\",\n      \"group_label\": \"Mobile\"\n    },\n    {\n      \"key\": \"mobile_text_alignment\",\n      \"type\": \"select\",\n      \"label\": \"Mobile text alignment\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Left\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        },\n        {\n          \"value\": \"end\",\n          \"label\": \"Right\"\n        }\n      ],\n      \"default\": \"start\",\n      \"group\": \"mobile\",\n      \"group_label\": \"Mobile\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"default\": \"scheme-1\",\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"animate\",\n      \"type\": \"checkbox\",\n      \"label\": \"Fade in\",\n      \"default\": true,\n      \"group\": \"animation\",\n      \"group_label\": \"Animation\"\n    }\n  ],\n  \"presets\": [\n    {\n      \"name\": \"Hero\",\n      \"settings\": {\n        \"button_label\": \"Button label\",\n        \"button2_label\": \"\"\n      }\n    }\n  ]\n}\n{% endschema %}\n","sections/image-with-text.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%} Image with text: a picture beside a heading, text and a button. {%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- if s.animate != false -%}{%- assign cn_rv = 'cn-reveal' -%}{%- else -%}{%- assign cn_rv = 'cn-reveal is-in is-settled' -%}{%- endif -%}\n<section class=\"cn-sec cn-iwt-sec {{ s.color_scheme | default: 'scheme-1' }} cn-pt-{{ s.spacing_top | default: 'default' }} cn-pb-{{ s.spacing_bottom | default: 'default' }}\">\n  <div class=\"cn-container\">\n    <div class=\"cn-iwt cn-iwt--img-{{ s.image_position | default: 'start' }} cn-iwt--w{{ s.image_width | default: '50' }} cn-iwt--v-{{ s.vertical_alignment | default: 'center' }} cn-iwt--m-{{ s.mobile_order | default: 'image_first' }}{% if s.panel %} cn-iwt--panel{% endif %} cn-ta-{{ s.text_alignment | default: 'start' }} {{ cn_rv }}\">\n      <div class=\"cn-iwt__media\">\n        {% render 'image', src: s.image, alt: s.heading, ratio: s.image_ratio, fit: s.image_fit, placeholder: 'ph-image-square.svg' %}\n      </div>\n      <div class=\"cn-iwt__content\">\n        {%- if s.eyebrow != blank -%}<p class=\"cn-iwt__eyebrow\">{{ s.eyebrow }}</p>{%- endif -%}\n        {%- if s.heading != blank -%}<h2 class=\"cn-iwt__title\">{{ s.heading }}</h2>{%- endif -%}\n        {%- if s.description != blank -%}<div class=\"cn-iwt__text cn-rte\">{{ s.description }}</div>{%- endif -%}\n        {%- if s.button_label != blank -%}\n          <div class=\"cn-actions\"><a class=\"cn-btn cn-btn--{{ s.button_style | default: 'primary' }}\" href=\"{{ s.button_link | default: '/collections' }}\">{{ s.button_label }}</a></div>\n        {%- endif -%}\n      </div>\n    </div>\n  </div>\n</section>\n\n{% schema %}\n{\n  \"name\": \"Image with text\",\n  \"icon\": \"lucide:image\",\n  \"settings\": [\n    {\n      \"key\": \"eyebrow\",\n      \"type\": \"text\",\n      \"label\": \"Subtitle\",\n      \"default\": \"Subtitle\"\n    },\n    {\n      \"key\": \"heading\",\n      \"type\": \"text\",\n      \"label\": \"Heading\",\n      \"default\": \"Title\"\n    },\n    {\n      \"key\": \"description\",\n      \"type\": \"richtext\",\n      \"label\": \"Description\",\n      \"default\": \"<p>Description</p>\"\n    },\n    {\n      \"key\": \"image_position\",\n      \"type\": \"select\",\n      \"label\": \"Image position\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Image first\"\n        },\n        {\n          \"value\": \"end\",\n          \"label\": \"Image second\"\n        }\n      ],\n      \"default\": \"start\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"image_width\",\n      \"type\": \"select\",\n      \"label\": \"Image width\",\n      \"options\": [\n        {\n          \"value\": \"40\",\n          \"label\": \"40%\"\n        },\n        {\n          \"value\": \"50\",\n          \"label\": \"50%\"\n        },\n        {\n          \"value\": \"60\",\n          \"label\": \"60%\"\n        }\n      ],\n      \"default\": \"50\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"vertical_alignment\",\n      \"type\": \"select\",\n      \"label\": \"Vertical alignment\",\n      \"options\": [\n        {\n          \"value\": \"top\",\n          \"label\": \"Top\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Middle\"\n        },\n        {\n          \"value\": \"bottom\",\n          \"label\": \"Bottom\"\n        }\n      ],\n      \"default\": \"center\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"text_alignment\",\n      \"type\": \"select\",\n      \"label\": \"Text alignment\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Left\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        },\n        {\n          \"value\": \"end\",\n          \"label\": \"Right\"\n        }\n      ],\n      \"default\": \"start\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"image\",\n      \"type\": \"image_picker\",\n      \"label\": \"Image\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"image_ratio\",\n      \"type\": \"select\",\n      \"label\": \"Image ratio\",\n      \"options\": [\n        {\n          \"value\": \"portrait\",\n          \"label\": \"Portrait (4:5)\"\n        },\n        {\n          \"value\": \"square\",\n          \"label\": \"Square (1:1)\"\n        },\n        {\n          \"value\": \"landscape\",\n          \"label\": \"Landscape (4:3)\"\n        },\n        {\n          \"value\": \"natural\",\n          \"label\": \"Natural\"\n        }\n      ],\n      \"default\": \"square\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"image_fit\",\n      \"type\": \"select\",\n      \"label\": \"Image fit\",\n      \"options\": [\n        {\n          \"value\": \"cover\",\n          \"label\": \"Fill the frame (crop)\"\n        },\n        {\n          \"value\": \"contain\",\n          \"label\": \"Fit inside (no crop)\"\n        }\n      ],\n      \"default\": \"cover\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"button_label\",\n      \"type\": \"text\",\n      \"label\": \"Button label\",\n      \"default\": \"Button label\",\n      \"info\": \"Leave empty to hide the button.\",\n      \"group\": \"buttons\",\n      \"group_label\": \"Buttons\"\n    },\n    {\n      \"key\": \"button_link\",\n      \"type\": \"link\",\n      \"label\": \"Button link\",\n      \"default\": \"/collections\",\n      \"group\": \"buttons\",\n      \"group_label\": \"Buttons\"\n    },\n    {\n      \"key\": \"button_style\",\n      \"type\": \"select\",\n      \"label\": \"Button style\",\n      \"options\": [\n        {\n          \"value\": \"primary\",\n          \"label\": \"Solid\"\n        },\n        {\n          \"value\": \"secondary\",\n          \"label\": \"Outline\"\n        },\n        {\n          \"value\": \"link\",\n          \"label\": \"Link\"\n        }\n      ],\n      \"default\": \"primary\",\n      \"group\": \"buttons\",\n      \"group_label\": \"Buttons\"\n    },\n    {\n      \"key\": \"mobile_order\",\n      \"type\": \"select\",\n      \"label\": \"On mobile\",\n      \"options\": [\n        {\n          \"value\": \"image_first\",\n          \"label\": \"Image first\"\n        },\n        {\n          \"value\": \"text_first\",\n          \"label\": \"Text first\"\n        }\n      ],\n      \"default\": \"image_first\",\n      \"group\": \"mobile\",\n      \"group_label\": \"Mobile\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"default\": \"scheme-1\",\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"panel\",\n      \"type\": \"checkbox\",\n      \"label\": \"Text on a panel\",\n      \"default\": false,\n      \"info\": \"Puts the text on a surface-colored card.\",\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"spacing_top\",\n      \"type\": \"select\",\n      \"label\": \"Top spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"spacing_bottom\",\n      \"type\": \"select\",\n      \"label\": \"Bottom spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"animate\",\n      \"type\": \"checkbox\",\n      \"label\": \"Reveal on scroll\",\n      \"default\": true,\n      \"group\": \"animation\",\n      \"group_label\": \"Animation\"\n    }\n  ],\n  \"presets\": [\n    {\n      \"name\": \"Image with text\"\n    }\n  ]\n}\n{% endschema %}\n","sections/instagram-feed.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign limit = s.limit | default: 6 -%}\n{%- assign profile_url = s.handle_url | default: instagram.profile_url -%}\n{%- assign items = instagram.media | slice: 0, limit -%}\n{%- assign has_posts = false -%}\n{%- if instagram.connected and items.size > 0 -%}{%- assign has_posts = true -%}{%- endif -%}\n{%- comment -%}\n  The store's connected Instagram account, from the server-side cache. Customers\n  never see an empty box: without posts the section hides (unless the merchant\n  turns that off); the editor always shows it so the connect prompt is visible.\n{%- endcomment -%}\n{%- if has_posts or request.design_mode or s.hide_when_disconnected == false -%}\n{%- capture ig_eyebrow -%}{{ s.eyebrow }}{%- if s.show_username != false and instagram.username -%}{%- if s.eyebrow != blank %} · {% endif -%}@{{ instagram.username }}{%- endif -%}{%- endcapture -%}\n{%- assign ig_link = '' -%}\n{%- if profile_url != blank -%}{%- assign ig_link = s.link_text -%}{%- endif -%}\n<section class=\"cn-sec scheme-1\">\n  <div class=\"cn-wrap\">\n    {% render 'section-head', eyebrow: ig_eyebrow, title: s.heading, link: profile_url, link_text: ig_link %}\n  </div>\n  <div class=\"cn-ig{% if s.full_width %} cn-ig--bleed{% else %} cn-wrap{% endif %}\">\n    {%- if has_posts -%}\n      <div class=\"cn-ig__grid cn-ig__grid--{{ s.aspect | default: 'square' }} cn-reveal\"\n           style=\"--ig-cols:{{ s.columns | default: 6 }};--ig-cols-m:{{ s.mobile_columns | default: '3' }};--ig-gap:{{ s.gap | default: 12 }}px\">\n        {%- for m in items -%}\n          {%- assign src = m.media_url -%}\n          {%- if m.media_type == 'VIDEO' -%}{%- assign src = m.thumbnail_url | default: m.media_url -%}{%- endif -%}\n          {%- assign alt = m.caption | default: 'Instagram post' | strip_html | truncate: 80 | escape -%}\n          <a class=\"cn-ig__post\" href=\"{{ m.permalink | default: profile_url }}\"{% if s.new_tab != false %} target=\"_blank\" rel=\"noopener\"{% endif %} aria-label=\"{{ alt }}\">\n            <img src=\"{{ src }}\" alt=\"{{ alt }}\" loading=\"lazy\">\n            {%- if s.show_icon != false -%}\n              <span class=\"cn-ig__badge\">\n                {%- if m.media_type == 'VIDEO' -%}<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M8 5v14l11-7z\"/></svg>{%- elsif m.media_type == 'CAROUSEL_ALBUM' -%}<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><rect x=\"3\" y=\"7\" width=\"14\" height=\"14\" rx=\"2\"/><path d=\"M7 3h12a2 2 0 0 1 2 2v12\"/></svg>{%- else -%}<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"5\"/><circle cx=\"12\" cy=\"12\" r=\"4\"/><circle cx=\"17.3\" cy=\"6.7\" r=\"0.6\" fill=\"currentColor\"/></svg>{%- endif -%}\n              </span>\n            {%- endif -%}\n          </a>\n        {%- endfor -%}\n      </div>\n    {%- elsif instagram.connected -%}\n      <p class=\"cn-ig__note\">No Instagram posts yet. Publish on Instagram, then refresh the feed from Settings → Apps.</p>\n    {%- else -%}\n      <div class=\"cn-ig__connect\">\n        <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" aria-hidden=\"true\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"5\"/><circle cx=\"12\" cy=\"12\" r=\"4\"/><circle cx=\"17.3\" cy=\"6.7\" r=\"0.6\" fill=\"currentColor\"/></svg>\n        <p><strong>Instagram isn't connected yet.</strong><br>Connect your account in this section's settings to show your latest posts.</p>\n      </div>\n    {%- endif -%}\n  </div>\n</section>\n{%- endif -%}\n\n{% schema %}\n{\n  \"name\": \"Instagram feed\",\n  \"icon\": \"lucide:instagram\",\n  \"presets\": [\n    {\n      \"name\": \"Instagram feed\"\n    }\n  ],\n  \"settings\": [\n    {\n      \"key\": \"connection\",\n      \"type\": \"instagram_connection\",\n      \"label\": \"Instagram account\",\n      \"info\": \"Connected once for the whole store. Every Instagram feed section shows this account’s posts.\"\n    },\n    {\n      \"key\": \"eyebrow\",\n      \"type\": \"text\",\n      \"label\": \"Eyebrow\",\n      \"default\": \"Instagram\"\n    },\n    {\n      \"key\": \"heading\",\n      \"type\": \"text\",\n      \"label\": \"Heading\",\n      \"default\": \"Follow along\"\n    },\n    {\n      \"key\": \"link_text\",\n      \"type\": \"text\",\n      \"label\": \"Follow link label\",\n      \"default\": \"Follow us\"\n    },\n    {\n      \"key\": \"handle_url\",\n      \"type\": \"url\",\n      \"label\": \"Profile link\",\n      \"info\": \"Leave empty to link to the connected account’s profile.\"\n    },\n    {\n      \"key\": \"show_username\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show @username\",\n      \"default\": true\n    },\n    {\n      \"type\": \"header\",\n      \"content\": \"Posts\"\n    },\n    {\n      \"key\": \"limit\",\n      \"type\": \"range\",\n      \"label\": \"Number of posts\",\n      \"min\": 3,\n      \"max\": 12,\n      \"step\": 1,\n      \"default\": 6\n    },\n    {\n      \"key\": \"show_icon\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show post type icon\",\n      \"default\": true\n    },\n    {\n      \"key\": \"new_tab\",\n      \"type\": \"checkbox\",\n      \"label\": \"Open posts in a new tab\",\n      \"default\": true\n    },\n    {\n      \"key\": \"hide_when_disconnected\",\n      \"type\": \"checkbox\",\n      \"label\": \"Hide when there are no posts to show\",\n      \"default\": true,\n      \"info\": \"Customers never see an empty section. The editor always shows it.\"\n    },\n    {\n      \"key\": \"columns\",\n      \"type\": \"range\",\n      \"label\": \"Columns on desktop\",\n      \"min\": 3,\n      \"max\": 6,\n      \"step\": 1,\n      \"default\": 6,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"gap\",\n      \"type\": \"range\",\n      \"label\": \"Gap\",\n      \"min\": 0,\n      \"max\": 24,\n      \"step\": 2,\n      \"unit\": \"px\",\n      \"default\": 12,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"full_width\",\n      \"type\": \"checkbox\",\n      \"label\": \"Edge-to-edge posts\",\n      \"default\": false,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"aspect\",\n      \"type\": \"select\",\n      \"segmented\": true,\n      \"label\": \"Post shape\",\n      \"default\": \"square\",\n      \"options\": [\n        {\n          \"value\": \"square\",\n          \"label\": \"Square\"\n        },\n        {\n          \"value\": \"portrait\",\n          \"label\": \"Portrait\"\n        }\n      ],\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"mobile_columns\",\n      \"type\": \"select\",\n      \"segmented\": true,\n      \"label\": \"Columns on mobile\",\n      \"default\": \"3\",\n      \"options\": [\n        {\n          \"value\": \"2\",\n          \"label\": \"2\"\n        },\n        {\n          \"value\": \"3\",\n          \"label\": \"3\"\n        }\n      ],\n      \"group\": \"mobile\",\n      \"group_label\": \"Mobile\"\n    }\n  ]\n}\n{% endschema %}\n","sections/logo-list.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%} Logo list: brand or partner logos in a row, optionally scrolling sideways. {%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign cn_cols = s.columns | default: 5 -%}\n{%- if s.animate != false -%}{%- assign cn_rv = 'cn-reveal' -%}{%- else -%}{%- assign cn_rv = 'cn-reveal is-in is-settled' -%}{%- endif -%}\n<section class=\"cn-sec cn-logos-sec {{ s.color_scheme | default: 'scheme-1' }} cn-pt-{{ s.spacing_top | default: 'default' }} cn-pb-{{ s.spacing_bottom | default: 'default' }}\">\n  <div class=\"cn-container\">\n    {% render 'section-head', title: s.heading, text: s.description, align: s.heading_alignment %}\n    <ul class=\"cn-logos cn-logos--scroll-{{ s.scroll | default: 'none' }} cn-logos--{{ s.alignment | default: 'center' }}{% if s.grayscale %} cn-logos--gray{% endif %}{% if s.show_border %} cn-logos--boxed{% endif %} {{ cn_rv }}\" data-cn-stagger\n      role=\"list\" style=\"--cn-cols-d:{{ cn_cols }};--cn-cols-t:{{ cn_cols | at_most: 4 }};--cn-cols-m:{{ cn_cols | at_most: 3 }};--cn-logo-h:{{ s.logo_height | default: 48 }}px;--cn-grid-gap:{{ s.gap | default: 24 }}px\">\n      {%- for block in section.blocks -%}\n        {%- assign b = block.settings -%}\n        {%- assign cn_src = '' -%}\n        {%- if b.image != blank -%}{%- capture cn_src -%}{{ b.image | asset_url }}{%- endcapture -%}{%- endif -%}\n        <li class=\"cn-logos__item\" {{ block.soooks_attributes }}>\n          {%- if b.link != blank -%}<a class=\"cn-logos__cell\" href=\"{{ b.link }}\"{% if b.alt != blank %} aria-label=\"{{ b.alt | escape }}\"{% endif %}>{%- else -%}<span class=\"cn-logos__cell\">{%- endif -%}\n            {%- if cn_src != '' -%}\n              <img src=\"{{ cn_src }}\" alt=\"{{ b.alt | escape }}\" loading=\"lazy\">\n            {%- else -%}\n              <span class=\"cn-logos__ph\">{%- if b.alt != blank -%}{{ b.alt }}{%- else -%}{{ 'onboarding.brand' | t }}{%- endif -%}</span>\n            {%- endif -%}\n          {%- if b.link != blank -%}</a>{%- else -%}</span>{%- endif -%}\n        </li>\n      {%- endfor -%}\n    </ul>\n  </div>\n</section>\n\n{% schema %}\n{\n  \"name\": \"Logo list\",\n  \"icon\": \"lucide:award\",\n  \"settings\": [\n    {\n      \"key\": \"heading\",\n      \"type\": \"text\",\n      \"label\": \"Heading\",\n      \"default\": \"Title\"\n    },\n    {\n      \"key\": \"description\",\n      \"type\": \"textarea\",\n      \"label\": \"Description\",\n      \"default\": \"\"\n    },\n    {\n      \"key\": \"heading_alignment\",\n      \"type\": \"select\",\n      \"label\": \"Heading alignment\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Left\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        }\n      ],\n      \"default\": \"center\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"columns\",\n      \"type\": \"range\",\n      \"label\": \"Logos per row\",\n      \"min\": 3,\n      \"max\": 8,\n      \"step\": 1,\n      \"default\": 5,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"logo_height\",\n      \"type\": \"range\",\n      \"label\": \"Logo height\",\n      \"min\": 24,\n      \"max\": 120,\n      \"step\": 4,\n      \"default\": 48,\n      \"unit\": \"px\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"alignment\",\n      \"type\": \"select\",\n      \"label\": \"Logo alignment\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Left\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        },\n        {\n          \"value\": \"end\",\n          \"label\": \"Right\"\n        }\n      ],\n      \"default\": \"center\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"scroll\",\n      \"type\": \"select\",\n      \"label\": \"Scroll sideways\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"Never — wrap to new rows\"\n        },\n        {\n          \"value\": \"mobile\",\n          \"label\": \"On mobile\"\n        },\n        {\n          \"value\": \"always\",\n          \"label\": \"Always\"\n        }\n      ],\n      \"default\": \"mobile\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"gap\",\n      \"type\": \"range\",\n      \"label\": \"Space between logos\",\n      \"min\": 0,\n      \"max\": 64,\n      \"step\": 4,\n      \"default\": 24,\n      \"unit\": \"px\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"show_border\",\n      \"type\": \"checkbox\",\n      \"label\": \"Logos on bordered tiles\",\n      \"default\": false,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"default\": \"scheme-1\",\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"grayscale\",\n      \"type\": \"checkbox\",\n      \"label\": \"Gray until hovered\",\n      \"default\": false,\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"spacing_top\",\n      \"type\": \"select\",\n      \"label\": \"Top spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"spacing_bottom\",\n      \"type\": \"select\",\n      \"label\": \"Bottom spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"animate\",\n      \"type\": \"checkbox\",\n      \"label\": \"Reveal on scroll\",\n      \"default\": true,\n      \"group\": \"animation\",\n      \"group_label\": \"Animation\"\n    }\n  ],\n  \"blocks\": [\n    {\n      \"type\": \"logo\",\n      \"name\": \"Logo\",\n      \"settings\": [\n        {\n          \"key\": \"image\",\n          \"type\": \"asset\",\n          \"label\": \"Logo\"\n        },\n        {\n          \"key\": \"alt\",\n          \"type\": \"text\",\n          \"label\": \"Brand name\",\n          \"default\": \"\",\n          \"info\": \"Read out by screen readers; shown until a logo is chosen.\"\n        },\n        {\n          \"key\": \"link\",\n          \"type\": \"link\",\n          \"label\": \"Link\"\n        }\n      ]\n    }\n  ],\n  \"max_blocks\": 16,\n  \"presets\": [\n    {\n      \"name\": \"Logo list\",\n      \"blocks\": [\n        {\n          \"type\": \"logo\"\n        },\n        {\n          \"type\": \"logo\"\n        },\n        {\n          \"type\": \"logo\"\n        },\n        {\n          \"type\": \"logo\"\n        },\n        {\n          \"type\": \"logo\"\n        }\n      ]\n    }\n  ]\n}\n{% endschema %}\n","sections/main-404.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%} Page not found: a short message, a search box and a way back. {%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign scheme = s.color_scheme | default: 'scheme-1' -%}\n<section class=\"cn-404-page {{ scheme }}\" style=\"--cn-pt: {{ s.padding_top | default: 80 }}px; --cn-pb: {{ s.padding_bottom | default: 96 }}px;\">\n  <div class=\"cn-wrap\">\n    <div class=\"cn-404-page__inner\">\n      {%- if s.show_code != false -%}<p class=\"cn-404-page__code\" aria-hidden=\"true\">404</p>{%- endif -%}\n      <h1 class=\"cn-404-page__title\">{{ s.heading | default: 'general.not_found_title' | t }}</h1>\n      {%- if s.text != blank -%}<p class=\"cn-404-page__text\">{{ s.text }}</p>{%- endif -%}\n      {%- if s.show_search != false -%}\n        <form class=\"cn-search-page__form cn-404-page__search\" method=\"get\" action=\"/search\" role=\"search\">\n          <label class=\"cn-visually-hidden\" for=\"cn-404-q-{{ section.id }}\">{{ 'general.search' | t }}</label>\n          <span class=\"cn-search-page__field\">\n            {% render 'cn-tpl-icon', name: 'search', size: 18, class: 'cn-search-page__icon' %}\n            <input class=\"cn-input cn-search-page__input\" id=\"cn-404-q-{{ section.id }}\" type=\"search\" name=\"q\" placeholder=\"{{ 'search.placeholder' | t | escape }}\" autocomplete=\"off\">\n          </span>\n          <button class=\"cn-btn\" type=\"submit\">{{ 'general.search' | t }}</button>\n        </form>\n      {%- endif -%}\n      <div class=\"cn-404-page__actions\">\n        <a class=\"cn-btn{% if s.show_search != false %} cn-btn--secondary{% endif %}\" href=\"{{ s.button_link | default: '/' }}\">{{ s.button_label | default: 'general.back_home' | t }}</a>\n      </div>\n    </div>\n  </div>\n</section>\n\n{% schema %}\n{\n  \"name\": \"404 page\",\n  \"icon\": \"lucide:circle-help\",\n  \"settings\": [\n    {\n      \"key\": \"heading\",\n      \"type\": \"text\",\n      \"label\": \"Heading\",\n      \"default\": \"Page not found\"\n    },\n    {\n      \"key\": \"text\",\n      \"type\": \"textarea\",\n      \"label\": \"Text\",\n      \"default\": \"The page you were looking for isn't here. It may have moved, or the link may be out of date.\"\n    },\n    {\n      \"key\": \"show_code\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show “404”\",\n      \"default\": true\n    },\n    {\n      \"key\": \"show_search\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show search box\",\n      \"default\": true\n    },\n    {\n      \"key\": \"button_label\",\n      \"type\": \"text\",\n      \"label\": \"Button label\",\n      \"default\": \"Back to the homepage\"\n    },\n    {\n      \"key\": \"button_link\",\n      \"type\": \"link\",\n      \"label\": \"Button link\",\n      \"default\": \"/\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"default\": \"scheme-1\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"padding_top\",\n      \"type\": \"range\",\n      \"label\": \"Top spacing\",\n      \"min\": 0,\n      \"max\": 160,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 80,\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"padding_bottom\",\n      \"type\": \"range\",\n      \"label\": \"Bottom spacing\",\n      \"min\": 0,\n      \"max\": 160,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 96,\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    }\n  ]\n}\n{% endschema %}\n","sections/main-account.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  The customer account is drawn by the store platform inside this section: sign-in, orders, addresses,\n  personal information and security never run as theme code. The settings and blocks below shape it, and it\n  takes this theme's colours, fonts, buttons and corners.\n{%- endcomment -%}\n<div class=\"soooks-account\" data-soooks-account>\n  <a href=\"/account\">{{ section.settings.heading | remove: '{first_name}' | remove: ',' | strip | default: 'My account' }}</a>\n</div>\n\n{% schema %}\n{\n  \"name\": \"Customer account\",\n  \"icon\": \"lucide:user-round\",\n  \"seed_blocks\": true,\n  \"classes\": {\n    \"button\": \"cn-btn\",\n    \"button_secondary\": \"cn-btn cn-btn--secondary\"\n  },\n  \"settings\": [\n    {\n      \"key\": \"heading\",\n      \"type\": \"text\",\n      \"label\": \"Heading\",\n      \"default\": \"Hi, {first_name}\",\n      \"info\": \"{first_name} shows the customer's first name. Shown on the account home.\"\n    },\n    {\n      \"key\": \"subheading\",\n      \"type\": \"text\",\n      \"label\": \"Subheading\",\n      \"default\": \"Your orders, addresses and details in one place.\"\n    },\n    {\n      \"key\": \"nav_layout\",\n      \"type\": \"select\",\n      \"label\": \"Navigation\",\n      \"options\": [\n        {\n          \"value\": \"sidebar\",\n          \"label\": \"Sidebar\"\n        },\n        {\n          \"value\": \"tabs\",\n          \"label\": \"Tabs\"\n        }\n      ],\n      \"default\": \"sidebar\",\n      \"info\": \"Phones always show a compact row of tabs.\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"max_width\",\n      \"type\": \"range\",\n      \"label\": \"Page width (px)\",\n      \"min\": 720,\n      \"max\": 1600,\n      \"step\": 20,\n      \"default\": 1200,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    }\n  ],\n  \"blocks\": [\n    {\n      \"type\": \"profile\",\n      \"name\": \"Profile summary\",\n      \"limit\": 1,\n      \"settings\": []\n    },\n    {\n      \"type\": \"recent-orders\",\n      \"name\": \"Recent orders\",\n      \"limit\": 1,\n      \"settings\": [\n        {\n          \"key\": \"heading\",\n          \"type\": \"text\",\n          \"label\": \"Heading\",\n          \"default\": \"Recent orders\"\n        },\n        {\n          \"key\": \"count\",\n          \"type\": \"range\",\n          \"label\": \"Orders shown\",\n          \"min\": 1,\n          \"max\": 5,\n          \"step\": 1,\n          \"default\": 3\n        }\n      ]\n    },\n    {\n      \"type\": \"quick-links\",\n      \"name\": \"Quick links\",\n      \"limit\": 1,\n      \"settings\": []\n    },\n    {\n      \"type\": \"gift-cards\",\n      \"name\": \"Gift card balance\",\n      \"limit\": 1,\n      \"settings\": [],\n      \"info\": \"Only shown to customers who have a gift card with a balance.\"\n    },\n    {\n      \"type\": \"default-address\",\n      \"name\": \"Default address\",\n      \"limit\": 1,\n      \"settings\": []\n    },\n    {\n      \"type\": \"text\",\n      \"name\": \"Text\",\n      \"settings\": [\n        {\n          \"key\": \"heading\",\n          \"type\": \"text\",\n          \"label\": \"Heading\",\n          \"default\": \"Need help?\"\n        },\n        {\n          \"key\": \"text\",\n          \"type\": \"textarea\",\n          \"label\": \"Text\",\n          \"default\": \"Questions about an order? Reply to your order confirmation email and we'll get back to you.\"\n        }\n      ]\n    }\n  ],\n  \"presets\": [\n    {\n      \"name\": \"Customer account\",\n      \"blocks\": [\n        {\n          \"type\": \"profile\"\n        },\n        {\n          \"type\": \"recent-orders\"\n        },\n        {\n          \"type\": \"quick-links\"\n        },\n        {\n          \"type\": \"gift-cards\"\n        }\n      ]\n    }\n  ]\n}\n{% endschema %}\n","sections/main-article.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Article page: hero image, title and meta, content, tags, share, back link and related articles\n  (same blog, provided by the platform as article.related). Share buttons: assets/corner-product.js.\n{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign scheme = s.color_scheme | default: 'scheme-1' -%}\n{%- assign width = s.content_width | default: 'medium' -%}\n{%- assign image_style = s.image_style | default: 'contained' -%}\n{%- assign a_title = article.title | default: 'onboarding.article' | t -%}\n{%- assign show_image = false -%}{%- if s.show_image != false and article.image -%}{%- assign show_image = true -%}{%- endif -%}\n\n<section class=\"cn-article-page {{ scheme }}\" style=\"--cn-pt: {{ s.padding_top | default: 32 }}px; --cn-pb: {{ s.padding_bottom | default: 64 }}px;\">\n  <article class=\"cn-article-page__article\">\n    {%- if show_image and image_style == 'full' -%}\n      <div class=\"cn-article-page__hero cn-article-page__hero--full\">\n        <img src=\"{{ article.image.url | default: article.image }}\" alt=\"{{ article.image.alt | escape }}\" loading=\"eager\" fetchpriority=\"high\">\n      </div>\n    {%- endif -%}\n    <div class=\"cn-wrap\">\n      <div class=\"cn-article-page__inner cn-article-page__inner--{{ width }}\">\n        <header class=\"cn-article-page__head cn-article-page__head--{{ s.heading_alignment | default: 'center' }}\">\n          {%- if s.show_category != false and article.category -%}\n            <a class=\"cn-article-page__cat\" href=\"/blog?category={{ article.category | url_encode }}\">{{ article.category }}</a>\n          {%- endif -%}\n          <h1 class=\"cn-article-page__title\">{{ a_title }}</h1>\n          {%- assign show_date = false -%}{%- if s.show_date != false and article.published_at -%}{%- assign show_date = true -%}{%- endif -%}\n          {%- assign show_author = false -%}{%- if s.show_author != false and article.author -%}{%- assign show_author = true -%}{%- endif -%}\n          {%- assign show_rt = false -%}{%- if s.show_reading_time != false and article.reading_time -%}{%- assign show_rt = true -%}{%- endif -%}\n          {%- if show_date or show_author or show_rt -%}\n            <p class=\"cn-article-page__meta\">\n              {%- if show_author -%}<span>{{ 'blog.by_author' | t | replace: '{author}', article.author }}</span>{%- endif -%}\n              {%- if show_date -%}<time datetime=\"{{ article.published_at }}\">{{ article.published_at | date: '%B %-d, %Y' }}</time>{%- endif -%}\n              {%- if show_rt -%}<span>{{ 'blog.reading_time' | t | replace: '{minutes}', article.reading_time }}</span>{%- endif -%}\n            </p>\n          {%- endif -%}\n        </header>\n\n        {%- if show_image and image_style != 'full' -%}\n          <div class=\"cn-article-page__hero\">\n            <img src=\"{{ article.image.url | default: article.image }}\" alt=\"{{ article.image.alt | escape }}\" loading=\"eager\" fetchpriority=\"high\">\n          </div>\n        {%- endif -%}\n\n        <div class=\"cn-article-page__body cn-rte\">\n          {%- if article.body != blank -%}{{ article.body }}{%- else -%}<p>{{ 'onboarding.article_text' | t }}</p>{%- endif -%}\n        </div>\n\n        {%- if s.show_tags != false and article.tags.size > 0 -%}\n          <p class=\"cn-article-page__tags\">\n            {%- for tag in article.tags -%}<a class=\"cn-chip cn-chip--link\" href=\"/blog?tag={{ tag | url_encode }}\">#{{ tag }}</a>{%- endfor -%}\n          </p>\n        {%- endif -%}\n\n        <div class=\"cn-article-page__foot\">\n          {%- if s.show_back != false -%}\n            {%- assign back_url = '/blog' -%}\n            {%- if article.blog.handle -%}{%- assign back_url = '/blogs/' | append: article.blog.handle -%}{%- endif -%}\n            <a class=\"cn-tlink\" href=\"{{ back_url }}\">{% render 'cn-tpl-icon', name: 'arrow-left', size: 16 %}{{ 'blog.back_to_blog' | t }}</a>\n          {%- endif -%}\n          {%- if s.show_share != false -%}\n            <div class=\"cn-share\" data-cn-share data-title=\"{{ a_title | escape }}\" data-label-copied=\"{{ 'products.link_copied' | t | escape }}\">\n              <button type=\"button\" class=\"cn-share__btn\" data-cn-share-native hidden>{% render 'cn-tpl-icon', name: 'share', size: 16 %}<span>{{ 'products.share' | t }}</span></button>\n              <button type=\"button\" class=\"cn-share__btn\" data-cn-share-copy>{% render 'cn-tpl-icon', name: 'link', size: 16 %}<span data-cn-share-copy-label>{{ 'products.copy_link' | t }}</span></button>\n            </div>\n          {%- endif -%}\n        </div>\n      </div>\n    </div>\n  </article>\n\n  {%- if s.show_related != false and article.related.size > 0 -%}\n    <div class=\"cn-wrap\">\n      <aside class=\"cn-article-page__related\" aria-labelledby=\"cn-related-{{ section.id }}\">\n        <h2 class=\"cn-tpl-head__title\" id=\"cn-related-{{ section.id }}\">{{ s.related_heading | default: 'blog.related' | t }}</h2>\n        <div class=\"cn-articles\" style=\"--cn-cols-d: 3;\">\n          {%- for post in article.related limit: 3 -%}\n            {% render 'cn-article-card', post: post, s: s, featured: false, eager: false, heading_level: 3 %}\n          {%- endfor -%}\n        </div>\n      </aside>\n    </div>\n  {%- endif -%}\n</section>\n\n{% schema %}\n{\n  \"name\": \"Article page\",\n  \"icon\": \"lucide:file-text\",\n  \"settings\": [\n    {\n      \"key\": \"show_image\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show featured image\",\n      \"default\": true\n    },\n    {\n      \"key\": \"show_category\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show category\",\n      \"default\": true\n    },\n    {\n      \"key\": \"show_date\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show date\",\n      \"default\": true\n    },\n    {\n      \"key\": \"show_author\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show author\",\n      \"default\": true\n    },\n    {\n      \"key\": \"show_reading_time\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show reading time\",\n      \"default\": true\n    },\n    {\n      \"key\": \"show_tags\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show tags\",\n      \"default\": true\n    },\n    {\n      \"key\": \"show_share\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show share buttons\",\n      \"default\": true\n    },\n    {\n      \"key\": \"show_back\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show “Back to blog” link\",\n      \"default\": true\n    },\n    {\n      \"key\": \"show_related\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show related articles\",\n      \"default\": true\n    },\n    {\n      \"key\": \"related_heading\",\n      \"type\": \"text\",\n      \"label\": \"Related articles heading\",\n      \"default\": \"Keep reading\",\n      \"visible_if\": \"{% unless section.settings.show_related == false %}true{% endunless %}\"\n    },\n    {\n      \"key\": \"content_width\",\n      \"type\": \"select\",\n      \"label\": \"Content width\",\n      \"default\": \"medium\",\n      \"options\": [\n        {\n          \"value\": \"narrow\",\n          \"label\": \"Narrow\"\n        },\n        {\n          \"value\": \"medium\",\n          \"label\": \"Medium\"\n        },\n        {\n          \"value\": \"wide\",\n          \"label\": \"Wide\"\n        }\n      ],\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"heading_alignment\",\n      \"type\": \"select\",\n      \"label\": \"Title alignment\",\n      \"default\": \"center\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Start\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        }\n      ],\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"image_style\",\n      \"type\": \"select\",\n      \"label\": \"Featured image\",\n      \"default\": \"contained\",\n      \"options\": [\n        {\n          \"value\": \"contained\",\n          \"label\": \"Under the title\"\n        },\n        {\n          \"value\": \"full\",\n          \"label\": \"Full width above the title\"\n        }\n      ],\n      \"visible_if\": \"{% unless section.settings.show_image == false %}true{% endunless %}\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"image_ratio\",\n      \"type\": \"select\",\n      \"label\": \"Related article image shape\",\n      \"default\": \"landscape\",\n      \"options\": [\n        {\n          \"value\": \"landscape\",\n          \"label\": \"Landscape (3:2)\"\n        },\n        {\n          \"value\": \"square\",\n          \"label\": \"Square\"\n        },\n        {\n          \"value\": \"portrait\",\n          \"label\": \"Portrait (4:5)\"\n        },\n        {\n          \"value\": \"wide\",\n          \"label\": \"Wide (16:9)\"\n        }\n      ],\n      \"visible_if\": \"{% unless section.settings.show_related == false %}true{% endunless %}\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"default\": \"scheme-1\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"padding_top\",\n      \"type\": \"range\",\n      \"label\": \"Top spacing\",\n      \"min\": 0,\n      \"max\": 120,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 32,\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"padding_bottom\",\n      \"type\": \"range\",\n      \"label\": \"Bottom spacing\",\n      \"min\": 0,\n      \"max\": 120,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 64,\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    }\n  ]\n}\n{% endschema %}\n","sections/main-blog.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Blog page: optional featured (latest) article, then a grid; category and tag filters (?category=, ?tag=) and\n  pagination. \"Posts per page\" (limit) sets the page size the storefront asks the platform for.\n{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign scheme = s.color_scheme | default: 'scheme-1' -%}\n{%- assign blog_posts = blog.posts -%}\n{%- if blog_posts == blank or blog_posts.size == 0 -%}{%- assign blog_posts = posts -%}{%- endif -%}\n{%- assign ratio = s.image_ratio | default: 'landscape' -%}\n{%- assign title = blog.title | default: s.heading -%}\n{%- assign cur_page = paginate.current_page | default: 1 -%}\n{%- assign feature_first = false -%}\n{%- if s.featured_first != false and cur_page == 1 and page_query.tag == blank and page_query.category == blank and blog_posts.size > 1 -%}{%- assign feature_first = true -%}{%- endif -%}\n{%- capture base_query -%}{% if page_query.category %}category={{ page_query.category | url_encode }}&{% endif %}{% if page_query.tag %}tag={{ page_query.tag | url_encode }}&{% endif %}{%- endcapture -%}\n\n<section class=\"cn-blog {{ scheme }}\" style=\"--cn-pt: {{ s.padding_top | default: 32 }}px; --cn-pb: {{ s.padding_bottom | default: 64 }}px;\">\n  <div class=\"cn-wrap\">\n    <header class=\"cn-tpl-head cn-tpl-head--{{ s.heading_alignment | default: 'start' }} cn-blog__head\">\n      {%- if title != blank -%}<h1 class=\"cn-tpl-head__title cn-tpl-head__title--page\">{{ title }}</h1>{%- endif -%}\n      {%- if s.show_description != false -%}\n        {%- if blog.description != blank -%}\n          <div class=\"cn-tpl-head__text cn-rte\">{{ blog.description }}</div>\n        {%- elsif s.description != blank -%}\n          <p class=\"cn-tpl-head__text\">{{ s.description }}</p>\n        {%- endif -%}\n      {%- endif -%}\n    </header>\n\n    {%- if s.show_categories != false and blog.categories.size > 0 -%}\n      <nav class=\"cn-blog__filters\" aria-label=\"{{ 'blog.categories' | t | escape }}\">\n        <a class=\"cn-chip cn-chip--link{% if page_query.category == blank and page_query.tag == blank %} is-active{% endif %}\" href=\"?\">{{ 'blog.all' | t }}</a>\n        {%- for cat in blog.categories -%}\n          <a class=\"cn-chip cn-chip--link{% if page_query.category == cat %} is-active{% endif %}\" href=\"?category={{ cat | url_encode }}\"{% if page_query.category == cat %} aria-current=\"page\"{% endif %}>{{ cat }}</a>\n        {%- endfor -%}\n      </nav>\n    {%- endif -%}\n    {%- if page_query.tag -%}\n      <div class=\"cn-collection__chips\">\n        <a class=\"cn-chip\" href=\"?\">#{{ page_query.tag }}{% render 'cn-tpl-icon', name: 'close', size: 14 %}<span class=\"cn-visually-hidden\">{{ 'collections.remove_filter' | t }}</span></a>\n      </div>\n    {%- endif -%}\n\n    {%- if blog_posts.size > 0 -%}\n      {%- assign grid_offset = 0 -%}\n      {%- if feature_first -%}\n        {%- assign grid_offset = 1 -%}\n        {% render 'cn-article-card', post: blog_posts.first, s: s, featured: true, eager: true %}\n      {%- endif -%}\n      <div class=\"cn-articles\" style=\"--cn-cols-d: {{ s.columns | default: 3 }};\">\n        {%- for post in blog_posts offset: grid_offset -%}\n          {%- assign eager = false -%}{%- if forloop.index <= 3 and grid_offset == 0 -%}{%- assign eager = true -%}{%- endif -%}\n          {% render 'cn-article-card', post: post, s: s, featured: false, eager: eager %}\n        {%- endfor -%}\n      </div>\n      {% render 'pagination', paginate: paginate, base_query: base_query %}\n    {%- else -%}\n      <div class=\"cn-empty-state\">\n        <p class=\"cn-empty-state__text\">{{ 'blog.empty' | t }}</p>\n      </div>\n    {%- endif -%}\n  </div>\n</section>\n\n{% schema %}\n{\n  \"name\": \"Blog page\",\n  \"icon\": \"lucide:newspaper\",\n  \"settings\": [\n    {\n      \"key\": \"heading\",\n      \"type\": \"text\",\n      \"label\": \"Heading\",\n      \"info\": \"A blog's own title replaces it on that blog's page.\",\n      \"default\": \"Blog\"\n    },\n    {\n      \"key\": \"description\",\n      \"type\": \"textarea\",\n      \"label\": \"Description\"\n    },\n    {\n      \"key\": \"show_description\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show description\",\n      \"default\": true\n    },\n    {\n      \"key\": \"limit\",\n      \"type\": \"range\",\n      \"label\": \"Posts per page\",\n      \"min\": 6,\n      \"max\": 24,\n      \"step\": 1,\n      \"default\": 13\n    },\n    {\n      \"key\": \"featured_first\",\n      \"type\": \"checkbox\",\n      \"label\": \"Feature the latest post\",\n      \"info\": \"On the first page, without filters.\",\n      \"default\": true\n    },\n    {\n      \"key\": \"show_categories\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show category filter\",\n      \"default\": true\n    },\n    {\n      \"key\": \"heading_alignment\",\n      \"type\": \"select\",\n      \"label\": \"Heading alignment\",\n      \"default\": \"start\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Start\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        }\n      ],\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"columns\",\n      \"type\": \"range\",\n      \"label\": \"Columns on desktop\",\n      \"min\": 2,\n      \"max\": 4,\n      \"step\": 1,\n      \"default\": 3,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"show_image\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show image\",\n      \"default\": true,\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"image_ratio\",\n      \"type\": \"select\",\n      \"label\": \"Image shape\",\n      \"default\": \"landscape\",\n      \"options\": [\n        {\n          \"value\": \"landscape\",\n          \"label\": \"Landscape (3:2)\"\n        },\n        {\n          \"value\": \"square\",\n          \"label\": \"Square\"\n        },\n        {\n          \"value\": \"portrait\",\n          \"label\": \"Portrait (4:5)\"\n        },\n        {\n          \"value\": \"wide\",\n          \"label\": \"Wide (16:9)\"\n        }\n      ],\n      \"visible_if\": \"{% unless section.settings.show_image == false %}true{% endunless %}\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"show_date\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show date\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Article cards\"\n    },\n    {\n      \"key\": \"show_author\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show author\",\n      \"default\": false,\n      \"group\": \"cards\",\n      \"group_label\": \"Article cards\"\n    },\n    {\n      \"key\": \"show_category\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show category\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Article cards\"\n    },\n    {\n      \"key\": \"show_excerpt\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show excerpt\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Article cards\"\n    },\n    {\n      \"key\": \"show_tags\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show tags\",\n      \"default\": false,\n      \"group\": \"cards\",\n      \"group_label\": \"Article cards\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"default\": \"scheme-1\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"padding_top\",\n      \"type\": \"range\",\n      \"label\": \"Top spacing\",\n      \"min\": 0,\n      \"max\": 120,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 32,\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"padding_bottom\",\n      \"type\": \"range\",\n      \"label\": \"Bottom spacing\",\n      \"min\": 0,\n      \"max\": 120,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 64,\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    }\n  ]\n}\n{% endschema %}\n","sections/main-cart.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Cart page. Line contract (assets/corner-core.js, unchanged from the base theme): [data-cn-cart-page] >\n  [data-cn-cart-line=<line id>] with [data-cn-qty] steppers, [data-cn-qty-input], [data-cn-remove],\n  [data-cn-line-total], [data-cn-line-note]; [data-cn-subtotal] (total after automatic discounts),\n  [data-cn-cart-note] (order note, saved as typed) and [data-cn-checkout].\n  The free-shipping bar and discount lines refresh from assets/corner-product.js after each change.\n  Discount codes and gift cards are entered at checkout (the cart has no field for them).\n{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign scheme = s.color_scheme | default: 'scheme-1' -%}\n{%- assign has_items = false -%}{%- if cart and cart.items.size > 0 -%}{%- assign has_items = true -%}{%- endif -%}\n{%- assign cart_total = cart.discounted_subtotal | default: cart.subtotal | default: 0 -%}\n\n<section class=\"cn-cart-page {{ scheme }}\" style=\"--cn-pt: {{ s.padding_top | default: 32 }}px; --cn-pb: {{ s.padding_bottom | default: 64 }}px;\">\n  <div class=\"cn-wrap\">\n    <div class=\"cn-cart-page__inner\" data-cn-cart-page data-cn-cart-extras\n      data-msg-stock=\"{{ 'cart.stock_max' | t | escape }}\"\n      data-money-sample=\"{{ 123456 | money | escape }}\"\n      data-label-remaining=\"{{ 'cart.free_shipping_remaining' | t | escape }}\"\n      data-label-reached=\"{{ 'cart.free_shipping_reached' | t | escape }}\">\n      <header class=\"cn-cart-page__head\">\n        <h1 class=\"cn-cart-page__title\">{{ s.heading | default: 'cart.title' | t }}</h1>\n        {%- if has_items and s.show_continue != false -%}\n          <a class=\"cn-tlink\" href=\"/products\">{{ 'general.continue_shopping' | t }}</a>\n        {%- endif -%}\n      </header>\n\n      {%- if has_items -%}\n        {%- if s.show_free_shipping != false and cart.free_shipping -%}\n          <div class=\"cn-shipbar\" data-cn-ship-bar role=\"status\">\n            <p class=\"cn-shipbar__text\" data-cn-ship-text>\n              {%- if cart.free_shipping.remaining > 0 -%}\n                {%- assign remaining_money = cart.free_shipping.remaining | money -%}\n                {{ 'cart.free_shipping_remaining' | t | replace: '{amount}', remaining_money }}\n              {%- else -%}\n                {{ 'cart.free_shipping_reached' | t }}\n              {%- endif -%}\n            </p>\n            <div class=\"cn-shipbar__track\" aria-hidden=\"true\"><span data-cn-ship-progress style=\"width: {{ cart.free_shipping.progress | default: 0 }}%\"></span></div>\n          </div>\n        {%- endif -%}\n\n        <div class=\"cn-cart-page__layout\">\n          <div class=\"cn-cart-page__lines\">\n            <div class=\"cn-cart-page__labels\" aria-hidden=\"true\">\n              <span>{{ 'cart.product' | t }}</span>\n              <span>{{ 'products.quantity' | t }}</span>\n              <span>{{ 'cart.total' | t }}</span>\n            </div>\n            <ul class=\"cn-cart-lines\" role=\"list\">\n              {%- for item in cart.items -%}\n                <li class=\"cn-cart-line\" data-cn-cart-line=\"{{ item.id }}\">\n                  <a class=\"cn-cart-line__media\" href=\"/products/{{ item.slug }}\" tabindex=\"-1\" aria-hidden=\"true\">\n                    {%- if item.image -%}\n                      <img src=\"{{ item.image }}\" alt=\"\" loading=\"lazy\" width=\"96\" height=\"96\">\n                    {%- else -%}\n                      <img src=\"{{ 'ph-product-1.svg' | asset_url }}\" alt=\"\" loading=\"lazy\" width=\"96\" height=\"96\">\n                    {%- endif -%}\n                  </a>\n                  <div class=\"cn-cart-line__info\">\n                    <a class=\"cn-cart-line__name\" href=\"/products/{{ item.slug }}\">{{ item.name }}</a>\n                    {%- if item.variant_title and item.variant_title != 'Default Title' -%}\n                      <p class=\"cn-cart-line__variant\">{{ item.variant_title }}</p>\n                    {%- endif -%}\n                    {%- if item.gift_card and item.properties -%}\n                      {%- if item.properties.recipient_name or item.properties.recipient_email -%}\n                        <p class=\"cn-cart-line__variant\">{{ 'cart.gift_card_for' | t }} {{ item.properties.recipient_name | default: item.properties.recipient_email }}</p>\n                      {%- endif -%}\n                    {%- endif -%}\n                    <p class=\"cn-cart-line__unit\">{{ item.unit_price | money }}</p>\n                  </div>\n                  <div class=\"cn-cart-line__qty\">\n                    <div class=\"cn-stepper cn-stepper--sm\" data-cn-qty>\n                      <button type=\"button\" class=\"cn-stepper__btn\" data-cn-qty-step=\"-1\" aria-label=\"{{ 'products.decrease_quantity' | t | escape }}\">{% render 'cn-tpl-icon', name: 'minus', size: 14 %}</button>\n                      <input class=\"cn-stepper__input\" type=\"number\" inputmode=\"numeric\" value=\"{{ item.quantity }}\" min=\"0\" max=\"99\" data-cn-qty-input {% if item.available != blank %}data-available=\"{{ item.available }}\"{% endif %} aria-label=\"{{ 'products.quantity' | t | escape }}: {{ item.name | escape }}\">\n                      <button type=\"button\" class=\"cn-stepper__btn\" data-cn-qty-step=\"1\" aria-label=\"{{ 'products.increase_quantity' | t | escape }}\">{% render 'cn-tpl-icon', name: 'plus', size: 14 %}</button>\n                    </div>\n                    <button type=\"button\" class=\"cn-cart-line__remove\" data-cn-remove>{{ 'cart.remove' | t }}<span class=\"cn-visually-hidden\">: {{ item.name }}</span></button>\n                  </div>\n                  <p class=\"cn-cart-line__total\" data-cn-line-total>{{ item.line_total | money }}</p>\n                  <div class=\"cn-note cn-cart-line__note\" data-cn-line-note hidden></div>\n                </li>\n              {%- endfor -%}\n            </ul>\n          </div>\n\n          <aside class=\"cn-cart-summary\" aria-label=\"{{ 'cart.summary' | t | escape }}\">\n            <div class=\"cn-cart-summary__rows\" data-cn-cart-discounts data-show=\"{% if s.show_discounts == false %}false{% else %}true{% endif %}\" data-label-subtotal=\"{{ 'cart.subtotal' | t | escape }}\">\n              {%- if s.show_discounts != false and cart.discounts.size > 0 -%}\n                <p class=\"cn-cart-summary__row\"><span>{{ 'cart.subtotal' | t }}</span><span>{{ cart.subtotal | money }}</span></p>\n                {%- for discount in cart.discounts -%}\n                  <p class=\"cn-cart-summary__row cn-cart-summary__row--discount\"><span>{{ discount.label | default: discount.code | default: 'cart.discount' | t }}</span><span>−{{ discount.amount | money }}</span></p>\n                {%- endfor -%}\n              {%- endif -%}\n            </div>\n            <p class=\"cn-cart-summary__row cn-cart-summary__row--total\"><span>{{ 'cart.total' | t }}</span><strong data-cn-subtotal>{{ cart_total | money }}</strong></p>\n            {%- if s.show_tax_note != false -%}\n              <p class=\"cn-cart-summary__hint\">{{ 'cart.shipping_note' | t }}</p>\n            {%- endif -%}\n            {%- if s.show_note != false -%}\n              <details class=\"cn-cart-summary__note\"{% if cart.note != blank %} open{% endif %}>\n                <summary>{{ 'cart.note_label' | t }}{% render 'cn-tpl-icon', name: 'chevron-down', size: 16, class: 'cn-disclosure__chevron' %}</summary>\n                <label class=\"cn-visually-hidden\" for=\"cn-cart-note-{{ section.id }}\">{{ 'cart.note_label' | t }}</label>\n                <textarea class=\"cn-input cn-cart-summary__textarea\" id=\"cn-cart-note-{{ section.id }}\" rows=\"3\" maxlength=\"500\" data-cn-cart-note placeholder=\"{{ 'cart.note_placeholder' | t | escape }}\">{{ cart.note }}</textarea>\n              </details>\n            {%- endif -%}\n            <a class=\"cn-btn cn-btn--wide cn-cart-summary__checkout\" href=\"/checkout\" data-cn-checkout>{{ 'cart.checkout' | t }}</a>\n            {%- if s.checkout_hint != blank -%}\n              <p class=\"cn-cart-summary__hint cn-cart-summary__hint--center\">{{ s.checkout_hint }}</p>\n            {%- endif -%}\n          </aside>\n        </div>\n      {%- else -%}\n        <div class=\"cn-empty-state cn-empty-state--cart\">\n          <p class=\"cn-empty-state__title\">{{ 'cart.empty' | t }}</p>\n          <p class=\"cn-empty-state__text\">{{ 'cart.empty_hint' | t }}</p>\n          <a class=\"cn-btn\" href=\"{{ s.empty_button_link | default: '/products' }}\">{{ 'general.continue_shopping' | t }}</a>\n        </div>\n      {%- endif -%}\n    </div>\n\n    {%- if s.show_recommendations != false -%}\n      {%- assign rec_max = s.limit | default: 4 -%}\n      {%- assign rec_shown = 0 -%}\n      {%- capture rec_cards -%}\n        {%- for item in products -%}\n          {%- assign in_cart = false -%}\n          {%- for line in cart.items -%}{%- if line.slug == item.slug -%}{%- assign in_cart = true -%}{%- endif -%}{%- endfor -%}\n          {%- if in_cart -%}{%- continue -%}{%- endif -%}\n          {%- if rec_shown >= rec_max -%}{%- break -%}{%- endif -%}\n          <div class=\"cn-tgrid__item\">{% render 'product-card', product: item, card: s, index: rec_shown %}</div>\n          {%- assign rec_shown = rec_shown | plus: 1 -%}\n        {%- endfor -%}\n      {%- endcapture -%}\n      {%- if rec_shown > 0 -%}\n        <div class=\"cn-cart-recs\">\n          {%- if s.recommendations_heading != blank -%}<h2 class=\"cn-tpl-head__title\">{{ s.recommendations_heading }}</h2>{%- endif -%}\n          <div class=\"cn-tgrid cn-tgrid--m-slider\" style=\"--cn-cols-d: {{ s.columns_desktop | default: 4 }}; --cn-cols-t: 3; --cn-cols-m: 2;\">{{ rec_cards }}</div>\n        </div>\n      {%- endif -%}\n    {%- endif -%}\n  </div>\n</section>\n\n{% schema %}\n{\n  \"name\": \"Cart page\",\n  \"icon\": \"lucide:shopping-cart\",\n  \"settings\": [\n    {\n      \"key\": \"heading\",\n      \"type\": \"text\",\n      \"label\": \"Heading\",\n      \"default\": \"Your cart\"\n    },\n    {\n      \"key\": \"show_continue\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show “Continue shopping” link\",\n      \"default\": true\n    },\n    {\n      \"key\": \"show_free_shipping\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show free shipping progress\",\n      \"info\": \"Shown when Shipping settings offer free shipping above an amount.\",\n      \"default\": true\n    },\n    {\n      \"key\": \"show_discounts\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show automatic discounts\",\n      \"default\": true\n    },\n    {\n      \"key\": \"show_note\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show order note\",\n      \"default\": true\n    },\n    {\n      \"key\": \"show_tax_note\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show taxes and shipping note\",\n      \"default\": true\n    },\n    {\n      \"key\": \"checkout_hint\",\n      \"type\": \"textarea\",\n      \"label\": \"Note under the checkout button\",\n      \"default\": \"Discount codes and gift cards can be added at checkout.\"\n    },\n    {\n      \"key\": \"empty_button_link\",\n      \"type\": \"link\",\n      \"label\": \"Empty cart button link\",\n      \"default\": \"/products\"\n    },\n    {\n      \"key\": \"show_recommendations\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show product recommendations\",\n      \"default\": true,\n      \"group\": \"recommendations\",\n      \"group_label\": \"Recommendations\"\n    },\n    {\n      \"key\": \"recommendations_heading\",\n      \"type\": \"text\",\n      \"label\": \"Heading\",\n      \"default\": \"You may also like\",\n      \"visible_if\": \"{% unless section.settings.show_recommendations == false %}true{% endunless %}\",\n      \"group\": \"recommendations\",\n      \"group_label\": \"Recommendations\"\n    },\n    {\n      \"key\": \"collection\",\n      \"type\": \"collection\",\n      \"label\": \"Products from\",\n      \"info\": \"Leave empty to show the newest products. Products already in the cart are skipped.\",\n      \"visible_if\": \"{% unless section.settings.show_recommendations == false %}true{% endunless %}\",\n      \"group\": \"recommendations\",\n      \"group_label\": \"Recommendations\"\n    },\n    {\n      \"key\": \"limit\",\n      \"type\": \"range\",\n      \"label\": \"Number of products\",\n      \"min\": 2,\n      \"max\": 8,\n      \"step\": 1,\n      \"default\": 4,\n      \"visible_if\": \"{% unless section.settings.show_recommendations == false %}true{% endunless %}\",\n      \"group\": \"recommendations\",\n      \"group_label\": \"Recommendations\"\n    },\n    {\n      \"key\": \"columns_desktop\",\n      \"type\": \"range\",\n      \"label\": \"Columns on desktop\",\n      \"min\": 2,\n      \"max\": 5,\n      \"step\": 1,\n      \"default\": 4,\n      \"visible_if\": \"{% unless section.settings.show_recommendations == false %}true{% endunless %}\",\n      \"group\": \"recommendations\",\n      \"group_label\": \"Recommendations\"\n    },\n    {\n      \"key\": \"show_vendor\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show vendor on cards\",\n      \"default\": false,\n      \"visible_if\": \"{% unless section.settings.show_recommendations == false %}true{% endunless %}\",\n      \"group\": \"recommendations\",\n      \"group_label\": \"Recommendations\"\n    },\n    {\n      \"key\": \"show_quick_add\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show quick add on cards\",\n      \"default\": true,\n      \"visible_if\": \"{% unless section.settings.show_recommendations == false %}true{% endunless %}\",\n      \"group\": \"recommendations\",\n      \"group_label\": \"Recommendations\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"default\": \"scheme-1\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"padding_top\",\n      \"type\": \"range\",\n      \"label\": \"Top spacing\",\n      \"min\": 0,\n      \"max\": 120,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 32,\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"padding_bottom\",\n      \"type\": \"range\",\n      \"label\": \"Bottom spacing\",\n      \"min\": 0,\n      \"max\": 120,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 64,\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    }\n  ]\n}\n{% endschema %}\n","sections/main-collection.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Collection page (and /products, the \"all products\" collection): banner, filters from the platform's facets,\n  sorting, product grid and pagination or \"Load more\". Behaviour: assets/corner-product.js ([data-cn-collection]).\n{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign scheme = s.color_scheme | default: 'scheme-1' -%}\n{%- assign col_title = collection.name | default: collection.title -%}\n{%- if col_title == blank -%}{%- assign col_title = 'onboarding.collection' | t -%}{%- endif -%}\n{%- assign total = paginate.total | default: collection.products.size | default: 0 -%}\n{%- assign filters_on = false -%}{%- if s.enable_filters != false and facets -%}{%- assign filters_on = true -%}{%- endif -%}\n{%- assign filter_layout = s.filter_layout | default: 'sidebar' -%}\n{%- assign pagination_type = s.pagination_type | default: 'pages' -%}\n\n{%- comment -%} The query every pagination link keeps (filters + sort). {%- endcomment -%}\n{%- assign active_count = 0 -%}\n{%- capture base_query -%}\n  {%- if page_query.sort -%}sort={{ page_query.sort | url_encode }}&{%- endif -%}\n  {%- if page_query.in_stock -%}in_stock=1&{%- endif -%}\n  {%- if page_query.price_min -%}price_min={{ page_query.price_min | url_encode }}&{%- endif -%}\n  {%- if page_query.price_max -%}price_max={{ page_query.price_max | url_encode }}&{%- endif -%}\n  {%- if page_query.vendor -%}vendor={{ page_query.vendor | url_encode }}&{%- endif -%}\n  {%- if page_query.per_page -%}per_page={{ page_query.per_page | url_encode }}&{%- endif -%}\n  {%- for ofacet in facets.options -%}\n    {%- assign qkey = 'opt[' | append: ofacet.name | append: ']' -%}\n    {%- if page_query[qkey] -%}{{ qkey | url_encode }}={{ page_query[qkey] | url_encode }}&{%- endif -%}\n  {%- endfor -%}\n{%- endcapture -%}\n\n{%- comment -%} Active filter chips. {%- endcomment -%}\n{%- capture chips -%}\n  {%- if page_query.in_stock -%}\n    {%- assign active_count = active_count | plus: 1 -%}\n    <button type=\"button\" class=\"cn-chip\" data-cn-filter-remove=\"in_stock\">{{ 'collections.filter_in_stock' | t }}{% render 'cn-tpl-icon', name: 'close', size: 14 %}<span class=\"cn-visually-hidden\">{{ 'collections.remove_filter' | t }}</span></button>\n  {%- endif -%}\n  {%- if page_query.price_min or page_query.price_max -%}\n    {%- assign active_count = active_count | plus: 1 -%}\n    <button type=\"button\" class=\"cn-chip\" data-cn-filter-remove=\"price\" data-min=\"{{ page_query.price_min | escape }}\" data-max=\"{{ page_query.price_max | escape }}\">\n      {%- if page_query.price_min -%}{{ page_query.price_min | money }}{%- else -%}{{ 0 | money }}{%- endif -%}\n      –\n      {%- if page_query.price_max -%}{{ page_query.price_max | money }}{%- else -%}{{ facets.price.max | money }}{%- endif -%}\n      {% render 'cn-tpl-icon', name: 'close', size: 14 %}<span class=\"cn-visually-hidden\">{{ 'collections.remove_filter' | t }}</span>\n    </button>\n  {%- endif -%}\n  {%- if page_query.vendor -%}\n    {%- assign vendor_list = page_query.vendor | split: ',' -%}\n    {%- for v in vendor_list -%}\n      {%- assign active_count = active_count | plus: 1 -%}\n      <button type=\"button\" class=\"cn-chip\" data-cn-filter-remove=\"vendor\" data-value=\"{{ v | escape }}\">{{ v }}{% render 'cn-tpl-icon', name: 'close', size: 14 %}<span class=\"cn-visually-hidden\">{{ 'collections.remove_filter' | t }}</span></button>\n    {%- endfor -%}\n  {%- endif -%}\n  {%- for ofacet in facets.options -%}\n    {%- assign qkey = 'opt[' | append: ofacet.name | append: ']' -%}\n    {%- if page_query[qkey] -%}\n      {%- assign vals = page_query[qkey] | split: ',' -%}\n      {%- for v in vals -%}\n        {%- assign active_count = active_count | plus: 1 -%}\n        <button type=\"button\" class=\"cn-chip\" data-cn-filter-remove=\"{{ qkey | escape }}\" data-value=\"{{ v | escape }}\">{{ ofacet.name }}: {{ v }}{% render 'cn-tpl-icon', name: 'close', size: 14 %}<span class=\"cn-visually-hidden\">{{ 'collections.remove_filter' | t }}</span></button>\n      {%- endfor -%}\n    {%- endif -%}\n  {%- endfor -%}\n{%- endcapture -%}\n\n{%- capture sort_select -%}\n  {%- if s.enable_sorting != false -%}\n    {%- assign current_sort = page_query.sort | default: '' -%}\n    {%- if collection.slug == blank and current_sort == '' -%}{%- assign current_sort = 'newest' -%}{%- endif -%}\n    <div class=\"cn-select cn-select--sm\">\n      <select data-cn-sort-by aria-label=\"{{ 'collections.sort_label' | t | escape }}\">\n        {%- if collection.slug != blank -%}\n          <option value=\"featured\"{% if current_sort == '' or current_sort == 'featured' %} selected{% endif %}>{{ 'collections.sort_featured' | t }}</option>\n        {%- endif -%}\n        <option value=\"best_selling\"{% if current_sort == 'best_selling' %} selected{% endif %}>{{ 'collections.sort_best_selling' | t }}</option>\n        <option value=\"newest\"{% if current_sort == 'newest' %} selected{% endif %}>{{ 'collections.sort_newest' | t }}</option>\n        <option value=\"price_asc\"{% if current_sort == 'price_asc' %} selected{% endif %}>{{ 'collections.sort_price_asc' | t }}</option>\n        <option value=\"price_desc\"{% if current_sort == 'price_desc' %} selected{% endif %}>{{ 'collections.sort_price_desc' | t }}</option>\n        <option value=\"name_asc\"{% if current_sort == 'name_asc' or current_sort == 'name' %} selected{% endif %}>{{ 'collections.sort_name' | t }}</option>\n        <option value=\"name_desc\"{% if current_sort == 'name_desc' %} selected{% endif %}>{{ 'collections.sort_name_desc' | t }}</option>\n      </select>\n      {% render 'cn-tpl-icon', name: 'chevron-down', size: 16, class: 'cn-select__chevron' %}\n    </div>\n  {%- endif -%}\n{%- endcapture -%}\n\n<section class=\"cn-collection {{ scheme }}\" data-cn-collection{% if page_query.per_page %} data-per-page=\"{{ page_query.per_page | escape }}\"{% endif %}\n  style=\"--cn-pt: {{ s.padding_top | default: 32 }}px; --cn-pb: {{ s.padding_bottom | default: 64 }}px;\">\n  {%- if s.show_banner != false -%}\n    {%- assign banner_image = '' -%}\n    {%- if s.show_image != false and collection.image -%}{%- assign banner_image = collection.image -%}{%- endif -%}\n    {%- assign banner_style = s.banner_style | default: 'split' -%}\n    {%- if banner_image == '' -%}{%- assign banner_style = 'simple' -%}{%- endif -%}\n    {%- if banner_style == 'simple' -%}{%- assign banner_image = '' -%}{%- endif -%}\n    <div class=\"cn-wrap\">\n      <header class=\"cn-colbanner cn-colbanner--{{ banner_style }} cn-colbanner--{{ s.banner_height | default: 'medium' }} cn-colbanner--align-{{ s.banner_alignment | default: 'start' }}\"\n        {% if banner_style == 'overlay' %}style=\"--cn-overlay: {{ s.overlay_opacity | default: 35 | divided_by: 100.0 }}\"{% endif %}>\n        {%- if banner_image != '' -%}\n          <div class=\"cn-colbanner__media\">\n            <img src=\"{{ banner_image }}\" alt=\"\" loading=\"eager\" fetchpriority=\"high\">\n          </div>\n        {%- endif -%}\n        <div class=\"cn-colbanner__text\">\n          {%- if s.show_title != false -%}<h1 class=\"cn-colbanner__title\">{{ col_title }}</h1>{%- else -%}<h1 class=\"cn-visually-hidden\">{{ col_title }}</h1>{%- endif -%}\n          {%- if s.show_description != false and collection.description != blank -%}\n            <div class=\"cn-colbanner__desc cn-rte\">{{ collection.description }}</div>\n          {%- endif -%}\n          {%- if s.show_count -%}<p class=\"cn-colbanner__count\">{{ 'collections.products_count' | t | replace: '{count}', total }}</p>{%- endif -%}\n        </div>\n      </header>\n    </div>\n  {%- else -%}\n    <h1 class=\"cn-visually-hidden\">{{ col_title }}</h1>\n  {%- endif -%}\n\n  <div class=\"cn-wrap\">\n    <div class=\"cn-collection__toolbar\">\n      <div class=\"cn-collection__toolbar-start\">\n        {%- if filters_on -%}\n          <button type=\"button\" class=\"cn-btn cn-btn--secondary cn-btn--sm cn-collection__filter-btn{% if filter_layout == 'sidebar' %} cn-collection__filter-btn--drawer-only{% endif %}\" data-cn-facets-open aria-controls=\"cn-facets-{{ section.id }}\" aria-expanded=\"false\">\n            {% render 'cn-tpl-icon', name: 'filter', size: 16 %}<span>{{ 'collections.filter_and_sort' | t }}</span>{%- if active_count > 0 -%}<span class=\"cn-collection__filter-count\">{{ active_count }}</span>{%- endif -%}\n          </button>\n        {%- endif -%}\n        <p class=\"cn-collection__count\" data-cn-collection-count>{{ 'collections.products_count' | t | replace: '{count}', total }}</p>\n      </div>\n      {%- if sort_select != blank -%}\n        <label class=\"cn-collection__sort\">\n          <span class=\"cn-collection__sort-label\">{{ 'collections.sort_label' | t }}</span>\n          {{ sort_select }}\n        </label>\n      {%- endif -%}\n    </div>\n\n    {%- if chips != blank -%}\n      <div class=\"cn-collection__chips\">\n        {{ chips }}\n        <button type=\"button\" class=\"cn-collection__clear\" data-cn-filters-clear>{{ 'collections.clear_all' | t }}</button>\n      </div>\n    {%- endif -%}\n\n    <div class=\"cn-collection__layout{% if filters_on and filter_layout == 'sidebar' %} cn-collection__layout--sidebar{% endif %}\">\n      {%- if filters_on -%}\n        {% render 'cn-facets', facets: facets, query: page_query, s: s, collection: collection, section_id: section.id, total: total %}\n      {%- endif -%}\n      <div class=\"cn-collection__results\">\n        {%- if collection.products.size > 0 -%}\n          <div class=\"cn-tgrid\" data-cn-collection-grid\n            style=\"--cn-cols-d: {{ s.columns_desktop | default: 4 }}; --cn-cols-t: {{ s.columns_tablet | default: 3 }}; --cn-cols-m: {{ s.columns_mobile | default: 2 }};\">\n            {%- for item in collection.products -%}\n              {%- assign card_eager = false -%}{%- if forloop.index0 < 4 -%}{%- assign card_eager = true -%}{%- endif -%}\n              <div class=\"cn-tgrid__item\">{% render 'product-card', product: item, card: s, index: forloop.index0, eager: card_eager %}</div>\n            {%- endfor -%}\n          </div>\n          {%- if paginate and paginate.last_page > 1 -%}\n            {%- if pagination_type == 'load_more' -%}\n              {%- assign shown_to = paginate.to | default: collection.products.size -%}\n              <div class=\"cn-loadmore\" data-cn-loadmore\n                data-next=\"{% if paginate.current_page < paginate.last_page %}?{{ base_query }}page={{ paginate.current_page | plus: 1 }}{% endif %}\"\n                data-label-error=\"{{ 'collections.load_error' | t | escape }}\">\n                <p class=\"cn-loadmore__count\" data-cn-loadmore-count data-template=\"{{ 'collections.showing' | t | escape }}\" data-total=\"{{ total }}\">{{ 'collections.showing' | t | replace: '{shown}', shown_to | replace: '{total}', total }}</p>\n                <div class=\"cn-loadmore__bar\" aria-hidden=\"true\"><span data-cn-loadmore-bar style=\"width: {{ shown_to | times: 100 | divided_by: total }}%\"></span></div>\n                {%- if paginate.current_page < paginate.last_page -%}\n                  <button type=\"button\" class=\"cn-btn cn-btn--secondary\" data-cn-loadmore-btn>{{ 'collections.load_more' | t }}</button>\n                {%- endif -%}\n              </div>\n            {%- else -%}\n              {% render 'pagination', paginate: paginate, base_query: base_query %}\n            {%- endif -%}\n          {%- endif -%}\n        {%- else -%}\n          <div class=\"cn-empty-state\">\n            {%- if active_count > 0 -%}\n              <p class=\"cn-empty-state__title\">{{ 'collections.no_matches' | t }}</p>\n              <button type=\"button\" class=\"cn-btn cn-btn--secondary\" data-cn-filters-clear>{{ 'collections.clear_all' | t }}</button>\n            {%- else -%}\n              <p class=\"cn-empty-state__title\">{{ 'collections.empty' | t }}</p>\n              <a class=\"cn-btn cn-btn--secondary\" href=\"/products\">{{ 'collections.all_products' | t }}</a>\n            {%- endif -%}\n          </div>\n        {%- endif -%}\n      </div>\n    </div>\n  </div>\n</section>\n\n{% schema %}\n{\n  \"name\": \"Collection page\",\n  \"icon\": \"lucide:layout-list\",\n  \"settings\": [\n    {\n      \"key\": \"show_banner\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show collection banner\",\n      \"default\": true\n    },\n    {\n      \"key\": \"show_title\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show title\",\n      \"default\": true,\n      \"visible_if\": \"{% unless section.settings.show_banner == false %}true{% endunless %}\"\n    },\n    {\n      \"key\": \"show_description\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show description\",\n      \"default\": true,\n      \"visible_if\": \"{% unless section.settings.show_banner == false %}true{% endunless %}\"\n    },\n    {\n      \"key\": \"show_image\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show collection image\",\n      \"default\": true,\n      \"visible_if\": \"{% unless section.settings.show_banner == false %}true{% endunless %}\"\n    },\n    {\n      \"key\": \"show_count\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show product count in the banner\",\n      \"default\": false,\n      \"visible_if\": \"{% unless section.settings.show_banner == false %}true{% endunless %}\"\n    },\n    {\n      \"key\": \"banner_style\",\n      \"type\": \"select\",\n      \"label\": \"Banner style\",\n      \"default\": \"split\",\n      \"info\": \"Used when the collection has an image.\",\n      \"options\": [\n        {\n          \"value\": \"simple\",\n          \"label\": \"Text only\"\n        },\n        {\n          \"value\": \"split\",\n          \"label\": \"Text beside the image\"\n        },\n        {\n          \"value\": \"overlay\",\n          \"label\": \"Text over the image\"\n        }\n      ],\n      \"visible_if\": \"{% unless section.settings.show_banner == false or section.settings.show_image == false %}true{% endunless %}\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"banner_height\",\n      \"type\": \"select\",\n      \"label\": \"Banner image height\",\n      \"default\": \"medium\",\n      \"options\": [\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"medium\",\n          \"label\": \"Medium\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"visible_if\": \"{% unless section.settings.show_banner == false or section.settings.show_image == false or section.settings.banner_style == 'simple' %}true{% endunless %}\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"banner_alignment\",\n      \"type\": \"select\",\n      \"label\": \"Banner text alignment\",\n      \"default\": \"start\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Start\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        }\n      ],\n      \"visible_if\": \"{% unless section.settings.show_banner == false %}true{% endunless %}\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"overlay_opacity\",\n      \"type\": \"range\",\n      \"label\": \"Image overlay\",\n      \"min\": 0,\n      \"max\": 80,\n      \"step\": 5,\n      \"unit\": \"%\",\n      \"default\": 35,\n      \"visible_if\": \"{% if section.settings.banner_style == 'overlay' %}true{% endif %}\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"columns_desktop\",\n      \"type\": \"range\",\n      \"label\": \"Columns on desktop\",\n      \"min\": 2,\n      \"max\": 6,\n      \"step\": 1,\n      \"default\": 4,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"columns_tablet\",\n      \"type\": \"range\",\n      \"label\": \"Columns on tablet\",\n      \"min\": 2,\n      \"max\": 4,\n      \"step\": 1,\n      \"default\": 3,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"pagination_type\",\n      \"type\": \"select\",\n      \"label\": \"More products\",\n      \"default\": \"pages\",\n      \"options\": [\n        {\n          \"value\": \"pages\",\n          \"label\": \"Page numbers\"\n        },\n        {\n          \"value\": \"load_more\",\n          \"label\": \"“Load more” button\"\n        }\n      ],\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"image_ratio\",\n      \"type\": \"select\",\n      \"label\": \"Image shape\",\n      \"default\": \"theme\",\n      \"options\": [\n        {\n          \"value\": \"theme\",\n          \"label\": \"Theme default\"\n        },\n        {\n          \"value\": \"portrait\",\n          \"label\": \"Portrait (4:5)\"\n        },\n        {\n          \"value\": \"square\",\n          \"label\": \"Square\"\n        },\n        {\n          \"value\": \"landscape\",\n          \"label\": \"Landscape (4:3)\"\n        },\n        {\n          \"value\": \"natural\",\n          \"label\": \"Original\"\n        }\n      ],\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"image_fit\",\n      \"type\": \"select\",\n      \"label\": \"Image fit\",\n      \"default\": \"cover\",\n      \"options\": [\n        {\n          \"value\": \"cover\",\n          \"label\": \"Fill the frame\"\n        },\n        {\n          \"value\": \"contain\",\n          \"label\": \"Show the whole image\"\n        }\n      ],\n      \"visible_if\": \"{% unless section.settings.image_ratio == 'natural' %}true{% endunless %}\",\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"second_image\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show second image on hover\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_vendor\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show vendor\",\n      \"default\": false,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_price\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show price\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_compare\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show compare-at price\",\n      \"default\": true,\n      \"visible_if\": \"{% unless section.settings.show_price == false %}true{% endunless %}\",\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_sale_badge\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show sale badge\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_badges\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show “New” and “Sold out” badges\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_rating\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show rating\",\n      \"info\": \"Only for products with review data.\",\n      \"default\": false,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_swatches\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show color swatches\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_quick_add\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show quick add\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"text_alignment\",\n      \"type\": \"select\",\n      \"label\": \"Text alignment\",\n      \"default\": \"start\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Start\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        }\n      ],\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"enable_filters\",\n      \"type\": \"checkbox\",\n      \"label\": \"Enable filters\",\n      \"default\": true,\n      \"group\": \"filters\",\n      \"group_label\": \"Filters and sorting\"\n    },\n    {\n      \"key\": \"filter_layout\",\n      \"type\": \"select\",\n      \"label\": \"Filters on desktop\",\n      \"default\": \"sidebar\",\n      \"info\": \"Phones and tablets always open filters in a drawer.\",\n      \"options\": [\n        {\n          \"value\": \"sidebar\",\n          \"label\": \"Sidebar\"\n        },\n        {\n          \"value\": \"drawer\",\n          \"label\": \"Drawer\"\n        }\n      ],\n      \"visible_if\": \"{% unless section.settings.enable_filters == false %}true{% endunless %}\",\n      \"group\": \"filters\",\n      \"group_label\": \"Filters and sorting\"\n    },\n    {\n      \"key\": \"show_availability_filter\",\n      \"type\": \"checkbox\",\n      \"label\": \"Availability filter\",\n      \"default\": true,\n      \"visible_if\": \"{% unless section.settings.enable_filters == false %}true{% endunless %}\",\n      \"group\": \"filters\",\n      \"group_label\": \"Filters and sorting\"\n    },\n    {\n      \"key\": \"show_price_filter\",\n      \"type\": \"checkbox\",\n      \"label\": \"Price filter\",\n      \"default\": true,\n      \"visible_if\": \"{% unless section.settings.enable_filters == false %}true{% endunless %}\",\n      \"group\": \"filters\",\n      \"group_label\": \"Filters and sorting\"\n    },\n    {\n      \"key\": \"show_vendor_filter\",\n      \"type\": \"checkbox\",\n      \"label\": \"Vendor filter\",\n      \"default\": true,\n      \"visible_if\": \"{% unless section.settings.enable_filters == false %}true{% endunless %}\",\n      \"group\": \"filters\",\n      \"group_label\": \"Filters and sorting\"\n    },\n    {\n      \"key\": \"show_option_filters\",\n      \"type\": \"checkbox\",\n      \"label\": \"Option filters (color, material, finish)\",\n      \"default\": true,\n      \"visible_if\": \"{% unless section.settings.enable_filters == false %}true{% endunless %}\",\n      \"group\": \"filters\",\n      \"group_label\": \"Filters and sorting\"\n    },\n    {\n      \"key\": \"show_collection_links\",\n      \"type\": \"checkbox\",\n      \"label\": \"List the store's collections\",\n      \"default\": false,\n      \"visible_if\": \"{% unless section.settings.enable_filters == false %}true{% endunless %}\",\n      \"group\": \"filters\",\n      \"group_label\": \"Filters and sorting\"\n    },\n    {\n      \"key\": \"enable_sorting\",\n      \"type\": \"checkbox\",\n      \"label\": \"Enable sorting\",\n      \"default\": true,\n      \"group\": \"filters\",\n      \"group_label\": \"Filters and sorting\"\n    },\n    {\n      \"key\": \"columns_mobile\",\n      \"type\": \"range\",\n      \"label\": \"Columns on phones\",\n      \"min\": 1,\n      \"max\": 2,\n      \"step\": 1,\n      \"default\": 2,\n      \"group\": \"mobile\",\n      \"group_label\": \"Mobile\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"default\": \"scheme-1\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"padding_top\",\n      \"type\": \"range\",\n      \"label\": \"Top spacing\",\n      \"min\": 0,\n      \"max\": 120,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 32,\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"padding_bottom\",\n      \"type\": \"range\",\n      \"label\": \"Bottom spacing\",\n      \"min\": 0,\n      \"max\": 120,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 64,\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    }\n  ]\n}\n{% endschema %}\n","sections/main-login.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Sign in / create account (the store's /account/login page). Contract with assets/corner-core.js: [data-cn-auth] with\n  tabs [data-cn-auth-tab=login|register] and forms [data-cn-auth-form=login|register] (fields email, password,\n  first_name, last_name, password_confirmation) posting to the storefront account API, errors in\n  [data-cn-form-note]. After signing in the customer lands in the platform's account area.\n{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign scheme = s.color_scheme | default: 'scheme-1' -%}\n{%- assign allow_register = true -%}{%- if s.show_register == false -%}{%- assign allow_register = false -%}{%- endif -%}\n<section class=\"cn-login {{ scheme }}\" style=\"--cn-pt: {{ s.padding_top | default: 48 }}px; --cn-pb: {{ s.padding_bottom | default: 80 }}px;\">\n  <div class=\"cn-wrap\">\n    <div class=\"cn-login__card{% if s.card_style == 'plain' %} cn-login__card--plain{% endif %}\" data-cn-auth>\n      <h1 class=\"cn-login__title\">{{ s.heading | default: 'account.sign_in' | t }}</h1>\n      {%- if s.text != blank -%}<p class=\"cn-login__text\">{{ s.text }}</p>{%- endif -%}\n      {%- if allow_register -%}\n        <div class=\"cn-login__tabs\" role=\"tablist\">\n          <button type=\"button\" class=\"cn-login__tab is-active\" data-cn-auth-tab=\"login\" role=\"tab\" aria-selected=\"true\" id=\"cn-tab-login-{{ section.id }}\" aria-controls=\"cn-form-login-{{ section.id }}\">{{ 'account.sign_in' | t }}</button>\n          <button type=\"button\" class=\"cn-login__tab\" data-cn-auth-tab=\"register\" role=\"tab\" aria-selected=\"false\" id=\"cn-tab-register-{{ section.id }}\" aria-controls=\"cn-form-register-{{ section.id }}\">{{ 'account.create_account' | t }}</button>\n        </div>\n      {%- endif -%}\n      <form class=\"cn-login__form\" data-cn-auth-form=\"login\" id=\"cn-form-login-{{ section.id }}\"{% if allow_register %} role=\"tabpanel\" aria-labelledby=\"cn-tab-login-{{ section.id }}\"{% endif %}>\n        <div class=\"cn-field\">\n          <label for=\"cn-li-email-{{ section.id }}\">{{ 'account.email' | t }}</label>\n          <input class=\"cn-input\" id=\"cn-li-email-{{ section.id }}\" name=\"email\" type=\"email\" autocomplete=\"email\" required>\n        </div>\n        <div class=\"cn-field\">\n          <label for=\"cn-li-pass-{{ section.id }}\">{{ 'account.password' | t }}</label>\n          <span class=\"soooks-password\"><input class=\"cn-input\" id=\"cn-li-pass-{{ section.id }}\" name=\"password\" type=\"password\" autocomplete=\"current-password\" required><button type=\"button\" class=\"soooks-password__toggle\" data-password-toggle aria-pressed=\"false\" aria-label=\"{{ 'account.show_password' | t }}\" data-show-label=\"{{ 'account.show_password' | t }}\" data-hide-label=\"{{ 'account.hide_password' | t }}\"></button></span>\n        </div>\n        <a class=\"cn-tlink cn-login__forgot\" href=\"/forgot-password\">{{ 'account.forgot_password' | t }}</a>\n        <div class=\"cn-note\" data-cn-form-note hidden></div>\n        <button class=\"cn-btn cn-btn--wide\" type=\"submit\">{{ 'account.sign_in' | t }}</button>\n      </form>\n      {%- if allow_register -%}\n        <form class=\"cn-login__form\" data-cn-auth-form=\"register\" id=\"cn-form-register-{{ section.id }}\" role=\"tabpanel\" aria-labelledby=\"cn-tab-register-{{ section.id }}\" hidden>\n          <div class=\"cn-login__row\">\n            <div class=\"cn-field\">\n              <label for=\"cn-re-fn-{{ section.id }}\">{{ 'account.first_name' | t }}</label>\n              <input class=\"cn-input\" id=\"cn-re-fn-{{ section.id }}\" name=\"first_name\" autocomplete=\"given-name\" required>\n            </div>\n            <div class=\"cn-field\">\n              <label for=\"cn-re-ln-{{ section.id }}\">{{ 'account.last_name' | t }}</label>\n              <input class=\"cn-input\" id=\"cn-re-ln-{{ section.id }}\" name=\"last_name\" autocomplete=\"family-name\">\n            </div>\n          </div>\n          <div class=\"cn-field\">\n            <label for=\"cn-re-email-{{ section.id }}\">{{ 'account.email' | t }}</label>\n            <input class=\"cn-input\" id=\"cn-re-email-{{ section.id }}\" name=\"email\" type=\"email\" autocomplete=\"email\" required>\n          </div>\n          <div class=\"cn-field\">\n            <label for=\"cn-re-pass-{{ section.id }}\">{{ 'account.password' | t }}</label>\n            <span class=\"soooks-password\"><input class=\"cn-input\" id=\"cn-re-pass-{{ section.id }}\" name=\"password\" type=\"password\" minlength=\"8\" autocomplete=\"new-password\" required><button type=\"button\" class=\"soooks-password__toggle\" data-password-toggle aria-pressed=\"false\" aria-label=\"{{ 'account.show_password' | t }}\" data-show-label=\"{{ 'account.show_password' | t }}\" data-hide-label=\"{{ 'account.hide_password' | t }}\"></button></span>\n          </div>\n          <div class=\"cn-field\">\n            <label for=\"cn-re-pass2-{{ section.id }}\">{{ 'account.password_confirm' | t }}</label>\n            <span class=\"soooks-password\"><input class=\"cn-input\" id=\"cn-re-pass2-{{ section.id }}\" name=\"password_confirmation\" type=\"password\" autocomplete=\"new-password\" required><button type=\"button\" class=\"soooks-password__toggle\" data-password-toggle aria-pressed=\"false\" aria-label=\"{{ 'account.show_password' | t }}\" data-show-label=\"{{ 'account.show_password' | t }}\" data-hide-label=\"{{ 'account.hide_password' | t }}\"></button></span>\n          </div>\n          <div class=\"cn-note\" data-cn-form-note hidden></div>\n          <button class=\"cn-btn cn-btn--wide\" type=\"submit\">{{ 'account.create_account' | t }}</button>\n        </form>\n      {%- endif -%}\n    </div>\n  </div>\n</section>\n\n{% schema %}\n{\n  \"name\": \"Customer login\",\n  \"icon\": \"lucide:user\",\n  \"settings\": [\n    {\n      \"key\": \"heading\",\n      \"type\": \"text\",\n      \"label\": \"Heading\",\n      \"default\": \"Account\"\n    },\n    {\n      \"key\": \"text\",\n      \"type\": \"textarea\",\n      \"label\": \"Text\",\n      \"default\": \"Sign in to see your orders and save your details for next time.\"\n    },\n    {\n      \"key\": \"show_register\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show “Create account”\",\n      \"default\": true\n    },\n    {\n      \"key\": \"card_style\",\n      \"type\": \"select\",\n      \"label\": \"Style\",\n      \"default\": \"card\",\n      \"options\": [\n        {\n          \"value\": \"card\",\n          \"label\": \"Bordered card\"\n        },\n        {\n          \"value\": \"plain\",\n          \"label\": \"Plain\"\n        }\n      ],\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"default\": \"scheme-1\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"padding_top\",\n      \"type\": \"range\",\n      \"label\": \"Top spacing\",\n      \"min\": 0,\n      \"max\": 120,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 48,\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"padding_bottom\",\n      \"type\": \"range\",\n      \"label\": \"Bottom spacing\",\n      \"min\": 0,\n      \"max\": 120,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 80,\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    }\n  ]\n}\n{% endschema %}\n","sections/main-page.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%} A store page (About, Shipping…): title and the page's content. {%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign scheme = s.color_scheme | default: 'scheme-1' -%}\n{%- assign p_title = page.title | default: 'Page title' -%}\n<section class=\"cn-page {{ scheme }}\" style=\"--cn-pt: {{ s.padding_top | default: 40 }}px; --cn-pb: {{ s.padding_bottom | default: 64 }}px;\">\n  <div class=\"cn-wrap\">\n    <div class=\"cn-page__inner cn-page__inner--{{ s.content_width | default: 'medium' }}\">\n      {%- if s.show_title != false -%}\n        <h1 class=\"cn-page__title cn-page__title--{{ s.heading_alignment | default: 'start' }}\">{{ p_title }}</h1>\n      {%- else -%}\n        <h1 class=\"cn-visually-hidden\">{{ p_title }}</h1>\n      {%- endif -%}\n      <div class=\"cn-page__body cn-rte\">\n        {%- if page.body != blank -%}{{ page.body }}{%- elsif request.design_mode -%}<p>Your page's content shows here. Write it in Online Store → Pages.</p>{%- endif -%}\n      </div>\n    </div>\n  </div>\n</section>\n\n{% schema %}\n{\n  \"name\": \"Page content\",\n  \"icon\": \"lucide:file\",\n  \"settings\": [\n    {\n      \"key\": \"show_title\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show title\",\n      \"default\": true\n    },\n    {\n      \"key\": \"heading_alignment\",\n      \"type\": \"select\",\n      \"label\": \"Title alignment\",\n      \"default\": \"start\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Start\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        }\n      ],\n      \"visible_if\": \"{% unless section.settings.show_title == false %}true{% endunless %}\"\n    },\n    {\n      \"key\": \"content_width\",\n      \"type\": \"select\",\n      \"label\": \"Content width\",\n      \"default\": \"medium\",\n      \"options\": [\n        {\n          \"value\": \"narrow\",\n          \"label\": \"Narrow\"\n        },\n        {\n          \"value\": \"medium\",\n          \"label\": \"Medium\"\n        },\n        {\n          \"value\": \"wide\",\n          \"label\": \"Full page width\"\n        }\n      ],\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"default\": \"scheme-1\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"padding_top\",\n      \"type\": \"range\",\n      \"label\": \"Top spacing\",\n      \"min\": 0,\n      \"max\": 120,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 40,\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"padding_bottom\",\n      \"type\": \"range\",\n      \"label\": \"Bottom spacing\",\n      \"min\": 0,\n      \"max\": 120,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 64,\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    }\n  ]\n}\n{% endschema %}\n","sections/main-product.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Product page. Gallery (section settings) + a details column built from blocks the merchant reorders.\n  Add-to-cart contract (assets/corner-core.js): form[data-cn-atc][data-product-id] with input[name=variant_id],\n  [data-cn-qty-input], [data-cn-atc-btn] (+ data-label-*), [data-cn-buynow] and [data-cn-atc-note].\n  Gallery, variants, sticky bar and zoom: assets/corner-product.js ([data-cn-pdp] hooks).\n{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign scheme = s.color_scheme | default: 'scheme-1' -%}\n{%- assign layout = s.gallery_layout | default: 'thumbs_below' -%}\n{%- assign ratio = s.media_ratio | default: 'natural' -%}\n{%- assign fit = s.media_fit | default: 'contain' -%}\n{%- if ratio == 'natural' -%}{%- assign fit = 'contain' -%}{%- endif -%}\n{%- assign zoom = s.image_zoom | default: 'lightbox' -%}\n{%- assign mobile_gallery = s.mobile_gallery | default: 'dots' -%}\n{%- assign show_arrows = true -%}{%- if s.show_arrows == false -%}{%- assign show_arrows = false -%}{%- endif -%}\n{%- assign media_width = s.media_width | default: 'medium' -%}\n{%- assign pt = s.padding_top | default: 32 -%}\n{%- assign pb = s.padding_bottom | default: 64 -%}\n\n{%- assign p_title = product.name | default: product.title -%}\n{%- if p_title == blank -%}{%- assign p_title = 'onboarding.product' | t -%}{%- endif -%}\n{%- assign current = product.selected_or_first_available_variant -%}\n{%- assign cur_price = current.price | default: product.price | default: 0 -%}\n{%- assign cur_compare = current.compare_at_price | default: 0 -%}\n{%- assign on_sale = false -%}{%- if cur_compare > cur_price -%}{%- assign on_sale = true -%}{%- endif -%}\n{%- assign cur_in_stock = true -%}\n{%- if product -%}\n  {%- if current.in_stock == false or current.available == false or product.in_stock == false and product.has_only_default_variant -%}{%- assign cur_in_stock = false -%}{%- endif -%}\n{%- endif -%}\n{%- assign image_count = product.images.size | default: 0 -%}\n\n<section class=\"cn-product {{ scheme }}\" data-cn-pdp data-cn-section=\"{{ section.id }}\"\n  data-money-sample=\"{{ 123456 | money | escape }}\"\n  data-label-soldout=\"{{ 'products.sold_out' | t | escape }}\"\n  data-label-unavailable=\"{{ 'products.unavailable' | t | escape }}\"\n  style=\"--cn-pt: {{ pt }}px; --cn-pb: {{ pb }}px;\">\n  <div class=\"cn-wrap\">\n    <div class=\"cn-product__grid cn-product__grid--{{ media_width }}{% if s.media_position == 'end' %} cn-product__grid--media-end{% endif %}\">\n\n      {%- comment -%} ---------- gallery ---------- {%- endcomment -%}\n      <div class=\"cn-product__media\">\n        <div class=\"cn-gallery cn-gallery--{{ layout }} cn-gallery--ratio-{{ ratio }} cn-gallery--fit-{{ fit }} cn-gallery--m-{{ mobile_gallery }}{% if zoom == 'lightbox' and image_count > 0 %} cn-gallery--zoom{% endif %}\"\n          data-cn-gallery data-layout=\"{{ layout }}\" data-zoom=\"{{ zoom }}\">\n          {%- if layout == 'thumbs_beside' and image_count > 1 -%}\n            <div class=\"cn-gallery__thumbs cn-gallery__thumbs--beside\" data-cn-gallery-thumbs role=\"list\">\n              {%- for img in product.images -%}\n                <button type=\"button\" class=\"cn-gallery__thumb{% if forloop.first %} is-active{% endif %}\" data-cn-gallery-thumb=\"{{ forloop.index0 }}\" role=\"listitem\"\n                  aria-label=\"{{ 'products.show_image' | t | replace: '{index}', forloop.index | escape }}\"{% if forloop.first %} aria-current=\"true\"{% endif %}>\n                  <img src=\"{{ img.url }}\" alt=\"\" loading=\"lazy\" width=\"80\" height=\"80\">\n                </button>\n              {%- endfor -%}\n            </div>\n          {%- endif -%}\n          <div class=\"cn-gallery__main\">\n            <div class=\"cn-gallery__track\" data-cn-gallery-track tabindex=\"0\" role=\"region\" aria-roledescription=\"carousel\" aria-label=\"{{ 'products.gallery_label' | t | escape }}\">\n              {%- if image_count > 0 -%}\n                {%- for img in product.images -%}\n                  {%- assign img_alt = img.alt | default: p_title -%}\n                  <div class=\"cn-gallery__slide{% if forloop.first %} is-active{% endif %}\" data-cn-slide=\"{{ forloop.index0 }}\" data-src=\"{{ img.url }}\" role=\"group\" aria-roledescription=\"slide\"\n                    aria-label=\"{{ forloop.index }} / {{ image_count }}\">\n                    {%- if zoom == 'lightbox' -%}\n                      <button type=\"button\" class=\"cn-gallery__open\" data-cn-zoom-open=\"{{ forloop.index0 }}\" aria-label=\"{{ 'products.zoom_image' | t | replace: '{index}', forloop.index | escape }}\">\n                        <img src=\"{{ img.url }}\" alt=\"{{ img_alt | escape }}\" loading=\"{% if forloop.first %}eager{% else %}lazy{% endif %}\"{% if forloop.first %} fetchpriority=\"high\"{% endif %} draggable=\"false\">\n                        <span class=\"cn-gallery__zoom-hint\" aria-hidden=\"true\">{% render 'cn-tpl-icon', name: 'zoom', size: 18 %}</span>\n                      </button>\n                    {%- else -%}\n                      <img src=\"{{ img.url }}\" alt=\"{{ img_alt | escape }}\" loading=\"{% if forloop.first %}eager{% else %}lazy{% endif %}\"{% if forloop.first %} fetchpriority=\"high\"{% endif %} draggable=\"false\">\n                    {%- endif -%}\n                  </div>\n                {%- endfor -%}\n              {%- else -%}\n                <div class=\"cn-gallery__slide is-active cn-gallery__slide--placeholder\" data-cn-slide=\"0\">\n                  <img src=\"{{ 'ph-product-1.svg' | asset_url }}\" alt=\"\" loading=\"eager\">\n                </div>\n              {%- endif -%}\n            </div>\n            {%- if image_count > 1 -%}\n              {%- if show_arrows -%}\n                <button type=\"button\" class=\"cn-gallery__arrow cn-gallery__arrow--prev\" data-cn-gallery-prev aria-label=\"{{ 'products.previous_image' | t | escape }}\">{% render 'cn-tpl-icon', name: 'chevron-left', size: 18 %}</button>\n                <button type=\"button\" class=\"cn-gallery__arrow cn-gallery__arrow--next\" data-cn-gallery-next aria-label=\"{{ 'products.next_image' | t | escape }}\">{% render 'cn-tpl-icon', name: 'chevron-right', size: 18 %}</button>\n              {%- endif -%}\n              <div class=\"cn-gallery__dots\" data-cn-gallery-dots>\n                {%- for img in product.images -%}\n                  <button type=\"button\" class=\"cn-gallery__dot{% if forloop.first %} is-active{% endif %}\" data-cn-gallery-dot=\"{{ forloop.index0 }}\"\n                    aria-label=\"{{ 'products.show_image' | t | replace: '{index}', forloop.index | escape }}\"{% if forloop.first %} aria-current=\"true\"{% endif %}></button>\n                {%- endfor -%}\n              </div>\n            {%- endif -%}\n          </div>\n          {%- if layout != 'thumbs_beside' and image_count > 1 -%}\n            <div class=\"cn-gallery__thumbs\" data-cn-gallery-thumbs role=\"list\">\n              {%- for img in product.images -%}\n                <button type=\"button\" class=\"cn-gallery__thumb{% if forloop.first %} is-active{% endif %}\" data-cn-gallery-thumb=\"{{ forloop.index0 }}\" role=\"listitem\"\n                  aria-label=\"{{ 'products.show_image' | t | replace: '{index}', forloop.index | escape }}\"{% if forloop.first %} aria-current=\"true\"{% endif %}>\n                  <img src=\"{{ img.url }}\" alt=\"\" loading=\"lazy\" width=\"80\" height=\"80\">\n                </button>\n              {%- endfor -%}\n            </div>\n          {%- endif -%}\n        </div>\n      </div>\n\n      {%- comment -%} ---------- details (blocks) ---------- {%- endcomment -%}\n      <div class=\"cn-product__info{% if s.sticky_info != false %} cn-product__info--sticky{% endif %}\">\n        <form class=\"cn-product__form\" data-cn-atc data-product-id=\"{{ product.id }}\" novalidate>\n          <input type=\"hidden\" name=\"variant_id\" value=\"{{ current.id }}\">\n          {%- for block in section.blocks -%}\n            {%- assign b = block.settings -%}\n            {%- case block.type -%}\n\n              {%- when 'vendor' -%}\n                {%- if product.vendor != blank -%}\n                  <div class=\"cn-product__block cn-product__vendor\" {{ block.soooks_attributes }}>\n                    {%- if b.link != false -%}\n                      <a href=\"/products?vendor={{ product.vendor | url_encode }}\">{{ product.vendor }}</a>\n                    {%- else -%}\n                      <span>{{ product.vendor }}</span>\n                    {%- endif -%}\n                  </div>\n                {%- elsif request.design_mode -%}\n                  <div class=\"cn-product__block cn-product__vendor cn-product__vendor--empty\" {{ block.soooks_attributes }}><span>{{ 'products.vendor' | t }}</span></div>\n                {%- endif -%}\n\n              {%- when 'title' -%}\n                <div class=\"cn-product__block\" {{ block.soooks_attributes }}>\n                  <h1 class=\"cn-product__title cn-product__title--{{ b.title_size | default: 'md' }}\">{{ p_title }}</h1>\n                </div>\n\n              {%- when 'rating' -%}\n                {%- assign rating = product.metafields.reviews.rating -%}\n                {%- assign rating_count = product.metafields.reviews.rating_count -%}\n                {%- if rating != blank -%}\n                  {%- assign rating_pct = rating | times: 20 | at_most: 100 -%}\n                  <div class=\"cn-product__block cn-product__rating\" {{ block.soooks_attributes }}>\n                    <span class=\"cn-stars\" style=\"--cn-rating: {{ rating_pct }}%\" role=\"img\" aria-label=\"{{ rating }} / 5\"></span>\n                    <span class=\"cn-product__rating-value\">{{ rating }}</span>\n                    {%- if rating_count -%}<span class=\"cn-product__rating-count\">({{ 'products.reviews_count' | t | replace: '{count}', rating_count }})</span>{%- endif -%}\n                  </div>\n                {%- elsif request.design_mode -%}\n                  <div class=\"cn-product__block cn-product__rating cn-product__rating--empty\" {{ block.soooks_attributes }}>\n                    <span class=\"cn-stars\" style=\"--cn-rating: 0%\" aria-hidden=\"true\"></span>\n                    <span class=\"cn-product__rating-count\">Ratings show here when this product has review data.</span>\n                  </div>\n                {%- endif -%}\n\n              {%- when 'price' -%}\n                <div class=\"cn-product__block cn-product__price\" {{ block.soooks_attributes }}>\n                  <div class=\"cn-product__price-row\">\n                    <span class=\"cn-product__price-amount{% if on_sale %} is-sale{% endif %}\" data-cn-pdp-price>{{ cur_price | money }}</span>\n                    {%- if b.show_compare != false -%}\n                      <s class=\"cn-product__price-compare\" data-cn-pdp-compare{% unless on_sale %} hidden{% endunless %}>{% if on_sale %}{{ cur_compare | money }}{% endif %}</s>\n                    {%- endif -%}\n                    {%- if b.show_sale_badge != false -%}\n                      <span class=\"cn-badge cn-badge--sale\" data-cn-pdp-sale{% unless on_sale %} hidden{% endunless %}>{{ 'products.sale' | t }}</span>\n                    {%- endif -%}\n                  </div>\n                  {%- if b.show_tax_note -%}\n                    <p class=\"cn-product__tax\">{{ 'cart.shipping_note' | t }}</p>\n                  {%- endif -%}\n                </div>\n\n              {%- when 'badges' -%}\n                {%- assign has_badge = false -%}\n                <div class=\"cn-product__block cn-product__badges\" {{ block.soooks_attributes }}>\n                  {%- if b.show_sold_out != false -%}\n                    <span class=\"cn-badge cn-badge--sold\" data-cn-pdp-soldout-badge{% if cur_in_stock %} hidden{% endif %}>{{ 'products.sold_out' | t }}</span>\n                  {%- endif -%}\n                  {%- if b.show_sale != false -%}\n                    <span class=\"cn-badge cn-badge--sale\" data-cn-pdp-sale{% unless on_sale %} hidden{% endunless %}>{{ 'products.sale' | t }}</span>\n                  {%- endif -%}\n                  {%- if b.show_new != false and product.badges contains 'new' -%}\n                    <span class=\"cn-badge cn-badge--new\">{{ 'products.new' | t }}</span>\n                  {%- endif -%}\n                </div>\n\n              {%- when 'variant_picker' -%}\n                {%- unless product.has_only_default_variant or product.options.size == 0 -%}\n                  {%- assign style = b.picker_style | default: 'buttons' -%}\n                  <div class=\"cn-product__block cn-product__variants\" {{ block.soooks_attributes }} data-cn-pdp-picker>\n                    {%- for option in product.options -%}\n                      {%- assign opt_index = forloop.index -%}\n                      {%- assign opt_key = option.name | downcase | strip -%}\n                      {%- assign is_color = false -%}\n                      {%- if b.color_swatches != false -%}\n                        {%- if opt_key == 'color' or opt_key == 'colour' or opt_key == 'shade' -%}{%- assign is_color = true -%}{%- endif -%}\n                      {%- endif -%}\n                      {%- assign selected_value = current.option_values[option.name] | default: option.values.first -%}\n                      {%- if style == 'dropdown' and is_color == false -%}\n                        <div class=\"cn-variant\" data-cn-pdp-option=\"{{ option.name | escape }}\">\n                          <label class=\"cn-variant__label\" for=\"cn-opt-{{ section.id }}-{{ opt_index }}\">{{ option.name }}</label>\n                          <div class=\"cn-select\">\n                            <select id=\"cn-opt-{{ section.id }}-{{ opt_index }}\" data-cn-pdp-select>\n                              {%- for value in option.values -%}\n                                <option value=\"{{ value | escape }}\" data-label=\"{{ value | escape }}\"{% if value == selected_value %} selected{% endif %}>{{ value }}</option>\n                              {%- endfor -%}\n                            </select>\n                            {% render 'cn-tpl-icon', name: 'chevron-down', size: 16, class: 'cn-select__chevron' %}\n                          </div>\n                        </div>\n                      {%- else -%}\n                        <fieldset class=\"cn-variant{% if is_color %} cn-variant--swatches{% endif %}\" data-cn-pdp-option=\"{{ option.name | escape }}\">\n                          <legend class=\"cn-variant__label\">{{ option.name }}<span class=\"cn-variant__current\">: <span data-cn-pdp-current>{{ selected_value }}</span></span></legend>\n                          <div class=\"cn-variant__values\">\n                            {%- for value in option.values -%}\n                              {%- assign sw_bg = '' -%}\n                              {%- if is_color -%}{%- capture sw_bg -%}{% render 'swatch-color', value: value %}{%- endcapture -%}{%- endif -%}\n                              {%- assign input_id = 'cn-opt-' | append: section.id | append: '-' | append: opt_index | append: '-' | append: forloop.index -%}\n                              <input class=\"cn-variant__input\" type=\"radio\" id=\"{{ input_id }}\" name=\"cn-opt-{{ section.id }}-{{ opt_index }}\" value=\"{{ value | escape }}\" data-cn-pdp-radio{% if value == selected_value %} checked{% endif %}>\n                              {%- if sw_bg != '' -%}\n                                <label class=\"cn-variant__swatch\" for=\"{{ input_id }}\" style=\"--cn-swatch: {{ sw_bg }}\" title=\"{{ value | escape }}\"><span class=\"cn-visually-hidden\">{{ value }}</span></label>\n                              {%- else -%}\n                                <label class=\"cn-variant__btn\" for=\"{{ input_id }}\">{{ value }}</label>\n                              {%- endif -%}\n                            {%- endfor -%}\n                          </div>\n                        </fieldset>\n                      {%- endif -%}\n                    {%- endfor -%}\n                  </div>\n                {%- endunless -%}\n\n              {%- when 'quantity' -%}\n                <div class=\"cn-product__block cn-product__qty\" {{ block.soooks_attributes }}>\n                  <label class=\"cn-variant__label\" for=\"cn-qty-{{ section.id }}\">{{ 'products.quantity' | t }}</label>\n                  <div class=\"cn-stepper\" data-cn-stepper>\n                    <button type=\"button\" class=\"cn-stepper__btn\" data-cn-step=\"-1\" aria-label=\"{{ 'products.decrease_quantity' | t | escape }}\">{% render 'cn-tpl-icon', name: 'minus', size: 16 %}</button>\n                    <input class=\"cn-stepper__input\" id=\"cn-qty-{{ section.id }}\" type=\"number\" inputmode=\"numeric\" value=\"1\" min=\"1\" max=\"99\" data-cn-qty-input>\n                    <button type=\"button\" class=\"cn-stepper__btn\" data-cn-step=\"1\" aria-label=\"{{ 'products.increase_quantity' | t | escape }}\">{% render 'cn-tpl-icon', name: 'plus', size: 16 %}</button>\n                  </div>\n                </div>\n\n              {%- when 'buttons' -%}\n                <div class=\"cn-product__block cn-product__buttons\" {{ block.soooks_attributes }}>\n                  <button class=\"cn-btn cn-btn--wide cn-product__atc\" type=\"submit\" data-cn-atc-btn data-cn-pdp-atc\n                    data-label-default=\"{{ 'products.add_to_cart' | t | escape }}\"\n                    data-label-adding=\"{{ 'products.adding' | t | escape }}\"\n                    data-label-added=\"{{ 'products.added' | t | escape }}\"\n                    data-label-soldout=\"{{ 'products.sold_out' | t | escape }}\"\n                    data-label-unavailable=\"{{ 'products.unavailable' | t | escape }}\"\n                    {% unless cur_in_stock %}disabled{% endunless %}>\n                    {%- if cur_in_stock -%}{{ 'products.add_to_cart' | t }}{%- else -%}{{ 'products.sold_out' | t }}{%- endif -%}\n                  </button>\n                  {%- if b.show_buy_now != false -%}\n                    <button type=\"button\" class=\"cn-btn cn-btn--secondary cn-btn--wide cn-product__buynow\" data-cn-buynow data-cn-pdp-buynow{% unless cur_in_stock %} hidden{% endunless %}>{{ 'products.buy_now' | t }}</button>\n                  {%- endif -%}\n                  <div class=\"cn-note\" data-cn-atc-note hidden></div>\n                </div>\n\n              {%- when 'inventory' -%}\n                {%- assign threshold = b.low_stock_threshold | default: 5 -%}\n                {%- assign stock_qty = current.stock_quantity -%}\n                <div class=\"cn-product__block\" {{ block.soooks_attributes }}>\n                  <p class=\"cn-stock\" data-cn-pdp-stock data-threshold=\"{{ threshold }}\" data-show-in-stock=\"{% if b.show_in_stock != false %}true{% else %}false{% endif %}\"\n                    data-label-low=\"{{ 'products.low_stock' | t | escape }}\"\n                    data-label-in=\"{{ 'products.in_stock' | t | escape }}\"\n                    data-label-out=\"{{ 'products.out_of_stock' | t | escape }}\">\n                    {%- if cur_in_stock == false -%}\n                      <span class=\"cn-stock__dot cn-stock__dot--out\"></span><span data-cn-pdp-stock-text>{{ 'products.out_of_stock' | t }}</span>\n                    {%- elsif stock_qty != blank and stock_qty > 0 and stock_qty <= threshold -%}\n                      <span class=\"cn-stock__dot cn-stock__dot--low\"></span><span data-cn-pdp-stock-text>{{ 'products.low_stock' | t | replace: '{count}', stock_qty }}</span>\n                    {%- elsif b.show_in_stock != false -%}\n                      <span class=\"cn-stock__dot\"></span><span data-cn-pdp-stock-text>{{ 'products.in_stock' | t }}</span>\n                    {%- endif -%}\n                  </p>\n                </div>\n\n              {%- when 'description' -%}\n                {%- if product.description != blank -%}\n                  {%- if b.collapsible -%}\n                    <details class=\"cn-product__block cn-disclosure\" {{ block.soooks_attributes }}>\n                      <summary class=\"cn-disclosure__summary\"><span>{{ b.heading | default: 'products.description' | t }}</span>{% render 'cn-tpl-icon', name: 'chevron-down', size: 16, class: 'cn-disclosure__chevron' %}</summary>\n                      <div class=\"cn-disclosure__body cn-rte\">{{ product.description }}</div>\n                    </details>\n                  {%- else -%}\n                    <div class=\"cn-product__block cn-product__description cn-rte\" {{ block.soooks_attributes }}>{{ product.description }}</div>\n                  {%- endif -%}\n                {%- elsif request.design_mode -%}\n                  <div class=\"cn-product__block cn-product__description cn-rte cn-muted-text\" {{ block.soooks_attributes }}><p>{{ 'products.description' | t }}</p></div>\n                {%- endif -%}\n\n              {%- when 'collapsible_tab' -%}\n                <details class=\"cn-product__block cn-disclosure\" {{ block.soooks_attributes }}{% if b.open %} open{% endif %}>\n                  <summary class=\"cn-disclosure__summary\">\n                    <span class=\"cn-disclosure__title\">\n                      {%- if b.icon != blank and b.icon != 'none' -%}{% render 'cn-tpl-icon', name: b.icon, size: 18 %}{%- endif -%}\n                      <span>{{ b.heading }}</span>\n                    </span>\n                    {% render 'cn-tpl-icon', name: 'chevron-down', size: 16, class: 'cn-disclosure__chevron' %}\n                  </summary>\n                  <div class=\"cn-disclosure__body cn-rte\">{{ b.content }}</div>\n                </details>\n\n              {%- when 'text' -%}\n                {%- if b.text != blank -%}\n                  <div class=\"cn-product__block cn-product__text cn-product__text--{{ b.style | default: 'body' }} cn-rte\" {{ block.soooks_attributes }}>{{ b.text }}</div>\n                {%- endif -%}\n\n              {%- when 'share' -%}\n                <div class=\"cn-product__block cn-share\" {{ block.soooks_attributes }} data-cn-share data-title=\"{{ p_title | escape }}\" data-label-copied=\"{{ 'products.link_copied' | t | escape }}\">\n                  <button type=\"button\" class=\"cn-share__btn\" data-cn-share-native hidden>{% render 'cn-tpl-icon', name: 'share', size: 16 %}<span>{{ b.label | default: 'products.share' | t }}</span></button>\n                  <button type=\"button\" class=\"cn-share__btn\" data-cn-share-copy>{% render 'cn-tpl-icon', name: 'link', size: 16 %}<span data-cn-share-copy-label>{{ 'products.copy_link' | t }}</span></button>\n                </div>\n\n            {%- endcase -%}\n          {%- endfor -%}\n        </form>\n      </div>\n    </div>\n  </div>\n\n  {%- if s.sticky_atc != false and product -%}\n    <div class=\"cn-sticky-atc\" data-cn-sticky-atc aria-hidden=\"true\">\n      <div class=\"cn-wrap cn-sticky-atc__inner\">\n        {%- if image_count > 0 -%}<img class=\"cn-sticky-atc__img\" src=\"{{ product.images.first.url }}\" alt=\"\" loading=\"lazy\" width=\"48\" height=\"48\">{%- endif -%}\n        <div class=\"cn-sticky-atc__text\">\n          <p class=\"cn-sticky-atc__title\">{{ p_title }}</p>\n          <p class=\"cn-sticky-atc__price\"><span data-cn-sticky-price>{{ cur_price | money }}</span>{% unless product.has_only_default_variant %} <span class=\"cn-sticky-atc__variant\" data-cn-sticky-variant>{{ current.title }}</span>{% endunless %}</p>\n        </div>\n        <button type=\"button\" class=\"cn-btn cn-sticky-atc__btn\" data-cn-sticky-btn tabindex=\"-1\" {% unless cur_in_stock %}disabled{% endunless %}>\n          {%- if cur_in_stock -%}{{ 'products.add_to_cart' | t }}{%- else -%}{{ 'products.sold_out' | t }}{%- endif -%}\n        </button>\n      </div>\n    </div>\n  {%- endif -%}\n\n  {%- if zoom == 'lightbox' and image_count > 0 -%}\n    <dialog class=\"cn-lightbox\" data-cn-lightbox aria-label=\"{{ 'products.gallery_label' | t | escape }}\">\n      <div class=\"cn-lightbox__bar\">\n        <span class=\"cn-lightbox__count\" data-cn-lightbox-count>1 / {{ image_count }}</span>\n        <button type=\"button\" class=\"cn-lightbox__btn\" data-cn-lightbox-close aria-label=\"{{ 'general.close' | t | escape }}\">{% render 'cn-tpl-icon', name: 'close', size: 20 %}</button>\n      </div>\n      <div class=\"cn-lightbox__stage\" data-cn-lightbox-stage>\n        <img class=\"cn-lightbox__img\" data-cn-lightbox-img src=\"{{ product.images.first.url }}\" alt=\"\" draggable=\"false\">\n      </div>\n      {%- if image_count > 1 -%}\n        <button type=\"button\" class=\"cn-lightbox__btn cn-lightbox__nav cn-lightbox__nav--prev\" data-cn-lightbox-prev aria-label=\"{{ 'products.previous_image' | t | escape }}\">{% render 'cn-tpl-icon', name: 'chevron-left', size: 22 %}</button>\n        <button type=\"button\" class=\"cn-lightbox__btn cn-lightbox__nav cn-lightbox__nav--next\" data-cn-lightbox-next aria-label=\"{{ 'products.next_image' | t | escape }}\">{% render 'cn-tpl-icon', name: 'chevron-right', size: 22 %}</button>\n      {%- endif -%}\n    </dialog>\n  {%- endif -%}\n\n  <script type=\"application/json\" data-cn-pdp-data>{\"variants\": {{ product.variants | json }}, \"url\": {{ product.url | json }}}</script>\n</section>\n\n{% schema %}\n{\n  \"name\": \"Product page\",\n  \"icon\": \"lucide:shopping-bag\",\n  \"settings\": [\n    {\n      \"type\": \"paragraph\",\n      \"content\": \"Add, remove and reorder the product details as blocks.\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"media_position\",\n      \"type\": \"select\",\n      \"label\": \"Gallery position\",\n      \"default\": \"start\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Before the details\"\n        },\n        {\n          \"value\": \"end\",\n          \"label\": \"After the details\"\n        }\n      ],\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"media_width\",\n      \"type\": \"select\",\n      \"label\": \"Gallery width\",\n      \"default\": \"medium\",\n      \"options\": [\n        {\n          \"value\": \"small\",\n          \"label\": \"Small (40%)\"\n        },\n        {\n          \"value\": \"medium\",\n          \"label\": \"Medium (50%)\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large (60%)\"\n        }\n      ],\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"sticky_info\",\n      \"type\": \"checkbox\",\n      \"label\": \"Keep the details in view while scrolling\",\n      \"info\": \"Desktop only.\",\n      \"default\": true,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"gallery_layout\",\n      \"type\": \"select\",\n      \"label\": \"Gallery layout\",\n      \"default\": \"thumbs_below\",\n      \"options\": [\n        {\n          \"value\": \"thumbs_below\",\n          \"label\": \"Thumbnails below\"\n        },\n        {\n          \"value\": \"thumbs_beside\",\n          \"label\": \"Thumbnails beside\"\n        },\n        {\n          \"value\": \"stacked\",\n          \"label\": \"Stacked\"\n        },\n        {\n          \"value\": \"grid\",\n          \"label\": \"Two-column grid\"\n        },\n        {\n          \"value\": \"slider\",\n          \"label\": \"Slider with dots\"\n        }\n      ],\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"media_ratio\",\n      \"type\": \"select\",\n      \"label\": \"Image shape\",\n      \"default\": \"natural\",\n      \"options\": [\n        {\n          \"value\": \"natural\",\n          \"label\": \"Original\"\n        },\n        {\n          \"value\": \"square\",\n          \"label\": \"Square\"\n        },\n        {\n          \"value\": \"portrait\",\n          \"label\": \"Portrait (4:5)\"\n        },\n        {\n          \"value\": \"landscape\",\n          \"label\": \"Landscape (4:3)\"\n        }\n      ],\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"media_fit\",\n      \"type\": \"select\",\n      \"label\": \"Image fit\",\n      \"default\": \"contain\",\n      \"options\": [\n        {\n          \"value\": \"contain\",\n          \"label\": \"Show the whole image\"\n        },\n        {\n          \"value\": \"cover\",\n          \"label\": \"Fill the frame (crops)\"\n        }\n      ],\n      \"visible_if\": \"{% if section.settings.media_ratio and section.settings.media_ratio != 'natural' %}true{% endif %}\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"image_zoom\",\n      \"type\": \"select\",\n      \"label\": \"Image zoom\",\n      \"default\": \"lightbox\",\n      \"options\": [\n        {\n          \"value\": \"lightbox\",\n          \"label\": \"Open in a zoom view\"\n        },\n        {\n          \"value\": \"none\",\n          \"label\": \"Off\"\n        }\n      ],\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"show_arrows\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show arrows\",\n      \"default\": true,\n      \"visible_if\": \"{% unless section.settings.gallery_layout == 'stacked' or section.settings.gallery_layout == 'grid' %}true{% endunless %}\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"sticky_atc\",\n      \"type\": \"checkbox\",\n      \"label\": \"Sticky add-to-cart bar\",\n      \"info\": \"Shows when the main button scrolls out of view.\",\n      \"default\": true,\n      \"group\": \"buttons\",\n      \"group_label\": \"Buttons\"\n    },\n    {\n      \"key\": \"mobile_gallery\",\n      \"type\": \"select\",\n      \"label\": \"Gallery on phones\",\n      \"default\": \"dots\",\n      \"options\": [\n        {\n          \"value\": \"dots\",\n          \"label\": \"Swipe with dots\"\n        },\n        {\n          \"value\": \"thumbs\",\n          \"label\": \"Swipe with thumbnails\"\n        }\n      ],\n      \"group\": \"mobile\",\n      \"group_label\": \"Mobile\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"default\": \"scheme-1\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"padding_top\",\n      \"type\": \"range\",\n      \"label\": \"Top spacing\",\n      \"min\": 0,\n      \"max\": 120,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 32,\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"padding_bottom\",\n      \"type\": \"range\",\n      \"label\": \"Bottom spacing\",\n      \"min\": 0,\n      \"max\": 120,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 64,\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    }\n  ],\n  \"blocks\": [\n    {\n      \"type\": \"vendor\",\n      \"name\": \"Vendor\",\n      \"limit\": 1,\n      \"settings\": [\n        {\n          \"key\": \"link\",\n          \"type\": \"checkbox\",\n          \"label\": \"Link to the vendor's products\",\n          \"default\": true\n        }\n      ]\n    },\n    {\n      \"type\": \"title\",\n      \"name\": \"Title\",\n      \"limit\": 1,\n      \"settings\": [\n        {\n          \"key\": \"title_size\",\n          \"type\": \"select\",\n          \"label\": \"Size\",\n          \"default\": \"md\",\n          \"options\": [\n            {\n              \"value\": \"sm\",\n              \"label\": \"Small\"\n            },\n            {\n              \"value\": \"md\",\n              \"label\": \"Medium\"\n            },\n            {\n              \"value\": \"lg\",\n              \"label\": \"Large\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"type\": \"rating\",\n      \"name\": \"Rating\",\n      \"limit\": 1,\n      \"settings\": [\n        {\n          \"type\": \"paragraph\",\n          \"content\": \"Shows the product's review rating (metafields reviews.rating and reviews.rating_count) when it has one.\"\n        }\n      ]\n    },\n    {\n      \"type\": \"price\",\n      \"name\": \"Price\",\n      \"limit\": 1,\n      \"settings\": [\n        {\n          \"key\": \"show_compare\",\n          \"type\": \"checkbox\",\n          \"label\": \"Show compare-at price\",\n          \"default\": true\n        },\n        {\n          \"key\": \"show_sale_badge\",\n          \"type\": \"checkbox\",\n          \"label\": \"Show sale badge\",\n          \"default\": true\n        },\n        {\n          \"key\": \"show_tax_note\",\n          \"type\": \"checkbox\",\n          \"label\": \"Show taxes and shipping note\",\n          \"default\": false\n        }\n      ]\n    },\n    {\n      \"type\": \"badges\",\n      \"name\": \"Badges\",\n      \"limit\": 1,\n      \"settings\": [\n        {\n          \"key\": \"show_sale\",\n          \"type\": \"checkbox\",\n          \"label\": \"Sale\",\n          \"default\": true\n        },\n        {\n          \"key\": \"show_new\",\n          \"type\": \"checkbox\",\n          \"label\": \"New\",\n          \"default\": true\n        },\n        {\n          \"key\": \"show_sold_out\",\n          \"type\": \"checkbox\",\n          \"label\": \"Sold out\",\n          \"default\": true\n        }\n      ]\n    },\n    {\n      \"type\": \"variant_picker\",\n      \"name\": \"Variant picker\",\n      \"limit\": 1,\n      \"settings\": [\n        {\n          \"key\": \"picker_style\",\n          \"type\": \"select\",\n          \"label\": \"Style\",\n          \"default\": \"buttons\",\n          \"options\": [\n            {\n              \"value\": \"buttons\",\n              \"label\": \"Buttons\"\n            },\n            {\n              \"value\": \"dropdown\",\n              \"label\": \"Dropdown\"\n            }\n          ]\n        },\n        {\n          \"key\": \"color_swatches\",\n          \"type\": \"checkbox\",\n          \"label\": \"Show colors as swatches\",\n          \"default\": true\n        }\n      ]\n    },\n    {\n      \"type\": \"quantity\",\n      \"name\": \"Quantity\",\n      \"limit\": 1,\n      \"settings\": []\n    },\n    {\n      \"type\": \"buttons\",\n      \"name\": \"Buy buttons\",\n      \"limit\": 1,\n      \"settings\": [\n        {\n          \"key\": \"show_buy_now\",\n          \"type\": \"checkbox\",\n          \"label\": \"Show “Buy it now” button\",\n          \"info\": \"Adds the product and goes straight to checkout.\",\n          \"default\": true\n        }\n      ]\n    },\n    {\n      \"type\": \"inventory\",\n      \"name\": \"Inventory status\",\n      \"limit\": 1,\n      \"settings\": [\n        {\n          \"key\": \"low_stock_threshold\",\n          \"type\": \"range\",\n          \"label\": \"Low stock below\",\n          \"min\": 1,\n          \"max\": 20,\n          \"step\": 1,\n          \"default\": 5\n        },\n        {\n          \"key\": \"show_in_stock\",\n          \"type\": \"checkbox\",\n          \"label\": \"Show “In stock” when stock is not low\",\n          \"default\": true\n        }\n      ]\n    },\n    {\n      \"type\": \"description\",\n      \"name\": \"Description\",\n      \"limit\": 1,\n      \"settings\": [\n        {\n          \"key\": \"collapsible\",\n          \"type\": \"checkbox\",\n          \"label\": \"Show as a collapsible row\",\n          \"default\": false\n        },\n        {\n          \"key\": \"heading\",\n          \"type\": \"text\",\n          \"label\": \"Row heading\",\n          \"default\": \"Description\",\n          \"visible_if\": \"{% if block.settings.collapsible %}true{% endif %}\"\n        }\n      ]\n    },\n    {\n      \"type\": \"collapsible_tab\",\n      \"name\": \"Collapsible row\",\n      \"settings\": [\n        {\n          \"key\": \"heading\",\n          \"type\": \"text\",\n          \"label\": \"Heading\",\n          \"default\": \"Shipping\"\n        },\n        {\n          \"key\": \"icon\",\n          \"type\": \"select\",\n          \"label\": \"Icon\",\n          \"default\": \"none\",\n          \"options\": [\n            {\n              \"value\": \"none\",\n              \"label\": \"None\"\n            },\n            {\n              \"value\": \"truck\",\n              \"label\": \"Delivery\"\n            },\n            {\n              \"value\": \"return\",\n              \"label\": \"Returns\"\n            },\n            {\n              \"value\": \"shield\",\n              \"label\": \"Guarantee\"\n            },\n            {\n              \"value\": \"box\",\n              \"label\": \"Package\"\n            },\n            {\n              \"value\": \"info\",\n              \"label\": \"Information\"\n            },\n            {\n              \"value\": \"leaf\",\n              \"label\": \"Leaf\"\n            },\n            {\n              \"value\": \"heart\",\n              \"label\": \"Heart\"\n            }\n          ]\n        },\n        {\n          \"key\": \"content\",\n          \"type\": \"richtext\",\n          \"label\": \"Content\",\n          \"default\": \"<p>Add details customers often ask about.</p>\"\n        },\n        {\n          \"key\": \"open\",\n          \"type\": \"checkbox\",\n          \"label\": \"Open by default\",\n          \"default\": false\n        }\n      ]\n    },\n    {\n      \"type\": \"text\",\n      \"name\": \"Text\",\n      \"settings\": [\n        {\n          \"key\": \"text\",\n          \"type\": \"richtext\",\n          \"label\": \"Text\",\n          \"default\": \"<p>Share a short note about this product.</p>\"\n        },\n        {\n          \"key\": \"style\",\n          \"type\": \"select\",\n          \"label\": \"Style\",\n          \"default\": \"body\",\n          \"options\": [\n            {\n              \"value\": \"body\",\n              \"label\": \"Body\"\n            },\n            {\n              \"value\": \"muted\",\n              \"label\": \"Subdued\"\n            },\n            {\n              \"value\": \"small\",\n              \"label\": \"Small\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"type\": \"share\",\n      \"name\": \"Share\",\n      \"limit\": 1,\n      \"settings\": [\n        {\n          \"key\": \"label\",\n          \"type\": \"text\",\n          \"label\": \"Label\",\n          \"default\": \"Share\"\n        }\n      ]\n    }\n  ],\n  \"presets\": [\n    {\n      \"name\": \"Product page\",\n      \"blocks\": [\n        {\n          \"type\": \"vendor\"\n        },\n        {\n          \"type\": \"title\"\n        },\n        {\n          \"type\": \"rating\"\n        },\n        {\n          \"type\": \"price\"\n        },\n        {\n          \"type\": \"variant_picker\"\n        },\n        {\n          \"type\": \"quantity\"\n        },\n        {\n          \"type\": \"buttons\"\n        },\n        {\n          \"type\": \"inventory\"\n        },\n        {\n          \"type\": \"description\"\n        },\n        {\n          \"type\": \"collapsible_tab\",\n          \"settings\": {\n            \"heading\": \"Shipping\",\n            \"icon\": \"truck\"\n          }\n        },\n        {\n          \"type\": \"collapsible_tab\",\n          \"settings\": {\n            \"heading\": \"Returns\",\n            \"icon\": \"return\"\n          }\n        },\n        {\n          \"type\": \"share\"\n        }\n      ]\n    }\n  ]\n}\n{% endschema %}\n","sections/main-search.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Search results page. The platform searches products (name, SKU, vendor, tags); the page can narrow results to\n  one collection (?c=slug) and sort them (?sort=). Collections whose name matches the search show as links.\n  Sort / collection controls: assets/corner-product.js ([data-cn-sort-by], [data-cn-search-scope]).\n{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign scheme = s.color_scheme | default: 'scheme-1' -%}\n{%- assign terms = page_query.q | default: '' -%}\n{%- assign total = paginate.total | default: collection.products.size | default: 0 -%}\n{%- assign terms_down = terms | downcase | strip -%}\n{%- capture base_query -%}q={{ terms | url_encode }}&{% if page_query.sort %}sort={{ page_query.sort | url_encode }}&{% endif %}{% if page_query.c %}c={{ page_query.c | url_encode }}&{% endif %}{% if page_query.vendor %}vendor={{ page_query.vendor | url_encode }}&{% endif %}{%- endcapture -%}\n\n{%- comment -%} Collections whose name contains the search words. {%- endcomment -%}\n{%- assign col_matches = 0 -%}\n{%- capture col_html -%}\n  {%- if s.show_collections != false and terms_down != '' -%}\n    {%- for col in collections -%}\n      {%- assign col_name = col.name | downcase -%}\n      {%- if col_name contains terms_down -%}\n        {%- assign col_matches = col_matches | plus: 1 -%}\n        <a class=\"cn-search-col\" href=\"/collections/{{ col.slug }}\">\n          <span class=\"cn-search-col__media\">\n            {%- if col.image -%}<img src=\"{{ col.image }}\" alt=\"\" loading=\"lazy\" width=\"56\" height=\"56\">{%- else -%}<img src=\"{{ 'ph-collection-1.svg' | asset_url }}\" alt=\"\" loading=\"lazy\" width=\"56\" height=\"56\">{%- endif -%}\n          </span>\n          <span class=\"cn-search-col__text\">\n            <span class=\"cn-search-col__name\">{{ col.name }}</span>\n            {%- if col.products_count -%}<span class=\"cn-search-col__count\">{{ 'collections.products_count' | t | replace: '{count}', col.products_count }}</span>{%- endif -%}\n          </span>\n        </a>\n      {%- endif -%}\n    {%- endfor -%}\n  {%- endif -%}\n{%- endcapture -%}\n\n<section class=\"cn-search-page {{ scheme }}\" data-cn-search-page data-q=\"{{ terms | escape }}\" style=\"--cn-pt: {{ s.padding_top | default: 32 }}px; --cn-pb: {{ s.padding_bottom | default: 64 }}px;\">\n  <div class=\"cn-wrap\">\n    <header class=\"cn-search-page__head\">\n      <h1 class=\"cn-search-page__title\">{{ s.heading | default: 'search.title' | t }}</h1>\n      <form class=\"cn-search-page__form\" method=\"get\" action=\"/search\" role=\"search\">\n        <label class=\"cn-visually-hidden\" for=\"cn-search-q-{{ section.id }}\">{{ 'general.search' | t }}</label>\n        <span class=\"cn-search-page__field\">\n          {% render 'cn-tpl-icon', name: 'search', size: 18, class: 'cn-search-page__icon' %}\n          <input class=\"cn-input cn-search-page__input\" id=\"cn-search-q-{{ section.id }}\" type=\"search\" name=\"q\" value=\"{{ terms }}\" placeholder=\"{{ 'search.placeholder' | t | escape }}\" autocomplete=\"off\">\n        </span>\n        {%- if page_query.c -%}<input type=\"hidden\" name=\"c\" value=\"{{ page_query.c }}\">{%- endif -%}\n        <button class=\"cn-btn\" type=\"submit\">{{ 'general.search' | t }}</button>\n      </form>\n    </header>\n\n    {%- if terms != '' -%}\n      {%- if col_matches > 0 -%}\n        <div class=\"cn-search-page__group\">\n          <h2 class=\"cn-search-page__group-title\">{{ 'search.collections' | t }}</h2>\n          <div class=\"cn-search-cols\">{{ col_html }}</div>\n        </div>\n      {%- endif -%}\n\n      <div class=\"cn-search-page__group\">\n        <div class=\"cn-collection__toolbar\">\n          <div class=\"cn-collection__toolbar-start\">\n            <h2 class=\"cn-search-page__group-title\">{{ 'search.products' | t }}</h2>\n            <p class=\"cn-collection__count\">{{ 'search.results_count' | t | replace: '{count}', total | replace: '{terms}', terms }}</p>\n          </div>\n          <div class=\"cn-search-page__controls\">\n            {%- if s.show_scope != false and collections.size > 0 -%}\n              <label class=\"cn-collection__sort\">\n                <span class=\"cn-collection__sort-label\">{{ 'search.in_collection' | t }}</span>\n                <span class=\"cn-select cn-select--sm\">\n                  <select data-cn-search-scope aria-label=\"{{ 'search.in_collection' | t | escape }}\">\n                    <option value=\"\">{{ 'search.all_collections' | t }}</option>\n                    {%- for col in collections -%}\n                      <option value=\"{{ col.slug }}\"{% if page_query.c == col.slug %} selected{% endif %}>{{ col.name }}</option>\n                    {%- endfor -%}\n                  </select>\n                  {% render 'cn-tpl-icon', name: 'chevron-down', size: 16, class: 'cn-select__chevron' %}\n                </span>\n              </label>\n            {%- endif -%}\n            {%- if s.show_sort != false -%}\n              {%- assign current_sort = page_query.sort | default: 'newest' -%}\n              <label class=\"cn-collection__sort\">\n                <span class=\"cn-collection__sort-label\">{{ 'collections.sort_label' | t }}</span>\n                <span class=\"cn-select cn-select--sm\">\n                  <select data-cn-sort-by aria-label=\"{{ 'collections.sort_label' | t | escape }}\">\n                    <option value=\"newest\"{% if current_sort == 'newest' %} selected{% endif %}>{{ 'collections.sort_newest' | t }}</option>\n                    <option value=\"best_selling\"{% if current_sort == 'best_selling' %} selected{% endif %}>{{ 'collections.sort_best_selling' | t }}</option>\n                    <option value=\"price_asc\"{% if current_sort == 'price_asc' %} selected{% endif %}>{{ 'collections.sort_price_asc' | t }}</option>\n                    <option value=\"price_desc\"{% if current_sort == 'price_desc' %} selected{% endif %}>{{ 'collections.sort_price_desc' | t }}</option>\n                    <option value=\"name_asc\"{% if current_sort == 'name_asc' or current_sort == 'name' %} selected{% endif %}>{{ 'collections.sort_name' | t }}</option>\n                    <option value=\"name_desc\"{% if current_sort == 'name_desc' %} selected{% endif %}>{{ 'collections.sort_name_desc' | t }}</option>\n                  </select>\n                  {% render 'cn-tpl-icon', name: 'chevron-down', size: 16, class: 'cn-select__chevron' %}\n                </span>\n              </label>\n            {%- endif -%}\n          </div>\n        </div>\n\n        {%- if page_query.vendor -%}\n          <div class=\"cn-collection__chips\">\n            <button type=\"button\" class=\"cn-chip\" data-cn-filter-remove=\"vendor\" data-value=\"{{ page_query.vendor | escape }}\">{{ page_query.vendor }}{% render 'cn-tpl-icon', name: 'close', size: 14 %}<span class=\"cn-visually-hidden\">{{ 'collections.remove_filter' | t }}</span></button>\n          </div>\n        {%- endif -%}\n\n        {%- if collection.products.size > 0 -%}\n          <div class=\"cn-tgrid\" style=\"--cn-cols-d: {{ s.columns_desktop | default: 4 }}; --cn-cols-t: {{ s.columns_tablet | default: 3 }}; --cn-cols-m: {{ s.columns_mobile | default: 2 }};\">\n            {%- for item in collection.products -%}\n              <div class=\"cn-tgrid__item\">{% render 'product-card', product: item, card: s, index: forloop.index0 %}</div>\n            {%- endfor -%}\n          </div>\n          {% render 'pagination', paginate: paginate, base_query: base_query %}\n        {%- else -%}\n          <div class=\"cn-empty-state\">\n            <p class=\"cn-empty-state__title\">{{ 'search.no_results' | t }} “{{ terms }}”</p>\n            <p class=\"cn-empty-state__text\">{{ 'search.no_results_hint' | t }}</p>\n            {%- if page_query.c -%}\n              <a class=\"cn-btn cn-btn--secondary\" href=\"/search?q={{ terms | url_encode }}\">{{ 'search.search_everywhere' | t }}</a>\n            {%- else -%}\n              <a class=\"cn-btn cn-btn--secondary\" href=\"/products\">{{ 'collections.all_products' | t }}</a>\n            {%- endif -%}\n          </div>\n        {%- endif -%}\n      </div>\n    {%- else -%}\n      <div class=\"cn-empty-state cn-empty-state--plain\">\n        <p class=\"cn-empty-state__text\">{{ 'search.start_hint' | t }}</p>\n        {%- if collections.size > 0 and s.show_collections != false -%}\n          <div class=\"cn-search-page__popular\">\n            {%- for col in collections limit: 8 -%}\n              <a class=\"cn-chip cn-chip--link\" href=\"/collections/{{ col.slug }}\">{{ col.name }}</a>\n            {%- endfor -%}\n          </div>\n        {%- endif -%}\n      </div>\n    {%- endif -%}\n  </div>\n</section>\n\n{% schema %}\n{\n  \"name\": \"Search page\",\n  \"icon\": \"lucide:search\",\n  \"settings\": [\n    {\n      \"key\": \"heading\",\n      \"type\": \"text\",\n      \"label\": \"Heading\",\n      \"default\": \"Search\"\n    },\n    {\n      \"key\": \"show_collections\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show matching collections\",\n      \"default\": true\n    },\n    {\n      \"key\": \"show_scope\",\n      \"type\": \"checkbox\",\n      \"label\": \"Let customers search one collection\",\n      \"default\": true\n    },\n    {\n      \"key\": \"show_sort\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show sorting\",\n      \"default\": true\n    },\n    {\n      \"key\": \"limit\",\n      \"type\": \"range\",\n      \"label\": \"Collections looked up\",\n      \"info\": \"How many of the store's collections are matched and listed.\",\n      \"min\": 4,\n      \"max\": 24,\n      \"step\": 1,\n      \"default\": 12\n    },\n    {\n      \"key\": \"columns_desktop\",\n      \"type\": \"range\",\n      \"label\": \"Columns on desktop\",\n      \"min\": 2,\n      \"max\": 6,\n      \"step\": 1,\n      \"default\": 4,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"columns_tablet\",\n      \"type\": \"range\",\n      \"label\": \"Columns on tablet\",\n      \"min\": 2,\n      \"max\": 4,\n      \"step\": 1,\n      \"default\": 3,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"image_ratio\",\n      \"type\": \"select\",\n      \"label\": \"Image shape\",\n      \"default\": \"theme\",\n      \"options\": [\n        {\n          \"value\": \"theme\",\n          \"label\": \"Theme default\"\n        },\n        {\n          \"value\": \"portrait\",\n          \"label\": \"Portrait (4:5)\"\n        },\n        {\n          \"value\": \"square\",\n          \"label\": \"Square\"\n        },\n        {\n          \"value\": \"landscape\",\n          \"label\": \"Landscape (4:3)\"\n        },\n        {\n          \"value\": \"natural\",\n          \"label\": \"Original\"\n        }\n      ],\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"image_fit\",\n      \"type\": \"select\",\n      \"label\": \"Image fit\",\n      \"default\": \"cover\",\n      \"options\": [\n        {\n          \"value\": \"cover\",\n          \"label\": \"Fill the frame\"\n        },\n        {\n          \"value\": \"contain\",\n          \"label\": \"Show the whole image\"\n        }\n      ],\n      \"visible_if\": \"{% unless section.settings.image_ratio == 'natural' %}true{% endunless %}\",\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"second_image\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show second image on hover\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_vendor\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show vendor\",\n      \"default\": false,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_price\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show price\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_compare\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show compare-at price\",\n      \"default\": true,\n      \"visible_if\": \"{% unless section.settings.show_price == false %}true{% endunless %}\",\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_sale_badge\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show sale badge\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_badges\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show “New” and “Sold out” badges\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_rating\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show rating\",\n      \"info\": \"Only for products with review data.\",\n      \"default\": false,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_swatches\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show color swatches\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_quick_add\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show quick add\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"text_alignment\",\n      \"type\": \"select\",\n      \"label\": \"Text alignment\",\n      \"default\": \"start\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Start\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        }\n      ],\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"columns_mobile\",\n      \"type\": \"range\",\n      \"label\": \"Columns on phones\",\n      \"min\": 1,\n      \"max\": 2,\n      \"step\": 1,\n      \"default\": 2,\n      \"group\": \"mobile\",\n      \"group_label\": \"Mobile\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"default\": \"scheme-1\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"padding_top\",\n      \"type\": \"range\",\n      \"label\": \"Top spacing\",\n      \"min\": 0,\n      \"max\": 120,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 32,\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"padding_bottom\",\n      \"type\": \"range\",\n      \"label\": \"Bottom spacing\",\n      \"min\": 0,\n      \"max\": 120,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 64,\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    }\n  ]\n}\n{% endschema %}\n","sections/newsletter.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Newsletter sign-up: stacked (centred), inline (text beside the form) or split with an image.\n  The form posts to the store's newsletter endpoint through corner-core.js (form[data-cn-newsletter]).\n{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign cn_layout = s.layout | default: 'stacked' -%}\n{%- if s.animate != false -%}{%- assign cn_rv = 'cn-reveal' -%}{%- else -%}{%- assign cn_rv = 'cn-reveal is-in is-settled' -%}{%- endif -%}\n<section class=\"cn-sec cn-news-sec {{ s.color_scheme | default: 'scheme-2' }} cn-pt-{{ s.spacing_top | default: 'default' }} cn-pb-{{ s.spacing_bottom | default: 'default' }}\">\n  <div class=\"cn-container\">\n    <div class=\"cn-news cn-news--{{ cn_layout }} cn-news--img-{{ s.image_position | default: 'start' }} cn-ta-{{ s.text_alignment | default: 'center' }} {{ cn_rv }}\">\n      {%- if cn_layout == 'split' -%}\n        <div class=\"cn-news__media\">{% render 'image', src: s.image, alt: '', ratio: 'fill', fit: 'cover', placeholder: 'ph-image-square.svg' %}</div>\n      {%- endif -%}\n      <div class=\"cn-news__body\">\n        <div class=\"cn-news__text\">\n          {%- if s.heading != blank -%}<h2 class=\"cn-news__title\">{{ s.heading }}</h2>{%- endif -%}\n          {%- if s.description != blank -%}<div class=\"cn-news__desc\">{{ s.description }}</div>{%- endif -%}\n        </div>\n        <div class=\"cn-news__formwrap\">\n          <form class=\"cn-news__form\" data-cn-newsletter data-msg-success=\"{{ 'general.newsletter_success' | t }}\">\n            <input class=\"cn-input\" type=\"email\" name=\"email\" required autocomplete=\"email\" placeholder=\"{{ 'general.newsletter_placeholder' | t }}\" aria-label=\"{{ 'general.newsletter_placeholder' | t }}\">\n            <button class=\"cn-btn cn-btn--{{ s.button_style | default: 'primary' }}\" type=\"submit\">{%- if s.button_label != blank -%}{{ s.button_label }}{%- else -%}{{ 'general.newsletter_button' | t }}{%- endif -%}</button>\n          </form>\n          <div class=\"cn-note\" data-cn-form-note hidden></div>\n          {%- if s.consent_text != blank -%}<div class=\"cn-news__consent\">{{ s.consent_text }}</div>{%- endif -%}\n        </div>\n      </div>\n    </div>\n  </div>\n</section>\n\n{% schema %}\n{\n  \"name\": \"Newsletter\",\n  \"icon\": \"lucide:mail\",\n  \"settings\": [\n    {\n      \"key\": \"heading\",\n      \"type\": \"text\",\n      \"label\": \"Heading\",\n      \"default\": \"Title\"\n    },\n    {\n      \"key\": \"description\",\n      \"type\": \"textarea\",\n      \"label\": \"Description\",\n      \"default\": \"Description\"\n    },\n    {\n      \"key\": \"consent_text\",\n      \"type\": \"richtext\",\n      \"label\": \"Consent text\",\n      \"default\": \"\",\n      \"info\": \"Shown under the email field.\"\n    },\n    {\n      \"key\": \"layout\",\n      \"type\": \"select\",\n      \"label\": \"Layout\",\n      \"options\": [\n        {\n          \"value\": \"stacked\",\n          \"label\": \"Stacked\"\n        },\n        {\n          \"value\": \"inline\",\n          \"label\": \"Text beside the form\"\n        },\n        {\n          \"value\": \"split\",\n          \"label\": \"Split with image\"\n        }\n      ],\n      \"default\": \"stacked\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"text_alignment\",\n      \"type\": \"select\",\n      \"label\": \"Text alignment\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Left\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        },\n        {\n          \"value\": \"end\",\n          \"label\": \"Right\"\n        }\n      ],\n      \"default\": \"center\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"image\",\n      \"type\": \"asset\",\n      \"label\": \"Image\",\n      \"visible_if\": \"{% if section.settings.layout == 'split' %}true{% endif %}\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"image_position\",\n      \"type\": \"select\",\n      \"label\": \"Image position\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Image first\"\n        },\n        {\n          \"value\": \"end\",\n          \"label\": \"Image second\"\n        }\n      ],\n      \"default\": \"start\",\n      \"visible_if\": \"{% if section.settings.layout == 'split' %}true{% endif %}\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"button_label\",\n      \"type\": \"text\",\n      \"label\": \"Button label\",\n      \"default\": \"Subscribe\",\n      \"group\": \"buttons\",\n      \"group_label\": \"Buttons\"\n    },\n    {\n      \"key\": \"button_style\",\n      \"type\": \"select\",\n      \"label\": \"Button style\",\n      \"options\": [\n        {\n          \"value\": \"primary\",\n          \"label\": \"Solid\"\n        },\n        {\n          \"value\": \"secondary\",\n          \"label\": \"Outline\"\n        }\n      ],\n      \"default\": \"primary\",\n      \"group\": \"buttons\",\n      \"group_label\": \"Buttons\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"default\": \"scheme-2\",\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"spacing_top\",\n      \"type\": \"select\",\n      \"label\": \"Top spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"spacing_bottom\",\n      \"type\": \"select\",\n      \"label\": \"Bottom spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"animate\",\n      \"type\": \"checkbox\",\n      \"label\": \"Reveal on scroll\",\n      \"default\": true,\n      \"group\": \"animation\",\n      \"group_label\": \"Animation\"\n    }\n  ],\n  \"presets\": [\n    {\n      \"name\": \"Newsletter\"\n    }\n  ]\n}\n{% endschema %}\n","sections/popup.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Popup — the storewide popup (global slot `popup`, added from the editor's section list under Overlays).\n  Essential tier (docs/popups.md): modal · compact · corner card; center · bottom left · bottom right.\n  Corner draws it; window.Soooks.popup (runtime/popups.ts) decides when it shows, to whom and how often, and makes\n  it behave (focus, Escape, scroll lock, signup → success step, coupon copy, the editor preview). The look and the\n  two animations (fade · fade and scale) are Corner's, keyed off the root's data-state in corner-sections.css.\n  Phones (≤749px), automatically: the modal shows as a compact card, the corner card as a bottom card.\n{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign pp_layout = s.layout | default: 'modal' -%}\n{%- assign pp_position = s.position | default: 'center' -%}\n{%- assign pp_anim = s.animation | default: 'scale' -%}\n{%- assign pp_trigger = s.trigger | default: 'delay' -%}\n{%- assign pp_modal = true -%}\n{%- if pp_layout == 'corner' -%}{%- assign pp_modal = false -%}{%- endif -%}\n{%- assign pp_label = 'popup.label' | t -%}\n{%- assign pp_ok = 'popup.success' | t -%}\n{%- assign pp_heading = '' -%}\n{%- assign pp_has_success = false -%}\n{%- for block in section.blocks -%}\n  {%- if block.type == 'heading' and pp_heading == '' -%}{%- assign pp_heading = block.id -%}{%- endif -%}\n  {%- if block.type == 'success' -%}{%- assign pp_has_success = true -%}{%- endif -%}\n{%- endfor -%}\n{%- assign pp_img = '' -%}\n{%- assign pp_ph = false -%}\n{%- if pp_layout != 'compact' -%}\n  {%- if s.image != blank -%}\n    {%- capture pp_img -%}{{ s.image | asset_url }}{%- endcapture -%}\n    {%- if pp_img contains '[object' -%}{%- assign pp_img = '' -%}{%- endif -%}\n  {%- endif -%}\n  {%- if pp_img == '' -%}\n    {%- capture pp_img -%}{{ 'ph-image-wide.svg' | asset_url }}{%- endcapture -%}\n    {%- assign pp_ph = true -%}\n  {%- endif -%}\n{%- endif -%}\n<div class=\"cn-popup cn-popup--{{ pp_layout }} cn-popup--{{ pp_position }} cn-popup--{{ pp_anim }}\"\n  data-soooks-popup=\"{{ section.id }}\" data-modal=\"{{ pp_modal }}\" hidden>\n  <script type=\"application/json\" data-soooks-popup-config>{\"trigger\":{\"on\":[\"{{ pp_trigger }}\"],\"delay\":{{ s.trigger_delay | default: 5 | plus: 0 }},\"inactivity\":{{ s.trigger_inactivity | default: 20 | plus: 0 }}},\"pages\":{\"only\":[{% if s.pages == 'index' %}\"index\"{% endif %}]},\"frequency\":{\"mode\":\"{{ s.frequency | default: 'session' }}\",\"stop_after_signup\":{% if s.stop_after_signup == false %}false{% else %}true{% endif %},\"stop_after_claim\":false}}</script>\n  {%- if pp_modal -%}<div class=\"cn-popup__overlay\" data-popup-overlay></div>{%- endif -%}\n  <div class=\"cn-popup__panel {{ s.color_scheme | default: 'scheme-1' }}\" data-popup-panel role=\"dialog\"{% if pp_modal %} aria-modal=\"true\"{% endif %}{% if pp_heading != '' %} aria-labelledby=\"PopupHeading-{{ section.id }}\"{% else %} aria-label=\"{{ pp_label }}\"{% endif %} tabindex=\"-1\">\n    <button type=\"button\" class=\"cn-popup__close\" data-popup-close aria-label=\"{{ 'popup.close' | t }}\">{% render 'icon', name: 'close', size: 18 %}</button>\n    {%- if pp_img != '' -%}\n      <div class=\"cn-popup__media{% if pp_ph %} cn-popup__media--ph{% endif %}\"><img data-src=\"{{ pp_img }}\" alt=\"\" width=\"1200\" height=\"800\"></div>\n    {%- endif -%}\n    <div class=\"cn-popup__body\">\n      <div class=\"cn-popup__step\" data-popup-step=\"main\">\n        {%- for block in section.blocks -%}\n          {%- assign b = block.settings -%}\n          {%- case block.type -%}\n            {%- when 'heading' -%}\n              <h2 class=\"cn-popup__title\"{% if block.id == pp_heading %} id=\"PopupHeading-{{ section.id }}\"{% endif %} {{ block.soooks_attributes }}>{{ b.text }}</h2>\n            {%- when 'text' -%}\n              <p class=\"cn-popup__text\" {{ block.soooks_attributes }}>{{ b.text | newline_to_br }}</p>\n            {%- when 'button' -%}\n              {%- capture pp_btn_class -%}{% if b.style == 'secondary' %}cn-btn cn-btn--secondary{% else %}cn-btn{% endif %} cn-popup__button{%- endcapture -%}\n              {%- if b.link != blank -%}\n                <a class=\"{{ pp_btn_class }}\" href=\"{{ b.link }}\" {{ block.soooks_attributes }}>{{ b.label }}</a>\n              {%- else -%}\n                <button type=\"button\" class=\"{{ pp_btn_class }}\" data-popup-close {{ block.soooks_attributes }}>{{ b.label }}</button>\n              {%- endif -%}\n            {%- when 'email' -%}\n              {%- assign pp_place = b.placeholder | default: '' -%}\n              {%- if pp_place == '' -%}{%- assign pp_place = 'popup.email_placeholder' | t -%}{%- endif -%}\n              <form class=\"cn-popup__form\" data-popup-form data-msg-success=\"{{ b.success | default: pp_ok | escape }}\" {{ block.soooks_attributes }}>\n                <input class=\"cn-input cn-popup__input\" type=\"email\" name=\"email\" required autocomplete=\"email\" placeholder=\"{{ pp_place | escape }}\" aria-label=\"{{ pp_place | escape }}\">\n                <button class=\"cn-btn cn-popup__submit\" type=\"submit\">{% if b.button_label != blank %}{{ b.button_label }}{% else %}{{ 'popup.subscribe' | t }}{% endif %}</button>\n                <p class=\"cn-popup__note\" data-popup-note role=\"status\" hidden></p>\n              </form>\n            {%- when 'coupon' -%}\n              <div class=\"cn-popup__coupon\" {{ block.soooks_attributes }}>\n                {%- if b.label != blank -%}<p class=\"cn-popup__coupon-label\">{{ b.label }}</p>{%- endif -%}\n                <button type=\"button\" class=\"cn-popup__code\" data-popup-copy=\"{{ b.code | escape }}\">\n                  <span class=\"cn-popup__code-text\">{{ b.code }}</span>\n                  <span class=\"cn-popup__code-action\" aria-live=\"polite\"><span class=\"cn-popup__copy\">{{ 'popup.copy' | t }}</span><span class=\"cn-popup__copied\">{{ 'popup.copied' | t }}</span></span>\n                </button>\n              </div>\n          {%- endcase -%}\n        {%- endfor -%}\n      </div>\n      {%- if pp_has_success -%}\n        <div class=\"cn-popup__step\" data-popup-step=\"success\" aria-live=\"polite\" hidden>\n          {%- for block in section.blocks -%}\n            {%- if block.type == 'success' -%}\n              {%- assign b = block.settings -%}\n              <div class=\"cn-popup__success\" {{ block.soooks_attributes }}>\n                <span class=\"cn-popup__success-icon\">{% render 'icon', name: 'check', size: 22 %}</span>\n                {%- if b.heading != blank -%}<h2 class=\"cn-popup__title\">{{ b.heading }}</h2>{%- endif -%}\n                {%- if b.text != blank -%}<p class=\"cn-popup__text\">{{ b.text | newline_to_br }}</p>{%- endif -%}\n                <button type=\"button\" class=\"cn-btn cn-btn--secondary cn-popup__button\" data-popup-close>{{ 'popup.continue' | t }}</button>\n              </div>\n            {%- endif -%}\n          {%- endfor -%}\n        </div>\n      {%- endif -%}\n    </div>\n  </div>\n</div>\n\n{% schema %}\n{\n  \"name\": \"Popup\",\n  \"icon\": \"lucide:app-window\",\n  \"settings\": [\n    {\n      \"key\": \"layout\",\n      \"type\": \"select\",\n      \"label\": \"Layout\",\n      \"default\": \"modal\",\n      \"options\": [\n        {\n          \"value\": \"modal\",\n          \"label\": \"Modal\"\n        },\n        {\n          \"value\": \"compact\",\n          \"label\": \"Compact\"\n        },\n        {\n          \"value\": \"corner\",\n          \"label\": \"Corner card\"\n        }\n      ],\n      \"info\": \"On phones the modal shows as a compact card and the corner card sits at the bottom of the screen.\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"position\",\n      \"type\": \"select\",\n      \"label\": \"Position\",\n      \"default\": \"center\",\n      \"options\": [\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        },\n        {\n          \"value\": \"bottom-left\",\n          \"label\": \"Bottom left\"\n        },\n        {\n          \"value\": \"bottom-right\",\n          \"label\": \"Bottom right\"\n        }\n      ],\n      \"info\": \"Left and right swap in right-to-left languages.\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"image\",\n      \"type\": \"asset\",\n      \"label\": \"Image\",\n      \"visible_if\": \"{% if section.settings.layout != 'compact' %}true{% endif %}\",\n      \"info\": \"Shown above the content in the modal and the corner card.\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"default\": \"scheme-1\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"animation\",\n      \"type\": \"select\",\n      \"label\": \"Animation\",\n      \"default\": \"scale\",\n      \"options\": [\n        {\n          \"value\": \"fade\",\n          \"label\": \"Fade\"\n        },\n        {\n          \"value\": \"scale\",\n          \"label\": \"Fade and scale\"\n        }\n      ],\n      \"group\": \"animation\",\n      \"group_label\": \"Animation\"\n    },\n    {\n      \"key\": \"trigger\",\n      \"type\": \"select\",\n      \"label\": \"Show the popup\",\n      \"default\": \"delay\",\n      \"options\": [\n        {\n          \"value\": \"delay\",\n          \"label\": \"After a few seconds\"\n        },\n        {\n          \"value\": \"load\",\n          \"label\": \"As soon as the page loads\"\n        },\n        {\n          \"value\": \"inactivity\",\n          \"label\": \"When the shopper is idle\"\n        }\n      ],\n      \"group\": \"trigger\",\n      \"group_label\": \"Trigger\"\n    },\n    {\n      \"key\": \"trigger_delay\",\n      \"type\": \"range\",\n      \"label\": \"Delay\",\n      \"min\": 1,\n      \"max\": 60,\n      \"step\": 1,\n      \"unit\": \"s\",\n      \"default\": 5,\n      \"visible_if\": \"{% if section.settings.trigger == 'delay' %}true{% endif %}\",\n      \"group\": \"trigger\",\n      \"group_label\": \"Trigger\"\n    },\n    {\n      \"key\": \"trigger_inactivity\",\n      \"type\": \"range\",\n      \"label\": \"Idle for\",\n      \"min\": 5,\n      \"max\": 120,\n      \"step\": 5,\n      \"unit\": \"s\",\n      \"default\": 20,\n      \"visible_if\": \"{% if section.settings.trigger == 'inactivity' %}true{% endif %}\",\n      \"group\": \"trigger\",\n      \"group_label\": \"Trigger\"\n    },\n    {\n      \"key\": \"pages\",\n      \"type\": \"select\",\n      \"label\": \"Show on\",\n      \"default\": \"all\",\n      \"options\": [\n        {\n          \"value\": \"all\",\n          \"label\": \"All pages\"\n        },\n        {\n          \"value\": \"index\",\n          \"label\": \"Homepage only\"\n        }\n      ],\n      \"group\": \"targeting\",\n      \"group_label\": \"Targeting\"\n    },\n    {\n      \"key\": \"frequency\",\n      \"type\": \"select\",\n      \"label\": \"How often\",\n      \"default\": \"session\",\n      \"options\": [\n        {\n          \"value\": \"always\",\n          \"label\": \"Every page view\"\n        },\n        {\n          \"value\": \"session\",\n          \"label\": \"Once per visit\"\n        },\n        {\n          \"value\": \"day\",\n          \"label\": \"Once a day\"\n        },\n        {\n          \"value\": \"week\",\n          \"label\": \"Once a week\"\n        },\n        {\n          \"value\": \"dismissed\",\n          \"label\": \"Until the shopper closes it\"\n        }\n      ],\n      \"info\": \"The theme editor never counts as a visit.\",\n      \"group\": \"frequency\",\n      \"group_label\": \"Frequency\"\n    },\n    {\n      \"key\": \"stop_after_signup\",\n      \"type\": \"checkbox\",\n      \"label\": \"Stop showing after a shopper signs up\",\n      \"default\": true,\n      \"group\": \"frequency\",\n      \"group_label\": \"Frequency\"\n    }\n  ],\n  \"blocks\": [\n    {\n      \"type\": \"heading\",\n      \"name\": \"Heading\",\n      \"limit\": 2,\n      \"settings\": [\n        {\n          \"key\": \"text\",\n          \"type\": \"text\",\n          \"label\": \"Heading\",\n          \"default\": \"Join our newsletter\"\n        }\n      ]\n    },\n    {\n      \"type\": \"text\",\n      \"name\": \"Text\",\n      \"settings\": [\n        {\n          \"key\": \"text\",\n          \"type\": \"textarea\",\n          \"label\": \"Text\",\n          \"default\": \"New arrivals, offers and news, straight to your inbox.\"\n        }\n      ]\n    },\n    {\n      \"type\": \"button\",\n      \"name\": \"Button\",\n      \"settings\": [\n        {\n          \"key\": \"label\",\n          \"type\": \"text\",\n          \"label\": \"Label\",\n          \"default\": \"Shop now\"\n        },\n        {\n          \"key\": \"link\",\n          \"type\": \"link\",\n          \"label\": \"Link\",\n          \"info\": \"Leave empty to make it a \\\"No thanks\\\" button that closes the popup.\"\n        },\n        {\n          \"key\": \"style\",\n          \"type\": \"select\",\n          \"label\": \"Style\",\n          \"default\": \"primary\",\n          \"segmented\": true,\n          \"options\": [\n            {\n              \"value\": \"primary\",\n              \"label\": \"Solid\"\n            },\n            {\n              \"value\": \"secondary\",\n              \"label\": \"Outline\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"type\": \"email\",\n      \"name\": \"Email signup\",\n      \"limit\": 1,\n      \"settings\": [\n        {\n          \"key\": \"placeholder\",\n          \"type\": \"text\",\n          \"label\": \"Placeholder\",\n          \"default\": \"\"\n        },\n        {\n          \"key\": \"button_label\",\n          \"type\": \"text\",\n          \"label\": \"Button label\",\n          \"default\": \"Subscribe\"\n        },\n        {\n          \"key\": \"success\",\n          \"type\": \"text\",\n          \"label\": \"Success message\",\n          \"default\": \"\",\n          \"info\": \"Shown under the field when the popup has no Success message block.\"\n        }\n      ]\n    },\n    {\n      \"type\": \"coupon\",\n      \"name\": \"Coupon code\",\n      \"settings\": [\n        {\n          \"key\": \"code\",\n          \"type\": \"text\",\n          \"label\": \"Code\",\n          \"default\": \"WELCOME10\",\n          \"info\": \"Create the discount under Discounts; shoppers copy the code with one tap.\"\n        },\n        {\n          \"key\": \"label\",\n          \"type\": \"text\",\n          \"label\": \"Label\",\n          \"default\": \"Use this code at checkout\"\n        }\n      ]\n    },\n    {\n      \"type\": \"success\",\n      \"name\": \"Success message\",\n      \"limit\": 1,\n      \"settings\": [\n        {\n          \"key\": \"heading\",\n          \"type\": \"text\",\n          \"label\": \"Heading\",\n          \"default\": \"You’re on the list\"\n        },\n        {\n          \"key\": \"text\",\n          \"type\": \"textarea\",\n          \"label\": \"Text\",\n          \"default\": \"Thanks for signing up — watch your inbox for our next email.\"\n        }\n      ]\n    }\n  ],\n  \"max_blocks\": 8,\n  \"presets\": [\n    {\n      \"name\": \"Popup\",\n      \"blocks\": [\n        {\n          \"type\": \"heading\"\n        },\n        {\n          \"type\": \"text\"\n        },\n        {\n          \"type\": \"email\"\n        },\n        {\n          \"type\": \"success\"\n        }\n      ]\n    }\n  ]\n}\n{% endschema %}\n","sections/product-grid.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Product grid (\"Featured collection\" / \"Product grid\"): products from a collection, hand-picked products or the\n  latest products. Blocks: the platform \"Header\" (eyebrow, heading, text, View all) and ONE \"Product card\"\n  definition, drawn for every product (each card is that product's resource context — the editor selects the\n  exact card). Grid, source and colour settings stay on the section.\n{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign cn_src = s.source | default: 'collection' -%}\n{%- assign cn_limit = s.limit | default: 8 -%}\n{%- assign cn_cols = s.columns_desktop | default: 4 -%}\n{%- assign cn_link = '/products' -%}\n{%- if cn_src == 'collection' and s.collection != blank -%}{%- assign cn_link = '/collections/' | append: s.collection -%}{%- endif -%}\n{%- if s.animate != false -%}{%- assign cn_rv = 'cn-reveal' -%}{%- else -%}{%- assign cn_rv = 'cn-reveal is-in is-settled' -%}{%- endif -%}\n{%- assign cn_card = nil -%}\n{%- for block in section.blocks -%}{%- if block.type == 'product-card' -%}{%- assign cn_card = block -%}{%- endif -%}{%- endfor -%}\n{%- comment -%} A section saved before blocks (no blocks at all) keeps the classic card; hiding blocks hides them. {%- endcomment -%}\n{%- assign cn_classic = false -%}\n{%- if section.blocks_count == 0 -%}{%- assign cn_classic = true -%}{%- endif -%}\n<section class=\"cn-sec cn-pgrid {{ s.color_scheme | default: 'scheme-1' }} cn-pt-{{ s.spacing_top | default: 'default' }} cn-pb-{{ s.spacing_bottom | default: 'default' }}\">\n  <div class=\"cn-container\">\n    {%- for block in section.blocks -%}\n      {%- if block.type == 'header' -%}{% render 'block-head', head: block, link: cn_link %}{%- endif -%}\n    {%- endfor -%}\n    {%- if cn_card or cn_classic -%}\n    <div class=\"cn-grid cn-grid--{{ s.mobile_layout | default: 'grid' }} {{ cn_rv }}\" data-cn-stagger\n      style=\"--cn-cols-d:{{ cn_cols }};--cn-cols-t:{{ s.columns_tablet | default: 3 }};--cn-cols-m:{{ s.columns_mobile | default: 2 }};--cn-grid-gap:{{ s.gap | default: 20 }}px\">\n      {%- assign cn_shown = 0 -%}\n      {%- if cn_src == 'products' and s.products.size > 0 -%}\n        {%- for cn_slug in s.products limit: cn_limit -%}\n          {%- assign cn_p = products_by_slug[cn_slug] -%}\n          {%- if cn_p == blank -%}{%- continue -%}{%- endif -%}\n          <div class=\"cn-grid__item\">{% render 'product-card', product: cn_p, card: s, card_block: cn_card, index: cn_shown %}</div>\n          {%- assign cn_shown = cn_shown | plus: 1 -%}\n        {%- endfor -%}\n      {%- elsif cn_src != 'products' -%}\n        {%- for cn_p in products limit: cn_limit -%}\n          <div class=\"cn-grid__item\">{% render 'product-card', product: cn_p, card: s, card_block: cn_card, index: forloop.index0 %}</div>\n          {%- assign cn_shown = cn_shown | plus: 1 -%}\n        {%- endfor -%}\n      {%- endif -%}\n      {%- if cn_shown == 0 -%}\n        {%- comment -%} Nothing to show yet (no products, or none picked): placeholder cards from the same card block. {%- endcomment -%}\n        {%- assign cn_ph = cn_limit | at_most: cn_cols -%}\n        {%- for cn_i in (1..cn_ph) -%}\n          <div class=\"cn-grid__item\">{% render 'product-card', placeholder: true, card: s, card_block: cn_card, index: forloop.index0 %}</div>\n        {%- endfor -%}\n      {%- endif -%}\n    </div>\n    {%- endif -%}\n  </div>\n</section>\n{% schema %}\n{\n  \"name\": \"Product grid\",\n  \"icon\": \"lucide:layout-grid\",\n  \"settings\": [\n    {\n      \"key\": \"source\",\n      \"type\": \"select\",\n      \"label\": \"Products\",\n      \"options\": [\n        {\n          \"value\": \"collection\",\n          \"label\": \"From a collection\"\n        },\n        {\n          \"value\": \"products\",\n          \"label\": \"Hand-picked products\"\n        },\n        {\n          \"value\": \"all\",\n          \"label\": \"All products\"\n        }\n      ],\n      \"default\": \"collection\"\n    },\n    {\n      \"key\": \"collection\",\n      \"type\": \"collection\",\n      \"label\": \"Collection\",\n      \"info\": \"Leave empty to show the latest products.\",\n      \"visible_if\": \"{% if section.settings.source == 'collection' %}true{% endif %}\"\n    },\n    {\n      \"key\": \"products\",\n      \"type\": \"product_list\",\n      \"label\": \"Products\",\n      \"visible_if\": \"{% if section.settings.source == 'products' %}true{% endif %}\"\n    },\n    {\n      \"key\": \"limit\",\n      \"type\": \"range\",\n      \"label\": \"Number of products\",\n      \"min\": 2,\n      \"max\": 24,\n      \"step\": 1,\n      \"default\": 8\n    },\n    {\n      \"key\": \"columns_desktop\",\n      \"type\": \"range\",\n      \"label\": \"Columns on desktop\",\n      \"min\": 2,\n      \"max\": 6,\n      \"step\": 1,\n      \"default\": 4,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"columns_tablet\",\n      \"type\": \"range\",\n      \"label\": \"Columns on tablet\",\n      \"min\": 2,\n      \"max\": 4,\n      \"step\": 1,\n      \"default\": 3,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"gap\",\n      \"type\": \"range\",\n      \"label\": \"Space between cards\",\n      \"min\": 0,\n      \"max\": 48,\n      \"step\": 4,\n      \"default\": 20,\n      \"unit\": \"px\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"image_fit\",\n      \"type\": \"select\",\n      \"label\": \"Image fit\",\n      \"options\": [\n        {\n          \"value\": \"cover\",\n          \"label\": \"Fill the frame (crop)\"\n        },\n        {\n          \"value\": \"contain\",\n          \"label\": \"Fit inside (no crop)\"\n        }\n      ],\n      \"default\": \"cover\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"show_swatches\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show color swatches\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"columns_mobile\",\n      \"type\": \"range\",\n      \"label\": \"Columns on mobile\",\n      \"min\": 1,\n      \"max\": 2,\n      \"step\": 1,\n      \"default\": 2,\n      \"group\": \"mobile\",\n      \"group_label\": \"Mobile\"\n    },\n    {\n      \"key\": \"mobile_layout\",\n      \"type\": \"select\",\n      \"label\": \"Mobile layout\",\n      \"options\": [\n        {\n          \"value\": \"grid\",\n          \"label\": \"Grid\"\n        },\n        {\n          \"value\": \"slider_mobile\",\n          \"label\": \"Slider on mobile\"\n        },\n        {\n          \"value\": \"slider_tablet\",\n          \"label\": \"Slider on tablet and mobile\"\n        }\n      ],\n      \"default\": \"grid\",\n      \"group\": \"mobile\",\n      \"group_label\": \"Mobile\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"default\": \"scheme-1\",\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"spacing_top\",\n      \"type\": \"select\",\n      \"label\": \"Top spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"spacing_bottom\",\n      \"type\": \"select\",\n      \"label\": \"Bottom spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"animate\",\n      \"type\": \"checkbox\",\n      \"label\": \"Reveal on scroll\",\n      \"default\": true,\n      \"group\": \"animation\",\n      \"group_label\": \"Animation\"\n    }\n  ],\n  \"presets\": [\n    {\n      \"name\": \"Featured collection\",\n      \"blocks\": [\n        {\n          \"type\": \"header\",\n          \"settings\": {\n            \"alignment\": \"left\"\n          },\n          \"blocks\": [\n            {\n              \"type\": \"eyebrow\",\n              \"settings\": {\n                \"text\": \"Subtitle\"\n              }\n            },\n            {\n              \"type\": \"heading\",\n              \"settings\": {\n                \"text\": \"Title\"\n              }\n            },\n            {\n              \"type\": \"view-all\",\n              \"settings\": {\n                \"label\": \"View all\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"product-card\",\n          \"settings\": {\n            \"hover\": \"zoom\",\n            \"text_alignment\": \"left\"\n          },\n          \"blocks\": [\n            {\n              \"type\": \"card-image\",\n              \"settings\": {\n                \"ratio\": \"portrait\",\n                \"second_image\": true\n              }\n            },\n            {\n              \"type\": \"card-badge\"\n            },\n            {\n              \"type\": \"card-vendor\"\n            },\n            {\n              \"type\": \"card-title\"\n            },\n            {\n              \"type\": \"card-price\"\n            },\n            {\n              \"type\": \"card-rating\"\n            },\n            {\n              \"type\": \"card-button\",\n              \"settings\": {\n                \"label\": \"Add to cart\",\n                \"style\": \"outline\"\n              }\n            }\n          ]\n        }\n      ],\n      \"settings\": {\n        \"source\": \"collection\",\n        \"limit\": 4,\n        \"columns_desktop\": 4,\n        \"mobile_layout\": \"slider_tablet\"\n      }\n    },\n    {\n      \"name\": \"Product grid\",\n      \"blocks\": [\n        {\n          \"type\": \"header\",\n          \"settings\": {\n            \"alignment\": \"left\"\n          },\n          \"blocks\": [\n            {\n              \"type\": \"eyebrow\",\n              \"settings\": {\n                \"text\": \"Subtitle\"\n              }\n            },\n            {\n              \"type\": \"heading\",\n              \"settings\": {\n                \"text\": \"Title\"\n              }\n            },\n            {\n              \"type\": \"view-all\",\n              \"settings\": {\n                \"label\": \"View all\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"product-card\",\n          \"settings\": {\n            \"hover\": \"zoom\",\n            \"text_alignment\": \"left\"\n          },\n          \"blocks\": [\n            {\n              \"type\": \"card-image\",\n              \"settings\": {\n                \"ratio\": \"portrait\",\n                \"second_image\": true\n              }\n            },\n            {\n              \"type\": \"card-badge\"\n            },\n            {\n              \"type\": \"card-vendor\"\n            },\n            {\n              \"type\": \"card-title\"\n            },\n            {\n              \"type\": \"card-price\"\n            },\n            {\n              \"type\": \"card-rating\"\n            },\n            {\n              \"type\": \"card-button\",\n              \"settings\": {\n                \"label\": \"Add to cart\",\n                \"style\": \"outline\"\n              }\n            }\n          ]\n        }\n      ],\n      \"settings\": {\n        \"source\": \"all\",\n        \"limit\": 8,\n        \"columns_desktop\": 4,\n        \"mobile_layout\": \"grid\"\n      }\n    }\n  ],\n  \"blocks\": [\n    \"@block:section-header\",\n    {\n      \"use\": \"@block:product-card\",\n      \"source\": \"products\"\n    }\n  ]\n}\n{% endschema %}\n","sections/promo-banner.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%} Promo banner: a band with a heading, text and a button — on a colour, or over an optional image. {%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign cn_has_img = false -%}\n{%- if s.image != blank -%}{%- assign cn_has_img = true -%}{%- endif -%}\n{%- if s.animate != false -%}{%- assign cn_rv = 'cn-reveal' -%}{%- else -%}{%- assign cn_rv = 'cn-reveal is-in is-settled' -%}{%- endif -%}\n<section class=\"cn-sec cn-promo-sec cn-pt-{{ s.spacing_top | default: 'default' }} cn-pb-{{ s.spacing_bottom | default: 'default' }}{% if s.full_width %} cn-promo-sec--full{% endif %}\">\n  <div class=\"{% if s.full_width %}cn-promo-full{% else %}cn-container{% endif %}\">\n    <div class=\"cn-promo {{ s.color_scheme | default: 'scheme-4' }} cn-promo--h-{{ s.height | default: 'medium' }} cn-promo--mh-{{ s.mobile_height | default: 'auto' }} cn-ta-{{ s.text_alignment | default: 'center' }} cn-mta-{{ s.mobile_text_alignment | default: 'center' }}{% if cn_has_img %} cn-promo--img{% endif %}{% if cn_has_img and s.overlay != false %} cn-promo--overlay{% endif %}{% if s.custom_colors %} cn-promo--custom{% endif %} {{ cn_rv }}\"\n      style=\"--cn-card-radius:{{ s.radius | default: 8 }}px;--cn-overlay:{{ s.overlay_opacity | default: 40 | divided_by: 100.0 }}{% if s.custom_colors %};--cn-promo-bg:{{ s.background_color | default: '#2457d6' }};--cn-promo-ink:{{ s.text_color | default: '#ffffff' }}{% endif %}\">\n      {%- if cn_has_img -%}\n        <div class=\"cn-promo__media\">{% render 'image', src: s.image, alt: '', ratio: 'fill', fit: 'cover', position: s.image_position %}</div>\n      {%- endif -%}\n      <div class=\"cn-promo__content\">\n        {%- if s.eyebrow != blank -%}<p class=\"cn-promo__eyebrow\">{{ s.eyebrow }}</p>{%- endif -%}\n        {%- if s.heading != blank -%}<h2 class=\"cn-promo__title\">{{ s.heading }}</h2>{%- endif -%}\n        {%- if s.description != blank -%}<div class=\"cn-promo__text\">{{ s.description }}</div>{%- endif -%}\n        {%- if s.button_label != blank -%}\n          <div class=\"cn-actions\"><a class=\"cn-btn cn-btn--{{ s.button_style | default: 'primary' }}\" href=\"{{ s.button_link | default: '/collections' }}\">{{ s.button_label }}</a></div>\n        {%- endif -%}\n      </div>\n    </div>\n  </div>\n</section>\n\n{% schema %}\n{\n  \"name\": \"Promo banner\",\n  \"icon\": \"lucide:megaphone\",\n  \"settings\": [\n    {\n      \"key\": \"eyebrow\",\n      \"type\": \"text\",\n      \"label\": \"Subtitle\",\n      \"default\": \"Subtitle\"\n    },\n    {\n      \"key\": \"heading\",\n      \"type\": \"text\",\n      \"label\": \"Heading\",\n      \"default\": \"Title\"\n    },\n    {\n      \"key\": \"description\",\n      \"type\": \"textarea\",\n      \"label\": \"Description\",\n      \"default\": \"Description\"\n    },\n    {\n      \"key\": \"text_alignment\",\n      \"type\": \"select\",\n      \"label\": \"Text alignment\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Left\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        },\n        {\n          \"value\": \"end\",\n          \"label\": \"Right\"\n        }\n      ],\n      \"default\": \"center\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"height\",\n      \"type\": \"select\",\n      \"label\": \"Height\",\n      \"options\": [\n        {\n          \"value\": \"auto\",\n          \"label\": \"Fit content\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"medium\",\n          \"label\": \"Medium\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"small\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"full_width\",\n      \"type\": \"checkbox\",\n      \"label\": \"Full width\",\n      \"default\": false,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"radius\",\n      \"type\": \"range\",\n      \"label\": \"Corner radius\",\n      \"min\": 0,\n      \"max\": 24,\n      \"step\": 2,\n      \"default\": 8,\n      \"unit\": \"px\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"image\",\n      \"type\": \"asset\",\n      \"label\": \"Background image\",\n      \"info\": \"Optional.\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"image_position\",\n      \"type\": \"select\",\n      \"label\": \"Image focal point\",\n      \"options\": [\n        {\n          \"value\": \"center center\",\n          \"label\": \"Center\"\n        },\n        {\n          \"value\": \"center top\",\n          \"label\": \"Top\"\n        },\n        {\n          \"value\": \"center bottom\",\n          \"label\": \"Bottom\"\n        },\n        {\n          \"value\": \"left center\",\n          \"label\": \"Left\"\n        },\n        {\n          \"value\": \"right center\",\n          \"label\": \"Right\"\n        }\n      ],\n      \"default\": \"center center\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"overlay\",\n      \"type\": \"checkbox\",\n      \"label\": \"Darken the image\",\n      \"default\": true,\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"overlay_opacity\",\n      \"type\": \"range\",\n      \"label\": \"Overlay opacity\",\n      \"min\": 0,\n      \"max\": 90,\n      \"step\": 5,\n      \"default\": 40,\n      \"unit\": \"%\",\n      \"visible_if\": \"{% if section.settings.overlay != false %}true{% endif %}\",\n      \"group\": \"media\",\n      \"group_label\": \"Media\"\n    },\n    {\n      \"key\": \"button_label\",\n      \"type\": \"text\",\n      \"label\": \"Button label\",\n      \"default\": \"Button label\",\n      \"info\": \"Leave empty to hide the button.\",\n      \"group\": \"buttons\",\n      \"group_label\": \"Buttons\"\n    },\n    {\n      \"key\": \"button_link\",\n      \"type\": \"link\",\n      \"label\": \"Button link\",\n      \"default\": \"/collections\",\n      \"group\": \"buttons\",\n      \"group_label\": \"Buttons\"\n    },\n    {\n      \"key\": \"button_style\",\n      \"type\": \"select\",\n      \"label\": \"Button style\",\n      \"options\": [\n        {\n          \"value\": \"primary\",\n          \"label\": \"Solid\"\n        },\n        {\n          \"value\": \"secondary\",\n          \"label\": \"Outline\"\n        },\n        {\n          \"value\": \"link\",\n          \"label\": \"Link\"\n        }\n      ],\n      \"default\": \"primary\",\n      \"group\": \"buttons\",\n      \"group_label\": \"Buttons\"\n    },\n    {\n      \"key\": \"mobile_height\",\n      \"type\": \"select\",\n      \"label\": \"Mobile height\",\n      \"options\": [\n        {\n          \"value\": \"auto\",\n          \"label\": \"Fit content\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"medium\",\n          \"label\": \"Medium\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"auto\",\n      \"group\": \"mobile\",\n      \"group_label\": \"Mobile\"\n    },\n    {\n      \"key\": \"mobile_text_alignment\",\n      \"type\": \"select\",\n      \"label\": \"Mobile text alignment\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Left\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        },\n        {\n          \"value\": \"end\",\n          \"label\": \"Right\"\n        }\n      ],\n      \"default\": \"center\",\n      \"group\": \"mobile\",\n      \"group_label\": \"Mobile\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"default\": \"scheme-4\",\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"custom_colors\",\n      \"type\": \"checkbox\",\n      \"label\": \"Use custom colors\",\n      \"default\": false,\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"background_color\",\n      \"type\": \"color\",\n      \"label\": \"Background\",\n      \"default\": \"#2457d6\",\n      \"visible_if\": \"{% if section.settings.custom_colors %}true{% endif %}\",\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"text_color\",\n      \"type\": \"color\",\n      \"label\": \"Text\",\n      \"default\": \"#ffffff\",\n      \"visible_if\": \"{% if section.settings.custom_colors %}true{% endif %}\",\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"spacing_top\",\n      \"type\": \"select\",\n      \"label\": \"Top spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"spacing_bottom\",\n      \"type\": \"select\",\n      \"label\": \"Bottom spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"animate\",\n      \"type\": \"checkbox\",\n      \"label\": \"Reveal on scroll\",\n      \"default\": true,\n      \"group\": \"animation\",\n      \"group_label\": \"Animation\"\n    }\n  ],\n  \"presets\": [\n    {\n      \"name\": \"Promo banner\"\n    }\n  ]\n}\n{% endschema %}\n","sections/related-products.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  \"You may also like\" under the product page: products from a chosen collection (or the newest in the store),\n  never the product being viewed. Cards come from snippets/product-card (card options = this section's settings).\n{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign scheme = s.color_scheme | default: 'scheme-1' -%}\n{%- assign max_items = s.limit | default: 4 -%}\n{%- assign shown = 0 -%}\n{%- capture cards -%}\n  {%- for item in products -%}\n    {%- if product and item.slug == product.slug -%}{%- continue -%}{%- endif -%}\n    {%- if shown >= max_items -%}{%- break -%}{%- endif -%}\n    <div class=\"cn-tgrid__item\">{% render 'product-card', product: item, card: s, index: shown %}</div>\n    {%- assign shown = shown | plus: 1 -%}\n  {%- endfor -%}\n{%- endcapture -%}\n{%- if shown > 0 or request.design_mode -%}\n<section class=\"cn-related {{ scheme }}\" style=\"--cn-pt: {{ s.padding_top | default: 48 }}px; --cn-pb: {{ s.padding_bottom | default: 64 }}px;\">\n  <div class=\"cn-wrap\">\n    {%- if s.heading != blank or s.text != blank -%}\n      <header class=\"cn-tpl-head cn-tpl-head--{{ s.heading_alignment | default: 'start' }}\">\n        {%- if s.heading != blank -%}<h2 class=\"cn-tpl-head__title\">{{ s.heading }}</h2>{%- endif -%}\n        {%- if s.text != blank -%}<p class=\"cn-tpl-head__text\">{{ s.text }}</p>{%- endif -%}\n      </header>\n    {%- endif -%}\n    {%- if shown > 0 -%}\n      <div class=\"cn-tgrid{% if s.mobile_layout == 'slider' %} cn-tgrid--m-slider{% endif %}\" style=\"--cn-cols-d: {{ s.columns_desktop | default: 4 }}; --cn-cols-t: {{ s.columns_tablet | default: 3 }}; --cn-cols-m: {{ s.columns_mobile | default: 2 }};\">\n        {{ cards }}\n      </div>\n    {%- else -%}\n      <p class=\"cn-muted-text\">{{ 'products.no_related' | t }}</p>\n    {%- endif -%}\n  </div>\n</section>\n{%- endif -%}\n\n{% schema %}\n{\n  \"name\": \"Related products\",\n  \"icon\": \"lucide:sparkles\",\n  \"settings\": [\n    {\n      \"key\": \"heading\",\n      \"type\": \"text\",\n      \"label\": \"Heading\",\n      \"default\": \"You may also like\"\n    },\n    {\n      \"key\": \"text\",\n      \"type\": \"text\",\n      \"label\": \"Description\"\n    },\n    {\n      \"key\": \"collection\",\n      \"type\": \"collection\",\n      \"label\": \"Products from\",\n      \"info\": \"Leave empty to show the newest products in the store.\"\n    },\n    {\n      \"key\": \"limit\",\n      \"type\": \"range\",\n      \"label\": \"Number of products\",\n      \"min\": 2,\n      \"max\": 12,\n      \"step\": 1,\n      \"default\": 4\n    },\n    {\n      \"key\": \"heading_alignment\",\n      \"type\": \"select\",\n      \"label\": \"Heading alignment\",\n      \"default\": \"start\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Start\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        }\n      ],\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"columns_desktop\",\n      \"type\": \"range\",\n      \"label\": \"Columns on desktop\",\n      \"min\": 2,\n      \"max\": 6,\n      \"step\": 1,\n      \"default\": 4,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"columns_tablet\",\n      \"type\": \"range\",\n      \"label\": \"Columns on tablet\",\n      \"min\": 2,\n      \"max\": 4,\n      \"step\": 1,\n      \"default\": 3,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"image_ratio\",\n      \"type\": \"select\",\n      \"label\": \"Image shape\",\n      \"default\": \"theme\",\n      \"options\": [\n        {\n          \"value\": \"theme\",\n          \"label\": \"Theme default\"\n        },\n        {\n          \"value\": \"portrait\",\n          \"label\": \"Portrait (4:5)\"\n        },\n        {\n          \"value\": \"square\",\n          \"label\": \"Square\"\n        },\n        {\n          \"value\": \"landscape\",\n          \"label\": \"Landscape (4:3)\"\n        },\n        {\n          \"value\": \"natural\",\n          \"label\": \"Original\"\n        }\n      ],\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"image_fit\",\n      \"type\": \"select\",\n      \"label\": \"Image fit\",\n      \"default\": \"cover\",\n      \"options\": [\n        {\n          \"value\": \"cover\",\n          \"label\": \"Fill the frame\"\n        },\n        {\n          \"value\": \"contain\",\n          \"label\": \"Show the whole image\"\n        }\n      ],\n      \"visible_if\": \"{% unless section.settings.image_ratio == 'natural' %}true{% endunless %}\",\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"second_image\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show second image on hover\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_vendor\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show vendor\",\n      \"default\": false,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_price\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show price\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_compare\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show compare-at price\",\n      \"default\": true,\n      \"visible_if\": \"{% unless section.settings.show_price == false %}true{% endunless %}\",\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_sale_badge\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show sale badge\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_badges\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show “New” and “Sold out” badges\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_rating\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show rating\",\n      \"info\": \"Only for products with review data.\",\n      \"default\": false,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_swatches\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show color swatches\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"show_quick_add\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show quick add\",\n      \"default\": true,\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"text_alignment\",\n      \"type\": \"select\",\n      \"label\": \"Text alignment\",\n      \"default\": \"start\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Start\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        }\n      ],\n      \"group\": \"cards\",\n      \"group_label\": \"Product cards\"\n    },\n    {\n      \"key\": \"columns_mobile\",\n      \"type\": \"range\",\n      \"label\": \"Columns on phones\",\n      \"min\": 1,\n      \"max\": 2,\n      \"step\": 1,\n      \"default\": 2,\n      \"group\": \"mobile\",\n      \"group_label\": \"Mobile\"\n    },\n    {\n      \"key\": \"mobile_layout\",\n      \"type\": \"select\",\n      \"label\": \"Layout on phones\",\n      \"default\": \"grid\",\n      \"options\": [\n        {\n          \"value\": \"grid\",\n          \"label\": \"Grid\"\n        },\n        {\n          \"value\": \"slider\",\n          \"label\": \"Swipe row\"\n        }\n      ],\n      \"group\": \"mobile\",\n      \"group_label\": \"Mobile\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"default\": \"scheme-2\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"padding_top\",\n      \"type\": \"range\",\n      \"label\": \"Top spacing\",\n      \"min\": 0,\n      \"max\": 120,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 48,\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"padding_bottom\",\n      \"type\": \"range\",\n      \"label\": \"Bottom spacing\",\n      \"min\": 0,\n      \"max\": 120,\n      \"step\": 4,\n      \"unit\": \"px\",\n      \"default\": 64,\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    }\n  ]\n}\n{% endschema %}\n","sections/rich-text.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%} Rich text: subtitle, heading, text and buttons, in the order of the blocks. {%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- if s.animate != false -%}{%- assign cn_rv = 'cn-reveal' -%}{%- else -%}{%- assign cn_rv = 'cn-reveal is-in is-settled' -%}{%- endif -%}\n<section class=\"cn-sec cn-rt-sec {{ s.color_scheme | default: 'scheme-1' }} cn-pt-{{ s.spacing_top | default: 'default' }} cn-pb-{{ s.spacing_bottom | default: 'default' }}\">\n  <div class=\"cn-container\">\n    <div class=\"cn-rt cn-rt--w-{{ s.content_width | default: 'medium' }} cn-rt--{{ s.alignment | default: 'center' }} cn-ta-{{ s.alignment | default: 'center' }} {{ cn_rv }}\">\n      {%- for block in section.blocks -%}\n        {%- assign b = block.settings -%}\n        {%- case block.type -%}\n          {%- when 'eyebrow' -%}\n            {%- if b.text != blank -%}<p class=\"cn-rt__eyebrow\" {{ block.soooks_attributes }}>{{ b.text }}</p>{%- endif -%}\n          {%- when 'heading' -%}\n            {%- if b.text != blank -%}<h2 class=\"cn-rt__title cn-rt__title--{{ b.heading_size | default: 'md' }}\" {{ block.soooks_attributes }}>{{ b.text }}</h2>{%- endif -%}\n          {%- when 'text' -%}\n            {%- if b.text != blank -%}<div class=\"cn-rt__text cn-rte\" {{ block.soooks_attributes }}>{{ b.text }}</div>{%- endif -%}\n          {%- when 'button' -%}\n            {%- if b.label != blank -%}<div class=\"cn-actions\" {{ block.soooks_attributes }}><a class=\"cn-btn cn-btn--{{ b.style | default: 'primary' }}\" href=\"{{ b.link | default: '/collections' }}\">{{ b.label }}</a></div>{%- endif -%}\n        {%- endcase -%}\n      {%- endfor -%}\n    </div>\n  </div>\n</section>\n\n{% schema %}\n{\n  \"name\": \"Rich text\",\n  \"icon\": \"lucide:text\",\n  \"settings\": [\n    {\n      \"key\": \"alignment\",\n      \"type\": \"select\",\n      \"label\": \"Alignment\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Left\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        },\n        {\n          \"value\": \"end\",\n          \"label\": \"Right\"\n        }\n      ],\n      \"default\": \"center\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"content_width\",\n      \"type\": \"select\",\n      \"label\": \"Content width\",\n      \"options\": [\n        {\n          \"value\": \"narrow\",\n          \"label\": \"Narrow\"\n        },\n        {\n          \"value\": \"medium\",\n          \"label\": \"Medium\"\n        },\n        {\n          \"value\": \"wide\",\n          \"label\": \"Wide\"\n        }\n      ],\n      \"default\": \"medium\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"default\": \"scheme-1\",\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"spacing_top\",\n      \"type\": \"select\",\n      \"label\": \"Top spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"spacing_bottom\",\n      \"type\": \"select\",\n      \"label\": \"Bottom spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"animate\",\n      \"type\": \"checkbox\",\n      \"label\": \"Reveal on scroll\",\n      \"default\": true,\n      \"group\": \"animation\",\n      \"group_label\": \"Animation\"\n    }\n  ],\n  \"blocks\": [\n    {\n      \"type\": \"eyebrow\",\n      \"name\": \"Subtitle\",\n      \"settings\": [\n        {\n          \"key\": \"text\",\n          \"type\": \"text\",\n          \"label\": \"Subtitle\",\n          \"default\": \"Subtitle\"\n        }\n      ]\n    },\n    {\n      \"type\": \"heading\",\n      \"name\": \"Heading\",\n      \"settings\": [\n        {\n          \"key\": \"text\",\n          \"type\": \"text\",\n          \"label\": \"Heading\",\n          \"default\": \"Title\"\n        },\n        {\n          \"key\": \"heading_size\",\n          \"type\": \"select\",\n          \"label\": \"Size\",\n          \"options\": [\n            {\n              \"value\": \"sm\",\n              \"label\": \"Small\"\n            },\n            {\n              \"value\": \"md\",\n              \"label\": \"Medium\"\n            },\n            {\n              \"value\": \"lg\",\n              \"label\": \"Large\"\n            }\n          ],\n          \"default\": \"md\"\n        }\n      ]\n    },\n    {\n      \"type\": \"text\",\n      \"name\": \"Text\",\n      \"settings\": [\n        {\n          \"key\": \"text\",\n          \"type\": \"richtext\",\n          \"label\": \"Text\",\n          \"default\": \"<p>Description</p>\"\n        }\n      ]\n    },\n    {\n      \"type\": \"button\",\n      \"name\": \"Button\",\n      \"settings\": [\n        {\n          \"key\": \"label\",\n          \"type\": \"text\",\n          \"label\": \"Label\",\n          \"default\": \"Button label\"\n        },\n        {\n          \"key\": \"link\",\n          \"type\": \"link\",\n          \"label\": \"Link\",\n          \"default\": \"/collections\"\n        },\n        {\n          \"key\": \"style\",\n          \"type\": \"select\",\n          \"label\": \"Style\",\n          \"options\": [\n            {\n              \"value\": \"primary\",\n              \"label\": \"Solid\"\n            },\n            {\n              \"value\": \"secondary\",\n              \"label\": \"Outline\"\n            },\n            {\n              \"value\": \"link\",\n              \"label\": \"Link\"\n            }\n          ],\n          \"default\": \"primary\"\n        }\n      ]\n    }\n  ],\n  \"max_blocks\": 10,\n  \"presets\": [\n    {\n      \"name\": \"Rich text\",\n      \"blocks\": [\n        {\n          \"type\": \"eyebrow\"\n        },\n        {\n          \"type\": \"heading\"\n        },\n        {\n          \"type\": \"text\"\n        },\n        {\n          \"type\": \"button\"\n        }\n      ]\n    }\n  ]\n}\n{% endschema %}\n","sections/slideshow.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%} The home page's one <h1>: the first slide's heading when this is the page's first section. {%- endcomment -%}\n{%- assign hx_first = 'h2' -%}\n{%- if request.page_type == 'index' and section.index == 1 -%}{%- assign hx_first = 'h1' -%}{%- endif -%}\n{%- comment -%}\n  Slideshow: full-width slides with text, buttons and an optional whole-slide link.\n  Behaviour (autoplay, loop, arrows, dots, swipe, keyboard) lives in assets/corner-sections.js ([data-cn-slideshow]).\n{%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign cn_n = section.blocks.size -%}\n{%- assign cn_height = s.height | default: 'medium' -%}\n{%- assign cn_ratio = 'fill' -%}\n{%- if cn_height == 'adapt' -%}{%- assign cn_ratio = 'natural' -%}{%- endif -%}\n<section class=\"cn-ss-sec cn-ss--h-{{ cn_height }} cn-ss--mh-{{ s.mobile_height | default: 'medium' }}{% if s.mobile_hide_arrows != false %} cn-ss--m-noarrows{% endif %} {{ s.color_scheme | default: 'scheme-1' }}\">\n  <div class=\"cn-ss cn-ss--{{ s.transition | default: 'slide' }}\" data-cn-slideshow\n    data-autoplay=\"{% if s.autoplay != false %}true{% else %}false{% endif %}\" data-speed=\"{{ s.autoplay_speed | default: 5 }}\"\n    data-loop=\"{% if s.loop != false %}true{% else %}false{% endif %}\" data-transition=\"{{ s.transition | default: 'slide' }}\"\n    data-swipe=\"{% if s.swipe != false %}true{% else %}false{% endif %}\"\n    role=\"region\" aria-roledescription=\"carousel\" aria-label=\"{{ 'slideshow.label' | t }}\">\n    <div class=\"cn-ss__viewport\">\n      <div class=\"cn-ss__track\" data-cn-ss-track>\n        {%- for block in section.blocks -%}{%- if forloop.first -%}{%- assign hx = hx_first -%}{%- else -%}{%- assign hx = 'h2' -%}{%- endif -%}\n          {%- assign b = block.settings -%}\n          {%- assign cn_pos = b.text_position | default: 'middle-center' | split: '-' -%}\n          {%- assign cn_img = 'ph-slide-1.svg' -%}\n          {%- assign cn_pick = forloop.index0 | modulo: 3 -%}\n          {%- if cn_pick == 1 -%}{%- assign cn_img = 'ph-slide-2.svg' -%}{%- elsif cn_pick == 2 -%}{%- assign cn_img = 'ph-slide-3.svg' -%}{%- endif -%}\n          <div class=\"cn-ss__slide cn-slide--v-{{ cn_pos[0] | default: 'middle' }} cn-slide--x-{{ cn_pos[1] | default: 'center' }} cn-ta-{{ b.text_alignment | default: 'center' }}{% if b.overlay != false %} cn-slide--overlay{% endif %}{% if forloop.first %} is-active{% endif %}\"\n            data-cn-slide {{ block.soooks_attributes }} role=\"group\" aria-roledescription=\"slide\"\n            aria-label=\"{{ forloop.index }} / {{ cn_n }}\"\n            style=\"--cn-overlay:{{ b.overlay_opacity | default: 30 | divided_by: 100.0 }}\">\n            <div class=\"cn-ss__media\">\n              {% render 'image', src: b.image, mobile_src: b.mobile_image, alt: b.heading, ratio: cn_ratio, fit: 'cover', eager: forloop.first, placeholder: cn_img %}\n            </div>\n            {%- if b.link != blank -%}<a class=\"cn-ss__cover\" href=\"{{ b.link }}\" tabindex=\"-1\" aria-hidden=\"true\"></a>{%- endif -%}\n            <div class=\"cn-ss__inner cn-container\">\n              <div class=\"cn-ss__content\">\n                {%- if b.eyebrow != blank -%}<p class=\"cn-ss__eyebrow\">{{ b.eyebrow }}</p>{%- endif -%}\n                {%- if b.heading != blank -%}<{{ hx }} class=\"cn-ss__title\">{{ b.heading }}</{{ hx }}>{%- endif -%}\n                {%- if b.description != blank -%}<div class=\"cn-ss__text\">{{ b.description }}</div>{%- endif -%}\n                {%- if b.button_label != blank or b.button2_label != blank -%}\n                  <div class=\"cn-actions\">\n                    {%- if b.button_label != blank -%}<a class=\"cn-btn cn-btn--{{ b.button_style | default: 'primary' }}\" href=\"{{ b.button_link | default: b.link | default: '/collections' }}\">{{ b.button_label }}</a>{%- endif -%}\n                    {%- if b.button2_label != blank -%}<a class=\"cn-btn cn-btn--{{ b.button2_style | default: 'secondary' }}\" href=\"{{ b.button2_link | default: '/collections' }}\">{{ b.button2_label }}</a>{%- endif -%}\n                  </div>\n                {%- endif -%}\n              </div>\n            </div>\n          </div>\n        {%- else -%}\n          <div class=\"cn-ss__slide cn-slide--v-middle cn-slide--x-center cn-ta-center is-active\">\n            <div class=\"cn-ss__media\">{% render 'image', ratio: cn_ratio, eager: true, placeholder: 'ph-slide-1.svg' %}</div>\n            <div class=\"cn-ss__inner cn-container\"><div class=\"cn-ss__content\"><h2 class=\"cn-ss__title\">Title</h2><div class=\"cn-ss__text\">Description</div></div></div>\n          </div>\n        {%- endfor -%}\n      </div>\n    </div>\n    {%- if cn_n > 1 -%}\n      {%- if s.show_arrows != false -%}\n        <button type=\"button\" class=\"cn-ss__arrow cn-ss__arrow--prev\" data-cn-ss-prev aria-label=\"{{ 'slideshow.previous' | t }}\"><span class=\"cn-chev cn-chev--prev\" aria-hidden=\"true\"></span></button>\n        <button type=\"button\" class=\"cn-ss__arrow cn-ss__arrow--next\" data-cn-ss-next aria-label=\"{{ 'slideshow.next' | t }}\"><span class=\"cn-chev cn-chev--next\" aria-hidden=\"true\"></span></button>\n      {%- endif -%}\n      {%- if s.show_dots != false or s.autoplay != false -%}\n        <div class=\"cn-ss__controls\">\n          {%- if s.autoplay != false -%}\n            <button type=\"button\" class=\"cn-ss__play\" data-cn-ss-toggle aria-label=\"{{ 'slideshow.pause' | t }}\" data-label-pause=\"{{ 'slideshow.pause' | t }}\" data-label-play=\"{{ 'slideshow.play' | t }}\"><span class=\"cn-ss__play-icon\" aria-hidden=\"true\"></span></button>\n          {%- endif -%}\n          {%- if s.show_dots != false -%}\n            <div class=\"cn-ss__dots\">\n              {%- for block in section.blocks -%}\n                <button type=\"button\" class=\"cn-ss__dot{% if forloop.first %} is-active{% endif %}\" data-cn-ss-dot=\"{{ forloop.index0 }}\" aria-label=\"{{ 'slideshow.go_to' | t | replace: '{n}', forloop.index }}\"{% if forloop.first %} aria-current=\"true\"{% endif %}></button>\n              {%- endfor -%}\n            </div>\n          {%- endif -%}\n        </div>\n      {%- endif -%}\n    {%- endif -%}\n  </div>\n</section>\n\n{% schema %}\n{\n  \"name\": \"Slideshow\",\n  \"icon\": \"lucide:gallery-horizontal\",\n  \"settings\": [\n    {\n      \"key\": \"height\",\n      \"type\": \"select\",\n      \"label\": \"Height\",\n      \"options\": [\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"medium\",\n          \"label\": \"Medium\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        },\n        {\n          \"value\": \"full\",\n          \"label\": \"Full screen\"\n        },\n        {\n          \"value\": \"adapt\",\n          \"label\": \"Adapt to image\"\n        }\n      ],\n      \"default\": \"medium\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"transition\",\n      \"type\": \"select\",\n      \"label\": \"Transition\",\n      \"options\": [\n        {\n          \"value\": \"slide\",\n          \"label\": \"Slide\"\n        },\n        {\n          \"value\": \"fade\",\n          \"label\": \"Fade\"\n        }\n      ],\n      \"default\": \"slide\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"autoplay\",\n      \"type\": \"checkbox\",\n      \"label\": \"Autoplay\",\n      \"default\": true,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"autoplay_speed\",\n      \"type\": \"range\",\n      \"label\": \"Change slides every\",\n      \"min\": 3,\n      \"max\": 10,\n      \"step\": 1,\n      \"default\": 5,\n      \"unit\": \"s\",\n      \"visible_if\": \"{% if section.settings.autoplay != false %}true{% endif %}\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"loop\",\n      \"type\": \"checkbox\",\n      \"label\": \"Loop\",\n      \"default\": true,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"show_arrows\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show arrows\",\n      \"default\": true,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"show_dots\",\n      \"type\": \"checkbox\",\n      \"label\": \"Show dots\",\n      \"default\": true,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"swipe\",\n      \"type\": \"checkbox\",\n      \"label\": \"Swipe and drag\",\n      \"default\": true,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"mobile_height\",\n      \"type\": \"select\",\n      \"label\": \"Mobile height\",\n      \"options\": [\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"medium\",\n          \"label\": \"Medium\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        },\n        {\n          \"value\": \"full\",\n          \"label\": \"Full screen\"\n        },\n        {\n          \"value\": \"adapt\",\n          \"label\": \"Adapt to image\"\n        }\n      ],\n      \"default\": \"medium\",\n      \"group\": \"mobile\",\n      \"group_label\": \"Mobile\"\n    },\n    {\n      \"key\": \"mobile_hide_arrows\",\n      \"type\": \"checkbox\",\n      \"label\": \"Hide arrows on mobile\",\n      \"default\": true,\n      \"group\": \"mobile\",\n      \"group_label\": \"Mobile\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"default\": \"scheme-1\",\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    }\n  ],\n  \"blocks\": [\n    {\n      \"type\": \"slide\",\n      \"name\": \"Slide\",\n      \"settings\": [\n        {\n          \"key\": \"image\",\n          \"type\": \"asset\",\n          \"label\": \"Image\"\n        },\n        {\n          \"key\": \"mobile_image\",\n          \"type\": \"asset\",\n          \"label\": \"Mobile image\",\n          \"info\": \"Optional. Shown under 768px.\"\n        },\n        {\n          \"key\": \"eyebrow\",\n          \"type\": \"text\",\n          \"label\": \"Subtitle\",\n          \"default\": \"Subtitle\"\n        },\n        {\n          \"key\": \"heading\",\n          \"type\": \"text\",\n          \"label\": \"Heading\",\n          \"default\": \"Title\"\n        },\n        {\n          \"key\": \"description\",\n          \"type\": \"textarea\",\n          \"label\": \"Description\",\n          \"default\": \"Description\"\n        },\n        {\n          \"key\": \"link\",\n          \"type\": \"link\",\n          \"label\": \"Slide link\",\n          \"info\": \"Makes the whole slide clickable.\"\n        },\n        {\n          \"key\": \"button_label\",\n          \"type\": \"text\",\n          \"label\": \"Button label\",\n          \"default\": \"Button label\",\n          \"info\": \"Leave empty to hide the button.\"\n        },\n        {\n          \"key\": \"button_link\",\n          \"type\": \"link\",\n          \"label\": \"Button link\",\n          \"default\": \"/collections\"\n        },\n        {\n          \"key\": \"button_style\",\n          \"type\": \"select\",\n          \"label\": \"Button style\",\n          \"options\": [\n            {\n              \"value\": \"primary\",\n              \"label\": \"Solid\"\n            },\n            {\n              \"value\": \"secondary\",\n              \"label\": \"Outline\"\n            },\n            {\n              \"value\": \"link\",\n              \"label\": \"Link\"\n            }\n          ],\n          \"default\": \"primary\"\n        },\n        {\n          \"key\": \"button2_label\",\n          \"type\": \"text\",\n          \"label\": \"Second button label\",\n          \"default\": \"\"\n        },\n        {\n          \"key\": \"button2_link\",\n          \"type\": \"link\",\n          \"label\": \"Second button link\",\n          \"default\": \"/collections\"\n        },\n        {\n          \"key\": \"button2_style\",\n          \"type\": \"select\",\n          \"label\": \"Second button style\",\n          \"options\": [\n            {\n              \"value\": \"primary\",\n              \"label\": \"Solid\"\n            },\n            {\n              \"value\": \"secondary\",\n              \"label\": \"Outline\"\n            },\n            {\n              \"value\": \"link\",\n              \"label\": \"Link\"\n            }\n          ],\n          \"default\": \"secondary\"\n        },\n        {\n          \"key\": \"text_position\",\n          \"type\": \"select\",\n          \"label\": \"Text position\",\n          \"options\": [\n            {\n              \"value\": \"top-start\",\n              \"label\": \"Top left\"\n            },\n            {\n              \"value\": \"top-center\",\n              \"label\": \"Top center\"\n            },\n            {\n              \"value\": \"top-end\",\n              \"label\": \"Top right\"\n            },\n            {\n              \"value\": \"middle-start\",\n              \"label\": \"Middle left\"\n            },\n            {\n              \"value\": \"middle-center\",\n              \"label\": \"Middle center\"\n            },\n            {\n              \"value\": \"middle-end\",\n              \"label\": \"Middle right\"\n            },\n            {\n              \"value\": \"bottom-start\",\n              \"label\": \"Bottom left\"\n            },\n            {\n              \"value\": \"bottom-center\",\n              \"label\": \"Bottom center\"\n            },\n            {\n              \"value\": \"bottom-end\",\n              \"label\": \"Bottom right\"\n            }\n          ],\n          \"default\": \"middle-center\"\n        },\n        {\n          \"key\": \"text_alignment\",\n          \"type\": \"select\",\n          \"label\": \"Text alignment\",\n          \"options\": [\n            {\n              \"value\": \"start\",\n              \"label\": \"Left\"\n            },\n            {\n              \"value\": \"center\",\n              \"label\": \"Center\"\n            },\n            {\n              \"value\": \"end\",\n              \"label\": \"Right\"\n            }\n          ],\n          \"default\": \"center\"\n        },\n        {\n          \"key\": \"overlay\",\n          \"type\": \"checkbox\",\n          \"label\": \"Darken the image\",\n          \"default\": true\n        },\n        {\n          \"key\": \"overlay_opacity\",\n          \"type\": \"range\",\n          \"label\": \"Overlay opacity\",\n          \"min\": 0,\n          \"max\": 90,\n          \"step\": 5,\n          \"default\": 35,\n          \"unit\": \"%\",\n          \"visible_if\": \"{% if block.settings.overlay != false %}true{% endif %}\"\n        }\n      ]\n    }\n  ],\n  \"max_blocks\": 8,\n  \"presets\": [\n    {\n      \"name\": \"Slideshow\",\n      \"blocks\": [\n        {\n          \"type\": \"slide\",\n          \"settings\": {\n            \"text_position\": \"middle-center\",\n            \"text_alignment\": \"center\"\n          }\n        },\n        {\n          \"type\": \"slide\",\n          \"settings\": {\n            \"text_position\": \"middle-start\",\n            \"text_alignment\": \"start\"\n          }\n        }\n      ]\n    }\n  ]\n}\n{% endschema %}\n","sections/testimonials.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%} Testimonials: customer quotes with a rating, name and an optional product — as a grid or a slider. {%- endcomment -%}\n{%- assign s = section.settings -%}\n{%- assign cn_layout = s.layout | default: 'grid' -%}\n{%- if s.animate != false -%}{%- assign cn_rv = 'cn-reveal' -%}{%- else -%}{%- assign cn_rv = 'cn-reveal is-in is-settled' -%}{%- endif -%}\n<section class=\"cn-sec cn-tst-sec {{ s.color_scheme | default: 'scheme-2' }} cn-pt-{{ s.spacing_top | default: 'default' }} cn-pb-{{ s.spacing_bottom | default: 'default' }}\">\n  <div class=\"cn-container\">\n    {% render 'section-head', eyebrow: s.eyebrow, title: s.heading, text: s.description, align: s.heading_alignment %}\n    <div class=\"cn-tst-wrap cn-tst-wrap--{{ cn_layout }}\"{% if cn_layout == 'slider' %} data-cn-slider{% endif %}>\n      <div class=\"cn-tst cn-tst--{{ cn_layout }} cn-tst--{{ s.card_style | default: 'bordered' }} cn-ta-{{ s.alignment | default: 'start' }} {{ cn_rv }}\" data-cn-stagger\n        style=\"--cn-cols-d:{{ s.columns | default: 3 }};--cn-cols-t:{{ s.columns | default: 3 | at_most: 2 }}\"{% if cn_layout == 'slider' %} data-cn-slider-track{% endif %}>\n        {%- for block in section.blocks -%}\n          {%- assign b = block.settings -%}\n          {%- assign cn_rating = b.rating | default: 0 -%}\n          <figure class=\"cn-tst__card\" {{ block.soooks_attributes }}>\n            {%- if cn_rating > 0 -%}\n              {%- assign cn_pct = cn_rating | times: 20 -%}\n              <p class=\"cn-tst__rating\" aria-label=\"{{ cn_rating }} / 5\"><span class=\"cn-stars\" style=\"--cn-rating:{{ cn_pct }}%\" aria-hidden=\"true\"></span></p>\n            {%- endif -%}\n            {%- if b.quote != blank -%}<blockquote class=\"cn-tst__quote\">{{ b.quote }}</blockquote>{%- endif -%}\n            <figcaption class=\"cn-tst__author\">\n              {%- assign cn_avatar = '' -%}\n              {%- if b.image != blank -%}{%- capture cn_avatar -%}{{ b.image | asset_url }}{%- endcapture -%}{%- endif -%}\n              {%- if cn_avatar != '' -%}<img class=\"cn-tst__avatar\" src=\"{{ cn_avatar }}\" alt=\"\" loading=\"lazy\">{%- endif -%}\n              <span class=\"cn-tst__who\">\n                <span class=\"cn-tst__name\">{% if b.name != blank %}{{ b.name }}{% else %}{{ 'onboarding.customer' | t }}{% endif %}</span>\n                {%- if b.detail != blank -%}<span class=\"cn-tst__detail\">{{ b.detail }}</span>{%- endif -%}\n              </span>\n            </figcaption>\n            {%- if b.product != blank -%}\n              {%- assign cn_p = products_by_slug[b.product] -%}\n              {%- if cn_p and cn_p.missing != true -%}\n                {% resource cn_p %}\n                <a class=\"cn-tst__product\" href=\"/products/{{ cn_p.slug }}\" data-resource-node>\n                  {%- if cn_p.image -%}<img src=\"{{ cn_p.image }}\" alt=\"\" loading=\"lazy\">{%- endif -%}\n                  <span>{{ cn_p.name }}</span>\n                </a>\n                {% endresource %}\n              {%- endif -%}\n            {%- endif -%}\n          </figure>\n        {%- endfor -%}\n      </div>\n      {%- if cn_layout == 'slider' and section.blocks.size > 1 -%}\n        <div class=\"cn-slider-nav\">\n          <button type=\"button\" class=\"cn-slider-nav__btn\" data-cn-slider-prev aria-label=\"{{ 'general.previous' | t }}\"><span class=\"cn-chev cn-chev--prev\" aria-hidden=\"true\"></span></button>\n          <div class=\"cn-slider-nav__dots\" data-cn-slider-dots data-label=\"{{ 'slideshow.go_to' | t }}\"></div>\n          <button type=\"button\" class=\"cn-slider-nav__btn\" data-cn-slider-next aria-label=\"{{ 'general.next' | t }}\"><span class=\"cn-chev cn-chev--next\" aria-hidden=\"true\"></span></button>\n        </div>\n      {%- endif -%}\n    </div>\n  </div>\n</section>\n\n{% schema %}\n{\n  \"name\": \"Testimonials\",\n  \"icon\": \"lucide:message-square-quote\",\n  \"settings\": [\n    {\n      \"key\": \"eyebrow\",\n      \"type\": \"text\",\n      \"label\": \"Subtitle\",\n      \"default\": \"Subtitle\"\n    },\n    {\n      \"key\": \"heading\",\n      \"type\": \"text\",\n      \"label\": \"Heading\",\n      \"default\": \"Title\"\n    },\n    {\n      \"key\": \"description\",\n      \"type\": \"textarea\",\n      \"label\": \"Description\",\n      \"default\": \"\"\n    },\n    {\n      \"key\": \"heading_alignment\",\n      \"type\": \"select\",\n      \"label\": \"Heading alignment\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Left\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        }\n      ],\n      \"default\": \"start\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"layout\",\n      \"type\": \"select\",\n      \"label\": \"Layout\",\n      \"options\": [\n        {\n          \"value\": \"grid\",\n          \"label\": \"Grid\"\n        },\n        {\n          \"value\": \"slider\",\n          \"label\": \"Slider\"\n        }\n      ],\n      \"default\": \"grid\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"columns\",\n      \"type\": \"range\",\n      \"label\": \"Columns on desktop\",\n      \"min\": 1,\n      \"max\": 4,\n      \"step\": 1,\n      \"default\": 3,\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"alignment\",\n      \"type\": \"select\",\n      \"label\": \"Text alignment\",\n      \"options\": [\n        {\n          \"value\": \"start\",\n          \"label\": \"Left\"\n        },\n        {\n          \"value\": \"center\",\n          \"label\": \"Center\"\n        }\n      ],\n      \"default\": \"start\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"card_style\",\n      \"type\": \"select\",\n      \"label\": \"Card style\",\n      \"options\": [\n        {\n          \"value\": \"plain\",\n          \"label\": \"Plain\"\n        },\n        {\n          \"value\": \"bordered\",\n          \"label\": \"Bordered\"\n        },\n        {\n          \"value\": \"filled\",\n          \"label\": \"Filled\"\n        }\n      ],\n      \"default\": \"bordered\",\n      \"group\": \"layout\",\n      \"group_label\": \"Layout\"\n    },\n    {\n      \"key\": \"color_scheme\",\n      \"type\": \"select\",\n      \"label\": \"Color scheme\",\n      \"options\": [\n        {\n          \"value\": \"scheme-1\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"scheme-2\",\n          \"label\": \"Light\"\n        },\n        {\n          \"value\": \"scheme-3\",\n          \"label\": \"Dark\"\n        },\n        {\n          \"value\": \"scheme-4\",\n          \"label\": \"Accent\"\n        },\n        {\n          \"value\": \"scheme-5\",\n          \"label\": \"Muted\"\n        }\n      ],\n      \"default\": \"scheme-2\",\n      \"group\": \"colors\",\n      \"group_label\": \"Colors\"\n    },\n    {\n      \"key\": \"spacing_top\",\n      \"type\": \"select\",\n      \"label\": \"Top spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"spacing_bottom\",\n      \"type\": \"select\",\n      \"label\": \"Bottom spacing\",\n      \"options\": [\n        {\n          \"value\": \"none\",\n          \"label\": \"None\"\n        },\n        {\n          \"value\": \"small\",\n          \"label\": \"Small\"\n        },\n        {\n          \"value\": \"default\",\n          \"label\": \"Default\"\n        },\n        {\n          \"value\": \"large\",\n          \"label\": \"Large\"\n        }\n      ],\n      \"default\": \"default\",\n      \"group\": \"spacing\",\n      \"group_label\": \"Spacing\"\n    },\n    {\n      \"key\": \"animate\",\n      \"type\": \"checkbox\",\n      \"label\": \"Reveal on scroll\",\n      \"default\": true,\n      \"group\": \"animation\",\n      \"group_label\": \"Animation\"\n    }\n  ],\n  \"blocks\": [\n    {\n      \"type\": \"testimonial\",\n      \"name\": \"Testimonial\",\n      \"settings\": [\n        {\n          \"key\": \"quote\",\n          \"type\": \"textarea\",\n          \"label\": \"Quote\",\n          \"default\": \"Customer review\"\n        },\n        {\n          \"key\": \"name\",\n          \"type\": \"text\",\n          \"label\": \"Name\",\n          \"default\": \"Customer name\"\n        },\n        {\n          \"key\": \"detail\",\n          \"type\": \"text\",\n          \"label\": \"Detail\",\n          \"default\": \"\",\n          \"info\": \"A location or a short note.\"\n        },\n        {\n          \"key\": \"image\",\n          \"type\": \"asset\",\n          \"label\": \"Photo\"\n        },\n        {\n          \"key\": \"rating\",\n          \"type\": \"range\",\n          \"label\": \"Rating\",\n          \"min\": 0,\n          \"max\": 5,\n          \"step\": 1,\n          \"default\": 5,\n          \"info\": \"0 hides the stars.\"\n        },\n        {\n          \"key\": \"product\",\n          \"type\": \"product\",\n          \"label\": \"Product\",\n          \"info\": \"Optional: the product the review is about.\"\n        }\n      ]\n    }\n  ],\n  \"max_blocks\": 12,\n  \"presets\": [\n    {\n      \"name\": \"Testimonials\",\n      \"blocks\": [\n        {\n          \"type\": \"testimonial\"\n        },\n        {\n          \"type\": \"testimonial\"\n        },\n        {\n          \"type\": \"testimonial\"\n        }\n      ]\n    }\n  ]\n}\n{% endschema %}\n","snippets/block-head.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Section header built from the platform \"Header\" block: eyebrow, heading, text and a \"View all\" link — the same\n  look as snippets/section-head, but every part is its own block (selectable and reorderable in the editor).\n  Params:\n    head   the header block\n    link   fallback target for \"View all\" (the section's collection / blog)\n{%- endcomment -%}\n{%- assign cn_align = head.settings.alignment | default: 'left' -%}\n{%- if cn_align == 'left' -%}{%- assign cn_align = 'start' -%}{%- endif -%}\n{%- capture cn_text -%}\n  {%- for part in head.blocks -%}\n    {%- case part.type -%}\n      {%- when 'eyebrow' -%}\n        {%- if part.settings.text != blank -%}<p class=\"cn-head__eyebrow\" {{ part.soooks_attributes }}>{{ part.settings.text }}</p>{%- endif -%}\n      {%- when 'heading' -%}\n        {%- if part.settings.text != blank -%}<h2 class=\"cn-head__title cn-head__title--{{ part.settings.heading_size | default: 'md' }}\" {{ part.soooks_attributes }}>{{ part.settings.text }}</h2>{%- endif -%}\n      {%- when 'text' -%}\n        {%- if part.settings.text != blank -%}<div class=\"cn-head__desc\" {{ part.soooks_attributes }}>{{ part.settings.text }}</div>{%- endif -%}\n    {%- endcase -%}\n  {%- endfor -%}\n{%- endcapture -%}\n{%- capture cn_link -%}\n  {%- for part in head.blocks -%}\n    {%- if part.type == 'view-all' -%}\n      <a class=\"cn-head__link\" href=\"{{ part.settings.link | default: link | default: '/collections' }}\" {{ part.soooks_attributes }}>{{ part.settings.label | default: 'View all' }} <span class=\"cn-arrow\" aria-hidden=\"true\">{% render 'icon', name: 'arrow', size: 16 %}</span></a>\n    {%- endif -%}\n  {%- endfor -%}\n{%- endcapture -%}\n<header class=\"cn-head cn-head--{{ cn_align }}\" {{ head.soooks_attributes }}>\n  <div class=\"cn-head__text\">{{ cn_text }}</div>\n  {{ cn_link }}\n</header>\n","snippets/cn-article-card.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Article card for the blog page and \"related articles\". The featured variant is wide (image beside the text).\n  Params: post, s (settings: show_image, image_ratio, show_date, show_author, show_category, show_excerpt,\n  show_tags), featured (bool), eager (bool), heading_level (2 default).\n{%- endcomment -%}\n{%- assign ratio = s.image_ratio | default: 'landscape' -%}\n{%- assign hl = heading_level | default: 2 -%}\n<article class=\"cn-article-card{% if featured %} cn-article-card--featured{% endif %}\">\n  {%- if s.show_image != false -%}\n    <a class=\"cn-article-card__media cn-article-card__media--{{ ratio }}\" href=\"{{ post.url }}\" tabindex=\"-1\" aria-hidden=\"true\">\n      {%- if post.image -%}\n        <img src=\"{{ post.image.url | default: post.image }}\" alt=\"\" loading=\"{% if eager %}eager{% else %}lazy{% endif %}\">\n      {%- else -%}\n        <img src=\"{{ 'ph-image-wide.svg' | asset_url }}\" alt=\"\" loading=\"lazy\">\n      {%- endif -%}\n    </a>\n  {%- endif -%}\n  <div class=\"cn-article-card__body\">\n    {%- assign show_cat = false -%}{%- if s.show_category != false and post.category -%}{%- assign show_cat = true -%}{%- endif -%}\n    {%- assign show_date = false -%}{%- if s.show_date != false and post.published_at -%}{%- assign show_date = true -%}{%- endif -%}\n    {%- assign show_author = false -%}{%- if s.show_author and post.author -%}{%- assign show_author = true -%}{%- endif -%}\n    {%- if show_cat or show_date or show_author -%}\n      <p class=\"cn-article-card__meta\">\n        {%- if show_cat -%}<span class=\"cn-article-card__cat\">{{ post.category }}</span>{%- endif -%}\n        {%- if show_date -%}<time datetime=\"{{ post.published_at }}\">{{ post.published_at | date: '%b %-d, %Y' }}</time>{%- endif -%}\n        {%- if show_author -%}<span>{{ 'blog.by_author' | t | replace: '{author}', post.author }}</span>{%- endif -%}\n      </p>\n    {%- endif -%}\n    <h{{ hl }} class=\"cn-article-card__title\"><a href=\"{{ post.url }}\">{{ post.title | default: 'onboarding.article' | t }}</a></h{{ hl }}>\n    {%- if s.show_excerpt != false and post.excerpt != blank -%}<p class=\"cn-article-card__excerpt\">{{ post.excerpt }}</p>{%- endif -%}\n    {%- if s.show_tags and post.tags.size > 0 -%}\n      <p class=\"cn-article-card__tags\">\n        {%- for tag in post.tags limit: 4 -%}<a class=\"cn-article-card__tag\" href=\"/blog?tag={{ tag | url_encode }}\">#{{ tag }}</a>{%- endfor -%}\n      </p>\n    {%- endif -%}\n    {%- if featured -%}<a class=\"cn-tlink cn-article-card__more\" href=\"{{ post.url }}\">{{ 'blog.read_more' | t }}{% render 'cn-tpl-icon', name: 'arrow-right', size: 16 %}</a>{%- endif -%}\n  </div>\n</article>\n","snippets/cn-facets.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Collection filters, from the platform's facets for the current collection: availability, price range,\n  vendors, option values (color, material…) and the store's collections. One panel: a sidebar on desktop\n  (layout \"sidebar\") or a drawer (layout \"drawer\", and always on phones and tablets).\n  Every change is a plain navigation (query: in_stock, price_min/price_max in cents, vendor=a,b, opt[Name]=x,y).\n  Params: facets, query (page_query), s (section settings), collection, sort_html (the sort control, shown in\n  the drawer on small screens).\n{%- endcomment -%}\n{%- assign picked_vendors = query.vendor | default: '' | split: ',' -%}\n<div class=\"cn-facets\" data-cn-facets id=\"cn-facets-{{ section_id }}\" aria-labelledby=\"cn-facets-title-{{ section_id }}\">\n  <div class=\"cn-facets__scrim\" data-cn-facets-close></div>\n  <div class=\"cn-facets__panel\">\n    <div class=\"cn-facets__head\">\n      <h2 class=\"cn-facets__title\" id=\"cn-facets-title-{{ section_id }}\">{{ 'collections.filters' | t }}</h2>\n      <button type=\"button\" class=\"cn-facets__close\" data-cn-facets-close aria-label=\"{{ 'general.close' | t | escape }}\">{% render 'cn-tpl-icon', name: 'close', size: 20 %}</button>\n    </div>\n    <div class=\"cn-facets__body\">\n      {%- if sort_html != blank -%}\n        <div class=\"cn-facet cn-facet--sort\">\n          <p class=\"cn-facet__title\">{{ 'collections.sort_label' | t }}</p>\n          {{ sort_html }}\n        </div>\n      {%- endif -%}\n\n      {%- if s.show_collection_links and facets.categories.size > 0 -%}\n        <details class=\"cn-facet\" open>\n          <summary class=\"cn-facet__summary\">{{ 'collections.collections' | t }}{% render 'cn-tpl-icon', name: 'chevron-down', size: 16, class: 'cn-facet__chevron' %}</summary>\n          <ul class=\"cn-facet__links\">\n            <li><a class=\"cn-facet__link{% if collection.slug == blank %} is-active{% endif %}\" href=\"/products\"{% if collection.slug == blank %} aria-current=\"page\"{% endif %}>{{ 'collections.all_products' | t }}{% if facets.total %} <span class=\"cn-facet__count\">{{ facets.total }}</span>{% endif %}</a></li>\n            {%- for cat in facets.categories limit: 20 -%}\n              <li><a class=\"cn-facet__link{% if cat.slug == collection.slug %} is-active{% endif %}\" href=\"/collections/{{ cat.slug }}\"{% if cat.slug == collection.slug %} aria-current=\"page\"{% endif %}>{{ cat.name }} <span class=\"cn-facet__count\">{{ cat.count }}</span></a></li>\n            {%- endfor -%}\n          </ul>\n        </details>\n      {%- endif -%}\n\n      {%- if s.show_availability_filter != false -%}\n        <details class=\"cn-facet\" open>\n          <summary class=\"cn-facet__summary\">{{ 'collections.availability' | t }}{% render 'cn-tpl-icon', name: 'chevron-down', size: 16, class: 'cn-facet__chevron' %}</summary>\n          <label class=\"cn-checkrow\">\n            <input type=\"checkbox\" data-cn-filter-instock {% if query.in_stock %}checked{% endif %}>\n            <span class=\"cn-checkrow__box\" aria-hidden=\"true\">{% render 'cn-tpl-icon', name: 'check', size: 14 %}</span>\n            <span class=\"cn-checkrow__label\">{{ 'collections.filter_in_stock' | t }}</span>\n            {%- if facets.in_stock_count != blank -%}<span class=\"cn-facet__count\">{{ facets.in_stock_count }}</span>{%- endif -%}\n          </label>\n        </details>\n      {%- endif -%}\n\n      {%- if s.show_price_filter != false and facets.price and facets.price.max > 0 -%}\n        {%- assign pmin = facets.price.min | divided_by: 100.0 | floor -%}\n        {%- assign pmax = facets.price.max | divided_by: 100.0 | ceil -%}\n        {%- assign pmin_money = facets.price.min | money -%}\n        {%- assign pmax_money = facets.price.max | money -%}\n        <details class=\"cn-facet\" open>\n          <summary class=\"cn-facet__summary\">{{ 'collections.price' | t }}{% render 'cn-tpl-icon', name: 'chevron-down', size: 16, class: 'cn-facet__chevron' %}</summary>\n          <form class=\"cn-price-filter\" data-cn-filter-price novalidate>\n            <div class=\"cn-price-filter__row\">\n              <label class=\"cn-price-filter__field\">\n                <span class=\"cn-price-filter__label\">{{ 'collections.price_min' | t }}</span>\n                <input class=\"cn-input\" type=\"number\" inputmode=\"decimal\" name=\"price_min\" min=\"0\" step=\"1\" placeholder=\"{{ pmin }}\" value=\"{% if query.price_min %}{{ query.price_min | divided_by: 100.0 | floor }}{% endif %}\">\n              </label>\n              <span class=\"cn-price-filter__dash\" aria-hidden=\"true\">–</span>\n              <label class=\"cn-price-filter__field\">\n                <span class=\"cn-price-filter__label\">{{ 'collections.price_max' | t }}</span>\n                <input class=\"cn-input\" type=\"number\" inputmode=\"decimal\" name=\"price_max\" min=\"0\" step=\"1\" placeholder=\"{{ pmax }}\" value=\"{% if query.price_max %}{{ query.price_max | divided_by: 100.0 | ceil }}{% endif %}\">\n              </label>\n            </div>\n            <p class=\"cn-price-filter__hint\">{{ 'collections.price_range' | t | replace: '{min}', pmin_money | replace: '{max}', pmax_money }}</p>\n            <button class=\"cn-btn cn-btn--secondary cn-btn--sm\" type=\"submit\">{{ 'collections.apply' | t }}</button>\n          </form>\n        </details>\n      {%- endif -%}\n\n      {%- if s.show_vendor_filter != false and facets.vendors.size > 1 -%}\n        <details class=\"cn-facet\" open>\n          <summary class=\"cn-facet__summary\">{{ 'collections.brand' | t }}{% render 'cn-tpl-icon', name: 'chevron-down', size: 16, class: 'cn-facet__chevron' %}</summary>\n          <div class=\"cn-facet__list\" data-cn-filter-list=\"vendor\">\n            {%- for v in facets.vendors -%}\n              <label class=\"cn-checkrow\">\n                <input type=\"checkbox\" value=\"{{ v.name | escape }}\" {% if picked_vendors contains v.name %}checked{% endif %}>\n                <span class=\"cn-checkrow__box\" aria-hidden=\"true\">{% render 'cn-tpl-icon', name: 'check', size: 14 %}</span>\n                <span class=\"cn-checkrow__label\">{{ v.name }}</span>\n                <span class=\"cn-facet__count\">{{ v.count }}</span>\n              </label>\n            {%- endfor -%}\n          </div>\n        </details>\n      {%- endif -%}\n\n      {%- if s.show_option_filters != false -%}\n        {%- for ofacet in facets.options -%}\n          {%- if ofacet.values.size == 0 -%}{%- continue -%}{%- endif -%}\n          {%- assign qkey = 'opt[' | append: ofacet.name | append: ']' -%}\n          {%- assign picked = query[qkey] | default: '' | split: ',' -%}\n          {%- assign fname = ofacet.name | downcase | strip -%}\n          {%- assign is_color = false -%}\n          {%- if fname == 'color' or fname == 'colour' or fname == 'shade' -%}{%- assign is_color = true -%}{%- endif -%}\n          <details class=\"cn-facet\" open>\n            <summary class=\"cn-facet__summary\">{{ ofacet.name }}{% render 'cn-tpl-icon', name: 'chevron-down', size: 16, class: 'cn-facet__chevron' %}</summary>\n            <div class=\"cn-facet__list{% if is_color %} cn-facet__list--swatches{% endif %}\" data-cn-filter-list=\"{{ qkey | escape }}\">\n              {%- for entry in ofacet.values -%}\n                {%- assign sw_bg = '' -%}\n                {%- if is_color -%}{%- capture sw_bg -%}{% render 'swatch-color', value: entry.value %}{%- endcapture -%}{%- endif -%}\n                <label class=\"cn-checkrow{% if sw_bg != '' %} cn-checkrow--swatch{% endif %}\">\n                  <input type=\"checkbox\" value=\"{{ entry.value | escape }}\" {% if picked contains entry.value %}checked{% endif %}>\n                  {%- if sw_bg != '' -%}\n                    <span class=\"cn-checkrow__swatch\" style=\"--cn-swatch: {{ sw_bg }}\" aria-hidden=\"true\"></span>\n                  {%- else -%}\n                    <span class=\"cn-checkrow__box\" aria-hidden=\"true\">{% render 'cn-tpl-icon', name: 'check', size: 14 %}</span>\n                  {%- endif -%}\n                  <span class=\"cn-checkrow__label\">{{ entry.value }}</span>\n                  <span class=\"cn-facet__count\">{{ entry.count }}</span>\n                </label>\n              {%- endfor -%}\n            </div>\n          </details>\n        {%- endfor -%}\n      {%- endif -%}\n    </div>\n    <div class=\"cn-facets__foot\">\n      <button type=\"button\" class=\"cn-btn cn-btn--secondary\" data-cn-filters-clear>{{ 'collections.clear_all' | t }}</button>\n      <button type=\"button\" class=\"cn-btn\" data-cn-facets-close>{{ 'collections.show_results' | t | replace: '{count}', total }}</button>\n    </div>\n  </div>\n</div>\n","snippets/cn-tpl-icon.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Small line icons for the page templates (product, collection, cart, search, blog).\n  Params: name, size (px, default 18), class. Direction-aware icons carry cn-ico--flip and mirror in RTL.\n{%- endcomment -%}\n{%- assign sz = size | default: 18 -%}\n{%- assign flip = '' -%}\n{%- case name -%}\n  {%- when 'chevron-left', 'chevron-right', 'arrow-left', 'arrow-right' -%}{%- assign flip = ' cn-ico--flip' -%}\n{%- endcase -%}\n<svg class=\"cn-ico{{ flip }} {{ class }}\" width=\"{{ sz }}\" height=\"{{ sz }}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">\n  {%- case name -%}\n    {%- when 'chevron-left' -%}<path d=\"m15 18-6-6 6-6\"/>\n    {%- when 'chevron-right' -%}<path d=\"m9 18 6-6-6-6\"/>\n    {%- when 'chevron-down' -%}<path d=\"m6 9 6 6 6-6\"/>\n    {%- when 'arrow-left' -%}<path d=\"M19 12H5m6-6-6 6 6 6\"/>\n    {%- when 'arrow-right' -%}<path d=\"M5 12h14m-6-6 6 6-6 6\"/>\n    {%- when 'close' -%}<path d=\"M18 6 6 18M6 6l12 12\"/>\n    {%- when 'plus' -%}<path d=\"M12 5v14M5 12h14\"/>\n    {%- when 'minus' -%}<path d=\"M5 12h14\"/>\n    {%- when 'check' -%}<path d=\"m5 13 4 4L19 7\"/>\n    {%- when 'zoom' -%}<circle cx=\"11\" cy=\"11\" r=\"7\"/><path d=\"m20 20-3.5-3.5M11 8v6M8 11h6\"/>\n    {%- when 'filter' -%}<path d=\"M4 6h16M7 12h10M10 18h4\"/>\n    {%- when 'share' -%}<circle cx=\"18\" cy=\"5\" r=\"2.5\"/><circle cx=\"6\" cy=\"12\" r=\"2.5\"/><circle cx=\"18\" cy=\"19\" r=\"2.5\"/><path d=\"m8.2 10.8 7.6-4.4m-7.6 6.8 7.6 4.4\"/>\n    {%- when 'link' -%}<path d=\"M10 13a5 5 0 0 0 7.5.5l3-3a5 5 0 0 0-7-7l-1.7 1.7\"/><path d=\"M14 11a5 5 0 0 0-7.5-.5l-3 3a5 5 0 0 0 7 7l1.7-1.7\"/>\n    {%- when 'truck' -%}<path d=\"M3 6h11v9H3zM14 9h4l3 3v3h-7\"/><circle cx=\"7\" cy=\"17.5\" r=\"1.8\"/><circle cx=\"17\" cy=\"17.5\" r=\"1.8\"/>\n    {%- when 'return' -%}<path d=\"M9 14 4 9l5-5\"/><path d=\"M4 9h10.5a5.5 5.5 0 0 1 0 11H11\"/>\n    {%- when 'info' -%}<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5m0-8h.01\"/>\n    {%- when 'leaf' -%}<path d=\"M5 19c0-8 5-13 14-14 0 9-5 14-13 14\"/><path d=\"M5 19 13 11\"/>\n    {%- when 'heart' -%}<path d=\"M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10Z\"/>\n    {%- when 'shield' -%}<path d=\"M12 3 5 6v6c0 4.5 3 7.5 7 9 4-1.5 7-4.5 7-9V6z\"/><path d=\"m9 12 2 2 4-4\"/>\n    {%- when 'tag' -%}<path d=\"M3 12V4h8l10 10-8 8z\"/><circle cx=\"7.5\" cy=\"8.5\" r=\"1.3\"/>\n    {%- when 'search' -%}<circle cx=\"11\" cy=\"11\" r=\"7\"/><path d=\"m20 20-3.5-3.5\"/>\n    {%- when 'box' -%}<path d=\"m12 3 8 4.5v9L12 21l-8-4.5v-9z\"/><path d=\"m4 7.5 8 4.5 8-4.5M12 12v9\"/>\n    {%- when 'grid' -%}<rect x=\"4\" y=\"4\" width=\"7\" height=\"7\" rx=\"1.5\"/><rect x=\"13\" y=\"4\" width=\"7\" height=\"7\" rx=\"1.5\"/><rect x=\"4\" y=\"13\" width=\"7\" height=\"7\" rx=\"1.5\"/><rect x=\"13\" y=\"13\" width=\"7\" height=\"7\" rx=\"1.5\"/>\n    {%- when 'dot' -%}<circle cx=\"12\" cy=\"12\" r=\"4\" fill=\"currentColor\" stroke=\"none\"/>\n    {%- else -%}<circle cx=\"12\" cy=\"12\" r=\"3\"/>\n  {%- endcase -%}\n</svg>\n","snippets/icon.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Inline line icons (24 × 24 grid, 1.7 stroke). Params: name, size (px, default 20), class (extra classes).\n  Directional icons (arrow, arrow-left, chevron-left/right) carry .cn-icon--flip and mirror in right-to-left.\n  Brand marks (facebook, instagram, tiktok, pinterest, x, youtube) are filled.\n  The header's \"Bold\" icon style thickens strokes through CSS (--cn-icon-stroke).\n{%- endcomment -%}\n{%- assign sz = size | default: 20 -%}\n{%- capture open -%}<svg class=\"cn-icon cn-icon--{{ name }}{% if name == 'arrow' or name == 'arrow-left' or name == 'chevron-left' or name == 'chevron-right' %} cn-icon--flip{% endif %}{% if class %} {{ class }}{% endif %}\" width=\"{{ sz }}\" height=\"{{ sz }}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">{%- endcapture -%}\n{%- capture open_fill -%}<svg class=\"cn-icon cn-icon--{{ name }}{% if class %} {{ class }}{% endif %}\" width=\"{{ sz }}\" height=\"{{ sz }}\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">{%- endcapture -%}\n{%- case name -%}\n{%- when 'search' -%}{{ open }}<circle cx=\"11\" cy=\"11\" r=\"7\"/><path d=\"m20 20-3.8-3.8\"/></svg>\n{%- when 'user' -%}{{ open }}<circle cx=\"12\" cy=\"8\" r=\"4\"/><path d=\"M4 21c1.5-3.6 4.5-5.2 8-5.2s6.5 1.6 8 5.2\"/></svg>\n{%- when 'bag', 'basket', 'cart' -%}{{ open }}<path d=\"M5 8h14l-1 12.5H6L5 8Z\"/><path d=\"M9 8V6.5a3 3 0 0 1 6 0V8\"/></svg>\n{%- when 'menu' -%}{{ open }}<path d=\"M4 7h16M4 12h16M4 17h16\"/></svg>\n{%- when 'close' -%}{{ open }}<path d=\"m6 6 12 12M18 6 6 18\"/></svg>\n{%- when 'chevron-down' -%}{{ open }}<path d=\"m6 9 6 6 6-6\"/></svg>\n{%- when 'chevron-up' -%}{{ open }}<path d=\"m6 15 6-6 6 6\"/></svg>\n{%- when 'chevron-left' -%}{{ open }}<path d=\"m15 6-6 6 6 6\"/></svg>\n{%- when 'chevron-right' -%}{{ open }}<path d=\"m9 6 6 6-6 6\"/></svg>\n{%- when 'arrow' -%}{{ open }}<path d=\"M5 12h14m-6-6 6 6-6 6\"/></svg>\n{%- when 'arrow-left' -%}{{ open }}<path d=\"M19 12H5m6-6-6 6 6 6\"/></svg>\n{%- when 'plus' -%}{{ open }}<path d=\"M12 5v14M5 12h14\"/></svg>\n{%- when 'minus' -%}{{ open }}<path d=\"M5 12h14\"/></svg>\n{%- when 'check' -%}{{ open }}<path d=\"m5 12.5 4.5 4.5L19 7.5\"/></svg>\n{%- when 'star' -%}{{ open_fill }}<path d=\"m12 3 2.7 5.8 6.3.7-4.7 4.3 1.3 6.2L12 16.9 6.4 20l1.3-6.2L3 9.5l6.3-.7L12 3Z\"/></svg>\n{%- when 'truck' -%}{{ open }}<path d=\"M2.5 6.5h11v10h-11zM13.5 10h4l3 3.2v3.3h-7\"/><circle cx=\"6.5\" cy=\"17.5\" r=\"1.8\"/><circle cx=\"17\" cy=\"17.5\" r=\"1.8\"/></svg>\n{%- when 'return' -%}{{ open }}<path d=\"M9 14 4 9l5-5\"/><path d=\"M4 9h10.5a5.5 5.5 0 0 1 0 11H11\"/></svg>\n{%- when 'lock' -%}{{ open }}<rect x=\"5\" y=\"11\" width=\"14\" height=\"9.5\" rx=\"2\"/><path d=\"M8 11V8a4 4 0 0 1 8 0v3\"/></svg>\n{%- when 'share' -%}{{ open }}<circle cx=\"18\" cy=\"5.5\" r=\"2.5\"/><circle cx=\"6\" cy=\"12\" r=\"2.5\"/><circle cx=\"18\" cy=\"18.5\" r=\"2.5\"/><path d=\"m8.2 10.8 7.6-4.1M8.2 13.2l7.6 4.1\"/></svg>\n{%- when 'filter' -%}{{ open }}<path d=\"M4 7h10M18 7h2M4 17h4M12 17h8\"/><circle cx=\"16\" cy=\"7\" r=\"2\"/><circle cx=\"10\" cy=\"17\" r=\"2\"/></svg>\n{%- when 'zoom' -%}{{ open }}<circle cx=\"11\" cy=\"11\" r=\"7\"/><path d=\"m20 20-3.8-3.8M11 8v6M8 11h6\"/></svg>\n{%- when 'play' -%}{{ open_fill }}<path d=\"M8 5.5v13a.8.8 0 0 0 1.2.7l10.4-6.5a.8.8 0 0 0 0-1.4L9.2 4.8A.8.8 0 0 0 8 5.5Z\"/></svg>\n{%- when 'mail' -%}{{ open }}<rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\"/><path d=\"m4 7 8 6 8-6\"/></svg>\n{%- when 'phone' -%}{{ open }}<path d=\"M5 4h3.5l1.5 4-2 1.5a11 11 0 0 0 6.5 6.5l1.5-2 4 1.5V19a2 2 0 0 1-2 2A16 16 0 0 1 3 6a2 2 0 0 1 2-2Z\"/></svg>\n{%- when 'pin' -%}{{ open }}<path d=\"M12 21s-6.5-6.2-6.5-11a6.5 6.5 0 0 1 13 0c0 4.8-6.5 11-6.5 11Z\"/><circle cx=\"12\" cy=\"10\" r=\"2.3\"/></svg>\n{%- when 'gift' -%}{{ open }}<rect x=\"3.5\" y=\"8\" width=\"17\" height=\"4\" rx=\"1\"/><path d=\"M5 12v8.5h14V12M12 8v12.5M12 8S10.5 3.5 8 4.2C6 4.8 7 8 12 8Zm0 0s1.5-4.5 4-3.8C18 4.8 17 8 12 8Z\"/></svg>\n{%- when 'shield' -%}{{ open }}<path d=\"M12 3 4.5 6v5.5c0 4.6 3.2 8.3 7.5 9.5 4.3-1.2 7.5-4.9 7.5-9.5V6L12 3Z\"/><path d=\"m9 12 2 2 4-4\"/></svg>\n{%- when 'tag' -%}{{ open }}<path d=\"M3.5 12.5V4.5a1 1 0 0 1 1-1h8l8 8-9 9-8-8Z\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/></svg>\n{%- when 'clock' -%}{{ open }}<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 7.5V12l3 2\"/></svg>\n{%- when 'chat' -%}{{ open }}<path d=\"M4 5.5h16v10H9l-5 4v-14Z\"/></svg>\n{%- when 'globe' -%}{{ open }}<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M3 12h18M12 3c2.5 2.6 3.8 5.7 3.8 9S14.5 18.4 12 21c-2.5-2.6-3.8-5.7-3.8-9S9.5 5.6 12 3Z\"/></svg>\n{%- when 'info', 'note' -%}{{ open }}<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5m0-8h.01\"/></svg>\n{%- when 'alert' -%}{{ open }}<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 7.5V13m0 3.5h.01\"/></svg>\n{%- when 'leaf' -%}{{ open }}<path d=\"M5 19C5 9 11 4 20 4c0 9-5 15-15 15Z\"/><path d=\"M5 19c3-5 7-9 11-11\"/></svg>\n{%- when 'sun' -%}{{ open }}<circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2m0 16v2M2 12h2m16 0h2M4.9 4.9l1.4 1.4m11.4 11.4 1.4 1.4M19.1 4.9l-1.4 1.4M6.3 17.7l-1.4 1.4\"/></svg>\n{%- when 'drop' -%}{{ open }}<path d=\"M12 3s6 6.5 6 11a6 6 0 0 1-12 0c0-4.5 6-11 6-11Z\"/></svg>\n{%- when 'facebook' -%}{{ open_fill }}<path d=\"M13.5 21v-7.5h2.6l.4-3h-3V8.6c0-.9.3-1.5 1.5-1.5h1.6V4.4a21 21 0 0 0-2.3-.1c-2.3 0-3.9 1.4-3.9 4v2.2H7.8v3h2.6V21h3.1Z\"/></svg>\n{%- when 'instagram' -%}{{ open }}<rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"4.5\"/><circle cx=\"12\" cy=\"12\" r=\"3.8\"/><circle cx=\"17.2\" cy=\"6.8\" r=\".6\" fill=\"currentColor\"/></svg>\n{%- when 'tiktok' -%}{{ open_fill }}<path d=\"M16.6 3h-3.1v12.2a2.7 2.7 0 1 1-2.7-2.7c.3 0 .6 0 .8.1V9.4a5.8 5.8 0 1 0 5 5.8V9a7.4 7.4 0 0 0 4.4 1.4V7.3A4.4 4.4 0 0 1 16.6 3Z\"/></svg>\n{%- when 'pinterest' -%}{{ open_fill }}<path d=\"M12 2.5a9.5 9.5 0 0 0-3.5 18.3c-.1-.8-.2-2 0-2.9l1.2-5s-.3-.6-.3-1.5c0-1.4.8-2.5 1.8-2.5.9 0 1.3.7 1.3 1.4 0 .9-.6 2.2-.9 3.4-.2 1 .5 1.9 1.6 1.9 1.9 0 3.3-2 3.3-4.9 0-2.6-1.8-4.4-4.5-4.4a4.6 4.6 0 0 0-4.8 4.6c0 .9.3 1.9.8 2.4.1.1.1.2.1.3l-.3 1.2c0 .2-.2.3-.4.2-1.4-.6-2.2-2.6-2.2-4.2 0-3.4 2.5-6.6 7.2-6.6 3.8 0 6.7 2.7 6.7 6.3 0 3.8-2.4 6.8-5.7 6.8-1.1 0-2.2-.6-2.5-1.3l-.7 2.6c-.3 1-.9 2.2-1.4 2.9A9.5 9.5 0 1 0 12 2.5Z\"/></svg>\n{%- when 'x' -%}{{ open_fill }}<path d=\"M17.3 3.5h2.9l-6.4 7.3 7.5 9.7h-5.9l-4.6-6-5.3 6H2.6l6.8-7.8L2.2 3.5h6l4.2 5.5 4.9-5.5Zm-1 15.3h1.6L7.8 5.1H6.1l10.2 13.7Z\"/></svg>\n{%- when 'youtube' -%}{{ open_fill }}<path d=\"M21.6 7.2a2.5 2.5 0 0 0-1.8-1.8C18.2 5 12 5 12 5s-6.2 0-7.8.4A2.5 2.5 0 0 0 2.4 7.2 26 26 0 0 0 2 12a26 26 0 0 0 .4 4.8 2.5 2.5 0 0 0 1.8 1.8C5.8 19 12 19 12 19s6.2 0 7.8-.4a2.5 2.5 0 0 0 1.8-1.8A26 26 0 0 0 22 12a26 26 0 0 0-.4-4.8ZM10 15V9l5.2 3L10 15Z\"/></svg>\n{%- endcase -%}\n","snippets/image.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Image in an aspect-ratio box, with a placeholder when nothing is set.\n  Params:\n    src          asset id, theme asset name or URL (blank → placeholder)\n    url          a ready image URL (a product, collection or article picture) used when src is blank\n    mobile_src   optional different picture under 768px\n    alt          alt text\n    ratio        'portrait' (4:5) | 'square' | 'landscape' (4:3) | 'wide' (16:9) | 'natural' (default) | 'fill'\n                 ('fill' takes the parent's height; the parent sets it). `aspect` is accepted as an alias.\n    fit          'cover' (default) | 'contain'\n    position     CSS object-position (focal point), e.g. 'center top'\n    eager        true for the first image on the page (hero, first slide)\n    placeholder  theme asset shown when src is blank (default ph-image.svg)\n    class        extra classes on the wrapper\n{%- endcomment -%}\n{%- assign cn_src = '' -%}\n{%- if src != blank -%}\n  {%- capture cn_src -%}{{ src | asset_url }}{%- endcapture -%}\n  {%- if cn_src contains '[object' -%}{%- assign cn_src = '' -%}{%- endif -%}\n{%- endif -%}\n{%- if cn_src == '' and url != blank -%}\n  {%- assign cn_src = url.url | default: url -%}\n  {%- if cn_src contains '[object' -%}{%- assign cn_src = '' -%}{%- endif -%}\n{%- endif -%}\n{%- assign cn_msrc = '' -%}\n{%- if mobile_src != blank -%}\n  {%- capture cn_msrc -%}{{ mobile_src | asset_url }}{%- endcapture -%}\n  {%- if cn_msrc contains '[object' -%}{%- assign cn_msrc = '' -%}{%- endif -%}\n{%- endif -%}\n{%- if cn_src == '' and cn_msrc != '' -%}{%- assign cn_src = cn_msrc -%}{%- assign cn_msrc = '' -%}{%- endif -%}\n{%- assign cn_ratio = ratio | default: aspect | default: 'natural' -%}\n<div class=\"cn-media cn-media--{{ cn_ratio }} cn-media--{{ fit | default: 'cover' }}{% if cn_src == '' %} cn-media--ph{% endif %} {{ class }}\"{% if position != blank %} style=\"--cn-focal:{{ position }}\"{% endif %}>\n  {%- if cn_src != '' -%}\n    {%- if cn_msrc != '' -%}\n      <picture>\n        <source media=\"(max-width: 767px)\" srcset=\"{{ cn_msrc }}\">\n        <img src=\"{{ cn_src }}\" alt=\"{{ alt | escape }}\" loading=\"{% if eager %}eager{% else %}lazy{% endif %}\"{% if eager %} fetchpriority=\"high\"{% endif %}>\n      </picture>\n    {%- else -%}\n      <img src=\"{{ cn_src }}\" alt=\"{{ alt | escape }}\" loading=\"{% if eager %}eager{% else %}lazy{% endif %}\"{% if eager %} fetchpriority=\"high\"{% endif %}>\n    {%- endif -%}\n  {%- else -%}\n    <img src=\"{{ placeholder | default: 'ph-image.svg' | asset_url }}\" alt=\"\" loading=\"{% if eager %}eager{% else %}lazy{% endif %}\">\n  {%- endif -%}\n</div>\n","snippets/language-picker.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Language picker: the store's published languages (Settings → Languages), each a link to this same page in that\n  language (/localization switches and comes back to request.path). Drawn only when the store publishes two\n  languages or more — a one-language store (and the theme editor's preview of one) shows nothing at all.\n  A <details> list: opens and closes without script; corner-core.js closes it on an outside click and on Esc.\n  Params:\n    style   'dropdown' (default: a small globe + code button with a floating list) or 'inline' (a full-width row\n            whose list opens in place — the mobile menu)\n    up      true: the floating list opens upward (the footer)\n    class   extra classes on the wrapper\n{%- endcomment -%}\n{%- if localization.available_languages.size > 1 -%}\n  {%- assign cn_lang_style = style | default: 'dropdown' -%}\n  {%- assign cn_lang_current = localization.language -%}\n  {%- assign cn_lang_label = 'general.language' | t -%}\n  {%- assign cn_lang_switch = '/localization?locale_code=' -%}\n  {%- assign cn_lang_back = request.path | default: '/' | url_encode -%}\n  <details class=\"cn-lang cn-lang--{{ cn_lang_style }}{% if up %} cn-lang--up{% endif %}{% if class %} {{ class }}{% endif %}\" data-cn-lang>\n    <summary class=\"cn-lang__toggle\" aria-label=\"{{ cn_lang_label | escape }}: {{ cn_lang_current.endonym_name | escape }}\">\n      {%- if cn_lang_style == 'inline' -%}\n        {% render 'icon', name: 'globe', size: 20 %}\n        <span class=\"cn-lang__label\">{{ cn_lang_label }}</span>\n        <span class=\"cn-lang__current\">{{ cn_lang_current.endonym_name }}</span>\n      {%- else -%}\n        {% render 'icon', name: 'globe', size: 18 %}\n        <span class=\"cn-lang__code\">{{ cn_lang_current.iso_code | upcase }}</span>\n      {%- endif -%}\n      {% render 'icon', name: 'chevron-down', size: 14, class: 'cn-lang__caret' %}\n    </summary>\n    <nav class=\"cn-lang__menu\" aria-label=\"{{ cn_lang_label | escape }}\">\n      <ul class=\"cn-lang__list\" role=\"list\">\n        {%- for language in localization.available_languages -%}\n          <li>\n            <a class=\"cn-lang__link\" href=\"{{ cn_lang_switch }}{{ language.iso_code }}&amp;return_to={{ cn_lang_back }}\" hreflang=\"{{ language.iso_code }}\" lang=\"{{ language.iso_code }}\"{% if language.iso_code == cn_lang_current.iso_code %} aria-current=\"true\"{% endif %}>\n              <span>{{ language.endonym_name }}</span>\n              {%- if language.iso_code == cn_lang_current.iso_code -%}{% render 'icon', name: 'check', size: 16 %}{%- endif -%}\n            </a>\n          </li>\n        {%- endfor -%}\n      </ul>\n    </nav>\n  </details>\n{%- endif -%}\n","snippets/pagination.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Numbered pagination: previous / 1 … 4 5 6 … 12 / next. Plain links, so every page has its own URL.\n  Params: paginate (current_page, last_page), base_query (\"sort=x&\" — kept on every link).\n{%- endcomment -%}\n{%- if paginate and paginate.last_page > 1 -%}\n  {%- assign cur = paginate.current_page | default: 1 -%}\n  {%- assign last = paginate.last_page -%}\n  {%- assign win_start = cur | minus: 1 -%}\n  {%- assign win_end = cur | plus: 1 -%}\n  <nav class=\"cn-pagination\" aria-label=\"{{ 'general.pagination' | t | escape }}\">\n    {%- if cur > 1 -%}\n      <a class=\"cn-pagination__step\" href=\"?{{ base_query }}page={{ cur | minus: 1 }}\" rel=\"prev\" aria-label=\"{{ 'collections.load_prev' | t | escape }}\">{% render 'cn-tpl-icon', name: 'chevron-left', size: 16 %}<span class=\"cn-pagination__step-label\">{{ 'collections.load_prev' | t }}</span></a>\n    {%- else -%}\n      <span class=\"cn-pagination__step is-disabled\" aria-hidden=\"true\">{% render 'cn-tpl-icon', name: 'chevron-left', size: 16 %}<span class=\"cn-pagination__step-label\">{{ 'collections.load_prev' | t }}</span></span>\n    {%- endif -%}\n    <ol class=\"cn-pagination__pages\">\n      {%- assign gap_shown_before = false -%}\n      {%- assign gap_shown_after = false -%}\n      {%- for n in (1..last) -%}\n        {%- if n == 1 or n == last or n >= win_start and n <= win_end -%}\n          <li>\n            {%- if n == cur -%}\n              <span class=\"cn-pagination__page is-current\" aria-current=\"page\">{{ n }}</span>\n            {%- else -%}\n              <a class=\"cn-pagination__page\" href=\"?{{ base_query }}page={{ n }}\">{{ n }}</a>\n            {%- endif -%}\n          </li>\n        {%- elsif n < cur and gap_shown_before == false -%}\n          {%- assign gap_shown_before = true -%}\n          <li class=\"cn-pagination__gap\" aria-hidden=\"true\">…</li>\n        {%- elsif n > cur and gap_shown_after == false -%}\n          {%- assign gap_shown_after = true -%}\n          <li class=\"cn-pagination__gap\" aria-hidden=\"true\">…</li>\n        {%- endif -%}\n      {%- endfor -%}\n    </ol>\n    {%- if cur < last -%}\n      <a class=\"cn-pagination__step\" href=\"?{{ base_query }}page={{ cur | plus: 1 }}\" rel=\"next\" aria-label=\"{{ 'collections.load_next' | t | escape }}\"><span class=\"cn-pagination__step-label\">{{ 'collections.load_next' | t }}</span>{% render 'cn-tpl-icon', name: 'chevron-right', size: 16 %}</a>\n    {%- else -%}\n      <span class=\"cn-pagination__step is-disabled\" aria-hidden=\"true\"><span class=\"cn-pagination__step-label\">{{ 'collections.load_next' | t }}</span>{% render 'cn-tpl-icon', name: 'chevron-right', size: 16 %}</span>\n    {%- endif -%}\n  </nav>\n{%- endif -%}\n","snippets/price.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Product price line.\n  Params:\n    product       the product drop\n    class         extra classes on the wrapper\n    show_compare  false hides the compare-at price (default shown)\n    price_size    'sm' | 'md' (default) | 'lg'\n  Hooks kept for live updates: data-cn-price / data-cn-compare (variant pickers rewrite them).\n{%- endcomment -%}\n{%- assign cn_on_sale = false -%}\n{%- if product.compare_at_price and product.compare_at_price > product.price -%}{%- assign cn_on_sale = true -%}{%- endif -%}\n<span class=\"cn-price cn-price--{{ price_size | default: 'md' }}{% if cn_on_sale %} cn-price--sale{% endif %} {{ class }}\">\n  {%- if product.price_varies -%}\n    <span class=\"cn-price__label\">{{ 'products.from' | t }}</span>\n  {%- endif -%}\n  <span class=\"cn-price__amount\" data-cn-price>{{ product.price | money }}</span>\n  {%- if cn_on_sale and show_compare != false -%}\n    <s class=\"cn-price__compare\" data-cn-compare>{{ product.compare_at_price | money }}</s>\n  {%- endif -%}\n</span>\n","snippets/product-card.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Corner product card — the one card every grid uses (product grid, collection, search, related products).\n\n  Usage:\n    {% render 'product-card', product: p, card: section.settings, index: forloop.index0 %}\n    {% render 'product-card', placeholder: true, card: section.settings, index: forloop.index0 %}\n\n  Params:\n    product      the product drop (a picked product that no longer exists → editor-only \"unavailable\" card)\n    placeholder  true → onboarding card (\"Product title\", sample price, ph-product-N.svg art)\n    index        position in the grid (picks the placeholder art; nothing else)\n    eager        true loads the picture eagerly (default lazy)\n    heading_tag  tag for the product name, default h3\n    card         a hash of card options — pass the section's settings; any key that is missing uses its default:\n      show_vendor      false   vendor above the name\n      show_price       true    price line\n      show_compare     true    compare-at price when on sale\n      show_sale_badge  true    \"Sale\" badge when on sale\n      show_badges      true    \"New\" / \"Sold out\" badges\n      show_rating      true    star rating — only when product.metafields.reviews.rating exists\n      show_quick_add   true    add-to-cart button (products with options get \"Choose options\" → product page)\n      show_swatches    true    colour dots for the first colour-like option (snippets/swatch-color)\n      second_image     true    show the second photo on hover\n      image_ratio      'theme' (Theme settings → Cards ratio) | 'portrait' (4:5) | 'square' | 'landscape' (4:3) | 'natural'\n      image_fit        'cover' | 'contain'\n      text_alignment   'start' | 'center' | 'end'\n\n  Block mode (product grid): pass `card_block` — the section's \"Product card\" block. The card then shows the\n  block's parts in the merchant's order (Image, Badge, Vendor, Product title, Price, Rating, Add to cart), each\n  carrying its own block identity, and takes ratio / hover / alignment from the block. `card` still supplies the\n  options that aren't parts (image_fit, show_swatches).\n\n  Hooks: [data-cn-quickadd] (corner-core.js quick add: data-product-id, data-slug, data-has-variants, data-variant-id),\n  [data-cn-swatch] / [data-cn-card-img] (corner-sections.js swaps the picture and the links to the variant).\n{%- endcomment -%}\n{%- if card_block -%}\n  {%- comment -%} ===== Block mode: the card definition's parts, one product per card ===== {%- endcomment -%}\n  {%- assign cb = card_block.settings -%}\n  {%- assign cn_img_part = nil -%}{%- assign cn_badge_part = nil -%}\n  {%- for part in card_block.blocks -%}\n    {%- if part.type == 'card-image' -%}{%- assign cn_img_part = part -%}{%- endif -%}\n    {%- if part.type == 'card-badge' -%}{%- assign cn_badge_part = part -%}{%- endif -%}\n  {%- endfor -%}\n  {%- assign cn_ratio = cn_img_part.settings.ratio | default: card.image_ratio | default: 'theme' -%}\n  {%- assign cn_fit = card.image_fit | default: 'cover' -%}\n  {%- assign cn_align = cb.text_alignment | default: 'left' -%}\n  {%- if cn_align == 'left' -%}{%- assign cn_align = 'start' -%}{%- endif -%}\n  {%- assign cn_tag = heading_tag | default: 'h3' -%}\n  {%- assign cn_ph = index | default: 0 | modulo: 4 | plus: 1 -%}\n  {%- if placeholder -%}\n    {%- comment -%} No product yet: the same parts with the standard placeholder copy. {%- endcomment -%}\n    <div class=\"cn-pcard cn-pcard--{{ cn_align }} cn-pcard--hover-{{ cb.hover | default: 'zoom' }} cn-pcard--ph\" {{ card_block.soooks_attributes }}>\n      {%- for part in card_block.blocks -%}\n        {%- case part.type -%}\n          {%- when 'card-image' -%}\n            <span class=\"cn-pcard__media cn-ratio cn-ratio--{{ cn_ratio }} cn-fit--{{ cn_fit }}\" {{ part.soooks_attributes }}><img class=\"cn-pcard__img\" src=\"{{ 'ph-product-PCN.svg' | replace: 'PCN', cn_ph | asset_url }}\" alt=\"\" loading=\"lazy\"></span>\n          {%- when 'card-title' -%}\n            <{{ cn_tag }} class=\"cn-pcard__title cn-pcard__title--{{ part.settings.title_size | default: 'md' }}\" {{ part.soooks_attributes }}>{{ 'onboarding.product' | t }}</{{ cn_tag }}>\n          {%- when 'card-price' -%}\n            <span class=\"cn-price cn-price--md cn-pcard__price\" {{ part.soooks_attributes }}><span class=\"cn-price__amount\">{{ 4500 | money }}</span></span>\n        {%- endcase -%}\n      {%- endfor -%}\n    </div>\n  {%- elsif product.missing -%}\n    {%- comment -%} A picked product that's gone (editor only): \"unavailable\", in the card's own shape. {%- endcomment -%}\n    {% resource product %}\n    <div class=\"cn-pcard cn-pcard--{{ cn_align }} cn-pcard--missing\" {{ card_block.soooks_attributes }}>\n      {%- for part in card_block.blocks -%}\n        {%- case part.type -%}\n          {%- when 'card-image' -%}\n            <span class=\"cn-pcard__media cn-ratio cn-ratio--{{ cn_ratio }}\" {{ part.soooks_attributes }}><span class=\"cn-pcard__missing\">{{ 'editor.product_unavailable' | t }}</span></span>\n          {%- when 'card-title' -%}\n            <{{ cn_tag }} class=\"cn-pcard__title\" {{ part.soooks_attributes }}>{{ 'editor.select_another' | t }}</{{ cn_tag }}>\n        {%- endcase -%}\n      {%- endfor -%}\n    </div>\n    {% endresource %}\n  {%- elsif product -%}\n    {%- assign cn_url = product.url | default: '' -%}\n    {%- if cn_url == '' -%}{%- assign cn_url = '/products/' | append: product.slug -%}{%- endif -%}\n    {%- assign cn_sold_out = false -%}\n    {%- if product.available == false or product.in_stock == false -%}{%- assign cn_sold_out = true -%}{%- endif -%}\n    {%- assign cn_on_sale = false -%}\n    {%- if product.compare_at_price and product.compare_at_price > product.price -%}{%- assign cn_on_sale = true -%}{%- elsif product.badges contains 'sale' -%}{%- assign cn_on_sale = true -%}{%- endif -%}\n    {%- assign cn_alt_src = '' -%}\n    {%- if cn_img_part and cn_img_part.settings.second_image != false and product.images.size > 1 -%}\n      {%- assign cn_second = product.images[1] -%}\n      {%- assign cn_second_src = cn_second.url | default: cn_second -%}\n      {%- assign cn_is_variant_img = false -%}\n      {%- for cn_v in product.variants -%}\n        {%- assign cn_vimg = cn_v.image.url | default: cn_v.image -%}\n        {%- if cn_vimg != blank and cn_vimg == cn_second_src -%}{%- assign cn_is_variant_img = true -%}{%- break -%}{%- endif -%}\n      {%- endfor -%}\n      {%- if cn_is_variant_img == false -%}{%- assign cn_alt_src = cn_second_src -%}{%- endif -%}\n    {%- endif -%}\n    {%- capture cn_badges -%}\n      {%- if cn_badge_part -%}\n        {%- if cn_sold_out and cn_badge_part.settings.show_sold_out != false -%}\n          <span class=\"cn-badge cn-badge--sold\">{{ 'products.sold_out' | t }}</span>\n        {%- elsif cn_on_sale and cn_badge_part.settings.show_sale != false -%}\n          <span class=\"cn-badge cn-badge--sale\">{{ 'products.sale' | t }}</span>\n        {%- endif -%}\n        {%- if cn_sold_out == false and product.badges contains 'new' -%}<span class=\"cn-badge cn-badge--new\">{{ 'products.new' | t }}</span>{%- endif -%}\n      {%- endif -%}\n    {%- endcapture -%}\n    {% resource product %}\n    <div class=\"cn-pcard cn-pcard--{{ cn_align }} cn-pcard--hover-{{ cb.hover | default: 'zoom' }}{% if cn_alt_src != '' %} cn-pcard--has-alt{% endif %}{% if cn_sold_out %} cn-pcard--soldout{% endif %}\" {{ card_block.soooks_attributes }} data-cn-card>\n      {%- for part in card_block.blocks -%}\n        {%- case part.type -%}\n          {%- when 'card-image' -%}\n            <a class=\"cn-pcard__media cn-ratio cn-ratio--{{ cn_ratio }} cn-fit--{{ cn_fit }}\" href=\"{{ cn_url }}\" tabindex=\"-1\" aria-hidden=\"true\" data-cn-card-link {{ part.soooks_attributes }}>\n              {%- if product.image -%}\n                <img class=\"cn-pcard__img\" data-cn-card-img src=\"{{ product.image }}\" alt=\"{{ product.name | escape }}\" loading=\"{% if eager %}eager{% else %}lazy{% endif %}\">\n                {%- if cn_alt_src != '' -%}<img class=\"cn-pcard__img cn-pcard__img--alt\" src=\"{{ cn_alt_src }}\" alt=\"\" loading=\"lazy\">{%- endif -%}\n              {%- else -%}\n                <img class=\"cn-pcard__img\" data-cn-card-img src=\"{{ 'ph-product-PCN.svg' | replace: 'PCN', cn_ph | asset_url }}\" alt=\"\" loading=\"lazy\">\n              {%- endif -%}\n              {%- if cn_badges != blank -%}<span class=\"cn-pcard__badges\" {{ cn_badge_part.soooks_attributes }}>{{ cn_badges }}</span>{%- endif -%}\n            </a>\n          {%- when 'card-badge' -%}\n            {%- unless cn_img_part -%}{%- if cn_badges != blank -%}<span class=\"cn-pcard__badges cn-pcard__badges--inline\" {{ part.soooks_attributes }}>{{ cn_badges }}</span>{%- endif -%}{%- endunless -%}\n          {%- when 'card-vendor' -%}\n            {%- if product.vendor != blank -%}<p class=\"cn-pcard__vendor\" {{ part.soooks_attributes }}>{{ product.vendor }}</p>{%- endif -%}\n          {%- when 'card-title' -%}\n            <{{ cn_tag }} class=\"cn-pcard__title cn-pcard__title--{{ part.settings.title_size | default: 'md' }} cn-pcard__title--lines-{{ part.settings.lines | default: '2' }}\" {{ part.soooks_attributes }}><a href=\"{{ cn_url }}\" data-cn-card-link>{{ product.name }}</a></{{ cn_tag }}>\n          {%- when 'card-price' -%}\n            <div class=\"cn-pcard__price-wrap\" {{ part.soooks_attributes }}>{% render 'price', product: product, show_compare: part.settings.show_compare, class: 'cn-pcard__price' %}</div>\n            {%- if card.show_swatches != false and product.options.size > 0 -%}{% render 'product-card', swatches_for: product, url: cn_url %}{%- endif -%}\n          {%- when 'card-rating' -%}\n            {%- if product.metafields.reviews.rating != blank -%}\n              {%- assign cn_rating = product.metafields.reviews.rating -%}\n              {%- assign cn_rating_pct = cn_rating | times: 20 | at_most: 100 -%}\n              <p class=\"cn-pcard__rating\" aria-label=\"{{ cn_rating }} / 5\" {{ part.soooks_attributes }}>\n                <span class=\"cn-stars\" style=\"--cn-rating:{{ cn_rating_pct }}%\" aria-hidden=\"true\"></span>\n                {%- if product.metafields.reviews.rating_count -%}<span class=\"cn-pcard__rating-count\">({{ product.metafields.reviews.rating_count }})</span>{%- endif -%}\n              </p>\n            {%- elsif request.design_mode -%}\n              <p class=\"cn-pcard__rating cn-pcard__rating--empty\" {{ part.soooks_attributes }}><span class=\"cn-stars\" style=\"--cn-rating:0%\" aria-hidden=\"true\"></span></p>\n            {%- endif -%}\n          {%- when 'card-button' -%}\n            {%- if cn_sold_out == false -%}\n              {%- if product.options.size > 0 -%}{%- capture cn_add_label -%}{{ 'general.choose_options' | t }}{%- endcapture -%}\n              {%- else -%}{%- capture cn_add_label -%}{{ part.settings.label | default: 'Add to cart' }}{%- endcapture -%}{%- endif -%}\n              <button type=\"button\" class=\"cn-pcard__add cn-pcard__add--{{ part.settings.style | default: 'outline' }} cn-quickadd\" data-cn-quickadd {{ part.soooks_attributes }}\n                data-product-id=\"{{ product.id }}\" data-slug=\"{{ product.slug }}\"\n                data-has-variants=\"{% if product.options.size > 0 %}true{% else %}false{% endif %}\"\n                data-variant-id=\"{{ product.variants.first.id }}\"\n                aria-label=\"{{ cn_add_label | escape }}: {{ product.name | escape }}\">{{ cn_add_label }}</button>\n            {%- endif -%}\n        {%- endcase -%}\n      {%- endfor -%}\n    </div>\n    {% endresource %}\n  {%- endif -%}\n{%- elsif swatches_for -%}\n  {%- comment -%} Colour dots for a product (shared by both card modes). {%- endcomment -%}\n  {%- assign product = swatches_for -%}\n  {%- assign cn_url = url -%}\n  {%- assign cn_sw_opt = nil -%}\n  {%- for cn_opt in product.options -%}\n    {%- assign cn_first = cn_opt.values | first -%}\n    {%- capture cn_probe -%}{% render 'swatch-color', value: cn_first %}{%- endcapture -%}\n    {%- if cn_probe != blank and cn_opt.values.size > 1 -%}{%- assign cn_sw_opt = cn_opt -%}{%- break -%}{%- endif -%}\n  {%- endfor -%}\n  {%- if cn_sw_opt -%}\n    <div class=\"cn-swatches\">\n      {%- for cn_val in cn_sw_opt.values limit: 5 -%}\n        {%- assign cn_match = nil -%}\n        {%- for cn_v in product.variants -%}\n          {%- if cn_v.option_values[cn_sw_opt.name] == cn_val -%}{%- assign cn_match = cn_v -%}{%- break -%}{%- endif -%}\n        {%- endfor -%}\n        {%- capture cn_bg -%}{% render 'swatch-color', value: cn_val %}{%- endcapture -%}\n        {%- assign cn_vimg = cn_match.image.url | default: cn_match.image | default: '' -%}\n        <button type=\"button\" class=\"cn-swatch{% if cn_bg == blank %} cn-swatch--none{% endif %}{% if forloop.first %} is-active{% endif %}\" data-cn-swatch\n          data-image=\"{{ cn_vimg }}\" data-variant=\"{{ cn_match.id }}\" title=\"{{ cn_val | escape }}\" aria-label=\"{{ cn_sw_opt.name | escape }}: {{ cn_val | escape }}\"\n          {% if cn_bg != blank %}style=\"--cn-swatch:{{ cn_bg }}\"{% endif %}></button>\n      {%- endfor -%}\n      {%- if cn_sw_opt.values.size > 5 -%}<a class=\"cn-swatches__more\" href=\"{{ cn_url }}\">+{{ cn_sw_opt.values.size | minus: 5 }}</a>{%- endif -%}\n    </div>\n  {%- endif -%}\n{%- else -%}\n{%- assign cn_ratio = card.image_ratio | default: 'theme' -%}\n{%- assign cn_fit = card.image_fit | default: 'cover' -%}\n{%- assign cn_align = card.text_alignment | default: 'start' -%}\n{%- if cn_align == 'left' -%}{%- assign cn_align = 'start' -%}{%- elsif cn_align == 'right' -%}{%- assign cn_align = 'end' -%}{%- endif -%}\n{%- assign cn_tag = heading_tag | default: 'h3' -%}\n{%- assign cn_ph = index | default: 0 | modulo: 4 | plus: 1 -%}\n{%- if placeholder -%}\n  <div class=\"cn-pcard cn-pcard--{{ cn_align }} cn-pcard--ph\">\n    <span class=\"cn-pcard__media cn-ratio cn-ratio--{{ cn_ratio }} cn-fit--{{ cn_fit }}\">\n      <img class=\"cn-pcard__img\" src=\"{{ 'ph-product-PCN.svg' | replace: 'PCN', cn_ph | asset_url }}\" alt=\"\" loading=\"lazy\">\n    </span>\n    <div class=\"cn-pcard__info\">\n      <{{ cn_tag }} class=\"cn-pcard__title\">{{ 'onboarding.product' | t }}</{{ cn_tag }}>\n      {%- if card.show_price != false -%}<span class=\"cn-price cn-price--md\"><span class=\"cn-price__amount\">{{ 4500 | money }}</span></span>{%- endif -%}\n    </div>\n  </div>\n{%- elsif product.missing -%}\n  {% resource product %}\n  <div class=\"cn-pcard cn-pcard--{{ cn_align }} cn-pcard--missing\" data-resource-node>\n    <span class=\"cn-pcard__media cn-ratio cn-ratio--{{ cn_ratio }}\"><span class=\"cn-pcard__missing\">{{ 'editor.product_unavailable' | t }}</span></span>\n    <div class=\"cn-pcard__info\"><span class=\"cn-pcard__vendor\">{{ 'editor.select_another' | t }}</span></div>\n  </div>\n  {% endresource %}\n{%- elsif product -%}\n  {%- assign cn_url = product.url | default: '' -%}\n  {%- if cn_url == '' -%}{%- assign cn_url = '/products/' | append: product.slug -%}{%- endif -%}\n  {%- assign cn_sold_out = false -%}\n  {%- if product.available == false or product.in_stock == false -%}{%- assign cn_sold_out = true -%}{%- endif -%}\n  {%- assign cn_on_sale = false -%}\n  {%- if product.compare_at_price and product.compare_at_price > product.price -%}{%- assign cn_on_sale = true -%}{%- elsif product.badges contains 'sale' -%}{%- assign cn_on_sale = true -%}{%- endif -%}\n  {%- comment -%} Second picture for hover — never one that belongs to a variant (another colour isn't a second view). {%- endcomment -%}\n  {%- assign cn_alt_src = '' -%}\n  {%- if card.second_image != false and product.images.size > 1 -%}\n    {%- assign cn_second = product.images[1] -%}\n    {%- assign cn_second_src = cn_second.url | default: cn_second -%}\n    {%- assign cn_is_variant_img = false -%}\n    {%- for cn_v in product.variants -%}\n      {%- assign cn_vimg = cn_v.image.url | default: cn_v.image -%}\n      {%- if cn_vimg != blank and cn_vimg == cn_second_src -%}{%- assign cn_is_variant_img = true -%}{%- break -%}{%- endif -%}\n    {%- endfor -%}\n    {%- if cn_is_variant_img == false -%}{%- assign cn_alt_src = cn_second_src -%}{%- endif -%}\n  {%- endif -%}\n  {% resource product %}\n  <div class=\"cn-pcard cn-pcard--{{ cn_align }}{% if cn_alt_src != '' %} cn-pcard--has-alt{% endif %}{% if cn_sold_out %} cn-pcard--soldout{% endif %}\" data-resource-node data-cn-card>\n    <a class=\"cn-pcard__media cn-ratio cn-ratio--{{ cn_ratio }} cn-fit--{{ cn_fit }}\" href=\"{{ cn_url }}\" tabindex=\"-1\" aria-hidden=\"true\" data-cn-card-link>\n      {%- if product.image -%}\n        <img class=\"cn-pcard__img\" data-cn-card-img src=\"{{ product.image }}\" alt=\"{{ product.name | escape }}\" loading=\"{% if eager %}eager{% else %}lazy{% endif %}\">\n        {%- if cn_alt_src != '' -%}<img class=\"cn-pcard__img cn-pcard__img--alt\" src=\"{{ cn_alt_src }}\" alt=\"\" loading=\"lazy\">{%- endif -%}\n      {%- else -%}\n        <img class=\"cn-pcard__img\" data-cn-card-img src=\"{{ 'ph-product-PCN.svg' | replace: 'PCN', cn_ph | asset_url }}\" alt=\"\" loading=\"lazy\">\n      {%- endif -%}\n      {%- capture cn_badges -%}\n        {%- if cn_sold_out and card.show_badges != false -%}\n          <span class=\"cn-badge cn-badge--sold\">{{ 'products.sold_out' | t }}</span>\n        {%- elsif cn_on_sale and card.show_sale_badge != false -%}\n          <span class=\"cn-badge cn-badge--sale\">{{ 'products.sale' | t }}</span>\n        {%- endif -%}\n        {%- if cn_sold_out == false and card.show_badges != false and product.badges contains 'new' -%}\n          <span class=\"cn-badge cn-badge--new\">{{ 'products.new' | t }}</span>\n        {%- endif -%}\n      {%- endcapture -%}\n      {%- if cn_badges != blank -%}<span class=\"cn-pcard__badges\">{{ cn_badges }}</span>{%- endif -%}\n    </a>\n    <div class=\"cn-pcard__info\">\n      {%- if card.show_vendor and product.vendor != blank -%}<p class=\"cn-pcard__vendor\">{{ product.vendor }}</p>{%- endif -%}\n      <{{ cn_tag }} class=\"cn-pcard__title\"><a href=\"{{ cn_url }}\" data-cn-card-link>{{ product.name }}</a></{{ cn_tag }}>\n      {%- if card.show_rating != false and product.metafields.reviews.rating != blank -%}\n        {%- assign cn_rating = product.metafields.reviews.rating -%}\n        {%- assign cn_rating_pct = cn_rating | times: 20 | at_most: 100 -%}\n        <p class=\"cn-pcard__rating\" aria-label=\"{{ cn_rating }} / 5\">\n          <span class=\"cn-stars\" style=\"--cn-rating:{{ cn_rating_pct }}%\" aria-hidden=\"true\"></span>\n          {%- if product.metafields.reviews.rating_count -%}<span class=\"cn-pcard__rating-count\">({{ product.metafields.reviews.rating_count }})</span>{%- endif -%}\n        </p>\n      {%- endif -%}\n      {%- if card.show_price != false -%}\n        {% render 'price', product: product, show_compare: card.show_compare, class: 'cn-pcard__price' %}\n      {%- endif -%}\n      {%- if card.show_swatches != false and product.options.size > 0 -%}\n        {%- comment -%} The first option whose first value is a colour we can paint. {%- endcomment -%}\n        {%- assign cn_sw_opt = nil -%}\n        {%- for cn_opt in product.options -%}\n          {%- assign cn_first = cn_opt.values | first -%}\n          {%- capture cn_probe -%}{% render 'swatch-color', value: cn_first %}{%- endcapture -%}\n          {%- if cn_probe != blank and cn_opt.values.size > 1 -%}{%- assign cn_sw_opt = cn_opt -%}{%- break -%}{%- endif -%}\n        {%- endfor -%}\n        {%- if cn_sw_opt -%}\n          <div class=\"cn-swatches\">\n            {%- for cn_val in cn_sw_opt.values limit: 5 -%}\n              {%- assign cn_match = nil -%}\n              {%- for cn_v in product.variants -%}\n                {%- if cn_v.option_values[cn_sw_opt.name] == cn_val -%}{%- assign cn_match = cn_v -%}{%- break -%}{%- endif -%}\n              {%- endfor -%}\n              {%- capture cn_bg -%}{% render 'swatch-color', value: cn_val %}{%- endcapture -%}\n              {%- assign cn_vimg = cn_match.image.url | default: cn_match.image | default: '' -%}\n              <button type=\"button\" class=\"cn-swatch{% if cn_bg == blank %} cn-swatch--none{% endif %}{% if forloop.first %} is-active{% endif %}\" data-cn-swatch\n                data-image=\"{{ cn_vimg }}\" data-variant=\"{{ cn_match.id }}\" title=\"{{ cn_val | escape }}\" aria-label=\"{{ cn_sw_opt.name | escape }}: {{ cn_val | escape }}\"\n                {% if cn_bg != blank %}style=\"--cn-swatch:{{ cn_bg }}\"{% endif %}></button>\n            {%- endfor -%}\n            {%- if cn_sw_opt.values.size > 5 -%}<a class=\"cn-swatches__more\" href=\"{{ cn_url }}\">+{{ cn_sw_opt.values.size | minus: 5 }}</a>{%- endif -%}\n          </div>\n        {%- endif -%}\n      {%- endif -%}\n    </div>\n    {%- if card.show_quick_add != false and cn_sold_out == false -%}\n      {%- if product.options.size > 0 -%}\n        {%- capture cn_add_label -%}{{ 'general.choose_options' | t }}{%- endcapture -%}\n      {%- else -%}\n        {%- capture cn_add_label -%}{{ 'products.add_to_cart' | t }}{%- endcapture -%}\n      {%- endif -%}\n      <button type=\"button\" class=\"cn-pcard__add cn-quickadd\" data-cn-quickadd\n        data-product-id=\"{{ product.id }}\" data-slug=\"{{ product.slug }}\"\n        data-has-variants=\"{% if product.options.size > 0 %}true{% else %}false{% endif %}\"\n        data-variant-id=\"{{ product.variants.first.id }}\"\n        aria-label=\"{{ cn_add_label | escape }}: {{ product.name | escape }}\">{{ cn_add_label }}</button>\n    {%- endif -%}\n  </div>\n  {% endresource %}\n{%- endif -%}\n{%- endif -%}\n","snippets/section-head.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Section heading: subtitle, title, description and an optional \"View all\" link.\n  Params:\n    eyebrow    small subtitle above the title\n    title      heading text\n    text       description (plain text or rich text)\n    link       URL for the link (shown only with link_text)\n    link_text  link label\n    align      'start' (default; 'left' is accepted) | 'center' | 'end'\n    tag        heading tag, default h2\n    attrs      extra attributes for the wrapper (e.g. a block's soooks_attributes)\n  Start-aligned headings put the link at the end of the row on wide screens; centred ones put it below.\n{%- endcomment -%}\n{%- assign cn_align = align | default: 'start' -%}\n{%- if cn_align == 'left' -%}{%- assign cn_align = 'start' -%}{%- elsif cn_align == 'right' -%}{%- assign cn_align = 'end' -%}{%- endif -%}\n{%- assign cn_tag = tag | default: 'h2' -%}\n{%- if eyebrow != blank or title != blank or text != blank or link_text != blank -%}\n<header class=\"cn-head cn-head--{{ cn_align }}\" {{ attrs }}>\n  <div class=\"cn-head__text\">\n    {%- if eyebrow != blank -%}<p class=\"cn-head__eyebrow\">{{ eyebrow }}</p>{%- endif -%}\n    {%- if title != blank -%}<{{ cn_tag }} class=\"cn-head__title\">{{ title }}</{{ cn_tag }}>{%- endif -%}\n    {%- if text != blank -%}<div class=\"cn-head__desc\">{{ text }}</div>{%- endif -%}\n  </div>\n  {%- if link_text != blank -%}\n    <a class=\"cn-head__link\" href=\"{{ link | default: '/collections' }}\">{{ link_text }} <span class=\"cn-arrow\" aria-hidden=\"true\">{% render 'icon', name: 'arrow', size: 16 %}</span></a>\n  {%- endif -%}\n</header>\n{%- endif -%}\n","snippets/swatch-color.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Colour option value → CSS background for a swatch (colour or gradient), or nothing when the name isn't a colour\n  we recognise (the caller then shows a text button). The names and colours are the platform's `swatch_color`\n  filter. Generated by scripts/theme-store/gen-swatch-snippet.py.\n  Params: value\n{%- endcomment -%}\n{{- value | swatch_color -}}\n","snippets/theme-vars.liquid":"{%- comment -%}soooks-theme:corner:169557:f0936d16eeb03eeb{%- endcomment -%}\n{%- comment -%}\n  Theme settings → CSS custom properties, once per page (rendered by layouts/theme.liquid).\n\n  Colors: the five color schemes (Theme settings → Color schemes) are written as .scheme-1 … .scheme-5\n  with Corner's own defaults, and scheme 1 is also set on :root so overlays appended to <body> are themed.\n  Settings may arrive nested (settings.schemes['scheme-1']) or under the editor's flat group key\n  (settings['schemes.scheme-1']); both are read, nested first (same order as the renderer).\n\n  Every value falls back to the brief's default: theme settings reach Liquid without schema defaults.\n{%- endcomment -%}\n{%- assign c = settings.colors -%}\n{%- assign ty = settings.typography -%}\n{%- assign ly = settings.layout -%}\n{%- assign bt = settings.buttons -%}\n{%- assign cd = settings.cards -%}\n{%- assign an = settings.animation -%}\n{%- assign scheme_keys = 'background,surface,surface_elevated,heading,text,text_muted,border,primary,on_primary,accent' | split: ',' -%}\n{%- capture scheme_defaults -%}\n#ffffff,#f5f6f8,#ffffff,#16181d,#2b2f36,#646b77,#e3e6eb,#2457d6,#ffffff,#f5b301|#f5f6f8,#ffffff,#ffffff,#16181d,#2b2f36,#646b77,#dfe2e8,#2457d6,#ffffff,#f5b301|#16181d,#22252c,#2a2e36,#ffffff,#e6e8ec,#a3a9b4,#343842,#ffffff,#16181d,#f5b301|#2457d6,#1f4cbd,#2f62dd,#ffffff,#eef2ff,#c9d6fb,#3f6ee0,#ffffff,#2457d6,#f5b301|#f3f1ec,#ffffff,#ffffff,#22201c,#3b3833,#77726a,#e4e0d8,#22201c,#ffffff,#c8862b\n{%- endcapture -%}\n{%- assign scheme_defaults = scheme_defaults | strip | split: '|' -%}\n{%- assign heading_weight = ty.heading_weight | default: '700' -%}\n{%- assign tracking = ty.heading_letter_spacing | default: 0 -%}\n{%- assign line_height = ty.body_line_height | default: 160 -%}\n{%- assign btn_size = bt.button_size | default: 'medium' -%}\n{%- case btn_size -%}\n  {%- when 'small' -%}{%- assign btn_pad = '0.6rem 1.1rem' -%}{%- assign btn_font = '0.875rem' -%}\n  {%- when 'large' -%}{%- assign btn_pad = '1rem 1.9rem' -%}{%- assign btn_font = '1rem' -%}\n  {%- else -%}{%- assign btn_pad = '0.8rem 1.5rem' -%}{%- assign btn_font = '0.9375rem' -%}\n{%- endcase -%}\n{%- assign btn_pad = btn_pad | split: ' ' -%}\n{%- case cd.image_ratio -%}\n  {%- when 'square' -%}{%- assign card_ratio = '1 / 1' -%}\n  {%- when 'landscape' -%}{%- assign card_ratio = '4 / 3' -%}\n  {%- when 'natural' -%}{%- assign card_ratio = 'auto' -%}\n  {%- else -%}{%- assign card_ratio = '4 / 5' -%}\n{%- endcase -%}\n<style>\n  {%- for d in scheme_defaults -%}\n    {%- capture scheme_name -%}scheme-{{ forloop.index }}{%- endcapture -%}\n    {%- capture flat_name -%}schemes.{{ scheme_name }}{%- endcapture -%}\n    {%- assign sc = settings.schemes[scheme_name] -%}\n    {%- unless sc -%}{%- assign sc = settings[flat_name] -%}{%- endunless -%}\n    {%- assign dv = d | split: ',' -%}\n    {%- capture vars -%}\n      {%- for k in scheme_keys -%}--color-{{ k | replace: '_', '-' }}:{{ sc[k] | default: dv[forloop.index0] }};{%- endfor -%}\n      --color-secondary:{{ sc.heading | default: dv[3] }};\n    {%- endcapture -%}\n    {%- if forloop.first %}\n  :root, .theme-root { {{ vars }} }\n    {%- endif %}\n  .scheme-{{ forloop.index }}, .theme-root .scheme-{{ forloop.index }} { {{ vars }} background-color: var(--color-background); color: var(--color-text); }\n  {%- endfor %}\n  :root, .theme-root {\n    --cn-sale: {{ c.sale | default: '#d33a2c' }};\n    --cn-success: {{ c.success | default: '#1f8a4c' }};\n    --cn-error: {{ c.error | default: '#c62828' }};\n    --cn-font-heading: '{{ ty.heading_font | default: 'Plus Jakarta Sans' }}', system-ui, sans-serif;\n    --cn-font-body: '{{ ty.text_font | default: 'Inter' }}', system-ui, sans-serif;\n    --cn-heading-weight: {{ heading_weight }};\n    --cn-scale: {{ ty.heading_scale | default: 100 | divided_by: 100.0 }};\n    --cn-heading-tracking: {{ tracking | divided_by: 100.0 }}em;\n    --cn-line-height: {{ line_height | divided_by: 100.0 }};\n    --cn-width: {{ ly.page_width | default: 1280 }}px;\n    --cn-space-desktop: {{ ly.section_spacing | default: 64 }}px;\n    --cn-space-mobile: {{ ly.section_spacing_mobile | default: 40 }}px;\n    --cn-gap: {{ ly.grid_gap | default: 20 }}px;\n    --cn-radius: {{ ly.radius | default: 8 }}px;\n    --cn-btn-radius: {{ bt.radius | default: 8 }}px;\n    --cn-btn-pad-y: {{ btn_pad[0] }};\n    --cn-btn-pad-x: {{ btn_pad[1] }};\n    --cn-btn-font: {{ btn_font }};\n    --cn-card-radius: {{ cd.radius | default: 8 }}px;\n    --cn-card-border-width: {% if cd.border == true %}1px{% else %}0px{% endif %};\n    --cn-card-pad: {% if cd.border == true or cd.shadow == true %}0.75rem{% else %}0px{% endif %};\n    --cn-card-shadow: {% if cd.shadow == true %}0 2px 10px rgba(0, 0, 0, 0.06){% else %}none{% endif %};\n    --cn-card-ratio: {{ card_ratio }};\n    --cn-reveal: {% if an.reveal == false %}off{% else %}on{% endif %};\n  }\n  {%- if bt.primary_style == 'outline' %}\n  .theme-root :is(.cn-btn, .cn-btn--primary):not(.cn-btn--secondary, .cn-btn--soft, .cn-btn--link, .cn-btn--dark), :is(.cn-btn, .cn-btn--primary):not(.cn-btn--secondary, .cn-btn--soft, .cn-btn--link, .cn-btn--dark) { background: transparent; color: var(--color-primary); border-color: var(--color-primary); }\n  .theme-root :is(.cn-btn, .cn-btn--primary):not(.cn-btn--secondary, .cn-btn--soft, .cn-btn--link, .cn-btn--dark):hover { background: var(--color-primary); color: var(--color-on-primary); }\n  {%- endif %}\n  {%- if an.reveal == false %}\n  .theme-root .cn-reveal { opacity: 1 !important; transform: none !important; }\n  .theme-root .cn-reveal [data-cn-stagger] > *, .theme-root .cn-reveal[data-cn-stagger] > * { animation: none !important; }\n  {%- endif %}\n</style>\n"}