Skip to content

Design parity 10: the Cards grid hides the unearned remainder #396

Description

@maximsan

From the divergence register (fix order step 10), tracked on the master checklist §5.

The design does not show the full locked set. The grid renders earned cards, then exactly one locked teaser, then a footer reading "{n} more to collect" (prototype/screens.jsx:1647-1664). Confirmed as still wanted (product owner, Aug 2026).

Acceptance

  • The grid shows earned cards plus one locked teaser, never the whole locked set — cardsGridItems, unit-tested over a fresh, a partial and a complete collection; the teaser keeps its authored position, so it can sit between two earned cards.
  • The footer count is the unearned remainder — total − earned, which counts the visible teaser, so it is not one less — asserted both ways in cards_grid_test: three counted, one of them on screen.
  • One flat grid, not grouped by category · no progress bar · the sub-line is a bare {earned} of {total} in mono at the label step (checklist §5 items 23–25) — cards_collection_test pins all three, including that two module tags produce no headings.

Built in PR #439. The screen's own "Collection" title went with it: the shared header already carries the tab's name, so it was being said twice. The design has both — an invisible bar at rest and a large title on the screen — and the app's bar draws at rest instead; that is #441, and the title comes back when it lands.

The tile is untouched and still diverges — a locked one draws ??? where the design draws its place in the set. That is #434.

The teaser is inert — and a fourth criterion asking otherwise was wrong

This read "Tapping the teaser opens the same sheet an unearned card opens". The design has no such behaviour, and the citation above does not cover the code that settles it: CollectionCard (prototype/screens.jsx:2398) returns early for an unearned card with no onClick, so a locked tile — teaser or not — opens nothing. The app already agrees: card_grid_item_widget.dart passes onTap: null when uncollected.

So there is nothing to build for it, and building it would add a tap target the design withholds. Dropped rather than carried, so it is not re-added.

This therefore does not wait on #385. The sheet that ticket builds is for earned cards; nothing here opens anything. The two are independent and can land in either order.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    design-parityCloses a finding in the app-vs-prototype divergence register

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions