Site header

The top of every page: the logo, the five sections with their mega-menus, the language switch and the one call to action; on phones, a drawer with the same links.

Organism · stable · v1.0.0 · owner: Site system lead · contract 19 of 20 points (open: figma)

Do and don't

Do: English header

Rendered by header.ts

Shown live at the top and the foot of this page.

Actual visible navigation marks See and its Product section; closed menus do not claim an expanded state.

Do: Japanese header with current English destination

Rendered by header.ts

Shown live at the top and the foot of this page.

Existing Japanese labels identify the actual English destinations, with their annotation and native-review banner; the current href matches the route.

Don't: Two calls to action

Rendered by header.ts

Shown live at the top and the foot of this page.

One action in the header; the second lives in the drawer foot and the page.

Don't: A header that hides the language switch on some pages

Rendered by header.ts

Shown live at the top and the foot of this page.

The switch is on every page so the header never shifts.

Rules

RuleWhyCheck
Every built page uses this header.One navigation everywhere.Automated: scripts/site/system/check-pages.ts (header on every page)
The language switch is on every page; a page without Japanese links to the Japanese home and says so.The header never shifts, and readers are told where the link goes.Automated: tests/site (language switch spec)

API

PropTypeRequiredDefaultWhat it does
langen | jaYesPage language.
pathstringYesThe current path (marks the current section and page).
navlistYesThe navigation groups (content/nav).
navSimplelistNoThe simple navigation variant.
alternatesobjectNoThe page's English and Japanese paths.
bannerstringNoThe Japanese review banner.

Contract details

The full contract: identity, anatomy, variants, states, tokens, layout, motion, accessibility, content, tests

Identity

AspectValue
Idheader
LayerOrganisms
Categorynavigation
OwnerSite system lead
Statusstable
Version1.0.0
Sourceapps/showcase/site/system/organisms/header.ts (private repository; the contract and the render function are this one module)
VersionDateChange
1.0.02026-10-26Site header as one module: its markup moved out of the page builder (scripts/site) into the system.

Use when

  • Every page built by the site builder. Why: One header everywhere means readers never relearn the navigation.

Do not use when

  • Inside the product tour. Why: The tour has the product's own header.

Anatomy

PartWhat it is
skipa.skip-link (rendered by the page shell, before the header)
rootheader.site-header
logoa.wordmark with the Logo
navnav.mega: details.mega-item per section (summary, div.mega-panel with mega-intro and mega-links); plain sections are a.mega-link
simplenav.simple-nav when the navigation variant is simple
actionsdiv.header-actions: LanguageSwitch, Button (small), details.drawer
drawernav.drawer-panel: the same sections, then drawer-foot with two buttons
bannerp.review-banner on Japanese pages

Made of: logo, language-switch, button, arrow-link, icon.

Used in: atomic-guide, page-apps, page-article, page-articles, page-deep, page-demo, page-hub, page-landing, page-404, page-status, page-runs-on-loom.

Variants

VariantWhenWhy
megaThe default.Each section shows its pages with one line each.
simplenav.variant: simple.A flat list for a smaller site.

States

StateRendered or not applicable
defaultClosed menus.
hoverSection labels underline in the section's thread colour.
focus-visibleThe --focus ring on every summary and link.
activeNot applicable: Links and summaries have no pressed style of their own.
disabledNot applicable: Nothing in the header is disabled.
loadingNot applicable: Build time; the menus work without JavaScript (details).
emptyNot applicable: The navigation is required; the build fails without it.
errorNot applicable: No data that can fail.
currentThe current section's summary is underlined with aria-current=true; the current page link has aria-current=page.
visitedNot applicable: Navigation links do not change colour when visited.
expandedAn open mega-menu or drawer (details[open]); one at a time (site.js closes the others).

Tokens

PartToken
root.background--cotton
root.border--rule-hair --line
thread.underline--thread (the section's dye)
panel.background--surface
panel.shadow--elevation-2
--header-left-space-5var(--space-5)
--header-top-space-13var(--space-13)
--header-padding-space-5var(--space-5)
--header-padding-space-6var(--space-6)
--header-background-inkvar(--ink)
--header-color-cottonvar(--cotton)
--header-font-type-strongvar(--type-strong)
--header-top-space-5var(--space-5)
--header-background-cottonvar(--cotton)
--header-border-bottom-rulevar(--rule)
--header-border-bottom-inkvar(--ink)
--header-gap-space-5var(--space-5)
--header-min-height-header-hvar(--header-h)
--header-font-type-small-strongvar(--type-small-strong)
--header-padding-space-4var(--space-4)
--header-padding-space-2var(--space-2)
--header-gap-space-4var(--space-4)
--header-gap-space-1var(--space-1)
--header-margin-right-space-4var(--space-4)
--header-font-family-font-displayvar(--font-display)
--header-border-right-rule-hairvar(--rule-hair)
--header-border-bottom-rule-hairvar(--rule-hair)
--header-transition-dur-moderatevar(--dur-moderate)
--header-transition-ease-standardvar(--ease-standard)
--header-right-space-5var(--space-5)
--header-bottom-rulevar(--rule)
--header-height-rulevar(--rule)
--header-background-saffronvar(--saffron)
--header-transition-dur-slowvar(--dur-slow)
--header-margin-top-rulevar(--rule)
--header-background-surfacevar(--surface)
--header-box-shadow-shadow-floatvar(--shadow-float)
--header-border-top-rule-framevar(--rule-frame)
--header-border-top-inkvar(--ink)
--header-gap-space-10var(--space-10)
--header-padding-top-space-9var(--space-9)
--header-padding-bottom-space-9var(--space-9)
--header-color-inkvar(--ink)
--header-font-type-h3var(--type-h3)
--header-letter-spacing-ls-h3var(--ls-h3)
--header-margin-top-space-4var(--space-4)
--header-color-ink-2var(--ink-2)
--header-margin-top-space-6var(--space-6)
--header-font-weight-weight-strongvar(--weight-strong)
--header-gap-space-2var(--space-2)
--header-gap-space-8var(--space-8)
--header-border-top-rule-hairvar(--rule-hair)
--header-border-top-linevar(--line)
--header-border-top-color-inkvar(--ink)
--header-font-type-smallvar(--type-small)
--header-text-decoration-thickness-rule-hairvar(--rule-hair)
--header-text-underline-offset-space-2var(--space-2)
--header-animation-dur-slowvar(--dur-slow)
--header-animation-ease-entervar(--ease-enter)
--header-padding-guttervar(--gutter)
--header-background-surface-2var(--surface-2)
--header-border-rule-hairvar(--rule-hair)
--header-border-inkvar(--ink)
--header-border-radius-radiusvar(--radius)
--header-top-header-hvar(--header-h)
--header-top-rulevar(--rule)
--header-padding-space-10var(--space-10)
--header-border-bottom-linevar(--line)
--header-padding-space-8var(--space-8)
--header-gap-space-3var(--space-3)
--header-t-threadvar(--thread)

Layout

AspectValue
breakpointsChecked at 390, 768, 1024 and 1440 px; the mega navigation from 1024 px, the drawer below it.
wrappingSection labels never wrap; the drawer lists wrap.
textExpansionJapanese labels are shorter in characters but wider in glyphs; checked at 1024 px with all five sections.

Spacing and rhythm

AspectValue
internal64 px tall; --space-5 between sections.
externalSticky at the top.
rhythmAlways first.

Motion

AspectValue
movesThe mega panel and the drawer open.
triggerClick, Enter or Space on a summary.
duration--dur-quick
easing--ease-standard
interruptibleYes: Escape closes, and opening another section closes the first.
reducedPanels appear without movement.
whyA short reveal shows where the panel came from.

Runtime and reuse

  1. Render-only element; mount any registered child enhancements separately. Preserve required Site CSS, fonts, responsive and locale rules from nativeElement.

Accessibility passport

AspectValue
rolebanner landmark; navigation landmarks named Main
nameMain
keyboardTab through sections; Enter or Space opens; Escape closes and returns focus to the summary.
focusThe --focus ring; focus is never trapped.
screenReaderdetails/summary announce expanded and collapsed; current page and section are announced.
contrastInk on cotton 14:1.
targetSection labels and buttons are 44 px tall.

Content

SlotLengthVoice
section1 wordSection name
item description8 wordsWhat the page gives

Good: “Product · See · Know what you really have.”

Bad: “Platform” · “Solutions for enterprises”

Japanese: Labels from nav-ja; English-only pages are marked (英語).

Icons and illustrations

None: this element uses no icon or illustration of its own.

Decisions and exceptions

  • None.

Usage

2109 uses across the built pages (measured by npm run site:system).

Tests

AspectValue
unittests/unit/site-system.test.ts: renders every do and don't example through the registry and checks the classes it owns
visualNot yet: there are no screenshot baselines; the Library page is checked for sideways scroll at 1440 px by tests/site/system.spec.ts
a11ytests/site/system.spec.ts: axe (0 serious or critical) on the element's Library page in light and dark
parityscripts/site/system/check.ts: Library examples are rendered by the same render function the site imports

Figma

not-yet: The Loom Site Figma library is the last stage of the plan; this element is not mapped yet.

Open in Storybook

Start with a conversation about your system.

We read your system, show you what we found, and agree with your team what to fix first.