composed · Composed pattern
EmojiPicker
@devalok/shilp-sutra/composed/emoji-pickerView in Storybook Hand-curated previews ship in rolling waves. See it live in Storybook →
Reference
Exports
EmojiPicker, EmojiPickerPopover
Props
EmojiPicker
onSelect: (emoji: EmojiData) => void
theme: "auto" | "light" | "dark"
previewPosition: "top" | "bottom" | "none"
skinTonePosition: "search" | "preview" | "none"
className: string
EmojiPickerPopover (extends EmojiPicker props)
children: ReactNode (trigger element)
align: "start" | "center" | "end"
EmojiData
id: string
native: string (the emoji character)
shortcodes: string
Defaults
theme="auto", previewPosition="none", skinTonePosition="search", align="start"
Example
<EmojiPickerPopover onSelect={(emoji) => insertEmoji(emoji.native)}>
<Button variant="ghost" size="icon-sm">😀</Button>
</EmojiPickerPopover>
<EmojiPicker onSelect={handleEmoji} theme="dark" />
Composability
- Two exports:
EmojiPicker(inline grid, no trigger) andEmojiPickerPopover(trigger + popover wrapper). Use EmojiPickerPopover 95% of the time — trigger-on-click is the standard UX. - Wraps @emoji-mart/react, lazy-loaded with a Skeleton placeholder while the ~200KB bundle fetches. Don't pre-import unless you need it eagerly.
- Trigger composition: EmojiPickerPopover's
childrenis the trigger — wrap any Button/IconButton. Typical pairing is an icon-only IconButton with a 😀 label. - TipTap integration: Use
createEmojiSuggestion(set?)factory to create a TipTap suggestion plugin that opens the picker on typing:emoji. Works with RichChatInput and RichTextEditor. - Theme matching:
theme="auto"reads the.darkclass on<html>— matches the DS dark mode toggle automatically. Override with explicit light/dark. - Emoji sets: Pass
set="apple" | "google" | ...for consistent cross-platform emoji art (defaults to native OS glyphs).
Gotchas
- Wraps
@emoji-mart/reactwhich is lazy-loaded — shows a Skeleton placeholder while loading theme="auto"reads the.darkclass on<html>to pick light/dark- EmojiPickerPopover auto-closes after selection
Changes
v0.33.0
- Added
setprop on EmojiPicker and EmojiPickerPopover —EmojiSettype: 'native' | 'apple' | 'google' | 'twitter' | 'facebook' - Added
EmojiNodeTipTap extension — inline atom node with spritesheet rendering for consistent emoji art styles - Added
createEmojiSuggestion(set?)factory — replacesEmojiSuggestionnamed export - Added
EmojiSettype exported from barrel - Breaking
EmojiSuggestionnamed export removed — usecreateEmojiSuggestion()factory