A long table under the olives.
All in, VAT included€52,410Brand
The identity, rendered by the system it documents.
Every swatch below is a live token, every contrast figure is measured in your browser as you read it, and the mark and the icons are the same components the product uses. Nothing here is a picture of the brand. If this page looks right, the site is right.
Today the brand is wearing Summer, live.
01 The mark
An arch standing on a rule. The arch is the place and takes the season; the rule is the total and is always gold. It is the only gold on any page.
Three drawings were rejected to get here, and each is easy to walk back into. The bare arch read as a rainbow at a glance and a lowercase n at 16px, and it floated — it had no ground. The arcade, three bays, fixed the rainbow and became the letters mm at 20px. The vault, concentric half-rounds over a line, is a sunrise icon at every size. The rule fixes all three: it grounds the arch, it makes the silhouette a doorway rather than a letterform, and it carries the second half of the meaning — the place, on the number.
Construction
lib/mark.test.ts asserts the join on every run.Optical sizes and the avatar
Below 24px the regular stroke rasters to about a pixel, so the compact drawing thickens both strokes while keeping the same outer silhouette. The 44px circular avatar is the test that matters: two-thirds of the audience meets a vendor there first, on a phone.
The geometry is identical in all of these. Only the colour it inherits changes — and over photography the gold steps up to leaf, because --signal-fill is tuned for 3:1 against a pale wall and goes muddy against a golden field.
02 The seasons
The brand wears one of four palettes and the calendar picks it, resolved on the server in Rome's timezone. The buttons at the top of this page preview the others — they repaint everything, because that is what shipping it does.
Each season is one hue family in four values — ground, sunken, soft, accent — plus gold and silver. An earlier cut gave every season six slots, which is more than any of these palettes has real colours for, so the surplus was filled with invention and the invention collided: the same pale sage in all four, dusty pink in two. A family run from palest to deepest cannot clash with itself.
The ratio is the mechanism, not the colour list. 70 ground · 25 soft · 5 accent. What makes a palette read as expensive is that it is uneven, which is why each key colour leads from a different band: spring's pink is the ground, because dusty rose at 70% is a wall and at 5% a detail; summer's terracotta is the accent, because terracotta at 70% is a flowerpot and at 5% it burns.
A long table under the olives.
All in, VAT included€52,410A long table under the olives.
All in, VAT included€52,410A long table under the olives.
All in, VAT included€52,410Winter shows five chips and the others four: it is the only season with a second colour, because it is the only one specified with two. --season-second is undefined elsewhere and every use of it carries a fallback.
What never moves
Gold is money
The rule under the mark, the rule above a total, the seal on a confirmed booking. Gold does not follow the season, because what it means does not. A seasonal money colour would change the meaning of the most important element on the site four times a year, which is the opposite of what a trust brand does. A total is gold in February.
Silver is structure
Edges, hairlines, the boundary of a control. Never a fill and never type. Two metals only work when each has a job.
The accent leads
The soft is a wash: never type, never a fill under small text, never a button. If a screen reads pink-first in spring or camel-first in autumn, it has failed. That is a test, not a preference.
Photography is the colour
The palette is quiet because the photograph is the loudest thing on the page. She wants to see it first. A palette that competes with a long table at dusk has misunderstood its job.
03 Measured
Four seasons times two themes is eight states, and npm run contrast measures every pairing in every one of them, failing the build under 4.5:1 for text or 3:1 for edges. The table below re-measures in your browser, live, in whichever season you are previewing.
| Pairing | Use | Floor | Measured |
|---|---|---|---|
--text-primary on --surface-canvas | Body copy on the ground | 4.5 | not in this season |
--text-secondary on --surface-canvas | Supporting prose, table cells | 4.5 | not in this season |
--text-tertiary on --surface-sunken | Captions on a band — the tightest text pairing | 4.5 | not in this season |
--accent-text on --surface-canvas | Every heading, every link | 4.5 | not in this season |
--accent-text on --surface-raised | A heading inside a card | 4.5 | not in this season |
--signal-text on --surface-canvas | Totals, in words | 4.5 | not in this season |
--text-on-accent on --accent-fill | Label on the primary button | 4.5 | not in this season |
--text-on-signal on --signal-fill | Label on the gold seal | 4.5 | not in this season |
--text-primary on --accent-surface | Type on the soft panel | 4.5 | not in this season |
--text-on-photo on --surface-photo | Type over photography | 4.5 | not in this season |
--signal-fill on --surface-canvas | THE MARK'S GOLD RULE on the ground | 3.0 | not in this season |
--border-control on --surface-canvas | The edge of an input | 3.0 | not in this season |
--signal-fill on --focus-halo | The focus ring against its halo | 3.0 | not in this season |
--season-second on --surface-raised | Winter's oxblood — the one second colour | 4.5 | not in this season |
04 Type
Fraunces for display and running text — engraved, invitation-adjacent, with enough authority to carry a five-figure number. Space Grotesk for labels, controls and anything set in caps. Tabular figures wherever a price appears, which is the strongest available signal that a number was computed rather than typed.
Long tables, low light
Long tables, low light
Long tables, low light
Long tables, low light
Long tables, low light
Long tables, low light
Long tables, low light
Long tables, low light
05 Icons
One set, one weight, one vocabulary. Every icon in the product comes through components/ui/Icon.tsx, and a glyph that is not in the list below does not appear in the product until it is added there on purpose. Nine files used to import lucide directly, at three different stroke weights.
1.5 stroke, butt caps, miter joins, on the four sizes in lib/icons.ts — 13, 15, 18, 22 — each tied to a type step rather than to a component. Butt caps match the mark and every rule in the stylesheet. Miter joins were chosen by rendering the whole set three ways and looking: the predicted spikes do not happen, and round joins blunted the point of send and the vertex of accept, which are the two places an icon in this brand should be sharp.
Colour is always currentColor. An icon never names a colour — it inherits from the text it accompanies, which is what keeps it correct in eight states without a single icon knowing any of them exist. lib/icons.test.ts fails the build if any file outside the wrapper imports lucide or restates the weight.
06 Voice
Plain, specific, never warmer than the facts support. The test for any sentence is whether someone could check it. If they could not, it does not ship.
Never
- Luxury, dream, magical, unforgettable, bespoke, curated, seamless
- "Perfect" anything — it cannot survive beside "estimate"
- Escrow, or any suggestion that we hold the couple's money
- Any second country. Italy only, until supply exists in one Italian region
- "AI" as a capability claim, and never reinforcement learning
- A supplier's name taken from the scraped corpus, on any public page
- "You both". Write to one woman — she does 54% of the planning
Instead
- The place, named. The number, itemised. The deadline, dated.
- "Estimate", "we hold no figure for this line"
- "Suppliers are paid directly, on their own invoices, in your name"
- "Italy. First season 2027."
- "Selected from live inventory, confirmed by a planner"
- Aggregates and counts, which are facts rather than a listing
- Place first, then the number, then who carries the risk, then the human
The money claim
The planning fee is the last invoice, paid after the wedding. Deposits and balances go to suppliers on their own invoices, in the couple's name. Delilah never holds the wedding money.
The only money claim the brand may make, and it must be made in full or not at all. Half of it — "paid after the wedding" without "suppliers are paid directly" — implies we hold the balance in between, which is the opposite of what the code does.
What a model may never do
- A model may choose. It may never assert. It selects from closed sets built from live inventory, and every number and every fact about a business is rendered from a row.
- No figure a model produced reaches a visitor. Ever.
- Nothing is bookable on the strength of a scraped row.
Enforced in lib/compose.ts and app/api/ai/route.ts, not trusted to a prompt. The footer line No figure on this site is model-generated is a promise the codebase keeps, and it is the most valuable sentence the brand owns.