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("mock: 3 files checked, 0 failures");
terminal.write("$ ");
fitAddon.fit();
} catch {
setFailed(true);
terminal?.dispose();
@@ -42,13 +41,34 @@ export function TerminalPanel() {
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 = () => {
fitAddon?.fit();
scheduleFit();
};
window.addEventListener("resize", handleResize);
return () => {
if (rafId !== undefined) {
cancelAnimationFrame(rafId);
}
resizeObserver.disconnect();
window.removeEventListener("resize", handleResize);
terminal?.dispose();
fitAddon?.dispose();