A design system for freelancers who run themselves like a business.
Sole is the operating system for independent workers. This is the living library that every screen, email, export, and nudge is built from.
Principles
What's in the library
8 pages
Tokens, brand, logo, color, type, space, motion, iconography — every decision before a component exists.
19 UUI + 6 Sole
Every Untitled UI v2.0 core component themed for Sole, plus six patterns you won't find anywhere else.
Do's & Don'ts
Side-by-side rules for when to use each pattern — and when to back away slowly.
Brand
Sole is the operating system for the independent economy. Every visual and verbal choice is tuned to one reader: the freelancer who is one invoice away from a hard month.
Voice
How we sound
Direct. Specific. Slightly dry. We explain the stakes, never the feelings. We use numbers when we have them.
Sample: "This contract gives the client your IP. One line fixes it."
How we don't sound
Not bubbly. Not aspirational. Not fintech-sterile. Not legal-ese.
Avoid: "We're so excited to help you crush your goals!" · "Transform your freelance journey." · "Leverage synergies."
Naming
Sole has four meanings stacked into one word: the sole operator, the sole responsibility, the sole of a shoe (grounded), and the soul of the work. The ring-as-o in the wordmark carries all four — it's the loop of work, money, and client — always moving, always returning.
Brand in one sentence
Sole is the tool that turns freelance chaos into a business you can defend, invoice, and grow from.
Logo
The Sole wordmark. Inter Semi Bold with an ember ring replacing the "o". Built once; used everywhere at every size from favicon to billboard.
The mark
Size family
Always use a preset. Never scale arbitrarily — kerning, ring stroke, and baseline tuning are set per size.
Mechanics
Ring & dot specs (per size)
- • xl 112px → ring 64 / 4px stroke · dot 22px
- • lg 72px → ring 42 / 3px · dot 14px
- • md 48px → ring 28 / 2px · dot 10px
- • sm 28px → ring 17 / 1.5px · dot 6px
- • xs 20px → ring 13 / 1.2px · dot 4.5px
- • Stroke = Midnight (or Sand on-dark) · Dot = Ember
- • Letter-spacing -0.085em · Line-height 0.95
l → e kerning
The letters "l" and "e" need a bespoke optical correction. Always apply margin-left: 0.06em to the "e" at every size. This is what separates Sole from a Google Font dump.
Clear space
Always reserve 1× ring diameter of clear space on all sides. Don't crop the mark into other shapes. Don't box it.
Forbidden treatments
Tint the ring. It is always Ember — on Midnight, on Paper, on photography, in print. The ring is the brand.
Italicize or compress the wordmark. Never change the tracking.
Add a tagline lockup under the mark. Sole stands alone. Context comes from surrounding copy.
Use Semi Bold at display sizes above 96px. Drop to Medium (500) for giant applications to keep the letterforms from feeling chunky.
Color
Four brand colors. Three surface colors. A semantic layer. Together they define every screen — no custom hex values, ever.
Brand
Ramps
Semantic
Usage rules
Primary CTAs are Midnight on Sand/Paper. Dark reads as confident, not destructive — the way Linear, Stripe, and Vercel do it.
Use Ember as a primary button background. Warm red-orange reads as destructive — it will be mistaken for a delete action.
Reserve Ember for brand accents: the logo dot, the Sole Score ring, active nav indicators, and the breathing session badge.
Pair Ember with Error (Red) in the same view. The warm-to-warm clash makes real alerts harder to scan.
Use Midnight for long-form work surfaces. Use Paper for forms, wizards, and onboarding. Use Sand to bridge.
Use pure white (#FFFFFF) as a page background. Paper is our white — it's warmer and matches the ink.
Typography
One typeface. One monospace. Nine sizes. Four weights. Every line of text on Sole picks from this list — no exceptions.
Typefaces
Sole's entire voice. Regular for body, Medium for UI labels, Semi Bold for headings, Bold for display. Never use Light or Extra Bold.
Reserved for: token names, specs, code samples, invoice numbers, and the "meta" microtype on resource lists. Never body copy.
Scale
Weights
Pairing rules
Pair a display title with lede (lg) copy underneath. Sand-on-paper or Sand-on-midnight; never lede on color.
Use display sizes for body text. If there's more than 2 lines, it's not display — it's body.
Space & Grid
Everything on a 4-pixel grid. Everything inside a 12-column canvas. Break either and the UI starts to look like it was hand-assembled.
Spacing scale
Radius
Grid
12-column grid. 16px gutter inside the product shell; 32px gutter on marketing surfaces. Max content width 1080px inside the library; 1200px on marketing.
Shadows
Motion
Sole's animation library is not an add-on. Durations and easings live in the core tokens; every component references them. This page shows what each token feels like and when to reach for it.
Principles
--ease-out-soft. Linear is reserved for indeterminate loading strips only.prefers-reduced-motion collapses durations to 0.001ms system-wide.Duration tokens
Easing tokens
Signature motion
Sole has six named motions. Learn their feel; use them verbatim.
Brand mark motion
The Sole wordmark has five sanctioned motions. All five loop in the stages below for study — in production each fires once (or loops in a designated ambient surface only).
Logo motion rules
Use Ring Reveal once per session on the app load splash — it's the brand's handshake.
Stack two logo motions on the same mark. Mark Breathe and Dot Breathe cannot coexist — pick the ambient behavior once and commit.
Fall back to a static mark when prefers-reduced-motion is set. The logo is recognizable without movement.
Rotate, skew, or color-shift the wordmark. The five motions above are the complete set — new logo motions require a Joe-owned RFC.
Motion × component matrix
| Component | Motion | Duration | Easing |
|---|---|---|---|
| Button · primary/secondary | Pressable Lift | 150ms | --ease-out-soft |
| Input · focus | Field Focus | 150ms | --ease-in-out |
| Card · hover | Translate -2px | 250ms | --ease-out-soft |
| Modal · open | Fade + scale 0.98→1 | 250ms | --ease-out-soft |
| Drawer · slide | Drawer Slide | 400ms | --ease-out-soft |
| Toast · arrive | Translate up 12px + fade | 250ms | --ease-out-soft |
| Sole Score · mount | Score Draw | 600ms | --ease-reveal |
| Verdict Card · mount | Verdict Reveal | 600ms | --ease-reveal |
| Nudge badge · waiting | Nudge Pulse | 1.6s loop | --ease-out-soft |
| Analyzer · working | Load Scan | 1.4s loop | --ease-in-out |
| Session badge · idle | Breathe | 3s loop | --ease-in-out |
| Logo · app mount | Mark Reveal | 600ms | --ease-reveal |
| Logo · brand splash | Ring Reveal | 800ms | --ease-reveal |
| Logo · session active | Dot Breathe | 3s loop | --ease-in-out |
| Logo · empty state | Mark Breathe | 3s loop | --ease-in-out |
| Logo · launch moment | Mark Draw-In | 1.2s one-shot | --ease-reveal |
Do's & Don'ts
Reference tokens, not raw values. transition: transform var(--dur-fast) var(--ease-out-soft);
Stack animations on a single element (no "scale + rotate + fade" cocktails). One move, one intent.
Test every animation with reduced motion on. If the UI becomes unclear without motion, the design itself is broken.
Use durations outside the token set. No 200ms, no 300ms, no 500ms. The scale exists to create rhythm.
Iconography
Phosphor Icons at 1.5px stroke. Always. Never Lucide, Feather, Heroicons, or emoji. Icons are always paired with a label on first use.
Set
Phosphor Icons · Regular weight · 24px default, 16px in tight contexts, 32px for empty-state centerpieces.
Sample icons (Phosphor-style)
Rules
Use Phosphor at 1.5px stroke, 24px default. Stroke color = current text color (inherits).
Mix icon families. Never ship Phosphor + Feather + Lucide in the same UI. The stroke weights don't match.
Pair an icon with a label on first use in a screen. Solo icons only after the meaning is taught.
Use emoji in the product. Not in copy, not in empty states, not in tooltips. Emoji read as casual; Sole handles other people's money.
Illustrations
The warm layer. 24 spots in Style C — editorial-minimalist shape with heavy risograph texture, warm shadows, wobbly outlines. The illustration system intentionally breaks Sole's surgical UI register so the emotional moments feel earned.
Why illustrations break the register on purpose.
Sole's UI is Linear-lane: precise, engineering-tool, surgical. That register works for 95% of the product — the tables, forms, dashboards, flows where freelancers need speed and clarity. But the 5% of the product that carries an emotional beat — a client finally paid after the Nudge, a contract got signed, a scope got agreed on — deserves warmth the chrome would never offer.
Illustrations carry that warmth. Heavy riso grain, visible hand, warm light falling across objects. Locked as "Style C" on April 17, 2026. Drawn by Vera Sable in the Hedof / Brian Edward Miller / Tom Froese lineage.
Palette
Each illustration uses 3–4 colors, always drawn from this set. Sand is the field. Midnight is line and structure. Ember is life (coins, dots, seals). Clay is the riso tint. Ink is the warm shadow. Paper is the alternate surface for editorial hero work.
Contracts · Module 1
Get Paid · Module 2
Define · Module 3
Cross-module · 9 shared surfaces
Shared vocabulary
Every piece in the kit uses some subset of the same object, surface, and motion library. That's how 24 illustrations feel like one artist made every one — and how the 25th and 50th and 100th will continue to feel coherent as the kit grows.
Object library
The coin. Ember circle, 32–62px. Heavy riso. Always carries weight.
The paper. Paper-fill rectangle, Midnight outline. The thing that gets signed, sent, or marked.
The ruler. 3px Midnight line with ticks. Always horizontal. "Define" lives here.
The compass. Circle + cardinals + rotating needle. Navigation and loss.
Surface library
Tabletop line. The horizon every object rests on. Drawn in from the left.
Warm shadow. Ink ellipse, 35% opacity, riso-textured. Under every lifted object.
Light rays. Ember diagonal strokes from upper-right. Arrive with the good moments.
Ambient grain. Clay-tinted overlay at 8–10% on every piece. The paper feel.
Motion library
Rise. Fade + 10px translateY. For papers and planned arrivals.
Drop. Fall + slight bounce. For coins and concluded deals.
Pop. Scale-0.6→1.1→1. For seals, dots, and punctuation marks.
Draw. Stroke-dashoffset. For lines that narrate themselves.
Pulse. Scale 1→1.25→1. For dots that haven't resolved yet.
Rules
Lean into texture on celebration and welcome surfaces. The grain is the proof a human made this — the studio's premium signal against AI-smooth vector gloss.
Pull the texture back to "fit" Sole's surgical UI register. The mismatch is the point. The illustration's job is to break the register.
Write the one-sentence idea before drawing. If you can't write the caption, the concept isn't done.
Mix style registers across the kit. A, B, and C cannot coexist — pick one and ship all 24 in it. We picked C.
Animate once on mount. Gentle ease-out with slight overshoot. No looping — the moment matters because it happens once.
Use emoji or stock illustration as a substitute. If we don't have a Vera piece for a surface yet, brief one — don't swap in temporary art. Temporary art becomes permanent.
UUI Components
Untitled UI v2.0 is Sole's backbone. Every primitive here is a real UUI component themed with Sole tokens. Never build a custom button when a UUI button exists.
Buttons
Inputs
Badges
Avatars
Toggle · Progress · Tabs
Toggle
Progress
4 of 7 modules complete
Tabs
Data table
| Client | Contract | Score | Status | Amount |
|---|---|---|---|---|
| Lovelace Studio | Brand system · v2 | 89 | Paid | $8,400 |
| Mariner & Co | Monthly retainer | 71 | Due Apr 30 | $3,200 |
| Banyan Coffee | Packaging design | 50 | Overdue 12d | $1,850 |
The full UUI map
Sole draws on every core UUI v2.0 primitive. Search the Untitled UI library before inventing new components.
Actions
Button · Button Group · Icon Button · Dropdown · Menu · Context Menu
Inputs
Input · Textarea · Select · Multi Select · Radio Group · Checkbox · Toggle · Date Picker · Range Slider
Display
Avatar · Avatar Group · Badge · Tag · Progress Bar · Progress Circle · Tooltip · Divider
Navigation
Tabs · Breadcrumbs · Pagination · Sidebar · Sub-nav · Command Palette
Feedback
Alert · Toast · Modal · Drawer · Banner · Empty State · Loading Scan
Data
Table · Card Grid · List · Stat Card · Chart Card · Activity Feed
Sole Patterns
Six patterns that only exist in Sole. Each is a composition of UUI primitives plus a Sole-specific signature. Memorize them — they are what makes the product feel like Sole.
1 · Sole Score
A 0–100 number backed by a ring. Tiered: Red (0–39), Ember (40–69), Success (70–89), Strong (90–100). Always animates with Score Draw on mount.
2 · Verdict Card
The top-of-result card: one-sentence verdict, Sole Score, and three sharable badges. Always appears before the detailed analysis.
3 · Nudge Tone Matrix
Every Nudge (follow-up message) is available in three tones. Users pick based on how overdue the invoice is.
4 · Shareable One-Pager
Every major analysis produces a single vertical summary image (Midnight background, Ember accent, Sole wordmark locked bottom-right) that freelancers can post to LinkedIn or send to a client. This is the product's main growth vector.
Three clauses flagged. One rewrite needed to protect your IP.
5 · Flag Stack
Ordered list of issues found in an analysis. Each flag has a severity chip, plain-English description, and "Rewrite this" CTA. The top flag always has Nudge Pulse applied until user acknowledges.
6 · Risk Stack Strip
A thin horizontal strip at the bottom of every screen that shows what Sole can and can't advise on (the legal risk tiering — T1 through T4). Always present. Never dismissable. This is what keeps Vivian happy.
Do's & Don'ts
The fastest way to make a Sole screen feel wrong is to break one of these. When in doubt, ping Joe before shipping.
Voice
"This contract transfers your IP. Fix with one line."
"We're excited to help you on your freelance journey! 🚀"
Color
Primary CTAs = Midnight. Ember is reserved for the logo dot, active nav bar, and the Sole Score ring only.
Use Ember as a button background. It reads as red/destructive and will be confused with delete.
Destructive = Error Red (#D02424). Delete, remove, unlink. Nothing else belongs in red.
Apply Ember to icons, dividers, or decorative backgrounds. That's Coral's job.
Type
Use display sizes only for page titles and hero copy. Body stays at 16px.
Mix Inter and a second sans-serif "for variety." Inter carries all the voices we need.
Motion
Use Score Draw on mount for every Sole Score — including tiny ones in a table cell.
Animate error states with pulse or shake. Errors should feel certain, not jittery.
Components
Reach for a UUI primitive first. If it doesn't fit, check with Joe — that's the only way new primitives enter the library.
Build a one-off button "because this screen is different." It's not.
Resources
Where the real work lives. Figma keys, GitHub paths, token exports, and the humans who own each layer.
Figma
-
Product · v0.2.0Sole — Product Design FileCanonical source of truth. 16 pages. 3-layer token model. Tailwind breakpoints xs–2xl.Open →
-
UUI LibraryUntitled UI v2.0 (published)Every primitive Sole uses. Themed with Sole tokens in the product file.Open →
-
Logo · Systemsole-lockup-system.htmlReusable wordmark CSS, size family, EPS export. This page inherits its wordmark from here.View →
Code
-
Next.js 15apps/sole-webPrimary product shell. Turborepo monorepo. Imports tokens from packages/tokens.Repo →
-
Tokenspackages/tokensCSS variables + Tailwind preset. Exported nightly from the Figma file.Repo →
-
Componentspackages/uiSole-specific patterns: VerdictCard, ScoreRing, NudgeBadge, FlagStack, RiskStackStrip.Repo →
Token sample
Owners
-
DesignJoe Richardson (CDO)Vision, component library additions, motion library.joe@primismerian.co
-
Product DesignZara Ahmed (Design Lead)Day-to-day pattern work and Figma file owner.zara@primismerian.co
-
EngineeringLucas Pereira (Platform Lead)Token pipeline, components package, Figma→code bridge.lucas@primismerian.co
-
CounselVivian Park (Fractional GC)Risk Stack strip authority. Release-gate review on every launch.vivian@parkgc.com
Version
This document is V2. Additions since v0.1: full Illustrations foundation (24 Phase 1 spots in locked Style C, shared object/surface/motion vocabulary, risograph filter system, animation primitives). Next release: v0.3 (adds Grow module patterns, dark-mode specific shadow tokens, the complete Flag Stack interaction model, and Phase 2 illustration expansion).