diff --git a/frontend/src/components/strategyEvaluation/StrategyEvaluationChart.tsx b/frontend/src/components/strategyEvaluation/StrategyEvaluationChart.tsx index 70d0a9f..7bc0a26 100644 --- a/frontend/src/components/strategyEvaluation/StrategyEvaluationChart.tsx +++ b/frontend/src/components/strategyEvaluation/StrategyEvaluationChart.tsx @@ -181,6 +181,8 @@ const StrategyEvaluationChart: React.FC = ({ const [backtestRunning, setBacktestRunning] = useState(false); const [backtestError, setBacktestError] = useState(null); const [magnifierActive, setMagnifierActive] = useState(false); + const [chartFullscreen, setChartFullscreen] = useState(false); + const chartRootRef = useRef(null); const marketBtnRef = useRef(null); const managerRef = useRef(null); const [internalOverlayVisibility, setInternalOverlayVisibility] = useState( @@ -680,8 +682,47 @@ const StrategyEvaluationChart: React.FC = ({ const selectedBar = bars[selectedBarIndex] ?? null; + useEffect(() => { + const cls = 'seval-chart-fs-lock'; + if (chartFullscreen) { + document.body.classList.add(cls); + } else { + document.body.classList.remove(cls); + } + return () => document.body.classList.remove(cls); + }, [chartFullscreen]); + + useEffect(() => { + if (!chartFullscreen) return; + const onKey = (e: KeyboardEvent) => { + if (e.key !== 'Escape' || isKeyboardTypingTarget(e.target)) return; + setChartFullscreen(false); + }; + document.addEventListener('keydown', onKey); + return () => document.removeEventListener('keydown', onKey); + }, [chartFullscreen]); + + useEffect(() => { + const raf = requestAnimationFrame(() => { + requestAnimationFrame(() => { + const root = chartRootRef.current; + const mgr = managerRef.current; + if (!root || !mgr) return; + const wrap = root.querySelector('.tv-chart-wrap') as HTMLElement | null; + const w = root.clientWidth; + const h = wrap?.clientHeight ?? root.clientHeight; + if (w > 0 && h > 0) mgr.resize(w, h); + mgr.refreshPaneSeparatorOverlay(); + }); + }); + return () => cancelAnimationFrame(raf); + }, [chartFullscreen, bars.length]); + return ( -
+
+ {onOpenAiVerify && (