diff --git a/webapp/src/components/app-shell.ts b/webapp/src/components/app-shell.ts
index aab75f8..84f747d 100644
--- a/webapp/src/components/app-shell.ts
+++ b/webapp/src/components/app-shell.ts
@@ -7,7 +7,7 @@ export class AppShell extends HTMLElement {
connectedCallback(): void {
this.innerHTML = `
diff --git a/webapp/src/style.css b/webapp/src/style.css
index 72a211d..e62e842 100644
--- a/webapp/src/style.css
+++ b/webapp/src/style.css
@@ -1,17 +1,210 @@
+/* System fonts only — no external dependencies, no license issues */
+
+:root {
+ --font-mono: 'Courier New', Courier, monospace;
+ --font-serif: Georgia, 'Times New Roman', serif;
+ --color-ink: #1a1a1a;
+ --color-muted: #666;
+ --color-rule: #ddd;
+ --color-bg: #fafaf8;
+ --column: 680px;
+}
+
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
-html, body {
- height: 100%;
- font-family: system-ui, sans-serif;
- font-size: 16px;
- color: #1a1a1a;
- background: #f5f5f5;
+html {
+ font-size: 18px;
+ background: var(--color-bg);
+ color: var(--color-ink);
+}
+
+body {
+ font-family: var(--font-serif);
+ line-height: 1.7;
+ min-height: 100vh;
}
#app {
- height: 100%;
+ min-height: 100vh;
+}
+
+/* --- Navigation --- */
+
+nav {
+ border-bottom: 1px solid var(--color-rule);
+ padding: 0.75rem 1.5rem;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ font-family: var(--font-mono);
+ font-size: 0.75rem;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+}
+
+nav a {
+ color: var(--color-ink);
+ text-decoration: none;
+}
+
+nav a:hover {
+ text-decoration: underline;
+}
+
+nav button {
+ background: none;
+ border: none;
+ cursor: pointer;
+ font-family: var(--font-mono);
+ font-size: 0.75rem;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ color: var(--color-muted);
+ padding: 0;
+}
+
+nav button:hover {
+ color: var(--color-ink);
+}
+
+/* --- Main content column --- */
+
+main {
+ max-width: var(--column);
+ margin: 0 auto;
+ padding: 3rem 1.5rem;
+}
+
+/* --- Typography --- */
+
+h1 {
+ font-family: var(--font-mono);
+ font-size: 1rem;
+ font-weight: normal;
+ letter-spacing: 0.06em;
+ text-transform: uppercase;
+ color: var(--color-muted);
+ margin-bottom: 2rem;
+ padding-bottom: 0.75rem;
+ border-bottom: 1px solid var(--color-rule);
+}
+
+h2 {
+ font-family: var(--font-mono);
+ font-size: 0.75rem;
+ font-weight: normal;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ color: var(--color-muted);
+ margin: 2.5rem 0 1rem;
+}
+
+p {
+ margin-bottom: 1rem;
+ color: var(--color-muted);
+ font-family: var(--font-mono);
+ font-size: 0.85rem;
+}
+
+/* --- Lists --- */
+
+ul {
+ list-style: none;
+}
+
+li {
+ border-bottom: 1px solid var(--color-rule);
+ padding: 0.75rem 0;
+ font-family: var(--font-mono);
+ font-size: 0.85rem;
+ color: var(--color-ink);
+}
+
+li:first-child {
+ border-top: 1px solid var(--color-rule);
+}
+
+li a {
+ color: var(--color-ink);
+ text-decoration: none;
+ display: block;
+}
+
+li a:hover {
+ text-decoration: underline;
+}
+
+/* --- Login form --- */
+
+form {
+ max-width: 360px;
+}
+
+form h1 {
+ margin-bottom: 2.5rem;
+}
+
+label {
+ display: block;
+ font-family: var(--font-mono);
+ font-size: 0.75rem;
+ letter-spacing: 0.06em;
+ text-transform: uppercase;
+ color: var(--color-muted);
+ margin-bottom: 1.5rem;
+}
+
+input[type="text"],
+input[type="password"] {
+ display: block;
+ width: 100%;
+ margin-top: 0.4rem;
+ padding: 0.5rem 0;
+ border: none;
+ border-bottom: 1px solid var(--color-ink);
+ background: transparent;
+ font-family: var(--font-mono);
+ font-size: 0.9rem;
+ color: var(--color-ink);
+ outline: none;
+}
+
+input:focus {
+ border-bottom-color: var(--color-ink);
+}
+
+button[type="submit"] {
+ margin-top: 2rem;
+ background: var(--color-ink);
+ color: var(--color-bg);
+ border: none;
+ padding: 0.6rem 1.5rem;
+ font-family: var(--font-mono);
+ font-size: 0.75rem;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ cursor: pointer;
+}
+
+button[type="submit"]:hover {
+ opacity: 0.8;
+}
+
+#login-error {
+ color: #c00;
+ font-size: 0.8rem;
+ margin-top: -0.5rem;
+ margin-bottom: 1rem;
+}
+
+/* --- Map --- */
+
+track-map {
+ display: block;
+ margin: 1.5rem 0;
+ border: 1px solid var(--color-rule);
}