/** * Props for the EmojiBurst component */ export interface EmojiBurstProps { /** * Whether the burst animation is currently active. * When set to true, starts a new burst animation from the specified position. * Setting to false will not stop an ongoing animation - use onComplete for cleanup. */ isActive: boolean; /** * The position where the burst should originate from, in viewport coordinates. * Typically obtained from element.getBoundingClientRect() or mouse event coordinates. * * @example * ```tsx * // From button center * const rect = buttonRef.current.getBoundingClientRect(); * const position = { * x: rect.left + rect.width / 2, * y: rect.top + rect.height / 2 * }; * * // From mouse click * const position = { x: event.clientX, y: event.clientY }; * ``` */ position: { x: number; y: number; }; /** * The emoji to display in the burst animation. * Special behavior: When set to '👍', automatically uses diverse skin tone variants. * * @default "👍" * * @example * ```tsx * emoji="🎉" // Party celebration * emoji="❤️" // Love reaction * emoji="😂" // Laughter * emoji="👍" // Uses skin tone variants: 👍, 👍🏻, 👍🏽, 👍🏿 * ``` */ emoji?: string; /** * Duration of the burst animation in milliseconds. * Controls how long emojis remain visible before fading out completely. * Longer durations allow emojis to travel further and fade more gradually. * * * - Animation uses requestAnimationFrame for smooth 60fps performance * - Emojis begin fading after 2/3 of the duration */ duration: number; /** * Callback function called when the animation completes and all emojis have faded out. * Use this to clean up state, typically by setting isActive to false. * * @example * ```tsx * onComplete={() => { * setBurstActive(false); * // Optional: trigger other effects * playSound('burst-complete'); * }} * ``` */ onComplete: () => void; } /** * EmojiBurst component creates an animated burst of emoji characters * * Features: * - Creates a circular burst of emojis with different skin tones (for thumbs-up) or the specified emoji * - Animates emojis with physics-based motion (velocity, gravity, rotation) * - Automatically fades out and cleans up after animation completes * - Non-interactive visual effect (pointer-events-none) * - Randomized trajectories and rotation for natural movement * - Adaptive emoji variants for inclusive representation * * @example * // Basic reaction burst on button click * const [burstActive, setBurstActive] = useState(false); * const [burstPosition, setBurstPosition] = useState({ x: 0, y: 0 }); * const [burstDuration] = useState(2000); // 2 seconds * * const handleReaction = (event: React.MouseEvent) => { * const rect = event.currentTarget.getBoundingClientRect(); * setBurstPosition({ * x: rect.left + rect.width / 2, * y: rect.top + rect.height / 2 * }); * setBurstActive(true); * }; * * return ( * <> * * setBurstActive(false)} * /> * * ); * * @example * // Custom emoji with longer duration * setShowCelebration(false)} * /> * * @example * // Triggered from mouse coordinates * const handleEmojiReaction = (event: MouseEvent, selectedEmoji: string) => { * setBurstPosition({ x: event.clientX, y: event.clientY }); * setBurstEmoji(selectedEmoji); * setBurstActive(true); * }; * * setBurstActive(false)} * /> */ export declare const EmojiBurst: ({ isActive, position, emoji, duration, onComplete, }: EmojiBurstProps) => import("react/jsx-runtime").JSX.Element | undefined;