GitTrail design system / version 2

One system for every trail

Semantic tokens, readable product previews and predictable interactions. Change the theme to inspect every example.

Illustrated icons

Original Git-themed spot illustrations use a shared ink outline, soft colour fills and rounded shapes. Small action controls keep simple interface glyphs.

Foundations

A custom faceted G forms a continuous trail, with an inward merging lane. The deep indigo tile and porcelain lines remain fixed; only the destination signal follows the theme and accent. A short transmission runs on entry, hover and keyboard focus, with reduced motion respected.

Grid
12 columns · fluid to 1920px · 68ch text
Padding / gutters
48px tablet · 32px mobile · adaptive laptop and desktop
Breakpoints
360 · 640 · 768 · 1024 · 1280 · 1536px
Section rhythm
48px mobile · 64px tablet · 96–128px desktop
Content rhythm
Label → heading 16px · heading → text 24px · text → action 32px
4px
8px
12px
16px
24px
32px
48px
64px
96px
128px

Radius and elevation

6pxsm
10pxbutton
14pxcard
20pxpanel
999pxpill
Elevation sm
Elevation md
Elevation lg

Light: 0 1px 2px / 6%, 0 4px 12px / 8%, 0 12px 32px / 12%. Dark: raised neutral surfaces and a 1px inner highlight.

Colour and contrast

All site and mockup colours come from semantic variables. Lane colours are graphic identifiers, not body text colours.

--bg
--surface
--surface-2
--border
--border-strong
--text
--text-2
--text-3
--accent
--accent-2
--accent-soft
--link
--on-accent
--success
--warning
--danger
--focus
--lane-1
--lane-2
--lane-3
--lane-4
--lane-5
--lane-6
Measured semantic contrast pairs
PairDarkLight
text / bgMinimum 4.5:117.49:1 Pass17.96:1 Pass
text / bg-subtleMinimum 4.5:116.89:1 Pass17.49:1 Pass
text / surfaceMinimum 4.5:115.81:1 Pass16.74:1 Pass
text / surface-raisedMinimum 4.5:114.65:1 Pass15.72:1 Pass
text / surface-sunkenMinimum 4.5:116.89:1 Pass17.49:1 Pass
text / surface-translucentMinimum 4.5:115.89:1 Pass16.79:1 Pass
text-secondary / bgMinimum 4.5:113.09:1 Pass9.19:1 Pass
text-secondary / bg-subtleMinimum 4.5:112.64:1 Pass8.94:1 Pass
text-secondary / surfaceMinimum 4.5:111.82:1 Pass8.55:1 Pass
text-secondary / surface-raisedMinimum 4.5:110.95:1 Pass8.05:1 Pass
text-secondary / surface-sunkenMinimum 4.5:112.64:1 Pass8.94:1 Pass
text-secondary / surface-translucentMinimum 4.5:111.88:1 Pass8.58:1 Pass
text-muted / bgMinimum 4.5:112.68:1 Pass8.1:1 Pass
text-muted / bg-subtleMinimum 4.5:112.27:1 Pass7.87:1 Pass
text-muted / surfaceMinimum 4.5:111.45:1 Pass7.53:1 Pass
text-muted / surface-raisedMinimum 4.5:110.6:1 Pass7.09:1 Pass
text-muted / surface-sunkenMinimum 4.5:112.27:1 Pass7.87:1 Pass
text-muted / surface-translucentMinimum 4.5:111.5:1 Pass7.56:1 Pass
text-link / bgMinimum 4.5:113.38:1 Pass9.65:1 Pass
text-link / bg-subtleMinimum 4.5:112.97:1 Pass9.39:1 Pass
text-link / surfaceMinimum 4.5:112.08:1 Pass8.98:1 Pass
text-link / surface-raisedMinimum 4.5:111.19:1 Pass8.45:1 Pass
text-link / surface-sunkenMinimum 4.5:112.97:1 Pass9.39:1 Pass
text-link / surface-translucentMinimum 4.5:112.14:1 Pass9.01:1 Pass
text-link-hover / bgMinimum 4.5:117.76:1 Pass17.4:1 Pass
text-link-hover / bg-subtleMinimum 4.5:117.17:1 Pass16.9:1 Pass
text-link-hover / surfaceMinimum 4.5:116.03:1 Pass16.17:1 Pass
text-link-hover / surface-raisedMinimum 4.5:114.85:1 Pass15.24:1 Pass
text-link-hover / surface-sunkenMinimum 4.5:117.17:1 Pass16.9:1 Pass
text-link-hover / surface-translucentMinimum 4.5:116.11:1 Pass16.22:1 Pass
border-strong / bgMinimum 3:15.12:1 Pass4.28:1 Pass
border-strong / bg-subtleMinimum 3:14.94:1 Pass4.15:1 Pass
border-strong / surfaceMinimum 3:14.62:1 Pass3.97:1 Pass
border-strong / surface-raisedMinimum 3:14.28:1 Pass3.74:1 Pass
border-strong / surface-sunkenMinimum 3:14.94:1 Pass4.15:1 Pass
border-strong / surface-translucentMinimum 3:14.64:1 Pass3.99:1 Pass
focus-ring / bgMinimum 3:113.38:1 Pass9.65:1 Pass
focus-ring / bg-subtleMinimum 3:112.97:1 Pass9.39:1 Pass
focus-ring / surfaceMinimum 3:112.08:1 Pass8.98:1 Pass
focus-ring / surface-raisedMinimum 3:111.19:1 Pass8.45:1 Pass
focus-ring / surface-sunkenMinimum 3:112.97:1 Pass9.39:1 Pass
focus-ring / surface-translucentMinimum 3:112.14:1 Pass9.01:1 Pass
accent-border / bgMinimum 3:15.14:1 Pass3.99:1 Pass
accent-border / bg-subtleMinimum 3:14.97:1 Pass3.87:1 Pass
accent-border / surfaceMinimum 3:14.64:1 Pass3.71:1 Pass
accent-border / surface-raisedMinimum 3:14.3:1 Pass3.49:1 Pass
accent-border / surface-sunkenMinimum 3:14.97:1 Pass3.87:1 Pass
accent-border / surface-translucentMinimum 3:14.66:1 Pass3.72:1 Pass
text-on-accent / accentMinimum 4.5:17.57:1 Pass7.57:1 Pass
text-on-accent / accent-hoverMinimum 4.5:16.67:1 Pass9.92:1 Pass
text-on-accent / accent-activeMinimum 4.5:17.57:1 Pass10.93:1 Pass
text-on-accent / accent-gradient-endMinimum 4.5:17.45:1 Pass7.45:1 Pass
success-text / success-bgMinimum 4.5:116.51:1 Pass7.74:1 Pass
success-border / success-bgMinimum 3:14.99:1 Pass3.29:1 Pass
text-on-accent / success-solidMinimum 4.5:16.57:1 Pass6.57:1 Pass
success-text / surfaceMinimum 4.5:117.11:1 Pass7.8:1 Pass
success-text / surface-raisedMinimum 4.5:115.85:1 Pass7.35:1 Pass
warning-text / warning-bgMinimum 4.5:111:1 Pass10.48:1 Pass
warning-border / warning-bgMinimum 3:14.62:1 Pass3.6:1 Pass
text-on-accent / warning-solidMinimum 4.5:17.29:1 Pass7.29:1 Pass
warning-text / surfaceMinimum 4.5:111.22:1 Pass10.73:1 Pass
warning-text / surface-raisedMinimum 4.5:110.39:1 Pass10.08:1 Pass
danger-text / danger-bgMinimum 4.5:112.6:1 Pass15.46:1 Pass
danger-border / danger-bgMinimum 3:14.43:1 Pass3.74:1 Pass
text-on-accent / danger-solidMinimum 4.5:17.71:1 Pass7.71:1 Pass
danger-text / surfaceMinimum 4.5:112.75:1 Pass15.81:1 Pass
danger-text / surface-raisedMinimum 4.5:111.81:1 Pass14.89:1 Pass
info-text / info-bgMinimum 4.5:114.29:1 Pass12.72:1 Pass
info-border / info-bgMinimum 3:14.86:1 Pass3.39:1 Pass
text-on-accent / info-solidMinimum 4.5:16.82:1 Pass6.82:1 Pass
info-text / surfaceMinimum 4.5:114.8:1 Pass12.86:1 Pass
info-text / surface-raisedMinimum 4.5:113.71:1 Pass12.11:1 Pass
code-text / code-bgMinimum 4.5:116.89:1 Pass17.49:1 Pass
code-text / diff-add-bgMinimum 4.5:115.22:1 Pass16.61:1 Pass
code-text / diff-del-bgMinimum 4.5:115.62:1 Pass16.36:1 Pass
syn-keyword / code-bgMinimum 4.5:112.97:1 Pass10.32:1 Pass
syn-keyword / diff-add-bgMinimum 4.5:111.66:1 Pass9.8:1 Pass
syn-keyword / diff-del-bgMinimum 4.5:111.98:1 Pass9.66:1 Pass
syn-string / code-bgMinimum 4.5:113.48:1 Pass9.38:1 Pass
syn-string / diff-add-bgMinimum 4.5:112.12:1 Pass8.91:1 Pass
syn-string / diff-del-bgMinimum 4.5:112.45:1 Pass8.78:1 Pass
syn-number / code-bgMinimum 4.5:112.97:1 Pass9.84:1 Pass
syn-number / diff-add-bgMinimum 4.5:111.68:1 Pass9.34:1 Pass
syn-number / diff-del-bgMinimum 4.5:112:1 Pass9.2:1 Pass
syn-comment / code-bgMinimum 4.5:112.64:1 Pass8.94:1 Pass
syn-comment / diff-add-bgMinimum 4.5:111.39:1 Pass8.49:1 Pass
syn-comment / diff-del-bgMinimum 4.5:111.69:1 Pass8.36:1 Pass
syn-function / code-bgMinimum 4.5:115.81:1 Pass13.44:1 Pass
syn-function / diff-add-bgMinimum 4.5:114.25:1 Pass12.77:1 Pass
syn-function / diff-del-bgMinimum 4.5:114.62:1 Pass12.58:1 Pass
syn-type / code-bgMinimum 4.5:112.75:1 Pass10.47:1 Pass
syn-type / diff-add-bgMinimum 4.5:111.49:1 Pass9.95:1 Pass
syn-type / diff-del-bgMinimum 4.5:111.79:1 Pass9.8:1 Pass
syn-punctuation / code-bgMinimum 4.5:112.64:1 Pass8.94:1 Pass
syn-punctuation / diff-add-bgMinimum 4.5:111.39:1 Pass8.49:1 Pass
syn-punctuation / diff-del-bgMinimum 4.5:111.69:1 Pass8.36:1 Pass
text-on-accent / brandMinimum 3:13.71:1 Pass7.57:1 Pass
visited / bgMinimum 4.5:113.38:1 Pass10.62:1 Pass
lane-1 / surfaceMinimum 3:16.96:1 Pass3.45:1 Pass
lane-2 / surfaceMinimum 3:18.38:1 Pass11.54:1 Pass
lane-3 / surfaceMinimum 3:112.08:1 Pass9.04:1 Pass
lane-4 / surfaceMinimum 3:13.64:1 Pass15.12:1 Pass
lane-5 / surfaceMinimum 3:110.53:1 Pass4.68:1 Pass
lane-6 / surfaceMinimum 3:14.86:1 Pass7.31:1 Pass

Decorative borders use border-subtle. Control boundaries use border-strong. Disabled examples are exempt from text contrast requirements. The full WCAG/APCA matrix is available on the themes page.

Typography

Self-hosted Inter Variable and JetBrains Mono use font-display: swap. Fluid sizes interpolate between the supplied mobile and desktop values.

Type roles · desktop / mobile
Role and sizeLine heightWeightTracking
Display64 / 40px1.05700−0.03em
H148 / 34px1.1700−0.025em
H236 / 28px1.15650−0.02em
H324 / 20px1.25600−0.01em
H418 / 17px1.356000
Body large19 / 17px1.64000
Body16px1.64000
Small14px1.54000
Micro label12px1.4500+0.04em
Code14px1.64000
Every commit belongsOne computer, every accountFollow your next branchPush with the right identityKeep your work in context

Set a folder rule once. GitTrail picks the right account.

Body text stays at 16px with a comfortable 1.6 line height.

Captions and meaningful metadata stay at 14px.Label / 12px uppercasegittrail use work

Components and states

State-labelled specimens show appearance without moving keyboard focus. The actual controls retain normal hover, press and keyboard behavior.

Buttons

Primary

default
hover
pressed
focus
disabled
loading

Secondary

default
hover
pressed
focus
disabled
loading

Ghost

default
hover
pressed
focus
disabled
loading

Danger

default
hover
pressed
focus
disabled
loading

Sizes: 32 / 40 / 48px. Touch pointers expand small controls to at least 44px. The multiple primary specimens are a reference-only exception; product views use one primary action. Inspect all themes and accents.

Inputs

Match repos inside this folder.

Match repos inside this folder.

Match repos inside this folder.

Match repos inside this folder.

Match repos inside this folder.

Checking this folder rule.

Rule is incomplete. Add a folder path.

Rule matches the work account.

Cards

default
hover
pressed
focus
disabled
loading

Links and icon buttons

defaultOpen docs
pressedOpen docs
disabledOpen docs
loadingLoading docs

Badges and chips

Defaultwork
Selectedwork
Disabledwork
LoadingChecking
ErrorRule error
SuccessMatched

Badges are static labels. Hover, press and focus do not apply. Use a labelled button for an actionable chip, as in the repo selector below.

Navigation and account switching

Composite components

State contracts for shared compositions
ComponentState behaviorFeedback
Section / FeatureRow / LaneBackgroundStatic; no hover, pressed, focus, disabled or loading semanticsFinite entry reveal; no content depends on motion
PricingCard / PricingButtons inherit all shared control statesMonthly / yearly pressed state and announced price
TerminalStatic command example; selection and copying use native text behaviorNo fake loading or clickable decoration
AppMockupRepo and Push controls inherit shared button statesAccount switch and aria-live result
Card / BadgeStatic unless the card has one actionUse a button for actionable states
MenuClosed / expanded; Escape closes and returns focusaria-expanded and aria-controls
FAQNative closed / expanded detailsNative keyboard and screen-reader state

Error and empty states

Account could not connect
Check the token permissions, then try again.

No repos match this rule
Choose another folder or add a repo.

Account matched
Your next push will use the work account.

Motion with a purpose

Timing
120ms hover / press · 200ms menu · 300ms account switch · 600ms entry
Easing
Enter (.16,1,.3,1) · exit (.4,0,1,1) · move (.65,0,.35,1)
Reveals
12px translate and opacity · 60ms stagger · once
Constraints
Transform and opacity only · no continuous loop · no stroke drawing
Access
System reduced-motion and manual pause remove movement

Audit and rule decisions

208 semantic contrast pairs pass their applicable AA threshold. Ratios are calculated from token values; they are not a full accessibility certification.

  • Specific type, radius, border and icon dimensions override the general 4px requirement.
  • All text roles use the new perceptual scales. Inspect the full theme and accent matrix on the theme showcase.
  • Primary fills and text/link tones were tuned for WCAG AA and APCA readability. Every change is recorded on the themes page.
  • Static components have no invented disabled, loading or pressed behavior. State contracts are listed above.
  • The exact type-role weights take priority over the two-weight limit in sections that combine labels, headings and nested cards.
  • Transform/opacity motion takes priority over the earlier stroke-drawing request. Graphs remain crisp and static.
  • Lighthouse scores, mid-range-mobile LCP and CLS remain unmeasured. No score is claimed.

See the source audit for recorded build, breakpoint and interaction checks.