diff --git a/ui/src/components/chat/ChatView.tsx b/ui/src/components/chat/ChatView.tsx index dbda402..c8e2218 100644 --- a/ui/src/components/chat/ChatView.tsx +++ b/ui/src/components/chat/ChatView.tsx @@ -1,6 +1,7 @@ import { useRef, useEffect } from 'react'; import ChatMessage from './ChatMessage'; import ChatInput from './ChatInput'; +import ThinkingIndicator from './ThinkingIndicator'; import ThemeToggle from '@/components/ThemeToggle'; import type { Message, FileAttachment } from '@/lib/llm'; @@ -41,6 +42,9 @@ export default function ChatView({ ))} + {/* Thinking indicator — visible before first stream token */} + {isLoading && !streamingContent && } + {/* Streaming Message */} {streamingContent && ( +
+ + + + Thinking... +
+ + ); +} diff --git a/ui/tailwind.config.ts b/ui/tailwind.config.ts index cc139df..ded75f4 100644 --- a/ui/tailwind.config.ts +++ b/ui/tailwind.config.ts @@ -63,28 +63,24 @@ export default { md: 'calc(var(--radius) - 2px)', sm: 'calc(var(--radius) - 4px)' }, - keyframes: { - 'accordion-down': { - from: { - height: '0' - }, - to: { - height: 'var(--radix-accordion-content-height)' - } - }, - 'accordion-up': { - from: { - height: 'var(--radix-accordion-content-height)' - }, - to: { - height: '0' - } - } - }, - animation: { - 'accordion-down': 'accordion-down 0.2s ease-out', - 'accordion-up': 'accordion-up 0.2s ease-out' - }, + keyframes: { + 'accordion-down': { + from: { height: '0' }, + to: { height: 'var(--radix-accordion-content-height)' } + }, + 'accordion-up': { + from: { height: 'var(--radix-accordion-content-height)' }, + to: { height: '0' } + }, + 'dot-pulse': { + '0%, 80%, 100%': { opacity: '0.3', transform: 'scale(0.8)' }, + '40%': { opacity: '1', transform: 'scale(1.2)' } + } + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out' + }, fontFamily: { sans: [ 'Poppins',