'use client'; import { useState } from 'react'; import { IconBrain, IconChevronDown, IconChevronRight } from '@tabler/icons-react'; import { ActionIcon, Collapse, Group, Paper, Text, useMantineTheme } from '@mantine/core'; import { useThemeContext } from '@/components/DynamicThemeProvider'; import classes from './ThinkingBlock.module.css'; interface ThinkingBlockProps { content: string; isStreaming?: boolean; } /** * Collapsible block for displaying model reasoning/thinking content */ export function ThinkingBlock({ content, isStreaming = false }: ThinkingBlockProps) { const [opened, setOpened] = useState(false); const { primaryColor } = useThemeContext(); const theme = useMantineTheme(); // Don't render if no content if (!content.trim()) { return null; } // Count approximate "thoughts" or lines for summary const lines = content.trim().split('\n').filter(Boolean); const wordCount = content.trim().split(/\s+/).length; return ( setOpened(!opened)} gap="xs" wrap="nowrap" p="xs" style={{ cursor: 'pointer' }} > {opened ? : } {isStreaming ? 'Thinking...' : 'Reasoning'} {!opened && ( {isStreaming ? 'Model is reasoning...' : `${wordCount} words, ${lines.length} steps`} )}
{content}
); }