<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
    <meta name="description" content="Discover and book community events, buy from your society marketplace — all in one place." />
    <meta name="theme-color" content="#00B894" media="(prefers-color-scheme: light)" />
    <meta name="theme-color" content="#00B894" />
    <meta name="color-scheme" content="light" />
    <meta name="mobile-web-app-capable" content="yes" />
    <meta name="application-name" content="TicVento" />
    <meta name="apple-mobile-web-app-capable" content="yes" />
    <meta name="apple-mobile-web-app-status-bar-style" content="default" />
    <meta name="apple-mobile-web-app-title" content="TicVento" />
    <link rel="apple-touch-icon" href="/icons/buyer/buyer-apple-touch-icon.png" />
    <link rel="icon" type="image/png" sizes="32x32" href="/icons/buyer/buyer-favicon-32x32.png" />
    <link rel="manifest" href="/manifest-buyer.json" />
    <link rel="preconnect" href="https://api.ticvento.com" crossorigin />
    <!-- API warm-up. use-credentials matches apiClient / the store-page head start
         (credentials: include) — browsers pool credentialed and anonymous
         connections separately, so an anonymous preconnect would not be reused. -->
    <link rel="preconnect" href="https://api.ticvento.com" crossorigin="use-credentials" />
    <link rel="preconnect" href="https://auth.ticvento.com" crossorigin />
    <link rel="preconnect" href="https://www.googleapis.com" crossorigin />
    <link rel="preconnect" href="https://fonts.googleapis.com" />
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
    <link rel="dns-prefetch" href="https://firebasestorage.googleapis.com" />
    <title>TicVento</title>

    <!-- Startup splash hand-off (src/components/AppSplash). Installed app, first
         load of the session only: preload the splash logo and hold a white
         cover until React's first render replaces #root, so nothing grey or
         blank flashes after the native launch screen. Browser tabs: no-op.
         'tv_boot_splash_shown' must match src/components/AppSplash/bootState.ts. -->
    <style>.tv-boot-cover{display:none}html[data-boot-splash] .tv-boot-cover{display:block;position:fixed;inset:0;z-index:20000;background:#FFFFFF}</style>
    <script>
      (function(){try{
        var standalone=window.matchMedia('(display-mode: standalone)').matches||navigator.standalone===true;
        if(!standalone||sessionStorage.getItem('tv_boot_splash_shown')==='1')return;
        document.documentElement.setAttribute('data-boot-splash','');
        var l=document.createElement('link');l.rel='preload';l.as='image';l.type='image/webp';l.href='/icons/splash-logo.webp';document.head.appendChild(l);
      }catch(e){}})();
    </script>

    <!-- Store-page data head start (/marketplace/:slug). Fires the public
         listing request the moment the HTML is parsed — in parallel with the
         JS bundles instead of after them. Consumed (once) by
         src/services/marketplaceListing.service.ts; the path rules and URL
         here must stay in sync with that file and API.MARKETPLACE_EVENT. -->
    <script>
      (function(){try{
        var m=/^\/marketplace\/([^/]+)\/?$/.exec(location.pathname);if(!m)return;
        var id=decodeURIComponent(m[1]);
        if(!id||/^(category|bulk|orders|feedback|checkout)$/.test(id)||/\.html$/.test(id))return;
        var base='https://api.ticvento.com';if(!base||base.indexOf('%')!==-1)base='https://api.ticvento.com';
        window.__tvListingPrefetch={eventId:id,at:Date.now(),promise:fetch(base+'/api/recurring-events/public/'+id,{credentials:'include'})
          .then(function(r){return r.ok?r.json():null}).catch(function(){return null})};
      }catch(e){}})();
    </script>
    <script>
      (function(){var fs=localStorage.getItem('eg-buyer-font-size');if(fs)document.documentElement.setAttribute('data-fs',fs);})();
    </script>
    <!-- Poppins (app UI) + DM Sans (public listing header parity with ticvento.com/marketplace) -->
    <link rel="preload" href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=Poppins:wght@400;500;600;700;800&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet'" />
    <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=Poppins:wght@400;500;600;700;800&display=swap" /></noscript>
    <!-- Cloudflare Web Analytics. Token comes from VITE_CF_BEACON_TOKEN, set
         per Cloudflare Pages project (Production env only) — empty in dev,
         so nothing is loaded locally. -->
    <script>
      // Guard against '%' too: if the build never defined VITE_CF_BEACON_TOKEN
      // (no .env entry, no Cloudflare Pages env var), Vite leaves the raw
      // "ad62aaf1d245477e8ea4552667527f17" placeholder in place instead of blanking it.
      var cfBeaconToken = 'ad62aaf1d245477e8ea4552667527f17';
      if (cfBeaconToken && cfBeaconToken.charAt(0) !== '%') {
        var cfBeacon = document.createElement('script');
        cfBeacon.type = 'module';
        cfBeacon.src = 'https://static.cloudflareinsights.com/beacon.min.js';
        cfBeacon.setAttribute('data-cf-beacon', JSON.stringify({ token: cfBeaconToken }));
        document.head.appendChild(cfBeacon);
      }
    </script>
    <script type="module" crossorigin src="/assets/index-B8ZkcdS3.js"></script>
    <link rel="modulepreload" crossorigin href="/assets/vendor-react-0huTDSlU.js">
    <link rel="modulepreload" crossorigin href="/assets/vendor-firebase-DLAwbEZi.js">
    <link rel="stylesheet" crossorigin href="/assets/style-DCZKEJ2r.css">
  </head>
  <body>
    <div id="root"><div class="tv-boot-cover"></div></div>
  </body>
</html>
