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

TokenValueNote
--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