Skip to content

Eyebrow

Hero example

Eyebrow

When to use

Reach for <Eyebrow> when you need a label that sits above a section heading — "What's next," "Now shipping," "Inside the box." The 11px / 0.18em tracking / uppercase casing reads as a small structural beat that orients the reader before the heading lands. The 24px gap below is built into the recipe; consumers don't add one.

Don't reach for Eyebrow for body copy — it's labelling. Don't use it for status indicators (use Pill) or inline tags. For the brand-tier marketing eyebrow variant with the orange accent dot, use MatterEyebrow.

Do — place Eyebrow directly above a <DisplayHeading> or <MatterH1>. The pairing is the canonical structural unit.
Don't — render Eyebrow without a heading directly after it. The label needs something to label.

Anatomy

A single <div class="eyebrow"> (or .eyebrow.mono when mono is set) containing the children verbatim. The recipe in @matter/components/styles.css supplies:

  • font-size: 11px
  • letter-spacing: 0.18em (uppercase tracking)
  • text-transform: uppercase
  • color: var(--fg-muted)
  • margin-bottom: 24px (the canonical gap to the heading below)

The mono flag swaps the font to Geist Mono and adjusts letter-spacing — for tabular numerics ("Q3 · 2026 · Equity") or code-flavored eyebrows.

Props

PropTypeDefaultDescription
monobooleanfalse
childrenReact.ReactNode

Also accepts Omit<React.HTMLAttributes<HTMLDivElement>, "children">.

States

Stateless.

Density

Density-agnostic. The 11px / 0.18em letter-spacing is at the legibility floor — any compaction breaks it.

Themes

Eyebrow
Eyebrow
Eyebrow

Tokens consumed

colors1 tokensv2.3.0
#5A5A5A
matter
src ↗
typography9 tokensv2.3.0
11px
matter
src ↗
500
matter
src ↗
0.18em
matter
src ↗
uppercase
matter
src ↗
"Inter", ui-sans-serif, system-ui, -apple-system, sans-serif
brand
src ↗
500
brand
src ↗
14px
brand
src ↗
1.2
brand
src ↗
0.06em
brand
src ↗

Color reads --fg-muted. Font, size, tracking come from the .eyebrow recipe (typography tokens).

Accessibility

  • Keyboard interactions. None.
  • ARIA roles and properties. Generic <div>. The text content carries the meaning; screen readers announce it inline before the heading.
  • Focus order. N/A.
  • Screen-reader expectations. Announces as plain text — "{eyebrow text}" — followed by whatever heading sits below.
  • Reduced motion. N/A.
  • Forced colors. Foreground → system foreground; tracking and uppercase casing preserved.
  • WIG rules. Uppercase + 0.18em tracking meets WIG's mono-caps legibility minimum. The 24px below-margin maintains rhythm without inline spacing hacks.

Do / Don't

Do — pair Eyebrow with <DisplayHeading> for marketing pages, or with <H1> / <H2> in dashboard contexts.
Don't — use Eyebrow as a section heading. It's a label; the heading below is the heading.
Do — pass mono for numeric eyebrows ("Q3 · 2026", "v2.3.0").
Don't — manually set text-transform: uppercase elsewhere. Let the recipe handle it; consumers should write in mixed case.
Do — keep eyebrow text short (≤ 30 characters). The tracking eats horizontal space; long eyebrows wrap awkwardly.
Don't — render Eyebrow without a heading after it. The structural beat needs the heading to complete.

Recipes

This component appears in:

  • The marketing site's section headers.
  • Docs corpus recipe — section labels on document detail pages.

Code example

import { Eyebrow, DisplayHeading } from "@matter/components";

export function PricingSection() {
  return (
    <section>
      <Eyebrow>Pricing</Eyebrow>
      <DisplayHeading as="h2" size="hero">
        Pay only when an entity files.
      </DisplayHeading>
      {/* body */}
    </section>
  );
}

Source

packages/components/src/Eyebrow

On this page