This repository was archived by the owner on Sep 7, 2026. It is now read-only.
Use one like control instead of five - #21
Merged
Merged
Conversation
Five content types each rendered the same boolean "like" their own way: two pill variants (Manga inline, Audiobooks via a private _LikeButton), a bare IconButton (Podcasts), and two list-row hearts (Books, Music). The audit rated this High. The colours were unified on 2026-08-29; the controls were not. All now use LikeButton, in one of two styles. The two styles only looked contradictory. The pill fills red and turns its icon white; the bare icon turns red. That is correct, and the reason now lives in the widget rather than being rediscovered per page: a filled pill needs a white icon to stay legible against its own fill, while a bare icon has no fill and so must carry the colour itself. Both use kLikedColor. Not folded in, because they are not the same concept: - Movies/Series "Add to Library" -- library membership, and a bookmark rather than a heart because that is what it means. - Anime status -- a four-state picker (Watching / Plan to Watch / Completed / Dropped). Collapsing it to a heart would delete the feature. - The fullscreen music player's like -- routes through the studio's user-configurable hover physics, which LikeButton would drop. It uses kLikedColor and carries the same semantics, so it follows the rules without being the widget. LikeButton also carries Semantics(button, toggled, label), which none of the five had: the bare-icon style has no visible text, so a screen reader previously announced an unlabelled button. The new test fails on any filled/outline heart ternary outside those exceptions. Its first draft flagged a sub-tab icon and an empty-state glyph -- matching the ternary rather than the icon name is what distinguishes a toggle from decoration. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01B62qvJ25JCrwnV2uiDrnCQ
#20 landed first and added its entry at the top of the same section. Both are dated 2026-08-31 and describe different work, so both stay. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01B62qvJ25JCrwnV2uiDrnCQ
David7ce
pushed a commit
that referenced
this pull request
Aug 31, 2026
Same keep-both as last time: #21 landed and added its entry at the top of the section this branch also writes to. Git cannot auto-merge two insertions at one anchor, so this round was expected. The roadmap needed nothing this time -- the row #20 retired stayed retired, and the corrected item 8 survived. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01B62qvJ25JCrwnV2uiDrnCQ
David7ce
added a commit
that referenced
this pull request
Sep 1, 2026
…y icon) Five new items, tracked not implemented, each investigated enough to be concrete rather than restating the ask: - #18: Movies/Series and Comics/Manga section labels -- code still says the slash form, only the roadmap's own table had already drifted to the ampersand form. - #19: Anime's language toggle is a binary IconButton today, not a dropdown -- needs FilterDropdown treatment matching its own genre filter right next to it. - #20: hero carousel issues are three separate root causes, not one bug -- Movies & Series has no backdrop image field at all (poster force-fit into a landscape slot), Live TV's code looks correct so the cause is unclear without eyes on it, Anime not yet investigated. - #21: Radio is not a styling problem -- it has no real station data source, just genre-flavoured song search reskinned as "stations". Books/Podcast UX-parity with Anime is blocked on Books' existing no-cover-URL problem. - #22: Library's "Saved" tab uses a heart icon for something broader than "liked" by its own doc comment; asked to split Liked/Playlist inside it, deliberately skipping Read for Playlist. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes the audit's highest-severity open finding — "Favorite control — 5 different schemes across content types" (High), which it called "the single most visible inconsistency in the app".
The problem
Five content types each rendered the same boolean "like" their own way:
_LikeButtonIconButtonin the app barThe colours were unified back on 2026-08-29. The controls were not. All five now use
LikeButton, in one of two styles.The contradiction that wasn't
The audit flagged that the pill turns its icon white while the bare icon turns red — "opposite color logic from the visually-similar pill".
Both are correct, and the reason now lives in the widget instead of being rediscovered per page: a filled pill needs a white icon to stay legible against its own red fill; a bare icon has no fill, so it must carry the colour itself. Both use
kLikedColor. "Fixing" one to match the other would have destroyed contrast in the pill.What I deliberately did not fold in
These look similar but are different concepts, and merging them would delete features:
LikeButtonwould drop. It useskLikedColorand carries the same semantics, so it follows the rules without being the widget.All three are recorded in the widget's doc comment and the audit, so nobody "finishes the job" later by breaking them.
An accessibility fix that came free
LikeButtoncarriesSemantics(button, toggled, label)— which none of the five had. The bare-icon style has no visible text, so a screen reader previously announced an unlabelled button.The test
Fails on any new filled/outline heart ternary outside those exceptions.
Its first draft matched the icon name and immediately flagged a sub-tab icon and an empty-state glyph — both decoration, not toggles. Matching the ternary between filled and outline is what distinguishes a control from an illustration.
Verification
flutter analyze→ No issues found.flutter test --exclude-tags network→ 212 passed.Generated by Claude Code