{"product_id":"the-other-white-party-an-evening-with-tom-brady-sr","title":"A Round With Mr. Brady — An Evening with Tom Brady Sr.","description":"\u003cstyle\u003e\n\/* ── Hide the Galleria native variant picker — exact custom element ── *\/\nproduct-variant-selector,\nproduct-variant-selector ~ *,\n[class*=\"product-meta-block\"][class*=\"type:variant_picker\"] {\n  display: none !important;\n  margin: 0 !important;\n  padding: 0 !important;\n  height: 0 !important;\n  overflow: hidden !important;\n}\n\n\/* ── Hide price, stock alert, buy buttons blocks ── *\/\n[class*=\"product-meta-block\"][class*=\"type:price\"],\n[class*=\"product-meta-block\"][class*=\"type:stock_alert\"],\n[class*=\"product-meta-block\"][class*=\"type:buy_buttons\"],\n[class*=\"product-meta-price\"],\n[class*=\"product-stock-alert\"],\n[class*=\"product-form\"],\n[class*=\"shopify-payment-button\"],\n[data-shopify=\"payment-button\"] {\n  display: none !important;\n  margin: 0 !important;\n  padding: 0 !important;\n}\n\n\/* ── Ticket cards ── *\/\n.tp-reset * { box-sizing: border-box; margin: 0; padding: 0; }\n.tp-wrap { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; padding: 8px 0 24px; }\n.tp-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }\n@media (max-width: 640px) { .tp-grid { grid-template-columns: 1fr; } }\n\n.tp-card { background: #FDF5E8; border-radius: 10px; padding: 24px 20px 18px; border: 2px solid #E8DCC8; cursor: pointer; transition: border-color .18s, box-shadow .18s, transform .12s; position: relative; display: flex; flex-direction: column; }\n.tp-card:hover { border-color: #0D2146; box-shadow: 0 4px 18px rgba(13,33,70,.12); transform: translateY(-2px); }\n.tp-card.tp-selected { border: 2.5px solid #0D2146; box-shadow: 0 4px 22px rgba(13,33,70,.18); }\n.tp-card.tp-ga.tp-selected { border: 2.5px solid #9B1219; box-shadow: 0 4px 22px rgba(155,18,25,.18); }\n\n.tp-badge { display: inline-block; font-size: 10px; font-weight: 800; letter-spacing: .10em; text-transform: uppercase; padding: 5px 16px; border-radius: 4px; margin-bottom: 12px; }\n.tp-badge.tp-navy { background: #0D2146; color: #FDF5E8; }\n.tp-badge.tp-red  { background: #9B1219; color: #FDF5E8; }\n\n.tp-price { font-size: 54px; font-weight: 900; line-height: 1; margin-bottom: 4px; letter-spacing: -1px; }\n.tp-vip .tp-price { color: #0D2146; }\n.tp-ga  .tp-price { color: #9B1219; }\n\n.tp-time { font-size: 11px; color: #7A6E60; margin-bottom: 14px; }\n.tp-rule { border: none; border-top: 1px solid #E0D4C0; margin: 0 0 14px; }\n\n.tp-list { list-style: none; flex: 1; }\n.tp-list li { font-size: 13px; color: #2E2A24; padding: 5px 0; border-bottom: 1px solid rgba(13,33,70,.07); display: flex; align-items: flex-start; gap: 8px; line-height: 1.45; }\n.tp-list li:last-child { border-bottom: none; }\n.tp-list li::before { content: '▸'; flex-shrink: 0; margin-top: 1px; font-size: 11px; }\n.tp-vip .tp-list li::before { color: #0D2146; }\n.tp-ga  .tp-list li::before { color: #9B1219; }\n\n.tp-val { background: #0D2146; border-radius: 5px; padding: 9px 12px; text-align: center; font-size: 12px; color: #FDF5E8; margin-top: 14px; font-weight: 600; }\n\n.tp-check { position: absolute; top: 14px; right: 14px; width: 22px; height: 22px; border-radius: 50%; border: 1.5px solid #C8BBAA; display: flex; align-items: center; justify-content: center; font-size: 12px; color: transparent; transition: all .15s; background: #FDF5E8; }\n.tp-vip.tp-selected .tp-check { background: #0D2146; border-color: #0D2146; color: #FDF5E8; }\n.tp-ga.tp-selected  .tp-check { background: #9B1219; border-color: #9B1219; color: #FDF5E8; }\n\n.tp-selected-label { text-align: center; font-size: 12px; color: #7A6E60; margin: 14px 0 6px; }\n.tp-selected-label strong { color: #0D2146; }\n.tp-add-btn { width: 100%; padding: 15px; border-radius: 8px; border: none; font-size: 15px; font-weight: 800; letter-spacing: .05em; text-transform: uppercase; cursor: pointer; transition: opacity .15s, transform .1s; margin-top: 4px; }\n.tp-add-btn:hover { opacity: .88; transform: translateY(-1px); }\n.tp-add-btn:active { transform: scale(.98); }\n.tp-btn-vip { background: #0D2146; color: #FDF5E8; }\n.tp-btn-ga  { background: #9B1219; color: #FDF5E8; }\n\u003c\/style\u003e\n\n\u003cdiv class=\"tp-reset\"\u003e\n\u003cdiv class=\"tp-wrap\"\u003e\n\n  \u003cdiv class=\"tp-grid\" id=\"tp-grid\"\u003e\n    \u003cdiv class=\"tp-card tp-vip tp-selected\" id=\"tp-card-vip\" onclick=\"tpSelect('vip')\" role=\"button\" aria-pressed=\"true\"\u003e\n      \u003cdiv class=\"tp-check\"\u003e✓\u003c\/div\u003e\n      \u003cspan class=\"tp-badge tp-navy\"\u003eVIP Ticket\u003c\/span\u003e\n      \u003cdiv class=\"tp-price\"\u003e$150\u003c\/div\u003e\n      \u003cdiv class=\"tp-time\"\u003e6:00 PM – 9:00 PM\u003c\/div\u003e\n      \u003chr class=\"tp-rule\"\u003e\n      \u003cul class=\"tp-list\"\u003e\n        \u003cli\u003ePrivate cocktail hour with Tom Brady Sr.\u003c\/li\u003e\n        \u003cli\u003eBehind-the-scenes stories\u003c\/li\u003e\n        \u003cli\u003eExclusive photo opportunity\u003c\/li\u003e\n        \u003cli\u003eRingline premium ball marker ($40)\u003c\/li\u003e\n        \u003cli\u003eBoston Sports Apparel golf hat ($48)\u003c\/li\u003e\n        \u003cli\u003eCommemorative wall print ($65)\u003c\/li\u003e\n        \u003cli\u003eFull main event access\u003c\/li\u003e\n      \u003c\/ul\u003e\n      \u003cdiv class=\"tp-val\"\u003e$153 in included value\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"tp-card tp-ga\" id=\"tp-card-ga\" onclick=\"tpSelect('ga')\" role=\"button\" aria-pressed=\"false\"\u003e\n      \u003cdiv class=\"tp-check\"\u003e✓\u003c\/div\u003e\n      \u003cspan class=\"tp-badge tp-red\"\u003eGeneral Admission\u003c\/span\u003e\n      \u003cdiv class=\"tp-price\"\u003e$50\u003c\/div\u003e\n      \u003cdiv class=\"tp-time\"\u003e7:00 PM – 9:00 PM\u003c\/div\u003e\n      \u003chr class=\"tp-rule\"\u003e\n      \u003cul class=\"tp-list\"\u003e\n        \u003cli\u003eLive conversation with Tom Brady Sr.\u003c\/li\u003e\n        \u003cli\u003eUntold stories: G.O.A.T. · Dynasty · Tampa\u003c\/li\u003e\n        \u003cli\u003eAudience Q\u0026amp;A session\u003c\/li\u003e\n        \u003cli\u003eHarpoon Beer Garden\u003c\/li\u003e\n        \u003cli\u003eLive music\u003c\/li\u003e\n        \u003cli\u003eBoston sports trivia\u003c\/li\u003e\n        \u003cli\u003eRingline putting challenge\u003c\/li\u003e\n        \u003cli\u003eSilent auction · Cash bar \u0026amp; menu\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv class=\"tp-selected-label\" id=\"tp-label\"\u003eSelected: \u003cstrong\u003eVIP Ticket — $150\u003c\/strong\u003e\n\u003c\/div\u003e\n  \u003cbutton class=\"tp-add-btn tp-btn-vip\" id=\"tp-btn\" onclick=\"tpAddToCart()\"\u003eAdd to Cart — $150\u003c\/button\u003e\n\n\u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n(function () {\n  var VIP_ID = '52114120573248';\n  var GA_ID  = '52114120606016';\n  var variants = {\n    vip: { id: VIP_ID, price: '$150', label: 'VIP Ticket',        btnClass: 'tp-btn-vip' },\n    ga:  { id: GA_ID,  price: '$50',  label: 'General Admission', btnClass: 'tp-btn-ga'  }\n  };\n  var current = 'vip';\n\n  \/* ── Hard-hide the native product-variant-selector element and its wrapper block ── *\/\n  function hideNative() {\n    \/* The custom element itself *\/\n    document.querySelectorAll('product-variant-selector').forEach(function(el) {\n      var block = el.closest('[class*=\"product-meta-block\"]') || el.parentElement;\n      [el, block].forEach(function(n) {\n        if (!n) return;\n        n.style.setProperty('display',   'none',   'important');\n        n.style.setProperty('margin',    '0',      'important');\n        n.style.setProperty('padding',   '0',      'important');\n        n.style.setProperty('height',    '0',      'important');\n        n.style.setProperty('overflow',  'hidden', 'important');\n      });\n    });\n\n    \/* Price, stock, buy_buttons blocks *\/\n    document.querySelectorAll('[class]').forEach(function(el) {\n      var c = el.className || '';\n      if (c.indexOf('product-meta-block') !== -1 \u0026\u0026\n          (c.indexOf('type:price') !== -1 ||\n           c.indexOf('type:stock_alert') !== -1 ||\n           c.indexOf('type:buy_buttons') !== -1 ||\n           c.indexOf('type:variant_picker') !== -1)) {\n        el.style.setProperty('display',  'none', 'important');\n        el.style.setProperty('margin',   '0',    'important');\n        el.style.setProperty('padding',  '0',    'important');\n      }\n    });\n\n    \/* Inner element fallbacks *\/\n    ['[class*=\"product-meta-price\"]','[class*=\"product-stock-alert\"]',\n     '[class*=\"product-form\"]','[class*=\"shopify-payment-button\"]',\n     '[data-shopify=\"payment-button\"]'].forEach(function(sel) {\n      try {\n        document.querySelectorAll(sel).forEach(function(el) {\n          var p = el.closest('[class*=\"product-meta-block\"]') || el;\n          p.style.setProperty('display', 'none', 'important');\n          p.style.setProperty('margin',  '0',    'important');\n          p.style.setProperty('padding', '0',    'important');\n        });\n      } catch(e) {}\n    });\n  }\n\n  \/* ── Sync native variant state (keeps cart\/price JS in sync even though picker is hidden) ── *\/\n  function syncNative(variantId) {\n    document.querySelectorAll('input[type=\"radio\"], input[type=\"checkbox\"]').forEach(function(inp) {\n      if (inp.value === variantId) {\n        inp.checked = true;\n        inp.dispatchEvent(new Event('change', { bubbles: true }));\n      }\n    });\n    document.querySelectorAll('select[name=\"id\"]').forEach(function(sel) {\n      sel.value = variantId;\n      sel.dispatchEvent(new Event('change', { bubbles: true }));\n    });\n    try {\n      var url = new URL(window.location.href);\n      url.searchParams.set('variant', variantId);\n      window.history.replaceState({}, '', url.toString());\n    } catch(e) {}\n  }\n\n  \/* ── Update card visuals ── *\/\n  function updateCards(type) {\n    ['vip', 'ga'].forEach(function(t) {\n      var card = document.getElementById('tp-card-' + t);\n      if (!card) return;\n      card.classList.toggle('tp-selected', t === type);\n      card.setAttribute('aria-pressed', t === type ? 'true' : 'false');\n    });\n    var v = variants[type];\n    var lbl = document.getElementById('tp-label');\n    if (lbl) lbl.innerHTML = 'Selected: \u003cstrong\u003e' + v.label + ' — ' + v.price + '\u003c\/strong\u003e';\n    var btn = document.getElementById('tp-btn');\n    if (btn) { btn.textContent = 'Add to Cart — ' + v.price; btn.className = 'tp-add-btn ' + v.btnClass; }\n  }\n\n  \/* ── Card click handler ── *\/\n  window.tpSelect = function(type) {\n    current = type;\n    updateCards(type);\n    syncNative(variants[type].id);\n  };\n\n  \/* ── Add to Cart ── *\/\n  window.tpAddToCart = function() {\n    var v = variants[current];\n    var btn = document.getElementById('tp-btn');\n    btn.textContent = 'Adding…'; btn.style.opacity = '.6';\n    fetch('\/cart\/add.js', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application\/json' },\n      body: JSON.stringify({ id: v.id, quantity: 1 })\n    })\n    .then(function(r) { return r.json(); })\n    .then(function() {\n      btn.textContent = '✓ Added to Cart!'; btn.style.opacity = '1';\n      setTimeout(function() { btn.textContent = 'Add to Cart — ' + v.price; btn.style.opacity = '1'; }, 2200);\n      document.dispatchEvent(new CustomEvent('cart:refresh'));\n      document.dispatchEvent(new CustomEvent('theme:cart:open'));\n    })\n    .catch(function() { btn.textContent = 'Add to Cart — ' + v.price; btn.style.opacity = '1'; });\n  };\n\n  \/* ── Init — run immediately, then at 300ms and 800ms to catch lazy rendering ── *\/\n  function init() {\n    hideNative();\n    syncNative(VIP_ID);\n    setTimeout(hideNative, 300);\n    setTimeout(hideNative, 800);\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n\n  \/* ── MutationObserver — re-hide if Galleria re-renders the block via AJAX ── *\/\n  var observer = new MutationObserver(function() { hideNative(); });\n  observer.observe(document.body, { childList: true, subtree: true });\n})();\n\u003c\/script\u003e","brand":"Fan Favorite Sports Apparel","offers":[{"title":"VIP Ticket","offer_id":52114120573248,"sku":"WP2026-VIP","price":150.0,"currency_code":"USD","in_stock":true},{"title":"General Admission","offer_id":52114120606016,"sku":"WP2026-GA","price":50.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0616\/8123\/8201\/files\/ad1.1aspectratio.png?v=1781212705","url":"https:\/\/fanfavorite.com\/products\/the-other-white-party-an-evening-with-tom-brady-sr","provider":"Fan Favorite Sports Apparel","version":"1.0","type":"link"}