2026-03-08 17:41:38 +01:00
|
|
|
<!DOCTYPE html>
|
2026-03-23 14:02:32 +01:00
|
|
|
<html lang="en" dir="ltr">
|
2026-03-08 17:41:38 +01:00
|
|
|
<head>
|
|
|
|
|
<meta charset="UTF-8" />
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
|
|
|
|
<meta name="theme-color" content="#1A1A2E" />
|
|
|
|
|
<meta name="description" content="Find the nearest public shelter in Norway" />
|
2026-03-23 14:27:45 +01:00
|
|
|
<meta http-equiv="Content-Security-Policy"
|
2026-03-23 15:10:30 +01:00
|
|
|
content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://*.tile.openstreetmap.org; connect-src 'self' https://*.tile.openstreetmap.org; font-src 'self'; worker-src 'self'" />
|
2026-03-08 17:41:38 +01:00
|
|
|
<title>Tilfluktsrom</title>
|
|
|
|
|
<link rel="manifest" href="/manifest.webmanifest" />
|
|
|
|
|
<link rel="icon" type="image/png" sizes="192x192" href="/icons/icon-192.png" />
|
|
|
|
|
<link rel="apple-touch-icon" href="/icons/icon-192.png" />
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
<div id="app">
|
|
|
|
|
<!-- Status bar -->
|
2026-03-23 14:02:32 +01:00
|
|
|
<header id="status-bar" role="banner">
|
|
|
|
|
<span id="status-text" aria-live="polite"></span>
|
2026-03-23 14:27:45 +01:00
|
|
|
<button id="about-btn" aria-label="About">ℹ</button>
|
2026-03-08 17:41:38 +01:00
|
|
|
<button id="refresh-btn" aria-label="Refresh data">↻</button>
|
2026-03-23 14:02:32 +01:00
|
|
|
</header>
|
2026-03-08 17:41:38 +01:00
|
|
|
|
|
|
|
|
<!-- Main content: map or compass -->
|
2026-03-23 14:02:32 +01:00
|
|
|
<main id="main-content">
|
|
|
|
|
<div id="map-container" role="application" aria-label="Map"></div>
|
|
|
|
|
<div id="compass-container" role="img" aria-label="Compass">
|
2026-03-08 17:41:38 +01:00
|
|
|
<span id="compass-address"></span>
|
2026-03-23 14:02:32 +01:00
|
|
|
<span id="compass-distance" aria-live="polite"></span>
|
2026-03-08 17:41:38 +01:00
|
|
|
</div>
|
|
|
|
|
<!-- Toggle map/compass FAB -->
|
|
|
|
|
<button id="toggle-fab" aria-label="Toggle map/compass view">🧭</button>
|
|
|
|
|
<!-- Reset view button -->
|
|
|
|
|
<button id="reset-view-btn" aria-label="Reset view">⌖</button>
|
2026-03-23 14:02:32 +01:00
|
|
|
</main>
|
2026-03-08 17:41:38 +01:00
|
|
|
|
|
|
|
|
<!-- No-cache warning banner -->
|
2026-03-23 14:02:32 +01:00
|
|
|
<div id="no-cache-banner" role="alert">
|
2026-03-08 17:41:38 +01:00
|
|
|
<span id="no-cache-text"></span>
|
|
|
|
|
<button id="cache-retry-btn"></button>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<!-- Bottom sheet with shelter info -->
|
2026-03-23 14:02:32 +01:00
|
|
|
<aside id="bottom-sheet" aria-label="Shelter info">
|
|
|
|
|
<div id="selected-shelter" aria-live="polite">
|
2026-03-09 09:53:17 +01:00
|
|
|
<canvas id="mini-arrow" width="96" height="96" role="img" aria-label="Direction to shelter"></canvas>
|
2026-03-08 17:41:38 +01:00
|
|
|
<div id="selected-shelter-info">
|
|
|
|
|
<div id="selected-shelter-address"></div>
|
|
|
|
|
<div id="selected-shelter-details"></div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2026-03-23 14:02:32 +01:00
|
|
|
<div id="shelter-list" role="list" aria-label="Nearest shelters"></div>
|
|
|
|
|
</aside>
|
2026-03-08 17:41:38 +01:00
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<!-- Loading overlay -->
|
2026-03-23 14:02:32 +01:00
|
|
|
<div id="loading-overlay" role="dialog" aria-modal="true" aria-label="Loading">
|
|
|
|
|
<div id="loading-spinner" aria-hidden="true"></div>
|
|
|
|
|
<div id="loading-text" aria-live="assertive" tabindex="-1"></div>
|
2026-03-08 17:41:38 +01:00
|
|
|
<div id="loading-button-row">
|
|
|
|
|
<button id="loading-skip-btn"></button>
|
|
|
|
|
<button id="loading-ok-btn"></button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<script type="module" src="/src/main.ts"></script>
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|