Reference
Design system
This page is noindex: it documents the template for whoever builds with it. Every contrast
ratio below was computed against the WCAG relative-luminance formula (tools/a11y/contrast.py)
before shipping, not eyeballed.
The palette, measured
RESEARCH.md names delphinium violet #6E4FA3 — HSL(262°, 35%, 47.5%) — against the pale
stem-green-grey ground #EDEFE7, and states three ratios: ink text at 13.8:1, accent text at
5.47:1, and white text on an accent button fill at 6.34:1. Measured independently with
tools/a11y/contrast.py, the figures come out at 13.81:1,
5.47:1 and
6.34:1 respectively — all within rounding of RESEARCH.md’s
own figures, no correction needed. The footer band inverts to a dark ink-violet background (this
batch’s default, not a light-band pattern): on that dark band, the raw accent violet measures under
AA, so --color-accent-on-band is a lightened same-hue violet (#9D86C4, 5.07:1)
and --color-on-band-muted is a lightened neutral (#B9B4C6, 7.94:1).
Typography
Display: Alegreya, set italic for section eyebrows and
every section heading — a calligraphic, organic old-style serif with real ink-flow character, a natural
fit for a hand-lettered market board without reaching for a display script. Body:
Figtree, a plain humanist sans, legible at the small
sizes the six price/schedule tables use, with tabular figures (.fig) so numeric columns align.
No monospace anywhere — unlike the batch’s
dimensioned-ledger templates, this page has no column of measurements that needs a fixed-width face;
prices, stem counts and days sit fine in Figtree’s tabular figures.
Schema.org — settled and withheld
Florist (LocalBusiness → Store → Florist) for Nakamura Floral Co., with
address, geo, openingHoursSpecification and telephone.
Product + Offer, with a real price and availability, on
every standing price-list item — including the market bouquet, whose price is fixed even though its exact
stems are not (see “What’s fixed” in the shop section) — the Offer describes a real,
always-orderable SKU regardless of which stems fill it that week.
No settled contents are claimed for the market bouquet
— its description states that stems vary by season instead of listing species it
can’t promise. A Service entry (no price/priceRange) covers
wedding & event work, consistent with the running ledger (129/131 Product/Offer + LocalBusiness; 132
Service no price; 133–135 Service no price beside Product+Offer) — this page repeats that
pattern because the underlying fact (fixed retail SKU vs. unknowable custom-event price) is the same shape.
Withheld: aggregateRating (no reviews collected — the two testimonials are named,
attributed quotes, not an aggregate); gtin (cut flowers don’t carry one); and a
business-level priceRange on the Florist entry itself — the standing SKUs
already carry individual prices, and a business-level range would flatten the exact distinction this page
makes between fixed and unknowable pricing.
One module, read by every surface that shows its numbers
src/lib/floral.ts is the only place a remaining-vase-life figure or a stem-recipe total is
computed. remainingVaseLifeDays() takes a species’ published total (src/data/stems.ts)
minus this shop’s own stated cut-to-shop days and returns the remainder, never negative.
computeRecipeTotals() sums the signature bouquet’s stem lines at a 3.5×
markup, hard goods at 2.25×, then charges design labor at 22%
of the marked-up materials total — the freshness-math section and the signature-bouquet table both read
the same functions against the same data, so neither can quietly disagree with the other.
The signature bouquet, computed once
Stems ($25.60 wholesale → $89.60 retail) + hard goods ($7.00 wholesale → $15.75 retail) = $105.35 materials, plus $23.18 design labor (22% of materials) = $128.53 shelf price. A worked example: a Skagit-grown garden rose (published total 7 days) delivered to the shop in 1 day has 6 days of vase life left; the same species imported wholesale, roughly 6 days in transit, has 1 day left — same flower, same published total, a different countdown depending on where the clock started.
A figure corrected from the brief
RESEARCH.md’s sourced ranges (carnation 14–21d, alstroemeria 10–14d, garden rose/tulip
7–10d, ranunculus ~7+d, peony 5–7d, dahlia ~4–7d) are stated as real published ranges,
not single numbers. This page turns each range into a deterministic input by taking the conservative low
end as the “published total” the remaining-vase-life math starts from
(src/data/stems.ts, totalDays) — so the computed remainder this page shows
a customer never overstates what a stem actually has left, even at the low end of a wide sourced range.
Tokens
| Token | Value | Note |
|---|---|---|
| --color-bg | #EDEFE7 | Pale stem-green-grey — florist paper and foliage, not a generic cream |
| --color-surface | #FFFFFF | Cards, tables, figures |
| --color-text | #241F2E | Ink with a violet undertone — 13.81:1 on ground · AAA |
| --color-text-muted | #635E6B | 5.41:1 on ground · AA |
| --color-accent | #6E4FA3 | Delphinium violet — 5.47:1 on ground · AA, normal text |
| --color-on-accent | #FFFFFF | 6.34:1 on accent fill · AA — the primary-button pair |
| --color-band | #241F2E | The footer inverts — a dark band on the light body |
| --color-on-band | #EDEFE7 | 13.81:1 on band · AAA |
| --color-on-band-muted | #B9B4C6 | 7.94:1 on band · AA+ |
| --color-accent-on-band | #9D86C4 | 5.07:1 on band · AA — lightened violet; the raw accent measures under AA there |