Findry · design system v1.0 · 25 Apr 2026

The system, rendered.

Every token, every primitive — live in React. Same pixels, same mechanical precision. Dark-mode-first. No italic. No serif. No ornament.

01 · INTER — DISPLAY
Build product decisions that compound
H1 · 52/1.05
The Findry loop
H3 · 28/1.2
One gap, 330 degrees of arc

NO SERIF · NO ITALIC · MECHANICAL SANS THROUGHOUT
02 · INTER — BODY + JETBRAINS MONO
Findry is where product hypotheses live, get tested, and get validated. The body voice is calm, declarative — never hyped. Never italic.

JETBRAINS MONO · META0.18–0.22em tracking
FINDRY · LOGOTYPEv1.0 · 25 APR 2026● SIGNALS

--font-display:var(--font-inter), 'PP Neue Montreal', Söhne, system-ui, sans-serif
--font-body:var(--font-inter), 'PP Neue Montreal', Inter, system-ui, sans-serif
--font-mono: var(--font-jetbrains-mono), JetBrains Mono, Fira Code, monospace
03 · NIGHT — FOUNDRY INTERIOR
#0E0E11
night
#0A0A0D
night-deep
#1D1D24
night-raised
#2C2C38
night-edge

OVERLAY · MODALS
#252530
night-overlay
#2E2E3C
border-strong

DAYLIGHT · FG ON NIGHT
#ECEAE5
daylight
16.0:1
#B8B6B0
daylight-soft
9.5:1
#76767E
daylight-mute
4.3:1
#4A4A52
daylight-faint
2.2:1
04 · PAPER — COOL NEUTRAL LIGHT
#F5F5F2
paper
#ECECE7
paper-deep
#DCDCD4
paper-edge
#C8C8C0
paper-mute

INK · FG ON PAPER
#111114
ink
17.3:1
#2A2A33
ink-soft
13.0:1
#6B6B78
ink-mute
4.8:1
#9A9AA8
ink-faint
2.5:1
05 · HEAT — THE SIGNATURE
TEMPERED ORANGE · USE SPARINGLY — ONE ACCENT PER COMPOSITION
#FB923C
gold-soft
#EA580C
gold · canonical
#C2410C
gold-deep · pressed
18%
gold-wash

FindryIN USE
Findry canonical aliases: --color-heat (#EA580C) · --color-heat-deep (#C2410C) · --color-heat-glow (18%) · --color-heat-whisper (6%)
06 · SEMANTIC — STATUS ONLY
QUIET — NEVER DECORATIVE
#0F766E
ok
#B45309
warn
#B91C1C
err
#475569
info

WASH + LINE SCALES
14%
ok-wash
30%
ok-line
14%
warn-wash
14%
err-wash

openrunningpendinginvalidvalidclosed

Heat is precious, not decorative.

Heat marks focus and selection. It never fills a hover state or a background.

StateTokenPatternDefault (rest)--night-raisedBackground or border on rest stateHover--color-heat-whisper bg OR --border-strong borderNever heat fill on hoverFocus--color-heat outline, 2px, offset 2pxHeat is the focus indicatorSelected/Active--color-heat fill or --color-heat-border borderHeat marks selectionDisabled--night-edge border + --daylight-faint textNo heat on disabled
07 · PHASE SYSTEM — SPATIAL WAYFINDING
FOUNDRY REGISTER — 6 PHASES, 6 ACCENT HUES — TEMPERED FROM HEAT TO COOL
Signals#EA580C
Hypotheses#B45309
Tests#475569
Bets#0F766E
Outcomes#92400E
Pulse#ECEAE5

PHASEINDICATOR COMPONENT
SignalsHypothesesTestsBetsOutcomesPulse
SignalsBets

NAVIGATION RAIL PREVIEW
Signals
Hypotheses
Tests
Bets
Outcomes
Active: 3px phase-color left rule + gradient wash
Hover: dot fill + --night-overlay background
Entrance: translateX(-10px) → 0, 38ms stagger
Touch target: min 44×44px (WCAG 2.5.5)
08 · MARK — LOOP WITH BREAK
16 · min
24
32
48 · canonical
80

A · HORIZONTAL LOCKUPFindry
B · STACKED
Findry

FAVICON · APP ICON
16px
32px
64px
96px
09 · RADII
BORDER RADIUS SCALE
xs
2px
sm
4px
md
6px
lg
8px
xl
12px
2xl
16px
pill
999px
09 · SPACING — 4PX BASE GRID
SPACING SCALE
--s-1
4px
--s-2
8px
--s-3
12px
--s-4
16px
--s-5
20px
--s-6
24px
--s-7
32px
--s-8
40px
--s-9
48px
--s-10
56px
--s-11
64px
--s-12
96px
09 · ELEVATION — SHADOW SCALE
hairline
1px border only
sm
0 1px 2px / 28%
md
0 4px 12px / 36%
lg
0 12px 32px / 50%
10 · MOTION — TOKEN-DRIVEN
slide · 2.8s cubic
pulse · 2.4s ease-soft
dur-1 · 120ms · hover
dur-2 · 200ms · default
dur-3 · 320ms · layout
dur-4 · 560ms · entrance

no bounces · no springs

EASING CURVES
ease-softcubic-bezier(0.4, 0, 0.2, 1)ease-outcubic-bezier(0.22, 1, 0.36, 1)ease-incubic-bezier(0.4, 0, 1, 1)

prefers-reduced-motion: reduce → specimens go static. All motion communicates state only.
11 · BUTTONS

Primary: bg --gold · hover --gold-deep · text --night · font-weight 500
Secondary: bg --night-raised · border --night-edge · hover --color-heat-whisper wash
Danger: bg --err-wash · border --err-line · text --err
12 · FORM CONTROLS
SWITCH · BOOLEAN TOGGLE

CHECKBOX · MULTI-SELECT

INPUT · TEXT FIELD
13 · BADGE + PILL
BADGE · SQUARE RADIUS · CATEGORY TAGS
LabelOutlineHeatWith dot
SignalsHypothesesTestsBetsOutcomesPulse

PILL · ROUND RADIUS · STATUS TAGS
openrunningpendingclosedinvalidvalid

Badge radius: --radius-xs (2px) → categorical. Pill radius: 999px → sequential status.
14 · AVATAR
SIZE SCALE
PA
xs · 20
PA
sm · 28
PA
md · 36
PA
lg · 48

ACCENT COLORS
ACBSCRDMEF
Initials from name (max 2 chars). Optional accentColor overrides border + text color.
15 · SEPARATOR
HORIZONTAL · PLAIN

HORIZONTAL · WITH LABEL
or continue with
3 signals · 1 active test
VERTICAL · IN FLEX ROW
SignalsHypothesesTests
16 · SKELETON — LOADING STATES
RECT · CARD PLACEHOLDER
TEXT LINES
CIRCLE · AVATAR PLACEHOLDER
COMPOSITE · CARD SKELETON
17 · EMPTY STATE

No signals yet

Signals are the raw observations and data points that feed your hypotheses. Add your first one to get started.


No active tests

Commit a hypothesis to a bet to start running tests.

17B · PHASE EMPTY STATES (LOOP-AWARE)
TEACHING — entry point, no upstream
SIGNALS · 0

Signals are raw observations — a user quote, a support ticket, a data point. Everything you'll eventually ship should trace back to at least one.

BLOCKED — needs upstream content first
HYPOTHESES · 0

Hypotheses are built from signals. Capture 2–3 first, then come back to articulate what they suggest.

READY — upstream has content, proceed
HYPOTHESES · 012 signals captured

Ready to articulate a hypothesis from what you’ve seen?

READY — with inline action rows (Bets)
BETS · 03 supported hypotheses ready to promote

Pick the strongest one and stake a sprint on it. RICE, predicted impact, owner, ship date — all in writing before code.

0.78Onboarding tooltip drives 1st-week activation
0.71Inline pricing on /vs page lifts trial signups
0.66Slack capture cuts time-to-first-signal
DIAGNOSTIC — Outcomes integration health
OUTCOMES · 0

Outcomes close the loop. The first HIT/MISS/PARTIAL lands here automatically once a tracker reports on a shipped bet.

  • 4 bets shipped
  • Tracker: PostHog connected
  • Awaiting first metric report
DIAGNOSTIC — needs tracker connection
OUTCOMES · 0

Outcomes close the loop. Connect your analytics tracker so verdicts can be detected automatically.

  • 2 bets shipped
  • Tracker: not connected
FILTERED — for any phase
SIGNALS · 0 · FILTERED

No signals match these filters. Try widening the source list or removing the date range.

17C · INTEGRATION LOGOS — MONOCHROME (CURRENTCOLOR)
RESTING — daylight-soft
PostHog
Amplitude
Mixpanel
GA4
Slack
Jira
Linear
Figma
ACTIVE — daylight
PostHog
Amplitude
Mixpanel
GA4
Slack
Jira
Linear
Figma
18 · TOAST — NOTIFICATIONS
STATIC PREVIEW — LIVE SYSTEM VIA useToast() + TOASTER PROVIDER
Hypothesis H-042 updated by @paulo
Test committed — running for 5% cohort
Signal confidence below threshold (62%)
Failed to save — check connection

Provider: <Toaster /> at root layout (fixed bottom-right)
Usage: const {toast} = useToast(); toast('msg', 'success')
Stack: max 5 · auto-dismiss 4s · entrance translateY(8px) 200ms
19 · CARDS — HYPOTHESIS PATTERN
Hypothesesrunning
Digest mode drives weekly retention
PA@paulo · 3 signals
H-041closed
Onboarding compresses to 3 steps
validated · shipped 12 Apr
20 · EYEBROW — TWO MODES
A · MARKETING · SECTION LABELInter · 11px · 0.12em · uppercase
For product teams who build on evidenceThe state of things
B · PRODUCT META · DATA LABELSJetBrains Mono · 0.18–0.22em
H-0042 · BETS● RUNNINGv0.2.3
Marketing eyebrows: Inter 11/0.12em, uppercase, heat orange. Product meta (IDs, versions, status): Mono 0.18–0.22em — reserved for data signals.
22 · DATA-VIZ PRIMITIVES — MUX-38
VerdictPlot — predicted-vs-actual SVG instrument
predicted rangepredicted +12%−5%0%+5%+10%+15%+20%measured +9.8%
Meter — generic 0-to-max progressbar with bands
value=65 · max=100 · bands=[33, 66] · caret
Sparkline — generic SVG time-series line
Sample sparkline: 8 data points, latest 80%
StatTile — labelled numeric tile (neutral / heat / verdict)
Hypotheses24this quarter
RICE score380P0 bet
Hit rate72%last 12 months
RiceBreakdown — RICE factor rows with Meter gauges
Reach
5,000
Impact
×2
Confidence
80%
Effort
/ 4 pw
VerdictPill — mono-uppercase verdict chip
HITNEAR HITMISSINCONCLUSIVE
SignificanceBlock — plain-language + precise numbers

This bet landed just shy of its predicted target. The result is statistically significant, so it's unlikely to be down to chance.

The numbers

Effect: 9.8 (95% CI 6.213.4)

p-value: 0.031

Test: Welch's t-test

21 · ICONS — LUCIDE
SM · 12 · badges
MD · 16 · UI
LG · 18 · nav
strokeWidth=1.5 throughout

SHELL / NAV
Settings
HelpCircle
Search
Home
FEEDBACK / STATUS
Check
CheckCircle2
X
XCircle
Info
AlertTriangle
AlertCircle
DIRECTION
ArrowUp
ArrowDown
ArrowLeft
ArrowRight
ChevronUp
ChevronDown
ChevronLeft
ChevronRight
ACTIONS
Plus
Trash2
Copy
ExternalLink
Link2
Pencil
Eye
EyeOff
Lock
Unlock
STATE / UI
Loader2
RefreshCw
MoreHorizontal
Filter
Calendar
PRODUCT DOMAIN
Zap
Radio
FlaskConical
BarChart2
Megaphone
TrendingUp
TrendingDown

Import from @/components/ui/icons — never from lucide-react directly