Fix mobile UI inconsistencies (#920), Recover button placement, and Android back button#950
Open
Zazawowow wants to merge 8 commits into
Open
Fix mobile UI inconsistencies (#920), Recover button placement, and Android back button#950Zazawowow wants to merge 8 commits into
Zazawowow wants to merge 8 commits into
Conversation
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.
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.
Summary
HorizontalWrapListBox class (WrapPanel) — month/frequency preset buttons keep natural width and wrap instead of char-wrapping inside a squeezed UniformGridTests
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.Closes #920