The news feed leads with a story, and the transaction filter leaves the list - #231
Merged
EduMenges merged 4 commits intoAug 10, 2026
Conversation
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.
braianxde
marked this pull request as ready for review
August 10, 2026 11:04
EduMenges
approved these changes
Aug 10, 2026
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 join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
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
DashboardScrollContainerevery 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:
RefreshIndicatoris 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.GWPageHeadercentres 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
Tooltipa 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 ownResponsiveDrawerwith aGWSelectRowper 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 and3 of 10- the count Assets prints and this page never had.Icons.filter_alt_outlinedrather thanIcons.tune:tuneis 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 toTransactionsScreen, 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:
IconButtonin 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.GWMeshBackgroundfor the flatsurfaceBasethat Assets and Crypto News paint. Both resolve to#0B0D12dark,#DCE0E6light.Verification
dart format lib testflutter analyzeflutter test+1203 ~3, all passedcheck_brace_stylecheck_raw_colorscheck_onboarding_seed_safetycheck_no_new_key_logging --scan-treecheck_agent_rules_synccheck_agent_rules_syncis red, and it was red before this branch touched anything: the drift is betweenAGENTS.mdand.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 ownpumpsTransactionsScreenandAssetsScreenin one test and compares them directly, so a change that moves both together still fails.Deliberately not here
ResponsiveDrawerdoes this whatever it holds -_ResponsiveDrawerScaffoldreturns aScaffold, which takesconstraints.biggest. Measured: a drawer whose entire body isText('one line')reportsSize(390, 844). Pre-existing and app-wide; fixing it means amaxHeighton the component and about 19 call sites to re-check, which is its own PR._TransactionFilterBarand_FilterChipare now dead code, roughly 200 lines. Deleting the narrow page's filter row removed their only live call site:_panelruns only whenpage == false, so itswidget.page ? bar : GWViewAllLinkternary 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.GWPageHeaderto absorb a tall trailing into its own bottom gap - changes a component shared with Buy GNUS and Swap.Filtersstill 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 (Failedalone returns 2 rows,Sent + Failedreturns 1) and sketch 191-F7 is the design for it. A model change, not a filter treatment._loadstamps onwhenCompletewhile 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 onredesign/row-rhythm-260808(PR #227). Basing ondevelopinstead would put roughly fifty commits already under review into this diff. Retarget once the parents land.