diff --git a/src/components/ChatMessage.tsx b/src/components/ChatMessage.tsx
index 027140e9..0b00610c 100755
--- a/src/components/ChatMessage.tsx
+++ b/src/components/ChatMessage.tsx
@@ -79,7 +79,7 @@ const ChatMessage = ({ message, persona, toggleHighlight, participants = [], foc
id={`message-${message.id}`}
className={cn(
"flex items-start p-3 rounded-lg transition-colors",
- message.highlighted ? "bg-amber-50 border border-amber-200" : "hover:bg-slate-50",
+ message.highlighted ? "bg-amber-500/10 border border-amber-500/30" : "hover:bg-white/5",
isModerator ? "border-l-4 border-l-primary pl-4" : "",
isFacilitator ? "border-l-4 border-l-green-500 pl-4" : ""
)}
@@ -93,20 +93,20 @@ const ChatMessage = ({ message, persona, toggleHighlight, participants = [], foc
) : isFacilitator ? (
-
-
+
+
) : persona ? (
-
-
})
+
) : (
-
@@ -123,12 +123,12 @@ const ChatMessage = ({ message, persona, toggleHighlight, participants = [], foc
)}
-
+
{message.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}
-
+
{!message.text || message.text.trim() === '' || message.text === '...' ? (
[No response content - AI generation may have failed]
@@ -140,12 +140,12 @@ const ChatMessage = ({ message, persona, toggleHighlight, participants = [], foc
{/* Display creative asset if this is a moderator/facilitator message with an asset */}
{hasCreativeAsset && assetInfo && (
-
+
-
- Creative Asset
+
+ Creative Asset
{assetInfo.displayReference !== assetInfo.filename && (
- ({assetInfo.displayReference})
+ ({assetInfo.displayReference})
)}
![]()
+
{effectiveAiModeActive ? (
@@ -1229,21 +1229,21 @@ const DiscussionPanel = ({
/>
{/* Control panel - pinned to bottom */}
-
+
{/* Show selected file indicator */}
{selectedFile && (
-
+
-
-
{selectedFile.name}
-
({(selectedFile.size / 1024 / 1024).toFixed(1)} MB)
+
+
{selectedFile.name}
+
({(selectedFile.size / 1024 / 1024).toFixed(1)} MB)
@@ -1298,7 +1298,7 @@ const DiscussionPanel = ({
-
+
{isSpeaking ? 'Speaking...' :
effectiveAiModeActive ? 'AI mode active' :
'Manual moderation mode'}
@@ -1313,7 +1313,7 @@ const DiscussionPanel = ({
className={`hover-transition ${
effectiveAiModeActive
? 'bg-red-50 text-red-600 hover:bg-red-100'
- : 'bg-blue-50 text-blue-600 hover:bg-blue-100'
+ : 'bg-blue-500/10 text-blue-400 hover:bg-blue-500/20'
}`}
title={effectiveAiModeActive ? "Stop AI mode and return to manual" : "Start autonomous AI conversation"}
>
@@ -1346,7 +1346,7 @@ const DiscussionPanel = ({
scrollToBottom();
}
}}
- className={`hover-transition ${autoScroll ? 'bg-blue-50 text-blue-600 hover:bg-blue-100' : ''}`}
+ className={`hover-transition ${autoScroll ? 'bg-blue-500/10 text-blue-400 hover:bg-blue-500/20' : ''}`}
title={autoScroll ? 'Disable auto-scroll' : 'Enable auto-scroll'}
>
@@ -1386,7 +1386,7 @@ const DiscussionPanel = ({
{/* Show AI mode status and controls */}
{effectiveAiModeActive && (
-
+
diff --git a/src/components/focus-group-session/ModeSwitchMarker.tsx b/src/components/focus-group-session/ModeSwitchMarker.tsx
index 7cffe05b..3169f5c7 100755
--- a/src/components/focus-group-session/ModeSwitchMarker.tsx
+++ b/src/components/focus-group-session/ModeSwitchMarker.tsx
@@ -25,29 +25,29 @@ const ModeSwitchMarker = ({ modeEvent }: ModeSwitchMarkerProps) => {
const getEventColor = (eventType: string) => {
switch (eventType) {
case 'ai_mode_started':
- return 'text-blue-600';
+ return 'text-blue-400';
case 'manual_mode_started':
- return 'text-slate-600';
+ return 'text-muted-foreground';
case 'ai_session_concluded':
- return 'text-green-600';
+ return 'text-green-400';
default:
- return 'text-gray-600';
+ return 'text-muted-foreground';
}
};
return (
-
-
+
+
{getEventText(modeEvent.event_type)}
- at
+ at
{formatTime(modeEvent.timestamp)}
-
+
);
};
-export default ModeSwitchMarker;
\ No newline at end of file
+export default ModeSwitchMarker;
diff --git a/src/components/focus-group-session/ReasoningPanel.tsx b/src/components/focus-group-session/ReasoningPanel.tsx
index 2945ca78..b707c972 100755
--- a/src/components/focus-group-session/ReasoningPanel.tsx
+++ b/src/components/focus-group-session/ReasoningPanel.tsx
@@ -18,34 +18,34 @@ interface ReasoningPanelProps {
reasoningHistory: ReasoningEntry[];
isVisible: boolean;
onToggle: () => void;
- isAiMode?: boolean; // Whether the focus group is in AI mode
+ isAiMode?: boolean;
}
const ActionIcon = ({ action }: { action: string }) => {
switch (action) {
case 'moderator_speak':
- return
;
+ return
;
case 'participant_respond':
- return
;
+ return
;
case 'participant_interaction':
return
;
case 'probe_trigger':
- return
;
+ return
;
case 'end_session':
- return
;
+ return
;
default:
- return
;
+ return
;
}
};
const StatusIcon = ({ status }: { status: string }) => {
switch (status) {
case 'success':
- return
;
+ return
;
case 'error':
- return
;
+ return
;
case 'pending':
- return
;
+ return
;
default:
return null;
}
@@ -75,10 +75,10 @@ const ReasoningEntry = ({ entry, isLatest }: { entry: ReasoningEntry; isLatest:
const [isExpanded, setIsExpanded] = useState(isLatest);
return (
-
+
-
+
@@ -89,7 +89,7 @@ const ReasoningEntry = ({ entry, isLatest }: { entry: ReasoningEntry; isLatest:
-
+
{formatTimestamp(entry.timestamp)}
@@ -101,9 +101,9 @@ const ReasoningEntry = ({ entry, isLatest }: { entry: ReasoningEntry; isLatest:
)}
{isExpanded ? (
-
+
) : (
-
+
)}
@@ -113,31 +113,31 @@ const ReasoningEntry = ({ entry, isLatest }: { entry: ReasoningEntry; isLatest:
-
AI Reasoning:
-
+
AI Reasoning:
+
"{entry.reasoning}"
-
+
{entry.details && Object.keys(entry.details).length > 0 && (
-
Details:
-
+
Details:
+
{JSON.stringify(entry.details, null, 2)}
)}
-
+
{entry.execution_result && (
-
+
Execution Result:
-
+
{entry.execution_result.error ? (
-
Error: {entry.execution_result.error}
+
Error: {entry.execution_result.error}
) : (
-
+
{entry.execution_result.message || 'Success'}
)}
@@ -155,10 +155,8 @@ const ReasoningEntry = ({ entry, isLatest }: { entry: ReasoningEntry; isLatest:
const ReasoningPanel = ({ reasoningHistory, isVisible, onToggle, isAiMode = false }: ReasoningPanelProps) => {
const [autoScroll, setAutoScroll] = useState(true);
- // Auto-expand latest entry when new reasoning arrives
useEffect(() => {
if (autoScroll && reasoningHistory.length > 0) {
- // Scroll to top of reasoning panel when new entry arrives
const reasoningPanel = document.getElementById('reasoning-panel-content');
if (reasoningPanel) {
reasoningPanel.scrollTop = 0;
@@ -167,10 +165,10 @@ const ReasoningPanel = ({ reasoningHistory, isVisible, onToggle, isAiMode = fals
}, [reasoningHistory.length, autoScroll]);
return (
-
+
-
+
@@ -188,27 +186,26 @@ const ReasoningPanel = ({ reasoningHistory, isVisible, onToggle, isAiMode = fals
)}
{isVisible ? (
-
+
) : (
-
+
)}
-
+
{isAiMode ? (
- // AI Mode: Show reasoning history
reasoningHistory.length === 0 ? (
-
-
+
+
No AI decisions yet
-
+
Reasoning will appear here when the AI makes decisions
) : (
-
@@ -223,14 +220,13 @@ const ReasoningPanel = ({ reasoningHistory, isVisible, onToggle, isAiMode = fals
)
) : (
- // Manual Mode: Show status and guidance
-
-
-
Manual Moderation Mode
-
+
+
+
Manual Moderation Mode
+
You are currently moderating the discussion manually.
-
+
Switch to AI Mode to see automated reasoning and decisions.
@@ -242,4 +238,4 @@ const ReasoningPanel = ({ reasoningHistory, isVisible, onToggle, isAiMode = fals
);
};
-export default ReasoningPanel;
\ No newline at end of file
+export default ReasoningPanel;