The reader's question is answered entirely by data already on the device and countdowns run off the local clock, so losing signal should not lose the app. The shell is cache-first; the feed is network-first falling back to the last copy seen, because stale events beat a blank screen. Webfonts are cached too — without them an offline load silently drops to system faces and the whole thing changes character. Offline is surfaced in the header and above the footer rather than hidden: stale data must never be presented as current. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
28 lines
1.1 KiB
HTML
28 lines
1.1 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
|
<title>Event Clock — gacha events by what expires next</title>
|
|
<meta
|
|
name="description"
|
|
content="Live and upcoming events across your gacha games, sorted by what ends soonest."
|
|
/>
|
|
<meta name="theme-color" content="#12141c" />
|
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
<link
|
|
href="https://fonts.googleapis.com/css2?family=Chakra+Petch:wght@500;600;700&family=Public+Sans:ital,wght@0,400;0,500;0,600;1,400&display=swap"
|
|
rel="stylesheet"
|
|
/>
|
|
<link rel="manifest" href="/manifest.webmanifest" />
|
|
<link rel="icon" href="/icon.svg" type="image/svg+xml" />
|
|
<link rel="apple-touch-icon" href="/icon.svg" />
|
|
<link rel="stylesheet" href="/styles.css" />
|
|
</head>
|
|
<body>
|
|
<div id="root"></div>
|
|
<script type="module" src="/main.js"></script>
|
|
</body>
|
|
</html>
|