leaf.kata.json and applied to this page.
If a compiled file cannot rebuild the look of the thing it came from, it is not carrying enough to
teach a model either.
// Registry entry
Landing and product pages, including satellite products on their own subdomains. Light by default, with a stated dark counterpart.
// Colour
Every value is scoped to a surface, so nothing can be borrowed across one by mistake. The swatches above and the page you are reading are drawn from these.
#FAF7F2The decision moves muted text #737373 to 4.44:1 on this paper — below AA, where it scraped past at 4.59:1 on the shipped value. Recorded under contrast-policy.rgba(245,245,245,.6) over pagefull-width alternating band behind a section#FFFFFF#FDFBF9 is the docs card token and does not apply here. Question closed.#FAFAFA#F5F5F5rgba(0, 0, 0, .08)The warm hairline rgba(25,18,7,.08) recorded in the previous compile is --leaf-border, a docs-side value. Marketing hairlines are neutral black at 8%.#0A0A0A#7373734.59:1 on page, 4.74:1 on card. Passes AA for body text, with no margin.#A3A3A3Fails: 2.31:1 on codeSurface #F5F5F5. Well below AA at any size.#D4652Eflame, the one loud colourFails: 3.56:1 as eyebrow text on page, at 11px. Below AA for text that size.#D7662F#F5B731rgba(212, 101, 46, .07)Exists in the shared sheet. The ghost button does NOT use it on hover; it uses neutral-50.rgba(212, 101, 46, .16)#FFFFFFFails: 3.68:1 against accent. Below AA for text under 18.66px bold. The primary button is 14px medium.#F5F5F5Marketing code is LIGHT. The warm-dark #1E1714 in the previous compile is the docs code block, harvested across surfaces — the same mistake as the text trio.#171717#FAFAFA#F5F5F5Applies to leafphp.dev/, *.leafphp.dev/, design.hanabira.dev/
#110E0B#0A0807#FAFAFA#D4652E#A3A3A37.63:1 on page. Passes.#E5E5E5#737373#0A0807#110E0Brgba(255, 255, 255, .08)Applies to leafphp.dev/, *.leafphp.dev/
Deliberately empty. The previous compile harvested three values from here and called them marketing tokens: the text trio (#3C3C43/#67676C/#929295), the warm hairline rgba(25,18,7,.08), and the dark code block #1E1714. All three are corrected in this compile. Do not harvest from this surface.
Applies to docs/**, leaf-docs/**
// Type
Rendered in the family this system actually uses, at the sizes it actually states. Anything that looks wrong here is wrong in the system.
2.25remclamp(1.875rem, 4vw, 2.75rem)clamp(2.25rem, 5.5vw, 4.5rem)1.0625rem1.125rem// Space
A scale that is not enforced is a habit rather than a rule, and the file says which this is.
Tailwind default scale, stated through utility classes across every marketing component
py-24 lg:py-32 (96px, 128px at lg)
The scale exists and is real. Whether off-scale values are a violation is not stated; arbitrary values appear for type sizes (text-[0.6875rem]) but not for spacing. See unspecified/spacing-enforce.
// Composition
Breakpoints, grid relationships and alignment. This is where the correction effort goes, and where a token file tells you nothing.
640px768px1024px1280px// Patterns
The second half is the one that matters. A component list says what exists; only the refusals say what to reach for.
wordmarkRow instead.// Refusals
The least recoverable section in the file. A rendered site shows only what it does, never what it declines, so every line here came from a person saying no.
// Contradictions
Places the written intent and the shipped code do not match. The compiler surfaces both and picks neither.
#FAF7F2 design notes
#FDFBF7 index.css:1075, stated in code and measured live
#FAF7F2. Michael, review 2026-08-03. Production ships #FDFBF7 and should migrate to the note value.
no gradient titles design notes
four-stop gradient on the hero display line, stated in source Hero.vue:46 — linear-gradient(135deg, #F5B731, #E8753A, #D4542B, #C0392B) with bg-clip-text
Gradient display is Leaf and Hanabira brand identity, prohibited for every other product. Michael, review 2026-08-03. Encoded as prohibition gradient-is-frontline-only.
#BE4A1F index.css --vp-button-brand-hover-bg
#D7662F ui.ts btnPrimary hover:bg-[#d7662f]
#D7662F. Michael, review 2026-08-03. The index.css token is stale.
no shadows anywhere (observed across all surfaces) live inspection
stated accent glow on the primary button: shadow-[0_16px_34px_-24px_rgba(232,117,58,0.8)] ui.ts btnPrimary
Conditional: the glow applies only where it fits the design and background in use. Michael, review 2026-08-03. No-shadows remains the default elsewhere.
#0A0A0A (neutral-950), the stated title colour ui.title, --home-fg
#3C3C43 on the shipped hero h1, inherited from the vitepress default --vp-c-text-1, which Leaf never overrode live inspection at 1280
Not the vitepress default. Use Tailwind neutrals or brand variables (neutral-950 per ui.title). Michael, review 2026-08-03 — production hero should be fixed.
// Still open
Recorded rather than guessed, and shipped into the rules files so a model asks instead of inventing. 11 further questions were raised and answered during review, and stay in the file as a record of how it was decided.
Four stated pairs now sit below AA (the 4.5:1 minimum for body text, 3:1 for large text): white-on-accent buttons 3.68:1, accent eyebrows 3.56:1 at 11px, code comments 2.31:1, and muted body text 4.44:1 on the newly decided #FAF7F2 paper. Which must be fixed and which are exempt as decorative?
Assumed meanwhile: Shipped as stated.
The Tailwind scale is real, but is an off-scale value a violation? Arbitrary values already appear for type sizes.
Assumed meanwhile: Not enforced.
ui.eyebrow tracks at 0.2em, ui.codeLabel at 0.08em, and one live instance measured 0.12em. One eyebrow with drift, or three intentional variants?
Assumed meanwhile: Two components, some drift.
Bricolage Grotesque for both display and body is measured everywhere but stated nowhere found. Intentional identity or interim?
Assumed meanwhile: Intentional.
// Provenance
Compiled 2026-08-03 at 1280, 900, 390 pixels wide. 1440 was not reachable (inspection pane clamps at 1280). 1280 is the site's last breakpoint (Tailwind xl), so every step of the type ramp and every grid collapse was still exercised. 390 and 900 measured directly.
docs/.vitepress/theme/components/Home/ui.tsdocs/.vitepress/theme/styles/home.cssdocs/.vitepress/theme/styles/index.cssdocs/.vitepress/theme/components/Home/Hero.vuehttps://v5-x.leafphp.devdesign notes, prior sessionDownload the file, run it in your repo, and your AI tools write in this language.
Apply design systempnpx kata apply ./leaf.kata.json · back to the registry