Design System

Open1031 Style Guide

The design-system reference for the Open1031 redesign — color tokens, the Inter type scale, spacing and radius, and live components. The Existing vs Redesigned section below shows, element by element, how the redesign evolved the live app — and where it deliberately kept what the founder already liked. Everything renders on the real app theme (app-theme.css). Dark is the default; toggle to verify both modes.

Existing vs Redesigned

Where the redesign actually evolved the live app, the Current (today's shipped UI) and the Redesigned treatment are shown side by side. Everything renders on the same theme tokens — the redesign uses the real app theme, it does not fork it. Where the redesign deliberately kept the current design, that is called out honestly.

One foundation. Color tokens, the Inter type scale, spacing, radius, and per-hub colors are shared and unchanged — they are documented once below and labeled accordingly. The redesign is a treatment layer on top of the same app-theme.css, not a new design language.

Hub cards

The dashboard's headline element. The redesign keeps the card, the per-hub color, and the progress bar — and adds a soft colored glow in each hub's own color so the active journey reads as "lit up."

Current
Sales Hub
Relinquished property
100% complete

Flat card, thin top accent line, resting shadow-sm. The color lives only in the accent, icon, and bar.

Redesigned
Sales Hub
Relinquished property
100% complete

Same card, same color token — plus a soft glow in the hub's own color and a hover lift. Glow is driven by a --hub-glow token (no raw hex on the element). Hover the card to see the lift.

1031 Exchange Timeline

The founder liked the existing connected phase-node timeline, so the redesign faithfully keeps it. The node + connecting-rail concept is identical; the redesign only adds a soft glow ring and a gradient rail fill. This is a "kept, not replaced" case.

Current
Phase 1Sale
Phase 2Identify
Phase 3Acquire

Connected phase nodes with done / now / pending states — the element the founder approved.

Redesigned
Phase 1Sale closed
Phase 214 days to identify
Phase 3180-day close

Same structure, kept on purpose. Only additions: a glow ring on each node and a gradient progress rail. No new component was invented.

Metric tiles

Dashboard summary tiles (Days to identify, escrow balance, hubs completed). The redesign adds an icon chip and a progress bar for at-a-glance scanning; values and tokens are unchanged.

Current
Days to identify
14
45-day deadline · Sep 5, 2026

Label, value, sub-label. Functional but visually quiet.

Redesigned
Days to identify
14
45-day deadline · Sep 5, 2026

Adds a Lucide icon chip, a progress bar, and a hover lift. Same value, same theme tokens — more scannable.

Buttons

Button shape, size, and the teal primary are shared. The redesign adds a subtle hover state (color shift + focus ring); geometry is unchanged.

Current

shadcn button, teal primary, slate outline. Static fill.

Redesigned

Same component + mandatory icons. Every button carries a leading Lucide icon. Hover for the darker-teal transition and focus ring.

Badges & status pills

The redesign introduces tinted, bordered status pills with Lucide icons for deadline/escrow states — richer than the flat badge, while keeping the original badges for inline labels.

Current
Completed In progress Not started

Solid / secondary / outline badges. Color but no icon, no state semantics.

Redesigned
Funds deposited 14 days to identify 2 days to close

Adds icon + tint + border semantic pills for success / warning / critical / info. Original badges still ship for inline labels.

Neela tip

Neela's in-product guidance. The redesign gives her a canonical gradient avatar and a teal-tinted tip card so her voice is visually distinct from system copy.

Current
Tip

You have 14 days left to identify your replacement property.

Generic muted callout with a chat icon — not visibly "Neela."

Redesigned
Neela

You have 14 days left to identify. Paste a listing link and I'll pre-fill the property details for you.

Branded assistant. Gradient "N" avatar with spark, teal-tinted card, named voice. Open1031's assistant is now visually identifiable.

Color tokens · Shared foundation (unchanged)

Shared, not redesigned. These color tokens are identical in the current app and the redesign — both read from app-theme.css. Shown once.

Brand teal is the single primary. Navy is the deep-slate brand anchor used for dark surfaces and high-contrast type. Neutrals are the shadcn slate scale; semantic colors signal success, warning, and critical states.

Brand

Teal — Primary
--primary · hsl(190 37% 57%)
#69adba
Teal — Primary hover
--color-primary-hover
hsl(190 37% 50%)
Navy — Brand anchor
--foreground · hsl(222.2 84% 4.9%)
#0a1120
Primary foreground (light)
--primary-foreground
hsl(210 40% 98%)

Neutral slate scale — light surfaces

background
#fff
muted
#f1f5f9
border
#e2e8f0
muted-fg
#64748b
foreground
#0a1120

Neutral slate scale — dark surfaces

background
#0a1120
muted
#1e293b
border
#1e293b
muted-fg
#94a3b8
foreground
#f8fafc

Semantic

Success
success-600
#16a34a
Warning
warning-600
#d97706
Critical / Destructive
--destructive · hsl(0 84.2% 60.2%)
#ef4444
Info
info-600
#0891b2

Per-hub colors

From the app HubCard COLOR_MAP. Applied via token classes only — never raw hex on elements, never bg-${'{'}color{'}'} interpolation.

Sales / Relinquished
.hub-card--green · #16a34a
Identification
.hub-card--blue · #2563eb (teal gradient progress)
Escrow
.hub-card--cyan · #0891b2
Purchase / Replacement
.hub-card--purple · #9333ea
Disbursement
.hub-card--orange · #ea580c
IRS
.hub-card--cyan · #0891b2 (cyan, not teal)
Reverse flow
reverse accent · #4338ca
Admin / platform chrome
console chrome · #4f46e5

Typography · Shared foundation (unchanged)

Inter, with feature settings "rlig" 1, "calt" 1. Tight negative tracking on large headings; relaxed 1.6 leading on body. Minimum body size is 16px.

Display · 40px / 700Defer the gain, not the deal.
H1 · 32px / 700Your 1031 exchange
H2 · 24px / 700Identification Hub
H3 · 18px / 600Replacement properties
Body · 16px / 400Your Qualified Intermediary holds your sale proceeds in segregated qualified escrow.
Body small · 14px / 400Supporting copy, table cells, and secondary descriptions use the small body size.
Caption · 12px / 50045-day identification deadline
Weights Light 300 Regular 400 Medium 500 Semibold 600 Bold 700

Spacing, radius & shadow

Spacing scale (4px base)

4px
space-1
8px
space-2
16px
space-4
24px
space-6
32px
space-8

Border radius

0.25rem
--radius-sm
0.375rem
--radius-md
0.5rem
--radius (lg)
9999px
pill / full

Shadows

sm
card resting
md
hover lift
lg
active hub
xl
modal
glow
hub --hub-glow

Components

Every component in the design system, rendered live on the real app-theme.css and labeled with its class / token name. Buttons, inputs, containers, data, feedback, and brand/AI — the full set. See the component checklist at the end for completeness.

Buttons

Variants × sizes × states. Maps to the app Button (variant = default / secondary / outline / ghost / destructive / link; size = sm / default / lg). Every button must include a Lucide icon.

Icon rule (mandatory): Every button must include a Lucide icon — leading by default (icon precedes the label). Forward-navigation buttons (Continue, Next) use a trailing icon. Icon-only buttons must carry an aria-label. No FontAwesome, no Heroicons, no emoji. This rule applies in both light and dark mode — icon and label must both be legible at WCAG AA contrast.

Variants — each rendered with a Lucide icon

.btn-primary
.btn-secondary
.btn-outline
.btn-ghost
.btn-destructive
Learn more
link

Sizes — each with a leading icon

.btn-sm
default
.btn-lg

States — resting · hover · disabled · loading

resting
:hover
:disabled (opacity 0.5)
loading (.spinner)

Icon-only — must carry aria-label

.btn-icon-only aria-label
icon-only sm
icon-only destructive

All variants with icons — leading (create/confirm) and trailing (navigate)

leading · create
trailing · navigate
primary action
secondary action
outline sm
destructive
ghost

Cards

Segregated escrow
$850,000
EX-2026-0047 · qualified intermediary
Days to identify 14 45-day deadline · Sep 5, 2026
.card · .card-header · .card-content · .metric-card

Badges & pills

Default Secondary Outline Destructive
.badge .badge-default / -secondary / -outline / -destructive

Status & deadline pills

Funds deposited 14 days to identify 2 days to close Awaiting QI review
.pill .pill--success / --warning / --critical / --info

Phase labels

Phase 1 · Sale Phase 2 · Identify Phase 3 · Purchase Post · IRS
.phase-label .phase-label--1 / --2 / --3 / --post

Inputs & selects

Text, select, textarea, search, and the masked SSN field. Maps to the app Input, Select, Textarea, and Label. SSN is masked to last-4 — never raw NPI.

.label · .input (text)
.label · .select
.input-search (.input + leading icon)
.textarea
.input-ssn (masked, last-4 only)
Enter a valid dollar amount.
.input — error state

Checkbox · radio · switch

.check-box / .check-box--on
.radio-dot / .radio-dot--on
.switch / .switch--on

Tabs

Active panel content renders below the selected tab.
.tabs · .tabs-list · .tab.active · .tabs-content

Modal

.modal · .modal__head · .modal__body · .modal__foot

Neela tip card & avatar (spark agent with eyes + orbiting task-moons)

Neela

You have 14 days left to identify. Paste a listing link and I'll pre-fill the property details for you.

.neela-avatar — spark agent with eyes + orbiting task-moons (sm / default / lg)

Timeline nodes

Sale closed
Jul 22, 2026 · $850,000 deposited to qualified escrow
Identification window open
Aug 22, 2026 · 14 days remaining · 0 of 3 identified
180-day close deadline
Jan 18, 2027 · 149 days remaining
.timeline · .timeline__node (--done / --now / pending)

Hub cards

The dashboard's headline tile, one per hub color, each with a soft glow in its own color. Glow is driven by a --hub-glow token — never raw hex on the element. Hover to see the lift. The last card shows the locked state.

Sale Hub
Relinquished property
100% complete
Identification Hub
45-day window
20% · 0 of 3
Escrow Hub
Segregated · $850,000
Funded
Purchase Hub
Replacement property
Complete Identification first
.hubcard .hubcard--{green/blue/cyan/purple/orange} · --locked · glow via --hub-glow token

Section card

Header (icon + title + sub) over a body. Used to frame a labeled region inside a hub or dashboard.

Identification summary
Phase 2 · 45-day rule
You have identified 0 of 3 replacement properties. The window closes September 5, 2026.
.section-card · .section-card__head · __icon · __body

Dropdown menu

Maps to the app DropdownMenu. Shown open for review.

.menu · .menu__item (--danger) · .menu__sep

Accordion

You must identify your replacement property(ies) in writing within 45 days of closing the sale of the relinquished property. The deadline is strict under Treas. Reg. §1.1031(k)-1(c).
.accordion · .accordion__item(--open) · __trigger · __panel

Data table

Header row, hover rows, tabular-numeric money column, inline status pills.

ExchangeExchangerPhaseEscrowStatus
EX-2026-0047Matt BelcherIdentification$850,000 14d to ID
EX-2026-0041R. OkaforPurchase$1,240,000 On track
EX-2026-0038S. NakamuraDisbursement$612,500 2d to close
.data-table · .table-wrap · .num (tabular) · inline .pill

Progress & countdown

Standalone progress bar (also used inside hub/metric cards) and the deadline countdown.

.progress · .progress__fill (69% — 31 of 45 days elapsed)
14
Days
06
Hours
42
Min
.countdown (--warn) — time to 45-day deadline

Feedback — toast · alert · empty · skeleton

Toasts

Identification saved
456 Sunset Blvd added to your exchange.
.toast.toast--success
Upload failed
We couldn't read that PDF. Try again.
.toast.toast--error

Alerts / banners

Your QI is Priya Anand
All exchange funds are held in segregated qualified escrow.
14 days to identify
Identify replacement property by September 5, 2026.
Constructive receipt risk
Funds must flow through the Qualified Intermediary — never to you directly.
Sale closed
$850,000 deposited to qualified escrow on July 22, 2026.
.alert .alert--info / --warning / --critical / --success
No properties identified yet

Paste a listing link and Neela will pre-fill the details, or add a property by hand.

.empty · .empty__icon / __title / __msg
.skeleton · .skeleton-card (loading)

Brand — logo lockups

Real logo via <img> only — logo.png on light, logo_white.png on dark. Never a fake mark. The co-brand lockup pairs the Open1031 logo with a partner QI mark for white-label.

Open1031 logo.png · on light
Open1031 logo_white.png · on dark
Open1031 Partner QI
co-brand · white-label

The mark is the filled doorway — never the stroked-arc approximation, never a re-drawn SVG. Full lockup at ≥ 22px rendered height in headers and footers; below that, crop to the doorway icon alone with an overflow:hidden span (the mobile .m-mark technique). Keep clearspace of at least the doorway’s own width on every side. The two PNGs carry different intrinsic padding (712×288 light vs 772×245 dark), so always set an explicit height per asset — the light asset needs ≈1.3× the dark asset’s CSS height to render the same visual size; never trust intrinsic size to match.

AI — Neela launcher-orb (canonical round FAB)

The round launcher orb that opens Neela. 58px circle with the canonical spark-agent SVG inside (eyes + orbiting moons), a green presence dot and the tooltip "Chat with Neela". The orb is the avatar disc itself — sapphire radial in dark, mint radial in light — never teal: the spark gradient is teal-led and disappears on a teal ground. The mark is always the faithful NeelaMark — spark, eyes and catchlights, orbit ring and task-moons. Never a letter-N disc, never a generic four-point sparkle or robot glyph, never a flat indigo puck.

.neela-launcher-orb (round FAB) · .neela-avatar (inline tip)

Component checklist

Every category in the design system, rendered live above. This is the completeness contract — if a primitive ships in the app, it appears in this guide.

Buttons
Primary / secondary / outline
Ghost / destructive / link
sm / default / lg sizes
Default / hover / disabled / loading
Iconed + icon-only (Lucide rule)
Inputs
Text input + error state
Select
Textarea
Search
Masked SSN field
Checkbox / radio
Toggle / switch
Containers
Card / metric card
Hub card (with glow) + locked
Section card
Modal / dialog
Dropdown / menu
Tabs
Accordion
Data
Data table
Badges
Status / deadline pills
Phase labels
Progress bar
Countdown
Timeline + node-timeline
Feedback
Toast
Alert / banner
Empty state
Loading skeleton + spinner
Brand / AI
Logo lockups (light / dark / co-brand)
Neela tip card + avatar sizes (spark agent with eyes + moons)
Neela launcher-orb (round FAB)
Foundations
Color tokens (brand / per-hub / semantic)
Typography (Inter scale)
Spacing / radius
Shadows / glow