UI componentsdocs/ui/components/typography.md

Text & icons

Headings, body text, inline emphasis, formatted values and icons.

← Component reference

Title #

Headings with a separate visual size and outline level.

Title #

Section title. order picks the semantic level and size only the look, so a small title never breaks the heading outline.

Project settings

<Title order={3}>
    Project settings
</Title>
PropTypeRequiredDefaultDescription
childrencontentHeading text.
orderHeadingOrder3Heading level (<h1>–<h6>) for the document outline. Default 2.
sizeHeadingOrderVisual size 1–6 (1 is largest), independent of the level. Default: order, else 3.
spacedbooleanKeep the normal gap before a following Subtitle.

HeadingOrder

type HeadingOrder = 1 | 2 | 3 | 4 | 5 | 6;

Subtitle #

Secondary line under a title.

Manage domains, builds and access.

<Subtitle>Manage domains, builds and access.</Subtitle>
PropTypeRequiredDefaultDescription
childrencontentSubtitle text.
orderHeadingOrder5Render as a heading at this level; by default a subtitle is a <p>.
sizeHeadingOrder3Visual size 1–6. Default 5.

HeadingOrder

type HeadingOrder = 1 | 2 | 3 | 4 | 5 | 6;

Heading #

Section heading whose level can change after mount.

Team members

<Heading level={3}>
    Team members
</Heading>
PropTypeRequiredDefaultDescription
childrencontentHeading text.
level1 | 2 | 32Heading level (h1–h3).

Also accepts the shared props: pass-through attributes, class, style, classes, styles, unstyled.

Text & prose #

Body text and long-form content.

Text #

Body text.

Last deployed 4 minutes ago by Ada.

<Text muted>
    Last deployed 4 minutes ago by Ada.
</Text>
PropTypeRequiredDefaultDescription
as"div" | "p" | "span"Element to render; fixed at mount.
childrencontentText content.
dangerbooleanDanger colour, e.g. for an inline error.
mutedbooleanSecondary (muted) colour.

Prose #

Typographic container for rich text (headings, paragraphs, lists, links), e.g. rendered Markdown.

Release notes

This release focuses on accessibility: every overlay now traps focus and restores it on close.

  • Keyboard support for menus and trees
  • Reduced-motion aware transitions
<Prose>
    <h3>Release notes</h3>
    <p>
        This release focuses on <a href="#a11y">accessibility</a>: every overlay now traps focus
        and restores it on close.
    </p>
    <ul>
        <li>Keyboard support for menus and trees</li>
        <li>Reduced-motion aware transitions</li>
    </ul>
</Prose>
PropTypeRequiredDefaultDescription
childrencontentLong-form content (headings, paragraphs, lists, links, code).
measurebooleantrueCap the line length for readability (default true).

Article #

Article container with readable text styles.

Designing a kit-wide customization system

Every component forwards attributes and exposes named slots…

<Article>
    <ArticleTitle order={3}>Designing a kit-wide customization system</ArticleTitle>
    <ArticleMeta>Ada Lovelace · Sep 12, 2026 · 6 min read</ArticleMeta>
    <p>Every component forwards attributes and exposes named slots…</p>
</Article>
PropTypeRequiredDefaultDescription
childrencontentArticleTitle, ArticleMeta and the article body.

Parts

ArticleTitle #

Article heading.

Designing a kit-wide customization system

<Article>
    <ArticleTitle order={3}>
        Designing a kit-wide customization system
    </ArticleTitle>
</Article>
PropTypeRequiredDefaultDescription
childrencontentContent of this part.
orderHeadingLevel1Heading level, to fit the page outline. Default 1.

HeadingLevel

type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;

ArticleMeta #

Article byline / metadata line.

Release 2.4

<Article>
    <ArticleTitle order={3}>Release 2.4</ArticleTitle>
    <ArticleMeta>Grace Hopper · Sep 1, 2026</ArticleMeta>
</Article>
PropTypeRequiredDefaultDescription
childrencontentContent of this part.

Quote #

Block quote with an optional citation.

The most dangerous phrase in the language is “we've always done it this way.”
Grace Hopper
The best way to predict the future is to invent it.
Alan Kay
<Stack gap="1rem">
    <Quote cite="Grace Hopper">
        The most dangerous phrase in the language is “we've always done it this way.”
    </Quote>
    <Quote variant="plain" cite="Alan Kay">
        The best way to predict the future is to invent it.
    </Quote>
</Stack>

Slots: root body cite

PropTypeRequiredDefaultDescription
childrencontentThe quotation.
citestringWho said it (shown under the quote).
variant"soft" | "plain""soft""soft" (default) adds a tinted background; "plain" keeps only the accent rule.

Also accepts the shared props: pass-through attributes, class, style, classes, styles, unstyled.

Anchor #

Text link; external opens a new tab with rel="noreferrer noopener".

<Anchor href="/docs">
    Read the docs
</Anchor>
PropTypeRequiredDefaultDescription
hrefstringyesLink target.
childrencontentLink text.
externalbooleanOpen in a new tab (adds rel="noreferrer noopener").

Also accepts the shared props: pass-through attributes, class, style, classes, styles, unstyled.

Mark & highlight #

Mark a span you choose, or every match of a search term.

Mark #

Highlight text you choose (<mark>, highlighter-yellow by default). To mark every match of a query inside a string, use Highlight.

Deploys run on every push to main.

<Text>
    Deploys run on <Mark>every push</Mark> to main.
</Text>
PropTypeRequiredDefaultDescription
childrencontentText to highlight.
tone"accent" | "warning" | "success""warning"Highlight colour.

Highlight #

Mark every case-insensitive match of highlight inside text, e.g. search results. To mark a span you choose, use Mark.

Deploy marketing-site to production
<Highlight text="Deploy marketing-site to production" highlight="deploy" />

Slots: root mark

PropTypeRequiredDefaultDescription
highlightstring | string[]yesTerm(s) to mark wherever they occur.
textstringyesThe full text to show.
tone"accent" | "warning" | "success""warning"Mark colour (default "warning", highlighter yellow), as on Mark.

Also accepts the shared props: pass-through attributes, class, style, classes, styles, unstyled.

Truncate & leader #

Fit text into limited space.

Truncate #

Ellipsis after lines lines.

The customization system covers every component: attributes are forwarded to the host element, classes and styles target named slots, unstyled drops the built-in look, and configureUI sets app-wide defaults. Text past the second line is cut with an ellipsis.
<Truncate style={{ "max-width": "22rem" }} lines={2}>
    The customization system covers every component: attributes are forwarded to the host
    element, classes and styles target named slots, unstyled drops the built-in look, and
    configureUI sets app-wide defaults. Text past the second line is cut with an ellipsis.
</Truncate>
PropTypeRequiredDefaultDescription
childrencontentText to truncate.
linesnumber1Number of lines shown before the ellipsis.

Leader #

UIkit-style dotted leader row.

Espresso$3.50
<Leader label="Espresso" value="$3.50" />

Slots: root dots label value

PropTypeRequiredDefaultDescription
labelcontentyesText on the left.
valuecontentyesText on the right; dots fill the space between.

Also accepts the shared props: pass-through attributes, class, style, classes, styles, unstyled.

Formatted values #

Numbers, relative times and countdowns.

NumberFormatter #

Formats a number with separators, decimals, prefix and suffix.

1,234,567.89
<NumberFormatter value={1234567.891} decimalScale={2} />
PropTypeRequiredDefaultDescription
valuenumberyesNumber to format.
decimalScalenumber0Fixed number of decimals.
prefixstring""Text before the number, e.g. $.
suffixstring""Text after the number, e.g. %.
thousandSeparatorstring","Character between thousands groups.

RelativeTime #

Relative time such as "5 minutes ago", with the full date in title.

<RelativeTime value={Date.now() - 5 * 60_000} />
PropTypeRequiredDefaultDescription
valuenumberyesAbsolute timestamp (ms).

Countdown #

Live countdown.

3d0h0m0s
<Countdown to={Date.now() + 3 * 86_400_000} />

Slots: root suffix unit value

PropTypeRequiredDefaultDescription
tonumberyesAbsolute target timestamp (ms).
units{ d: string; h: string; m: string; s: string; }Unit suffixes (default d/h/m/s).

Also accepts the shared props: pass-through attributes, class, style, classes, styles, unstyled.

VisuallyHidden #

Screen-reader-only text.

Interact with the example: callbacks show up here.
<Button variant="ghost" onClick={() => {}}>
    ★<VisuallyHidden>Add to favourites</VisuallyHidden>
</Button>
PropTypeRequiredDefaultDescription
childrencontentText read by screen readers but not shown.

Also accepts the shared props: pass-through attributes, class, style, classes, styles, unstyled.

Icon #

The built-in icon set.

Icon #

Built-in SVG icon.

<Icon name="bell" />
PropTypeRequiredDefaultDescription
nameIconNameyesWhich built-in icon to draw.
labelstringAccessible name; without it the icon is decorative (aria-hidden).
sizenumber | "sm" | "md" | "lg"sm / md / lg, or a size in pixels.

IconName — Material Design Icons path names used by <Icon />.

type IconName = | "check" | "x" | "plus" | "minus" | "search" | "user" | "users" | "settings" | "menu" | "home" | "heart" | "star" | "bell" | "mail" | "calendar" | "clock" | "edit" | "trash" | "copy" | "download" | "upload" | "link" | "external" | "info" | "warning" | "error" | "success" | "chevron-down" | "chevron-up" | "chevron-left" | "chevron-right" | "arrow-left" | "arrow-right" | "eye" | "eye-off" | "eye-outline" | "lock" | "unlock" | "filter" | "more" | "close" | "spinner" | "sun" | "moon" | "play" | "pause" | "refresh" | "share" | "image" | "file" | "folder" | "zap" | "phone" | "git" | "code";

IconBadge #

Colored circular/square icon badge.

<IconBadge name="zap" tone="accent" />

Slots: root icon

PropTypeRequiredDefaultDescription
nameIconNameyesWhich built-in icon to draw.
size"sm" | "md" | "lg""md"Badge size.
tone"accent" | "warning" | "success" | "danger" | "muted""accent"Colour of the icon and its tinted background.

IconName — Material Design Icons path names used by <Icon />.

type IconName = | "check" | "x" | "plus" | "minus" | "search" | "user" | "users" | "settings" | "menu" | "home" | "heart" | "star" | "bell" | "mail" | "calendar" | "clock" | "edit" | "trash" | "copy" | "download" | "upload" | "link" | "external" | "info" | "warning" | "error" | "success" | "chevron-down" | "chevron-up" | "chevron-left" | "chevron-right" | "arrow-left" | "arrow-right" | "eye" | "eye-off" | "eye-outline" | "lock" | "unlock" | "filter" | "more" | "close" | "spinner" | "sun" | "moon" | "play" | "pause" | "refresh" | "share" | "image" | "file" | "folder" | "zap" | "phone" | "git" | "code";

Also accepts the shared props: pass-through attributes, class, style, classes, styles, unstyled.