Skip to content

Commit ae76878

Browse files
committed
Clean up theme usage in components
- Remove resolveThemeColor calls from components (handled in theme building) - Components now use theme properties directly with ?? fallbacks - Simplify AgentBranchItem and ToolCallItem props (remove showBorder, toggleEnabled) - Auto-resolve 'default' color values to actual colors during theme building - ThemeColor is always a string (never undefined or 'default') Components are now simpler and just consume ready-to-use theme values.
1 parent fa47525 commit ae76878

File tree

5 files changed

+78
-105
lines changed

5 files changed

+78
-105
lines changed

cli/src/components/agent-branch-item.tsx

Lines changed: 24 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ import { TextAttributes, type BorderCharacters } from '@opentui/core'
22
import React, { type ReactNode } from 'react'
33

44
import { RaisedPill } from './raised-pill'
5-
6-
import type { ChatTheme } from '../utils/theme-system'
5+
import { useTheme } from '../hooks/use-theme'
76

87
interface AgentBranchItemProps {
98
name: string
@@ -18,10 +17,7 @@ interface AgentBranchItemProps {
1817
statusLabel?: string
1918
statusColor?: string
2019
statusIndicator?: string
21-
theme: ChatTheme
2220
onToggle?: () => void
23-
showBorder?: boolean
24-
toggleEnabled?: boolean
2521
titleSuffix?: string
2622
}
2723

@@ -52,24 +48,10 @@ export const AgentBranchItem = ({
5248
statusLabel,
5349
statusColor,
5450
statusIndicator = '●',
55-
theme,
5651
onToggle,
57-
showBorder = true,
58-
toggleEnabled = true,
5952
titleSuffix,
6053
}: AgentBranchItemProps) => {
61-
const resolveFg = (
62-
color?: string | null,
63-
fallback?: string | null,
64-
): string | undefined => {
65-
if (color && color !== 'default') return color
66-
if (fallback && fallback !== 'default') return fallback
67-
return undefined
68-
}
69-
const fallbackTextColor =
70-
resolveFg(theme.agentContentText) ??
71-
resolveFg(theme.chromeText) ??
72-
'#d1d5e5'
54+
const theme = useTheme()
7355

7456
const baseTextAttributes = theme.messageTextAttributes ?? 0
7557
const getAttributes = (extra: number = 0): number | undefined => {
@@ -80,19 +62,12 @@ export const AgentBranchItem = ({
8062
const isExpanded = !isCollapsed
8163
const toggleFrameColor = isExpanded
8264
? theme.agentToggleExpandedBg
83-
: theme.agentResponseCount ?? theme.agentToggleHeaderBg
84-
const toggleIconColor = isStreaming
85-
? theme.statusAccent
86-
: theme.chromeText ?? toggleFrameColor
87-
const toggleLabelColor = theme.chromeText ?? toggleFrameColor
88-
const toggleIndicator = toggleEnabled ? (isCollapsed ? '▸ ' : '▾ ') : ''
65+
: theme.agentResponseCount
66+
const toggleIconColor = isStreaming ? theme.statusAccent : theme.chromeText
67+
const toggleIndicator = onToggle ? (isCollapsed ? '▸ ' : '▾ ') : ''
8968
const toggleLabel = `${branchChar}${toggleIndicator}`
9069
const collapseButtonFrame = theme.agentToggleExpandedBg
9170
const collapseButtonText = collapseButtonFrame
92-
const toggleFrameFg = resolveFg(toggleFrameColor, fallbackTextColor)
93-
const toggleIconFg = resolveFg(toggleIconColor, fallbackTextColor)
94-
const toggleLabelFg = resolveFg(toggleLabelColor, fallbackTextColor)
95-
const headerFg = resolveFg(theme.agentToggleHeaderText, fallbackTextColor)
9671
const statusText =
9772
statusLabel && statusLabel.length > 0
9873
? statusIndicator === '✓'
@@ -149,7 +124,7 @@ export const AgentBranchItem = ({
149124
if (isTextRenderable(value)) {
150125
return (
151126
<text
152-
fg={resolveFg(theme.agentText)}
127+
fg={theme.agentText}
153128
key="expanded-text"
154129
attributes={getAttributes()}
155130
>
@@ -204,10 +179,10 @@ export const AgentBranchItem = ({
204179
}}
205180
>
206181
<box
207-
border={showBorder}
208-
borderStyle={showBorder ? 'single' : undefined}
209-
borderColor={showBorder ? toggleFrameFg ?? undefined : undefined}
210-
customBorderChars={showBorder ? containerBorderChars : undefined}
182+
border
183+
borderStyle="single"
184+
borderColor={toggleFrameColor}
185+
customBorderChars={containerBorderChars}
211186
style={{
212187
flexDirection: 'column',
213188
gap: 0,
@@ -230,9 +205,9 @@ export const AgentBranchItem = ({
230205
width: '100%',
231206
}}
232207
>
233-
<text {...(headerFg ? { fg: headerFg } : undefined)}>Prompt</text>
208+
<text fg={theme.agentToggleHeaderText}>Prompt</text>
234209
<text
235-
fg={resolveFg(theme.agentText)}
210+
fg={theme.agentText}
236211
style={{ wrapMode: 'word' }}
237212
attributes={getAttributes()}
238213
>
@@ -244,27 +219,27 @@ export const AgentBranchItem = ({
244219
style={{
245220
flexDirection: 'row',
246221
alignItems: 'center',
247-
paddingLeft: showBorder ? 1 : 0,
248-
paddingRight: showBorder ? 1 : 0,
222+
paddingLeft: 1,
223+
paddingRight: 1,
249224
paddingTop: 0,
250225
paddingBottom: isCollapsed ? 0 : 1,
251226
width: '100%',
252227
}}
253-
onMouseDown={toggleEnabled && onToggle ? onToggle : undefined}
228+
onMouseDown={onToggle}
254229
>
255230
<text style={{ wrapMode: 'none' }}>
256-
<span {...(toggleIconFg ? { fg: toggleIconFg } : undefined)}>
231+
<span fg={toggleIconColor}>
257232
{toggleLabel}
258233
</span>
259234
<span
260-
{...(toggleLabelFg ? { fg: toggleLabelFg } : undefined)}
235+
fg={theme.chromeText}
261236
attributes={isExpanded ? TextAttributes.BOLD : undefined}
262237
>
263238
{name}
264239
</span>
265240
{titleSuffix ? (
266241
<span
267-
{...(toggleLabelFg ? { fg: toggleLabelFg } : undefined)}
242+
fg={theme.chromeText}
268243
attributes={TextAttributes.BOLD}
269244
>
270245
{` ${titleSuffix}`}
@@ -292,10 +267,7 @@ export const AgentBranchItem = ({
292267
}}
293268
>
294269
<text
295-
fg={resolveFg(
296-
isStreaming ? theme.agentText : theme.agentResponseCount,
297-
fallbackTextColor,
298-
)}
270+
fg={isStreaming ? theme.agentText : theme.agentResponseCount}
299271
attributes={getAttributes(TextAttributes.ITALIC)}
300272
>
301273
{isStreaming ? streamingPreview : finishedPreview}
@@ -321,19 +293,19 @@ export const AgentBranchItem = ({
321293
marginBottom: content ? 1 : 0,
322294
}}
323295
>
324-
<text {...(headerFg ? { fg: headerFg } : undefined)}>
296+
<text fg={theme.agentToggleHeaderText}>
325297
Prompt
326298
</text>
327299
<text
328-
fg={resolveFg(theme.agentText)}
300+
fg={theme.agentText}
329301
style={{ wrapMode: 'word' }}
330302
attributes={getAttributes()}
331303
>
332304
{prompt}
333305
</text>
334306
{content && (
335307
<text
336-
{...(headerFg ? { fg: headerFg } : undefined)}
308+
fg={theme.agentToggleHeaderText}
337309
style={{ marginTop: 1 }}
338310
>
339311
Response
@@ -342,12 +314,12 @@ export const AgentBranchItem = ({
342314
</box>
343315
)}
344316
{renderExpandedContent(content)}
345-
{toggleEnabled && onToggle && (
317+
{onToggle && (
346318
<box
347319
style={{
348320
alignSelf: 'flex-end',
349321
marginTop: content ? 0 : 1,
350-
paddingRight: showBorder ? 1 : 0,
322+
paddingRight: 1,
351323
paddingBottom: 0,
352324
marginBottom: 0,
353325
}}

cli/src/components/message-block.tsx

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import {
1818
import type { ElapsedTimeTracker } from '../hooks/use-elapsed-time'
1919
import type { ContentBlock } from '../types/chat'
2020
import type { ChatTheme, ThemeColor } from '../types/theme-system'
21-
import { resolveThemeColor } from '../utils/theme-system'
2221

2322
const trimTrailingNewlines = (value: string): string =>
2423
value.replace(/[\r\n]+$/g, '')
@@ -73,10 +72,7 @@ export const MessageBlock = ({
7372
onToggleCollapsed,
7473
registerAgentRef,
7574
}: MessageBlockProps): ReactNode => {
76-
const resolvedTextColor =
77-
resolveThemeColor(textColor, theme.messageAiText) ??
78-
resolveThemeColor(theme.messageAiText, '#cbd5f5') ??
79-
'#cbd5f5'
75+
const resolvedTextColor = textColor ?? theme.messageAiText
8076

8177
// Get elapsed time from timer for streaming AI messages
8278
const elapsedSeconds = timer.elapsedSeconds
@@ -239,7 +235,7 @@ export const MessageBlock = ({
239235
? null
240236
: (
241237
<text
242-
fg={resolveThemeColor(theme.agentText)}
238+
fg={theme.agentText}
243239
style={{ wrapMode: 'word' }}
244240
attributes={
245241
theme.messageTextAttributes && theme.messageTextAttributes !== 0
@@ -280,7 +276,6 @@ export const MessageBlock = ({
280276
branchChar={branchChar}
281277
streamingPreview={streamingPreview}
282278
finishedPreview={finishedPreview}
283-
theme={theme}
284279
onToggle={() => onToggleCollapsed(toolBlock.toolCallId)}
285280
titleSuffix={toolRenderConfig.path}
286281
/>
@@ -361,7 +356,6 @@ export const MessageBlock = ({
361356
statusLabel={statusLabel ?? undefined}
362357
statusColor={statusColor}
363358
statusIndicator={statusIndicator}
364-
theme={theme}
365359
onToggle={() => onToggleCollapsed(agentBlock.agentId)}
366360
/>
367361
</box>
@@ -446,7 +440,6 @@ export const MessageBlock = ({
446440
branchChar=""
447441
streamingPreview=""
448442
finishedPreview={finishedPreview}
449-
theme={theme}
450443
onToggle={() => onToggleCollapsed(agentListBlock.id)}
451444
/>
452445
</box>
@@ -488,16 +481,13 @@ export const MessageBlock = ({
488481
typeof (nestedBlock as any).color === 'string'
489482
? ((nestedBlock as any).color as string)
490483
: undefined
491-
const nestedTextColor = resolveThemeColor(
492-
explicitColor,
493-
theme.agentText,
494-
)
484+
const nestedTextColor = explicitColor ?? theme.agentText
495485
nodes.push(
496486
<text
497487
key={renderKey}
498488
style={{
499489
wrapMode: 'word',
500-
fg: nestedTextColor ?? theme.agentText,
490+
fg: nestedTextColor,
501491
marginLeft: Math.max(0, indentLevel * 2),
502492
marginTop,
503493
marginBottom,
@@ -607,11 +597,11 @@ export const MessageBlock = ({
607597
typeof (block as any).color === 'string'
608598
? ((block as any).color as string)
609599
: undefined
610-
const blockTextColor = resolveThemeColor(explicitColor, resolvedTextColor)
600+
const blockTextColor = explicitColor ?? resolvedTextColor
611601
return (
612602
<text
613603
key={renderKey}
614-
style={{ wrapMode: 'word', fg: blockTextColor ?? resolvedTextColor, marginTop, marginBottom }}
604+
style={{ wrapMode: 'word', fg: blockTextColor, marginTop, marginBottom }}
615605
>
616606
{renderedContent}
617607
</text>

0 commit comments

Comments
 (0)