Design Template · v.2026.03

Components,
tokens, and the grid.

StackHTML · CSS variables · React 18
Tokens32 colour · 8 type · 8 spacing
Components14 atoms · 9 patterns
StatusProduction / v.01
— 01 / Design Tokens

Variables that hold the system.

Every visual decision routes through a CSS custom property. Designers and developers never write a hex value, a font name, or a magic number — they write a token. The names below are the ones that ship in styles.css.

Color tokens
TokenValueUsage
--bg#FAF7F2Page
--surface#F2EDE4Cards
--ink#1A1410Type / fill
--ink-sec#6B5E50Secondary
--gold#B8974AAccent / rules
--rust#C4623AEmphasis
--white#FFFFFFModals
Type tokens
TokenFamilyNotes
--f-displayCormorant Garamond300 · 400 · italic
--f-bodyDM SansSöhne substitute
--f-monoJetBrains MonoData · labels
--f-thaiIBM Plex Sans ThaiTH body +2px
display-xl96 / 0.96 / −2.5%Hero only
display-l56 / 1.0 / −1.5%Section head
body-lg19 / 1.65Essay
eyebrow11 / +18% / UCLabels
Spacing scale · 4-px base
4xs · −1
82xs
12xs
16sm
24md
36lg
64xl
96+2xl
Layout grid · 12 columns · clamp(24, 5vw, 80) gutter · max 1440px
— 02 / Atomic components

Buttons, badges, cards, rules.

The visible vocabulary of the site. Every atom carries: default, hover, active, disabled, focus. Every atom is built with tokens; nothing is one-off. If you find yourself reaching for a new value, look in the system first.

A1Button · primary / ghost / link
5 variants · 4 states
Primary
Ghost
Currency pill
Language
A2Badge & chip
5 variants
Standard
Sathorn Off-market Limited quota Pre-launch Available
Data chip
REIC 4.8% BTS 6 min 124 sqm ฿28.5M asking
A3Cards
3 variants
Soi · golden-hour
Sathorn
The Sathorn flat with the fig tree.
฿28.5M · 124 sqm · BTS 6m
Lobby
Off-market
The Ari teak house behind the coffee shop.
฿19.8M · 168 sqm · BTS 4m
Avg. condo yield
4.6%
▲ +40 bp YoY
Gross rental yield, 87 buildings tracked.
A4Interaction states
Default / Hover / Active / Disabled
Default
Hover (filled gold)
Active / focus
Disabled
A5Rules · dividers · meta
3 types
Hairline
Gold rule
Section marker (essay style)
§ 3 Market reality
— 03 / Forms & inputs

Quiet, monospaced, no decoration.

Inputs are framed in hairline, focused in gold, never filled. Help text is monospace. Validation is rust, never red. The booking calendar is the single richest form pattern — see the live prototype for its full state machine.

F1Field family
5 types · 4 states
As you would like on the booking.
We never share.
Phone needs country code.
Toggles
Foreign quota matters to me
I have visited Bangkok before
Pagination
— 04 / Page patterns

Anatomy of a page.

Three patterns carry the site: the editorial hero, the section header, and the essay column. Each has a fixed rhythm. Stick to the pattern; resist the urge to invent.

Section head · 1fr / 2fr grid · 88px gap
Number
04 / Data
Eyebrow (optional)
Bangkok in numbers
Title (display-l)
The market, in plain figures.
Intro (body-lg)

Three numbers I track weekly across the buildings I cover.

Essay column · max 640px / drop-cap / pull-quote rule
§ 1 Before the embassies open

Sathorn at seven.

There is a particular hour in Sathorn — between the night-market sweep and the first embassy car of the day — when the soi feels almost private. The street sweepers have finished. The salt-pork porridge stall on Soi 12 is on its second pot. You can smell jasmine rice from the tower above the 7-Eleven, and pandan from the monks' alms round one block south.

"I know which lifts are slow on Mondays."
Marker · §N · gold mono
Heading · display-m / 32px
Body · 19px / 1.65 lh / DM Sans
Drop cap · 4em · gold
Pull quote · italic 28px / gold left rule
Spacing · 24px between
Internationalisation behaviours
P3Localisation switches
4 languages · 4 currencies
Language · cross-fade, no reload, persists in localStorage
Bangkok, neighborhood by neighborhood.
กรุงเทพฯ ทีละย่าน ทีละซอย
曼谷,一个城区,一个城区。
バンコクを、街区ごとに。
Currency · THB ↔ USD ↔ CNY ↔ JPY
LocaleFormatExample
THB฿0.00M฿28.50M
USD$0.0k$803.7k
CNY¥0.0k¥5,814.0k
JPY¥0k¥122,550k
— 05 / Motion

Patient, not performative.

Movement is paper-coming-into-focus, not a Hollywood reveal. The signature curve is cubic-bezier(0.16, 1, 0.3, 1) — a long tail. Durations: 200–280ms for hovers, 600–900ms for reveals, 800ms for the page load fade-in.

Ease out — signature
cubic-bezier(0.16, 1, 0.3, 1) Reveals · enter · drop-in · 600–900ms
Linear — scroll-driven
linear · 50ms Scroll progress bar · reading progress
Avoid — bounce
Do not use Overshoot reads as toy, not editorial.
ElementTriggerMotionDuration
PageLoadFade from white → paper800ms ease-out
Essay sectionIn viewTranslate-Y 20px + fade800ms ease-out
Pull quoteIn viewGold rule grows down (scaleY)600ms ease-out
PhotoHoverSaturate 0.7 → 1.0700ms ease-out
Button (primary)HoverGold fill slides up from base380ms ease-out
Nav linkHoverGold underline scaleX 0 → 1280ms ease-out
Booking cardEssay 80% scrolledSlide up + fade600ms ease-out
Language toggleSwitchCross-fade content280ms ease-out
— 06 / Iconography

Hairline marks. 1.4 stroke.

Icons are rare. When they appear they are 1.4px stroke, no fills, 24×24 frame, drawn on a square grid. Decorative ornaments and emoji are not in the system. The wordmark does the heavy lifting.

House
Soi
Building
07:00
Yield ▲
Coffee
Concierge
Market
House of Noey · Design Template
A system. Not a style.
v.2026.03 · 14 atoms · 9 patterns · 32 tokens