
Tobacco Vanille
Tom Ford · EDP
Case · Decant8 · 2026
An editorial site for niche perfume, designed and built as one system. Every value on this page is read from the same stylesheet the site ships with, so the page cannot drift from the product.
01 · Tokens
11 roles and 9 family grounds. Contrast is computed against paper and ink at build; a unit test fails the build if a text colour drops below AA.
--color-gold#bc8569Fills, rules and large type. 3.1:1 on paper, so never small text there.on paper 3.14 AA largeon ink 5.31 AA--color-gold-ink#996144Gold for small text on paper and sheet. 5.1:1.on paper 5.06 AAon ink 3.29 AA large--color-accent→ goldSemantic text accent. Gold on dark surfaces, gold-ink on light ones.on paper 5.06 AAon ink 5.31 AA--color-ink-muted#17201e · 66%Secondary text on paper and every family ground. AA everywhere.on paper 5.36 AAon ink 1 fail--color-sage-muted#c9cfc1 · 60%Secondary text on deep. AA.on paper 1.31 failon ink 4.63 AA--color-deep#17201eDark ground: hero, skin scene, footer, articles.on paper 16.64 AAAon ink 1 fail--color-paper#ffffffLight ground and text on deep.on paper 1 failon ink 16.64 AAA--color-sage#c9cfc1Text and hairlines on deep.on paper 1.59 failon ink 10.44 AAA--color-ink#17201eText on paper. Same value as deep, kept as a separate role.on paper 16.64 AAAon ink 1 fail--color-line#e8e6e0Hairlines on paper.on paper 1.25 failon ink 13.34 AAA--color-sheet#f2f2f2Quiet fill: empty states, thumbnails.on paper 1.12 failon ink 14.87 AAAFamily grounds · review sheets and cards
--color-ground-woody#e7e1d6 · ink 12.79--color-ground-oriental#ead7c4 · ink 11.9--color-ground-fresh#e4ebe6 · ink 13.73--color-ground-floral#f3e4e2 · ink 13.48--color-ground-gourmand#f3e6d4 · ink 13.54--color-ground-aromatic#e6e4d8 · ink 13.04--color-ground-chypre#e3ddd4 · ink 12.33--color-ground-citrus#f4efd8 · ink 14.41--color-ground-leather#e2d5c8 · ink 11.5602 · Tokens
Two families. A thin serif carries voice; a grotesk carries facts. Five fluid sizes, no middle tier. Sizes resolve per viewport; the live column reads your screen.
Aa
Editorial New · 100 · 300
Bought by the desk. Worn three times.
--font-editorialAa
PP Neue Montreal · 400 · 600
Prices by the millilitre. No press kit. 0123456789
--font-sans · --font-mono--text-megaclamp(4rem, 15vw, 15rem)64px216px·1.18Decant
--text-statementclamp(2.75rem, 8vw, 8rem)44px115.2px·1.18Wear it first
--text-displayclamp(2.25rem, 5vw, 4.5rem)36px72px·1.18The reading list
--text-titleclamp(1.5rem, 3vw, 2.25rem)24px36px·1.15Tobacco Vanille
--text-micro0.625rem10px10px·1.2Cursor · tap echo
--text-label0.6875rem11px11px·1.2Library · 28 reviews
03 · Tokens
Tailwind's 0.25rem step for components, four named tokens for page rhythm. Lint rejects any step that is not a multiple of 0.25, raw radii in px and raw z-index numbers.
--spacing-section72 → 128pxTop padding of a section.--spacing-section-end104 → 192pxBottom padding. About 1.5× the top: sections exhale.--spacing-header60pxFixed header height; first row offset.--spacing-gutter20pxPage edge on every breakpoint. Header, grids, footer.0Photography, tables.--radius-card · 0.875remCards and panels.--radius-inner · 0.625remInside a card: options, sources, thumbnails.--radius-pill · 999pxEvery button, pill, chip and bar.--radius-round · 50%Avatars, dots, the cursor.Layers · z-index scale
--z-below-1Fills behind their own content.--z-base1Lift inside a component.--z-raised2Hero flow over columns.--z-float20Hero cue, floating preview.--z-overlay40Wear clock, chapter pill.--z-dock45Rail dock, read progress.--z-header50Site header.--z-cursor60Custom cursor, tap echo.--z-sheet70Filter sheet, menu panel.--z-scrollbar75Desk scrollbar.--z-toggle80Menu toggle above its panel.--z-skip90Skip link, always on top.04 · Tokens
Two curves, 6 durations. GSAP registers both curves through CustomEase from the same CSS variables and reads durations at runtime, so CSS and script moves feel like one hand. Lint rejects any other ease. The one exception is gravity in the splash pour. Hover a card to play it.
--ease-quietcubic-bezier(0.18, 0.71, 0.11, 1)Default. Hover, reveals, colour. Fast start, long settle.--ease-expocubic-bezier(0.19, 1, 0.22, 1)Mass: sheets, filters, liquid fill, page-level moves.instant · 200msCursor label, focus, micro feedback.fast · 400msColour, opacity, cursor follow, small UI.medium · 600msHeader, sheets, menu, page exit.base · 800msHover moves, underlines, reveals, page entry.slow · 1100msLiquid fill, SplitText lines.reveal · 1600msImage scale on enter, ground shift by phase.indexEvery pageShared modules eagerly; page modules imported only when their selector existsSameview transitionsSame-origin navigationNative cross-document fade; card still morphs into the review stillOffheaderScroll directionHides on the way down, returns on the way up and on focusAlways shownsplashFirst visit, homePer-letter wordmark, liquid pour, sheen sweepSkippedrevealEnters 85% of viewportFade-up, SplitText lines and charsStaticheroGridLoad, scrollFour columns rise with staggerStaticheroWave · heroCarouselPointer / small screensPointer wave; canvas slideshow paused off-screenOffskin · skinLayoutPinned scrubBlotter to skin, drydown clock, seeded collision-free notesStatic layoutstoryScroll scrubHome wear clock, parallax scenesOffwearReview scrollWear clock walks top, heart, base from longevity; ground shifts per phaseNo label motiondrag · carouselFine pointer / touchInertia drag; on touch a swipe hint and a one-time nudgeNative scrollroadScroll scrubHand-drawn dashed road, stops pop inFull pathpreviewHover / touchHover preview loads on first entry; on touch the centred row opens a thumbnailOffcursorHover / touchCustom cursor; on touch a label echoes at the tap pointOffmenuToggleOverlay, stagger, focus trap, inert pageNo staggerrailDock · railSheet< 64remDock with progress ring, bottom sheet for railsSamearticle · tablesScrollActive chapter, table revealStaticvapor404Canvas vapour that follows the pointerStatic05 · Layout
Three breakpoints, one gutter of 20px. Usage counts come from the stylesheet.
base0n/aOne column. Rail becomes a sheet, dock appears.md48rem · 768px20Two-column cards, split heroes start.lg64rem · 1024px23Sticky rail, header nav, desktop motion.xl80rem · 1280px2Three-column catalog.Rail + body
14rem · 1frLibrary, search, articlesContents + body
16rem · 1frMethodCatalog
1 → 2 → 3 colsLibrary grid, same familySplit 7 / 5
7fr · 5frFooter colophon, review sheetHero quartet
4 × 1frHome heroEditorial 12
12 cols, off-grid itemsSkin scene, method road06 · Components
Live components, not pictures. Hover the buttons: one liquid fill for all of them.
Logo currentColor SVG, header and footer wordmark.Arrow dir one Editorial glyph, rotated: left, up, right, down, out.01 · Library · 28 reviews
Label 11px, caps, tracking 0.14em. Kickers, meta, nav.VerdictPill buy · decant first · skip.VerdictPill theme="deep".btn-line · .reading-btn pill, liquid fill top-down, 1.1s expo..btn-gold · .btn-line.is-light dark grounds only.Filter chip pressed state draws a gold rule.Breadcrumb tone ink · paper.07 · Components
Atoms bound to real data: the sample below is the Tobacco Vanille file.
ArrowLink text roll, gold underline, arrow swap. Dark grounds.ScoreBars longevity, sillage, value per ml.SpecTable definition list, one label–value row per spec.FragranceCard ground by family, verdict pill, square still.08 · Components
Sections as they ship, 1440 wide. Each links to its page.

Hero quartet
Four stills, statement type, wear clock starts at 0:00.
Skin scene
Pinned scrub: blotter, then skin. Notes placed without overlaps.
Families index
Mega list; hover preview on desktop, centred-row thumbnail on touch.
Reading list
Snap carousel, shared arrows, uniform 4:5 cards.
Desk wire
News block: lead file plus numbered index.
Method road
Four steps joined by a drawn road.
Review sheet
Ground by family, shifting with the wear clock phase.
Article head
Issue number, deck, author line.
Colophon
Ledger computed from the collection.
Menu, mobile
Editorial list, contact buttons with liquid fill.09 · Build
Content as typed collections, a static build, and gates that fail the build instead of a review.
Content model
Quality gates
@theme: CSS, Astro, TS.quiet and expo in GSAP; no Tailwind duration off the scale.text-ink/50 fails, text-ink-muted passes.style, no arbitrary -[ ] classes in markup.Measured · 5 Oct 2026
10 · Handoff
One JSON in W3C design-token format. core is a single-mode collection;mobile and desktop share keys and become two modes of one collection, so frames at 390 and 1440 switch sizes with a mode toggle.
mobile and desktop to modes of a Size collection.color/gold = --color-gold = bg-gold.{
"core": {
"color": {
"gold": {
"$type": "color",
"$value": "#bc8569"
},
"ink": {
"$type": "color",
"$value": "#17201e"
}
}
},
"desktop": {
"text": {
"title": {
"$type": "dimension",
"$value": "36px",
"$extensions": {
"css": "clamp(1.5rem, 3vw, 2.25rem)",
"lineHeight": 1.15
}
}
}
},
"mobile": {
"text": {
"title": {
"$type": "dimension",
"$value": "24px",
"$extensions": {
"css": "clamp(1.5rem, 3vw, 2.25rem)",
"lineHeight": 1.15
}
}
}
}
}