moduix

Heading

A typography primitive for semantic headings with library sizing and weight tokens.

API Reference

Heading is a moduix typography primitive. Base UI does not provide a matching heading primitive, so the public API stays focused on semantic element choice, visual variants, and root className composition.

Basic

Build reliable interfaces

import { Heading } from "moduix";export function HeadingDemo() {  return <Heading>Build reliable interfaces</Heading>;}

Full list of component variables available for project-level overrides.

PropertyDefaultDescription
--heading-colorvar(--color-foreground)Controls heading text color.
--heading-font-familyvar(--font-sans)Controls heading font family.
--heading-font-sizesize-dependentControls heading font size for all sizes.
--heading-font-size-xsvar(--text-sm)Controls `xs` heading font size.
--heading-font-size-smvar(--text-md)Controls `sm` heading font size.
--heading-font-size-mdvar(--text-lg)Controls `md` heading font size.
--heading-font-size-lgvar(--text-xl)Controls `lg` heading font size.
--heading-font-size-xlvar(--text-2xl)Controls `xl` heading font size.
--heading-font-size-2xlvar(--text-3xl)Controls `2xl` heading font size.
--heading-font-weightvar(--weight-semibold)Controls heading font weight.
--heading-font-weight-boldvar(--weight-bold)Controls `bold` heading font weight.
--heading-font-weight-mediumvar(--weight-medium)Controls `medium` heading font weight.
--heading-font-weight-regularvar(--weight-regular)Controls `regular` heading font weight.
--heading-font-weight-semiboldvar(--weight-semibold)Controls `semibold` heading font weight.
--heading-letter-spacing0Controls heading letter spacing.
--heading-line-heightsize-dependentControls heading line height for all sizes.
--heading-line-height-xsvar(--line-height-text-sm)Controls `xs` heading line height.
--heading-line-height-smvar(--line-height-text-md)Controls `sm` heading line height.
--heading-line-height-mdvar(--line-height-text-lg)Controls `md` heading line height.
--heading-line-height-lgvar(--line-height-text-xl)Controls `lg` heading line height.
--heading-line-height-xlvar(--line-height-text-2xl)Controls `xl` heading line height.
--heading-line-height-2xlvar(--line-height-text-3xl)Controls `2xl` heading line height.
--heading-text-wrapbalanceControls heading text wrapping.

Interactive variables scoped for docs preview without changing size scale tokens.

PropertyValueDefaultDescription
--heading-colorvar(--color-foreground)Controls heading text color.
--heading-font-familyvar(--font-sans)Controls heading font family.
--heading-letter-spacing0Controls heading letter spacing.
--heading-text-wrapbalanceControls heading text wrapping.

Anatomy

Heading is composed as a single typography root that renders a semantic heading element. Visual style is controlled independently through size, weight, alignment, and CSS variables.

Heading
└─ text or inline content
PartRole
HeadingSemantic heading root with design-system typography and tone props.

Composition

Use as for semantic heading level and size for visual scale when semantics and appearance should differ. Use weight, align, and className for presentation customization.

Heading has no hidden service slots; styling is done directly on the root element.

Examples

Elements

Use as to choose the semantic heading level. Each level has a matching default visual size.

Heading level 1

Heading level 2

Heading level 3

Heading level 4

Heading level 5
Heading level 6
import { Heading } from "moduix";export function HeadingElementsDemo() {  return (    <div className={styles.stack}>      <Heading as="h1">Heading level 1</Heading>      <Heading as="h2">Heading level 2</Heading>      <Heading as="h3">Heading level 3</Heading>      <Heading as="h4">Heading level 4</Heading>      <Heading as="h5">Heading level 5</Heading>      <Heading as="h6">Heading level 6</Heading>    </div>  );}
.stack {  display: flex;  width: min(32rem, calc(100vw - var(--spacing-8)));  flex-direction: column;  gap: var(--spacing-3);}

Sizes

Use size for visual sizing when the semantic level should stay separate from presentation.

Extra-large heading

Large heading

Medium-large heading

Medium heading

Small heading

Extra-small heading

import { Heading } from "moduix";export function HeadingSizesDemo() {  return (    <div className={styles.stack}>      <Heading as="h2" size="2xl">Extra-large heading</Heading>      <Heading as="h2" size="xl">Large heading</Heading>      <Heading as="h2" size="lg">Medium-large heading</Heading>      <Heading as="h2" size="md">Medium heading</Heading>      <Heading as="h2" size="sm">Small heading</Heading>      <Heading as="h2" size="xs">Extra-small heading</Heading>    </div>  );}
.stack {  display: flex;  width: min(32rem, calc(100vw - var(--spacing-8)));  flex-direction: column;  gap: var(--spacing-3);}

Weights

Use weight for the intended emphasis without adding a custom class.

Regular weight

Medium weight

Semibold weight

Bold weight

import { Heading } from "moduix";export function HeadingWeightsDemo() {  return (    <div className={styles.stack}>      <Heading as="h2" weight="regular">Regular weight</Heading>      <Heading as="h2" weight="medium">Medium weight</Heading>      <Heading as="h2" weight="semibold">Semibold weight</Heading>      <Heading as="h2" weight="bold">Bold weight</Heading>    </div>  );}
.stack {  display: flex;  width: min(32rem, calc(100vw - var(--spacing-8)));  flex-direction: column;  gap: var(--spacing-3);}

Alignment

Use align to set text alignment without adding custom CSS.

Left aligned

Center aligned

Right aligned

import { Heading } from "moduix";export function HeadingAlignedDemo() {  return (    <div className={styles.aligned}>      <Heading as="h2" align="left">Left aligned</Heading>      <Heading as="h2" align="center">Center aligned</Heading>      <Heading as="h2" align="right">Right aligned</Heading>    </div>  );}
.aligned {  display: flex;  width: min(32rem, calc(100vw - var(--spacing-8)));  flex-direction: column;  gap: var(--spacing-4);}

Semantic Level

Keep document outline and visual size independent by combining as and size.

Page title rendered as h2

import { Heading } from "moduix";export function SemanticHeadingDemo() {  return (    <Heading as="h2" size="2xl">      Page title rendered as h2    </Heading>  );}

Custom Styles

Pass className when styling the root with CSS Modules, Tailwind CSS, or CSS-in-JS.

Customized heading

import { Heading } from "moduix";export function CustomHeadingDemo() {  return (    <Heading as="h2" className={styles.customHeading}>      Customized heading    </Heading>  );}
.customHeading {  --heading-color: var(--color-primary);  --heading-font-size-xl: var(--text-3xl);  --heading-line-height-xl: var(--line-height-text-3xl);  --heading-font-weight-semibold: var(--weight-bold);}

On this page