{"slug":"tare","name":"Tare","version":"1.0.0","category":"local business","priceCents":3900,"ui_library":{"version":"1.5.2","files":["html/src/js/_tt/accordion-disclosure.js","html/src/js/_tt/anchor.js","html/src/js/_tt/field-ids.js","html/src/js/_tt/field.js","html/src/js/_tt/focusables.js","html/src/js/_tt/form-error-summary.js","html/src/js/_tt/form.js","html/src/js/_tt/layer.js","html/src/js/_tt/mode.js","html/src/js/_tt/pending.js","html/src/js/_tt/popover.js","html/src/js/_tt/presence.js","html/src/js/_tt/reduced-motion.js","src/components/ui/_tt/accordion-disclosure.axes.ts","src/components/ui/_tt/accordion-disclosure.fixtures.ts","src/components/ui/_tt/accordion-disclosure.tsx","src/components/ui/_tt/anchor.ts","src/components/ui/_tt/capture.ts","src/components/ui/_tt/card-panel.axes.ts","src/components/ui/_tt/card-panel.fixtures.ts","src/components/ui/_tt/card-panel.tsx","src/components/ui/_tt/field-ids.ts","src/components/ui/_tt/field.axes.ts","src/components/ui/_tt/field.capture.ts","src/components/ui/_tt/field.fixtures.ts","src/components/ui/_tt/field.tsx","src/components/ui/_tt/focusables.ts","src/components/ui/_tt/form-error-summary.axes.ts","src/components/ui/_tt/form-error-summary.fixtures.ts","src/components/ui/_tt/form-error-summary.tsx","src/components/ui/_tt/form.axes.ts","src/components/ui/_tt/form.fixtures.ts","src/components/ui/_tt/form.part.tsx","src/components/ui/_tt/form.ts","src/components/ui/_tt/hint.axes.ts","src/components/ui/_tt/hint.fixtures.ts","src/components/ui/_tt/hint.tsx","src/components/ui/_tt/host.ts","src/components/ui/_tt/ids.ts","src/components/ui/_tt/layer.ts","src/components/ui/_tt/layout-effect.ts","src/components/ui/_tt/popover.axes.ts","src/components/ui/_tt/popover.fixtures.ts","src/components/ui/_tt/popover.tsx","src/components/ui/_tt/presence.ts","src/components/ui/_tt/recipe.ts","src/components/ui/_tt/reduced-motion.ts"]},"license":"standard","description":"Tare is a veterinary clinic tailwind template for the developer building a site for an independent small-animal practice whose clients ask what a spay costs for a 30 kg dog. Every animal is weighed in on the page: photographed from one fixed camera, standing on one long waiting-room scale whose graphite edge carries its reading in kg, with a ticket hanging under it that names the fee band the weight puts it in. The fee list is published in full by species and weight band, a household registers all its animals in one form, the out-of-hours page names the partner practice the way the RCVS expects, and an end-of-life page says what happens and what it costs. Light and dark, in React and plain HTML, every figure derived from one fixture that refuses an impossible weight at build, and AGENTS.md gives your coding agent the rules.","summary":"For an independent vet practice: a veterinary clinic tailwind template where every animal is weighed in and every fee is published by weight band.","tags":["veterinary clinic tailwind template","vet clinic tailwind template","veterinary practice website template","animal hospital website template","vet price list template"],"accent_mode":"monochrome-plus-spot","palette":{"bg":"#efeeeb","surface":"#ffffff","accent":"#0e7e02","text":"#1a1a18","line":"#d5d4d0"},"darkMode":true,"pages":[{"path":"/","title":"On the scale this morning","sections":["site-header","hero","species-index","band-sample","tonight","site-footer"]},{"path":"/prices","title":"Every fee, by species and weight","sections":["site-header","fee-board","flat-fees","register-end","site-footer"]},{"path":"/animals/cats","title":"Cats","route":"/animals/[species]","sections":["site-header","species-opener","first-year","species-care","species-fees","register-end","site-footer"]},{"path":"/animals/dogs","title":"Dogs","route":"/animals/[species]","sections":["site-header","species-opener","first-year","species-care","species-fees","register-end","site-footer"]},{"path":"/animals/rabbits-and-small-pets","title":"Rabbits and small pets","route":"/animals/[species]","sections":["site-header","species-opener","first-year","species-care","species-fees","register-end","site-footer"]},{"path":"/register","title":"Register your animals","sections":["site-header","register-head","register-household","repeat-prescription","site-footer"]},{"path":"/out-of-hours","title":"Out of hours","sections":["site-header","handover","ring-now","night-visit","site-footer"]},{"path":"/health-plan","title":"The health plan","sections":["site-header","plan-board","plan-terms","register-end","site-footer"]},{"path":"/team","title":"Who will see your animal","sections":["site-header","team-roster","team-animals","register-end","site-footer"]},{"path":"/when-its-time","title":"When it's time","sections":["site-header","end-of-life-opener","end-of-life-room","end-of-life-after","end-of-life-fees","site-footer"]},{"path":"/components","title":"Tare's parts","sections":["site-header","site-footer"]}],"components":[{"name":"site-header","file":"src/components/site-header.tsx","renders":"The type-set wordmark, six routes with aria-current, the phone in the mono, the mode toggle and a quiet \"Repeat prescription\"; below xl the routes take a second row under one hairline and wrap at 375, and the phone keeps the top row at every width."},{"name":"hero","file":"src/components/hero.tsx","renders":"A8: the running head, the 11-word H1, the lede's derived \"300 grams\", \"Register your animals\" and the call, the helper with its hint, and today's open status and handover in a 28rem column, beside this morning's four weigh-ins bleeding off the right edge, the fourth cut by the frame."},{"name":"species-index","file":"src/components/species-index.tsx","renders":"Who the practice sees as ruled rows, never a grid of species icons: each species route with its vet and how it is priced, and the birds and reptiles it refers, by name."},{"name":"band-sample","file":"src/components/band-sample.tsx","renders":"A sample of the fee board on the ticket's paper: spay, castration and dental across the four dog bands under platform-cell heads from md, procedure rows at 375, one fee proved against Hector's weigh-in, and the link to every fee."},{"name":"tonight","file":"src/components/tonight.tsx","renders":"The route's end at 7/5: the out-of-hours partner on a ticket panel, with when the practice closes, the drive, that the fee is theirs and the number, beside the end repeat of \"Register your animals\" and its risk reversal."},{"name":"species-opener","file":"src/components/species-opener.tsx","renders":"The species page's opener, the home hero turned round: three whole weigh-ins of that species on one platform, inside the frame, with their dated tickets and chips, beside the species eyebrow, the H1 and lede from SPECIES_PAGES, the green action, the call and the helper with its hint; a snap rail below lg."},{"name":"first-year","file":"src/components/first-year.tsx","renders":"The first year at 4/8: the species protocol dated for the young animal in the line-up by firstYear(), each row with what was done or is next, the age or interval, and the fee read from the fee list (a dog's spay at her weight today); on the rabbits page, each small pet's vaccine in words."},{"name":"species-care","file":"src/components/species-care.tsx","renders":"Every year after (the protocol's care rows with their cadence) beside the vet who sees the species and, on the rabbits page, where birds and reptiles are referred, at 7/5."},{"name":"species-fees","file":"src/components/species-fees.tsx","renders":"How the species is priced, on the ticket's paper: the rule in one sentence from the species row, every fee it and any animal pays (banded fees as their range, by band), a link to the full list and one to the end-of-life fees."},{"name":"fee-board","file":"src/components/fee-board.tsx","renders":"/prices' opener: the H1, lede and green action in the wide first column beside the four dog bands, each read out on the platform over a plate and the weigh-in of a dog in that band; the dog fees beneath in the bands' columns, Spay first, flat dog fees across every band and end of life grouped apart; a band label marks its column by #band-x (:target, no script); procedure rows below lg."},{"name":"flat-fees","file":"src/components/flat-fees.tsx","renders":"On the ticket's paper: cats and rabbits under platform cells read out as their whole plausible range, each with the patient it was read over and its fee list; the small pets under one cell with their six-monthly check and each one's vaccine in words; what every animal pays below."},{"name":"register-end","file":"src/components/register-end.tsx","renders":"An interior route's end at 7/5: the route's own heading beside the one repeat of \"Register your animals\", the risk reversal and the desk's number."},{"name":"register-head","file":"src/components/register-head.tsx","renders":"/register's head: the H1, the lede and two links that switch between the household form and the repeat-prescription state by :target on #register and #repeat-prescription, with no script; one h1 whose inapplicable half is display:none."},{"name":"register-household","file":"src/components/register-household.tsx","renders":"The household form (client island): You, then one to six animal fieldsets with species-conditional answers (a dog's weight, a rabbit's companion), add, remove with undo; beside it the empty platform reading ––.– kg over a live ticket per animal (signalment, the owner's reading and band chip, the next first-year step), the submit and the hand-off line; ui/form validation with the summary, live refusals from refuseDraft(), and a receipt that says Not sent unless REGISTER_ENDPOINT answered."},{"name":"repeat-prescription","file":"src/components/repeat-prescription.tsx","renders":"/register's second state (client island): name, phone, animal, medicine and collect-or-written, beside the derived shelf date (readyFrom) and the written-prescription fee; the seen-in-12-months rule behind a hint; the same honest hand-off to REPEAT_ENDPOINT."},{"name":"handover","file":"src/components/handover.tsx","renders":"/out-of-hours' opener, type only: today and the open status, the H1 led by handoverLead(now) (After 18:30 tonight · Until 08:30 tomorrow · Until 08:30 Monday), the green call to the partner's number with the cover reason behind a hint, and the arrangement as five ruled rows: where, how far, when they answer (coverLine() from HOURS), whose fee, afterwards."},{"name":"ring-now","file":"src/components/ring-now.tsx","renders":"On the ticket's paper: when not to wait for the morning, ringNow() grouped as every animal then the species pages, conditions an owner can see and never a diagnosis, under a critical-ink running head; ends on the partner's number again."},{"name":"night-visit","file":"src/components/night-visit.tsx","renders":"/out-of-hours' close at 7/5: ring before you set off, what to bring in a native details disclosure (ui/accordion-disclosure), and when the practice opens again (reopens(now)) with the desk's number."},{"name":"plan-board","file":"src/components/plan-board.tsx","renders":"/health-plan's opener: the H1, lede and green action with the stop-any-month risk line, then six abutting plan columns under one platform band, the dog bands read out 0–10 … 40+ kg over Fern, Juno, Bracken and Hector and cats and rabbits over their whole range; each ticket gives the monthly price and savingLine(), then planValue()'s working: every included row at the fee list, the year at list prices, less twelve payments, and the difference; #plan-x washes a column by :target."},{"name":"plan-terms","file":"src/components/plan-terms.tsx","renders":"At 4/8: what the plan leaves out (operations and medicines, nights, leaving), three native details disclosures from PLAN_TERMS, with the published fees linked."},{"name":"team-roster","file":"src/components/team-roster.tsx","renders":"/team's opener, name rows with no portraits: the H1 and the lede counting the team beside the green action, then every person across the frame with their register letters as abbr, their role, who they see (a vet's species pages linked, every species for a nurse, everyone who rings for the desk), what else they do and their own animal by name; checkTeam() throws when a species page has no vet."},{"name":"team-animals","file":"src/components/team-animals.tsx","renders":"The staff's own animals on the platform at 5/7, plates over the graphite band with dated tickets and chips, beside the one weigh-in history the data says most about (bandMove(): a dog that came to the weight clinic in band B and weighs into band A now); readouts only when unphotographed."},{"name":"end-of-life-opener","file":"src/components/end-of-life-opener.tsx","renders":"/when-its-time's opener, type only: one reading column with the H1 that names euthanasia once, the lede, the desk's number on the green with what the desk asks behind a hint, then four ruled columns: at the practice, at home, not sure yet (a consultation at the fee list) and at night (the partner, whose fees are theirs)."},{"name":"end-of-life-room","file":"src/components/end-of-life-room.tsx","renders":"In the room at 4/8: what the vet does, in order, as six numbered steps in Alegreya figures (the form, time first, the sedative, the injection named plainly, what may be seen after death and that it is reflex, the side door out); the heading sticks beside the list from lg."},{"name":"end-of-life-after","file":"src/components/end-of-life-after.tsx","renders":"Cremation or burial at home at 4/8: communal and individual cremation, burial at home with its conditions and not deciding yet as ruled rows, then what the practice does without being asked; no prices."},{"name":"end-of-life-fees","file":"src/components/end-of-life-fees.tsx","renders":"Every end-of-life fee as a plain text table on the ticket's paper, the signature withheld: dog columns per band in words, cat, rabbit or small pet, a row per procedure and the home visit spanning them, from endOfLifeTable(); one short list per animal below md; ends on the desk's number as a link."},{"name":"site-footer","file":"src/components/site-footer.tsx","renders":"The week as a real table with today named in a word, the address and phone, every route in two columns with the styleguide link, and the one line that says fees are in pounds and include VAT."},{"name":"ui/type","file":"src/components/ui/type.ts","renders":"The type roles as class strings: caption to d4 on the 1.250 ratio, the tracked label, the Alegreya heading, Fragment Mono for the readout and codes, and Alegreya's lining tabular figures for every fee column; the only file that names a --text-* token."},{"name":"ui/popover","file":"src/components/ui/popover.tsx","renders":"A slip of ticket paper anchored to its trigger: the overlay ground, a hairline edge, square corners, a 600-weight text-face header over the reasoning at a 32ch measure, no arrow and no shadow, placed rather than faded."},{"name":"ui/hint","file":"src/components/ui/hint.tsx","renders":"A one-clause helper line with a 28px square trigger on the ticket's paper carrying an Info glyph, its edge turning to ink on hover and its ground stepping while open; pressing it opens the reasoning on the popover's slip."},{"name":"ui/card-panel","file":"src/components/ui/card-panel.tsx","renders":"A ticket at full size: white paper with a hairline edge and square corners, no shadow, a running head in the tracked mono over the display-face title above one hairline, and an optional footer strip; the bleed extent drops the side edges."},{"name":"ui/platform","file":"src/components/ui/platform.tsx","renders":"The signature: abutting fixed-camera plates over one unbroken graphite band carrying each readout, tickets hung beneath, as a focusable snap rail that bleeds to the frame's edge; without photographs the band and tickets stand alone."},{"name":"ui/readout","file":"src/components/ui/readout.tsx","renders":"The scale's reading in Fragment Mono at --text-d2 with kg on its baseline and an optional NET abbreviation; value and unit are required props, so no cell shows a bare figure."},{"name":"ui/ticket","file":"src/components/ui/ticket.tsx","renders":"A white slip hung from the platform: name and owner, the signalment with every code an abbr, the time weighed, the change since the last weigh-in, and the band chip."},{"name":"ui/band-chip","file":"src/components/ui/band-chip.tsx","renders":"The fee band a weight buys, as a full-round label in the green's own wash on a ticket only; named by its words, never by its fill."},{"name":"ui/photo","file":"src/components/ui/photo.tsx","renders":"A weigh-in plate at its own 2:3, square, anchored to the bottom of the frame so a crop never loses the scale's edge, tagged data-plate."},{"name":"ui/button","file":"src/components/ui/button.tsx","renders":"The action in two weights: the green fill with data-cta primary (48px) or a quiet ink outline (40px), hover and press moving lightness, pressed sinking .98."},{"name":"ui/link","file":"src/components/ui/link.tsx","renders":"An ink link underlined at 1px, 2px on hover or when it is the current page; the call beside the green action is one, never a ghost button."},{"name":"ui/mode-toggle","file":"src/components/ui/mode-toggle.tsx","renders":"One 40px icon button flipping the day page and the after-hours page, named for what pressing it does, aria-pressed for dark, the choice kept in storage."},{"name":"ui/wordmark","file":"src/components/ui/wordmark.tsx","renders":"The practice's name set in Alegreya at the display weight, linking home, inside data-brand-name; no drawn mark."},{"name":"ui/field","file":"src/components/ui/field.tsx","renders":"A line of the registration card: the label in the text face at a ticket name's weight, the optional marker in words, a white slip in a 3:1 field-border edge (sunken near-black in dark), one muted clause under it; refused, the edge goes critical at 2px and the message leads with the alert glyph at the label's weight."},{"name":"ui/form","file":"src/components/ui/form.tsx","renders":"The submit flow with nothing painted: a reset fieldset laid out by the call site, and a receipt on ticket paper focused after it renders, whose first words are the outcome (Not sent unless the endpoint answered)."},{"name":"ui/form-error-summary","file":"src/components/ui/form-error-summary.tsx","renders":"The register's one coloured ground, earned: critical-soft paper inside a whole critical hairline, the counted heading (\"7 answers to check\") in the critical ink with the alert glyph, and an ordered list of underlined links that read as the field labels."},{"name":"ui/accordion-disclosure","file":"src/components/ui/accordion-disclosure.tsx","renders":"A ruled row of the record as a native details: hairlines above and below, the summary at a ticket name's weight with an optional count, a chevron at the right edge that turns instantly, the content indented under it."}],"tokens":{"--background":"#efeeeb","--foreground":"#1a1a18","--card":"#ffffff","--card-foreground":"#1a1a18","--secondary":"#e9e8e4","--secondary-foreground":"#1a1a18","--muted":"#e2e1dd","--muted-foreground":"#565551","--border":"#d5d4d0","--surface-overlay":"#ffffff","--platform":"#272725","--platform-foreground":"#efeeeb","--platform-muted":"#adadab","--plate-filter":"none","--primary":"#0e7e02","--primary-foreground":"#ffffff","--primary-hover":"#0a6a00","--primary-active":"#085800","--accent":"#e1f1db","--accent-foreground":"#0c5a04","--link":"#1a1a18","--link-hover":"#1a1a18","--ring":"#1a1a18","--field":"#ffffff","--field-border":"#82817d","--control-border":"#82817d","--selection":"#e2e1dd","--selection-foreground":"#1a1a18","--selection-border":"#1a1a18","--positive":"#00706a","--positive-foreground":"#ffffff","--positive-soft":"#dff6f3","--positive-border":"#a3d2cd","--positive-fill":"#027973","--warning":"#8a5a00","--warning-foreground":"#ffffff","--warning-soft":"#fdefda","--warning-border":"#e3c697","--warning-fill":"#916217","--critical":"#b3261e","--critical-foreground":"#ffffff","--critical-soft":"#ffebe8","--critical-border":"#ecb9b1","--critical-fill":"#a6473c","--scrim":"rgb(26 26 24 / 0.48)","--radius":"0.375rem","--radius-plate":"0rem","--radius-chip":"9999px","--page-max":"72rem","--gutter":"clamp(1rem, 5vw, 4rem)","--page-frame":"calc(var(--page-max) + 2 * var(--gutter))","--page-inset":"max(var(--gutter), calc((100% - var(--page-max)) / 2))","--plate-w":"clamp(10.5rem, 4rem + 11vw, 12.5rem)","--plate-ratio":"2 / 3","--hero-copy":"28rem","--rail-caption":"calc(3 * var(--plate-w))","--icon-stroke":"1.5","--ease-house":"cubic-bezier(0.16, 1, 0.3, 1)","--duration-micro":"120ms","--duration-state":"150ms","--text-caption":"0.75rem","--leading-caption":"1.4","--text-small":"0.875rem","--leading-small":"1.45","--text-body":"1rem","--leading-body":"1.55","--text-lead":"1.125rem","--leading-lead":"1.6","--text-d1":"1.5rem","--leading-d1":"1.25","--tracking-d1":"-0.005em","--text-d2":"1.875rem","--leading-d2":"1.15","--tracking-d2":"-0.01em","--text-d3":"clamp(1.875rem, 1.6rem + 1.1vw, 2.344rem)","--leading-d3":"1.12","--tracking-d3":"-0.015em","--text-d4":"clamp(2.125rem, 1.6rem + 2.1vw, 2.93rem)","--leading-d4":"1.06","--tracking-d4":"-0.02em","--tracking-label":"0.08em","--weight-display":"600","--font-display":"var(--font-tare-display), Palatino, Georgia, serif","--font-text":"var(--font-tare-text), ui-sans-serif, system-ui, sans-serif","--font-sans":"var(--font-text)","--font-mono":"var(--font-tare-mono), ui-monospace, 'Courier New', monospace"},"tokensDark":{"--background":"#131312","--foreground":"#e9e8e5","--card":"#1f1f1e","--card-foreground":"#e9e8e5","--secondary":"#2b2b2a","--secondary-foreground":"#e9e8e5","--muted":"#0d0d0c","--muted-foreground":"#a3a29e","--border":"#2e2e2c","--surface-overlay":"#242423","--platform":"#0b0b0a","--platform-foreground":"#e9e8e5","--platform-muted":"#aaa9a6","--plate-filter":"brightness(0.84)","--primary":"#3ec432","--primary-foreground":"#0a1a09","--primary-hover":"#56d849","--primary-active":"#6bec5f","--accent":"#17331a","--accent-foreground":"#a3e59a","--link":"#e9e8e5","--link-hover":"#e9e8e5","--ring":"#e9e8e5","--field":"#0d0d0c","--field-border":"#71706c","--control-border":"#71706c","--selection":"#2b2b2a","--selection-foreground":"#e9e8e5","--selection-border":"#e9e8e5","--positive":"#4cc7b9","--positive-foreground":"#131312","--positive-soft":"#0a2724","--positive-border":"#18524c","--positive-fill":"#35b4a7","--warning":"#e2a53e","--warning-foreground":"#131312","--warning-soft":"#2c1f09","--warning-border":"#5d4216","--warning-fill":"#cd9a4a","--critical":"#f47a6b","--critical-foreground":"#131312","--critical-soft":"#321a16","--critical-border":"#65352f","--critical-fill":"#e17365","--scrim":"rgb(0 0 0 / 0.62)","--radius":"0.375rem","--radius-plate":"0rem","--radius-chip":"9999px","--page-max":"72rem","--gutter":"clamp(1rem, 5vw, 4rem)","--page-frame":"calc(var(--page-max) + 2 * var(--gutter))","--page-inset":"max(var(--gutter), calc((100% - var(--page-max)) / 2))","--plate-w":"clamp(10.5rem, 4rem + 11vw, 12.5rem)","--plate-ratio":"2 / 3","--hero-copy":"28rem","--rail-caption":"calc(3 * var(--plate-w))","--icon-stroke":"1.5","--ease-house":"cubic-bezier(0.16, 1, 0.3, 1)","--duration-micro":"120ms","--duration-state":"150ms","--text-caption":"0.75rem","--leading-caption":"1.4","--text-small":"0.875rem","--leading-small":"1.45","--text-body":"1rem","--leading-body":"1.55","--text-lead":"1.125rem","--leading-lead":"1.6","--text-d1":"1.5rem","--leading-d1":"1.25","--tracking-d1":"-0.005em","--text-d2":"1.875rem","--leading-d2":"1.15","--tracking-d2":"-0.01em","--text-d3":"clamp(1.875rem, 1.6rem + 1.1vw, 2.344rem)","--leading-d3":"1.12","--tracking-d3":"-0.015em","--text-d4":"clamp(2.125rem, 1.6rem + 2.1vw, 2.93rem)","--leading-d4":"1.06","--tracking-d4":"-0.02em","--tracking-label":"0.08em","--weight-display":"600","--font-display":"var(--font-tare-display), Palatino, Georgia, serif","--font-text":"var(--font-tare-text), ui-sans-serif, system-ui, sans-serif","--font-sans":"var(--font-text)","--font-mono":"var(--font-tare-mono), ui-monospace, 'Courier New', monospace"},"compatibility":{"next":">=15 <17","react":">=19 <20","tailwind":">=4 <5"},"dependencies":["lucide-react"],"editions":{"react":{"source":"src","runtime":"react"},"html":{"source":"html/src","output":"html/dist","engine":"nunjucks","runtime":"vanilla","buildRequired":false}},"design":{"typefaces":{"display":"Alegreya","text":"Albert Sans","mono":"Fragment Mono"},"typeRatio":1.25,"signature":"The weigh-in: a row of plates photographed from one fixed camera abut with no gutter over one continuous graphite platform, the scale's front edge, whose cell under each animal carries its reading in Fragment Mono with kg (and NET when a carrier was tared) on the baseline; beneath it hangs a ticket with the name, the signalment in the vet's own shorthand, the time weighed, the change since the last weigh-in and the band chip that weight puts the animal in for this practice's fees. Implemented in src/components/ui/platform.tsx, ui/readout.tsx and ui/ticket.tsx; weighIn(), bandFor(), signalment() and trend() in src/fixtures/derive.ts throw at import on an impossible weight, a band gap or overlap, an impossible sex code, a tare at or above the gross, and a chip that disagrees with bandFor(). It recurs on /, /prices (band heads), /animals/[species], /register (the empty platform), /team and /health-plan, and is withheld on /when-its-time.","heroArchetype":"A8","sanctionedDeviation":"Mono display figures on the platform: every readout is Fragment Mono at --text-d2, fixed-width, the hero's included, against CONTRACT § Type scale's proportional figures on a standalone display figure, so a reading looks like an instrument's output and stacked readouts align on the decimal point. Scoped to ui/readout.tsx; value and unit are required props, so no cell shows a bare figure.","motionPersonality":"near-static: a scale settles; it does not animate","undertone":"limewash and graphite, one grass green","surface_kind":"marketing","built_against":"2026-10-29","recipe":{"primary":"the waiting-room weigh-in","secondary":"the published fee list"},"brand_pyramid":["plainly priced","measured","kind"],"levers":{"theme":"light","density":"comfortable","accent_mode":"monochrome-plus-spot","motion":"still","borders":"soft","radius":"small","texture":"none","shadow":"none"},"icons":{"set":"lucide","stroke":1.5,"ladder":["size-4","size-5","size-6"],"contexts":{"nav":"none","panel_header":"none","fact_row":"none","feature_grid":"none"}},"disclosure":{"helper_line":"one-clause","sentence":"hint","paragraph":"details","parallel_views":"tabs","secondary_object":"route"},"cta":{"header":"quiet","hero":"filled","repeats":["end"],"mobile":"inline"},"colour_budget":{"brand_max_pct":null,"concentration_pct":70,"regions":["cta","band"]},"exemplars":[{"name":"a veterinary walk-on platform scale","slice":"the long graphite mat and brushed front edge every animal stands on, read in kg on one line"},{"name":"a thermal weigh ticket","slice":"the narrow printed slip with a name, a time and a reading, hanging under the instrument that printed it"}],"anti_list":["paw prints, bones, hearts and cartoon animals","a vet hugging a puppy over 'caring for your furry family'","teal or orange as the brand","a 3-up services grid of species icons","call for prices, or fees from £X","a count-up stat strip, reviews, ratings or 'years caring'","a testimonial carousel","a symptom checker or triage advice","online booking, a patient portal or a pharmacy shop","green in any photograph"],"strict":["harmony"]}}