CraftlumenDesign system

A wealth-management system, not a SaaS theme.

Warm paper, deep pine, one champagne accent, and a strict separation between editorial type and figures. Every product surface is a dark inset panel, so the interface always reads as an instrument sitting on a page.

Principles

The rules that keep the system from drifting into generic product design.

  1. 01

    Paper, not canvas

    Backgrounds are warm and slightly off-white. Pure white is a raised surface, never the page.

  2. 02

    Type carries the voice

    Headlines are a high-contrast serif; the interface is a neutral grotesque. Never mix the two roles.

  3. 03

    Figures are mono

    Every number uses tabular mono so columns hold still while values animate.

  4. 04

    One accent

    Champagne appears once per view — a rule, a pill, a marker. Two accents means one is wrong.

  5. 05

    Hairlines over boxes

    Structure comes from 1px rules and generous space, not from cards inside cards.

  6. 06

    Instruments are dark

    Product surfaces sit on dark panels, which keeps data legible and separates tool from page.

Theme

One system, two palettes. The switch happens at the token layer, so no component contains a theme conditional.

Switching

The system preference is the default and needs no script: the stylesheet carries a prefers-color-scheme block, so a visitor with JavaScript switched off still gets their own theme. An explicit choice is stored and replayed onto <html> by an inline script in <head>, before the first paint — there is no flash to correct afterwards.

Neither theme block is anchored to the root element, so data-theme on any element themes that subtree. The two specimens below are one page in two themes, which is the same mechanism a dark hero on a light page would use.

Both palettes, side by side
lightLive
Conviction, quantified.

Body copy on the page surface, with a +18.28% figure inline.

Tertiary label

A raised card sits on the page.

Product panel

$4,281,904.22

Champagne
darkLive
Conviction, quantified.

Body copy on the page surface, with a +18.28% figure inline.

Tertiary label

A raised card sits on the page.

Product panel

$4,281,904.22

Champagne
Role tokens

Components ask for a role, never for a colour. These are the only tokens that move between themes; the pine, champagne and dark-panel ramps below are identical in both. Values are read from the stylesheet at runtime, so this table cannot drift from the CSS.

Surfaces

The page and the things that sit on it. A card lifts, an alternating band sinks.

TokenLightDarkRole
surfacePage canvas
paperRaised surface
sandAlternating band
sand-deepInset / track
lineHairline rule
line-softQuiet divider
Foreground

Four steps, and never more. Anything below `ash` would fail AA at small sizes.

TokenLightDarkRole
inkHeadings
ink-softStrong body
slateBody text
ashTertiary text, labels
Brand as ink

Pine and champagne when they are words on the page rather than fills. The ramps themselves do not move between themes; these do.

TokenLightDarkRole
brandEyebrows, marks
brand-strongEmphatic figures
brand-softChecks, secondary marks
accent-inkChampagne as text
accent-ink-softChampagne, quieter
focusFocus ring
Tinted chips

Badges and pills: a ground, an edge and a legible foreground, as a set.

TokenLightDarkRole
tint-brandPine chip ground
tint-brand-fgPine chip text
tint-brand-linePine chip edge
tint-accentChampagne chip ground
tint-accent-fgChampagne chip text
tint-accent-lineChampagne chip edge
Data on the page

Recalibrated per theme. A hue tuned for ivory loses its value against a dark page, so the dark theme adopts the dark-ground set. Inside a product panel the colours never change, because the panel never changes.

TokenLightDarkRole
gainPositive
lossNegative
s1Series 1
s2Series 2
s3Series 3
s4Series 4
s5Series 5

Colour

Four ramps and a reserved semantic pair. The categorical series is validated, not chosen by eye.

Pine — brand

The primary. Deep enough to carry white type at 800 and above.

pine-50
#F2F6F4
Tint
pine-100
#DCEAE3
Tint
pine-200
#B6D2C5
Border on tint
pine-300
#85B3A0
Muted mark
pine-400
#4F8E77
Icon
pine-500
#2E7259
Accent text
pine-600
#1F5B46
Focus ring
pine-700
#184839
Button hover
pine-800
#12352B
Primary button
pine-900
#0D261F
Dark band
pine-950
#071713
Deepest band
Champagne — accent

Used sparingly: one accent per view. Never a gradient.

gold-100
#F6EEDC
Tint
gold-200
#EFE0BF
Tint
gold-300
#E0C88F
Text on dark
gold-400
#C8A15A
Accent mark
gold-500
#B08540
Hover
gold-600
#8F692F
Text on light
Dark panels

Every product mockup sits on these, in both light and dark contexts.

panel
#0C1714
Panel base
panel-2
#11201B
Panel raised
panel-3
#172A23
Panel hover
panel-line
#22352D
Panel hairline
Semantic — reserved

Gain and loss are never reused as categorical series, and never carry meaning alone — an arrow or a signed value always travels with them.

gain
#1E7F5C
Positive, on light
gain-dk
#2E9E77
Positive, on panel
loss
#B4402B
Negative, on light
loss-dk
#E0684B
Negative, on panel
Categorical series — validated

Assigned in this fixed order and never cycled. The set clears the OKLCH lightness band, the chroma floor, adjacent-pair CVD separation and 3:1 contrast against both surfaces. The one pair in the warn band ships with direct labels, which is what makes it legal.

SlotOn lightOn panel
s1 / s1-dk#1E7F5C#2E9E77
s2 / s2-dk#B04E2C#C8623C
s3 / s3-dk#33689E#4A87C4
s4 / s4-dk#9A6716#B8823A
s5 / s5-dk#7D5EA6#9C7BC0

Typography

Three families, three jobs. Instrument Serif speaks, Inter explains, IBM Plex Mono counts.

Display scale

Conviction

Quantified and explained

One page that tells the truth

Detected patterns

Reference
TokenFamilySize / leadingUse
display-xlInstrument Serifclamp(2.9rem → 6rem) / 0.94Hero only
display-lgInstrument Serifclamp(2.4rem → 4.1rem) / 0.98Section headings
display-mdInstrument Serifclamp(1.9rem → 2.85rem) / 1.04Sub-headings
display-smInstrument Serifclamp(1.4rem → 1.85rem) / 1.14Card titles
ledeInterclamp(1.06rem → 1.19rem) / 1.62Standfirst
bodyInter0.875–0.95rem / 1.6Paragraph, UI
label-monoIBM Plex Mono0.6875rem · 0.16em · capsEyebrows, axes
numIBM Plex Monotabular figuresEvery figure on the page
Body & figures

A standfirst sits between the headline and the argument. It runs one or two sentences and never carries a figure.

Body copy holds at 14–15px with generous leading. Figures set inline stay mono, so $4,281,904.22 and +18.28% keep their rhythm.

Surfaces

Radius, elevation and the four page tones that alternate down the homepage.

Page tones
surfaceDefault
sandAlternate
paperRaised
pine-950Dark band
Radius
xs
4px
sm
6px
md
10px
lg
14px
xl
20px
2xl
28px
Elevation
shadow-xs
Hairline lift — resting cards
shadow-sm
Controls
shadow-md
Card hover
shadow-lg
Floating chips
shadow-xl
Overlays
shadow-panel
Dark product frames

Controls

Every interactive element is a pill or a hairline. No filled grey boxes.

Button — variants
Button — sizes
Badge
Neutral2 months freeMost subscribedReconciledPolicy breach
NeutralLiveRiskWatch
Switch, input, eyebrow, avatar
Annual
Private wealth
Accordion

One question per row, answered in plain sentences. The open row is the only one with strong ink; the rest recede.

The first row, so the pattern is legible without a click.

Data display

Figures first. A stat tile with no plot is often the right chart.

Stat
Assets monitored$0.0B+12.1% YoY
Median alert latency0.0s
Max drawdown−11.6%vs −18.4% benchmark
Portfolio value$0.00+0.91%
Sharpe (3Y)1.42
Beta vs. benchmark0.83
Card
tone=paper

Resting surface with hover lift.

tone=sand

Inset on a bone page.

tone=panel

Product surface.

Marquee
NORTHVALEAshcombeSTONEHAVENKestrel & Co.

Charts

Thin marks, recessive grids, one axis, and a hover layer by default.

Rules
  • One y-axis per frame. A second scale becomes a second chart.
  • Categorical hues are assigned in fixed order and never cycled; a sixth category folds into “Other”.
  • Magnitude uses one hue, light to dark. Polarity uses the reserved gain/loss pair with a neutral middle.
  • Status colours are reserved — they never stand in for a series.
  • Two or more series always carry a legend; up to four are also direct-labelled, so identity is never colour alone.
  • Grid and axis type stay recessive; the series line is the only strong mark.
  • Every figure is set in tabular mono so columns hold still while values animate.
Time series — hover for the crosshair
Composition & magnitude
Donut — direct-labelled
Total
4.28M
  • Global equities46.2%
  • Fixed income21.4%
  • Private markets14.8%
  • Real assets12.6%
  • Cash & equivalents5.0%
Bars — polarity by sign
  • Semiconductors+4.8%
  • Industrials+3.1%
  • Healthcare+2.4%
  • Consumer staples−0.9%
Micro marks
+1.82%
−0.31%
94
81
Conviction score

Motion

Two curves, long durations, and a full reduced-motion path that fades instead of moving.

TokenValueApplied to
ease-out-quintcubic-bezier(0.22, 1, 0.36, 1)Entrances, reveals, layout
ease-in-out-quartcubic-bezier(0.76, 0, 0.24, 1)Loops, sweeps, pulses
Reveal720ms, y +18px, onceEvery section entrance
Count-up1500ms quintic, onceHeadline figures
Path draw1500ms clip wipeTime-series lines

Every animated component reads prefers-reduced-motion. Under it, reveals lose their translation, counters land on their final value immediately, chart paths render complete, and the ambient marquee, sweep and pulse stop.