Profile sheet & themes, M3 variants, OLED, search, LaTeX, mobile UX #7

Merged
alex merged 1 commit from chat-enhancements into main 2026-05-19 08:04:16 -04:00
Owner

Specs:

  • MSC4133 extended profile fields (m.about, m.pronouns, m.color) with
    cross-client alias reads (Element, Extera, Commet, Sable, and MSC4440
    structured biography).
  • MSC4427 profile banner (m.banner_uri stable + chat.commet.profile_banner
    fallback for existing implementations).
  • MSC2191 inline LaTeX rendered in messages via flutter_math_fork; non-math
    segments still get emoji + linkify.

Features:

  • Bottom-sheet user profile with banner, avatar, about, pronouns, color
    accent, presence, and block/report/share row; replaces the centered
    user dialog.
  • Profile color themes the entire sheet via ColorScheme.fromSeed, so the
    whole card (background, buttons, text, accents) uses a palette derived
    from the user's chosen color.
  • Status dot overlay on the profile-sheet avatar (green for online and
    active, yellow for idle / unavailable, hidden for offline) replacing
    the "Currently active" text label.
  • Settings > Profile at /rooms/settings/profile: edit avatar, banner,
    displayname, about (256 chars), pronouns, color in one place.
  • Settings > Features at /rooms/settings/features: toggles for profile
    sheet, banners, rich previews, autoplay media, LaTeX, translation,
    and message pull direction (off / natural / all_rtl).
  • Material 3 theme style picker: DropdownMenu in chat customizations
    with eight curated dynamic scheme variants (tonal spot, vibrant,
    expressive, fidelity, neutral, monochrome, rainbow, fruit salad),
    each with a live preview swatch generated from the current seed.
  • "Use system colors" toggle wires the device's wallpaper-derived
    ColorScheme through (Android 12+ via dynamic_color).
  • OLED dark mode: pure-black surface family in dark mode, stepped
    near-black containers to preserve M3 elevation hierarchy.
  • Color picker dialog (HSV + hex) via flutter_colorpicker.
  • Image cropper (1:1 avatar, 3:1 banner) via crop_your_image.
  • Read-receipts row: avatar stack on own last message with overflow
    count; tap opens a Read-by sheet listing every reader.
  • Inline pronouns chip next to sender name in the message header.
  • Local relevance-scored room search (name, topic, alias, heroes,
    userId localpart). Works on E2EE rooms where server search is empty.
  • Chat export: current view / entire room / last N events, optionally
    with media (per-file and total size caps), as HTML / plain / JSON,
    zipped + shared.
  • Message translation: LibreTranslate (self-hostable), Google, DeepL,
    and a Custom endpoint with {{text}}/{{source}}/{{target}} templating
    and JSON-pointer response path.
  • GIF picker: masonry layout, newest-first, configurable column count
    (2/3/4), drag-to-dismiss bottom sheet.
  • Mobile swipe navigation (OverlappingPanelsShell) with full-screen
    drag, velocity fling, and snap; opt-in via setting.
  • Per-message pull gestures: reply at 40 px, edit at 80 px (own text),
    light/medium haptics, rubber-band cap at 120 px.
  • App lock "lock on cover" via proximity sensor (350 ms debounce).
  • Back-button unread badge counter mode (chats vs messages).
  • Emoji picker recents sorted by frequency * 2 + recency bonus.

Fixes:

  • Reactor list dialog now renders the actual image and shortcode label
    for custom emoji instead of dumping the raw mxc:// URL.
  • Reply preview width matches the bubble's natural width instead of
    forcing the bubble to maxWidth.
  • Read-receipt avatars hug the correct edge on own messages (right)
    and received (left), instead of left-aligning inside the 48 px tap
    area.
  • Live updates: theme variant, OLED, system-color, and color picks
    trigger MaterialApp rebuild via ThemeController so changes apply
    without a restart.
  • Context menus anchor at the press point in TwoColumnLayout.
  • MessagePullHandler is inert on search-jumped messages and re-enables
    after the highlight expires.
  • Image edits emit m.replace with m.new_content preserving msgtype,
    url, info, and filename (only body updates).
  • Strip Discord-style naming from identifiers, UI strings, and comments
    (discord_emoji_shortcodes -> emoji_shortcodes, discordHeaderTimestamp
    -> sectionHeaderTimestamp).

pubspec: added flutter_colorpicker, crop_your_image, proximity_sensor,
flutter_math_fork, flutter_staggered_grid_view.

Specs: - MSC4133 extended profile fields (m.about, m.pronouns, m.color) with cross-client alias reads (Element, Extera, Commet, Sable, and MSC4440 structured biography). - MSC4427 profile banner (m.banner_uri stable + chat.commet.profile_banner fallback for existing implementations). - MSC2191 inline LaTeX rendered in messages via flutter_math_fork; non-math segments still get emoji + linkify. Features: - Bottom-sheet user profile with banner, avatar, about, pronouns, color accent, presence, and block/report/share row; replaces the centered user dialog. - Profile color themes the entire sheet via ColorScheme.fromSeed, so the whole card (background, buttons, text, accents) uses a palette derived from the user's chosen color. - Status dot overlay on the profile-sheet avatar (green for online and active, yellow for idle / unavailable, hidden for offline) replacing the "Currently active" text label. - Settings > Profile at /rooms/settings/profile: edit avatar, banner, displayname, about (256 chars), pronouns, color in one place. - Settings > Features at /rooms/settings/features: toggles for profile sheet, banners, rich previews, autoplay media, LaTeX, translation, and message pull direction (off / natural / all_rtl). - Material 3 theme style picker: DropdownMenu in chat customizations with eight curated dynamic scheme variants (tonal spot, vibrant, expressive, fidelity, neutral, monochrome, rainbow, fruit salad), each with a live preview swatch generated from the current seed. - "Use system colors" toggle wires the device's wallpaper-derived ColorScheme through (Android 12+ via dynamic_color). - OLED dark mode: pure-black surface family in dark mode, stepped near-black containers to preserve M3 elevation hierarchy. - Color picker dialog (HSV + hex) via flutter_colorpicker. - Image cropper (1:1 avatar, 3:1 banner) via crop_your_image. - Read-receipts row: avatar stack on own last message with overflow count; tap opens a Read-by sheet listing every reader. - Inline pronouns chip next to sender name in the message header. - Local relevance-scored room search (name, topic, alias, heroes, userId localpart). Works on E2EE rooms where server search is empty. - Chat export: current view / entire room / last N events, optionally with media (per-file and total size caps), as HTML / plain / JSON, zipped + shared. - Message translation: LibreTranslate (self-hostable), Google, DeepL, and a Custom endpoint with {{text}}/{{source}}/{{target}} templating and JSON-pointer response path. - GIF picker: masonry layout, newest-first, configurable column count (2/3/4), drag-to-dismiss bottom sheet. - Mobile swipe navigation (OverlappingPanelsShell) with full-screen drag, velocity fling, and snap; opt-in via setting. - Per-message pull gestures: reply at 40 px, edit at 80 px (own text), light/medium haptics, rubber-band cap at 120 px. - App lock "lock on cover" via proximity sensor (350 ms debounce). - Back-button unread badge counter mode (chats vs messages). - Emoji picker recents sorted by frequency * 2 + recency bonus. Fixes: - Reactor list dialog now renders the actual image and shortcode label for custom emoji instead of dumping the raw mxc:// URL. - Reply preview width matches the bubble's natural width instead of forcing the bubble to maxWidth. - Read-receipt avatars hug the correct edge on own messages (right) and received (left), instead of left-aligning inside the 48 px tap area. - Live updates: theme variant, OLED, system-color, and color picks trigger MaterialApp rebuild via ThemeController so changes apply without a restart. - Context menus anchor at the press point in TwoColumnLayout. - MessagePullHandler is inert on search-jumped messages and re-enables after the highlight expires. - Image edits emit m.replace with m.new_content preserving msgtype, url, info, and filename (only body updates). - Strip Discord-style naming from identifiers, UI strings, and comments (discord_emoji_shortcodes -> emoji_shortcodes, discordHeaderTimestamp -> sectionHeaderTimestamp). pubspec: added flutter_colorpicker, crop_your_image, proximity_sensor, flutter_math_fork, flutter_staggered_grid_view.
Profile sheet & themes, M3 variants, OLED, search, LaTeX, mobile UX
Some checks failed
Pull Request Workflow / code_tests (pull_request) Failing after 1m25s
Pull Request Workflow / build_debug_apk (pull_request) Has been skipped
Pull Request Workflow / build_debug_web (pull_request) Has been skipped
Pull Request Workflow / build_debug_linux (pull_request) Has been skipped
e81c3ec90b
Specs:
- MSC4133 extended profile fields (m.about, m.pronouns, m.color) with
  cross-client alias reads (Element, Extera, Commet, Sable, and MSC4440
  structured biography).
- MSC4427 profile banner (m.banner_uri stable + chat.commet.profile_banner
  fallback for existing implementations).
- MSC2191 inline LaTeX rendered in messages via flutter_math_fork; non-math
  segments still get emoji + linkify.

Features:
- Bottom-sheet user profile with banner, avatar, about, pronouns, color
  accent, presence, and block/report/share row; replaces the centered
  user dialog.
- Profile color themes the entire sheet via ColorScheme.fromSeed, so the
  whole card (background, buttons, text, accents) uses a palette derived
  from the user's chosen color.
- Status dot overlay on the profile-sheet avatar (green for online and
  active, yellow for idle / unavailable, hidden for offline) replacing
  the "Currently active" text label.
- Settings > Profile at /rooms/settings/profile: edit avatar, banner,
  displayname, about (256 chars), pronouns, color in one place.
- Settings > Features at /rooms/settings/features: toggles for profile
  sheet, banners, rich previews, autoplay media, LaTeX, translation,
  and message pull direction (off / natural / all_rtl).
- Material 3 theme style picker: DropdownMenu in chat customizations
  with eight curated dynamic scheme variants (tonal spot, vibrant,
  expressive, fidelity, neutral, monochrome, rainbow, fruit salad),
  each with a live preview swatch generated from the current seed.
- "Use system colors" toggle wires the device's wallpaper-derived
  ColorScheme through (Android 12+ via dynamic_color).
- OLED dark mode: pure-black surface family in dark mode, stepped
  near-black containers to preserve M3 elevation hierarchy.
- Color picker dialog (HSV + hex) via flutter_colorpicker.
- Image cropper (1:1 avatar, 3:1 banner) via crop_your_image.
- Read-receipts row: avatar stack on own last message with overflow
  count; tap opens a Read-by sheet listing every reader.
- Inline pronouns chip next to sender name in the message header.
- Local relevance-scored room search (name, topic, alias, heroes,
  userId localpart). Works on E2EE rooms where server search is empty.
- Chat export: current view / entire room / last N events, optionally
  with media (per-file and total size caps), as HTML / plain / JSON,
  zipped + shared.
- Message translation: LibreTranslate (self-hostable), Google, DeepL,
  and a Custom endpoint with {{text}}/{{source}}/{{target}} templating
  and JSON-pointer response path.
- GIF picker: masonry layout, newest-first, configurable column count
  (2/3/4), drag-to-dismiss bottom sheet.
- Mobile swipe navigation (OverlappingPanelsShell) with full-screen
  drag, velocity fling, and snap; opt-in via setting.
- Per-message pull gestures: reply at 40 px, edit at 80 px (own text),
  light/medium haptics, rubber-band cap at 120 px.
- App lock "lock on cover" via proximity sensor (350 ms debounce).
- Back-button unread badge counter mode (chats vs messages).
- Emoji picker recents sorted by frequency * 2 + recency bonus.

Fixes:
- Reactor list dialog now renders the actual image and shortcode label
  for custom emoji instead of dumping the raw mxc:// URL.
- Reply preview width matches the bubble's natural width instead of
  forcing the bubble to maxWidth.
- Read-receipt avatars hug the correct edge on own messages (right)
  and received (left), instead of left-aligning inside the 48 px tap
  area.
- Live updates: theme variant, OLED, system-color, and color picks
  trigger MaterialApp rebuild via ThemeController so changes apply
  without a restart.
- Context menus anchor at the press point in TwoColumnLayout.
- MessagePullHandler is inert on search-jumped messages and re-enables
  after the highlight expires.
- Image edits emit m.replace with m.new_content preserving msgtype,
  url, info, and filename (only body updates).
- Strip Discord-style naming from identifiers, UI strings, and comments
  (discord_emoji_shortcodes -> emoji_shortcodes, discordHeaderTimestamp
  -> sectionHeaderTimestamp).

pubspec: added flutter_colorpicker, crop_your_image, proximity_sensor,
flutter_math_fork, flutter_staggered_grid_view.
alex merged commit 9543e60dff into main 2026-05-19 08:04:16 -04:00
alex deleted branch chat-enhancements 2026-05-19 08:04:16 -04:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
alex/Mochi!7
No description provided.