feat(chat): message-list rework, customization surface, smooth scroll

Chat tab overhaul:
- Header/layout: single-row header (name + key-lock + compact click-to-copy address +
  right-aligned icon toolbar with a settings "notch"), composer moved below the message
  box (emoji toggle left of a bottom-flush input), tightened list-pane controls.
- Message list: per-day date separators (Today/Yesterday/date), time-only group headers,
  tight same-sender grouping with iMessage-style merged corners, per-run peer avatar,
  delivery status (clock -> check), hover-reveal per-message time. Message base ~18px.
- Customization: a settings "notch" gear opens a modal (also under Settings ->
  Chat & Contacts) with segmented controls for emoji style / bubble style / density /
  timestamps, sliders for poll rate + text size, a bubble-accent dropdown, Enter-to-send.
  Bubble style/accent/density/text-size/timestamps all applied live in the message loop.
- Settings: app-wide clock-format control lives in Settings -> General; chat keeps a
  per-tab override. Both chat panes now use the app's smooth wheel-scroll.
- i18n: new strings across all 8 languages; CJK subset rebuilt for the added glyphs.

Inline contact rename, hide/mute, 0-conf fast-scan and the export path are carried through.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-17 18:45:19 -05:00
parent 3b5db02e09
commit 2c909d35ea
13 changed files with 1060 additions and 212 deletions

View File

@@ -217,11 +217,11 @@ void I18n::loadBuiltinEnglish()
strings_["chat_you"] = "You";
strings_["chat_contact_request"] = "contact request";
strings_["chat_send_failed"] = "not sent";
strings_["chat_new_button"] = "New conversation";
strings_["chat_new_button"] = "New chat";
strings_["chat_select_hint"] = "Select a conversation to view it.";
strings_["chat_waiting_reply"] = "Waiting for this contact to reply — you can message them once they do.";
strings_["chat_send"] = "Send";
strings_["chat_new_title"] = "New conversation";
strings_["chat_new_title"] = "New chat";
strings_["chat_new_zaddr"] = "Recipient z-address";
strings_["chat_new_message"] = "Message";
strings_["chat_new_send"] = "Send request";
@@ -263,6 +263,44 @@ void I18n::loadBuiltinEnglish()
strings_["chat_copy_address_tip"] = "Click to copy address";
strings_["chat_verify_key"] = "Identity key \xE2\x80\x94 compare to verify";
strings_["chat_awaiting_key"] = "Waiting for reply";
strings_["chat_rename"] = "Rename contact";
strings_["chat_rename_hint"] = "Contact name";
strings_["chat_renamed"] = "Contact renamed";
// Chat customization (gear modal + Settings → Chat & Contacts)
strings_["chat_settings_title"] = "Chat settings";
strings_["chat_settings_tip"] = "Chat customization";
strings_["chat_settings_section"] = "CHAT & CONTACTS";
strings_["chat_opt_emoji"] = "Emoji style";
strings_["chat_emoji_mono"] = "Monochrome";
strings_["chat_emoji_color"] = "Color";
strings_["chat_opt_poll"] = "Message poll rate";
strings_["chat_opt_bubble_style"] = "Bubble style";
strings_["chat_bubble_rounded"] = "Rounded";
strings_["chat_bubble_square"] = "Square";
strings_["chat_bubble_minimal"] = "Minimal";
strings_["chat_opt_bubble_accent"] = "Bubble color";
strings_["chat_accent_theme"] = "Theme";
strings_["chat_accent_blue"] = "Blue";
strings_["chat_accent_green"] = "Green";
strings_["chat_accent_purple"] = "Purple";
strings_["chat_accent_amber"] = "Amber";
strings_["chat_accent_pink"] = "Pink";
strings_["chat_opt_density"] = "Message density";
strings_["chat_density_comfortable"] = "Comfortable";
strings_["chat_density_compact"] = "Compact";
strings_["chat_opt_font_size"] = "Text size";
strings_["chat_opt_timestamp"] = "Timestamps";
strings_["chat_ts_global"] = "Follow global";
strings_["chat_ts_24h"] = "24-hour";
strings_["chat_ts_12h"] = "12-hour";
strings_["chat_opt_enter_sends"] = "Enter sends message";
strings_["chat_opt_global_clock"] = "Global clock format";
strings_["chat_settings_done"] = "Done";
strings_["chat_ts_global_short"] = "Global";
strings_["chat_sec_appearance"] = "APPEARANCE";
strings_["chat_sec_messaging"] = "MESSAGING";
strings_["chat_today"] = "Today";
strings_["chat_yesterday"] = "Yesterday";
// Seed-phrase backup (full-node)
strings_["seed_backup_button"] = "Seed phrase";
strings_["tt_seed_backup"] = "Show and back up your wallet's 24-word recovery seed phrase";
@@ -1148,6 +1186,8 @@ void I18n::loadBuiltinEnglish()
strings_["network"] = "Network";
strings_["theme"] = "Theme";
strings_["language"] = "Language";
strings_["clock_format"] = "Clock format";
strings_["tt_clock_format"] = "24-hour or 12-hour clock, used across the app. The Chat tab can override it in its own settings.";
strings_["dragonx_green"] = "DragonX (Green)";
strings_["dark"] = "Dark";
strings_["light"] = "Light";