Skip to content
WingoUI
ComponentsTemplatesDocsPricingAI agentsBlogChangelogContact
Components
Buttons & Actions
ButtonButton GroupCopy ButtonDelete ButtonTheme ToggleToggleToggle Group
Inputs
Avatar UploadCalendarCheckboxColor PickerComboboxCountry SelectCron PickerCurrency InputDate PickerDate Range PickerDate Time PickerDuration PickerEmail InputEmoji PickerFile UploadFilter BuilderInputInput GroupListboxMasked InputMention InputMonth PickerMulti SelectNumber InputOTP InputPassword InputPhone InputRadio GroupRatingSearch InputSegmented ControlSelectSignature PadSliderSwitchTag InputTextareaTime PickerTimezone SelectTree Select
Forms
Address InputBooking WidgetCSV ImportFieldForm WizardInline EditInvoice line itemsRich Text EditorSchema Builder
Navigation
Back To TopBounce SidebarBreadcrumbCommand MenuGlobal SearchGooey NavHook SidebarNav MenuNav TabsPaginationProximity SidebarScroll ProgressSidebarStepsTable Of ContentsTabsTopbarUser MenuWorkspace Switcher
Overlays
Alert DialogContext MenuDialogDrawerDropdown MenuFamily DrawerHover CardPopoverShare DialogSheetShortcuts DialogTooltipTour
Feedback
AlertBannerCookie ConsentEmoji ReactionEmpty StateNotification BellNotification CenterProgressRoute ProgressSetup ChecklistSkeletonSpinnerToast
Data Display
Approval FlowAvatarBadgeCalendar ViewCode BlockComment ThreadContact cardCountdownDescription ListDiff ViewerFile ListFile managerFolderGanttJSON ViewerKbdLog ViewerMarkdownPresenceSchedulerTagTimelineTree View
Tables & Lists
Audit LogData TableDeal PipelineEditable GridKanbanListMembers tablePermissions MatrixTableTask ListVirtual List
Charts & Stats
Animated CounterArea chartBar chartDonut chartFunnel chartGaugeGitHub ActivityHeatmap calendarLeaderboardLine chartRadar chartRadial barSparklineStat CardTrackerTrend badge
Layout
AccordionApp ShellCardCollapsibleDetail LayoutEntity HeaderPage HeaderScroll AreaSeparatorSettings LayoutSplit ViewToolbar
Media
Audio PlayerCarouselCSV ViewerDOCX EditorDOCX ViewerExcel ViewerFile SystemImage compareImage CropperImage GalleryImage LightboxLocation MapPDF ViewerPowerPoint ViewerQR CodeStep PlayerVideo Player
AI Kit
Agent Status CardChat MessageChat ThreadChat WidgetConversation ListFluid OrbGrid RevealMatrix OrbModel PickerPrompt InputReasoning IndicatorRule BuilderSuggestion ChipsTool Call TimelineUsage MeterVoice InputWorkflow Canvas
Text & Effects
Background PatternGravity LettersMarqueeTerminalText AnimateText Rotate
Mobile
Action SheetBottom Tab BarFABHaptic ButtonHero HeaderInstall PromptLarge Title HeaderNotification BannerOnboarding CarouselPicker WheelPull To RefreshSlide To ConfirmSticky CTA BarSwipe DeckSwipeable Tabs
Commerce
Cart drawerCategory pickerCheckout stepsCoupon inputFavorite buttonFilter panelListing cardListing gridOrder trackerPricePrice rangePricing tableProduct galleryQuantity stepperReviewsSeller card
Marketing Sections
App Download SectionBlog Cards SectionCTA SectionFAQ SectionFeature GridFeature ShowcaseHero SectionIntegrations SectionLogo CloudMarketing FooterMarketing HeaderMarketing SectionNewsletter SectionPricing SectionStats SectionSteps SectionTeam SectionTestimonials SectionTimeline SectionVideo Section
Blocks
Admin Dashboard PageAdmin ShellAI Chat PageAPI Keys PageAutomation Builder PageCheckout PageCRM Contact PageCRM Pipeline PageError PagesInbox PageInvoice PageKPI DashboardListing Detail PageLogin PageMarketplace Home PageMarketplace Search PageMarketplace ShellMobile App HomeOnboarding FlowOrder History PagePost Listing WizardPricing PageProfile PageRegister PageSettings PageUsers Admin Page
Templates
About PageAcademy PageAccessibility PageAffiliate PageAgency PageAI Product PageAppointment Booking PageBlog PageBlog Post PageBug Bounty PageCareers PageChangelog PageCommunity PageCompare PageContact PageCustomer Story PageCustomers PageDemo Booking PageDevelopers PageDocs Home PageDownload PageEnterprise PageEvents PageExperts PageFAQ PageFeature PageGlossary PageHelp Article PageHelp Center PageHome Services PageImpact PageIntegration Detail PageIntegrations PageJob Detail PageLanding PageLaunch PageLegal PageManifesto PagePortfolio PagePress PageProduct Tour PagePromo PageReal Estate PageReferral PageResearch Report PageRestaurant PageRoadmap PageROI Calculator PageSecurity PageSolutions PageStartups PageStatus PageStorefront PageSwitch PageTemplate Gallery PageTravel PageWaitlist PageYear in Review Page
Hooks & Utilities
AI ChatChart kitCommerceDate utilsFile exportFile typesFiltersForm validationHapticsInvoicingMotion presetsNavigationNumber formatRelative timeRomanian locationsSpreadsheetText matchTonesUIProvideruseClipboarduseConsentuseControllableStateuseCooldownuseDebounceuseKeyboardInsetuseLocaleuseLongPressuseMediaControlsuseMediaQueryuseOverflowItemsusePersistedStateuseScrollEdgesuseScrollStateuseSelectionuseShortcutuseStickToBottom
GalleryTheme

Feedback

Emoji Reaction

Feedback

Emoji Reaction React component for Tailwind CSS v4

Cookie ConsentEmpty State
Live props
Appearance
size
align
surfaceColor
Behavior
asChild
burstCount5
rise450px
holdInterval550ms
State
defaultOpen
Content
openLabel
closeLabel
reactedLabel
menuLabel
emojiBaseUrl
Code
import { EmojiReaction } from "@/components/ui/emoji-reaction"

<EmojiReaction />
  1. Home
  2. Components
  3. Feedback
  4. Emoji Reaction
Free

Emoji Reaction React component for Tailwind CSS v4

v1.0.1·Updated in 1.2.1

A React emoji reaction button in the chat tapback style: it opens a bar of Apple emoji and sends copies of your pick floating up.

Click the button to pop the emoji bar open, or press and drag straight onto an emoji to pick it in one gesture. Hover an emoji to lift it. Pick one and 5 copies stream up off it, drifting apart, shrinking, and blurring out of focus as they climb. Hold the emoji down to keep them coming. The bar flips below the button when there is no room above, and the arrow keys, Home and End move along it. While it is open the button turns into a cross; click that, click outside, or press Escape to close. The button then shows your last pick.

Emoji Reaction is a free React component in the React feedback components category, written in TypeScript for React 19 and Tailwind CSS v4. It installs as source with npx wingo-ui@latest add emoji-reaction, together with UIProvider and the npm packages motion, react-apple-emojis, lucide-react and @radix-ui/react-slot.

Add to a project

Requirements: React 19 and Tailwind CSS v4, in Next.js (App Router or Pages), Vite or React Router. Installation guide · Next.js setup · Vite setup

npx wingo-ui@latest add emoji-reaction

Usage

Import EmojiReaction from @/components/ui/emoji-reaction.

import { EmojiReaction } from "@/components/ui/emoji-reaction"

export function Demo() {
  return <EmojiReaction onReact={(name) => console.log(name)} />
}

// or hang the bar off your own element:
// <EmojiReaction asChild>
//   <button className="rounded-2xl bg-card p-4">Nice work</button>
// </EmojiReaction>

Props

  • sizedefault "md"
    "sm" | "md" | "lg"

    Scale of the button, the bar, and the emoji that fly up. The trigger is 32px (sm), 40px (md) or 48px (lg).

  • aligndefault "center"
    "left" | "center" | "right"

    Which edge of the bar lines up with the trigger. It still shifts inward when it would run off screen.

  • asChilddefault false
    boolean

    Uses your own child as the trigger instead of the built-in button, so the bar can hang off a message, card, or image.

  • surfaceColordefault "auto"
    string

    Fill of the trigger, the bar and its tail, any CSS color. Auto is #F4F4F9 on light pages and #262626 on dark ones.

  • burstCountdefault 5
    number

    How many copies of the emoji fly up per reaction. Holding an emoji repeats the burst, and at most 60 copies are in the air at once.

  • risedefault 450
    number

    How far the copies climb before they fade out, in pixels. Each copy varies it a little.

  • holdIntervaldefault 550
    number

    While an emoji is held down, a new burst fires this often, in milliseconds.

  • defaultOpendefault false
    boolean

    Starts with the bar open, for a first-run hint or a screenshot. It does not take focus until the user opens it themselves.

  • openLabeldefault "Add a reaction"
    string

    Accessible name of the trigger before any reaction.

  • closeLabeldefault "Close reactions"
    string

    Accessible name of the trigger while the bar is open.

  • reactedLabeldefault "Reacted {emoji}"
    string

    Accessible name of the trigger after a reaction; {emoji} fills in its name.

  • menuLabeldefault "Pick a reaction"
    string

    Accessible name of the emoji bar.

  • emojiBaseUrldefault "https://em-content.zobj.net/source/apple/419/"
    string

    Where the built-in five faces load from; point it at your own mirror of the same file names. Ignored when emojiData is passed.

  • emojisdefault "["smiling-face-with-hearts", "star-struck", "confused-face", "pleading-face", "grinning-face-with-smiling-eyes"]"
    string[]

    Apple emoji names shown in the bar, hyphenated as on Emojipedia. Anything beyond the five defaults needs emojiData too.

  • emojiDatadefault "built-in Apple emoji set (the five defaults)"
    EmojiData

    Emoji name to image map passed to EmojiProvider. Defaults to the five bundled faces served from the emojipedia CDN; pass react-apple-emojis/src/data.json for the full set.

  • onReact
    (name: string) => void

    Called with the emoji name every time one is picked, including each repeat while it is held down.

  • children
    ReactNode

    The custom trigger when asChild is set. Ignored otherwise.

  • className
    string

    Extra classes merged onto the root element; other div props are spread onto it too.

Examples

React to chat messages

asChild turns each message bubble into the trigger; onReact receives the emoji name to show or save.

Under a post

The small size next to a running count; every pick, including held repeats, adds one.

Fewer faces, bigger burst

emojis narrows the bar to three; burstCount and rise send more copies higher.

Dependencies

motionreact-apple-emojislucide-react@radix-ui/react-slotui-config

Files

  • components/ui/emoji-reaction.tsx

FAQ

Is the React Emoji Reaction component free?

Yes. The source is free and needs no account: copy it from the Code tab or install it with the CLI.

How do I install Emoji Reaction?

Run npx wingo-ui@latest add emoji-reaction. It also adds the Wingo UI item it builds on (UIProvider) and the npm packages motion, react-apple-emojis, lucide-react and @radix-ui/react-slot. With shadcn, run npx shadcn@latest add https://wingo-ui.com/r/emoji-reaction.json.

See also

Chat MessageComment ThreadFavorite buttonPopoverChat Thread

More React feedback components

AlertToastProgressBannerCookie ConsentEmpty State
All 13 React feedback components

Articles using this component

  • React Emoji Picker: Search, Skin Tones and Phone Sheets

    Component guides · Nov 6, 2026 · 9 min read

PreviousCookie ConsentNext Empty State

Click the button, then pick an emoji to throw it up the screen.