{"title":"Dark Fantasy","description":"\u003cp\u003eCursed swordsmen, sinister grins and shadow realms. The darkest corner of the Washed Warrior wardrobe.\u003c\/p\u003e","products":[{"product_id":"dark-warrior","title":"Dark Warrior","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":50201905824091,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50201905856859,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50201905889627,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50201905922395,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50201905955163,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50201905987931,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/main-image-28.jpg?v=1741386582"},{"product_id":"shadow-warrior-glow","title":"Shadow Warrior Glow","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":50201911755099,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50201911787867,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50201911820635,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50201911853403,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50201911886171,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50201911918939,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/main-image-27.jpg?v=1741386742"},{"product_id":"dark-demon-overlord-tee","title":"Dark Demon Overlord 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":50233581535579,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50233581568347,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50233581601115,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50233581633883,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50233581666651,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50233581699419,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/variant-image-23.jpg?v=1741918724"},{"product_id":"cursed-swordsman-graphic-tee","title":"Cursed Swordsman Graphic 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":50241475150171,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50241475182939,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50241475215707,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50241475248475,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50241475281243,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50241475314011,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/variant-image-1_4c97352c-a6d8-4249-91f6-2e4da56d2c7d.jpg?v=1742076087"},{"product_id":"shadow-hunter-vintage-tee","title":"Shadow Hunter 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":50241495925083,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50241495957851,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50241495990619,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50241496023387,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50241496056155,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50241496088923,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/variant-image-2_1957e2f7-5147-4144-a805-f4b0d2b77173.jpg?v=1742076259"},{"product_id":"cursed-swordsman-tee","title":"Cursed Swordsman 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":50241566441819,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50241566474587,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50241566507355,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50241566540123,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50241566572891,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50241566605659,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/variant-image-3_102f1786-bd8b-4163-89cf-8316f97c60bd.jpg?v=1742077314"},{"product_id":"shadow-grin-washed-tee","title":"Shadow Grin Washed Tee","description":"\u003cdiv style=\"max-width:640px;margin:0 auto;font-family:ui-sans-serif,system-ui,-apple-system,'Segoe UI',Roboto,Arial,sans-serif;color:#0b0c0f;line-height:1.75;font-size:15px;\"\u003e\n  \u003cdiv style=\"background:#fff;border:1px solid #eceef1;border-radius:18px;box-shadow:0 6px 24px rgba(0,0,0,.05);padding:28px 26px;\"\u003e\n    \u003ch2 style=\"margin:0 0 10px;font-size:24px;font-weight:700;letter-spacing:-0.015em;\"\u003eA grin straight out of the shadow realm.\u003c\/h2\u003e\n    \u003cp style=\"margin:0;color:#1f2937;\"\u003eThe Shadow Grin Washed Tee brings unsettling manga-panel energy to an everyday fit. A heavy vintage wash gives each tee its own faded, lived-in character, while the relaxed cut keeps it street-ready. Finished with high-durability printing that holds its detail wash after wash.\u003c\/p\u003e\n    \u003cul style=\"list-style:none;padding:0;margin:16px 0 0;\"\u003e\n      \u003cli style=\"margin:0 0 10px;\"\u003e\n\u003cspan style=\"color:#111827;opacity:.55;font-weight:600;\"\u003e—\u003c\/span\u003e Vintage washed finish — every piece fades uniquely\u003c\/li\u003e\n      \u003cli style=\"margin:0 0 10px;\"\u003e\n\u003cspan style=\"color:#111827;opacity:.55;font-weight:600;\"\u003e—\u003c\/span\u003e Relaxed, oversized streetwear fit\u003c\/li\u003e\n      \u003cli style=\"margin:0;\"\u003e\n\u003cspan style=\"color:#111827;opacity:.55;font-weight:600;\"\u003e—\u003c\/span\u003e High-durability print that resists cracking and fading\u003c\/li\u003e\n    \u003c\/ul\u003e\n  \u003c\/div\u003e\n  \u003cdiv style=\"text-align:center;margin:16px 0 0;\"\u003e\n    \u003cbutton id=\"sizeChartToggle\" type=\"button\" style=\"background:#fff;color:#0b0c0f;padding:9px 16px;font-size:12px;font-weight:700;letter-spacing:.25px;border-radius:999px;border:1px solid #0b0c0f;cursor:pointer;text-transform:uppercase;box-shadow:0 3px 12px rgba(0,0,0,.05);\"\u003eSize Chart For Shirt\u003c\/button\u003e\n  \u003c\/div\u003e\n  \u003cdiv id=\"sizeChartPanel\" style=\"display:none;max-width:560px;margin:18px auto 40px;padding:16px;background:#fff;border:1px solid #eceef1;border-radius:10px;box-shadow:0 3px 12px rgba(0,0,0,.05);\"\u003e\n    \u003cdiv style=\"display:flex;justify-content:center;gap:18px;margin-bottom:12px;border-bottom:1px solid #eceef1;padding-bottom:2px;\"\u003e\n      \u003cbutton id=\"tabBtnCm\" type=\"button\" data-unit=\"cm\" style=\"appearance:none;background:transparent;color:#0b0c0f;padding:6px 2px;font-size:12px;font-weight:700;letter-spacing:.3px;border:none;border-bottom:2px solid #111827;cursor:pointer;\"\u003eCM\u003c\/button\u003e\n      \u003cbutton id=\"tabBtnIn\" type=\"button\" data-unit=\"in\" style=\"appearance:none;background:transparent;color:#6b7280;padding:6px 2px;font-size:12px;font-weight:700;letter-spacing:.3px;border:none;border-bottom:2px solid transparent;cursor:pointer;\"\u003eINCHES\u003c\/button\u003e\n    \u003c\/div\u003e\n    \u003cdiv id=\"tabCm\"\u003e\u003ctable id=\"tableCm\" style=\"width:100%;border-collapse:collapse;background:#fff;\"\u003e\u003c\/table\u003e\u003c\/div\u003e\n    \u003cdiv id=\"tabIn\" style=\"display:none;\"\u003e\u003ctable id=\"tableIn\" style=\"width:100%;border-collapse:collapse;background:#fff;\"\u003e\u003c\/table\u003e\u003c\/div\u003e\n    \u003cp style=\"margin-top:10px;font-size:11.5px;color:#6b7280;text-align:center;\"\u003eMeasurements are garment dimensions. Compare with a tee you own for best fit.\u003c\/p\u003e\n  \u003c\/div\u003e\n  \u003cscript\u003e\n  (function(){\n    var DATA=[{size:\"S\",length:72,chest:112,shoulder:54,sleeve:24},{size:\"M\",length:74,chest:116,shoulder:55.5,sleeve:25},{size:\"L\",length:76,chest:120,shoulder:57,sleeve:26},{size:\"XL\",length:78,chest:124,shoulder:58.5,sleeve:27},{size:\"XXL\",length:80,chest:128,shoulder:60,sleeve:28},{size:\"XXXL\",length:82,chest:132,shoulder:61.5,sleeve:29}];\n    var COLS=[{k:\"size\",l:\"Size\"},{k:\"length\",l:\"Length\"},{k:\"chest\",l:\"Chest\"},{k:\"shoulder\",l:\"Shoulder\"},{k:\"sleeve\",l:\"Sleeve\"}];\n    function cmToIn(cm){return Math.round((cm\/2.54)*2)\/2;}\n    function cellStyle(el,head){el.style.textAlign=\"center\";el.style.padding=\"10px 6px\";el.style.fontSize=\"12px\";el.style.color=\"#0b0c0f\";el.style.borderBottom=\"1px solid #eceef1\";if(head){el.style.fontWeight=\"700\";el.style.background=\"#fbfcfd\";}}\n    function render(t,unit){t.innerHTML=\"\";var thead=document.createElement(\"thead\");var trh=document.createElement(\"tr\");COLS.forEach(function(c){var th=document.createElement(\"th\");th.textContent=c.k===\"size\"?c.l:c.l+\" (\"+unit+\")\";cellStyle(th,true);if(c.k===\"size\"){th.style.textAlign=\"left\";th.style.paddingLeft=\"6px\";}trh.appendChild(th);});thead.appendChild(trh);t.appendChild(thead);var tb=document.createElement(\"tbody\");DATA.forEach(function(r,i){var tr=document.createElement(\"tr\");COLS.forEach(function(c){var td=document.createElement(\"td\");if(c.k===\"size\"){td.textContent=r.size;td.style.fontWeight=\"600\";cellStyle(td,false);td.style.textAlign=\"left\";td.style.paddingLeft=\"6px\";}else{var v=unit===\"cm\"?r[c.k]:cmToIn(r[c.k]);td.textContent=Number.isInteger(v)?String(v):v.toFixed(1);cellStyle(td,false);}if(i===DATA.length-1){td.style.borderBottom=\"none\";}tr.appendChild(td);});tb.appendChild(tr);});t.appendChild(tb);}\n    var tCm=document.getElementById(\"tableCm\"),tIn=document.getElementById(\"tableIn\");\n    render(tCm,\"cm\");render(tIn,\"in\");\n    var toggle=document.getElementById(\"sizeChartToggle\"),panel=document.getElementById(\"sizeChartPanel\");\n    toggle.addEventListener(\"click\",function(){panel.style.display=panel.style.display===\"none\"?\"block\":\"none\";});\n    var bCm=document.getElementById(\"tabBtnCm\"),bIn=document.getElementById(\"tabBtnIn\"),pCm=document.getElementById(\"tabCm\"),pIn=document.getElementById(\"tabIn\");\n    function activate(u){var cm=u===\"cm\";pCm.style.display=cm?\"block\":\"none\";pIn.style.display=cm?\"none\":\"block\";bCm.style.color=cm?\"#0b0c0f\":\"#6b7280\";bCm.style.borderBottomColor=cm?\"#111827\":\"transparent\";bIn.style.color=cm?\"#6b7280\":\"#0b0c0f\";bIn.style.borderBottomColor=cm?\"transparent\":\"#111827\";}\n    bCm.addEventListener(\"click\",function(){activate(\"cm\");});\n    bIn.addEventListener(\"click\",function(){activate(\"in\");});\n  })();\n  \u003c\/script\u003e\n\u003c\/div\u003e","brand":"Washed Warrior","offers":[{"title":"S","offer_id":50241580368219,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50241580400987,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50241580433755,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50241580466523,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50241580499291,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50241580532059,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/variant-image-4.webp?v=1742077478"},{"product_id":"shadow-grin-washed-tee-copy","title":"Dark Slayer Oversized Tee","description":"\u003cbody\u003e\n\n\n  \u003cmeta charset=\"utf-8\"\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n  \u003ctitle\u003eProduct + Size Chart — Minimal\u003c\/title\u003e\n  \u003cstyle\u003e\n    :root{\n      --bg:#ffffff;\n      --ink:#0b0c0f;\n      --muted:#6b7280;\n      --line:#eceef1;\n      --accent:#111827;\n      --radius:18px;\n      --radius-sm:10px;\n      --shadow:0 6px 24px rgba(0,0,0,.05);\n      --shadow-soft:0 3px 12px rgba(0,0,0,.05);\n    }\n\n    html,body{height:100%}\n    html{color-scheme:light}\n    body{\n      margin:0;\n      background:var(--bg);\n      color:var(--ink);\n      font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Inter, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif;\n      -webkit-font-smoothing:antialiased;\n      font-size:15px;\n      line-height:1.75;\n      font-weight:300;\n      letter-spacing:.15px;\n    }\n\n    \/* Narrow, minimal container *\/\n    .wrap{\n      max-width: 640px;\n      margin: 56px auto;\n      padding: 0 18px;\n      position: relative;\n    }\n\n    \/* Minimal card *\/\n    .card{\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius);\n      box-shadow: var(--shadow);\n      padding: 28px 26px;\n    }\n\n    .title{\n      margin: 0 0 10px;\n      font-size: clamp(20px, 4.4vw, 26px);\n      font-weight: 700;\n      letter-spacing: -0.015em;\n    }\n\n    .lead{\n      margin: 0;\n      color:#1f2937;\n      max-width: 60ch;\n    }\n\n    .features{\n      list-style: none;\n      padding: 0;\n      margin: 16px 0 0;\n      display: grid;\n      gap: 10px;\n    }\n    .features li{\n      font-weight: 400;\n      display: inline-flex;\n      align-items: baseline;\n      gap: 8px;\n    }\n    .features li::before{\n      content: \"—\";\n      color: var(--accent);\n      opacity:.55;\n      font-weight: 600;\n    }\n\n    \/* Ghost trigger button *\/\n    .size-chart-button-container{ text-align:center; margin: 16px 0 0; }\n    .size-chart-open-button{\n      background:#fff;\n      color:var(--ink);\n      padding: 9px 16px;\n      font-size: 12px;\n      font-weight: 700;\n      letter-spacing:.25px;\n      border-radius: 999px;\n      border: 1px solid var(--ink);\n      cursor: pointer;\n      text-transform: uppercase;\n      transition: transform .15s ease, box-shadow .2s ease, background .2s ease;\n      box-shadow: var(--shadow-soft);\n    }\n    .size-chart-open-button:hover,\n    .size-chart-open-button:focus-visible{\n      transform: translateY(-1px);\n      outline: none;\n      background: #fafafa;\n      box-shadow: 0 10px 26px rgba(0,0,0,.08);\n    }\n\n    \/* Collapse *\/\n    .size-chart-collapse{\n      width: 100%;\n      max-width: 560px;\n      margin: 18px auto 40px;\n      padding: 16px;\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius-sm);\n      box-shadow: var(--shadow-soft);\n    }\n    .hidden{ display:none; }\n\n    \/* Tabs: minimalist underline *\/\n    .size-chart-tabs{\n      display:flex;\n      justify-content:center;\n      gap: 18px;\n      margin-bottom: 12px;\n      border-bottom: 1px solid var(--line);\n      padding-bottom: 2px;\n    }\n    .tab-button{\n      appearance:none;\n      background:transparent;\n      color:var(--muted);\n      padding: 6px 2px;\n      font-size:12px;\n      font-weight:700;\n      letter-spacing:.3px;\n      border:none;\n      border-radius:0;\n      cursor:pointer;\n      position:relative;\n      transition: color .2s ease;\n    }\n    .tab-button:hover,\n    .tab-button:focus-visible{\n      color:var(--ink);\n      outline:none;\n    }\n    .tab-button[aria-selected=\"true\"]{\n      color:var(--ink);\n    }\n    .tab-button[aria-selected=\"true\"]::after{\n      content:\"\";\n      position:absolute;\n      left:0; right:0; bottom:-3px;\n      height: 2px;\n      background: var(--accent);\n      border-radius: 2px;\n    }\n\n    \/* Table: soft row dividers only *\/\n    .size-chart-table{\n      width:100%;\n      border-collapse: collapse;\n      background:#fff;\n    }\n    .size-chart-table th,\n    .size-chart-table td{\n      text-align:center;\n      padding: 10px 6px;\n      font-size:12px;\n      color:var(--ink);\n      border: none;\n      border-bottom: 1px solid var(--line);\n    }\n    .size-chart-table th{\n      font-weight: 700;\n      background: #fbfcfd;\n    }\n    .size-chart-table td:first-child,\n    .size-chart-table th:first-child{\n      text-align:left;\n      padding-left: 6px;\n      font-weight: 600;\n    }\n    .size-chart-table tbody tr:last-child td{\n      border-bottom: none;\n    }\n\n    .size-chart-note{\n      margin-top: 10px;\n      font-size: 11.5px;\n      color: var(--muted);\n      text-align: center;\n    }\n\n    @media (max-width:660px){\n      .wrap{ margin:44px auto; padding:0 14px; }\n      .card{ padding: 24px 20px; }\n      .size-chart-collapse{ max-width: 100%; }\n    }\n  \u003c\/style\u003e\n\n\n  \u003cmain class=\"wrap\" aria-labelledby=\"product-heading\"\u003e\n    \u003csection class=\"card\" aria-describedby=\"product-desc\"\u003e\n      \u003ch1 class=\"title\" id=\"product-heading\"\u003eBuilt for the Long Term\u003c\/h1\u003e\n      \u003cp class=\"lead\" id=\"product-desc\"\u003e\n        We make pieces to last. Cut from ultra-smooth 100% polyester mesh for cool comfort and durability, then\n        finished with professional-grade printing that resists cracking and fading. Everyday-ready, season after season.\n      \u003c\/p\u003e\n      \u003cul class=\"features\" role=\"list\"\u003e\n        \u003cli\u003e100% Polyester Mesh\u003c\/li\u003e\n        \u003cli\u003eWith pockets\u003c\/li\u003e\n        \u003cli\u003eHigh-quality printing\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/section\u003e\n\n    \u003c!-- Trigger --\u003e\n    \u003cdiv class=\"size-chart-button-container\"\u003e\n      \u003cbutton id=\"sizeChartToggle\" class=\"size-chart-open-button\" aria-expanded=\"false\" aria-controls=\"sizeChartPanel\"\u003e\n        Size Chart For Shirt\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Collapsible size chart --\u003e\n    \u003csection id=\"sizeChartPanel\" class=\"size-chart-collapse hidden\" aria-hidden=\"true\"\u003e\n      \u003c!-- Tabs --\u003e\n      \u003cdiv class=\"size-chart-tabs\" role=\"tablist\" aria-label=\"Size chart units\"\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-cm\" aria-selected=\"true\" aria-controls=\"tab-cm\" tabindex=\"0\" data-unit=\"cm\"\u003eCM\u003c\/button\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-in\" aria-selected=\"false\" aria-controls=\"tab-in\" tabindex=\"-1\" data-unit=\"in\"\u003eInches\u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- CM table --\u003e\n      \u003cdiv id=\"tab-cm\" role=\"tabpanel\" aria-labelledby=\"tab-btn-cm\"\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-cm\" aria-label=\"Shirt size chart in centimeters\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Inches table --\u003e\n      \u003cdiv id=\"tab-in\" role=\"tabpanel\" aria-labelledby=\"tab-btn-in\" hidden\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-in\" aria-label=\"Shirt size chart in inches\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003cp class=\"size-chart-note\"\u003e\n        Measurements are garment dimensions. Compare with a tee you own for best fit.\n      \u003c\/p\u003e\n    \u003c\/section\u003e\n\n    \u003cnoscript\u003e\n      \u003cp style=\"text-align:center;font:14px\/1.4 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;color:#555;\"\u003e\n        Enable JavaScript to view the interactive size chart.\n      \u003c\/p\u003e\n    \u003c\/noscript\u003e\n  \u003c\/main\u003e\n\n  \u003cscript\u003e\n    \/* ===== Data (single source of truth in CM) ===== *\/\n    const SIZE_DATA_CM = [\n      { size: \"S\",   length: 72, chest: 112, shoulder: 54,   sleeve: 24 },\n      { size: \"M\",   length: 74, chest: 116, shoulder: 55.5, sleeve: 25 },\n      { size: \"L\",   length: 76, chest: 120, shoulder: 57,   sleeve: 26 },\n      { size: \"XL\",  length: 78, chest: 124, shoulder: 58.5, sleeve: 27 },\n      { size: \"XXL\", length: 80, chest: 128, shoulder: 60,   sleeve: 28 },\n      { size: \"XXXL\",length: 82, chest: 132, shoulder: 61.5, sleeve: 29 }\n    ];\n\n    const COLUMNS = [\n      { key: \"size\",     label: \"Size\" },\n      { key: \"length\",   label: \"Length\" },\n      { key: \"chest\",    label: \"Chest\" },\n      { key: \"shoulder\", label: \"Shoulder\" },\n      { key: \"sleeve\",   label: \"Sleeve\" }\n    ];\n\n    \/\/ CM -\u003e inches (rounded to nearest 0.5\")\n    const cmToIn = cm =\u003e Math.round((cm \/ 2.54) * 2) \/ 2;\n\n    function renderTable(target, data, unit){\n      const thead = document.createElement(\"thead\");\n      const trh = document.createElement(\"tr\");\n\n      COLUMNS.forEach(col =\u003e {\n        const th = document.createElement(\"th\");\n        th.scope = \"col\";\n        th.textContent = col.key === \"size\" ? col.label : `${col.label} (${unit === \"cm\" ? \"cm\" : \"in\"})`;\n        trh.appendChild(th);\n      });\n      thead.appendChild(trh);\n\n      const tbody = document.createElement(\"tbody\");\n      data.forEach(row =\u003e {\n        const tr = document.createElement(\"tr\");\n        COLUMNS.forEach(col =\u003e {\n          const td = document.createElement(\"td\");\n          if(col.key === \"size\"){\n            td.textContent = row.size;\n            td.style.fontWeight = 600;\n          } else {\n            const val = unit === \"cm\" ? row[col.key] : cmToIn(row[col.key]);\n            td.textContent = Number.isInteger(val) ? String(val) : val.toFixed(1);\n          }\n          tr.appendChild(td);\n        });\n        tbody.appendChild(tr);\n      });\n\n      target.innerHTML = \"\";\n      target.appendChild(thead);\n      target.appendChild(tbody);\n    }\n\n    \/\/ Initial render\n    const tableCM = document.getElementById(\"table-cm\");\n    const tableIN = document.getElementById(\"table-in\");\n    renderTable(tableCM, SIZE_DATA_CM, \"cm\");\n    renderTable(tableIN, SIZE_DATA_CM, \"in\");\n\n    \/\/ Collapsible behavior\n    const toggleBtn = document.getElementById(\"sizeChartToggle\");\n    const panel = document.getElementById(\"sizeChartPanel\");\n\n    function setPanel(open){\n      panel.classList.toggle(\"hidden\", !open);\n      panel.setAttribute(\"aria-hidden\", String(!open));\n      toggleBtn.setAttribute(\"aria-expanded\", String(!!open));\n      if(open){ document.getElementById(\"tab-btn-cm\").focus(); }\n    }\n    toggleBtn.addEventListener(\"click\", () =\u003e {\n      const isOpen = toggleBtn.getAttribute(\"aria-expanded\") === \"true\";\n      setPanel(!isOpen);\n    });\n\n    \/\/ Tabs: click + arrow keys + roving tabindex\n    const tabs = Array.from(document.querySelectorAll('[role=\"tab\"]'));\n    const tabMap = {\n      cm: { btn: document.getElementById(\"tab-btn-cm\"), panel: document.getElementById(\"tab-cm\") },\n      in: { btn: document.getElementById(\"tab-btn-in\"), panel: document.getElementById(\"tab-in\") }\n    };\n\n    function activateTab(key){\n      for(const k in tabMap){\n        const { btn, panel } = tabMap[k];\n        const selected = k === key;\n        btn.setAttribute(\"aria-selected\", String(selected));\n        btn.tabIndex = selected ? 0 : -1;\n        panel.hidden = !selected;\n      }\n      tabMap[key].btn.focus();\n    }\n\n    tabs.forEach(btn =\u003e {\n      btn.addEventListener(\"click\", () =\u003e activateTab(btn.dataset.unit));\n      btn.addEventListener(\"keydown\", (e) =\u003e {\n        const idx = tabs.indexOf(btn);\n        if(e.key === 'ArrowRight' || e.key === 'ArrowDown'){\n          e.preventDefault();\n          const next = tabs[(idx + 1) % tabs.length];\n          activateTab(next.dataset.unit);\n        } else if(e.key === 'ArrowLeft' || e.key === 'ArrowUp'){\n          e.preventDefault();\n          const prev = tabs[(idx - 1 + tabs.length) % tabs.length];\n          activateTab(prev.dataset.unit);\n        } else if(e.key === 'Home'){\n          e.preventDefault();\n          activateTab(tabs[0].dataset.unit);\n        } else if(e.key === 'End'){\n          e.preventDefault();\n          activateTab(tabs[tabs.length - 1].dataset.unit);\n        }\n      });\n    });\n\n    \/\/ Default active tab\n    activateTab('cm');\n  \u003c\/script\u003e\n\n\n\u003c\/body\u003e","brand":"Washed Warrior","offers":[{"title":"S","offer_id":50241581547867,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50241581580635,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50241581613403,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50241581646171,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50241581678939,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50241581711707,"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-5.webp?v=1742077698"},{"product_id":"dark-slayer-oversized-te-copy","title":"Dark Knight Oversized Tee","description":"\u003cbody\u003e\n\n\n  \u003cmeta charset=\"utf-8\"\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n  \u003ctitle\u003eProduct + Size Chart — Minimal\u003c\/title\u003e\n  \u003cstyle\u003e\n    :root{\n      --bg:#ffffff;\n      --ink:#0b0c0f;\n      --muted:#6b7280;\n      --line:#eceef1;\n      --accent:#111827;\n      --radius:18px;\n      --radius-sm:10px;\n      --shadow:0 6px 24px rgba(0,0,0,.05);\n      --shadow-soft:0 3px 12px rgba(0,0,0,.05);\n    }\n\n    html,body{height:100%}\n    html{color-scheme:light}\n    body{\n      margin:0;\n      background:var(--bg);\n      color:var(--ink);\n      font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Inter, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif;\n      -webkit-font-smoothing:antialiased;\n      font-size:15px;\n      line-height:1.75;\n      font-weight:300;\n      letter-spacing:.15px;\n    }\n\n    \/* Narrow, minimal container *\/\n    .wrap{\n      max-width: 640px;\n      margin: 56px auto;\n      padding: 0 18px;\n      position: relative;\n    }\n\n    \/* Minimal card *\/\n    .card{\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius);\n      box-shadow: var(--shadow);\n      padding: 28px 26px;\n    }\n\n    .title{\n      margin: 0 0 10px;\n      font-size: clamp(20px, 4.4vw, 26px);\n      font-weight: 700;\n      letter-spacing: -0.015em;\n    }\n\n    .lead{\n      margin: 0;\n      color:#1f2937;\n      max-width: 60ch;\n    }\n\n    .features{\n      list-style: none;\n      padding: 0;\n      margin: 16px 0 0;\n      display: grid;\n      gap: 10px;\n    }\n    .features li{\n      font-weight: 400;\n      display: inline-flex;\n      align-items: baseline;\n      gap: 8px;\n    }\n    .features li::before{\n      content: \"—\";\n      color: var(--accent);\n      opacity:.55;\n      font-weight: 600;\n    }\n\n    \/* Ghost trigger button *\/\n    .size-chart-button-container{ text-align:center; margin: 16px 0 0; }\n    .size-chart-open-button{\n      background:#fff;\n      color:var(--ink);\n      padding: 9px 16px;\n      font-size: 12px;\n      font-weight: 700;\n      letter-spacing:.25px;\n      border-radius: 999px;\n      border: 1px solid var(--ink);\n      cursor: pointer;\n      text-transform: uppercase;\n      transition: transform .15s ease, box-shadow .2s ease, background .2s ease;\n      box-shadow: var(--shadow-soft);\n    }\n    .size-chart-open-button:hover,\n    .size-chart-open-button:focus-visible{\n      transform: translateY(-1px);\n      outline: none;\n      background: #fafafa;\n      box-shadow: 0 10px 26px rgba(0,0,0,.08);\n    }\n\n    \/* Collapse *\/\n    .size-chart-collapse{\n      width: 100%;\n      max-width: 560px;\n      margin: 18px auto 40px;\n      padding: 16px;\n      background:#fff;\n      border: 1px solid var(--line);\n      border-radius: var(--radius-sm);\n      box-shadow: var(--shadow-soft);\n    }\n    .hidden{ display:none; }\n\n    \/* Tabs: minimalist underline *\/\n    .size-chart-tabs{\n      display:flex;\n      justify-content:center;\n      gap: 18px;\n      margin-bottom: 12px;\n      border-bottom: 1px solid var(--line);\n      padding-bottom: 2px;\n    }\n    .tab-button{\n      appearance:none;\n      background:transparent;\n      color:var(--muted);\n      padding: 6px 2px;\n      font-size:12px;\n      font-weight:700;\n      letter-spacing:.3px;\n      border:none;\n      border-radius:0;\n      cursor:pointer;\n      position:relative;\n      transition: color .2s ease;\n    }\n    .tab-button:hover,\n    .tab-button:focus-visible{\n      color:var(--ink);\n      outline:none;\n    }\n    .tab-button[aria-selected=\"true\"]{\n      color:var(--ink);\n    }\n    .tab-button[aria-selected=\"true\"]::after{\n      content:\"\";\n      position:absolute;\n      left:0; right:0; bottom:-3px;\n      height: 2px;\n      background: var(--accent);\n      border-radius: 2px;\n    }\n\n    \/* Table: soft row dividers only *\/\n    .size-chart-table{\n      width:100%;\n      border-collapse: collapse;\n      background:#fff;\n    }\n    .size-chart-table th,\n    .size-chart-table td{\n      text-align:center;\n      padding: 10px 6px;\n      font-size:12px;\n      color:var(--ink);\n      border: none;\n      border-bottom: 1px solid var(--line);\n    }\n    .size-chart-table th{\n      font-weight: 700;\n      background: #fbfcfd;\n    }\n    .size-chart-table td:first-child,\n    .size-chart-table th:first-child{\n      text-align:left;\n      padding-left: 6px;\n      font-weight: 600;\n    }\n    .size-chart-table tbody tr:last-child td{\n      border-bottom: none;\n    }\n\n    .size-chart-note{\n      margin-top: 10px;\n      font-size: 11.5px;\n      color: var(--muted);\n      text-align: center;\n    }\n\n    @media (max-width:660px){\n      .wrap{ margin:44px auto; padding:0 14px; }\n      .card{ padding: 24px 20px; }\n      .size-chart-collapse{ max-width: 100%; }\n    }\n  \u003c\/style\u003e\n\n\n  \u003cmain class=\"wrap\" aria-labelledby=\"product-heading\"\u003e\n    \u003csection class=\"card\" aria-describedby=\"product-desc\"\u003e\n      \u003ch1 class=\"title\" id=\"product-heading\"\u003eBuilt for the Long Term\u003c\/h1\u003e\n      \u003cp class=\"lead\" id=\"product-desc\"\u003e\n        We make pieces to last. Cut from ultra-smooth 100% polyester mesh for cool comfort and durability, then\n        finished with professional-grade printing that resists cracking and fading. Everyday-ready, season after season.\n      \u003c\/p\u003e\n      \u003cul class=\"features\" role=\"list\"\u003e\n        \u003cli\u003e100% Polyester Mesh\u003c\/li\u003e\n        \u003cli\u003eWith pockets\u003c\/li\u003e\n        \u003cli\u003eHigh-quality printing\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/section\u003e\n\n    \u003c!-- Trigger --\u003e\n    \u003cdiv class=\"size-chart-button-container\"\u003e\n      \u003cbutton id=\"sizeChartToggle\" class=\"size-chart-open-button\" aria-expanded=\"false\" aria-controls=\"sizeChartPanel\"\u003e\n        Size Chart For Shirt\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Collapsible size chart --\u003e\n    \u003csection id=\"sizeChartPanel\" class=\"size-chart-collapse hidden\" aria-hidden=\"true\"\u003e\n      \u003c!-- Tabs --\u003e\n      \u003cdiv class=\"size-chart-tabs\" role=\"tablist\" aria-label=\"Size chart units\"\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-cm\" aria-selected=\"true\" aria-controls=\"tab-cm\" tabindex=\"0\" data-unit=\"cm\"\u003eCM\u003c\/button\u003e\n        \u003cbutton class=\"tab-button\" role=\"tab\" id=\"tab-btn-in\" aria-selected=\"false\" aria-controls=\"tab-in\" tabindex=\"-1\" data-unit=\"in\"\u003eInches\u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- CM table --\u003e\n      \u003cdiv id=\"tab-cm\" role=\"tabpanel\" aria-labelledby=\"tab-btn-cm\"\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-cm\" aria-label=\"Shirt size chart in centimeters\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Inches table --\u003e\n      \u003cdiv id=\"tab-in\" role=\"tabpanel\" aria-labelledby=\"tab-btn-in\" hidden\u003e\n        \u003ctable class=\"size-chart-table\" id=\"table-in\" aria-label=\"Shirt size chart in inches\"\u003e\u003c\/table\u003e\n      \u003c\/div\u003e\n\n      \u003cp class=\"size-chart-note\"\u003e\n        Measurements are garment dimensions. Compare with a tee you own for best fit.\n      \u003c\/p\u003e\n    \u003c\/section\u003e\n\n    \u003cnoscript\u003e\n      \u003cp style=\"text-align:center;font:14px\/1.4 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;color:#555;\"\u003e\n        Enable JavaScript to view the interactive size chart.\n      \u003c\/p\u003e\n    \u003c\/noscript\u003e\n  \u003c\/main\u003e\n\n  \u003cscript\u003e\n    \/* ===== Data (single source of truth in CM) ===== *\/\n    const SIZE_DATA_CM = [\n      { size: \"S\",   length: 72, chest: 112, shoulder: 54,   sleeve: 24 },\n      { size: \"M\",   length: 74, chest: 116, shoulder: 55.5, sleeve: 25 },\n      { size: \"L\",   length: 76, chest: 120, shoulder: 57,   sleeve: 26 },\n      { size: \"XL\",  length: 78, chest: 124, shoulder: 58.5, sleeve: 27 },\n      { size: \"XXL\", length: 80, chest: 128, shoulder: 60,   sleeve: 28 },\n      { size: \"XXXL\",length: 82, chest: 132, shoulder: 61.5, sleeve: 29 }\n    ];\n\n    const COLUMNS = [\n      { key: \"size\",     label: \"Size\" },\n      { key: \"length\",   label: \"Length\" },\n      { key: \"chest\",    label: \"Chest\" },\n      { key: \"shoulder\", label: \"Shoulder\" },\n      { key: \"sleeve\",   label: \"Sleeve\" }\n    ];\n\n    \/\/ CM -\u003e inches (rounded to nearest 0.5\")\n    const cmToIn = cm =\u003e Math.round((cm \/ 2.54) * 2) \/ 2;\n\n    function renderTable(target, data, unit){\n      const thead = document.createElement(\"thead\");\n      const trh = document.createElement(\"tr\");\n\n      COLUMNS.forEach(col =\u003e {\n        const th = document.createElement(\"th\");\n        th.scope = \"col\";\n        th.textContent = col.key === \"size\" ? col.label : `${col.label} (${unit === \"cm\" ? \"cm\" : \"in\"})`;\n        trh.appendChild(th);\n      });\n      thead.appendChild(trh);\n\n      const tbody = document.createElement(\"tbody\");\n      data.forEach(row =\u003e {\n        const tr = document.createElement(\"tr\");\n        COLUMNS.forEach(col =\u003e {\n          const td = document.createElement(\"td\");\n          if(col.key === \"size\"){\n            td.textContent = row.size;\n            td.style.fontWeight = 600;\n          } else {\n            const val = unit === \"cm\" ? row[col.key] : cmToIn(row[col.key]);\n            td.textContent = Number.isInteger(val) ? String(val) : val.toFixed(1);\n          }\n          tr.appendChild(td);\n        });\n        tbody.appendChild(tr);\n      });\n\n      target.innerHTML = \"\";\n      target.appendChild(thead);\n      target.appendChild(tbody);\n    }\n\n    \/\/ Initial render\n    const tableCM = document.getElementById(\"table-cm\");\n    const tableIN = document.getElementById(\"table-in\");\n    renderTable(tableCM, SIZE_DATA_CM, \"cm\");\n    renderTable(tableIN, SIZE_DATA_CM, \"in\");\n\n    \/\/ Collapsible behavior\n    const toggleBtn = document.getElementById(\"sizeChartToggle\");\n    const panel = document.getElementById(\"sizeChartPanel\");\n\n    function setPanel(open){\n      panel.classList.toggle(\"hidden\", !open);\n      panel.setAttribute(\"aria-hidden\", String(!open));\n      toggleBtn.setAttribute(\"aria-expanded\", String(!!open));\n      if(open){ document.getElementById(\"tab-btn-cm\").focus(); }\n    }\n    toggleBtn.addEventListener(\"click\", () =\u003e {\n      const isOpen = toggleBtn.getAttribute(\"aria-expanded\") === \"true\";\n      setPanel(!isOpen);\n    });\n\n    \/\/ Tabs: click + arrow keys + roving tabindex\n    const tabs = Array.from(document.querySelectorAll('[role=\"tab\"]'));\n    const tabMap = {\n      cm: { btn: document.getElementById(\"tab-btn-cm\"), panel: document.getElementById(\"tab-cm\") },\n      in: { btn: document.getElementById(\"tab-btn-in\"), panel: document.getElementById(\"tab-in\") }\n    };\n\n    function activateTab(key){\n      for(const k in tabMap){\n        const { btn, panel } = tabMap[k];\n        const selected = k === key;\n        btn.setAttribute(\"aria-selected\", String(selected));\n        btn.tabIndex = selected ? 0 : -1;\n        panel.hidden = !selected;\n      }\n      tabMap[key].btn.focus();\n    }\n\n    tabs.forEach(btn =\u003e {\n      btn.addEventListener(\"click\", () =\u003e activateTab(btn.dataset.unit));\n      btn.addEventListener(\"keydown\", (e) =\u003e {\n        const idx = tabs.indexOf(btn);\n        if(e.key === 'ArrowRight' || e.key === 'ArrowDown'){\n          e.preventDefault();\n          const next = tabs[(idx + 1) % tabs.length];\n          activateTab(next.dataset.unit);\n        } else if(e.key === 'ArrowLeft' || e.key === 'ArrowUp'){\n          e.preventDefault();\n          const prev = tabs[(idx - 1 + tabs.length) % tabs.length];\n          activateTab(prev.dataset.unit);\n        } else if(e.key === 'Home'){\n          e.preventDefault();\n          activateTab(tabs[0].dataset.unit);\n        } else if(e.key === 'End'){\n          e.preventDefault();\n          activateTab(tabs[tabs.length - 1].dataset.unit);\n        }\n      });\n    });\n\n    \/\/ Default active tab\n    activateTab('cm');\n  \u003c\/script\u003e\n\n\n\u003c\/body\u003e","brand":"Washed Warrior","offers":[{"title":"S","offer_id":50241596326235,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50241596359003,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50241596391771,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50241596424539,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50241596457307,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50241596490075,"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-6.webp?v=1742077848"},{"product_id":"cursed-smile-occult-graphic-tee","title":"Cursed Smile Occult Graphic 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":50610620170587,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50610620203355,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50610620236123,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50610620268891,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50610620301659,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50610620334427,"sku":"","price":22.99,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0924\/6054\/8443\/files\/variant-image-2_c07add0d-b407-4e50-b2ce-f939bac97a7f.jpg?v=1747776304"},{"product_id":"cursed-smile-occult-graphic-tee-copy","title":"Psychedelic Horror Face T-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":50610643698011,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50610643730779,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50610643763547,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50610643796315,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50610643829083,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50610643861851,"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-4_2c957d18-ca5c-4e1e-8567-c57dae0eac1e.jpg?v=1747776971"},{"product_id":"psychedelic-horror-face-t-shirt-copy","title":"Sinister Eyes Horror Manga 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":50610692424027,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"M","offer_id":50610692456795,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"L","offer_id":50610692489563,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"XL","offer_id":50610692522331,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"2XL","offer_id":50610692555099,"sku":null,"price":22.99,"currency_code":"GBP","in_stock":true},{"title":"3XL","offer_id":50610692587867,"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-5_758de583-7549-4bdf-b9fd-edf9e8b088ec.jpg?v=1747777236"}],"url":"https:\/\/washedwarrior.com\/collections\/dark-fantasy.oembed","provider":"Washed Warrior","version":"1.0","type":"link"}