Nav bar

Two floating glass pills — logo left, links right. The nav hovers over the page without a solid background, using backdrop-filter blur to stay legible over any content. The wordmark swaps color when scrolling over dark sections. This is the production landing nav, faithfully reproduced.

Variants

Default — over light content
Over dark content — wordmark color swaps
Scrolled — glass strengthens

Default is the resting state — both pills use --glass-bg (72% opacity cream) with --glass-border. The backdrop blur makes it readable over any background without a heavy opaque bar.

Over dark — when the page scrolls into a dark section, add .over-dark to the <nav>. The wordmark color flips from --wm-teal to --dark-canvas (near-black) so it reads on the now-dark glass. The links pill gets a dark glass treatment.

Scrolled — after 8px of scroll, add .scrolled to the <nav>. The glass opacity increases to 92%, and a visible 1px border appears. This prevents the pills from feeling unmoored when scrolled away from the hero.

Structure

ElementHeightPaddingNotes
Nav shell16px topFixed, pointer-events none — children restore pointer-events
Logo pill44px6px all-roundWordmark is 18px Bricolage Grotesque
Links pill44px6px all-round, 2px gap between linksLast link is always the CTA
Nav link (text)7px 14px14px/500 Onest, pill border-radius
CTA link7px 14pxInk fill, paper text, 600 weight

States

StateVisual changeTrigger
Default (at top)Glass at 72% opacity, no borderPage Y = 0
ScrolledGlass at 92% opacity, 1px --ink-line borderwindow.scrollY > 8 → add .scrolled
Over darkWordmark flips to dark color, links pill gets dark glassIntersectionObserver on dark sections → add .over-dark
Link hoverrgba(23,21,19,0.04) bg, full ink textpointer hover
Link pressedscale(0.97):active
CTA hover--teal-deep backgroundpointer hover
Mobile (<720px)Text links hidden — only logo + CTA visibleCSS media query

On dark surfaces

The dark behavior is driven by IntersectionObserver — when a dark-background section enters the viewport, .over-dark is toggled on the <nav> element. This triggers the wordmark color transition (200ms ease-out) and the links pill dark glass. Remove .over-dark when the dark section exits.

Anatomy

PartElementNotes
Nav shell<nav class="nav">Fixed, full-width, pointer-events none. Only pills are interactive.
Row.nav-rowFlexbox, space-between, 16px top padding, 32px side padding.
Logo pill.nav-logo-pill wrapping .nav-wordmarkGlass pill. Wraps wordmark only — no icon, no avatar.
Links pill.nav-links-pillGlass pill wrapping 1–4 links. Last link is always .cta.
Nav link.nav-linkTransparent by default. Hover: warm fill. Active: scale(0.97).
CTA.nav-link.ctaInk fill inside the links pill — the one action that stands out.

Usage

Do Keep the links pill to 3 items maximum — logo pill / 2 text links / 1 CTA. The glass pill doesn't expand gracefully beyond that and the mobile breakpoint already hides text links.
Don't Don't add icons inside the nav pills. No hamburger icon, no user avatar in the nav. The nav is for discovery and acquisition — app navigation lives in the bottom tab bar.
Do Use IntersectionObserver to toggle .over-dark — don't try to detect this from scroll position. The observer fires when the dark section's boundary crosses the nav, regardless of scroll speed.
Don't Don't change the wordmark font, size, or letter-spacing. The bridged-t wordmark is a brand asset — its kerning is fixed. Don't substitute a logo SVG without design approval.

Accessibility

Landmark The nav shell uses <nav>, which is a landmark element. Add aria-label="Main navigation" to distinguish it from other <nav> elements on the page (e.g., the sidebar).
Skip link The fixed nav sits on top of content. Provide a skip link as the first focusable element on the page: <a href="#main-content" class="skip-link">Skip to content</a>. Style it visually hidden until focused.
Color-only wordmark change The wordmark color swap (teal → dark) on .over-dark is purely visual — it has no semantic change. No ARIA updates needed.

Code

HTML

<nav class="nav" aria-label="Main navigation">
  <div class="nav-row">
    <a href="/" class="nav-logo-pill" aria-label="Settld home">
      <span class="nav-wordmark" aria-hidden="true">settld</span>
    </a>
    <div class="nav-links-pill">
      <a href="#features" class="nav-link">Features</a>
      <a href="#pricing" class="nav-link">Pricing</a>
      <a href="#waitlist" class="nav-link cta">Join waitlist →</a>
    </div>
  </div>
</nav>

JavaScript — scroll + dark-section detection

const nav = document.querySelector('.nav');

// Scroll: strengthen glass after 8px
window.addEventListener('scroll', () => {
  nav.classList.toggle('scrolled', window.scrollY > 8);
}, { passive: true });

// Dark sections: swap wordmark color
const darkSections = document.querySelectorAll('[data-dark-section]');
const observer = new IntersectionObserver(entries => {
  const anyDark = entries.some(e => e.isIntersecting);
  nav.classList.toggle('over-dark', anyDark);
}, { rootMargin: '-64px 0px 0px 0px', threshold: 0 });
darkSections.forEach(s => observer.observe(s));

CSS classes

ClassPurpose
.navFixed shell, pointer-events none, z-index 50
.nav.scrolledOpaque glass (92%), visible border — added via JS on scroll
.nav.over-darkWordmark color swap — added via IntersectionObserver
.nav-rowFlex row, space-between, restores pointer-events
.nav-logo-pillLeft glass pill — wraps wordmark
.nav-wordmarkBricolage Grotesque 18px teal wordmark
.nav-links-pillRight glass pill — wraps links
.nav-linkText link with hover fill and press scale
.nav-link.ctaInk-fill primary action inside the links pill

Design tokens used

TokenValueRole
--glass-bgrgba(251,248,240,0.72)Default pill background
--glass-borderrgba(255,255,255,0.55)Default pill border
--wm-teal#2A9D8FWordmark teal on light
--shadow-mdsee tokens.cssPill shadow
--r-pill999pxPill border-radius
--z-nav50Fixed z-index
--ink#171513CTA fill
--teal-deep#0A5F4FCTA hover fill
--d-fast140msLink transitions