diff --git a/apps/webuiapps/src/components/ChatPanel/ChatSubComponents.tsx b/apps/webuiapps/src/components/ChatPanel/ChatSubComponents.tsx new file mode 100644 index 0000000..57798a4 --- /dev/null +++ b/apps/webuiapps/src/components/ChatPanel/ChatSubComponents.tsx @@ -0,0 +1,198 @@ +/** + * Helper sub-components extracted from ChatPanel + * + * StageIndicator, ActionsTaken, CharacterAvatar, renderMessageContent + */ + +import React, { useState, useEffect, useCallback, memo, useRef } from 'react'; +import { ChevronDown, ChevronRight } from 'lucide-react'; +import type { CharacterConfig } from '@/lib/characterManager'; +import { resolveEmotionMedia } from '@/lib/characterManager'; +import type { ModManager } from '@/lib/modManager'; +import styles from './index.module.scss'; + +// --------------------------------------------------------------------------- +// Render message content — formats (action text) as styled spans +// --------------------------------------------------------------------------- + +export function renderMessageContent(content: string): React.ReactNode { + const parts = content.split(/(\([^)]+\))/g); + return parts.map((part, i) => { + if (/^\([^)]+\)$/.test(part)) { + return ( + + {part} + + ); + } + return part; + }); +} + +// --------------------------------------------------------------------------- +// Stage Indicator +// --------------------------------------------------------------------------- + +export const StageIndicator: React.FC<{ modManager: ModManager | null }> = ({ modManager }) => { + if (!modManager) return null; + + const total = modManager.stageCount; + const current = modManager.currentStageIndex; + const finished = modManager.isFinished; + + return ( +