diff --git a/src/app/App.module.css b/src/app/App.module.css
index 7c0987e..21f80f6 100644
--- a/src/app/App.module.css
+++ b/src/app/App.module.css
@@ -16,11 +16,38 @@
}
.title {
+ margin: 0; /* it's an
now — drop the UA heading margin */
font-weight: 600;
font-size: 16px;
letter-spacing: 0.01em;
}
+/*
+ * Skip link — visually hidden until focused, then pinned top-left above
+ * everything. Reveal uses :focus (not only :focus-visible) so a keyboard Tab
+ * shows it; the transition is neutralized under prefers-reduced-motion by base.css.
+ */
+.skipLink {
+ position: absolute;
+ top: -100%;
+ left: var(--space-4);
+ z-index: 1200;
+ padding: var(--space-3) var(--space-4);
+ background: var(--accent);
+ color: var(--accent-contrast);
+ border-radius: var(--radius);
+ transition: top var(--dur-fast) var(--ease);
+}
+
+.skipLink:focus {
+ top: var(--space-3);
+}
+
+/* The focus target itself shouldn't paint a ring (the skip link already shows). */
+.panes:focus {
+ outline: none;
+}
+
.version {
font-family: var(--font-mono);
font-size: 11px;
diff --git a/src/app/App.tsx b/src/app/App.tsx
index 2c65024..21f6e8a 100644
--- a/src/app/App.tsx
+++ b/src/app/App.tsx
@@ -23,14 +23,20 @@ export function App() {
return (
+ {/* Skip link (WCAG 2.4.1 / GOV.UK): the first focusable element, hidden
+ until focused, lets keyboard users bypass the header into the work area. */}
+
+ Skip to content
+
- Astrolabe
+ Astrolabe
v{__APP_VERSION__}
-
+ {/* tabIndex -1 makes the landmark a focus target for the skip link. */}
+