From 21dac524f384a8519734ef08c35410301e712151 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Sat, 12 Sep 2026 17:20:09 -0400 Subject: [PATCH] fix(tui): defer palette probe until first frame --- packages/tui/src/app.tsx | 2 -- packages/tui/src/context/theme.tsx | 8 +++----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/tui/src/app.tsx b/packages/tui/src/app.tsx index 976eef49af1..ba0348901eb 100644 --- a/packages/tui/src/app.tsx +++ b/packages/tui/src/app.tsx @@ -285,8 +285,6 @@ export const run = Effect.fn("Tui.run")(function* (input: TuiInput) { ) renderer.once("destroy", () => shutdown.openUnsafe()) yield* Effect.tryPromise(async () => { - // Prewarm palette before ThemeProvider mounts so `system` theme avoids a first-paint fallback flash. - void renderer.getPalette({ size: 16 }).catch(() => undefined) const mode = handoff?.mode ?? (await renderer.waitForThemeMode(1000)) ?? "dark" if (renderer.isDestroyed) return diff --git a/packages/tui/src/context/theme.tsx b/packages/tui/src/context/theme.tsx index a8c9984f08c..741ba6ce96a 100644 --- a/packages/tui/src/context/theme.tsx +++ b/packages/tui/src/context/theme.tsx @@ -184,11 +184,9 @@ const themeContext = createSimpleContext({ } onMount(() => { - const systemTheme = resolveSystemTheme(store.mode) - void Promise.allSettled([ - store.active === "system" ? systemTheme : Promise.resolve(), - syncCustomThemes(), - ]).finally(() => { + // Terminal palette queries serialize with frame output. Use the mode fallback for the first paint; + // App asks for the system palette after that frame and updates the theme in place. + void syncCustomThemes().finally(() => { valuesV2() setStore("ready", true) })