Skip to content

Mobile custom emoji + settings redesign#906

Merged
wesbillman merged 9 commits into
mainfrom
brain/mobile-custom-emoji
Jun 8, 2026
Merged

Mobile custom emoji + settings redesign#906
wesbillman merged 9 commits into
mainfrom
brain/mobile-custom-emoji

Conversation

@wesbillman

Copy link
Copy Markdown
Collaborator

Summary

Adds custom emoji support to the Sprout mobile app and gives the mobile Settings screen a Slack-inspired redesign built on new reusable list components.

Custom emoji (mobile)

  • NIP-30 custom emoji foundation: palette, render, and tag handling.
  • Custom emoji render across mobile UI surfaces (messages, reactions, status).
  • Custom emoji management/upload is web-only — the add-emoji UI was removed from mobile (per product decision); mobile renders and reacts only.

Settings redesign (Slack-inspired)

  • New reusable widgets in lib/shared/widgets/app_list.dart:
    • AppListRow — flush, borderless row (icon column + title/subtitle/trailing, consistent padding, tap ripple).
    • AppListRowRaw — same shape with a custom leading widget (emoji/avatar).
    • AppListSection — groups rows separated by hairline dividers with a quiet muted label, instead of heavy section titles.
  • Settings rebuilt on these primitives: flush rows, hairline-divided groups, no cards/borders.
  • Connection + Identity moved below Status/Appearance.
  • Version pinned as a footer at the bottom of the screen (respects safe area).
  • Remove Workspace is a centered borderless destructive button.

Testing

  • flutter analyze clean across all of mobile.
  • Pre-push hook green: rust clippy + tests, desktop tests, mobile tests.
  • Verified visually in the iOS Simulator (iPhone 17 Pro) across several iterations.

Follow-ups (not in this PR)

  • Migrate the other screens (channels list, members, search, forum, message actions) onto AppListRow/AppListSection.
  • Live custom-emoji formatting in the message text input.

wesbillman and others added 9 commits June 8, 2026 09:45
Port the desktop custom-emoji data model to the Flutter mobile app: the
NIP-30 per-user kind:30030 set, unioned client-side into one workspace
palette (one entry per shortcode, smallest-URL tiebreak), the riverpod
palette provider with read-modify-write of the caller's own set, the
pure tag-building/normalization helpers, and a gpt_markdown inline
component plus standalone image widget for rendering `:shortcode:` glyphs.

This is the shared foundation; UI surfaces (picker, composer, reactions,
status, settings) consume the provider + render component.

Co-authored-by: Brain <21994759fc7a6fa6b965551d35cfd7897d262f2495467f2d78694ddcfa6a5c7e@sprout-oss.stage.blox.sqprod.co>
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
Add a Custom Emoji section to settings: a dedicated management page to
upload an image, name it with a `:shortcode:`, and publish it to the
signing user's own NIP-30 kind:30030 set, plus list and remove their own
emoji. Reuses the existing Blossom media-upload path and the shared
custom-emoji palette provider; the workspace palette and render/composer
surfaces are unchanged.

Also folds in the Status-section custom-emoji render (Pinky's hunk) since
it shares this file.

Co-authored-by: Brain <21994759fc7a6fa6b965551d35cfd7897d262f2495467f2d78694ddcfa6a5c7e@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co>
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
- render custom emoji in messages, previews, search, activity, profile, status, forum, and pulse surfaces
- attach NIP-30 emoji tags when sending messages, edits, reactions, forum posts, and pulse notes
- expose custom emoji in the picker and render custom reaction pills
- cover inline render tags, edit tags, and reaction image URLs in focused tests

Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co>
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
Custom emoji can be rendered and reacted with, but the mobile app no
longer manages (uploads/names) custom emoji — that lives on web for now.
Drops the settings page, the own-set read/write provider methods, and the
filename-shortcode helper, with their tests.

Co-authored-by: Brain <21994759fc7a6fa6b965551d35cfd7897d262f2495467f2d78694ddcfa6a5c7e@sprout-oss.stage.blox.sqprod.co>
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
Move the Connection and Identity section to the bottom of the
Settings screen, below Status and Appearance, and drop the card
borders around the Connection, Identity, and Status list tiles so
they render flush like the Appearance rows.

Co-authored-by: Brain <21994759fc7a6fa6b965551d35cfd7897d262f2495467f2d78694ddcfa6a5c7e@sprout-oss.stage.blox.sqprod.co>
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
Add a top gap so the first section clears the frosted app bar, and
give all section headers one consistent grouped-settings style via a
shared _SectionHeader (muted, uppercase, semibold) instead of the
mixed titleMedium/titleSmall page-title sizing.

Co-authored-by: Brain <21994759fc7a6fa6b965551d35cfd7897d262f2495467f2d78694ddcfa6a5c7e@sprout-oss.stage.blox.sqprod.co>
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
Introduce AppListRow / AppListRowRaw / AppListSection in
shared/widgets for a flush, Slack-style list look: borderless rows
with a consistent icon column and generous padding, groups separated
by hairline dividers instead of heavy section titles. Rebuild the
Settings screen on these primitives so the styling is reusable across
other screens in a follow-up.

Co-authored-by: Brain <21994759fc7a6fa6b965551d35cfd7897d262f2495467f2d78694ddcfa6a5c7e@sprout-oss.stage.blox.sqprod.co>
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
…tton

Mute the Accent Color sub-label so it reads below the Appearance rows,
top-align row icons with the title on multi-line rows, and turn the
Remove Workspace outlined button into a flush destructive row so it
matches the rest of the Slack-style list.

Co-authored-by: Brain <21994759fc7a6fa6b965551d35cfd7897d262f2495467f2d78694ddcfa6a5c7e@sprout-oss.stage.blox.sqprod.co>
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
Move the version label out of the scroll view into a pinned footer at
the bottom of the Settings screen (respecting the safe area), and
center the Remove Workspace action as a borderless destructive button.

Co-authored-by: Brain <21994759fc7a6fa6b965551d35cfd7897d262f2495467f2d78694ddcfa6a5c7e@sprout-oss.stage.blox.sqprod.co>
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
@wesbillman wesbillman requested a review from a team as a code owner June 8, 2026 17:14
@wesbillman wesbillman changed the title Mobile custom emoji + Slack-inspired settings redesign Mobile custom emoji + settings redesign Jun 8, 2026
@wesbillman wesbillman merged commit 10b6674 into main Jun 8, 2026
15 checks passed
@wesbillman wesbillman deleted the brain/mobile-custom-emoji branch June 8, 2026 17:28
tlongwell-block pushed a commit that referenced this pull request Jun 9, 2026
* origin/main: (32 commits)
  docs: add NIP-ER event reminders (#875)
  feat(acp): pass slash commands through to ACP connectors (#919)
  fix(sdk): resolve multi-word display names and add NIP-27 nostr:npub mention extraction (#905)
  fix(desktop): re-enable mcp_command reconciliation and harden spawn site (#909)
  Fix desktop DM and sidebar UI polish (#908)
  Animate reaction counts (#904)
  Mobile custom emoji + settings redesign (#906)
  Renew TTL when unarchiving ephemeral channels (#902)
  chore(release): release version 0.3.13 (#903)
  Collapse channel header actions (#901)
  sprout-agent: make Databricks defaults env-only (#868)
  Restyle settings sections (#894)
  Add emoji reaction particles (#890)
  Move settings into the app shell (#893)
  Tune chat text sizing (#891)
  Style channel header navigation (#889)
  fix: rename missed known_acp_provider_exact → known_acp_runtime_exact (#900)
  chore(deps): update radix-ui-primitives monorepo (#898)
  chore(deps): update actions/checkout digest to df4cb1c (#897)
  refactor: rename ACP "provider" to "runtime" across the codebase (#783)
  ...

# Conflicts:
#	desktop/src/features/agents/ui/CreateAgentDialog.tsx
tlongwell-block pushed a commit that referenced this pull request Jun 9, 2026
* origin/main: (32 commits)
  docs: add NIP-ER event reminders (#875)
  feat(acp): pass slash commands through to ACP connectors (#919)
  fix(sdk): resolve multi-word display names and add NIP-27 nostr:npub mention extraction (#905)
  fix(desktop): re-enable mcp_command reconciliation and harden spawn site (#909)
  Fix desktop DM and sidebar UI polish (#908)
  Animate reaction counts (#904)
  Mobile custom emoji + settings redesign (#906)
  Renew TTL when unarchiving ephemeral channels (#902)
  chore(release): release version 0.3.13 (#903)
  Collapse channel header actions (#901)
  sprout-agent: make Databricks defaults env-only (#868)
  Restyle settings sections (#894)
  Add emoji reaction particles (#890)
  Move settings into the app shell (#893)
  Tune chat text sizing (#891)
  Style channel header navigation (#889)
  fix: rename missed known_acp_provider_exact → known_acp_runtime_exact (#900)
  chore(deps): update radix-ui-primitives monorepo (#898)
  chore(deps): update actions/checkout digest to df4cb1c (#897)
  refactor: rename ACP "provider" to "runtime" across the codebase (#783)
  ...

Signed-off-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co>

# Conflicts:
#	desktop/src/features/agents/ui/CreateAgentDialog.tsx
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant