1<!DOCTYPE html> 2<html lang="ru"> 3 4<head> 5 <meta charset="UTF-8" /> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" /> 7 <title>snich.ai</title> 8 <meta name="description" content="РоÑÑийÑÐºÐ°Ñ Ð¿Ð»Ð°ÑÑоÑма видеоÑвÑзи Ñ AI: вÑÑÑеÑи, вебинаÑÑ Ð¸ обÑÑение в бÑаÑзеÑе. SNICH ÑикÑиÑÑÐµÑ ÑеÑениÑ, ÑаздаÑÑ Ð·Ð°Ð´Ð°Ñи и оÑпÑавлÑÐµÑ Ð¸Ñоги ÑÑаÑÑникам ÑеÑез минÑÑÑ Ð¿Ð¾Ñле звонка." /> 9 <meta property="og:type" content="website" /> 10 <meta property="og:site_name" content="SNICH" /> 11 <meta property="og:title" content="SNICH â вÑÑÑеÑи и вебинаÑÑ, коÑоÑÑе заканÑиваÑÑÑÑ ÑезÑлÑÑаÑом" /> 12 <meta property="og:description" content="РоÑÑийÑÐºÐ°Ñ Ð¿Ð»Ð°ÑÑоÑма видеоÑвÑзи Ñ AI: ÑеÑениÑ, задаÑи и иÑоги â ÑеÑез минÑÑÑ Ð¿Ð¾Ñле звонка." /> 13 <meta property="og:image" content="https://snich.ai/og-default.png" /> 14 <meta property="og:image:width" content="1200" /> 15 <meta property="og:image:height" content="630" /> 16 <meta name="twitter:card" content="summary_large_image" /> 17 <link rel="icon" type="image/png" sizes="64x64" href="/brand/favicon-64.png?v=2" /> 18 <link rel="icon" type="image/png" sizes="32x32" href="/brand/favicon-32.png?v=2" /> 19 <link rel="icon" type="image/svg+xml" href="/brand/favicon.svg?v=2" /> 20 <link rel="apple-touch-icon" href="/brand/apple-touch-icon.png" /> 21
21<script> 22 if (window.performance && performance.mark) performance.mark('snich:boot:html'); 23 </script>
23 24 <!-- Fonts load without blocking first paint: the stylesheet is fetched at 25 low priority (media="print") and applied once ready. --> 26 <link rel="preconnect" href="https://fonts.googleapis.com" /> 27 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> 28 <link rel="stylesheet" 29 href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Manrope:wght@400;500;600;700;800&family=Rubik:wght@500;700;800&family=Onest:wght@400;500;600;700&family=Unbounded:wght@500;600;700&family=JetBrains+Mono:wght@500;600&display=swap" 30 media="print" onload="this.media='all'" /> 31 <noscript> 32 <link rel="stylesheet" 33 href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Manrope:wght@400;500;600;700;800&family=Rubik:wght@500;700;800&family=Onest:wght@400;500;600;700&family=Unbounded:wght@500;600;700&family=JetBrains+Mono:wght@500;600&display=swap" /> 34 </noscript> 35 <style> 36 body { 37 font-family: 'Inter', sans-serif; 38 background-color: #181a1b; 39 color: white; 40 overflow-x: hidden; 41 overflow-y: auto; 42 -webkit-overflow-scrolling: touch; 43 } 44 45 /* Prevent text size adjustment on orientation change */ 46 html { 47 -webkit-text-size-adjust: 100%; 48 -moz-text-size-adjust: 100%; 49 text-size-adjust: 100%; 50 } 51 52 /* Custom scrollbar */ 53 ::-webkit-scrollbar {
54 width: 6px; 55 height: 6px; 56 } 57 58 ::-webkit-scrollbar-track { 59 background: #2b2d30; 60 } 61 62 ::-webkit-scrollbar-thumb { 63 background: #555; 64 border-radius: 3px; 65 } 66 67 ::-webkit-scrollbar-thumb:hover { 68 background: #777; 69 } 70 71 /* Improve touch targets */ 72 @media (hover: none) and (pointer: coarse) { 73 74 button, 75 a, 76 select { 77 min-height: 44px; 78 } 79 } 80 81 /* Boot loader: pure CSS, visible from the first painted frame until React 82 mounts and replaces #root's content. */ 83 #snich-boot-loader { 84 position: fixed; 85 inset: 0; 86 display: flex; 87 flex-direction: column; 88 align-items: center; 89 justify-content: center; 90 gap: 18px; 91 background: #F4F3EF; 92 z-index: 2147483000; 93 } 94 95 #snich-boot-loader .snich-boot-brand { 96 display: flex; 97 align-items: center; 98 gap: 12px; 99 font-family: 'Unbounded', 'Onest', -apple-system, sans-serif; 100 font-size: 26px; 101 font-weight: 600; 102 letter-spacing: -0.015em; 103 color: #141619; 104 } 105 106 #snich-boot-loader .snich-boot-brand img { 107 width: 44px; 108 height: 44px; 109 display: block; 110 } 111 112 #snich-boot-loader .snich-boot-brand b { 113 font-weight: inherit; 114 } 115 116 #snich-boot-loader .snich-boot-brand span { 117 color: #D52F3A; 118 } 119 120 #snich-boot-loader .snich-boot-spinner { 121 width: 30px; 122 height: 30px; 123 border-radius: 50%; 124 border: 3px solid rgba(20, 22, 25, 0.1); 125 border-top-color: #0A72C6; 126 animation: snich-boot-spin 0.9s linear infinite; 127 } 128 129 #snich-boot-loader .snich-boot-text { 130 font-family: 'Onest', 'Inter', -apple-system, sans-serif; 131 font-size: 14px; 132 font-weight: 500; 133 color: #6A7079; 134 } 135 136 /* Appears only when loading takes suspiciously long. */ 137 #snich-boot-loader .snich-boot-slow-hint { 138 font-family: 'Onest', 'Inter', -apple-system, sans-serif; 139 font-size: 12px; 140 color: #868D96; 141 opacity: 0; 142 animation: snich-boot-appear 0.4s ease 15s forwards; 143 } 144 145 @keyframes snich-boot-spin { 146 to { 147 transform: rotate(360deg); 148 } 149 } 150 151 @keyframes snich-boot-appear { 152 to { 153 opacity: 1; 154 } 155 } 156 </style> 157 158 <!-- pdf.js and JSZip are injected on demand by utils/externalLibs.ts when a 159 PDF/PPTX upload actually needs them. Keeping them out of <head> removes 160 two parser-blocking CDN requests from the critical path. --> 161 162
162<script> 163 (function () { 164 var hash = window.location.hash || ''; 165 if (hash.indexOf('#/') !== 0) return; 166 167 var next = hash.slice(1); 168 var hostname = window.location.hostname; 169 var isLocal = hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '0.0.0.0' || hostname.endsWith('.localhost'); 170 171 if (isLocal) { 172 window.history.replaceState(null, '', next); 173 return; 174 } 175 176 var appOrigin = 'https://app.snich.ai'; 177 var meetOrigin = 'https://meet.snich.ai'; 178 var eventsOrigin = 'https://events.snich.ai'; 179 180 if (next.indexOf('/meet/') === 0 || next.indexOf('/join/') === 0 || next.indexOf('/meeting/') === 0) { 181 var roomId = next.split('/').filter(Boolean).pop(); 182 window.location.replace(meetOrigin + '/' + encodeURIComponent(roomId || '')); 183 return; 184 } 185 186 if (next.indexOf('/e/') === 0) { 187 var slug = next.replace(/^\/e\//, ''); 188 window.location.replace(eventsOrigin + '/' + slug); 189 return; 190 } 191 192 window.location.replace(appOrigin + next); 193 })(); 194 </script>
194 195
195<script type="importmap"> 196{ 197 "imports": { 198 "@google/genai": "https://esm.sh/@google/[email protected]", 199 "lucide-react": "https://esm.sh/[email protected]", 200 "react/": "https://esm.sh/[email protected]/", 201 "react": "https://esm.sh/[email protected]", 202 "react-dom/": "https://esm.sh/[email protected]/", 203 "react-router-dom": "https://esm.sh/[email protected]" 204 } 205} 206</script>
206 207
207<script type="module" crossorigin src="/assets/main-f15583bd.js"></script>
207 208 <link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-3cfb730f.js"> 209 <link rel="modulepreload" crossorigin href="/assets/vendor-react-72e4a099.js"> 210 <link rel="modulepreload" crossorigin href="/assets/buildLifecycle-a44b0e05.js"> 211 <link rel="stylesheet" href="/assets/buildLifecycle-ced147ba.css"> 212</head> 213 214<body> 215 <div id="root"> 216 <div id="snich-boot-loader"> 217 <div class="snich-boot-brand"><img src="/brand/snich-mark.svg" alt="" width="44" height="44" /><b>snich<span>.</span>ai</b></div> 218 <div class="snich-boot-spinner"></div> 219 <div class="snich-boot-text">ÐагÑÑжаемâ¦</div> 220 <div class="snich-boot-slow-hint">Ðолго гÑÑзиÑÑÑ? ÐÑовеÑÑÑе ÑеÑÑ Ð¸Ð»Ð¸ обновиÑе ÑÑÑаниÑÑ.</div> 221 </div> 222 </div> 223 224</body> 225 226</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.