From 4836356c178c1d7f665cb1fa31308bee2ca344ce Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Thu, 13 Aug 2026 15:56:36 -0400 Subject: [PATCH] fix(tui): stop disabled tab pulse rendering (#42346) --- packages/tui/src/component/tab-pulse.tsx | 2 +- .../tui/test/component/tab-pulse.test.tsx | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/packages/tui/src/component/tab-pulse.tsx b/packages/tui/src/component/tab-pulse.tsx index 1ae66a8386..98176c7e17 100644 --- a/packages/tui/src/component/tab-pulse.tsx +++ b/packages/tui/src/component/tab-pulse.tsx @@ -190,7 +190,7 @@ class PulseState { } get live() { - return this.active || this.breathing || this.envelopes.some(envelopeActive) + return this.enabled && (this.active || this.breathing || this.envelopes.some(envelopeActive)) } get running() { diff --git a/packages/tui/test/component/tab-pulse.test.tsx b/packages/tui/test/component/tab-pulse.test.tsx index ad0b547e14..22d527aab1 100644 --- a/packages/tui/test/component/tab-pulse.test.tsx +++ b/packages/tui/test/component/tab-pulse.test.tsx @@ -1,6 +1,10 @@ import { expect, test } from "bun:test" +/** @jsxImportSource @opentui/solid */ import { RGBA } from "@opentui/core" +import { testRender } from "@opentui/solid" +import { createSignal } from "solid-js" import { + TabPulse, blendTabPulseColor, completionPulseOpacity, glowIgnitionLevel, @@ -9,6 +13,26 @@ import { } from "../../src/component/tab-pulse" import { tint } from "../../src/theme/color" +test("a disabled pulse stays idle when it becomes active", async () => { + const background = RGBA.fromHex("#101010") + const [active, setActive] = createSignal(false) + const app = await testRender( + () => , + { width: 8, height: 1 }, + ) + + try { + await app.renderOnce() + expect(app.renderer.root.liveCount).toBe(0) + + setActive(true) + await app.renderOnce() + expect(app.renderer.root.liveCount).toBe(0) + } finally { + app.renderer.destroy() + } +}) + test("completion pulse rises quickly and fades over the remaining duration", () => { expect(completionPulseOpacity(0)).toBe(0) expect(completionPulseOpacity(0.06)).toBeCloseTo(0.5)