Skip to Content
FoundationsTypography

Typography

Typography in the Mukoko design system uses three font families, each with a specific purpose. The font choices prioritize African language support and readability across diverse devices.

Font stack

RoleFontCSS VariableWhy
BodyNoto Sans--font-sansBroad language coverage, excellent screen readability
DisplayNoto Serif--font-serifElegant headings, cultural weight for page titles
CodeJetBrains Mono--font-monoMonospaced, ligatures for code samples

Loading fonts

Use next/font/google for automatic optimization and subsetting:

import { Noto_Sans, Noto_Serif, JetBrains_Mono } from "next/font/google" const fontSans = Noto_Sans({ subsets: ["latin"], variable: "--font-sans" }) const fontSerif = Noto_Serif({ subsets: ["latin"], variable: "--font-serif" }) const fontMono = JetBrains_Mono({ subsets: ["latin"], variable: "--font-mono" })

Apply the variables to <html> and set the default with font-sans on <body>.

Type scale

The type scale uses Tailwind’s default sizing with specific guidance for Mukoko apps:

NameClassSizeLine heightUsage
Displaytext-5xl48px1.1Hero headlines
Title 1text-4xl36px1.15Page titles
Title 2text-3xl30px1.2Section titles
Title 3text-2xl24px1.25Subsection titles
Headingtext-xl20px1.3Card titles
Subheadingtext-lg18px1.5Lead paragraphs
Bodytext-base16px1.5Default body text
Captiontext-sm14px1.5Secondary text, labels
Footnotetext-xs12px1.5Metadata, timestamps
Microtext-[10px]10px1.4Version numbers, badges

When to use serif vs sans

Noto Serif (display/headings):

  • Page titles and hero headlines
  • Brand-level messaging
  • Section headings on landing pages
  • The word “mukoko” in display contexts

Noto Sans (body/UI):

  • All body text and paragraphs
  • UI labels, buttons, inputs
  • Navigation items
  • Card content
  • Error messages and notifications
{/* Serif for page titles */} <h1 className="font-serif text-4xl font-bold tracking-tight"> mukoko weather </h1> {/* Sans for body content */} <p className="text-base text-muted-foreground"> AI-powered weather intelligence for Zimbabwe. </p>

Heading hierarchy

Use heading levels sequentially — never skip from h1 to h3:

<h1>Page title</h1> {/* One per page */} <h2>Major section</h2> <h3>Subsection</h3> <h3>Subsection</h3> <h2>Major section</h2> <h3>Subsection</h3> <h4>Detail</h4>

Every page must have exactly one <h1>. Screen readers use heading hierarchy to build a page outline.

Line height and letter spacing

ContextLine heightLetter spacing
Display textleading-tight (1.1-1.2)tracking-tight (-0.025em)
Body textleading-relaxed (1.5)Default (0)
UI labelsleading-normal (1.5)Default (0)
All caps textleading-normaltracking-widest (0.1em)
Codeleading-relaxedDefault (0)

Tight tracking on display text prevents large headings from looking too spread out. Wide tracking on all-caps labels improves readability.

Brand wordmarks

All Mukoko ecosystem brand names are rendered in lowercase:

  • mukoko
  • nyuchi
  • shamwari
  • bundu
  • nhimbe
  • bushtrade
  • lingo

This is a brand rule, not a suggestion. The lowercase treatment is part of the visual identity.

Typography component

The registry includes a typography component with pre-styled elements:

import { TypographyH1, TypographyH2, TypographyP, TypographyLead } from "@/components/ui/typography" <TypographyH1>Page title</TypographyH1> <TypographyLead>Introductory paragraph with larger text.</TypographyLead> <TypographyH2>Section heading</TypographyH2> <TypographyP>Standard body paragraph.</TypographyP>

Install it via:

npx shadcn@latest add https://registry.mukoko.com/api/v1/ui/typography
Last updated on