1<!DOCTYPE html> 2<html lang="en"> 3 <head> 4 <meta charset="UTF-8" /> 5 <meta name="referrer" content="strict-origin-when-cross-origin" /> 6 <!-- Viewport settings (viewport-fit=cover for iOS notch support) --> 7 <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> 8 <meta name="facebook-domain-verification" content="xwtvzvjwrg05zqyl0f8g5y34c507km" /> 9 <meta name="apple-mobile-web-app-capable" content="yes" /> 10 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> 11 12 <title>ShowFloor AI | Professional Floor Visualization</title> 13 <meta name="description" content="Show clients their new floor before you install it. Photorealistic flooring visualizations, proposals, and one-tap acceptance for contractors." /> 14 15 <!-- Open Graph tags --> 16 <meta property="og:title" content="ShowFloor AI | Close More Flooring Deals" /> 17 <meta property="og:description" content="Show clients their new floor before you install it. Photorealistic flooring visualizations, proposals, and one-tap acceptance for contractors." /> 18 <meta property="og:type" content="website" /> 19 <meta property="og:url" content="https://app.showfloor.ai" /> 20 <meta property="og:site_name" content="ShowFloor AI" /> 21 <meta property="og:image" content="https://app.showfloor.ai/og-image-v5.jpg" /> 22 <meta property="og:image:secure_url" content="https://app.showfloor.ai/og-image-v5.jpg" /> 23 <meta property="og:image:type" content="image/jpeg" /> 24 <meta property="og:image:width" content="1200" /> 25 <meta property="og:image:height" content="630" /> 26 <meta property="og:image:alt" content="ShowFloor AI logo over a before-and-after garage floor visualization" /> 27 28 <!-- Twitter Card tags --> 29 <meta name="twitter:card" content="summary_large_image" /> 30 <meta name="twitter:title" content="ShowFloor AI | Close More Flooring Deals" /> 31 <meta name="twitter:description" content="Show clients their new floor before you install it. Photorealistic flooring visualizations, proposals, and one-tap acceptance for contractors." /> 32 <meta name="twitter:image" content="https://app.showfloor.ai/og-image-v5.jpg" /> 33 <meta name="twitter:image:alt" content="ShowFloor AI logo over a before-and-after garage floor visualization" /> 34 35 <!-- SEO --> 36 <link rel="canonical" href="https://app.showfloor.ai" /> 37 <meta name="robots" content="index, follow" /> 38 39 <!-- PWA Manifest --> 40 <link rel="manifest" href="/manifest.webmanifest" /> 41 <meta name="theme-color" content="#F97316" /> 42 <link rel="icon" type="image/svg+xml" href="/logo.svg?v=4" /> 43 <link rel="apple-touch-icon" href="/pwa-192x192.png?v=4" /> 44 45 <!-- Structured Data --> 46
46<script type="application/ld+json"> 47 { 48 "@context": "https://schema.org", 49 "@type": "SoftwareApplication", 50 "name": "ShowFloor AI", 51 "applicationCategory": "BusinessApplication", 52 "operatingSystem": "Web", 53 "url": "https://app.showfloor.ai", 54 "description": "AI-powered floor visualization tool for flooring contractors. Upload a photo, pick a material, get a photorealistic preview in seconds.", 55 "offers": { 56 "@type": "AggregateOffer", 57 "priceCurrency": "USD", 58 "lowPrice": "0", 59 "highPrice": "149", 60 "offerCount": "3" 61 }, 62 "creator": { 63 "@type": "Organization", 64 "name": "ShowFloor AI", 65 "url": "https://www.showfloor.ai" 66 } 67 } 68 </script>
68 69 70 <!-- Google Fonts â Inter is the unified product font. Outfit was 71 retired as a display face in Task 1 of the 2026-04-17 launch UI 72 plan (see client/src/index.css); do not reintroduce it here. --> 73 <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet" /> 74 <!-- Marketing analytics load from the app only after sensitive auth and 75 capability URLs have been excluded. See lib/marketingAnalytics.ts. --> 76
76<script type="module" crossorigin src="/assets/index-DcQpqDRc.js"></script>
76 77 <link rel="modulepreload" crossorigin href="/assets/query-CYOR7zGO.js"> 78 <link rel="modulepreload" crossorigin href="/assets/supabase-B3MrfvGd.js"> 79 <link rel="modulepreload" crossorigin href="/assets/ui-vendor-B7dXr53s.js"> 80 <link rel="modulepreload" crossorigin href="/assets/react-vendor-5heRg20C.js"> 81 <link rel="modulepreload" crossorigin href="/assets/lucide-Da0VTTkw.js"> 82 <link rel="stylesheet" crossorigin href="/assets/index-CqAXPZpT.css"> 83 </head> 84 <body> 85 <div id="root"></div> 86 <!-- Inline version check: runs BEFORE React loads to bust stale bundles. 87 index.html has no-store headers so this script is always fresh from the server. 88 Compares server buildId with localStorage; if different, clears caches and reloads. --> 89
89<script> 90 (function(){ 91 var KEY='sf_known_build'; 92 // A framed shopper journey owns in-memory photo/request state. Keep 93 // this exact route policy in parity with hooks/useVersionCheck.ts. 94 function isPublicVisualizerEmbed(){return /^\/embed\/showroom\/[^/]+\/?$/.test(window.location.pathname)} 95 if(isPublicVisualizerEmbed())return; 96 try{ 97 fetch('/api/version').then(function(r){return isPublicVisualizerEmbed()?null:r.json()}).then(function(d){ 98 if(isPublicVisualizerEmbed()||!d)return; 99 var serverBuild=d.buildId||''; 100 if(!serverBuild||serverBuild==='unknown')return; 101 var knownBuild=localStorage.getItem(KEY)||''; 102 if(knownBuild&&knownBuild!=='unknown'&&knownBuild===serverBuild)return; 103 localStorage.setItem(KEY,serverBuild); 104 if(!knownBuild||knownBuild==='unknown')return; // First visit or pre-fix client, just store 105 // Build changed â purge caches and reload 106 if('caches' in window){caches.keys().then(function(n){if(isPublicVisualizerEmbed())return;n.forEach(function(k){caches.delete(k)})})} 107 window.location.reload(); 108 }).catch(function(){}); 109 }catch(e){} 110 })(); 111 </script>
111 112 </body> 113</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.