How to Render Emojis as Custom Images in a React Text Input
Build a custom emoji input with Theodore, wire up your own image assets, and connect an emoji picker in a real React example.
npm install theodore-jsThis hint is a custom React component. Press Tab to accept the ghost text or Escape to reject it.
Emoji style:
Render emoji consistently, add inline suggestions, and keep full control over behavior and presentation.
Render emoji with your own images so they look identical across browsers and platforms.
Show inline suggestions without adding them to the user’s content until accepted.
Use Tab, Escape, buttons, gestures, or custom product logic to control suggestions.
Style emoji, ghost text, and suggestion hints to match your product.
Preserve expected editor behavior, including undo and keyboard interactions.
Add both capabilities without adopting a heavy, opinionated editor framework.
Connect custom emoji rendering and ghost-text suggestions in one component.
import { useRef } from 'react';
import {
Theodore,
type TheodoreHandle,
useEditorState,
useSuggestion,
} from 'theodore-js';
import 'theodore-js/style.css';
import { renderEmoji, requestSuggestion } from './editor-config';
export function Composer() {
const theodoreRef = useRef<TheodoreHandle>(null);
const editorState = useEditorState();
const { suggestion } = useSuggestion({
editorState,
theodoreRef,
requestSuggestion,
});
return (
<Theodore
editorState={editorState}
theodoreRef={theodoreRef}
renderEmoji={renderEmoji}
suggestion={suggestion}
placeholder="Write something..."
/>
);
}Theodore journal
Read the ideas, tradeoffs, and practical techniques that shaped Theodore—and bring them into your own React inputs.

Build a custom emoji input with Theodore, wire up your own image assets, and connect an emoji picker in a real React example.

Explore the story behind Theodore and the content, selection, and history architecture that makes its editing model work.