Rework post page (lead, pager), add skip link, unified focus ring, reduced motion and keyboard-accessible menu

This commit is contained in:
tleininger committed 2026-10-01 16:48:52 +02:00
1 parent ae362639e3
commit ba65b18d29
14 files changed
+544 -69

No files matched your search

@@ -62,6 +62,12 @@
color: var(--color-on-header);
}
/* On the blue gradient the global brand-blue focus ring would vanish; white
stays visible on both ends of it. */
.brand:focus-visible {
outline-color: var(--color-focus-inverse);
}
/* The signet lives in its own component (Signet.razor), so its <svg> carries that
component's scope attribute, not this one's; ::deep reaches it from here. */
.brand ::deep .signet {
@@ -97,7 +103,9 @@
}
/* The hamburger button and its state checkbox are hidden on wide screens; the
media query below turns them on for narrow ones. */
media query below turns them on for narrow ones. display:none (beating the
global .visually-hidden the checkbox also carries) takes the checkbox out of the
tab order here, where there is no menu to open. */
.nav-toggle,
.nav-toggle-label {
display: none;
@@ -205,6 +213,11 @@
text-decoration: underline;
}
/* Same reason as the brand link in the header: a light ring on the dark band. */
.footer-nav a:focus-visible {
outline-color: var(--color-focus-inverse);
}
/* Copyright: a thin rule separates it from the columns. The rule spans the content
width, not the whole window, so it lines up with the columns above. */
.footer-copyright {
@@ -228,6 +241,19 @@
justify-content: space-between;
}
/* The checkbox comes back as a real, focusable control -- only visually hidden
(global .visually-hidden), so Tab stops on it and Space toggles the menu. It
lives under the label, so the focus ring is drawn there instead. */
.nav-toggle {
display: block;
}
.nav-toggle:focus-visible + .nav-toggle-label {
outline: 3px solid var(--color-focus-inverse);
outline-offset: 2px;
border-radius: var(--radius);
}
/* Show the hamburger button. */
.nav-toggle-label {
display: block;
@@ -271,20 +297,29 @@
transform: translateY(-2px) rotate(-45deg); /* back up by its own height */
}
/* The nav takes its own row and is hidden until the checkbox is checked. */
/* The nav takes its own row and is hidden until the checkbox is checked.
max-height:0 alone would only hide it from the eye: its links would still
be Tab stops and still be read out. visibility:hidden takes them out of
both. Transitioning visibility delays the switch to hidden until the fold
has finished, so closing still animates. Opening uses the transition of the
:checked rule below, which leaves visibility out: the links must be Tab
stops the moment Space is pressed, not 0.2s later. */
.main-nav {
flex-basis: 100%;
flex-direction: column;
gap: 0;
max-height: 0;
overflow: hidden;
transition: max-height 0.2s ease;
visibility: hidden;
transition: max-height 0.2s ease, visibility 0.2s;
}
/* Checked state: reveal the stacked links. The max-height caps the open menu
to the space below the sticky header; a longer list scrolls inside it
instead of running off the screen. */
.nav-toggle:checked ~ .main-nav {
visibility: visible;
transition: max-height 0.2s ease;
max-height: 70vh;
overflow-y: auto;
margin-top: 0.5rem;