// thinking-overlay.jsx — 質問間の「考えている」演出(約20秒) // // ・スワイプした方向(A/B)から液体メタルが流れ込み、中央で粒子の渦 // ・5秒ごとにメッセージが切り替わる(4ステップ) // ・最後の0.8秒でフェードアウト→次の質問へ const THINKING_PHASES = [ // qIdx ごとに4つのメッセージ(5秒ずつ) ["選択を読み取っています", "感情の輪郭を捉えました", "深層を辿っています", "次の問いを準備中"], ["印象を記録しました", "好みの粒度を上げています", "感覚の層を重ねています", "もう少しで見えてきます"], ["潜在意識に触れました", "気配を編み込んでいます", "解像度が高まっています", "残りわずかです"], ["核に近づいています", "あなたの色が滲んでいます", "輪郭が定まりつつあります", "次の扉を開きます"], ]; function ThinkingOverlay({ choice, tags, qIdx }) { const phaseSet = THINKING_PHASES[qIdx % THINKING_PHASES.length]; const [msgIdx, setMsgIdx] = React.useState(0); React.useEffect(() => { setMsgIdx(0); const ids = []; // 5秒、10秒、15秒の3回切り替え [5000, 10000, 15000].forEach((ms, i) => { ids.push(setTimeout(() => setMsgIdx(i + 1), ms)); }); return () => ids.forEach(clearTimeout); }, [qIdx]); const msg = phaseSet[msgIdx]; const firstTag = tags ? Object.keys(tags)[0] : null; const totalSteps = phaseSet.length; return (
{/* 液体メタルが選択方向から流れ込む(ループ) */}
{/* 中央の渦(粒子化した液体メタル) */}
{Array.from({ length: 8 }).map((_, i) => ( ))}
{/* メッセージ(5秒ごとにフェード切替) */}
{msg}
{/* メッセージ進行ドット */}
{Array.from({ length: totalSteps }).map((_, i) => ( ))}
{/* 取得タグの小さなチップ */} {firstTag && (
+ {firstTag}
)} {/* 全体タイムラインのプログレスバー */}
); } window.ThinkingOverlay = ThinkingOverlay;