1<!doctype html> 2<html lang="en"> 3 <head> 4 <!-- Styling script to prevent flash of unstyled content --> 5 <style> 6 /* Immediately apply theme variables to prevent flash */ 7 :root { 8 color-scheme: light dark; 9 } 10 11 :root[data-theme="light"] { 12 --cai-primary: #f4f4f5; 13 --cai-secondary: #18181b; 14 color-scheme: light; 15 } 16 17 :root[data-theme="dark"] { 18 --cai-primary: #18181b; 19 --cai-secondary: #f4f4f5; 20 color-scheme: dark; 21 } 22 23 /* Default to landing page colors */ 24 html, body { 25 color: var(--cai-secondary); 26 background-color: #0f172a; 27 margin: 0; 28 padding: 0; 29 } 30 31 /* Landing page gradient for non-authenticated users - exact match to LandingPage component */ 32 body:not(.authenticated) { 33 background: linear-gradient(135deg, #0f172a 0%, #1e293b 25%, #020617 60%, #000000 100%) !important; 34 } 35 36 /* Override with app background for authenticated users */ 37 body.authenticated { 38 background-color: var(--cai-primary) !important; 39 } 40 41 /* Prevent any potential background overrides from other sources */ 42 body:not(.authenticated) #root, 43 body:not(.authenticated) #root > * { 44 background: transparent !important; 45 } 46 47 /* Hide content until JS loads to prevent flash */ 48 body:not(.theme-ready) #root { 49 visibility: hidden; 50 } 51 52 /* View Transitions API for smooth page navigation */ 53 @view-transition { 54 navigation: auto; 55 } 56 </style> 57 58 <!-- Theme loader script to prevent flash of unstyled content --> 59
59<script> 60 (function() { 61 // Check authentication status from Supabase localStorage 62 function checkAuthStatus() { 63 try { 64 // Check for Supabase auth token 65 const authKey = Object.keys(localStorage).find(key => 66 key.startsWith('sb-') && key.includes('-auth-token') 67 ); 68 69 if (authKey) { 70 const authData = JSON.parse(localStorage.getItem(authKey) || '{}'); 71 return !!(authData.access_token && authData.user); 72 } 73 74 return false; 75 } catch (error) { 76 return false; 77 } 78 } 79 80 // Get theme from localStorage or use system preference 81 let theme; 82 try { 83 const storedTheme = localStorage.getItem('cai-theme-preference'); 84 const useSystemTheme = localStorage.getItem('cai-use-system-theme') === 'true'; 85 if (useSystemTheme) { 86 theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; 87 } else if (storedTheme) { 88 theme = storedTheme; 89 } else { 90 theme = 'dark'; 91 } 92 } catch (error) { 93 theme = 'dark'; 94 } 95 96 // Set theme 97 document.documentElement.setAttribute('data-theme', theme); 98 99 // Wait for body to be available before manipulating it 100 function initializeBodyClasses() { 101 if (!document.body) { 102 // If body doesn't exist yet, wait for it 103 if (document.readyState === 'loading') { 104 document.addEventListener('DOMContentLoaded', initializeBodyClasses); 105 } else { 106 // DOM is ready but body still not available, wait a bit 107 setTimeout(initializeBodyClasses, 1); 108 } 109 return; 110 } 111 112 // Set background based on auth status 113 const isAuthenticated = checkAuthStatus(); 114 if (isAuthenticated) { 115 document.body.classList.add('authenticated'); 116 } 117 // If not authenticated, keep the default landing page gradient 118 119 // Mark as theme ready 120 requestAnimationFrame(function() { 121 document.body.classList.add('theme-ready'); 122 }); 123 } 124 125 // Initialize when DOM is ready 126 if (document.readyState === 'loading') { 127 document.addEventListener('DOMContentLoaded', initializeBodyClasses); 128 } else { 129 initializeBodyClasses(); 130 } 131 })(); 132 </script>
132 133 134 <!-- Rest of the head content remains unchanged --> 135 <meta charset="UTF-8" /> 136 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> 137 <title>Cai Creative, Inc.</title> 138 <meta name="description" content="The world's most intelligent platform for music creation. The future of music is here." /> 139 140 <!-- Canonical URL - Will be dynamically updated by JavaScript --> 141 <link rel="canonical" href="https://www.cai.audio/" /> 142 143 <!-- Open Graph metadata - Wide format only --> 144 <meta property="og:title" content="Cai â The Future of Music is Here." /> 145 <meta property="og:description" content="The world's most intelligent platform for music creation." /> 146 <meta property="og:url" content="https://www.cai.audio" /> 147 <meta property="og:site_name" content="Cai Creative" /> 148 <meta property="og:image" content="https://www.cai.audio/icons/open-graph-image-wide.png" /> 149 <meta property="og:image:width" content="1200" /> 150 <meta property="og:image:height" content="630" /> 151 <meta property="og:image:alt" content="Cai Creative Logo" /> 152 <meta property="og:locale" content="en_US" /> 153 <meta property="og:type" content="website" /> 154 155 <!-- Twitter card metadata - Wide format only --> 156 <meta name="twitter:card" content="summary_large_image" /> 157 <meta name="twitter:title" content="Cai â The Future of Music is Here." /> 158 <meta name="twitter:description" content="The world's most intelligent platform for music creation." /> 159 <meta name="twitter:image" content="https://www.cai.audio/icons/twitter-card-image-wide.png" /> 160 161 <!-- Special tag for thumbnail/icon view in sharing UI --> 162 <link rel="image_src" href="https://www.cai.audio/icons/apple-touch-icon.png" /> 163 164 <!-- Preload legal pages for faster navigation --> 165 <link rel="prefetch" href="/privacy" /> 166 <link rel="prefetch" href="/terms" /> 167 <link rel="prefetch" href="/cookies" /> 168 169 <!-- Icons --> 170 <link rel="icon" href="/favicon.ico" sizes="any" /> 171 <link rel="icon" href="/icons/cai-logo.svg" type="image/svg+xml" media="(max-width: 767px)" /> 172 <link rel="icon" href="/icons/cai-logo-wide.svg" type="image/svg+xml" media="(min-width: 768px)" /> 173 <link rel="apple-touch-icon" href="/icons/apple-touch-icon.png" /> 174 <link rel="icon" href="/icons/favicon-16x16.png" sizes="16x16" type="image/png" /> 175 <link rel="icon" href="/icons/favicon-32x32.png" sizes="32x32" type="image/png" /> 176 <link rel="icon" href="/icons/favicon-48x48.png" sizes="48x48" type="image/png" /> 177 <link rel="icon" href="/icons/favicon-64x64.png" sizes="64x64" type="image/png" /> 178 <link rel="icon" href="/icons/favicon-128x128.png" sizes="128x128" type="image/png" /> 179 <link rel="icon" href="/icons/favicon-256x256.png" sizes="256x256" type="image/png" /> 180 <link rel="icon" href="/icons/favicon-512x512.png" sizes="512x512" type="image/png" /> 181 <link rel="mask-icon" href="/icons/safari-pinned-tab.svg" color="#18181b" /> 182 183 <!-- Web App Manifest --> 184 <link rel="manifest" href="/site.webmanifest" /> 185 186 <!-- Apple web app metadata --> 187 <meta name="apple-mobile-web-app-title" content="Cai" /> 188 <meta name="apple-mobile-web-app-status-bar-style" content="default" /> 189 <meta name="theme-color" content="#000000" /> 190
190<script type="module" crossorigin src="/assets/index-B2t2GiYn.js"></script>
190 191 <link rel="modulepreload" crossorigin href="/assets/fundamental-detector-eOE6r6IZ.js"> 192 <link rel="modulepreload" crossorigin href="/assets/song-scheduler-B44bR_LS.js"> 193 <link rel="modulepreload" crossorigin href="/assets/instrument-player-NxMImQOz.js"> 194 <link rel="modulepreload" crossorigin href="/assets/audio-file-player-CaPcbHD5.js"> 195 <link rel="stylesheet" crossorigin href="/assets/index-uwDfaG3u.css"> 196 </head> 197 198 <body> 199 <div id="root"></div> 200 <div id="voice-mode-overlay"></div> 201 </body> 202</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.