The holdings page reads as panels, and every page title heads its content - #230
Merged
Conversation
The portfolio total was a private widget inside coins_screen.dart, which was fine while the dashboard panel was the only surface printing it. The /assets page is about to print the same number, and two copies of a number the user reads as one fact drift: the type, the colour, or the optical centring of the 24h percentage would sooner or later disagree between the two screens. Promoted verbatim - same tokens, same space4 inset, same CrossAxisAlignment.center that fixed the percentage hanging low. The dashboard's rendered tree is unchanged, and the header test proves it: the same boxH 32.0, drop 0.125 and header 94.0 it measured before. The test's finder moved with it. It matched the private type by name, and the test file declares its OWN AssetsTotalBand as a measurement probe, so the shipping widget is imported with a prefix rather than either being renamed - a probe called something else drifts out of step with what it claims to mirror.
Assets was the only unboxed list in the app. Home wraps every panel in DashboardScrollContainer, Activity wraps its transaction list in the same container on a phone, Markets draws a card per coin and News one per article - and Assets hung its rows on raw surface-base. The page now uses two panels: the portfolio total, then the search, the count and sort line, and the rows. Two things a user hits, fixed on the way: The back link is gone. It read "< HOME" and was written when the only way onto this page was the dashboard's View all. Assets has been the bottom bar's second tab since the S7 bar landed, and a tab has no back - Home is one tap away on the same screen. The sibling tab Activity carries no back link either, so the two now agree. The page frame is the shared one. This screen hardcoded a 64px top gap and a 12px gutter while every other page-header screen calls pageTitleGap and pageGutter, which are 24 and 6 on a phone. Measured on device, the Assets title sat 40px lower and 6px further in than the Transactions title. Cost, accepted deliberately: a boxed row has 348px of content at 390pt where a flat one has 362. The amount column was already measured clipping at that width, so this makes a known defect 14px worse. It is the same 14px Activity already pays, and matching the app beat keeping one page wider than the rest.
Every page title sat flush with the frame gutter while everything the page actually says - section kickers, coin names, row icons, transaction rows - sat 15px further in. The title read as having escaped to the left of its own page. Walked on device on Assets, then asked for across the tabs. The inset is derived from the app's panel container rather than picked: the 1px hairline it draws, the padding it charges (which switches on the same breakpoint the container does), and the space4 wall GWSectionTitle and kGWRowWall already share inside it. At 390pt that puts a title at 21 from the screen edge, which is the exact X the dashboard's own section titles land on - so "Assets" on the page now lines up with "Assets" on Home. space8 was rejected as a tidier single token: it lands at 22 and misses the content column by a pixel, and an alignment off by one is worse than one that is deliberately different. It lives in the component, so Assets, Activity, Markets, News, Banxa, the coin page and the job form all move together instead of drifting apart. Two costs, named rather than found later. The centred form (Swap, Feedback's header style) is exempt - it sits inside a centred card column, not above a content column. And on plain GWCard pages the title lands near its text rather than on it, because a card's padding is not a panel's; one inset shared by every title, so the tabs agree with each other, beats four that each agree with one page and no other. Three tests encoded the old flush-with-the-container rule. They are repointed, not deleted, and each now reads the inset from the component inside the pumped tree, so the component and its tests can no longer drift apart.
… them Sketch 187 asked whether /assets needs a breadcrumb and whether it should be boxed like the Home panels. Sketch 188 asked the same of Transactions - and answered a factual question that reversed 187's own recommendation, so 187 is annotated in place rather than quietly rewritten: its finding that no full page uses DashboardScrollContainer is false, and Assets was the only unboxed list in the app. Also records the quick task that implemented the winner, including the title inset chosen on device and the two costs it carries.
EduMenges
approved these changes
Aug 10, 2026
| // follow-up, held back only so it does not confound the review of | ||
| // the title treatment this change is actually for. | ||
| if (total > 0) ...[ | ||
| const SizedBox(width: GeniusWalletConsts.space4), |
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.
What a user hits
The holdings page finally looks like the rest of the app. Assets was the only unboxed list we
ship: Home wraps every panel in
DashboardScrollContainer, Activity wraps its transaction list inthe same container on a phone, Markets draws a card per coin and News one per article - and Assets
hung its rows on raw
surface-base. It now uses two panels: the portfolio total, then the search,the count and sort line, and the rows.
The "‹ HOME" back link is gone. It was written when the only way onto the page was the
dashboard's View all. Assets has been the bottom bar's second tab since the S7 bar landed, and a
tab has no back - Home is one tap away on the same screen. Activity, the tab beside it, never had
one either.
The page frame is the shared one. Assets was the single page-header screen hardcoding a 64px top
gap and a 12px gutter while every sibling calls
pageTitleGap/pageGutter(24 and 6 on a phone).Measured on device, its title sat 40px lower and 6px further in than the Transactions title.
Every page title moved in, not just this one. Titles sat flush with the frame gutter while
everything the page says - kickers, coin names, row icons, transaction rows - sat 15px further in, so
the title read as having escaped to the left of its own page. The inset now lives in
GWPageHeader,so Assets, Activity, Markets, News, Banxa, the coin page and the job form move together. It is
derived from the panel container (its hairline + its padding + the
space4wallGWSectionTitleandkGWRowWallshare), which puts a title at 21 on a phone - the exact X the dashboard's own sectiontitles land on.
Also: the portfolio total was a private widget inside
coins_screen.dartand is now shared, so thedashboard panel and the page cannot disagree about a number the user reads as one fact.
Verification
All run, not assumed:
flutter analyzeflutter testdart format lib testcheck_brace_style/check_raw_colors/check_onboarding_seed_safety/check_no_new_key_logging --scan-treecheck_agent_rules_syncThe dashboard's Assets panel is proven byte-identical after the shared-widget extraction:
assets_header_scheme_a_testreports the sameboxH=32.0,drop=0.125andheader=94.0it didbefore.
Walked on an iPhone 14 (390pt) via hot reload while building.
Deliberately not here
check_agent_rules_syncfails.AGENTS.mdandCLAUDE.mdare out of sync, neither file istouched by this branch, and the same mismatch is on
develop- it arrived with One rules file for every agent on the team #223. Reportedrather than fixed silently, because a rules-file edit is not something to smuggle into a UI PR.
so the two neighbouring tabs draw a list the same way; that is its own change and its own review.
wall). The amount column was already measured clipping at that width, so a known defect gets 14px
worse. It is the same 14px Activity already pays, and matching the app beat keeping one page wider
than every other. The clipping itself has a todo of its own.
GWCardpages the title lands near its text, not on it - a card's padding is not apanel's. One inset shared by every title, so the tabs agree with each other, beat four insets that
each agree with one page and no other.
has nothing page-specific to undo.
Reading the diff
The three code commits stand alone and are worth reading in order: the shared total band, then the
page, then the header component. The fourth is planning docs only - sketches 187 and 188, where 188
corrects a factual claim 187 made, annotated in place rather than quietly rewritten.