Principles
- Measured before believed. A claim about the interface is a number a script can reproduce, or it is not made. Contrast, consistency and layout are counted on every build.
- One name, one value. A color or a size has one name that says what it is for, and one value in each theme. Components use names, never raw values.
- Meaning never rides on color alone. Status and priority carry a shape or a word as well.
- The keyboard is a first-class way in. What can be done with a pointer can be reached from the keys, and the interface shows how.
- Change is staged and reversible. Defects are fixed first, pixels change last, and every release can be put back.
Tokens
The source of truth is a set of token files in the Design Tokens Community Group format (2025.10). A build step turns them into CSS custom properties with the prefix --tg-, checks every color’s two notations against each other, and refuses to build if a text and surface pair falls below its contrast threshold.
| Tier | Example | Rule |
| Reference | --tg-ref-neutral-950 | Raw ramps. Never used by a component. |
| Semantic | --tg-color-text-secondary | Named by role. The only tier components use. |
| Component | --tg-button-height | Only where a component needs a documented hook. |
Themes are value sets on the same names. This page follows your system’s light or dark setting; the tables below show both.
Color
The accent comes from the Tridge mark. The teal end of the mark is kept for the logo and for illustration, never for the state of a control.
Surfaces
| Token | Light | Dark |
|---|
--tg-color-bg-canvas | #F6F7FA | #0E0F12 |
|---|
--tg-color-bg-surface | #FFFFFF | #16171A |
|---|
--tg-color-bg-sunken | #EFF0F4 | #1D1E22 |
|---|
--tg-color-bg-hover | #E8E9EE | #23252A |
|---|
--tg-color-bg-selected | #DCDFE8 | #2A2D38 |
|---|
Borders
| Token | Light | Dark |
|---|
--tg-color-border-subtle | #DCDEE2 | #27292D |
|---|
--tg-color-border-default | #C8CAD0 | #36383D |
|---|
--tg-color-border-strong | #777A82 | #777A82 |
|---|
Text
| Token | Light | Dark |
|---|
--tg-color-text-primary | #181A20 | #EAEBEF |
|---|
--tg-color-text-secondary | #4A4D55 | #B5B7BE |
|---|
--tg-color-text-tertiary | #5D6069 | #9598A0 |
|---|
--tg-color-text-disabled | #9C9EA5 | #616369 |
|---|
--tg-color-text-on-accent | #FFFFFF | #FFFFFF |
|---|
Accent
| Token | Light | Dark |
|---|
--tg-color-accent-solid | #4D4BD1 | #5252D8 |
|---|
--tg-color-accent-solid-hover | #423BC0 | #5F62E9 |
|---|
--tg-color-accent-text | #4641C7 | #96A2FC |
|---|
--tg-color-accent-subtle | #EAEEFE | #222546 |
|---|
Focus
| Token | Light | Dark |
|---|
--tg-color-focus-ring | #5A5CE2 | #8893FA |
|---|
Status
| Token | Light | Dark |
|---|
--tg-color-status-danger-text | #B71824 | #F7857D |
|---|
--tg-color-status-danger-subtle | #FEE9E6 | #3B1C1A |
|---|
--tg-color-status-danger-solid | #C50220 | #C50220 |
|---|
--tg-color-status-warning-text | #825100 | #E9B452 |
|---|
--tg-color-status-warning-subtle | #FFF1CC | #332710 |
|---|
--tg-color-status-warning-solid | #F0B135 | #F0B135 |
|---|
--tg-color-status-success-text | #056A3B | #59D38C |
|---|
--tg-color-status-success-subtle | #DAF7E3 | #152C1E |
|---|
--tg-color-status-success-solid | #02703F | #02703F |
|---|
--tg-color-status-info-text | #02629C | #72B8F2 |
|---|
--tg-color-status-info-subtle | #E2F1FE | #152839 |
|---|
Brand
| Token | Light | Dark |
|---|
--tg-color-brand-indigo | #8B93F8 | #8B93F8 |
|---|
--tg-color-brand-teal | #5EEAD4 | #5EEAD4 |
|---|
--tg-color-brand-ink | #12131A | #12131A |
|---|
Contrast, measured
78 measurements: every pair below in both themes, by the WCAG 2.x contrast formula. Text needs 4.5 to 1; the boundary of a control and the focus ring need 3 to 1. All of them pass, and the build that produced this page would have failed otherwise.
| Pair | Used for | Needs | Light | Dark |
|---|
color-text-primary on color-bg-canvas | text | 4.5:1 | 16.24:1 | 16.09:1 |
|---|
color-text-primary on color-bg-surface | text | 4.5:1 | 17.39:1 | 15.05:1 |
|---|
color-text-primary on color-bg-sunken | text | 4.5:1 | 15.27:1 | 13.98:1 |
|---|
color-text-primary on color-bg-hover | text | 4.5:1 | 14.35:1 | 12.87:1 |
|---|
color-text-primary on color-bg-selected | text | 4.5:1 | 13.06:1 | 11.51:1 |
|---|
color-text-secondary on color-bg-canvas | text | 4.5:1 | 7.89:1 | 9.57:1 |
|---|
color-text-secondary on color-bg-surface | text | 4.5:1 | 8.45:1 | 8.95:1 |
|---|
color-text-secondary on color-bg-sunken | text | 4.5:1 | 7.42:1 | 8.31:1 |
|---|
color-text-secondary on color-bg-hover | text | 4.5:1 | 6.97:1 | 7.65:1 |
|---|
color-text-secondary on color-bg-selected | text | 4.5:1 | 6.35:1 | 6.85:1 |
|---|
color-text-tertiary on color-bg-canvas | text | 4.5:1 | 5.86:1 | 6.64:1 |
|---|
color-text-tertiary on color-bg-surface | text | 4.5:1 | 6.28:1 | 6.21:1 |
|---|
color-text-tertiary on color-bg-sunken | text | 4.5:1 | 5.52:1 | 5.77:1 |
|---|
color-text-tertiary on color-bg-hover | text | 4.5:1 | 5.18:1 | 5.31:1 |
|---|
color-text-tertiary on color-bg-selected | text | 4.5:1 | 4.72:1 | 4.75:1 |
|---|
color-accent-text on color-bg-canvas | link | 4.5:1 | 6.90:1 | 8.10:1 |
|---|
color-accent-text on color-bg-surface | link | 4.5:1 | 7.39:1 | 7.57:1 |
|---|
color-accent-text on color-bg-sunken | link | 4.5:1 | 6.49:1 | 7.03:1 |
|---|
color-text-on-accent on color-accent-solid | button text | 4.5:1 | 6.48:1 | 5.90:1 |
|---|
color-text-on-accent on color-accent-solid-hover | button text, hover | 4.5:1 | 8.02:1 | 4.76:1 |
|---|
color-accent-text on color-accent-subtle | text on the accent tint | 4.5:1 | 6.39:1 | 6.24:1 |
|---|
color-status-danger-text on color-bg-canvas | status text | 4.5:1 | 6.18:1 | 7.85:1 |
|---|
color-status-danger-text on color-bg-surface | status text | 4.5:1 | 6.63:1 | 7.35:1 |
|---|
color-status-warning-text on color-bg-canvas | status text | 4.5:1 | 6.27:1 | 10.14:1 |
|---|
color-status-warning-text on color-bg-surface | status text | 4.5:1 | 6.72:1 | 9.49:1 |
|---|
color-status-success-text on color-bg-canvas | status text | 4.5:1 | 6.26:1 | 10.15:1 |
|---|
color-status-success-text on color-bg-surface | status text | 4.5:1 | 6.71:1 | 9.49:1 |
|---|
color-status-info-text on color-bg-canvas | status text | 4.5:1 | 6.07:1 | 8.99:1 |
|---|
color-status-info-text on color-bg-surface | status text | 4.5:1 | 6.50:1 | 8.41:1 |
|---|
color-status-danger-text on color-status-danger-subtle | status text on its tint | 4.5:1 | 5.68:1 | 6.30:1 |
|---|
color-status-warning-text on color-status-warning-subtle | status text on its tint | 4.5:1 | 5.98:1 | 7.73:1 |
|---|
color-status-success-text on color-status-success-subtle | status text on its tint | 4.5:1 | 5.87:1 | 7.88:1 |
|---|
color-status-info-text on color-status-info-subtle | status text on its tint | 4.5:1 | 5.65:1 | 7.07:1 |
|---|
color-border-strong on color-bg-canvas | control boundary | 3:1 | 4.01:1 | 4.46:1 |
|---|
color-border-strong on color-bg-surface | control boundary | 3:1 | 4.29:1 | 4.17:1 |
|---|
color-border-strong on color-bg-sunken | control boundary | 3:1 | 3.77:1 | 3.88:1 |
|---|
color-focus-ring on color-bg-canvas | focus ring | 3:1 | 4.82:1 | 6.94:1 |
|---|
color-focus-ring on color-bg-surface | focus ring | 3:1 | 5.17:1 | 6.49:1 |
|---|
color-focus-ring on color-bg-sunken | focus ring | 3:1 | 4.54:1 | 6.03:1 |
|---|
Type
IBM Plex Sans for the interface, IBM Plex Mono for code and identifiers. The product uses nine roles; this site adds larger display sizes for headlines.
| Role | Size / line | Weight | Specimen |
|---|
--tg-type-display | 32 / 40 | 600 | Plan it. Write it. Talk it through. |
|---|
--tg-type-title-lg | 24 / 32 | 600 | Plan it. Write it. Talk it through. |
|---|
--tg-type-title-md | 20 / 28 | 600 | Plan it. Write it. Talk it through. |
|---|
--tg-type-title-sm | 16 / 24 | 600 | Plan it. Write it. Talk it through. |
|---|
--tg-type-body-lg | 16 / 24 | 400 | Plan it. Write it. Talk it through. |
|---|
--tg-type-body | 14 / 20 | 400 | Plan it. Write it. Talk it through. |
|---|
--tg-type-body-sm | 13 / 20 | 400 | Plan it. Write it. Talk it through. |
|---|
--tg-type-label | 12 / 16 | 500 | Plan it. Write it. Talk it through. |
|---|
--tg-type-caption | 11 / 16 | 500 | Plan it. Write it. Talk it through. |
|---|
Space and radius
space-0502 pxspace-1004 pxspace-1506 pxspace-2008 pxspace-25010 pxspace-30012 pxspace-40016 pxspace-50020 pxspace-60024 pxspace-70028 pxspace-80032 pxspace-100040 pxspace-120048 pxspace-160064 px
Radius
radius-xs2 pxradius-sm4 pxradius-md6 pxradius-lg8 pxradius-xl12 pxradius-2xl16 px
Motion
Five durations, from 0 to 300 milliseconds, and three easing curves. Hover and press are fast; menus enter in 150 ms; nothing that is triggered from the keyboard many times a day is animated. When your system asks for reduced motion, movement stops and only short fades remain.
Where the program stands
- Defects and instruments: twenty fixes, the contrast gate, the visual baselinesfirst release live, November 11, 2026
- Token source and alias layer: one source, no pixel changednext
- Color, type, elevation, motion and themesplanned
- Icon system: one grid, one stroke, names by meaningplanned
- Primitives, states and the command modelplanned
- Shell, Home and navigationplanned
- Attention and viewsplanned
- Assistance and the published conformance reportplanned
What each release changed for the people who use Tridge is in the changelog.