PageSourceSearch

https://cai.audio/

html cai.audio collected 2026-10-05 22:37:31 UTC 8,240 bytes, 202 lines download raw bytes

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.