1<!doctype html> 2<html lang="en"> 3 <head> 4 <meta charset="UTF-8" /> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" /> 6
6<script> 7 // Canonical-host guard: the default Lovable hostname is used by Cloudflare 8 // as an internal origin, so send direct visitors to the canonical domain. 9 // Exact hostname match only â preview hosts are never redirected. 10 (function () { 11 if (window.location.hostname === 'lux-expose.lovable.app') { 12 window.location.replace( 13 'https://luxexpose.com' + 14 window.location.pathname + 15 window.location.search + 16 window.location.hash 17 ); 18 } 19 })(); 20 </script>
20 21
21<script> 22 // Recovery links may be configured to return to the site root. Move a 23 // credential-bearing recovery callback before the auth client boots so 24 // it can only be consumed by the dedicated reset page. 25 (function () { 26 if (window.location.pathname === '/reset-password') return; 27 var search = new URLSearchParams(window.location.search); 28 var hash = new URLSearchParams(window.location.hash.replace(/^#/, '')); 29 var hasPkceRecovery = search.get('type') === 'recovery' && !!search.get('code'); 30 var hasImplicitRecovery = hash.get('type') === 'recovery' && !!hash.get('access_token'); 31 if (!hasPkceRecovery && !hasImplicitRecovery) return; 32 window.location.replace('/reset-password' + window.location.search + window.location.hash); 33 })(); 34 </script>
34 35 <meta name="theme-color" content="#000000" /> 36 <meta name="apple-mobile-web-app-capable" content="yes" /> 37 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> 38 <meta name="mobile-web-app-capable" content="yes" /> 39 40 <!-- CRITICAL: Resource Hints for LCP Performance. 41 Only genuinely critical origins are preconnected (max 4). Fonts are 42 self-hosted from this origin, so no Google Fonts origins are needed. 43 SEOHead must never add more hints at runtime. --> 44 <link rel="preconnect" href="https://ppmdgygupuzthqxfippv.supabase.co" crossorigin> 45 <link rel="preconnect" href="https://www.googletagmanager.com"> 46 47 <!-- Exactly the two above-the-fold faces: Inter 400 (body/meta) and 48 Cormorant Garamond 600 (article + category H1). Every other weight is 49 loaded lazily after first paint, so no duplicate weight competes with 50 the LCP text. --> 51 <link rel="preload" as="font" type="font/woff2" href="/fonts/inter-latin-400-normal.woff2" crossorigin> 52 <link rel="preload" as="font" type="font/woff2" href="/fonts/cormorant-garamond-latin-600-normal.woff2" crossorigin> 53 54 <!-- PWA Manifest --> 55 <link rel="manifest" href="/manifest.webmanifest" /> 56 <link rel="icon" type="image/x-icon" href="/favicon.ico" /> 57 <link rel="icon" type="image/png" sizes="192x192" href="/favicon-192.png" /> 58 <link rel="icon" type="image/png" sizes="512x512" href="/favicon.png" /> 59 <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" /> 60 61 <title>Lux Exposé | Private Concierge & Luxury Experiences</title> 62 <meta name="description" content="Private concierge for luxury travel, villas, aviation, dining, events and rare experiences, personally reviewed and coordinated by Lux Exposé." /> 63 <meta name="author" content="Lux Exposé" /> 64 <!-- No hard-coded canonical here. This SPA shell is served for EVERY route, 65 so a static canonical would self-canonicalize all article/hub URLs to "/". 66 Google's guidance for client-rendered apps is to omit the source canonical 67 and let the runtime (SEOHead/Helmet) emit the correct self-canonical. --> 68 69 <!-- Google Search Console verification --> 70 <meta name="google-site-verification" content="8X8o0BSZBBY4koehU7oArvZG5rHX6b4M5jkefCMGmek" /> 71 72 <!-- Open Graph / Facebook --> 73 <meta property="og:type" content="website" /> 74 <meta property="og:site_name" content="Lux Exposé" /> 75 <!-- og:url dedupes by property, so SEOHead replaces it per route. --> 76 <meta property="og:url" content="https://luxexpose.com/" /> 77 <meta property="og:title" content="Lux Exposé | Private Concierge & Luxury Experiences" /> 78 <meta property="og:description" content="Private concierge for luxury travel, villas, aviation, dining, events and rare experiences, personally reviewed and coordinated by Lux Exposé." /> 79 <!-- No static og:image*/twitter:image* here. This SPA shell is served for 80 EVERY route, so a hard-coded homepage social image was advertised on 81 article URLs before React mounted (Apple/iMessage previews captured it 82 and produced a split two-image collage). The homepage image now comes 83 from its runtime SEOHead; known crawlers get it from the prerender. --> 84 85 <!-- Twitter --> 86 <meta name="twitter:card" content="summary_large_image" /> 87 <meta name="twitter:site" content="@luxexpose" /> 88 <meta name="twitter:url" content="https://luxexpose.com/" /> 89 <meta name="twitter:title" content="Lux Exposé | Private Concierge & Luxury Experiences" /> 90 <meta name="twitter:description" content="Private concierge for luxury travel, villas, aviation, dining, events and rare experiences, personally reviewed and coordinated by Lux Exposé." /> 91 92 <!-- CRITICAL: inline above-the-fold CSS for the shared article and category 93 templates. Keep this small: background, header space, breadcrumb, 94 metadata, H1 and the 16:9 hero reservation only. The full generated 95 stylesheet is loaded non-blockingly (see vite.config.ts) with a 96 <noscript> fallback, so this block is what prevents an unstyled flash. --> 97 <style> 98 @font-face{font-family:'Inter';font-style:normal;font-weight:400;font-display:swap;src:url('/fonts/inter-latin-400-normal.woff2') format('woff2');
98unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD} 99 @font-face{font-family:'Cormorant Garamond';font-style:normal;font-weight:600;font-display:swap;src:url('/fonts/cormorant-garamond-latin-600-normal.woff2') format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD} 100 :root{--background:0 0% 0%;--foreground:0 0% 98%;--muted-foreground:0 0% 65%;--luxury-gold:43 74% 52%} 101 *,::before,::after{box-sizing:border-box} 102 html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:Inter,system-ui,sans-serif} 103 body{margin:0;background:hsl(var(--background));color:hsl(var(--foreground));font-family:Inter,system-ui,sans-serif} 104 img,svg{display:block;max-width:100%} 105 #root{min-height:100vh} 106 /* Pre-paint shell: emitted by the prerender edge function inside #root so 107 the real article/category H1 exists in the initial HTML. React replaces 108 it in its first commit; the geometry below matches the mounted layout. */ 109 .lux-pp{padding-top:76px} 110 @media(max-width:767px){.lux-pp{padding-top:62px}} 111 .lux-pp-wrap{max-width:820px;margin:0 auto;padding:2.5rem 1.25rem 0} 112 .lux-pp-crumbs{font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:hsl(var(--muted-foreground));margin:0 0 1.25rem} 113 .lux-pp-h1{font-family:'Cormorant Garamond',Georgia,serif;font-weight:600;line-height:1.08;letter-spacing:-.01em;margin:0 0 1rem;font-size:clamp(2rem,6vw,3.5rem)} 114 .lux-pp-meta{font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:hsl(var(--muted-foreground));margin:0 0 2rem} 115 .lux-pp-hero{width:100%;aspect-ratio:16/9;background:hsl(0 0% 7%)} 116 /* Homepage pre-paint hero. Injected into #root at build time with the 117 content-hashed AVIF of the first cinematic slide so the LCP element 118 exists before the React bundle executes. Geometry matches the mounted 119 ImmersiveHero (full-viewport, object-cover) so React's first commit 120 swaps it without any layout shift. */ 121 .lux-hero-pp{position:absolute;inset:0;height:100vh;overflow:hidden;background:hsl(0 0% 0%)} 122 .lux-hero-pp img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover} 123 </style> 124 125 <!-- Consent Mode v2 - Must load BEFORE GTM --> 126
126<script> 127 (function(w,d){ 128 w.dataLayer=w.dataLayer||[]; 129 w.gtag=function(){w.dataLayer.push(arguments);} 130 w.gtag('consent','default',{ 131 'ad_storage':'denied', 132 'analytics_storage':'denied', 133 'ad_user_data':'denied', 134 'ad_personalization':'denied', 135 'wait_for_update':500 136 }); 137 })(window,document); 138 </script>
138 139 140 <!-- Google Tag Manager â single authoritative analytics loader. 141 Loaded immediately (no idle-callback / 2s deferral) so short visits 142 are measured. Consent Mode v2 defaults above remain "denied"; GTM runs 143 cookieless until ConsentBanner grants consent. --> 144
144<script>
vendor: 358 bytes, lines 144-149
144 145 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 146 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 147 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 148 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 149 })(window,document,'script','dataLayer','
149GTM-M7Q344VJ
vendor: 8 bytes, lines 149-150
149'); 150
150</script>
150 151
151<script type="module" crossorigin src="/assets/index-DqL6WUeV.js"></script>
151 152 <link rel="modulepreload" crossorigin href="/assets/vendor-core-CQ8qaKpM.js"> 153 <link rel="modulepreload" crossorigin href="/assets/vendor-ui-4fpAmGSB.js"> 154 <link rel="modulepreload" crossorigin href="/assets/vendor-db-CAUBq_ny.js"> 155 <link rel="preload" as="style" href="/assets/index-BQT9Ryho.css" crossorigin onload="this.onload=null;this.rel='stylesheet'"> 156 <noscript><link rel="stylesheet" href="/assets/index-BQT9Ryho.css"></noscript><link rel="preload" as="image" type="image/avif" imagesrcset="/assets/hero-private-jet-640-CfrdhOHZ.avif 640w, /assets/hero-private-jet-1280-CBbeumpp.avif 1280w, /assets/hero-private-jet-1920-C9wsoF1Y.avif 1920w" imagesizes="100vw" fetchpriority="high"><meta property="og:image" content="https://pub-bb2e103a32db4e198524a2e9ed8f35b4.r2.dev/lovp_63ewpmnxqz9x48r44bacnvh85w/08e9834fd4a744ee7d755d1922cc2da8_1790875599293.png"><meta name="twitter:image" content="https://pub-bb2e103a32db4e198524a2e9ed8f35b4.r2.dev/lovp_63ewpmnxqz9x48r44bacnvh85w/08e9834fd4a744ee7d755d1922cc2da8_1790875599293.png"></head> 157 158 <body> 159 <!-- Google Tag Manager (noscript) -->
vendor: 72 bytes, lines 159-160
159 160 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
160GTM-M7Q344VJ
vendor: 96 bytes, lines 160-163
160" 161 height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 162 163
163<div id="root"><div class="lux-hero-pp" aria-hidden="true"><img src="/assets/hero-private-jet-1280-CBbeumpp.avif" srcset="/assets/hero-private-jet-640-CfrdhOHZ.avif 640w, /assets/hero-private-jet-1280-CBbeumpp.avif 1280w, /assets/hero-private-jet-1920-C9wsoF1Y.avif 1920w" sizes="100vw" alt="" width="1920" height="1080" fetchpriority="high" decoding="async"></div></div> 164
164<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"4cbf81dfbcbb440b921b572c9f13ee8c","r":1,"spa":2}' crossorigin="anonymous"></script>
164 165</body> 166</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.