hanabira.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
The landing at hanabira.dev. Dark only — no light theme exists.
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.
#0C0C0D#000000#000000#0E0E10#131316#8A898C5.62:1 on page. Passes AA for body. This mid-grey is also the base colour of every heading, because the global * rule paints them. See unspecified/text-hierarchy-inversion.#C7CDE112.34:1. The 'secondary' colour is brighter and higher-contrast than 'primary'. The names run backwards relative to their jobs.#FFFFFF#222223rgba(199, 205, 225, .1)Second hairline token from the later era. Tilebeds use this; older components use --border-primary. Two hairlines, one job.#8B9CE07.38:1 on page, 7.00:1 on card. The --hana token is the accent. #5E79C7 remains recorded below as legacy.#C391D9the kanji slot in eyebrows, gradient mid-stop#4A4A52Fails: 2.23:1 on page. Below AA at any size. If the // prefix is content, it fails; if decorative, it should be marked aria-hidden and is not.#272D41A third line colour, drawn as a shadow rather than a border.#5E79C7Superseded. Live in the header SVG stroke; migrate to #8B9CE0.Applies to hanabira.dev/, hana/apps/landing/**
#242424Vite starter default, not a decision.rgba(255,255,255,.87)Same.greenThe nprogress bar ships with the CSS keyword green. Nothing about it belongs to any palette.This surface is scaffold boilerplate, recorded as found. It shares nothing with the landing: different font (Inter), different background, keyword colours. See unspecified/app-surface-exists.
Applies to hana/apps/example/**
Deliberately empty. This theme belongs to the Leaf docs, not to Hanabira. Harvesting from it would import a third system's values.
Applies to hana/apps/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.
96pxContradiction recorded: hero-display-sizeclamp(52px, 7vw, 92px)82px52pxclamp(34px, 4vw, 52px)Two clamps for the same role, 52 vs 56 max. Drift, not intent, most likely — but that is a guess and it is not encoded.24px16pxSpace
A scale that is not enforced is a habit rather than a rule, and the file says which this is.
No scale exists, and per review 2026-08-03 that is intentional — spacing is reviewed by eye. Shipped paddings sampled: 10, 12, 16, 20, 24, 34, 40, 44, 48, 50, 60, 70, 80, 85, 100, 140. enforce stays false.
Composition
Breakpoints, grid relationships and alignment. This is where the correction effort goes, and where a token file tells you nothing.
738px720px50em (800px)pxpxPatterns
The second half is the one that matters. A component list says what exists; only the refusals say what to reach for.
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.
h1: 96px fixed global.css
.hero-title: clamp(52px, 7vw, 92px), which wins in the cascade and renders 92px at 1440 index.astro:313, measured live
Nothing yet. The compiler will not pick.
#5E79C7 (--accent, original block; also hardcoded as an SVG stroke in Header.astro) global.css, Header.astro
#8B9CE0 (--hana, Hana-edition block; eyebrows and markers) global.css
#8B9CE0. Michael, review 2026-08-03. --accent #5E79C7 is legacy and should migrate, including the hardcoded header SVG stroke.
pre { border-radius: 14px } global.css:106, original block
pre { border-radius: 0 } plus the squared-corners intent comment global.css:169, Hana-edition block
Nothing yet. The compiler will not pick.
#222223 (--border-primary) and rgba(199,205,225,.1) (--line) global.css, both stated
#272D41 drawn as a box-shadow on the footer Footer.astro:22
Nothing yet. The compiler will not pick.
Still open
Recorded rather than guessed, and shipped into the rules files so a model asks instead of inventing. 4 further questions were raised and answered during review, and stay in the file as a record of how it was decided.
720, 738 and 800 all govern mobile behaviour on one page. One breakpoint with drift, or three decisions?
Assumed meanwhile: Drift.
The example app is unstyled Vite boilerplate. Does a designed app surface exist anywhere, or is the landing the only designed surface?
Assumed meanwhile: Landing only.
The // prefix sits at 2.23:1. If it is content it fails AA; if it is decorative it needs aria-hidden, which it lacks. Which is it?
Assumed meanwhile: Decorative, unmarked.
Card orbs take raw hexes per instance (#DB1010, #591040, ...). Intentional per-card hues, or token debt?
Assumed meanwhile: Intentional content, off-token.
clamp(34px,4vw,52px) and clamp(34px,4vw,56px) both style section titles in the same file. Which is canonical?
Assumed meanwhile: Drift.
textSecondary is brighter and higher-contrast than textPrimary. The hierarchy is intentional in effect, but the names run backwards. Rename, or keep?
Assumed meanwhile: Kept as shipped.
Provenance
Compiled 2026-08-03 at 1440, 900, 390 pixels wide. Compiled from shipped source plus a live run of the landing. Nothing was written down before it was built, so the open list is dominated by intent questions no scrape can answer. No overflow at any inspected width.
hana/apps/landing/src/styles/global.csshana/apps/landing/src/components/*.astrohana/apps/landing/src/pages/index.astrohttp://localhost:4321 (astro dev)hana/apps/example/src/styles/index.cssDownload the file, run it in your repo, and your AI tools write in this language.
Apply design systempnpx kata apply ./hanabira.kata.json · back to the registry