Plinth v1.0 · Operator theme

Styleguide

Phase 0 components in both themes. Every colour and size comes from tokens.css; compare against the Plinth canvas.

Page theme: light
light

Buttons

Primary, secondary, tertiary, destructive, destructive-secondary · sm 32 / md 40 / lg 48 · loading, disabled

Variants
Sizes
States
Icon

Status pills, tags, badges

Colour never alone: dot or icon plus label. Five statuses, never a sixth.

SubtlePaidAwaiting approvalOverdueScheduledDraft
Iconsuccesswarningdangerinfoneutral
Outlinesuccesswarningdangerinfoneutral
Tags, badgesMeat & fishDeliveroo31299+

Stat tiles

One number, one comparison, one sentence. Delta coloured by sentiment, value never coloured.

Cash today
£84.2k
+£6,400vs 1 Aug
Covers 11 weeks of costs at the current run rate.
Bills due in 14 days
£31.9k
0.0%12 bills
3 need your approval.
Labour % of sales
31.2%
+2.1 ptsvs target
Saturday overtime at Great Titchfield Street.
Sales this month
Money£1,240.50−£1,240.50£12.4k£1,240.50−£1,240.50£1,240.50
Delta+4.2%−1.8%0.0%+£310

Queue items

Plain sentence, context, suggested action. Tapping the row opens the record.

Brakes bill for £1,240.50 is waiting for approval
Great Titchfield Street · due in 3 days
Bank feed disconnected since Monday
Current account
14 transactions need a category
Last 7 days

Table

Sort, selection, priority columns, mobile card fallback below 768px. Numbers right-aligned, never centred.

Nothing here yet
Bills you capture will appear here.

Toasts, alerts

Inverse toast bottom-left, 4 s; undo defers the commit 8 s; errors persist.

Trigger
2 invoices are missing VAT numbers. Fix or exclude them before you submit.
VAT threshold at 92%. Registration is likely due next month.

Approval card → receipt

Summary in sentences, one primary action, then the card becomes the receipt in place.

You’re approving a bill from Brakes for £1,240.50, due 12 Sep 2026. It will be paid from Tikkas · Current account on the due date.
Reference
INV-48213
Category
Meat & fish
Requested by
Priya
Priya will be notified. You can cancel until it's paid.
dark

Buttons

Primary, secondary, tertiary, destructive, destructive-secondary · sm 32 / md 40 / lg 48 · loading, disabled

Variants
Sizes
States
Icon

Status pills, tags, badges

Colour never alone: dot or icon plus label. Five statuses, never a sixth.

SubtlePaidAwaiting approvalOverdueScheduledDraft
Iconsuccesswarningdangerinfoneutral
Outlinesuccesswarningdangerinfoneutral
Tags, badgesMeat & fishDeliveroo31299+

Stat tiles

One number, one comparison, one sentence. Delta coloured by sentiment, value never coloured.

Cash today
£84.2k
+£6,400vs 1 Aug
Covers 11 weeks of costs at the current run rate.
Bills due in 14 days
£31.9k
0.0%12 bills
3 need your approval.
Labour % of sales
31.2%
+2.1 ptsvs target
Saturday overtime at Great Titchfield Street.
Sales this month
Money£1,240.50−£1,240.50£12.4k£1,240.50−£1,240.50£1,240.50
Delta+4.2%−1.8%0.0%+£310

Queue items

Plain sentence, context, suggested action. Tapping the row opens the record.

Brakes bill for £1,240.50 is waiting for approval
Great Titchfield Street · due in 3 days
Bank feed disconnected since Monday
Current account
14 transactions need a category
Last 7 days

Table

Sort, selection, priority columns, mobile card fallback below 768px. Numbers right-aligned, never centred.

Nothing here yet
Bills you capture will appear here.

Toasts, alerts

Inverse toast bottom-left, 4 s; undo defers the commit 8 s; errors persist.

Trigger
2 invoices are missing VAT numbers. Fix or exclude them before you submit.
VAT threshold at 92%. Registration is likely due next month.

Approval card → receipt

Summary in sentences, one primary action, then the card becomes the receipt in place.

You’re approving a bill from Brakes for £1,240.50, due 12 Sep 2026. It will be paid from Tikkas · Current account on the due date.
Reference
INV-48213
Category
Meat & fish
Requested by
Priya
Priya will be notified. You can cancel until it's paid.

Tokens (from tokens.css)

Left swatch light, right swatch dark. Compare with the Plinth canvas Foundations board.

surface
--canvas#F6F7F8#121417
--surface#FFFFFF#1A1D21
--surface-raised#FFFFFF#22262C
--surface-overlay#FFFFFF#282D34
--sunken#EEF0F2#121417
--hover#FBFBFC#1F2328
--selected#EEF0F2#22262C
border
--border-subtle#E3E6EA#262B31
--border#CFD4DA#33393F
--border-strong#878F99#6B7380
text
--text#1A1D21#F3F4F6
--text-2#545C68#A6ADB7
--text-3#6B7380#8B929C
--text-dis#9AA1AB#5C6470
--text-inv#FFFFFF#121417
icon
--icon#3D444E#CFD4DA
--icon-2#6B7380#8B929C
accent
--accent#1A1D21#F3F4F6
--accent-hover#282D34#E3E6EA
--accent-active#3D444E#CFD4DA
--accent-fg#FFFFFF#121417
--accent-subtle#EEF0F2#22262C
--accent-subtle-fg#1A1D21#F3F4F6
signal
--signal#2860D8#7FA6FF
--signal-subtle#E9F0FE#14213F
success
--success#197A43#5DD38A
--success-fill#197A43#4CC38F
--success-subtle#E6F4EC#10281A
--success-border#9FD4B5#1F5A36
warning
--warning#8A5A0F#E8B04B
--warning-fill#D9962B#E8B04B
--warning-subtle#FCF2E3#2C2210
--warning-border#EBCB8B#6B4E14
danger
--danger#C93B3B#F47C7C
--danger-fill#C93B3B#E45C5C
--danger-subtle#FDEFEF#331717
--danger-border#F0B3B3#7A2E2E
info
--info#2860D8#7FA6FF
--info-fill#2860D8#6B8DEE
--info-subtle#E9F0FE#14213F
--info-border#A9C3F5#2E4A8F
neutral
--neutral#545C68#A6ADB7
--neutral-subtle#EEF0F2#22262C
--neutral-border#CFD4DA#454C55
chart
--chart-primary#1A1D21#F3F4F6
--chart-secondary#9AA1AB#6B7380
--chart-tertiary#CFD4DA#454C55
--chart-forecast#3B6FE0#6B8DEE
--chart-grid#EEF0F2#262B31
--chart-axis#CFD4DA#33393F
--chart-axis-text#6B7380#8B929C
--chart-pos#197A43#5DD38A
--chart-neg#C93B3B#F47C7C
--chart-target#2860D8#7FA6FF
shadow
--shadow-10 1px 2px rgba(11,12,14,.06)none
--shadow-20 4px 12px rgba(11,12,14,.08), 0 1px 3px rgba(11,12,14,.06)0 4px 12px rgba(0,0,0,.4)
--shadow-30 16px 40px rgba(11,12,14,.16), 0 2px 8px rgba(11,12,14,.08)0 16px 40px rgba(0,0,0,.6)
toast
--toast-bg#1A1D21#282D34
--toast-fg#FFFFFF#F3F4F6
type
--type-display-lg40px/44px
--type-display32px/36px
--type-title-lg24px/28px
--type-title20px/24px
--type-heading17px/22px
--type-subheading15px/20px
--type-body-lg17px/24px
--type-body15px/20px
--type-body-sm13px/18px
--type-label13px/16px
--type-caption12px/16px
--type-overline11px/16px
--type-mono13px/18px
space
--space-12px
--space-24px
--space-38px
--space-412px
--space-516px
--space-624px
--space-732px
--space-848px
--space-964px
radius
--radius-xs4px
--radius-sm6px
--radius-md8px
--radius-lg12px
--radius-xl16px
--radius-full9999px
control
--control-sm32px
--control-md40px
--control-touch44px
--control-lg48px
font
--font-sans-apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI Variable Text", "Segoe UI", Roboto, "Helvetica Neue", Arial, system-ui, sans-serif
--font-monoui-monospace, "SF Mono", Menlo, monospace