Skip to content

Transactions page at phone width - #224

Merged
braianxde merged 3 commits into
developfrom
gsd/phase-25-transactions-mobile
Aug 7, 2026
Merged

Transactions page at phone width#224
braianxde merged 3 commits into
developfrom
gsd/phase-25-transactions-mobile

Conversation

@braianxde

@braianxde braianxde commented Aug 6, 2026

Copy link
Copy Markdown

/transactions was a desktop screen squeezed into a narrow window. This makes it read as a phone screen. Desktop is unchanged.

What you'll see on a phone

  • One title, not two. The page header and the panel's own title were stacking on top of each other.
  • The list sits on a card, with an animated brand mesh behind it, instead of floating on the raw background.
  • More history fits on screen. The clock time is gone from each row and the coin icon leads instead; padding, icon size and type are all tighter, and day separators are tighter too.
  • The token name and its tag get the room, instead of the amount claiming half of every row.
  • Filter chips are properly tappable — 44px, up from 32.
  • "No more transactions" at the end of the list, so a scrolled history reads as finished rather than as a load that stopped.
  • The page title sits closer to the nav bar, and the screen edges are tighter — recovered space goes to content.

The title spacing and edge gutters are shared, so Markets, News, Swap, Feedback, Token detail and Buy GNUS get the same tightening on a phone. Their content is untouched — that's the next pass.

Known limits

  • 44px meets the iOS minimum, not Android's 48dp.
  • Long amounts truncate sooner than before — the trade for giving the name and tag more room.
  • Not tested on a real device. This was verified by resizing the Windows build, which exercises the width breakpoint only — safe areas and real touch behaviour are unverified.
  • Light mode is still deferred project-wide.
  • The dashboard's own transactions panel still truncates its tags. Same shared row, deliberately left alone here.

For reviewers

Everything is gated on !GeniusBreakpoints.useDesktopLayout(context) — read from the window, not the row's constraints. The dashboard's transactions panel is ~376px wide while sitting on a desktop, so gating on row width would have restyled desktop by accident.

flutter analyze clean, both style gates clean, 1002/1002 tests (up from 1000: the never-transacted empty state and the 44px chip at 320px are now covered).

Quick task. Mobile pass over /transactions, plus the frame values it shares
with every other page header. Desktop is unchanged throughout.

Everything gates on `!GeniusBreakpoints.useDesktopLayout(context)` -- read from
the WINDOW, never the row's own constraints. TransactionRow's existing `wide`
bool is the wrong signal: the dashboard's transactions panel is ~376px while
sitting on a 2560px desktop, so gating on row width silently restyles desktop.
A bool satisfies the freeze rule (37639d5), which bans a dimension derived
continuously from constraints, not a breakpoint.

Shared frame values, applied to all seven pages that mount a GWPageHeader:
navbar->title 64->24 and page gutter 12->6 via GeniusBreakpoints.pageTitleGap
/pageGutter, plus card padding 12->6 through DashboardScrollContainer (all 11
call sites). The gutter never reaches 0 -- content on the window bezel is the
defect the 06-01 walk found.

The page's narrow branch used to `return _panel(...)`, which put TWO
"Transactions" on a phone: the route supplies GWPageHeader and _panel carries
its own GWSectionTitle. It now has its own presentation -- filter bar, then the
list on a card. _panel is untouched; the dashboard still needs its title.

Removing that duplicate is what made a real touch target affordable: the filter
bar moved onto its own row, so the chips reach 44 (44pt iOS; 48dp Android is
still unmet), pinned by a test at 320. The earlier audit had ruled 44 out
against ~11px of shared-row headroom.

Row density: time column dropped and the icon leads; padding, gaps, icon and
type all reduced; the name+tag block takes 2 parts against the amount's 1 where
it was 1:1. Background is GWMeshBackground. A terminus closes the list.

Phase 15's suspected title-row overflow is confirmed a harness-font artifact:
measured on the running build at 320/360/390/414, there is none. Its deferred
item 1 closes with no fix, because none was needed.

Costs recorded in the task SUMMARY rather than glossed: the mesh never settles
(so widget tests below 768 must use pump(), not pumpAndSettle), the minute is
gone from the phone row, long amounts truncate sooner, and the desktop
dashboard panel still truncates its tags.

isMobileApp() is false on Windows, so this is the width branch only -- never a
real device. Safe areas and actual touch behaviour are unverified.

Also corrects two stale planning claims: the ROADMAP progress table (12, 13 and
15 are passed, not partial) and Phase 18, whose VERIFICATION body still reads
gaps_found although cccd20c deleted the orphaned webTabCanClose() on
2026-07-25. Phase 14 is the only genuinely open phase.

Suite 1000 -> 1002; analyze clean; brace and raw-colour gates clean.
A commit cannot contain its own hash, so the Quick Tasks Completed row is
filled in here.
- W017: pruned the orphan worktree GNUS-compare/GeniusWallet-3514, whose path
  no longer exists on disk.
- W004: model_profile was "adaptive", which is not a valid value (quality,
  balanced, budget, inherit) -> "balanced". Practical effect is nil either way:
  dynamic_routing is enabled and overrides model_profile.

Also gave four files the date prefix the other eleven HANDOFFs carry, so the
directory reads consistently: three HANDOFF-swap-* and .continue-here.md, the
last renamed to HANDOFF-260729-jakub-paused-work-since-landed.md. Its work is
merged (8ed02e7 is an ancestor of HEAD), so it is a record, not a pointer.
This is cosmetic ONLY -- it clears no warning. GSD flags all 15 HANDOFF files
as non-canonical regardless of naming, and that cannot be fixed without moving
them, which AGENTS.md:106 forbids ("Every session writes its own
.planning/HANDOFF-<topic>.md"). Project convention wins; the W019s are
permanent and expected.

Health: 22 -> 20 warnings, 0 errors. Remaining: 15x W019 (above), 4x W009
(phases 08/13/14/22 have Validation Architecture in RESEARCH.md but no
VALIDATION.md), 1x W006 (Phase 1 in ROADMAP.md, never started, no directory).
@braianxde braianxde changed the title Transactions at phone width Transactions: mobile layout Aug 6, 2026
@braianxde braianxde changed the title Transactions: mobile layout Transactions page at phone width Aug 6, 2026
Comment thread lib/dashboard/chart/markets_screen.dart
Comment thread lib/dashboard/home/widgets/transaction_displays.dart
@braianxde
braianxde merged commit 545d0a3 into develop Aug 7, 2026
11 of 19 checks passed
EduMenges pushed a commit that referenced this pull request Aug 10, 2026
Both were live in the app and neither was in ROADMAP.md. Phase 24 is the
mobile nav shell (centre dock, wallet header, two-section accounts sheet);
phase 25 is the capped dashboard sections and the Assets page they forced
into existence. Added with their locked decisions, the files they landed and
their test coverage.

Both carry an artifact-gap note, because the metadata lies: phase 24 has no
SUMMARY and its PLAN still reads status: in-progress, and phase 25's BRIEF
still reads ready-to-plan with no SUMMARY for 25-01. Jakub executed them
outside GSD. The roadmap now says to trust git over the phase files rather
than leaving the next reader to work that out.

STATE.md contradicted itself and the repo — current_phase 14 in frontmatter,
23 in one body line, 22 in another, and a stopped_at claiming the 260806-hfe
task was never pushed when it merged as #224. Counters and dates corrected,
and a dated block now marks where the current position ends and the
dual-track history begins. That history is kept, not rewritten.
@EduMenges
EduMenges deleted the gsd/phase-25-transactions-mobile branch August 17, 2026 20:35
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