fix: defer xterm fit to ResizeObserver ticks
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user