Design system
The internal reference for the Aurenza build — every token, type style, control and component, shown live and named by its literal class. Written for the WordPress handoff so nothing is lost in translation.
01 · Foundations
Colour tokens
Every colour is a custom property declared once in :root and referenced
everywhere else. No component sets a raw hex value, and no page introduces a new hue. Surfaces are warm
near-black, never pure black; the accent is a single champagne gold, with oxblood
reserved only for urgency and limited releases.
--ink
#0B0A08
--ink-2
#100E0B
--surface
#16130F
--surface-2
#1D1913
--surface-3
#262019
--surface-4
#2F2820
--ivory
#F3EDE1
--ivory-dim
#D6CDBC
--muted
#A69C8B
--faint
#857C6E
--gold
#C9A96A
--gold-bright
#E9D5A6
--gold-deep
#8E7038
--wine
#7C2F2F
--line
rgba(201,169,106,.17)
--line-hard
rgba(201,169,106,.34)
02 · Foundations
Typography
Three families, no more. Fraunces carries every display and heading at a light weight with
a soft, slightly wonky optical setting. Instrument Sans is the body and interface face.
DM Mono is reserved for eyebrows, labels, prices and other metadata. No other family may
be introduced, and no component sets its own font-family.
Aa
--font-display
Fraunces · 300–900, italic & roman
Aa
--font-body
Instrument Sans · 400–600
Aa
--font-mono
DM Mono · 400
Heading scale
h1 · --fs-h1
Hand-blended in Grasse
h2 · --fs-h2
The composition and its pyramid
h3 · --fs-h3
Matured ninety days before bottling
h4 · --fs-h4
A note on maceration
Display, lead and supporting styles
.display
Noir & Champagne
.lead
A quieter kind of luxury — the extrait is composed to be judged at hour eight, not at the counter.
.eyebrow
The house since 2019
.quote
Built to be judged at hour eight.
.mono, .small, .muted, .gold
SKU AUR-NA-50 · ₹34,500 · 28% perfume oil
Supporting copy in Instrument Sans at --fs-sm, in --muted.
Accent copy in .gold.
03 · Foundations
Spacing scale
Spacing runs on an eight-pixel rhythm, from --s-1 (4px) to
--s-12 (128px). Sections use --section-y, page edges use
--gutter, and content is held within --container or the
wider --container-wide.
.container.container--wide04 · Controls
Buttons
One base class, .btn, with variants and sizes. Buttons are near-square
(--radius), set in DM Mono with wide tracking, and never pill-shaped. The primary
button is gold on ink; the ghost button is an inset hairline.
Variants · .btn, .btn--ghost, .btn--dark
Sizes · .btn--sm, default, .btn--lg, .btn--block
Disabled · .btn[disabled]
Text link · .link-arrow and .link-sweep
05 · Controls
Form controls
Every control sits inside a .field with a .label. Inputs,
selects and textareas share one surface and hairline. Error text uses
.field__error and hint text uses .field__hint. The
validation script fills the error span when a required field is empty.
06 · Library
Components
The reusable blocks that make up every page. Each is shown live below its literal class names. Components never nest a card inside a card, and every media element carries descriptive alt text, explicit width and height, and lazy loading below the fold.
Media frames
.frame with ratio modifiers --tall (4:5),
--portrait (3:4), --square (1:1),
--land (16:10), --cine (21:9) and
--wide (3:2). Add --sheen or --zoom for hover.
Product card & badges
.product-card with __media, __badge,
__body, __family, __name,
__price and __quick. Badges take
--wine for limited or final-sale states. The add button uses
data-add="<slug>".
Chips, pills & meters
.chip toggles with aria-pressed;
.note-pill lists a note; .status-pill carries state and
--done marks it complete; .scent-meter renders intensity
as gold bars driven by data-meter.
Accordion & tabs
.accordion with __trigger[aria-expanded] and
__panel > __inner; single-open behaviour is handled in
main.js. Tabs live in a [data-tabs] wrapper with
role="tab" buttons and role="tabpanel" siblings.
Black plum, Bulgarian rose, smoked oud, leather and labdanum. The rose is jammy rather than fresh.
Ten to twelve hours on skin, with a bold sillage in the first four. Built to be judged at hour eight.
Oud from a single sustainable plantation in Assam; rose is a CO2 extract from Kazanlak. Never tested on animals.
Table & pagination
.table sets mono, tracked headers over hairline rows; inside
.prose it inherits prose padding. .pagination holds
square page links with aria-current on the active page.
| Order | Composition | Status | Total |
|---|---|---|---|
| AUR-10428 | Noir Absolu · 50 ml | Delivered | ₹34,500 |
| AUR-10411 | Éclat Blanc · 100 ml | In transit | ₹14,900 |
| AUR-10396 | Safran Nuit · 50 ml | Delivered | ₹29,900 |
Stat & step
.stat with __num and __label for
figures; .step with __num for a numbered sequence.
Composed
Built around a single idea, not a trend.
Macerated
Rested ninety days so the notes settle.
Bottled
Drawn, sealed and dated by hand in Grasse.
Testimonial, gift card & timeline
.testimonial pairs a quote with an avatar; .giftcard is the
16:9 gift visual; .timeline with __item,
__dot and is-done traces an order.
Two sprays, and I could still find it on my coat the following evening.
Verified buyer · Mumbai
₹10,000
No expiry · Redeemable online and in boutique
Order placed
1 October, 09:12 IST
Dispatched
1 October, 16:40 IST
Out for delivery
Expected 3 October
Empty state, breadcrumb & toast
.empty-state with __icon for a cleared cart or wishlist;
.breadcrumb for the page trail; .toast inside
.toast-stack for transient confirmations, created by
main.js.
Your cart is empty
Nothing selected yet. Explore the six houses and find the one that follows you.
Browse the collectionNoir Absolu · 50 ml
.summary · order totals
07 · Assets
Imagery
All artwork is SVG, so it stays sharp at any size and weighs almost nothing. Products live at
1000×1250, editorial at 1400×1050 (landscape) and
1200×1600 (portrait), heroes at 2000×1200, and avatars
at 200×200. Always declare width and height, add descriptive alt text, and lazy-load
everything below the fold.
08 · Behaviour
Motion
Motion is opt-in and additive. The root element only receives the motion class
when GSAP, ScrollTrigger and a motion-safe preference are all present, so content is visible by default
and nothing is hidden from a reduced-motion or no-JavaScript visitor.
Reveal
Add data-reveal to a block to fade and lift it as it enters the viewport, and
data-reveal-delay="0.08" to stagger a group. The reveal fires once, at
top 88%, with a 1.05s power3.out ease.
Other hooks
.split-line > span— masked line reveal for hero headlines.data-parallax="12"— scrubbed vertical drift on a background.data-count="218" data-dec="0"— a number that counts up once.data-meter="92"— staggers the bars of a scent meter.data-magnetic— a button that leans toward the cursor on hover-capable devices..frame--reveal img— a scale-and-fade entrance for media.data-hscroll— a horizontal track scrubbed by vertical scroll.
Reduced motion
Under prefers-reduced-motion: reduce the motion class
is never added, transitions collapse to a fraction of a millisecond, and every
[data-reveal] and .split-line > span is forced
fully visible. No content depends on animation to be readable.
Accessibility checklist
- One
h1per page; headings never skip a level. - Every input has a
<label>tied byfor. - Focus states use a visible gold outline, never
outline: nonealone. - Colour is never the only signal; state also uses text or
aria-pressed.