EmojiPicker.tsx has no arrow-key navigation and Enter doesn't pick the top result; there's no skin-tone selector. (Search autofocus, the side rail, recents and hover preview already exist.)
Fix: arrow keys move through the grid, Enter picks; a skin-tone selector remembered in prefs.
Part of the v1.0 UI pass.
`EmojiPicker.tsx` has no arrow-key navigation and Enter doesn't pick the top result; there's no skin-tone selector. (Search autofocus, the side rail, recents and hover preview already exist.)
**Fix:** arrow keys move through the grid, Enter picks; a skin-tone selector remembered in prefs.
_Part of the v1.0 UI pass._
Salastil
added this to the v1.0 milestone 2026-10-07 20:43:20 -04:00
The emoji picker is now usable without the mouse, and the hands come in your skin tone.
Arrow keys walk the grid while the search box keeps the focus (so typing never stops): ↓/↑ go to the nearest cell in the row below/above across the differently-sized sections, ←/→ go cell to cell once one is marked (until then they still move the caret), ↑ off the top gives control back to the box. At the end of the built rows it scrolls a little so more build. The marked cell is outlined and named in the footer.
Enter picks the marked cell, or the top result when none is marked.
Skin tone: a hand button at the end of the search row opens the six tones; the choice is kept in prefs (emoji.skinTone, shared by every window) and applies to the hands in the grid, to what gets picked and recorded in Recent, and to :shortcode completion. Added 👋🙌👌✌️ to the curated set so the choice has something to act on.
Tests: skintone.test.ts; behaviour checked against the running app (search + Enter picks 🔥; walk down/right/down/up; ↑ off the top clears; ← still moves the caret; Dark tone picks 👍 as U+1F44D U+1F3FF and survives reopening).
Before (top), after (bottom, arrows walked, tone menu open):
Finished: [99fd0d3](https://git.salastil.com/Salastil/moho/commit/99fd0d350f78156433cf9958a58fbf6663adcf08).
The emoji picker is now usable without the mouse, and the hands come in your skin tone.
- **Arrow keys** walk the grid while the search box keeps the focus (so typing never stops): ↓/↑ go to the nearest cell in the row below/above across the differently-sized sections, ←/→ go cell to cell once one is marked (until then they still move the caret), ↑ off the top gives control back to the box. At the end of the built rows it scrolls a little so more build. The marked cell is outlined and named in the footer.
- **Enter** picks the marked cell, or the **top result** when none is marked.
- **Skin tone:** a hand button at the end of the search row opens the six tones; the choice is kept in prefs (`emoji.skinTone`, shared by every window) and applies to the hands in the grid, to what gets picked and recorded in Recent, and to `:shortcode` completion. Added 👋 🙌 👌 ✌️ to the curated set so the choice has something to act on.
- Tests: `skintone.test.ts`; behaviour checked against the running app (search + Enter picks 🔥; walk down/right/down/up; ↑ off the top clears; ← still moves the caret; Dark tone picks 👍 as U+1F44D U+1F3FF and survives reopening).
Before (top), after (bottom, arrows walked, tone menu open):

Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
EmojiPicker.tsxhas no arrow-key navigation and Enter doesn't pick the top result; there's no skin-tone selector. (Search autofocus, the side rail, recents and hover preview already exist.)Fix: arrow keys move through the grid, Enter picks; a skin-tone selector remembered in prefs.
Part of the v1.0 UI pass.
Finished: 99fd0d3.
The emoji picker is now usable without the mouse, and the hands come in your skin tone.
emoji.skinTone, shared by every window) and applies to the hands in the grid, to what gets picked and recorded in Recent, and to:shortcodecompletion. Added 👋 🙌 👌 ✌️ to the curated set so the choice has something to act on.skintone.test.ts; behaviour checked against the running app (search + Enter picks 🔥; walk down/right/down/up; ↑ off the top clears; ← still moves the caret; Dark tone picks 👍 as U+1F44D U+1F3FF and survives reopening).Before (top), after (bottom, arrows walked, tone menu open):