"use client" import * as React from "react" import { BrainIcon } from "lucide-react" import { motion, useReducedMotion } from "motion/react" import type { MessageAnimationPreset } from "@/lib/message-animations" import { MESSAGE_ANIMATIONS } from "@/lib/message-animations" import { Bubble, BubbleContent } from "@/styles/radix-rhea/ui/bubble" import { Message, MessageContent } from "@/styles/radix-rhea/ui/message" import { MessageScrollerItem } from "@/styles/radix-rhea/ui/message-scroller" type MessageAnimatedPart = { content?: unknown type: string text?: unknown } type MessageAnimatedMessage = { id: string role: string text?: string parts?: ReadonlyArray } const MotionMessageScrollerItem = motion.create(MessageScrollerItem) function MessageAnimated({ message, animationPreset = MESSAGE_ANIMATIONS["slide-up"], assistantVariant = "ghost", scrollAnchor, userVariant = "muted", ...props }: Omit< React.ComponentProps, "animate" | "children" | "exit" | "initial" | "messageId" | "variants" > & { animationPreset?: MessageAnimationPreset assistantVariant?: React.ComponentProps["variant"] message: MessageAnimatedMessage userVariant?: React.ComponentProps["variant"] }) { const shouldReduceMotion = useReducedMotion() const isUserMessage = message.role === "user" if (isUserMessage) { return ( ) } return ( ) } function MessageAnimatedRow({ message, assistantVariant, userVariant, }: { assistantVariant: React.ComponentProps["variant"] message: MessageAnimatedMessage userVariant: React.ComponentProps["variant"] }) { const isUserMessage = message.role === "user" const parts = getMessageAnimatedContentParts(message) return ( {parts.map((part) => { const paragraphs = part.text .split(/\n\s*\n/) .map((paragraph) => paragraph.trim()) .filter(Boolean) if (part.type === "reasoning") { return (
Reasoning
{paragraphs.map((paragraph, paragraphIndex) => (

{paragraph}

))}
) } return ( {paragraphs.map((paragraph, paragraphIndex) => (

{paragraph}

))}
) })}
) } function getMessageAnimatedContentParts(message: MessageAnimatedMessage) { if (message.parts) { return message.parts.flatMap((part, index) => { const type = part.type === "reasoning" || part.type === "thinking" ? "reasoning" : part.type === "text" ? "text" : null const text = typeof part.text === "string" ? part.text : typeof part.content === "string" ? part.content : null if (!type || text === null) { return [] } return [ { key: `${message.id}-${index}`, text, type, }, ] }) } return typeof message.text === "string" ? [{ key: `${message.id}-text`, text: message.text, type: "text" }] : [] } export { MessageAnimated, type MessageAnimatedMessage }