From 38d6866cad6ff8e980f6dbf29ab90a72eb4caee3 Mon Sep 17 00:00:00 2001 From: SawyerHood Date: Fri, 18 Sep 2026 16:33:06 -0700 Subject: [PATCH] Respect reduced motion for runtime status glyphs --- .../src/components/sidebar/ThreadRow.test.tsx | 19 +++++++++++++++++++ .../components/thread/ThreadStatusGlyph.tsx | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/apps/app/src/components/sidebar/ThreadRow.test.tsx b/apps/app/src/components/sidebar/ThreadRow.test.tsx index c3eff08406..9fed48fde9 100644 --- a/apps/app/src/components/sidebar/ThreadRow.test.tsx +++ b/apps/app/src/components/sidebar/ThreadRow.test.tsx @@ -546,6 +546,25 @@ describe("ThreadRow", () => { expect(Array.from(errorIcon.classList)).not.toContain("animate-shine-icon"); }); + it("disables runtime glyph rotation when reduced motion is requested", () => { + renderThreadRow({ + hasComposerDraft: false, + thread: createThread({ + status: "active", + runtime: { + displayStatus: "active", + hostReconnectGraceExpiresAt: null, + }, + }), + }); + + const runningIcon = screen.getByLabelText("Thread working"); + expect(runningIcon.getAttribute("data-icon")).toBe("Loading"); + expect(Array.from(runningIcon.classList)).toContain( + "motion-reduce:animate-none", + ); + }); + it("keeps the runtime spinner ahead of a plugin status", () => { setPluginThreadRowStatus("thr_test", "composer-status-test", { icon: "AiContentGenerator01", diff --git a/apps/app/src/components/thread/ThreadStatusGlyph.tsx b/apps/app/src/components/thread/ThreadStatusGlyph.tsx index 25fdd7de20..d29dd17c37 100644 --- a/apps/app/src/components/thread/ThreadStatusGlyph.tsx +++ b/apps/app/src/components/thread/ThreadStatusGlyph.tsx @@ -234,7 +234,7 @@ export function ThreadStatusGlyph({