fix(terminal): preserve animation-frame first fit

This commit is contained in:
Gabriel Brown
2026-07-10 17:06:33 -04:00
parent 75d06394ce
commit feb3723753
3 changed files with 47 additions and 4 deletions
+9
View File
@@ -22,3 +22,12 @@ Implemented terminal fit scheduling for the first animation frame, `document.fon
- No implementation concerns found.
- The component-suite worktree dependency-resolution issue remains external to this task.
## Reviewer follow-up: preserve the animation-frame first fit
- RED: `cd apps/next && bun run test:unit -- terminal-fit` exited 1 with 1 failed / 2 passed. The new `waits for the first animation frame before font-triggered fits` regression expected zero calls before rAF, but `fit` had already been called 2 times after flushing the resolved font promises.
- GREEN: after gating both font-triggered refits on the initial rAF fit promise, `cd apps/next && bun run test:unit -- terminal-fit` exited 0 with 1 file / 3 tests passed.
- Final focused verification: `cd apps/next && bun run test:unit -- terminal-fit` exited 0 with 1 file / 3 tests passed.
- Final full unit verification: `cd apps/next && bun run test:unit` exited 0 with 4 files / 11 tests passed.
- Final type verification: `cd apps/next && bun run typecheck` exited 0.
- Final formatting verification: `cd apps/next && bun run format` exited 0; all matched files use Prettier formatting.
@@ -12,10 +12,17 @@ export const scheduleTerminalFits = (deps: {
deps.sendResize();
};
deps.raf(refit);
void deps.fontsReady.then(refit).catch(() => undefined);
void deps
.loadNerdFont()
const initialFit = new Promise<void>((resolve) => {
deps.raf(() => {
refit();
resolve();
});
});
void Promise.all([deps.fontsReady, initialFit])
.then(refit)
.catch(() => undefined);
void Promise.all([deps.loadNerdFont(), initialFit])
.then(refit)
.catch(() => undefined);
};
+27
View File
@@ -7,6 +7,33 @@ const flush = async () => {
};
describe('scheduleTerminalFits', () => {
test('waits for the first animation frame before font-triggered fits', async () => {
const fit = vi.fn();
const sendResize = vi.fn();
let rafCb: (() => void) | undefined;
scheduleTerminalFits({
fit,
sendResize,
fontsReady: Promise.resolve(),
loadNerdFont: () => Promise.resolve(),
raf: (cb) => {
rafCb = cb;
},
isAborted: () => false,
});
await flush();
expect(fit).not.toHaveBeenCalled();
expect(sendResize).not.toHaveBeenCalled();
rafCb?.();
await flush();
expect(fit).toHaveBeenCalledTimes(3);
expect(sendResize).toHaveBeenCalledTimes(3);
});
test('fits in rAF and again after fonts.ready and nerd-font load', async () => {
const fit = vi.fn();
const sendResize = vi.fn();