Design standard

How Bridgeplay looks and reads today, for Mac players who know Steam and do not know Wine.

Version 2 · November 2026 · Values and owners are in docs/DESIGN.md

Principles

Seven rules. When in doubt, the second one decides.

Answer "can I play?" first
One headline, then the details.
When unsure, do what macOS does
Standard controls, dialogs, menus and wording.
Black canvas, near-white type, hairlines
No shadows, except on things that float.
The gradient marks emphasis only
Progress, a value's extent, on, done. Never a button.
One white button
Per row, or per step.
Say what is kept
Whenever something installs, repairs or removes.
Stay quiet
News waits in a banner. Motion stops under Reduce Motion.

Leave to macOS

NeedUseNot
A choice with a cost.confirmationDialog, title visibleA custom modal
Page actionsToolbar items with a symbol and .helpButtons in the page
CommandsThe menu bar, with ⌘ shortcutsA gear menu
A list with columnsTableA hand-built grid
Nothing to showContentUnavailableView"No data"
Updates, AboutSparkle's window, the standard panelOur own

Colour

One black canvas, three inks, one gradient. The app is dark only. Click a swatch to copy it.

BP.* in BridgeplayUI/BridgeplayTheme.swift

Don't A gradient button

Do White for the action, gradient for how far

Installed

Don't Coloured text as status

Ready.Update available.Missing.Not installed.

Do A dot, and words that say it

Type

Geist for everything. Unbounded for the wordmark only. Regular, medium and semibold.

BP.sans(size, weight) · numbers that change use .monospacedDigit()

Space and radius

There are no spacing tokens yet. These are the values in use.

2Title to caption
8Between buttons
12Icon to text
16Row side padding
20Page gutter
28Wizard gutter
12 · card
8 · sidebar item
7 · badge
Capsule · pill

Rounded rectangles are .continuous. Borders are 1 pt, drawn inside.

Motion

Short, and off under Reduce Motion. Try them.

Scale 0.97 · ease-out 0.18 s

Switch · ease-out 0.18 s

Your MacGraphicsSteamSet UpDone

Click to move on · spring 0.42 / 0.86

Skeleton shimmer · linear 1.4 s

Icons

SF Symbols only. These drawings stand in for them, since a web page cannot embed the real ones.

checklist
slider.horizontal.3
externaldrive
book
arrow.clockwise
arrow.counterclockwise
folder
ellipsis
checkmark
xmark

Sidebar 13 pt medium · small glyphs 11 semibold · badge glyphs 10 bold · the mark at 22, 52 and 136

Components

Pick from these before building anything new.

NeedUseNot
Main action.pill · .pillLarge.borderedProminent
Other action.pillSecondaryA second white pill
Back, Cancel, Not Now.pillPlainA link
On or off.brandSwitchA checkbox
A number in a rangeBrandSliderThe system slider
State or settingStatusRow · WizardRow in a SetupCardA hand-built row
Known progressGradientProgressA blue bar
StepsStepBarNumbered tabs
Page loadingSkeletonPageA centred spinner
Background newsUpdateBannerRowAn alert

Buttons

28 high, 13 semibold · large 34, 14 semibold · secondary 1 pt lineStrong · PillButtonStyle

Don't Two white pills

Do One, on the right

Settings

High Resolution
Sharper, but slower.
DLSS
Uses MetalFX when a game turns DLSS on.
Graphics Backend
Automatic
Frame Rate Limit
60 FPS
15
120
Game Defaults: hero, Graphics and Performance sections
The real page · GameDefaultsView.swift

A row is a title, one short line and one control. Switch 38 × 22 · slider track 4, knob 16 · the reset arrow shows only on a changed setting.

Rows

Bridgeplay
Installed
Controllers may not work
macOS kept Steam's old controller permission.
Steam is running
Close Steam before continuing.
Apple silicon
Apple M4
Rosetta 2
Apple's translator for Windows games.
1
Or download it from Apple
Sign in, then download the .dmg.

StatusRow: 8 pt dot, title 13 semibold, value · WizardRow: badge 24 × 24, radius 7, hairline inset 54

Status page, Steam section
Status
Setup Assistant, step 1
Setup Assistant

Hero

Ready to play
Open Steam and press Play on any Windows game.
WineCX 11.17D3DMetal

One per page · 148 high · headline 24 semibold, gradient only when ready · chips 11 semibold on white 10% · StatusHero.swift

Navigation and steps

Bridgeplay
Setup Assistant, step 2, with the step bar and footer buttons
Step bar, step title, and a footer with one white pill

Sidebar item 32 high, radius 8; selected is raise2, never the system accent · step bar 3 pt segments, one gradient up to the current step

Banner and corner card

Enjoying Bridgeplay?
A star on GitHub helps other people find it.
Don't show again

News is a banner above the window's content. The corner card is the only surface with a shadow.

States

Every page has all four. A failure always offers a next step.

Loading · a skeleton in the page's shape
Empty Prefix Backups page
Empty · ContentUnavailableView with the page's symbol
Failed
Bridgeplay could not save this setting.
Failed · the reason, a remedy, Report under "More"
Done
Installed into Steam.
2 of 3
Done, and work with a known amount
Loading...

Don't A lone spinner for a page

Error
Operation failed (code 1).

Don't A dead end

In the game and in Steam

The same ink, type and gradient, drawn over the game. These are renders from the drawing code, with sample readings.

Quick settings sidebar
Quick settings · ⌥⌘P · sidebar.m
Detailed performance overlay
Performance overlay · perfhud.m
The Guide's drawing of the Bridgeplay tab in Steam Properties
The Steam tab, as the Guide draws it
SurfaceRule
Quick settings320 wide. A slider for ordered choices, a selector for unordered, a switch for on or off. Focus is one white 5% tint.
Performance overlay#0D0D0F 86%, radius 8. A value the Mac does not report is left out.
Bridgeplay tab in SteamSteam's own controls and colours. It lives in Steam's page.
EverywhereAn option has one name and one order. No game art ships.

Copy

Plain and short. Capitalization and punctuation follow macOS.

KindRuleFrom the app
Button, menu item, settingTitle Case; verb and object"Open Input Monitoring"
Headline, stateSentence case"Ready to play" · "Steam is running"
ValueA sentence with a full stop"Not installed." · "Sharper, but slower."
DialogA question; the button repeats the verb"Block Steam client updates?" · "Block Updates"
ErrorWhat happened, then what to do"Steam is running. Close Steam before continuing."
ReassuranceName what is kept"Your settings, game prefixes and saves are kept."
In progressParticiple and "…""Checking…"
Error: codesign exited with status 1!

Don't Technical, and shouting

Bridgeplay could not save this setting.

Do Plain, "could not", no exclamation mark

Are you sure?

Don't No subject, and "OK"

Replace Steam with Valve's bundle?

Do The question names it; the button repeats it

Definition of done

A screen is ready when every line is true.

Recorded exceptions

On purpose. Do not fix them.

WhereWhatWhy
The appDark onlyThe brand is a black canvas
Dialogs, menus, toolbar, tables, AboutmacOS's own lookSee "Leave to macOS"
Update windowSparkle'sSPUStandardUpdaterController
Rebuild and launch progress panelSystem font, app icon, system appearanceFollows the alert before it
Drawings of SteamSteam's colours, radius 2They show Steam
Bridgeplay tab in SteamSteam's classesIt lives in Steam's page
In-game drawing codeHex tokens, no symbols, no animationC in the game's process
Pill borderCapsule(style: .circular)The continuous curve leaves a tick
WordmarkUnboundedThe display face's only use
Setup art#7DFF8A, monospaced digitsImitates the Metal HUD
DMG backgroundMonospaced labels, radius 28Sits behind Finder icons

Known gaps

Inconsistencies in today's UI. Do not copy them.

#GapWhere
1System buttons beside pillsPatchBanner PlayReportCard report sheets
2A second banner style: .bar material, system type and orangePatchBanner play report bars
3Four switches: brand, in-game flat blue, system toggle, checkboxsidebar.m InstallerView PlayReportCard
4Installer progress is the system barInstallerView
5Section headers styled on Game Defaults, system on StatusGameDefaultsView StatusView
6StatusRow uses .secondary and .callout, not tokensStatusView
7Step bar written twice; the installer's differsStepBar InstallerView
8Hero frame written twiceStatusHero DefaultsHero
9Sheet titles 15 and 17; padding 20 and 22WhatsNewSheet report sheets
10Hairline 8% in the app, 10% in the gameBP.line ph_style.line
11Off-scale: 12.5, 15, 19 pt; a radius 6 that is not continuousGuideView InstallerView RowWash
12Mixed case: "Has issues" beside "Smooth"; "Last used" beside "Private Size"PlayReportCard PrefixesView
13In-game labels are sentence case ("Frame rate limit", "Auto")sidebar.m
14Engine rows are not localized ("Download & Set Up", "Rescan")StatusView
15Languages: app 4; Steam tab 3; game English; Install.command Indonesianwebpatch.c sidebar.m installer/
16⌘1 to ⌘5 are not in the sidebar's orderApp.swift
17At 900 × 760 the sidebar wraps the wordmark and cuts two names (debug preview)RootView
18Failures titled "Failed" or "Something went wrong"; red in the app, orange in the installerStatus, Setup Assistant, installer
19"Thanks!", "Prefix rebuild failed!", five "Please", one "couldn't"Localizable.xcstrings webpatch.c
20The installer's first step is a lone spinnerInstallerView
21No spacing tokensAll views
Installer while downloading, with the system progress bar
Gaps 4 and 7 · the installer
Sidebar with a wrapped wordmark and cut-off page names
Gap 17

Where things live

WhatFile
Rulesdocs/DESIGN.md
Tokens, fonts, pills, the markapp/Sources/BridgeplayUI/BridgeplayTheme.swift
Viewsapp/Sources/BridgeplayApp/Views/
Installerapp/Sources/BridgeplayInstaller/InstallerView.swift
StringsResources/Localization/Localizable.xcstrings
In-game UIoverlay-shim/sidebar.m overlay-shim/perfhud.m
Steam tabdylib/feats/webpatch.c