SimpleTherapy · ST_MSK

Design system & conventions

Token values read directly from the published library. Conventions counted from the product file. Where a rule and the file disagree, the count is shown so the disagreement is visible rather than assumed.

Version 1.0 13 Aug 2026 50 of 83 pages 673 mobile screens 1,335 desktop screens 31 variables · 25 text styles

01Colour

31 variables in one collection, one mode. Bind colours to variables — never hardcode a hex value. Names do not always predict appearance, so the value is shown alongside every name.

Core

Black#001B36Headings. A deep navy, not true black.
White#FFFFFFScreen and card grounds
Blue#1EA5DEPrimary accent, selected states
Light Blue#E9F6FCTinted surfaces
Gradient#1EA5DE → #2EB695The only published paint style

Greys — ordered dark to light, 0 → 6

Grey 0#3D4F62Body text
Grey 1#526376Secondary text
Grey 2#8496A8Tertiary, placeholders
Grey 3#C7CFD9Default border colour
Grey 4#ECF2F6Disabled border
Grey 5#F6F9FBSubtle fill
Grey 6#FAFAFALightest fill

Semantic

Dark Green#06845ASuccess. Also alternate flow lines.
Green#2EB695Positive
Light Green#EBF8F5Positive surface
Dark Red#C83739Error. Also conditional flow lines.
Red#FF7678Alert
Light Red#FFF1F2Alert surface
Orange#FF790CWarning, selected (orange)
Purple#814ADFAccent
Light Purple#F2EDFCAccent surface

Special button pairs — base and hover

Used for specific promotional or programme surfaces, not for standard product buttons.

Special Blue 1 / 2#242778 / #2F349E
Special Orange 1 / 2#EC6950 / #FF7156
Special Purple 1 / 2#673467 / #8C478C
Special Green 1 / 2#17723C / #1F9951

Known issue: Dark05, Dark10 and Dark60 all resolve to #001B36 — identical to Black. They read as intended opacity steps that were never given distinct values. Avoid until resolved.

02Typography

One family: Avenir Next. Letter-spacing is −2% on every style except the uppercase caption. Line-height is 110% for headers, 140% for body, 100% for buttons and tags. Specimens below render at true size.

Two naming traps. Style names repeat the family segment — Universal/P1/P1 - Regular, not Universal/P1. And a style named “Regular” uses Avenir Next Medium; “Semibold” uses Demi Bold. There is no Semibold weight in the family.

Desktop headers

AaDesktop Header/H164 / 110% / −2% · Bold
Care plan generatedDesktop Header/H240 / 110% / −2% · Demi Bold
Care plan generatedDesktop Header/H324 / 110% / −2% · Demi Bold

Mobile headers

Your care planMobile Header/H136 / 110% / −2% · Demi Bold
Your care planMobile Header/H228 / 110% / −2% · Demi Bold
Your care planMobile Header/H324 / 110% / −2% · Demi Bold
Your care planMobile Header/H420 / 110% / −2% · Demi Bold

Body — P1 to P3, and caption

Sessions are tailored to your programme.Universal/P1/P1 - Regular18 / 140% / −2% · Medium
Sessions are tailored to your programme.P1 - Semibold18 · Demi Bold
Sessions are tailored to your programme.Universal/P2/P2 - Regular16 / 140% / −2% · Medium
Sessions are tailored to your programme.P2 - Semibold16 · Demi Bold
Sessions are tailored to your programme.Universal/P3/P3 - Regular14 / 140% / −2% · Medium
most-used style, 4,873×
Sessions are tailored to your programme.P3 - Semibold14 · Demi Bold · 4,566×
Sessions are tailored to your programme.Universal/Caption/C1 - Regular12 / 140% / −2% · Medium
Sessions are tailoredC1 - CAP12 / 140% / +2% · uppercase
Italic variants exist at P1, P2, P3 and C1.… - ItalicAvenir Next Italic

Buttons and tags — 100% line-height

View care planUniversal/Button/B116 / 100% / −2% · Demi Bold
View care planUniversal/Button/B214 / 100% · Demi Bold
View care planUniversal/Button/B312 / 100% · Demi Bold
Pelvic HealthUniversal/Tag/T114 / 100% · Medium
Pelvic HealthUniversal/Tag/T212 / 100% · Medium · 1,650×

03Elevation

Six elevation styles. Below/* casts downward at 10% black, Above/* upward at 8% — used for bottom bars. Rendered here at true values.

Shown on a light stage in both themes — these shadows are defined for the product's light surfaces.

Below/Low0 2px 4px · #000 10%
Below/Medium0 2px 8px · #000 10% — standard card, 2,341×
Below/High0 2px 16px · #000 10%
Above/Low0 −2px 4px · #000 8%
Above/Medium0 −2px 8px · #000 8% — bottom bars, 641×
Above/High0 −2px 16px · #000 8%

04Borders

Borders are not strokes. They are effect styles built from a zero-blur spread shadow plus a soft drop shadow. This matters when reproducing them — a stroke will not match.

Border/Default 1.5pxspread 1.5 Grey 3 + 0 2px 4px · 5,901×
Border/Selected 1.5px (Blue)spread 1.5 #1EA5DE · 545×
Border/Selected 1.5px (Orange)spread 1.5 #FF790C · 53×
Border/Selected 3pxspread 3 #1EA5DE
Border/Disabled 1.5pxspread 1.5 Grey 4 · 652×

05Grids & canvas

Published layout grids
GridColumnsGutterMargin
Mobile41616
Tablet61632
Desktop121664
Screen sizes in use
TargetSizeContent widthEvidence
Mobile375 × 812 fixed343 (16 side padding)1,194 frames
Desktop1440 × 960400 one-col · 1200 two-col579; 817 (404), 881 (133)
Tablet840 wide~64 frames. Rare.

Half-width mobile card is 164. Desktop header height 79. Icons default to 20 × 20. Corner radius: 100 pills and buttons, 12 / 16 cards, 8 small elements.

06Spacing

Spacing is a hierarchy, not a single scale. The correct gap depends entirely on what the container is — measured by role across roughly 24,000 mobile and 14,000 desktop auto-layout containers.

Mobile
RoleGapPadding ↕Padding ↔
Screen content, block → block32 24 · 1624 1616 24
Title → subtitle4 8 · 2 · 1224 · 88 · 24 · 16
Card, internal8 12 · 16 · 412 16 · 8 · 1412 16 · 8 · 24
List, item → item16 12 · 8816
Row — icon + label8 12 · 4 · 164 · 8 · 104 · 24 · 12
Button area81056 · 12 · 16
Desktop
RoleGapPadding ↕Padding ↔
Screen content, block → block40 60 · 24 · 4860 24 · 4080 136
Title → subtitle4 8 · 2 · 1610 2410 24 · 16
Card, internal12 8 · 16 · 1012 10 · 1612 16 · 24
List, item → item12 16 · 8 · 2440 · 60 · 80136 80
Row8 12 · 16 · 48 · 4 · 104 · 14 · 10
Button area8 161016 · 12 · 56

Why some spacing looks wrong

Gaps tighten monotonically with nesting depth. Most spacing that reads as off is a value borrowed from the wrong tier — a 32 inside a card, or an 8 between page sections.

Page / section40 · 60 · 120
Major blocks24 · 32 · 40
Sub-blocks8 · 12 · 16
Inside components8 · 12 · 4

Not an 8-point grid. 10, 14, 6 and 5 appear tens of thousands of times. Do not “correct” spacing to multiples of 8 — match the tier and the neighbours.

Sanctioned gaps 2 4 8 12 16 24 32 40 60 · padding 4 8 10 12 14 16 24 56 80 136

07Screen anatomy

Measured across 673 mobile screens, excluding 409 frames that are flattened artwork rather than designed screens.

HomeIndicatorPresent even when the screen has no button.88.1% · 593
Buttons82.6% · 556
StatusBarFrontmost. Mobile only — 0.1% on desktop.80.2% · 540
Top HeaderWhen the screen has a title or a back affordance.62.0% · 417
Bottom Button Bar / VerticalHolds the button and the HomeIndicator together. Clone an existing instance.53.2% · 358
Tab barDoes not exist anywhere in the product.0 uses

Layer order, back to front

1Background — gradient component, animation, or group45% gradient · absolute
2Content Container / Body / Main Containerauto-layout
3Bottom Button Bar — HomeIndicator nested inside379 of 1,126
4Top Headerwhen present
5StatusBarfrontmost

Buttons are bottom-anchored. 440 of 556 screens place the lowest button within 20px of the bottom edge; 88.7% within 50px. A primary action floating mid-screen is wrong.

Screen-level layout is split — 51.3% absolute, 48.7% vertical auto-layout. Match the neighbours. Inside the content area, auto-layout always. The background gradient is always absolutely positioned, outside the layout flow.

08Buttons

One component set, 252 variants, 3,206 instances measured.

PropertyDistribution
ColorBlack 3,110 — 97.0% White 70 · Blue 20 · Orange 4 · Red 2
TypePrimary 1,842 Secondary 1,233 · Ghost 131
SizeLarge 2,226 Small 535 · Medium 445
StateDefault 2,925 Disabled 281

The default, unless told otherwise: Size=Large, Type=Primary, State=Default, Color=Black — 1,060 uses. Large button height is 48; a full-width mobile button is 343 × 48.

09Flow lines

Flows between screens are top-level vectors. A white 12pt line between two screens is a flow connection, not decoration.

White #FFFFFF, 12pt strokeThe standard flow connection.497 of 553
Red #C83739 — Dark RedConditional or error branches.31
Green #06845A — Dark GreenSuccess or alternate paths.14
Flow Annotation · Selection Logic · Conditional LogicLabelling and branch logic are components, not loose text.752

Both branch colours are design system variables, not ad-hoc picks — Dark Red and Dark Green.

10Never

Each of these exists in the file but is a mistake or a foreign import, not a convention. Do not reproduce them; flag them when found.

Blue, Orange or Red buttonsUnless explicitly asked.20 · 4 · 2 of 3,206
Foreign text styles — Body/Small, Body/Regular, Title2/Regular, Text/Regular/NormalLeaked in from community UI kits.93
Legacy effects — Material Blur, OLD/Card - Dropshadow, .Zone35
1px padding on a content containerAlmost certainly accidental.454
Negative gaps beyond −24Small negatives are deliberate overlap; −437 and −317 are not.outliers
Hardcoded hex valuesBind to a variable.rule
A tab barThe product has none.0
Editing the published libraryComponents, icons, styles and variables are the source of truth. Consume, never modify.rule

11How work lands

Nothing existing is ever modified. New and changed work goes into a new section, clearly labelled, for manual review.

1Duplicate or build into a new Section on the same pagenever in place
2Keep the original frame naming, so it drops straight into placenaming intact
3Label it 🤖 Created by Claude as instructed — … — dateunmistakable
4Stop and report node IDs; the designer reviews and placeshuman approves

The file already establishes this habit — sections named Original Copy and New Designs keep untouched originals beside new work.

Standing caveats. Designed ≠ shipped — whether a screen exists in ST_MSK says nothing about whether it reached members. No PHI in any output. Clinical content needs licensed review. Claude accelerates; Claude does not approve.

Submit a client brief →