PageSourceSearch

https://playwhale.io/

html playwhale.io collected 2026-10-07 00:22:27 UTC 5,000 bytes, 144 lines download raw bytes

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.