IRONLINK
Design system & component library
Mobile · iOS / Android v1 · single source of truth

The complete visual language behind every IronLink screen — tokens, type, icons, components, states and motion. One stylesheet (ironlink.css) drives all 55 mockups; nothing here is bespoke per screen. Built for skilled trades: industrial-familiar, professional, practical.

01

Principles

Three rules decide every visual call. The audience is blue-collar trade workers and the employers who hire them — often on a phone, on a job site, sometimes lower-literacy or bilingual (EN/ES). Clarity beats cleverness.

Industry-familiar

Safety yellow and neutral grays mirror the visual world of construction and skilled trades.

Professional & trustworthy

Minimal color accents and muted tones keep it serious and work-focused — money and verification feel safe.

Clear & practical

Straight lines, structured layouts, big confident numbers, generous tap targets. One primary action per view.

02

Color

Yellow is reserved for the single primary action / highlight on a screen — never decoration. Navy ink carries text and dark actions. Everything else is a cool neutral or a semantic accent used sparingly.

Brand & surfaces
Safety Yellow--yellow · #FFD53Fprimary action / highlight
Navy Ink--ink · #162138text · dark buttons
App background--bg · #F4F6FBcool off-white
Surface--surface · #FFFFFFcards · sheets
Yellow & ink scale
Yellow 600--yellow-600 · #F5C400pressed / hairline
Yellow tint--yellow-tint · #FFF7DChighlight wash
Ink 800--ink-800 · #1E2C4A
Ink 700--ink-700 · #2A3A5C
Text & lines
Text 1--text-1 · #162138primary
Text 2--text-2 · #596682secondary
Text 3--text-3 · #A0AABFtertiary / placeholder
Surface 2--surface-2 · #F7F9FDinset / muted
Border--border · #E7EBF4hairline
Border strong--border-strong · #D6DCEA
Semantic — each ships with a tint for backgrounds
Positive--positive · #2E9E6Babove market · success
Danger--danger · #D8453Bpay gap · error · destructive
Warning--warning · #E08A00attention
Info / Link--info · #3768C4links · informational
Positive tint--positive-tint
Danger tint--danger-tint
Warning tint--warning-tint
Info tint--info-tint
03

Typography

Archivo — an engineered, slightly squared grotesque with industrial character and high legibility. Archivo Expanded handles display + numbers (wage figures, metrics). Deliberately not Inter / Roboto / system. Numbers use tabular-nums so money lines up.

Aa Gg $38

Display — Archivo Expanded 800
Heading 1 · trades that pay fairly
Heading 2 · Trends & Insights
Heading 3 · section label

Body 15 / 1.5 — clear, high-legibility copy for an audience that includes lower-literacy and bilingual (EN/ES) users.

Small 13 · secondary metadata · Montgomery, AL

XS 11.5 · timestamps, captions

$38+4.2%Eyebrow label
ClassSize / lineWeightUse
.t-display30 / 1.08800 expandedHero headlines
.t-h126 / 1.12800Screen titles
.t-h220 / 1.18700Card / section titles
.t-h316 / 1.25700Sub-headers, list titles
.t-body · .t-body-m15 / 1.5400 · 500Paragraph & emphasised body
.t-sm · .t-sm-m13400 · 600Metadata, secondary
.t-xs11.5500Captions, timestamps
.t-metric · .t-metric-sm38 · 26800 expandedWages, percentiles, counts
.eyebrow11 · .1em caps700Overline labels

Color helpers: .muted (text-2) · .faint (text-3) · .pos / .neg / .warn · .tabnum for tabular figures.

04

Spacing & radii

A strict 4-pt spacing grid and a 6-step radius scale keep rhythm consistent. Screen gutters use --s5 (20px) via .pad; cards stack with --s3 (12px).

TokenValue
--s14px
--s28px
--s312px
--s416px
--s520px
--s624px
--s732px
--s840px
RadiusValue
--r-xs6px
--r-sm10px
--r-md14px
--r-lg18px
--r-xl24px
--r-pill999px
05

Elevation

Five soft, cool-tinted shadows. Sized by intent, not whim: cards rest low, sheets and FABs float. The two colored shadows tie the yellow FAB and dark buttons to their fills.

--sh-sm

cards, chips, inputs

--sh-md

create menu, hover

--sh-lg

sheets, dialogs, toast

--sh-yellow

primary button · FAB

--sh-ink

dark button · employer FAB

06

Motion

Motion utilities are opt-in (add a class) and every one is disabled under prefers-reduced-motion. Three easings, short durations. Used live across the loading, refresh, sheet and create-menu screens.

EasingCurveFor
--ease-stdcubic-bezier(.4,0,.2,1)moves & cross-fades
--ease-incubic-bezier(.3,0,.4,1)entrances (sheets, dialogs)
--ease-outcubic-bezier(.4,0,1,1)exits
UtilityDurationEffect
.anim-sheet / .anim-scrim280 / 240msbottom-sheet slide-up + scrim fade
.anim-dialog200mscentered pop-in
.anim-toast260mssnackbar slide-up
.anim-stagger / .anim-list320 / 300mschildren rise in sequence
.anim-fab-open240msFAB rotates + → ✕
.tabfade150mstab content cross-fade
.appbar.is-collapsed180mscollapsing detail header
.tabbar.is-hidden280mshide-on-scroll (feed)
.press:activescale(.97) tap feedback
07

Iconography

A single SVG <symbol> sprite, thin geometric stroke (1.9px), 24px grid. Reference with <svg class="ic"><use href="#i-home"/></svg>. Sizes: .ic 22 · .ic-sm 18 · .ic-lg 26 · .ic-xl 30. One glyph = one meaning per mode (e.g. i-network = Network, i-users = Talent).

i-home
i-network
i-trends
i-jobs
i-message
i-message-sq
i-users
i-plus
i-search
i-bell
i-filter
i-sliders
i-edit
i-more
i-check
i-close
i-chevron-left
i-chevron-right
i-chevron-down
i-arrow-right
i-arrows
i-rotate
i-download
i-logout
i-pin
i-clock
i-calendar
i-wage
i-card
i-bolt
i-heart
i-comment
i-share
i-bookmark
i-star
i-flag
i-paperclip
i-camera
i-image
i-mic
i-doc
i-user
i-building
i-shield
i-lock
i-eye
i-globe
i-settings
i-truck
i-tools
i-phone
i-wifi-off
i-pause
i-trash
08

Buttons

One .btn base, five intents, three sizes. Primary (yellow) appears once per screen. Dark is the secondary heavyweight; outline / ghost are quiet. Destructive uses the danger tint.

.btn .btn--primary

Single primary action. Carries --sh-yellow.

.btn .btn--dark

Heavyweight secondary / on light cards.

.btn--outline .btn--ghost

Quiet actions; ghost for dismissive.

.btn--danger [disabled]

Destructive, and the disabled state.

Sizes & width
.btn--sm 40px · default 52px · .btn--lg 56px · .btn--block full width
Icon buttons (app bar)
.iconbtn .iconbtn--ghost .iconbtn--dark

40px round. Wrap with .iconbtn-wrap + .badge--dot for unread.

09

Avatars

Initials on navy by default; yellow for the signed-in worker; squared (--org) for companies. A dashed placeholder covers the no-photo case.

MR MR MR MR MR SM ?
.avatar · --xs --sm --lg --xl · --yellow · --org · --ph

Sizes 28 / 34 / 40 / 56 / 84px. img children are object-fit cover.

10

Tags & badges

Small status pills carry meaning by color. Match score uses the inverted ink/yellow pair to feel premium. Badges are for unread counts.

92% match Above market −$2/hr gap Fair Verified 4 spots Urgent Draft
.tag + --match --pos --neg --warn --info --yellow --urgent · .tag--dot prefixes a dot
3 12
.badge · .badge--dot

Unread counts & presence dots.

11

Chips, segmented & tabs

Three selection patterns: filter chips (multi, horizontal scroll), segmented control (one of N, compact), and underline tabs (top-level views).

HVACPlumbingElectricalAll trades
.chip .chip--active .chip--dark · scroll row = .chiprow
.segmented + .is-active · .segmented--block stretches
.tabs > button.is-active

Yellow underline marks the active view. Pairs with .tabfade.

12

Forms & inputs

52px touch targets, 1.5px borders that darken to ink on focus and to danger on error. Inputs always pair with a .label and optional .hint.

Full name
Phone number
+1
.field > .label · .input · .input-group + .lead
Wage rangeWage range is required to publish
.field.is-error · textarea.input

Error darkens border + hint to danger.

.searchbar > input

46px; sits in headers and list tops.

On Off
.toggle · .toggle.is-on

Green when on. Settings & preference rows.

Worker
Find work & know your worth
Employer
Hire skilled trades
.choice · .choice.is-selected + .choice__radio
4
9
2
.otp > .otp__cell + .is-filled .is-active

SMS verification, auto-fill.

13

Cards & lists

The card is the workhorse container. Highlight (yellow wash) marks the one thing that matters; dark inverts for AI insights / wallet. List rows and section headers structure long content.

Default card

Surface, hairline border, soft shadow.

.card
Highlighted

Yellow wash + border for the key item.

.card--highlight
AI insight

A cert moves you to $46/hr.

.card--dark
List rows & section header
CertificationsAdd
EPA 608 Universal
Verified · expires 2027
OSHA 30
Verified
.card--flush · .section-head · .listrow + .listrow__chev · .divider
14

Feedback & overlays

Banners give persistent context; the toast confirms an action; dialogs confirm decisions; action sheets offer choices. Empty states always point to the next step.

Banners & toast
Application sent View
.banner + --offline --pos --warn --info · .toast
Dialog & action sheet

Delete this listing?

This can't be undone. Buyers will no longer see it.

.dialog + .dialog__icon--danger/warn/info/pos · .dialog__actions(--row) · overlay = .modal-center
.actionsheet > .actionsheet__item + __icon(--y) __sub · .is-disabled
Empty state
No saved jobs yet

Save jobs to compare them later.

.empty > .empty__icon

Always ends with one action.

15

Progress

Profile 60% complete
.progress > .progress__fill
85%
.ring (--p) > .ring__inner
Step 2 of 4
.stepper > .stepper__seg.is-done
16

Domain blocks

Purpose-built compositions for IronLink's core jobs: pay transparency, hiring and the feed. These encode the product, not just the brand.

Pay range & stats
You · $38
$24$40 median$62
.payrange > __track __marker __pin __bubble __scale
$62/hrTop 10% (p90)
128techs hiring near you
.statgrid > .stat > .stat__label
Area chart
.chart > .chart__grid __area __line · gradient id #ilGrad
Job card
HVAC Service Tech
Capitol Mechanical · 4.2 mi
$28–$34/hrAbove market
92% matchUrgentFull-time
.jobcard > .jobcard__wage (composes rows, tags, iconbtn)
Feed post · conversation row · chat bubbles
PJ
Patrick Jane
HVAC Tech · 3h
Job site photo

Passed my EPA 608 today 🔧

247 34
.post > __head __media __body __actions __action
CM
Capitol Mechanical
See you Monday at 7…
2m2
DL
Devon Lawson
¿Tienes disponibilidad?
1h
.convo > .convo__meta
Are you available Monday?
9:02
Yes — I can be on site at 7am
9:04 · Read
.chatlog > .bubble--in / --out + .bubble__time
Notification item
You're hired! Capitol Mechanical
2h ago
New match: Journeyman Electrician $32/hr
Yesterday
.notif + .is-unread > .notif__icon (tint per intent)
17

Loading, offline & media states

Designed for spotty job-site 4G: read & draft always work, writes queue, and every gap is explained. Skeletons hold layout; placeholders cover missing photos.

.skeleton + .sk-avatar .sk-line(.w40/60/80/100) .sk-thumb .sk-chip .sk-metric
Refreshing…
Updated 2h ago Will send when online Internet required
.ptr(.is-spinning/.is-ready) · .synced · .pending-clock · .offline-hint · .is-stale
No photo
.media .media--16x10/1x1/4x3 > .media__ph
Couldn't load
.media--broken + .media__retry