Skip to content
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
David7ce merged 2 commits into
mainfrom
claude/like-button-consistency
Aug 31, 2026
Merged

David7ce merged 2 commits into
mainfrom
claude/like-button-consistency

Conversation

@David7ce

Copy link
Copy Markdown
Member

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:

Where How
Manga Pill, written inline
Audiobooks Pill, via a private _LikeButton
Podcasts Bare IconButton in the app bar
Books Heart in a list row
Music Heart in a list row

The 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:

  • Movies/Series "Add to Library" — library membership, and a bookmark rather than a heart because that's what it means.
  • Anime status — a four-state picker (Watching / Plan to Watch / Completed / Dropped). A heart can't express four states.
  • 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.

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

LikeButton 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 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

claude added 2 commits August 31, 2026 08:35
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
David7ce merged commit 96d978a into main Aug 31, 2026
1 check passed
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
David7ce deleted the claude/like-button-consistency branch August 31, 2026 09:55
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>
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants