Add this component

npx zentauri-ui add typography

Accessibility notes

Keyboard accessible by default with semantic markup, visible focus treatment, and tokenized states. Add descriptive labels for icon-only or decorative usage.

Dependency notes

No extra runtime dependency beyond React and the package peers already covered in Installation.

Typography

Typography system overview

Browse headings, body copy, lists, quotations, inline emphasis, and code blocks from one hub. Each section demonstrates variants, formatting combinations, and snippets you can paste into App Router pages. Explore scale tokens, presets, semantic inline emphasis and accessible labels.

Browse sections

Pick a topic to view variants, formatting, combinations, and snippets.

Editorial recipes

Open preview

Number formatting

Open preview

Highlighting and relevance

Open preview

Truncation and expansion

Open preview

Prose and rich content

Open preview

Text links

Open preview

Description lists

Open preview

Scale and presets

Open preview

Accessible text

Open preview

Headings

Open preview

Paragraph

Open preview

Lists

Open preview

Blockquote

Open preview

Inline text

Open preview

Code blocks

Open preview

Typography API

Generated from the package prop types and variant definitions.

Blockquote

BlockquoteProps

Variants

PropTypeDefault
tone
accentdefaultdestructiveerrorgradient-cyan-bluegradient-cyan-greengradient-cyan-orangegradient-cyan-pinkgradient-cyan-purplegradient-cyan-redgradient-cyan-violetgradient-pink-violet+6
default

Behavior

PropTypeDefault
attributionAttribution label; distinct from the native cite URL attribute.string | undefinednone
Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLQuoteElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLQuoteElement> | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

CodeBlock

CodeBlockProps

Variants

PropTypeDefault
tone
accentdefaultdestructiveerrorgradient-cyan-bluegradient-cyan-greengradient-cyan-orangegradient-cyan-pinkgradient-cyan-purplegradient-cyan-redgradient-cyan-violetgradient-pink-violet+6
default

Behavior

PropTypeDefault
languagestring | undefinednone
Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLPreElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLPreElement> | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

DescriptionList

DescriptionListProps

Variants

PropTypeDefault
layout
inlineresponsivestacked
responsive
separators
falsetrue
false
size
baselgsm
base
tone
accentdefaultdestructiveerrorgradient-cyan-bluegradient-cyan-greengradient-cyan-orangegradient-cyan-pinkgradient-cyan-purplegradient-cyan-redgradient-cyan-violetgradient-pink-violet+6
default
Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLDListElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLDListElement> | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

DescriptionListDetails

DescriptionListDetailsProps

Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLElement> | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

DescriptionListItem

DescriptionListItemProps

Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLDivElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLDivElement> | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

DescriptionListTerm

DescriptionListTermProps

Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLElement> | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

Emphasis

EmphasisProps

Variants

PropTypeDefault
tone
accentdefaultdestructiveerrorgradient-cyan-bluegradient-cyan-greengradient-cyan-orangegradient-cyan-pinkgradient-cyan-purplegradient-cyan-redgradient-cyan-violetgradient-pink-violet+6
default
Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLElement> | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

ExpandableText

ExpandableTextProps

Behavior

PropTypeDefault
buttonClassNamestring | undefinednone
contentClassNamestring | undefinednone
contentIdstring | undefinednone
defaultExpandedboolean | undefinednone
expandedboolean | undefinednone
lessLabelstring | undefinednone
linesnumber | undefinednone
moreLabelstring | undefinednone
onExpandedChange((expanded: boolean) => void) | undefinednone
showToggleAlways exposes the control when layout measurement is unavailable.'overflow' | 'always' | undefinednone
text*stringnone
Inherited HTML props
PropTypeDefault
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLDivElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLDivElement> | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

FootnoteBacklink

FootnoteBacklinkProps

Behavior

PropTypeDefault
label*stringnone
noteId*stringnone
referenceId*stringnone
Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
downloadanynone
idstring | undefinednone
onClickMouseEventHandler<HTMLAnchorElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLAnchorElement> | undefinednone
referrerPolicyHTMLAttributeReferrerPolicy | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
targetHTMLAttributeAnchorTarget | undefinednone
titlestring | undefinednone

FootnoteItem

FootnoteItemProps

Behavior

PropTypeDefault
noteId*stringnone
number*numbernone
Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
onClickMouseEventHandler<HTMLLIElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLLIElement> | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

FootnoteReference

FootnoteReferenceProps

Behavior

PropTypeDefault
noteId*stringnone
number*numbernone
referenceId*stringnone
Inherited HTML props
PropTypeDefault
classNamestring | undefinednone
downloadanynone
onClickMouseEventHandler<HTMLAnchorElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLAnchorElement> | undefinednone
referrerPolicyHTMLAttributeReferrerPolicy | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
targetHTMLAttributeAnchorTarget | undefinednone
titlestring | undefinednone

Footnotes

FootnotesProps

Behavior

PropTypeDefault
scopeIdstring | undefinednone
Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLDivElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLDivElement> | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

FootnotesList

FootnotesListProps

Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLOListElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLOListElement> | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

Heading

HeadingProps

Variants

PropTypeDefault
align
centerendjustifystart
none
leading
normalrelaxedtight
none
level*
123456
none
measure
nonereadablewide
none
tone
accentdefaultdestructiveerrorgradient-cyan-bluegradient-cyan-greengradient-cyan-orangegradient-cyan-pinkgradient-cyan-purplegradient-cyan-redgradient-cyan-violetgradient-pink-violet+6
default
tracking
normaltightwide
none
weight
boldmediumnormalsemibold
none
wrap
balancenormalnowrappretty
none

Behavior

PropTypeDefault
boldExplicit weight takes precedence over bold.boolean | undefinednone
displayLevelVisual scale; defaults to level. Does not change the semantic heading tag.HeadingLevel | undefinednone
displaySizeMarketing display size. Takes precedence over displayLevel.NonNullable<'md' | 'sm' | 'lg' | null | undefined> | undefinednone
italicboolean | undefinednone
scaleFluid sizing is opt-in; default retains the existing responsive scale.'default' | 'fluid' | undefinednone
strikethroughboolean | undefinednone
underlineboolean | undefinednone
Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLHeadingElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLHeadingElement> | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

HighlightText

HighlightTextProps

Behavior

PropTypeDefault
caseSensitiveUnicode simple case folding, without locale or accent normalization.boolean | undefinednone
markClassNamestring | undefinednone
query*string | readonly string[]none
text*stringnone
Inherited HTML props
PropTypeDefault
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLSpanElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLSpanElement> | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

InlineCode

InlineCodeProps

Variants

PropTypeDefault
tone
accentdefaultdestructiveerrorgradient-cyan-bluegradient-cyan-greengradient-cyan-orangegradient-cyan-pinkgradient-cyan-purplegradient-cyan-redgradient-cyan-violetgradient-pink-violet+6
default
Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLElement> | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

List

ListProps

Variants

PropTypeDefault
marker
circlediscnone
disc
tone
accentdefaultdestructiveerrorgradient-cyan-bluegradient-cyan-greengradient-cyan-orangegradient-cyan-pinkgradient-cyan-purplegradient-cyan-redgradient-cyan-violetgradient-pink-violet+6
default

Behavior

PropTypeDefault
orderedboolean | undefinednone
Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLOListElement> | MouseEventHandler<HTMLUListElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).((instance: HTMLUListElement | null) => void | (() => VoidOrUndefinedOnly) | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | RefObject<HTMLUListElement | null> | ((instance: HTMLOListElement | null) => void | (() => VoidOrUndefinedOnly) | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | RefObject<HTMLOListElement | null> | null | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

ListItem

ListItemProps

Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLLIElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLLIElement> | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

Mark

MarkProps

Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLElement> | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

NumberText

NumberTextProps

Variants

PropTypeDefault
align
centerendjustifystart
none
font
bodymono
none
leading
normalrelaxedtight
none
measure
nonereadablewide
none
numeric
normaltabular
tabular
size
baselgsmxlxs
base
tone
accentdefaultdestructiveerrorgradient-cyan-bluegradient-cyan-greengradient-cyan-orangegradient-cyan-pinkgradient-cyan-purplegradient-cyan-redgradient-cyan-violetgradient-pink-violet+6
default
tracking
normaltightwide
none
weight
boldmediumnormalsemibold
none
wrap
balancenormalnowrappretty
none

State

PropTypeDefault
value*number | bigintnone

Behavior

PropTypeDefault
as'div' | 'p' | 'span' | undefinednone
formatOptionsIntl's style is separate from the native React CSS style prop.Intl.NumberFormatOptions | undefinednone
localestring | string[] | undefinednone
partClassNamesStyles native parts without replacing their text or order.Partial<Record<keyof Intl.NumberFormatPartTypeRegistry, string>> | undefinednone
Inherited HTML props
PropTypeDefault
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLDivElement> | MouseEventHandler<HTMLSpanElement> | MouseEventHandler<HTMLParagraphElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).((instance: HTMLDivElement | null) => void | (() => VoidOrUndefinedOnly) | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | RefObject<HTMLDivElement | null> | ((instance: HTMLSpanElement | null) => void | (() => VoidOrUndefinedOnly) | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | RefObject<HTMLSpanElement | null> | ((instance: HTMLParagraphElement | null) => void | (() => VoidOrUndefinedOnly) | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | RefObject<HTMLParagraphElement | null> | null | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

Prose

ProseProps

Variants

PropTypeDefault
measure
nonereadablewide
readable
size
baselgsm
base
tone
accentdefaultdestructiveerrorgradient-cyan-bluegradient-cyan-greengradient-cyan-orangegradient-cyan-pinkgradient-cyan-purplegradient-cyan-redgradient-cyan-violetgradient-pink-violet+6
default

Behavior

PropTypeDefault
as'div' | 'article' | undefinednone
Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLDivElement> | MouseEventHandler<HTMLElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).((instance: HTMLDivElement | null) => void | (() => VoidOrUndefinedOnly) | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | RefObject<HTMLDivElement | null> | ((instance: HTMLElement | null) => void | (() => VoidOrUndefinedOnly) | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | RefObject<HTMLElement | null> | null | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

Small

SmallProps

Variants

PropTypeDefault
tone
accentdefaultdestructiveerrorgradient-cyan-bluegradient-cyan-greengradient-cyan-orangegradient-cyan-pinkgradient-cyan-purplegradient-cyan-redgradient-cyan-violetgradient-pink-violet+6
default
Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLElement> | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

Strong

StrongProps

Variants

PropTypeDefault
tone
accentdefaultdestructiveerrorgradient-cyan-bluegradient-cyan-greengradient-cyan-orangegradient-cyan-pinkgradient-cyan-purplegradient-cyan-redgradient-cyan-violetgradient-pink-violet+6
default
Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLElement> | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

Text

TextProps

Variants

PropTypeDefault
align
centerendjustifystart
none
font
bodymono
none
leading
normalrelaxedtight
none
measure
nonereadablewide
none
numeric
normaltabular
none
preset
bodycaptionleadoverline
body
size
baselgsmxlxs
base
tone
accentdefaultdestructiveerrorgradient-cyan-bluegradient-cyan-greengradient-cyan-orangegradient-cyan-pinkgradient-cyan-purplegradient-cyan-redgradient-cyan-violetgradient-pink-violet+6
default
tracking
normaltightwide
none
underline
alwayshovernone
always
weight
boldmediumnormalsemibold
none
wrap
balancenormalnowrappretty
none

Behavior

PropTypeDefault
as'div' | 'label' | 'p' | 'span' | undefinednone
boldExplicit weight, then a preset's weight, take precedence over bold.boolean | undefinednone
highlightVisual highlighting only; use semantic emphasis for importance.boolean | undefinednone
italicboolean | undefinednone
strikethroughboolean | undefinednone
Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLDivElement> | MouseEventHandler<HTMLSpanElement> | MouseEventHandler<HTMLParagraphElement> | MouseEventHandler<HTMLLabelElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).((instance: HTMLDivElement | null) => void | (() => VoidOrUndefinedOnly) | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | RefObject<HTMLDivElement | null> | ((instance: HTMLSpanElement | null) => void | (() => VoidOrUndefinedOnly) | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | RefObject<HTMLSpanElement | null> | ((instance: HTMLParagraphElement | null) => void | (() => VoidOrUndefinedOnly) | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | RefObject<HTMLParagraphElement | null> | ((instance: HTMLLabelElement | null) => void | (() => VoidOrUndefinedOnly) | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | RefObject<HTMLLabelElement | null> | null | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

TextLink

TextLinkProps

Variants

PropTypeDefault
align
centerendjustifystart
none
leading
normalrelaxedtight
none
measure
nonereadablewide
none
size
baselgsmxlxs
base
tone
accentdefaultdestructiveerrorgradient-cyan-bluegradient-cyan-greengradient-cyan-orangegradient-cyan-pinkgradient-cyan-purplegradient-cyan-redgradient-cyan-violetgradient-pink-violet+6
default
tracking
normaltightwide
none
underline
alwayshovernone
always
weight
boldmediumnormalsemibold
none
wrap
balancenormalnowrappretty
none

Behavior

PropTypeDefault
externalIndicatorDecorative external-link marker; does not change target or accessible name.boolean | undefinednone
Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
downloadanynone
hrefstring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLAnchorElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).Ref<HTMLAnchorElement> | undefinednone
referrerPolicyHTMLAttributeReferrerPolicy | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
targetHTMLAttributeAnchorTarget | undefinednone
titlestring | undefinednone

TruncateText

TruncateTextProps

Behavior

PropTypeDefault
as'div' | 'p' | 'span' | undefinednone
linesnumber | undefinednone

Content

PropTypeDefault
children*stringnone
Inherited HTML props
PropTypeDefault
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLDivElement> | MouseEventHandler<HTMLSpanElement> | MouseEventHandler<HTMLParagraphElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).((instance: HTMLDivElement | null) => void | (() => VoidOrUndefinedOnly) | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | RefObject<HTMLDivElement | null> | ((instance: HTMLSpanElement | null) => void | (() => VoidOrUndefinedOnly) | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | RefObject<HTMLSpanElement | null> | ((instance: HTMLParagraphElement | null) => void | (() => VoidOrUndefinedOnly) | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | RefObject<HTMLParagraphElement | null> | null | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone

VisuallyHidden

VisuallyHiddenProps

Behavior

PropTypeDefault
as'div' | 'span' | undefinednone
focusableReveal on focus-within, for example when containing a skip-link anchor.boolean | undefinednone
Inherited HTML props
PropTypeDefault
childrenReactNodenone
classNamestring | undefinednone
idstring | undefinednone
onClickMouseEventHandler<HTMLDivElement> | MouseEventHandler<HTMLSpanElement> | undefinednone
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).((instance: HTMLDivElement | null) => void | (() => VoidOrUndefinedOnly) | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | RefObject<HTMLDivElement | null> | ((instance: HTMLSpanElement | null) => void | (() => VoidOrUndefinedOnly) | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | RefObject<HTMLSpanElement | null> | null | undefinednone
relstring | undefinednone
styleCSSProperties | undefinednone
titlestring | undefinednone
CSS variable overrides

Typography CSS variables

Override colors, fonts, scale, leading, tracking, measures and rhythm on :root, a theme selector, or a typography wrapper. Dark metric tokens inherit their light overrides when omitted. An initial font, weight or tracking variable leaves the computed property inherited. Private --_zui-type-* properties are implementation details.

552 variables

Pattern: --zui-<component>-<slot?>-<variant?>-<property>-<state?>-dark?

:root {
  --zui-typography-font-display: initial;
  --zui-typography-display-sm-size: 3rem;
  --zui-typography-display-sm-leading: 1.1;
  --zui-typography-display-md-size: 3.75rem;
  --zui-typography-display-md-leading: 1.1;
  --zui-typography-display-lg-size: 4.5rem;
  --zui-typography-display-lg-leading: 1.1;
  --zui-typography-display-sm-fluid-size: clamp(2.25rem,1.5rem + 3vw,3rem);
  --zui-typography-display-md-fluid-size: clamp(2.75rem,1.75rem + 4vw,3.75rem);
  --zui-typography-display-lg-fluid-size: clamp(3rem,1.5rem + 6vw,4.5rem);
  --zui-typography-heading-1-fluid-size: clamp(2.25rem,1.75rem + 2vw,3rem);
  --zui-typography-heading-1-fluid-leading: 1.2;
  --zui-typography-heading-2-fluid-size: clamp(1.875rem,1.625rem + 1vw,2.25rem);
  --zui-typography-heading-2-fluid-leading: 1.2;
  --zui-typography-heading-3-fluid-size: clamp(1.5rem,1.25rem + 1vw,1.875rem);
  --zui-typography-heading-3-fluid-leading: 1.2;
  --zui-typography-heading-4-fluid-size: clamp(1.25rem,1.125rem + 0.5vw,1.5rem);
  --zui-typography-heading-4-fluid-leading: 1.2;
  --zui-typography-heading-5-fluid-size: clamp(1.125rem,1rem + 0.5vw,1.25rem);
  --zui-typography-heading-5-fluid-leading: 1.2;
  --zui-typography-heading-6-fluid-size: clamp(1rem,0.875rem + 0.5vw,1.125rem);
  --zui-typography-heading-6-fluid-leading: 1.2;
  --zui-typography-heading-1-size: 2.25rem;
  --zui-typography-heading-1-leading: calc(2.5/2.25);
  --zui-typography-heading-1-weight: 700;
  --zui-typography-heading-1-tracking: -0.025em;
  --zui-typography-heading-1-size-md: 3rem;
  --zui-typography-heading-1-leading-md: 1;
  --zui-typography-heading-2-size: 1.875rem;
  --zui-typography-heading-2-leading: calc(2.25/1.875);
  --zui-typography-heading-2-weight: 600;
  --zui-typography-heading-2-tracking: -0.025em;
  --zui-typography-heading-3-size: 1.5rem;
  --zui-typography-heading-3-leading: calc(2/1.5);
  --zui-typography-heading-3-weight: 600;
  --zui-typography-heading-3-tracking: -0.025em;
  --zui-typography-heading-4-size: 1.25rem;
  --zui-typography-heading-4-leading: calc(1.75/1.25);
  --zui-typography-heading-4-weight: 600;
  --zui-typography-heading-4-tracking: -0.025em;
  --zui-typography-heading-5-size: 1.125rem;
  --zui-typography-heading-5-leading: calc(1.75/1.125);
  --zui-typography-heading-5-weight: 500;
  --zui-typography-heading-5-tracking: initial;
  --zui-typography-heading-6-size: 1rem;
  --zui-typography-heading-6-leading: 1.5;
  --zui-typography-heading-6-weight: 500;
  --zui-typography-heading-6-tracking: initial;
  --zui-typography-list-gap: 0.5rem;
  --zui-typography-list-indent: 1.25rem;
  --zui-typography-font-body: initial;
  --zui-typography-text-xs-size: 0.75rem;
  --zui-typography-text-xs-leading: 1.625;
  --zui-typography-text-xs-weight: initial;
  --zui-typography-text-xs-tracking: initial;
  --zui-typography-text-sm-size: 0.875rem;
  --zui-typography-text-sm-leading: 1.625;
  --zui-typography-text-sm-weight: initial;
  --zui-typography-text-sm-tracking: initial;
  --zui-typography-text-base-size: 1rem;
  --zui-typography-text-base-leading: 1.625;
  --zui-typography-text-base-weight: initial;
  --zui-typography-text-base-tracking: initial;
  --zui-typography-text-lg-size: 1.125rem;
  --zui-typography-text-lg-leading: 1.625;
  --zui-typography-text-lg-weight: initial;
  --zui-typography-text-lg-tracking: initial;
  --zui-typography-text-xl-size: 1.25rem;
  --zui-typography-text-xl-leading: 1.625;
  --zui-typography-text-xl-weight: initial;
  --zui-typography-text-xl-tracking: initial;
  --zui-typography-quote-attribution-gap: 0.75rem;
  --zui-typography-quote-attribution-size: 0.875rem;
  --zui-typography-quote-attribution-leading: calc(1.25/0.875);
  --zui-typography-quote-border-width: 4px;
  --zui-typography-quote-padding-y: 0.25rem;
  --zui-typography-quote-padding-start: 1rem;
  --zui-typography-quote-gap: 0.5rem;
  --zui-typography-quote-leading: 1.625;
  --zui-typography-code-padding: 1rem;
  --zui-typography-code-size: 0.875rem;
  --zui-typography-code-leading: 1.625;
  --zui-typography-code-bg: color-mix(in oklab,var(--color-white,#fff) 90%,transparent);
  --zui-typography-code-border: color-mix(in oklab,var(--color-white,#fff) 10%,transparent);
  --zui-typography-code-shadow: oklch(12.9% 0.042 264.695 / 0.4);
  --zui-typography-font-mono: var(--font-mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);
  --zui-typography-code-content-size: 0.95em;
  --zui-typography-description-row-gap: 1rem;
  --zui-typography-description-column-gap: 1rem;
  --zui-typography-description-value-gap: 0.375rem;
  --zui-typography-description-rule-color: #cbd5e1;
  --zui-typography-description-columns: minmax(0,1fr) minmax(0,2fr);
  --zui-typography-description-rule-width: 1px;
  --zui-typography-description-separator-padding: 1rem;
  --zui-typography-description-term-weight: 500;
  --zui-typography-drop-cap-gap: 0.15em;
  --zui-typography-drop-cap-size: 3.5em;
  --zui-typography-drop-cap-leading: 0.9;
  --zui-typography-expandable-gap: 0.5rem;
  --zui-typography-expandable-fg: #0369a1;
  --zui-typography-expandable-focus-width: 2px;
  --zui-typography-expandable-focus-offset: 2px;
  --zui-typography-expandable-focus-color: #0284c7;
  --zui-typography-footnote-scroll-margin: 6rem;
  --zui-typography-footnote-focus-width: 2px;
  --zui-typography-footnote-focus-offset: 2px;
  --zui-typography-footnote-focus-ring: var(--zui-typography-link-focus-ring,#0369a1);
  --zui-typography-link-focus-ring: #0369a1;
  --zui-typography-footnote-reference-gap: 0.125em;
  --zui-typography-footnotes-margin: 1.5rem;
  --zui-typography-footnotes-padding: 1rem;
  --zui-typography-footnotes-indent: 1.5rem;
  --zui-typography-footnotes-gap: 0.75rem;
  --zui-typography-footnotes-border-width: 1px;
  --zui-typography-footnotes-border-color: #cbd5e1;
  --zui-typography-footnotes-size: 0.875rem;
  --zui-typography-footnotes-leading: 1.6;
  --zui-typography-highlight-bg: color-mix(in oklab,var(--color-amber-400,oklch(82.8% 0.189 84.429)) 15%,transparent);
  --zui-typography-inline-code-padding-x: 0.375rem;
  --zui-typography-inline-code-padding-y: 0.125rem;
  --zui-typography-inline-code-size: 0.925em;
  --zui-typography-inline-code-weight: 400;
  --zui-typography-inline-code-bg: color-mix(in oklab,var(--color-white,#fff) 6%,transparent);
  --zui-typography-inline-code-border: color-mix(in oklab,var(--color-white,#fff) 10%,transparent);
  --zui-typography-leading-tight: 1.25;
  --zui-typography-leading-normal: 1.5;
  --zui-typography-leading-relaxed: 1.625;
  --zui-typography-link-underline-offset: 0.2em;
  --zui-typography-link-underline-width: 1px;
  --zui-typography-link-indicator-size: 0.875em;
  --zui-typography-link-indicator-gap: 0.25em;
  --zui-typography-link-default-fg: var(--zui-typography-default-fg,oklch(20.8% 0.042 265.755));
  --zui-typography-default-fg: oklch(20.8% 0.042 265.755);
  --zui-typography-link-default-hover-fg: var(--zui-typography-link-default-fg,var(--zui-typography-default-fg,oklch(20.8% 0.042 265.755)));
  --zui-typography-link-default-visited-fg: var(--zui-typography-link-default-fg,var(--zui-typography-default-fg,oklch(20.8% 0.042 265.755)));
  --zui-typography-link-muted-fg: var(--zui-typography-muted-fg,oklch(55.4% 0.046 257.417));
  --zui-typography-muted-fg: oklch(55.4% 0.046 257.417);
  --zui-typography-link-muted-hover-fg: var(--zui-typography-link-muted-fg,var(--zui-typography-muted-fg,oklch(55.4% 0.046 257.417)));
  --zui-typography-link-muted-visited-fg: var(--zui-typography-link-muted-fg,var(--zui-typography-muted-fg,oklch(55.4% 0.046 257.417)));
  --zui-typography-link-primary-fg: var(--zui-typography-primary-fg,oklch(52% 0.105 223.128));
  --zui-typography-primary-fg: oklch(52% 0.105 223.128);
  --zui-typography-link-primary-hover-fg: var(--zui-typography-link-primary-fg,var(--zui-typography-primary-fg,oklch(52% 0.105 223.128)));
  --zui-typography-link-primary-visited-fg: var(--zui-typography-link-primary-fg,var(--zui-typography-primary-fg,oklch(52% 0.105 223.128)));
  --zui-typography-link-secondary-fg: var(--zui-typography-secondary-fg,oklch(44.6% 0.043 257.281));
  --zui-typography-secondary-fg: oklch(44.6% 0.043 257.281);
  --zui-typography-link-secondary-hover-fg: var(--zui-typography-link-secondary-fg,var(--zui-typography-secondary-fg,oklch(44.6% 0.043 257.281)));
  --zui-typography-link-secondary-visited-fg: var(--zui-typography-link-secondary-fg,var(--zui-typography-secondary-fg,oklch(44.6% 0.043 257.281)));
  --zui-typography-link-accent-fg: var(--zui-typography-accent-fg,oklch(49.1% 0.27 292.581));
  --zui-typography-accent-fg: oklch(49.1% 0.27 292.581);
  --zui-typography-link-accent-hover-fg: var(--zui-typography-link-accent-fg,var(--zui-typography-accent-fg,oklch(49.1% 0.27 292.581)));
  --zui-typography-link-accent-visited-fg: var(--zui-typography-link-accent-fg,var(--zui-typography-accent-fg,oklch(49.1% 0.27 292.581)));
  --zui-typography-link-destructive-fg: var(--zui-typography-destructive-fg,oklch(58.6% 0.253 17.585));
  --zui-typography-destructive-fg: oklch(58.6% 0.253 17.585);
  --zui-typography-link-destructive-hover-fg: var(--zui-typography-link-destructive-fg,var(--zui-typography-destructive-fg,oklch(58.6% 0.253 17.585)));
  --zui-typography-link-destructive-visited-fg: var(--zui-typography-link-destructive-fg,var(--zui-typography-destructive-fg,oklch(58.6% 0.253 17.585)));
  --zui-typography-link-info-fg: var(--zui-typography-info-fg,oklch(50% 0.134 242.749));
  --zui-typography-info-fg: oklch(50% 0.134 242.749);
  --zui-typography-link-info-hover-fg: var(--zui-typography-link-info-fg,var(--zui-typography-info-fg,oklch(50% 0.134 242.749)));
  --zui-typography-link-info-visited-fg: var(--zui-typography-link-info-fg,var(--zui-typography-info-fg,oklch(50% 0.134 242.749)));
  --zui-typography-link-success-fg: var(--zui-typography-success-fg,oklch(50.8% 0.118 165.612));
  --zui-typography-success-fg: oklch(50.8% 0.118 165.612);
  --zui-typography-link-success-hover-fg: var(--zui-typography-link-success-fg,var(--zui-typography-success-fg,oklch(50.8% 0.118 165.612)));
  --zui-typography-link-success-visited-fg: var(--zui-typography-link-success-fg,var(--zui-typography-success-fg,oklch(50.8% 0.118 165.612)));
  --zui-typography-link-warning-fg: var(--zui-typography-warning-fg,oklch(55.5% 0.163 48.998));
  --zui-typography-warning-fg: oklch(55.5% 0.163 48.998);
  --zui-typography-link-warning-hover-fg: var(--zui-typography-link-warning-fg,var(--zui-typography-warning-fg,oklch(55.5% 0.163 48.998)));
  --zui-typography-link-warning-visited-fg: var(--zui-typography-link-warning-fg,var(--zui-typography-warning-fg,oklch(55.5% 0.163 48.998)));
  --zui-typography-link-error-fg: var(--zui-typography-error-fg,oklch(50.5% 0.213 27.518));
  --zui-typography-error-fg: oklch(50.5% 0.213 27.518);
  --zui-typography-link-error-hover-fg: var(--zui-typography-link-error-fg,var(--zui-typography-error-fg,oklch(50.5% 0.213 27.518)));
  --zui-typography-link-error-visited-fg: var(--zui-typography-link-error-fg,var(--zui-typography-error-fg,oklch(50.5% 0.213 27.518)));
  --zui-typography-list-leading: 1.625;
  --zui-typography-mark-bg: #fef08a;
  --zui-typography-mark-fg: #422006;
  --zui-typography-mark-padding-x: 0.125em;
  --zui-typography-mark-radius: 0.125em;
  --zui-typography-measure: 65ch;
  --zui-typography-measure-wide: 80ch;
  --zui-typography-default-border: #00000026;
  --zui-typography-muted-border: #00000026;
  --zui-typography-primary-border: oklch(86.5% 0.127 207.078 / 0.4);
  --zui-typography-secondary-border: #00000026;
  --zui-typography-accent-border: oklch(81.1% 0.111 293.571 / 0.4);
  --zui-typography-destructive-border: oklch(81% 0.117 11.638 / 0.4);
  --zui-typography-info-border: oklch(82.8% 0.111 230.318 / 0.4);
  --zui-typography-success-border: oklch(84.5% 0.143 164.978 / 0.4);
  --zui-typography-warning-border: oklch(87.9% 0.169 91.605 / 0.4);
  --zui-typography-error-border: oklch(80.8% 0.114 19.571 / 0.4);
  --zui-typography-prose-paragraph-gap: 1.25em;
  --zui-typography-prose-h1-size: 2.25em;
  --zui-typography-prose-heading-weight: 600;
  --zui-typography-prose-heading-leading: 1.25;
  --zui-typography-prose-heading-gap-before: 1.5em;
  --zui-typography-prose-heading-gap-after: 0.5em;
  --zui-typography-prose-h2-size: 1.875em;
  --zui-typography-prose-h3-size: 1.5em;
  --zui-typography-prose-h4-size: 1.25em;
  --zui-typography-prose-h5-size: 1.125em;
  --zui-typography-prose-h6-size: 1em;
  --zui-typography-prose-list-margin: 1.25em;
  --zui-typography-prose-list-indent: 1.5em;
  --zui-typography-prose-list-item-gap: 0.375em;
  --zui-typography-prose-nested-list-margin: 0.5em;
  --zui-typography-prose-quote-border-width: 4px;
  --zui-typography-prose-quote-border: var(--zui-typography-default-border,#00000026);
  --zui-typography-prose-quote-indent: 1em;
  --zui-typography-prose-quote-margin: 1.5em;
  --zui-typography-prose-strong-weight: 700;
  --zui-typography-prose-inline-code-bg: #f1f5f9;
  --zui-typography-prose-inline-code-padding: 0.25em;
  --zui-typography-prose-code-padding: 1em;
  --zui-typography-prose-code-radius: 0.75rem;
  --zui-typography-prose-code-bg: #f1f5f9;
  --zui-typography-prose-code-margin: 1.5em;
  --zui-typography-prose-link-fg: var(--zui-typography-primary-fg,#0e7490);
  --zui-typography-prose-link-hover-fg: #0369a1;
  --zui-typography-prose-link-visited-fg: #6d28d9;
  --zui-typography-prose-rule-margin: 2em;
  --zui-typography-prose-rule-color: #cbd5e1;
  --zui-typography-prose-table-margin: 1.5em;
  --zui-typography-prose-table-cell-padding-x: 0.75em;
  --zui-typography-prose-table-cell-padding-y: 0.5em;
  --zui-typography-prose-table-border-width: 1px;
  --zui-typography-prose-table-border-color: #cbd5e1;
  --zui-typography-prose-image-radius: 0.5rem;
  --zui-typography-prose-figure-margin: 1.5em;
  --zui-typography-prose-caption-size: 0.875em;
  --zui-typography-prose-caption-gap: 0.5em;
  --zui-typography-prose-caption-fg: #64748b;
  --zui-typography-prose-definition-margin: 1.25em;
  --zui-typography-prose-definition-indent: 1.5em;
  --zui-typography-prose-definition-gap: 0.5em;
  --zui-typography-small-size: 0.875em;
  --zui-typography-strong-weight: 700;
  --zui-typography-overline-tracking: 0.1em;
  --zui-typography-overline-leading: 1.5;
  --zui-typography-overline-weight: 500;
  --zui-typography-gradient-pink-violet-from: oklch(59.2% 0.249 0.584);
  --zui-typography-gradient-pink-violet-to: oklch(54.1% 0.281 293.009);
  --zui-typography-gradient-pink-violet-fg: transparent;
  --zui-typography-gradient-pink-violet-border: oklch(81.1% 0.111 293.571 / 0.4);
  --zui-typography-gradient-cyan-violet-from: oklch(60.9% 0.126 221.723);
  --zui-typography-gradient-cyan-violet-to: oklch(54.1% 0.281 293.009);
  --zui-typography-gradient-cyan-violet-fg: transparent;
  --zui-typography-gradient-cyan-violet-border: oklch(81.1% 0.111 293.571 / 0.4);
  --zui-typography-gradient-cyan-blue-from: oklch(60.9% 0.126 221.723);
  --zui-typography-gradient-cyan-blue-to: oklch(54.6% 0.245 262.881);
  --zui-typography-gradient-cyan-blue-fg: transparent;
  --zui-typography-gradient-cyan-blue-border: oklch(80.9% 0.105 251.813 / 0.4);
  --zui-typography-gradient-cyan-green-from: oklch(60.9% 0.126 221.723);
  --zui-typography-gradient-cyan-green-to: oklch(62.7% 0.194 149.214);
  --zui-typography-gradient-cyan-green-fg: transparent;
  --zui-typography-gradient-cyan-green-border: oklch(87.1% 0.15 154.449 / 0.4);
  --zui-typography-gradient-cyan-orange-from: oklch(60.9% 0.126 221.723);
  --zui-typography-gradient-cyan-orange-to: oklch(64.6% 0.222 41.116);
  --zui-typography-gradient-cyan-orange-fg: transparent;
  --zui-typography-gradient-cyan-orange-border: oklch(83.7% 0.128 66.29 / 0.4);
  --zui-typography-gradient-cyan-red-from: oklch(60.9% 0.126 221.723);
  --zui-typography-gradient-cyan-red-to: oklch(57.7% 0.245 27.325);
  --zui-typography-gradient-cyan-red-fg: transparent;
  --zui-typography-gradient-cyan-red-border: oklch(80.8% 0.114 19.571 / 0.4);
  --zui-typography-gradient-cyan-purple-from: oklch(60.9% 0.126 221.723);
  --zui-typography-gradient-cyan-purple-to: oklch(55.8% 0.288 302.321);
  --zui-typography-gradient-cyan-purple-fg: transparent;
  --zui-typography-gradient-cyan-purple-border: oklch(82.7% 0.119 306.383 / 0.4);
  --zui-typography-gradient-cyan-pink-from: oklch(60.9% 0.126 221.723);
  --zui-typography-gradient-cyan-pink-to: oklch(59.2% 0.249 0.584);
  --zui-typography-gradient-cyan-pink-fg: transparent;
  --zui-typography-gradient-cyan-pink-border: oklch(82.3% 0.12 346.018 / 0.4);
  --zui-typography-tracking-tight: -0.025em;
  --zui-typography-tracking-normal: 0em;
  --zui-typography-tracking-wide: 0.025em;
  --zui-typography-weight-normal: 400;
  --zui-typography-weight-medium: 500;
  --zui-typography-weight-semibold: 600;
  --zui-typography-weight-bold: 700;
}

/* Dark theme variables follow the same names with -dark appended. */
.dark {
  --zui-typography-font-display-dark: var(--zui-typography-font-display,initial);
  --zui-typography-display-sm-size-dark: var(--zui-typography-display-sm-size,3rem);
  /* ...same variables with -dark at the end */
}

What it does

Provides Heading, Text, List, Blockquote, InlineCode, CodeBlock, Strong, Emphasis, Small and VisuallyHidden. Fonts, type scale, leading and tracking use paired CSS variable tokens.

Sections

  • Marketing pages with consistent heading scale.
  • Documentation sites with lists and block quotes.
  • Dashboard copy with muted secondary lines.
  • Inline code and fenced samples without bespoke CSS.

Composition and API

Prefer small primitives over prop-heavy wrappers.

Compose bold, italic, underline, and strikethrough via booleans on Heading and Text.

Accessibility

Reserve headings for titles and sections.

Keep contrast sufficient for muted tones against your background; validate blockquotes with readable citations.

Next.js integration notes

Import from `@zentauri-ui/zentauri-components/ui/typography`.

Set NEXT_PUBLIC_SITE_URL so canonical metadata resolves on deploy.

FAQ

Does Typography work with Next.js App Router?

Yes. Primitives are plain React components; use them in server components unless you wrap interactive playgrounds that rely on client hooks.

Can I override styles with Tailwind?

Pass className to merge utilities; tones map to semantic Tailwind text colors aligned with the rest of Zentauri UI.

How do I choose heading levels for accessibility?

Match Heading level to document outline: one h1 per page where appropriate, then descend without skipping ranks inside each region.