Skip to content

feat(ui): apply handbook §02 / §03 / §12 product copy + visibility updates#635

Merged
TaprootFreak merged 6 commits into
stagingfrom
feat/dani-handbook-text-changes-tranche-a
Jun 2, 2026
Merged

feat(ui): apply handbook §02 / §03 / §12 product copy + visibility updates#635
TaprootFreak merged 6 commits into
stagingfrom
feat/dani-handbook-text-changes-tranche-a

Conversation

@TaprootFreak
Copy link
Copy Markdown
Contributor

@TaprootFreak TaprootFreak commented Jun 2, 2026

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.

ARB key Old (DE / EN) New (DE / EN)
realunitWalletSubtitle Verwalten Sie Ihre RealUnit Token kostenfrei und bankenunabhängig. / Manage your RealUnit tokens free of charge and independently of banks. Kaufen und verwalten Sie RealUnit Aktientoken kostenfrei und bankenunabhängig. / Buy and manage RealUnit stock tokens free of charge and independently of banks.
softwareWallet Digitale Wallet (App) / Software Wallet Software-Wallet (App) / Software Wallet (App)
softwareWalletSubtitle Ich möchte eine neue Wallet für den Handel und die Aufbewahrung der RealUnit Token erstellen. / I would like to create a new wallet for trading and storing RealUnit tokens. Ich möchte eine neue Wallet erstellen oder meine bestehende Wallet (z.B. Aktionariat) wiederherstellen. / I want to create a new wallet or restore my existing wallet (e.g. Aktionariat).
bitbox BitBox / BitBox BitBox Hardware-Wallet / BitBox Hardware Wallet
hardwareWalletSubtitle Verwahren Sie Ihre RealUnit Aktientoken auf diesem separaten, physischen Gerät (einer "Hardware Wallet") aus der Schweiz. / Store your RealUnit stock tokens on this separate, physical device (a "hardware wallet") from Switzerland. Ich besitze eine Bitbox02 Nova und möchte RealUnit Token darauf verwahren. / I own a Bitbox02 Nova and want to store RealUnit tokens on it.

Reuse confirmed: the bitbox key is only referenced in lib/screens/welcome/welcome_page.dart:92 as 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 SettingOption that opens SettingsNetworkPage is wrapped in a if (kDebugMode) collection-if, mirroring the existing pattern in lib/screens/welcome/welcome_page.dart:125 (the Address + Signature debug entry). SettingsNetworkPage, SettingsRoutes.network, SettingsBloc network-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.yaml workflow. Once regenerated and pushed, Visual Regression turns green and the handbook screenshots refresh automatically (the mapping in scripts/assemble-handbook-screenshots.sh already points at these three files).

Out of scope

  • §01 (welcome splash claim Bankenunabhängig. Sicher.Sicher. Einfach. Bankenunabhängig.) — the claim is baked into assets/images/splash/splash_background.png; needs a fresh asset from the designer before it can land.

Test plan

  • dart run tool/generate_localization.dart regenerates lib/generated/i18n.dart with the new strings (already committed).
  • flutter analyze clean on the touched files.
  • Visual Regression: after golden regeneration, welcome_page_ios.png, welcome_page_second_step.png, and settings_page_default.png show the new copy / layout and the handbook screenshots pick them up.
  • Production build of the Settings page no longer lists the Network row; debug build still does.

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.
@TaprootFreak TaprootFreak changed the title feat(i18n): refresh wallet-type screen copy (handbook §02 / §03) feat(ui): apply handbook §02 / §03 / §12 product copy + visibility updates Jun 2, 2026
@TaprootFreak TaprootFreak marked this pull request as ready for review June 2, 2026 00:19
@TaprootFreak TaprootFreak marked this pull request as draft June 2, 2026 00:25
@TaprootFreak TaprootFreak marked this pull request as ready for review June 2, 2026 00:25
@TaprootFreak TaprootFreak added the tier3:full Opt-in: run Tier 3 Maestro handbook flows on this PR label Jun 2, 2026
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.
@TaprootFreak TaprootFreak merged commit 8632d90 into staging Jun 2, 2026
6 checks passed
@TaprootFreak TaprootFreak deleted the feat/dani-handbook-text-changes-tranche-a branch June 2, 2026 08:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

tier3:full Opt-in: run Tier 3 Maestro handbook flows on this PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant