CLAVA · Slate portal pattern
configured for · Yale SOMA better Slate menu & how it stays accessible
A navigation pattern for Slate portals — on-brand, keyboard- and screen-reader-friendly, and CSS-only (portals forbid custom JavaScript). Real anchor links plus a native checkbox/<label> disclosure for mobile — no faked ARIA tablist.
The component
Resize the window below 737px to see the bar collapse into a labelled “Menu” toggle. Tab through it: every control has a visible focus ring; the toggle is a real, keyboard-operable checkbox.
Why this is accessible without JS: the links are real <a href> anchors (keyboard- and SR-native), and each target section is tabindex="-1" so the browser moves focus to it on activation; the mobile toggle is a <label> whose visible text (“Menu”) is the accessible name of its bound <input type="checkbox"> (no overriding aria-label — so it satisfies Label-in-Name / voice control), and it is focusable only at mobile widths where it is actually used. We deliberately avoid role="tab"/aria-expanded: those promise JS-driven behaviour (arrow-key navigation, live state) a CSS-only portal cannot deliver, so they would mislead assistive tech.
Use it in Slate
Paste the <nav class="pnav">…</nav> markup into a portal Static-Content widget and the .pnav CSS into the portal’s Custom CSS Rules (or ship it in build.css). On a Default-Branding portal the live --som-* tokens style it automatically.
<select> is injected by Slate’s mobilify JS with no accessible name — a Technolutions platform limitation that branding CSS cannot repair. The build.css recommendation (a visible label + AA-styled select) plus a Technolutions feedback note live in docs/PORTAL_NAV_DESIGN.md. This portal pattern sidesteps it entirely by not depending on mobilify.
Generated as a toolkit reference · Toolkit front door · Style Guide · design rationale in PORTAL_NAV_DESIGN.md. Created by Remi Moët-Buonaparte. © 2026.