{
  "version": 3,
  "sources": ["/cdn/shop/t/3/assets/js-render.js?cbx=1791111609601"],
  "sourcesContent": ["/* ==========================================================================\n   Vision Attire \u2014 data-driven components\n   Product cards, athlete wall, reviews and FAQ all render from the data files\n   so the catalogue lives in one place and maps cleanly onto Shopify later.\n   ========================================================================== */\n(() => {\n  'use strict';\n\n  const $  = (s, c = document) => c.querySelector(s);\n  const $$ = (s, c = document) => [...c.querySelectorAll(s)];\n  const esc = (s) => String(s).replace(/[&<>\"]/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' }[c]));\n\n  const STOCK = {\n    in:   ['In stock', 'pill--in'],\n    low:  ['Low stock', 'pill--low'],\n    out:  ['Sold out', 'pill--out'],\n    drop: ['Drop', 'pill--acc'],\n  };\n\n  // On Shopify the theme sets VA_ROUTES (/collections/\u2026, /pages/custom); on Netlify the .html pages stand.\n  const PAGE = Object.assign({\n    'mens-physique-shorts': 'product-mens-physique.html',\n    'classic-physique-trunks': 'product-classic-trunks.html',\n    'bodybuilding-trunks': 'product-bodybuilding-trunks.html',\n    custom: 'custom.html',\n  }, window.VA_ROUTES);\n\n  const need = (sel) => $$(sel).length > 0;\n  // \"6 colourways\", \"3 cuts\": the classic trunks are chosen by cut, not colour.\n  const options = (c) => {\n    const noun = (c.optionLabel || 'Colourway').toLowerCase();\n    return `${c.products.length} ${noun}${c.products.length > 1 ? 's' : ''}`;\n  };\n\n  Promise.all([\n    need('[data-cards],[data-collections]') ? fetch(VA_DATA('assets/data/catalogue.json')).then(r => r.json()).then(VA_FIX)\n      .then(c => window.VA_SHOP ? VA_SHOP.live(c) : c) : null,\n    fetch(VA_DATA('assets/data/site.json')).then(r => r.json()).then(VA_FIX),\n  ]).then(([cat, site]) => {\n    if (cat) { cards(cat); collections(cat); }\n    wall(site);\n    reviews(site);\n    faq(site);\n  }).catch(e => console.error('render:', e));\n\n  /* --- one card per collection ------------------------------------------ */\n  function cards(cat) {\n    const host = $('[data-cards]');\n    if (!host) return;\n\n    const items = cat.collections.map((c, i) => {\n      const lead = c.products.find(p => p.handle === c.lead) || c.products[0];\n      const anyIn = c.products.some(p => p.stock === 'in');\n      const [txt, cls] = anyIn ? STOCK.in : STOCK.out;\n      return `\n      <a class=\"pcard\" href=\"${PAGE[c.handle]}\" data-reveal data-reveal-delay=\"${i * 90}\">\n        <div class=\"pcard__fig\">\n          <span class=\"pill ${cls} pcard__tag\">${txt}</span>\n          <img class=\"pcard__img\" src=\"${c.img}\" alt=\"${esc(c.title)}, ${esc(lead.title)}\"\n               width=\"720\" height=\"900\" loading=\"lazy\" decoding=\"async\">\n        </div>\n        <div class=\"pcard__body\">\n          <div class=\"pcard__row\"><h3>${esc(c.title)}</h3><span class=\"price\">$${c.price}</span></div>\n          <p>${esc(c.blurb)}</p>\n          <span class=\"pcard__go\">${options(c)} &rarr;</span>\n        </div>\n      </a>`;\n    }).join('');\n\n    const cu = cat.custom;\n    const custom = `\n      <a class=\"pcard\" href=\"${PAGE.custom}\" data-reveal data-reveal-delay=\"270\">\n        <div class=\"pcard__fig\">\n          <span class=\"pill pill--acc pcard__tag\">Always available</span>\n          <img class=\"pcard__img\" src=\"${cu.img}\" alt=\"Custom men's physique shorts\"\n               width=\"720\" height=\"900\" loading=\"lazy\" decoding=\"async\">\n        </div>\n        <div class=\"pcard__body\">\n          <div class=\"pcard__row\"><h3>${esc(cu.title)}</h3><span class=\"price\">$${cu.price}</span></div>\n          <p>${esc(cu.blurb)}</p>\n          <span class=\"pcard__go\">Build yours &rarr;</span>\n        </div>\n      </a>`;\n\n    host.innerHTML = items + custom;\n    rewatch(host);\n  }\n\n  /* --- full collection listing (shop page) ------------------------------ */\n  function collections(cat) {\n    const host = $('[data-collections]');\n    if (!host) return;\n\n    const block = (c) => `\n      <section class=\"sect\" id=\"${c.handle}\">\n        <div class=\"wrap\">\n          <div class=\"sect__head\">\n            <p class=\"eyebrow\">$${c.price} &middot; ${options(c)}</p>\n            <h2>${esc(c.title)}</h2>\n            <p class=\"lede\">${esc(c.blurb)}</p>\n          </div>\n          <div class=\"grid cols-4\">\n            ${c.products.map((p, i) => {\n              const [txt, cls] = STOCK[p.stock] || STOCK.out;\n              return `\n              <a class=\"pcard\" href=\"${PAGE[c.handle]}#${p.handle}\" data-reveal data-reveal-delay=\"${i * 70}\">\n                <div class=\"pcard__fig\">\n                  <span class=\"pill ${cls} pcard__tag\">${txt}</span>\n                  <img class=\"pcard__img\" src=\"${p.img}\" alt=\"${esc(c.title)}, ${esc(p.title)}\"\n                       width=\"720\" height=\"900\" loading=\"lazy\" decoding=\"async\">\n                </div>\n                <div class=\"pcard__body\">\n                  <div class=\"pcard__row\"><h3>${esc(p.title)}</h3><span class=\"price\">$${p.price ?? c.price}</span></div>\n                  <span class=\"pcard__go\">${p.stock === 'out' ? 'Notify me' : 'View'} &rarr;</span>\n                </div>\n              </a>`;\n            }).join('')}\n          </div>\n        </div>\n      </section>`;\n\n    // Off Season (client, 16 Sep 2026): a home for non-competition apparel, not a sell-through notice.\n    const off = cat.offSeason;\n    const ranges = (off.ranges || []).map(r => `\n              <div class=\"card\"><h3>${esc(r)}</h3></div>`).join('');\n    const offBlock = `\n      <section class=\"sect sect--tint\" id=\"off-season\">\n        <div class=\"wrap\">\n          <div class=\"sect__head\">\n            <p class=\"eyebrow\">${esc(off.eyebrow || off.title)}</p>\n            <h2>${esc(off.title)}</h2>\n            <p class=\"lede\">${esc(off.blurb)}</p>\n          </div>\n          ${ranges ? `<div class=\"grid cols-3\">${ranges}</div><p class=\"hint mt-2\">${esc(off.rangesNote || '')}</p>` : ''}\n          ${off.products.length ? `<p class=\"eyebrow mt-3\">${esc(off.dropsLabel || 'Released as drops')}</p>` : ''}\n          <div class=\"grid cols-2 mt-1\">\n            ${off.products.map(p => `\n              <div class=\"card\">\n                <div class=\"pcard__row mb-1\">\n                  <h3>${esc(p.title)}</h3><span class=\"price\">$${p.price}</span>\n                </div>\n                <p>Not held as permanent stock. Join the waitlist and you'll hear before it goes public.</p>\n                <form class=\"mt-2\" data-confirm=\"You're on the list. We'll email you before the next drop.\"\n                      name=\"drop-waitlist\" method=\"POST\" data-netlify=\"true\" netlify-honeypot=\"bot-field\">\n                  <input type=\"hidden\" name=\"form-name\" value=\"drop-waitlist\">\n                  <p hidden><label>Leave blank <input name=\"bot-field\" tabindex=\"-1\" autocomplete=\"off\"></label></p>\n                  <input type=\"hidden\" name=\"product\" value=\"${esc(p.title)}\">\n                  <div class=\"field\" style=\"margin-bottom:10px\">\n                    <label class=\"sr-only\" for=\"drop-${p.handle}\">Email</label>\n                    <input class=\"input\" type=\"email\" id=\"drop-${p.handle}\" name=\"email\" placeholder=\"you@email.com\" required>\n                  </div>\n                  <button class=\"btn btn--sm btn--ghost btn--wide\" type=\"submit\">Join the waitlist</button>\n                </form>\n              </div>`).join('')}\n          </div>\n        </div>\n      </section>`;\n\n    host.innerHTML = cat.collections.map(block).join('') + offBlock;\n    rewatch(host);\n    // vision.js owns the confirm behaviour; these forms were injected after it ran.\n    $$('form[data-confirm]', host).forEach(f => {\n      if (window.__vaWire) window.__vaWire(f);\n    });\n  }\n\n  /* --- athlete wall ------------------------------------------------------\n     Deliberately NOT captioned with names. We have ten photographs and ten\n     named team members, but nobody has told us which is which, and guessing\n     puts the wrong name under a real person's face. The named roster renders\n     separately from the real data. Client confirms the mapping before launch.\n     ---------------------------------------------------------------------- */\n  const SHOTS = [\n    'athlete-4-88A6817', 'athlete-6-88A7065', 'athlete-11-88A7102', 'athlete-13-88A7248',\n    'athlete-5-88A6830', 'athlete-7-88A7067', 'athlete-9-88A7099', 'athlete-14-88A7264',\n    'athlete-2-588729895_14299659887022', 'athlete-3-590222005_13849914798705',\n  ];\n\n  function wall(site) {\n    const host = $('[data-wall]');\n    if (host) {\n      const limit = +host.dataset.wallLimit || SHOTS.length;\n      host.innerHTML = SHOTS.slice(0, limit).map(f => `\n        <figure>\n          <img src=\"${VA_URL('assets/img/' + f + '.webp')}\" alt=\"A Vision Attire athlete on stage\"\n               loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"1800\">\n        </figure>`).join('');\n    }\n\n    const roster = $('[data-roster]');\n    if (roster) {\n      roster.innerHTML = site.athletes.map((a, i) => `\n        <div class=\"card\" data-reveal data-reveal-delay=\"${(i % 4) * 70}\">\n          <h3>${esc(a.name)}</h3>\n          <div class=\"pills mt-1\">\n            ${a.federations.map(f => `<span class=\"pill\">${esc(f)}</span>`).join('')}\n          </div>\n          <p class=\"mt-1\">${esc(a.division)}</p>\n        </div>`).join('');\n      rewatch(roster);\n    }\n  }\n\n  /* --- reviews ----------------------------------------------------------- */\n  function reviews(site) {\n    const host = $('[data-reviews]');\n    if (!host) return;\n    host.innerHTML = site.reviews.items.map(r => `\n      <figure class=\"quote\">\n        <div class=\"quote__stars\" aria-label=\"${r.stars} out of 5\">${'\u2605'.repeat(r.stars)}</div>\n        <blockquote>${esc(r.text)}</blockquote>\n        <figcaption><b>${esc(r.name)}</b> &middot; ${esc(r.division)}</figcaption>\n      </figure>`).join('');\n  }\n\n  /* --- FAQ --------------------------------------------------------------- */\n  function faq(site) {\n    const host = $('[data-faq]');\n    if (!host) return;\n    const limit = +host.dataset.faqLimit || site.faq.items.length;\n    host.innerHTML = site.faq.items.slice(0, limit).map(f => `\n      <details>\n        <summary>${esc(f.q)}</summary>\n        <div class=\"faq__a\">${f.a.map(p => `<p>${p}</p>`).join('')}</div>\n      </details>`).join('');\n  }\n\n  /* --- re-arm reveal on injected nodes ----------------------------------- */\n  function rewatch(host) {\n    const els = $$('[data-reveal]', host);\n    if (!els.length) return;\n    if (matchMedia('(prefers-reduced-motion: reduce)').matches) {\n      els.forEach(el => el.classList.add('is-in'));\n      return;\n    }\n    const io = new IntersectionObserver(es => es.forEach(en => {\n      if (!en.isIntersecting) return;\n      setTimeout(() => en.target.classList.add('is-in'), +(en.target.dataset.revealDelay || 0));\n      io.unobserve(en.target);\n    }), { rootMargin: '0px 0px -8% 0px', threshold: 0.05 });\n    els.forEach(el => io.observe(el));\n  }\n})();\n"],
  "mappings": "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",
  "names": []
}
