Skip to content

The news feed leads with a story, and the transaction filter leaves the list - #231

Merged
EduMenges merged 4 commits into
redesign/assets-boxed-panels-260808from
redesign/news-digest-tx-filters-260810
Aug 10, 2026
Merged

The news feed leads with a story, and the transaction filter leaves the list#231
EduMenges merged 4 commits into
redesign/assets-boxed-panels-260808from
redesign/news-digest-tx-filters-260810

Conversation

@SirYakoob

Copy link
Copy Markdown

Two phone surfaces that were still showing their desktop shape.

Crypto News: the grid could not fit a headline

On a phone the news grid resolved to two 181px columns, which left a 16px headline 147px of line against a 62-character median headline. Nearly every card was truncated, and thirty articles spent 4,248px of grid to say very little. It also put a search field first, above the news.

The narrow presentation now leads with the hero story and follows it with one digest panel: the same DashboardScrollContainer every other list page uses, holding the search field, a story count and each remaining article as a 72px-thumbnail row with a two-line headline and a one-line dek. The separate "Next up" band is gone, since its three stories are just the first three rows. The wide presentation is byte-identical.

Two smaller header corrections while it was open:

  • The refresh button now renders on desktop only. It exists because pull-to-refresh is unreachable with a mouse, and that reason only holds where there is a mouse. On a phone RefreshIndicator is already mounted over the same feed, so the glyph was a second door into a room that has one - and its 40px tap target, not the 32px title, was what set the header row's height. The header goes 56 to 48.
  • The freshness stamp moves down 1px. GWPageHeader centres its trailing by line box, and a line box is not where the letters are. Inter's proportional leading puts the 24/32 title's ink at 7.93..30.61 and the 14/20 stamp's at 11.49..25.03, so the stamp read a pixel high.

Transactions: nine filters, four of them reachable

The phone page inherited the dashboard panel's filter bar - four icon-only chips with the other five filters behind an overflow menu, and no labels anywhere, because a chip that grows on tap shoves its neighbours sideways. It cost a 44px row plus its gap, the filter names lived in a Tooltip a finger cannot open, and a filter chosen from the menu left no mark on the page: the list read as unfiltered while showing part of itself.

The trigger is now a funnel in GWPageHeader.trailing, the slot Crypto News already fills, so it costs the page no vertical space at all. It opens the app's own ResponsiveDrawer with a GWSelectRow per filter, each carrying the badge mark its rows already use and its live count, so all nine filters and All are one gesture away and every one is named. A live filter tints the trigger and adds a dismissible chip row above the list carrying the filter's name and 3 of 10 - the count Assets prints and this page never had.

Icons.filter_alt_outlined rather than Icons.tune: tune is already Swap's settings glyph, and the funnel is already this screen's own filtered-empty mark, so anything else would make the trigger disagree with the empty state it produces.

The page's filter moved from TransactionsSlimView's State up to TransactionsScreen, because the trigger that sets it sits two widgets above the list. Both pass-throughs take it as an optional parameter, so the dashboard panel keeps its own internal filter and its call sites are unchanged.

Three corrections from reviewing it on device:

  • The page title sat 8px lower than every other page title, and the list 16px lower, because a 48x48 IconButton in the header sets that row's height against the 32px title line. The trigger is 48x32 now and the page measures 48/0/48, identical to Assets.
  • The phone background drops GWMeshBackground for the flat surfaceBase that Assets and Crypto News paint. Both resolve to #0B0D12 dark, #DCE0E6 light.
  • "No more transactions" is gone.

Verification

gate result
dart format lib test 399 files, 0 changed
flutter analyze No issues found
flutter test +1203 ~3, all passed
check_brace_style 0
check_raw_colors 0
check_onboarding_seed_safety 0
check_no_new_key_logging --scan-tree 0
check_agent_rules_sync 1 - see below

check_agent_rules_sync is red, and it was red before this branch touched anything: the drift is between AGENTS.md and .github/copilot-instructions.md, in prose about the lazy-developer ladder. Neither file is modified here. Left for whoever owns that sync rather than folded into a UI PR.

Test count moved 1207 to 1203 across the two feature commits and is accounted for exactly: a 14-test group asserting the old filter bar became a 9-test group asserting the new control, the drawer-padding census gained one, three end-of-list tests folded to two cap tests, and one header-geometry test was added. One assertion has no successor and was deleted rather than replaced with something invented: it measured the font size of the terminus label, and the label no longer exists.

Header geometry and drawer heights in this description are measured in widget tests against really-pumped screens, not estimated. phone: the page title sits exactly where Assets puts its own pumps TransactionsScreen and AssetsScreen in one test and compares them directly, so a change that moves both together still fails.

Deliberately not here

  • The filter drawer will be full-screen height on a phone, leaving roughly 180px empty below the last row. Every mobile ResponsiveDrawer does this whatever it holds - _ResponsiveDrawerScaffold returns a Scaffold, which takes constraints.biggest. Measured: a drawer whose entire body is Text('one line') reports Size(390, 844). Pre-existing and app-wide; fixing it means a maxHeight on the component and about 19 call sites to re-check, which is its own PR.
  • _TransactionFilterBar and _FilterChip are now dead code, roughly 200 lines. Deleting the narrow page's filter row removed their only live call site: _panel runs only when page == false, so its widget.page ? bar : GWViewAllLink ternary has always taken the link arm since the 2026-08-07 merge. They are kept here because removing them is a separate decision, and the dead arm keeps them referenced so no analyzer suppression is needed.
  • The trigger's tap target is 48x32, down from 48x48. 32 on the short side clears WCAG 2.2 SC 2.5.8's 24x24 conformance floor and 48dp Android horizontally, but it is under Apple's 44pt recommendation vertically. That is the price of the title landing level with every other page title, and it was chosen knowingly. The alternative - teaching GWPageHeader to absorb a tall trailing into its own bottom gap - changes a component shared with Buy GNUS and Swap.
  • Filters still mixes two orthogonal axes. Seven types and two statuses in one enum with single-value selection, so choosing Pending un-chooses Sent and "my failed sends" is not a question this control can ask. Sketch 191 measured it (Failed alone returns 2 rows, Sent + Failed returns 1) and sketch 191-F7 is the design for it. A model change, not a filter treatment.
  • Mint's glyph is the odd one out. It is the only filter whose mark is not a Material icon but a stroked SVG asset at stroke-width 3.2, so it reads heavier than everything beside it at any size. True in the shipped app; recorded in sketch 193 rather than fixed silently.
  • The "Updated" stamp can lie. _load stamps on whenComplete while the API returns its cache untouched for two minutes, so a refresh inside that window reads "Updated now" having fetched nothing. Sketch 194 finding 3, unfixed here.

Base branch

Stacked on redesign/assets-boxed-panels-260808 (PR #230), which is itself on redesign/row-rhythm-260808 (PR #227). Basing on develop instead would put roughly fifty commits already under review into this diff. Retarget once the parents land.

On a phone the news grid resolved to two 181px columns, which gave a 16px
headline 147px of line against a 62-character median headline. Nearly every
card was truncated, and 30 articles cost 4,248px of grid for very little
readable text.

The narrow presentation is now a lead hero followed by one digest panel: the
same DashboardScrollContainer every other list page uses, holding the search
field, a story count and every remaining article as a 72px-thumbnail row with
a two-line headline and a one-line dek. "Next up" is gone as a separate band;
its three stories are simply the first three rows. The wide presentation is
untouched.

Two smaller corrections to the header while it was open:

The refresh button now renders on desktop only. It exists because
pull-to-refresh is unreachable with a mouse, which is a reason that only holds
where there is a mouse; on a phone RefreshIndicator is already mounted over
this same feed, so the glyph was a second door into a room that has one. Its
40px tap target, not the 32px title, was what set the header row's height, so
removing it takes the header from 56 to 48.

The freshness stamp is nudged down 1px. GWPageHeader centres its trailing by
line box, and a line box is not where the letters are: Inter's proportional
leading puts the 24/32 title's ink at 7.93..30.61 and this 14/20 stamp's at
11.49..25.03, so the stamp read a pixel high. Baseline alignment overshoots
2.6px the other way.

Sketches 189 (scheme C) and 194 (scheme A).
The phone page inherited the dashboard panel's filter bar: a track of four
icon-only chips with the remaining five filters behind an overflow menu, and
no labels anywhere, because a chip that grows on tap shoves its neighbours
sideways. It cost the panel a 44px row plus its gap, and a filter chosen from
the menu left no mark on the page at all.

The trigger is now a funnel in GWPageHeader.trailing, the slot Crypto News
already fills, which costs the page no vertical space. It opens the app's own
ResponsiveDrawer with a GWSelectRow per filter, each carrying the same badge
mark the rows below use and its live count, so all nine filters and All are
one gesture away and every one of them is named. A live filter paints the
trigger and adds a dismissible chip row above the list carrying the filter's
name and "3 of 10", which is the count Assets prints and this page never had.

Icons.filter_alt_outlined rather than Icons.tune: tune is already Swap's
settings glyph, and filter_alt_outlined is already this screen's own
filtered-empty mark.

The page's filter now lives on TransactionsScreen rather than inside
TransactionsSlimView's State, because the trigger that sets it sits two
widgets above the list. Both pass-throughs take it as an optional parameter,
so the dashboard panel keeps its own internal filter and its call sites are
unchanged.

Three corrections from reviewing it on device:

The page title sat 8px lower than every other page title, and the list 16px
lower, because a 48x48 IconButton in the header rows sets that row's height
against the 32px title line. The trigger is 48x32 now and the page measures
48/0/48, identical to Assets. That trades tap height: 32 clears WCAG 2.2 SC
2.5.8's 24x24 floor but is under Apple's 44pt recommendation vertically.

The phone background drops GWMeshBackground for the plain surfaceBase that
Assets and Crypto News paint.

The "No more transactions" terminus is gone. The cap it used to distinguish is
now asserted by row counts and the presence of View all.

Sketch 195, scheme G2.
Seven sketches behind the two changes above, kept because each records a
decision that is not visible in the diff.

189 measured why the phone news grid failed and put five schemes against real
CoinTelegraph data. 190 put the Transactions page in the Assets page's
language. 191 and 192 are two rounds of filter treatments; 193 corrected three
assumptions the earlier rounds had made about the app's own drawer, its icon
table and whether the count line earned its space. 194 covered the news
freshness stamp. 195 is the design that shipped.

Three corrections recorded there rather than silently fixed: sketches 188, 190,
191 and 192 drew hand-made filter glyphs instead of the shared badgeSpec table,
so their marks were stroked where the app's are filled and vertical where the
app's are diagonal; 188 and 190 drew a count on each filter chip that the code
has never rendered; and 191 and 192 invented a bottom sheet rather than using
ResponsiveDrawer. The layout findings stand, the impressions they invited were
made against the wrong marks.

Also noted for later, not fixed here: Mint is the one filter whose glyph is not
a Material icon but a stroked SVG asset, so it reads heavier than everything
beside it at any size, and that is true in the shipped app.
The team's standup note for the Crypto News feed and the Transactions filter,
in the flat-bullet chat format, plus what was deliberately left open and why.
@EduMenges
EduMenges merged commit 72175fe into redesign/assets-boxed-panels-260808 Aug 10, 2026
@EduMenges
EduMenges deleted the redesign/news-digest-tx-filters-260810 branch August 10, 2026 18:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants