/* ==========================================================================
 * 稽古 THE CURATED COURSE — the lesson surface (demo: lesson 8)
 *
 * The app's own dress, nothing minted: paper/ink/indigo/kintsugi from
 * tokens.css, Klee One for Japanese and Inter for the chrome, cards that rest
 * rather than float, ONE accent for the thing under the cursor, and gold
 * reserved for a single case — a miss that came back and was answered.
 *
 * ⛔ It does NOT borrow the walk's .kw-* rules: --sh / --kw-paper /
 * --kw-card-w are declared on #keikoWalk alone, so a .kw-card mounted
 * anywhere else renders with a default width and grey (not sumi) shadows —
 * and naming this root #keikoWalk would opt it into furigana.js's
 * leanFromPeek, which WRITES kanjiLeanLedgerV1 on every ruby peek.
 * ==========================================================================*/

#kotobaLesson {
    /* ⭐ ROUND 2 (L10 / gap-4, 2026-09-10): ONE UNIT, LESSON-SCOPED. The room
       breathed with the monitor only in its Japanese steps; the column, the
       plate, the English and the airs stayed a fixed 720px strip at 16px on a
       2560 glass. rem cannot carry the breath (it reads <html>, which the
       sheet must not touch under the app), so the lesson declares its own
       unit — 16px up to 1600 wide, ~17 at 1920, 19 at 2500 and beyond — and
       every token that carries the room's proportion is a multiple of it: the
       column, the gutter, the airs, the origins, the glass cap, the ten type
       steps. Ordinary rem paddings, gaps and seats stay in rem. */
    --cl-u: clamp(16px, 10.67px + 0.333vw, 19px);
    /* the lesson's own light — the room paper, one shade warmer than the wall */
    --cl-paper: #F3F0EA;
    --cl-sheet: #FBF8F2;
    /* ⭐ ROUND 2 (CT-4): THE ENGLISH IS WARM INK. The app's neutral #2C2C2C was
       the one cold colour on a warm page (JP brown beside it, stone chrome,
       cream paper); the kanji drawer already reads the slip's warm sumi, and
       the lesson joins it — 10.5:1 on paper, 11.3:1 on the sheet. The triple
       beside it is for a dimmed word (a paler ink, never a browner one). */
    --cl-ink: var(--slip-ink, #3A3633);
    --cl-ink-rgb: 58, 54, 51;
    /* the ink of a day already lived: last week's kana under today's kanji, and
       lesson 7's leaf in the warm-up. ONE past ink, spent twice, declared once.
       ⛔ It is the app's warm-stone secondary, NOT a lighter grey: the warm-up
       asks the reader to press what they can no longer read, so this is a
       legibility floor and never an amount of fade. */
    --cl-ink-past: #57534E;
    /* ⭐ S5: THE PAGE HAS TWO AIRS. Inside a tier blocks step by --cl-air-in;
       between tiers the paper opens by --cl-air-between (and --cl-air-close
       before the teacher's closing sentence). The character page had six gaps
       within 0.6rem of each other, so nothing on it was grouped; no block on
       the page may invent a third value. */
    --cl-air-in: calc(1.2 * var(--cl-u));
    --cl-air-close: calc(2.4 * var(--cl-u));
    --cl-air-between: calc(2.8 * var(--cl-u));
    --cl-quiet: var(--color-faint-warm, #6E6860);
    /* ⭐ ROUND 2 (CR-7): ONE FOCUS RING, SOLID INDIGO. Thirty rings at .4-.55
       alpha composited to 1.9-2.5:1 on the paper — invisible to the hand that
       needs them. The ring gains ink, not a hue: the app's own solid ring. */
    --cl-ring: 2px solid var(--cl-accent);
    --cl-ring-off: 3px;
    --cl-rule: var(--color-divider, #D8D2C8);
    --cl-accent: var(--color-accent, #3D5A80);
    --cl-gold: var(--color-gold, #C9A96E);
    /* ⭐ THE TWO ANSWERS, AND THEY ARE THE APP'S OWN COLOURS. Moss is what the
       rail already dots a settled word with — the house mark for "known" — and
       gold is the kintsugi the design system reserves for a repair. A row is
       right in moss or mended in gold; there is no red in this book. Declared
       as triples so a wash and an ink can come from one colour. */
    --cl-moss: 122, 132, 96;
    --cl-mend: 176, 138, 82;
    /* ⭐ S1: THE VERDICT IS INK ALONE NOW (no wash under a seat), so the ink
       has to carry it on its own — and ⭐ ROUND 2 (CT-3) deepened both: the
       old moss (98,108,72) sat at dE 22 from the JP brown and the old mend
       (138,102,50) shared the brown's hue exactly, so the one colour that
       changes with the learner's answer read as the headword's own ink.
       Moss #4A6B3A: 5.3:1 on paper, 5.7:1 on the sheet, dE 30 from the
       brown, still a house moss and never a signal green. Mend #8F6512:
       4.6:1 / 4.9:1, dE 32, below the seal's chroma (the one loud mark).
       The wash triples above stay for FILLS only. */
    --cl-moss-ink: 74, 107, 58;
    --cl-mend-ink: 143, 101, 18;
    /* the hanko's own vermilion, and it is the SEAL'S — declared on the room
       because the seal is pressed at the close and kept by the book, and a
       colour scoped to one of those two surfaces leaves the other's rim and
       glyph falling back to black ink the moment the seal is hung elsewhere */
    --cl-hanko: 181, 73, 58;
    --cl-sh: 67, 50, 30;                     /* every shadow cast in sumi-brown */
    /* ⭐ S10: ONE DOT for "not yet". The rail's unmet word and the street's
       place not yet found are the same device, so both read from one token
       and can never drift apart. */
    --cl-dot: 4px;
    --cl-dot-ink: rgba(110, 104, 96, 0.3);
    --cl-col-max: calc(45 * var(--cl-u));          /* 720 at ≤1600, 768 at 1920, 855 at 2560 */
    --cl-col: min(var(--cl-col-max), 100% - 3rem);
    /* the air between the column's right edge and anything standing beside
       it (the words rail). ONE gutter, read where the rail is placed. */
    --cl-gutter: calc(4 * var(--cl-u));
    /* ⭐ S1: THE PLATE. Every painting inside a card hangs as ONE plate — the
       column's width, the door's hairline, whole at 3:2, never a cover crop.
       ⛔ NOT the door's 1100px: the rail's seat is one gutter off the column,
       and a plate that runs 48px past the column's edge to meet it is a
       misalignment, not a plate. ⛔ And never a HEIGHT-BUDGETED width either:
       a plate 48px SHORT of the column reads the same way (measured at
       1680×1050: a 46vh budget hung 672px in a 720px column). The plate is
       the column; a short glass steps it down to the old 34em vignette in
       ONE step, by breakpoint (below), so it is always one of two widths
       and never a near-miss of either. ⛔ 100% of the STATION, never
       var(--cl-col): that token's "100% - 3rem" is written against the
       room, and read inside the column it comes out 48px short (672 in
       720 — measured). */
    --cl-plate-w: 100%;

    /* ── the type scale ──────────────────────────────────────────────────
       Ten steps and nothing between them. Japanese runs on k1–k6 (Klee),
       the chrome's English on e1–e4 (Inter), and every font-size in this
       sheet is one of the ten — a new size is a new step, argued for, not
       a number typed at a rule. The sheet held forty-seven of them.
       ⛔ K6 IS THE FLOOR FOR JAPANESE. Only furigana riding under a k2-or-
       larger glyph goes below it, and never under 0.75rem: Japanese set
       smaller than the English beside it is a page that does not mean what
       it says about which language is being read. */
    /* ⭐ THE JAPANESE STEPS BREATHE WITH THE GLASS (density wave
       2026-08-29): a bigger screen shows bigger writing, never more
       emptiness. Same ten steps, same law — each JP step now carries a
       vh slope so the scale is set to the room it is read in. ⛔ The
       English steps do not grow: the glass's gift goes to the Japanese. */
    /* ⭐ ROUND 2 (L10): the steps ride the lesson UNIT now — one mechanism,
       never two compounding (a vh slope on top of a width unit reached 90px
       at 2560). The vh slopes of the 2026-08-29 wave are flattened to their
       midpoints; the hero glyph alone keeps a height budget so the character
       page's one glyph grows with a tall glass. */
    --k1: clamp(9rem, 16vh, 13rem);                  /* the character page's hero glyph, and nowhere else */
    --k2: calc(4.4 * var(--cl-u));                   /* a word's head; the kanji home's glyph */
    --k3: calc(2.9 * var(--cl-u));                   /* the glyph rows: parts, lookalikes, second sounds, tomorrow */
    --k4: calc(2.05 * var(--cl-u));                  /* what is ASKED or ANSWERED: ask lines, tiles, the settle */
    --k5: calc(1.6 * var(--cl-u));                   /* what is READ: passage lines, quoted sentences */
    --k6: calc(1.125 * var(--cl-u));                 /* readings, rail rows — the floor */
    --e1: calc(1.5 * var(--cl-u));                   /* the one English line that leads a page */
    --e2: calc(1 * var(--cl-u));                     /* the chrome talking: asks, labels, translations */
    --e3: calc(0.8125 * var(--cl-u));                /* glosses, translations, notes, feet */
    --e4: calc(0.6875 * var(--cl-u));                /* the micro-labels — and ONE tracking for all of them */
    /* ⭐ ROUND 2 (CT-1): THE TEACHER'S PROSE HAS A FACE OF ITS OWN. Every
       English line was Inter, so the machine's ask, the pressed option and
       the teacher's reply read as one paragraph. The AUTHORED prose — the
       lines that come from a lesson-JSON *_en field the teacher wrote — is
       set in Literata (the fallbacks are real book faces, never a sans);
       every chrome string, machine verdict, data seat, hand, rail, spine and
       translation stays Inter. The boundary is an explicit class list (below,
       "the teacher's cut"), never mixed(). Never italic. */
    --cl-font-tell: 'Literata', 'Literata Fallback', 'Iowan Old Style', 'Palatino Linotype', Palatino, Georgia, 'Noto Serif JP', serif;
    --e2-tell: calc(1.0625 * var(--cl-u));
    --e4-track: 0.12em;
    /* S1: and ONE case. Tracked lowercase read as a spec sheet; the rest of
       the app tracks its micro-labels in uppercase (.wp-verb .cap). */
    --e4-case: uppercase;

    /* ── the motion clocks (motion doctrine, 2026-08-30) ─────────────────
       ⭐ TWO CURVES, AND THEY ARE NOT INTERCHANGEABLE. --ease-brush and
       --ease-settle are both expo-out: they put ~47% of the distance into
       the first two frames. That is right for INK, which should appear
       decisively and then settle — and it is exactly what "jaggered" means
       when it is asked to carry 90-190px of GEOMETRY. Geometry gets its own
       symmetric curve; ink keeps the house's. ⛔ Never --ease-brush on
       height / max-height / width / margin / padding / transform. */
    --cl-ease-move: cubic-bezier(0.4, 0, 0.2, 1);
    /* ⛔ THE CLOCKS ARE --cl-t-*, NEVER A COLOUR'S NAME. This block once
       declared the 320ms clock under the colour's own name (--cl-ink, :20),
       and the later declaration won: forty colour rules fell through to the
       UA's black and every English paragraph printed pure rgb(0,0,0). A
       custom property is declared ONCE in #kotobaLesson (pinned by
       tests/course/css_tokens_test.js). */
    --cl-t-ink: 320ms;       /* ink arriving on a seat that was already there */
    --cl-t-ink-quick: 160ms; /* a control answering a press */
    --cl-t-ink-long: 520ms;  /* a painting, a glyph, a whole told body */
    --cl-fold: 260ms;        /* the ONE geometry clock, tail of the sheet only */
    --cl-turn: 260ms;        /* the page arriving */
    --cl-turn-out: 90ms;     /* S9: inside a meeting, the sheet leaving before the wipe */
    --cl-ink-step: 120ms;    /* S9: one ink after another — a record's lines, a told body's tiers */

    /* ── two vertical origins ────────────────────────────────────────────
       A page begins where a page begins. A screen that asks ONE thing
       begins about a quarter of the way down, which is where the eye
       lands first — and the seat DEEPENS with the glass (owner #77: on a
       tall screen the one block on the page hugged the top edge while
       three quarters of the room stood empty). Two numbers, so no
       station can invent a third. */
    --cl-origin-page: calc(2 * var(--cl-u));
    /* ⭐ ROUND 2 (2026-09-09): THE GLASS. The sheet of glass a station is laid on is the
       glass minus the corner chrome and the stage's bottom air — capped at
       52rem, so the floor stops rising with the monitor (at 2560×1440 the
       hands sat 1350px down, a screen-height under the last line). Every
       floor in this file reads it; nothing measures the glass twice. */
    --cl-glass: min(calc(100vh - var(--cl-chrome-h, 4.6rem) - 2.6rem), calc(52 * var(--cl-u)));
    /* ⛔ the ask origin is a quarter of the GLASS SHEET, not of the raw viewport: at 24vh
       flat a set item's rack ran 40-50px past a 900px laptop glass with no
       scrollbar to say so, and at 1440p the block floated at 353 under a 1350
       floor. 38rem = the tallest set item with its seat, measured. */
    --cl-origin-ask: clamp(1.5rem, min(24vh, calc(var(--cl-glass) - 38rem)), 15rem);
    /* the slack a told page's hand may hang under its last line before the
       floor takes over: 2.4rem of foot air + this. On a short page (a pair, a
       beat, a bare example) the hand rests ~14rem under the reading instead
       of on the glass floor 600px away — the owner's "buttons too low". */
    --cl-tether: 11.6rem;

    position: fixed;
    inset: 0;
    z-index: 9400;                            /* under the hall (9500), over the rooms */
    overflow-y: auto;
    overflow-x: hidden;
    /* ⛔ AND THE SPINE SURVIVES A LONG PAGE. The passage is the one station
       taller than the glass, so it was the one station that grew a scrollbar
       — and the centred column then slid half a scrollbar left of every other
       screen in the lesson. The gutter is reserved on all of them, so the
       margin the eye has been reading down all evening does not move under a
       page just because that page is long. (Overlay scrollbars reserve
       nothing, so on a Mac this changes not one pixel of anything.) */
    scrollbar-gutter: stable;
    background: var(--cl-paper);
    color: var(--cl-ink);
    font-family: var(--font-ui, 'Inter', system-ui, sans-serif);
    -webkit-font-smoothing: antialiased;
}
body.course-lesson-open { overflow: hidden; }

/* ⛔ components.css:378 gives EVERY <button> `background: white` and a raised
   shadow, and button:hover a bigger one (0-1-1 beats a plain class). A flat
   mark like 一週間前 or the quiet Stop here therefore wore a white pill nobody
   asked for. Answer it once, here, for the flat hands only — the tiles, the
   next buttons and the listen disc cast their own sumi shadow. */
#kotobaLesson .cl-quiet,
#kotobaLesson .cl-leave,
#kotobaLesson .cl-weekago,
#kotobaLesson .cl-rcw,
#kotobaLesson .cl-signoff-jp,
#kotobaLesson .cl-kh-back,
#kotobaLesson .cl-kh-more,
#kotobaLesson .cl-sound,
#kotobaLesson .cl-draw,
#kotobaLesson .cl-wk-word,
#kotobaLesson .cl-night-jp,
#kotobaLesson .cl-scene-w,
#kotobaLesson .cl-draw:hover,
#kotobaLesson .cl-sound:hover,
#kotobaLesson .cl-quiet:hover,
#kotobaLesson .cl-leave:hover,
#kotobaLesson .cl-weekago:hover,
#kotobaLesson .cl-rcw:hover,
#kotobaLesson .cl-signoff-jp:hover,
#kotobaLesson .cl-wk-word:hover,
#kotobaLesson .cl-night-jp:hover,
#kotobaLesson .cl-scene-w:hover,
#kotobaLesson .cl-kh-back:hover,
#kotobaLesson .cl-kh-more:hover { box-shadow: none; background: none; }

#kotobaLesson [lang="ja"],
#kotobaLesson .cl-word,
#kotobaLesson .cl-page,
#kotobaLesson .cl-tile--kanji { font-family: var(--font-jp, 'Klee One', 'Noto Sans JP', serif); }

/* ── the standing mark: lesson, title, the way out ───────────────────────── */
.cl-topmark {
    position: sticky;
    top: 0;
    z-index: 3;
    display: flex;
    align-items: flex-start;
    gap: 0.7rem;
    padding: 1.1rem clamp(1rem, 4vw, 2.4rem) 0.9rem;
    /* ROUND 2 (CR-8): paper under the whole spine — the fade lives in the box's own bottom padding */
    background: linear-gradient(var(--cl-paper) calc(100% - 0.9rem), rgba(243, 240, 234, 0));
}
/* ⭐ THE TAG OWNS THE CORNER. One small grey line was the only thing on every
   screen saying WHICH DAY this is, and it was quieter than the ✕ beside it.
   Two lines: the day's name in Japanese with its number in front, the plain
   English echo beneath. Chrome still — it must never compete with the station
   it stands over — but chrome that can be read. */
.cl-mark { display: flex; flex-direction: column; gap: 0.1rem; line-height: 1.25; }
.cl-mark-line { display: flex; align-items: baseline; gap: 0.55rem; flex-wrap: wrap; }
.cl-mark-line .cl-mark-en { margin-left: 0.2rem; }
.cl-mark-n {
    font-size: var(--e4);
    letter-spacing: var(--e4-track);
    text-transform: var(--e4-case);
    color: var(--cl-quiet);
    font-variant-numeric: tabular-nums;
}
.cl-mark-title { font-size: var(--k5); color: var(--color-jp-text, #523E1E); }
.cl-mark-en { font-size: var(--e3); color: var(--cl-quiet); }
/* IMM-1 (round 2, a TRY — contested): where in the evening, whispered after
   the running head on screens that carry an authored place */
.cl-mark-place { color: var(--cl-quiet); }
.cl-mark-place[hidden] { display: none; }
/* on the door the day's name is already standing on the painting at full size,
   and printing it twice on one screen is the surface talking to itself.
   ⛔ THE SAME YIELD ON EVERY PAGE SCREEN: the leaf carries a dateline now, and
   on the warm-up the corner was worse than redundant — it printed TODAY's day
   over MONDAY's page. The corner keeps the lesson number and the way out. */
#kotobaLesson[data-screen="door"] .cl-mark-title,
#kotobaLesson[data-screen="door"] .cl-mark-en,
#kotobaLesson[data-screen="warmup"] .cl-mark-title,
#kotobaLesson[data-screen="warmup"] .cl-mark-en,
#kotobaLesson[data-screen="page"] .cl-mark-title,
#kotobaLesson[data-screen="page"] .cl-mark-en,
#kotobaLesson[data-screen="reread"] .cl-mark-title,
#kotobaLesson[data-screen="reread"] .cl-mark-en { display: none; }
/* and on the door the NUMBER stands down too — the 扉 head prints "Lesson 8"
   on the leaf itself, and a day is never numbered twice on one screen */
#kotobaLesson[data-screen="door"] .cl-mark-n { display: none; }
.cl-leave {
    margin-left: auto;
    border: 0;
    background: none;
    color: var(--cl-quiet);
    font-size: var(--e2);
    line-height: 1;
    padding: 0.4rem 0.5rem;
    cursor: pointer;
    border-radius: var(--radius-sm, 4px);
    transition: color var(--duration-fast, .15s) var(--ease-settle, ease);
}
/* ⭐ S8: THE WAY OUT SAYS WHERE YOU LAND. "Your place is kept." stands to the
   left of ✕ with its width reserved and wakes in INK alone — on the mark's
   hover, on the keyboard's focus, and on Escape's first press (the room's
   .cl-leave-asked). A hover reveal changes ink, never geometry: the seat is
   there at rest, invisible, so nothing moves when the promise appears. */
.cl-leave-note {
    margin-left: 0;
    align-self: center;
    font-size: var(--e3);
    color: var(--cl-quiet);
    white-space: nowrap;
    visibility: hidden;
    padding-right: 0.15rem;
}
.cl-leave-note + .cl-leave { margin-left: 0; }
.cl-topmark:has(.cl-leave:hover) .cl-leave-note,
.cl-topmark:has(.cl-leave:focus-visible) .cl-leave-note,
#kotobaLesson.cl-leave-asked .cl-leave-note { visibility: visible; }
.cl-leave:hover { color: var(--cl-accent); }
/* ⭐ S8: THE SPINE — the chapter's stations under the corner mark, three inks.
   Passed in past ink, the one the FRONTIER stands in inked (its Japanese in
   the JP brown), the ones to come quiet; a 3px dot between. No number, no
   fill: a row of names is a place, not a meter.
   ⭐ ROUND 2 (nav-C2): the frontier is the axis and the cursor is a mark — the
   station the cursor stands in carries the one hairline underline, so after a
   Back the row still says where the walk has got to. The "coming" ink moves
   from the rule colour (1.32:1, illegible) to --cl-quiet (4.8:1).
   ⭐ (nav-C1): ONE DOOR — a passed 言葉 is a button back to the first word,
   in the file's door grammar (rest in past ink, hover indigo with one
   underline under the Japanese, the shared focus ring); every other station
   stays text and promises nothing it lacks. */
.cl-spine {
    list-style: none;
    margin: 0.4rem 0 0;
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    row-gap: 0.15rem;
    font-size: var(--e3);
    line-height: 1.4;
    letter-spacing: 0.01em;
}
.cl-spine[hidden] { display: none; }   /* the [hidden] reset law: an author display owes its own */
.cl-sp {
    display: inline-flex;
    align-items: baseline;
    gap: 0.35em;
    white-space: nowrap;
    color: var(--cl-rule);
}
.cl-sp [lang="ja"] { font-family: var(--font-jp, 'Klee One', serif); font-size: 0.9375rem; letter-spacing: 0.06em; }
.cl-sp i { font-style: normal; }
.cl-sp + .cl-sp::before {
    content: '';
    display: inline-block;
    width: 3px;
    height: 3px;
    border-radius: 50%;
    background: var(--cl-rule);
    margin: 0 0.65rem;
    align-self: center;
}
.cl-sp--past { color: var(--cl-ink-past); }
.cl-sp--now { color: var(--cl-ink); }
.cl-sp--now [lang="ja"] { color: var(--color-jp-text, #523E1E); }
.cl-sp--here [lang="ja"] {
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 0.22em;
    text-decoration-color: currentColor;
}
.cl-sp--next { color: var(--cl-quiet); }
.cl-sp-door {
    display: inline-flex;
    align-items: baseline;
    gap: 0.35em;
    border: 0;
    background: none;
    padding: 0;
    margin: 0;
    font: inherit;
    letter-spacing: inherit;
    color: inherit;
    cursor: pointer;
    transition: color var(--duration-fast, .15s) var(--ease-settle, ease);
}
.cl-sp-door:hover { color: var(--cl-accent); }
.cl-sp-door:hover [lang="ja"] {
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 0.22em;
    text-decoration-color: currentColor;
}
.cl-sp-door:focus-visible { outline: var(--cl-ring); outline-offset: 2px; }
.cl-sp-door:disabled { cursor: default; color: inherit; }
.cl-sp-door:disabled [lang="ja"] { text-decoration: none; }
/* ⭐ S8: BACK AT THE LEFT OF EVERY FOOT. The quiet duet (戻る Back), and the
   way on keeps its seat at the right: the foot stays flex-end and Back alone
   pushes itself to the far edge. Disabled, never gone, while a hand holds
   tiles — the seat stays, the ink pales, Backspace gives the tiles back. */
.cl-prev { margin-right: auto; }
/* ⭐ ROUND 2 (nav-C4): Back names its landing after a middle dot, in the
   quiet English it already wears — 戻る Back · 手 the word */
.cl-prev-to { font-size: var(--e3); color: var(--cl-quiet); display: inline-flex; gap: 0.35em; align-items: baseline; }
.cl-prev-to [lang="ja"] { font-family: var(--font-jp, 'Klee One', serif); }
.cl-prev:hover .cl-prev-to { color: var(--cl-accent); }
.cl-prev:disabled .cl-prev-to { color: var(--cl-rule); }
/* ⭐ ROUND 2 (nav-C3): しおり — the way back to where I was, one quiet hand
   immediately left of 次へ while the cursor stands behind the frontier */
.cl-bookmark { margin-right: 0.9rem; }
.cl-bookmark:disabled, .cl-bookmark:disabled:hover { color: var(--cl-rule); cursor: default; border-bottom-color: transparent; }
.cl-prev:disabled,
.cl-prev:disabled:hover { color: var(--cl-rule); cursor: default; border-bottom-color: transparent; }
/* ⭐ S8: START AGAIN, OFF THE CORNER. On the door's own row (a chapter
   part-way) and at the close's foot, in the quiet dress; the press turns it
   in place into one sentence and two hands, いいえ under the hand. */
/* at the close's foot the two quiet hands stand TOGETHER at the left, and
   the goodbye alone at the right: an erase seated beside the exit is the
   trap S8 moved はじめから out of the corner to escape */
.cl-close .cl-foot .cl-prev { margin-right: 0; }
.cl-close .cl-foot .cl-again { margin-right: auto; }
.cl-againrow { margin-top: 1.2rem; }
.cl-again[hidden] { display: none; }   /* the confirm stands in its place */
.cl-again-ask { display: inline-flex; align-items: baseline; gap: 1.1rem; flex-wrap: wrap; }
.cl-again-q { font-size: var(--e2); color: var(--cl-ink); }
.cl-leave:focus-visible { outline: var(--cl-ring); outline-offset: 2px; }

/* ── the stage ───────────────────────────────────────────────────────────── */
/* ⛔ THE STAGE ITSELF HOLDS NO ORIGIN. Its own padding-top would be a third
   number under the two tokens — every station declares which origin it reads
   on, and that number is the whole distance from the top of the stage. */
.cl-stage {
    width: var(--cl-col);
    margin: 0 auto;
    /* the air under the way on: the same 2.6rem at the end of a long page as
       under a page that fits (the seat law below reads this number) */
    padding: 0 0 2.6rem;
    opacity: 0;
    /* ⛔ NO TRAVEL ON A PAGE TURN. 4px of rise on ~60 turns a lesson is text
       moving while it is arriving, which is the one thing this surface may not
       do — and it bought nothing a fade does not. The cut out is honest (JS
       kills the transition while the stage is wiped), the arrival is 260ms. */
    transition: opacity var(--cl-turn) var(--ease-brush, ease);
}
.cl-stage.cl-in { opacity: 1; }
/* a pointer turn seats the hand on the stage itself (focusFirst): no ring
   on a container nobody pressed — a real Tab lands on a real control */
.cl-stage:focus, .cl-stage:focus-visible { outline: none; }
/* the wipe itself: no clock, so the outgoing page is gone before the new one
   begins — a cut, not a 33%-opacity flicker (--ease-brush front-loads) */
.cl-stage.cl-cut { transition: none; }
/* ⭐ S9: INSIDE A MEETING THE SHEET TURNS. A 90ms out before the wipe and the
   260ms arrival read as one page turning where a hard cut read as the card
   being replaced (JS adds it on turn(); render() takes it off with the cut). */
.cl-stage.cl-in.cl-out { opacity: 0; transition: opacity var(--cl-turn-out) var(--ease-settle, ease); }
/* ⭐⭐ S1: THE WAY ON HAS ONE SEAT. Measured across one lesson: ten heights and
   three x positions (the column's edge, the set's 34em edge, the street's
   plate). Rule: x = the column's right edge on every station; y = the bottom
   of the glass on any station that fits, else the end of the content. The
   station is the positioned box and reserves the seat's height at its foot;
   min-height is the glass minus the corner chrome (measured by the runner
   into --cl-chrome-h) minus the stage's own bottom air, so a page that fits
   puts the seat on the glass floor and a page that scrolls puts it after its
   last line. ⛔ WORK buttons are not the way on and keep their row: 答える
   under its rack, the seam's fork under its line, the door's greeting under
   the day's line. ⛔ Three stations keep their own foot: the street's plate
   IS its column (the foot rides the plate's right edge), the close is a long
   receipt whose door out follows its last section, and the door has no way
   on at all — its greeting is the door. */
/* ⭐ ROUND 2 (2026-09-09): TWO SEATS, ONE X. The owner read S1's floor as
   "buttons too low" and "75% of the page empty": a pair page ended a third of
   the way down and its hands sat on the glass floor 650px below. The y half of
   the law now has two cases and the x half is untouched. An ASK (the meet ask,
   a set item, a check) keeps the floor: Back stands in its foot while the
   paper is still changing, and a hand that moved at the verdict would break
   "the verdict belongs to the question". A TOLD page (the character page once
   told, the word, the example, the pair, a beat) is TETHERED: the runner
   measures the page (seatFloor) and sets its min-height to the content plus
   --cl-tether, never past the sheet — so the hand rests under the reading on
   a short page and on the floor on a page that fills the glass. */
.cl-stage > section:not(.cl-door):not(.cl-pano):not(.cl-close):not(.cl-night):not(.cl-fail) {
    position: relative;
    min-height: var(--cl-glass);
    padding-bottom: 5.4rem;               /* the seat: the hand's height + its 2.4rem of air */
}
/* a station whose foot is a WORK fork (the seam's 続ける / ここまで) is not
   absolutely seated, so the 5.4rem seat under it was a phantom tail: the
   rest scrolled by 45px on every glass with nothing to scroll to */
.cl-stage > .cl-seam { padding-bottom: 0; }
/* ⛔ THE OVERHANG GUARD. A page either fits or overhangs by at least 8rem:
   when a station ran past the glass by less than the hand's own height the
   cut line fell mid-button (the word page with its plate at 1080, by 22-49px)
   and no scrollbar said so. The runner measures after every seat and, on a
   short overhang, gives the page enough tail that the cut lands in the paper
   under the hand — an honest cue — never through the hand. */
.cl-stage > section.cl-overhang { padding-bottom: 13.4rem; }
.cl-stage > section:not(.cl-door):not(.cl-pano):not(.cl-close):not(.cl-night):not(.cl-fail) .cl-foot--turn,
.cl-stage > section:not(.cl-door):not(.cl-pano):not(.cl-close):not(.cl-night):not(.cl-fail) .cl-foot--held {
    position: absolute;
    left: 0;                              /* S8: the foot spans the column — Back at its left, the way on at its right */
    right: 0;
    bottom: 0;
    margin-top: 0;
}

/* ⛔ A THING THAT HAS NOT ARRIVED HOLDS NO SEAT. [hidden] is display:none from
   the UA sheet and an author `display` outranks it — .cl-foot is flex, .cl-pale
   is flex, .cl-pano-found is flex — so the room says it once, above every class
   inside it, and nothing waiting is in the layout. */
#kotobaLesson [hidden] { display: none; }
/* ⭐⭐ AND THE OTHER HALF OF THAT LAW: A THING THAT WILL ARRIVE HERE HOLDS ITS
   SEAT FROM MOUNT. [hidden] is for what belongs to another page; [data-veil]
   is for what belongs to THIS one and has not been said yet. The seat is laid
   at mount, at its true height, and arrival is ink alone — which is the only
   way an answer can land while the learner is reading and move nothing.
   visibility (never opacity) so the unsaid is out of the a11y tree, out of a
   selection, and out of the tab order until it has been said. */
#kotobaLesson [data-veil] { visibility: hidden; }
/* ⛔ MARGINS MUST NOT COLLAPSE OUT OF A BOX WHOSE CHILDREN COME AND GO. A
   spent rack removed at the end of its fold turned .cl-built's 2.1rem bottom
   margin into the parent's last margin — 34px closing in ONE frame, 420ms
   after the answer, with the learner's hand already on 次へ (measured on 13 of
   14 answer transitions). flow-root pins the box: nothing collapses through
   it, so a removal inside it can never change its height. */
.cl-hand, .cl-handwrap, .cl-item, .cl-landing { display: flow-root; }
/* and when it does arrive it arrives the way everything on this surface does:
   the close's staged beats and the panorama's hand-over share the one idiom */
.cl-arrive { animation: cl-unfold 520ms var(--ease-brush, ease) both; }

.cl-eyebrow {
    font-size: var(--e3);
    letter-spacing: 0.06em;
    color: var(--cl-quiet);
    margin: 0 0 1.4rem;
}

/* ⭐⭐ THE INK LAW. Japanese set inside a line of teacher's English used to be
   the smallest-feeling thing in the sentence: English is effortless and
   Japanese is work, so at the same measured size the JP reads smaller than the
   words around it — and anything introduced mid-sentence that way inherits
   footnote status however important it is. 出口 and 気をつけて are ENCOUNTERS,
   not citations. In its own sentence, Japanese is the senior ink: a size step
   up, the Klee face, and full sumi even where the sentence around it is quiet.
   ⛔ ONE CLASS, MINTED AT THE SEAM (js: mixed()). The old law was a
   hand-maintained list of two dozen prose selectors, so every renderer added
   since had to remember to join it — and the ones that forgot were exactly the
   lines nobody re-read. mixed() is the only door Japanese uses to get into an
   English sentence, so the class it mints is the only place the law has to be.
   ⛔ AND THE LEADING IS GUARDED. A 1.18em run inside a 1.7 line would push its
   own line box taller than its neighbours and rag the paragraph; line-height:1
   on the span keeps every line of the paragraph on the paragraph's own rhythm. */
#kotobaLesson .cl-jp {
    font-family: var(--font-jp, 'Klee One', 'Noto Sans JP', serif);
    font-size: 1.18em;
    line-height: 1;
    color: var(--cl-ink);
}

/* ── 0 · the wake: two words held, before the walk is picked up ──────────── */
/* One line and two words on an otherwise empty sheet. Nothing is asked and
   nothing is scored here — the whole screen is a hand offered at the top of
   the stairs, so it stays as quiet as the paper it is printed on. */
.cl-wake { padding-top: var(--cl-origin-page); }
.cl-wake-line {
    font-size: var(--e2);
    line-height: 1.75;
    color: var(--cl-ink);
    margin: 0 0 2.4rem;
    max-width: 34em;
}
.cl-wake-words {
    list-style: none;
    display: flex;
    flex-wrap: wrap;
    gap: 1.6rem 3rem;
    margin: 0 0 1rem;
    padding: 0;
}
.cl-wk-word {
    border: 0;
    padding: 0.2rem 0.1rem;
    font: inherit;
    text-align: left;
    cursor: pointer;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 0.4rem;
}
.cl-wk-k {
    font-size: var(--k3);
    line-height: 1.15;
    color: var(--color-jp-text, #523E1E);
    transition: color var(--duration-fast, .15s) var(--ease-settle, ease);
}
/* the rest of the veil dress is shared with the meet, above — the only thing
   this hand adds is ink under the cursor, and never a millimetre of movement */
.cl-wk-word:hover .cl-wk-k { color: var(--cl-accent); }
.cl-wk-word:focus-visible { outline: var(--cl-ring); outline-offset: 3px; }

/* ── 1 · the door ────────────────────────────────────────────────────────── */
/* ⭐ THE DOOR IS THE DIARY OPENED AT TODAY. The day's name is printed on the
   PAPER — the reading leaf's own dateline grammar, one step louder — and the
   painting hangs whole beneath it as a mounted plate. Type never stands on
   the paint: the old full-bleed strip washed 46% of the frame to seat a
   caption (contrast measured down to 1.85:1 against the wet window), ran the
   title into the painted phone's own 雨, and cropped away more of the
   commissioned art the bigger the glass got. */
.cl-stage[data-screen="door"] { width: 100%; }
.cl-door { padding-top: var(--cl-origin-page); padding-bottom: 2.5rem; text-align: left; }
.cl-door-head,
.cl-door-body {
    width: var(--cl-col);
    margin: 0 auto;
}
/* the head shares the PLATE's left edge — series line, dateline, rule and
   painting bind into one object, and the body text sits on the reading
   column beneath it */
.cl-door-top {
    width: var(--cl-door-w, min(1100px, 100% - 3rem));
    margin: 0 auto;
}
.cl-door-head { margin-bottom: 1.1rem; }
/* the 扉 head: the series line, then the day. The lesson number takes a real
   seat on the leaf (the corner's 11px crumb stands down on this one screen),
   quiet above the dateline the way a book names its series above its title. */
.cl-door-lede {
    font-size: var(--e3);
    letter-spacing: var(--e4-track);
    color: var(--cl-ink);
    margin: 0 0 1.05rem;
}
.cl-door-top { margin-bottom: 1.8rem; }
.cl-door-title {
    margin: 0;
    padding-bottom: 0.7rem;
    border-bottom: 1px solid var(--cl-rule);
    font-family: var(--font-jp, 'Klee One', 'Noto Sans JP', serif);
    font-size: var(--k3);
    font-weight: 400;
    letter-spacing: 0.04em;
    line-height: 1.25;
    color: var(--color-jp-text, #523E1E);
}
/* the dateline's full-width gap — the comma's work, done by air (the leaf's
   own head grammar, css .cl-dateline) */
.cl-door-title .cl-dl-wx { margin-left: 1em; }
/* the line the door says to someone it has seen before: ink on the paper,
   one measure, nothing beside it */
.cl-back {
    font-size: var(--e2);
    line-height: 1.7;
    color: var(--cl-ink);
    max-width: 34em;
    margin: 0.6rem 0 0;
}
/* ⛔ THE CROP KEEPS THE SILL IN FRAME. The door's painting was re-cut with a
   written surface on it — the lit phone the day's first word is printed on —
   and the old crop, chosen when the window was all there was to see, put that
   surface a hand's width below the bottom edge on any wide desktop. One number
   holds the frame and the overlay together (the img is placed by it and the
   scene layer is placed by it), so they can never drift apart. */
/* ⭐ ROUND 2 (M5, 2026-09-10): THE DOOR HANGS WHOLE. The plate was a strip
   — a fixed 42vh height over an 1100px width, cover-cropped at 50% 62%:
   62% of the painting at 1920×1080, 58% on a laptop, the night sky, the
   shelf tops and the colleague's head on the cut. The door is the one
   station with no column beside it and its painting is the chapter's
   opening: it takes the street width the panorama already owns, at 3:2,
   HEIGHT-BUDGETED so the greeting stays on the glass by construction —
   972×648 at 1920×1080, 702×468 at 1440×900, 1100×733 at 2560×1440. With
   the plate whole the scene layer IS the frame (no crop number to share),
   and a painted board's sign_text lands exact instead of crop-compensated. */
.cl-door { --cl-door-w: min(1100px, 100% - 3rem, calc((100vh - 27rem) * 1.5)); }
.cl-doorart {
    position: relative;
    width: var(--cl-door-w);
    aspect-ratio: 1.5;
    margin: 0 auto 2rem;
    overflow: hidden;
    border: 1px solid var(--cl-rule);
    container-type: size;                 /* 1cqw / 1cqh = the frame, for the writing on it */
}
.cl-doorart img { display: block; width: 100%; height: 100%; object-fit: cover; }
.cl-doorart:empty { display: none; }   /* the text lane: no painting yet, no empty plate */
/* a short laptop keeps the greeting above the fold: the one press that
   opens the day must never need a scroll to be found (the plate's own
   height budget already shrinks it; only the air under it steps) */
@media (max-height: 780px) {
    .cl-doorart { margin-bottom: 1.5rem; }
    .cl-door-top { margin-bottom: 1.3rem; }
}
/* the day's line leads the paper below the plate — the story needs no label
   over it, and --e1 is the step that exists for exactly this line */
.cl-parked {
    font-size: var(--e4);
    letter-spacing: var(--e4-track);
    text-transform: var(--e4-case);
    color: var(--cl-quiet);
    margin: 1.4rem 0 0.35rem;
}
.cl-resume { font-size: var(--e2); color: var(--cl-quiet); margin: 0; }
/* ⭐ THE THREE-MINUTE DOOR stands UNDER the greeting, never beside it: the
   whole lesson is the offer, and this is the one you can afford tonight. It
   is a handle, not a hand — the quietest control on the screen. */
.cl-nightrow { margin-top: 1.2rem; }
.cl-nightdoor { max-width: 34em; text-align: left; }

/* ── 1b · the night paper ────────────────────────────────────────────────── */
/* One expression, its reading, its English, the teacher's note under it, and
   the way back. Nothing is asked, so nothing on it is a hand except the line
   itself, which speaks where the day has a voice for it. */
.cl-night { padding-top: var(--cl-origin-page); }
/* the three-minute paper is the one surface that still sets the phrase as a
   page rather than an island: it IS the page, and an island on an empty sheet
   is a box drawn around the only thing there */
.cl-night .cl-phrase-jp {
    margin: 0;
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k4);
    line-height: 1.8;
    color: var(--cl-ink);
}
.cl-night .cl-phrase-r { margin: 0.4rem 0 0; font-size: var(--k6); color: var(--cl-quiet); }
.cl-night .cl-phrase-en { margin: 0.55rem 0 0; font-size: var(--e3); color: var(--cl-quiet); }
.cl-night .cl-phrase-note { margin: 1.3rem 0 0; font-size: var(--e3); line-height: 1.7; color: var(--cl-quiet); max-width: 34em; }
.cl-night .cl-foot { margin-top: 2.8rem; }
/* the sentence IS the door where a clip says it — the signoff's own dress:
   no pill, an ink underline waking on hover as the only sign it has a voice */
button.cl-night-jp {
    border: 0;
    padding: 0;
    text-align: left;
    cursor: pointer;
    border-bottom: 1px solid transparent;
    transition: border-color var(--duration-fast, .15s) var(--ease-settle, ease);
}
button.cl-night-jp:hover { border-bottom-color: rgba(61, 90, 128, 0.4); }
button.cl-night-jp:focus-visible { outline: var(--cl-ring); outline-offset: 2px; }
/* ⭐ S1: THE GREETING READS AS A DOOR. It stood as printed speech over a
   hairline ("the third breath", 2026-08) — and a Japanese line over a rule
   with an English hint beneath it reads, to a web-literate adult, as a text
   field, not a press; the louder control on that screen was the mute. The
   door is the one page with no page before it, so its press has to be found
   cold: it wears the way-on's own hand (the hairline hand every 次へ wears
   now), one step larger in the Japanese so it still reads as speech. What
   survives from the third breath: the 44px floor, the JP+EN duet, and the
   said state as colour alone — the box the hand is resting on never moves.
   Compound selectors: these override .cl-next, declared further down. */
.cl-next.cl-begin {
    gap: 0.8rem;
    padding: 0.7rem 1.4rem 0.75rem;
    min-height: 44px;
}
.cl-next.cl-begin span[lang="ja"] { font-size: var(--k5); line-height: 1.3; }
/* answered — the ink settles while the bell rings and the weather comes up.
   Colour alone: the box the hand is still resting on must not move. */
.cl-next.cl-begin--said,
.cl-next.cl-begin--said:hover { border-color: var(--cl-accent); color: var(--cl-accent); }
.cl-next.cl-begin--said span[lang="ja"] { color: var(--cl-accent); }
.cl-next.cl-begin--said i { color: var(--cl-accent); }

/* the course's one mute. Both states are INK: the glyph pales by colour
   alpha (never element opacity, which would composite the strike with it)
   and a hairline crosses it out of a seat that is already reserved — nothing
   on this control moves under the pointer.
   ⭐ S1: IT LIVES IN THE CORNER CHROME, top-left beside the title mark, on
   every screen. It used to stand beside the door's greeting ("it belongs to
   the card it mutes") and again on the seam — which made it the loudest
   control on the door and left a lesson under way with no way to quiet the
   room. Chrome is where a room's switches go; the ✕ corner stays free. */
/* ⭐ ROUND 2 (CR-8 / L9): the mute's ONE seat — the right cluster, 音 · the
   promise · ✕, on every screen; it used to trail the mark's width */
.cl-topmark .cl-sound { align-self: center; margin: 0 0.5rem 0 auto; }
.cl-sound {
    position: relative;
    display: inline-flex;
    flex-direction: row;
    align-items: baseline;
    justify-content: center;
    gap: 0.45rem;
    border: 0;
    background: none;
    color: var(--cl-quiet);
    font-size: var(--k6);
    line-height: 1;
    /* the 44px floor: the ink stays a small 音, the hand gets a real seat */
    min-width: 44px;
    min-height: 44px;
    padding: 0.4rem 0.5rem;
    cursor: pointer;
    border-radius: var(--radius-sm, 4px);
    transition: color var(--duration-fast, .15s) var(--ease-settle, ease);
}
.cl-sound-k { position: relative; font-family: var(--font-jp, 'Klee One', serif); }
/* ⛔ THE STRIKE CROSSES THE GLYPH, NOT THE BUTTON. Hung on the button it shared
   its pseudo with the door's printed label, and the override left the door with
   neither: no label anyone could see, and no strike when the sound was off. */
.cl-sound-k::after {
    content: '';
    position: absolute;
    left: -0.16em;
    right: -0.16em;
    top: 50%;
    height: 1px;
    background: currentColor;
    visibility: hidden;
}
.cl-sound-en {
    font-style: normal;
    font-size: var(--e4);
    letter-spacing: var(--e4-track);
    text-transform: var(--e4-case);
    line-height: 1;
}
.cl-sound[data-muted="1"] { color: rgba(110, 104, 96, 0.45); }
.cl-sound[data-muted="1"] .cl-sound-k::after { visibility: visible; }
.cl-sound:hover { color: var(--cl-accent); }
.cl-sound:focus-visible { outline: var(--cl-ring); outline-offset: 2px; }

/* a painting inside the column (the seam) — the seam's is darkened, because
   the day has gone into a packed carriage and the light with it */
/* ⭐ ONE MOUNTING GRAMMAR. The door and the leaf went to print — square
   corners, one hairline, no lift — and the rest of the book's paintings
   still floated as rounded app cards beside them. Every painting in the
   course now hangs as the same plate the door hangs. */
.cl-art {
    position: relative;
    margin: 0 0 1.7rem;
    border: 1px solid var(--cl-rule);
    overflow: hidden;
}
.cl-art img {
    display: block;
    width: 100%;
    height: clamp(210px, 32vh, 320px);
    object-fit: cover;
    object-position: 50% 52%;
}
/* ⭐ ROUND 2 (M8, 2026-09-10): A PAINTING ARRIVES AS INK, never as a pop.
   The lazily loaded webp used to land in one frame whenever the network
   delivered it — the one thing on the page that moved without the page.
   Every plate the course hangs (the word and example vignettes, the seam
   and the close, the door) opens as the sheet's own tone and the paint
   comes up in the long ink beat; the runner adds .is-in when the image has
   decoded (synchronously for a cached one, so it lands inside the page's
   own fade and never double-clocks). Geometry never moves: the ratio box
   holds the seat. The panorama keeps its own arrival (the tour). */
.cl-vig, .cl-art, .cl-doorart { background: rgba(88, 76, 60, 0.04); }
.cl-vig img, .cl-art img, .cl-doorart img {
    opacity: 0;
    transition: opacity var(--cl-t-ink-long) var(--ease-brush, ease);
}
.cl-vig img.is-in, .cl-art img.is-in, .cl-doorart img.is-in { opacity: 1; }
/* ⭐ S1: the seam's painting is the PLATE — whole at 3:2 in the ratio box
   the word and example pages hang, never a 32vh strip cut from a picture
   that was painted to be looked at (the pause is the one screen whose whole
   job is the picture) */
.cl-seam .cl-art { width: var(--cl-plate-w); aspect-ratio: 1.5; }
.cl-seam .cl-art img { height: 100%; }
/* ── the writing IN a painting ───────────────────────────────────────────── */
/* ⛔ THE PAINTING'S OWN COORDINATES. Every x/y/w in the lesson file is a
   percentage of the IMAGE, not of the box it is shown in: the phone sits where
   the brush put it, and the box crops. So this layer re-creates the image's own
   rectangle inside the frame — cover-sized from the frame's two axes, placed by
   the very object-position the <img> is placed by — and the words hang off IT.
   Percentages the whole way down: the writing scales with the paint, and there
   is not one pixel in the geometry. The floor (inset: 0) is exactly right
   wherever the frame already matches the painting, which is the panorama. */
.cl-scene {
    --cl-scene-ar: 1.5;                   /* 3:2 — every painting in this course */
    position: absolute;
    inset: 0;
    z-index: 1;                           /* over the paper wash the title stands in */
    pointer-events: none;                 /* only the words themselves take a press */
    container-type: inline-size;          /* 1cqw = 1% of the PAINTING's width */
}
@supports (container-type: size) {
    .cl-scene {
        inset: auto;
        left: 50%;
        top: var(--cl-scene-y, 50%);
        width: max(100cqw, 100cqh * var(--cl-scene-ar));
        height: max(100cqh, 100cqw / var(--cl-scene-ar));
        transform: translate(-50%, calc(-1 * var(--cl-scene-y, 50%)));
    }
}
.cl-scene-w {
    position: absolute;
    left: var(--cl-x, 50%);
    top: var(--cl-y, 50%);
    transform: translate(-50%, -50%) rotate(var(--cl-rot, 0deg));
    margin: 0;
    padding: 0;
    border: 0;
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k4);                          /* the floor where cq units are unknown */
    font-size: calc(var(--cl-w, 6) * 1cqw);
    width: calc(var(--cl-w, 6) * 1cqw);
    line-height: 1;
    text-align: center;
    color: var(--cl-ink);
    pointer-events: auto;
    transition: color var(--duration-fast, .15s) var(--ease-settle, ease);
}
button.cl-scene-w { cursor: pointer; }
/* ink under the pointer and nothing else: the word is painted onto a surface
   in the picture, and a surface in a picture does not move when it is looked at */
button.cl-scene-w:hover { color: var(--cl-accent); }
button.cl-scene-w:focus-visible { outline: var(--cl-ring); outline-offset: 3px; }
/* ⛔ NOT YET TAUGHT = NOT YET LEGIBLE. Soft ink, out of reach and out of the
   accessibility tree — writing on a wall in a language you have not learned.
   It pales by COLOUR alpha, never element opacity, and the blur is measured in
   the painting's own width so it stays the same softness at every size. */
.cl-scene-w--asleep {
    color: rgba(var(--cl-ink-rgb), 0.35);
    filter: blur(2.5px);
    filter: blur(0.16cqw);
    pointer-events: none;
}
/* ⭐ AND THE SAME LAW WHERE THE WORD IS IN THE PAINT. A brushed 駅 on a station
   board cannot be paled by colour — there is no DOM ink to pale — so the veil
   does it from above: the painting's own light, blurred and washed back, over
   that word's zone alone. It lifts when the character's card is met, and it
   never takes a press: the invisible door under it was always the way in. */
/* ⛔ AND ITS EDGE IS SOFT. A hard-edged rectangle of blur over a painting is a
   censor bar; the eye reads it as something removed. Feathered, it is what it
   is meant to be — a patch of the picture the eye cannot focus on yet. */
.cl-scene-veil {
    position: absolute;
    pointer-events: none;
    border-radius: 2px;
    background: rgba(244, 241, 234, 0.28);
    backdrop-filter: blur(3px);
    -webkit-backdrop-filter: blur(3px);
    -webkit-mask-image: radial-gradient(closest-side, #000 58%, transparent 100%);
    mask-image: radial-gradient(closest-side, #000 58%, transparent 100%);
    transition: backdrop-filter 520ms var(--ease-settle, ease),
                -webkit-backdrop-filter 520ms var(--ease-settle, ease),
                background-color 520ms var(--ease-settle, ease);
}
.cl-scene-veil--lifted {
    background: rgba(244, 241, 234, 0);
    backdrop-filter: blur(0);
    -webkit-backdrop-filter: blur(0);
}

/* ⛔ A HOVER MUST NOT MOVE THE HOVERED BOX (components.css:383, pinned by
   tests/css/hover_stability_test.js). A 1px lift vacates a 1px band along the
   button's own bottom edge, the pointer resting there is dropped, :hover falls
   and the button springs back onto it — a strobe. Every hover below is colour,
   border or shadow; none is geometry. */
/* ── the feet: 次へ and its quiet siblings ───────────────────────────────── */
.cl-foot { margin-top: 2.4rem; display: flex; align-items: center; gap: 1.4rem; }
/* ⛔ THE FOOT IS NOT A PLACEHOLDER, IT IS THE SEAT OF THE WAY ON. It used to
   reserve 1px and a different top margin, so every settle swapped 1px + 1.6rem
   for a 46px button + 2.4rem — 58px claimed in one frame at the bottom of a
   page that was already folding. The button is now in the DOM from mount under
   [data-veil]; --held only says the page has not offered it yet. */
.cl-foot--held { justify-content: flex-end; }
/* ⭐ the read's Back RESTS while the page is asking: the questions arrive at
   the tail one at a time and the foot follows them down, so a Back standing
   there was the one readable thing on the leaf that moved after landing.
   Veiled (the seat kept), it returns with the doors; ← rests with it. */
.cl-foot--asking .cl-prev { visibility: hidden; }
/* ⭐ THE PAGE TURN HAS ONE SEAT: the bottom-right corner of the column it
   turns. 次へ is the most-pressed control in the lesson and it wandered —
   under a rack on one screen, under a painting on the next, under a settled
   sentence on a third — so the hand had to go looking for it every time.
   ⛔ A WORK button is not a page turn and keeps the left: 答える commits the
   row above it, the door's greeting answers a sentence, the seam's pair is a
   fork read left to right. What earns this class is a foot whose whole job
   is "and now the next page". */
.cl-foot--turn { justify-content: flex-end; }
/* ⛔ AND THE CLOSE'S TWO DOORS WEAR IT TOO. 読む and 聞く were caption-grey
   text: the one control that turns the day's own proof, dressed as a footnote,
   and nobody knew it was pressable. Same dress as 次へ; same labels. */
/* ⭐⭐ S1: HANDS, NOT FORM BUTTONS. 次へ, 答える and 続ける were filled,
   shadowed, sheet-coloured buttons on a page of printed speech. The house
   draws its pressable verbs as HAIRLINE HANDS (the word page's .wp-verb: a
   1.5px rule at 62% ink, no fill, no shadow), and the lesson adopts that:
   the Japanese in the JP brown, the English quiet beside it, and the hover
   answered in ink alone — the rule to full ink, the words to indigo. The
   corner stays the house --radius (the walk's hands wear it too; the 3px
   print corner is the slip's, and the one slip in this room is the kanji
   sheet). Nothing moves under the pointer. */
.cl-next, .cl-commit, .cl-rbnext, .cl-rb-hear {
    display: inline-flex;
    align-items: baseline;
    gap: 0.55rem;
    border: 1.5px solid rgba(var(--cl-sh), 0.55);
    background: none;
    color: var(--cl-ink);
    border-radius: var(--radius, 8px);
    padding: 0.6rem 1.1rem;
    cursor: pointer;
    font: inherit;
    box-shadow: none;
    transition: border-color var(--duration-fast, .15s) var(--ease-settle, ease),
                color var(--duration-fast, .15s) var(--ease-settle, ease);
}
.cl-next [lang="ja"], .cl-commit [lang="ja"],
.cl-rbnext [lang="ja"], .cl-rb-hear [lang="ja"] { font-size: var(--k6); color: var(--color-jp-text, #523E1E); }
.cl-next i, .cl-commit i, .cl-rbnext i, .cl-rb-hear i {
    font-style: normal; font-size: var(--e3); color: var(--cl-quiet); letter-spacing: 0.03em;
}
.cl-next:hover, .cl-commit:hover:not(:disabled),
.cl-rbnext:hover, .cl-rb-hear:hover {
    border-color: var(--cl-ink);
    background: none;
    color: var(--cl-accent);
    box-shadow: none;
}
.cl-next:hover [lang="ja"], .cl-commit:hover:not(:disabled) [lang="ja"],
.cl-rbnext:hover [lang="ja"], .cl-rb-hear:hover [lang="ja"],
.cl-next:hover i, .cl-commit:hover:not(:disabled) i,
.cl-rbnext:hover i, .cl-rb-hear:hover i { color: var(--cl-accent); }
.cl-next:focus-visible, .cl-commit:focus-visible,
.cl-rbnext:focus-visible, .cl-rb-hear:focus-visible { outline: var(--cl-ring); outline-offset: 2px; }
/* S3: PRESSED. The lesson had no :active anywhere — a press with no receipt
   before the 260ms turn makes a beginner press twice. Ink only: the hairline
   takes the indigo the words already wear on hover. Never a border width,
   never a transform. */
.cl-next:active, .cl-commit:active:not(:disabled),
.cl-rbnext:active, .cl-rb-hear:active { border-color: var(--cl-accent); }
/* not yet answerable: the hand pales by INK (rule and words), never by
   element opacity — a spent row must not ghost through a fade of the whole box */
.cl-commit:disabled { border-color: rgba(var(--cl-sh), 0.2); cursor: default; }
.cl-commit:disabled [lang="ja"] { color: rgba(82, 62, 30, 0.42); }
.cl-commit:disabled i { color: rgba(110, 104, 96, 0.5); }
.cl-quiet {
    border: 0;
    background: none;
    color: var(--cl-quiet);
    font: inherit;
    font-size: var(--k6);
    cursor: pointer;
    padding: 0.4rem 0;
    border-bottom: 1px solid transparent;
    display: inline-flex;
    align-items: baseline;
    gap: 0.5rem;
}
.cl-quiet i { font-style: normal; font-size: var(--e3); }
.cl-quiet:hover { color: var(--cl-accent); border-bottom-color: rgba(61, 90, 128, 0.4); }
.cl-quiet:focus-visible { outline: var(--cl-ring); outline-offset: 2px; }

/* ── the teacher's cut ──────────────────────────────────────────────────────
   ⭐ ROUND 2 (CT-1): the AUTHORED prose — a lesson-JSON *_en field the
   teacher wrote — wears Literata; nothing that comes from the COPY table
   does, however it enters. The list is the boundary: a rule joins it only
   when its text is the author's. Never italic; the ink is the page's. */
.cl-synth, .cl-twin-shared, .cl-twin-line, .cl-second-why, .cl-honor,
.cl-frame, .cl-back, .cl-wbeat-line, .cl-ss-line, .cl-aside-frame, .cl-moment,
.cl-tonight, .cl-stamp-line, .cl-wild, .cl-rb-intro, .cl-seedline, .cl-pano-line,
.cl-kh-second, .cl-close-line, .cl-life-note, .cl-guess-r /* the teacher's cut */ {
    font-family: var(--cl-font-tell);
    font-style: normal;
}
.cl-synth, .cl-twin-shared, .cl-twin-line, .cl-second-why, .cl-honor,
.cl-frame, .cl-back, .cl-wbeat-line, .cl-ss-line, .cl-moment, .cl-tonight,
.cl-stamp-line, .cl-wild, .cl-rb-intro, .cl-pano-line, .cl-kh-second, .cl-life-note, .cl-guess-r /* the teacher's cut, at its size */ {
    font-size: var(--e2-tell);
    line-height: 1.65;
}
/* gap-5: a swap after mount must not move a reserved seat — the fallback is
   metric-matched to Literata's box, so a line measured in it is the line
   Literata sets (the runner re-measures every held note on fonts.ready too) */
@font-face {
    font-family: 'Literata Fallback';
    src: local('Iowan Old Style'), local('Palatino'), local('Georgia');
    size-adjust: 96%;
    ascent-override: 93%;
    descent-override: 26%;
    line-gap-override: 0%;
}

/* ── 2 / 7 · a page ──────────────────────────────────────────────────────── */
/* every page screen is a leaf of the same diary, so all three open where a
   page opens — the warm-up included. It used to begin a fifth of the way down
   with the screens that ASK, back when it was a bare block of Japanese under
   an instruction; it is yesterday's page now, and a page starts at the top. */
.cl-pagescreen, .cl-warm { padding-top: var(--cl-origin-page); }
/* ⭐ THE DATELINE. The day's name, printed on the paper as a diary prints it:
   weekday, a full-width gap, the weather. The gap does the work the file's 、
   does in the data, so no comma is set. ⛔ ONE RULED LINE, and this is it —
   the page carries no other, ever. */
.cl-dateline {
    display: flex;
    align-items: baseline;
    font-size: var(--k4);
    letter-spacing: 0.05em;
    color: var(--color-jp-text, #523E1E);
    border-bottom: 1px solid var(--cl-rule);
    padding-bottom: 0.6rem;
    /* the seal hangs at the top-right corner: the date never runs under it */
    padding-right: 76px;
    margin: 0 0 1.6rem;
}
.cl-dl-wx { margin-left: 1em; }
/* ⭐ ONE LEAF, NOT A CARD. Square corners and no lift: paper laid on the desk
   is not a panel floating over it. The hairline border stays — on a bright
   display the sheet and the room are two shades apart and the edge is the
   only thing that says where the page ends. Print margins, with a heavier
   foot, the way a printed page is set. */
.cl-page {
    position: relative;
    background: var(--cl-sheet);
    border: 1px solid var(--cl-rule);
    border-radius: 0;
    padding: clamp(2rem, 4vw, 2.75rem) clamp(1.4rem, 3vw, 2.4rem) clamp(2.6rem, 5vw, 3.4rem);
    box-shadow: none;
}
/* the house's ONE texture spend, the walk's own washi recipe (study-walk.css:
   static feTurbulence fibre, never a halftone grid). ⛔ Nothing else joins it:
   no gutter, no binding, no spine shadow — border, dateline rule and grain are
   the whole material story. */
.cl-page::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 0;
    pointer-events: none;
    opacity: 0.05;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
    mix-blend-mode: multiply;
}
/* the ink sits ON the fibre, not under it */
.cl-page > .cl-dateline,
.cl-page > .cl-page-lines { position: relative; z-index: 1; }
.cl-line {
    margin: 0;
    font-size: var(--k5);
    line-height: 1.95;
    color: var(--cl-ink);
}
/* the day's movements, as the author marked them: a paragraph is a run of
   lines, and its first line takes the 字下げ one-character indent */
.cl-para { margin: 0 0 1.4rem; }
.cl-para:last-child { margin-bottom: 0; }
.cl-para .cl-line:first-child { text-indent: 1em; }
/* ⛔ AND THE 字下げ IS THE JAPANESE SENTENCE'S ALONE. text-indent inherits, so
   the paragraph's opening line handed its indent to the English printed under
   it and to any gloss card hanging over it — one English row out of line with
   every other, and a card that stood wider than its own words. (S6: the
   glossed guest's inline-block — which inherited the same indent as a hole
   before the word, 「五時半まで、　会社」 — is gone with the hung gloss.) */
.cl-line-en, .cl-gloss { text-indent: 0; }
/* S3 (2026-09-06): a token is a door and wears the door grammar (see "doors",
   below) — BARE at rest by law: a leaf of a hundred doors would be wallpaper
   with a rule under each, so there the hover alone says it, in the same
   indigo and solid rule every door in the room answers with. ⛔ The kana
   token's quieter stone hover is RETIRED: one hover ink for every inline door.
   A beginner can ask about かばん as freely as about 学校. */
/* ⭐ S6: A WORD NEVER SPLITS ACROSS LINES. The leaf's tokens ARE the words
   (lineHTML), so the token itself is unbreakable and the break falls between
   words, at the <wbr> the leaf lays — 学生 no longer parts into 学 / 生 on a
   leaf whose own eyebrow says a kanji opens a word and the kana close it.
   keep-all (the S5 block below) already forbade a break inside a CJK run;
   nowrap on the token closes the kana-to-kana seam too. The 字下げ stays as
   ruled: a wrapped tail simply begins at the margin. */
.cl-tk { position: relative; cursor: pointer; white-space: nowrap; }
.cl-tk--plain, .cl-punct { cursor: default; }
/* ⭐⭐ S6: THREE INKS ON THE LEAF (owner call 5). A word this chapter taught
   wears the day's brown — the example sentences' own target dress, one step
   quieter — so a reader's eye finds what the chapter bought; an old word is
   sumi, unmarked; a guest is sumi under its ruby. COLOUR ALONE: Klee One
   ships 400 and 600, so a "500" would render as 400, and a semibold diary
   word is not a diary word. Declared BEFORE the pencil mark: a word the
   reader opened is theirs (stone) whichever chapter taught it. */
.cl-tk--today { color: var(--color-jp-text, #523E1E); }
/* the pencil mark: a word this reader opened, faint and unlabelled — an INK
   change (the room's quiet stone), never a rule: a dotted rule now means
   "a door" everywhere, and one mark may not mean two things */
.cl-tk--marked { color: var(--cl-quiet); }
/* ⛔ ABOVE the word: a card hung below covers the line the reader has not
   read yet. The first line has no paper above it, so that one alone hangs
   below (.cl-gloss--below).
   ⛔ AND IT FITS THE GAP IT HANGS IN. Stacked, the card stood two lines tall
   and blanked the line above the word on every single tap — the reader lost a
   line of the page to read one word of it. Reading and English on ONE
   baseline-aligned row: a rare long gloss still wraps, and that one is worth
   the line. */
/* ⭐ ROUND 2 (nav-C5): the rail row's card carries one door line at its foot
   — 「その頁 its page」 — in the door grammar (a dotted rule at rest, indigo
   solid on hover); ink only under the pointer */
.cl-gloss:has(.cl-gloss-page) { flex-wrap: wrap; }
.cl-gloss-page {
    display: block;
    flex: 1 0 100%;
    width: 100%;
    margin-top: 0.1rem;
    padding: 0.35rem 0 0.1rem;
    border: 0;
    border-top: 1px solid var(--cl-rule);
    background: none;
    font: inherit;
    font-size: var(--e3);
    color: var(--color-jp-text, #523E1E);
    text-align: left;
    cursor: pointer;
}
.cl-gloss-page [lang="ja"] {
    font-family: var(--font-jp, 'Klee One', serif);
    text-decoration-line: underline;
    text-decoration-style: dotted;
    text-decoration-thickness: 1px;
    text-underline-offset: 0.16em;
    text-decoration-color: rgba(82, 62, 30, 0.5);
}
.cl-gloss-page i { font-style: normal; color: var(--cl-quiet); margin-left: 0.5em; }
.cl-gloss-page:hover, .cl-gloss-page:hover i { color: var(--cl-accent); }
.cl-gloss-page:hover [lang="ja"] { text-decoration-style: solid; text-decoration-color: var(--cl-accent); }
.cl-gloss-page:focus-visible { outline: var(--cl-ring); outline-offset: 2px; }
.cl-gloss {
    position: absolute;
    left: 50%;
    bottom: calc(100% + 6px);
    /* clamped WITHIN the sheet: the runner measures the card against the
       paper and shifts it by this var, so a word at the right edge never
       centres its English past the root's overflow-x */
    transform: translateX(calc(-50% + var(--cl-gshift, 0px)));
    z-index: 4;
    display: flex;
    flex-direction: row;
    align-items: baseline;
    gap: 0.5rem;
    /* an abspos card shrink-wraps against its TOKEN's width — max-content
       keeps it one line wide, the cap wraps only the genuinely long gloss */
    width: max-content;
    max-width: 26em;
    background: var(--cl-sheet);           /* ROUND 2 (CR-5): the sheet, lifted by its shadow */
    border: 1px solid var(--cl-rule);
    border-radius: var(--radius-sm, 4px);
    padding: 0.3rem 0.6rem;
    box-shadow: 0 1px 2px rgba(var(--cl-sh), 0.04);
    cursor: default;
}
.cl-gloss--below { bottom: auto; top: calc(100% + 6px); }
/* S3: the word's own disc rides the card row — the inline chip, seated on the
   row's centre and let overhang the card's padding so the card stays one
   line tall */
.cl-gloss-oto { align-self: center; margin: -0.3rem 0; flex: none; }
/* S3: a RAIL row's card sits BESIDE the row, like a note in the margin — hung
   above, it covered the column's own title; hung below, the next place. The
   runner's clamp still shifts it back inside the glass on a narrow window. */
.cl-rail .cl-gloss {
    left: calc(100% + 0.7rem);
    right: auto;
    bottom: auto;
    top: 50%;
    transform: translate(var(--cl-gshift, 0px), -50%);
}
.cl-gloss-r { font-size: var(--k6); color: var(--cl-ink); line-height: 1.2; white-space: nowrap; }
/* ⭐ AND THE CHARACTERS ARE THE LAST THING ON THE CARD. A guest word's press
   opens the WORD — its sound and its meaning — and only then offers the
   kanji it is written with, each its own door onto its home. They keep the
   .cl-kref dress they wear everywhere else so the learner has one shape to
   learn; here they simply sit at the end of the row rather than inside the
   word. ⛔ Row order is the teaching order: word first, characters after. */
.cl-gloss-ks {
    display: inline-flex;
    align-items: baseline;
    gap: 0.5rem;     /* S3: parted, so two doors read as two doors, not the word again */
    margin-left: 0.15rem;
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k6);
    color: var(--color-jp-text, #523E1E);
    line-height: 1.2;
    white-space: nowrap;
}
.cl-gloss-en {
    font-family: var(--font-ui, 'Inter', sans-serif);
    font-size: var(--e3);
    color: var(--cl-quiet);
    line-height: 1.35;
    /* ⛔ ONE cap, and it is the CARD's. A second cap here, set in the small
       English em, was the tighter of the two and wrapped every gloss the row
       could have held on one line. */
}
.cl-line-en {
    display: none;
    font-family: var(--font-ui, 'Inter', sans-serif);
    font-size: var(--e3);
    color: var(--cl-quiet);
    line-height: 1.5;
    margin-top: 0.15rem;
}
/* ⭐ S9: THE ENGLISH DOOR OPENS LINE BY LINE — 18ms a line down the leaf
   (--li, the line's own index, set on its <p>), never 29 lines in one frame.
   The geometry is the door's own act (display); only the ink is clocked. */
.cl-page--en .cl-line-en {
    display: block;
    animation: cl-unfold 320ms var(--ease-brush, ease) both;
    animation-delay: calc(var(--li, 0) * 18ms);
}
/* a week ago: the same day in the kana it would have needed */
.cl-page--kana .cl-line { color: var(--cl-ink-past); }
/* ⭐ YESTERDAY'S LEAF. The warm-up is a page from the book already written, so
   its paper has settled a shade and its ink has: the same past ink the kana
   view wears, and nothing else changes — a page you are asked to read is not
   a page held at a distance. */
.cl-page--warm { background: #F8F5EF; }
.cl-page--warm .cl-line { color: var(--cl-ink-past); }
/* the parting word's seat is held from mount, so the second press of 次へ
   lands exactly where the first did — a reveal changes ink, never geometry */
.cl-warm-foot { font-size: var(--e3); color: var(--cl-quiet); margin: 1.2rem 0 0; min-height: 1.6em; visibility: hidden; }
.cl-warm-foot--said { visibility: visible; }

/* ⭐ S6: THE TWO MERCIES READ AS A PAIR. The kana door stood alone above the
   leaf, at its right edge, in a dress of its own; it is seated beside the
   English door now (.cl-doors), wearing the same .cl-quiet duet, opened by
   the same answered question. What is left above the leaf is the preface
   line and nothing else (.cl-page-preface). On, the door keeps the accent
   the way an open English door keeps its label: a state, said in ink. */
.cl-weekago [lang="ja"] { letter-spacing: 0.06em; }
.cl-weekago--on { color: var(--cl-accent); border-bottom-color: rgba(61, 90, 128, 0.4); }

/* ── 3 / 5 · a meet card ─────────────────────────────────────────────────── */
/* ⛔ ONE COLUMN, ONE THING TO A PAGE. The wide two-track desk — teaching left,
   hand right — was what a card needed while the whole ceremony stood on one
   paper; it read as a mirror hall, and it kept the meaning small to make the
   halves balance. The meeting is three pages now, so each one takes the same
   measure every other station reads on: the door's column. */
.cl-card { padding-top: var(--cl-origin-page); }
/* ⭐ the ASK page (and the settle it becomes) is a one-thing screen and
   seats at the ask origin like every other one-thing screen — top-anchored
   at 2rem it hugged the ceiling of a tall glass while three quarters of the
   room stood empty (owner #77). The guess and word pages keep the page
   origin: they are pages. Ask -> settle shares the class, so answering
   never moves the paper. */
.cl-card--pa { padding-top: var(--cl-origin-ask); }
.cl-card-head { display: flex; align-items: baseline; gap: 1.2rem; margin-bottom: 1.6rem; }
.cl-word {
    font-size: clamp(var(--k3), 6vw, var(--k2));
    line-height: 1.1;
    color: var(--color-jp-text, #523E1E);
    /* ⛔ the word keeps its whole line: the meta beside it now carries a
       framing line as well as the reading, and a shrinkable word broke 気持ち
       across two lines to make room for prose about it */
    flex: none;
    white-space: nowrap;
}
.cl-word-meta { display: flex; flex-direction: column; gap: 0.25rem; }
/* ⭐ ROUND 2 (IMM-7): the reading cut as RUBY over its characters on the word
   page — k6 Klee, centred over each group, the two inks kept; the plain
   reading stays in the tree for the ear and the suites, visually hidden.
   ⛔ declared apart from .cl-guest rt: the crutch dress (0.44em) never
   reaches this head. */
ruby.cl-word--ruby { ruby-position: over; ruby-align: center; }
ruby.cl-word--ruby rt {
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k6);
    line-height: 1.1;
    font-weight: 400;
    letter-spacing: 0.02em;
    ruby-align: center;
}
.cl-reading--sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
.cl-word-meta--ruby .cl-reading-row { align-items: baseline; }
.cl-reading-row { display: inline-flex; align-items: baseline; gap: 0.5rem; }
.cl-reading { font-size: var(--k6); color: var(--cl-ink); }
/* ── the veil: once the ask begins, the reading's INK goes and its SEAT
   stays (visibility, never display — a reveal changes ink, not geometry).
   A pale rest stroke says something waits here; hover or keyboard focus
   peeks; nothing records the peek. The settle removes the class. */
.cl-reading { position: relative; display: inline-block; }
.cl-card--asking .cl-reading { cursor: default; }
/* ⭐ and the peek is PAPER MOVING: a sheet slides (js: CourseFoley.slide) and
   the ink BLOOMS up over 300ms rather than appearing. visibility is what keeps
   the held reading out of the a11y tree and out of a selection — colour alone
   would leave the answer copyable — so visibility flips at once and the colour
   is what takes the time. The rest stroke fades on the same breath. */
/* ⭐ ONE VEIL, TWO SURFACES: the wake screen holds its two readings under the
   same dress the meet uses, so a returning learner meets a hand they already
   know. There it is a PRESS that peels (.cl-wk--woke), not a hover — the base
   rule keeps matching either way, which is what leaves the 300ms bloom on. */
.cl-card--asking .cl-reading .cl-reading-ink,
.cl-wake .cl-reading .cl-reading-ink {
    visibility: hidden;
    color: transparent;
    transition: color 300ms var(--ease-settle, ease);
}
.cl-card--asking .cl-reading::after,
.cl-wake .cl-reading::after {
    content: '';
    transition: background-color 300ms var(--ease-settle, ease);
    position: absolute;
    left: 0.1em; right: 0.1em; bottom: 0.28em;
    height: 1px;
    background: rgba(110, 104, 96, 0.4);
}
/* ⛔ the ask page's hover reveal is GONE (review board 2026-08-29): it was
   an unfindable mercy and a silent answer key at once. The wake screen keeps
   its peel — there it is a deliberate PRESS. */
.cl-wk--woke .cl-reading .cl-reading-ink { visibility: visible; color: inherit; }
.cl-wk--woke .cl-reading::after { background: transparent; }
.cl-reading:focus-visible { outline: var(--cl-ring); outline-offset: 2px; }
/* ⭐⭐ ONE CHIP, EVERYWHERE A THING SPEAKS. The ♪ was an outlined pill — a
   form control wearing a music note, on a page whose whole material is paper —
   and the listen item's disc, the readback's door and the greeting all spoke
   in different shapes, so nothing on the surface taught the learner what "this
   speaks" looks like. ⭐ S1: IT IS THE APP'S OWN DISC, MINUS ITS GOLD. The
   word page's 音 chip (.wp-oto, the brand seal's clothes since 2026-06-11):
   washi paper, a 1.6px brushed sumi ring, the speaker glyph — 44px beside a
   headword, 34px inline. The lesson's ringless white disc was a shape the
   app never uses. ⛔ No gold dot here: gold in this room appears only on a
   miss that came back and was answered, and the seal's dot stays the word
   page's. ⛔ The speaker glyph, never a 音 character: a first-weeks learner
   has not met it, and it would collide with the mute's own 音 in the corner.
   Ink answers the pointer; nothing moves. */
.cl-chip {
    flex: none;
    width: 2.75rem;
    height: 2.75rem;
    padding: 0;
    border: 1.6px solid rgba(var(--cl-sh), 0.65);
    border-radius: 50%;
    background: var(--cl-sheet);           /* ROUND 2 (CR-5): the object material, not a fourth cream */
    color: var(--cl-ink);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    box-shadow: 0 1px 3px rgba(var(--cl-sh), 0.06);
    transition: color var(--duration-fast, .15s) var(--ease-settle, ease),
                border-color var(--duration-fast, .15s) var(--ease-settle, ease);
}
.cl-chip-i { width: 1.125rem; height: 1.125rem; display: block; }
.cl-chip-i path { fill: currentColor; }
.cl-chip-i .cl-chip-w {
    fill: none;
    stroke: currentColor;
    stroke-width: 1.7;
    stroke-linecap: round;
}
.cl-chip:hover { color: var(--color-jp-text, #523E1E); border-color: var(--color-jp-text, #523E1E); }
.cl-chip:focus-visible { outline: var(--cl-ring); outline-offset: 3px; }
/* ⭐ S9: A RECORD ARRIVES IN THREE INKS — its lines one ink step apart (0 /
   120 / 240ms), the way on 520ms after the last (JS counts row + 2·ink). The
   seat was laid at mount and veiled; the veil lifts and the lines bloom in
   order. Where the word's own clip clocks the record (.cl-settled--clocked,
   the item host) the clip's three beats rule instead and this stands down. */
.cl-record.cl-settled > * { --d: 0ms; animation: cl-unfold 320ms var(--ease-brush, ease) both; animation-delay: var(--d); }
.cl-record.cl-settled > * + * { --d: var(--cl-ink-step); }
.cl-record.cl-settled > * + * + * { --d: calc(var(--cl-ink-step) * 2); }
.cl-record.cl-settled .cl-sent--settled > .cl-sent-en {
    animation: cl-unfold 320ms var(--ease-brush, ease) both;
    animation-delay: calc(var(--d, 0ms) + var(--cl-ink-step));
}
.cl-settled--clocked .cl-record.cl-settled > *,
.cl-settled--clocked .cl-record.cl-settled .cl-sent--settled > .cl-sent-en { animation: none; }
/* silent: ink alpha on ring and glyph, never element opacity */
.cl-chip:disabled { color: rgba(var(--cl-ink-rgb), 0.3); border-color: rgba(var(--cl-sh), 0.22); cursor: default; }
/* the inline size: a sentence's voice, a ledger row's — the word page's own
   34px .wp-eaudio */
.cl-chip--inline, .cl-kw-chip, .cl-sent-oto {
    width: 2.125rem;
    height: 2.125rem;
    border-width: 1.4px;
    border-color: rgba(var(--cl-sh), 0.55);
}
.cl-chip--inline .cl-chip-i, .cl-kw-chip .cl-chip-i { width: 0.875rem; height: 0.875rem; }
/* speaking: the glyph fills warm, and the second wave joins it */
.cl-chip--on { color: var(--color-jp-text, #523E1E); }
.cl-chip .cl-chip-w2 { opacity: 0; transition: opacity var(--duration-fast, .15s) var(--ease-settle, ease); }
.cl-chip--on .cl-chip-w2, .cl-chip:hover .cl-chip-w2 { opacity: 1; }
/* the listen item's chip is the loud one on an otherwise empty sheet */
.cl-disc { width: 3.4rem; height: 3.4rem; }
.cl-disc .cl-chip-i { width: 1.5rem; height: 1.5rem; }
.cl-gloss-line { font-size: var(--e3); color: var(--cl-quiet); }
/* ⛔ .cl-story / .cl-dry / .cl-promise are GONE with their markup (owner ruling
   2026-09-08, the introduction model): the shape story, the closing sentence and
   the promise are retired seats, and a rule kept for markup nobody prints is a
   dead rule living inside a green gate. */
/* ── kanji first: on a word-carried card the GLYPH leads at brush size and
   the word arrives further down as the synthesis of its halves */
.cl-card-head--k { margin-bottom: 1.2rem; }
.cl-kglyph {
    font-family: var(--font-jp, 'Klee One', 'Noto Sans JP', serif);
    font-size: var(--k2);
    line-height: 1.05;
    color: var(--color-jp-text, #523E1E);
}
/* ⭐ THE SELF-WRITING GLYPH. The Klee ink holds the seat and every fallback
   lands on it — no stroke file, a reader who asked for less motion, a browser
   that never returns the fetch — so the card's geometry is the same box in
   every one of those worlds. The strokes are laid OVER that seat, never
   instead of it, and the ink hands over by visibility. */
.cl-draw {
    position: relative;
    display: inline-block;
    padding: 0;
    border: 0;
    font: inherit;
    color: inherit;
    line-height: 1;
    cursor: default;
    vertical-align: baseline;
}
.cl-draw-ink { display: block; }
.cl-draw--live { cursor: pointer; }
.cl-draw--live .cl-draw-ink { visibility: hidden; }
.cl-draw-svg {
    position: absolute;
    left: 50%;
    top: 50%;
    width: 1.02em;
    height: 1.02em;
    transform: translate(-50%, -50%);
    overflow: visible;
}
.cl-draw-svg path {
    fill: none;
    stroke: var(--color-jp-text, #523E1E);
    stroke-width: 5.6;
    stroke-linecap: round;
    stroke-linejoin: round;
}
/* the one interactive glyph on the paper says so the way every other control
   does: the ink under the cursor goes to the accent, and nothing moves */
.cl-draw--live:hover .cl-draw-svg path { stroke: var(--cl-accent); }
/* ⭐ ROUND 2 (CR-3): the seat handed back — the ink comes in, the strokes go
   out over the long ink beat; the hero rests in Klee One 600 at k1, the hand
   the word page reads it in; the pointer's accent moves to the ink */
.cl-draw--rested .cl-draw-ink { visibility: visible; font-weight: 600; }
.cl-draw--rested .cl-draw-svg { opacity: 0; transition: opacity var(--cl-t-ink-long) var(--ease-brush, ease); pointer-events: none; }
.cl-draw--live.cl-draw--rested:hover .cl-draw-ink { color: var(--cl-accent); }
.cl-draw:focus-visible {
    outline: var(--cl-ring);
    outline-offset: 2px;
    border-radius: var(--radius-sm, 4px);
}
/* less motion asked for: no hand, one calm arrival */
.cl-draw--fade { animation: cl-fade 300ms var(--ease-settle, ease) both; }
@keyframes cl-fade { from { opacity: 0; } to { opacity: 1; } }

/* ── the three pages of a meeting ────────────────────────────────────────── */
/* ⭐ THE CHARACTER PAGE IS THE GLYPH. With the word, the sentence and the hand
   moved off it, the shape can be met at the size a hand actually writes it —
   two and a half times the stacked card's, which is what makes the writing
   read as writing. */
/* ⭐ ROUND 2 (L7): the kind caption is a specimen caption UNDER the glyph, at
   its left edge — not a stray label beside it on its baseline (the name it was
   seated beside prints with the answer since the 09-08 ruling) */
.cl-card--pc .cl-card-head--k { margin-bottom: var(--cl-air-between); flex-direction: column; align-items: flex-start; gap: 0.35rem; }
.cl-card--pc .cl-kmeta .cl-kkind { order: -1; }
.cl-card--pc .cl-kglyph { font-size: var(--k1); }
/* ⭐ AND THE MEANING IS THE SECOND-LOUDEST THING ON IT, standing BESIDE the
   shape it names rather than three blocks below it: the glyph gets named,
   literally, on its own baseline. ⛔ It holds its seat from the first breath
   and arrives in INK — visibility keeps it out of the reading and out of a
   selection while the look is still being taken (a meaning that can be
   copy-pasted before the guess is a guess with its answer printed on it), and
   nothing on the page moves when it lands. A card with no guess never wears
   --looking, so its name is simply there. */
.cl-kname {
    margin: 0;
    font-family: var(--font-ui, 'Inter', system-ui, sans-serif);
    font-size: var(--e1);
    font-weight: 500;                      /* ROUND 2 (CT-6): under the glyph's ink, over the prose */
    letter-spacing: -0.005em;
    line-height: 1.3;
    color: var(--cl-ink);
    max-width: 14em;
    transition: color 620ms var(--ease-brush, ease);
}
/* ⛔ THE NAME LINE PRINTS WITH THE ANSWER (owner 2026-09-08). It used to hold a
   hidden seat here and ink in on the take; it now stands inside the answer block
   under the guess, so the page before the answer carries the glyph, the kind
   caption and the question, and nothing else. A card with no guess keeps its
   name in the head, where there is no answer to bring it. */
.cl-kmeta { display: flex; flex-direction: column; gap: 0.3rem; }
/* ⭐ THE KIND CAPTION, in the parts row's own caption dress: a name for what
   sort of character this is, never a sentence, and never louder than the name. */
.cl-kkind { margin: 0; font-size: var(--e3); line-height: 1.4; color: var(--cl-quiet); }
/* ⭐ S5: the word page's meaning is the SECOND-LOUDEST thing on its paper — the
   character page's own grammar (the name beside the glyph, on its baseline),
   not a whisper under a heavier gloss. The head aligns on its LAST baseline so
   the gloss sits on the word's baseline with the reading above it; the
   reading is never the smallest Japanese on the page (k5, the sentence's
   size), and it is set in per-kanji GROUPS: this card's slice in ink, the rest
   in past ink, okurigana as itself. */
.cl-card--pw .cl-card-head { align-items: last baseline; margin-bottom: 1.2rem; }
.cl-card--pw .cl-gloss-line { font-size: var(--e1); font-weight: 500; letter-spacing: -0.005em; line-height: 1.3; color: var(--cl-ink); }
.cl-card--pw .cl-word-meta { gap: 0.5rem; }
.cl-card--pw .cl-reading { font-size: var(--k5); }
.cl-reading--grouped .cl-reading-ink { display: inline-flex; gap: 0.45em; }
/* ⭐⭐ THE SECOND ENCOUNTER, MARKED (2026-09-08). 人 you know as ひと; in 人生 it
   says じん. The character stands at the parts row's glyph size on the left and
   the line reads beside it, so the moment is a MOMENT and not one more
   paragraph. Its two inks are the reading row's own — past ink for the sound he
   holds, the brush brown for the one this word wants — and there is nothing
   else: no arrow, no box, no third colour. */
.cl-secondseat {
    display: flex;
    align-items: baseline;
    gap: 0.9rem;
    margin: 0;
    max-width: 34em;
}
.cl-ss-k {
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k3);
    line-height: 1;
    color: var(--color-jp-text, #523E1E);
}
.cl-ss-line { font-size: var(--e2); line-height: 1.7; color: var(--cl-ink); }
/* this card's slice wears the brush brown — the same law the sentence runs under
   (.cl-sent-hit: today's word in the headword's warm ink, the rest in sumi); sumi
   against past ink at k5 was a difference the screen did not deliver */
.cl-rg--now { color: var(--color-jp-text, #523E1E); }
.cl-rg--past { color: var(--cl-ink-past); }
/* the ask page: the word, the veil, the rack. Nothing else needs a margin
   here — the head is the whole of it until the settle answers. */
/* ⭐⭐ THE ASK PAGE IS ONE BLOCK: the word, and the reading it owes (owner
   2026-08-30). The question is lifted out of the hand and set above the word as
   the page's own eyebrow; the word and its empty seats then stand together with
   nothing between them, so the seats read as the word's reading slot rather
   than as a widget further down the page. The rack keeps a clear gap below —
   that is the tools, not the question. */
.cl-ask--brow { margin: 0 0 0.4rem; }
.cl-card--pa .cl-card-head {
    display: flex;
    align-items: center;
    gap: 1.1rem;
    margin-bottom: 0.9rem;
}
.cl-card--pa .cl-built { margin-bottom: 1rem; }
.cl-card--pa .cl-ask { display: none; }          /* the copy in the hand's seat */
.cl-card--pa .cl-ask--brow { display: block; }
.cl-card--pa .cl-rewrite { margin-top: 2.2rem; }
.cl-card--pa .cl-teach { margin-top: 1.6rem; }
/* ⭐ AND WHEN IT ANSWERS, THE HEAD BECOMES THE RECORD. The meaning joins the
   reading in the meta column and the sentence hangs off that column's own left
   edge — the word is not said a second time, because it is still standing at
   the top of the page where it was asked. */
/* ⭐⭐ THE PAYOFF PAGE (owner 2026-08-30). The answer is a RECEIPT LINE — the
   word, the reading in the seats of the learner's own hand — and under it a
   scene they have not seen, with the sentence it paints. ⛔ Never a word card
   here: the display headword, the reading and the dictionary meaning were all
   printed on the word page two turns back and again on the ask, and handing
   them back a third time is what the learner got for doing the work. */
/* the seat the answer's own words grow into, under the row they are about */
.cl-verdictnote { margin: 0; }
.cl-record-body { display: flex; flex-direction: column; gap: 0.5rem; margin: 0 0 1.6rem; }
.cl-record-body .cl-vig { margin-bottom: 0.4rem; }
.cl-record-body .cl-sent--settled { margin-top: 1.1rem; margin-bottom: 0; max-width: 26em; }
.cl-record-body .cl-sent--settled [lang="ja"] { font-size: var(--k4); line-height: 1.8; }
/* the reading beside a settled word is part of the record, not a footnote —
   ask and settle share --pa, so the veiled seat never moves between them */
.cl-card--pa .cl-reading { font-size: var(--k5); }
/* ⛔⛔ AND NOW THE ROW IS THE ONLY STATEMENT THERE IS. It used to give up its
   ink after the answer because a settled record above it said the same reading
   a second time, louder. Both of those are gone — the head's veiled slot (the
   '__') and the record page's headline — so on the meet's ask the seats ARE
   the reading, and a reading the learner just earned is not printed at 45%. */
/* ⭐ THE ANSWERED PAGE IS ITS OWN PAGE (owner, 2026-08-30). The record carries
   the learner's own row under the word it was reaching for: their seats in the
   hand's dress, one step quieter than the record above them, and — where the
   row was wrong — retyped RIGHT with what they reached for stepped down under
   it. It is evidence, not a second headline, and it never asks to be pressed. */
/* ⛔ THE EXAMPLE IS A PAGE, NOT AN ASK. It carried --pa so that answering never
   moved the paper — true while the settle happened here. The settle is back on
   the ask's own paper, and --pa's 24vh origin pushed a page carrying a painting
   off the bottom of the glass. */
.cl-card--example { padding-top: var(--cl-origin-page); }
.cl-card--example .cl-aside { margin-top: 2.2rem; }

/* ⭐ THE WORD'S OWN SCENE — a crop of the day's master painting, in the one 3:2
   dress every painting in this course wears, at the reading measure and never
   full-bleed: the word arrives somewhere. ⛔ The seat is held by RATIO, so a
   lazily-loaded file lands into a box that was already there and the page
   under the eye never jumps. */
/* ⭐ S1: AT PLATE WIDTH. It hung at 34em (544px at 1680) — narrower than the
   column it stands in, a picture that stopped short of the line the page
   reads on. It is the plate now: the column, whole, hairlined (--cl-plate-w).
   ⛔ THE WORD PAGE KEEPS ITS ONE GLANCE: scene, word, reading, meaning and
   the teach sentence in the glass together. A 720×480 plate leaves them
   there on any glass taller than ~860px; below that the page steps the
   plate down to the 34em vignette in one move. The example page and the
   seam, where the scene IS the page, hold the plate down to ~740px. */
.cl-vig {
    margin: 0 0 1.5rem;
    width: var(--cl-plate-w);
    max-width: 100%;
    aspect-ratio: 1.5;
    border: 1px solid var(--cl-rule);
    overflow: hidden;
}
/* ⛔ ROUND 2 (2026-09-09): THE WORD PAGE'S PLATE STEPS DOWN ON EVERY GLASS.
   The 860px step predates the compound line, the second-encounter seat and
   the life note (the introduction model, 09-08): with those seated, a 720×480
   plate overran a 1080 glass by 22-49px on five of nine word pages and the
   hand was cut at the edge. At 34em the whole page — scene, word, reading,
   meaning, its seats and the teach sentence — is one glance again at 1080
   and at 900; the example page and the seam, where the scene IS the page,
   keep the column plate. A glass over 1140px tall gets the plate back. */
.cl-card--pw .cl-vig { width: min(100%, 34em); }
@media (min-height: 1140px) {
    .cl-card--pw .cl-vig { width: var(--cl-plate-w); }
}
/* M6 (round 2): the phrase beat carries its scene at the column plate — the
   line and where it was said — and steps with the example page */
.cl-beat .cl-vig { width: var(--cl-plate-w); }
@media (max-height: 740px) {
    .cl-card--example .cl-vig, .cl-seam .cl-art, .cl-beat .cl-vig { width: min(100%, 34em); }
}
/* ⛔ the ask page stays bare — the second word's scene rides its own ask at
   the column's width, never as a plate: the ask earns its emptiness */
.cl-card--pa .cl-vig { width: 100%; max-width: 34em; }
.cl-vig img { display: block; width: 100%; height: 100%; object-fit: cover; }
.cl-synth { margin: 0 0 1.3rem; font-size: var(--e2); line-height: 1.7; max-width: 34em; }
/* ⭐ ROUND 2 (CR-4): THE WORD PAGE ON THE TWO AIRS. Six near-identical gaps
   read as a list; three tiers now — the word and its compound line, the
   plate, what is said about the word — stepping by --cl-air-in inside a
   tier and opening by --cl-air-between between, the sentence last. */
.cl-card--pw .cl-card-head { margin-bottom: var(--cl-air-in); }
.cl-card--pw .cl-synth { margin: 0 0 var(--cl-air-between); }
.cl-card--pw .cl-vig { margin-bottom: var(--cl-air-in); }   /* the plate belongs with what is said about the word: a step, so the page still fits a 1080 glass */
.cl-card--pw .cl-life-note /* CR-4: the note steps inside its tier */ { margin: var(--cl-air-in) 0 0; }
.cl-card--pw .cl-sent--teach { margin-top: var(--cl-air-between); }
.cl-sent--teach { margin-top: 1.4rem; }
/* the derived credit line and a second word's synthesis, above their rack */
.cl-synth--build { margin: 0 0 0.7rem; }
.cl-credit { margin: 0 0 1rem; font-size: var(--e3); line-height: 1.65; color: var(--cl-quiet); max-width: 34em; }
/* ⭐⭐ THE ASIDE: an encounter, staged. A phrase or a sight word used to be a
   prose paragraph under a full-width rule — a divider announcing a block, and
   the Japanese inside it set at the English size, which is how a page prints a
   footnote. It is an ISLAND: slightly warmer paper, generous air, no border
   and no rule anywhere near it, and the Japanese leading at working size with
   its reading, its meaning and the one line the teacher would say.
   ⛔ IT IS NOT THE SENTENCE QUOTE. A quote wears the left spine and belongs to
   the card's own word; this is a thing MET. Two different objects, two
   different shapes, and neither borrows the other's. */
/* ⭐ THE BEAT: one encounter, alone on the paper. It opens where every read
   page opens, and the island loses the top margin it wore when it sat under
   somebody else's sentence — there is nothing above it any more. */
.cl-beat { padding-top: var(--cl-origin-page); }
.cl-beat .cl-aside { margin-top: 0; }
/* ⭐⭐ ONE WORD, ONE SOUND. 出口 is a word whose sound belongs to the word and
   not to either character, and the whole screen is that sentence said once:
   the word at head size, its reading in the seat every card's reading sits in,
   the meaning under it, and one quiet line of the teacher's own prose. Nothing
   is asked here, so nothing wears an ask's dress — no veil, no rack, no rule.
   ⛔ IT BORROWS THE CARD'S HEAD, NOT A NEW ONE. .cl-card-head / .cl-word /
   .cl-reading-row are the same three elements the word page uses, so the word
   the learner has been meeting all night stands in exactly the place they have
   been reading it — a second geometry for the same object would read as a
   different kind of thing. */
/* S1: the MEASURE is 34em; the section is the column, so the way on keeps
   its one seat at the column's edge (it stood at the 34em edge here) */
.cl-wbeat { padding-top: var(--cl-origin-page); }
.cl-wbeat-eyebrow, .cl-wbeat .cl-card-head, .cl-wbeat-line { max-width: 34em; }
/* the eyebrow speaks the rail's dress: the Japanese quiet and small, the
   English a micro-label under it on the one tracking every micro-label here
   shares. It NAMES the moment; it does not explain it. */
.cl-wbeat-eyebrow {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 0.05rem;
    line-height: 1.2;
    margin: 0 0 1.6rem;
}
.cl-wbeat-eyebrow [lang="ja"] {
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k6);
    color: var(--cl-quiet);
}
.cl-wbeat-eyebrow i {
    font-style: normal;
    font-size: var(--e4);
    letter-spacing: var(--e4-track);
    text-transform: var(--e4-case);
    color: rgba(110, 104, 96, 0.6);
}
/* the word page's own weight for the meaning: this screen is a page, not a
   whisper under an ask */
.cl-wbeat .cl-gloss-line { font-size: var(--e2); color: var(--cl-ink); }
.cl-wbeat .cl-word-meta { gap: 0.5rem; }
/* the one line the teacher would actually say — the room's prose measure, and
   the Japanese inside it keeps its face through mixed()'s own ink law */
.cl-wbeat-line {
    margin: 1.6rem 0 0;
    font-size: var(--e2);
    line-height: 1.7;
    color: var(--cl-ink);
    max-width: 32em;
}
/* ⭐ THE SPOKEN MOMENT IS PRINT, NOT A CARD. The beat is the story's own
   voice — the most diary moment in the walk — and it was the one block still
   wearing a rounded tinted app card. It stands now as printed speech on the
   page's paper, on the same left quote-rule every spoken sentence in this
   room already wears, one step larger. */
.cl-aside {
    margin: 2rem 0 0;
    padding: 0.3rem 0 0.3rem clamp(1.2rem, 2.6vw, 1.7rem);
    border-left: 2px solid var(--cl-rule);
    max-width: 34em;
}
/* ⛔ THE READING SITS UNDER THE HEADLINE, NOT BESIDE IT. Beside it, a phrase
   long enough to wrap (雨だから、気をつけて。) ran its second line straight into
   the reading's column and the two collided. One rule for long and short
   alike: the word takes the whole measure and its reading hangs under it, so
   nothing depends on how many characters the encounter happens to have. The
   chip keeps its seat with them and spans both lines. */
.cl-aside-head {
    display: grid;
    grid-template-columns: 1fr auto;
    align-items: center;
    column-gap: 0.85rem;
    row-gap: 0.25rem;
    margin: 0;
}
.cl-aside-head .cl-aside-jp { grid-column: 1; grid-row: 1; }
.cl-aside-head .cl-aside-r  { grid-column: 1; grid-row: 2; }
.cl-aside-head .cl-chip { grid-column: 2; grid-row: 1 / span 2; }
.cl-aside-jp {
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k4);
    line-height: 1.35;
    color: var(--cl-ink);
}
.cl-aside-r {
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k6);
    color: var(--cl-quiet);
}
/* ⭐ JP LEADS THE INK. The English meaning under a spoken line is a
   TRANSLATION, and a translation reads in the warm secondary: near-black
   Inter above warm Klee made every beat an English page with Japanese
   decoration. An English ASK (the set's cue) keeps the primary ink: a
   question is not a translation. */
.cl-aside-gloss {
    margin: 0.55rem 0 0;
    font-size: var(--e1);
    line-height: 1.35;
    color: var(--cl-ink-past);
}
.cl-aside-note {
    margin: 0.85rem 0 0;
    font-size: var(--e2);
    line-height: 1.7;
    color: var(--cl-quiet);
}
.cl-aside-frame {
    margin: 0 0 0.55rem;
    font-size: var(--e3);
    color: var(--cl-quiet);
}
/* a printed sentence's visible voice: the same disc, at the inline size */
.cl-sent-oto {
    margin-left: 0.6rem;
    vertical-align: middle;
}
.cl-sent-oto .cl-chip-i { width: 0.875rem; height: 0.875rem; }
/* ⭐ inside a printed sentence the voice is PUNCTUATION, not a second button:
   the round chip beside the headword stays the page's one instrument, and the
   sentence's mark is bare ink riding the end of its own line. (The night
   phrase keeps the disc — there the phrase IS the page.) */
.cl-sent .cl-sent-oto {
    width: auto;
    height: auto;
    margin-left: 0.5em;
    border: 0;
    background: none;
    box-shadow: none;
    color: var(--cl-quiet);
}
.cl-sent .cl-sent-oto:hover { background: none; box-shadow: none; color: var(--color-jp-text, #523E1E); }
.cl-sent .cl-sent-oto .cl-chip-i { width: 1.05rem; height: 1.05rem; }
/* the night paper shows one phrase and nothing else, so its aside is the page */
.cl-night .cl-aside { margin-top: 0; }
.cl-glyphs {
    list-style: none;
    display: flex;
    gap: clamp(1.5rem, 4vw, 2.8rem);
    margin: 1.6rem 0 0;
    padding: 0;
}
.cl-glyph { display: flex; flex-direction: column; align-items: center; gap: 0.35rem; }
/* ⛔ BOTH STATES ARE INK, AND COLOUR IS WHAT SAYS "TODAY'S". At 72% stone the
   twins read as dust on the page rather than as characters the learner is
   being asked to tell apart — and telling them apart is the whole lesson. The
   resting twin is sumi; the one this card teaches wears the brush's own brown.
   The distinction survives; the dust does not. */
.cl-glyph-g {
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k3);
    line-height: 1;
    color: var(--cl-ink);
}
.cl-glyph--now .cl-glyph-g { color: var(--color-jp-text, #523E1E); }
.cl-glyph-w { font-size: var(--e4); letter-spacing: var(--e4-track); text-transform: var(--e4-case); color: var(--cl-quiet); }
/* the parts of the character being taught are all of them today's, so they all
   wear the brush ink; and what stands under a part is its NAME, not a
   micro-label, so it is set as a name — untracked, at reading-note size */
.cl-glyphs--parts .cl-glyph-g { color: var(--color-jp-text, #523E1E); }
/* ⭐ A WORN PIECE (owner note 9, 2026-09-08): the shape it WAS, in the past ink
   the reading seat uses for the sound you knew; the caption says what it became */
.cl-glyphs--parts .cl-glyph--worn .cl-glyph-g { color: var(--cl-ink-past); }
/* ROUND 2 (CR-4): the parts row takes the twins row's dress — captions never set the glyph spacing */
.cl-glyphs--parts { align-items: flex-start; gap: clamp(1.5rem, 3vw, 2.4rem); }
.cl-glyphs--parts .cl-glyph { max-width: 12em; }
.cl-glyphs--parts .cl-glyph-w { font-size: var(--e3); letter-spacing: 0; text-transform: none; text-align: center; text-wrap: balance; max-width: 12em; }
/* ⭐ ONE CAPTION PER PART still: the sound clause is a second LINE inside the
   part's own caption, not a second caption beside it */
.cl-glyph-snd { display: block; font-style: normal; color: var(--cl-quiet); }
/* ── 似 the pair: the twin seat (S4, 2026-09-06) ───────────────────────── */
/* Two shapes side by side at specimen size: this character LEFT in the brush's
   own brown (the parts row's --now grammar), the twin RIGHT in sumi and a door;
   under each its short name, and under the name the differing part as a small
   mark with its plain name. One shared clause in the quiet ink; on the sheet,
   two per-side lines, each opening with its glyph in that glyph's ink. No left
   rule, no quote dress, no pills inside the lines: the glyphs are the doors.
   The same block seats the card's told section, the sheet's foot and every
   miss on the pair (in the note seat, where the twin keeps the wrong tile's
   wash). A meaning runs longer than a part's name, so a caption wraps into
   its column instead of stretching the row. */
.cl-twin { margin: 1.9rem 0 0; }
.cl-twin .cl-glyphs { margin: 0; gap: clamp(1.6rem, 4vw, 2.6rem); align-items: flex-start; }
.cl-twin .cl-glyph { min-width: 6.5em; gap: 0.3rem; }
.cl-glyphs--twins .cl-glyph-w {
    font-size: var(--e3);
    letter-spacing: 0;
    text-transform: none;
    max-width: 9em;
    text-align: center;
    text-wrap: balance;
}
/* the part's name is a CAPTION like the parts row's, never a micro-label:
   "儿 legs" in sentence case, one step quieter than the name above it */
.cl-glyph-p {
    display: inline-flex;
    align-items: baseline;
    justify-content: center;
    gap: 0.35em;
    max-width: 12em;
    font-size: var(--e4);
    letter-spacing: 0;
    text-transform: none;
    line-height: 1.4;
    color: var(--cl-quiet);
    text-align: center;
    text-wrap: balance;
}
.cl-glyph-p [lang="ja"] {
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k6);
    line-height: 1;
    letter-spacing: 0;
    text-transform: none;
    color: var(--color-jp-text, #523E1E);
}
/* the twin rests in sumi — the one glyph on the seat that is not this page's —
   and, being a door, answers the pointer in the one hover ink */
.cl-glyph--twin .cl-glyph-g { color: var(--cl-ink); }
.cl-glyph--twin .cl-kref:hover { color: var(--cl-accent); }
/* the shape the learner wrote keeps the wrong tile's wash — on the SEAT, so the
   door inside it stays bare ink and the row's geometry does not move */
.cl-glyph--picked {
    background: rgba(216, 210, 200, 0.34);
    border-radius: 6px;
    padding: 0.35rem 0.55rem 0.4rem;
    margin: -0.35rem -0.55rem -0.4rem;
}
.cl-glyph--picked .cl-glyph-g { color: rgba(110, 104, 96, 0.6); }
.cl-glyph--picked .cl-kref:hover { color: var(--cl-accent); }
.cl-twin-shared { margin: 1rem 0 0; font-size: var(--e2); line-height: 1.65; color: var(--cl-quiet); max-width: 34em; }
.cl-twin-line { margin: 0.6rem 0 0; font-size: var(--e2); line-height: 1.65; color: var(--cl-ink); max-width: 34em; }
.cl-twin-lg {
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k5);
    line-height: 1;
    color: var(--cl-ink);
    margin-right: 0.35em;
}
.cl-twin-lg--now { color: var(--color-jp-text, #523E1E); }
.cl-verdictnote .cl-twin { margin-top: 0; }

/* ── the look before the telling ─────────────────────────────────────────── */
/* ⛔ WHAT IS BEING LOOKED AT IS ALL THAT IS ON THE PAPER. On the character
   page the telling — parts, story, the meaning, the way on — waits inside
   .cl-told, and it arrives together the moment the look is answered. A card
   with no guess authored never wears --looking, and its page is open at once. */
.cl-card--looking .cl-told { display: none; }
/* ⭐ S9: THE TOLD BODY ARRIVES IN TIERS, not as one 520ms fade: the parts row,
   the story, the twin seat, the closing line, the promise — one ink step
   apart in the order they are read — and the way on last. Every seat is laid
   when the block opens; only ink arrives on the clock. */
.cl-card--told .cl-told > * { animation: cl-unfold 320ms var(--ease-brush, ease) both; }
.cl-card--told .cl-told > :nth-child(2) { animation-delay: calc(var(--cl-ink-step) * 1); }
.cl-card--told .cl-told > :nth-child(3) { animation-delay: calc(var(--cl-ink-step) * 2); }
.cl-card--told .cl-told > :nth-child(4) { animation-delay: calc(var(--cl-ink-step) * 3); }
.cl-card--told .cl-told > :nth-child(n+5) { animation-delay: calc(var(--cl-ink-step) * 4); }
/* the way on: 520ms after the LAST content tier — which is the tier before it */
.cl-card--told .cl-told > .cl-foot:nth-child(2) { animation-delay: var(--cl-t-ink-long); }
.cl-card--told .cl-told > .cl-foot:nth-child(3) { animation-delay: calc(var(--cl-ink-step) * 1 + var(--cl-t-ink-long)); }
.cl-card--told .cl-told > .cl-foot:nth-child(4) { animation-delay: calc(var(--cl-ink-step) * 2 + var(--cl-t-ink-long)); }
.cl-card--told .cl-told > .cl-foot:nth-child(5) { animation-delay: calc(var(--cl-ink-step) * 3 + var(--cl-t-ink-long)); }
.cl-card--told .cl-told > .cl-foot:nth-child(n+6) { animation-delay: calc(var(--cl-ink-step) * 4 + var(--cl-t-ink-long)); }
/* ── S5 · TIER THREE, THE TELLING: one big air after the response, then the
   parts row, the story where the card has one, the twin seat, each a step
   apart; the second air; then the teacher's closing sentence in ink with the
   promise beneath it. Only these two values exist on the page. */
.cl-told { margin-top: var(--cl-air-between); }
.cl-told > .cl-glyphs { margin-top: var(--cl-air-in); }
.cl-told > :first-child { margin-top: 0; }
/* ⛔ AN ARRIVAL DOES NOT TRAVEL. The 6px rise meant fresh text moved relative
   to the lines around it for half a second — arriving and being read at the
   same time, which is the one thing this surface may not do. Ink only. */
@keyframes cl-unfold {
    from { opacity: 0; }
    to   { opacity: 1; }
}
/* ── spent furniture folds; arrivals grow — two ends of ONE reflow ───────── */
/* ⛔ .remove() closes geometry in one frame. A fold may close geometry, but it
   closes it the way the guess options already did: over the brush ease. JS
   (foldOut / growIn) measures the height and drives max-height inline; these
   classes carry the dress. Reduced motion never reaches them — foldOut removes
   outright and growIn stands down (state, not performance). */
.cl-spent {
    overflow: hidden !important;
    opacity: 0;
    margin-top: 0 !important;
    margin-bottom: 0 !important;
    padding-top: 0 !important;
    padding-bottom: 0 !important;
    pointer-events: none;
    transition: max-height var(--cl-fold) var(--cl-ease-move),
                opacity var(--cl-t-ink-quick) var(--ease-settle, ease),
                margin var(--cl-fold) var(--cl-ease-move),
                padding var(--cl-fold) var(--cl-ease-move);
}
.cl-arriving { transition: max-height var(--cl-fold) var(--cl-ease-move); }
/* ⭐ AND THE THIRD STATE: SPENT INK THAT CANNOT LEAVE. Furniture with read
   text below or beside it never folds — it goes quiet where it stands and the
   page clears it at the next turn. The seat is untouched, so nothing moves;
   the box is unpressable and out of the tab order the moment it is spent. */
/* ⭐ ROUND 2 (CR-2): the answered ask stays in its seat and dims to past ink */
.cl-ask--done, .cl-hand--done .cl-ask { color: var(--cl-ink-past); transition: color var(--cl-t-ink) var(--ease-settle, ease); }
.cl-quiet-out {
    color: transparent !important;
    pointer-events: none;
    transition: color var(--cl-t-ink) var(--ease-settle, ease),
                opacity var(--cl-t-ink) var(--ease-settle, ease);
}
.cl-quiet-out * { color: transparent !important; }

/* folded away until the hand has finished writing the glyph */
/* ── S5 · TIER TWO, THE LOOK: question, the row, the response — one air inside
   it. On the take the question goes to PAST INK on the ink clock (colour, never
   opacity: a wrong-guess reader re-reads it), the pressed words stay in ink and
   lose their button dress, and the response answers them one step in from the
   question's edge — the reply and the words it replies to share a left edge,
   which is what says "this answered that" on a page with no story and no tell. */
.cl-guess { display: none; margin: var(--cl-air-between) 0 0; }
.cl-guess--in { display: block; animation: cl-unfold 460ms var(--ease-brush, ease) both; }
.cl-guess-q {
    margin: 0 0 var(--cl-air-in);
    font-size: var(--e2);
    line-height: 1.7;
    max-width: 34em;
    transition: color var(--cl-t-ink) var(--ease-settle, ease);
}
.cl-card--taken .cl-guess-q { color: var(--cl-ink-past); }
.cl-guess-opts { display: flex; flex-wrap: wrap; gap: 0.6rem; }
.cl-guess-o {
    border: 1px solid var(--cl-rule);
    background: var(--cl-sheet);
    border-radius: var(--radius, 8px);
    padding: 0.5rem 0.9rem;
    font-family: inherit;
    font-size: var(--e2);
    line-height: 1.45;
    color: var(--cl-ink);
    text-align: left;
    cursor: pointer;
    box-shadow: 0 1px 2px rgba(var(--cl-sh), 0.04);
    transition: border-color var(--duration-fast, .15s) var(--ease-settle, ease),
                color var(--duration-fast, .15s) var(--ease-settle, ease);
}
.cl-guess-o:hover:not(:disabled) { border-color: var(--cl-accent); color: var(--cl-accent); }
.cl-guess-o:focus-visible { outline: var(--cl-ring); outline-offset: 2px; }
.cl-guess-o:disabled,
.cl-guess-o:disabled:hover { cursor: default; box-shadow: none; }
/* ⛔⛔ AND THE ONES NOT CHOSEN GO QUIET — THEY DO NOT LEAVE. They used to fold
   sideways and take the row off the page with them, so the response line the
   learner had just started reading rose under their eye (owner, 2026-08-30).
   A wrapping row cannot be animated honestly anyway: a continuous width drives
   a discontinuous re-wrap. So the row keeps its seat for the life of the page,
   the two untaken options fade to paper, and THE CHOSEN ONE STAYS as the
   receipt of what was pressed. Nothing moves; the answer arrives in ink. */
.cl-guess-o--gone {
    border-color: transparent;
    color: transparent;
    background: none;
    box-shadow: none;
    pointer-events: none;
    transition: color var(--cl-t-ink) var(--ease-settle, ease),
                border-color var(--cl-t-ink) var(--ease-settle, ease),
                background-color var(--cl-t-ink) var(--ease-settle, ease);
}
/* the pressed one, left standing in its seat: the words in the day's ink, the
   box gone — a bordered sheet rectangle is the page's "press me" grammar, and
   one left standing that does nothing spends the learner's attention (S5).
   Padding and size hold, so the row's geometry does not move a pixel. */
.cl-guess-o--took {
    border-color: transparent;
    background: none;
    color: var(--cl-ink-past);             /* ROUND 2 (CT-6): the spent press wears the question's past ink */
    box-shadow: none;
    pointer-events: none;
    transition: border-color var(--cl-t-ink) var(--ease-settle, ease),
                background-color var(--cl-t-ink) var(--ease-settle, ease),
                color var(--cl-t-ink) var(--ease-settle, ease);
}
/* ⭐ THE ANSWER IS ONE BLOCK (2026-09-08): the character's name, the reply to the
   look, the mark saying how settled that reply is, and the old printed form. It is
   laid at mount and hidden, so the row above it never moves when it arrives. */
.cl-guess-a[hidden] { display: none; }
.cl-guess-a > .cl-kname { margin: var(--cl-air-in) 0 0; padding-left: 0.9rem; }
.cl-guess-r {
    margin: var(--cl-air-in) 0 0;
    padding-left: 0.9rem;
    font-size: var(--e2);
    line-height: 1.75;
    max-width: 34em;
}
.cl-guess-a > .cl-kname + .cl-guess-r { margin-top: 0.35rem; }
/* the certainty mark is a caption on the claim above it, never a sentence of its
   own: settled scholarship says nothing at all, and only the two unsettled
   states print (js: certaintyMark) */
.cl-cert {
    margin: 0.3rem 0 0;
    padding-left: 0.9rem;
    font-size: var(--e3);
    line-height: 1.4;
    color: var(--cl-quiet);
}
/* the old printed form: the glyph in the page's own brush ink at reading size,
   its caption under it — a specimen, in the parts row's grammar */
.cl-oldform { margin: var(--cl-air-in) 0 0; padding-left: 0.9rem; }
.cl-oldform-g {
    display: block;
    font-family: var(--font-jp, 'Klee One', 'Noto Sans JP', serif);
    font-size: var(--k3);                  /* ROUND 2 (CR-4): one specimen size with the parts and the seat */
    line-height: 1.15;
    color: var(--color-jp-text, #523E1E);
}
.cl-oldform-cap { display: block; font-size: var(--e3); line-height: 1.4; color: var(--cl-quiet); }

/* the greeting he has answered for two months, rewriting itself in place.
   One cell, two inks: a cross-fade, which is also what a reader who asked
   for less motion gets (the reduced-motion block keeps opacity). */
.cl-rewrite { display: inline-grid; margin: 1.4rem 0 0; }
.cl-rewrite > span {
    grid-area: 1 / 1;
    font-size: var(--k5);
    line-height: 1.5;
    color: var(--color-jp-text, #523E1E);
    transition: opacity 620ms var(--ease-brush, ease);
}
.cl-rw-after { opacity: 0; }
.cl-card--rewrote .cl-rw-before { opacity: 0; }
.cl-card--rewrote .cl-rw-after { opacity: 1; }

/* ⭐ S5: the teacher's closing sentence is the one line the learner carries out
   of the room, and it was the quietest text on the page — grey under a black
   response, the weight of a caption. It stands in INK now; its position after
   the second air is what says "a last word". The promise beneath it is the one
   quiet prose on the page (it looks forward), on a line of its own — the two
   speech acts rode one grey paragraph. */
/* .cl-frame is the SET ITEM's scene clause (frame_en), dressed by .cl-item .cl-frame
   below. The once-only kind / two-sounds sentences that shared the class were CUT
   (owner 2026-09-09): the kind caption and the reading tag carry it. */
.cl-frame { margin: 0; font-size: var(--e2); line-height: 1.7; color: var(--cl-ink); max-width: 34em; }
/* ⭐ S5: ONE SPINE, ONE MEANING. The left bar belongs to QUOTED JAPANESE (the
   sentence, the aside, the passage); the sight footnote is quiet prose under
   the sentence's English, set in under the quote's own text column. */
.cl-note {
    margin: 1.1rem 0 0;
    padding-left: 1.2rem;
    font-size: var(--e3);
    line-height: 1.65;
    color: var(--cl-quiet);
    max-width: 34em;
}

/* ── the hand ────────────────────────────────────────────────────────────── */
/* ⛔ AIR, NOT A RULE. The line between one hand and the next was the last
   full-width divider on the meet card: a hairline drawn across paper to say
   "a new thing starts here", which the whitespace already says and the
   settled record above it says twice. The gap does the work. */
.cl-hands { margin-top: 2.2rem; }
.cl-handwrap + .cl-handwrap { margin-top: 3.4rem; }
/* (the two-rules-with-nothing-between case is gone with the divider above:
   the following hand no longer draws one, so the settle keeps its own.) */
/* ⭐ ROUND 2 (CT-7): THE QUESTION IS INK, not a caption — it read as the
   station eyebrow's footnote grey; the frame (the chapter continuing) wears
   the teacher's cut, and the eyebrow alone stays quiet */
.cl-ask { font-size: var(--e2); color: var(--cl-ink); margin-bottom: 0.6rem; }
.cl-built { display: flex; gap: 0.4rem; margin-bottom: 0.9rem; }
/* ⭐ S5: the meet's receipt — each kanji under the seats that spell it, this
   card's in the brush brown. One cell per group, as wide as its morae's seats
   plus the row's gaps, laid at mount and veiled until the row's verdict (the
   partition is part of what the build tests). Nothing moves when it lands. */
.cl-built-k {
    display: flex;
    gap: 0.4rem;
    margin: -0.45rem 0 0.9rem;
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k6);
    line-height: 1;
    color: var(--cl-ink);
}
.cl-bk {
    display: inline-block;
    flex: none;
    width: calc(var(--n, 1) * max(var(--cl-seat-w, 2.6rem), 2.6rem) + (var(--n, 1) - 1) * 0.4rem);
    text-align: center;
}
.cl-bk--now { color: var(--color-jp-text, #523E1E); }
/* ⭐⭐ S1: THE SEATS ARE BLANKS ON PAPER, NOT INPUT WELLS. The inlaid well
   (sumi at four percent, 10px corners, a dot in each empty one) put four grey
   rounded rectangles under the word and made a reading ask ten to twelve
   boxes on the paper. A seat is a RULE now — one 1px rule under each seat at
   its final width, never one rule under the whole answer, so the count of
   seats still says how many sounds the reading has. A typed kana sits in ink
   over its rule; the verdict stays ink (moss kana on a moss rule, mend gold on
   a gold rule); the okurigana the sentence already gave stands in quiet with
   NO rule, because it is not asked. Nothing moves at the settle. ⛔ One dress
   for every rack in the lesson — the reading build, the word build, the gap,
   the check. */
.cl-seat {
    /* ⛔ A SEAT IS AS WIDE AS THE WIDEST TILE ON ITS RACK. Fixed at 2.6rem a
       two-mora tile (しゅ, しょ) overflowed the well the moment it was seated.
       wireHand measures the rack once at mount and sets --cl-seat-w on the
       row, so every seat is laid at its final width before a tile lands —
       nothing widens under the hand, and no seat leaks which position holds
       the small kana (all of them share the one width). */
    width: var(--cl-seat-w, auto);
    min-width: 2.6rem;
    height: 3rem;
    white-space: nowrap;
    /* S2: one cell, so an old ink and a new one can stand in the same seat
       while the settle cross-fades between them */
    display: inline-grid;
    place-items: center;
    border-radius: 0;
    background: none;
    border-bottom: 1px solid rgba(var(--cl-sh), 0.34);
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k4);
    color: var(--cl-ink);
    position: relative;
    /* an EMPTY seat is not a hand: only a seat holding something can be
       pressed, and only that one says so */
    cursor: default;
    /* the verdict lands on the ink clock (320ms), the take-back hover on the quick one */
    transition: border-color var(--cl-t-ink) var(--ease-settle, ease),
                color var(--cl-t-ink) var(--ease-settle, ease);
}
.cl-seat > span { grid-area: 1 / 1; }
/* the cross-fade: the old kana's ink goes as the new one's comes, in place —
   never emptied and faded up from nothing */
.cl-seat-old { transition: color var(--cl-t-ink) var(--ease-settle, ease); }
.cl-seat-new { color: transparent; transition: color var(--cl-t-ink) var(--ease-settle, ease); }
.cl-seat--swap .cl-seat-old { color: transparent; }
.cl-seat--swap .cl-seat-new { color: inherit; }
.cl-seat--k { width: 3rem; height: 3.4rem; font-size: var(--k4); }
/* ⭐ A FILLED SEAT GIVES ITS TILE BACK. The press on the seat is the whole
   affordance — no ⌫ cap, no undo chrome — so it wears the house hand-dress:
   the pointer, and ink under it. Nothing moves. */
.cl-seat--filled { cursor: pointer; }
.cl-seat--filled:hover { border-bottom-color: var(--cl-accent); color: var(--cl-accent); }
.cl-seat--filled:focus-visible { outline: var(--cl-ring); outline-offset: 2px; }
/* ⛔ NO RED AND NO GREEN, anywhere a course marks an answer. A wrong seat
   goes to STONE — the ink drains out of it — and the right answer settles in
   full ink beneath. Nothing is scored, nothing is scolded, and the one warm
   colour in the lesson stays reserved for a miss that came back answered. */
/* the verdict is INK: the kana and the rule under it take the one colour */
/* ⭐⭐ THE ANSWER IS THE COLOUR OF THE ROW (owner 2026-08-30). It used to be
   two greys a shade apart — the learner pressed 答える and nothing on the page
   said yes or no, so the verdict had to be staged as a second beat of folding
   and revealing. A right seat goes MOSS, a wrong one goes GOLD, and the beat
   is not needed: nothing moves, one colour lands. S1: the wash under the seat
   is gone with the well, so the verdict rides the deeper INK triples. */
.cl-seat--good {
    color: rgb(var(--cl-moss-ink));
    border-bottom-color: rgb(var(--cl-moss-ink));
}
.cl-seat--bad {
    color: rgb(var(--cl-mend-ink));
    border-bottom-color: rgb(var(--cl-mend-ink));
}
/* ⭐⭐ S2: THE ANSWER YOU WERE OWED is the Japanese ink on the plain rule —
   the biggest, plainest thing on the page after a miss, and NEVER amber:
   amber means "a mora you got wrong" and lives only in the learner's own row
   beneath. (Named reversal of the 2026-08-30 gold retype, which dressed the
   correction and the failure in one colour.) */
.cl-seat--answer { color: var(--color-jp-text, #523E1E); border-bottom-color: rgba(var(--cl-sh), 0.34); }
/* ⭐⭐ S1: SPENT FURNITURE GOES TO PAPER, NOT TO A GHOST. The rack and 答える
   used to keep a trace of their ink at 22% — and the tiles the learner had
   pressed wore their own 22% on top, so the kana they had just built were the
   faintest things on the page (owner note c: "the options become pale"), and
   the spent 答える composed at nine percent. THE READING HAS ONE PLACE ON THE
   ASK: the seats. So the rack and the row under it keep their SEATS (nothing
   moves) and give up their ink entirely — one breath of fade, then paper.
   visibility, so the spent tiles leave the a11y tree and the tab order too. */
.cl-still {
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transition: opacity var(--cl-t-ink) var(--ease-settle, ease),
                visibility 0s linear var(--cl-t-ink);
}
/* ⛔ GIVEN, NEVER ASKED: the okurigana the sentence already prints. Quiet,
   fixed, no rule under it, no hand on it, and outside every verdict. */
.cl-seat--given { color: var(--cl-quiet); border-bottom-color: transparent; cursor: default; }
/* ⭐ S2: THE LEARNER'S OWN ROW, at reading size, directly under the seats:
   ink for the morae that were right, amber only on the ones that were not.
   No micro-label — the row's ink says whose it is. Its seat is laid at
   mount (the answer's kana, veiled, hold the line's true height), so the
   settle inks and nothing below it moves. */
/* ⭐ ROUND 2 (CT-8): THE LEARNER'S ROW LIES ON THE SEAT GRID. A settled miss
   used to print the built kana as free text under the seats (まち tight under
   も, ち under nothing) — no column to compare. Each mora takes a seat's width
   (--cl-seat-w, stamped by seatWidth with the seats'), so a wrong mora stands
   under the seat it was wrong in; a row of another length stays free-set and
   amber whole, because a grid would claim a positional match that is not there. */
.cl-yours {
    display: flex;
    gap: 0.4rem;
    margin: 0 0 1.3rem;
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k4);
    line-height: 1.3;
    min-height: 1.3em;
    color: var(--cl-ink);
    letter-spacing: 0;
}
.cl-yours-m { display: inline-block; width: max(var(--cl-seat-w, 2.6rem), 2.6rem); text-align: center; }
.cl-yours-free { letter-spacing: 0.04em; }
.cl-yours-x { color: rgb(var(--cl-mend-ink)); }
/* ⭐ S2: THE TAIL IS ONE CELL. The tools (the rack, 答える) and the note (the
   near-pass line, the honor, the tell) share a grid cell: the tools go to
   paper at the settle and the note inks over where they stood — under the
   learner's row, in a seat that has been there since mount, sized for the
   tallest thing it may have to say (reserveNote). Where the tiles ARE the
   answer's marks (a pick, a gap, a listen, a page question) they stay, and
   the note's cell stands after them. */
.cl-hand-tail { display: grid; }
.cl-hand-tail > .cl-tools, .cl-hand-tail > .cl-verdictnote, .cl-hand-tail > .cl-hand-said { grid-area: 1 / 1; align-self: start; }
/* ROUND 2 (CR-1): the learner's row and the note stack in the tools' cell —
   the cell is max(tools, said) at mount, so nothing moves at the settle */
/* ⛔ 2026-09-09 (owner: "I cannot enter readings"): the said cell is LATER in the
   DOM, so it painted OVER the rack and took every real pointer click while its
   veiled seats were still empty — DOM clicks (every pin) went through, a mouse
   did not. The wrapper is glass; only what is in it may take a hand. */
.cl-hand-tail > .cl-hand-said, .cl-hand-tail > .cl-verdictnote { pointer-events: none; }
.cl-hand-tail > .cl-hand-said > *, .cl-hand-tail > .cl-verdictnote > * { pointer-events: auto; }
.cl-hand-said .cl-yours { margin: 0 0 0.9rem; }
/* ROUND 2 (L5): the word's record follows the note in the same tail, on the next row */
.cl-hand-tail > .cl-record { grid-row: 2; }
.cl-hand-tail--after { margin-top: 1.4rem; }
.cl-verdictnote .cl-teach { margin-top: 0; }
.cl-verdictnote .cl-teach + .cl-teach--after { margin-top: 0.9rem; }
.cl-rack { display: flex; flex-wrap: wrap; gap: 0.5rem; }

/* ── Wave 1 · laws the room already believes in (review board 2026-08-29) ── */
/* the どこ line's seat is held through the tour: the hand-over from watching
   to being asked changes ink, never the painting's place under the eye */
#kotobaLesson .cl-pano-line[hidden] { display: block; visibility: hidden; }
/* while the street still has unfound words, the way out wears the quiet
   dress; it takes the primary dress back the moment the street rests */
.cl-next--soft { border-color: transparent; background: none; box-shadow: none; color: var(--cl-quiet); }
.cl-next--soft:hover { box-shadow: none; background: none; }
/* a clean pass retires the typed receipt — the head is the record now */
/* ⛔ and it never fades out either: the clock that used to hand the reading
   over to a record has no record to hand it to. */
/* the exit breathes out over the hall instead of cutting to it */
#kotobaLesson.cl-room--out { opacity: 0; pointer-events: none; transition: opacity 300ms var(--ease-settle, ease); }
/* while a guess is open the chrome must not answer the look: the day's title
   (and its English echo) hold their ink; "Lesson 8" stays. Seat kept. */
#kotobaLesson.cl-looking-room .cl-mark-title,
#kotobaLesson.cl-looking-room .cl-mark-en { visibility: hidden; }
/* the old form stands as a pale ghost above the question that names it */
.cl-guess-old { display: block; font-family: var(--font-jp, 'Klee One', serif); font-size: var(--k3); line-height: 1.2; color: var(--cl-quiet); opacity: 0.5; margin-bottom: 0.5rem; }

/* ── the day's character entry (close + bound into the book) ─────────────
   A dictionary entry on a sheet that will be bound: the character heads one
   shared axis, its returns hang off it — the glyph's position IS the lesson
   (気持ち/気をつけて lead with it; 天気/元気/電気 end with it). Annotations
   right-aligned like a specimen sheet. Receipts only, never seats. */
/* ⭐ ROUND 2 (CR-5): THE ENTRY IS PRINT, NOT PAPER. Three materials in the
   room — the ROOM (--cl-paper), a SHEET laid on the desk (--cl-sheet: the
   leaf, the tanzaku), an OBJECT pressed (sheet + hairline + the shadow: a
   tile, a chip, an option) — and a bordered second sheet beside the one
   textured leaf was a fourth. The entry keeps its grid and the foot's one
   hairline; air sets it off. */
.cl-family {
    background: none;
    border: 0;
    padding: 0;
    margin: 0 0 1.9rem;
    max-width: 36em;
}
.cl-fam-grid {
    display: grid;
    grid-template-columns: max-content max-content max-content 1fr;
    column-gap: 0;
    row-gap: 0.55rem;
    align-items: baseline;
}
.cl-fam-glyph {
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k3);
    line-height: 1.15;
    color: var(--color-jp-text, #523E1E);
    justify-self: center;
    padding-bottom: 0.3rem;
}
.cl-fam-headmeta { padding-left: 0.7rem; padding-bottom: 0.3rem; }
.cl-fam-headmeta [lang="ja"] { font-family: var(--font-jp, 'Klee One', serif); font-size: var(--k6); color: var(--cl-quiet); }
.cl-fam-headmeta i { font-style: normal; font-size: var(--e3); color: var(--cl-quiet); margin-left: 0.6em; }
.cl-fam-row { display: contents; cursor: pointer; }
.cl-fam-row:focus-visible .cl-fam-k { outline: var(--cl-ring); outline-offset: 2px; }
.cl-fam-pre, .cl-fam-k, .cl-fam-rest [lang="ja"]:first-child {
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k4);
    line-height: 1.3;
    color: var(--cl-ink);
}
.cl-fam-pre { text-align: right; }
.cl-fam-k { justify-self: center; color: var(--color-jp-text, #523E1E); }
.cl-fam-rest { padding-left: 0; }
.cl-fam-r { font-family: var(--font-jp, 'Klee One', serif); font-size: var(--k6); color: var(--cl-quiet); margin-left: 0.7em; }
.cl-fam-when { font-style: normal; font-size: var(--e3); color: var(--cl-quiet); justify-self: end; text-align: right; padding-left: 1.2rem; }
/* a slipped word keeps its seat in the family, in the day-lived ink */
.cl-fam-row--slip .cl-fam-pre, .cl-fam-row--slip .cl-fam-k,
.cl-fam-row--slip .cl-fam-rest [lang="ja"] { color: var(--cl-ink-past); }
.cl-fam-row:hover .cl-fam-k { color: var(--cl-accent); }
.cl-fam-foot {
    margin: 1rem 0 0;
    padding-top: 0.8rem;
    border-top: 1px solid var(--cl-rule);
    font-size: var(--e2);
    color: var(--cl-quiet);
}
/* the book binds the entry at the leaf's measure */
/* in the BOOK the entry is bound inside the leaf: one hairline parts it from the day's prose */
.cl-reread .cl-page .cl-family { position: relative; z-index: 1; margin: 1.6rem 0 0; padding-top: 1.2rem; border-top: 1px solid var(--cl-rule); }
.cl-tile {
    min-width: 2.9rem;
    padding: 0.55rem 0.7rem;
    border: 1px solid var(--cl-rule);
    background: var(--cl-sheet);
    border-radius: var(--radius, 8px);
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k4);
    color: var(--cl-ink);
    cursor: pointer;
    box-shadow: 0 1px 2px rgba(var(--cl-sh), 0.04);
    transition: border-color var(--duration-fast, .15s) var(--ease-settle, ease),
                background-color var(--duration-fast, .15s) var(--ease-settle, ease),
                color var(--duration-fast, .15s) var(--ease-settle, ease),
                box-shadow var(--duration-fast, .15s) var(--ease-settle, ease);
}
.cl-tile--kanji { font-size: var(--k4); min-width: 3.4rem; padding: 0.6rem 0.8rem; }
.cl-tile:hover:not(:disabled) {
    border-color: var(--cl-accent);
    color: var(--cl-accent);
    box-shadow: 0 2px 7px rgba(var(--cl-sh), 0.08);
}
.cl-tile:focus-visible { outline: var(--cl-ring); outline-offset: 2px; }
/* ⭐ S1: a tile the learner has seated has MOVED — what stays on the rack is
   its quiet ink with no box, never a 22% ghost of the button (which then
   multiplied with the spent rack's own fade into a five-percent smear) */
/* ROUND 2 (CR-2): a lifted tile leaves a SOCKET — the hairline stays, the ink goes — not a ghost of the kana */
.cl-tile--used { border-color: var(--cl-rule); background: none; box-shadow: none; color: transparent; pointer-events: none; }
.cl-tile:disabled { cursor: default; }
/* ⭐⭐ S2: ONE MARK GRAMMAR, LESSON-WIDE, three dresses and no fourth.
   Pressed-and-right = the MOSS SEAT (a moss fill, moss ink, no border).
   Wrong press = the quiet border with the stone wash. The answer you missed
   = the same moss seat, no underline — underline means one thing only, the
   word being asked (.cl-target). Two objects, one meaning: a reading seat is
   a rule on paper, so moss there is ink and rule colour; a tile is a box, so
   moss is a filled seat. Guess options, meaning lines, page-question tiles
   and rack tiles all take these three. (The meet's ungraded look keeps its
   neutral receipt, .cl-guess-o--took: no verdict colour on a guess.) */
.cl-tile--picked,
.cl-tile--answer {
    border-color: transparent;
    background: rgba(var(--cl-moss), 0.16);
    color: rgb(var(--cl-moss-ink));
    box-shadow: none;
}
/* ROUND 2 (CR-2): the wrong tile wears no frame — the answer is the heaviest
   thing on the row, the miss a stone wash */
.cl-tile--wrong {
    border-color: transparent;
    background: rgba(216, 210, 200, 0.34);
    color: rgba(110, 104, 96, 0.6);
    box-shadow: none;
}
.cl-commitrow { margin-top: 1.4rem; }

/* ── the scene that asks the item ────────────────────────────────────────── */
/* One clause of the day's own story above the line, in the chrome face and
   the quiet ink: it places the sentence somewhere without competing with it.
   Not italic — an italic clause reads as an aside about the exercise, and
   this is the story still going on.
   ⛔ Scoped to the item it dresses: the teaching FRAMES (the character page's
   kind sentence, the word page's two-sounds sentence) wear the same class and
   their own rule above; an unscoped rule here, later in the file, was quietly
   re-dressing them in the scene's quiet ink. */
.cl-item .cl-frame { margin: 0 0 1.1rem; max-width: 34em; }

/* what the miss says: the pick honored, then the tell, word for word, once */
.cl-teach { margin-top: 1.5rem; }
/* the honoring is the teacher answering THIS learner: running prose, no quote
   rule — the rule belongs to the registry tell below it, which is the same
   eight words every miss on that pair gets */
.cl-honor {
    margin: 0 0 0.8rem;
    font-size: var(--e2);
    line-height: 1.7;
    color: var(--cl-ink);
    max-width: 34em;
}
/* a READING tell on a miss is a line of prose in ink — no quote bar: since S4
   the shape tell is the twin seat everywhere it prints, and since S5 the left
   bar belongs to quoted Japanese alone (the "same sentence, same dress" law
   this bar once served now lives inside the seat) */
.cl-tellline {
    display: inline-block;
    font-size: var(--e2);
    line-height: 1.65;
    color: var(--cl-ink);
}
.cl-rule { font-size: var(--e2); color: var(--cl-quiet); }
.cl-rule [lang="ja"] { color: var(--cl-ink); font-size: var(--k6); }

/* the answer settles — ONE contract on every desk: lean before the answer;
   everything after. ⭐ S2: THE ASK IS THE RECORD. A gap, a read and a build
   keep the sentence they asked with (the blank fills in place, the target
   takes ink) and take the English — with the target's meaning and the
   sentence's own voice — in a held seat under the original line; nothing is
   quoted twice and no headword repeats what the seats already spell. A pick
   and a listen have no seats, so they keep the word row and the reveal. */
.cl-record--line {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.3rem 0.9rem;
    margin: 0 0 1.5rem;
    font-size: var(--e3);
    line-height: 1.6;
    max-width: 34em;
}
.cl-record-g { color: var(--cl-ink); }
.cl-record-en { color: var(--cl-quiet); }
.cl-record-oto { margin-left: 0.1rem; }
/* beside the kanji seats: the reading and the meaning the seats do not spell */
.cl-record--beside {
    display: flex;
    align-items: baseline;
    gap: 0.9rem;
    margin: -0.4rem 0 1.4rem;
}
.cl-record--word { margin-top: 1.4rem; }
.cl-record--sent { margin-top: 1.2rem; }
/* the hairline under a record: only where a sentence was printed, and never
   on a miss (the mark must not say "right" on the item just missed).
   ⛔ Its seat is laid at mount — padding and a transparent rule from the
   first frame — so the settle inks the rule and grows nothing (+9px measured
   when the padding arrived with the class). */
.cl-record--sent {
    padding-bottom: 0.55rem;
    border-bottom: 1px solid transparent;
    transition: border-color var(--cl-t-ink) var(--ease-settle, ease);
}
.cl-record--sent.cl-settled:not(.cl-settled--miss) { border-bottom-color: var(--cl-rule); }
.cl-settled-row { display: flex; align-items: baseline; gap: 0.9rem; flex-wrap: wrap; }
.cl-settled-g { font-size: var(--e3); color: var(--cl-quiet); }
.cl-sent--settled { margin-top: 1rem; margin-bottom: 0.6rem; }
/* after a miss the answer settles WITHOUT the hairline a right answer gets:
   the mark under the sentence must never say "right" on the item just missed
   (S2: the rule stays transparent — .cl-record--sent.cl-settled:not(--miss) —
   and the seat's padding was laid at mount, so a miss removes nothing) */
/* ⭐ KINTSUGI GOLD IS FOR RECOVERY AND NOTHING ELSE. Here that is a miss that
   came back and was answered; the close's .cl-moment--back hairline is the
   same law told once more, over the same repair, at the end of the night. Two
   sites, one meaning — never a third, and never a decoration. */
/* ⭐ GOLD IS THE REPAIR, AND IT IS A LEFT HAIRLINE. A word that slipped and
   came back clean wears the kintsugi seam the close's own moment line wears —
   one grammar for gold in this course, on the one axis it lives on. It blooms
   in over a breath and then simply stays; there is no label, because the
   learner knows exactly what just happened. ⛔ Nowhere else in the walk. */
.cl-record { position: relative; }
.cl-settled--recovered { border-bottom-color: var(--cl-rule); }
/* S2: the seam stands in the MARGIN, off the text — a left border with its
   padding moved the whole record 15px right at the settle */
.cl-settled--recovered::before {
    content: '';
    position: absolute;
    left: -0.85rem;
    top: 0;
    bottom: 0;
    width: 2px;
    background: var(--cl-gold);
    animation: cl-gold-in 600ms var(--ease-settle, ease) both;
}
@keyframes cl-gold-in {
    from { opacity: 0; }
    to   { opacity: 1; }
}
/* the standing title's one visible beat, the night 火曜日、あめ becomes
   火曜日、雨. Ink blooming and nothing else — no glow, no scale, no sound. */
.cl-settled-w { font-family: var(--font-jp, 'Klee One', serif); font-size: var(--k4); color: var(--color-jp-text, #523E1E); }
.cl-settled-r { font-size: var(--k6); color: var(--cl-quiet); }
/* ⭐ THE SETTLE CLOCKED TO THE CLIP (runner: clockSettle, and only where the
   corpus has a clip and full motion is wanted). Three stamps on one block:
   voiced = the headword takes its ink as the sound starts, over the clip's own
   length; named = the reading and the meaning at the word's middle; said = the
   sentence on the last breath. INK ONLY — every line already holds its seat,
   so nothing moves while the word is spoken, and the colour carries the fade
   rather than opacity, which would composite the whole block. */
.cl-settled--clocked .cl-settled-w {
    color: rgba(82, 62, 30, 0.28);
    transition: color var(--cl-say, 700ms) var(--ease-settle, ease);
}
.cl-settled--clocked.cl-settled--voiced .cl-settled-w { color: var(--color-jp-text, #523E1E); }
/* ⛔ AND THE CLOCK KNOWS BOTH RECORD SHAPES. On the meet the record composes
   in the card's HEAD (the word was already standing there, so it never fades
   — only the reading coming out from under its veil and the meaning joining
   it are new); on the set and the check it composes in the settled block. Same
   three stamps, same one clock, two shapes of paper. */
.cl-settled--clocked .cl-settled-r,
.cl-settled--clocked .cl-settled-g,
.cl-settled--clocked .cl-record-g,
.cl-settled--clocked .cl-reading-ink,
.cl-settled--clocked .cl-gloss-line {
    color: transparent;
    transition: color 320ms var(--ease-settle, ease);
}
.cl-settled--clocked.cl-settled--named .cl-settled-r,
.cl-settled--clocked.cl-settled--named .cl-settled-g,
.cl-settled--clocked.cl-settled--named .cl-reading-ink,
.cl-settled--clocked.cl-settled--named .cl-gloss-line { color: var(--cl-quiet); }
.cl-settled--clocked.cl-settled--named .cl-record-g { color: var(--cl-ink); }
/* the record line's English lands on the last breath, with the sentence */
.cl-settled--clocked .cl-record-en { color: transparent; transition: color 420ms var(--ease-settle, ease); }
.cl-settled--clocked.cl-settled--said .cl-record-en { color: var(--cl-quiet); }
.cl-settled--clocked .cl-record-oto { opacity: 0; transition: none; }
.cl-settled--clocked.cl-settled--said .cl-record-oto { opacity: 1; transition: opacity 420ms var(--ease-settle, ease); }
.cl-settled--clocked .cl-sent--settled {
    border-left-color: transparent;
    transition: border-color 420ms var(--ease-settle, ease);
}
:where(.cl-settled--clocked .cl-sent--settled [lang="ja"]),
.cl-settled--clocked .cl-sent--settled .cl-sent-en {
    color: transparent;
    transition: color 420ms var(--ease-settle, ease);
}
.cl-settled--clocked.cl-settled--said .cl-sent--settled { border-left-color: var(--cl-rule); }
:where(.cl-settled--clocked.cl-settled--said .cl-sent--settled [lang="ja"]) { color: var(--cl-ink); }
.cl-settled--clocked.cl-settled--said .cl-sent--settled .cl-sent-en { color: var(--cl-quiet); }
/* the target word keeps the block's clock too — its own ink would otherwise
   stand alone in a still-transparent sentence */
.cl-settled--clocked .cl-sent--settled .cl-sent-hit {
    color: transparent;
    transition: color 420ms var(--ease-settle, ease);
}
.cl-settled--clocked.cl-settled--said .cl-sent--settled .cl-sent-hit { color: var(--color-jp-text, #523E1E); }
/* ⛔ THE CHIPS KEEP THE RECORD'S CLOCK — AND THE HIDE IS INSTANT. The head
   chip un-hides the moment the asking class drops and the clock veils it the
   same tick; with the transition declared on the HIDING rule the chip FADED
   out in full view — the flash the owner caught (2026-08-30). Opacity 0 lands
   with no transition; only the arrival breathes, each chip on its own line:
   the head's with the reading, the sentence's with the sentence. */
.cl-settled--clocked .cl-oto,
.cl-settled--clocked .cl-sent-oto { opacity: 0; transition: none; }
.cl-settled--clocked.cl-settled--named .cl-oto,
.cl-settled--clocked.cl-settled--said .cl-sent-oto {
    opacity: 1;
    transition: opacity 420ms var(--ease-settle, ease);
}

/* ── every sentence has a voice ──────────────────────────────────────────── */
/* ⭐ THE SENTENCE IS THE CONTROL. A ♪ beside every line would be a column of
   buttons down a page whose whole claim is that it reads like a book. So the
   line takes the press itself and says so the way every readable thing here
   says it: ink under the pointer, and not one pixel of movement. ⛔ The class
   is added ONLY where the manifest has a clip — a dead affordance on a page
   about reading teaches distrust of the paper. */
.cl-say {
    cursor: pointer;
    transition: color var(--duration-fast, .15s) var(--ease-settle, ease);
}
.cl-say:hover { color: var(--cl-accent); }
.cl-say:focus-visible { outline: var(--cl-ring); outline-offset: 3px; }
/* and while it is speaking it holds that ink, so the eye knows which line the
   voice belongs to on a page carrying several */
.cl-said--on,
.cl-said--on:hover { color: var(--cl-accent); }
/* IMM-3: the 聞く door while the teacher is reading — the same said ink */
.cl-door--on, .cl-door--on:hover { color: var(--cl-accent); }
.cl-sent {
    margin: 1.6rem 0 0;
    padding-left: 1.2rem;
    border-left: 1px solid var(--cl-rule);
}
/* the JP line is INLINE so its voice mark rides the end of the line itself —
   as a block it pushed the mark onto a row of its own between the sentence
   and its English, a shelf holding one small button */
.cl-sent [lang="ja"] { display: inline; font-size: var(--k5); line-height: 1.9; }
/* ⭐ S5: SENTENCES NEVER BREAK INSIDE A WORD. Every course sentence span is set
   keep-all / strict: a line breaks only after punctuation, at the <wbr> laid
   between two tokens of the leaf, and — the last resort, a clause wider than
   its column — anywhere. 書き|ます and いま|す no longer happen. */
.cl-sent [lang="ja"], .cl-line, .cl-aside-jp, .cl-meanline, .cl-q-ask, .cl-rb-jp, .cl-seam-jp, .cl-phrase-jp {
    word-break: keep-all;
    line-break: strict;
    overflow-wrap: anywhere;
}
/* ⛔ THE BASE INK IS IN :where(), SO A HOVER CAN WIN. .cl-say:hover and this
   rule tied at (0,2,0) and source order handed the tie to the base colour:
   no sentence on the page ever answered the pointer (S0, 2026-09-06). The
   settle clock's colours below are :where()'d for the same reason. */
:where(.cl-sent [lang="ja"]) { color: var(--cl-ink); }
.cl-sent-en { display: block; font-size: var(--e3); color: var(--cl-quiet); margin-top: 0.45rem; }
/* today's word inside its own example: the headword's warm ink, and WEIGHT with
   it. ⛔ Colour alone could not carry this — warm brown against the street's
   sumi at reading size is a difference a screen does not deliver, and the word
   the sentence exists to show read as unmarked. Weight is the mark; the colour
   says which mark it is. Still no box and no pill: the door pills stay doors.
   ⛔ The clock stages COLOUR only, so the weight never changes mid-settle. */
.cl-sent-hit { color: var(--color-jp-text, #523E1E); font-weight: 600; }

/* ── 4 · the seam ────────────────────────────────────────────────────────── */
.cl-seam { padding-top: var(--cl-origin-page); }
/* ⭐ ROUND 2 (CT-2): BROWN MEANS ONE THING. On the leaf only the tokens this
   chapter taught wear the JP brown; the seam line, the readback, the beat
   line and the night paper's phrase printed WHOLE lines in it. They read in
   the reading ink now and the runner marks the chapter's words (.cl-chap). */
.cl-seam-jp { font-family: var(--font-jp, 'Klee One', serif); font-size: var(--k4); margin: 1.8rem 0 0; color: var(--cl-ink); }
.cl-chap { color: var(--color-jp-text, #523E1E); }
/* the line's own quiet English, directly beneath it — the one sentence on
   the stop-or-go screen must be readable (a teacher's ASIDE was cut from
   this seat: an explainer is not what the line means) */
.cl-seam-en {
    margin: 0.5rem 0 0;
    font-size: var(--e3);
    line-height: 1.6;
    color: var(--cl-quiet);
    max-width: 34em;
}
.cl-foot--pair { gap: 2rem; }
.cl-foot--pair .cl-prev { margin-right: 0; }

/* ── 5b · second sounds ──────────────────────────────────────────────────── */
/* ⛔ it had no origin at all, so it began at the stage's own top edge — the
   eyebrow landing under the standing mark, the one station in the lesson
   that opened crushed against the chrome */
/* ROUND 2: the second-readings screen is a four-thing page that scrolls on
   every glass; it opens where a page opens, not a quarter down like a
   one-thing ask (at 1080 that alone cost 200px of scrolling) */
.cl-second-screen { padding-top: var(--cl-origin-page); }
.cl-secondrow { display: flex; gap: 1.4rem; margin-bottom: 2.2rem; }
.cl-second-k { font-family: var(--font-jp, 'Klee One', serif); font-size: var(--k3); line-height: 1; color: var(--color-jp-text, #523E1E); }
.cl-second-body { flex: 1 1 auto; min-width: 0; }
.cl-second-body p { margin: 0; font-size: var(--e2); line-height: 1.7; }
/* ⭐ S10: THE LEDGER. glyph · the word it was met in (the sound the learner
   has) · the word it wears the new sound in. The seat under the new word is
   ONE grid cell holding both the two kana tiles and the reading, laid at
   mount: the press swaps ink and never geometry. The response seat below the
   why-line is held for its one line from the start (measured: every response
   the copy can make fits one line at 34em). */
.cl-second-screen .cl-second-ask-line { margin: 0 0 1.8rem; font-size: var(--e2); color: var(--cl-ink); }
.cl-ledger { display: flex; flex-wrap: wrap; gap: 0.6rem 2.6rem; align-items: flex-start; margin: 0 0 0.9rem; }
.cl-lg { display: flex; flex-direction: column; align-items: flex-start; gap: 0.25rem; }
.cl-lg-w { font-family: var(--font-jp, 'Klee One', serif); font-size: var(--k4); line-height: 1.2; color: var(--cl-ink); }
.cl-lg-k { color: var(--color-jp-text, #523E1E); }
.cl-lg-r { font-style: normal; font-family: var(--font-jp, 'Klee One', serif); font-size: var(--k6); line-height: 1.2; color: var(--cl-quiet); }
.cl-lg-seat { display: grid; align-items: center; justify-items: start; min-height: 2.3rem; }
.cl-lg-seat > * { grid-area: 1 / 1; }
.cl-lg-seat--asked .cl-lg-r--new { visibility: hidden; }
.cl-lg-seat:not(.cl-lg-seat--asked) .cl-lg-r--new { animation: cl-unfold var(--cl-t-ink) var(--ease-settle, ease) both; }
.cl-lg-opts { display: inline-flex; gap: 0.45rem; }
.cl-lg-o { font-family: var(--font-jp, 'Klee One', serif); font-size: var(--k5); padding: 0.3rem 0.7rem; min-height: 2.3rem; line-height: 1.2; }
.cl-second-body .cl-second-why { margin: 0 0 0.6rem; max-width: 34em; }
.cl-second-body .cl-second-r { margin: 0 0 0.9rem; min-height: 1.75em; line-height: 1.75; max-width: 34em; color: var(--cl-ink); }
.cl-second-r:not([data-veil]) { animation: cl-unfold var(--cl-t-ink) var(--ease-settle, ease) both; }
.cl-secondrow--form { margin-top: 0.4rem; }

/* ── 6 / 8 · the set and the check: bare paper ───────────────────────────── */
/* One item on an empty sheet, composed rather than dropped in the corner:
   it begins a fifth of the way down, which is where the eye lands first, and
   the sentence is the first thing there. Nothing counts it. */
/* ⛔ ONE LEFT EDGE. The item was auto-CENTRED on its 34em measure inside a
   680px stage while the station's own opening line stood at the stage's edge
   — two left edges 68px apart on the same screen, and neither of them the
   line every other station reads on. The measure is right and the centring
   was what made it a second spine: the item keeps 34em and hangs, with the
   line above it and the foot below it, off the one edge. */
.cl-set { padding-top: var(--cl-origin-ask); }
/* IMM-6 (round 2): a place's plate above the first item of that place, at the
   reading measure, and the ask keeps its own seat beneath it */
.cl-set .cl-vig { width: min(100%, 34em); margin-bottom: 1.6rem; }
/* a scene plate IS the item's opening: the ask sits under it at the page origin, not a quarter down, so the record and the way on still fit a 1080 glass */
.cl-set:has(> .cl-vig) { padding-top: var(--cl-origin-page); }
.cl-set .cl-station-line,
.cl-set .cl-item { max-width: 34em; margin-left: 0; margin-right: auto; }
.cl-gapline {
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k4);
    line-height: 2;
    margin-bottom: 0.6rem;
    color: var(--cl-ink);
}
/* a line whose record seat is empty (no English authored) keeps its old air */
.cl-gapline + .cl-hand { margin-top: 1.2rem; }
/* the gap in a printed sentence is the same well, set inline in the line.
   ⭐ It wears a WRITING LINE: the wash alone was near-invisible on stone
   paper, and a gap the eye cannot find is a question the sentence never
   quite asks. The underline stays under the landed answer — the seat that
   was filled, not erased. */
.cl-blank {
    display: inline-block;
    min-width: 1.9rem;
    padding: 0 0.15em;
    border-radius: 8px 8px 0 0;
    background: rgba(var(--cl-sh), 0.045);
    border-bottom: 2px solid rgba(82, 62, 30, 0.4);
    text-align: center;
}
/* S2: the landed answer keeps its writing line and drops the wash — geometry
   unchanged, only the ink; the reading rides as ruby when the record inks */
.cl-blank--filled { background: none; }
/* ⛔ the ruby must not grow the line: a ruby annotation box adds its own
   height to a line box (+5px measured, and every seat below moved), so the
   reading floats over the blank, out of the flow, in the room the k4 line's
   double leading already leaves above the glyph */
.cl-blank { position: relative; }
.cl-blank-r {
    position: absolute;
    left: 0;
    right: 0;
    top: -0.02em;
    text-align: center;
    font-size: 0.42em;
    line-height: 1;
    color: var(--cl-quiet);
    letter-spacing: 0.04em;
    pointer-events: none;
}
/* the asked word is marked in the brush ink the gap blank already uses —
   indigo stays reserved for things that answer the pointer */
.cl-target { text-decoration: none; border-bottom: 2px solid rgba(82, 62, 30, 0.4); padding-bottom: 1px; }
.cl-cue {
    font-size: var(--e1);
    margin-bottom: 1.6rem;
    color: var(--cl-ink);
}
.cl-cue[lang="ja"] { font-family: var(--font-jp, 'Klee One', serif); font-size: var(--k4); }
.cl-built--k { margin-bottom: 0.9rem; }
.cl-yours--k { font-size: var(--k4); }

.cl-listen { margin-bottom: 1.8rem; }

/* ── 7 · the question and its doors ──────────────────────────────────────── */
.cl-q { margin-top: 2.6rem; }
.cl-q-ask { font-family: var(--font-jp, 'Klee One', serif); font-size: var(--k4); margin-bottom: 1.3rem; }
.cl-doors { margin-top: 1.8rem; display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.2rem 1.8rem; }
/* born hidden on the first read (the doors open on the answered question):
   an author display needs its own [hidden] reset (the house's hidden law) */
.cl-doors[hidden] { display: none; }

/* ── 8b · the way home: the find-everything painting ─────────────────────── */
/* The painting runs wide, like the door's, and everything else on the page
   keeps the reading column. ⛔ The zones over it are INVISIBLE: a picture with
   boxes drawn on it is a diagram, and the page's whole claim is that the town
   reads as a town. The cursor is the only tell, and it tells the truth. */
.cl-stage[data-screen="pano"] { width: 100%; }
/* ⛔ AND IT STILL STARTS ON THE SPINE. Centred on its own width the street
   began 180px left of every other station — the widest page in the lesson
   was also the only one that moved the margin the eye had been reading down
   all evening. It hangs off the column's left edge and runs RIGHT from there;
   the line, the row of found words and the way on hang off the same edge.
   ⛔ The width is capped in vw, never in %: .cl-pano-art's height is a calc
   off this number, and a percentage inside a height resolves against a
   height. 340px is the column's own half — the same constant the rail
   hangs on, and the two must agree or the street and the column part. */
.cl-pano {
    --cl-spine: max(0px, calc((100% - var(--cl-col)) / 2));
    --cl-pano-w: min(980px, 50vw + 340px - 1.5rem, 92vh);
    padding-top: var(--cl-origin-page);
}
.cl-pano-line,
.cl-pano-found,
.cl-pano .cl-foot {
    width: var(--cl-pano-w);
    margin-left: var(--cl-spine);
    margin-right: auto;
}
.cl-pano-line {
    font-size: var(--e2);
    line-height: 1.7;
    color: var(--cl-ink);
    margin-top: 0;
    margin-bottom: 1.4rem;
}
/* sized from ONE number so the box keeps the painting's ratio exactly — the
   scene layer's coordinates are the image's own, and a box a few percent off
   the ratio puts the station board off the station */
.cl-pano-art {
    position: relative;
    width: var(--cl-pano-w);
    height: calc(var(--cl-pano-w) / 1.5);
    margin: 0 auto 1.3rem var(--cl-spine);
    border: 1px solid var(--cl-rule);
    overflow: hidden;
    container-type: size;
}
.cl-pano-art img { display: block; width: 100%; height: 100%; object-fit: cover; }
/* ⛔ ONE CURSOR, EVERYWHERE ON THE PAINTING. Eight invisible hotspots each
   flipping the pointer drew the answers in the cursor: a learner could sweep
   the street and read the map off their own mouse without looking at the
   picture once. The whole painting takes the press, the hit test is geometry,
   and what tells you anything is ink. */
.cl-pano-art { cursor: pointer; }
.cl-pano-art:focus-visible { outline: var(--cl-ring); outline-offset: 2px; }
.cl-pano-marks { position: absolute; inset: 0; z-index: 2; pointer-events: none; }
/* ⛔ WHAT LIVES IN THE PAINTING SITS ABOVE THE PAINT — the veil over a painted
   word has to be over it to soften it, and a typeset board takes its own press.
   Neither swallows the painting's press: the veil takes none at all. */
.cl-pano-art .cl-scene { z-index: 3; }
/* the word standing BESIDE what it names: a chip of washi with the word in ink
   and its sound small underneath, the tanzaku's own paper so it reads over
   rain, with a hairline run back to the thing itself. ⛔ It never sits ON its
   referent — a tag laid over a silhouette hides the one thing it points at,
   and over the painted board it would print 駅 twice. It arrives in INK ALONE. */
.cl-pano-blooms { position: absolute; inset: 0; z-index: 4; pointer-events: none; }
/* the leaders live in the painting's own 100×100 space, so an endpoint lands
   on its referent at every size while the stroke stays a hairline */
.cl-pano-leads { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; }
.cl-pano-leads line {
    stroke: rgba(88, 76, 60, 0.6);
    stroke-width: 1.5;
    opacity: 0;
    transition: opacity 420ms var(--ease-brush, ease);
}
.cl-pano-leads line.cl-pano-lead--in { opacity: 1; }
/* ⛔ AND THE LEADER LANDS ON A POINT, NOT IN THE AIR. A line that simply stops
   somewhere over a car reads as a line that missed; a dot ON the thing is what
   makes the tag point. It is DOM rather than svg because the leaders' viewBox
   is stretched to the painting's shape, and a circle drawn in there comes out
   an ellipse. */
.cl-pano-dot {
    position: absolute;
    width: 3px;
    height: 3px;
    margin: -1.5px 0 0 -1.5px;
    border-radius: 50%;
    background: rgba(88, 76, 60, 0.75);
    opacity: 0;
    transition: opacity 420ms var(--ease-brush, ease);
}
.cl-pano-dot--in { opacity: 1; }
/* ⭐ THE BOARD THAT NEEDS NO TAG. 駅 is painted onto the station in the brush's
   own hand, so a washi chip beside it would print the word twice. What it wears
   is the light a thing wears while it is being said — the picture's own lamp
   coming up on it, and gone again when the word is done. */
.cl-pano-glow {
    position: absolute;
    border-radius: 4px;
    border: 1px solid rgba(88, 76, 60, 0.5);   /* gap-3: an edge a still and a reduced-motion reader can see */
    background: radial-gradient(closest-side, rgba(255, 244, 214, 0.55), rgba(255, 244, 214, 0));
    opacity: 0;
    transition: opacity 520ms var(--ease-brush, ease);
}
.cl-pano-glow--in { opacity: 1; }
/* ⛔ A MISS IS INK AND NOTHING ELSE — it makes no sound, it leaves no mark, and
   nothing anywhere counts it. The ripple says "not there" where the hand
   landed; the second miss in a row makes the PLACE breathe, which is the only
   teaching a learner who cannot find something actually needs. */
.cl-pano-ripple {
    position: absolute;
    width: 2.4rem;
    height: 2.4rem;
    margin: -1.2rem 0 0 -1.2rem;
    border-radius: 50%;
    border: 1px solid rgba(88, 76, 60, 0.55);
    opacity: 0;
    animation: cl-pano-ripple 600ms var(--ease-brush, ease) both;
}
@keyframes cl-pano-ripple {
    0%   { opacity: 0.75; transform: scale(0.35); }
    100% { opacity: 0; transform: scale(1); }
}
/* ⛔ AND IT HAS AN EDGE. A wash alone is invisible on the half of a painting
   that is already pale — 雨's own place is the SKY, so a soft light over it
   said nothing at exactly the moment the learner needed telling. The mark is
   a ring with the light inside it: legible over rain, road or lit window, and
   the same mark a reader who asked for less motion gets standing still. */
.cl-pano-breathe {
    position: absolute;
    border-radius: 8px;
    border: 1px solid rgba(88, 76, 60, 0.5);
    background: radial-gradient(closest-side, rgba(251, 248, 242, 0.42), rgba(251, 248, 242, 0));
    opacity: 0;
    animation: cl-pano-breathe 900ms var(--ease-settle, ease) both;
}
@keyframes cl-pano-breathe {
    0%, 100% { opacity: 0; }
    45%      { opacity: 1; }
}
/* the same two meanings, standing still, for a reader who asked for less
   motion: at the press for "not there", over the place for "here" */
.cl-pano-hint {
    position: absolute;
    min-width: 2.4rem;
    min-height: 2.4rem;
    border-radius: 8px;
    border: 1px solid rgba(88, 76, 60, 0.55);
    background: radial-gradient(closest-side, rgba(251, 248, 242, 0.42), rgba(251, 248, 242, 0));
    opacity: 0;
    transition: opacity 160ms var(--ease-settle, ease);
}
.cl-pano-hint.cl-mark--in { opacity: 1; }
.cl-pano-bloom {
    position: absolute;
    transform: translate(-50%, -50%);
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.05rem;
    padding: 0.2rem 0.5rem 0.25rem;
    background: rgba(251, 248, 242, 0.9);
    border: 1px solid rgba(88, 76, 60, 0.22);
    border-radius: 2px;
    box-shadow: 0 1px 3px rgba(var(--cl-sh), 0.14);
    opacity: 0;
    transition: opacity 420ms var(--ease-brush, ease);
}
.cl-pano-bloom--in { opacity: 1; }
.cl-pano-bloom b {
    font-family: var(--font-jp, 'Klee One', serif);
    font-weight: 400;
    font-size: var(--k5);
    line-height: 1.2;
    color: var(--color-jp-text, #523E1E);
}
.cl-pano-bloom i {
    font-style: normal;
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k6);
    line-height: 1.2;
    color: var(--cl-quiet);
}
/* ⛔ SLOTS, NEVER A SCORE. The row is seated EMPTY from the hand-over, one
   frame per word in the day's own order — the receipt of what the street
   holds. It never says how many are left, it never re-sorts under the hand,
   and its whole height is there from the start so nothing jumps as words land. */
.cl-pano-found {
    list-style: none;
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    gap: 0.5rem 0.9rem;
    /* the row's whole height is there from the first breath — the ask is the
       tallest thing that will ever stand in it, so nothing jumps when a word
       lands or when the last ask leaves */
    min-height: 4.4rem;
    /* ⛔ margin-top/bottom ONLY: the row hangs off the painting's own left edge
       by the auto margins three rules up, and a flat `margin: 0` here silently
       un-centred the whole strip out past the page's left edge */
    margin-top: 0;
    margin-bottom: 0;
    padding: 0;
}
/* ⛔ AND THE STREET'S ROW IS PAPER TOO. Eight underlined blanks along the foot
   of a painting is the same worksheet the racks were wearing, in the same
   lesson. A place not yet found is a DOT (the rail's own mark for exactly this
   meaning); the one being asked sits in the seat inlay, because that is what a
   place waiting to be filled looks like everywhere else on this surface; a
   word found needs no furniture at all, because the word is the mark. */
.cl-pano-frame {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 3.1rem;
    min-height: 2rem;
    padding: 0 0.3rem;
    border-radius: 10px;
}
/* ⭐ S10: the waiting seat wears EXACTLY the rail's unmet dot (one token, one
   device — SCHEMA v3.3's "slots, never a score" stands, and so does the rail's
   own law that an unmet word is a dot) and takes only the width the dot
   needs, so a row of them reads as the rail's column turned on its side and
   not as a row of slots. One seat per spot; the frame's height stays reserved. */
.cl-pano-frame:empty { min-width: 0; width: 1.15em; padding: 0; }
.cl-pano-frame:empty::after {
    content: '';
    width: var(--cl-dot);
    height: var(--cl-dot);
    border-radius: 50%;
    background: var(--cl-dot-ink);
}
.cl-pano-frame--in { animation: cl-fade 460ms var(--ease-settle, ease) both; }
/* ⭐ THE ASK STANDS IN THE ROW, IN KANJI, AND IT IS THE LOUDEST THING THERE.
   No reading under it and no voice on it: those two are what finding it buys,
   and printing either here would answer the question it is asking. */
.cl-pano-frame--ask {
    background: rgba(var(--cl-sh), 0.045);
    padding: 0.1rem 0.5rem 0.15rem;
}
.cl-pano-frame--ask span {
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k3);
    line-height: 1.15;
    color: var(--color-jp-text, #523E1E);
}
/* and a word already found rests with the reading it earned under it, on
   nothing: what it stands on is the page */
.cl-pano-frame--found { background: none; }
/* a found frame SPEAKS (it already prints the reading): ink under the
   pointer and no rule — the "sounds" half of the door grammar */
.cl-pfw {
    display: inline-flex;
    flex-direction: column;
    align-items: center;
    gap: 0.05rem;
    line-height: 1.15;
    border: 0;
    background: none;
    padding: 0.1rem 0.05rem;
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k4);
    color: var(--color-jp-text, #523E1E);
    cursor: pointer;
    transition: color var(--duration-fast, .15s) var(--ease-settle, ease);
}
.cl-pfw:hover { color: var(--cl-accent); }
.cl-pfw:focus-visible { outline: var(--cl-ring); outline-offset: 2px; }
.cl-pfw b { font-weight: 400; }
.cl-pfw i {
    font-style: normal;
    font-size: var(--k6);
    line-height: 1.2;
    color: var(--cl-quiet);
}
/* the street's one line: どこ？ while it is asking, in the duet every control
   in the room wears; the day's own closing sentence once it has been walked */
.cl-pano-line--ask {
    display: flex;
    align-items: baseline;
    gap: 0.55rem;
}
.cl-pano-line--ask [lang="ja"] {
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k4);
    color: var(--color-jp-text, #523E1E);
}
.cl-pano-line--ask i {
    font-style: normal;
    font-size: var(--e3);
    color: var(--cl-quiet);
}
.cl-pano .cl-foot { margin-top: 1.4rem; }

/* ── 9 · the close and the shelf ─────────────────────────────────────────── */
.cl-close { padding-top: var(--cl-origin-page); }
/* ⭐ THREE MOVEMENTS, AND THE WHITESPACE IS WHAT SAYS SO. The close read as a
   dozen peer blocks at near-equal gaps — a list of things that happened rather
   than an evening with a shape. Inside a chapter the blocks breathe on one
   short measure; between chapters the paper opens. ⛔ NO NEW RULES. A divider
   between chapters would say the same thing the air already says, and this
   room has spent four waves taking lines like that out. */
.cl-close-ch + .cl-close-ch { margin-top: 4.5rem; }
.cl-close .cl-close-ch > * { margin-top: 0; margin-bottom: 1.4rem; }
.cl-close .cl-close-ch > *:last-child { margin-bottom: 0; }
/* ⭐ the shelf: the book so far. Finished chapters only — each a book (one
   press, its page); S8: a chapter not yet walked is not listed at all (the
   next door is the hall's card). It never names tonight, and it stands
   above the goodbye. */
.cl-shelf {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
}
.cl-shelf-open {
    display: inline-flex;
    align-items: baseline;
    gap: 0.6rem;
    padding: 0.3rem 0.55rem;
    margin-left: -0.55rem;
    border: 0;
    background: none;
    font: inherit;
    color: inherit;
    cursor: pointer;
    border-radius: 4px;
}
.cl-shelf-open:hover,
.cl-shelf-open:focus-visible { background: rgba(88, 76, 60, 0.07); }
.cl-shelf-n { font-size: var(--e3); color: var(--cl-quiet); }
.cl-shelf-t { font-family: var(--font-jp, 'Klee One', serif); }
/* the day's other bookend: the door's window at night, quieter than the door.
   ⭐ ROUND 2 (M5): WHOLE, at the column plate — 720×480, the seam's own
   dress — never the 28vh strip that cut 42% of the night away. The seed
   glyph is anchored in the PAINTING's own fractions (close.seed.at, percent
   of the image, centre-anchored like the panorama's zones), so it sits in
   the night glass on every screen. */
.cl-art--close { margin-bottom: 0.9rem; width: var(--cl-plate-w); aspect-ratio: 1.5; }
.cl-art--close img { height: 100%; }
/* ⭐ THE SEED: one kanji from tomorrow, in the night glass. Pale warm ink on
   the dark window — no blur, no glow, nothing that reads as an effect: it is
   a character seen through a window, and it is not the learner's yet. It
   carries no reading, no meaning and no press (the runner keeps it out of the
   kanji-home pass), so the only thing it can do is be noticed. */
.cl-seed-k {
    position: absolute;
    top: 13%;
    right: 24%;
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k3);
    line-height: 1;
    color: rgba(216, 203, 176, 0.55);
    pointer-events: none;
}
/* anchored in the painting: the runner writes left/top from close.seed.at */
.cl-seed-k--at { right: auto; transform: translate(-50%, -50%); }
/* ⭐ THE TANZAKU: the day's last sentence set vertically, a narrow washi strip
   hung at the right edge of the window — the first vertical Japanese the
   learner reads, and it asks nothing. It arrives when the readback is done. */
.cl-tanzaku {
    position: absolute;
    top: 0.6rem;
    right: 3.5%;
    margin: 0;
    padding: 0.55rem 0.3rem;
    max-height: calc(100% - 1.2rem);
    /* lesson 8's signoff sets to 204px inside the 280px of glass, so the strip
       is comfortably within its window; a longer signoff owes a resize of the
       strip, never a column of kana running out of the painting's bottom edge */
    overflow: hidden;
    writing-mode: vertical-rl;
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k6);
    line-height: 1.5;
    color: var(--color-jp-text, #523E1E);
    background: rgba(251, 248, 242, 0.9);
    border: 1px solid rgba(88, 76, 60, 0.22);
    border-radius: 2px;
    box-shadow: 0 1px 3px rgba(var(--cl-sh), 0.14);
    opacity: 0;
    transition: opacity 700ms var(--ease-brush, ease);
    pointer-events: none;
}
.cl-tanzaku--in { opacity: 1; }
/* the seed's one line — S10: at the foot of the close, above the door out
   (the close leads with today; tomorrow is said once, here) */
.cl-seedline {
    font-size: var(--e3);
    line-height: 1.7;
    color: var(--cl-quiet);
    margin: 2.2rem 0 0;
    max-width: 34em;
}
/* the RECEIPT: the day's words resting in one ink row, day order. A slip
   rests a shade paler — named nowhere, counted nowhere. A press speaks. */
.cl-receipt {
    list-style: none;
    display: flex;
    flex-wrap: wrap;
    gap: 0.6rem 1.4rem;
    margin: 0 0 1.7rem;
    padding: 0;
}
/* S3: each word is a WORD DOOR (the card: reading, meaning, the disc, its
   kanji one step in) — a receipt that only made a sound was the one place
   the day's words could not be asked about. A row of nothing but doors rests
   bare; the hover wears the door grammar (below). */
.cl-rcw {
    position: relative;
    display: inline-block;
    padding: 0.1rem 0.05rem;
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k4);
    color: var(--color-jp-text, #523E1E);
    cursor: pointer;
}
.cl-rcw--slip { color: rgba(110, 104, 96, 0.6); }
/* S10: the reading the learner did not have, under the word that slipped */
.cl-rcw-r { display: block; font-style: normal; font-size: var(--k6); line-height: 1.2; color: var(--cl-quiet); margin-top: 0.15rem; }
.cl-close-line { font-size: var(--e1); margin: 0 0 1.5rem; }

/* ── the readback: the day, read back one line at a time ─────────────────── */
/* ⛔ NOTHING IS GRADED HERE and nothing is veiled. The lines land on the
   learner's own press, in the reading face at reading size; the English comes
   under each one a breath later and small, because the sentence that has to
   be read is the Japanese one. The seat under the line is held from the
   start, so the page never jumps when the English arrives. */
.cl-readback { margin: 0 0 2rem; }
.cl-rb-intro { font-size: var(--e2); line-height: 1.7; color: var(--cl-quiet); margin: 0 0 1.4rem; }
.cl-rb-lines { display: block; }
.cl-rb-line {
    margin: 0 0 1.15rem;
    opacity: 0;
    transition: opacity 420ms var(--ease-brush, ease);
}
.cl-rb-line--in { opacity: 1; }
.cl-rb-jp {
    display: block;
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k5);
    line-height: 1.85;
    color: var(--cl-ink);
}
.cl-rb-en {
    display: block;
    font-size: var(--e3);
    line-height: 1.6;
    color: var(--cl-quiet);
    margin-top: 0.2rem;
    opacity: 0;
    transition: opacity 520ms var(--ease-brush, ease);
}
.cl-rb-en--in { opacity: 1; }
/* the day heard: 聞く stands with the line that closes the reading, in the
   same bordered dress 読む and 次へ wear — the reading's voice is a door, not
   a footnote. It fades in on its own beat once the teacher's line has stood
   alone for one, so the close arrives rather than appearing. */
.cl-rb-hear {
    margin: 0.85rem 0 0;
    opacity: 0;
    transition: opacity 520ms var(--ease-brush, ease),
                border-color var(--duration-fast, .15s) var(--ease-settle, ease),
                color var(--duration-fast, .15s) var(--ease-settle, ease),
                box-shadow var(--duration-fast, .15s) var(--ease-settle, ease);
}
.cl-rb-hear--in { opacity: 1; }
.cl-rb-foot { margin-top: 1.3rem; }
.cl-rbnext [lang="ja"], .cl-rb-hear [lang="ja"] {
    font-family: var(--font-jp, 'Klee One', serif);
}


/* ── the receipt of moments, and the seal over it ────────────────────────── */
/* Three lines at most, in the teacher's voice, about tonight alone. A slip
   that came back wears a kintsugi hairline, because gold in this course marks
   a repair and nothing else — the same law the set's .cl-settled--recovered
   settle keeps in the moment the miss actually came back. */
.cl-moment {
    font-size: var(--e2);
    line-height: 1.75;
    margin: 1.2rem 0 0;
    max-width: 34em;
}
.cl-moment--back {
    border-left: 1px solid var(--cl-gold);
    padding-left: 0.85rem;
}
/* ⛔ THE VISIT STAMP IS A COLOPHON, NEVER A GRADE — the 駅スタンプ pressed into
   a book at the end of a day out. Vermilion is the hanko's own ink and lives
   nowhere else in the course; it never appears on an answer surface. */
/* ⭐ THE CERTIFICATE. The one vermilion mark in the lesson used to float in
   the middle of the pile, a paragraph among paragraphs. Here it is what it has
   always been: a seal pressed on clear paper beside the sentences that earned
   it. The voice on the left keeps the reading measure; the colophon holds its
   own column, so the stamp can never come down on top of a word. ⛔ The seal's
   seat is reserved from the first breath — it is stamped three beats after the
   chapter arrives, and a column that grows when it lands would move the
   sentences the learner is reading. */
.cl-cert {
    display: flex;
    align-items: flex-start;
    gap: clamp(1.5rem, 4vw, 3rem);
}
.cl-cert-voice { flex: 1 1 auto; min-width: 0; max-width: 34em; }
.cl-cert .cl-cert-voice > * { margin-top: 0; margin-bottom: 1.4rem; }
.cl-cert .cl-cert-voice > *:last-child { margin-bottom: 0; }
.cl-cert .cl-cert-voice .cl-proof:empty { margin-bottom: 0; }
.cl-cert .cl-cert-voice .cl-moment { margin: 0; }
.cl-cert-seal { flex: 0 0 11rem; }
.cl-stamp {
    display: flex;
    align-items: center;
    gap: 1.15rem;
    margin: 2.2rem 0 0;
}
/* in the certificate the colophon stacks under its own seal — the row belongs
   to the page now, not to the stamp */
.cl-cert-seal .cl-stamp {
    display: block;
    margin: 0;
}
.cl-cert-seal .cl-stamp-line { margin-top: 0.7rem; font-size: var(--e3); }
.cl-seal {
    flex: none;
    width: 92px;
    height: 92px;
    transform: rotate(-4deg);
    animation: cl-press 260ms var(--ease-settle, ease) both;
}
/* a re-opened close finds the seal resting: the press already happened */
.cl-stamp--rest .cl-seal { animation: none; }
/* ⭐ AND THE BOOK KEEPS IT — the same seal, smaller, pressed ON the leaf a
   finished lesson reopens on. It never presses here: a stamp performed again
   every time the book is opened is a stamp that stops meaning a day.
   ⛔ ABSOLUTE, and sitting slightly over the dateline's rule: a hanko is put
   down on the paper, not ruled around, and out of flow a stamped book and an
   unstamped one seat their dateline on exactly the same line. */
.cl-bookseal {
    position: absolute;
    /* both offsets TRACK THE LEAF'S OWN PADDING, so the seal keeps the same
       bite out of the rule and the same edge as the text at every width */
    top: calc(clamp(2rem, 4vw, 2.75rem) + 4px);
    right: clamp(1.4rem, 3vw, 2.4rem);
    z-index: 2;
    line-height: 0;
}
.cl-seal--sm { width: 56px; height: 56px; animation: none; }
@keyframes cl-press {
    from { opacity: 0; transform: rotate(-4deg) scale(1.06); }
    to   { opacity: 1; transform: rotate(-4deg) scale(1); }
}
.cl-seal-rim { fill: none; stroke: rgba(var(--cl-hanko), 0.85); stroke-width: 2.6; }
.cl-seal-k {
    font-family: var(--font-jp, 'Klee One', serif);
    font-weight: 700;
    font-size: 40px;
    fill: rgba(var(--cl-hanko), 0.85);
}
.cl-seal-d {
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: 10.5px;
    letter-spacing: 0.04em;
    fill: rgba(var(--cl-hanko), 0.72);
}
.cl-stamp-line { font-size: var(--e2); line-height: 1.7; color: var(--cl-quiet); margin: 0; }
.cl-tonight { font-size: var(--e2); line-height: 1.7; margin: 1.6rem 0 0; }
.cl-signoff { margin: 2.2rem 0 0; }
.cl-signoff-jp {
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k4);
    color: var(--color-jp-text, #523E1E);
    border-bottom: 1px solid transparent;
    cursor: default;
}
/* with a clip authored the line is a BUTTON — press it and the sentence is
   spoken. S3: a thing that SPEAKS answers the pointer in ink and wears no
   rule — a rule under a thing means it opens (the door grammar) */
button.cl-signoff-jp {
    border: 0;
    background: none;
    padding: 0;
    cursor: pointer;
    text-align: left;
    transition: color var(--duration-fast, .15s) var(--ease-settle, ease);
}
button.cl-signoff-jp:hover { color: var(--cl-accent); }
button.cl-signoff-jp:focus-visible { outline: var(--cl-ring); outline-offset: 2px; }
/* ⛔ the signoff's English prints PLAINLY (the schema's own law): the close
   assigns this line as the evening's homework, and a meaning behind a hover
   is a gesture nobody can find at the moment it matters most */
.cl-signoff-en {
    display: block;
    font-size: var(--e3);
    color: var(--cl-quiet);
    margin-top: 0.4rem;
}
.cl-next-line { font-size: var(--e2); margin: 2.4rem 0 0.9rem; color: var(--cl-ink); }
.cl-wild { font-size: var(--e2); color: var(--cl-quiet); margin: 2.2rem 0 0; line-height: 1.7; }

/* the quiet door out — one named day, then the room closes. ⛔ It keeps no
   top margin of its own: inside a chapter the rhythm belongs to the chapter,
   and a foot that set its own gap was the last block still arguing with it. */

/* ── the re-dress column at the page's edge ──────────────────────────────── */
/* ⛔ IT HANGS OFF THE COLUMN, NOT OFF THE GLASS, AND IT DOES NOT DRIFT.
   Pinned to the window's right edge and centred on the viewport, the column
   sat a different distance from the page on every window and slid UP the
   screen as the day's words were added — the one thing in the lesson that is
   supposed to be a fixed place to look kept moving. Its head now stands at
   the asking origin all lesson and the words append DOWN from it, and its
   left edge is the column's right edge plus ONE gutter. ⛔ It is computed
   from --cl-col itself: a hand-copied "340px = half the column" was 20px
   wrong (the column is 720), and the rail hung 15-24px inside the leaf's
   own edge at 1680 (S0, 2026-09-06). The min keeps it inside the glass on
   any window the breakpoint below still shows it on. */
.cl-rail {
    position: fixed;
    left: min(calc(50% + var(--cl-col) / 2 + var(--cl-gutter)), calc(100% - 8rem));
    top: var(--cl-origin-ask);
    transform: none;
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.42rem;
    text-align: left;
    pointer-events: none;
}
/* the column says what it is, once, in Japanese alone (S8, owner call 13:
   the English duet dropped). Out of the a11y tree: the list's own label
   already says it. */
.cl-rd-title {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 0.05rem;
    margin-bottom: 0.55rem;
    line-height: 1.2;
}
.cl-rd-title [lang="ja"] {
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k6);
    color: var(--cl-quiet);
}
/* ⛔ A MET WORD IS FULL INK. At 55% the words the learner had actually
   earned read as the faintest thing on the screen — quieter than the frames
   standing for the ones they had not met yet. The unmet state carries the
   whole distinction, so the ink does not have to. */
/* ⛔ AND IT IS READ, NOT LABELLED. At the scale's floor the day's own words sat
   at chrome size in the margin — the one column of Japanese the learner has
   actually earned, set smaller than the English beside it. It reads at reading
   size. The title above stays at the floor: it names the column, it is not the
   column. Every mark hung on a row (the stone dot, the moss dot, the min-height
   that keeps met and unmet rows the same height) is set in em, so all of it
   follows the type up without a second number to keep in step. */
.cl-rd {
    position: relative;
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k5);
    /* one line-height for EVERY row state — an inked row on `normal` stood
       6px taller than a stone, so the list shifted under the eye each time a
       word was met, exactly what the stone's same-height law forbids */
    line-height: 1.15;
    color: var(--cl-ink);
    transition: color var(--duration, .25s) var(--ease-brush, ease);
}
.cl-rd--on { color: var(--color-jp-text, #523E1E); }
/* ⭐ S9: a met word's ink blooms ONCE, where its row stands — the row is
   re-dressed in place now, so this fires on the re-dress and never again */
.cl-rd--on .cl-rd-ink { animation: cl-unfold var(--cl-t-ink) var(--ease-settle, ease) both; }
/* ⛔ AN UNMET WORD IS A STONE, NOT A WHISPER. Its reading is not faint here,
   it is ABSENT — the row is a place in the day and nothing more, so the column
   can never hand over a reading before the card that teaches it. Same height
   as an inked row, so the walk's own list never shifts under the eye. */
.cl-rd--stone {
    min-height: 1.15em;
}
/* ⛔⛔ A DOT, NEVER A BOX. Wave E gave these places hairline squares to stop
   them reading as dust; eleven empty squares stacked down the page turned out
   to read as something far worse — a checklist, a form with unticked rows,
   which is the one thing this column has never been allowed to be. The place
   is a DOT: the day's extent is visible and nothing else is said about it.
   ⛔ And a met word needs no mark at all, because the word IS the mark. */
.cl-rd--stone::after,
.cl-rd--veiled::after {
    content: '';
    display: inline-block;
    width: var(--cl-dot);
    height: var(--cl-dot);
    border-radius: 50%;
    background: var(--cl-dot-ink);
    vertical-align: 0.32em;
    transition: background-color 300ms var(--ease-settle, ease),
                transform 300ms var(--ease-settle, ease);
}
/* where the walk is standing right now: the place's OWN dot takes today's
   warm ink and swells a breath. One mark, one column — the brush dash that
   used to sit in the margin was a second glyph saying the same thing beside
   the first, and two marks on one row read as furniture. */
.cl-rd--now.cl-rd--stone::after,
.cl-rd--now.cl-rd--veiled::after {
    background: var(--color-jp-text, #523E1E);
    transform: scale(1.6);
}
/* S1: no dot on a met row — the sheet already says the word IS the mark
   (above), and a moss dot beside an inked word was the mark saying it twice */
/* ⛔ the ACTIVE build's row is an EMPTY SEAT — the rail otherwise prints the
   ask's answer in kana at the page's edge while the hand asks for it. Same
   law as the head veil: ink out via visibility (the seat keeps its width), the
   waiting frame holds the place, hover or focus peeks, nothing records it. */
.cl-rd--veiled { position: relative; pointer-events: auto; }
/* the same bloom the head veil lifts with — two veils on one screen must not
   answer the same gesture two different ways. No sound out here: the column
   sits at the page's edge and a pointer crosses it on its way somewhere. */
.cl-rd--veiled .cl-rd-ink {
    visibility: hidden;
    color: transparent;
    transition: color 300ms var(--ease-brush, ease);
}
/* the same waiting frame an unmet row wears (declared with it, above) — two
   placeholders on one column would be two grammars, and both of these mean
   "not yours to read right now". Laid over the held seat, never beside it. */
.cl-rd--veiled::after {
    position: absolute;
    left: 0;
    top: 0.18em;
}
.cl-rd--veiled:hover .cl-rd-ink,
.cl-rd--veiled:focus-visible .cl-rd-ink { visibility: visible; color: inherit; }
.cl-rd--veiled:hover::after,
.cl-rd--veiled:focus-visible::after { content: none; }
.cl-rd--veiled:focus-visible { outline: var(--cl-ring); outline-offset: 2px; }
/* an INK row is a WORD door (S3): the card opens on the row. A column of
   nothing but doors rests bare; the hover wears the door grammar (below) */
.cl-rd--door { pointer-events: auto; cursor: pointer; }
/* ⛔ [hidden] is only a UA `display:none` — an author display wins. The column
   is hidden by the attribute, so it must be answered here or it rides every
   screen (it rode the page and the close). */
.cl-rail[hidden] { display: none; }
/* below 1320px the meet grid's work column runs under the fixed rail
   (stage 1060px + the rail's seat), and kana sat over the rack's rightmost
   tiles — the rail stands down rather than overlap the desk */
/* ROUND 2 (L9): the rail stands down only where the margin folds (below 1180px) —
   the 1364 floor served a desk that no longer exists */
@media (max-width: 1179px) { .cl-rail { display: none; } }

/* ── a lesson that could not load: one line on paper, the ways out work ──── */
.cl-fail { padding-top: var(--cl-origin-ask); }
.cl-fail-line { font-size: var(--e2); color: var(--cl-quiet); margin: 0; }

/* ── the aria-live region: mirrored settles and tells, visually silent ───── */
.cl-live {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0 0 0 0);
    clip-path: inset(50%);
    white-space: nowrap;
    border: 0;
}

/* ── the kanji home: a place you visit, never a step ─────────────────────── */
/* ── doors: what is pressable, and how it says so (S3, 2026-09-06) ────────
   ⭐⭐ REST = INK AND A HAIRLINE. A door in prose or a sentence — a WORD
   (.cl-wref, the unit) or a lone taught character (.cl-kref) — prints in the
   book's Japanese ink with a 1px DOTTED rule under it, drawn by
   text-decoration: never a border or padding, so a wrapped run keeps one
   continuous rule and nothing reflows, and the rule sits under the whole word.
   HOVER: ink and rule to indigo, the one interactive colour, the rule going
   solid. PRESSED (:active): the rule thickens — ink, never geometry. FOCUS:
   one ring. ⛔ The wash pill is GONE, with its per-run group (owner note f,
   2026-09-05, overturning his own earlier pill-over-underline pick that stood
   here): a grey slab behind running text is a highlighter, inside a run it
   barely answered the pointer, and 六時二十五分 came out as one six-character
   wash. ⛔ ONE meaning for the dotted rule — "a door" — so the reader's
   pencil mark for an opened token became an ink change (.cl-tk--marked).
   ⛔ A LIST OF NOTHING BUT DOORS rests bare (the leaf's tokens, the rail's
   met rows, the receipt): a mark on every item marks nothing, so there the
   hover alone says it — and it says it in exactly the same dress.
   OPENS VERSUS SPEAKS: a rule under a thing means it opens (a card, a sheet);
   ink alone under the pointer means it sounds (.cl-say, the pano's found
   strip, the signoff, a family row). Never both on one act. */
.cl-wref, .cl-kref, .cl-guest[role="button"], .cl-tk, .cl-rd--door, .cl-rcw {
    text-decoration-line: none;
    text-decoration-style: dotted;
    text-decoration-thickness: 1px;
    text-underline-offset: 0.16em;
    text-decoration-skip-ink: none;
    transition: color var(--duration-fast, .15s) var(--ease-settle, ease),
                text-decoration-color var(--duration-fast, .15s) var(--ease-settle, ease);
}
.cl-wref, .cl-kref {
    position: relative;
    cursor: pointer;
    color: var(--color-jp-text, #523E1E);
    text-decoration-line: underline;
    text-decoration-color: rgba(82, 62, 30, 0.5);
}
/* a guest wears the same grammar one shade quieter: the rest rule in stone
   (a meet-later word beside a taught word's brown), the hover the same
   indigo as every door that opens a card — the rest tier says "stranger",
   the hover says "opens" */
.cl-guest[role="button"] {
    cursor: pointer;
    text-decoration-line: underline;
    text-decoration-color: rgba(110, 104, 96, 0.35);
}
.cl-wref:hover, .cl-kref:hover, .cl-guest[role="button"]:hover,
.cl-tk:not(.cl-tk--plain):hover, .cl-rd--door:hover, .cl-rcw:hover {
    color: var(--cl-accent);
    text-decoration-line: underline;
    text-decoration-style: solid;
    text-decoration-color: var(--cl-accent);
}
.cl-wref:active, .cl-kref:active, .cl-guest[role="button"]:active,
.cl-tk:not(.cl-tk--plain):active, .cl-rd--door:active, .cl-rcw:active {
    text-decoration-thickness: 2px;
}
.cl-wref:focus-visible, .cl-kref:focus-visible, .cl-guest[role="button"]:focus-visible,
.cl-tk:focus-visible, .cl-rd--door:focus-visible, .cl-rcw:focus-visible {
    outline: var(--cl-ring);
    outline-offset: 1px;
}
/* ⛔ except where the glyph IS the specimen: a part standing at k3 in its own
   column is already a thing to look at, and a rule under it is furniture.
   There the pointer's ink is the whole cue, as it was. */
.cl-glyphs .cl-kref { text-decoration-line: none; }
.cl-glyphs .cl-kref:hover { text-decoration-line: none; color: var(--cl-accent); }
/* ⭐⭐ S7: THE SHEET IS THE APP'S RIGHT DRAWER (owner call 7). It was a centred
   modal that dimmed the very text it was opened from and stood 80px inside
   the spine; the app's grammar for a supporting glance from inside a page is
   the right-anchored drawer (the kanji drawer, the word panel), and the page
   keeps its place beside it — 先 and 生 side by side is the whole point of a
   pair. The field outside the drawer is the ROOM, undimmed: a press on it
   puts the sheet down, the way the app's scrim does, and nothing else
   happens (the drawer law: one press closes, the next press is the page's). */
.cl-khome {
    position: fixed;
    inset: 0;
    z-index: 10;                              /* over the topmark (3) and glosses (4) */
    background: transparent;
}
/* the panel: full height, on the glass's right edge, as wide as the free
   paper to the right of the spine (the leaf's margin law, mirrored) — never
   under 340px, never over 480 — so at 1440 and up the spine stands clear and
   below that the drawer takes only the column's right edge. Its edge is a
   hairline cast as SHADOW, never a border-left: in this room a left bar
   means "quoted Japanese" (charpage_test), and one mark may not mean two
   things. One soft shadow under the design system's 0.06 ceiling (the old
   slip cast 0.14).
   ⛔ A DRAWER SCROLLS — its body does; the ✕ stays pinned — which re-bases the
   old "the sheet does not scroll" law: the spine is short by construction
   (the parts row and the story left it), and a long ledger folds at six. */
.cl-kh-sheet {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    width: clamp(340px, calc(50% - var(--cl-col) / 2 - var(--cl-gutter)), 480px);
    max-width: 100%;
    display: flex;
    flex-direction: column;
    background: var(--cl-sheet);
    box-shadow: -1px 0 0 var(--cl-rule), -4px 0 18px rgba(var(--cl-sh), 0.06);
    opacity: 0;
    transform: translateX(24px);
    transition: opacity .2s var(--ease-settle, ease), transform .24s var(--ease-settle, ease);
}
.cl-khome--in .cl-kh-sheet { opacity: 1; transform: none; }
.cl-kh-body {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding: clamp(2.4rem, 4vh, 3.2rem) clamp(1.4rem, 2.4vw, 2rem) 2rem;
}
.cl-kh-back {
    position: absolute;
    top: 0.7rem;
    right: 0.8rem;
    z-index: 2;                               /* over the scrolling body */
    border: 0;
    background: none;
    color: var(--cl-quiet);
    font-size: var(--e2);
    line-height: 1;
    padding: 0.4rem 0.5rem;
    cursor: pointer;
    border-radius: var(--radius-sm, 4px);
    transition: color var(--duration-fast, .15s) var(--ease-settle, ease);
}
.cl-kh-back:hover { color: var(--cl-accent); }
.cl-kh-back:focus-visible { outline: var(--cl-ring); outline-offset: 2px; }
/* ⭐ THE HEAD IS THE CHARACTER AND WHAT IT MEANS. The glyph stands alone; under
   it the one senior English line of the page; under that the picture it was
   taught by, quiet. No reading floats here — a character does not have one. */
.cl-kh-head { display: block; }
.cl-kh-glyph {
    display: block;
    font-family: var(--font-jp, 'Klee One', 'Noto Sans JP', serif);
    font-size: var(--k2);
    line-height: 1.05;
    color: var(--color-jp-text, #523E1E);
}
/* ⭐ S7: the glyph is the lesson's own BRUSH (the card's .cl-draw at k2):
   written once when the sheet opens, written again on a press; the Klee ink
   holds the seat until the strokes land and is the floor with no data */
.cl-kh-glyph .cl-draw { display: block; }
.cl-kh-mean { margin: 0.7rem 0 0; font-size: var(--e1); line-height: 1.3; color: var(--cl-ink); }
.cl-kh-shape { margin: 0.5rem 0 0; font-size: var(--e3); line-height: 1.5; color: var(--cl-quiet); }
.cl-kh-second { margin: 1.4rem 0 0; font-size: var(--e2); line-height: 1.55; color: var(--cl-ink); }
.cl-kh-tell { margin-top: 1.5rem; }
.cl-kh-tell .cl-twin { margin-top: 0; }

/* ── the ledger: every word this character lives in ──────────────────────── */
/* ⭐ THREE COLUMNS THAT HOLD ACROSS THE WHOLE PAGE — the word, the reading,
   the English — because the reading column is where the lesson is: the kana
   this character contributes stands in full sumi and the rest of the word
   stays quiet, so にち, ようび and に sort themselves down the page without a
   heading, a label or a caption saying so. Subgrid, so the groups can be
   parted by air and still line up. */
.cl-kw-list {
    list-style: none;
    display: grid;
    grid-template-columns: max-content max-content minmax(0, 1fr) 2.125rem;
    column-gap: 1.1rem;
    row-gap: 0.34rem;
    margin: 1.5rem 0 0;
    padding: 0;
}
/* ⭐ S7: THE DRAWER LAYS THE MEANING UNDER THE WORD. A drawer is 340 to 480px
   wide, and on one line the fourth column left the English ~25px at the
   floor (a 1280 glass) with the words overrunning the disc. One layout for
   one housing, at every width: the word and its reading keep their two
   ALIGNED columns (the ink column is the lesson), the meaning takes the row's
   second line at full width, and the disc spans both. */
.cl-kw-list { row-gap: 0.1rem; }
.cl-kw { grid-row: span 2; grid-template-rows: subgrid; }
.cl-kw-w, .cl-kw-r { grid-row: 1; }
.cl-kw-en { grid-column: 1 / 4; grid-row: 2; margin-bottom: 0.55rem; }
.cl-kw-oto { grid-row: 1 / 3; }
.cl-kw-air, .cl-kw-more { grid-row: span 1; }
.cl-kw {
    display: grid;
    grid-column: 1 / -1;
    grid-template-columns: subgrid;
    align-items: baseline;
}
/* ⛔ the author display above would otherwise beat [hidden] and the fold
   would hide nothing */
.cl-kw-list [hidden] { display: none; }
.cl-kw-w { font-size: var(--k5); line-height: 1.35; color: var(--color-jp-text, #523E1E); }
.cl-kw-r { font-size: var(--k6); line-height: 1.35; }
.cl-kw-on { color: var(--cl-ink); }
.cl-kw-off { color: rgba(110, 104, 96, 0.68); }
.cl-kw-en { font-size: var(--e3); line-height: 1.45; color: var(--cl-quiet); }
/* the seat is always here; only the ink comes and goes */
.cl-kw-oto { justify-self: end; align-self: center; }
/* ⭐ S7: ROWS SPEAK. The disc STANDS on every row that has a clip — a chip the
   pointer had to find (opacity 0 at rest) was a promise the eye could not
   see. At rest it is quiet ink (ink alpha on ring and glyph, never element
   opacity); under the pointer, the row's, it is full sumi; on the chip itself,
   the press promise every disc in the room makes. A row with no clip keeps
   the seat and carries no chip: no dead disc on a ledger. */
.cl-kw-chip {
    color: rgba(var(--cl-ink-rgb), 0.5);
    border-color: rgba(var(--cl-sh), 0.3);
    box-shadow: none;
}
.cl-kw:hover .cl-kw-chip,
.cl-kw:focus-within .cl-kw-chip,
.cl-kw-chip:focus-visible { color: var(--cl-ink); border-color: rgba(var(--cl-sh), 0.72); }
.cl-kw:hover .cl-kw-chip:hover,
.cl-kw-chip.cl-chip--on { color: var(--color-jp-text, #523E1E); border-color: var(--color-jp-text, #523E1E); }
.cl-kw-air { grid-column: 1 / -1; height: 0.5rem; }
/* the word under your finger, seated first: the same row, read a size larger,
   with its own air beneath so the ledger below reads as the ledger */
.cl-kw--lead { padding-bottom: 0.45rem; }
.cl-kw--lead .cl-kw-w { font-size: var(--k4); }
.cl-kw-more { grid-column: 1 / -1; margin-top: 0.5rem; }
.cl-kh-more {
    border: 0;
    background: none;
    padding: 0.2rem 0;
    font-size: var(--e3);
    color: var(--cl-quiet);
    cursor: pointer;
}
.cl-kh-more:hover { color: var(--cl-accent); }
.cl-kh-more:focus-visible { outline: var(--cl-ring); outline-offset: 2px; }
.cl-kh-sheet:focus { outline: none; }
/* ⭐ S7: the drawer ARRIVES the way the app's does — opacity and a short slide
   in from the right edge (the motion doctrine: entry = opacity + a short
   translateX). ⛔ Reduced motion keeps the fade and drops the travel. */
@media (prefers-reduced-motion: reduce) {
    .cl-kh-sheet { transform: none; transition: opacity .16s linear; }
    .cl-khome--in .cl-kh-sheet { transform: none; }
}

/* the reread's doors rest under the page, before the one turn forward */
.cl-reread .cl-doors { margin-top: 1.6rem; }

/* ── the hall's own quiet door keeps the hall's dress; nothing here ──────── */

/* ── reduced motion: a cross-fade and nothing else ───────────────────────── */
/* A CROSS-FADE and nothing else: every transform is cut, animations stop, and
   what survives is the ink changing — opacity and colour. Killing the
   transition wholesale would have made the screen SWAP, which is not what a
   reader who asked for less motion asked for. */
@media (prefers-reduced-motion: reduce) {
    #kotobaLesson *,
    #kotobaLesson *::before,
    #kotobaLesson *::after {
        animation-duration: 0.01ms !important;
        animation-delay: 0ms !important;          /* S9: no stagger — a record, a told body, the English land whole */
        animation-iteration-count: 1 !important;
        transition-property: opacity, color, background-color, border-color !important;
        transition-duration: 160ms !important;
    }
    #kotobaLesson .cl-stage,
    #kotobaLesson .cl-stage.cl-in { transform: none !important; }
    /* the one thing a reader who asked for less motion still gets: the glyph
       the hand would have written, arriving as a calm fade instead */
    #kotobaLesson .cl-draw--fade { animation-duration: 300ms !important; }
    /* the veil over a painted word is a STATE, not a performance: it is
       already lifted or already down, with nothing in between */
    #kotobaLesson .cl-scene-veil { transition: none !important; }
    /* ⛔ the title's beat is MOTION, and a reader who asked for less of it gets
       none: the JS never adds the class, and this is the belt under that brace.
       The recovery's gold is not motion — it is a mark, so it simply stands. */
    #kotobaLesson .cl-settled--recovered {
        animation: none !important;
        border-left-color: var(--cl-gold) !important;
    }
}

/* ── Wave A · say it once, plainly (review round 2026-08-28) ─────────────── */
/* the door title's English pair — printed once, small, under the kana title */
/* the reading's own note (S5: the four L7 reading notes moved here off the
   shape page) — under the head that prints the reading, at reading size in
   past ink: a rule the ask will test in a moment is not a whisper */
.cl-life-note {
    display: block;
    margin: 0;
    font-size: var(--e2);
    line-height: 1.7;
    color: var(--cl-ink-past);
    max-width: 34em;
}
/* one authored line above a station's first paper */
.cl-station-line {
    font-size: var(--e3);
    color: var(--cl-quiet);
    margin: 0 0 1.6rem;
}
/* mercy names its terms under the seam's pair of doors */
.cl-stop-note {
    font-size: var(--e3);
    color: var(--cl-quiet);
    margin: 0.7rem 0 0;
}
/* the registry tell now speaks AFTER the plain disclosure */
.cl-teach--after { margin-top: 1rem; }
/* S10: the check's one promise, after the tell: quiet, and said once */
.cl-comeback { margin: 0.7rem 0 0; font-size: var(--e3); line-height: 1.6; color: var(--cl-quiet); }
/* the second build's one payoff note, under its settled sentence */
.cl-build-note {
    font-size: var(--e3);
    line-height: 1.7;
    color: var(--cl-quiet);
    margin: 0.9rem 0 0;
    max-width: 34em;
}
/* the no-spaces line, visible on the first read of the page */
.cl-page-preface {
    font-size: var(--e3);
    color: var(--cl-quiet);
    margin: 0.4rem 0 1.2rem;
}
/* while the reading is veiled, its speaker holds its seat in silence —
   a ♪ that says あめ during the ask hands over the answer */
.cl-card--asking .cl-oto { visibility: hidden; }

/* ── guest words: the real spelling, the ruby only where it is owed ────────
   ⭐⭐ A GUEST is a word the course PRINTS but does not teach (会社, 電車,
   一人): its kanji stand, and the reading sits over exactly the characters
   the reader has not been given yet. Programme §1b, 2026-08-31.
   ⛔ IT NEVER WEARS AN ASK'S DRESS. A page token underlines on hover because
   it opens; a guest is print, and print that lights up like a control teaches
   the learner to press the wrong things. Its own press (where it has one) is
   the same quiet stone the kana tokens use, and nothing about it moves. */
.cl-guest { position: relative; white-space: nowrap; }
.cl-guest ruby { ruby-position: over; ruby-align: center; }
.cl-guest rt {
    /* the reading is the crutch, not the word: past ink, half the size, and
       it never sets the line's own colour */
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: 0.44em;
    line-height: 1.1;
    color: var(--cl-ink-past);
    font-weight: 400;
    letter-spacing: 0.02em;
}
/* ⛔ AND A GUEST'S RUBY IS NOT THE PAGE'S FURIGANA. Where the reader's own
   token wraps it, the token keeps its dotted pencil mark and its hover; the
   guest inside adds no second underline of its own. */
.cl-guest,
.cl-tk .cl-guest { border-bottom: 0; }
/* ⭐⭐ THE WHOLE WORD LIGHTS, BECAUSE THE WHOLE WORD IS THE DOOR (owner,
   2026-08-31). 会社 used to wash character by character — the taught kanji
   inside it each wore their own .cl-kref pill — so the pointer said "two
   things here" about a word that is one thing, and pressing either half never
   reached the word's own meaning. The per-character doors are gone from inside
   a guest (js: tapifyDoors), and the characters wait one step in, in the card
   the press opens. S3: the guest's dress is declared with the doors (the
   "doors" block): the same grammar one shade quieter, and no wash. */
/* ⭐⭐ S6: NO GLOSS IN THE LINE, ANYWHERE. The first appearance used to hang
   its meaning under the word in 0.4em print (9.6px at k5 — not print, a
   smudge), out of flow, "in the leading that is already there": it was
   there only on the bare leaf. With the English on, on the example page, on
   the beat, the leading was spent and the gloss printed over the next line
   ("homework" across "In my hand, the homework."). And its inline-block
   inherited the 字下げ as a hole before the word, and stood wider than the
   word so the hover rule ran past the glyphs. A guest's meaning has two
   seats now: the leaf's MARGIN NOTE and the word card a press opens.
   ⛔ THE RUBY NEVER CHANGES INK UNDER A POINTER. The token's hover takes the
   door's indigo (S3: one hover ink for every inline door); the reading
   above the word is the crutch, not the door, and it stays in past ink —
   and the door's rule hugs the word now that no box widens it. */
.cl-tk:not(.cl-tk--plain):hover .cl-guest rt,
.cl-guest[role="button"]:hover .cl-guest rt,
.cl-guest[role="button"]:hover rt,
.cl-guest--lit rt { color: var(--cl-ink-past); }
/* a note lights every occurrence of its guest on the leaf: the door's own
   hover ink, because each occurrence IS that door */
.cl-guest--lit {
    color: var(--cl-accent);
    text-decoration-line: underline;
    text-decoration-style: solid;
    text-decoration-color: var(--cl-accent);
}

/* ── S6 · the margin notes ────────────────────────────────────────────────
   ⭐⭐ THE PAPER TO THE LEAF'S LEFT IS THE READER'S MARGIN (owner call 5).
   One note per guest per leaf — the word, its reading, its meaning — on the
   first line the guest stands in, right-aligned to the leaf's edge, where a
   reader pencils a meaning beside a diary line. The width is the free paper
   (the glass's left edge to the leaf), measured by layoutMargin, so a note
   never runs off the glass; each note's `top` is its guest's own line, and
   a note that would overlap the one above drops below it. Three things in
   three inks — the word in the reading's Klee at the floor size, the reading
   in past ink, the meaning in the quiet English — none louder than the leaf.
   ⛔ Positioned out of the leaf, never in its flow: the leaf's geometry is
   byte-identical with the notes and without them. */
.cl-page > .cl-margin {
    position: absolute;
    top: 0;
    right: 100%;
    z-index: 1;
    box-sizing: border-box;
    padding-right: 1.5rem;
    pointer-events: none;
}
.cl-mnote {
    position: absolute;
    right: 1.5rem;
    max-width: calc(100% - 1.5rem);
    display: flex;
    flex-wrap: wrap;
    justify-content: flex-end;
    align-items: baseline;
    text-align: right;
    /* the leaf's own line box, so a note sits ON its line */
    line-height: calc(var(--k5) * 1.95);
    font-size: var(--k6);
    pointer-events: auto;
    cursor: default;
}
.cl-mnote > * { white-space: nowrap; }
.cl-mnote[hidden] { display: none; }   /* a note whose guest the leaf no longer shows */
.cl-mn-w { font-family: var(--font-jp, 'Klee One', serif); color: var(--cl-ink); transition: color var(--duration-fast, .15s) var(--ease-settle, ease); }
.cl-mn-r { font-family: var(--font-jp, 'Klee One', serif); color: var(--cl-ink-past); }
.cl-mn-en { font-style: normal; font-family: var(--font-ui, 'Inter', sans-serif); font-size: var(--e3); color: var(--cl-quiet); letter-spacing: 0.01em; }
/* the dots TRAIL: a note that wraps in a narrow margin (280px at 1280) then
   ends its first line on "かいしゃ ·" and opens the next on the meaning, never
   on a stray dot */
.cl-mnote > :not(:last-child)::after { content: '·'; margin: 0 0.5em; color: rgba(110, 104, 96, 0.6); }
/* a guest under the pointer lights its note; a note under the pointer is
   lit with the occurrences it lights — the word's ink only */
.cl-mnote--lit .cl-mn-w { color: var(--cl-accent); }
/* ⭐ ROUND 2 (L8): a PRESSED word's note in the margin — lit, pressable (its
   disc, its character doors), on the token's line; the leaf never moves */
.cl-mnote--pressed { pointer-events: auto; }
.cl-mnote--pressed .cl-mn-w { color: var(--cl-accent); }
.cl-mnote--pressed .cl-chip--inline { vertical-align: middle; margin: 0 0.15em; }
.cl-mnote--pressed .cl-kref { font-family: var(--font-jp, 'Klee One', serif); }
/* below 1180px the free paper is under 230px: the notes fold into ONE ROW
   inside the leaf's foot, in flow, still one per guest. (The rail already
   stands down below 1364px, so the leaf's own left space is the only
   question here.) Relative + z-index so the fibre never paints over them. */
@media (max-width: 1179px) {
    .cl-page > .cl-margin {
        position: relative;
        top: auto;
        right: auto;
        width: auto;
        padding: 0;
        margin-top: 1.5rem;
        display: flex;
        flex-wrap: wrap;
        gap: 0.2rem 1.4rem;
        pointer-events: auto;
    }
    .cl-mnote { position: static; max-width: none; line-height: 1.5; justify-content: flex-start; text-align: left; }
}

/* ── the meaning item: the one ask about what the Japanese SAYS ───────────
   The sentence at reading size, the three readings of it under it in the
   look's own dress — a pressed line, a fading pair, and the answer named on
   a miss. Nothing here is self-graded and nothing keeps score. */
.cl-meanline {
    font-family: var(--font-jp, 'Klee One', serif);
    font-size: var(--k5);
    line-height: 1.9;
    color: var(--cl-ink);
    margin-bottom: 1.4rem;
}
.cl-mean .cl-ask { margin-bottom: 0.9rem; }
.cl-mean-opts { flex-direction: column; align-items: stretch; }
.cl-mean-o { max-width: 40em; }
/* the pressed-and-wrong line keeps its seat: the quiet border, the stone wash */
.cl-mean-o--wrong {
    border-color: transparent;
    background: rgba(216, 210, 200, 0.34);
    color: rgba(110, 104, 96, 0.7);
    box-shadow: none;
}
/* and the true reading is named, because a miss is owed the answer — S2: in
   the moss seat every right thing wears, never indigo (indigo is for things
   that answer the pointer, and an answer is not a control) */
.cl-mean-o--answer,
.cl-mean-o--right {
    border-color: transparent;
    background: rgba(var(--cl-moss), 0.16);
    color: rgb(var(--cl-moss-ink));
    box-shadow: none;
}

/* the warm-up's repair asks wear the set's own dress; only the station line
   above the first one says what they are */
.cl-repair .cl-station-line { color: var(--cl-quiet); }

/* ── the pair, on its own paper (owner note 2, 2026-09-08) ────────────────── */
/* ⭐⭐ "THESE TWO ARE EASY TO MIX UP" IS A PAGE, not the last block at the foot
   of a page about one character. The seat is the SHEET's full one — both glyphs,
   the shared clause, a line each — because this screen is where the learner comes
   to compare, and there is nothing else on the paper to compare it against. */
/* ⛔ ROUND 2: the page begins where a page begins and the SECTION keeps the
   column. It carried 2.8rem of margin on a section already sized to the
   glass (a 45px phantom scroll on every glass, 次へ cut at the bottom edge)
   and shrank the section itself to 34em, so its absolute foot spanned 544px
   and Next stood 176px inside the column's edge — the one station that
   escaped S1's x law. The prose keeps its 34em measure on its own blocks. */
.cl-twinpage { padding-top: var(--cl-origin-page); }
.cl-twinpage > .cl-twin, .cl-twinpage > p { max-width: 34em; }
.cl-twinpage > .cl-twin { margin-top: 0; }

/* ⭐ ROUND 2 (CR-7): KEYCAPS FOR THE KEYBOARD HAND. The 1-9 digits answered a
   guess, a pick, a meaning line and a page question and nothing said so.
   While the room is driven by keys (.cl-by-key) each option a digit reaches
   wears its numeral in the corner, quiet ink, seat reserved by the option's
   own padding; the pointer hand never sees it; a spent hand loses it.
   ⛔ Never on a build rack: those tiles are placed and taken back, and a
   numeral there would name a key that does nothing. */
#kotobaLesson.cl-by-key .cl-guess-o[data-key], #kotobaLesson.cl-by-key .cl-tile--kanji[data-key] { position: relative; }
#kotobaLesson.cl-by-key .cl-guess-o[data-key]::before, #kotobaLesson.cl-by-key .cl-tile--kanji[data-key]::before {
    content: attr(data-key);
    position: absolute;
    top: 3px;
    left: 6px;
    font-family: var(--font-ui, 'Inter', system-ui, sans-serif);
    font-size: var(--e4);
    font-weight: 500;
    line-height: 1;
    letter-spacing: 0;
    color: var(--cl-quiet);
    pointer-events: none;
}
#kotobaLesson.cl-by-key .cl-hand--done .cl-tile--kanji[data-key]::before,
#kotobaLesson.cl-by-key .cl-hand--done .cl-guess-o[data-key]::before,
#kotobaLesson.cl-by-key .cl-card--taken .cl-guess-o[data-key]::before { content: none; }
