diff --git a/packages/tui/src/feature-plugins/system/diff-viewer-file-tree.tsx b/packages/tui/src/feature-plugins/system/diff-viewer-file-tree.tsx index cb15eaa5034a..291612b86f35 100644 --- a/packages/tui/src/feature-plugins/system/diff-viewer-file-tree.tsx +++ b/packages/tui/src/feature-plugins/system/diff-viewer-file-tree.tsx @@ -85,14 +85,14 @@ export function DiffViewerFileTree(props: DiffViewerFileTreeProps) { backgroundColor={highlighted() ? props.theme.primary : undefined} onMouseUp={() => props.onRowClick?.(row)} > - + {prefix()} diff --git a/packages/tui/src/routes/session/index.tsx b/packages/tui/src/routes/session/index.tsx index 6d77b0ea58fd..06d1e87e0402 100644 --- a/packages/tui/src/routes/session/index.tsx +++ b/packages/tui/src/routes/session/index.tsx @@ -1410,7 +1410,7 @@ function UserMessage(props: { const directory = file.mime === "application/x-directory" return ( - + {directory ? " Directory " : " File "} {file.filename} diff --git a/packages/tui/src/theme/index.ts b/packages/tui/src/theme/index.ts index e8a5f2c5a973..a8c06861765d 100644 --- a/packages/tui/src/theme/index.ts +++ b/packages/tui/src/theme/index.ts @@ -100,16 +100,18 @@ export function selectedForeground(theme: Theme, bg?: RGBA): RGBA { // For transparent backgrounds, calculate contrast based on the actual bg (or fallback to primary) if (theme.background.a === 0) { - const targetColor = bg ?? theme.primary - const { r, g, b } = targetColor - const luminance = 0.299 * r + 0.587 * g + 0.114 * b - return luminance > 0.5 ? RGBA.fromInts(0, 0, 0) : RGBA.fromInts(255, 255, 255) + return contrastForeground(bg ?? theme.primary) } // Fall back to background color return theme.background } +function contrastForeground(bg: RGBA): RGBA { + const luminance = 0.299 * bg.r + 0.587 * bg.g + 0.114 * bg.b + return luminance > 0.5 ? RGBA.fromInts(0, 0, 0) : RGBA.fromInts(255, 255, 255) +} + type HexColor = `#${string}` type RefName = string type Variant = { @@ -275,6 +277,8 @@ export function resolveTheme(theme: ThemeJson, mode: "dark" | "light") { const hasSelectedListItemText = theme.theme.selectedListItemText !== undefined if (hasSelectedListItemText) { resolved.selectedListItemText = resolveColor(theme.theme.selectedListItemText!) + } else if (resolved.background?.a === 0) { + resolved.selectedListItemText = contrastForeground(resolved.primary ?? RGBA.fromInts(0, 0, 0)) } else { // Backward compatibility: if selectedListItemText is not defined, use background color // This preserves the current behavior for all existing themes