{"title":"Battle Legends","description":"\u003cp\u003eBeam attacks, fusions and legendary power-ups. High-energy battle prints for warriors who train past their limits.\u003c\/p\u003e","products":[{"product_id":"retro-battle-kid-shirt","title":"Retro Battle Kid 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":50201876431195,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50201876463963,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50201876496731,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50201876529499,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50201876562267,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50201876595035,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/main-image-11.jpg?v=1741385561"},{"product_id":"dark-flame-fighter","title":"Dark Flame Fighter","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":50202701922651,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50202701955419,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50202701988187,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50202702020955,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50202702053723,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50202702086491,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/main-image-9.jpg?v=1741385707"},{"product_id":"galactic-beam-attack","title":"Galactic Beam Attack","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":50201895600475,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50201895633243,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50201895666011,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50201895698779,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50201895731547,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50201895764315,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/main-image-16.jpg?v=1741386247"},{"product_id":"heavy-lifting-beast","title":"Heavy Lifting Beast","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":50201898680667,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50201898713435,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50201898746203,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50201898778971,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50201898811739,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50201898844507,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/main-image-8.jpg?v=1741386395"},{"product_id":"legendary-force-battle-tee","title":"Legendary Force Battle 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":50201923584347,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50201923617115,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50201923649883,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50201923682651,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50201923715419,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50201923748187,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/main-image-26.jpg?v=1741387054"},{"product_id":"future-warrior-battle-tee","title":"Future Warrior Battle 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":50233521144155,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50233521176923,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50233521209691,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50233521242459,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50233521275227,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50233521307995,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/main-image-23.jpg?v=1741916922"},{"product_id":"the-fusion-collection","title":"The Fusion Collection","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":"Goten \/ S","offer_id":50238646878555,"sku":"","price":29.99,"currency_code":"GBP","in_stock":true},{"title":"Goten \/ M","offer_id":50238646911323,"sku":"","price":29.99,"currency_code":"GBP","in_stock":true},{"title":"Goten \/ L","offer_id":50238646944091,"sku":"","price":29.99,"currency_code":"GBP","in_stock":true},{"title":"Goten \/ XL","offer_id":50238646976859,"sku":"","price":29.99,"currency_code":"GBP","in_stock":true},{"title":"Goten \/ 2XL","offer_id":50238647009627,"sku":"","price":29.99,"currency_code":"GBP","in_stock":true},{"title":"Goten \/ 3XL","offer_id":50238647042395,"sku":"","price":29.99,"currency_code":"GBP","in_stock":true},{"title":"Trunks \/ S","offer_id":50283119214939,"sku":null,"price":29.99,"currency_code":"GBP","in_stock":true},{"title":"Trunks \/ M","offer_id":50283119247707,"sku":null,"price":29.99,"currency_code":"GBP","in_stock":true},{"title":"Trunks \/ L","offer_id":50283119280475,"sku":null,"price":29.99,"currency_code":"GBP","in_stock":true},{"title":"Trunks \/ XL","offer_id":50283119313243,"sku":null,"price":29.99,"currency_code":"GBP","in_stock":true},{"title":"Trunks \/ 2XL","offer_id":50283119346011,"sku":null,"price":29.99,"currency_code":"GBP","in_stock":true},{"title":"Trunks \/ 3XL","offer_id":50283119378779,"sku":null,"price":29.99,"currency_code":"GBP","in_stock":true},{"title":"The Fusion Collection \/ S","offer_id":50283119411547,"sku":null,"price":54.99,"currency_code":"GBP","in_stock":true},{"title":"The Fusion Collection \/ M","offer_id":50283119444315,"sku":null,"price":54.99,"currency_code":"GBP","in_stock":true},{"title":"The Fusion Collection \/ L","offer_id":50283119477083,"sku":null,"price":54.99,"currency_code":"GBP","in_stock":true},{"title":"The Fusion Collection \/ XL","offer_id":50283119509851,"sku":null,"price":54.99,"currency_code":"GBP","in_stock":true},{"title":"The Fusion Collection \/ 2XL","offer_id":50283119542619,"sku":null,"price":54.99,"currency_code":"GBP","in_stock":true},{"title":"The Fusion Collection \/ 3XL","offer_id":50283119575387,"sku":null,"price":54.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/IMG_1159.jpg?v=1741995935"},{"product_id":"dark-knight-oversized-tee-copy","title":"Rage Mode Vintage 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":50241605173595,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50241605206363,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50241605239131,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50241605271899,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50241605304667,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50241605337435,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/variant-image-7.webp?v=1742077964"},{"product_id":"energetic-warrior-battle-tee","title":"Energetic Warrior Battle 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":50716548366683,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50716548399451,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50716548432219,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50716548464987,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50716548497755,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50716548530523,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/IMG_0169Large.jpg?v=1748642535"}],"url":"https:\/\/washedwarrior.com\/collections\/battle-legends.oembed","provider":"Washed Warrior","version":"1.0","type":"link"}