Design system
Every component variant, rendered in light and dark at the same time. Copy the exact classes from here - do not paraphrase them, and never reach for a raw Tailwind palette colour.
Temporary palette
scripts/design/gen-tokens.ts from design/tokens.json once a proposal is approved. The token names, the component APIs and this page’s structure are the stable part.Semantic tokens
Every colour in the app comes from one of these. Raw Tailwind palette classes do not exist here.
bg
bg-secondary
bg-tertiary
surface
surface-alt
border
border-strong
primary
accent
success
warning
error
info
focus
text tiers
text - primary reading colour
text-secondary - supporting copy
text-tertiary - hints, timestamps, disabled
Family accents
The four type families. Each has a paired on-accent colour for text drawn on top of it.
solid
soft
Form controls
Shown on the public profile.
That username is already taken.
Read-only, set at migration.
Publishing refuses anything that is not approved in all 9 locales.
Markdown. Rendered with PvMarkdown in the app.
Badge
soft
solid
with a leading dot
Card
Content version
Currently published to production.
- Version
- 2026.08.24-1
- Locales
- 9 / 9 approved
Bare card
12,480
Results computed in the last 30 days
Alert
Info
Success
Warning
Error
With actions
Modal & dropdown
Shown both as a live trigger and as a static preview, so the panel is visible in a screenshot.
live
static preview
Delete account
This runs the deleteAccount callable and is irreversible.
View profile
Override entitlement
Delete account
Spinner & skeleton
spinner
skeleton
Table
| User | Type | Locale | Status | Score |
|---|---|---|---|---|
| ada@example.com | NFINFJ | en | complete | 86 |
| grace@example.com | NTENTJ | it | partial | 41 |
| linus@example.com | SPISTP | de | abandoned | 12 |
| hedy@example.com | SJESFJ | ja | complete | 93 |
Tabs
The source locale. Everything else is adapted from it.
Pagination
Empty state
No feedback yet
Feedback submitted from the app lands here, newest first, with the reporter's locale and app version.
Semantic tokens
Every colour in the app comes from one of these. Raw Tailwind palette classes do not exist here.
bg
bg-secondary
bg-tertiary
surface
surface-alt
border
border-strong
primary
accent
success
warning
error
info
focus
text tiers
text - primary reading colour
text-secondary - supporting copy
text-tertiary - hints, timestamps, disabled
Family accents
The four type families. Each has a paired on-accent colour for text drawn on top of it.
solid
soft
Form controls
Shown on the public profile.
That username is already taken.
Read-only, set at migration.
Publishing refuses anything that is not approved in all 9 locales.
Markdown. Rendered with PvMarkdown in the app.
Badge
soft
solid
with a leading dot
Card
Content version
Currently published to production.
- Version
- 2026.08.24-1
- Locales
- 9 / 9 approved
Bare card
12,480
Results computed in the last 30 days
Alert
Info
Success
Warning
Error
With actions
Modal & dropdown
Shown both as a live trigger and as a static preview, so the panel is visible in a screenshot.
live
static preview
Delete account
This runs the deleteAccount callable and is irreversible.
View profile
Override entitlement
Delete account
Spinner & skeleton
spinner
skeleton
Table
| User | Type | Locale | Status | Score |
|---|---|---|---|---|
| ada@example.com | NFINFJ | en | complete | 86 |
| grace@example.com | NTENTJ | it | partial | 41 |
| linus@example.com | SPISTP | de | abandoned | 12 |
| hedy@example.com | SJESFJ | ja | complete | 93 |
Tabs
The source locale. Everything else is adapted from it.
Pagination
Empty state
No feedback yet
Feedback submitted from the app lands here, newest first, with the reporter's locale and app version.