Skip to content

Fix mobile UI inconsistencies (#920), Recover button placement, and Android back button#950

Open
Zazawowow wants to merge 8 commits into
mainfrom
fix/920-mobile-ui-and-back-button
Open

Fix mobile UI inconsistencies (#920), Recover button placement, and Android back button#950
Zazawowow wants to merge 8 commits into
mainfrom
fix/920-mobile-ui-and-back-button

Conversation

@Zazawowow

Copy link
Copy Markdown
Collaborator

Summary

  • Recover button (InvestmentDetail): moved structurally below the stages, full width at all breakpoints — the previous runtime grid-repositioning fix was fragile across cached-view re-attachment and regressed (overlapped "Payment Schedule" on mobile).
  • Issue Angor-mobile app ui inconsistencies (v0.2.31) #920 fixes:
    • New HorizontalWrap ListBox class (WrapPanel) — month/frequency preset buttons keep natural width and wrap instead of char-wrapping inside a squeezed UniformGrid
    • Step4: Start/End date columns stack in one column on compact
    • Step5: stage editor Percentage + Release Date stacked one column (date no longer overflows)
    • PaymentFlow modal: title/amount header uses Grid (no overlap); wallet card stacks name/type/balance in one column
  • Android physical back button: Back Down/Up could desynchronize when app state changed between the two key events, leaving a dead back button. Down is now always consumed; Up routes to the shell back ladder and performs the platform default itself at root.

Tests

  • New PlatformBackRegressionTests (7 headless tests) covering every state in the shell back ladder, incl. modal priority and wizard step-back; also pins the string-keyed view-cache labels so nav-label renames fail loudly.
  • New PaymentFlowView layout-regression test at all 6 breakpoints (caught a real overflow during development).
  • Full layout+responsiveness+back suite: 106/106 passed. App, App.Desktop, App.Android all build clean.

Closes #920

Dorian and others added 8 commits July 23, 2026 22:17
The runtime grid-repositioning fix was fragile across cached-view
re-attachment and regressed (button overlapped 'Payment Schedule' on
mobile). The button is now structurally the last element of the
schedule card so it cannot overlap the header regardless of
layout-mode races.
)

- New HorizontalWrap ListBox class (WrapPanel): preset buttons keep
  natural width and wrap to the next line instead of char-wrapping
  inside a squeezed UniformGrid (month/frequency selectors)
- Step4: Start/End date columns stack in one column on compact
- Step5: stage editor Percentage + Release Date stacked one column
  (date text no longer overflows the picker)
- PaymentFlow: title/amount header uses Grid instead of overlapping
  Panel; wallet card stacks name/type/balance in one column
…ession tests

Back Down/Up could desynchronize when app state changed between the
two key events (modal closing itself, async nav), leaving Android with
an orphan Up and a dead back button. Back Down is now always consumed;
Up routes to the shell back ladder and performs the platform default
itself when at a root screen.

Adds PlatformBackRegressionTests covering every state in the
CanHandlePlatformBack/TryHandlePlatformBack ladder (modal priority,
detail screens, wizard step-back, edit profile, manage funds) and a
PaymentFlowView layout-regression test at all breakpoints.
…le support

- Modal opens immediately in a loading state (house spinner pattern)
  while investor shares are fetched; inline error state on failure —
  the button is never a silent no-op during the fetch
- Proper modal chrome: RecoveryModalBg/Border light+dark tokens,
  sticky Dock=Top header with close X, sticky Dock=Bottom full-width
  Close (ModalBtn MobileAction), inner ScrollViewer bound to parent
  bounds instead of hardcoded MaxHeight
- Mobile: fixed-width table becomes stacked investor cards on compact
  (same pattern as InvestmentDetail stages); summary stat cards stack
- Replaced hardcoded orange/green hexes with PillOrange*/TabBarPillActiveBg
  theme tokens
- Layout regression tests for data + loading states at all breakpoints
  (caught a wrapping-note overflow and a rotating-spinner bounds bug)
…centred content

- BitcoinAccent (orange) token instead of the ad-hoc green gradient,
  matching the original design accent for the recovery action
- MobileAction class: standard 52px action height on compact
  (MinHeight instead of inline Height so the style setter wins)
- Content centred on both axes
…ed banners

- Preset pills (BTC amounts, months, frequency): transparent background
  + Stroke outline instead of the washed-out SurfaceHover fill in dark
  mode; standard 60px MinHeight so mixed preset rows all align with the
  two-line target-amount pills
- New BalancedWrapPanel: preset rows divide the full width into balanced
  rows (5 -> 3+2, 6 -> 3+3) instead of hugging content; used by the
  project-length presets at all breakpoints
- Frequency presets: 2x2 fill grid on compact (new Grid2 ItemsPanel
  class), single full-width row on desktop
- Step5 duration input + Months dropdown aligned at the same 52px height;
  Add Another Stage matches primary action height
- Advanced editor total/date banners use PillGreen*/PillAmber* theme
  tokens instead of hardcoded light-mode hexes
- Stage row delete: borderless icon button (house RemoveBtn pattern),
  red trash (PillRedText) matching Settings deletes
- Layout regression tests now cover all three project types AND the real
  step-5 form (ShowStep5Welcome=false) - the welcome interstitial was
  masking the form from the audits
…ve in layout asserts

- Header title row: horizontal StackPanel never constrains children, so the
  20px title escaped its 238px slot at the 360 breakpoint. Replaced with a
  Grid (Auto,12,*) and CharacterEllipsis trimming so the title shrinks.
- LayoutAsserts.ToRootRect now excludes the element's own render transform:
  the loading spinner's RotateTransform swung the icon's corner ~29px
  depending on which animation frame the layout pass caught, producing
  timing-dependent false OVERFLOW failures. Render transforms don't move
  layout slots, so they must not count against bounds checks.
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.

Angor-mobile app ui inconsistencies (v0.2.31)

2 participants