feat(ui): apply handbook §02 / §03 / §12 product copy + visibility updates#635
Merged
Merged
Conversation
Updates five strings on the wallet-type selection / software-wallet-terms screens (handbook sections 02 + 03) to match the latest product copy: - realunitWalletSubtitle: emphasis shifts from 'manage' to 'buy and manage', and renames the asset from 'tokens' to 'stock tokens' (Aktientoken). - softwareWallet: 'Digital Wallet (App)' → 'Software-Wallet (App)' / 'Software Wallet' → 'Software Wallet (App)'. - softwareWalletSubtitle: now covers both new-wallet and restore paths in one line, naming Aktionariat as the canonical existing-wallet example. - bitbox: appends 'Hardware-Wallet' / 'Hardware Wallet' so the tile makes the device class explicit alongside the brand name. - hardwareWalletSubtitle: replaces the descriptive sentence with a first-person 'I own a Bitbox02 Nova ...' line matching the new software-wallet tile voicing. Also updates the handbook section-02 description to reflect the renamed tiles and the broader software-wallet scope. Section 03 prose is unchanged (the two-step architecture stays); its screenshot picks up the new header subtitle automatically via the shared welcome-page golden.
The Mainnet/Testnet toggle in Settings is a developer affordance — there is no end-user reason to switch networks and an accidental tap drops the user onto Testnet with broken liquidity and a forced reauth on every subsequent network round-trip. Wraps the SettingOption that opens `SettingsNetworkPage` in a `if (kDebugMode)` collection-if, mirroring the existing pattern in `lib/screens/welcome/welcome_page.dart:125` for the Address+Signature debug entry. `SettingsNetworkPage`, `SettingsRoutes.network`, `SettingsBloc` network-mode state, and `SettingsRepository.networkMode` all stay — debug builds still expose the toggle, the default Mainnet mode stays active for everyone, and an internal dev can flip via a debug build when needed.
4 tasks
The "flat-value series still spreads lines via the 5% floor" test in `portfolio_chart_cubit_test.dart` constructs a `PortfolioChartCubit` and asserts on `horizontalLineValues` without calling `selectPeriod`. The cubit's default period is `TimePeriod.threeMonths`, which clips `visibleSpots` to a window anchored at `DateTime.now()`. The previous data points (`2026-01-01`, `2026-02-01`, `2026-03-01`) were inside that window when the test was written but fall outside as soon as the wall clock crosses three months past the last point — at which moment `visibleSpots` returns empty, `horizontalLineValues` returns empty, and the `hasLength(6)` assertion at line 76 fails on every PR run until someone notices. This first surfaced on 2026-06-02, the day after the test was still passing. Anchor the three data points to `DateTime.now()` (-60d, -30d, -1d) so they stay inside the three-month window regardless of when CI runs. The asserted line values are unchanged because the value math (10000 → average 100 → 5% floor 5 → nice-number interval 2 → bottom 94) doesn't depend on the timestamps.
…ard label The handbook copy refresh in 8a8b4d7 renamed the welcome-page Software-Wallet card title from 'Digitale Wallet (App)' to 'Software-Wallet (App)' (ARB key `softwareWallet`). Three Maestro flows still matched on the old label and failed at the first tap on the Software-Wallet card: - `.maestro/handbook/02-create-vs-restore.yaml` (the assertion target) - `.maestro/handbook/03-software-wallet-terms.yaml` (the tap on the Software-Wallet card to flip the welcome toggle to step 2) - `.maestro/handbook/25-restore-wallet.yaml` (same step + the doc comments at the top of the file) All three are retargeted at `.*Software-Wallet.*` and the two free-form comments in flow 25 are updated to reference the new card label so a future reader does not get pulled at the old name.
…638) Tier-3 handbook flow `25-restore-wallet.yaml` was getting stuck on WelcomePage step 1 after logout: the three `runFlow when: notVisible:` gates each silently evaluated false and the conditional taps never fired, leaving the flow to time out on the final `Wiederherstellungs- Wörter` wait. Root cause: the welcome page wraps both step-1 and step-2 card groups in a `Stack` + `AnimatedSlide` (`lib/screens/welcome/welcome_page.dart`), so the off-screen group stays in the widget tree at a translated offset. Maestro's semantic-tree `notVisible` probe treats those off-screen titles as visible, which means the regex text checks against card titles match off-screen widgets. After the `softwareWallet` / `bitbox` / `softwareWalletSubtitle` copy refresh in 8a8b4d7 the new step-1 subtitle ("Ich möchte eine neue Wallet erstellen ... wiederherstellen.") even contained substrings that overlapped the step-2 card-title regexes, which tipped the gate boundary in flows 02/03/25 entirely. Fix: wrap each `WelcomeCard` instance in `Semantics(identifier: …)` and retarget the four affected Maestro handbook flows (`02-create-vs-restore`, `03-software-wallet-terms`, `04-seed-hidden`, `25-restore-wallet`) at `tapOn: id:` / `visible: id:` / `notVisible: id:`. The ids (`welcome-software-wallet`, `welcome-bitbox`, `welcome-create-wallet`, `welcome-restore-wallet`, `welcome-debug-auth`) are stable across copy refreshes and animation half-states, and follow the same pattern as the existing `wallet-logout-confirm-checkbox` and `home-terms-link` Semantics ids. Closes #638.
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
Applies three product updates to the wallet-type selection (handbook §02), the software-wallet-terms screen (handbook §03), and the Settings page (handbook §12). The Step 1 / Step 2 onboarding architecture and the Network mode itself stay; only the user-facing surface changes.
§02 / §03 — wallet-type screen copy
Five strings on the wallet-type selection (handbook §02) and the software-wallet-terms screen (handbook §03) are rewritten per the latest product handbook copy. The two-step architecture (Step 1 = Software-Wallet vs BitBox, Step 2 = Create vs Restore vs Debug) is unchanged.
realunitWalletSubtitlesoftwareWalletsoftwareWalletSubtitlebitboxhardwareWalletSubtitleReuse confirmed: the
bitboxkey is only referenced inlib/screens/welcome/welcome_page.dart:92as the tile title — the BitBox-disconnected / reconnect strings use separate keys (bitboxDisconnectedTitle,bitboxDisconnectedDescription,bitboxReconnect). The rename does not bleed into other screens.docs/handbook/de/index.html§02 description rewritten to match the renamed tiles and the broader software-wallet scope. §03 prose is unchanged — the two-step architecture stays, and its screenshot picks up the new header subtitle automatically via the shared welcome-page golden.§12 — hide Network-mode row from production builds
The Settings → Network row (Mainnet/Testnet toggle) is a developer affordance — an end-user has no legitimate reason to switch networks, and an accidental tap drops them onto Testnet with broken liquidity and a forced reauth on every subsequent network round-trip.
The
SettingOptionthat opensSettingsNetworkPageis wrapped in aif (kDebugMode)collection-if, mirroring the existing pattern inlib/screens/welcome/welcome_page.dart:125(the Address + Signature debug entry).SettingsNetworkPage,SettingsRoutes.network,SettingsBlocnetwork-mode state,SettingsRepository.networkMode— all untouched. Default Mainnet stays active for everyone, debug builds still expose the toggle.Goldens
Three golden surfaces drift on this PR:
welcome/goldens/macos/welcome_page_ios.png(handbook §02)welcome/goldens/macos/welcome_page_second_step.png(handbook §03 — header subtitle pulls the new copy)settings/goldens/macos/settings_page_default.png(handbook §12 — Network row gone)Visual Regression will fail on this PR until the goldens are regenerated on the dfx01 self-hosted runner via the
golden-regenerate.yamlworkflow. Once regenerated and pushed, Visual Regression turns green and the handbook screenshots refresh automatically (the mapping inscripts/assemble-handbook-screenshots.shalready points at these three files).Out of scope
Bankenunabhängig. Sicher.→Sicher. Einfach. Bankenunabhängig.) — the claim is baked intoassets/images/splash/splash_background.png; needs a fresh asset from the designer before it can land.Test plan
dart run tool/generate_localization.dartregenerateslib/generated/i18n.dartwith the new strings (already committed).flutter analyzeclean on the touched files.welcome_page_ios.png,welcome_page_second_step.png, andsettings_page_default.pngshow the new copy / layout and the handbook screenshots pick them up.