COMPONENTS / ORGANISMS / al-header← ALL COMPONENTS

Header

<al-header>beta

Southleft's primary navigation bar — sticky, translucent, blurred, with pill nav items, circular icon actions and a numbered mobile panel.

PLAYGROUND3 CONTROLS
FLAGS
CODE — HTML

Guidance

AUTHORED · CITED TO SOURCE

Southleft's primary navigation bar, and the brand implementation of al-header: sticky, translucent and blurred, with pill nav items, circular icon actions and a numbered mobile panel it opens itself. Altitude's al-header is a bare landmark; this is the whole bar.

WHEN TO USE

  • You are building a page on the Southleft design system and it needs the site's navigation chrome.
  • You want the mobile panel behaviour without writing it. The component owns menu-open, renders the toggle and the panel, and dispatches on change.

WHEN NOT TO USE

  • You need a neutral landmark to compose your own bar inside. That is Altitude's header, and this design system deliberately replaces it, so arranging your own chrome means composing the layout primitive instead.USE LAYOUT →
  • The band you want is a page-level heading rather than site navigation.USE PAGE-HERO →

DO

  • Put the wordmark in brand, links in nav, the right-hand cluster in actions, and a copy of the links in mobile. The panel does not mirror the nav slot for you.
  • Mark the current page with aria-current on the matching nav link; the component styles that state but cannot know the route.

DON’T

  • Do not wrap the slotted logo in your own anchor. al-logo renders its own, and the nesting is an axe nested-interactive failure.
  • Do not build a second menu toggle in the page. The component owns menu-open, and two things toggling one menu is how a menu ends up half-open.

ACCESSIBILITY IN PRACTICE

  • The nav landmark and its label live inside the component, so slot plain anchors rather than another nav element. A nested navigation landmark makes the bar announce twice.

CONTENT GUIDELINES

  • Nav labels are one or two words. The mobile panel numbers them, so a label that wraps to two lines breaks the alignment of its ordinal.

WHERE THIS CAME FROM

  • libs/sl-web-components/components/header/header.tsThe brand implementation that registers under the base library tag — the override this guidance opens by describing.
  • libs/sl-web-components/components/header/header.tsThe component owns the open state and announces it, which is why a page must not add a second toggle.
  • .altitude/ds-projects.jsonThe registry declares this as a deliberate same-tag override rather than a collision.

Each line above names a file and a literal string that must still appear in it.pnpm gate:guidance re-reads them from this built page, so guidance that has stopped being true fails a check rather than misleading you.

BOTH CHANGEDSouthleft Design SystemFIGMA SET · Header

Code and Figma each changed since the last confirmed sync. Neither side should be overwritten blindly.

DECIDED BY
CONTRACT DIFF
FIGMA SIDE
OBSERVED
LAST CONFIRMED SYNC
2026-08-28
PUBLIC SURFACE
3 ATTR · 5 SLOT · 1 EVENT · 5 PART

The component’s public surface — attributes and their value sets, slots, events, CSS parts and custom properties, from the manifest — compared against the Figma set’s property definitions.

Measured by axe on this documentation site’s own preview of the default story — @southleft/sl-web-components has no Storybook in the measured set.

CHECKEVIDENCEDETAILRESULT
Default stateAXEDefaultPASS
Advanced statesAXEThe docs page renders the default story only. This component’s other stories have not been measured.NOT MEASURED
Screen readerMANUALNo screen-reader pass has been recorded for this component.NOT RECORDED
Keyboard navigationINTERACTION TESTSNo interaction tests and no manual keyboard pass.NOT RECORDED

MEASURED 2026-09-08 · 1 STORIES · AXE WCAG2A + WCAG2AA + WCAG21A + WCAG21AA + WCAG22AA

COLOR CONTRAST1 RULE FAILING

The CI gate disables color-contrast globally (libs/al-web-components/story-fixture/src/main.ts), so its result never reaches a test run. It is enabled for this measurement, and reported here whichever way it comes out.

RULEWHEREELEMENTS
color-contrastElements must meet minimum color contrast ratio thresholdsDefault1
import '@southleft/sl-web-components/components/header';
PROPTYPEDEFAULT
stickybooleanStick the bar to the top of the scroll container. On by default — the site's header is sticky.true
elevatedbooleanAdd the base header's elevated shadow treatment.false
menu-openbooleanWhether the mobile panel is open. Reflected so the page can style against `al-header[menu-open]` and so the state is inspectable in devtools rather than trapped in the shadow root.
SLOTDESCRIPTION
(default)Additional navigation content, preserving the base header's unnamed slot.
brandThe wordmark. Usually `<al-logo variant="southleft">`.
navThe primary links, as flat `<a>` elements. The component gives them the pill treatment and marks `aria-current="page"` as the filled state. Hidden below the `64rem` breakpoint, where the mobile panel takes over.
actionsThe right-hand cluster. Native `<button>`s get the circular icon treatment; anything else (an `<al-button>` CTA) is left alone.
mobileThe panel's links. Supplied separately from `nav` because a slot can project its nodes only once — see the note in the SCSS.
EVENTDESCRIPTIONTYPE
sl-header-menu-toggleWhen the mobile panel opens or closes. `detail.open` carries the new state.CustomEvent
PARTDESCRIPTION
barThe row inside the measure.
navThe `<nav>` landmark around the pills.
menu-buttonThe button that opens the mobile panel.
panelThe mobile panel.
bar-outer
PROPERTYDESCRIPTIONDEFAULT
--al-header-heightBar height. Defaults to `4rem`, and `5rem` from the `48rem` breakpoint up.
--al-header-measureThe content column. Defaults to `79rem`.
--al-header-backgroundBar surface. Defaults to the page background at 85% so the blur reads.
--al-header-min-heightMinimum bar height; overrides the brand height.
--al-header-paddingPadding around the bar, before its constrained content.
--al-header-border-block-endThe bottom border of the bar.
--al-header-backdrop-filterBackdrop treatment behind the bar.

SOURCE — components/header/header.ts · Organisms/Header