Internal reference

Brand

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

R9.1springing y10the feet stand on it
Box 26 × 26. Arch stroke 1.8, radius 9.1, springing at y = 10, stroke edges landing exactly on x = 3, x = 23 and y = 0. The feet end exactly on the rule's top stroke edge — the doorway stands on the threshold. A gap makes it hover and an overlap makes it sink, and 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.

64 · regular32 · regular20 · compact16 · compact

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,410
SpringMarch – MayRosa · Pink, from the wall to the ink

A long table under the olives.

All in, VAT included€52,410
SummerJune – AugustTerracotta · A cream wall, terracotta at five per cent

A long table under the olives.

All in, VAT included€52,410
AutumnSeptember – NovemberBeige · Greige, camel, espresso. No hue at all

A long table under the olives.

All in, VAT included€52,410
WinterDecember – FebruaryVerde e bordeaux · Bottle green leading, oxblood beneath

Winter 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.

Measured in this browser, in the season and theme you are reading in. Nothing here is read off the stylesheet — it is the paint.
PairingUseFloorMeasured
--text-primary on --surface-canvasBody copy on the ground4.5not in this season
--text-secondary on --surface-canvasSupporting prose, table cells4.5not in this season
--text-tertiary on --surface-sunkenCaptions on a band — the tightest text pairing4.5not in this season
--accent-text on --surface-canvasEvery heading, every link4.5not in this season
--accent-text on --surface-raisedA heading inside a card4.5not in this season
--signal-text on --surface-canvasTotals, in words4.5not in this season
--text-on-accent on --accent-fillLabel on the primary button4.5not in this season
--text-on-signal on --signal-fillLabel on the gold seal4.5not in this season
--text-primary on --accent-surfaceType on the soft panel4.5not in this season
--text-on-photo on --surface-photoType over photography4.5not in this season
--signal-fill on --surface-canvasTHE MARK'S GOLD RULE on the ground3.0not in this season
--border-control on --surface-canvasThe edge of an input3.0not in this season
--signal-fill on --focus-haloThe focus ring against its halo3.0not in this season
--season-second on --surface-raisedWinter's oxblood — the one second colour4.5not 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.

--t-5xlHeroOnce per site

Long tables, low light

--t-3xlh1Every interior page

Long tables, low light

--t-2xlh2A section

Long tables, low light

--t-xlh3A subsection

Long tables, low light

--t-lgh4 · wordmarkThe lockup is set here

Long tables, low light

--t-baseBody17px root, 66ch measure

Long tables, low light

--t-smSecondaryTables, buttons, notes

Long tables, low light

--t-2xsEyebrowUppercase, 0.2em tracking

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.ts13, 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.

planestimateconfirmedpaperworkpaidsupplierplannerguestsvenuemodelcallsenddismissemaildownloadremoveacceptnextbackcollapsethemeSystemthemeLightthemeDark

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

  1. 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.
  2. No figure a model produced reaches a visitor. Ever.
  3. 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.