# emoji-picker-react β€” complete documentation > Emoji picker for React: batteries included with ``, or BYOD (bring your own design, design language and design library) with `unstyled` and `emoji-picker-react/primitives`. Both paths share search, keyboard navigation, localization and virtualization. Use your existing Tailwind, shadcn/ui, CSS Modules, Emotion, styled-components, MUI or plain CSS design. > Generated by `npm run docs:llms`. Do not edit by hand. Key facts: - Install: `npm install emoji-picker-react`. Minimal use: `import EmojiPicker from 'emoji-picker-react'; insert(e.emoji)} />`. - Choose batteries included or BYOD for both "I just need an emoji picker" (the default component needs no styling) and "it must match our design system" (`unstyled` or primitives + the project's styling solution). - Entry points: `emoji-picker-react` (the default picker, enums and types; registers the English dataset), `emoji-picker-react/primitives` (composable parts, hooks, tokens and the same enums; loads the dataset on demand), `emoji-picker-react/data` (search and lookup without React), `emoji-picker-react/data/emojis-` (28 datasets). The complete export list is below. - Styling: `--epr-*` CSS variables (they always yield to consumer CSS), `[data-epr-part="…"]` selectors, `className`/`style`. Ordinary resets are handled by library classes; more specific rules and !important can still override structural geometry. With Tailwind v4 or other @layer setups pass `cssLayer="epr"` and declare `@layer epr, theme, base, components, utilities;` first. - Use `colorScheme="light" | "dark" | "auto"` on Root, or prefer it over `theme` on EmojiPicker (CSS-in-JS wrappers reserve `theme`). Props accept string literals or enums. - Accessibility: automated axe and keyboard/focus regression checks; grid semantics (emoji buttons are `role="gridcell"`); every UI string localizable through `labels`. Manual screen-reader verification has a separate release protocol. - Works with React 16.8–19, SSR, React Server Components (client entries are marked "use client"), TypeScript. - Composition owns presence and placement: Root renders exactly the parts you supply β€” omit Search, Preview, SkinTone, Panel or Reactions to omit that UI, and place SkinTone inside Search or Preview (or anywhere in Root). The default picker assembles the same parts from its legacy props. Use SearchInput as={Input} with an input-forwarding adapter. Root/EmojiPicker components replace Emoji, CategoryHeader, CategoryButton, SkinToneButton, ClearButton and ExpandButton; List components override grid slots. Use useSearchActions, useCategoryNavigation and usePickerMode for custom controls. Bare Root and unstyled remove all branded decoration; geometry and presence belong to your JSX. Do not invent asChild, onEmojiSelect or a renderer-independent UI engine. - Read the installed package llms-full.txt first; it matches the installed version. The primitives entry, `unstyled`, `columns`, `components`, `labels` and loader `emojiData` exist from 5.0.0; a 4.x installation has only the v4 props. - Do not override structural layout (viewport overflow, grid geometry); position the picker by wrapping it. Exports (generated from the entry sources): - `emoji-picker-react`: default `EmojiPicker`; values `Categories`, `Emoji`, `emojiByUnified`, `EmojiStyle`, `SkinTonePickerLocation`, `SkinTones`, `SuggestionMode`, `Theme`; types `CategoryButtonRenderProps`, `CategoryConfig`, `CategoryHeaderRenderProps`, `CategoryIcons`, `CustomEmoji`, `EmojiClickData`, `EmojiClickHandler`, `EmojiData`, `EmojiDataInput`, `EmojiDataLoader`, `EmojiDataLoaderOptions`, `EmojiRenderProps`, `EmojiStyleValue`, `ListComponents`, `ListEmoji`, `OnEmojiClickApi`, `PickerComponents`, `PickerLabels`, `PickerProps`, `PreviewConfig`, `Props`, `SkinToneButtonRenderProps`, `SkinToneChangeHandler`, `SkinTonesValue`, `SuggestionModeValue`, `ThemeValue`. - `emoji-picker-react/primitives`: values `Categories`, `CategoryNav`, `darkPickerTokens`, `defaultPickerTokens`, `EmojiStyle`, `Empty`, `lightPickerTokens`, `List`, `LoadError`, `Loading`, `Panel`, `Preview`, `Reactions`, `Root`, `Search`, `SearchInput`, `SkinTone`, `SkinTonePickerLocation`, `SkinTones`, `structuralPickerTokens`, `SuggestionMode`, `Theme`, `useActiveEmoji`, `useCategoryNavigation`, `useEmojiDataState`, `usePickerMode`, `useSearchActions`, `useSearchState`, `useSkinTone`, `Viewport`; types `CategoryButtonRenderProps`, `CategoryConfig`, `CategoryHeaderRenderProps`, `CategoryIcons`, `CategoryNavProps`, `CustomEmoji`, `EmojiClickData`, `EmojiClickHandler`, `EmojiData`, `EmojiDataInput`, `EmojiDataLoader`, `EmojiDataLoaderOptions`, `EmojiDataState`, `EmojiRenderProps`, `EmojiStyleValue`, `EmptyProps`, `ListComponents`, `ListEmoji`, `ListProps`, `LoadErrorProps`, `LoadingProps`, `OnEmojiClickApi`, `PanelProps`, `PickerAppearanceProps`, `PickerComponents`, `PickerCompositionProps`, `PickerLabels`, `PreviewConfig`, `PreviewProps`, `ReactionsProps`, `RootBehaviorProps`, `RootProps`, `SearchInputComponent`, `SearchInputElement`, `SearchInputProps`, `SearchProps`, `SearchState`, `SkinToneButtonRenderProps`, `SkinToneChangeHandler`, `SkinToneProps`, `SkinTonesValue`, `SuggestionModeValue`, `ThemeValue`, `ViewportProps`. - `emoji-picker-react/data`: values `getEmojiByUnified`, `searchEmojis`; types `EmojiData`, `EmojiDataOptions`, `EmojiInfo`. - `emoji-picker-react/data/emojis-`: default export, an `EmojiData` dataset (bn, da, de, en, en-gb, es, es-mx, et, fi, fr, hi, hu, it, ja, ko, lt, ms, nb, nl, pl, pt, ru, sv, th, uk, vi, zh, zh-hant). Quick reference: ```tsx // Batteries included: theme the built-in look with colorScheme and --epr-* variables. import EmojiPicker from 'emoji-picker-react'; insert(e.emoji)} /> // Unstyled: same layout and behavior, your CSS on [data-epr-part] selectors (color variables do nothing here). // Composed: your layout, your components; Root keeps state, keyboard, ARIA and virtualization. import * as Picker from 'emoji-picker-react/primitives'; insert(e.emoji)}> // Data only (no React): search and lookup. import { searchEmojis, getEmojiByUnified } from 'emoji-picker-react/data'; searchEmojis('party'); getEmojiByUnified('1f389'); // { emoji: 'πŸŽ‰', name: 'party popper', unified, names, … } ``` Contents: 1. Agent integration guide (docs/v5/AGENT_GUIDE.md): installed-version discovery, batteries included/BYOD, typed input/cell contracts, localization and verification 2. Copyable integration prompts (docs/v5/PROMPTS.md): setup, brand styling, design-library composition, recipe adoption and v4-to-v5 migration 3. README (README.md): overview, quick start, choosing a path, styling with any solution, common tasks 4. Props reference (PROPS.md): every prop of the default 5. CSS variables (CSS_VARIABLES.md): every --epr-* design token 6. Customization (CUSTOMIZATION.md): custom emojis and groups, category icons, preview, CSP nonce 7. Internationalization (INTERNATIONALIZATION.md): locale datasets and labels 8. Adoption (docs/v5/ADOPTION.md): native input, loading recovery, registry installation and source downloads 9. v5 API (docs/v5/API.md): all v5 additions with examples 10. Primitives (docs/v5/PRIMITIVES.md): composable parts, hooks, custom cells, grammar 11. Styling (docs/v5/STYLING.md): tokens, parts, cascade, structural rules 12. Styling recipes by library (docs/v5/STYLING_RECIPES.md): theme, unstyled and composed snippets for plain CSS, CSS Modules, Tailwind, shadcn/ui, Emotion, styled-components and MUI 13. Data API (docs/v5/DATA_API.md): framework-free search and lookup 14. Migrating from v4 (docs/v5/MIGRATION.md): what changed and how to upgrade 15. Website examples (website/README.md): typed customization, locale loading and composition 16. Design recipes (stories/recipes/README.md): 25 designs, each in seven styling stacks 17. Styling integrations (stories/integrations/README.md): shadcn/ui, Tailwind, Emotion, styled-components, CSS Modules, CSS, MUI 18. Example app (example/README.md): Vite + React 19 app running the batteries-included, unstyled, composed and data-API paths 19. Worked example: team chat picker composition (stories/recipes/team-chat/picker.tsx; picker only, demo app chrome excluded) # Integrating emoji-picker-react: agent guide A decision-first guide for coding agents and the people reviewing their output. Every snippet here matches the shipped API. For a task to paste into a coding agent, use the [setup, customization, recipe adoption and v5 migration prompts](PROMPTS.md). Each is self-contained and starts with installed-version discovery; the contracts below remain authoritative. ## 1. Check the installed version first Everything below exists from `emoji-picker-react@5.0.0`. A 4.x installation has the same default `` but none of the v5 additions. 1. Read the app's `package.json`, lockfile, and `node_modules/emoji-picker-react/package.json` (`version`, `exports`). 2. Read `node_modules/emoji-picker-react/llms-full.txt`: the full reference for that exact version, usable offline. `llms.txt` is a short index. 3. If the installed version is 4.x, use only v4 APIs (no `/primitives`, `unstyled`, `columns`, `components`, `labels` or loader `emojiData`), or upgrade: [MIGRATION.md](MIGRATION.md) lists every behavior change. ## 2. Pick a path | The app needs | Use | The app styles | The picker owns | | --- | --- | --- | --- | | An emoji picker, fast | `` | Nothing | Complete UI and behavior | | The built-in look in brand colors | `` + `colorScheme` + `--epr-*` color variables | Variables | Complete UI and behavior | | Its own design, supplied layout | `` | Every part, via `[data-epr-part]` | Layout, geometry, behavior | | Its own layout or design-library components | `emoji-picker-react/primitives` | Layout and parts | State, grid, keyboard, ARIA, virtualization | | Search or lookup without UI | `emoji-picker-react/data` | Everything | Dataset search and lookup | BYOD means **bring your own design, design language and design library**. It works with plain CSS, CSS Modules, Tailwind, shadcn/ui, Emotion, styled-components and MUI. **The styling rule.** Color variables (`--epr-bg-color`, `--epr-highlight-color`, …) theme the *built-in look*. `unstyled` and a bare `Root` remove the built-in look, so color variables do nothing there. Size variables (`--epr-emoji-size`, paddings, heights) work in every mode. To reuse the built-in look in a composition, pass `appearance="default"` to `Root`. ## 3. Batteries included ```tsx import EmojiPicker from 'emoji-picker-react'; insertAtCaret(data.emoji)} /> ``` `insertAtCaret` is your application's function. The host owns insertion, trigger state, placement and popover/dialog dismissal. Preserve the text selection and any suffix when inserting. For custom image emojis, `data.emoji` is the custom id; map it to your token or attachment. Search and selection never send messages. ## 4. BYOD with design-library components ```tsx import * as React from 'react'; import * as Picker from 'emoji-picker-react/primitives'; import { Input, Button } from './design-system'; function Cell({ emoji, ...managed }: Picker.EmojiRenderProps) { return (