= ({ content }) =>
// If we couldn't parse any tasks, fall back to text display
if (tasks.length === 0) {
return (
-
+
{content}
);
@@ -87,13 +87,13 @@ export const TaskListContent: React.FC = ({ content }) =>
return (
-
+
{completed}/{total} completed
-
+
0 ? (completed / total) * 100 : 0}%` }}
/>
@@ -104,16 +104,16 @@ export const TaskListContent: React.FC
= ({ content }) =>
return (
{config.icon}
-
+
#{task.id}
-
+
{task.subject}
-
+
{task.status.replace('_', ' ')}
diff --git a/src/components/chat/tools/components/ContentRenderers/TextContent.tsx b/src/components/chat/tools/components/ContentRenderers/TextContent.tsx
index 2a5702f1..abe3367e 100644
--- a/src/components/chat/tools/components/ContentRenderers/TextContent.tsx
+++ b/src/components/chat/tools/components/ContentRenderers/TextContent.tsx
@@ -26,7 +26,7 @@ export const TextContent: React.FC = ({
}
return (
-
+
{formattedJson}
);
@@ -34,7 +34,7 @@ export const TextContent: React.FC = ({
if (format === 'code') {
return (
-
+
{content}
);
@@ -42,7 +42,7 @@ export const TextContent: React.FC = ({
// Plain text
return (
-
+
{content}
);
diff --git a/src/components/chat/tools/components/ContentRenderers/TodoList.tsx b/src/components/chat/tools/components/ContentRenderers/TodoList.tsx
index ab25cb49..a9e0a403 100644
--- a/src/components/chat/tools/components/ContentRenderers/TodoList.tsx
+++ b/src/components/chat/tools/components/ContentRenderers/TodoList.tsx
@@ -79,25 +79,25 @@ const TodoRow = memo(
const StatusIcon = statusConfig.icon;
return (
-
-
+
+
-
-
+
+
{todo.content}
-
+
{todo.priority}
{todo.status.replace('_', ' ')}
@@ -136,7 +136,7 @@ const TodoList = memo(
return (
{isResult && (
-
+
Todo List ({normalizedTodos.length}{' '}
{normalizedTodos.length === 1 ? 'item' : 'items'})
diff --git a/src/components/chat/tools/components/InteractiveRenderers/AskUserQuestionPanel.tsx b/src/components/chat/tools/components/InteractiveRenderers/AskUserQuestionPanel.tsx
index 71868510..5a75390f 100644
--- a/src/components/chat/tools/components/InteractiveRenderers/AskUserQuestionPanel.tsx
+++ b/src/components/chat/tools/components/InteractiveRenderers/AskUserQuestionPanel.tsx
@@ -148,32 +148,32 @@ export const AskUserQuestionPanel: React.FC
= ({
tabIndex={-1}
onKeyDown={handleKeyDown}
className={`w-full outline-none transition-all duration-500 ease-out ${
- mounted ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-3'
+ mounted ? 'translate-y-0 opacity-100' : 'translate-y-3 opacity-0'
}`}
>
-
+
{/* Accent line */}
-
+
{/* Header + Question — compact */}
-
-
+
+
{/* Question icon */}
-
-
-
+
+
Claude needs your input
{q.header && (
-
+
{q.header}
)}
@@ -181,7 +181,7 @@ export const AskUserQuestionPanel: React.FC = ({
{/* Step counter */}
{!isSingle && (
-
+
{currentStep + 1}/{total}
)}
@@ -189,7 +189,7 @@ export const AskUserQuestionPanel: React.FC = ({
{/* Progress dots (multi-question) */}
{!isSingle && (
-
+
{questions.map((_, i) => (
{/* Options — tight spacing */}
-
+
{q.options.map((opt, optIdx) => {
const isSelected = selected.has(opt.label);
@@ -226,25 +226,25 @@ export const AskUserQuestionPanel: React.FC
= ({
key={opt.label}
type="button"
onClick={() => toggleOption(currentStep, opt.label, multi)}
- className={`group w-full text-left flex items-center gap-2.5 px-3 py-2 rounded-lg border transition-all duration-150 ${
+ className={`group flex w-full items-center gap-2.5 rounded-lg border px-3 py-2 text-left transition-all duration-150 ${
isSelected
- ? 'border-blue-300 dark:border-blue-600 bg-blue-50/80 dark:bg-blue-900/25 ring-1 ring-blue-200/50 dark:ring-blue-700/30'
- : 'border-gray-200 dark:border-gray-700/60 hover:border-gray-300 dark:hover:border-gray-600 hover:bg-gray-50/60 dark:hover:bg-gray-750/50'
+ ? 'border-blue-300 bg-blue-50/80 ring-1 ring-blue-200/50 dark:border-blue-600 dark:bg-blue-900/25 dark:ring-blue-700/30'
+ : 'dark:hover:bg-gray-750/50 border-gray-200 hover:border-gray-300 hover:bg-gray-50/60 dark:border-gray-700/60 dark:hover:border-gray-600'
}`}
>
{/* Keyboard hint */}
-
{optIdx + 1}
-
+
{opt.label}
@@ -262,7 +262,7 @@ export const AskUserQuestionPanel: React.FC
= ({
{/* Selection check */}
{isSelected && (
-
@@ -332,11 +332,11 @@ export const AskUserQuestionPanel: React.FC
= ({
{/* Footer — compact */}
-
+
diff --git a/src/components/chat/tools/components/OneLineDisplay.tsx b/src/components/chat/tools/components/OneLineDisplay.tsx
index a73bd22a..a3fcd421 100644
--- a/src/components/chat/tools/components/OneLineDisplay.tsx
+++ b/src/components/chat/tools/components/OneLineDisplay.tsx
@@ -68,16 +68,16 @@ export const OneLineDisplay: React.FC
= ({
const renderCopyButton = () => (
{copied ? (
-
+
) : (
-
+
)}
@@ -89,15 +89,15 @@ export const OneLineDisplay: React.FC = ({
return (
-
-
+
-
-
-
- $ {value}
+
+
+
+ $ {value}
{action === 'copy' && renderCopyButton()}
@@ -105,7 +105,7 @@ export const OneLineDisplay: React.FC
= ({
{secondary && (
-
+
{secondary}
@@ -118,12 +118,12 @@ export const OneLineDisplay: React.FC = ({
if (action === 'open-file') {
const displayName = value.split('/').pop() || value;
return (
-
-
{label || toolName}
-
/
+
+
{label || toolName}
+
/
{displayName}
@@ -135,23 +135,23 @@ export const OneLineDisplay: React.FC = ({
// Search / jump-to-results style
if (action === 'jump-to-results') {
return (
-
-
{label || toolName}
-
/
-
+
+
{label || toolName}
+
/
+
{value}
{secondary && (
-
+
{secondary}
)}
{toolResult && (
-
+
@@ -162,21 +162,21 @@ export const OneLineDisplay: React.FC = ({
// Default one-line style
return (
-
+
{icon && icon !== 'terminal' && (
{icon}
)}
{!icon && (label || toolName) && (
-
{label || toolName}
+
{label || toolName}
)}
{(icon || label || toolName) && (
-
/
+
/
)}
-
+
{value}
{secondary && (
-
+
{secondary}
)}
diff --git a/src/components/chat/tools/components/SubagentContainer.tsx b/src/components/chat/tools/components/SubagentContainer.tsx
index 5ff8b764..ae8099da 100644
--- a/src/components/chat/tools/components/SubagentContainer.tsx
+++ b/src/components/chat/tools/components/SubagentContainer.tsx
@@ -1,6 +1,6 @@
import React from 'react';
-import { CollapsibleSection } from './CollapsibleSection';
import type { SubagentChildTool } from '../../types/types';
+import { CollapsibleSection } from './CollapsibleSection';
interface SubagentContainerProps {
toolInput: unknown;
@@ -57,7 +57,7 @@ export const SubagentContainer: React.FC = ({
const title = `Subagent / ${subagentType}: ${description}`;
return (
-
+
= ({
>
{/* Prompt/request to the subagent */}
{prompt && (
-
+
{prompt}
)}
{/* Current tool indicator (while running) */}
{currentTool && !isComplete && (
-
-
+
+
Currently:
{currentTool.toolName}
{getCompactToolDisplay(currentTool.toolName, currentTool.toolInput) && (
<>
/
-
+
{getCompactToolDisplay(currentTool.toolName, currentTool.toolInput)}
>
@@ -89,8 +89,8 @@ export const SubagentContainer: React.FC = ({
{/* Completion status */}
{isComplete && (
-
-
+
+
Completed ({childTools.length} {childTools.length === 1 ? 'tool' : 'tools'})
@@ -99,10 +99,10 @@ export const SubagentContainer: React.FC
= ({
{/* Tool history (collapsed) */}
{childTools.length > 0 && (
-
-
+
+
= ({
View tool history ({childTools.length})
-
+
{childTools.map((child, index) => (
- {index + 1}.
+ {index + 1}.
{child.toolName}
{getCompactToolDisplay(child.toolName, child.toolInput) && (
-
+
{getCompactToolDisplay(child.toolName, child.toolInput)}
)}
{child.toolResult?.isError && (
- (error)
+ (error)
)}
))}
@@ -163,11 +163,11 @@ export const SubagentContainer: React.FC
= ({
}
return typeof content === 'string' ? (
-
+
{content}
) : content ? (
-
+
{JSON.stringify(content, null, 2)}
) : null;
diff --git a/src/components/chat/tools/components/ToolDiffViewer.tsx b/src/components/chat/tools/components/ToolDiffViewer.tsx
index b567f7c4..8f43a395 100644
--- a/src/components/chat/tools/components/ToolDiffViewer.tsx
+++ b/src/components/chat/tools/components/ToolDiffViewer.tsx
@@ -38,44 +38,44 @@ export const ToolDiffViewer: React.FC = ({
);
return (
-
+
{/* Header */}
-
+
{onFileClick ? (
{filePath}
) : (
-
+
{filePath}
)}
-
+
{badge}
{/* Diff lines */}
-
+
{diffLines.map((diffLine, i) => (
{diffLine.type === 'removed' ? '-' : '+'}
{diffLine.content}
diff --git a/src/components/chat/view/ChatInterface.tsx b/src/components/chat/view/ChatInterface.tsx
index eb888be9..90c1921d 100644
--- a/src/components/chat/view/ChatInterface.tsx
+++ b/src/components/chat/view/ChatInterface.tsx
@@ -1,15 +1,14 @@
import React, { useCallback, useEffect, useRef } from 'react';
-import { QuickSettingsPanel } from '../../quick-settings-panel';
-import { useTasksSettings } from '../../../contexts/TasksSettingsContext';
import { useTranslation } from 'react-i18next';
-import ChatMessagesPane from './subcomponents/ChatMessagesPane';
-import ChatComposer from './subcomponents/ChatComposer';
-import type { ChatInterfaceProps } from '../types/types';
+import { useTasksSettings } from '../../../contexts/TasksSettingsContext';
+import { QuickSettingsPanel } from '../../quick-settings-panel';
+import type { ChatInterfaceProps, Provider } from '../types/types';
import { useChatProviderState } from '../hooks/useChatProviderState';
import { useChatSessionState } from '../hooks/useChatSessionState';
import { useChatRealtimeHandlers } from '../hooks/useChatRealtimeHandlers';
import { useChatComposerState } from '../hooks/useChatComposerState';
-import type { Provider } from '../types/types';
+import ChatMessagesPane from './subcomponents/ChatMessagesPane';
+import ChatComposer from './subcomponents/ChatComposer';
type PendingViewSession = {
@@ -259,7 +258,7 @@ function ChatInterface({
: t('messageTypes.claude');
return (
-
+
{t('projectSelection.startChatWithProvider', {
@@ -274,7 +273,7 @@ function ChatInterface({
return (
<>
-
+
-
-
-
+
+
+
{selectedProvider === 'cursor' ? 'Cursor' : selectedProvider === 'codex' ? 'Codex' : selectedProvider === 'gemini' ? 'Gemini' : 'Claude'}
-
+
.
diff --git a/src/components/chat/view/subcomponents/ChatComposer.tsx b/src/components/chat/view/subcomponents/ChatComposer.tsx
index 6ac150db..35bf7548 100644
--- a/src/components/chat/view/subcomponents/ChatComposer.tsx
+++ b/src/components/chat/view/subcomponents/ChatComposer.tsx
@@ -1,9 +1,3 @@
-import CommandMenu from './CommandMenu';
-import ClaudeStatus from './ClaudeStatus';
-import MicButton from '../../../mic-button/view/MicButton';
-import ImageAttachment from './ImageAttachment';
-import PermissionRequestsBanner from './PermissionRequestsBanner';
-import ChatInputControls from './ChatInputControls';
import { useTranslation } from 'react-i18next';
import type {
ChangeEvent,
@@ -17,7 +11,13 @@ import type {
SetStateAction,
TouchEvent,
} from 'react';
+import MicButton from '../../../mic-button/view/MicButton';
import type { PendingPermissionRequest, PermissionMode, Provider } from '../../types/types';
+import CommandMenu from './CommandMenu';
+import ClaudeStatus from './ClaudeStatus';
+import ImageAttachment from './ImageAttachment';
+import PermissionRequestsBanner from './PermissionRequestsBanner';
+import ChatInputControls from './ChatInputControls';
interface MentionableFile {
name: string;
@@ -169,7 +169,7 @@ export default function ChatComposer({
: '';
return (
-
+
{!hasQuestionPanel && (
)}
-
+
- {!hasQuestionPanel &&