{"product_id":"premium-golf-shoe-bag-vented-leather-shoe-storage","title":"Premium Golf Shoe Bag – Vented Leather Shoe Storage","description":"\u003cstyle\u003e\n\/* =========================\n   AF LUXURY PAGE STYLES (Scoped \u0026 Premium)\n   ========================= *\/\n.af-luxury-page {\n  background: #050509;\n  color: #f3f4f6;\n  padding: 60px 20px;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n  line-height: 1.6;\n}\n.af-luxury-page * { box-sizing: border-box; }\n\n.af-container {\n  max-width: 1000px;\n  margin: 0 auto;\n}\n\n\/* TYPOGRAPHY *\/\n.af-eyebrow {\n  color: #34d399; \/* Brand Accent *\/\n  letter-spacing: 0.15em;\n  text-transform: uppercase;\n  font-weight: 700;\n  font-size: 0.75rem;\n  margin: 0 0 12px;\n  text-align: center;\n}\n\n.af-hero h1 {\n  margin: 0 0 16px;\n  font-weight: 800;\n  line-height: 1.1;\n  font-size: clamp(2.5rem, 5vw, 3.5rem);\n  letter-spacing: -0.02em;\n  color: #fff;\n  text-align: center;\n}\n\n.af-lede {\n  margin: 0 auto 22px;\n  max-width: 760px;\n  color: #9ca3af;\n  font-size: 1.15rem;\n  text-align: center;\n  line-height: 1.6;\n}\n\n\/* CONSOLE CARDS (Glassmorphism) *\/\n.af-card {\n  background: #111827;\n  border: 1px solid rgba(255,255,255,0.12);\n  border-radius: 24px;\n  padding: 40px;\n  margin-bottom: 24px;\n  box-shadow: 0 20px 40px -10px rgba(0,0,0,0.5);\n  position: relative;\n  overflow: hidden;\n}\n\n.af-h2 {\n  margin: 0 0 16px;\n  font-size: 1.75rem;\n  line-height: 1.2;\n  font-weight: 700;\n  color: #fff;\n}\n\n.af-muted {\n  color: #d1d5db;\n  font-size: 1.05rem;\n  margin-bottom: 1.5rem;\n}\n\n\/* EXECUTIVE SUMMARY (Highlight Box) *\/\n.af-exec-summary {\n  background: rgba(52, 211, 153, 0.1);\n  border: 1px solid rgba(52, 211, 153, 0.25);\n  border-radius: 16px;\n  padding: 24px;\n  margin-bottom: 28px;\n}\n.af-exec-summary__hdr {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  margin-bottom: 12px;\n  flex-wrap: wrap;\n}\n.af-exec-summary__label {\n  font-size: 0.75rem;\n  letter-spacing: 0.1em;\n  text-transform: uppercase;\n  color: #34d399;\n  font-weight: 800;\n  background: rgba(52, 211, 153, 0.1);\n  padding: 4px 8px;\n  border-radius: 6px;\n}\n.af-exec-summary__note {\n  font-size: 0.95rem;\n  color: #fff;\n  font-weight: 600;\n}\n.af-exec-summary p {\n  margin: 0;\n  color: #d1d5db;\n  font-size: 1rem;\n}\n\n\/* LISTS \u0026 STEPS *\/\n.af-list, .af-steps {\n  margin: 0;\n  padding-left: 1.2rem;\n  color: #d1d5db;\n}\n.af-list li, .af-steps li {\n  margin: 0.8rem 0;\n}\n.af-list li strong, .af-steps li strong { color: #fff; }\n\n\/* GRIDS *\/\n.af-grid-2 {\n  display: grid;\n  grid-template-columns: 1fr;\n  gap: 20px;\n}\n@media (min-width: 768px) {\n  .af-grid-2 { grid-template-columns: 1fr 1fr; }\n}\n\n\/* IMAGES *\/\n.af-img-wrap {\n  width: 100%;\n  border-radius: 16px;\n  overflow: hidden;\n  border: 1px solid rgba(255,255,255,0.1);\n  margin-top: 16px;\n}\n.af-img {\n  width: 100%;\n  height: auto;\n  display: block;\n}\n\n\/* FAQ (Accordion Style) *\/\n.af-faq {\n  border-top: 1px solid rgba(255,255,255,0.1);\n  padding: 16px 0;\n}\n.af-faq summary {\n  cursor: pointer;\n  font-weight: 700;\n  color: #fff;\n  font-size: 1.1rem;\n  list-style: none;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: 12px;\n}\n.af-faq summary::-webkit-details-marker { display: none; }\n.af-faq summary::after {\n  content: \"+\";\n  font-weight: 400;\n  color: #9ca3af;\n  font-size: 1.5rem;\n}\ndetails[open] summary::after { content: \"−\"; }\n.af-faq div { margin-top: 12px; color: #d1d5db; line-height: 1.6; }\n\n\/* BUTTONS (Locked System) *\/\n.af-btn-wrap {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 12px;\n  margin-top: 18px;\n}\n.af-btn {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  padding: 12px 24px;\n  border-radius: 999px;\n  font-weight: 700;\n  text-decoration: none !important;\n  font-size: 0.95rem;\n  transition: all 0.2s ease;\n  cursor: pointer;\n  border: none;\n  font-family: inherit;\n  user-select: none;\n}\n.af-btn:hover { transform: translateY(-2px); }\n\n.af-btn-primary {\n  background: #34d399;\n  color: #064e3b !important;\n  box-shadow: 0 4px 12px rgba(52, 211, 153, 0.3);\n}\n.af-btn-primary:hover {\n  background: #10b981;\n  box-shadow: 0 8px 20px rgba(52, 211, 153, 0.4);\n}\n\n.af-btn-secondary {\n  background: rgba(255,255,255,0.1);\n  color: #fff !important;\n  border: 1px solid rgba(255,255,255,0.1);\n}\n.af-btn-secondary:hover { background: rgba(255,255,255,0.2); }\n\n\/* SMALL UTILS *\/\n.af-center { text-align:center; }\n.af-pill-row { justify-content:center; }\n.af-tight { margin-top: 10px; }\n.af-kicker {\n  display:flex; gap:10px; flex-wrap:wrap; justify-content:center;\n  margin-top: 10px;\n}\n.af-kicker span{\n  font-size: .92rem;\n  color:#d1d5db;\n  border: 1px solid rgba(255,255,255,.12);\n  background: rgba(255,255,255,.06);\n  padding: 6px 10px;\n  border-radius: 999px;\n}\n.af-variant-wrap{\n  display:flex; flex-wrap:wrap; gap:10px; justify-content:center;\n  margin-top: 14px;\n}\n.af-variant-btn[aria-pressed=\"true\"]{\n  border-color: rgba(52,211,153,.55);\n  box-shadow: 0 8px 20px rgba(52,211,153,.18);\n}\n\u003c\/style\u003e\n\u003cdiv data-af-shoe-bag=\"\" class=\"af-luxury-page\"\u003e\n\u003cdiv class=\"af-container\"\u003e\n\u003cheader class=\"af-hero\"\u003e\n\u003cp class=\"af-eyebrow\"\u003eOn-Course Organization System™ • Shoe Bag\u003c\/p\u003e\n\u003ch1\u003ePremium Golf Shoe Bag\u003c\/h1\u003e\n\u003cp class=\"af-lede\"\u003eHere’s the dumbest way to start a round: toss dirty shoes into your trunk and let them “season” your entire setup. This fixes the one predictable failure mode that ruins everything else: contamination creep.\u003c\/p\u003e\n\u003cdiv class=\"af-exec-summary\"\u003e\n\u003cdiv class=\"af-exec-summary__hdr\"\u003e\n\u003cspan class=\"af-exec-summary__label\"\u003eTest Verdict\u003c\/span\u003e \u003cspan class=\"af-exec-summary__note\"\u003eContain the mess, protect the rest.\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cp\u003eThe Premium Golf Shoe Bag is built for one job: isolate dirty, damp footwear so it doesn’t migrate into gloves, towels, headcovers, or your car. The mechanism is boring on purpose: create a default home for shoes so the trunk stays clean and your pre-round routine stays repeatable.\u003cbr\u003e\u003cbr\u003e\u003cstrong\u003eVerdict:\u003c\/strong\u003e Buy it if you keep shoes in the car (or travel). Skip it if your shoes live at the clubhouse.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c!-- HERO GALLERY + VARIANT --\u003e\n\u003cdiv class=\"af-card\"\u003e\n\u003ch2 style=\"margin-bottom: 10px;\" class=\"af-h2 af-center\"\u003eChoose your color\u003c\/h2\u003e\n\u003cp style=\"margin-bottom: 6px;\" class=\"af-muted af-center\"\u003ePick a finish you won’t regret in 6 months. (Both do the same job.)\u003c\/p\u003e\n\u003cdiv aria-label=\"Shoe bag color\" role=\"group\" class=\"af-variant-wrap\"\u003e\n\u003cbutton aria-pressed=\"true\" data-af-color=\"Grey\" class=\"af-btn af-btn-secondary af-variant-btn\" type=\"button\"\u003eGrey\u003c\/button\u003e \u003cbutton aria-pressed=\"false\" data-af-color=\"Black\" class=\"af-btn af-btn-secondary af-variant-btn\" type=\"button\"\u003eBlack\u003c\/button\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"af-kicker\"\u003e\n\u003cspan\u003eFits up to men’s size 14\u003c\/span\u003e \u003cspan\u003eBuilt for trunk containment\u003c\/span\u003e \u003cspan\u003eSystem-ready routine\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"af-img-wrap\"\u003e\u003cimg loading=\"eager\" alt=\"Premium golf shoe bag in grey, designed to contain dirty shoes and protect the rest of your gear\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0555\/0830\/3915\/files\/premium_shoe_bag_grey.jpg?v=1768952013\" data-af-hero-img=\"\" class=\"af-img\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"af-btn-wrap af-pill-row\"\u003e\n\u003c!-- Primary conversion: real \/cart\/add form submit --\u003e \u003cbutton data-af-atc=\"\" class=\"af-btn af-btn-primary\" type=\"button\"\u003e Add to Cart \u003c\/button\u003e \u003ca href=\"\/collections\/on-course-organization-system\" class=\"af-btn af-btn-secondary\"\u003e Shop the System \u003c\/a\u003e \u003ca href=\"\/pages\/our-golf-gear-testing-design-standards\" class=\"af-btn af-btn-secondary\"\u003e Testing Standards \u003c\/a\u003e\n\u003c\/div\u003e\n\u003cp style=\"margin-bottom: 0; font-size: .98rem; color: #9ca3af;\" class=\"af-muted af-center af-tight\"\u003eNote: The button above submits the real Shopify product form (no theme-button roulette).\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/header\u003e\n\u003csection class=\"af-card\"\u003e\n\u003ch2 class=\"af-h2\"\u003eWhat problem this solves\u003c\/h2\u003e\n\u003cp class=\"af-muted\"\u003eShoes are the messy item that quietly ruins everything else. Dirt falls out. Moisture lingers. Odor sticks. Toss them loose and your trunk becomes a slow-motion spill into gloves, towels, and whatever you actually like.\u003c\/p\u003e\n\u003cp class=\"af-muted\"\u003eThe second problem is decision friction. If shoes don’t have a default home, every round starts with tiny choices: “Where do these go?” “Did I bring them?” Those micro-annoyances stack up and steal focus.\u003c\/p\u003e\n\u003cp class=\"af-muted\"\u003e\u003cstrong\u003eThe fix:\u003c\/strong\u003e One job. One place. Every time.\u003c\/p\u003e\n\u003c\/section\u003e\n\u003csection class=\"af-card\"\u003e\n\u003ch2 class=\"af-h2\"\u003eHow it works\u003c\/h2\u003e\n\u003col class=\"af-steps\"\u003e\n\u003cli\u003e\n\u003cstrong\u003eAfter the round:\u003c\/strong\u003e shoes go straight into the bag, not onto carpet, not into your back seat.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eContainment:\u003c\/strong\u003e dirt and moisture stay with the shoes instead of migrating into your gear.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eReset:\u003c\/strong\u003e the bag becomes the default home, removing the “where do these go?” decision.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eSystem compatibility:\u003c\/strong\u003e store it next to your small-gear organizer so the whole routine stays automatic.\u003c\/li\u003e\n\u003c\/ol\u003e\n\u003c\/section\u003e\n\u003csection class=\"af-grid-2\"\u003e\n\u003cdiv class=\"af-card\"\u003e\n\u003ch2 class=\"af-h2\"\u003eWho it’s for\u003c\/h2\u003e\n\u003cul class=\"af-list\"\u003e\n\u003cli\u003eGolfers who keep shoes in the car.\u003c\/li\u003e\n\u003cli\u003ePlayers who walk, practice, or travel.\u003c\/li\u003e\n\u003cli\u003eAnyone building a repeatable setup.\u003c\/li\u003e\n\u003cli\u003ePeople tired of trunk chaos (so… adults).\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"af-card\"\u003e\n\u003ch2 class=\"af-h2\"\u003eWho it’s not for\u003c\/h2\u003e\n\u003cul class=\"af-list\"\u003e\n\u003cli\u003ePeople who leave shoes at the clubhouse.\u003c\/li\u003e\n\u003cli\u003eGolfers who don’t care about trunk mess.\u003c\/li\u003e\n\u003cli\u003eAnyone who thinks “organization” is a personality flaw.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003csection class=\"af-card\"\u003e\n\u003ch2 class=\"af-h2\"\u003eChoose your setup\u003c\/h2\u003e\n\u003cp class=\"af-muted\"\u003eUse explicit decision rules so you don’t overthink it:\u003c\/p\u003e\n\u003cul class=\"af-list\"\u003e\n\u003cli\u003e\n\u003cstrong\u003eChoose the Shoe Bag\u003c\/strong\u003e if your main issue is dirt, moisture, and smell migrating into other gear.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eChoose the On-Course Organization System™\u003c\/strong\u003e if you also want a home for small essentials (phone, keys, tees, cash).\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cdiv class=\"af-btn-wrap\"\u003e\n\u003ca href=\"\/collections\/on-course-organization-system\" class=\"af-btn af-btn-secondary\"\u003eShop Shoe Bags\u003c\/a\u003e \u003ca href=\"\/collections\/on-course-organization-system\" class=\"af-btn af-btn-secondary\"\u003eShop Utility Pouches\u003c\/a\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003csection class=\"af-card\"\u003e\n\u003ch2 class=\"af-h2\"\u003eUse it like this\u003c\/h2\u003e\n\u003col class=\"af-steps\"\u003e\n\u003cli\u003e\n\u003cstrong\u003eBefore round:\u003c\/strong\u003e keep the shoe bag in the trunk with your setup.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eArrive:\u003c\/strong\u003e shoes come out, bag stays put.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eAfter round:\u003c\/strong\u003e shoes go straight back in before anything else gets packed.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eAt home:\u003c\/strong\u003e store the bag. Let shoes air out if needed.\u003c\/li\u003e\n\u003c\/ol\u003e\n\u003c\/section\u003e\n\u003csection class=\"af-card\"\u003e\n\u003ch2 class=\"af-h2\"\u003eProof and trust\u003c\/h2\u003e\n\u003cp class=\"af-muted\"\u003eWe design around routines and failure modes: what actually creates friction during real golf weeks. Shoe mess is predictable, so the fix is a predictable home. Not sexy. Just effective.\u003c\/p\u003e\n\u003cdiv class=\"af-btn-wrap\"\u003e\u003ca href=\"\/pages\/our-golf-gear-testing-design-standards\" class=\"af-btn af-btn-secondary\"\u003eRead Testing Standards\u003c\/a\u003e\u003c\/div\u003e\n\u003c\/section\u003e\n\u003csection id=\"af-faq\" class=\"af-card\"\u003e\n\u003ch2 class=\"af-h2\"\u003ePremium Golf Shoe Bag FAQ\u003c\/h2\u003e\n\u003cdetails class=\"af-faq\"\u003e\n\u003csummary\u003eWhat problem does this solve best?\u003c\/summary\u003e\n\u003cdiv\u003eContaining dirt, moisture, and odor so they don’t transfer into the rest of your gear or your trunk.\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails class=\"af-faq\"\u003e\n\u003csummary\u003eWill it fit large shoes?\u003c\/summary\u003e\n\u003cdiv\u003eYes. It fits up to men’s size 14.\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails class=\"af-faq\"\u003e\n\u003csummary\u003eIs it compatible with any golf bag?\u003c\/summary\u003e\n\u003cdiv\u003eYes. It’s separate from your golf bag, so it works whether you use a stand bag, cart bag, or push cart.\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails class=\"af-faq\"\u003e\n\u003csummary\u003eDoes it eliminate odor?\u003c\/summary\u003e\n\u003cdiv\u003eIt isolates odor from other gear. For best results, dry shoes between rounds. This is containment, not a deodorizer.\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails class=\"af-faq\"\u003e\n\u003csummary\u003eShould I also get the utility pouch?\u003c\/summary\u003e\n\u003cdiv\u003eGet the pouch if your small essentials keep migrating. The shoe bag isolates footwear; the pouch consolidates essentials.\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails class=\"af-faq\"\u003e\n\u003csummary\u003eHow does this fit the System?\u003c\/summary\u003e\n\u003cdiv\u003eIt handles footwear containment. Pair with the utility pouch for a complete pre-round flow.\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c\/section\u003e\n\u003csection class=\"af-card af-center\"\u003e\n\u003ch2 class=\"af-h2\"\u003eMake your trunk boring again\u003c\/h2\u003e\n\u003cp class=\"af-muted\"\u003eBoring is good. Boring means your shoes are contained, your gear stays cleaner, and your round starts with fewer distractions.\u003c\/p\u003e\n\u003cdiv class=\"af-btn-wrap af-pill-row\"\u003e\n\u003cbutton data-af-atc=\"\" class=\"af-btn af-btn-primary\" type=\"button\"\u003eAdd to Cart\u003c\/button\u003e \u003ca href=\"\/pages\/golf-gear-system-hub\" class=\"af-btn af-btn-secondary\"\u003eSee System Hub\u003c\/a\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- FAQPage JSON-LD (matches on-page FAQ) --\u003e\n\u003cp\u003e\u003cscript type=\"application\/ld+json\"\u003e\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What problem does this solve best?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Containing dirt, moisture, and odor so they don’t transfer into the rest of your gear or your trunk.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Will it fit large shoes?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. It fits up to men’s size 14.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Is it compatible with any golf bag?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. It’s separate from your golf bag, so it works whether you use a stand bag, cart bag, or push cart.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Does it eliminate odor?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"It isolates odor from other gear. For best results, dry shoes between rounds. This is containment, not a deodorizer.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Should I also get the utility pouch?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Get the pouch if your small essentials keep migrating. The shoe bag isolates footwear; the pouch consolidates essentials.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How does this fit the System?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"It handles footwear containment. Pair with the utility pouch for a complete pre-round flow.\"\n      }\n    }\n  ]\n}\n\u003c\/script\u003e \u003cscript\u003e\n\/* =========================================================\n   AF PDP ATC LOCK (No Theme Buttons)\n   - Submits the REAL Shopify \/cart\/add form via requestSubmit()\n   - MutationObserver fallback to wait for form + variant UI\n   - Also syncs a simple color toggle to the product variant option\n   ========================================================= *\/\n(function(){\n  const root = document.querySelector('[data-af-shoe-bag]');\n  if(!root) return;\n\n  const IMG_GREY  = \"https:\/\/cdn.shopify.com\/s\/files\/1\/0555\/0830\/3915\/files\/premium_shoe_bag_grey.jpg?v=1768952013\";\n  const IMG_BLACK = \"https:\/\/cdn.shopify.com\/s\/files\/1\/0555\/0830\/3915\/files\/premium_shoe_bag_black.jpg?v=1768952030\";\n\n  const heroImg = root.querySelector('[data-af-hero-img]');\n  const variantBtns = Array.from(root.querySelectorAll('[data-af-color]'));\n  const atcBtns = Array.from(root.querySelectorAll('[data-af-atc]'));\n\n  function setPressed(color){\n    variantBtns.forEach(btn =\u003e btn.setAttribute('aria-pressed', String(btn.getAttribute('data-af-color') === color)));\n  }\n\n  function setHero(color){\n    if(!heroImg) return;\n    if(color === \"Black\"){\n      heroImg.src = IMG_BLACK;\n      heroImg.alt = \"Premium golf shoe bag in black, designed to contain dirty shoes and protect the rest of your gear\";\n    } else {\n      heroImg.src = IMG_GREY;\n      heroImg.alt = \"Premium golf shoe bag in grey, designed to contain dirty shoes and protect the rest of your gear\";\n    }\n  }\n\n  \/\/ Attempts to set Shopify variant option to match the chosen color (supports select, radios, swatches).\n  function syncShopifyVariant(color){\n    const form = findProductForm();\n    if(!form) return false;\n\n    \/\/ 1) Standard Shopify \u003cselect name=\"id\"\u003e exists (variant id). If present, we likely need to trigger the theme option picker instead.\n    \/\/ 2) Try common option inputs inside the product form (radios\/selects) and match by value\/text.\n    const optionCandidates = [\n      ...form.querySelectorAll('input[type=\"radio\"][name*=\"option\"], input[type=\"radio\"][name*=\"options\"]'),\n      ...form.querySelectorAll('select[name*=\"option\"], select[name*=\"options\"]'),\n      ...form.querySelectorAll('button[aria-label*=\"Color\"], button[aria-label*=\"colour\"], button[aria-label*=\"Grey\"], button[aria-label*=\"Black\"]')\n    ];\n\n    \/\/ Radios\n    const radios = optionCandidates.filter(el =\u003e el.tagName === \"INPUT\" \u0026\u0026 el.type === \"radio\");\n    for(const r of radios){\n      const val = (r.value || \"\").trim();\n      const label = (form.querySelector('label[for=\"'+r.id+'\"]')?.textContent || \"\").trim();\n      if(val.toLowerCase() === color.toLowerCase() || label.toLowerCase() === color.toLowerCase()){\n        if(!r.checked){\n          r.click();\n          r.dispatchEvent(new Event('change', {bubbles:true}));\n        }\n        return true;\n      }\n    }\n\n    \/\/ Selects\n    const selects = optionCandidates.filter(el =\u003e el.tagName === \"SELECT\");\n    for(const s of selects){\n      const opts = Array.from(s.options || []);\n      const match = opts.find(o =\u003e (o.textContent || \"\").trim().toLowerCase() === color.toLowerCase() || (o.value || \"\").trim().toLowerCase() === color.toLowerCase());\n      if(match){\n        s.value = match.value;\n        s.dispatchEvent(new Event('change', {bubbles:true}));\n        return true;\n      }\n    }\n\n    \/\/ Buttons (some themes use buttons for swatches)\n    const btns = optionCandidates.filter(el =\u003e el.tagName === \"BUTTON\");\n    for(const b of btns){\n      const txt = (b.textContent || \"\").trim().toLowerCase();\n      const aria = (b.getAttribute('aria-label') || \"\").trim().toLowerCase();\n      if(txt === color.toLowerCase() || aria.includes(color.toLowerCase())){\n        b.click();\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  function findProductForm(){\n    \/\/ Real Shopify product forms typically post to \/cart\/add\n    \/\/ We pick the first visible-ish one on the page.\n    const forms = Array.from(document.querySelectorAll('form[action^=\"\/cart\/add\"]'));\n    if(!forms.length) return null;\n\n    \/\/ Prefer form that is closest to the description block (PDP context)\n    \/\/ but keep it simple: first form that contains an id input.\n    const preferred = forms.find(f =\u003e f.querySelector('input[name=\"id\"], select[name=\"id\"]'));\n    return preferred || forms[0];\n  }\n\n  function submitRealCartForm(){\n    const form = findProductForm();\n    if(!form) return false;\n\n    \/\/ If theme uses a disabled add button until variant selected, our job is still to submit.\n    \/\/ requestSubmit will respect validation, but not theme JS states.\n    try{\n      if(typeof form.requestSubmit === \"function\"){\n        form.requestSubmit();\n      } else {\n        form.submit();\n      }\n      return true;\n    } catch(e){\n      try { form.submit(); return true; } catch(_) { return false; }\n    }\n  }\n\n  \/\/ Lock: requestSubmit + MutationObserver fallback\n  function atcWithObserverFallback(){\n    const ok = submitRealCartForm();\n    if(ok) return;\n\n    \/\/ Wait for product form to be injected \/ re-rendered\n    const obs = new MutationObserver(() =\u003e {\n      const formNow = findProductForm();\n      if(formNow){\n        obs.disconnect();\n        submitRealCartForm();\n      }\n    });\n    obs.observe(document.documentElement, {childList:true, subtree:true});\n    \/\/ Safety disconnect\n    setTimeout(() =\u003e { try{ obs.disconnect(); }catch(e){} }, 8000);\n  }\n\n  \/\/ Variant button behavior\n  variantBtns.forEach(btn =\u003e {\n    btn.addEventListener('click', () =\u003e {\n      const color = btn.getAttribute('data-af-color') || \"Grey\";\n      setPressed(color);\n      setHero(color);\n\n      \/\/ Try to sync with Shopify variant UI; if it isn't ready, observe briefly.\n      if(syncShopifyVariant(color)) return;\n\n      const obs = new MutationObserver(() =\u003e {\n        if(syncShopifyVariant(color)){\n          obs.disconnect();\n        }\n      });\n      obs.observe(document.documentElement, {childList:true, subtree:true});\n      setTimeout(() =\u003e { try{ obs.disconnect(); }catch(e){} }, 4000);\n    });\n  });\n\n  \/\/ ATC behavior (both buttons)\n  atcBtns.forEach(b =\u003e {\n    b.addEventListener('click', (e) =\u003e {\n      e.preventDefault();\n\n      \/\/ Make sure selected color attempts to sync before submit\n      const pressed = variantBtns.find(x =\u003e x.getAttribute('aria-pressed') === \"true\");\n      const color = pressed ? pressed.getAttribute('data-af-color') : \"Grey\";\n      syncShopifyVariant(color);\n\n      atcWithObserverFallback();\n    });\n  });\n\n  \/\/ Default hero state\n  setPressed(\"Grey\");\n  setHero(\"Grey\");\n})();\n\u003c\/script\u003e\u003c\/p\u003e","brand":"Aiming Fluid Golf","offers":[{"title":"Black","offer_id":51392263979304,"sku":"sku-42715031273515","price":119.69,"currency_code":"USD","in_stock":true},{"title":"Gray","offer_id":51392264012072,"sku":"sku-42715031306283","price":119.69,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0854\/2152\/3240\/files\/premium_shoe_bag_black.jpg?v=1778891255","url":"https:\/\/www.golfleaguellc.com\/products\/premium-golf-shoe-bag-vented-leather-shoe-storage","provider":"GOLF LEAGUE","version":"1.0","type":"link"}