{"slug":"quadrant","name":"Quadrant","version":"1.0.0","category":"local business","priceCents":2900,"ui_library":{"version":"1.5.2","files":["html/src/js/_tt/accordion-disclosure.js","html/src/js/_tt/anchor.js","html/src/js/_tt/dialog.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","html/src/js/_tt/variant-selector.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/dialog.axes.ts","src/components/ui/_tt/dialog.fixtures.ts","src/components/ui/_tt/dialog.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","src/components/ui/_tt/variant-selector.axes.ts","src/components/ui/_tt/variant-selector.capture.ts","src/components/ui/_tt/variant-selector.fixtures.ts","src/components/ui/_tt/variant-selector.tsx"]},"license":"standard","description":"Quadrant is a dental website template for Next.js and Tailwind, for the developer building a site for an independent general practice that publishes its fees and answers its own phone. Its index is the patient's own mouth: a two-arch FDI tooth chart with every cell sized to the tooth's real width, so a patient points to the tooth that hurts and the page says what a first look costs, what it might need next and who would see them. Fifteen routes ship in light and dark, in React and in plain HTML: the home chart, one treatments page with all 15 fees, eight treatment pages that re-price by tooth and canal count, a children's page on the 20-tooth chart, the team by chair and day, a booking request whose first field is the chart, a same-day emergency page and a styleguide of every part. Every figure is derived from one fixture that refuses a broken schedule at build, both modes pass WCAG AA, the zip runs as it is, and AGENTS.md gives your coding agent the rules.","summary":"For an independent dental practice: a dental website template nextjs where a patient points to the tooth and the page prices it before they phone.","tags":["dental website template nextjs","dental clinic tailwind template","dentist website template react","dental practice website template","dental website template with tooth chart"],"accent_mode":"monochrome-plus-spot","palette":{"bg":"#f6f4ef","surface":"#fffefb","accent":"#be04ca","text":"#1f1d1b","line":"#dcd6cc"},"darkMode":true,"pages":[{"path":"/","title":"Point to the tooth.","sections":["site-header","hero","chart-index","tooth-readout","visit-fees","visit-strip","site-footer"]},{"path":"/treatments","title":"Treatments and every fee","sections":["site-header","treatments-index","treatments-end","site-footer"]},{"path":"/treatments/fissure-sealant","title":"Fissure sealant","sections":["site-header","treatment-chart","treatment-quote","treatment-notes","treatments-end","site-footer"]},{"path":"/treatments/white-filling-front","title":"White filling, front tooth","sections":["site-header","treatment-chart","treatment-quote","treatment-notes","treatments-end","site-footer"]},{"path":"/treatments/white-filling-back","title":"White filling, back tooth","sections":["site-header","treatment-chart","treatment-quote","treatment-notes","treatments-end","site-footer"]},{"path":"/treatments/ceramic-crown","title":"Ceramic crown","sections":["site-header","treatment-chart","treatment-quote","treatment-notes","treatments-end","site-footer"]},{"path":"/treatments/root-canal","title":"Root canal","sections":["site-header","treatment-chart","treatment-quote","treatment-notes","treatments-end","site-footer"]},{"path":"/treatments/removal","title":"Removing a tooth","sections":["site-header","treatment-chart","treatment-quote","treatment-notes","treatments-end","site-footer"]},{"path":"/treatments/wisdom-tooth-removal","title":"Wisdom tooth removal","sections":["site-header","treatment-chart","treatment-quote","treatment-notes","treatments-end","site-footer"]},{"path":"/treatments/whitening","title":"Whitening","sections":["site-header","treatment-chart","treatment-quote","treatment-notes","treatments-end","site-footer"]},{"path":"/children","title":"Point to the wobbly one.","sections":["site-header","children-opener","children-chart","children-readout","children-visits","site-footer"]},{"path":"/team","title":"Who would see you","sections":["site-header","team-chairs","team-days","team-desk","site-footer"]},{"path":"/book","title":"Ask for a time","sections":["site-header","book-request","book-halfday","book-direct","book-asked","book-next","site-footer"]},{"path":"/emergency","title":"In pain today","sections":["site-header","emergency-opener","emergency-before","site-footer"]},{"path":"/components","title":"Quadrant's parts","sections":["site-header","site-footer"]}],"components":[{"name":"site-header","file":"src/components/site-header.tsx","renders":"The wordmark, four routes with aria-current, the phone, the mode toggle and a quiet \"Ask for a time\"; below lg the routes take a second row under one hairline, and at 375 the phone keeps the top row so a patient can ring in one tap."},{"name":"hero","file":"src/components/hero.tsx","renders":"The H1 \"Point to the tooth.\", the first look's fee in one sentence, \"Book a first look\" and the call link, beside the Chair 2 plate cropped at its fixture focal point; unphotographed, the H1 row runs the full measure and the chart rises into the first screen."},{"name":"chart-index","file":"src/components/chart-index.tsx","renders":"The record card holding the 32-tooth chart at 8px a millimetre, the Zsigmondy cross, the by-name select for anyone unsure which tooth, and the live readback under it."},{"name":"tooth-readout","file":"src/components/tooth-readout.tsx","renders":"What the picked tooth would need: its chip and name, the first look itemised to $116, every tooth-specific fee that applies with who does it, and the three dentists who do a first look, with or without their portraits."},{"name":"visit-fees","file":"src/components/visit-fees.tsx","renders":"The two whole-mouth visits a patient asks about by name, a check-up and a new-patient visit, each itemised from the schedule to its sum and its chair time."},{"name":"visit-strip","file":"src/components/visit-strip.tsx","renders":"Today's held pain slots, today's hours, the address, funds claimed at the desk, and the route's one repeat of the filled action."},{"name":"site-footer","file":"src/components/site-footer.tsx","renders":"The week as a real table with today named in words, the address and phone, every route and the styleguide link, and the one line that says fees are in Australian dollars."},{"name":"treatments-index","file":"src/components/treatments-index.tsx","renders":"All fifteen fees as one record card: the eight tooth-specific rows each with its 160px chart strip and where-words, the root canal's range and three canal steps with its pricing rule in a hint, the first look's sum, and the five whole-mouth rows with their visit sums."},{"name":"treatments-end","file":"src/components/treatments-end.tsx","renders":"The step every fee leads to: the first look itemised, funds claimed at the desk, what is referred out, the filled action and the call, full width on the card ground."},{"name":"treatment-chart","file":"src/components/treatment-chart.tsx","renders":"A treatment page's masthead over its own chart: the strip and \"Done on N teeth\" in the card header, the by-name select, the 32 radios, and a readback that re-prices on every tooth, a root canal by its canal count."},{"name":"treatment-quote","file":"src/components/treatment-quote.tsx","renders":"The re-priced fee for the picked tooth at display size, the lines it is made of, each visit and the interval between them, and who would see you; on a tooth it is not done on, where it is done and every fee that is."},{"name":"treatment-notes","file":"src/components/treatment-notes.tsx","renders":"A treatment's clinical words as native details rows, the first open, beside the other fees that are done on one tooth; never a fee behind a disclosure."},{"name":"children-opener","file":"src/components/children-opener.tsx","renders":"The kids'-corner plate full bleed, \"Point to the wobbly one.\" with who sees children and what a first visit costs, the filled action and the call, beside the baby chart; unphotographed, the words and the chart open the page."},{"name":"children-chart","file":"src/components/children-chart.tsx","renders":"The 20-tooth baby chart on tenth-millimetre columns at the adult chart's 8px a millimetre, in its own 552px record card, with the by-name select and a readback that says when the tooth usually comes out."},{"name":"children-readout","file":"src/components/children-readout.tsx","renders":"A baby tooth's arrival, the adult tooth that follows it and the one that arrives behind it, then the first look and every fee that reaches that tooth with who does it."},{"name":"children-visits","file":"src/components/children-visits.tsx","renders":"Five things that happen at a child's first visit, both kids' visits itemised to $137 and $114 with their chairs and people, funds at the desk, and the end repeat of the action."},{"name":"emergency-opener","file":"src/components/emergency-opener.tsx","renders":"A type-only head whose H1 is the held same-day slots as a sentence that moves with the clock, the desk's open state and the address beside it, who sees you, the filled call and the 000 line."},{"name":"emergency-before","file":"src/components/emergency-before.tsx","renders":"Five steps written as the desk would say them, what a first look costs itemised to $116 and its minutes, the promise that anything more is priced first, and the end repeat of the call."},{"name":"team-chairs","file":"src/components/team-chairs.tsx","renders":"Four columns in chair order on a graphite rule, each a 3:4 portrait, name, role, week strip and the person's own fee rows on one subgrid; unphotographed, four ruled rows with the chair numeral in the portrait's place."},{"name":"team-days","file":"src/components/team-days.tsx","renders":"A person's week as six cells on a shared hairline, the days they are in reversed out in bold ink, with the sentence it stands for as the accessible text."},{"name":"team-desk","file":"src/components/team-desk.tsx","renders":"The front desk across the full width: the person a request reaches, her days and duties, the two-hour call-back promise, \"Ask for a time\" and the call, with or without the reception plate."},{"name":"book-request","file":"src/components/book-request.tsx","renders":"The request form whose first field is the compact chart, optional and pre-picked from ?tooth=, then what is wrong, name, phone, the half-day and new or existing patient, validating with a focused summary and posting with no script."},{"name":"book-halfday","file":"src/components/book-halfday.tsx","renders":"The week as a timetable of morning and afternoon cells with their hours, one radio group and one tab stop, \"First free time, any day\" across the foot, and a readback naming the dentists in that half-day."},{"name":"book-direct","file":"src/components/book-direct.tsx","renders":"The direct hand-off for a practice whose own system takes bookings: one record card with \"Book online\" to the system's URL and the phone with today's desk status."},{"name":"book-asked","file":"src/components/book-asked.tsx","renders":"The tooth asked about on the home page, carried into the direct state as the picked-tooth chip and one line saying to mention it when booking."},{"name":"book-next","file":"src/components/book-next.tsx","renders":"Beside the form, what happens after sending in three timed steps, the same-day pain slots with the call, and where the practice is, with the shopfront plate when photographed."},{"name":"ui/tooth-chart","file":"src/components/ui/tooth-chart.tsx","renders":"The signature's picker on ui/variant-selector: 32 adult or 20 baby cells at their real widths on a half-millimetre grid, the cross ruled between the arches, the picked tooth filled in the orchid; arches from md, or quadrants pinned at any width."},{"name":"ui/chart-strip","file":"src/components/ui/chart-strip.tsx","renders":"The chart's own geometry at 160px, read and not operated: the teeth a fee applies to filled in the orchid, the rest on the card, the cross between the arches."},{"name":"ui/tooth-state","file":"src/components/ui/tooth-state.tsx","renders":"The one picked tooth a route's sections share, seeded from ?tooth= on the server and after hydration, so the action's href, the chart and the readout always agree."},{"name":"ui/tooth-chip","file":"src/components/ui/tooth-chip.tsx","renders":"The picked tooth's FDI number in the mono at lead size on the accent wash, a full-round label that never reads as a button; the only ground the accent paints."},{"name":"ui/fee-line","file":"src/components/ui/fee-line.tsx","renders":"One schedule row as a list item: the house code in the mono, the treatment's name and one line of what it involves, and the fee right-aligned in tabular figures over a hairline."},{"name":"ui/button","file":"src/components/ui/button.tsx","renders":"The one action shape in two weights, filled orchid with data-cta primary or a quiet graphite outline, 44px tall, hover and press moving lightness, pressed sinking .98, and an aria-current underline when it is the page it is on."},{"name":"ui/book-link","file":"src/components/ui/book-link.tsx","renders":"\"Book a first look\", the filled action whose label never changes and whose href carries the picked tooth to /book."},{"name":"ui/text-link","file":"src/components/ui/text-link.tsx","renders":"An underlined link in the deeper link ink, 2px on hover; the call beside every filled action is one, never a ghost button."},{"name":"ui/photo","file":"src/components/ui/photo.tsx","renders":"A generated plate cropped in code at its fixture focal point, square-cornered over the muted ground, tagged data-plate; decorative portraits sit beside the name they show."},{"name":"ui/mode-toggle","file":"src/components/ui/mode-toggle.tsx","renders":"One 40px icon button flipping enamel and graphite, named for what pressing it does, aria-pressed for the dark state, the choice kept in storage."},{"name":"ui/wordmark","file":"src/components/ui/wordmark.tsx","renders":"The practice's name set in Besley at the display weight, linking home, with data-brand-name for the rebrand preview; no drawn mark."},{"name":"ui/type","file":"src/components/ui/type.ts","renders":"The type roles as class strings: caption to d4 on the 1.333 ratio, the tracked label, the Besley heading, the Atkinson mono and tabular figures; the only file that names a --text-* token."},{"name":"ui/variant-selector","file":"src/components/ui/variant-selector.tsx","renders":"A labelled set of native radios as bordered rows with the dot left visible; the chosen row steps to the neutral selection ground and a graphite edge, and the readback line under it is announced. The tooth chart composes the same part under its own recipe."},{"name":"ui/field","file":"src/components/ui/field.tsx","renders":"A label, an optional (optional) mark and a one-clause note over a bare native input, select or textarea drawn on the white field with its 3.75:1 edge; an error keeps a critical edge, a circle-alert glyph and its sentence while the blue focus ring is drawn outside it."},{"name":"ui/form","file":"src/components/ui/form.tsx","renders":"The booking request's form and fieldset, with no paint of its own while pending; on success, focus lands on a receipt set on the positive soft ground in the foreground ink."},{"name":"ui/form-error-summary","file":"src/components/ui/form-error-summary.tsx","renders":"The panel a rejected request inserts and focuses: critical's soft ground and edge, the count of answers to fix as a sentence, and a bulleted list of underlined links that each go to the field."},{"name":"ui/accordion-disclosure","file":"src/components/ui/accordion-disclosure.tsx","renders":"A native details row for aftercare and clinical explanation on a treatment page: label at body weight 600 above a hairline, a chevron that turns instantly on open, and the prose region at reading measure. Never wraps a fee."},{"name":"ui/card-panel","file":"src/components/ui/card-panel.tsx","renders":"The record card: a hairline edge and a lightness step off the page, the 0.5rem outer corner, no shadow, a Besley title and an Atkinson meta line over the header's one rule, and an optional footer; the bleed extent drops the side edges and corners."},{"name":"ui/popover","file":"src/components/ui/popover.tsx","renders":"A small record card anchored to its trigger: the overlay ground, a hairline edge, the 0.5rem corner, a Besley header over the reasoning, 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 24px question-mark trigger on its first line, muted at rest and in the link ink on hover; pressing it opens the fee rule's reasoning on the popover's surface."},{"name":"ui/dialog","file":"src/components/ui/dialog.tsx","renders":"A record card over a graphite scrim, rising from the bottom edge at 375 and centred from sm, with a Besley title, a 40px close button, a scrolling body and a muted footer row; the critical tone draws the whole edge, never a stripe."}],"tokens":{"--background":"#f6f4ef","--foreground":"#1f1d1b","--card":"#fffefb","--card-foreground":"#1f1d1b","--secondary":"#e6e2dc","--secondary-foreground":"#1f1d1b","--muted":"#efece7","--muted-foreground":"#625c55","--border":"#dcd6cc","--surface-overlay":"#fffefb","--primary":"#be04ca","--primary-foreground":"#ffffff","--primary-hover":"#a308ad","--primary-active":"#8a0193","--accent":"#f7e4f8","--accent-foreground":"#9a12a3","--link":"#9a12a3","--link-hover":"#801188","--ring":"#2f5aa8","--field":"#ffffff","--field-border":"#8a8379","--control-border":"#8a8379","--selection":"#e9e6df","--selection-foreground":"#1f1d1b","--selection-border":"#1f1d1b","--chart-rule":"#cfc9be","--chart-cross":"#8a8379","--positive":"#137738","--positive-foreground":"#ffffff","--positive-soft":"#e5f5e7","--positive-border":"#a9d0b0","--positive-fill":"#2d7b44","--warning":"#825b00","--warning-foreground":"#ffffff","--warning-soft":"#fbf1dc","--warning-border":"#dcc49c","--warning-fill":"#966a00","--critical":"#ba2d1f","--critical-foreground":"#ffffff","--critical-soft":"#ffebe7","--critical-border":"#e9b6ad","--critical-fill":"#a74639","--scrim":"rgb(31 29 27 / 0.48)","--radius":"0.375rem","--radius-cell":"0rem","--radius-card":"0.5rem","--radius-chip":"9999px","--tooth-mm":"0.5rem","--tooth-row":"3.75rem","--tooth-row-compact":"3rem","--chart-cross-width":"2px","--strip-width":"10rem","--chart-measure":"calc(127 * var(--tooth-mm) + 2px)","--icon-stroke":"1.75","--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":"2rem","--leading-d2":"1.2","--tracking-d2":"-0.01em","--text-d3":"clamp(2rem, 1.55rem + 1.9vw, 2.666rem)","--leading-d3":"1.15","--tracking-d3":"-0.015em","--text-d4":"clamp(2.5rem, 1.6rem + 3vw, 3.553rem)","--leading-d4":"1.08","--tracking-d4":"-0.02em","--tracking-label":"0.06em","--weight-display":"600","--font-display":"var(--font-quadrant-display), Rockwell, Georgia, serif","--font-text":"var(--font-quadrant-text), ui-sans-serif, system-ui, sans-serif","--font-sans":"var(--font-text)","--font-mono":"var(--font-quadrant-mono), ui-monospace, 'Courier New', monospace"},"tokensDark":{"--background":"#171615","--foreground":"#ede9e2","--card":"#1f1e1c","--card-foreground":"#ede9e2","--secondary":"#2d2b28","--secondary-foreground":"#ede9e2","--muted":"#11100f","--muted-foreground":"#a8a198","--border":"#34312d","--surface-overlay":"#282624","--primary":"#f13bfe","--primary-foreground":"#1a0a1c","--primary-hover":"#f574fe","--primary-active":"#f69ffb","--accent":"#3b2340","--accent-foreground":"#f2b3f6","--link":"#f0a6f6","--link-hover":"#f9c1fd","--ring":"#8fb3f0","--field":"#141312","--field-border":"#77716a","--control-border":"#77716a","--selection":"#302d2b","--selection-foreground":"#ede9e2","--selection-border":"#ede9e2","--chart-rule":"#3d3a36","--chart-cross":"#77716a","--positive":"#68ca80","--positive-foreground":"#171615","--positive-soft":"#15291a","--positive-border":"#2f5838","--positive-fill":"#60ac72","--warning":"#edb345","--warning-foreground":"#171615","--warning-soft":"#2d220f","--warning-border":"#644f2a","--warning-fill":"#ca9c48","--critical":"#f87966","--critical-foreground":"#171615","--critical-soft":"#351c18","--critical-border":"#6e3e36","--critical-fill":"#e17363","--scrim":"rgb(0 0 0 / 0.62)","--radius":"0.375rem","--radius-cell":"0rem","--radius-card":"0.5rem","--radius-chip":"9999px","--tooth-mm":"0.5rem","--tooth-row":"3.75rem","--tooth-row-compact":"3rem","--chart-cross-width":"2px","--strip-width":"10rem","--chart-measure":"calc(127 * var(--tooth-mm) + 2px)","--icon-stroke":"1.75","--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.0085em","--text-d2":"2rem","--leading-d2":"1.2","--tracking-d2":"0.0035em","--text-d3":"clamp(2rem, 1.55rem + 1.9vw, 2.666rem)","--leading-d3":"1.15","--tracking-d3":"-0.0015em","--text-d4":"clamp(2.5rem, 1.6rem + 3vw, 3.553rem)","--leading-d4":"1.08","--tracking-d4":"-0.0065em","--tracking-label":"0.06em","--weight-display":"500","--font-display":"var(--font-quadrant-display), Rockwell, Georgia, serif","--font-text":"var(--font-quadrant-text), ui-sans-serif, system-ui, sans-serif","--font-sans":"var(--font-text)","--font-mono":"var(--font-quadrant-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":"Besley","text":"Atkinson Hyperlegible Next","mono":"Atkinson Hyperlegible Mono"},"typeRatio":1.333,"signature":"The disclosed chart: a two-arch FDI tooth chart drawn facing the patient, every cell a tooth's real mesiodistal width at 8px per millimetre, the Zsigmondy cross ruled between the arches, and the teeth a question touches disclosed in the orchid of a plaque-disclosing tablet. Implemented in src/components/ui/tooth-chart.tsx (a recipe on ui/variant-selector: native radios, one tab stop, DOM order = arch order, posts ?tooth= without JavaScript; dentition adult or primary, composition arches or quadrants) and src/components/ui/chart-strip.tsx (the same geometry at 160px). chartFor(), firstLookFor() and feeFor() in src/fixtures/derive.ts throw at build on an unknown tooth, an unpriced line or a clinician who does not do the treatment. It recurs on /, /treatments (a strip per tooth-specific fee), /treatments/<slug> (re-pricing, a root canal by canal count), /children (the 20-cell primary chart) and /book (the first field).","heroArchetype":"A9","sanctionedDeviation":"The chart's cell geometry is off the 4/8 spacing ladder: cells are real tooth widths × --tooth-mm (68, 52, 60, 56, 52, 80, 72, 68 upper; 40, 44, 56, 56, 56, 88, 84, 80 lower, at 1280), so an 88px molar sits beside a 40px incisor and the row reads as a mouth, not a 16-column table. Scoped to tooth-chart.tsx and chart-strip.tsx; everything around the chart stays on the ladder.","motionPersonality":"near-static: a chart is marked, not animated","undertone":"tooth enamel and graphite, one disclosing orchid","surface_kind":"marketing","built_against":"2026-10-21","recipe":{"primary":"the dental record card","secondary":"the published fee schedule"},"brand_pyramid":["legible","plainly priced","calm"],"levers":{"theme":"light","density":"comfortable","accent_mode":"monochrome-plus-spot","motion":"still","borders":"hairline","radius":"small","texture":"none","shadow":"none"},"icons":{"set":"lucide","stroke":1.75,"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":["chart","hero-cta"]},"exemplars":[{"name":"a dentist's paper charting card","slice":"the two-arch FDI record with the cross ruled between the arches, marked, never drawn"},{"name":"a plaque-disclosing tablet","slice":"one saturated ink that shows only what the question touches"}],"anti_list":["stock-smile hero photography and 'your smile is our priority' headlines","a blue or teal Book button","a 3-up services grid","call for pricing, or fees in a PDF","drawn teeth, tooth outlines, smile illustrations, 3D mouths","before/after galleries, open mouths, instruments in use","reviews, ratings, smile counters, insurer logos","a live availability calendar, patient portal or chat widget","rebate, gap or insurance estimators"],"strict":["harmony"]}}