/wireframe — design system

Intent /wireframe · reference styleguide

The five-role grayscale ramp, the Intent indigo accent for primary actions and selection states, and one semantic exception for invalid states. Wireframe content uses these variables only. The annotation layer shares the indigo but speaks in its own shapes — numbered markers and the notes rail, never controls.

--w-canvas
--w-surface
--w-border
--w-ink2
--w-ink1
--w-accent
--w-accent-soft
--w-error (invalid only)
--sp-1 · 4
--sp-2 · 8
--sp-3 · 12
--sp-4 · 16
--sp-5 · 20
--sp-6 · 24
--sp-8 · 32
--sp-10 · 40
--sp-12 · 48
--sp-14 · 56
--sp-16 · 64
--sp-18 · 72
--sp-20 · 80
--sp-22 · 88
--sp-23 · 92

Grid-locked size/line-height pairs in the neutral content font, floored for legibility (nothing under 11px). Hierarchy comes from size and weight — never typeface.

Posted to Maplewoodt-display · 22/28 · 700
Posted to Maplewoodt-title · 18/24 · 700
Near you todayt-heading · 16/20 · 600
Desk lamp — $10t-body-strong · 14/20 · 600
Warm brass lamp, works great. Pickup only.t-body · 14/20 · 400
Visible to neighbors within 1 mile. No fees, ever.t-small · 13/20 · 400
Mara T. · 0.3 mi · 2ht-caption · 11/16 · 400
--h-sm · 32
--h-md · 40
--h-lg · 48
--ic-sm · 16
--ic-md · 20
--ic-lg · 24
--r-sm · 2
--r-md · 4
--r-lg · 8
--r-full

Two roles, one rule. Functional glyphs (chevrons, search, check, ×) are drawn SVG rendered in currentColor — never text characters. The featureless circle is the placeholder for app-specific icons that aren't decided yet. An icon-only button always carries an aria-label.

gl-chevron
gl-search
gl-check
gl-x
gl-plus
gl-bell
gl-camera
gl-alert
gl-arrow-left
gl-info
icon-sm (placeholder)
icon-md (placeholder)
icon (placeholder)
btn-icon + aria-label

Native buttons. Hover, press, focus, and disabled states are real — try them.

btn-primary · sm / md / lg / disabled
btn-secondary · sm / md / lg / disabled
btn-ghost · sm / md / lg / disabled btn-block

All native and functional: type in them, tab through them, toggle them. Focus = 2px accent ring.

Category
search — input with leading drawn glyph
Visible to neighbors
Auto-renew listing
checkbox · radio · switch (role="switch") — all toggle

The ramp's single semantic exception: --w-error, for invalid states only. Never decorative, never for emphasis — if it isn't telling the user something is wrong, it stays gray.

input.error + field-error — what happened, then what to do

Skeletons for content, a spinner only inside controls. The label carries the state ("Posting…") — motion just reinforces it, and reduced-motion users get a static treatment.

loading buttons — spinner + honest label
skeleton card — surface-tone blocks, no spinners in content
chips — click to toggle inline tabs
bottom tab bar (mobile) — placeholder icons + real labels
Nearby Maplewood · 1 mi
app bar — icon-only actions carry aria-labels
3 12 Draft Consented
avatar sm/md/lg · media block · badges · link
divider

Desk lamp

$10

Mara T. · 0.3 mi · 2h

Kids bike, 16-inch

$35

Dev P. · 0.5 mi · 4h
card.interactive — hover the border
list rows — hover fills with surface
ListingPriceViewsStatus
Desk lamp$1034Active
Kids bike, 16-inch$35112Active
Moving boxes (12)Free56Claimed

Elevation doctrine: a scrim plus a hairline border. No soft glow shadows.

modal on its scrim sheet (mobile)
Posted to Maplewood
toast — dismissible

The in-page counterpart to the toast. Severity reads from the leading glyph and the copy, not from hue — the ramp carries no success or warning color. Neutral by default; accent for emphasis; error is the ramp's one semantic exception. Never a left accent stripe.

Giveaways are free to post

Marking a listing free skips the price step and notifies neighbors within 0.5 mi.

neutral — note

Your draft saves automatically.

neutral — single line, dismissible

Post to the block, not the city

Listings reach the 842 neighbors closest to you first — they're the ones who can pick up today.

accent — emphasis / tip

This listing couldn't post

Add at least one photo, then try again. Your text is saved.

error — the ramp's one semantic exception

A thumbnail is one idea: a focused UI fragment built from this same kit at natural size, staged on a muted panel, with a caption narrating the concept — index, title, one breath of description. A board of them is divergence at the mechanism level: many different answers to one problem. The vignette contains only real UI; the caption is annotation. The optional .dots stage grid is a board-level choice — all vignettes or none, and only when the dots mean something (a map, a canvas). Here, three ideas for "how do giveaways work on Nearby?"

A third of neighborhood posts are giveaways.

#1

Free as a first-class choice

Price and "Free" are one decision, not two fields. Tapping Free clears the price — no validation error to recover from.

Sana is giving away moving boxes

Free · 0.2 mi · first come, first served

#2

Giveaway alerts to the block

Free items notify nearby neighbors instantly. Giveaways move in hours, not days — and the curb stays empty.

Porch pickup

It's outside — just take it
#3

Porch pickup windows

No coordination chat for a $0 item. The seller sets it out; the listing says when it's there.