Messaging · Stickers and GIFs: a sticker picker and a GIF picker

StickerPicker shows stickers a pack at a time, chosen above with a
segmented control; a search spans every pack and keeps the stickers
whose names hold it. Arrows move, Enter or a press picks. It reuses the
glyph grid, now forms::picks, which takes its columns and cell size and
titles from the host, so emoji, icons and stickers share one searchable
grid; forms::glyphs keeps the emoji and icon pickers.

GifPicker packs host GIFs in two columns, each moving, under a search
it owns; the host hears the trimmed words only when they change, and
categories fill the search while it is empty. Waiting, it shows tiles
in GIF shapes; finding nothing, it says so. Each GIF is a Tab stop that
a press, Enter or Space picks.

The share toggle now shows its state, as the microphone and camera do.
The gallery ships line-drawn stickers and small GIFs made from its own
pictures.
This commit is contained in:
ZacharyZhang-NY committed 2026-09-26 23:00:15 -04:00
1 parent dd465fedb7
commit 1700a72753
27 files changed
+1212 -288

No files matched your search

+16
View File
@@ -10,6 +10,7 @@ use jiff::{SignedDuration, Timestamp};
mod calls;
mod messages;
mod people;
mod pickers;
use super::Page;
use crate::{
@@ -61,6 +62,19 @@ const SCRIPT: &[Step] = &[
Step::UpAt("messaging-incoming", 24.0, 14.0),
Step::Wait(300),
Step::Shot("incoming-call"),
Step::Key("escape"),
Step::Wait(200),
Step::DownAt("messaging-stickers", 96.0, 105.0),
Step::UpAt("messaging-stickers", 96.0, 105.0),
Step::Wait(200),
Step::Shot("sticker-sent"),
Step::DownAt("messaging-gifs", 127.0, 48.0),
Step::UpAt("messaging-gifs", 127.0, 48.0),
Step::Wait(300),
Step::DownAt("messaging-gifs", 78.0, 120.0),
Step::UpAt("messaging-gifs", 78.0, 120.0),
Step::Wait(300),
Step::Shot("gif-sent"),
];
/// The demo's chats: which is open and what waits unread in each.
@@ -252,5 +266,7 @@ fn render(window: &mut Window, cx: &mut App) -> AnyElement {
.child(calls::grid(window, cx))
.child(calls::share(window, cx))
.child(calls::incoming(window, cx))
.child(pickers::stickers(window, cx))
.child(pickers::gifs(window, cx))
.into_any_element()
}