aboutsummaryrefslogtreecommitdiffstats
path: root/docs/superpowers/plans/2026-08-09-card-list.md
AgeCommit message (Collapse)AuthorFilesLines
2026-08-09docs: keep the card list off master, and name the way backDanilo M.1-6/+60
The user asked to be able to abandon this cleanly. Task 0 now branches `card-list` off a rebased copy rather than rebasing `item-20-message-rows` in place, which would have destroyed the record of what the rejected presentation looked like. Nothing in the plan touches master, stated as a requirement rather than left to convention, with the escape hatch written out: `git checkout master` is the whole of the undo. Task 0 gains a step that verifies master and the original branch are both where they started, since a rebase onto the wrong branch is silent and every later task assumes master is the thing to fall back to. Task 10 now ends by explicitly forbidding a merge. This design was reached by rejecting a previous one that was finished, tested and green, so a passing suite is not what decides it: the user looks at the cards. That is the one instruction most likely to be lost between sessions, and it is the one that matters.
2026-08-09docs: make the account colour the card's accent, not a chipDanilo M.1-15/+225
The plan left the account chip unspecified, because where it sits on a card was never decided and inventing a place would have been a guess. The user's answer replaces it rather than placing it: a coloured bar down the card's left edge, the reply spines inheriting that colour, and matching swatches in the account dropdown. It is a net simplification. The chip ate a third of line 2 on every card to repeat a name the user already knows, which is the table-of-records texture item 53 is about; the bar says the same thing in a few pixels and leaves line 2 to the subject. Three details that are easy to get wrong and are specified rather than left to the implementer: - The raw account colour is never drawn as a line. It is chosen to be a chip's FILL, with text drawn on top in whatever stays legible against it. A thin line on the pane's own background has a different job: followable down a long expansion without competing with the senders beside it. The accent blends toward QPalette::Base by the same 0.35 weight threadLineColour() already uses, keeping the hue and dropping the shout. The dropdown swatch does use the raw colour, being a filled patch rather than a line. - A reply resolves its THREAD's colour by walking to the root. AccountColourRole is empty on a message row, so a spine reading its own index would fall back to the neutral line under an accented root and break the continuous edge the design is built on. - Reply cards carry no bar of their own. Two vertical lines a few pixels apart in one gutter is what option B looked like, and the spine already carries the accent. colourFor() never failing is kept deliberately: an account with no colour= key gets a stable colour derived from its tag name, so adding an account and forgetting to colour it degrades to something usable rather than to nothing. kAccentWidth ships at 3px as a starting value. Whether five accounts are tellable apart at that width, on this user's screen and theme, is not decidable from a mockup or a test, so Task 10 gains a step that settles it against real cards, in both themes, with the guidance to widen the bar before touching the user's own colour choices.
2026-08-09docs: plan the card list implementationDanilo M.1-0/+1958
Eleven tasks against the card-list spec, TDD throughout, each with its own mutation check. Three decisions the plan makes that the spec did not: - Task 0 rebases the branch first. item-20-message-rows is 15 commits behind master and conflicts in eight files, one of which carries the item 55 splitter fix in the same file this plan rewrites heavily. Resolving that while also building a feature would mean debugging a merge and a feature at once, so it is its own task with its own verification step. - CardLayout is a separate file from CardDelegate, holding all the geometry and touching no painter or widget. That is a direct response to the rendering-probe lessons in CLAUDE.md: a delegate test can be defeated by a blank render, a pure function cannot. - Tasks 2, 5 and 6 knowingly leave the build red between commits, since removing a column across three files cannot be atomic without one enormous commit. The plan says so at each one and warns against merging mid-plan. Also recorded: the account chip is specified but has no task, because its placement on a card was never specified and inventing one would be a guess.