You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Found reconciling the 11 September 2026 prototype drop (a16008c5) against the app.
What the design draws now
The design has one disclosure and routes every expandable section through it. A header button carries a label or a custom header, an optional trailing slot before the glyph (a count, a lock), and an optional below line under the header. The panel opens over 240ms (cubic-bezier(.2,.8,.2,1)); the glyph turns over the same 240ms (cubic-bezier(.4,0,.2,1)). Two glyphs, on purpose: a caret (18, or 16 where a site says so) for lists — "more of the same, below" — turning 180°; a plus (12) for prose, an FAQ answer, turning 45° into a cross. collapsible={false} renders the header as a plain heading with the panel open — overruled for Path: the owner ruled that every module a learner can reach carries a caret and opens and shuts, so Disclosure states its open flag rather than inferring it. A collapsed panel keeps its content out of the tab order. divider draws the hairline under a row.
Its sites:
The practice list's Lessons and Games groups — divider between, panel paddingBottom: 6.
Path's modules — headerPad: 0, headerAlign: 'baseline', glyph 16, the lock as trailing, Finish X to unlock as below, panel paddingTop: 8. The move is now 240ms; the app took 320ms from the earlier design.
Reference — the same shape, its caption as below.
The challenges' For later list — headerPad: '4px 0', minHeight: 44, closed by default.
The Help FAQ rows — plus glyph, divider.
Coffee Duel's review, which v1 does not ship.
What the app draws now
Four hand-rolled dialects, and a fifth on its way: PracticeGroup with its own rotating chevron; PathModuleSection with a 13 chevron and expandDuration 320ms over AnimatedSize; ReferenceSection with CaretMark, whose own note says the turn is instant because the layer had no duration token — the design now gives one; the For later list, which does not collapse at all; and the Help PR (#591), which adds a plus-to-cross mark of its own for the FAQ.
What is owed
One Disclosure widget in lib/core/widgets/ carrying the design's slots, glyphs, timing and the collapsed-content rule, honouring reduced motion as a cut rather than a drop, as the Tour's frame does. The four app sites and the FAQ routed through it; CaretMark retired or folded in.
Acceptance criteria
One widget draws the Lessons and Games groups, Path's modules, Reference, For later and the FAQ, and no other expandable remains in lib/ — Disclosure; the only AnimatedSize left in lib/ is the dictionary self-check's reveal, which has no header and no glyph and is not a disclosure in the design either
Caret sites turn 180° and the FAQ's plus 45°, over 240ms with the design's easings; reduced motion cuts the move — AppMotion.disclosure with Cubic(.2,.8,.2,1) on the panel and Cubic(.4,0,.2,1) on the glyph; four tests in disclosure_test.dart hold the turns, the growth and the cut
A collapsed panel exposes nothing to assistive tech — it is not mounted at all, asserted against the semantics tree. Path's active module is a button, not a heading: the owner ruled the design wrong here, so every module a learner can reach carries a caret and opens and shuts, the active one open on arrival. A module still out of reach keeps neither caret nor lessons.
dart format, flutter analyze, the metrics gate and the suite pass, with a changelog bullet, and Path, Today's practice list and the FAQ are shown in screenshots — 3166 tests green, six CI jobs green on One disclosure draws every expandable section #599, all three screens driven on a simulator and reviewed
Out of scope
Coffee Duel's review disclosure — v1 does not ship the Duel.
Found reconciling the 11 September 2026 prototype drop (
a16008c5) against the app.What the design draws now
The design has one disclosure and routes every expandable section through it. A header button carries a
labelor a customheader, an optionaltrailingslot before the glyph (a count, a lock), and an optionalbelowline under the header. The panel opens over240ms(cubic-bezier(.2,.8,.2,1)); the glyph turns over the same240ms(cubic-bezier(.4,0,.2,1)). Two glyphs, on purpose: a caret (18, or 16 where a site says so) for lists — "more of the same, below" — turning 180°; a plus (12) for prose, an FAQ answer, turning 45° into a cross.collapsible={false}renders the header as a plain heading with the panel open — overruled for Path: the owner ruled that every module a learner can reach carries a caret and opens and shuts, soDisclosurestates its open flag rather than inferring it. A collapsed panel keeps its content out of the tab order.dividerdraws the hairline under a row.Its sites:
paddingBottom: 6.headerPad: '12px 0',minHeight: 44, glyph 16, trailing gap 14, panelpaddingLeft: 34, paddingBottom: 4. Built by The practice list groups lessons by module and games by kind, collapsibly (10 Sep drop) #582, which this ticket blocks.headerPad: 0,headerAlign: 'baseline', glyph 16, the lock as trailing, Finish X to unlock asbelow, panelpaddingTop: 8. The move is now240ms; the app took320msfrom the earlier design.below.headerPad: '4px 0',minHeight: 44, closed by default.What the app draws now
Four hand-rolled dialects, and a fifth on its way:
PracticeGroupwith its own rotating chevron;PathModuleSectionwith a 13 chevron andexpandDuration320ms overAnimatedSize;ReferenceSectionwithCaretMark, whose own note says the turn is instant because the layer had no duration token — the design now gives one; the For later list, which does not collapse at all; and the Help PR (#591), which adds a plus-to-cross mark of its own for the FAQ.What is owed
One
Disclosurewidget inlib/core/widgets/carrying the design's slots, glyphs, timing and the collapsed-content rule, honouring reduced motion as a cut rather than a drop, as the Tour's frame does. The four app sites and the FAQ routed through it;CaretMarkretired or folded in.Acceptance criteria
lib/—Disclosure; the onlyAnimatedSizeleft inlib/is the dictionary self-check's reveal, which has no header and no glyph and is not a disclosure in the design eitherAppMotion.disclosurewithCubic(.2,.8,.2,1)on the panel andCubic(.4,0,.2,1)on the glyph; four tests indisclosure_test.darthold the turns, the growth and the cutdart format,flutter analyze, the metrics gate and the suite pass, with a changelog bullet, and Path, Today's practice list and the FAQ are shown in screenshots — 3166 tests green, six CI jobs green on One disclosure draws every expandable section #599, all three screens driven on a simulator and reviewedOut of scope