InkForge Design System

A code-truthful spec for a native macOS drawing app. The art direction is Studio Slate — a monochromatic dark workspace where the user's artwork is the only saturated thing on screen. Every token here maps to a constant in Sources/InkForge/UI/Theme.swift; when code and this doc disagree, code wins.

1 accent hue 5 surface greys 12 blend modes v1.0
01 · Identity

The canvas is the brand.

A drawing app for artists, not a productivity app for managers. Three principles hold the whole thing together — break any one and it stops feeling like InkForge.

The canvas is the brand.The artwork is the only saturated thing on screen. Chrome is monochromatic so colour decisions read true.
Neumorphism is the gesture.Every control is either raised (pressable) or recessed (a readout/track). Legible without hover — essential on Wacom.
Steel blue is the only colour we own.#4874B0 marks the active tool, focused control, and selected layer. Nowhere else.
02 · Color

Five greys, one accent, nothing else.

The surface hierarchy is built from five near-neutral greys, each ~4 percentage points lighter than the last. When panels nest, the inner one is always one step lighter than its parent. Steel blue is the single accent — it appears in four specific contexts only.

Surfaces — five-stop grey

canvas-bg
#242426
Workspace surround, behind the bitmap
panel
#2E2E30
Toolbar, status bar, left sidebar
panel-alt
#383839
Layer panel, color picker (nested)
button-bg
#3D3D42
Default control background
raised
#474749
Neumorphic raised pad (knob, active tool)
inset
#1A1A1C
Recessed groove (slider track, inputs)

Text — three-tier on dark

text
#F2F2F2
Layer names, headers, knob readouts
text-dim
#B3B3B8
Captions, blend-mode popup, values
text-muted
#808085
Status bar, lock badge, secondary metadata

The single accent

accent
#4874B0
Active tool · focused control · selected layer
accent-light
#6A9FD4
AI spark glyph, hover links
accent-tint
15% alpha
Selected row wash, slider track fill
accent-glow
35% alpha
Active button glow (box-shadow)
border
#4D4D52
1px hairlines between panels
03 · Typography

System font throughout — mono digits where values tick.

Inter (–apple-system / SF Pro) everywhere. Use monospacedDigitSystemFont anywhere a numeric value changes (knob readouts, slider labels) so digits don't jitter sideways. JetBrains Mono for eyebrows, hex inputs, and spec labels.

Inter 700Display · section headers · 28+
Layers
Inter 600Panel header · action labels · 18–22
Brush Settings
Inter 500Body · UI · layer names · 12–16
Dry Brush tip · Opacity 78% · Blend: Multiply. Drag vertically on the left sidebar to adjust brush size.
JetBrains Mono 600Micro · eyebrows · knob values · 10–13
SIZE 24 · OPACITY 78% · #4874B0
04 · Spacing

A tight scale — drawing apps fight for canvas space.

Six steps from a 2px row gap to a 24px status-bar rhythm. Tight by design — every pixel of chrome is a pixel not given to the artwork.

xxs
2px — layer row gap
xs
4px — bottom-bar gap, prop row
sm
6px — toolbar right cluster
md
8px — toolbar left cluster (default)
lg
16px — section inner padding
xl
24px — status bar inter-item gap
05 · Radius

Tight corners — precision tool, not consumer app.

Four steps, all small. Large rounded corners signal "friendly app"; these signal "instrument". Pill is reserved for color swatches and small tags only.

Pill Color swatch ring, AI tag
r-pill · 999px
Toolbar btn 36×36 tool buttons
lg · 8px
Layer row 44px list rows
md · 6px
Thumb 32×32 layer thumbnails
sm · 4px
Badge Count badges, lock chips
xs · 3px
06 · Elevation

Every shadow is pure black — never warm grey.

On a dark background, coloured shadows add noise. All shadows use black alpha. The steel-blue glow is the one exception — reserved exclusively for the active tool button.

sh-sm
sh-card
glow-active
inset-groove
07 · Neumorphism

Two recipes: raised pad and recessed groove.

The load-bearing design idea. Every interactive surface is either a raised pad (pressable) or a recessed groove (readout/track). No hover state — this is a tablet-first app. The active tool gets the steel-blue glow as its one reward.

Raised pad — toolbar buttons

Pen
Active tool
Eraser

Recessed groove — vertical sliders & knob

SIZE
OPACITY
KNOB
78
08 · Components

Six primitives compose every screen.

All components in Sources/InkForge/UI/. Representative samples rendered on the dark canvas stage:

Layer panel rows

Sketch
100%
Colour wash
72%
Background
REF

Toolbar buttons (Pen · AI · Selection · Eraser)

Color swatches (recent colors)

09 · Motion

Feedback, not decoration.

Short and purposeful. All animations respect prefers-reduced-motion — they collapse to a plain opacity transition. The steel-blue glow is the most visible motion in the system.

Tool select Steel-blue glow fades in, 160ms ease-out
78
Knob tick Value scales 1 → 1.12 → 1, 120ms
AI sheet
Sheet open Scale 0.96 → 1, fade in, 220ms
Layer insert Row drops from above, 280ms ease-out
10 · Iconography

SF Symbols at system stroke weight — OS-continuous chrome.

All in-product glyphs use SF Symbols line icons at the system default stroke weight, matched to SF Pro text. No custom icon set — this keeps the app feeling native and eliminates a design maintenance surface. The app icon is the one exception: a custom pen nib with a steel-blue AI sparkle, on a dark canvas-matching background.

InkForge app icon
11 · Voice

Precise, plain, and deferential to the artist.

The app never congratulates itself. Copy is label-grade brief in the toolbar, a full sentence only when something needs context. The AI feature is presented as a collaborator, not a magic shortcut.

We say

"Inpaint — describe what to fill"

"Result added as new layer"

"Hold stroke end to snap to shape"

We don't say

"Magic AI will perfect your art!"

"Replaced by AI — amazing!"

"Auto-beautified your stroke ✨"

12 · Doing it wrong

Five ways to break the feel.

If a new screen does any of these, it isn't InkForge anymore.

  • Don't use colour in the chrome. The user's artwork is the only saturated thing on screen. A coloured toolbar button competes with a warm neutral the artist just chose for their painting.
  • Don't use coloured shadows. All shadows are pure black alpha. Coloured shadows on a dark background read as light leaks, not depth.
  • Don't bake AI results into the canvas. Results always land as new layers — the artist makes the final call on blending. No destructive operations without a clear undo path.
  • Don't rely on hover-only feedback. This is a Wacom tablet app. If an affordance only reveals itself on mouse hover, a stylus user never sees it. States must be readable from form, not cursor.
  • Don't use proportional-width digits in readouts. Use monospacedDigitSystemFont wherever a value ticks — the label must not jitter sideways as it changes.
13 · Source of truth

Where every token actually lives.

This page documents the system; the code defines it. When they disagree, the code wins.

TokensSources/InkForge/UI/Theme.swift
Neumorphic sliderNeumorphicVerticalSlider.swift
ToolbarToolbarView.swift
Layer panelLayerPanelView.swift
KnobKnobControl.swift
AI integrationAI/AISheetController.swift
Repositorygithub.com/ilan-stack/InkForge → Case studyOverview page →