feat(ui): implement UI/UX audit — i18n, HiDPI, theme, destructive-action & overflow fixes

Implements all 26 confirmed UI/UX audit findings plus the 4 dashboard/timeline
tile labels. Verified across full-node + Lite + Windows builds (ctest green) and
an adversarial diff review (one market-tab delete regression caught + fixed).

i18n coverage:
- Balance hero/quick-actions/toasts + dashboard & timeline tiles (Total Balance,
  Shielded, Transparent, Quick Send, Quick Receive, Click to open, Market)
- Send: Review Send / Cancel / Paste / view-only tooltip / memo byte counter
- Settings: Lite lifecycle errors, plaintext-RPC security warning, 8 toasts
- Mining pool-payout tooltip
- Resolve daemon_update_title double-assignment collision (new daemon_update_prompt_title)
- 23 new keys translated into all 8 locales; CJK subset font rebuilt

HiDPI: DPI-scale the Send amount bar, mining thread-tile clamp bounds, receive
loading skeleton, and sidebar notification-badge insets.

Light theme: theme-aware material::SurfaceOverlay() for balance bar tracks and
row-hover highlights; contacts active-pill foreground uses OnPrimary().

Destructive actions: arm/confirm for portfolio-group delete, saved pool/worker
remove, and avatar-image delete.

Interaction/overflow: route balance star/eye buttons and the console fold-toggle
through popup-safe guards; clip peer addr/subver; truncate the balance custom
label; measure Settings tool-button widths; mining stepper disabled-state
feedback; +/- stepper buttons restyled to match the thread tiles.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-18 17:54:15 -05:00
parent 0de44569b7
commit e24ca015d1
24 changed files with 599 additions and 148 deletions

View File

@@ -823,7 +823,7 @@ void I18n::loadBuiltinEnglish()
strings_["confirm_reinstall_daemon_title"] = "Install Bundled Daemon";
strings_["confirm_reinstall_daemon_msg"] = "This stops the daemon, overwrites the installed dragonxd (and dragonx-cli/dragonx-tx) with the versions bundled in this wallet build, then restarts the node. Use this to recover or update the node binary.";
strings_["confirm_reinstall_daemon_safe"] = "Your wallet, keys and blockchain data are not touched — only the daemon program files are replaced.";
strings_["daemon_update_title"] = "Update the node daemon?";
strings_["daemon_update_prompt_title"] = "Update the node daemon?";
strings_["daemon_update_body"] = "This wallet build bundles a newer DragonX node than the one currently installed. Updating replaces the installed dragonxd (and dragonx-cli/dragonx-tx), then stops and restarts the node so the new version takes effect. Recommended — a newer node can add features (e.g. seed-phrase support) the old one lacks.";
strings_["daemon_update_safe"] = "Your wallet, keys and blockchain data are not touched — only the daemon program files are replaced. If you deliberately run a custom node, choose Keep current.";
strings_["daemon_update_now"] = "Update now";
@@ -855,6 +855,10 @@ void I18n::loadBuiltinEnglish()
strings_["lite_passphrase_label"] = "Passphrase";
strings_["lite_validate"] = "Validate";
strings_["lite_working"] = "Working…";
strings_["lite_enter_wallet_path"] = "Enter a wallet path";
strings_["lite_enter_all_seed_words"] = "Enter all 24 seed words to restore (got %d)";
strings_["lite_could_not_start"] = "Could not start the operation";
strings_["lite_backend_unavailable"] = "Lite wallet backend unavailable";
strings_["lite_wallet_ready"] = "Wallet ready";
strings_["lite_backup_keys"] = "Backup & keys";
strings_["lite_show_seed"] = "Show seed";
@@ -1101,6 +1105,14 @@ void I18n::loadBuiltinEnglish()
strings_["balance_history_collecting"] = "Balance history — collecting data...";
strings_["balance_shielded_fmt"] = "Shielded: %.8f";
strings_["balance_transparent_fmt"] = "Transparent: %.8f";
strings_["total_balance_label"] = "Total Balance";
strings_["balance_syncing_pct"] = "Syncing %.1f%%";
strings_["balance_mining_rate"] = "Mining %s";
strings_["balance_layout_switched"] = "Layout: %s";
strings_["byte_count_fmt"] = "%zu / %zu bytes";
strings_["quick_send"] = "Quick Send";
strings_["quick_receive"] = "Quick Receive";
strings_["tile_click_to_open"] = "Click to open";
strings_["your_addresses"] = "Your Addresses";
strings_["z_addresses"] = "Z-Addresses";
strings_["t_addresses"] = "T-Addresses";
@@ -1428,9 +1440,18 @@ void I18n::loadBuiltinEnglish()
strings_["loading_stall_body"] = "The daemon has been initializing for %.0fs. This can be normal after an update or on first launch (loading the block index or rescanning) — it will connect automatically once ready.";
strings_["loading_stall_hint"] = "Still stuck? Open Settings and use Restart Daemon, or check the Console for details.";
strings_["sb_plaintext_remote_blocked"] = "Refusing to send RPC credentials over plaintext to a remote host. Add rpcallowplaintext=1 to DRAGONX.conf to allow it, or enable TLS with rpctls=1.";
strings_["rpc_plaintext_remote_warning"] = "Remote RPC is using plaintext HTTP. Add rpctls=1 to DRAGONX.conf if your daemon supports TLS.";
strings_["settings_open_log_folder"] = "Open log folder";
strings_["settings_copy_diagnostics"] = "Copy diagnostics";
strings_["settings_diagnostics_copied"] = "Diagnostics copied to clipboard";
strings_["settings_rpc_ok"] = "RPC connection OK";
strings_["settings_rpc_error_prefix"] = "RPC error: ";
strings_["settings_not_connected"] = "Not connected to daemon";
strings_["settings_theme_refreshed"] = "Theme list refreshed";
strings_["settings_saved"] = "Settings saved";
strings_["settings_reloaded"] = "Settings reloaded from disk";
strings_["settings_ztx_cleared"] = "Z-transaction history cleared";
strings_["settings_ztx_not_found"] = "No history file found";
strings_["tt_open_log_folder"] = "Open the folder containing the debug and crash logs";
strings_["tt_copy_diagnostics"] = "Copy a support snapshot (version, daemon/wallet/log state — no secrets) to the clipboard";
strings_["sb_dragonxd_running"] = "dragonxd running";
@@ -1886,6 +1907,7 @@ void I18n::loadBuiltinEnglish()
strings_["mining_payout_invalid"] = "Not a valid DragonX address — fix it before starting, or mining rewards are lost.";
strings_["mining_est_daily_pool_sub"] = "rough solo-equivalent, before pool fee";
strings_["mining_generate_z_address_hint"] = "Generate a Z address in the Receive tab to use as your payout address";
strings_["mining_pool_needs_payout_tooltip"] = "Enter a payout address first (generate a Z address)";
strings_["mining_pool"] = "Pool";
strings_["mining_payout_foreign"] = "⚠ This payout address isn't in your current wallet — mined rewards would go to a different wallet. Update it if you switched wallets.";
strings_["mining_pool_hashrate"] = "Pool Hashrate";
@@ -2155,6 +2177,7 @@ void I18n::loadBuiltinEnglish()
strings_["send_tooltip_not_connected"] = "Not connected to daemon";
strings_["send_tooltip_select_source"] = "Select a source address first";
strings_["send_tooltip_syncing"] = "Wait for blockchain to sync";
strings_["send_tooltip_view_only"] = "View-only address — no spending key, cannot send";
strings_["send_total"] = "Total";
strings_["send_tx_failed"] = "Transaction failed";
strings_["send_tx_sent"] = "Transaction sent!";