1<!doctype html> 2<html lang="en" class="dark"> 3 <head> 4 <meta charset="UTF-8" /> 5 <link rel="icon" type="image/webp" href="/favicon.webp" /> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 7 <title>Whale</title> 8 <!-- 9 Telegram Mini App detection, ported verbatim from the reference boot shell (`app.html:68-81`). 10 Telegram appends `#tgWebAppVersion=â¦` to the launch URL, so a hash carrying it means we are 11 running inside a Mini App. This MUST run before `main.tsx`: `core/device` caches `getDevice()` 12 on first read, and the whole TELEGRAM branch (initData â /auth-sync/tgapp-sync auth, the TG 13 SDK, back-button wiring) gates on `localStorage.isTelegramApplication` being set here. 14 It also stays FIRST in <head> â everything below (the boot-shell CSS) is presentation only. 15 --> 16
16<script> 17 (function () { 18 try { 19 var launchParams = new URLSearchParams(window.location.hash.slice(1)); 20 21 if ( 22 launchParams.has('tgWebAppVersion') || 23 launchParams.has('tgWebAppData') || 24 launchParams.has('tgWebAppPlatform') 25 ) { 26 localStorage.setItem('isTelegramApplication', 'true'); 27 } 28 } catch (error) { 29 console.error('Telegram detection error:', error); 30 } 31 })(); 32 </script>
32 33 <!-- 34 Critical CSS for the boot shell, ported from the reference `app.html:27-67`. In the built 35 artifact vite emits app.css as a blocking <link>, but the JS module graph still takes far 36 longer than TTFB â without this block the document is a bare white page until React mounts. 37 `#13161e` is the same `--color-bg-primary` default the port ships in `styles/theme.css:19` 38 (and the reference's pre-theme `:root` value), so the shell matches the app's first frame. 39 --> 40 <style> 41 html, 42 body { 43 margin: 0; 44 min-height: 100dvh; 45 background-color: var(--color-bg-primary, #13161e); 46 color: var(--text-fill-color, #ffffff); 47 } 48 49 #app-shell { 50 position: fixed; 51 inset: 0; 52 z-index: 2147483647; 53 display: flex; 54 align-items: center; 55 justify-content: center; 56 background-color: var(--color-bg-primary, #13161e); 57 } 58 59 #app-shell[hidden] { 60 display: none; 61 } 62 63 #app-shell svg { 64 width: 44px; 65 height: 44px; 66 animation: app-shell-spin 900ms linear infinite; 67 } 68 69 @keyframes app-shell-spin { 70 to { 71 transform: rotate(360deg); 72 } 73 } 74 75 @media (prefers-reduced-motion: reduce) { 76 #app-shell svg { 77 animation: none; 78 } 79 } 80 </style> 81
81<script type="module" crossorigin src="/assets/index-CiajkjIR.js"></script>
81 82 <link rel="stylesheet" crossorigin href="/assets/index-DjByUfik.css"> 83 </head> 84 <body> 85 <div id="root"></div> 86 <!-- 87 Boot shell, ported from the reference `app.html:86-121`. A SIBLING of the React mount point, 88 never a child: `createRoot(container).render()` wipes `#root`, and the prerender plugin 89 (`vite/prerenderStaticPages.ts:buildPageHtml`) rewrites the exact string 90 `<div id="root"></div>` â the shell must not disturb either. 91 92 It is a fixed overlay rather than a content-shaped skeleton on purpose (reference 93 `app.html:89-100`): an inline SVG paints at roughly TTFB instead of waiting on the JS module 94 graph; because it is out of flow, removing it shifts nothing (no CLS). 95 96 Removed by `App`'s boot effect as soon as the first React commit lands (the reference tears 97 it down at `+layout.svelte:241-246`). The script below is a pure failsafe so a regression in 98 that path can never strand a user behind the overlay. 99 --> 100 <div id="app-shell" role="status" aria-label="Loading"> 101 <svg viewBox="0 0 44 44" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> 102 <circle cx="22" cy="22" r="19" stroke="currentColor" stroke-opacity="0.15" stroke-width="4" /> 103 <path 104 d="M41 22c0-10.493-8.507-19-19-19" 105 stroke="currentColor" 106 stroke-opacity="0.7" 107 stroke-width="4" 108 stroke-linecap="round" 109 /> 110 </svg> 111 </div> 112
112<script> 113 (function () { 114 var shell = document.getElementById('app-shell'); 115 116 if (!shell) { 117 return; 118 } 119 120 /* 121 * Prerendered legal pages (`vite/prerenderStaticPages.ts`) bake their content INTO 122 * `#root`, precisely to avoid a blank frame â covering that content with a spinner until 123 * React mounts would defeat the prerender. NO REFERENCE: the reference overlays its 124 * prerendered pages too (`app.html` is the template for every SvelteKit output file); 125 * deliberate deviation, agreed scope of the boot-shell task. Belt and braces with the 126 * build-time `hidden` the prerender plugin injects (`buildPageHtml`), so even a stale 127 * cached shell never hides baked content. 128 */ 129 var root = document.getElementById('root'); 130 131 if (root && root.firstElementChild) { 132 shell.hidden = true; 133 134 return; 135 } 136 137 /* Reference `app.html:114-121` â the 15s failsafe. */ 138 setTimeout(function () { 139 shell.hidden = true; 140 }, 15000); 141 })(); 142 </script>
142 143 </body> 144</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.