Skip to content

Typography

Player 1 Inventory uses the system sans-serif stack for all UI text. The system font renders crisply at any weight, requires no network request, and matches the native feel of each platform — appropriate for a grocery app where users scan lists quickly.

Rosario (--font-rosario) is reserved for the app name only, consistent with its sister app GW2 Inventory. It is a humanist serif that adds warmth and brand recognition to the wordmark without affecting readability of content text.

Fonts

RoleTypefaceTokenHow to use
App name onlyRosario (variable, 300–700)--font-rosario / font-rosario Tailwind utilityApply only to the app name wordmark
All UI textSystem sans-serif(none — browser default)No class needed; body inherits automatically

Rosario is loaded via a <link> in apps/web/index.html and mapped as a Tailwind utility via @theme:

apps/web/src/design-tokens/index.css
@theme {
--font-rosario: 'Rosario', sans-serif;
}

For the app name, apply the utility class:

<span className="font-rosario">Player 1 Inventory</span>

All other text inherits the system sans-serif from body — no utility class needed.

Type scale

The app uses Tailwind’s default type scale. No custom size tokens are defined.

Welcome to Player 1 Inventory
Onboarding welcome title — not used in main app
text-2xl / 1.5rem
Choose from a template
Onboarding headings — not used in main app
text-xl / 1.25rem
Costco
Page title (h1) — vendor / shelf / recipe detail headers
text-base / 1rem
Organic Whole Milk
Card titles, button labels, section headings, form labels
text-sm / 0.875rem · font-medium
Your data is stored on this device
Card descriptions (default), body text, dropdown items, navigation labels
text-sm / 0.875rem · font-normal
3 / 8 active · 2 low stock · dairy
CardMetadata, badges, fine print, secondary stats and counts
text-xs / 0.75rem

The app deliberately uses a compact scale. The largest size in regular UI is text-base (page titles); most content sits at text-sm and text-xs. Sizes above text-base appear only in the onboarding flow (/onboarding).

When to use each step

Heading scale

LevelClassExample context
h1text-base font-regularPage title in LayoutInnerPages, pantry detail view headers
h2text-sm font-medium uppercaseForm section headers (e.g. “Quantities”, “Advanced”)
Onboarding onlytext-xl / text-2xlWelcome screen — isolated to /onboarding, not part of main app hierarchy

h3 elements are rare in the app. CardTitle (the most common card heading element) renders as text-sm font-medium leading-tight by default.

Content scale

These reflect actual usage across the app for non-heading UI text:

SizeClassUse
text-base16 pxButton large (lg), page title
text-sm14 pxDefault body text, card content, form labels, button default, dropdown items, navigation labels, card descriptions (default)
text-xs12 pxBadges, fine print, helper text, secondary metadata, card descriptions (many components override CardDescription to text-xs), group card counts

Sizes below text-xs and above text-base are not used in the main app.

Component typography defaults

ComponentDefault classNotes
CardTitletext-sm font-medium leading-tightPrimary content heading
CardDescriptiontext-sm text-foreground-mutedSecondary labels and short descriptive copy
CardMetadatatext-xs text-foreground-mutedCompact supplementary data — item counts, stats, badge-style info
Button (default size)text-sm font-medium
Button (lg size)text-base font-medium
Button (xs / sm size)text-xs font-medium
Badgetext-xs capitalizeNo weight override — inherits font-normal
Labeltext-sm font-normal leading-noneForm field labels

Weight conventions

WeightTailwind classUsage
400font-regular / font-normalPage titles (h1), body text — font-regular is used in the codebase as an alias for the normal weight
500font-mediumCard titles, button labels, section headings, form labels, all button sizes
600font-semiboldDialog titles, alert titles, dropdown menu items
700font-boldNot used in production UI — reserved for future intentionally heavy emphasis

Line height

The app’s body rule sets a compact base line height:

body {
line-height: 1.25em;
}

Individual components override this with leading-tight as needed — CardTitle uses it by default.

Uppercase labels

Form section headers use a distinct small-caps treatment:

<h2 className="text-sm font-medium uppercase">Quantities</h2>

This pattern is intentional — the reduced size, medium weight, and uppercase transform together signal a non-interactive group header that sits above form fields without competing with field labels.

Name display convention

Entity names (items, tags, recipes) are displayed in title case using Tailwind’s capitalize class. This is purely visual — stored values are unchanged, so search and comparison logic is unaffected.

Vendor names are excluded — vendors may use intentional casing (e.g. “iHerb”, “7-Eleven”). Vendor badges explicitly add normal-case to override the Badge component’s built-in capitalize.

Mono font

No custom mono font token is defined. The Starlight documentation site falls back to its default system mono stack for code blocks.