emoteer

ReactionButton

Sticker-style reaction buttons with burst animations and an optional picker

ReactionButton renders one or more tappable emoji stickers. Use a handful of curated emojis in a quick bar, add a "more" button that opens a full picker, or render isolated stickers anywhere in the UI.

Tap any sticker.

Sticker

The simplest form: a standalone sticker button with a burst animation on click.

components/stickers.tsx
import { ReactionButton } from '@emoteer/react';

export function Stickers() {
  return (
    <div className="flex gap-4">
      {['❤️', '🔥', '🚀', '✨'].map((emoji) => (
        <ReactionButton.Sticker
          key={emoji}
          emoji={emoji}
          burst
          onClick={() => console.log(emoji)}
        />
      ))}
    </div>
  );
}

Quick bar

Combine multiple stickers and a picker trigger in a single floating bar.

components/quick-bar.tsx
import { ReactionButton, EmoteList } from '@emoteer/react';
import { useState } from 'react';

export function QuickBar() {
  const [open, setOpen] = useState(false);

  return (
    <ReactionButton.Root onSelect={(e) => console.log(e)}>
      {['👍', '❤️', '😂', '🙏'].map((emoji) => (
        <ReactionButton.Item key={emoji} emoji={emoji} burst />
      ))}

      <ReactionButton.Divider />

      <ReactionButton.Popover open={open} onOpenChange={(d) => setOpen(d.open)}>
        <ReactionButton.Trigger>
          <ReactionButton.Plus />
        </ReactionButton.Trigger>
        <ReactionButton.Content>
          <EmoteList.Root onSelect={(e) => setOpen(false)}>
            <EmoteList.Search />
            <EmoteList.Tabs />
            <EmoteList.Grid />
          </EmoteList.Root>
        </ReactionButton.Content>
      </ReactionButton.Popover>
    </ReactionButton.Root>
  );
}

Slots

SlotDescription
RootContainer for a quick bar. Exposes onSelect.
ItemA sticker in the quick bar. Emits selection on click.
StickerStandalone sticker button (no Root required).
DividerVisual separator inside the quick bar.
PlusIcon button, typically used as a Trigger child.
PopoverControlled popover wrapping the picker content.
TriggerElement that toggles the popover.
ContentPopover body — typically an EmoteList.

Props

ReactionButton.Root

PropTypeDescription
onSelect(emoji: string) => voidFires when any Item inside the quick bar is tapped.
classNamestringForwarded to the outer container.
childrenReactNodeItems, dividers and the picker popover.

ReactionButton.Item

PropTypeDefaultDescription
emojistring—Emoji shown inside the sticker.
labelstringemojiAccessible label. Defaults to the emoji character.
burstbooleanfalseShow a particle burst on click.
classNamestring—Forwarded to the <button>.
...native——All standard <button> attributes.

ReactionButton.Sticker

Standalone sticker — works without a Root.

PropTypeDefaultDescription
emojistring"❤️"Emoji to display and report.
onClick() => void—Fires when the sticker is tapped.
burstbooleantrueShow a particle burst on click.
childrenReactNodeemojiOverride the sticker contents.
classNamestring—Forwarded to the outer <div>.

ReactionButton.Divider

PropTypeDescription
classNamestringForwarded to the divider element.

ReactionButton.Plus

A pre-styled "+" icon button, typically used as the child of Trigger.

PropTypeDescription
onClick() => voidClick handler.
classNamestringForwarded to the <button>.
...native—All standard <button> attributes.

ReactionButton.Popover

Controlled popover container.

PropTypeDescription
openbooleanWhether the popover is open.
onOpenChange(details: { open: boolean }) => voidCalled when the open state changes.
childrenReactNodeTrigger and content.

ReactionButton.Trigger

PropTypeDescription
childrenReactElementElement that receives the trigger props. Defaults to ReactionButton.Plus.

ReactionButton.Content

PropTypeDescription
childrenReactNodePopover body — typically an EmoteList.
classNamestringForwarded to the content wrapper.

Burst animation

Setting burst on a Sticker or Item emits a short particle animation on click. It's pure CSS — no external library — and honors prefers-reduced-motion.

On this page