fix: defer xterm fit to ResizeObserver ticks

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
tao.chen
2026-07-03 11:03:05 +08:00
co-authored by Claude
parent 70799a5df8
commit b3d0b63f4b
+22 -2
View File
@@ -34,7 +34,6 @@ export function TerminalPanel() {
terminal.writeln("$ pnpm test"); terminal.writeln("$ pnpm test");
terminal.writeln("mock: 3 files checked, 0 failures"); terminal.writeln("mock: 3 files checked, 0 failures");
terminal.write("$ "); terminal.write("$ ");
fitAddon.fit();
} catch { } catch {
setFailed(true); setFailed(true);
terminal?.dispose(); terminal?.dispose();
@@ -42,13 +41,34 @@ export function TerminalPanel() {
return; return;
} }
let rafId: number | undefined;
const scheduleFit = () => {
if (rafId !== undefined) return;
rafId = requestAnimationFrame(() => {
rafId = undefined;
try {
fitAddon?.fit();
} catch {
// fit() throws when the container has zero dimensions; ignore
// and wait for the next ResizeObserver tick.
}
});
};
const resizeObserver = new ResizeObserver(scheduleFit);
resizeObserver.observe(container);
const handleResize = () => { const handleResize = () => {
fitAddon?.fit(); scheduleFit();
}; };
window.addEventListener("resize", handleResize); window.addEventListener("resize", handleResize);
return () => { return () => {
if (rafId !== undefined) {
cancelAnimationFrame(rafId);
}
resizeObserver.disconnect();
window.removeEventListener("resize", handleResize); window.removeEventListener("resize", handleResize);
terminal?.dispose(); terminal?.dispose();
fitAddon?.dispose(); fitAddon?.dispose();