{"product_id":"piston-meatball-press","title":"Piston Meatball Press","description":"\u003cp\u003eTwelve meatballs. One press. Every one the same size.\u003c\/p\u003e\n\u003cp\u003eLoad the cylinder with mince, push the bar handle down once, and a tray of even balls drops straight out. No rolling, and no mince stuck to your palms. They cook evenly because they are even. It takes about four seconds.\u003c\/p\u003e\n\n\u003cstyle\u003e\n#cl-sets{margin:6px 0 18px}\n#cl-sets .clb-head{display:flex;align-items:center;gap:12px;margin:0 0 14px}\n#cl-sets .clb-line{flex:1;height:1px;background:currentColor;opacity:.35}\n#cl-sets .clb-title{font-size:1.2rem;letter-spacing:.22em;text-transform:uppercase;font-weight:700}\n#cl-sets .clb-card{position:relative;border:2px solid rgba(244,241,234,.28);border-radius:10px;padding:1.5rem 1.6rem;margin:0 0 1.1rem;display:flex;align-items:center;gap:1.2rem;cursor:pointer}\n#cl-sets .clb-card.sel{border-color:#c81e2d}\n#cl-sets .clb-radio{width:2rem;height:2rem;border:2px solid rgba(244,241,234,.4);border-radius:50%;flex:none;position:relative}\n#cl-sets .clb-card.sel .clb-radio{border-color:#c81e2d}\n#cl-sets .clb-card.sel .clb-radio:after{content:\"\";position:absolute;inset:4px;background:#c81e2d;border-radius:50%}\n#cl-sets .clb-main{flex:1;min-width:0}\n#cl-sets .clb-t{font-weight:700;font-size:1.5rem;line-height:1.25;display:flex;align-items:center;gap:.8rem;flex-wrap:wrap}\n#cl-sets .clb-pill{background:#c81e2d;color:#fff;font-size:1.02rem;font-weight:700;letter-spacing:.08em;padding:.25rem .7rem;border-radius:4px;white-space:nowrap}\n#cl-sets .clb-c{font-size:1.25rem;opacity:.7;margin-top:.35rem}\n#cl-sets .clb-price{text-align:right;flex:none}\n#cl-sets .clb-p{font-size:1.6rem;font-weight:700}\n#cl-sets .clb-was{font-size:1.2rem;opacity:.55;text-decoration:line-through}\n#cl-sets .clb-badge{position:absolute;top:-1.05rem;right:1.2rem;background:#c81e2d;color:#fff;font-size:1.02rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;padding:.35rem .9rem}\n\u003c\/style\u003e\n\u003cscript id=\"cl-sets-js\"\u003e\n(function () {\n  var HANDLE = 'piston-meatball-press';\n  function boot() {\n    if (document.getElementById('cl-sets')) return;\n    var form = document.querySelector('form[action*=\"\/cart\/add\"]');\n    if (!form || !form.querySelector('input[name=\"id\"], [name=\"id\"]')) { setTimeout(boot, 300); return; }\n    fetch('\/products\/' + HANDLE + '.js', { credentials: 'same-origin' })\n      .then(function (r) { return r.json(); })\n      .then(function (p) { build(p, form); })\n      .catch(function () {});\n  }\n  function build(p, form) {\n    if (document.getElementById('cl-sets')) return;\n    var cur = (window.Shopify \u0026\u0026 Shopify.currency \u0026\u0026 Shopify.currency.active) || 'USD';\n    function money(cents) {\n      try { return new Intl.NumberFormat(undefined, { style: 'currency', currency: cur }).format(cents \/ 100); }\n      catch (e) { return (cents \/ 100).toFixed(2) + ' ' + cur; }\n    }\n    var sizes = [];\n    p.variants.forEach(function (v) { if (sizes.indexOf(v.option1) \u003c 0) sizes.push(v.option1); });\n    function tiersFor(unit) {\n      return [\n        { qty: 1, title: 'One press', total: unit, was: 0 },\n        { qty: 2, title: 'Two presses — second one 30% off', total: unit * 2 - Math.floor(unit * 0.3), was: unit * 2 },\n        { qty: 3, title: 'Three presses — one of them free', total: unit * 2, was: unit * 3 }\n      ];\n    }\n    var chosen = 2;\n    var tiers = tiersFor(p.variants[0].price);\n    function curSize() {\n      var r = document.querySelector('input[type=\"radio\"][name*=\"Size\"]:checked');\n      if (r) return r.value;\n      return sizes[0];\n    }\n    function variantFor(size) {\n      return p.variants.filter(function (v) { return v.option1 === size; })[0] || p.variants[0];\n    }\n    function setQty(n) {\n      var forms = document.querySelectorAll('form[action*=\"\/cart\/add\"]');\n      Array.prototype.forEach.call(forms, function (f) {\n        var inputs = f.querySelectorAll('input[name=\"quantity\"], [name=\"quantity\"]');\n        if (!inputs.length) {\n          var qi = document.createElement('input');\n          qi.type = 'hidden';\n          qi.name = 'quantity';\n          f.appendChild(qi);\n          inputs = [qi];\n        }\n        Array.prototype.forEach.call(inputs, function (i) {\n          i.value = String(n);\n          try { i.dispatchEvent(new Event('change', { bubbles: true })); } catch (e) {}\n        });\n      });\n    }\n    var box = document.createElement('div');\n    box.id = 'cl-sets';\n    function render() {\n      var html = '\u003cdiv class=\"clb-head\"\u003e\u003cspan class=\"clb-line\"\u003e\u003c\/span\u003e\u003cspan class=\"clb-title\"\u003eHow many\u003c\/span\u003e\u003cspan class=\"clb-line\"\u003e\u003c\/span\u003e\u003c\/div\u003e';\n      tiers.forEach(function (t, i) {\n        var save = t.was ? t.was - t.total : 0;\n        var pill = save ? '\u003cspan class=\"clb-pill\"\u003eSAVE ' + money(save) + '\u003c\/span\u003e' : '';\n        var was = save ? '\u003cdiv class=\"clb-was\"\u003e' + money(t.was) + '\u003c\/div\u003e' : '';\n        var badge = i === 1 ? '\u003cspan class=\"clb-badge\"\u003eMost popular\u003c\/span\u003e' : '';\n        var sub = i === 0 ? 'Standard price' : 'Ships free · Applied in cart';\n        html += '\u003cdiv class=\"clb-card' + (t.qty === chosen ? ' sel' : '') + '\" data-qty=\"' + t.qty + '\"\u003e' + badge +\n          '\u003cspan class=\"clb-radio\"\u003e\u003c\/span\u003e' +\n          '\u003cspan class=\"clb-main\"\u003e\u003cspan class=\"clb-t\"\u003e' + t.title + ' ' + pill + '\u003c\/span\u003e\u003cdiv class=\"clb-c\"\u003e' + sub + '\u003c\/div\u003e\u003c\/span\u003e' +\n          '\u003cspan class=\"clb-price\"\u003e\u003cdiv class=\"clb-p\"\u003e' + money(t.total) + '\u003c\/div\u003e' + was + '\u003c\/span\u003e' +\n          '\u003c\/div\u003e';\n      });\n      box.innerHTML = html;\n    }\n    render();\n    form.parentNode.insertBefore(box, form);\n    function apply() {\n      var v = variantFor(curSize());\n      tiers = tiersFor(v.price);\n      render();\n      document.querySelectorAll('form[action*=\"\/cart\/add\"] input[name=\"id\"], form[action*=\"\/cart\/add\"] [name=\"id\"]').forEach(function (inp) { inp.value = v.id; });\n      setQty(chosen);\n      var t = tiers.filter(function (x) { return x.qty === chosen; })[0] || tiers[0];\n      document.querySelectorAll('.product__info-container .price-item--regular').forEach(function (el) { el.textContent = money(t.total); });\n      try {\n        var u = new URL(window.location.href);\n        u.searchParams.set('variant', v.id);\n        window.history.replaceState({}, '', u.toString());\n      } catch (e) {}\n    }\n    box.addEventListener('click', function (e) {\n      var card = e.target \u0026\u0026 e.target.closest ? e.target.closest('.clb-card') : null;\n      if (!card) return;\n      chosen = parseInt(card.getAttribute('data-qty'), 10) || 1;\n      apply();\n    });\n    document.addEventListener('change', function (e) {\n      if (e.target \u0026\u0026 e.target.name \u0026\u0026 String(e.target.name).indexOf('Size') \u003e -1) setTimeout(apply, 60);\n    }, true);\n    setInterval(function () { setQty(chosen); }, 1200);\n    apply();\n  }\n  if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', boot); } else { boot(); }\n})();\n\u003c\/script\u003e\n","brand":"Clyro","offers":[{"title":"Six wells","offer_id":58568074395980,"sku":"CL-MP-06","price":21.95,"currency_code":"EUR","in_stock":true},{"title":"Twelve wells","offer_id":58568074527052,"sku":"CL-MP-12","price":24.95,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1079\/2524\/2188\/files\/hf_20260830_120825_d7f8c29d-0482-4e9b-bdc4-67927317e9ee.png?v=1788091837","url":"https:\/\/clyro22.com\/products\/piston-meatball-press","provider":"clyro","version":"1.0","type":"link"}