Skip to content

Typography

Bumi uses four font families, each with a distinct role. The combination of serif titles, sans-serif body, and monospace data creates a clear visual hierarchy without relying on color.

Lora — Page Titles
Plus Jakarta Sans — Headings & Labels
Inter — Body text for descriptions, table cells, and long-form content
JetBrains Mono — Rp 12.450.000 · TXN-28491 · 14:32

Font Families

Display: Plus Jakarta Sans

The primary UI typeface. Designed by Tokotype, an Indonesian type foundry. Used for headings, labels, navigation, and UI chrome.

css
font-family: 'Plus Jakarta Sans', system-ui, -apple-system, sans-serif;

Serif: Lora

Used exclusively for page titles. Adds editorial weight and distinguishes the page-level heading from all other text.

css
font-family: 'Lora', Georgia, 'Times New Roman', serif;

Body: Inter

The workhorse. Used for body text, descriptions, table cells, and long-form content. Optimized for screen readability.

css
font-family: 'Inter', system-ui, -apple-system, sans-serif;

Mono: JetBrains Mono

Used for numerical data, prices, SKUs, timestamps, transaction IDs, and code. Monospace alignment makes columns of numbers easy to scan.

css
font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace;

Type Scale

SizepxremUsage
Micro10px0.625Micro labels, legal text
Badge11px0.6875Badges, pills, status tags
Label12px0.75Labels, metadata, timestamps
Body Small13px0.8125Nav items, secondary body text
Body14px0.875Default body text, table cells
Body Large16px1.0Emphasized body, intro paragraphs
Card Title18px1.125Card headings, dialog titles
Section Header24px1.5Section headings (Jakarta Sans)
Sub-page Title28px1.75Sub-page headings (Jakarta Sans)
Page Title32px2.0Page titles (Lora)
Type Scale Preview
10px
Micro — Legal text, fine print disclaimers
11px
Badge — Status tags, pill labels
12px
Label — Metadata, timestamps, table headers
13px
Body Small — Nav items, secondary body text
14px
Body — Default body text, table cells, descriptions
16px
Body Large — Emphasized body, intro paragraphs
18px
Card Title — Dialog titles, card headings
24px
Section Header
28px
Sub-page Title
32px
Page Title

Font Weights

WeightValueUsage
Regular400Body text, descriptions
Medium500Labels, nav items, medium emphasis
Semibold600Card titles, emphasis, table headers
Bold700Section headings, strong emphasis
Extrabold800Display numbers (dashboard KPIs)
Font Weight Preview
Regular 400 — Body text and descriptions
Medium 500 — Labels, nav items
Semibold 600 — Card titles, table headers
Bold 700 — Section headings
Extrabold 800 — Dashboard KPIs

Line Height

ContextValueUsage
Display1.1Page titles, large headings
Headings1.3Section headers, card titles
Body1.5Default body text
Long text1.6Paragraphs, descriptions, help text

Letter Spacing

ContextValueUsage
Display / Serif-0.02emPage titles in Lora
Body0Default --- no adjustment
Uppercase labels0.04emSection group labels, tab labels
Section labels0.08emSidebar section headers, overlines

Usage by Context

Page Title

css
.page-title {
  font-family: 'Lora', Georgia, serif;
  font-size: 32px;
  font-weight: 400; /* Lora looks best at normal weight */
  line-height: 1.1;
  letter-spacing: -0.02em;
  color: var(--text-1);
}

Section Header

css
.section-header {
  font-family: 'Plus Jakarta Sans', system-ui, sans-serif;
  font-size: 24px;
  font-weight: 700;
  line-height: 1.3;
  color: var(--text-1);
}

Card Title

css
.card-title {
  font-family: 'Plus Jakarta Sans', system-ui, sans-serif;
  font-size: 18px;
  font-weight: 600;
  line-height: 1.3;
  color: var(--text-1);
}

Body Text

css
.body {
  font-family: 'Inter', system-ui, sans-serif;
  font-size: 14px;
  font-weight: 400;
  line-height: 1.5;
  color: var(--text-1);
}

Data / Numbers

css
.data {
  font-family: 'JetBrains Mono', monospace;
  font-size: 14px;
  font-weight: 400;
  line-height: 1.5;
  font-variant-numeric: tabular-nums;
  color: var(--text-1);
}
Usage Context Preview
Penjualan Hari Ini
Ringkasan transaksi per shift kasir
Total Penjualan
Rp 12.450.000
Transaksi
847
Rata-rata
Rp 14.700
css
.sidebar-section {
  font-family: 'Plus Jakarta Sans', system-ui, sans-serif;
  font-size: 11px;
  font-weight: 600;
  line-height: 1.3;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-3);
}

Badge / Pill

css
.badge {
  font-family: 'Plus Jakarta Sans', system-ui, sans-serif;
  font-size: 11px;
  font-weight: 600;
  line-height: 1;
  letter-spacing: 0.02em;
}

Loading Fonts (Web)

Add to your HTML <head> or import in CSS:

html
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Lora&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&family=Plus+Jakarta+Sans:wght@500;600;700;800&display=swap" rel="stylesheet">

Mobile Font Strategy

On mobile (React Native), loading four web fonts impacts startup time and bundle size. Use this approach:

RoleFontMobile Strategy
HeadingsPlus Jakarta SansLoad via expo-font --- this is our identity font
Serif titlesLoraSkip --- use Jakarta Sans bold instead
BodyInterUse system font (San Francisco on iOS, Roboto on Android)
MonoJetBrains MonoUse system monospace (Platform.select({ ios: 'Menlo', android: 'monospace' }))
tsx
// React Native font loading
import { useFonts } from 'expo-font';

const [fontsLoaded] = useFonts({
  'PlusJakartaSans-Medium': require('../assets/fonts/PlusJakartaSans-Medium.ttf'),
  'PlusJakartaSans-SemiBold': require('../assets/fonts/PlusJakartaSans-SemiBold.ttf'),
  'PlusJakartaSans-Bold': require('../assets/fonts/PlusJakartaSans-Bold.ttf'),
});

DO and DON'T

DO

  • Use Lora for the single top-level page title only
  • Use JetBrains Mono for all prices, quantities, IDs, and timestamps
  • Use tabular-nums (font-variant-numeric: tabular-nums) for numbers in tables
  • Keep body text at 14px --- this is the readable default for dense data apps

DON'T

  • Don't use Lora for card titles, section headers, or labels --- that is Jakarta Sans territory
  • Don't use more than two font families in a single component
  • Don't go below 10px for any text (accessibility)
  • Don't use font-weight 300 (light) --- it lacks presence on low-DPI screens

RetailOS - Sistem ERP Retail Modern untuk Indonesia