{"title":"Shinobi Legacy","description":"\u003cp\u003eMasks, cloaks and moonlit missions. Our biggest line — shinobi-inspired washed tees and cosplay for the hidden village in all of us.\u003c\/p\u003e","products":[{"product_id":"martial-arts-ninja-tee","title":"Martial Arts Ninja Tee","description":"\u003cbody\u003e\n\n\n  \u003cmeta charset=\"utf-8\"\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n  \u003ctitle\u003eProduct + Size Chart — Minimal\u003c\/title\u003e\n  \u003cstyle\u003e\n    :root{\n      --bg:#ffffff;\n      --ink:#0b0c0f;\n      --muted:#6b7280;\n      --line:#eceef1;\n      --accent:#111827;\n      --radius:18px;\n      --radius-sm:10px;\n      --shadow:0 6px 24px rgba(0,0,0,.05);\n      --shadow-soft:0 3px 12px rgba(0,0,0,.05);\n    }\n\n    html,body{height:100%}\n    html{color-scheme:light}\n    body{\n      margin:0;\n      background:var(--bg);\n      color:var(--ink);\n      font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Inter, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif;\n      -webkit-font-smoothing:antialiased;\n      font-size:15px;\n      line-height:1.75;\n      font-weight:300;\n      letter-spacing:.15px;\n    }\n\n    \/* Narrow, minimal container *\/\n    .wrap{\n      max-width: 640px;\n      margin: 56px auto;\n      padding: 0 18px;\n      position: relative;\n    }\n\n    \/* Minimal card *\/\n    .card{\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius);\n      box-shadow: var(--shadow);\n      padding: 28px 26px;\n    }\n\n    .title{\n      margin: 0 0 10px;\n      font-size: clamp(20px, 4.4vw, 26px);\n      font-weight: 700;\n      letter-spacing: -0.015em;\n    }\n\n    .lead{\n      margin: 0;\n      color:#1f2937;\n      max-width: 60ch;\n    }\n\n    .features{\n      list-style: none;\n      padding: 0;\n      margin: 16px 0 0;\n      display: grid;\n      gap: 10px;\n    }\n    .features li{\n      font-weight: 400;\n      display: inline-flex;\n      align-items: baseline;\n      gap: 8px;\n    }\n    .features li::before{\n      content: \"—\";\n      color: var(--accent);\n      opacity:.55;\n      font-weight: 600;\n    }\n\n    \/* Ghost trigger button *\/\n    .size-chart-button-container{ text-align:center; margin: 16px 0 0; }\n    .size-chart-open-button{\n      background:#fff;\n      color:var(--ink);\n      padding: 9px 16px;\n      font-size: 12px;\n      font-weight: 700;\n      letter-spacing:.25px;\n      border-radius: 999px;\n      border: 1px solid var(--ink);\n      cursor: pointer;\n      text-transform: uppercase;\n      transition: transform .15s ease, box-shadow .2s ease, background .2s ease;\n      box-shadow: var(--shadow-soft);\n    }\n    .size-chart-open-button:hover,\n    .size-chart-open-button:focus-visible{\n      transform: translateY(-1px);\n      outline: none;\n      background: #fafafa;\n      box-shadow: 0 10px 26px rgba(0,0,0,.08);\n    }\n\n    \/* Collapse *\/\n    .size-chart-collapse{\n      width: 100%;\n      max-width: 560px;\n      margin: 18px auto 40px;\n      padding: 16px;\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius-sm);\n      box-shadow: var(--shadow-soft);\n    }\n    .hidden{ display:none; }\n\n    \/* Tabs: minimalist underline *\/\n    .size-chart-tabs{\n      display:flex;\n      justify-content:center;\n      gap: 18px;\n      margin-bottom: 12px;\n      border-bottom: 1px solid var(--line);\n      padding-bottom: 2px;\n    }\n    .tab-button{\n      appearance:none;\n      background:transparent;\n      color:var(--muted);\n      padding: 6px 2px;\n      font-size:12px;\n      font-weight:700;\n      letter-spacing:.3px;\n      border:none;\n      border-radius:0;\n      cursor:pointer;\n      position:relative;\n      transition: color .2s ease;\n    }\n    .tab-button:hover,\n    .tab-button:focus-visible{\n      color:var(--ink);\n      outline:none;\n    }\n    .tab-button[aria-selected=\"true\"]{\n      color:var(--ink);\n    }\n    .tab-button[aria-selected=\"true\"]::after{\n      content:\"\";\n      position:absolute;\n      left:0; right:0; bottom:-3px;\n      height: 2px;\n      background: var(--accent);\n      border-radius: 2px;\n    }\n\n    \/* Table: soft row dividers only *\/\n    .size-chart-table{\n      width:100%;\n      border-collapse: collapse;\n      background:#fff;\n    }\n    .size-chart-table th,\n    .size-chart-table td{\n      text-align:center;\n      padding: 10px 6px;\n      font-size:12px;\n      color:var(--ink);\n      border: none;\n      border-bottom: 1px solid var(--line);\n    }\n    .size-chart-table th{\n      font-weight: 700;\n      background: #fbfcfd;\n    }\n    .size-chart-table td:first-child,\n    .size-chart-table th:first-child{\n      text-align:left;\n      padding-left: 6px;\n      font-weight: 600;\n    }\n    .size-chart-table tbody tr:last-child td{\n      border-bottom: none;\n    }\n\n    .size-chart-note{\n      margin-top: 10px;\n      font-size: 11.5px;\n      color: var(--muted);\n      text-align: center;\n    }\n\n    @media (max-width:660px){\n      .wrap{ margin:44px auto; padding:0 14px; }\n      .card{ padding: 24px 20px; }\n      .size-chart-collapse{ max-width: 100%; }\n    }\n  \u003c\/style\u003e\n\n\n  \u003cmain class=\"wrap\" aria-labelledby=\"product-heading\"\u003e\n    \u003csection class=\"card\" aria-describedby=\"product-desc\"\u003e\n      \u003ch1 class=\"title\" id=\"product-heading\"\u003eBuilt for the Long Term\u003c\/h1\u003e\n      \u003cp class=\"lead\" id=\"product-desc\"\u003e\n        We make pieces to last. Cut from ultra-smooth 100% polyester mesh for cool comfort and durability, then\n        finished with professional-grade printing that resists cracking and fading. Everyday-ready, season after season.\n      \u003c\/p\u003e\n      \u003cul class=\"features\" role=\"list\"\u003e\n        \u003cli\u003e100% Polyester Mesh\u003c\/li\u003e\n        \u003cli\u003eWith pockets\u003c\/li\u003e\n        \u003cli\u003eHigh-quality printing\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/section\u003e\n\n    \u003c!-- Trigger --\u003e\n    \u003cdiv class=\"size-chart-button-container\"\u003e\n      \u003cbutton id=\"sizeChartToggle\" class=\"size-chart-open-button\" aria-expanded=\"false\" aria-controls=\"sizeChartPanel\"\u003e\n        Size Chart For Shirt\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Collapsible size chart --\u003e\n    \u003csection id=\"sizeChartPanel\" class=\"size-chart-collapse hidden\" aria-hidden=\"true\"\u003e\n      \u003c!-- Tabs --\u003e\n      \u003cdiv class=\"size-chart-tabs\" role=\"tablist\" aria-label=\"Size chart units\"\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-cm\" aria-selected=\"true\" aria-controls=\"tab-cm\" tabindex=\"0\" data-unit=\"cm\"\u003eCM\u003c\/button\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-in\" aria-selected=\"false\" aria-controls=\"tab-in\" tabindex=\"-1\" data-unit=\"in\"\u003eInches\u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- CM table --\u003e\n      \u003cdiv id=\"tab-cm\" role=\"tabpanel\" aria-labelledby=\"tab-btn-cm\"\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-cm\" aria-label=\"Shirt size chart in centimeters\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Inches table --\u003e\n      \u003cdiv id=\"tab-in\" role=\"tabpanel\" aria-labelledby=\"tab-btn-in\" hidden\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-in\" aria-label=\"Shirt size chart in inches\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003cp class=\"size-chart-note\"\u003e\n        Measurements are garment dimensions. Compare with a tee you own for best fit.\n      \u003c\/p\u003e\n    \u003c\/section\u003e\n\n    \u003cnoscript\u003e\n      \u003cp style=\"text-align:center;font:14px\/1.4 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;color:#555;\"\u003e\n        Enable JavaScript to view the interactive size chart.\n      \u003c\/p\u003e\n    \u003c\/noscript\u003e\n  \u003c\/main\u003e\n\n  \u003cscript\u003e\n    \/* ===== Data (single source of truth in CM) ===== *\/\n    const SIZE_DATA_CM = [\n      { size: \"S\",   length: 72, chest: 112, shoulder: 54,   sleeve: 24 },\n      { size: \"M\",   length: 74, chest: 116, shoulder: 55.5, sleeve: 25 },\n      { size: \"L\",   length: 76, chest: 120, shoulder: 57,   sleeve: 26 },\n      { size: \"XL\",  length: 78, chest: 124, shoulder: 58.5, sleeve: 27 },\n      { size: \"XXL\", length: 80, chest: 128, shoulder: 60,   sleeve: 28 },\n      { size: \"XXXL\",length: 82, chest: 132, shoulder: 61.5, sleeve: 29 }\n    ];\n\n    const COLUMNS = [\n      { key: \"size\",     label: \"Size\" },\n      { key: \"length\",   label: \"Length\" },\n      { key: \"chest\",    label: \"Chest\" },\n      { key: \"shoulder\", label: \"Shoulder\" },\n      { key: \"sleeve\",   label: \"Sleeve\" }\n    ];\n\n    \/\/ CM -\u003e inches (rounded to nearest 0.5\")\n    const cmToIn = cm =\u003e Math.round((cm \/ 2.54) * 2) \/ 2;\n\n    function renderTable(target, data, unit){\n      const thead = document.createElement(\"thead\");\n      const trh = document.createElement(\"tr\");\n\n      COLUMNS.forEach(col =\u003e {\n        const th = document.createElement(\"th\");\n        th.scope = \"col\";\n        th.textContent = col.key === \"size\" ? col.label : `${col.label} (${unit === \"cm\" ? \"cm\" : \"in\"})`;\n        trh.appendChild(th);\n      });\n      thead.appendChild(trh);\n\n      const tbody = document.createElement(\"tbody\");\n      data.forEach(row =\u003e {\n        const tr = document.createElement(\"tr\");\n        COLUMNS.forEach(col =\u003e {\n          const td = document.createElement(\"td\");\n          if(col.key === \"size\"){\n            td.textContent = row.size;\n            td.style.fontWeight = 600;\n          } else {\n            const val = unit === \"cm\" ? row[col.key] : cmToIn(row[col.key]);\n            td.textContent = Number.isInteger(val) ? String(val) : val.toFixed(1);\n          }\n          tr.appendChild(td);\n        });\n        tbody.appendChild(tr);\n      });\n\n      target.innerHTML = \"\";\n      target.appendChild(thead);\n      target.appendChild(tbody);\n    }\n\n    \/\/ Initial render\n    const tableCM = document.getElementById(\"table-cm\");\n    const tableIN = document.getElementById(\"table-in\");\n    renderTable(tableCM, SIZE_DATA_CM, \"cm\");\n    renderTable(tableIN, SIZE_DATA_CM, \"in\");\n\n    \/\/ Collapsible behavior\n    const toggleBtn = document.getElementById(\"sizeChartToggle\");\n    const panel = document.getElementById(\"sizeChartPanel\");\n\n    function setPanel(open){\n      panel.classList.toggle(\"hidden\", !open);\n      panel.setAttribute(\"aria-hidden\", String(!open));\n      toggleBtn.setAttribute(\"aria-expanded\", String(!!open));\n      if(open){ document.getElementById(\"tab-btn-cm\").focus(); }\n    }\n    toggleBtn.addEventListener(\"click\", () =\u003e {\n      const isOpen = toggleBtn.getAttribute(\"aria-expanded\") === \"true\";\n      setPanel(!isOpen);\n    });\n\n    \/\/ Tabs: click + arrow keys + roving tabindex\n    const tabs = Array.from(document.querySelectorAll('[role=\"tab\"]'));\n    const tabMap = {\n      cm: { btn: document.getElementById(\"tab-btn-cm\"), panel: document.getElementById(\"tab-cm\") },\n      in: { btn: document.getElementById(\"tab-btn-in\"), panel: document.getElementById(\"tab-in\") }\n    };\n\n    function activateTab(key){\n      for(const k in tabMap){\n        const { btn, panel } = tabMap[k];\n        const selected = k === key;\n        btn.setAttribute(\"aria-selected\", String(selected));\n        btn.tabIndex = selected ? 0 : -1;\n        panel.hidden = !selected;\n      }\n      tabMap[key].btn.focus();\n    }\n\n    tabs.forEach(btn =\u003e {\n      btn.addEventListener(\"click\", () =\u003e activateTab(btn.dataset.unit));\n      btn.addEventListener(\"keydown\", (e) =\u003e {\n        const idx = tabs.indexOf(btn);\n        if(e.key === 'ArrowRight' || e.key === 'ArrowDown'){\n          e.preventDefault();\n          const next = tabs[(idx + 1) % tabs.length];\n          activateTab(next.dataset.unit);\n        } else if(e.key === 'ArrowLeft' || e.key === 'ArrowUp'){\n          e.preventDefault();\n          const prev = tabs[(idx - 1 + tabs.length) % tabs.length];\n          activateTab(prev.dataset.unit);\n        } else if(e.key === 'Home'){\n          e.preventDefault();\n          activateTab(tabs[0].dataset.unit);\n        } else if(e.key === 'End'){\n          e.preventDefault();\n          activateTab(tabs[tabs.length - 1].dataset.unit);\n        }\n      });\n    });\n\n    \/\/ Default active tab\n    activateTab('cm');\n  \u003c\/script\u003e\n\n\n\u003c\/body\u003e","brand":"Washed Warrior","offers":[{"title":"S","offer_id":50202455507291,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50202455540059,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50202455572827,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50202455605595,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50202455638363,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50202455671131,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/variant-image-1_337b33a4-f7b3-431c-b730-946f61745909.jpg?v=1741398306"},{"product_id":"the-fourth-ninja-cloak-shirt","title":"The Fourth Ninja Cloak Shirt","description":"\u003cbody\u003e\n\n\n  \u003cmeta charset=\"utf-8\"\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n  \u003ctitle\u003eProduct + Size Chart — Minimal\u003c\/title\u003e\n  \u003cstyle\u003e\n    :root{\n      --bg:#ffffff;\n      --ink:#0b0c0f;\n      --muted:#6b7280;\n      --line:#eceef1;\n      --accent:#111827;\n      --radius:18px;\n      --radius-sm:10px;\n      --shadow:0 6px 24px rgba(0,0,0,.05);\n      --shadow-soft:0 3px 12px rgba(0,0,0,.05);\n    }\n\n    html,body{height:100%}\n    html{color-scheme:light}\n    body{\n      margin:0;\n      background:var(--bg);\n      color:var(--ink);\n      font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Inter, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif;\n      -webkit-font-smoothing:antialiased;\n      font-size:15px;\n      line-height:1.75;\n      font-weight:300;\n      letter-spacing:.15px;\n    }\n\n    \/* Narrow, minimal container *\/\n    .wrap{\n      max-width: 640px;\n      margin: 56px auto;\n      padding: 0 18px;\n      position: relative;\n    }\n\n    \/* Minimal card *\/\n    .card{\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius);\n      box-shadow: var(--shadow);\n      padding: 28px 26px;\n    }\n\n    .title{\n      margin: 0 0 10px;\n      font-size: clamp(20px, 4.4vw, 26px);\n      font-weight: 700;\n      letter-spacing: -0.015em;\n    }\n\n    .lead{\n      margin: 0;\n      color:#1f2937;\n      max-width: 60ch;\n    }\n\n    .features{\n      list-style: none;\n      padding: 0;\n      margin: 16px 0 0;\n      display: grid;\n      gap: 10px;\n    }\n    .features li{\n      font-weight: 400;\n      display: inline-flex;\n      align-items: baseline;\n      gap: 8px;\n    }\n    .features li::before{\n      content: \"—\";\n      color: var(--accent);\n      opacity:.55;\n      font-weight: 600;\n    }\n\n    \/* Ghost trigger button *\/\n    .size-chart-button-container{ text-align:center; margin: 16px 0 0; }\n    .size-chart-open-button{\n      background:#fff;\n      color:var(--ink);\n      padding: 9px 16px;\n      font-size: 12px;\n      font-weight: 700;\n      letter-spacing:.25px;\n      border-radius: 999px;\n      border: 1px solid var(--ink);\n      cursor: pointer;\n      text-transform: uppercase;\n      transition: transform .15s ease, box-shadow .2s ease, background .2s ease;\n      box-shadow: var(--shadow-soft);\n    }\n    .size-chart-open-button:hover,\n    .size-chart-open-button:focus-visible{\n      transform: translateY(-1px);\n      outline: none;\n      background: #fafafa;\n      box-shadow: 0 10px 26px rgba(0,0,0,.08);\n    }\n\n    \/* Collapse *\/\n    .size-chart-collapse{\n      width: 100%;\n      max-width: 560px;\n      margin: 18px auto 40px;\n      padding: 16px;\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius-sm);\n      box-shadow: var(--shadow-soft);\n    }\n    .hidden{ display:none; }\n\n    \/* Tabs: minimalist underline *\/\n    .size-chart-tabs{\n      display:flex;\n      justify-content:center;\n      gap: 18px;\n      margin-bottom: 12px;\n      border-bottom: 1px solid var(--line);\n      padding-bottom: 2px;\n    }\n    .tab-button{\n      appearance:none;\n      background:transparent;\n      color:var(--muted);\n      padding: 6px 2px;\n      font-size:12px;\n      font-weight:700;\n      letter-spacing:.3px;\n      border:none;\n      border-radius:0;\n      cursor:pointer;\n      position:relative;\n      transition: color .2s ease;\n    }\n    .tab-button:hover,\n    .tab-button:focus-visible{\n      color:var(--ink);\n      outline:none;\n    }\n    .tab-button[aria-selected=\"true\"]{\n      color:var(--ink);\n    }\n    .tab-button[aria-selected=\"true\"]::after{\n      content:\"\";\n      position:absolute;\n      left:0; right:0; bottom:-3px;\n      height: 2px;\n      background: var(--accent);\n      border-radius: 2px;\n    }\n\n    \/* Table: soft row dividers only *\/\n    .size-chart-table{\n      width:100%;\n      border-collapse: collapse;\n      background:#fff;\n    }\n    .size-chart-table th,\n    .size-chart-table td{\n      text-align:center;\n      padding: 10px 6px;\n      font-size:12px;\n      color:var(--ink);\n      border: none;\n      border-bottom: 1px solid var(--line);\n    }\n    .size-chart-table th{\n      font-weight: 700;\n      background: #fbfcfd;\n    }\n    .size-chart-table td:first-child,\n    .size-chart-table th:first-child{\n      text-align:left;\n      padding-left: 6px;\n      font-weight: 600;\n    }\n    .size-chart-table tbody tr:last-child td{\n      border-bottom: none;\n    }\n\n    .size-chart-note{\n      margin-top: 10px;\n      font-size: 11.5px;\n      color: var(--muted);\n      text-align: center;\n    }\n\n    @media (max-width:660px){\n      .wrap{ margin:44px auto; padding:0 14px; }\n      .card{ padding: 24px 20px; }\n      .size-chart-collapse{ max-width: 100%; }\n    }\n  \u003c\/style\u003e\n\n\n  \u003cmain class=\"wrap\" aria-labelledby=\"product-heading\"\u003e\n    \u003csection class=\"card\" aria-describedby=\"product-desc\"\u003e\n      \u003ch1 class=\"title\" id=\"product-heading\"\u003eBuilt for the Long Term\u003c\/h1\u003e\n      \u003cp class=\"lead\" id=\"product-desc\"\u003e\n        We make pieces to last. Cut from ultra-smooth 100% polyester mesh for cool comfort and durability, then\n        finished with professional-grade printing that resists cracking and fading. Everyday-ready, season after season.\n      \u003c\/p\u003e\n      \u003cul class=\"features\" role=\"list\"\u003e\n        \u003cli\u003e100% Polyester Mesh\u003c\/li\u003e\n        \u003cli\u003eWith pockets\u003c\/li\u003e\n        \u003cli\u003eHigh-quality printing\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/section\u003e\n\n    \u003c!-- Trigger --\u003e\n    \u003cdiv class=\"size-chart-button-container\"\u003e\n      \u003cbutton id=\"sizeChartToggle\" class=\"size-chart-open-button\" aria-expanded=\"false\" aria-controls=\"sizeChartPanel\"\u003e\n        Size Chart For Shirt\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Collapsible size chart --\u003e\n    \u003csection id=\"sizeChartPanel\" class=\"size-chart-collapse hidden\" aria-hidden=\"true\"\u003e\n      \u003c!-- Tabs --\u003e\n      \u003cdiv class=\"size-chart-tabs\" role=\"tablist\" aria-label=\"Size chart units\"\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-cm\" aria-selected=\"true\" aria-controls=\"tab-cm\" tabindex=\"0\" data-unit=\"cm\"\u003eCM\u003c\/button\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-in\" aria-selected=\"false\" aria-controls=\"tab-in\" tabindex=\"-1\" data-unit=\"in\"\u003eInches\u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- CM table --\u003e\n      \u003cdiv id=\"tab-cm\" role=\"tabpanel\" aria-labelledby=\"tab-btn-cm\"\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-cm\" aria-label=\"Shirt size chart in centimeters\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Inches table --\u003e\n      \u003cdiv id=\"tab-in\" role=\"tabpanel\" aria-labelledby=\"tab-btn-in\" hidden\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-in\" aria-label=\"Shirt size chart in inches\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003cp class=\"size-chart-note\"\u003e\n        Measurements are garment dimensions. Compare with a tee you own for best fit.\n      \u003c\/p\u003e\n    \u003c\/section\u003e\n\n    \u003cnoscript\u003e\n      \u003cp style=\"text-align:center;font:14px\/1.4 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;color:#555;\"\u003e\n        Enable JavaScript to view the interactive size chart.\n      \u003c\/p\u003e\n    \u003c\/noscript\u003e\n  \u003c\/main\u003e\n\n  \u003cscript\u003e\n    \/* ===== Data (single source of truth in CM) ===== *\/\n    const SIZE_DATA_CM = [\n      { size: \"S\",   length: 72, chest: 112, shoulder: 54,   sleeve: 24 },\n      { size: \"M\",   length: 74, chest: 116, shoulder: 55.5, sleeve: 25 },\n      { size: \"L\",   length: 76, chest: 120, shoulder: 57,   sleeve: 26 },\n      { size: \"XL\",  length: 78, chest: 124, shoulder: 58.5, sleeve: 27 },\n      { size: \"XXL\", length: 80, chest: 128, shoulder: 60,   sleeve: 28 },\n      { size: \"XXXL\",length: 82, chest: 132, shoulder: 61.5, sleeve: 29 }\n    ];\n\n    const COLUMNS = [\n      { key: \"size\",     label: \"Size\" },\n      { key: \"length\",   label: \"Length\" },\n      { key: \"chest\",    label: \"Chest\" },\n      { key: \"shoulder\", label: \"Shoulder\" },\n      { key: \"sleeve\",   label: \"Sleeve\" }\n    ];\n\n    \/\/ CM -\u003e inches (rounded to nearest 0.5\")\n    const cmToIn = cm =\u003e Math.round((cm \/ 2.54) * 2) \/ 2;\n\n    function renderTable(target, data, unit){\n      const thead = document.createElement(\"thead\");\n      const trh = document.createElement(\"tr\");\n\n      COLUMNS.forEach(col =\u003e {\n        const th = document.createElement(\"th\");\n        th.scope = \"col\";\n        th.textContent = col.key === \"size\" ? col.label : `${col.label} (${unit === \"cm\" ? \"cm\" : \"in\"})`;\n        trh.appendChild(th);\n      });\n      thead.appendChild(trh);\n\n      const tbody = document.createElement(\"tbody\");\n      data.forEach(row =\u003e {\n        const tr = document.createElement(\"tr\");\n        COLUMNS.forEach(col =\u003e {\n          const td = document.createElement(\"td\");\n          if(col.key === \"size\"){\n            td.textContent = row.size;\n            td.style.fontWeight = 600;\n          } else {\n            const val = unit === \"cm\" ? row[col.key] : cmToIn(row[col.key]);\n            td.textContent = Number.isInteger(val) ? String(val) : val.toFixed(1);\n          }\n          tr.appendChild(td);\n        });\n        tbody.appendChild(tr);\n      });\n\n      target.innerHTML = \"\";\n      target.appendChild(thead);\n      target.appendChild(tbody);\n    }\n\n    \/\/ Initial render\n    const tableCM = document.getElementById(\"table-cm\");\n    const tableIN = document.getElementById(\"table-in\");\n    renderTable(tableCM, SIZE_DATA_CM, \"cm\");\n    renderTable(tableIN, SIZE_DATA_CM, \"in\");\n\n    \/\/ Collapsible behavior\n    const toggleBtn = document.getElementById(\"sizeChartToggle\");\n    const panel = document.getElementById(\"sizeChartPanel\");\n\n    function setPanel(open){\n      panel.classList.toggle(\"hidden\", !open);\n      panel.setAttribute(\"aria-hidden\", String(!open));\n      toggleBtn.setAttribute(\"aria-expanded\", String(!!open));\n      if(open){ document.getElementById(\"tab-btn-cm\").focus(); }\n    }\n    toggleBtn.addEventListener(\"click\", () =\u003e {\n      const isOpen = toggleBtn.getAttribute(\"aria-expanded\") === \"true\";\n      setPanel(!isOpen);\n    });\n\n    \/\/ Tabs: click + arrow keys + roving tabindex\n    const tabs = Array.from(document.querySelectorAll('[role=\"tab\"]'));\n    const tabMap = {\n      cm: { btn: document.getElementById(\"tab-btn-cm\"), panel: document.getElementById(\"tab-cm\") },\n      in: { btn: document.getElementById(\"tab-btn-in\"), panel: document.getElementById(\"tab-in\") }\n    };\n\n    function activateTab(key){\n      for(const k in tabMap){\n        const { btn, panel } = tabMap[k];\n        const selected = k === key;\n        btn.setAttribute(\"aria-selected\", String(selected));\n        btn.tabIndex = selected ? 0 : -1;\n        panel.hidden = !selected;\n      }\n      tabMap[key].btn.focus();\n    }\n\n    tabs.forEach(btn =\u003e {\n      btn.addEventListener(\"click\", () =\u003e activateTab(btn.dataset.unit));\n      btn.addEventListener(\"keydown\", (e) =\u003e {\n        const idx = tabs.indexOf(btn);\n        if(e.key === 'ArrowRight' || e.key === 'ArrowDown'){\n          e.preventDefault();\n          const next = tabs[(idx + 1) % tabs.length];\n          activateTab(next.dataset.unit);\n        } else if(e.key === 'ArrowLeft' || e.key === 'ArrowUp'){\n          e.preventDefault();\n          const prev = tabs[(idx - 1 + tabs.length) % tabs.length];\n          activateTab(prev.dataset.unit);\n        } else if(e.key === 'Home'){\n          e.preventDefault();\n          activateTab(tabs[0].dataset.unit);\n        } else if(e.key === 'End'){\n          e.preventDefault();\n          activateTab(tabs[tabs.length - 1].dataset.unit);\n        }\n      });\n    });\n\n    \/\/ Default active tab\n    activateTab('cm');\n  \u003c\/script\u003e\n\n\n\u003c\/body\u003e","brand":"Washed Warrior","offers":[{"title":"S","offer_id":50202461372763,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50202461405531,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50202461438299,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50202461471067,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50202461503835,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50202461536603,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/variant-image-2.jpg?v=1741398517"},{"product_id":"mystic-ninja-koi-tee","title":"Mystic Ninja Koi Tee","description":"\u003cbody\u003e\n\n\n  \u003cmeta charset=\"utf-8\"\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n  \u003ctitle\u003eProduct + Size Chart — Minimal\u003c\/title\u003e\n  \u003cstyle\u003e\n    :root{\n      --bg:#ffffff;\n      --ink:#0b0c0f;\n      --muted:#6b7280;\n      --line:#eceef1;\n      --accent:#111827;\n      --radius:18px;\n      --radius-sm:10px;\n      --shadow:0 6px 24px rgba(0,0,0,.05);\n      --shadow-soft:0 3px 12px rgba(0,0,0,.05);\n    }\n\n    html,body{height:100%}\n    html{color-scheme:light}\n    body{\n      margin:0;\n      background:var(--bg);\n      color:var(--ink);\n      font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Inter, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif;\n      -webkit-font-smoothing:antialiased;\n      font-size:15px;\n      line-height:1.75;\n      font-weight:300;\n      letter-spacing:.15px;\n    }\n\n    \/* Narrow, minimal container *\/\n    .wrap{\n      max-width: 640px;\n      margin: 56px auto;\n      padding: 0 18px;\n      position: relative;\n    }\n\n    \/* Minimal card *\/\n    .card{\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius);\n      box-shadow: var(--shadow);\n      padding: 28px 26px;\n    }\n\n    .title{\n      margin: 0 0 10px;\n      font-size: clamp(20px, 4.4vw, 26px);\n      font-weight: 700;\n      letter-spacing: -0.015em;\n    }\n\n    .lead{\n      margin: 0;\n      color:#1f2937;\n      max-width: 60ch;\n    }\n\n    .features{\n      list-style: none;\n      padding: 0;\n      margin: 16px 0 0;\n      display: grid;\n      gap: 10px;\n    }\n    .features li{\n      font-weight: 400;\n      display: inline-flex;\n      align-items: baseline;\n      gap: 8px;\n    }\n    .features li::before{\n      content: \"—\";\n      color: var(--accent);\n      opacity:.55;\n      font-weight: 600;\n    }\n\n    \/* Ghost trigger button *\/\n    .size-chart-button-container{ text-align:center; margin: 16px 0 0; }\n    .size-chart-open-button{\n      background:#fff;\n      color:var(--ink);\n      padding: 9px 16px;\n      font-size: 12px;\n      font-weight: 700;\n      letter-spacing:.25px;\n      border-radius: 999px;\n      border: 1px solid var(--ink);\n      cursor: pointer;\n      text-transform: uppercase;\n      transition: transform .15s ease, box-shadow .2s ease, background .2s ease;\n      box-shadow: var(--shadow-soft);\n    }\n    .size-chart-open-button:hover,\n    .size-chart-open-button:focus-visible{\n      transform: translateY(-1px);\n      outline: none;\n      background: #fafafa;\n      box-shadow: 0 10px 26px rgba(0,0,0,.08);\n    }\n\n    \/* Collapse *\/\n    .size-chart-collapse{\n      width: 100%;\n      max-width: 560px;\n      margin: 18px auto 40px;\n      padding: 16px;\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius-sm);\n      box-shadow: var(--shadow-soft);\n    }\n    .hidden{ display:none; }\n\n    \/* Tabs: minimalist underline *\/\n    .size-chart-tabs{\n      display:flex;\n      justify-content:center;\n      gap: 18px;\n      margin-bottom: 12px;\n      border-bottom: 1px solid var(--line);\n      padding-bottom: 2px;\n    }\n    .tab-button{\n      appearance:none;\n      background:transparent;\n      color:var(--muted);\n      padding: 6px 2px;\n      font-size:12px;\n      font-weight:700;\n      letter-spacing:.3px;\n      border:none;\n      border-radius:0;\n      cursor:pointer;\n      position:relative;\n      transition: color .2s ease;\n    }\n    .tab-button:hover,\n    .tab-button:focus-visible{\n      color:var(--ink);\n      outline:none;\n    }\n    .tab-button[aria-selected=\"true\"]{\n      color:var(--ink);\n    }\n    .tab-button[aria-selected=\"true\"]::after{\n      content:\"\";\n      position:absolute;\n      left:0; right:0; bottom:-3px;\n      height: 2px;\n      background: var(--accent);\n      border-radius: 2px;\n    }\n\n    \/* Table: soft row dividers only *\/\n    .size-chart-table{\n      width:100%;\n      border-collapse: collapse;\n      background:#fff;\n    }\n    .size-chart-table th,\n    .size-chart-table td{\n      text-align:center;\n      padding: 10px 6px;\n      font-size:12px;\n      color:var(--ink);\n      border: none;\n      border-bottom: 1px solid var(--line);\n    }\n    .size-chart-table th{\n      font-weight: 700;\n      background: #fbfcfd;\n    }\n    .size-chart-table td:first-child,\n    .size-chart-table th:first-child{\n      text-align:left;\n      padding-left: 6px;\n      font-weight: 600;\n    }\n    .size-chart-table tbody tr:last-child td{\n      border-bottom: none;\n    }\n\n    .size-chart-note{\n      margin-top: 10px;\n      font-size: 11.5px;\n      color: var(--muted);\n      text-align: center;\n    }\n\n    @media (max-width:660px){\n      .wrap{ margin:44px auto; padding:0 14px; }\n      .card{ padding: 24px 20px; }\n      .size-chart-collapse{ max-width: 100%; }\n    }\n  \u003c\/style\u003e\n\n\n  \u003cmain class=\"wrap\" aria-labelledby=\"product-heading\"\u003e\n    \u003csection class=\"card\" aria-describedby=\"product-desc\"\u003e\n      \u003ch1 class=\"title\" id=\"product-heading\"\u003eBuilt for the Long Term\u003c\/h1\u003e\n      \u003cp class=\"lead\" id=\"product-desc\"\u003e\n        We make pieces to last. Cut from ultra-smooth 100% polyester mesh for cool comfort and durability, then\n        finished with professional-grade printing that resists cracking and fading. Everyday-ready, season after season.\n      \u003c\/p\u003e\n      \u003cul class=\"features\" role=\"list\"\u003e\n        \u003cli\u003e100% Polyester Mesh\u003c\/li\u003e\n        \u003cli\u003eWith pockets\u003c\/li\u003e\n        \u003cli\u003eHigh-quality printing\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/section\u003e\n\n    \u003c!-- Trigger --\u003e\n    \u003cdiv class=\"size-chart-button-container\"\u003e\n      \u003cbutton id=\"sizeChartToggle\" class=\"size-chart-open-button\" aria-expanded=\"false\" aria-controls=\"sizeChartPanel\"\u003e\n        Size Chart For Shirt\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Collapsible size chart --\u003e\n    \u003csection id=\"sizeChartPanel\" class=\"size-chart-collapse hidden\" aria-hidden=\"true\"\u003e\n      \u003c!-- Tabs --\u003e\n      \u003cdiv class=\"size-chart-tabs\" role=\"tablist\" aria-label=\"Size chart units\"\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-cm\" aria-selected=\"true\" aria-controls=\"tab-cm\" tabindex=\"0\" data-unit=\"cm\"\u003eCM\u003c\/button\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-in\" aria-selected=\"false\" aria-controls=\"tab-in\" tabindex=\"-1\" data-unit=\"in\"\u003eInches\u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- CM table --\u003e\n      \u003cdiv id=\"tab-cm\" role=\"tabpanel\" aria-labelledby=\"tab-btn-cm\"\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-cm\" aria-label=\"Shirt size chart in centimeters\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Inches table --\u003e\n      \u003cdiv id=\"tab-in\" role=\"tabpanel\" aria-labelledby=\"tab-btn-in\" hidden\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-in\" aria-label=\"Shirt size chart in inches\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003cp class=\"size-chart-note\"\u003e\n        Measurements are garment dimensions. Compare with a tee you own for best fit.\n      \u003c\/p\u003e\n    \u003c\/section\u003e\n\n    \u003cnoscript\u003e\n      \u003cp style=\"text-align:center;font:14px\/1.4 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;color:#555;\"\u003e\n        Enable JavaScript to view the interactive size chart.\n      \u003c\/p\u003e\n    \u003c\/noscript\u003e\n  \u003c\/main\u003e\n\n  \u003cscript\u003e\n    \/* ===== Data (single source of truth in CM) ===== *\/\n    const SIZE_DATA_CM = [\n      { size: \"S\",   length: 72, chest: 112, shoulder: 54,   sleeve: 24 },\n      { size: \"M\",   length: 74, chest: 116, shoulder: 55.5, sleeve: 25 },\n      { size: \"L\",   length: 76, chest: 120, shoulder: 57,   sleeve: 26 },\n      { size: \"XL\",  length: 78, chest: 124, shoulder: 58.5, sleeve: 27 },\n      { size: \"XXL\", length: 80, chest: 128, shoulder: 60,   sleeve: 28 },\n      { size: \"XXXL\",length: 82, chest: 132, shoulder: 61.5, sleeve: 29 }\n    ];\n\n    const COLUMNS = [\n      { key: \"size\",     label: \"Size\" },\n      { key: \"length\",   label: \"Length\" },\n      { key: \"chest\",    label: \"Chest\" },\n      { key: \"shoulder\", label: \"Shoulder\" },\n      { key: \"sleeve\",   label: \"Sleeve\" }\n    ];\n\n    \/\/ CM -\u003e inches (rounded to nearest 0.5\")\n    const cmToIn = cm =\u003e Math.round((cm \/ 2.54) * 2) \/ 2;\n\n    function renderTable(target, data, unit){\n      const thead = document.createElement(\"thead\");\n      const trh = document.createElement(\"tr\");\n\n      COLUMNS.forEach(col =\u003e {\n        const th = document.createElement(\"th\");\n        th.scope = \"col\";\n        th.textContent = col.key === \"size\" ? col.label : `${col.label} (${unit === \"cm\" ? \"cm\" : \"in\"})`;\n        trh.appendChild(th);\n      });\n      thead.appendChild(trh);\n\n      const tbody = document.createElement(\"tbody\");\n      data.forEach(row =\u003e {\n        const tr = document.createElement(\"tr\");\n        COLUMNS.forEach(col =\u003e {\n          const td = document.createElement(\"td\");\n          if(col.key === \"size\"){\n            td.textContent = row.size;\n            td.style.fontWeight = 600;\n          } else {\n            const val = unit === \"cm\" ? row[col.key] : cmToIn(row[col.key]);\n            td.textContent = Number.isInteger(val) ? String(val) : val.toFixed(1);\n          }\n          tr.appendChild(td);\n        });\n        tbody.appendChild(tr);\n      });\n\n      target.innerHTML = \"\";\n      target.appendChild(thead);\n      target.appendChild(tbody);\n    }\n\n    \/\/ Initial render\n    const tableCM = document.getElementById(\"table-cm\");\n    const tableIN = document.getElementById(\"table-in\");\n    renderTable(tableCM, SIZE_DATA_CM, \"cm\");\n    renderTable(tableIN, SIZE_DATA_CM, \"in\");\n\n    \/\/ Collapsible behavior\n    const toggleBtn = document.getElementById(\"sizeChartToggle\");\n    const panel = document.getElementById(\"sizeChartPanel\");\n\n    function setPanel(open){\n      panel.classList.toggle(\"hidden\", !open);\n      panel.setAttribute(\"aria-hidden\", String(!open));\n      toggleBtn.setAttribute(\"aria-expanded\", String(!!open));\n      if(open){ document.getElementById(\"tab-btn-cm\").focus(); }\n    }\n    toggleBtn.addEventListener(\"click\", () =\u003e {\n      const isOpen = toggleBtn.getAttribute(\"aria-expanded\") === \"true\";\n      setPanel(!isOpen);\n    });\n\n    \/\/ Tabs: click + arrow keys + roving tabindex\n    const tabs = Array.from(document.querySelectorAll('[role=\"tab\"]'));\n    const tabMap = {\n      cm: { btn: document.getElementById(\"tab-btn-cm\"), panel: document.getElementById(\"tab-cm\") },\n      in: { btn: document.getElementById(\"tab-btn-in\"), panel: document.getElementById(\"tab-in\") }\n    };\n\n    function activateTab(key){\n      for(const k in tabMap){\n        const { btn, panel } = tabMap[k];\n        const selected = k === key;\n        btn.setAttribute(\"aria-selected\", String(selected));\n        btn.tabIndex = selected ? 0 : -1;\n        panel.hidden = !selected;\n      }\n      tabMap[key].btn.focus();\n    }\n\n    tabs.forEach(btn =\u003e {\n      btn.addEventListener(\"click\", () =\u003e activateTab(btn.dataset.unit));\n      btn.addEventListener(\"keydown\", (e) =\u003e {\n        const idx = tabs.indexOf(btn);\n        if(e.key === 'ArrowRight' || e.key === 'ArrowDown'){\n          e.preventDefault();\n          const next = tabs[(idx + 1) % tabs.length];\n          activateTab(next.dataset.unit);\n        } else if(e.key === 'ArrowLeft' || e.key === 'ArrowUp'){\n          e.preventDefault();\n          const prev = tabs[(idx - 1 + tabs.length) % tabs.length];\n          activateTab(prev.dataset.unit);\n        } else if(e.key === 'Home'){\n          e.preventDefault();\n          activateTab(tabs[0].dataset.unit);\n        } else if(e.key === 'End'){\n          e.preventDefault();\n          activateTab(tabs[tabs.length - 1].dataset.unit);\n        }\n      });\n    });\n\n    \/\/ Default active tab\n    activateTab('cm');\n  \u003c\/script\u003e\n\n\n\u003c\/body\u003e","brand":"Washed Warrior","offers":[{"title":"S","offer_id":50238777000283,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50238777033051,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50238777065819,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50238777098587,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50238777131355,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50238777164123,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/IMG_0170Large.jpg?v=1741998731"},{"product_id":"shadow-realm-vision-shirt","title":"Shadow Realm Vision Shirt","description":"\u003cbody\u003e\n\n\n  \u003cmeta charset=\"utf-8\"\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n  \u003ctitle\u003eProduct + Size Chart — Minimal\u003c\/title\u003e\n  \u003cstyle\u003e\n    :root{\n      --bg:#ffffff;\n      --ink:#0b0c0f;\n      --muted:#6b7280;\n      --line:#eceef1;\n      --accent:#111827;\n      --radius:18px;\n      --radius-sm:10px;\n      --shadow:0 6px 24px rgba(0,0,0,.05);\n      --shadow-soft:0 3px 12px rgba(0,0,0,.05);\n    }\n\n    html,body{height:100%}\n    html{color-scheme:light}\n    body{\n      margin:0;\n      background:var(--bg);\n      color:var(--ink);\n      font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Inter, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif;\n      -webkit-font-smoothing:antialiased;\n      font-size:15px;\n      line-height:1.75;\n      font-weight:300;\n      letter-spacing:.15px;\n    }\n\n    \/* Narrow, minimal container *\/\n    .wrap{\n      max-width: 640px;\n      margin: 56px auto;\n      padding: 0 18px;\n      position: relative;\n    }\n\n    \/* Minimal card *\/\n    .card{\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius);\n      box-shadow: var(--shadow);\n      padding: 28px 26px;\n    }\n\n    .title{\n      margin: 0 0 10px;\n      font-size: clamp(20px, 4.4vw, 26px);\n      font-weight: 700;\n      letter-spacing: -0.015em;\n    }\n\n    .lead{\n      margin: 0;\n      color:#1f2937;\n      max-width: 60ch;\n    }\n\n    .features{\n      list-style: none;\n      padding: 0;\n      margin: 16px 0 0;\n      display: grid;\n      gap: 10px;\n    }\n    .features li{\n      font-weight: 400;\n      display: inline-flex;\n      align-items: baseline;\n      gap: 8px;\n    }\n    .features li::before{\n      content: \"—\";\n      color: var(--accent);\n      opacity:.55;\n      font-weight: 600;\n    }\n\n    \/* Ghost trigger button *\/\n    .size-chart-button-container{ text-align:center; margin: 16px 0 0; }\n    .size-chart-open-button{\n      background:#fff;\n      color:var(--ink);\n      padding: 9px 16px;\n      font-size: 12px;\n      font-weight: 700;\n      letter-spacing:.25px;\n      border-radius: 999px;\n      border: 1px solid var(--ink);\n      cursor: pointer;\n      text-transform: uppercase;\n      transition: transform .15s ease, box-shadow .2s ease, background .2s ease;\n      box-shadow: var(--shadow-soft);\n    }\n    .size-chart-open-button:hover,\n    .size-chart-open-button:focus-visible{\n      transform: translateY(-1px);\n      outline: none;\n      background: #fafafa;\n      box-shadow: 0 10px 26px rgba(0,0,0,.08);\n    }\n\n    \/* Collapse *\/\n    .size-chart-collapse{\n      width: 100%;\n      max-width: 560px;\n      margin: 18px auto 40px;\n      padding: 16px;\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius-sm);\n      box-shadow: var(--shadow-soft);\n    }\n    .hidden{ display:none; }\n\n    \/* Tabs: minimalist underline *\/\n    .size-chart-tabs{\n      display:flex;\n      justify-content:center;\n      gap: 18px;\n      margin-bottom: 12px;\n      border-bottom: 1px solid var(--line);\n      padding-bottom: 2px;\n    }\n    .tab-button{\n      appearance:none;\n      background:transparent;\n      color:var(--muted);\n      padding: 6px 2px;\n      font-size:12px;\n      font-weight:700;\n      letter-spacing:.3px;\n      border:none;\n      border-radius:0;\n      cursor:pointer;\n      position:relative;\n      transition: color .2s ease;\n    }\n    .tab-button:hover,\n    .tab-button:focus-visible{\n      color:var(--ink);\n      outline:none;\n    }\n    .tab-button[aria-selected=\"true\"]{\n      color:var(--ink);\n    }\n    .tab-button[aria-selected=\"true\"]::after{\n      content:\"\";\n      position:absolute;\n      left:0; right:0; bottom:-3px;\n      height: 2px;\n      background: var(--accent);\n      border-radius: 2px;\n    }\n\n    \/* Table: soft row dividers only *\/\n    .size-chart-table{\n      width:100%;\n      border-collapse: collapse;\n      background:#fff;\n    }\n    .size-chart-table th,\n    .size-chart-table td{\n      text-align:center;\n      padding: 10px 6px;\n      font-size:12px;\n      color:var(--ink);\n      border: none;\n      border-bottom: 1px solid var(--line);\n    }\n    .size-chart-table th{\n      font-weight: 700;\n      background: #fbfcfd;\n    }\n    .size-chart-table td:first-child,\n    .size-chart-table th:first-child{\n      text-align:left;\n      padding-left: 6px;\n      font-weight: 600;\n    }\n    .size-chart-table tbody tr:last-child td{\n      border-bottom: none;\n    }\n\n    .size-chart-note{\n      margin-top: 10px;\n      font-size: 11.5px;\n      color: var(--muted);\n      text-align: center;\n    }\n\n    @media (max-width:660px){\n      .wrap{ margin:44px auto; padding:0 14px; }\n      .card{ padding: 24px 20px; }\n      .size-chart-collapse{ max-width: 100%; }\n    }\n  \u003c\/style\u003e\n\n\n  \u003cmain class=\"wrap\" aria-labelledby=\"product-heading\"\u003e\n    \u003csection class=\"card\" aria-describedby=\"product-desc\"\u003e\n      \u003ch1 class=\"title\" id=\"product-heading\"\u003eBuilt for the Long Term\u003c\/h1\u003e\n      \u003cp class=\"lead\" id=\"product-desc\"\u003e\n        We make pieces to last. Cut from ultra-smooth 100% polyester mesh for cool comfort and durability, then\n        finished with professional-grade printing that resists cracking and fading. Everyday-ready, season after season.\n      \u003c\/p\u003e\n      \u003cul class=\"features\" role=\"list\"\u003e\n        \u003cli\u003e100% Polyester Mesh\u003c\/li\u003e\n        \u003cli\u003eWith pockets\u003c\/li\u003e\n        \u003cli\u003eHigh-quality printing\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/section\u003e\n\n    \u003c!-- Trigger --\u003e\n    \u003cdiv class=\"size-chart-button-container\"\u003e\n      \u003cbutton id=\"sizeChartToggle\" class=\"size-chart-open-button\" aria-expanded=\"false\" aria-controls=\"sizeChartPanel\"\u003e\n        Size Chart For Shirt\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Collapsible size chart --\u003e\n    \u003csection id=\"sizeChartPanel\" class=\"size-chart-collapse hidden\" aria-hidden=\"true\"\u003e\n      \u003c!-- Tabs --\u003e\n      \u003cdiv class=\"size-chart-tabs\" role=\"tablist\" aria-label=\"Size chart units\"\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-cm\" aria-selected=\"true\" aria-controls=\"tab-cm\" tabindex=\"0\" data-unit=\"cm\"\u003eCM\u003c\/button\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-in\" aria-selected=\"false\" aria-controls=\"tab-in\" tabindex=\"-1\" data-unit=\"in\"\u003eInches\u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- CM table --\u003e\n      \u003cdiv id=\"tab-cm\" role=\"tabpanel\" aria-labelledby=\"tab-btn-cm\"\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-cm\" aria-label=\"Shirt size chart in centimeters\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Inches table --\u003e\n      \u003cdiv id=\"tab-in\" role=\"tabpanel\" aria-labelledby=\"tab-btn-in\" hidden\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-in\" aria-label=\"Shirt size chart in inches\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003cp class=\"size-chart-note\"\u003e\n        Measurements are garment dimensions. Compare with a tee you own for best fit.\n      \u003c\/p\u003e\n    \u003c\/section\u003e\n\n    \u003cnoscript\u003e\n      \u003cp style=\"text-align:center;font:14px\/1.4 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;color:#555;\"\u003e\n        Enable JavaScript to view the interactive size chart.\n      \u003c\/p\u003e\n    \u003c\/noscript\u003e\n  \u003c\/main\u003e\n\n  \u003cscript\u003e\n    \/* ===== Data (single source of truth in CM) ===== *\/\n    const SIZE_DATA_CM = [\n      { size: \"S\",   length: 72, chest: 112, shoulder: 54,   sleeve: 24 },\n      { size: \"M\",   length: 74, chest: 116, shoulder: 55.5, sleeve: 25 },\n      { size: \"L\",   length: 76, chest: 120, shoulder: 57,   sleeve: 26 },\n      { size: \"XL\",  length: 78, chest: 124, shoulder: 58.5, sleeve: 27 },\n      { size: \"XXL\", length: 80, chest: 128, shoulder: 60,   sleeve: 28 },\n      { size: \"XXXL\",length: 82, chest: 132, shoulder: 61.5, sleeve: 29 }\n    ];\n\n    const COLUMNS = [\n      { key: \"size\",     label: \"Size\" },\n      { key: \"length\",   label: \"Length\" },\n      { key: \"chest\",    label: \"Chest\" },\n      { key: \"shoulder\", label: \"Shoulder\" },\n      { key: \"sleeve\",   label: \"Sleeve\" }\n    ];\n\n    \/\/ CM -\u003e inches (rounded to nearest 0.5\")\n    const cmToIn = cm =\u003e Math.round((cm \/ 2.54) * 2) \/ 2;\n\n    function renderTable(target, data, unit){\n      const thead = document.createElement(\"thead\");\n      const trh = document.createElement(\"tr\");\n\n      COLUMNS.forEach(col =\u003e {\n        const th = document.createElement(\"th\");\n        th.scope = \"col\";\n        th.textContent = col.key === \"size\" ? col.label : `${col.label} (${unit === \"cm\" ? \"cm\" : \"in\"})`;\n        trh.appendChild(th);\n      });\n      thead.appendChild(trh);\n\n      const tbody = document.createElement(\"tbody\");\n      data.forEach(row =\u003e {\n        const tr = document.createElement(\"tr\");\n        COLUMNS.forEach(col =\u003e {\n          const td = document.createElement(\"td\");\n          if(col.key === \"size\"){\n            td.textContent = row.size;\n            td.style.fontWeight = 600;\n          } else {\n            const val = unit === \"cm\" ? row[col.key] : cmToIn(row[col.key]);\n            td.textContent = Number.isInteger(val) ? String(val) : val.toFixed(1);\n          }\n          tr.appendChild(td);\n        });\n        tbody.appendChild(tr);\n      });\n\n      target.innerHTML = \"\";\n      target.appendChild(thead);\n      target.appendChild(tbody);\n    }\n\n    \/\/ Initial render\n    const tableCM = document.getElementById(\"table-cm\");\n    const tableIN = document.getElementById(\"table-in\");\n    renderTable(tableCM, SIZE_DATA_CM, \"cm\");\n    renderTable(tableIN, SIZE_DATA_CM, \"in\");\n\n    \/\/ Collapsible behavior\n    const toggleBtn = document.getElementById(\"sizeChartToggle\");\n    const panel = document.getElementById(\"sizeChartPanel\");\n\n    function setPanel(open){\n      panel.classList.toggle(\"hidden\", !open);\n      panel.setAttribute(\"aria-hidden\", String(!open));\n      toggleBtn.setAttribute(\"aria-expanded\", String(!!open));\n      if(open){ document.getElementById(\"tab-btn-cm\").focus(); }\n    }\n    toggleBtn.addEventListener(\"click\", () =\u003e {\n      const isOpen = toggleBtn.getAttribute(\"aria-expanded\") === \"true\";\n      setPanel(!isOpen);\n    });\n\n    \/\/ Tabs: click + arrow keys + roving tabindex\n    const tabs = Array.from(document.querySelectorAll('[role=\"tab\"]'));\n    const tabMap = {\n      cm: { btn: document.getElementById(\"tab-btn-cm\"), panel: document.getElementById(\"tab-cm\") },\n      in: { btn: document.getElementById(\"tab-btn-in\"), panel: document.getElementById(\"tab-in\") }\n    };\n\n    function activateTab(key){\n      for(const k in tabMap){\n        const { btn, panel } = tabMap[k];\n        const selected = k === key;\n        btn.setAttribute(\"aria-selected\", String(selected));\n        btn.tabIndex = selected ? 0 : -1;\n        panel.hidden = !selected;\n      }\n      tabMap[key].btn.focus();\n    }\n\n    tabs.forEach(btn =\u003e {\n      btn.addEventListener(\"click\", () =\u003e activateTab(btn.dataset.unit));\n      btn.addEventListener(\"keydown\", (e) =\u003e {\n        const idx = tabs.indexOf(btn);\n        if(e.key === 'ArrowRight' || e.key === 'ArrowDown'){\n          e.preventDefault();\n          const next = tabs[(idx + 1) % tabs.length];\n          activateTab(next.dataset.unit);\n        } else if(e.key === 'ArrowLeft' || e.key === 'ArrowUp'){\n          e.preventDefault();\n          const prev = tabs[(idx - 1 + tabs.length) % tabs.length];\n          activateTab(prev.dataset.unit);\n        } else if(e.key === 'Home'){\n          e.preventDefault();\n          activateTab(tabs[0].dataset.unit);\n        } else if(e.key === 'End'){\n          e.preventDefault();\n          activateTab(tabs[tabs.length - 1].dataset.unit);\n        }\n      });\n    });\n\n    \/\/ Default active tab\n    activateTab('cm');\n  \u003c\/script\u003e\n\n\n\u003c\/body\u003e","brand":"Washed Warrior","offers":[{"title":"S","offer_id":50238781718875,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50238781751643,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50238781784411,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50238781817179,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50238781849947,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50238781882715,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/IMG_0166Large.jpg?v=1741998868"},{"product_id":"lone-ninja-eclipse-shirt","title":"Lone Ninja Eclipse Shirt","description":"\u003cbody\u003e\n\n\n  \u003cmeta charset=\"utf-8\"\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n  \u003ctitle\u003eProduct + Size Chart — Minimal\u003c\/title\u003e\n  \u003cstyle\u003e\n    :root{\n      --bg:#ffffff;\n      --ink:#0b0c0f;\n      --muted:#6b7280;\n      --line:#eceef1;\n      --accent:#111827;\n      --radius:18px;\n      --radius-sm:10px;\n      --shadow:0 6px 24px rgba(0,0,0,.05);\n      --shadow-soft:0 3px 12px rgba(0,0,0,.05);\n    }\n\n    html,body{height:100%}\n    html{color-scheme:light}\n    body{\n      margin:0;\n      background:var(--bg);\n      color:var(--ink);\n      font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Inter, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif;\n      -webkit-font-smoothing:antialiased;\n      font-size:15px;\n      line-height:1.75;\n      font-weight:300;\n      letter-spacing:.15px;\n    }\n\n    \/* Narrow, minimal container *\/\n    .wrap{\n      max-width: 640px;\n      margin: 56px auto;\n      padding: 0 18px;\n      position: relative;\n    }\n\n    \/* Minimal card *\/\n    .card{\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius);\n      box-shadow: var(--shadow);\n      padding: 28px 26px;\n    }\n\n    .title{\n      margin: 0 0 10px;\n      font-size: clamp(20px, 4.4vw, 26px);\n      font-weight: 700;\n      letter-spacing: -0.015em;\n    }\n\n    .lead{\n      margin: 0;\n      color:#1f2937;\n      max-width: 60ch;\n    }\n\n    .features{\n      list-style: none;\n      padding: 0;\n      margin: 16px 0 0;\n      display: grid;\n      gap: 10px;\n    }\n    .features li{\n      font-weight: 400;\n      display: inline-flex;\n      align-items: baseline;\n      gap: 8px;\n    }\n    .features li::before{\n      content: \"—\";\n      color: var(--accent);\n      opacity:.55;\n      font-weight: 600;\n    }\n\n    \/* Ghost trigger button *\/\n    .size-chart-button-container{ text-align:center; margin: 16px 0 0; }\n    .size-chart-open-button{\n      background:#fff;\n      color:var(--ink);\n      padding: 9px 16px;\n      font-size: 12px;\n      font-weight: 700;\n      letter-spacing:.25px;\n      border-radius: 999px;\n      border: 1px solid var(--ink);\n      cursor: pointer;\n      text-transform: uppercase;\n      transition: transform .15s ease, box-shadow .2s ease, background .2s ease;\n      box-shadow: var(--shadow-soft);\n    }\n    .size-chart-open-button:hover,\n    .size-chart-open-button:focus-visible{\n      transform: translateY(-1px);\n      outline: none;\n      background: #fafafa;\n      box-shadow: 0 10px 26px rgba(0,0,0,.08);\n    }\n\n    \/* Collapse *\/\n    .size-chart-collapse{\n      width: 100%;\n      max-width: 560px;\n      margin: 18px auto 40px;\n      padding: 16px;\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius-sm);\n      box-shadow: var(--shadow-soft);\n    }\n    .hidden{ display:none; }\n\n    \/* Tabs: minimalist underline *\/\n    .size-chart-tabs{\n      display:flex;\n      justify-content:center;\n      gap: 18px;\n      margin-bottom: 12px;\n      border-bottom: 1px solid var(--line);\n      padding-bottom: 2px;\n    }\n    .tab-button{\n      appearance:none;\n      background:transparent;\n      color:var(--muted);\n      padding: 6px 2px;\n      font-size:12px;\n      font-weight:700;\n      letter-spacing:.3px;\n      border:none;\n      border-radius:0;\n      cursor:pointer;\n      position:relative;\n      transition: color .2s ease;\n    }\n    .tab-button:hover,\n    .tab-button:focus-visible{\n      color:var(--ink);\n      outline:none;\n    }\n    .tab-button[aria-selected=\"true\"]{\n      color:var(--ink);\n    }\n    .tab-button[aria-selected=\"true\"]::after{\n      content:\"\";\n      position:absolute;\n      left:0; right:0; bottom:-3px;\n      height: 2px;\n      background: var(--accent);\n      border-radius: 2px;\n    }\n\n    \/* Table: soft row dividers only *\/\n    .size-chart-table{\n      width:100%;\n      border-collapse: collapse;\n      background:#fff;\n    }\n    .size-chart-table th,\n    .size-chart-table td{\n      text-align:center;\n      padding: 10px 6px;\n      font-size:12px;\n      color:var(--ink);\n      border: none;\n      border-bottom: 1px solid var(--line);\n    }\n    .size-chart-table th{\n      font-weight: 700;\n      background: #fbfcfd;\n    }\n    .size-chart-table td:first-child,\n    .size-chart-table th:first-child{\n      text-align:left;\n      padding-left: 6px;\n      font-weight: 600;\n    }\n    .size-chart-table tbody tr:last-child td{\n      border-bottom: none;\n    }\n\n    .size-chart-note{\n      margin-top: 10px;\n      font-size: 11.5px;\n      color: var(--muted);\n      text-align: center;\n    }\n\n    @media (max-width:660px){\n      .wrap{ margin:44px auto; padding:0 14px; }\n      .card{ padding: 24px 20px; }\n      .size-chart-collapse{ max-width: 100%; }\n    }\n  \u003c\/style\u003e\n\n\n  \u003cmain class=\"wrap\" aria-labelledby=\"product-heading\"\u003e\n    \u003csection class=\"card\" aria-describedby=\"product-desc\"\u003e\n      \u003ch1 class=\"title\" id=\"product-heading\"\u003eBuilt for the Long Term\u003c\/h1\u003e\n      \u003cp class=\"lead\" id=\"product-desc\"\u003e\n        We make pieces to last. Cut from ultra-smooth 100% polyester mesh for cool comfort and durability, then\n        finished with professional-grade printing that resists cracking and fading. Everyday-ready, season after season.\n      \u003c\/p\u003e\n      \u003cul class=\"features\" role=\"list\"\u003e\n        \u003cli\u003e100% Polyester Mesh\u003c\/li\u003e\n        \u003cli\u003eWith pockets\u003c\/li\u003e\n        \u003cli\u003eHigh-quality printing\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/section\u003e\n\n    \u003c!-- Trigger --\u003e\n    \u003cdiv class=\"size-chart-button-container\"\u003e\n      \u003cbutton id=\"sizeChartToggle\" class=\"size-chart-open-button\" aria-expanded=\"false\" aria-controls=\"sizeChartPanel\"\u003e\n        Size Chart For Shirt\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Collapsible size chart --\u003e\n    \u003csection id=\"sizeChartPanel\" class=\"size-chart-collapse hidden\" aria-hidden=\"true\"\u003e\n      \u003c!-- Tabs --\u003e\n      \u003cdiv class=\"size-chart-tabs\" role=\"tablist\" aria-label=\"Size chart units\"\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-cm\" aria-selected=\"true\" aria-controls=\"tab-cm\" tabindex=\"0\" data-unit=\"cm\"\u003eCM\u003c\/button\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-in\" aria-selected=\"false\" aria-controls=\"tab-in\" tabindex=\"-1\" data-unit=\"in\"\u003eInches\u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- CM table --\u003e\n      \u003cdiv id=\"tab-cm\" role=\"tabpanel\" aria-labelledby=\"tab-btn-cm\"\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-cm\" aria-label=\"Shirt size chart in centimeters\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Inches table --\u003e\n      \u003cdiv id=\"tab-in\" role=\"tabpanel\" aria-labelledby=\"tab-btn-in\" hidden\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-in\" aria-label=\"Shirt size chart in inches\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003cp class=\"size-chart-note\"\u003e\n        Measurements are garment dimensions. Compare with a tee you own for best fit.\n      \u003c\/p\u003e\n    \u003c\/section\u003e\n\n    \u003cnoscript\u003e\n      \u003cp style=\"text-align:center;font:14px\/1.4 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;color:#555;\"\u003e\n        Enable JavaScript to view the interactive size chart.\n      \u003c\/p\u003e\n    \u003c\/noscript\u003e\n  \u003c\/main\u003e\n\n  \u003cscript\u003e\n    \/* ===== Data (single source of truth in CM) ===== *\/\n    const SIZE_DATA_CM = [\n      { size: \"S\",   length: 72, chest: 112, shoulder: 54,   sleeve: 24 },\n      { size: \"M\",   length: 74, chest: 116, shoulder: 55.5, sleeve: 25 },\n      { size: \"L\",   length: 76, chest: 120, shoulder: 57,   sleeve: 26 },\n      { size: \"XL\",  length: 78, chest: 124, shoulder: 58.5, sleeve: 27 },\n      { size: \"XXL\", length: 80, chest: 128, shoulder: 60,   sleeve: 28 },\n      { size: \"XXXL\",length: 82, chest: 132, shoulder: 61.5, sleeve: 29 }\n    ];\n\n    const COLUMNS = [\n      { key: \"size\",     label: \"Size\" },\n      { key: \"length\",   label: \"Length\" },\n      { key: \"chest\",    label: \"Chest\" },\n      { key: \"shoulder\", label: \"Shoulder\" },\n      { key: \"sleeve\",   label: \"Sleeve\" }\n    ];\n\n    \/\/ CM -\u003e inches (rounded to nearest 0.5\")\n    const cmToIn = cm =\u003e Math.round((cm \/ 2.54) * 2) \/ 2;\n\n    function renderTable(target, data, unit){\n      const thead = document.createElement(\"thead\");\n      const trh = document.createElement(\"tr\");\n\n      COLUMNS.forEach(col =\u003e {\n        const th = document.createElement(\"th\");\n        th.scope = \"col\";\n        th.textContent = col.key === \"size\" ? col.label : `${col.label} (${unit === \"cm\" ? \"cm\" : \"in\"})`;\n        trh.appendChild(th);\n      });\n      thead.appendChild(trh);\n\n      const tbody = document.createElement(\"tbody\");\n      data.forEach(row =\u003e {\n        const tr = document.createElement(\"tr\");\n        COLUMNS.forEach(col =\u003e {\n          const td = document.createElement(\"td\");\n          if(col.key === \"size\"){\n            td.textContent = row.size;\n            td.style.fontWeight = 600;\n          } else {\n            const val = unit === \"cm\" ? row[col.key] : cmToIn(row[col.key]);\n            td.textContent = Number.isInteger(val) ? String(val) : val.toFixed(1);\n          }\n          tr.appendChild(td);\n        });\n        tbody.appendChild(tr);\n      });\n\n      target.innerHTML = \"\";\n      target.appendChild(thead);\n      target.appendChild(tbody);\n    }\n\n    \/\/ Initial render\n    const tableCM = document.getElementById(\"table-cm\");\n    const tableIN = document.getElementById(\"table-in\");\n    renderTable(tableCM, SIZE_DATA_CM, \"cm\");\n    renderTable(tableIN, SIZE_DATA_CM, \"in\");\n\n    \/\/ Collapsible behavior\n    const toggleBtn = document.getElementById(\"sizeChartToggle\");\n    const panel = document.getElementById(\"sizeChartPanel\");\n\n    function setPanel(open){\n      panel.classList.toggle(\"hidden\", !open);\n      panel.setAttribute(\"aria-hidden\", String(!open));\n      toggleBtn.setAttribute(\"aria-expanded\", String(!!open));\n      if(open){ document.getElementById(\"tab-btn-cm\").focus(); }\n    }\n    toggleBtn.addEventListener(\"click\", () =\u003e {\n      const isOpen = toggleBtn.getAttribute(\"aria-expanded\") === \"true\";\n      setPanel(!isOpen);\n    });\n\n    \/\/ Tabs: click + arrow keys + roving tabindex\n    const tabs = Array.from(document.querySelectorAll('[role=\"tab\"]'));\n    const tabMap = {\n      cm: { btn: document.getElementById(\"tab-btn-cm\"), panel: document.getElementById(\"tab-cm\") },\n      in: { btn: document.getElementById(\"tab-btn-in\"), panel: document.getElementById(\"tab-in\") }\n    };\n\n    function activateTab(key){\n      for(const k in tabMap){\n        const { btn, panel } = tabMap[k];\n        const selected = k === key;\n        btn.setAttribute(\"aria-selected\", String(selected));\n        btn.tabIndex = selected ? 0 : -1;\n        panel.hidden = !selected;\n      }\n      tabMap[key].btn.focus();\n    }\n\n    tabs.forEach(btn =\u003e {\n      btn.addEventListener(\"click\", () =\u003e activateTab(btn.dataset.unit));\n      btn.addEventListener(\"keydown\", (e) =\u003e {\n        const idx = tabs.indexOf(btn);\n        if(e.key === 'ArrowRight' || e.key === 'ArrowDown'){\n          e.preventDefault();\n          const next = tabs[(idx + 1) % tabs.length];\n          activateTab(next.dataset.unit);\n        } else if(e.key === 'ArrowLeft' || e.key === 'ArrowUp'){\n          e.preventDefault();\n          const prev = tabs[(idx - 1 + tabs.length) % tabs.length];\n          activateTab(prev.dataset.unit);\n        } else if(e.key === 'Home'){\n          e.preventDefault();\n          activateTab(tabs[0].dataset.unit);\n        } else if(e.key === 'End'){\n          e.preventDefault();\n          activateTab(tabs[tabs.length - 1].dataset.unit);\n        }\n      });\n    });\n\n    \/\/ Default active tab\n    activateTab('cm');\n  \u003c\/script\u003e\n\n\n\u003c\/body\u003e","brand":"Washed Warrior","offers":[{"title":"S","offer_id":50238783553883,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50238783586651,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50238783619419,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50238783652187,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50238783684955,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50238783717723,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/IMG_0168Large.jpg?v=1741998958"},{"product_id":"lone-shadow-moon-shirt","title":"Lone Shadow Moon Shirt","description":"\u003cp\u003e\u003cmeta charset=\"utf-8\"\u003e \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\u003c\/p\u003e\n\u003cstyle\u003e\n    :root{\n      --bg:#ffffff;\n      --ink:#0b0c0f;\n      --muted:#6b7280;\n      --line:#eceef1;\n      --accent:#111827;\n      --radius:18px;\n      --radius-sm:10px;\n      --shadow:0 6px 24px rgba(0,0,0,.05);\n      --shadow-soft:0 3px 12px rgba(0,0,0,.05);\n    }\n\n    html,body{height:100%}\n    html{color-scheme:light}\n    body{\n      margin:0;\n      background:var(--bg);\n      color:var(--ink);\n      font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Inter, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif;\n      -webkit-font-smoothing:antialiased;\n      font-size:15px;\n      line-height:1.75;\n      font-weight:300;\n      letter-spacing:.15px;\n    }\n\n    \/* Narrow, minimal container *\/\n    .wrap{\n      max-width: 640px;\n      margin: 56px auto;\n      padding: 0 18px;\n      position: relative;\n    }\n\n    \/* Minimal card *\/\n    .card{\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius);\n      box-shadow: var(--shadow);\n      padding: 28px 26px;\n    }\n\n    .title{\n      margin: 0 0 10px;\n      font-size: clamp(20px, 4.4vw, 26px);\n      font-weight: 700;\n      letter-spacing: -0.015em;\n    }\n\n    .lead{\n      margin: 0;\n      color:#1f2937;\n      max-width: 60ch;\n    }\n\n    .features{\n      list-style: none;\n      padding: 0;\n      margin: 16px 0 0;\n      display: grid;\n      gap: 10px;\n    }\n    .features li{\n      font-weight: 400;\n      display: inline-flex;\n      align-items: baseline;\n      gap: 8px;\n    }\n    .features li::before{\n      content: \"—\";\n      color: var(--accent);\n      opacity:.55;\n      font-weight: 600;\n    }\n\n    \/* Ghost trigger button *\/\n    .size-chart-button-container{ text-align:center; margin: 16px 0 0; }\n    .size-chart-open-button{\n      background:#fff;\n      color:var(--ink);\n      padding: 9px 16px;\n      font-size: 12px;\n      font-weight: 700;\n      letter-spacing:.25px;\n      border-radius: 999px;\n      border: 1px solid var(--ink);\n      cursor: pointer;\n      text-transform: uppercase;\n      transition: transform .15s ease, box-shadow .2s ease, background .2s ease;\n      box-shadow: var(--shadow-soft);\n    }\n    .size-chart-open-button:hover,\n    .size-chart-open-button:focus-visible{\n      transform: translateY(-1px);\n      outline: none;\n      background: #fafafa;\n      box-shadow: 0 10px 26px rgba(0,0,0,.08);\n    }\n\n    \/* Collapse *\/\n    .size-chart-collapse{\n      width: 100%;\n      max-width: 560px;\n      margin: 18px auto 40px;\n      padding: 16px;\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius-sm);\n      box-shadow: var(--shadow-soft);\n    }\n    .hidden{ display:none; }\n\n    \/* Tabs: minimalist underline *\/\n    .size-chart-tabs{\n      display:flex;\n      justify-content:center;\n      gap: 18px;\n      margin-bottom: 12px;\n      border-bottom: 1px solid var(--line);\n      padding-bottom: 2px;\n    }\n    .tab-button{\n      appearance:none;\n      background:transparent;\n      color:var(--muted);\n      padding: 6px 2px;\n      font-size:12px;\n      font-weight:700;\n      letter-spacing:.3px;\n      border:none;\n      border-radius:0;\n      cursor:pointer;\n      position:relative;\n      transition: color .2s ease;\n    }\n    .tab-button:hover,\n    .tab-button:focus-visible{\n      color:var(--ink);\n      outline:none;\n    }\n    .tab-button[aria-selected=\"true\"]{\n      color:var(--ink);\n    }\n    .tab-button[aria-selected=\"true\"]::after{\n      content:\"\";\n      position:absolute;\n      left:0; right:0; bottom:-3px;\n      height: 2px;\n      background: var(--accent);\n      border-radius: 2px;\n    }\n\n    \/* Table: soft row dividers only *\/\n    .size-chart-table{\n      width:100%;\n      border-collapse: collapse;\n      background:#fff;\n    }\n    .size-chart-table th,\n    .size-chart-table td{\n      text-align:center;\n      padding: 10px 6px;\n      font-size:12px;\n      color:var(--ink);\n      border: none;\n      border-bottom: 1px solid var(--line);\n    }\n    .size-chart-table th{\n      font-weight: 700;\n      background: #fbfcfd;\n    }\n    .size-chart-table td:first-child,\n    .size-chart-table th:first-child{\n      text-align:left;\n      padding-left: 6px;\n      font-weight: 600;\n    }\n    .size-chart-table tbody tr:last-child td{\n      border-bottom: none;\n    }\n\n    .size-chart-note{\n      margin-top: 10px;\n      font-size: 11.5px;\n      color: var(--muted);\n      text-align: center;\n    }\n\n    @media (max-width:660px){\n      .wrap{ margin:44px auto; padding:0 14px; }\n      .card{ padding: 24px 20px; }\n      .size-chart-collapse{ max-width: 100%; }\n    }\n  \u003c\/style\u003e\n\u003cmain aria-labelledby=\"product-heading\" class=\"wrap\"\u003e\n\u003csection aria-describedby=\"product-desc\" class=\"card\"\u003e\n\u003ch1 id=\"product-heading\" class=\"title\"\u003eBuilt for the Long Term\u003c\/h1\u003e\n\u003cp id=\"product-desc\" class=\"lead\"\u003eWe make pieces to last. Cut from ultra-smooth 100% polyester mesh for cool comfort and durability, then finished with professional-grade printing that resists cracking and fading. Everyday-ready, season after season.\u003c\/p\u003e\n\u003cul role=\"list\" class=\"features\"\u003e\n\u003cli\u003e100% Polyester Mesh\u003c\/li\u003e\n\u003cli\u003eWith pockets\u003c\/li\u003e\n\u003cli\u003eHigh-quality printing\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/section\u003e\n\u003c!-- Trigger --\u003e\n\u003cdiv class=\"size-chart-button-container\"\u003e\u003cbutton aria-controls=\"sizeChartPanel\" aria-expanded=\"false\" class=\"size-chart-open-button\" id=\"sizeChartToggle\"\u003e Size Chart For Shirt \u003c\/button\u003e\u003c\/div\u003e\n\u003c!-- Collapsible size chart --\u003e\n\u003csection aria-hidden=\"true\" class=\"size-chart-collapse hidden\" id=\"sizeChartPanel\"\u003e\u003c!-- Tabs --\u003e\n\u003cdiv aria-label=\"Size chart units\" role=\"tablist\" class=\"size-chart-tabs\"\u003e\n\u003cbutton data-unit=\"cm\" aria-controls=\"tab-cm\" aria-selected=\"true\" id=\"tab-btn-cm\" role=\"tab\" class=\"tab-button\" tabindex=\"0\"\u003eCM\u003c\/button\u003e \u003cbutton data-unit=\"in\" aria-controls=\"tab-in\" aria-selected=\"false\" id=\"tab-btn-in\" role=\"tab\" class=\"tab-button\" tabindex=\"-1\"\u003eInches\u003c\/button\u003e\n\u003c\/div\u003e\n\u003c!-- CM table --\u003e\n\u003cdiv aria-labelledby=\"tab-btn-cm\" role=\"tabpanel\" id=\"tab-cm\"\u003e\n\u003ctable aria-label=\"Shirt size chart in centimeters\" id=\"table-cm\" class=\"size-chart-table\"\u003e\u003c\/table\u003e\n\u003c\/div\u003e\n\u003c!-- Inches table --\u003e\n\u003cdiv hidden=\"\" aria-labelledby=\"tab-btn-in\" role=\"tabpanel\" id=\"tab-in\"\u003e\n\u003ctable aria-label=\"Shirt size chart in inches\" id=\"table-in\" class=\"size-chart-table\"\u003e\u003c\/table\u003e\n\u003c\/div\u003e\n\u003cp class=\"size-chart-note\"\u003eMeasurements are garment dimensions. Compare with a tee you own for best fit.\u003c\/p\u003e\n\u003c\/section\u003e\n\u003cnoscript\u003e\n      \u003cp style=\"text-align:center;font:14px\/1.4 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;color:#555;\"\u003e\n        Enable JavaScript to view the interactive size chart.\n      \u003c\/p\u003e\n    \u003c\/noscript\u003e\u003c\/main\u003e\n\u003cp\u003e \u003c\/p\u003e","brand":"Washed Warrior","offers":[{"title":"S","offer_id":50238785093979,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50238785126747,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50238785159515,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50238785192283,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50238785225051,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50238785257819,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/IMG_0167_Large_041476cc-3b40-402a-84ae-6e393a6339b9.jpg?v=1750037991"},{"product_id":"dark-shinobi-oversized-tee","title":"Dark Shinobi Oversized Tee","description":"\u003cbody\u003e\n\n\n  \u003cmeta charset=\"utf-8\"\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n  \u003ctitle\u003eProduct + Size Chart — Minimal\u003c\/title\u003e\n  \u003cstyle\u003e\n    :root{\n      --bg:#ffffff;\n      --ink:#0b0c0f;\n      --muted:#6b7280;\n      --line:#eceef1;\n      --accent:#111827;\n      --radius:18px;\n      --radius-sm:10px;\n      --shadow:0 6px 24px rgba(0,0,0,.05);\n      --shadow-soft:0 3px 12px rgba(0,0,0,.05);\n    }\n\n    html,body{height:100%}\n    html{color-scheme:light}\n    body{\n      margin:0;\n      background:var(--bg);\n      color:var(--ink);\n      font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Inter, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif;\n      -webkit-font-smoothing:antialiased;\n      font-size:15px;\n      line-height:1.75;\n      font-weight:300;\n      letter-spacing:.15px;\n    }\n\n    \/* Narrow, minimal container *\/\n    .wrap{\n      max-width: 640px;\n      margin: 56px auto;\n      padding: 0 18px;\n      position: relative;\n    }\n\n    \/* Minimal card *\/\n    .card{\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius);\n      box-shadow: var(--shadow);\n      padding: 28px 26px;\n    }\n\n    .title{\n      margin: 0 0 10px;\n      font-size: clamp(20px, 4.4vw, 26px);\n      font-weight: 700;\n      letter-spacing: -0.015em;\n    }\n\n    .lead{\n      margin: 0;\n      color:#1f2937;\n      max-width: 60ch;\n    }\n\n    .features{\n      list-style: none;\n      padding: 0;\n      margin: 16px 0 0;\n      display: grid;\n      gap: 10px;\n    }\n    .features li{\n      font-weight: 400;\n      display: inline-flex;\n      align-items: baseline;\n      gap: 8px;\n    }\n    .features li::before{\n      content: \"—\";\n      color: var(--accent);\n      opacity:.55;\n      font-weight: 600;\n    }\n\n    \/* Ghost trigger button *\/\n    .size-chart-button-container{ text-align:center; margin: 16px 0 0; }\n    .size-chart-open-button{\n      background:#fff;\n      color:var(--ink);\n      padding: 9px 16px;\n      font-size: 12px;\n      font-weight: 700;\n      letter-spacing:.25px;\n      border-radius: 999px;\n      border: 1px solid var(--ink);\n      cursor: pointer;\n      text-transform: uppercase;\n      transition: transform .15s ease, box-shadow .2s ease, background .2s ease;\n      box-shadow: var(--shadow-soft);\n    }\n    .size-chart-open-button:hover,\n    .size-chart-open-button:focus-visible{\n      transform: translateY(-1px);\n      outline: none;\n      background: #fafafa;\n      box-shadow: 0 10px 26px rgba(0,0,0,.08);\n    }\n\n    \/* Collapse *\/\n    .size-chart-collapse{\n      width: 100%;\n      max-width: 560px;\n      margin: 18px auto 40px;\n      padding: 16px;\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius-sm);\n      box-shadow: var(--shadow-soft);\n    }\n    .hidden{ display:none; }\n\n    \/* Tabs: minimalist underline *\/\n    .size-chart-tabs{\n      display:flex;\n      justify-content:center;\n      gap: 18px;\n      margin-bottom: 12px;\n      border-bottom: 1px solid var(--line);\n      padding-bottom: 2px;\n    }\n    .tab-button{\n      appearance:none;\n      background:transparent;\n      color:var(--muted);\n      padding: 6px 2px;\n      font-size:12px;\n      font-weight:700;\n      letter-spacing:.3px;\n      border:none;\n      border-radius:0;\n      cursor:pointer;\n      position:relative;\n      transition: color .2s ease;\n    }\n    .tab-button:hover,\n    .tab-button:focus-visible{\n      color:var(--ink);\n      outline:none;\n    }\n    .tab-button[aria-selected=\"true\"]{\n      color:var(--ink);\n    }\n    .tab-button[aria-selected=\"true\"]::after{\n      content:\"\";\n      position:absolute;\n      left:0; right:0; bottom:-3px;\n      height: 2px;\n      background: var(--accent);\n      border-radius: 2px;\n    }\n\n    \/* Table: soft row dividers only *\/\n    .size-chart-table{\n      width:100%;\n      border-collapse: collapse;\n      background:#fff;\n    }\n    .size-chart-table th,\n    .size-chart-table td{\n      text-align:center;\n      padding: 10px 6px;\n      font-size:12px;\n      color:var(--ink);\n      border: none;\n      border-bottom: 1px solid var(--line);\n    }\n    .size-chart-table th{\n      font-weight: 700;\n      background: #fbfcfd;\n    }\n    .size-chart-table td:first-child,\n    .size-chart-table th:first-child{\n      text-align:left;\n      padding-left: 6px;\n      font-weight: 600;\n    }\n    .size-chart-table tbody tr:last-child td{\n      border-bottom: none;\n    }\n\n    .size-chart-note{\n      margin-top: 10px;\n      font-size: 11.5px;\n      color: var(--muted);\n      text-align: center;\n    }\n\n    @media (max-width:660px){\n      .wrap{ margin:44px auto; padding:0 14px; }\n      .card{ padding: 24px 20px; }\n      .size-chart-collapse{ max-width: 100%; }\n    }\n  \u003c\/style\u003e\n\n\n  \u003cmain class=\"wrap\" aria-labelledby=\"product-heading\"\u003e\n    \u003csection class=\"card\" aria-describedby=\"product-desc\"\u003e\n      \u003ch1 class=\"title\" id=\"product-heading\"\u003eBuilt for the Long Term\u003c\/h1\u003e\n      \u003cp class=\"lead\" id=\"product-desc\"\u003e\n        We make pieces to last. Cut from ultra-smooth 100% polyester mesh for cool comfort and durability, then\n        finished with professional-grade printing that resists cracking and fading. Everyday-ready, season after season.\n      \u003c\/p\u003e\n      \u003cul class=\"features\" role=\"list\"\u003e\n        \u003cli\u003e100% Polyester Mesh\u003c\/li\u003e\n        \u003cli\u003eWith pockets\u003c\/li\u003e\n        \u003cli\u003eHigh-quality printing\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/section\u003e\n\n    \u003c!-- Trigger --\u003e\n    \u003cdiv class=\"size-chart-button-container\"\u003e\n      \u003cbutton id=\"sizeChartToggle\" class=\"size-chart-open-button\" aria-expanded=\"false\" aria-controls=\"sizeChartPanel\"\u003e\n        Size Chart For Shirt\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Collapsible size chart --\u003e\n    \u003csection id=\"sizeChartPanel\" class=\"size-chart-collapse hidden\" aria-hidden=\"true\"\u003e\n      \u003c!-- Tabs --\u003e\n      \u003cdiv class=\"size-chart-tabs\" role=\"tablist\" aria-label=\"Size chart units\"\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-cm\" aria-selected=\"true\" aria-controls=\"tab-cm\" tabindex=\"0\" data-unit=\"cm\"\u003eCM\u003c\/button\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-in\" aria-selected=\"false\" aria-controls=\"tab-in\" tabindex=\"-1\" data-unit=\"in\"\u003eInches\u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- CM table --\u003e\n      \u003cdiv id=\"tab-cm\" role=\"tabpanel\" aria-labelledby=\"tab-btn-cm\"\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-cm\" aria-label=\"Shirt size chart in centimeters\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Inches table --\u003e\n      \u003cdiv id=\"tab-in\" role=\"tabpanel\" aria-labelledby=\"tab-btn-in\" hidden\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-in\" aria-label=\"Shirt size chart in inches\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003cp class=\"size-chart-note\"\u003e\n        Measurements are garment dimensions. Compare with a tee you own for best fit.\n      \u003c\/p\u003e\n    \u003c\/section\u003e\n\n    \u003cnoscript\u003e\n      \u003cp style=\"text-align:center;font:14px\/1.4 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;color:#555;\"\u003e\n        Enable JavaScript to view the interactive size chart.\n      \u003c\/p\u003e\n    \u003c\/noscript\u003e\n  \u003c\/main\u003e\n\n  \u003cscript\u003e\n    \/* ===== Data (single source of truth in CM) ===== *\/\n    const SIZE_DATA_CM = [\n      { size: \"S\",   length: 72, chest: 112, shoulder: 54,   sleeve: 24 },\n      { size: \"M\",   length: 74, chest: 116, shoulder: 55.5, sleeve: 25 },\n      { size: \"L\",   length: 76, chest: 120, shoulder: 57,   sleeve: 26 },\n      { size: \"XL\",  length: 78, chest: 124, shoulder: 58.5, sleeve: 27 },\n      { size: \"XXL\", length: 80, chest: 128, shoulder: 60,   sleeve: 28 },\n      { size: \"XXXL\",length: 82, chest: 132, shoulder: 61.5, sleeve: 29 }\n    ];\n\n    const COLUMNS = [\n      { key: \"size\",     label: \"Size\" },\n      { key: \"length\",   label: \"Length\" },\n      { key: \"chest\",    label: \"Chest\" },\n      { key: \"shoulder\", label: \"Shoulder\" },\n      { key: \"sleeve\",   label: \"Sleeve\" }\n    ];\n\n    \/\/ CM -\u003e inches (rounded to nearest 0.5\")\n    const cmToIn = cm =\u003e Math.round((cm \/ 2.54) * 2) \/ 2;\n\n    function renderTable(target, data, unit){\n      const thead = document.createElement(\"thead\");\n      const trh = document.createElement(\"tr\");\n\n      COLUMNS.forEach(col =\u003e {\n        const th = document.createElement(\"th\");\n        th.scope = \"col\";\n        th.textContent = col.key === \"size\" ? col.label : `${col.label} (${unit === \"cm\" ? \"cm\" : \"in\"})`;\n        trh.appendChild(th);\n      });\n      thead.appendChild(trh);\n\n      const tbody = document.createElement(\"tbody\");\n      data.forEach(row =\u003e {\n        const tr = document.createElement(\"tr\");\n        COLUMNS.forEach(col =\u003e {\n          const td = document.createElement(\"td\");\n          if(col.key === \"size\"){\n            td.textContent = row.size;\n            td.style.fontWeight = 600;\n          } else {\n            const val = unit === \"cm\" ? row[col.key] : cmToIn(row[col.key]);\n            td.textContent = Number.isInteger(val) ? String(val) : val.toFixed(1);\n          }\n          tr.appendChild(td);\n        });\n        tbody.appendChild(tr);\n      });\n\n      target.innerHTML = \"\";\n      target.appendChild(thead);\n      target.appendChild(tbody);\n    }\n\n    \/\/ Initial render\n    const tableCM = document.getElementById(\"table-cm\");\n    const tableIN = document.getElementById(\"table-in\");\n    renderTable(tableCM, SIZE_DATA_CM, \"cm\");\n    renderTable(tableIN, SIZE_DATA_CM, \"in\");\n\n    \/\/ Collapsible behavior\n    const toggleBtn = document.getElementById(\"sizeChartToggle\");\n    const panel = document.getElementById(\"sizeChartPanel\");\n\n    function setPanel(open){\n      panel.classList.toggle(\"hidden\", !open);\n      panel.setAttribute(\"aria-hidden\", String(!open));\n      toggleBtn.setAttribute(\"aria-expanded\", String(!!open));\n      if(open){ document.getElementById(\"tab-btn-cm\").focus(); }\n    }\n    toggleBtn.addEventListener(\"click\", () =\u003e {\n      const isOpen = toggleBtn.getAttribute(\"aria-expanded\") === \"true\";\n      setPanel(!isOpen);\n    });\n\n    \/\/ Tabs: click + arrow keys + roving tabindex\n    const tabs = Array.from(document.querySelectorAll('[role=\"tab\"]'));\n    const tabMap = {\n      cm: { btn: document.getElementById(\"tab-btn-cm\"), panel: document.getElementById(\"tab-cm\") },\n      in: { btn: document.getElementById(\"tab-btn-in\"), panel: document.getElementById(\"tab-in\") }\n    };\n\n    function activateTab(key){\n      for(const k in tabMap){\n        const { btn, panel } = tabMap[k];\n        const selected = k === key;\n        btn.setAttribute(\"aria-selected\", String(selected));\n        btn.tabIndex = selected ? 0 : -1;\n        panel.hidden = !selected;\n      }\n      tabMap[key].btn.focus();\n    }\n\n    tabs.forEach(btn =\u003e {\n      btn.addEventListener(\"click\", () =\u003e activateTab(btn.dataset.unit));\n      btn.addEventListener(\"keydown\", (e) =\u003e {\n        const idx = tabs.indexOf(btn);\n        if(e.key === 'ArrowRight' || e.key === 'ArrowDown'){\n          e.preventDefault();\n          const next = tabs[(idx + 1) % tabs.length];\n          activateTab(next.dataset.unit);\n        } else if(e.key === 'ArrowLeft' || e.key === 'ArrowUp'){\n          e.preventDefault();\n          const prev = tabs[(idx - 1 + tabs.length) % tabs.length];\n          activateTab(prev.dataset.unit);\n        } else if(e.key === 'Home'){\n          e.preventDefault();\n          activateTab(tabs[0].dataset.unit);\n        } else if(e.key === 'End'){\n          e.preventDefault();\n          activateTab(tabs[tabs.length - 1].dataset.unit);\n        }\n      });\n    });\n\n    \/\/ Default active tab\n    activateTab('cm');\n  \u003c\/script\u003e\n\n\n\u003c\/body\u003e","brand":"Washed Warrior","offers":[{"title":"S","offer_id":50253163004251,"sku":"","price":24.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50253163037019,"sku":"","price":24.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50253163069787,"sku":"","price":24.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50253163102555,"sku":"","price":24.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50253163135323,"sku":"","price":24.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50253163168091,"sku":"","price":24.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/variant-image-1_b035803e-4ac7-4273-9065-a6a0d81fd7da.jpg?v=1742264274"},{"product_id":"forbidden-seal-summon-tee","title":"Forbidden Seal Summon Tee","description":"\u003cbody\u003e\n\n\n  \u003cmeta charset=\"utf-8\"\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n  \u003ctitle\u003eProduct + Size Chart — Minimal\u003c\/title\u003e\n  \u003cstyle\u003e\n    :root{\n      --bg:#ffffff;\n      --ink:#0b0c0f;\n      --muted:#6b7280;\n      --line:#eceef1;\n      --accent:#111827;\n      --radius:18px;\n      --radius-sm:10px;\n      --shadow:0 6px 24px rgba(0,0,0,.05);\n      --shadow-soft:0 3px 12px rgba(0,0,0,.05);\n    }\n\n    html,body{height:100%}\n    html{color-scheme:light}\n    body{\n      margin:0;\n      background:var(--bg);\n      color:var(--ink);\n      font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Inter, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif;\n      -webkit-font-smoothing:antialiased;\n      font-size:15px;\n      line-height:1.75;\n      font-weight:300;\n      letter-spacing:.15px;\n    }\n\n    \/* Narrow, minimal container *\/\n    .wrap{\n      max-width: 640px;\n      margin: 56px auto;\n      padding: 0 18px;\n      position: relative;\n    }\n\n    \/* Minimal card *\/\n    .card{\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius);\n      box-shadow: var(--shadow);\n      padding: 28px 26px;\n    }\n\n    .title{\n      margin: 0 0 10px;\n      font-size: clamp(20px, 4.4vw, 26px);\n      font-weight: 700;\n      letter-spacing: -0.015em;\n    }\n\n    .lead{\n      margin: 0;\n      color:#1f2937;\n      max-width: 60ch;\n    }\n\n    .features{\n      list-style: none;\n      padding: 0;\n      margin: 16px 0 0;\n      display: grid;\n      gap: 10px;\n    }\n    .features li{\n      font-weight: 400;\n      display: inline-flex;\n      align-items: baseline;\n      gap: 8px;\n    }\n    .features li::before{\n      content: \"—\";\n      color: var(--accent);\n      opacity:.55;\n      font-weight: 600;\n    }\n\n    \/* Ghost trigger button *\/\n    .size-chart-button-container{ text-align:center; margin: 16px 0 0; }\n    .size-chart-open-button{\n      background:#fff;\n      color:var(--ink);\n      padding: 9px 16px;\n      font-size: 12px;\n      font-weight: 700;\n      letter-spacing:.25px;\n      border-radius: 999px;\n      border: 1px solid var(--ink);\n      cursor: pointer;\n      text-transform: uppercase;\n      transition: transform .15s ease, box-shadow .2s ease, background .2s ease;\n      box-shadow: var(--shadow-soft);\n    }\n    .size-chart-open-button:hover,\n    .size-chart-open-button:focus-visible{\n      transform: translateY(-1px);\n      outline: none;\n      background: #fafafa;\n      box-shadow: 0 10px 26px rgba(0,0,0,.08);\n    }\n\n    \/* Collapse *\/\n    .size-chart-collapse{\n      width: 100%;\n      max-width: 560px;\n      margin: 18px auto 40px;\n      padding: 16px;\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius-sm);\n      box-shadow: var(--shadow-soft);\n    }\n    .hidden{ display:none; }\n\n    \/* Tabs: minimalist underline *\/\n    .size-chart-tabs{\n      display:flex;\n      justify-content:center;\n      gap: 18px;\n      margin-bottom: 12px;\n      border-bottom: 1px solid var(--line);\n      padding-bottom: 2px;\n    }\n    .tab-button{\n      appearance:none;\n      background:transparent;\n      color:var(--muted);\n      padding: 6px 2px;\n      font-size:12px;\n      font-weight:700;\n      letter-spacing:.3px;\n      border:none;\n      border-radius:0;\n      cursor:pointer;\n      position:relative;\n      transition: color .2s ease;\n    }\n    .tab-button:hover,\n    .tab-button:focus-visible{\n      color:var(--ink);\n      outline:none;\n    }\n    .tab-button[aria-selected=\"true\"]{\n      color:var(--ink);\n    }\n    .tab-button[aria-selected=\"true\"]::after{\n      content:\"\";\n      position:absolute;\n      left:0; right:0; bottom:-3px;\n      height: 2px;\n      background: var(--accent);\n      border-radius: 2px;\n    }\n\n    \/* Table: soft row dividers only *\/\n    .size-chart-table{\n      width:100%;\n      border-collapse: collapse;\n      background:#fff;\n    }\n    .size-chart-table th,\n    .size-chart-table td{\n      text-align:center;\n      padding: 10px 6px;\n      font-size:12px;\n      color:var(--ink);\n      border: none;\n      border-bottom: 1px solid var(--line);\n    }\n    .size-chart-table th{\n      font-weight: 700;\n      background: #fbfcfd;\n    }\n    .size-chart-table td:first-child,\n    .size-chart-table th:first-child{\n      text-align:left;\n      padding-left: 6px;\n      font-weight: 600;\n    }\n    .size-chart-table tbody tr:last-child td{\n      border-bottom: none;\n    }\n\n    .size-chart-note{\n      margin-top: 10px;\n      font-size: 11.5px;\n      color: var(--muted);\n      text-align: center;\n    }\n\n    @media (max-width:660px){\n      .wrap{ margin:44px auto; padding:0 14px; }\n      .card{ padding: 24px 20px; }\n      .size-chart-collapse{ max-width: 100%; }\n    }\n  \u003c\/style\u003e\n\n\n  \u003cmain class=\"wrap\" aria-labelledby=\"product-heading\"\u003e\n    \u003csection class=\"card\" aria-describedby=\"product-desc\"\u003e\n      \u003ch1 class=\"title\" id=\"product-heading\"\u003eBuilt for the Long Term\u003c\/h1\u003e\n      \u003cp class=\"lead\" id=\"product-desc\"\u003e\n        We make pieces to last. Cut from ultra-smooth 100% polyester mesh for cool comfort and durability, then\n        finished with professional-grade printing that resists cracking and fading. Everyday-ready, season after season.\n      \u003c\/p\u003e\n      \u003cul class=\"features\" role=\"list\"\u003e\n        \u003cli\u003e100% Polyester Mesh\u003c\/li\u003e\n        \u003cli\u003eWith pockets\u003c\/li\u003e\n        \u003cli\u003eHigh-quality printing\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/section\u003e\n\n    \u003c!-- Trigger --\u003e\n    \u003cdiv class=\"size-chart-button-container\"\u003e\n      \u003cbutton id=\"sizeChartToggle\" class=\"size-chart-open-button\" aria-expanded=\"false\" aria-controls=\"sizeChartPanel\"\u003e\n        Size Chart For Shirt\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Collapsible size chart --\u003e\n    \u003csection id=\"sizeChartPanel\" class=\"size-chart-collapse hidden\" aria-hidden=\"true\"\u003e\n      \u003c!-- Tabs --\u003e\n      \u003cdiv class=\"size-chart-tabs\" role=\"tablist\" aria-label=\"Size chart units\"\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-cm\" aria-selected=\"true\" aria-controls=\"tab-cm\" tabindex=\"0\" data-unit=\"cm\"\u003eCM\u003c\/button\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-in\" aria-selected=\"false\" aria-controls=\"tab-in\" tabindex=\"-1\" data-unit=\"in\"\u003eInches\u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- CM table --\u003e\n      \u003cdiv id=\"tab-cm\" role=\"tabpanel\" aria-labelledby=\"tab-btn-cm\"\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-cm\" aria-label=\"Shirt size chart in centimeters\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Inches table --\u003e\n      \u003cdiv id=\"tab-in\" role=\"tabpanel\" aria-labelledby=\"tab-btn-in\" hidden\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-in\" aria-label=\"Shirt size chart in inches\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003cp class=\"size-chart-note\"\u003e\n        Measurements are garment dimensions. Compare with a tee you own for best fit.\n      \u003c\/p\u003e\n    \u003c\/section\u003e\n\n    \u003cnoscript\u003e\n      \u003cp style=\"text-align:center;font:14px\/1.4 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;color:#555;\"\u003e\n        Enable JavaScript to view the interactive size chart.\n      \u003c\/p\u003e\n    \u003c\/noscript\u003e\n  \u003c\/main\u003e\n\n  \u003cscript\u003e\n    \/* ===== Data (single source of truth in CM) ===== *\/\n    const SIZE_DATA_CM = [\n      { size: \"S\",   length: 72, chest: 112, shoulder: 54,   sleeve: 24 },\n      { size: \"M\",   length: 74, chest: 116, shoulder: 55.5, sleeve: 25 },\n      { size: \"L\",   length: 76, chest: 120, shoulder: 57,   sleeve: 26 },\n      { size: \"XL\",  length: 78, chest: 124, shoulder: 58.5, sleeve: 27 },\n      { size: \"XXL\", length: 80, chest: 128, shoulder: 60,   sleeve: 28 },\n      { size: \"XXXL\",length: 82, chest: 132, shoulder: 61.5, sleeve: 29 }\n    ];\n\n    const COLUMNS = [\n      { key: \"size\",     label: \"Size\" },\n      { key: \"length\",   label: \"Length\" },\n      { key: \"chest\",    label: \"Chest\" },\n      { key: \"shoulder\", label: \"Shoulder\" },\n      { key: \"sleeve\",   label: \"Sleeve\" }\n    ];\n\n    \/\/ CM -\u003e inches (rounded to nearest 0.5\")\n    const cmToIn = cm =\u003e Math.round((cm \/ 2.54) * 2) \/ 2;\n\n    function renderTable(target, data, unit){\n      const thead = document.createElement(\"thead\");\n      const trh = document.createElement(\"tr\");\n\n      COLUMNS.forEach(col =\u003e {\n        const th = document.createElement(\"th\");\n        th.scope = \"col\";\n        th.textContent = col.key === \"size\" ? col.label : `${col.label} (${unit === \"cm\" ? \"cm\" : \"in\"})`;\n        trh.appendChild(th);\n      });\n      thead.appendChild(trh);\n\n      const tbody = document.createElement(\"tbody\");\n      data.forEach(row =\u003e {\n        const tr = document.createElement(\"tr\");\n        COLUMNS.forEach(col =\u003e {\n          const td = document.createElement(\"td\");\n          if(col.key === \"size\"){\n            td.textContent = row.size;\n            td.style.fontWeight = 600;\n          } else {\n            const val = unit === \"cm\" ? row[col.key] : cmToIn(row[col.key]);\n            td.textContent = Number.isInteger(val) ? String(val) : val.toFixed(1);\n          }\n          tr.appendChild(td);\n        });\n        tbody.appendChild(tr);\n      });\n\n      target.innerHTML = \"\";\n      target.appendChild(thead);\n      target.appendChild(tbody);\n    }\n\n    \/\/ Initial render\n    const tableCM = document.getElementById(\"table-cm\");\n    const tableIN = document.getElementById(\"table-in\");\n    renderTable(tableCM, SIZE_DATA_CM, \"cm\");\n    renderTable(tableIN, SIZE_DATA_CM, \"in\");\n\n    \/\/ Collapsible behavior\n    const toggleBtn = document.getElementById(\"sizeChartToggle\");\n    const panel = document.getElementById(\"sizeChartPanel\");\n\n    function setPanel(open){\n      panel.classList.toggle(\"hidden\", !open);\n      panel.setAttribute(\"aria-hidden\", String(!open));\n      toggleBtn.setAttribute(\"aria-expanded\", String(!!open));\n      if(open){ document.getElementById(\"tab-btn-cm\").focus(); }\n    }\n    toggleBtn.addEventListener(\"click\", () =\u003e {\n      const isOpen = toggleBtn.getAttribute(\"aria-expanded\") === \"true\";\n      setPanel(!isOpen);\n    });\n\n    \/\/ Tabs: click + arrow keys + roving tabindex\n    const tabs = Array.from(document.querySelectorAll('[role=\"tab\"]'));\n    const tabMap = {\n      cm: { btn: document.getElementById(\"tab-btn-cm\"), panel: document.getElementById(\"tab-cm\") },\n      in: { btn: document.getElementById(\"tab-btn-in\"), panel: document.getElementById(\"tab-in\") }\n    };\n\n    function activateTab(key){\n      for(const k in tabMap){\n        const { btn, panel } = tabMap[k];\n        const selected = k === key;\n        btn.setAttribute(\"aria-selected\", String(selected));\n        btn.tabIndex = selected ? 0 : -1;\n        panel.hidden = !selected;\n      }\n      tabMap[key].btn.focus();\n    }\n\n    tabs.forEach(btn =\u003e {\n      btn.addEventListener(\"click\", () =\u003e activateTab(btn.dataset.unit));\n      btn.addEventListener(\"keydown\", (e) =\u003e {\n        const idx = tabs.indexOf(btn);\n        if(e.key === 'ArrowRight' || e.key === 'ArrowDown'){\n          e.preventDefault();\n          const next = tabs[(idx + 1) % tabs.length];\n          activateTab(next.dataset.unit);\n        } else if(e.key === 'ArrowLeft' || e.key === 'ArrowUp'){\n          e.preventDefault();\n          const prev = tabs[(idx - 1 + tabs.length) % tabs.length];\n          activateTab(prev.dataset.unit);\n        } else if(e.key === 'Home'){\n          e.preventDefault();\n          activateTab(tabs[0].dataset.unit);\n        } else if(e.key === 'End'){\n          e.preventDefault();\n          activateTab(tabs[tabs.length - 1].dataset.unit);\n        }\n      });\n    });\n\n    \/\/ Default active tab\n    activateTab('cm');\n  \u003c\/script\u003e\n\n\n\u003c\/body\u003e","brand":"Washed Warrior","offers":[{"title":"S","offer_id":50610597364059,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50610597396827,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50610597429595,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50610597462363,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50610597495131,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50610597527899,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/variant-image-1_f1d29b1b-53ca-4d90-9b55-1e009f707747.jpg?v=1747776112"},{"product_id":"the-akatsukii","title":"The Akatsukii","description":"\u003cbody\u003e\n\n\n  \u003cmeta charset=\"utf-8\"\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n  \u003ctitle\u003eProduct + Size Chart — Minimal\u003c\/title\u003e\n  \u003cstyle\u003e\n    :root{\n      --bg:#ffffff;\n      --ink:#0b0c0f;\n      --muted:#6b7280;\n      --line:#eceef1;\n      --accent:#111827;\n      --radius:18px;\n      --radius-sm:10px;\n      --shadow:0 6px 24px rgba(0,0,0,.05);\n      --shadow-soft:0 3px 12px rgba(0,0,0,.05);\n    }\n\n    html,body{height:100%}\n    html{color-scheme:light}\n    body{\n      margin:0;\n      background:var(--bg);\n      color:var(--ink);\n      font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Inter, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif;\n      -webkit-font-smoothing:antialiased;\n      font-size:15px;\n      line-height:1.75;\n      font-weight:300;\n      letter-spacing:.15px;\n    }\n\n    \/* Narrow, minimal container *\/\n    .wrap{\n      max-width: 640px;\n      margin: 56px auto;\n      padding: 0 18px;\n      position: relative;\n    }\n\n    \/* Minimal card *\/\n    .card{\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius);\n      box-shadow: var(--shadow);\n      padding: 28px 26px;\n    }\n\n    .title{\n      margin: 0 0 10px;\n      font-size: clamp(20px, 4.4vw, 26px);\n      font-weight: 700;\n      letter-spacing: -0.015em;\n    }\n\n    .lead{\n      margin: 0;\n      color:#1f2937;\n      max-width: 60ch;\n    }\n\n    .features{\n      list-style: none;\n      padding: 0;\n      margin: 16px 0 0;\n      display: grid;\n      gap: 10px;\n    }\n    .features li{\n      font-weight: 400;\n      display: inline-flex;\n      align-items: baseline;\n      gap: 8px;\n    }\n    .features li::before{\n      content: \"—\";\n      color: var(--accent);\n      opacity:.55;\n      font-weight: 600;\n    }\n\n    \/* Ghost trigger button *\/\n    .size-chart-button-container{ text-align:center; margin: 16px 0 0; }\n    .size-chart-open-button{\n      background:#fff;\n      color:var(--ink);\n      padding: 9px 16px;\n      font-size: 12px;\n      font-weight: 700;\n      letter-spacing:.25px;\n      border-radius: 999px;\n      border: 1px solid var(--ink);\n      cursor: pointer;\n      text-transform: uppercase;\n      transition: transform .15s ease, box-shadow .2s ease, background .2s ease;\n      box-shadow: var(--shadow-soft);\n    }\n    .size-chart-open-button:hover,\n    .size-chart-open-button:focus-visible{\n      transform: translateY(-1px);\n      outline: none;\n      background: #fafafa;\n      box-shadow: 0 10px 26px rgba(0,0,0,.08);\n    }\n\n    \/* Collapse *\/\n    .size-chart-collapse{\n      width: 100%;\n      max-width: 560px;\n      margin: 18px auto 40px;\n      padding: 16px;\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius-sm);\n      box-shadow: var(--shadow-soft);\n    }\n    .hidden{ display:none; }\n\n    \/* Tabs: minimalist underline *\/\n    .size-chart-tabs{\n      display:flex;\n      justify-content:center;\n      gap: 18px;\n      margin-bottom: 12px;\n      border-bottom: 1px solid var(--line);\n      padding-bottom: 2px;\n    }\n    .tab-button{\n      appearance:none;\n      background:transparent;\n      color:var(--muted);\n      padding: 6px 2px;\n      font-size:12px;\n      font-weight:700;\n      letter-spacing:.3px;\n      border:none;\n      border-radius:0;\n      cursor:pointer;\n      position:relative;\n      transition: color .2s ease;\n    }\n    .tab-button:hover,\n    .tab-button:focus-visible{\n      color:var(--ink);\n      outline:none;\n    }\n    .tab-button[aria-selected=\"true\"]{\n      color:var(--ink);\n    }\n    .tab-button[aria-selected=\"true\"]::after{\n      content:\"\";\n      position:absolute;\n      left:0; right:0; bottom:-3px;\n      height: 2px;\n      background: var(--accent);\n      border-radius: 2px;\n    }\n\n    \/* Table: soft row dividers only *\/\n    .size-chart-table{\n      width:100%;\n      border-collapse: collapse;\n      background:#fff;\n    }\n    .size-chart-table th,\n    .size-chart-table td{\n      text-align:center;\n      padding: 10px 6px;\n      font-size:12px;\n      color:var(--ink);\n      border: none;\n      border-bottom: 1px solid var(--line);\n    }\n    .size-chart-table th{\n      font-weight: 700;\n      background: #fbfcfd;\n    }\n    .size-chart-table td:first-child,\n    .size-chart-table th:first-child{\n      text-align:left;\n      padding-left: 6px;\n      font-weight: 600;\n    }\n    .size-chart-table tbody tr:last-child td{\n      border-bottom: none;\n    }\n\n    .size-chart-note{\n      margin-top: 10px;\n      font-size: 11.5px;\n      color: var(--muted);\n      text-align: center;\n    }\n\n    @media (max-width:660px){\n      .wrap{ margin:44px auto; padding:0 14px; }\n      .card{ padding: 24px 20px; }\n      .size-chart-collapse{ max-width: 100%; }\n    }\n  \u003c\/style\u003e\n\n\n  \u003cmain class=\"wrap\" aria-labelledby=\"product-heading\"\u003e\n    \u003csection class=\"card\" aria-describedby=\"product-desc\"\u003e\n      \u003ch1 class=\"title\" id=\"product-heading\"\u003eBuilt for the Long Term\u003c\/h1\u003e\n      \u003cp class=\"lead\" id=\"product-desc\"\u003e\n        We make pieces to last. Cut from ultra-smooth 100% polyester mesh for cool comfort and durability, then\n        finished with professional-grade printing that resists cracking and fading. Everyday-ready, season after season.\n      \u003c\/p\u003e\n      \u003cul class=\"features\" role=\"list\"\u003e\n        \u003cli\u003e100% Polyester Mesh\u003c\/li\u003e\n        \u003cli\u003eWith pockets\u003c\/li\u003e\n        \u003cli\u003eHigh-quality printing\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/section\u003e\n\n    \u003c!-- Trigger --\u003e\n    \u003cdiv class=\"size-chart-button-container\"\u003e\n      \u003cbutton id=\"sizeChartToggle\" class=\"size-chart-open-button\" aria-expanded=\"false\" aria-controls=\"sizeChartPanel\"\u003e\n        Size Chart For Shirt\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Collapsible size chart --\u003e\n    \u003csection id=\"sizeChartPanel\" class=\"size-chart-collapse hidden\" aria-hidden=\"true\"\u003e\n      \u003c!-- Tabs --\u003e\n      \u003cdiv class=\"size-chart-tabs\" role=\"tablist\" aria-label=\"Size chart units\"\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-cm\" aria-selected=\"true\" aria-controls=\"tab-cm\" tabindex=\"0\" data-unit=\"cm\"\u003eCM\u003c\/button\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-in\" aria-selected=\"false\" aria-controls=\"tab-in\" tabindex=\"-1\" data-unit=\"in\"\u003eInches\u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- CM table --\u003e\n      \u003cdiv id=\"tab-cm\" role=\"tabpanel\" aria-labelledby=\"tab-btn-cm\"\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-cm\" aria-label=\"Shirt size chart in centimeters\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Inches table --\u003e\n      \u003cdiv id=\"tab-in\" role=\"tabpanel\" aria-labelledby=\"tab-btn-in\" hidden\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-in\" aria-label=\"Shirt size chart in inches\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003cp class=\"size-chart-note\"\u003e\n        Measurements are garment dimensions. Compare with a tee you own for best fit.\n      \u003c\/p\u003e\n    \u003c\/section\u003e\n\n    \u003cnoscript\u003e\n      \u003cp style=\"text-align:center;font:14px\/1.4 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;color:#555;\"\u003e\n        Enable JavaScript to view the interactive size chart.\n      \u003c\/p\u003e\n    \u003c\/noscript\u003e\n  \u003c\/main\u003e\n\n  \u003cscript\u003e\n    \/* ===== Data (single source of truth in CM) ===== *\/\n    const SIZE_DATA_CM = [\n      { size: \"S\",   length: 72, chest: 112, shoulder: 54,   sleeve: 24 },\n      { size: \"M\",   length: 74, chest: 116, shoulder: 55.5, sleeve: 25 },\n      { size: \"L\",   length: 76, chest: 120, shoulder: 57,   sleeve: 26 },\n      { size: \"XL\",  length: 78, chest: 124, shoulder: 58.5, sleeve: 27 },\n      { size: \"XXL\", length: 80, chest: 128, shoulder: 60,   sleeve: 28 },\n      { size: \"XXXL\",length: 82, chest: 132, shoulder: 61.5, sleeve: 29 }\n    ];\n\n    const COLUMNS = [\n      { key: \"size\",     label: \"Size\" },\n      { key: \"length\",   label: \"Length\" },\n      { key: \"chest\",    label: \"Chest\" },\n      { key: \"shoulder\", label: \"Shoulder\" },\n      { key: \"sleeve\",   label: \"Sleeve\" }\n    ];\n\n    \/\/ CM -\u003e inches (rounded to nearest 0.5\")\n    const cmToIn = cm =\u003e Math.round((cm \/ 2.54) * 2) \/ 2;\n\n    function renderTable(target, data, unit){\n      const thead = document.createElement(\"thead\");\n      const trh = document.createElement(\"tr\");\n\n      COLUMNS.forEach(col =\u003e {\n        const th = document.createElement(\"th\");\n        th.scope = \"col\";\n        th.textContent = col.key === \"size\" ? col.label : `${col.label} (${unit === \"cm\" ? \"cm\" : \"in\"})`;\n        trh.appendChild(th);\n      });\n      thead.appendChild(trh);\n\n      const tbody = document.createElement(\"tbody\");\n      data.forEach(row =\u003e {\n        const tr = document.createElement(\"tr\");\n        COLUMNS.forEach(col =\u003e {\n          const td = document.createElement(\"td\");\n          if(col.key === \"size\"){\n            td.textContent = row.size;\n            td.style.fontWeight = 600;\n          } else {\n            const val = unit === \"cm\" ? row[col.key] : cmToIn(row[col.key]);\n            td.textContent = Number.isInteger(val) ? String(val) : val.toFixed(1);\n          }\n          tr.appendChild(td);\n        });\n        tbody.appendChild(tr);\n      });\n\n      target.innerHTML = \"\";\n      target.appendChild(thead);\n      target.appendChild(tbody);\n    }\n\n    \/\/ Initial render\n    const tableCM = document.getElementById(\"table-cm\");\n    const tableIN = document.getElementById(\"table-in\");\n    renderTable(tableCM, SIZE_DATA_CM, \"cm\");\n    renderTable(tableIN, SIZE_DATA_CM, \"in\");\n\n    \/\/ Collapsible behavior\n    const toggleBtn = document.getElementById(\"sizeChartToggle\");\n    const panel = document.getElementById(\"sizeChartPanel\");\n\n    function setPanel(open){\n      panel.classList.toggle(\"hidden\", !open);\n      panel.setAttribute(\"aria-hidden\", String(!open));\n      toggleBtn.setAttribute(\"aria-expanded\", String(!!open));\n      if(open){ document.getElementById(\"tab-btn-cm\").focus(); }\n    }\n    toggleBtn.addEventListener(\"click\", () =\u003e {\n      const isOpen = toggleBtn.getAttribute(\"aria-expanded\") === \"true\";\n      setPanel(!isOpen);\n    });\n\n    \/\/ Tabs: click + arrow keys + roving tabindex\n    const tabs = Array.from(document.querySelectorAll('[role=\"tab\"]'));\n    const tabMap = {\n      cm: { btn: document.getElementById(\"tab-btn-cm\"), panel: document.getElementById(\"tab-cm\") },\n      in: { btn: document.getElementById(\"tab-btn-in\"), panel: document.getElementById(\"tab-in\") }\n    };\n\n    function activateTab(key){\n      for(const k in tabMap){\n        const { btn, panel } = tabMap[k];\n        const selected = k === key;\n        btn.setAttribute(\"aria-selected\", String(selected));\n        btn.tabIndex = selected ? 0 : -1;\n        panel.hidden = !selected;\n      }\n      tabMap[key].btn.focus();\n    }\n\n    tabs.forEach(btn =\u003e {\n      btn.addEventListener(\"click\", () =\u003e activateTab(btn.dataset.unit));\n      btn.addEventListener(\"keydown\", (e) =\u003e {\n        const idx = tabs.indexOf(btn);\n        if(e.key === 'ArrowRight' || e.key === 'ArrowDown'){\n          e.preventDefault();\n          const next = tabs[(idx + 1) % tabs.length];\n          activateTab(next.dataset.unit);\n        } else if(e.key === 'ArrowLeft' || e.key === 'ArrowUp'){\n          e.preventDefault();\n          const prev = tabs[(idx - 1 + tabs.length) % tabs.length];\n          activateTab(prev.dataset.unit);\n        } else if(e.key === 'Home'){\n          e.preventDefault();\n          activateTab(tabs[0].dataset.unit);\n        } else if(e.key === 'End'){\n          e.preventDefault();\n          activateTab(tabs[tabs.length - 1].dataset.unit);\n        }\n      });\n    });\n\n    \/\/ Default active tab\n    activateTab('cm');\n  \u003c\/script\u003e\n\n\n\u003c\/body\u003e","brand":"Washed Warrior","offers":[{"title":"S","offer_id":50715455684955,"sku":"","price":24.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50715455717723,"sku":"","price":24.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50715455750491,"sku":"","price":24.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50715455783259,"sku":"","price":24.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50715455816027,"sku":"","price":24.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50715455848795,"sku":"","price":24.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/main-image-6.jpg?v=1748620165"},{"product_id":"akatsuki-style-cloak","title":"Akatsuki-Style Cloak","description":"\u003cbody\u003e\n  \u003cmeta charset=\"utf-8\"\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n  \u003ctitle\u003eProduct + Size Chart — Minimal\u003c\/title\u003e\n  \u003cstyle\u003e\n    :root{\n      --bg:#ffffff; --ink:#0b0c0f; --muted:#6b7280; --line:#eceef1; --accent:#111827;\n      --radius:18px; --radius-sm:10px; --shadow:0 6px 24px rgba(0,0,0,.05); --shadow-soft:0 3px 12px rgba(0,0,0,.05);\n    }\n    html,body{height:100%} html{color-scheme:light}\n    body{margin:0;background:var(--bg);color:var(--ink);font-family:ui-sans-serif,system-ui,-apple-system,\"Segoe UI\",Roboto,Inter,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif;-webkit-font-smoothing:antialiased;font-size:15px;line-height:1.75;font-weight:300;letter-spacing:.15px}\n    .wrap{max-width:640px;margin:56px auto;padding:0 18px;position:relative}\n    .card{background:#fff;border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:28px 26px}\n    .title{margin:0 0 10px;font-size:clamp(20px,4.4vw,26px);font-weight:700;letter-spacing:-0.015em}\n    .lead{margin:0;color:#1f2937;max-width:60ch}\n    .features{list-style:none;padding:0;margin:16px 0 0;display:grid;gap:10px}\n    .features li{font-weight:400;display:inline-flex;align-items:baseline;gap:8px}\n    .features li::before{content:\"—\";color:var(--accent);opacity:.55;font-weight:600}\n    .size-chart-button-container{text-align:center;margin:16px 0 0}\n    .size-chart-open-button{background:#fff;color:var(--ink);padding:9px 16px;font-size:12px;font-weight:700;letter-spacing:.25px;border-radius:999px;border:1px solid var(--ink);cursor:pointer;text-transform:uppercase;transition:transform .15s ease,box-shadow .2s ease,background .2s ease;box-shadow:var(--shadow-soft)}\n    .size-chart-open-button:hover,.size-chart-open-button:focus-visible{transform:translateY(-1px);outline:none;background:#fafafa;box-shadow:0 10px 26px rgba(0,0,0,.08)}\n    .size-chart-collapse{width:100%;max-width:560px;margin:18px auto 40px;padding:16px;background:#fff;border:1px solid var(--line);border-radius:var(--radius-sm);box-shadow:var(--shadow-soft)}\n    .hidden{display:none}\n    .size-chart-tabs{display:flex;justify-content:center;gap:18px;margin-bottom:12px;border-bottom:1px solid var(--line);padding-bottom:2px}\n    .tab-button{appearance:none;background:transparent;color:var(--muted);padding:6px 2px;font-size:12px;font-weight:700;letter-spacing:.3px;border:none;border-radius:0;cursor:pointer;position:relative;transition:color .2s ease}\n    .tab-button:hover,.tab-button:focus-visible{color:var(--ink);outline:none}\n    .tab-button[aria-selected=\"true\"]{color:var(--ink)}\n    .tab-button[aria-selected=\"true\"]::after{content:\"\";position:absolute;left:0;right:0;bottom:-3px;height:2px;background:var(--accent);border-radius:2px}\n    .size-chart-table{width:100%;border-collapse:collapse;background:#fff}\n    .size-chart-table th,.size-chart-table td{text-align:center;padding:10px 6px;font-size:12px;color:var(--ink);border:none;border-bottom:1px solid var(--line)}\n    .size-chart-table th{font-weight:700;background:#fbfcfd}\n    .size-chart-table td:first-child,.size-chart-table th:first-child{text-align:left;padding-left:6px;font-weight:600}\n    .size-chart-table tbody tr:last-child td{border-bottom:none}\n    .size-chart-note{margin-top:10px;font-size:11.5px;color:var(--muted);text-align:center}\n    @media (max-width:660px){.wrap{margin:44px auto;padding:0 14px}.card{padding:24px 20px}.size-chart-collapse{max-width:100%}}\n  \u003c\/style\u003e\n\n  \u003cmain class=\"wrap\" aria-labelledby=\"product-heading\"\u003e\n  \u003csection class=\"card\" aria-describedby=\"product-desc\"\u003e\n    \u003ch1 class=\"title\" id=\"product-heading\"\u003eAkatsuki Cloak + Spiral Mask Set\u003c\/h1\u003e\n    \u003cp class=\"lead\" id=\"product-desc\"\u003e\n      Step into the world of your favorite anime with this \u003cstrong\u003eAkatsuki cloak and spiral mask set\u003c\/strong\u003e 🌙\n      Perfect for cosplay, conventions, or Halloween, this outfit lets you channel the mysterious energy of the\n      shadowy ninja organization.\n    \u003c\/p\u003e\n    \u003cp class=\"lead\"\u003e\n      🖤 Crafted from \u003cstrong\u003esoft, premium polyester\u003c\/strong\u003e, the cloak’s bold red cloud design stands out while\n      keeping you comfortable and cool. The \u003cstrong\u003elightweight spiral mask\u003c\/strong\u003e completes the look with just the\n      right touch of intrigue.\n    \u003c\/p\u003e\n    \u003cp class=\"lead\"\u003e\n      Whether you’re a dedicated anime fan or just love Japanese-inspired fashion, this set is a must-have for your\n      collection ✨\n    \u003c\/p\u003e\n    \u003cul class=\"features\" role=\"list\"\u003e\n      \u003cli\u003eIncludes cloak + spiral mask\u003c\/li\u003e\n      \u003cli\u003ePremium polyester (soft, durable, breathable)\u003c\/li\u003e\n      \u003cli\u003eUnisex fit for all fans\u003c\/li\u003e\n      \u003cli\u003eIdeal for cosplay, conventions, or Halloween\u003c\/li\u003e\n      \u003cli\u003eInspired by classic ninja anime style\u003c\/li\u003e\n    \u003c\/ul\u003e\n  \u003c\/section\u003e\n\n  \u003cdiv class=\"size-chart-button-container\"\u003e\n    \u003cbutton id=\"sizeChartToggle\" class=\"size-chart-open-button\" aria-expanded=\"false\" aria-controls=\"sizeChartPanel\"\u003e\n      Size Chart For Shirt\n    \u003c\/button\u003e\n  \u003c\/div\u003e\n\n  \u003csection id=\"sizeChartPanel\" class=\"size-chart-collapse hidden\" aria-hidden=\"true\"\u003e\n    \u003cdiv class=\"size-chart-tabs\" role=\"tablist\" aria-label=\"Size chart units\"\u003e\n      \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-cm\" aria-selected=\"true\" aria-controls=\"tab-cm\" tabindex=\"0\" data-unit=\"cm\"\u003eCM\u003c\/button\u003e\n      \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-in\" aria-selected=\"false\" aria-controls=\"tab-in\" tabindex=\"-1\" data-unit=\"in\"\u003eInches\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv id=\"tab-cm\" role=\"tabpanel\" aria-labelledby=\"tab-btn-cm\"\u003e\n      \u003ctable class=\"size-chart-table\" id=\"table-cm\" aria-label=\"Shirt size chart in centimeters\"\u003e\u003c\/table\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv id=\"tab-in\" role=\"tabpanel\" aria-labelledby=\"tab-btn-in\" hidden\u003e\n      \u003ctable class=\"size-chart-table\" id=\"table-in\" aria-label=\"Shirt size chart in inches\"\u003e\u003c\/table\u003e\n    \u003c\/div\u003e\n\n    \u003cp class=\"size-chart-note\"\u003e\n      Measurements are garment dimensions. Compare with a tee you own for best fit.\n    \u003c\/p\u003e\n  \u003c\/section\u003e\n\n  \u003cnoscript\u003e\n    \u003cp style=\"text-align:center;font:14px\/1.4 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;color:#555;\"\u003e\n      Enable JavaScript to view the interactive size chart.\n    \u003c\/p\u003e\n  \u003c\/noscript\u003e\n\u003c\/main\u003e\n\n  \u003cscript\u003e\n    \/* ===== Data (from provided chart, in CM) ===== *\/\n    const SIZE_DATA_CM = [\n      { size: \"S\",    length: 101, bust: 120, shoulder: 50, sleeve: 53 },\n      { size: \"M\",    length: 103, bust: 124, shoulder: 52, sleeve: 55 },\n      { size: \"L\",    length: 106, bust: 128, shoulder: 54, sleeve: 56 },\n      { size: \"XL\",   length: 110, bust: 132, shoulder: 56, sleeve: 57 },\n      { size: \"XXL\",  length: 113, bust: 136, shoulder: 58, sleeve: 58 },\n      { size: \"XXXL\", length: 113, bust: 140, shoulder: 60, sleeve: 59 }\n    ];\n\n    const COLUMNS = [\n      { key: \"size\",     label: \"Size\" },\n      { key: \"length\",   label: \"Clothing Length\" },\n      { key: \"bust\",     label: \"Bust\" },\n      { key: \"shoulder\", label: \"Shoulder\" },\n      { key: \"sleeve\",   label: \"Sleeve\" }\n    ];\n\n    \/\/ CM -\u003e inches (rounded to nearest 0.5\")\n    const cmToIn = cm =\u003e Math.round((cm \/ 2.54) * 2) \/ 2;\n\n    function renderTable(target, data, unit){\n      const thead = document.createElement(\"thead\");\n      const trh = document.createElement(\"tr\");\n\n      COLUMNS.forEach(col =\u003e {\n        const th = document.createElement(\"th\");\n        th.scope = \"col\";\n        th.textContent = col.key === \"size\" ? col.label : `${col.label} (${unit === \"cm\" ? \"cm\" : \"in\"})`;\n        trh.appendChild(th);\n      });\n      thead.appendChild(trh);\n\n      const tbody = document.createElement(\"tbody\");\n      data.forEach(row =\u003e {\n        const tr = document.createElement(\"tr\");\n        COLUMNS.forEach(col =\u003e {\n          const td = document.createElement(\"td\");\n          if(col.key === \"size\"){\n            td.textContent = row.size;\n            td.style.fontWeight = 600;\n          } else {\n            const val = unit === \"cm\" ? row[col.key] : cmToIn(row[col.key]);\n            td.textContent = Number.isInteger(val) ? String(val) : val.toFixed(1);\n          }\n          tr.appendChild(td);\n        });\n        tbody.appendChild(tr);\n      });\n\n      target.innerHTML = \"\";\n      target.appendChild(thead);\n      target.appendChild(tbody);\n    }\n\n    \/\/ Initial render\n    const tableCM = document.getElementById(\"table-cm\");\n    const tableIN = document.getElementById(\"table-in\");\n    renderTable(tableCM, SIZE_DATA_CM, \"cm\");\n    renderTable(tableIN, SIZE_DATA_CM, \"in\");\n\n    \/\/ Collapsible behavior\n    const toggleBtn = document.getElementById(\"sizeChartToggle\");\n    const panel = document.getElementById(\"sizeChartPanel\");\n\n    function setPanel(open){\n      panel.classList.toggle(\"hidden\", !open);\n      panel.setAttribute(\"aria-hidden\", String(!open));\n      toggleBtn.setAttribute(\"aria-expanded\", String(!!open));\n      if(open){ document.getElementById(\"tab-btn-cm\").focus(); }\n    }\n    toggleBtn.addEventListener(\"click\", () =\u003e {\n      const isOpen = toggleBtn.getAttribute(\"aria-expanded\") === \"true\";\n      setPanel(!isOpen);\n    });\n\n    \/\/ Tabs\n    const tabs = Array.from(document.querySelectorAll('[role=\"tab\"]'));\n    const tabMap = {\n      cm: { btn: document.getElementById(\"tab-btn-cm\"), panel: document.getElementById(\"tab-cm\") },\n      in: { btn: document.getElementById(\"tab-btn-in\"), panel: document.getElementById(\"tab-in\") }\n    };\n\n    function activateTab(key){\n      for(const k in tabMap){\n        const { btn, panel } = tabMap[k];\n        const selected = k === key;\n        btn.setAttribute(\"aria-selected\", String(selected));\n        btn.tabIndex = selected ? 0 : -1;\n        panel.hidden = !selected;\n      }\n      tabMap[key].btn.focus();\n    }\n\n    tabs.forEach(btn =\u003e {\n      btn.addEventListener(\"click\", () =\u003e activateTab(btn.dataset.unit));\n      btn.addEventListener(\"keydown\", (e) =\u003e {\n        const idx = tabs.indexOf(btn);\n        if(e.key === 'ArrowRight' || e.key === 'ArrowDown'){\n          e.preventDefault();\n          const next = tabs[(idx + 1) % tabs.length];\n          activateTab(next.dataset.unit);\n        } else if(e.key === 'ArrowLeft' || e.key === 'ArrowUp'){\n          e.preventDefault();\n          const prev = tabs[(idx - 1 + tabs.length) % tabs.length];\n          activateTab(prev.dataset.unit);\n        } else if(e.key === 'Home'){\n          e.preventDefault();\n          activateTab(tabs[0].dataset.unit);\n        } else if(e.key === 'End'){\n          e.preventDefault();\n          activateTab(tabs[tabs.length - 1].dataset.unit);\n        }\n      });\n    });\n\n    \/\/ Default active tab\n    activateTab('cm');\n  \u003c\/script\u003e\n\n\u003c\/body\u003e","brand":"Washed Warrior","offers":[{"title":"S \/ Mask Only","offer_id":51564186567003,"sku":null,"price":24.99,"currency_code":"GBP","in_stock":true},{"title":"S \/ Cloak Only","offer_id":51564186534235,"sku":null,"price":34.99,"currency_code":"GBP","in_stock":true},{"title":"S \/ Full Costume (Including Ring)","offer_id":51564186599771,"sku":null,"price":54.99,"currency_code":"GBP","in_stock":true},{"title":"M \/ Mask Only","offer_id":51564186665307,"sku":null,"price":24.99,"currency_code":"GBP","in_stock":true},{"title":"M \/ Cloak Only","offer_id":51564186632539,"sku":null,"price":34.99,"currency_code":"GBP","in_stock":true},{"title":"M \/ Full Costume (Including Ring)","offer_id":51564186698075,"sku":null,"price":54.99,"currency_code":"GBP","in_stock":true},{"title":"L \/ Mask Only","offer_id":51564186763611,"sku":null,"price":24.99,"currency_code":"GBP","in_stock":true},{"title":"L \/ Cloak Only","offer_id":51564186730843,"sku":null,"price":34.99,"currency_code":"GBP","in_stock":true},{"title":"L \/ Full Costume (Including Ring)","offer_id":51564186796379,"sku":null,"price":54.99,"currency_code":"GBP","in_stock":true},{"title":"XL \/ Mask Only","offer_id":51564186861915,"sku":null,"price":24.99,"currency_code":"GBP","in_stock":true},{"title":"XL \/ Cloak Only","offer_id":51564186829147,"sku":null,"price":34.99,"currency_code":"GBP","in_stock":true},{"title":"XL \/ Full Costume (Including Ring)","offer_id":51564186894683,"sku":null,"price":54.99,"currency_code":"GBP","in_stock":true},{"title":"2XL \/ Mask Only","offer_id":51564186960219,"sku":null,"price":24.99,"currency_code":"GBP","in_stock":true},{"title":"2XL \/ Cloak Only","offer_id":51564186927451,"sku":null,"price":34.99,"currency_code":"GBP","in_stock":true},{"title":"2XL \/ Full Costume (Including Ring)","offer_id":51564186992987,"sku":null,"price":54.99,"currency_code":"GBP","in_stock":true},{"title":"3XL \/ Mask Only","offer_id":51564187058523,"sku":null,"price":24.99,"currency_code":"GBP","in_stock":true},{"title":"3XL \/ Cloak Only","offer_id":51564187025755,"sku":null,"price":34.99,"currency_code":"GBP","in_stock":true},{"title":"3XL \/ Full Costume (Including Ring)","offer_id":51564187091291,"sku":null,"price":54.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/il_1588xN.7260083932_7q6j.webp?v=1760812121"},{"product_id":"midnight-shinobi-aura-streetwear-tee","title":"Midnight Shinobi Tee","description":"\u003cbody\u003e\n\n\n  \u003cmeta charset=\"utf-8\"\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n  \u003ctitle\u003eProduct + Size Chart — Minimal\u003c\/title\u003e\n  \u003cstyle\u003e\n    :root{\n      --bg:#ffffff;\n      --ink:#0b0c0f;\n      --muted:#6b7280;\n      --line:#eceef1;\n      --accent:#111827;\n      --radius:18px;\n      --radius-sm:10px;\n      --shadow:0 6px 24px rgba(0,0,0,.05);\n      --shadow-soft:0 3px 12px rgba(0,0,0,.05);\n    }\n\n    html,body{height:100%}\n    html{color-scheme:light}\n    body{\n      margin:0;\n      background:var(--bg);\n      color:var(--ink);\n      font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Inter, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif;\n      -webkit-font-smoothing:antialiased;\n      font-size:15px;\n      line-height:1.75;\n      font-weight:300;\n      letter-spacing:.15px;\n    }\n\n    \/* Narrow, minimal container *\/\n    .wrap{\n      max-width: 640px;\n      margin: 56px auto;\n      padding: 0 18px;\n      position: relative;\n    }\n\n    \/* Minimal card *\/\n    .card{\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius);\n      box-shadow: var(--shadow);\n      padding: 28px 26px;\n    }\n\n    .title{\n      margin: 0 0 10px;\n      font-size: clamp(20px, 4.4vw, 26px);\n      font-weight: 700;\n      letter-spacing: -0.015em;\n    }\n\n    .lead{\n      margin: 0;\n      color:#1f2937;\n      max-width: 60ch;\n    }\n\n    .features{\n      list-style: none;\n      padding: 0;\n      margin: 16px 0 0;\n      display: grid;\n      gap: 10px;\n    }\n    .features li{\n      font-weight: 400;\n      display: inline-flex;\n      align-items: baseline;\n      gap: 8px;\n    }\n    .features li::before{\n      content: \"—\";\n      color: var(--accent);\n      opacity:.55;\n      font-weight: 600;\n    }\n\n    \/* Ghost trigger button *\/\n    .size-chart-button-container{ text-align:center; margin: 16px 0 0; }\n    .size-chart-open-button{\n      background:#fff;\n      color:var(--ink);\n      padding: 9px 16px;\n      font-size: 12px;\n      font-weight: 700;\n      letter-spacing:.25px;\n      border-radius: 999px;\n      border: 1px solid var(--ink);\n      cursor: pointer;\n      text-transform: uppercase;\n      transition: transform .15s ease, box-shadow .2s ease, background .2s ease;\n      box-shadow: var(--shadow-soft);\n    }\n    .size-chart-open-button:hover,\n    .size-chart-open-button:focus-visible{\n      transform: translateY(-1px);\n      outline: none;\n      background: #fafafa;\n      box-shadow: 0 10px 26px rgba(0,0,0,.08);\n    }\n\n    \/* Collapse *\/\n    .size-chart-collapse{\n      width: 100%;\n      max-width: 560px;\n      margin: 18px auto 40px;\n      padding: 16px;\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius-sm);\n      box-shadow: var(--shadow-soft);\n    }\n    .hidden{ display:none; }\n\n    \/* Tabs: minimalist underline *\/\n    .size-chart-tabs{\n      display:flex;\n      justify-content:center;\n      gap: 18px;\n      margin-bottom: 12px;\n      border-bottom: 1px solid var(--line);\n      padding-bottom: 2px;\n    }\n    .tab-button{\n      appearance:none;\n      background:transparent;\n      color:var(--muted);\n      padding: 6px 2px;\n      font-size:12px;\n      font-weight:700;\n      letter-spacing:.3px;\n      border:none;\n      border-radius:0;\n      cursor:pointer;\n      position:relative;\n      transition: color .2s ease;\n    }\n    .tab-button:hover,\n    .tab-button:focus-visible{\n      color:var(--ink);\n      outline:none;\n    }\n    .tab-button[aria-selected=\"true\"]{\n      color:var(--ink);\n    }\n    .tab-button[aria-selected=\"true\"]::after{\n      content:\"\";\n      position:absolute;\n      left:0; right:0; bottom:-3px;\n      height: 2px;\n      background: var(--accent);\n      border-radius: 2px;\n    }\n\n    \/* Table: soft row dividers only *\/\n    .size-chart-table{\n      width:100%;\n      border-collapse: collapse;\n      background:#fff;\n    }\n    .size-chart-table th,\n    .size-chart-table td{\n      text-align:center;\n      padding: 10px 6px;\n      font-size:12px;\n      color:var(--ink);\n      border: none;\n      border-bottom: 1px solid var(--line);\n    }\n    .size-chart-table th{\n      font-weight: 700;\n      background: #fbfcfd;\n    }\n    .size-chart-table td:first-child,\n    .size-chart-table th:first-child{\n      text-align:left;\n      padding-left: 6px;\n      font-weight: 600;\n    }\n    .size-chart-table tbody tr:last-child td{\n      border-bottom: none;\n    }\n\n    .size-chart-note{\n      margin-top: 10px;\n      font-size: 11.5px;\n      color: var(--muted);\n      text-align: center;\n    }\n\n    @media (max-width:660px){\n      .wrap{ margin:44px auto; padding:0 14px; }\n      .card{ padding: 24px 20px; }\n      .size-chart-collapse{ max-width: 100%; }\n    }\n  \u003c\/style\u003e\n\n\n  \u003cmain class=\"wrap\" aria-labelledby=\"product-heading\"\u003e\n    \u003csection class=\"card\" aria-describedby=\"product-desc\"\u003e\n      \u003ch1 class=\"title\" id=\"product-heading\"\u003eBuilt for the Long Term\u003c\/h1\u003e\n      \u003cp class=\"lead\" id=\"product-desc\"\u003e\n        We make pieces to last. Cut from ultra-smooth 100% polyester mesh for cool comfort and durability, then\n        finished with professional-grade printing that resists cracking and fading. Everyday-ready, season after season.\n      \u003c\/p\u003e\n      \u003cul class=\"features\" role=\"list\"\u003e\n        \u003cli\u003e100% Polyester Mesh\u003c\/li\u003e\n        \u003cli\u003eWith pockets\u003c\/li\u003e\n        \u003cli\u003eHigh-quality printing\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/section\u003e\n\n    \u003c!-- Trigger --\u003e\n    \u003cdiv class=\"size-chart-button-container\"\u003e\n      \u003cbutton id=\"sizeChartToggle\" class=\"size-chart-open-button\" aria-expanded=\"false\" aria-controls=\"sizeChartPanel\"\u003e\n        Size Chart For Shirt\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Collapsible size chart --\u003e\n    \u003csection id=\"sizeChartPanel\" class=\"size-chart-collapse hidden\" aria-hidden=\"true\"\u003e\n      \u003c!-- Tabs --\u003e\n      \u003cdiv class=\"size-chart-tabs\" role=\"tablist\" aria-label=\"Size chart units\"\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-cm\" aria-selected=\"true\" aria-controls=\"tab-cm\" tabindex=\"0\" data-unit=\"cm\"\u003eCM\u003c\/button\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-in\" aria-selected=\"false\" aria-controls=\"tab-in\" tabindex=\"-1\" data-unit=\"in\"\u003eInches\u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- CM table --\u003e\n      \u003cdiv id=\"tab-cm\" role=\"tabpanel\" aria-labelledby=\"tab-btn-cm\"\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-cm\" aria-label=\"Shirt size chart in centimeters\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Inches table --\u003e\n      \u003cdiv id=\"tab-in\" role=\"tabpanel\" aria-labelledby=\"tab-btn-in\" hidden\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-in\" aria-label=\"Shirt size chart in inches\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003cp class=\"size-chart-note\"\u003e\n        Measurements are garment dimensions. Compare with a tee you own for best fit.\n      \u003c\/p\u003e\n    \u003c\/section\u003e\n\n    \u003cnoscript\u003e\n      \u003cp style=\"text-align:center;font:14px\/1.4 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;color:#555;\"\u003e\n        Enable JavaScript to view the interactive size chart.\n      \u003c\/p\u003e\n    \u003c\/noscript\u003e\n  \u003c\/main\u003e\n\n  \u003cscript\u003e\n    \/* ===== Data (single source of truth in CM) ===== *\/\n    const SIZE_DATA_CM = [\n      { size: \"S\",   length: 72, chest: 112, shoulder: 54,   sleeve: 24 },\n      { size: \"M\",   length: 74, chest: 116, shoulder: 55.5, sleeve: 25 },\n      { size: \"L\",   length: 76, chest: 120, shoulder: 57,   sleeve: 26 },\n      { size: \"XL\",  length: 78, chest: 124, shoulder: 58.5, sleeve: 27 },\n      { size: \"XXL\", length: 80, chest: 128, shoulder: 60,   sleeve: 28 },\n      { size: \"XXXL\",length: 82, chest: 132, shoulder: 61.5, sleeve: 29 }\n    ];\n\n    const COLUMNS = [\n      { key: \"size\",     label: \"Size\" },\n      { key: \"length\",   label: \"Length\" },\n      { key: \"chest\",    label: \"Chest\" },\n      { key: \"shoulder\", label: \"Shoulder\" },\n      { key: \"sleeve\",   label: \"Sleeve\" }\n    ];\n\n    \/\/ CM -\u003e inches (rounded to nearest 0.5\")\n    const cmToIn = cm =\u003e Math.round((cm \/ 2.54) * 2) \/ 2;\n\n    function renderTable(target, data, unit){\n      const thead = document.createElement(\"thead\");\n      const trh = document.createElement(\"tr\");\n\n      COLUMNS.forEach(col =\u003e {\n        const th = document.createElement(\"th\");\n        th.scope = \"col\";\n        th.textContent = col.key === \"size\" ? col.label : `${col.label} (${unit === \"cm\" ? \"cm\" : \"in\"})`;\n        trh.appendChild(th);\n      });\n      thead.appendChild(trh);\n\n      const tbody = document.createElement(\"tbody\");\n      data.forEach(row =\u003e {\n        const tr = document.createElement(\"tr\");\n        COLUMNS.forEach(col =\u003e {\n          const td = document.createElement(\"td\");\n          if(col.key === \"size\"){\n            td.textContent = row.size;\n            td.style.fontWeight = 600;\n          } else {\n            const val = unit === \"cm\" ? row[col.key] : cmToIn(row[col.key]);\n            td.textContent = Number.isInteger(val) ? String(val) : val.toFixed(1);\n          }\n          tr.appendChild(td);\n        });\n        tbody.appendChild(tr);\n      });\n\n      target.innerHTML = \"\";\n      target.appendChild(thead);\n      target.appendChild(tbody);\n    }\n\n    \/\/ Initial render\n    const tableCM = document.getElementById(\"table-cm\");\n    const tableIN = document.getElementById(\"table-in\");\n    renderTable(tableCM, SIZE_DATA_CM, \"cm\");\n    renderTable(tableIN, SIZE_DATA_CM, \"in\");\n\n    \/\/ Collapsible behavior\n    const toggleBtn = document.getElementById(\"sizeChartToggle\");\n    const panel = document.getElementById(\"sizeChartPanel\");\n\n    function setPanel(open){\n      panel.classList.toggle(\"hidden\", !open);\n      panel.setAttribute(\"aria-hidden\", String(!open));\n      toggleBtn.setAttribute(\"aria-expanded\", String(!!open));\n      if(open){ document.getElementById(\"tab-btn-cm\").focus(); }\n    }\n    toggleBtn.addEventListener(\"click\", () =\u003e {\n      const isOpen = toggleBtn.getAttribute(\"aria-expanded\") === \"true\";\n      setPanel(!isOpen);\n    });\n\n    \/\/ Tabs: click + arrow keys + roving tabindex\n    const tabs = Array.from(document.querySelectorAll('[role=\"tab\"]'));\n    const tabMap = {\n      cm: { btn: document.getElementById(\"tab-btn-cm\"), panel: document.getElementById(\"tab-cm\") },\n      in: { btn: document.getElementById(\"tab-btn-in\"), panel: document.getElementById(\"tab-in\") }\n    };\n\n    function activateTab(key){\n      for(const k in tabMap){\n        const { btn, panel } = tabMap[k];\n        const selected = k === key;\n        btn.setAttribute(\"aria-selected\", String(selected));\n        btn.tabIndex = selected ? 0 : -1;\n        panel.hidden = !selected;\n      }\n      tabMap[key].btn.focus();\n    }\n\n    tabs.forEach(btn =\u003e {\n      btn.addEventListener(\"click\", () =\u003e activateTab(btn.dataset.unit));\n      btn.addEventListener(\"keydown\", (e) =\u003e {\n        const idx = tabs.indexOf(btn);\n        if(e.key === 'ArrowRight' || e.key === 'ArrowDown'){\n          e.preventDefault();\n          const next = tabs[(idx + 1) % tabs.length];\n          activateTab(next.dataset.unit);\n        } else if(e.key === 'ArrowLeft' || e.key === 'ArrowUp'){\n          e.preventDefault();\n          const prev = tabs[(idx - 1 + tabs.length) % tabs.length];\n          activateTab(prev.dataset.unit);\n        } else if(e.key === 'Home'){\n          e.preventDefault();\n          activateTab(tabs[0].dataset.unit);\n        } else if(e.key === 'End'){\n          e.preventDefault();\n          activateTab(tabs[tabs.length - 1].dataset.unit);\n        }\n      });\n    });\n\n    \/\/ Default active tab\n    activateTab('cm');\n  \u003c\/script\u003e\n\n\n\u003c\/body\u003e","brand":"Washed Warrior","offers":[{"title":"S","offer_id":51639741186395,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":51639741219163,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":51639741251931,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":51639741284699,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":51639741317467,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":51639741350235,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/variant-image-1_d1fa5592-38b3-4087-8487-19c0964dee67.jpg?v=1761764332"},{"product_id":"the-drunk","title":"The Drunk","description":"\u003cbody\u003e\n\n\n  \u003cmeta charset=\"utf-8\"\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n  \u003ctitle\u003eProduct + Size Chart — Minimal\u003c\/title\u003e\n  \u003cstyle\u003e\n    :root{\n      --bg:#ffffff;\n      --ink:#0b0c0f;\n      --muted:#6b7280;\n      --line:#eceef1;\n      --accent:#111827;\n      --radius:18px;\n      --radius-sm:10px;\n      --shadow:0 6px 24px rgba(0,0,0,.05);\n      --shadow-soft:0 3px 12px rgba(0,0,0,.05);\n    }\n\n    html,body{height:100%}\n    html{color-scheme:light}\n    body{\n      margin:0;\n      background:var(--bg);\n      color:var(--ink);\n      font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Inter, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif;\n      -webkit-font-smoothing:antialiased;\n      font-size:15px;\n      line-height:1.75;\n      font-weight:300;\n      letter-spacing:.15px;\n    }\n\n    \/* Narrow, minimal container *\/\n    .wrap{\n      max-width: 640px;\n      margin: 56px auto;\n      padding: 0 18px;\n      position: relative;\n    }\n\n    \/* Minimal card *\/\n    .card{\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius);\n      box-shadow: var(--shadow);\n      padding: 28px 26px;\n    }\n\n    .title{\n      margin: 0 0 10px;\n      font-size: clamp(20px, 4.4vw, 26px);\n      font-weight: 700;\n      letter-spacing: -0.015em;\n    }\n\n    .lead{\n      margin: 0;\n      color:#1f2937;\n      max-width: 60ch;\n    }\n\n    .features{\n      list-style: none;\n      padding: 0;\n      margin: 16px 0 0;\n      display: grid;\n      gap: 10px;\n    }\n    .features li{\n      font-weight: 400;\n      display: inline-flex;\n      align-items: baseline;\n      gap: 8px;\n    }\n    .features li::before{\n      content: \"—\";\n      color: var(--accent);\n      opacity:.55;\n      font-weight: 600;\n    }\n\n    \/* Ghost trigger button *\/\n    .size-chart-button-container{ text-align:center; margin: 16px 0 0; }\n    .size-chart-open-button{\n      background:#fff;\n      color:var(--ink);\n      padding: 9px 16px;\n      font-size: 12px;\n      font-weight: 700;\n      letter-spacing:.25px;\n      border-radius: 999px;\n      border: 1px solid var(--ink);\n      cursor: pointer;\n      text-transform: uppercase;\n      transition: transform .15s ease, box-shadow .2s ease, background .2s ease;\n      box-shadow: var(--shadow-soft);\n    }\n    .size-chart-open-button:hover,\n    .size-chart-open-button:focus-visible{\n      transform: translateY(-1px);\n      outline: none;\n      background: #fafafa;\n      box-shadow: 0 10px 26px rgba(0,0,0,.08);\n    }\n\n    \/* Collapse *\/\n    .size-chart-collapse{\n      width: 100%;\n      max-width: 560px;\n      margin: 18px auto 40px;\n      padding: 16px;\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius-sm);\n      box-shadow: var(--shadow-soft);\n    }\n    .hidden{ display:none; }\n\n    \/* Tabs: minimalist underline *\/\n    .size-chart-tabs{\n      display:flex;\n      justify-content:center;\n      gap: 18px;\n      margin-bottom: 12px;\n      border-bottom: 1px solid var(--line);\n      padding-bottom: 2px;\n    }\n    .tab-button{\n      appearance:none;\n      background:transparent;\n      color:var(--muted);\n      padding: 6px 2px;\n      font-size:12px;\n      font-weight:700;\n      letter-spacing:.3px;\n      border:none;\n      border-radius:0;\n      cursor:pointer;\n      position:relative;\n      transition: color .2s ease;\n    }\n    .tab-button:hover,\n    .tab-button:focus-visible{\n      color:var(--ink);\n      outline:none;\n    }\n    .tab-button[aria-selected=\"true\"]{\n      color:var(--ink);\n    }\n    .tab-button[aria-selected=\"true\"]::after{\n      content:\"\";\n      position:absolute;\n      left:0; right:0; bottom:-3px;\n      height: 2px;\n      background: var(--accent);\n      border-radius: 2px;\n    }\n\n    \/* Table: soft row dividers only *\/\n    .size-chart-table{\n      width:100%;\n      border-collapse: collapse;\n      background:#fff;\n    }\n    .size-chart-table th,\n    .size-chart-table td{\n      text-align:center;\n      padding: 10px 6px;\n      font-size:12px;\n      color:var(--ink);\n      border: none;\n      border-bottom: 1px solid var(--line);\n    }\n    .size-chart-table th{\n      font-weight: 700;\n      background: #fbfcfd;\n    }\n    .size-chart-table td:first-child,\n    .size-chart-table th:first-child{\n      text-align:left;\n      padding-left: 6px;\n      font-weight: 600;\n    }\n    .size-chart-table tbody tr:last-child td{\n      border-bottom: none;\n    }\n\n    .size-chart-note{\n      margin-top: 10px;\n      font-size: 11.5px;\n      color: var(--muted);\n      text-align: center;\n    }\n\n    @media (max-width:660px){\n      .wrap{ margin:44px auto; padding:0 14px; }\n      .card{ padding: 24px 20px; }\n      .size-chart-collapse{ max-width: 100%; }\n    }\n  \u003c\/style\u003e\n\n\n  \u003cmain class=\"wrap\" aria-labelledby=\"product-heading\"\u003e\n    \u003csection class=\"card\" aria-describedby=\"product-desc\"\u003e\n      \u003ch1 class=\"title\" id=\"product-heading\"\u003eBuilt for the Long Term\u003c\/h1\u003e\n      \u003cp class=\"lead\" id=\"product-desc\"\u003e\n        We make pieces to last. Cut from ultra-smooth 100% polyester mesh for cool comfort and durability, then\n        finished with professional-grade printing that resists cracking and fading. Everyday-ready, season after season.\n      \u003c\/p\u003e\n      \u003cul class=\"features\" role=\"list\"\u003e\n        \u003cli\u003e100% Polyester Mesh\u003c\/li\u003e\n        \u003cli\u003eWith pockets\u003c\/li\u003e\n        \u003cli\u003eHigh-quality printing\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/section\u003e\n\n    \u003c!-- Trigger --\u003e\n    \u003cdiv class=\"size-chart-button-container\"\u003e\n      \u003cbutton id=\"sizeChartToggle\" class=\"size-chart-open-button\" aria-expanded=\"false\" aria-controls=\"sizeChartPanel\"\u003e\n        Size Chart For Shirt\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Collapsible size chart --\u003e\n    \u003csection id=\"sizeChartPanel\" class=\"size-chart-collapse hidden\" aria-hidden=\"true\"\u003e\n      \u003c!-- Tabs --\u003e\n      \u003cdiv class=\"size-chart-tabs\" role=\"tablist\" aria-label=\"Size chart units\"\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-cm\" aria-selected=\"true\" aria-controls=\"tab-cm\" tabindex=\"0\" data-unit=\"cm\"\u003eCM\u003c\/button\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-in\" aria-selected=\"false\" aria-controls=\"tab-in\" tabindex=\"-1\" data-unit=\"in\"\u003eInches\u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- CM table --\u003e\n      \u003cdiv id=\"tab-cm\" role=\"tabpanel\" aria-labelledby=\"tab-btn-cm\"\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-cm\" aria-label=\"Shirt size chart in centimeters\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Inches table --\u003e\n      \u003cdiv id=\"tab-in\" role=\"tabpanel\" aria-labelledby=\"tab-btn-in\" hidden\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-in\" aria-label=\"Shirt size chart in inches\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003cp class=\"size-chart-note\"\u003e\n        Measurements are garment dimensions. Compare with a tee you own for best fit.\n      \u003c\/p\u003e\n    \u003c\/section\u003e\n\n    \u003cnoscript\u003e\n      \u003cp style=\"text-align:center;font:14px\/1.4 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;color:#555;\"\u003e\n        Enable JavaScript to view the interactive size chart.\n      \u003c\/p\u003e\n    \u003c\/noscript\u003e\n  \u003c\/main\u003e\n\n  \u003cscript\u003e\n    \/* ===== Data (single source of truth in CM) ===== *\/\n    const SIZE_DATA_CM = [\n      { size: \"S\",   length: 72, chest: 112, shoulder: 54,   sleeve: 24 },\n      { size: \"M\",   length: 74, chest: 116, shoulder: 55.5, sleeve: 25 },\n      { size: \"L\",   length: 76, chest: 120, shoulder: 57,   sleeve: 26 },\n      { size: \"XL\",  length: 78, chest: 124, shoulder: 58.5, sleeve: 27 },\n      { size: \"XXL\", length: 80, chest: 128, shoulder: 60,   sleeve: 28 },\n      { size: \"XXXL\",length: 82, chest: 132, shoulder: 61.5, sleeve: 29 }\n    ];\n\n    const COLUMNS = [\n      { key: \"size\",     label: \"Size\" },\n      { key: \"length\",   label: \"Length\" },\n      { key: \"chest\",    label: \"Chest\" },\n      { key: \"shoulder\", label: \"Shoulder\" },\n      { key: \"sleeve\",   label: \"Sleeve\" }\n    ];\n\n    \/\/ CM -\u003e inches (rounded to nearest 0.5\")\n    const cmToIn = cm =\u003e Math.round((cm \/ 2.54) * 2) \/ 2;\n\n    function renderTable(target, data, unit){\n      const thead = document.createElement(\"thead\");\n      const trh = document.createElement(\"tr\");\n\n      COLUMNS.forEach(col =\u003e {\n        const th = document.createElement(\"th\");\n        th.scope = \"col\";\n        th.textContent = col.key === \"size\" ? col.label : `${col.label} (${unit === \"cm\" ? \"cm\" : \"in\"})`;\n        trh.appendChild(th);\n      });\n      thead.appendChild(trh);\n\n      const tbody = document.createElement(\"tbody\");\n      data.forEach(row =\u003e {\n        const tr = document.createElement(\"tr\");\n        COLUMNS.forEach(col =\u003e {\n          const td = document.createElement(\"td\");\n          if(col.key === \"size\"){\n            td.textContent = row.size;\n            td.style.fontWeight = 600;\n          } else {\n            const val = unit === \"cm\" ? row[col.key] : cmToIn(row[col.key]);\n            td.textContent = Number.isInteger(val) ? String(val) : val.toFixed(1);\n          }\n          tr.appendChild(td);\n        });\n        tbody.appendChild(tr);\n      });\n\n      target.innerHTML = \"\";\n      target.appendChild(thead);\n      target.appendChild(tbody);\n    }\n\n    \/\/ Initial render\n    const tableCM = document.getElementById(\"table-cm\");\n    const tableIN = document.getElementById(\"table-in\");\n    renderTable(tableCM, SIZE_DATA_CM, \"cm\");\n    renderTable(tableIN, SIZE_DATA_CM, \"in\");\n\n    \/\/ Collapsible behavior\n    const toggleBtn = document.getElementById(\"sizeChartToggle\");\n    const panel = document.getElementById(\"sizeChartPanel\");\n\n    function setPanel(open){\n      panel.classList.toggle(\"hidden\", !open);\n      panel.setAttribute(\"aria-hidden\", String(!open));\n      toggleBtn.setAttribute(\"aria-expanded\", String(!!open));\n      if(open){ document.getElementById(\"tab-btn-cm\").focus(); }\n    }\n    toggleBtn.addEventListener(\"click\", () =\u003e {\n      const isOpen = toggleBtn.getAttribute(\"aria-expanded\") === \"true\";\n      setPanel(!isOpen);\n    });\n\n    \/\/ Tabs: click + arrow keys + roving tabindex\n    const tabs = Array.from(document.querySelectorAll('[role=\"tab\"]'));\n    const tabMap = {\n      cm: { btn: document.getElementById(\"tab-btn-cm\"), panel: document.getElementById(\"tab-cm\") },\n      in: { btn: document.getElementById(\"tab-btn-in\"), panel: document.getElementById(\"tab-in\") }\n    };\n\n    function activateTab(key){\n      for(const k in tabMap){\n        const { btn, panel } = tabMap[k];\n        const selected = k === key;\n        btn.setAttribute(\"aria-selected\", String(selected));\n        btn.tabIndex = selected ? 0 : -1;\n        panel.hidden = !selected;\n      }\n      tabMap[key].btn.focus();\n    }\n\n    tabs.forEach(btn =\u003e {\n      btn.addEventListener(\"click\", () =\u003e activateTab(btn.dataset.unit));\n      btn.addEventListener(\"keydown\", (e) =\u003e {\n        const idx = tabs.indexOf(btn);\n        if(e.key === 'ArrowRight' || e.key === 'ArrowDown'){\n          e.preventDefault();\n          const next = tabs[(idx + 1) % tabs.length];\n          activateTab(next.dataset.unit);\n        } else if(e.key === 'ArrowLeft' || e.key === 'ArrowUp'){\n          e.preventDefault();\n          const prev = tabs[(idx - 1 + tabs.length) % tabs.length];\n          activateTab(prev.dataset.unit);\n        } else if(e.key === 'Home'){\n          e.preventDefault();\n          activateTab(tabs[0].dataset.unit);\n        } else if(e.key === 'End'){\n          e.preventDefault();\n          activateTab(tabs[tabs.length - 1].dataset.unit);\n        }\n      });\n    });\n\n    \/\/ Default active tab\n    activateTab('cm');\n  \u003c\/script\u003e\n\n\n\u003c\/body\u003e","brand":"Washed Warrior","offers":[{"title":"S","offer_id":51639738237275,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":51639738270043,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":51639738302811,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":51639738335579,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":51639738368347,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":51639738401115,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/variant-image-26.jpg?v=1761764646"},{"product_id":"the-drunk-copy","title":"The Ghost","description":"\u003cbody\u003e\n\n\n  \u003cmeta charset=\"utf-8\"\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n  \u003ctitle\u003eProduct + Size Chart — Minimal\u003c\/title\u003e\n  \u003cstyle\u003e\n    :root{\n      --bg:#ffffff;\n      --ink:#0b0c0f;\n      --muted:#6b7280;\n      --line:#eceef1;\n      --accent:#111827;\n      --radius:18px;\n      --radius-sm:10px;\n      --shadow:0 6px 24px rgba(0,0,0,.05);\n      --shadow-soft:0 3px 12px rgba(0,0,0,.05);\n    }\n\n    html,body{height:100%}\n    html{color-scheme:light}\n    body{\n      margin:0;\n      background:var(--bg);\n      color:var(--ink);\n      font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Inter, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif;\n      -webkit-font-smoothing:antialiased;\n      font-size:15px;\n      line-height:1.75;\n      font-weight:300;\n      letter-spacing:.15px;\n    }\n\n    \/* Narrow, minimal container *\/\n    .wrap{\n      max-width: 640px;\n      margin: 56px auto;\n      padding: 0 18px;\n      position: relative;\n    }\n\n    \/* Minimal card *\/\n    .card{\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius);\n      box-shadow: var(--shadow);\n      padding: 28px 26px;\n    }\n\n    .title{\n      margin: 0 0 10px;\n      font-size: clamp(20px, 4.4vw, 26px);\n      font-weight: 700;\n      letter-spacing: -0.015em;\n    }\n\n    .lead{\n      margin: 0;\n      color:#1f2937;\n      max-width: 60ch;\n    }\n\n    .features{\n      list-style: none;\n      padding: 0;\n      margin: 16px 0 0;\n      display: grid;\n      gap: 10px;\n    }\n    .features li{\n      font-weight: 400;\n      display: inline-flex;\n      align-items: baseline;\n      gap: 8px;\n    }\n    .features li::before{\n      content: \"—\";\n      color: var(--accent);\n      opacity:.55;\n      font-weight: 600;\n    }\n\n    \/* Ghost trigger button *\/\n    .size-chart-button-container{ text-align:center; margin: 16px 0 0; }\n    .size-chart-open-button{\n      background:#fff;\n      color:var(--ink);\n      padding: 9px 16px;\n      font-size: 12px;\n      font-weight: 700;\n      letter-spacing:.25px;\n      border-radius: 999px;\n      border: 1px solid var(--ink);\n      cursor: pointer;\n      text-transform: uppercase;\n      transition: transform .15s ease, box-shadow .2s ease, background .2s ease;\n      box-shadow: var(--shadow-soft);\n    }\n    .size-chart-open-button:hover,\n    .size-chart-open-button:focus-visible{\n      transform: translateY(-1px);\n      outline: none;\n      background: #fafafa;\n      box-shadow: 0 10px 26px rgba(0,0,0,.08);\n    }\n\n    \/* Collapse *\/\n    .size-chart-collapse{\n      width: 100%;\n      max-width: 560px;\n      margin: 18px auto 40px;\n      padding: 16px;\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius-sm);\n      box-shadow: var(--shadow-soft);\n    }\n    .hidden{ display:none; }\n\n    \/* Tabs: minimalist underline *\/\n    .size-chart-tabs{\n      display:flex;\n      justify-content:center;\n      gap: 18px;\n      margin-bottom: 12px;\n      border-bottom: 1px solid var(--line);\n      padding-bottom: 2px;\n    }\n    .tab-button{\n      appearance:none;\n      background:transparent;\n      color:var(--muted);\n      padding: 6px 2px;\n      font-size:12px;\n      font-weight:700;\n      letter-spacing:.3px;\n      border:none;\n      border-radius:0;\n      cursor:pointer;\n      position:relative;\n      transition: color .2s ease;\n    }\n    .tab-button:hover,\n    .tab-button:focus-visible{\n      color:var(--ink);\n      outline:none;\n    }\n    .tab-button[aria-selected=\"true\"]{\n      color:var(--ink);\n    }\n    .tab-button[aria-selected=\"true\"]::after{\n      content:\"\";\n      position:absolute;\n      left:0; right:0; bottom:-3px;\n      height: 2px;\n      background: var(--accent);\n      border-radius: 2px;\n    }\n\n    \/* Table: soft row dividers only *\/\n    .size-chart-table{\n      width:100%;\n      border-collapse: collapse;\n      background:#fff;\n    }\n    .size-chart-table th,\n    .size-chart-table td{\n      text-align:center;\n      padding: 10px 6px;\n      font-size:12px;\n      color:var(--ink);\n      border: none;\n      border-bottom: 1px solid var(--line);\n    }\n    .size-chart-table th{\n      font-weight: 700;\n      background: #fbfcfd;\n    }\n    .size-chart-table td:first-child,\n    .size-chart-table th:first-child{\n      text-align:left;\n      padding-left: 6px;\n      font-weight: 600;\n    }\n    .size-chart-table tbody tr:last-child td{\n      border-bottom: none;\n    }\n\n    .size-chart-note{\n      margin-top: 10px;\n      font-size: 11.5px;\n      color: var(--muted);\n      text-align: center;\n    }\n\n    @media (max-width:660px){\n      .wrap{ margin:44px auto; padding:0 14px; }\n      .card{ padding: 24px 20px; }\n      .size-chart-collapse{ max-width: 100%; }\n    }\n  \u003c\/style\u003e\n\n\n  \u003cmain class=\"wrap\" aria-labelledby=\"product-heading\"\u003e\n    \u003csection class=\"card\" aria-describedby=\"product-desc\"\u003e\n      \u003ch1 class=\"title\" id=\"product-heading\"\u003eBuilt for the Long Term\u003c\/h1\u003e\n      \u003cp class=\"lead\" id=\"product-desc\"\u003e\n        We make pieces to last. Cut from ultra-smooth 100% polyester mesh for cool comfort and durability, then\n        finished with professional-grade printing that resists cracking and fading. Everyday-ready, season after season.\n      \u003c\/p\u003e\n      \u003cul class=\"features\" role=\"list\"\u003e\n        \u003cli\u003e100% Polyester Mesh\u003c\/li\u003e\n        \u003cli\u003eWith pockets\u003c\/li\u003e\n        \u003cli\u003eHigh-quality printing\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/section\u003e\n\n    \u003c!-- Trigger --\u003e\n    \u003cdiv class=\"size-chart-button-container\"\u003e\n      \u003cbutton id=\"sizeChartToggle\" class=\"size-chart-open-button\" aria-expanded=\"false\" aria-controls=\"sizeChartPanel\"\u003e\n        Size Chart For Shirt\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Collapsible size chart --\u003e\n    \u003csection id=\"sizeChartPanel\" class=\"size-chart-collapse hidden\" aria-hidden=\"true\"\u003e\n      \u003c!-- Tabs --\u003e\n      \u003cdiv class=\"size-chart-tabs\" role=\"tablist\" aria-label=\"Size chart units\"\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-cm\" aria-selected=\"true\" aria-controls=\"tab-cm\" tabindex=\"0\" data-unit=\"cm\"\u003eCM\u003c\/button\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-in\" aria-selected=\"false\" aria-controls=\"tab-in\" tabindex=\"-1\" data-unit=\"in\"\u003eInches\u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- CM table --\u003e\n      \u003cdiv id=\"tab-cm\" role=\"tabpanel\" aria-labelledby=\"tab-btn-cm\"\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-cm\" aria-label=\"Shirt size chart in centimeters\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Inches table --\u003e\n      \u003cdiv id=\"tab-in\" role=\"tabpanel\" aria-labelledby=\"tab-btn-in\" hidden\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-in\" aria-label=\"Shirt size chart in inches\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003cp class=\"size-chart-note\"\u003e\n        Measurements are garment dimensions. Compare with a tee you own for best fit.\n      \u003c\/p\u003e\n    \u003c\/section\u003e\n\n    \u003cnoscript\u003e\n      \u003cp style=\"text-align:center;font:14px\/1.4 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;color:#555;\"\u003e\n        Enable JavaScript to view the interactive size chart.\n      \u003c\/p\u003e\n    \u003c\/noscript\u003e\n  \u003c\/main\u003e\n\n  \u003cscript\u003e\n    \/* ===== Data (single source of truth in CM) ===== *\/\n    const SIZE_DATA_CM = [\n      { size: \"S\",   length: 72, chest: 112, shoulder: 54,   sleeve: 24 },\n      { size: \"M\",   length: 74, chest: 116, shoulder: 55.5, sleeve: 25 },\n      { size: \"L\",   length: 76, chest: 120, shoulder: 57,   sleeve: 26 },\n      { size: \"XL\",  length: 78, chest: 124, shoulder: 58.5, sleeve: 27 },\n      { size: \"XXL\", length: 80, chest: 128, shoulder: 60,   sleeve: 28 },\n      { size: \"XXXL\",length: 82, chest: 132, shoulder: 61.5, sleeve: 29 }\n    ];\n\n    const COLUMNS = [\n      { key: \"size\",     label: \"Size\" },\n      { key: \"length\",   label: \"Length\" },\n      { key: \"chest\",    label: \"Chest\" },\n      { key: \"shoulder\", label: \"Shoulder\" },\n      { key: \"sleeve\",   label: \"Sleeve\" }\n    ];\n\n    \/\/ CM -\u003e inches (rounded to nearest 0.5\")\n    const cmToIn = cm =\u003e Math.round((cm \/ 2.54) * 2) \/ 2;\n\n    function renderTable(target, data, unit){\n      const thead = document.createElement(\"thead\");\n      const trh = document.createElement(\"tr\");\n\n      COLUMNS.forEach(col =\u003e {\n        const th = document.createElement(\"th\");\n        th.scope = \"col\";\n        th.textContent = col.key === \"size\" ? col.label : `${col.label} (${unit === \"cm\" ? \"cm\" : \"in\"})`;\n        trh.appendChild(th);\n      });\n      thead.appendChild(trh);\n\n      const tbody = document.createElement(\"tbody\");\n      data.forEach(row =\u003e {\n        const tr = document.createElement(\"tr\");\n        COLUMNS.forEach(col =\u003e {\n          const td = document.createElement(\"td\");\n          if(col.key === \"size\"){\n            td.textContent = row.size;\n            td.style.fontWeight = 600;\n          } else {\n            const val = unit === \"cm\" ? row[col.key] : cmToIn(row[col.key]);\n            td.textContent = Number.isInteger(val) ? String(val) : val.toFixed(1);\n          }\n          tr.appendChild(td);\n        });\n        tbody.appendChild(tr);\n      });\n\n      target.innerHTML = \"\";\n      target.appendChild(thead);\n      target.appendChild(tbody);\n    }\n\n    \/\/ Initial render\n    const tableCM = document.getElementById(\"table-cm\");\n    const tableIN = document.getElementById(\"table-in\");\n    renderTable(tableCM, SIZE_DATA_CM, \"cm\");\n    renderTable(tableIN, SIZE_DATA_CM, \"in\");\n\n    \/\/ Collapsible behavior\n    const toggleBtn = document.getElementById(\"sizeChartToggle\");\n    const panel = document.getElementById(\"sizeChartPanel\");\n\n    function setPanel(open){\n      panel.classList.toggle(\"hidden\", !open);\n      panel.setAttribute(\"aria-hidden\", String(!open));\n      toggleBtn.setAttribute(\"aria-expanded\", String(!!open));\n      if(open){ document.getElementById(\"tab-btn-cm\").focus(); }\n    }\n    toggleBtn.addEventListener(\"click\", () =\u003e {\n      const isOpen = toggleBtn.getAttribute(\"aria-expanded\") === \"true\";\n      setPanel(!isOpen);\n    });\n\n    \/\/ Tabs: click + arrow keys + roving tabindex\n    const tabs = Array.from(document.querySelectorAll('[role=\"tab\"]'));\n    const tabMap = {\n      cm: { btn: document.getElementById(\"tab-btn-cm\"), panel: document.getElementById(\"tab-cm\") },\n      in: { btn: document.getElementById(\"tab-btn-in\"), panel: document.getElementById(\"tab-in\") }\n    };\n\n    function activateTab(key){\n      for(const k in tabMap){\n        const { btn, panel } = tabMap[k];\n        const selected = k === key;\n        btn.setAttribute(\"aria-selected\", String(selected));\n        btn.tabIndex = selected ? 0 : -1;\n        panel.hidden = !selected;\n      }\n      tabMap[key].btn.focus();\n    }\n\n    tabs.forEach(btn =\u003e {\n      btn.addEventListener(\"click\", () =\u003e activateTab(btn.dataset.unit));\n      btn.addEventListener(\"keydown\", (e) =\u003e {\n        const idx = tabs.indexOf(btn);\n        if(e.key === 'ArrowRight' || e.key === 'ArrowDown'){\n          e.preventDefault();\n          const next = tabs[(idx + 1) % tabs.length];\n          activateTab(next.dataset.unit);\n        } else if(e.key === 'ArrowLeft' || e.key === 'ArrowUp'){\n          e.preventDefault();\n          const prev = tabs[(idx - 1 + tabs.length) % tabs.length];\n          activateTab(prev.dataset.unit);\n        } else if(e.key === 'Home'){\n          e.preventDefault();\n          activateTab(tabs[0].dataset.unit);\n        } else if(e.key === 'End'){\n          e.preventDefault();\n          activateTab(tabs[tabs.length - 1].dataset.unit);\n        }\n      });\n    });\n\n    \/\/ Default active tab\n    activateTab('cm');\n  \u003c\/script\u003e\n\n\n\u003c\/body\u003e","brand":"Washed Warrior","offers":[{"title":"S","offer_id":51639731159387,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":51639731192155,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":51639731224923,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":51639731257691,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":51639731290459,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":51639731323227,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/variant-image-8_1.jpg?v=1761764739"},{"product_id":"the-ghost-copy","title":"The Masked Man","description":"\u003cbody\u003e\n\n\n  \u003cmeta charset=\"utf-8\"\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n  \u003ctitle\u003eProduct + Size Chart — Minimal\u003c\/title\u003e\n  \u003cstyle\u003e\n    :root{\n      --bg:#ffffff;\n      --ink:#0b0c0f;\n      --muted:#6b7280;\n      --line:#eceef1;\n      --accent:#111827;\n      --radius:18px;\n      --radius-sm:10px;\n      --shadow:0 6px 24px rgba(0,0,0,.05);\n      --shadow-soft:0 3px 12px rgba(0,0,0,.05);\n    }\n\n    html,body{height:100%}\n    html{color-scheme:light}\n    body{\n      margin:0;\n      background:var(--bg);\n      color:var(--ink);\n      font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Inter, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif;\n      -webkit-font-smoothing:antialiased;\n      font-size:15px;\n      line-height:1.75;\n      font-weight:300;\n      letter-spacing:.15px;\n    }\n\n    \/* Narrow, minimal container *\/\n    .wrap{\n      max-width: 640px;\n      margin: 56px auto;\n      padding: 0 18px;\n      position: relative;\n    }\n\n    \/* Minimal card *\/\n    .card{\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius);\n      box-shadow: var(--shadow);\n      padding: 28px 26px;\n    }\n\n    .title{\n      margin: 0 0 10px;\n      font-size: clamp(20px, 4.4vw, 26px);\n      font-weight: 700;\n      letter-spacing: -0.015em;\n    }\n\n    .lead{\n      margin: 0;\n      color:#1f2937;\n      max-width: 60ch;\n    }\n\n    .features{\n      list-style: none;\n      padding: 0;\n      margin: 16px 0 0;\n      display: grid;\n      gap: 10px;\n    }\n    .features li{\n      font-weight: 400;\n      display: inline-flex;\n      align-items: baseline;\n      gap: 8px;\n    }\n    .features li::before{\n      content: \"—\";\n      color: var(--accent);\n      opacity:.55;\n      font-weight: 600;\n    }\n\n    \/* Ghost trigger button *\/\n    .size-chart-button-container{ text-align:center; margin: 16px 0 0; }\n    .size-chart-open-button{\n      background:#fff;\n      color:var(--ink);\n      padding: 9px 16px;\n      font-size: 12px;\n      font-weight: 700;\n      letter-spacing:.25px;\n      border-radius: 999px;\n      border: 1px solid var(--ink);\n      cursor: pointer;\n      text-transform: uppercase;\n      transition: transform .15s ease, box-shadow .2s ease, background .2s ease;\n      box-shadow: var(--shadow-soft);\n    }\n    .size-chart-open-button:hover,\n    .size-chart-open-button:focus-visible{\n      transform: translateY(-1px);\n      outline: none;\n      background: #fafafa;\n      box-shadow: 0 10px 26px rgba(0,0,0,.08);\n    }\n\n    \/* Collapse *\/\n    .size-chart-collapse{\n      width: 100%;\n      max-width: 560px;\n      margin: 18px auto 40px;\n      padding: 16px;\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius-sm);\n      box-shadow: var(--shadow-soft);\n    }\n    .hidden{ display:none; }\n\n    \/* Tabs: minimalist underline *\/\n    .size-chart-tabs{\n      display:flex;\n      justify-content:center;\n      gap: 18px;\n      margin-bottom: 12px;\n      border-bottom: 1px solid var(--line);\n      padding-bottom: 2px;\n    }\n    .tab-button{\n      appearance:none;\n      background:transparent;\n      color:var(--muted);\n      padding: 6px 2px;\n      font-size:12px;\n      font-weight:700;\n      letter-spacing:.3px;\n      border:none;\n      border-radius:0;\n      cursor:pointer;\n      position:relative;\n      transition: color .2s ease;\n    }\n    .tab-button:hover,\n    .tab-button:focus-visible{\n      color:var(--ink);\n      outline:none;\n    }\n    .tab-button[aria-selected=\"true\"]{\n      color:var(--ink);\n    }\n    .tab-button[aria-selected=\"true\"]::after{\n      content:\"\";\n      position:absolute;\n      left:0; right:0; bottom:-3px;\n      height: 2px;\n      background: var(--accent);\n      border-radius: 2px;\n    }\n\n    \/* Table: soft row dividers only *\/\n    .size-chart-table{\n      width:100%;\n      border-collapse: collapse;\n      background:#fff;\n    }\n    .size-chart-table th,\n    .size-chart-table td{\n      text-align:center;\n      padding: 10px 6px;\n      font-size:12px;\n      color:var(--ink);\n      border: none;\n      border-bottom: 1px solid var(--line);\n    }\n    .size-chart-table th{\n      font-weight: 700;\n      background: #fbfcfd;\n    }\n    .size-chart-table td:first-child,\n    .size-chart-table th:first-child{\n      text-align:left;\n      padding-left: 6px;\n      font-weight: 600;\n    }\n    .size-chart-table tbody tr:last-child td{\n      border-bottom: none;\n    }\n\n    .size-chart-note{\n      margin-top: 10px;\n      font-size: 11.5px;\n      color: var(--muted);\n      text-align: center;\n    }\n\n    @media (max-width:660px){\n      .wrap{ margin:44px auto; padding:0 14px; }\n      .card{ padding: 24px 20px; }\n      .size-chart-collapse{ max-width: 100%; }\n    }\n  \u003c\/style\u003e\n\n\n  \u003cmain class=\"wrap\" aria-labelledby=\"product-heading\"\u003e\n    \u003csection class=\"card\" aria-describedby=\"product-desc\"\u003e\n      \u003ch1 class=\"title\" id=\"product-heading\"\u003eBuilt for the Long Term\u003c\/h1\u003e\n      \u003cp class=\"lead\" id=\"product-desc\"\u003e\n        We make pieces to last. Cut from ultra-smooth 100% polyester mesh for cool comfort and durability, then\n        finished with professional-grade printing that resists cracking and fading. Everyday-ready, season after season.\n      \u003c\/p\u003e\n      \u003cul class=\"features\" role=\"list\"\u003e\n        \u003cli\u003e100% Polyester Mesh\u003c\/li\u003e\n        \u003cli\u003eWith pockets\u003c\/li\u003e\n        \u003cli\u003eHigh-quality printing\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/section\u003e\n\n    \u003c!-- Trigger --\u003e\n    \u003cdiv class=\"size-chart-button-container\"\u003e\n      \u003cbutton id=\"sizeChartToggle\" class=\"size-chart-open-button\" aria-expanded=\"false\" aria-controls=\"sizeChartPanel\"\u003e\n        Size Chart For Shirt\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Collapsible size chart --\u003e\n    \u003csection id=\"sizeChartPanel\" class=\"size-chart-collapse hidden\" aria-hidden=\"true\"\u003e\n      \u003c!-- Tabs --\u003e\n      \u003cdiv class=\"size-chart-tabs\" role=\"tablist\" aria-label=\"Size chart units\"\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-cm\" aria-selected=\"true\" aria-controls=\"tab-cm\" tabindex=\"0\" data-unit=\"cm\"\u003eCM\u003c\/button\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-in\" aria-selected=\"false\" aria-controls=\"tab-in\" tabindex=\"-1\" data-unit=\"in\"\u003eInches\u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- CM table --\u003e\n      \u003cdiv id=\"tab-cm\" role=\"tabpanel\" aria-labelledby=\"tab-btn-cm\"\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-cm\" aria-label=\"Shirt size chart in centimeters\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Inches table --\u003e\n      \u003cdiv id=\"tab-in\" role=\"tabpanel\" aria-labelledby=\"tab-btn-in\" hidden\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-in\" aria-label=\"Shirt size chart in inches\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003cp class=\"size-chart-note\"\u003e\n        Measurements are garment dimensions. Compare with a tee you own for best fit.\n      \u003c\/p\u003e\n    \u003c\/section\u003e\n\n    \u003cnoscript\u003e\n      \u003cp style=\"text-align:center;font:14px\/1.4 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;color:#555;\"\u003e\n        Enable JavaScript to view the interactive size chart.\n      \u003c\/p\u003e\n    \u003c\/noscript\u003e\n  \u003c\/main\u003e\n\n  \u003cscript\u003e\n    \/* ===== Data (single source of truth in CM) ===== *\/\n    const SIZE_DATA_CM = [\n      { size: \"S\",   length: 72, chest: 112, shoulder: 54,   sleeve: 24 },\n      { size: \"M\",   length: 74, chest: 116, shoulder: 55.5, sleeve: 25 },\n      { size: \"L\",   length: 76, chest: 120, shoulder: 57,   sleeve: 26 },\n      { size: \"XL\",  length: 78, chest: 124, shoulder: 58.5, sleeve: 27 },\n      { size: \"XXL\", length: 80, chest: 128, shoulder: 60,   sleeve: 28 },\n      { size: \"XXXL\",length: 82, chest: 132, shoulder: 61.5, sleeve: 29 }\n    ];\n\n    const COLUMNS = [\n      { key: \"size\",     label: \"Size\" },\n      { key: \"length\",   label: \"Length\" },\n      { key: \"chest\",    label: \"Chest\" },\n      { key: \"shoulder\", label: \"Shoulder\" },\n      { key: \"sleeve\",   label: \"Sleeve\" }\n    ];\n\n    \/\/ CM -\u003e inches (rounded to nearest 0.5\")\n    const cmToIn = cm =\u003e Math.round((cm \/ 2.54) * 2) \/ 2;\n\n    function renderTable(target, data, unit){\n      const thead = document.createElement(\"thead\");\n      const trh = document.createElement(\"tr\");\n\n      COLUMNS.forEach(col =\u003e {\n        const th = document.createElement(\"th\");\n        th.scope = \"col\";\n        th.textContent = col.key === \"size\" ? col.label : `${col.label} (${unit === \"cm\" ? \"cm\" : \"in\"})`;\n        trh.appendChild(th);\n      });\n      thead.appendChild(trh);\n\n      const tbody = document.createElement(\"tbody\");\n      data.forEach(row =\u003e {\n        const tr = document.createElement(\"tr\");\n        COLUMNS.forEach(col =\u003e {\n          const td = document.createElement(\"td\");\n          if(col.key === \"size\"){\n            td.textContent = row.size;\n            td.style.fontWeight = 600;\n          } else {\n            const val = unit === \"cm\" ? row[col.key] : cmToIn(row[col.key]);\n            td.textContent = Number.isInteger(val) ? String(val) : val.toFixed(1);\n          }\n          tr.appendChild(td);\n        });\n        tbody.appendChild(tr);\n      });\n\n      target.innerHTML = \"\";\n      target.appendChild(thead);\n      target.appendChild(tbody);\n    }\n\n    \/\/ Initial render\n    const tableCM = document.getElementById(\"table-cm\");\n    const tableIN = document.getElementById(\"table-in\");\n    renderTable(tableCM, SIZE_DATA_CM, \"cm\");\n    renderTable(tableIN, SIZE_DATA_CM, \"in\");\n\n    \/\/ Collapsible behavior\n    const toggleBtn = document.getElementById(\"sizeChartToggle\");\n    const panel = document.getElementById(\"sizeChartPanel\");\n\n    function setPanel(open){\n      panel.classList.toggle(\"hidden\", !open);\n      panel.setAttribute(\"aria-hidden\", String(!open));\n      toggleBtn.setAttribute(\"aria-expanded\", String(!!open));\n      if(open){ document.getElementById(\"tab-btn-cm\").focus(); }\n    }\n    toggleBtn.addEventListener(\"click\", () =\u003e {\n      const isOpen = toggleBtn.getAttribute(\"aria-expanded\") === \"true\";\n      setPanel(!isOpen);\n    });\n\n    \/\/ Tabs: click + arrow keys + roving tabindex\n    const tabs = Array.from(document.querySelectorAll('[role=\"tab\"]'));\n    const tabMap = {\n      cm: { btn: document.getElementById(\"tab-btn-cm\"), panel: document.getElementById(\"tab-cm\") },\n      in: { btn: document.getElementById(\"tab-btn-in\"), panel: document.getElementById(\"tab-in\") }\n    };\n\n    function activateTab(key){\n      for(const k in tabMap){\n        const { btn, panel } = tabMap[k];\n        const selected = k === key;\n        btn.setAttribute(\"aria-selected\", String(selected));\n        btn.tabIndex = selected ? 0 : -1;\n        panel.hidden = !selected;\n      }\n      tabMap[key].btn.focus();\n    }\n\n    tabs.forEach(btn =\u003e {\n      btn.addEventListener(\"click\", () =\u003e activateTab(btn.dataset.unit));\n      btn.addEventListener(\"keydown\", (e) =\u003e {\n        const idx = tabs.indexOf(btn);\n        if(e.key === 'ArrowRight' || e.key === 'ArrowDown'){\n          e.preventDefault();\n          const next = tabs[(idx + 1) % tabs.length];\n          activateTab(next.dataset.unit);\n        } else if(e.key === 'ArrowLeft' || e.key === 'ArrowUp'){\n          e.preventDefault();\n          const prev = tabs[(idx - 1 + tabs.length) % tabs.length];\n          activateTab(prev.dataset.unit);\n        } else if(e.key === 'Home'){\n          e.preventDefault();\n          activateTab(tabs[0].dataset.unit);\n        } else if(e.key === 'End'){\n          e.preventDefault();\n          activateTab(tabs[tabs.length - 1].dataset.unit);\n        }\n      });\n    });\n\n    \/\/ Default active tab\n    activateTab('cm');\n  \u003c\/script\u003e\n\n\n\u003c\/body\u003e","brand":"Washed Warrior","offers":[{"title":"S","offer_id":51639729193307,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":51639729226075,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":51639729258843,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":51639729291611,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":51639729324379,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":51639729357147,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/variant-image-11_b3380f3a-7029-4021-b8d5-f70df6428d8f.jpg?v=1761764801"},{"product_id":"the-masked-man-copy","title":"Crimson Shinobi Reflections","description":"\u003cbody\u003e\n\n\n  \u003cmeta charset=\"utf-8\"\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n  \u003ctitle\u003eProduct + Size Chart — Minimal\u003c\/title\u003e\n  \u003cstyle\u003e\n    :root{\n      --bg:#ffffff;\n      --ink:#0b0c0f;\n      --muted:#6b7280;\n      --line:#eceef1;\n      --accent:#111827;\n      --radius:18px;\n      --radius-sm:10px;\n      --shadow:0 6px 24px rgba(0,0,0,.05);\n      --shadow-soft:0 3px 12px rgba(0,0,0,.05);\n    }\n\n    html,body{height:100%}\n    html{color-scheme:light}\n    body{\n      margin:0;\n      background:var(--bg);\n      color:var(--ink);\n      font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Inter, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif;\n      -webkit-font-smoothing:antialiased;\n      font-size:15px;\n      line-height:1.75;\n      font-weight:300;\n      letter-spacing:.15px;\n    }\n\n    \/* Narrow, minimal container *\/\n    .wrap{\n      max-width: 640px;\n      margin: 56px auto;\n      padding: 0 18px;\n      position: relative;\n    }\n\n    \/* Minimal card *\/\n    .card{\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius);\n      box-shadow: var(--shadow);\n      padding: 28px 26px;\n    }\n\n    .title{\n      margin: 0 0 10px;\n      font-size: clamp(20px, 4.4vw, 26px);\n      font-weight: 700;\n      letter-spacing: -0.015em;\n    }\n\n    .lead{\n      margin: 0;\n      color:#1f2937;\n      max-width: 60ch;\n    }\n\n    .features{\n      list-style: none;\n      padding: 0;\n      margin: 16px 0 0;\n      display: grid;\n      gap: 10px;\n    }\n    .features li{\n      font-weight: 400;\n      display: inline-flex;\n      align-items: baseline;\n      gap: 8px;\n    }\n    .features li::before{\n      content: \"—\";\n      color: var(--accent);\n      opacity:.55;\n      font-weight: 600;\n    }\n\n    \/* Ghost trigger button *\/\n    .size-chart-button-container{ text-align:center; margin: 16px 0 0; }\n    .size-chart-open-button{\n      background:#fff;\n      color:var(--ink);\n      padding: 9px 16px;\n      font-size: 12px;\n      font-weight: 700;\n      letter-spacing:.25px;\n      border-radius: 999px;\n      border: 1px solid var(--ink);\n      cursor: pointer;\n      text-transform: uppercase;\n      transition: transform .15s ease, box-shadow .2s ease, background .2s ease;\n      box-shadow: var(--shadow-soft);\n    }\n    .size-chart-open-button:hover,\n    .size-chart-open-button:focus-visible{\n      transform: translateY(-1px);\n      outline: none;\n      background: #fafafa;\n      box-shadow: 0 10px 26px rgba(0,0,0,.08);\n    }\n\n    \/* Collapse *\/\n    .size-chart-collapse{\n      width: 100%;\n      max-width: 560px;\n      margin: 18px auto 40px;\n      padding: 16px;\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius-sm);\n      box-shadow: var(--shadow-soft);\n    }\n    .hidden{ display:none; }\n\n    \/* Tabs: minimalist underline *\/\n    .size-chart-tabs{\n      display:flex;\n      justify-content:center;\n      gap: 18px;\n      margin-bottom: 12px;\n      border-bottom: 1px solid var(--line);\n      padding-bottom: 2px;\n    }\n    .tab-button{\n      appearance:none;\n      background:transparent;\n      color:var(--muted);\n      padding: 6px 2px;\n      font-size:12px;\n      font-weight:700;\n      letter-spacing:.3px;\n      border:none;\n      border-radius:0;\n      cursor:pointer;\n      position:relative;\n      transition: color .2s ease;\n    }\n    .tab-button:hover,\n    .tab-button:focus-visible{\n      color:var(--ink);\n      outline:none;\n    }\n    .tab-button[aria-selected=\"true\"]{\n      color:var(--ink);\n    }\n    .tab-button[aria-selected=\"true\"]::after{\n      content:\"\";\n      position:absolute;\n      left:0; right:0; bottom:-3px;\n      height: 2px;\n      background: var(--accent);\n      border-radius: 2px;\n    }\n\n    \/* Table: soft row dividers only *\/\n    .size-chart-table{\n      width:100%;\n      border-collapse: collapse;\n      background:#fff;\n    }\n    .size-chart-table th,\n    .size-chart-table td{\n      text-align:center;\n      padding: 10px 6px;\n      font-size:12px;\n      color:var(--ink);\n      border: none;\n      border-bottom: 1px solid var(--line);\n    }\n    .size-chart-table th{\n      font-weight: 700;\n      background: #fbfcfd;\n    }\n    .size-chart-table td:first-child,\n    .size-chart-table th:first-child{\n      text-align:left;\n      padding-left: 6px;\n      font-weight: 600;\n    }\n    .size-chart-table tbody tr:last-child td{\n      border-bottom: none;\n    }\n\n    .size-chart-note{\n      margin-top: 10px;\n      font-size: 11.5px;\n      color: var(--muted);\n      text-align: center;\n    }\n\n    @media (max-width:660px){\n      .wrap{ margin:44px auto; padding:0 14px; }\n      .card{ padding: 24px 20px; }\n      .size-chart-collapse{ max-width: 100%; }\n    }\n  \u003c\/style\u003e\n\n\n  \u003cmain class=\"wrap\" aria-labelledby=\"product-heading\"\u003e\n    \u003csection class=\"card\" aria-describedby=\"product-desc\"\u003e\n      \u003ch1 class=\"title\" id=\"product-heading\"\u003eBuilt for the Long Term\u003c\/h1\u003e\n      \u003cp class=\"lead\" id=\"product-desc\"\u003e\n        We make pieces to last. Cut from ultra-smooth 100% polyester mesh for cool comfort and durability, then\n        finished with professional-grade printing that resists cracking and fading. Everyday-ready, season after season.\n      \u003c\/p\u003e\n      \u003cul class=\"features\" role=\"list\"\u003e\n        \u003cli\u003e100% Polyester Mesh\u003c\/li\u003e\n        \u003cli\u003eWith pockets\u003c\/li\u003e\n        \u003cli\u003eHigh-quality printing\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/section\u003e\n\n    \u003c!-- Trigger --\u003e\n    \u003cdiv class=\"size-chart-button-container\"\u003e\n      \u003cbutton id=\"sizeChartToggle\" class=\"size-chart-open-button\" aria-expanded=\"false\" aria-controls=\"sizeChartPanel\"\u003e\n        Size Chart For Shirt\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Collapsible size chart --\u003e\n    \u003csection id=\"sizeChartPanel\" class=\"size-chart-collapse hidden\" aria-hidden=\"true\"\u003e\n      \u003c!-- Tabs --\u003e\n      \u003cdiv class=\"size-chart-tabs\" role=\"tablist\" aria-label=\"Size chart units\"\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-cm\" aria-selected=\"true\" aria-controls=\"tab-cm\" tabindex=\"0\" data-unit=\"cm\"\u003eCM\u003c\/button\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-in\" aria-selected=\"false\" aria-controls=\"tab-in\" tabindex=\"-1\" data-unit=\"in\"\u003eInches\u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- CM table --\u003e\n      \u003cdiv id=\"tab-cm\" role=\"tabpanel\" aria-labelledby=\"tab-btn-cm\"\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-cm\" aria-label=\"Shirt size chart in centimeters\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Inches table --\u003e\n      \u003cdiv id=\"tab-in\" role=\"tabpanel\" aria-labelledby=\"tab-btn-in\" hidden\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-in\" aria-label=\"Shirt size chart in inches\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003cp class=\"size-chart-note\"\u003e\n        Measurements are garment dimensions. Compare with a tee you own for best fit.\n      \u003c\/p\u003e\n    \u003c\/section\u003e\n\n    \u003cnoscript\u003e\n      \u003cp style=\"text-align:center;font:14px\/1.4 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;color:#555;\"\u003e\n        Enable JavaScript to view the interactive size chart.\n      \u003c\/p\u003e\n    \u003c\/noscript\u003e\n  \u003c\/main\u003e\n\n  \u003cscript\u003e\n    \/* ===== Data (single source of truth in CM) ===== *\/\n    const SIZE_DATA_CM = [\n      { size: \"S\",   length: 72, chest: 112, shoulder: 54,   sleeve: 24 },\n      { size: \"M\",   length: 74, chest: 116, shoulder: 55.5, sleeve: 25 },\n      { size: \"L\",   length: 76, chest: 120, shoulder: 57,   sleeve: 26 },\n      { size: \"XL\",  length: 78, chest: 124, shoulder: 58.5, sleeve: 27 },\n      { size: \"XXL\", length: 80, chest: 128, shoulder: 60,   sleeve: 28 },\n      { size: \"XXXL\",length: 82, chest: 132, shoulder: 61.5, sleeve: 29 }\n    ];\n\n    const COLUMNS = [\n      { key: \"size\",     label: \"Size\" },\n      { key: \"length\",   label: \"Length\" },\n      { key: \"chest\",    label: \"Chest\" },\n      { key: \"shoulder\", label: \"Shoulder\" },\n      { key: \"sleeve\",   label: \"Sleeve\" }\n    ];\n\n    \/\/ CM -\u003e inches (rounded to nearest 0.5\")\n    const cmToIn = cm =\u003e Math.round((cm \/ 2.54) * 2) \/ 2;\n\n    function renderTable(target, data, unit){\n      const thead = document.createElement(\"thead\");\n      const trh = document.createElement(\"tr\");\n\n      COLUMNS.forEach(col =\u003e {\n        const th = document.createElement(\"th\");\n        th.scope = \"col\";\n        th.textContent = col.key === \"size\" ? col.label : `${col.label} (${unit === \"cm\" ? \"cm\" : \"in\"})`;\n        trh.appendChild(th);\n      });\n      thead.appendChild(trh);\n\n      const tbody = document.createElement(\"tbody\");\n      data.forEach(row =\u003e {\n        const tr = document.createElement(\"tr\");\n        COLUMNS.forEach(col =\u003e {\n          const td = document.createElement(\"td\");\n          if(col.key === \"size\"){\n            td.textContent = row.size;\n            td.style.fontWeight = 600;\n          } else {\n            const val = unit === \"cm\" ? row[col.key] : cmToIn(row[col.key]);\n            td.textContent = Number.isInteger(val) ? String(val) : val.toFixed(1);\n          }\n          tr.appendChild(td);\n        });\n        tbody.appendChild(tr);\n      });\n\n      target.innerHTML = \"\";\n      target.appendChild(thead);\n      target.appendChild(tbody);\n    }\n\n    \/\/ Initial render\n    const tableCM = document.getElementById(\"table-cm\");\n    const tableIN = document.getElementById(\"table-in\");\n    renderTable(tableCM, SIZE_DATA_CM, \"cm\");\n    renderTable(tableIN, SIZE_DATA_CM, \"in\");\n\n    \/\/ Collapsible behavior\n    const toggleBtn = document.getElementById(\"sizeChartToggle\");\n    const panel = document.getElementById(\"sizeChartPanel\");\n\n    function setPanel(open){\n      panel.classList.toggle(\"hidden\", !open);\n      panel.setAttribute(\"aria-hidden\", String(!open));\n      toggleBtn.setAttribute(\"aria-expanded\", String(!!open));\n      if(open){ document.getElementById(\"tab-btn-cm\").focus(); }\n    }\n    toggleBtn.addEventListener(\"click\", () =\u003e {\n      const isOpen = toggleBtn.getAttribute(\"aria-expanded\") === \"true\";\n      setPanel(!isOpen);\n    });\n\n    \/\/ Tabs: click + arrow keys + roving tabindex\n    const tabs = Array.from(document.querySelectorAll('[role=\"tab\"]'));\n    const tabMap = {\n      cm: { btn: document.getElementById(\"tab-btn-cm\"), panel: document.getElementById(\"tab-cm\") },\n      in: { btn: document.getElementById(\"tab-btn-in\"), panel: document.getElementById(\"tab-in\") }\n    };\n\n    function activateTab(key){\n      for(const k in tabMap){\n        const { btn, panel } = tabMap[k];\n        const selected = k === key;\n        btn.setAttribute(\"aria-selected\", String(selected));\n        btn.tabIndex = selected ? 0 : -1;\n        panel.hidden = !selected;\n      }\n      tabMap[key].btn.focus();\n    }\n\n    tabs.forEach(btn =\u003e {\n      btn.addEventListener(\"click\", () =\u003e activateTab(btn.dataset.unit));\n      btn.addEventListener(\"keydown\", (e) =\u003e {\n        const idx = tabs.indexOf(btn);\n        if(e.key === 'ArrowRight' || e.key === 'ArrowDown'){\n          e.preventDefault();\n          const next = tabs[(idx + 1) % tabs.length];\n          activateTab(next.dataset.unit);\n        } else if(e.key === 'ArrowLeft' || e.key === 'ArrowUp'){\n          e.preventDefault();\n          const prev = tabs[(idx - 1 + tabs.length) % tabs.length];\n          activateTab(prev.dataset.unit);\n        } else if(e.key === 'Home'){\n          e.preventDefault();\n          activateTab(tabs[0].dataset.unit);\n        } else if(e.key === 'End'){\n          e.preventDefault();\n          activateTab(tabs[tabs.length - 1].dataset.unit);\n        }\n      });\n    });\n\n    \/\/ Default active tab\n    activateTab('cm');\n  \u003c\/script\u003e\n\n\n\u003c\/body\u003e","brand":"Washed Warrior","offers":[{"title":"S","offer_id":51639813570907,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":51639813603675,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":51639813636443,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":51639813669211,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":51639813701979,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":51639813734747,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/variant-image-9_1.jpg?v=1761766162"},{"product_id":"crimson-shinobi-reflections-copy","title":"Arc Lightning Shinobi","description":"\u003cbody\u003e\n\n\n  \u003cmeta charset=\"utf-8\"\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n  \u003ctitle\u003eProduct + Size Chart — Minimal\u003c\/title\u003e\n  \u003cstyle\u003e\n    :root{\n      --bg:#ffffff;\n      --ink:#0b0c0f;\n      --muted:#6b7280;\n      --line:#eceef1;\n      --accent:#111827;\n      --radius:18px;\n      --radius-sm:10px;\n      --shadow:0 6px 24px rgba(0,0,0,.05);\n      --shadow-soft:0 3px 12px rgba(0,0,0,.05);\n    }\n\n    html,body{height:100%}\n    html{color-scheme:light}\n    body{\n      margin:0;\n      background:var(--bg);\n      color:var(--ink);\n      font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Inter, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif;\n      -webkit-font-smoothing:antialiased;\n      font-size:15px;\n      line-height:1.75;\n      font-weight:300;\n      letter-spacing:.15px;\n    }\n\n    \/* Narrow, minimal container *\/\n    .wrap{\n      max-width: 640px;\n      margin: 56px auto;\n      padding: 0 18px;\n      position: relative;\n    }\n\n    \/* Minimal card *\/\n    .card{\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius);\n      box-shadow: var(--shadow);\n      padding: 28px 26px;\n    }\n\n    .title{\n      margin: 0 0 10px;\n      font-size: clamp(20px, 4.4vw, 26px);\n      font-weight: 700;\n      letter-spacing: -0.015em;\n    }\n\n    .lead{\n      margin: 0;\n      color:#1f2937;\n      max-width: 60ch;\n    }\n\n    .features{\n      list-style: none;\n      padding: 0;\n      margin: 16px 0 0;\n      display: grid;\n      gap: 10px;\n    }\n    .features li{\n      font-weight: 400;\n      display: inline-flex;\n      align-items: baseline;\n      gap: 8px;\n    }\n    .features li::before{\n      content: \"—\";\n      color: var(--accent);\n      opacity:.55;\n      font-weight: 600;\n    }\n\n    \/* Ghost trigger button *\/\n    .size-chart-button-container{ text-align:center; margin: 16px 0 0; }\n    .size-chart-open-button{\n      background:#fff;\n      color:var(--ink);\n      padding: 9px 16px;\n      font-size: 12px;\n      font-weight: 700;\n      letter-spacing:.25px;\n      border-radius: 999px;\n      border: 1px solid var(--ink);\n      cursor: pointer;\n      text-transform: uppercase;\n      transition: transform .15s ease, box-shadow .2s ease, background .2s ease;\n      box-shadow: var(--shadow-soft);\n    }\n    .size-chart-open-button:hover,\n    .size-chart-open-button:focus-visible{\n      transform: translateY(-1px);\n      outline: none;\n      background: #fafafa;\n      box-shadow: 0 10px 26px rgba(0,0,0,.08);\n    }\n\n    \/* Collapse *\/\n    .size-chart-collapse{\n      width: 100%;\n      max-width: 560px;\n      margin: 18px auto 40px;\n      padding: 16px;\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius-sm);\n      box-shadow: var(--shadow-soft);\n    }\n    .hidden{ display:none; }\n\n    \/* Tabs: minimalist underline *\/\n    .size-chart-tabs{\n      display:flex;\n      justify-content:center;\n      gap: 18px;\n      margin-bottom: 12px;\n      border-bottom: 1px solid var(--line);\n      padding-bottom: 2px;\n    }\n    .tab-button{\n      appearance:none;\n      background:transparent;\n      color:var(--muted);\n      padding: 6px 2px;\n      font-size:12px;\n      font-weight:700;\n      letter-spacing:.3px;\n      border:none;\n      border-radius:0;\n      cursor:pointer;\n      position:relative;\n      transition: color .2s ease;\n    }\n    .tab-button:hover,\n    .tab-button:focus-visible{\n      color:var(--ink);\n      outline:none;\n    }\n    .tab-button[aria-selected=\"true\"]{\n      color:var(--ink);\n    }\n    .tab-button[aria-selected=\"true\"]::after{\n      content:\"\";\n      position:absolute;\n      left:0; right:0; bottom:-3px;\n      height: 2px;\n      background: var(--accent);\n      border-radius: 2px;\n    }\n\n    \/* Table: soft row dividers only *\/\n    .size-chart-table{\n      width:100%;\n      border-collapse: collapse;\n      background:#fff;\n    }\n    .size-chart-table th,\n    .size-chart-table td{\n      text-align:center;\n      padding: 10px 6px;\n      font-size:12px;\n      color:var(--ink);\n      border: none;\n      border-bottom: 1px solid var(--line);\n    }\n    .size-chart-table th{\n      font-weight: 700;\n      background: #fbfcfd;\n    }\n    .size-chart-table td:first-child,\n    .size-chart-table th:first-child{\n      text-align:left;\n      padding-left: 6px;\n      font-weight: 600;\n    }\n    .size-chart-table tbody tr:last-child td{\n      border-bottom: none;\n    }\n\n    .size-chart-note{\n      margin-top: 10px;\n      font-size: 11.5px;\n      color: var(--muted);\n      text-align: center;\n    }\n\n    @media (max-width:660px){\n      .wrap{ margin:44px auto; padding:0 14px; }\n      .card{ padding: 24px 20px; }\n      .size-chart-collapse{ max-width: 100%; }\n    }\n  \u003c\/style\u003e\n\n\n  \u003cmain class=\"wrap\" aria-labelledby=\"product-heading\"\u003e\n    \u003csection class=\"card\" aria-describedby=\"product-desc\"\u003e\n      \u003ch1 class=\"title\" id=\"product-heading\"\u003eBuilt for the Long Term\u003c\/h1\u003e\n      \u003cp class=\"lead\" id=\"product-desc\"\u003e\n        We make pieces to last. Cut from ultra-smooth 100% polyester mesh for cool comfort and durability, then\n        finished with professional-grade printing that resists cracking and fading. Everyday-ready, season after season.\n      \u003c\/p\u003e\n      \u003cul class=\"features\" role=\"list\"\u003e\n        \u003cli\u003e100% Polyester Mesh\u003c\/li\u003e\n        \u003cli\u003eWith pockets\u003c\/li\u003e\n        \u003cli\u003eHigh-quality printing\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/section\u003e\n\n    \u003c!-- Trigger --\u003e\n    \u003cdiv class=\"size-chart-button-container\"\u003e\n      \u003cbutton id=\"sizeChartToggle\" class=\"size-chart-open-button\" aria-expanded=\"false\" aria-controls=\"sizeChartPanel\"\u003e\n        Size Chart For Shirt\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Collapsible size chart --\u003e\n    \u003csection id=\"sizeChartPanel\" class=\"size-chart-collapse hidden\" aria-hidden=\"true\"\u003e\n      \u003c!-- Tabs --\u003e\n      \u003cdiv class=\"size-chart-tabs\" role=\"tablist\" aria-label=\"Size chart units\"\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-cm\" aria-selected=\"true\" aria-controls=\"tab-cm\" tabindex=\"0\" data-unit=\"cm\"\u003eCM\u003c\/button\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-in\" aria-selected=\"false\" aria-controls=\"tab-in\" tabindex=\"-1\" data-unit=\"in\"\u003eInches\u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- CM table --\u003e\n      \u003cdiv id=\"tab-cm\" role=\"tabpanel\" aria-labelledby=\"tab-btn-cm\"\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-cm\" aria-label=\"Shirt size chart in centimeters\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Inches table --\u003e\n      \u003cdiv id=\"tab-in\" role=\"tabpanel\" aria-labelledby=\"tab-btn-in\" hidden\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-in\" aria-label=\"Shirt size chart in inches\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003cp class=\"size-chart-note\"\u003e\n        Measurements are garment dimensions. Compare with a tee you own for best fit.\n      \u003c\/p\u003e\n    \u003c\/section\u003e\n\n    \u003cnoscript\u003e\n      \u003cp style=\"text-align:center;font:14px\/1.4 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;color:#555;\"\u003e\n        Enable JavaScript to view the interactive size chart.\n      \u003c\/p\u003e\n    \u003c\/noscript\u003e\n  \u003c\/main\u003e\n\n  \u003cscript\u003e\n    \/* ===== Data (single source of truth in CM) ===== *\/\n    const SIZE_DATA_CM = [\n      { size: \"S\",   length: 72, chest: 112, shoulder: 54,   sleeve: 24 },\n      { size: \"M\",   length: 74, chest: 116, shoulder: 55.5, sleeve: 25 },\n      { size: \"L\",   length: 76, chest: 120, shoulder: 57,   sleeve: 26 },\n      { size: \"XL\",  length: 78, chest: 124, shoulder: 58.5, sleeve: 27 },\n      { size: \"XXL\", length: 80, chest: 128, shoulder: 60,   sleeve: 28 },\n      { size: \"XXXL\",length: 82, chest: 132, shoulder: 61.5, sleeve: 29 }\n    ];\n\n    const COLUMNS = [\n      { key: \"size\",     label: \"Size\" },\n      { key: \"length\",   label: \"Length\" },\n      { key: \"chest\",    label: \"Chest\" },\n      { key: \"shoulder\", label: \"Shoulder\" },\n      { key: \"sleeve\",   label: \"Sleeve\" }\n    ];\n\n    \/\/ CM -\u003e inches (rounded to nearest 0.5\")\n    const cmToIn = cm =\u003e Math.round((cm \/ 2.54) * 2) \/ 2;\n\n    function renderTable(target, data, unit){\n      const thead = document.createElement(\"thead\");\n      const trh = document.createElement(\"tr\");\n\n      COLUMNS.forEach(col =\u003e {\n        const th = document.createElement(\"th\");\n        th.scope = \"col\";\n        th.textContent = col.key === \"size\" ? col.label : `${col.label} (${unit === \"cm\" ? \"cm\" : \"in\"})`;\n        trh.appendChild(th);\n      });\n      thead.appendChild(trh);\n\n      const tbody = document.createElement(\"tbody\");\n      data.forEach(row =\u003e {\n        const tr = document.createElement(\"tr\");\n        COLUMNS.forEach(col =\u003e {\n          const td = document.createElement(\"td\");\n          if(col.key === \"size\"){\n            td.textContent = row.size;\n            td.style.fontWeight = 600;\n          } else {\n            const val = unit === \"cm\" ? row[col.key] : cmToIn(row[col.key]);\n            td.textContent = Number.isInteger(val) ? String(val) : val.toFixed(1);\n          }\n          tr.appendChild(td);\n        });\n        tbody.appendChild(tr);\n      });\n\n      target.innerHTML = \"\";\n      target.appendChild(thead);\n      target.appendChild(tbody);\n    }\n\n    \/\/ Initial render\n    const tableCM = document.getElementById(\"table-cm\");\n    const tableIN = document.getElementById(\"table-in\");\n    renderTable(tableCM, SIZE_DATA_CM, \"cm\");\n    renderTable(tableIN, SIZE_DATA_CM, \"in\");\n\n    \/\/ Collapsible behavior\n    const toggleBtn = document.getElementById(\"sizeChartToggle\");\n    const panel = document.getElementById(\"sizeChartPanel\");\n\n    function setPanel(open){\n      panel.classList.toggle(\"hidden\", !open);\n      panel.setAttribute(\"aria-hidden\", String(!open));\n      toggleBtn.setAttribute(\"aria-expanded\", String(!!open));\n      if(open){ document.getElementById(\"tab-btn-cm\").focus(); }\n    }\n    toggleBtn.addEventListener(\"click\", () =\u003e {\n      const isOpen = toggleBtn.getAttribute(\"aria-expanded\") === \"true\";\n      setPanel(!isOpen);\n    });\n\n    \/\/ Tabs: click + arrow keys + roving tabindex\n    const tabs = Array.from(document.querySelectorAll('[role=\"tab\"]'));\n    const tabMap = {\n      cm: { btn: document.getElementById(\"tab-btn-cm\"), panel: document.getElementById(\"tab-cm\") },\n      in: { btn: document.getElementById(\"tab-btn-in\"), panel: document.getElementById(\"tab-in\") }\n    };\n\n    function activateTab(key){\n      for(const k in tabMap){\n        const { btn, panel } = tabMap[k];\n        const selected = k === key;\n        btn.setAttribute(\"aria-selected\", String(selected));\n        btn.tabIndex = selected ? 0 : -1;\n        panel.hidden = !selected;\n      }\n      tabMap[key].btn.focus();\n    }\n\n    tabs.forEach(btn =\u003e {\n      btn.addEventListener(\"click\", () =\u003e activateTab(btn.dataset.unit));\n      btn.addEventListener(\"keydown\", (e) =\u003e {\n        const idx = tabs.indexOf(btn);\n        if(e.key === 'ArrowRight' || e.key === 'ArrowDown'){\n          e.preventDefault();\n          const next = tabs[(idx + 1) % tabs.length];\n          activateTab(next.dataset.unit);\n        } else if(e.key === 'ArrowLeft' || e.key === 'ArrowUp'){\n          e.preventDefault();\n          const prev = tabs[(idx - 1 + tabs.length) % tabs.length];\n          activateTab(prev.dataset.unit);\n        } else if(e.key === 'Home'){\n          e.preventDefault();\n          activateTab(tabs[0].dataset.unit);\n        } else if(e.key === 'End'){\n          e.preventDefault();\n          activateTab(tabs[tabs.length - 1].dataset.unit);\n        }\n      });\n    });\n\n    \/\/ Default active tab\n    activateTab('cm');\n  \u003c\/script\u003e\n\n\n\u003c\/body\u003e","brand":"Washed Warrior","offers":[{"title":"S","offer_id":51639816716635,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":51639816749403,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":51639816782171,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":51639816814939,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":51639816847707,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":51639816880475,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/variant-image-10_1.jpg?v=1761766317"},{"product_id":"arc-lightning-shinobi-copy","title":"Azure Dragon Guardian","description":"\u003cbody\u003e\n\n\n  \u003cmeta charset=\"utf-8\"\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n  \u003ctitle\u003eProduct + Size Chart — Minimal\u003c\/title\u003e\n  \u003cstyle\u003e\n    :root{\n      --bg:#ffffff;\n      --ink:#0b0c0f;\n      --muted:#6b7280;\n      --line:#eceef1;\n      --accent:#111827;\n      --radius:18px;\n      --radius-sm:10px;\n      --shadow:0 6px 24px rgba(0,0,0,.05);\n      --shadow-soft:0 3px 12px rgba(0,0,0,.05);\n    }\n\n    html,body{height:100%}\n    html{color-scheme:light}\n    body{\n      margin:0;\n      background:var(--bg);\n      color:var(--ink);\n      font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Inter, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif;\n      -webkit-font-smoothing:antialiased;\n      font-size:15px;\n      line-height:1.75;\n      font-weight:300;\n      letter-spacing:.15px;\n    }\n\n    \/* Narrow, minimal container *\/\n    .wrap{\n      max-width: 640px;\n      margin: 56px auto;\n      padding: 0 18px;\n      position: relative;\n    }\n\n    \/* Minimal card *\/\n    .card{\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius);\n      box-shadow: var(--shadow);\n      padding: 28px 26px;\n    }\n\n    .title{\n      margin: 0 0 10px;\n      font-size: clamp(20px, 4.4vw, 26px);\n      font-weight: 700;\n      letter-spacing: -0.015em;\n    }\n\n    .lead{\n      margin: 0;\n      color:#1f2937;\n      max-width: 60ch;\n    }\n\n    .features{\n      list-style: none;\n      padding: 0;\n      margin: 16px 0 0;\n      display: grid;\n      gap: 10px;\n    }\n    .features li{\n      font-weight: 400;\n      display: inline-flex;\n      align-items: baseline;\n      gap: 8px;\n    }\n    .features li::before{\n      content: \"—\";\n      color: var(--accent);\n      opacity:.55;\n      font-weight: 600;\n    }\n\n    \/* Ghost trigger button *\/\n    .size-chart-button-container{ text-align:center; margin: 16px 0 0; }\n    .size-chart-open-button{\n      background:#fff;\n      color:var(--ink);\n      padding: 9px 16px;\n      font-size: 12px;\n      font-weight: 700;\n      letter-spacing:.25px;\n      border-radius: 999px;\n      border: 1px solid var(--ink);\n      cursor: pointer;\n      text-transform: uppercase;\n      transition: transform .15s ease, box-shadow .2s ease, background .2s ease;\n      box-shadow: var(--shadow-soft);\n    }\n    .size-chart-open-button:hover,\n    .size-chart-open-button:focus-visible{\n      transform: translateY(-1px);\n      outline: none;\n      background: #fafafa;\n      box-shadow: 0 10px 26px rgba(0,0,0,.08);\n    }\n\n    \/* Collapse *\/\n    .size-chart-collapse{\n      width: 100%;\n      max-width: 560px;\n      margin: 18px auto 40px;\n      padding: 16px;\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius-sm);\n      box-shadow: var(--shadow-soft);\n    }\n    .hidden{ display:none; }\n\n    \/* Tabs: minimalist underline *\/\n    .size-chart-tabs{\n      display:flex;\n      justify-content:center;\n      gap: 18px;\n      margin-bottom: 12px;\n      border-bottom: 1px solid var(--line);\n      padding-bottom: 2px;\n    }\n    .tab-button{\n      appearance:none;\n      background:transparent;\n      color:var(--muted);\n      padding: 6px 2px;\n      font-size:12px;\n      font-weight:700;\n      letter-spacing:.3px;\n      border:none;\n      border-radius:0;\n      cursor:pointer;\n      position:relative;\n      transition: color .2s ease;\n    }\n    .tab-button:hover,\n    .tab-button:focus-visible{\n      color:var(--ink);\n      outline:none;\n    }\n    .tab-button[aria-selected=\"true\"]{\n      color:var(--ink);\n    }\n    .tab-button[aria-selected=\"true\"]::after{\n      content:\"\";\n      position:absolute;\n      left:0; right:0; bottom:-3px;\n      height: 2px;\n      background: var(--accent);\n      border-radius: 2px;\n    }\n\n    \/* Table: soft row dividers only *\/\n    .size-chart-table{\n      width:100%;\n      border-collapse: collapse;\n      background:#fff;\n    }\n    .size-chart-table th,\n    .size-chart-table td{\n      text-align:center;\n      padding: 10px 6px;\n      font-size:12px;\n      color:var(--ink);\n      border: none;\n      border-bottom: 1px solid var(--line);\n    }\n    .size-chart-table th{\n      font-weight: 700;\n      background: #fbfcfd;\n    }\n    .size-chart-table td:first-child,\n    .size-chart-table th:first-child{\n      text-align:left;\n      padding-left: 6px;\n      font-weight: 600;\n    }\n    .size-chart-table tbody tr:last-child td{\n      border-bottom: none;\n    }\n\n    .size-chart-note{\n      margin-top: 10px;\n      font-size: 11.5px;\n      color: var(--muted);\n      text-align: center;\n    }\n\n    @media (max-width:660px){\n      .wrap{ margin:44px auto; padding:0 14px; }\n      .card{ padding: 24px 20px; }\n      .size-chart-collapse{ max-width: 100%; }\n    }\n  \u003c\/style\u003e\n\n\n  \u003cmain class=\"wrap\" aria-labelledby=\"product-heading\"\u003e\n    \u003csection class=\"card\" aria-describedby=\"product-desc\"\u003e\n      \u003ch1 class=\"title\" id=\"product-heading\"\u003eBuilt for the Long Term\u003c\/h1\u003e\n      \u003cp class=\"lead\" id=\"product-desc\"\u003e\n        We make pieces to last. Cut from ultra-smooth 100% polyester mesh for cool comfort and durability, then\n        finished with professional-grade printing that resists cracking and fading. Everyday-ready, season after season.\n      \u003c\/p\u003e\n      \u003cul class=\"features\" role=\"list\"\u003e\n        \u003cli\u003e100% Polyester Mesh\u003c\/li\u003e\n        \u003cli\u003eWith pockets\u003c\/li\u003e\n        \u003cli\u003eHigh-quality printing\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/section\u003e\n\n    \u003c!-- Trigger --\u003e\n    \u003cdiv class=\"size-chart-button-container\"\u003e\n      \u003cbutton id=\"sizeChartToggle\" class=\"size-chart-open-button\" aria-expanded=\"false\" aria-controls=\"sizeChartPanel\"\u003e\n        Size Chart For Shirt\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Collapsible size chart --\u003e\n    \u003csection id=\"sizeChartPanel\" class=\"size-chart-collapse hidden\" aria-hidden=\"true\"\u003e\n      \u003c!-- Tabs --\u003e\n      \u003cdiv class=\"size-chart-tabs\" role=\"tablist\" aria-label=\"Size chart units\"\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-cm\" aria-selected=\"true\" aria-controls=\"tab-cm\" tabindex=\"0\" data-unit=\"cm\"\u003eCM\u003c\/button\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-in\" aria-selected=\"false\" aria-controls=\"tab-in\" tabindex=\"-1\" data-unit=\"in\"\u003eInches\u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- CM table --\u003e\n      \u003cdiv id=\"tab-cm\" role=\"tabpanel\" aria-labelledby=\"tab-btn-cm\"\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-cm\" aria-label=\"Shirt size chart in centimeters\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Inches table --\u003e\n      \u003cdiv id=\"tab-in\" role=\"tabpanel\" aria-labelledby=\"tab-btn-in\" hidden\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-in\" aria-label=\"Shirt size chart in inches\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003cp class=\"size-chart-note\"\u003e\n        Measurements are garment dimensions. Compare with a tee you own for best fit.\n      \u003c\/p\u003e\n    \u003c\/section\u003e\n\n    \u003cnoscript\u003e\n      \u003cp style=\"text-align:center;font:14px\/1.4 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;color:#555;\"\u003e\n        Enable JavaScript to view the interactive size chart.\n      \u003c\/p\u003e\n    \u003c\/noscript\u003e\n  \u003c\/main\u003e\n\n  \u003cscript\u003e\n    \/* ===== Data (single source of truth in CM) ===== *\/\n    const SIZE_DATA_CM = [\n      { size: \"S\",   length: 72, chest: 112, shoulder: 54,   sleeve: 24 },\n      { size: \"M\",   length: 74, chest: 116, shoulder: 55.5, sleeve: 25 },\n      { size: \"L\",   length: 76, chest: 120, shoulder: 57,   sleeve: 26 },\n      { size: \"XL\",  length: 78, chest: 124, shoulder: 58.5, sleeve: 27 },\n      { size: \"XXL\", length: 80, chest: 128, shoulder: 60,   sleeve: 28 },\n      { size: \"XXXL\",length: 82, chest: 132, shoulder: 61.5, sleeve: 29 }\n    ];\n\n    const COLUMNS = [\n      { key: \"size\",     label: \"Size\" },\n      { key: \"length\",   label: \"Length\" },\n      { key: \"chest\",    label: \"Chest\" },\n      { key: \"shoulder\", label: \"Shoulder\" },\n      { key: \"sleeve\",   label: \"Sleeve\" }\n    ];\n\n    \/\/ CM -\u003e inches (rounded to nearest 0.5\")\n    const cmToIn = cm =\u003e Math.round((cm \/ 2.54) * 2) \/ 2;\n\n    function renderTable(target, data, unit){\n      const thead = document.createElement(\"thead\");\n      const trh = document.createElement(\"tr\");\n\n      COLUMNS.forEach(col =\u003e {\n        const th = document.createElement(\"th\");\n        th.scope = \"col\";\n        th.textContent = col.key === \"size\" ? col.label : `${col.label} (${unit === \"cm\" ? \"cm\" : \"in\"})`;\n        trh.appendChild(th);\n      });\n      thead.appendChild(trh);\n\n      const tbody = document.createElement(\"tbody\");\n      data.forEach(row =\u003e {\n        const tr = document.createElement(\"tr\");\n        COLUMNS.forEach(col =\u003e {\n          const td = document.createElement(\"td\");\n          if(col.key === \"size\"){\n            td.textContent = row.size;\n            td.style.fontWeight = 600;\n          } else {\n            const val = unit === \"cm\" ? row[col.key] : cmToIn(row[col.key]);\n            td.textContent = Number.isInteger(val) ? String(val) : val.toFixed(1);\n          }\n          tr.appendChild(td);\n        });\n        tbody.appendChild(tr);\n      });\n\n      target.innerHTML = \"\";\n      target.appendChild(thead);\n      target.appendChild(tbody);\n    }\n\n    \/\/ Initial render\n    const tableCM = document.getElementById(\"table-cm\");\n    const tableIN = document.getElementById(\"table-in\");\n    renderTable(tableCM, SIZE_DATA_CM, \"cm\");\n    renderTable(tableIN, SIZE_DATA_CM, \"in\");\n\n    \/\/ Collapsible behavior\n    const toggleBtn = document.getElementById(\"sizeChartToggle\");\n    const panel = document.getElementById(\"sizeChartPanel\");\n\n    function setPanel(open){\n      panel.classList.toggle(\"hidden\", !open);\n      panel.setAttribute(\"aria-hidden\", String(!open));\n      toggleBtn.setAttribute(\"aria-expanded\", String(!!open));\n      if(open){ document.getElementById(\"tab-btn-cm\").focus(); }\n    }\n    toggleBtn.addEventListener(\"click\", () =\u003e {\n      const isOpen = toggleBtn.getAttribute(\"aria-expanded\") === \"true\";\n      setPanel(!isOpen);\n    });\n\n    \/\/ Tabs: click + arrow keys + roving tabindex\n    const tabs = Array.from(document.querySelectorAll('[role=\"tab\"]'));\n    const tabMap = {\n      cm: { btn: document.getElementById(\"tab-btn-cm\"), panel: document.getElementById(\"tab-cm\") },\n      in: { btn: document.getElementById(\"tab-btn-in\"), panel: document.getElementById(\"tab-in\") }\n    };\n\n    function activateTab(key){\n      for(const k in tabMap){\n        const { btn, panel } = tabMap[k];\n        const selected = k === key;\n        btn.setAttribute(\"aria-selected\", String(selected));\n        btn.tabIndex = selected ? 0 : -1;\n        panel.hidden = !selected;\n      }\n      tabMap[key].btn.focus();\n    }\n\n    tabs.forEach(btn =\u003e {\n      btn.addEventListener(\"click\", () =\u003e activateTab(btn.dataset.unit));\n      btn.addEventListener(\"keydown\", (e) =\u003e {\n        const idx = tabs.indexOf(btn);\n        if(e.key === 'ArrowRight' || e.key === 'ArrowDown'){\n          e.preventDefault();\n          const next = tabs[(idx + 1) % tabs.length];\n          activateTab(next.dataset.unit);\n        } else if(e.key === 'ArrowLeft' || e.key === 'ArrowUp'){\n          e.preventDefault();\n          const prev = tabs[(idx - 1 + tabs.length) % tabs.length];\n          activateTab(prev.dataset.unit);\n        } else if(e.key === 'Home'){\n          e.preventDefault();\n          activateTab(tabs[0].dataset.unit);\n        } else if(e.key === 'End'){\n          e.preventDefault();\n          activateTab(tabs[tabs.length - 1].dataset.unit);\n        }\n      });\n    });\n\n    \/\/ Default active tab\n    activateTab('cm');\n  \u003c\/script\u003e\n\n\n\u003c\/body\u003e","brand":"Washed Warrior","offers":[{"title":"S","offer_id":51639818322267,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":51639818355035,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":51639818387803,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":51639818420571,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":51639818453339,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":51639818486107,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/variant-image-21_1.jpg?v=1761766401"},{"product_id":"azure-dragon-guardian-copy","title":"The lost ninjas","description":"\u003cbody\u003e\n\n\n  \u003cmeta charset=\"utf-8\"\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n  \u003ctitle\u003eProduct + Size Chart — Minimal\u003c\/title\u003e\n  \u003cstyle\u003e\n    :root{\n      --bg:#ffffff;\n      --ink:#0b0c0f;\n      --muted:#6b7280;\n      --line:#eceef1;\n      --accent:#111827;\n      --radius:18px;\n      --radius-sm:10px;\n      --shadow:0 6px 24px rgba(0,0,0,.05);\n      --shadow-soft:0 3px 12px rgba(0,0,0,.05);\n    }\n\n    html,body{height:100%}\n    html{color-scheme:light}\n    body{\n      margin:0;\n      background:var(--bg);\n      color:var(--ink);\n      font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Inter, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif;\n      -webkit-font-smoothing:antialiased;\n      font-size:15px;\n      line-height:1.75;\n      font-weight:300;\n      letter-spacing:.15px;\n    }\n\n    \/* Narrow, minimal container *\/\n    .wrap{\n      max-width: 640px;\n      margin: 56px auto;\n      padding: 0 18px;\n      position: relative;\n    }\n\n    \/* Minimal card *\/\n    .card{\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius);\n      box-shadow: var(--shadow);\n      padding: 28px 26px;\n    }\n\n    .title{\n      margin: 0 0 10px;\n      font-size: clamp(20px, 4.4vw, 26px);\n      font-weight: 700;\n      letter-spacing: -0.015em;\n    }\n\n    .lead{\n      margin: 0;\n      color:#1f2937;\n      max-width: 60ch;\n    }\n\n    .features{\n      list-style: none;\n      padding: 0;\n      margin: 16px 0 0;\n      display: grid;\n      gap: 10px;\n    }\n    .features li{\n      font-weight: 400;\n      display: inline-flex;\n      align-items: baseline;\n      gap: 8px;\n    }\n    .features li::before{\n      content: \"—\";\n      color: var(--accent);\n      opacity:.55;\n      font-weight: 600;\n    }\n\n    \/* Ghost trigger button *\/\n    .size-chart-button-container{ text-align:center; margin: 16px 0 0; }\n    .size-chart-open-button{\n      background:#fff;\n      color:var(--ink);\n      padding: 9px 16px;\n      font-size: 12px;\n      font-weight: 700;\n      letter-spacing:.25px;\n      border-radius: 999px;\n      border: 1px solid var(--ink);\n      cursor: pointer;\n      text-transform: uppercase;\n      transition: transform .15s ease, box-shadow .2s ease, background .2s ease;\n      box-shadow: var(--shadow-soft);\n    }\n    .size-chart-open-button:hover,\n    .size-chart-open-button:focus-visible{\n      transform: translateY(-1px);\n      outline: none;\n      background: #fafafa;\n      box-shadow: 0 10px 26px rgba(0,0,0,.08);\n    }\n\n    \/* Collapse *\/\n    .size-chart-collapse{\n      width: 100%;\n      max-width: 560px;\n      margin: 18px auto 40px;\n      padding: 16px;\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius-sm);\n      box-shadow: var(--shadow-soft);\n    }\n    .hidden{ display:none; }\n\n    \/* Tabs: minimalist underline *\/\n    .size-chart-tabs{\n      display:flex;\n      justify-content:center;\n      gap: 18px;\n      margin-bottom: 12px;\n      border-bottom: 1px solid var(--line);\n      padding-bottom: 2px;\n    }\n    .tab-button{\n      appearance:none;\n      background:transparent;\n      color:var(--muted);\n      padding: 6px 2px;\n      font-size:12px;\n      font-weight:700;\n      letter-spacing:.3px;\n      border:none;\n      border-radius:0;\n      cursor:pointer;\n      position:relative;\n      transition: color .2s ease;\n    }\n    .tab-button:hover,\n    .tab-button:focus-visible{\n      color:var(--ink);\n      outline:none;\n    }\n    .tab-button[aria-selected=\"true\"]{\n      color:var(--ink);\n    }\n    .tab-button[aria-selected=\"true\"]::after{\n      content:\"\";\n      position:absolute;\n      left:0; right:0; bottom:-3px;\n      height: 2px;\n      background: var(--accent);\n      border-radius: 2px;\n    }\n\n    \/* Table: soft row dividers only *\/\n    .size-chart-table{\n      width:100%;\n      border-collapse: collapse;\n      background:#fff;\n    }\n    .size-chart-table th,\n    .size-chart-table td{\n      text-align:center;\n      padding: 10px 6px;\n      font-size:12px;\n      color:var(--ink);\n      border: none;\n      border-bottom: 1px solid var(--line);\n    }\n    .size-chart-table th{\n      font-weight: 700;\n      background: #fbfcfd;\n    }\n    .size-chart-table td:first-child,\n    .size-chart-table th:first-child{\n      text-align:left;\n      padding-left: 6px;\n      font-weight: 600;\n    }\n    .size-chart-table tbody tr:last-child td{\n      border-bottom: none;\n    }\n\n    .size-chart-note{\n      margin-top: 10px;\n      font-size: 11.5px;\n      color: var(--muted);\n      text-align: center;\n    }\n\n    @media (max-width:660px){\n      .wrap{ margin:44px auto; padding:0 14px; }\n      .card{ padding: 24px 20px; }\n      .size-chart-collapse{ max-width: 100%; }\n    }\n  \u003c\/style\u003e\n\n\n  \u003cmain class=\"wrap\" aria-labelledby=\"product-heading\"\u003e\n    \u003csection class=\"card\" aria-describedby=\"product-desc\"\u003e\n      \u003ch1 class=\"title\" id=\"product-heading\"\u003eBuilt for the Long Term\u003c\/h1\u003e\n      \u003cp class=\"lead\" id=\"product-desc\"\u003e\n        We make pieces to last. Cut from ultra-smooth 100% polyester mesh for cool comfort and durability, then\n        finished with professional-grade printing that resists cracking and fading. Everyday-ready, season after season.\n      \u003c\/p\u003e\n      \u003cul class=\"features\" role=\"list\"\u003e\n        \u003cli\u003e100% Polyester Mesh\u003c\/li\u003e\n        \u003cli\u003eWith pockets\u003c\/li\u003e\n        \u003cli\u003eHigh-quality printing\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/section\u003e\n\n    \u003c!-- Trigger --\u003e\n    \u003cdiv class=\"size-chart-button-container\"\u003e\n      \u003cbutton id=\"sizeChartToggle\" class=\"size-chart-open-button\" aria-expanded=\"false\" aria-controls=\"sizeChartPanel\"\u003e\n        Size Chart For Shirt\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Collapsible size chart --\u003e\n    \u003csection id=\"sizeChartPanel\" class=\"size-chart-collapse hidden\" aria-hidden=\"true\"\u003e\n      \u003c!-- Tabs --\u003e\n      \u003cdiv class=\"size-chart-tabs\" role=\"tablist\" aria-label=\"Size chart units\"\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-cm\" aria-selected=\"true\" aria-controls=\"tab-cm\" tabindex=\"0\" data-unit=\"cm\"\u003eCM\u003c\/button\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-in\" aria-selected=\"false\" aria-controls=\"tab-in\" tabindex=\"-1\" data-unit=\"in\"\u003eInches\u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- CM table --\u003e\n      \u003cdiv id=\"tab-cm\" role=\"tabpanel\" aria-labelledby=\"tab-btn-cm\"\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-cm\" aria-label=\"Shirt size chart in centimeters\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Inches table --\u003e\n      \u003cdiv id=\"tab-in\" role=\"tabpanel\" aria-labelledby=\"tab-btn-in\" hidden\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-in\" aria-label=\"Shirt size chart in inches\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003cp class=\"size-chart-note\"\u003e\n        Measurements are garment dimensions. Compare with a tee you own for best fit.\n      \u003c\/p\u003e\n    \u003c\/section\u003e\n\n    \u003cnoscript\u003e\n      \u003cp style=\"text-align:center;font:14px\/1.4 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;color:#555;\"\u003e\n        Enable JavaScript to view the interactive size chart.\n      \u003c\/p\u003e\n    \u003c\/noscript\u003e\n  \u003c\/main\u003e\n\n  \u003cscript\u003e\n    \/* ===== Data (single source of truth in CM) ===== *\/\n    const SIZE_DATA_CM = [\n      { size: \"S\",   length: 72, chest: 112, shoulder: 54,   sleeve: 24 },\n      { size: \"M\",   length: 74, chest: 116, shoulder: 55.5, sleeve: 25 },\n      { size: \"L\",   length: 76, chest: 120, shoulder: 57,   sleeve: 26 },\n      { size: \"XL\",  length: 78, chest: 124, shoulder: 58.5, sleeve: 27 },\n      { size: \"XXL\", length: 80, chest: 128, shoulder: 60,   sleeve: 28 },\n      { size: \"XXXL\",length: 82, chest: 132, shoulder: 61.5, sleeve: 29 }\n    ];\n\n    const COLUMNS = [\n      { key: \"size\",     label: \"Size\" },\n      { key: \"length\",   label: \"Length\" },\n      { key: \"chest\",    label: \"Chest\" },\n      { key: \"shoulder\", label: \"Shoulder\" },\n      { key: \"sleeve\",   label: \"Sleeve\" }\n    ];\n\n    \/\/ CM -\u003e inches (rounded to nearest 0.5\")\n    const cmToIn = cm =\u003e Math.round((cm \/ 2.54) * 2) \/ 2;\n\n    function renderTable(target, data, unit){\n      const thead = document.createElement(\"thead\");\n      const trh = document.createElement(\"tr\");\n\n      COLUMNS.forEach(col =\u003e {\n        const th = document.createElement(\"th\");\n        th.scope = \"col\";\n        th.textContent = col.key === \"size\" ? col.label : `${col.label} (${unit === \"cm\" ? \"cm\" : \"in\"})`;\n        trh.appendChild(th);\n      });\n      thead.appendChild(trh);\n\n      const tbody = document.createElement(\"tbody\");\n      data.forEach(row =\u003e {\n        const tr = document.createElement(\"tr\");\n        COLUMNS.forEach(col =\u003e {\n          const td = document.createElement(\"td\");\n          if(col.key === \"size\"){\n            td.textContent = row.size;\n            td.style.fontWeight = 600;\n          } else {\n            const val = unit === \"cm\" ? row[col.key] : cmToIn(row[col.key]);\n            td.textContent = Number.isInteger(val) ? String(val) : val.toFixed(1);\n          }\n          tr.appendChild(td);\n        });\n        tbody.appendChild(tr);\n      });\n\n      target.innerHTML = \"\";\n      target.appendChild(thead);\n      target.appendChild(tbody);\n    }\n\n    \/\/ Initial render\n    const tableCM = document.getElementById(\"table-cm\");\n    const tableIN = document.getElementById(\"table-in\");\n    renderTable(tableCM, SIZE_DATA_CM, \"cm\");\n    renderTable(tableIN, SIZE_DATA_CM, \"in\");\n\n    \/\/ Collapsible behavior\n    const toggleBtn = document.getElementById(\"sizeChartToggle\");\n    const panel = document.getElementById(\"sizeChartPanel\");\n\n    function setPanel(open){\n      panel.classList.toggle(\"hidden\", !open);\n      panel.setAttribute(\"aria-hidden\", String(!open));\n      toggleBtn.setAttribute(\"aria-expanded\", String(!!open));\n      if(open){ document.getElementById(\"tab-btn-cm\").focus(); }\n    }\n    toggleBtn.addEventListener(\"click\", () =\u003e {\n      const isOpen = toggleBtn.getAttribute(\"aria-expanded\") === \"true\";\n      setPanel(!isOpen);\n    });\n\n    \/\/ Tabs: click + arrow keys + roving tabindex\n    const tabs = Array.from(document.querySelectorAll('[role=\"tab\"]'));\n    const tabMap = {\n      cm: { btn: document.getElementById(\"tab-btn-cm\"), panel: document.getElementById(\"tab-cm\") },\n      in: { btn: document.getElementById(\"tab-btn-in\"), panel: document.getElementById(\"tab-in\") }\n    };\n\n    function activateTab(key){\n      for(const k in tabMap){\n        const { btn, panel } = tabMap[k];\n        const selected = k === key;\n        btn.setAttribute(\"aria-selected\", String(selected));\n        btn.tabIndex = selected ? 0 : -1;\n        panel.hidden = !selected;\n      }\n      tabMap[key].btn.focus();\n    }\n\n    tabs.forEach(btn =\u003e {\n      btn.addEventListener(\"click\", () =\u003e activateTab(btn.dataset.unit));\n      btn.addEventListener(\"keydown\", (e) =\u003e {\n        const idx = tabs.indexOf(btn);\n        if(e.key === 'ArrowRight' || e.key === 'ArrowDown'){\n          e.preventDefault();\n          const next = tabs[(idx + 1) % tabs.length];\n          activateTab(next.dataset.unit);\n        } else if(e.key === 'ArrowLeft' || e.key === 'ArrowUp'){\n          e.preventDefault();\n          const prev = tabs[(idx - 1 + tabs.length) % tabs.length];\n          activateTab(prev.dataset.unit);\n        } else if(e.key === 'Home'){\n          e.preventDefault();\n          activateTab(tabs[0].dataset.unit);\n        } else if(e.key === 'End'){\n          e.preventDefault();\n          activateTab(tabs[tabs.length - 1].dataset.unit);\n        }\n      });\n    });\n\n    \/\/ Default active tab\n    activateTab('cm');\n  \u003c\/script\u003e\n\n\n\u003c\/body\u003e","brand":"Washed Warrior","offers":[{"title":"S","offer_id":51639819600219,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":51639819632987,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":51639819665755,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":51639819698523,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":51639819731291,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":51639819764059,"sku":null,"price":26.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/variant-image-19_1.jpg?v=1761766627"}],"url":"https:\/\/washedwarrior.com\/collections\/shinobi-legacy.oembed","provider":"Washed Warrior","version":"1.0","type":"link"}