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 ? ( -
- {`${persona.name} + {`${persona.name}
) : ( -
- +
+
)}
@@ -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 && (

-
+
AI Active
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;