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',