diff --git a/packages/core/src/renderer.ts b/packages/core/src/renderer.ts index 8e5c9946a..068494e24 100644 --- a/packages/core/src/renderer.ts +++ b/packages/core/src/renderer.ts @@ -2110,7 +2110,9 @@ export class CliRenderer extends EventEmitter implements RenderContext { this.enableMouse() } - this.currentRenderBuffer.clear(this.backgroundColor) + // Normal diff skips unchanged cells leaving transparency visible. force=true repaints all. + this.lib.render(this.rendererPtr, true) + this._controlState = this._previousControlState if ( diff --git a/packages/core/src/tests/renderer.control.test.ts b/packages/core/src/tests/renderer.control.test.ts index 7d71f4fde..f919d46c3 100644 --- a/packages/core/src/tests/renderer.control.test.ts +++ b/packages/core/src/tests/renderer.control.test.ts @@ -116,6 +116,27 @@ test("resume() restores previous AUTO_STARTED state and restarts rendering", () expect(renderer.isRunning).toBe(true) }) +test("resume() triggers a force render to fix transparency artifacts", () => { + renderer.start() + renderer.suspend() + + let forceRenderCalled = false + + // @ts-expect-error - lib is private + const originalRender = renderer.lib.render.bind(renderer.lib) + // @ts-expect-error - lib is private + renderer.lib.render = (ptr: any, force: boolean) => { + if (force) forceRenderCalled = true + return originalRender(ptr, force) + } + + renderer.resume() + expect(forceRenderCalled).toBe(true) + + // @ts-expect-error - lib is private + renderer.lib.render = originalRender +}) + test("stop() transitions to EXPLICIT_STOPPED and stops rendering", () => { renderer.start() expect(renderer.isRunning).toBe(true)