on main help sign in
chore(styles): clean up theme definitions
commit8ebab21f60d8b5471398422a13a0a44664fb3ac5 authorChristian Rocha <christian@rocha.is> dateMon 27 Apr 2026, 21:46 (6 months ago) parent64c47cb
2 files changed+369−409
internal/ui/styles/quickstyle.go+325−361 internal/ui/styles/themes.go+44−48
internal/ui/styles/quickstyle.go+325−361
@@ -20,41 +20,39 @@ type quickStyleOpts struct {
2020 // Brand.
2121 primary color.Color
2222 secondary color.Color
23− tertiary color.Color
23+ accent color.Color
2424
25− // Foregrounds.
26− fgBase color.Color
27− fgMuted color.Color
28− fgHalfMuted color.Color
29− fgSubtle color.Color
25+ // Default foreground and background colors.
26+ fgBase color.Color
27+ bgBase color.Color
28+
29+ // Low-contrast dividers, separators, and rule lines.
30+ separator color.Color
31+
32+ fgSubtle color.Color
33+ fgMoreSubtle color.Color
34+ fgMostSubtle color.Color
3035
3136 // Contrast pairings: foregrounds designed to sit on top of a
3237 // matching background role.
3338 onPrimary color.Color // foreground on primary backgrounds.
34− onAccent color.Color // foreground on saturated status/accent backgrounds.
35−
36− // Backgrounds.
37− bgBase color.Color
38− bgBaseLighter color.Color
39− bgSubtle color.Color
40− bgOverlay color.Color
41−
42− // Borders.
43− border color.Color
44− borderFocus color.Color
45−
46− // Status.
47− danger color.Color
48− error color.Color
49− warning color.Color
50− warningStrong color.Color
51− busy color.Color
52− info color.Color
53− infoSubtle color.Color
54− infoMuted color.Color
55− success color.Color
56− successSubtle color.Color
57− successMuted color.Color
39+
40+ bgMostVisible color.Color
41+ bgLessVisible color.Color
42+ bgLeastVisible color.Color
43+
44+ // Statuses.
45+ destructive color.Color
46+ error color.Color
47+ warning color.Color
48+ warningSubtle color.Color
49+ busy color.Color
50+ info color.Color
51+ infoMoreSubtle color.Color
52+ infoMostSubtle color.Color
53+ success color.Color
54+ successMoreSubtle color.Color
55+ successMostSubtle color.Color
5856}
5957
6058// quickStyle builds a complete Styles value from a palette of semantic
@@ -65,68 +63,34 @@ type quickStyleOpts struct {
6563// add overrides as needed.
6664func quickStyle(o quickStyleOpts) Styles {
6765 var (
68− primary = o.primary
69− secondary = o.secondary
70− tertiary = o.tertiary
71−
72− fgBase = o.fgBase
73− fgMuted = o.fgMuted
74− fgHalfMuted = o.fgHalfMuted
75− fgSubtle = o.fgSubtle
76−
77− onPrimary = o.onPrimary
78− onAccent = o.onAccent
79−
80− bgBase = o.bgBase
81− bgBaseLighter = o.bgBaseLighter
82− bgSubtle = o.bgSubtle
83− bgOverlay = o.bgOverlay
84−
85− border = o.border
86− borderFocus = o.borderFocus
87−
88− danger = o.danger
89− error = o.error
90− warning = o.warning
91− warningStrong = o.warningStrong
92− busy = o.busy
93− info = o.info
94− infoSubtle = o.infoSubtle
95− infoMuted = o.infoMuted
96− success = o.success
97− successSubtle = o.successSubtle
98− successMuted = o.successMuted
99− )
100−
101− var (
102− base = lipgloss.NewStyle().Foreground(fgBase)
103− muted = lipgloss.NewStyle().Foreground(fgMuted)
104− subtle = lipgloss.NewStyle().Foreground(fgSubtle)
66+ base = lipgloss.NewStyle().Foreground(o.fgBase)
67+ muted = lipgloss.NewStyle().Foreground(o.fgMoreSubtle)
68+ subtle = lipgloss.NewStyle().Foreground(o.fgMostSubtle)
10569 s Styles
10670 )
10771
108− s.Background = bgBase
72+ s.Background = o.bgBase
10973
11074 // Populate color fields
111− s.WorkingGradFromColor = primary
112− s.WorkingGradToColor = secondary
113− s.WorkingLabelColor = fgBase
75+ s.WorkingGradFromColor = o.primary
76+ s.WorkingGradToColor = o.secondary
77+ s.WorkingLabelColor = o.fgBase
11478
11579 s.TextInput = textinput.Styles{
11680 Focused: textinput.StyleState{
11781 Text: base,
118− Placeholder: base.Foreground(fgSubtle),
119− Prompt: base.Foreground(tertiary),
120− Suggestion: base.Foreground(fgSubtle),
82+ Placeholder: base.Foreground(o.fgMostSubtle),
83+ Prompt: base.Foreground(o.accent),
84+ Suggestion: base.Foreground(o.fgMostSubtle),
12185 },
12286 Blurred: textinput.StyleState{
123− Text: base.Foreground(fgMuted),
124− Placeholder: base.Foreground(fgSubtle),
125− Prompt: base.Foreground(fgMuted),
126− Suggestion: base.Foreground(fgSubtle),
87+ Text: base.Foreground(o.fgMoreSubtle),
88+ Placeholder: base.Foreground(o.fgMostSubtle),
89+ Prompt: base.Foreground(o.fgMoreSubtle),
90+ Suggestion: base.Foreground(o.fgMostSubtle),
12791 },
12892 Cursor: textinput.CursorStyle{
129− Color: secondary,
93+ Color: o.secondary,
13094 Shape: tea.CursorBlock,
13195 Blink: true,
13296 },
@@ -136,23 +100,23 @@ func quickStyle(o quickStyleOpts) Styles {
136100 Focused: textarea.StyleState{
137101 Base: base,
138102 Text: base,
139− LineNumber: base.Foreground(fgSubtle),
103+ LineNumber: base.Foreground(o.fgMostSubtle),
140104 CursorLine: base,
141− CursorLineNumber: base.Foreground(fgSubtle),
142− Placeholder: base.Foreground(fgSubtle),
143− Prompt: base.Foreground(tertiary),
105+ CursorLineNumber: base.Foreground(o.fgMostSubtle),
106+ Placeholder: base.Foreground(o.fgMostSubtle),
107+ Prompt: base.Foreground(o.accent),
144108 },
145109 Blurred: textarea.StyleState{
146110 Base: base,
147− Text: base.Foreground(fgMuted),
148− LineNumber: base.Foreground(fgMuted),
111+ Text: base.Foreground(o.fgMoreSubtle),
112+ LineNumber: base.Foreground(o.fgMoreSubtle),
149113 CursorLine: base,
150− CursorLineNumber: base.Foreground(fgMuted),
151− Placeholder: base.Foreground(fgSubtle),
152− Prompt: base.Foreground(fgMuted),
114+ CursorLineNumber: base.Foreground(o.fgMoreSubtle),
115+ Placeholder: base.Foreground(o.fgMostSubtle),
116+ Prompt: base.Foreground(o.fgMoreSubtle),
153117 },
154118 Cursor: textarea.CursorStyle{
155− Color: secondary,
119+ Color: o.secondary,
156120 Shape: tea.CursorBlock,
157121 Blink: true,
158122 },
@@ -163,7 +127,7 @@ func quickStyle(o quickStyleOpts) Styles {
163127 StylePrimitive: ansi.StylePrimitive{
164128 // BlockPrefix: "\n",
165129 // BlockSuffix: "\n",
166− Color: hex(fgHalfMuted),
130+ Color: hex(o.fgSubtle),
167131 },
168132 // Margin: new(uint(defaultMargin)),
169133 },
@@ -178,7 +142,7 @@ func quickStyle(o quickStyleOpts) Styles {
178142 Heading: ansi.StyleBlock{
179143 StylePrimitive: ansi.StylePrimitive{
180144 BlockSuffix: "\n",
181− Color: hex(info),
145+ Color: hex(o.info),
182146 Bold: new(true),
183147 },
184148 },
@@ -186,8 +150,8 @@ func quickStyle(o quickStyleOpts) Styles {
186150 StylePrimitive: ansi.StylePrimitive{
187151 Prefix: " ",
188152 Suffix: " ",
189− Color: hex(warning),
190− BackgroundColor: hex(primary),
153+ Color: hex(o.warningSubtle),
154+ BackgroundColor: hex(o.primary),
191155 Bold: new(true),
192156 },
193157 },
@@ -214,7 +178,7 @@ func quickStyle(o quickStyleOpts) Styles {
214178 H6: ansi.StyleBlock{
215179 StylePrimitive: ansi.StylePrimitive{
216180 Prefix: "###### ",
217− Color: hex(successMuted),
181+ Color: hex(o.successMostSubtle),
218182 Bold: new(false),
219183 },
220184 },
@@ -228,7 +192,7 @@ func quickStyle(o quickStyleOpts) Styles {
228192 Bold: new(true),
229193 },
230194 HorizontalRule: ansi.StylePrimitive{
231− Color: hex(border),
195+ Color: hex(o.separator),
232196 Format: "\n--------\n",
233197 },
234198 Item: ansi.StylePrimitive{
@@ -247,7 +211,7 @@ func quickStyle(o quickStyleOpts) Styles {
247211 Underline: new(true),
248212 },
249213 LinkText: ansi.StylePrimitive{
250− Color: hex(successMuted),
214+ Color: hex(o.successMostSubtle),
251215 Bold: new(true),
252216 },
253217 Image: ansi.StylePrimitive{
@@ -255,40 +219,40 @@ func quickStyle(o quickStyleOpts) Styles {
255219 Underline: new(true),
256220 },
257221 ImageText: ansi.StylePrimitive{
258− Color: hex(fgMuted),
222+ Color: hex(o.fgMoreSubtle),
259223 Format: "Image: {{.text}} →",
260224 },
261225 Code: ansi.StyleBlock{
262226 StylePrimitive: ansi.StylePrimitive{
263227 Prefix: " ",
264228 Suffix: " ",
265− Color: hex(danger),
266− BackgroundColor: hex(bgSubtle),
229+ Color: hex(o.destructive),
230+ BackgroundColor: hex(o.bgLessVisible),
267231 },
268232 },
269233 CodeBlock: ansi.StyleCodeBlock{
270234 StyleBlock: ansi.StyleBlock{
271235 StylePrimitive: ansi.StylePrimitive{
272− Color: hex(bgSubtle),
236+ Color: hex(o.bgLessVisible),
273237 },
274238 Margin: new(uint(defaultMargin)),
275239 },
276240 Chroma: &ansi.Chroma{
277241 Text: ansi.StylePrimitive{
278− Color: hex(fgHalfMuted),
242+ Color: hex(o.fgSubtle),
279243 },
280244 Error: ansi.StylePrimitive{
281− Color: hex(onAccent),
282− BackgroundColor: hex(error),
245+ Color: hex(o.primary),
246+ BackgroundColor: hex(o.error),
283247 },
284248 Comment: ansi.StylePrimitive{
285− Color: hex(fgSubtle),
249+ Color: hex(o.fgMostSubtle),
286250 },
287251 CommentPreproc: ansi.StylePrimitive{
288252 Color: hex(charmtone.Bengal),
289253 },
290254 Keyword: ansi.StylePrimitive{
291− Color: hex(info),
255+ Color: hex(o.info),
292256 },
293257 KeywordReserved: ansi.StylePrimitive{
294258 Color: hex(charmtone.Pony),
@@ -303,10 +267,10 @@ func quickStyle(o quickStyleOpts) Styles {
303267 Color: hex(charmtone.Salmon),
304268 },
305269 Punctuation: ansi.StylePrimitive{
306− Color: hex(warning),
270+ Color: hex(o.warningSubtle),
307271 },
308272 Name: ansi.StylePrimitive{
309− Color: hex(fgHalfMuted),
273+ Color: hex(o.fgSubtle),
310274 },
311275 NameBuiltin: ansi.StylePrimitive{
312276 Color: hex(charmtone.Cheeky),
@@ -326,34 +290,34 @@ func quickStyle(o quickStyleOpts) Styles {
326290 Color: hex(charmtone.Citron),
327291 },
328292 NameFunction: ansi.StylePrimitive{
329− Color: hex(successMuted),
293+ Color: hex(o.successMostSubtle),
330294 },
331295 LiteralNumber: ansi.StylePrimitive{
332− Color: hex(success),
296+ Color: hex(o.success),
333297 },
334298 LiteralString: ansi.StylePrimitive{
335299 Color: hex(charmtone.Cumin),
336300 },
337301 LiteralStringEscape: ansi.StylePrimitive{
338− Color: hex(successSubtle),
302+ Color: hex(o.successMoreSubtle),
339303 },
340304 GenericDeleted: ansi.StylePrimitive{
341− Color: hex(danger),
305+ Color: hex(o.destructive),
342306 },
343307 GenericEmph: ansi.StylePrimitive{
344308 Italic: new(true),
345309 },
346310 GenericInserted: ansi.StylePrimitive{
347− Color: hex(successMuted),
311+ Color: hex(o.successMostSubtle),
348312 },
349313 GenericStrong: ansi.StylePrimitive{
350314 Bold: new(true),
351315 },
352316 GenericSubheading: ansi.StylePrimitive{
353− Color: hex(fgMuted),
317+ Color: hex(o.fgMoreSubtle),
354318 },
355319 Background: ansi.StylePrimitive{
356− BackgroundColor: hex(bgSubtle),
320+ BackgroundColor: hex(o.bgLessVisible),
357321 },
358322 },
359323 },
@@ -368,8 +332,8 @@ func quickStyle(o quickStyleOpts) Styles {
368332 }
369333
370334 // QuietMarkdown style - muted colors on subtle background for thinking content.
371− plainBg := hex(bgBaseLighter)
372− plainFg := hex(fgMuted)
335+ plainBg := hex(o.bgLeastVisible)
336+ plainFg := hex(o.fgMoreSubtle)
373337 s.QuietMarkdown = ansi.StyleConfig{
374338 Document: ansi.StyleBlock{
375339 StylePrimitive: ansi.StylePrimitive{
@@ -531,37 +495,37 @@ func quickStyle(o quickStyleOpts) Styles {
531495 }
532496
533497 s.Help = help.Styles{
534− ShortKey: base.Foreground(fgMuted),
535− ShortDesc: base.Foreground(fgSubtle),
536− ShortSeparator: base.Foreground(border),
537− Ellipsis: base.Foreground(border),
538− FullKey: base.Foreground(fgMuted),
539− FullDesc: base.Foreground(fgSubtle),
540− FullSeparator: base.Foreground(border),
498+ ShortKey: base.Foreground(o.fgMoreSubtle),
499+ ShortDesc: base.Foreground(o.fgMostSubtle),
500+ ShortSeparator: base.Foreground(o.separator),
501+ Ellipsis: base.Foreground(o.separator),
502+ FullKey: base.Foreground(o.fgMoreSubtle),
503+ FullDesc: base.Foreground(o.fgMostSubtle),
504+ FullSeparator: base.Foreground(o.separator),
541505 }
542506
543507 s.Diff = diffview.Style{
544508 DividerLine: diffview.LineStyle{
545509 LineNumber: lipgloss.NewStyle().
546− Foreground(fgHalfMuted).
547− Background(bgBaseLighter),
510+ Foreground(o.fgSubtle).
511+ Background(o.bgLeastVisible),
548512 Code: lipgloss.NewStyle().
549− Foreground(fgHalfMuted).
550− Background(bgBaseLighter),
513+ Foreground(o.fgSubtle).
514+ Background(o.bgLeastVisible),
551515 },
552516 MissingLine: diffview.LineStyle{
553517 LineNumber: lipgloss.NewStyle().
554− Background(bgBaseLighter),
518+ Background(o.bgLeastVisible),
555519 Code: lipgloss.NewStyle().
556− Background(bgBaseLighter),
520+ Background(o.bgLeastVisible),
557521 },
558522 EqualLine: diffview.LineStyle{
559523 LineNumber: lipgloss.NewStyle().
560− Foreground(fgMuted).
561− Background(bgBase),
524+ Foreground(o.fgMoreSubtle).
525+ Background(o.bgBase),
562526 Code: lipgloss.NewStyle().
563− Foreground(fgMuted).
564− Background(bgBase),
527+ Foreground(o.fgMoreSubtle).
528+ Background(o.bgBase),
565529 },
566530 InsertLine: diffview.LineStyle{
567531 LineNumber: lipgloss.NewStyle().
@@ -585,249 +549,249 @@ func quickStyle(o quickStyleOpts) Styles {
585549 },
586550 Filename: diffview.LineStyle{
587551 LineNumber: lipgloss.NewStyle().
588− Foreground(fgHalfMuted).
589− Background(bgBaseLighter),
552+ Foreground(o.fgSubtle).
553+ Background(o.bgLeastVisible),
590554 Code: lipgloss.NewStyle().
591− Foreground(fgHalfMuted).
592− Background(bgBaseLighter),
555+ Foreground(o.fgSubtle).
556+ Background(o.bgLeastVisible),
593557 },
594558 }
595559
596560 s.FilePicker = filepicker.Styles{
597− DisabledCursor: base.Foreground(fgMuted),
598− Cursor: base.Foreground(fgBase),
599− Symlink: base.Foreground(fgSubtle),
600− Directory: base.Foreground(primary),
601− File: base.Foreground(fgBase),
602− DisabledFile: base.Foreground(fgMuted),
603− DisabledSelected: base.Background(bgOverlay).Foreground(fgMuted),
604− Permission: base.Foreground(fgMuted),
605− Selected: base.Background(primary).Foreground(fgBase),
606− FileSize: base.Foreground(fgMuted),
607− EmptyDirectory: base.Foreground(fgMuted).PaddingLeft(2).SetString("Empty directory"),
561+ DisabledCursor: base.Foreground(o.fgMoreSubtle),
562+ Cursor: base.Foreground(o.fgBase),
563+ Symlink: base.Foreground(o.fgMostSubtle),
564+ Directory: base.Foreground(o.primary),
565+ File: base.Foreground(o.fgBase),
566+ DisabledFile: base.Foreground(o.fgMoreSubtle),
567+ DisabledSelected: base.Background(o.bgMostVisible).Foreground(o.fgMoreSubtle),
568+ Permission: base.Foreground(o.fgMoreSubtle),
569+ Selected: base.Background(o.primary).Foreground(o.fgBase),
570+ FileSize: base.Foreground(o.fgMoreSubtle),
571+ EmptyDirectory: base.Foreground(o.fgMoreSubtle).PaddingLeft(2).SetString("Empty directory"),
608572 }
609573
610574 // borders
611− s.ToolCallSuccess = lipgloss.NewStyle().Foreground(success).SetString(ToolSuccess)
575+ s.ToolCallSuccess = lipgloss.NewStyle().Foreground(o.success).SetString(ToolSuccess)
612576
613− s.Header.Charm = base.Foreground(secondary)
614− s.Header.Diagonals = base.Foreground(primary)
577+ s.Header.Charm = base.Foreground(o.secondary)
578+ s.Header.Diagonals = base.Foreground(o.primary)
615579 s.Header.Percentage = muted
616580 s.Header.Keystroke = muted
617581 s.Header.KeystrokeTip = subtle
618582 s.Header.WorkingDir = muted
619583 s.Header.Separator = subtle
620− s.Header.Wrapper = lipgloss.NewStyle().Foreground(fgBase)
584+ s.Header.Wrapper = lipgloss.NewStyle().Foreground(o.fgBase)
621585 s.Header.LogoGradCanvas = lipgloss.NewStyle()
622− s.Header.LogoGradFromColor = secondary
623− s.Header.LogoGradToColor = primary
586+ s.Header.LogoGradFromColor = o.secondary
587+ s.Header.LogoGradToColor = o.primary
624588
625589 s.CompactDetails.Title = base
626− s.CompactDetails.View = base.Padding(0, 1, 1, 1).Border(lipgloss.RoundedBorder()).BorderForeground(borderFocus)
627− s.CompactDetails.Version = lipgloss.NewStyle().Foreground(border)
590+ s.CompactDetails.View = base.Padding(0, 1, 1, 1).Border(lipgloss.RoundedBorder()).BorderForeground(o.primary)
591+ s.CompactDetails.Version = lipgloss.NewStyle().Foreground(o.separator)
628592
629593 // Tool rendering styles
630− s.Tool.IconPending = base.Foreground(successMuted).SetString(ToolPending)
631− s.Tool.IconSuccess = base.Foreground(success).SetString(ToolSuccess)
632− s.Tool.IconError = base.Foreground(error).SetString(ToolError)
594+ s.Tool.IconPending = base.Foreground(o.successMostSubtle).SetString(ToolPending)
595+ s.Tool.IconSuccess = base.Foreground(o.success).SetString(ToolSuccess)
596+ s.Tool.IconError = base.Foreground(o.error).SetString(ToolError)
633597 s.Tool.IconCancelled = muted.SetString(ToolPending)
634598
635− s.Tool.NameNormal = base.Foreground(info)
636− s.Tool.NameNested = base.Foreground(info)
599+ s.Tool.NameNormal = base.Foreground(o.info)
600+ s.Tool.NameNested = base.Foreground(o.info)
637601
638602 s.Tool.ParamMain = subtle
639603 s.Tool.ParamKey = subtle
640604
641605 // Content rendering - prepared styles that accept width parameter
642− s.Tool.ContentLine = muted.Background(bgBaseLighter)
643− s.Tool.ContentTruncation = muted.Background(bgBaseLighter)
644− s.Tool.ContentCodeLine = base.Background(bgBase).PaddingLeft(2)
645− s.Tool.ContentCodeTruncation = muted.Background(bgBase).PaddingLeft(2)
646− s.Tool.ContentCodeBg = bgBase
606+ s.Tool.ContentLine = muted.Background(o.bgLeastVisible)
607+ s.Tool.ContentTruncation = muted.Background(o.bgLeastVisible)
608+ s.Tool.ContentCodeLine = base.Background(o.bgBase).PaddingLeft(2)
609+ s.Tool.ContentCodeTruncation = muted.Background(o.bgBase).PaddingLeft(2)
610+ s.Tool.ContentCodeBg = o.bgBase
647611 s.Tool.Body = base.PaddingLeft(2)
648612
649613 // Deprecated - kept for backward compatibility
650− s.Tool.ContentBg = muted.Background(bgBaseLighter)
614+ s.Tool.ContentBg = muted.Background(o.bgLeastVisible)
651615 s.Tool.ContentText = muted
652− s.Tool.ContentLineNumber = base.Foreground(fgMuted).Background(bgBase).PaddingRight(1).PaddingLeft(1)
616+ s.Tool.ContentLineNumber = base.Foreground(o.fgMoreSubtle).Background(o.bgBase).PaddingRight(1).PaddingLeft(1)
653617
654− s.Tool.StateWaiting = base.Foreground(fgSubtle)
655− s.Tool.StateCancelled = base.Foreground(fgSubtle)
618+ s.Tool.StateWaiting = base.Foreground(o.fgMostSubtle)
619+ s.Tool.StateCancelled = base.Foreground(o.fgMostSubtle)
656620
657− s.Tool.ErrorTag = base.Padding(0, 1).Background(danger).Foreground(onAccent)
658− s.Tool.ErrorMessage = base.Foreground(fgHalfMuted)
621+ s.Tool.ErrorTag = base.Padding(0, 1).Background(o.destructive).Foreground(o.primary)
622+ s.Tool.ErrorMessage = base.Foreground(o.fgSubtle)
659623
660624 // Diff and multi-edit styles
661− s.Tool.DiffTruncation = muted.Background(bgBaseLighter).PaddingLeft(2)
662− s.Tool.NoteTag = base.Padding(0, 1).Background(info).Foreground(onAccent)
663− s.Tool.NoteMessage = base.Foreground(fgHalfMuted)
625+ s.Tool.DiffTruncation = muted.Background(o.bgLeastVisible).PaddingLeft(2)
626+ s.Tool.NoteTag = base.Padding(0, 1).Background(o.info).Foreground(o.primary)
627+ s.Tool.NoteMessage = base.Foreground(o.fgSubtle)
664628
665629 // Job header styles
666− s.Tool.JobIconPending = base.Foreground(successMuted)
667− s.Tool.JobIconError = base.Foreground(error)
668− s.Tool.JobIconSuccess = base.Foreground(success)
669− s.Tool.JobToolName = base.Foreground(info)
670− s.Tool.JobAction = base.Foreground(infoMuted)
630+ s.Tool.JobIconPending = base.Foreground(o.successMostSubtle)
631+ s.Tool.JobIconError = base.Foreground(o.error)
632+ s.Tool.JobIconSuccess = base.Foreground(o.success)
633+ s.Tool.JobToolName = base.Foreground(o.info)
634+ s.Tool.JobAction = base.Foreground(o.infoMostSubtle)
671635 s.Tool.JobPID = muted
672636 s.Tool.JobDescription = subtle
673637
674638 // Agent task styles
675− s.Tool.AgentTaskTag = base.Bold(true).Padding(0, 1).MarginLeft(2).Background(infoSubtle).Foreground(onAccent)
639+ s.Tool.AgentTaskTag = base.Bold(true).Padding(0, 1).MarginLeft(2).Background(o.infoMoreSubtle).Foreground(o.primary)
676640 s.Tool.AgentPrompt = muted
677641
678642 // Agentic fetch styles
679− s.Tool.AgenticFetchPromptTag = base.Bold(true).Padding(0, 1).MarginLeft(2).Background(success).Foreground(border)
643+ s.Tool.AgenticFetchPromptTag = base.Bold(true).Padding(0, 1).MarginLeft(2).Background(o.success).Foreground(o.separator)
680644
681645 // Todo styles
682− s.Tool.TodoRatio = base.Foreground(infoMuted)
683− s.Tool.TodoCompletedIcon = base.Foreground(success)
684− s.Tool.TodoInProgressIcon = base.Foreground(successMuted)
685− s.Tool.TodoPendingIcon = base.Foreground(fgMuted)
686− s.Tool.TodoStatusNote = lipgloss.NewStyle().Foreground(fgSubtle)
687− s.Tool.TodoItem = lipgloss.NewStyle().Foreground(fgBase)
688− s.Tool.TodoJustStarted = lipgloss.NewStyle().Foreground(fgBase)
646+ s.Tool.TodoRatio = base.Foreground(o.infoMostSubtle)
647+ s.Tool.TodoCompletedIcon = base.Foreground(o.success)
648+ s.Tool.TodoInProgressIcon = base.Foreground(o.successMostSubtle)
649+ s.Tool.TodoPendingIcon = base.Foreground(o.fgMoreSubtle)
650+ s.Tool.TodoStatusNote = lipgloss.NewStyle().Foreground(o.fgMostSubtle)
651+ s.Tool.TodoItem = lipgloss.NewStyle().Foreground(o.fgBase)
652+ s.Tool.TodoJustStarted = lipgloss.NewStyle().Foreground(o.fgBase)
689653
690654 // MCP styles
691− s.Tool.MCPName = base.Foreground(info)
692− s.Tool.MCPToolName = base.Foreground(infoMuted)
693− s.Tool.MCPArrow = base.Foreground(info).SetString(ArrowRightIcon)
655+ s.Tool.MCPName = base.Foreground(o.info)
656+ s.Tool.MCPToolName = base.Foreground(o.infoMostSubtle)
657+ s.Tool.MCPArrow = base.Foreground(o.info).SetString(ArrowRightIcon)
694658
695659 // Loading indicators for images, skills
696− s.Tool.ResourceLoadedText = base.Foreground(success)
697− s.Tool.ResourceLoadedIndicator = base.Foreground(successMuted)
660+ s.Tool.ResourceLoadedText = base.Foreground(o.success)
661+ s.Tool.ResourceLoadedIndicator = base.Foreground(o.successMostSubtle)
698662 s.Tool.ResourceName = base
699663 s.Tool.MediaType = base
700− s.Tool.ResourceSize = base.Foreground(fgMuted)
664+ s.Tool.ResourceSize = base.Foreground(o.fgMoreSubtle)
701665
702666 // Hook styles
703− s.Tool.HookLabel = base.Foreground(successSubtle)
667+ s.Tool.HookLabel = base.Foreground(o.successMoreSubtle)
704668 s.Tool.HookName = base
705− s.Tool.HookMatcher = base.Foreground(fgMuted)
706− s.Tool.HookArrow = base.Foreground(successSubtle)
707− s.Tool.HookDetail = base.Foreground(fgMuted)
708− s.Tool.HookOK = base.Foreground(successMuted)
709− s.Tool.HookDenied = base.Foreground(error)
710− s.Tool.HookDeniedLabel = base.Foreground(danger)
711− s.Tool.HookDeniedReason = base.Foreground(bgOverlay)
712− s.Tool.HookRewrote = base.Foreground(bgOverlay)
669+ s.Tool.HookMatcher = base.Foreground(o.fgMoreSubtle)
670+ s.Tool.HookArrow = base.Foreground(o.successMoreSubtle)
671+ s.Tool.HookDetail = base.Foreground(o.fgMoreSubtle)
672+ s.Tool.HookOK = base.Foreground(o.successMostSubtle)
673+ s.Tool.HookDenied = base.Foreground(o.error)
674+ s.Tool.HookDeniedLabel = base.Foreground(o.destructive)
675+ s.Tool.HookDeniedReason = base.Foreground(o.bgMostVisible)
676+ s.Tool.HookRewrote = base.Foreground(o.bgMostVisible)
713677
714678 // Tool-call action verbs and result-list styling.
715− s.Tool.ActionCreate = lipgloss.NewStyle().Foreground(successSubtle)
716− s.Tool.ActionDestroy = lipgloss.NewStyle().Foreground(danger)
717− s.Tool.ResultEmpty = lipgloss.NewStyle().Foreground(fgSubtle)
718− s.Tool.ResultTruncation = lipgloss.NewStyle().Foreground(fgSubtle)
719− s.Tool.ResultItemName = lipgloss.NewStyle().Foreground(fgBase)
720− s.Tool.ResultItemDesc = lipgloss.NewStyle().Foreground(fgSubtle)
679+ s.Tool.ActionCreate = lipgloss.NewStyle().Foreground(o.successMoreSubtle)
680+ s.Tool.ActionDestroy = lipgloss.NewStyle().Foreground(o.destructive)
681+ s.Tool.ResultEmpty = lipgloss.NewStyle().Foreground(o.fgMostSubtle)
682+ s.Tool.ResultTruncation = lipgloss.NewStyle().Foreground(o.fgMostSubtle)
683+ s.Tool.ResultItemName = lipgloss.NewStyle().Foreground(o.fgBase)
684+ s.Tool.ResultItemDesc = lipgloss.NewStyle().Foreground(o.fgMostSubtle)
721685
722686 // Buttons
723− s.Button.Focused = lipgloss.NewStyle().Foreground(onAccent).Background(secondary)
724− s.Button.Blurred = lipgloss.NewStyle().Foreground(fgBase).Background(bgSubtle)
687+ s.Button.Focused = lipgloss.NewStyle().Foreground(o.primary).Background(o.secondary)
688+ s.Button.Blurred = lipgloss.NewStyle().Foreground(o.fgBase).Background(o.bgLessVisible)
725689
726690 // Editor
727− s.Editor.PromptNormalFocused = lipgloss.NewStyle().Foreground(successMuted).SetString("::: ")
728− s.Editor.PromptNormalBlurred = s.Editor.PromptNormalFocused.Foreground(fgMuted)
729− s.Editor.PromptYoloIconFocused = lipgloss.NewStyle().MarginRight(1).Foreground(fgSubtle).Background(busy).Bold(true).SetString(" ! ")
730− s.Editor.PromptYoloIconBlurred = s.Editor.PromptYoloIconFocused.Foreground(bgBase).Background(fgMuted)
731− s.Editor.PromptYoloDotsFocused = lipgloss.NewStyle().MarginRight(1).Foreground(warning).SetString(":::")
732− s.Editor.PromptYoloDotsBlurred = s.Editor.PromptYoloDotsFocused.Foreground(fgMuted)
691+ s.Editor.PromptNormalFocused = lipgloss.NewStyle().Foreground(o.successMostSubtle).SetString("::: ")
692+ s.Editor.PromptNormalBlurred = s.Editor.PromptNormalFocused.Foreground(o.fgMoreSubtle)
693+ s.Editor.PromptYoloIconFocused = lipgloss.NewStyle().MarginRight(1).Foreground(o.fgMostSubtle).Background(o.busy).Bold(true).SetString(" ! ")
694+ s.Editor.PromptYoloIconBlurred = s.Editor.PromptYoloIconFocused.Foreground(o.bgBase).Background(o.fgMoreSubtle)
695+ s.Editor.PromptYoloDotsFocused = lipgloss.NewStyle().MarginRight(1).Foreground(o.warningSubtle).SetString(":::")
696+ s.Editor.PromptYoloDotsBlurred = s.Editor.PromptYoloDotsFocused.Foreground(o.fgMoreSubtle)
733697
734− s.Radio.On = lipgloss.NewStyle().Foreground(fgHalfMuted).SetString(RadioOn)
735− s.Radio.Off = lipgloss.NewStyle().Foreground(fgHalfMuted).SetString(RadioOff)
736− s.Radio.Label = lipgloss.NewStyle().Foreground(fgHalfMuted)
698+ s.Radio.On = lipgloss.NewStyle().Foreground(o.fgSubtle).SetString(RadioOn)
699+ s.Radio.Off = lipgloss.NewStyle().Foreground(o.fgSubtle).SetString(RadioOff)
700+ s.Radio.Label = lipgloss.NewStyle().Foreground(o.fgSubtle)
737701
738702 // Logo
739− s.Logo.FieldColor = primary
740− s.Logo.TitleColorA = secondary
741− s.Logo.TitleColorB = primary
742− s.Logo.CharmColor = secondary
743− s.Logo.VersionColor = primary
744− s.Logo.SmallCharm = lipgloss.NewStyle().Foreground(secondary)
745− s.Logo.SmallDiagonals = lipgloss.NewStyle().Foreground(primary)
703+ s.Logo.FieldColor = o.primary
704+ s.Logo.TitleColorA = o.secondary
705+ s.Logo.TitleColorB = o.primary
706+ s.Logo.CharmColor = o.secondary
707+ s.Logo.VersionColor = o.primary
708+ s.Logo.SmallCharm = lipgloss.NewStyle().Foreground(o.secondary)
709+ s.Logo.SmallDiagonals = lipgloss.NewStyle().Foreground(o.primary)
746710 s.Logo.GradCanvas = lipgloss.NewStyle()
747− s.Logo.SmallGradFromColor = secondary
748− s.Logo.SmallGradToColor = primary
711+ s.Logo.SmallGradFromColor = o.secondary
712+ s.Logo.SmallGradToColor = o.primary
749713
750714 // Section
751715 s.Section.Title = subtle
752− s.Section.Line = base.Foreground(border)
716+ s.Section.Line = base.Foreground(o.separator)
753717
754718 // Initialize
755719 s.Initialize.Header = base
756720 s.Initialize.Content = muted
757− s.Initialize.Accent = base.Foreground(successMuted)
721+ s.Initialize.Accent = base.Foreground(o.successMostSubtle)
758722
759723 // ResourceGroup (LSP/MCP/skills sidebar lists).
760− s.Resource.Heading = lipgloss.NewStyle().Foreground(fgSubtle)
761− s.Resource.Name = lipgloss.NewStyle().Foreground(fgMuted)
762− s.Resource.StatusText = lipgloss.NewStyle().Foreground(fgSubtle)
763− s.Resource.OfflineIcon = lipgloss.NewStyle().Foreground(bgOverlay).SetString("●")
764− s.Resource.BusyIcon = s.Resource.OfflineIcon.Foreground(busy)
765− s.Resource.ErrorIcon = s.Resource.OfflineIcon.Foreground(danger)
766− s.Resource.OnlineIcon = s.Resource.OfflineIcon.Foreground(successMuted)
767− s.Resource.DisabledIcon = lipgloss.NewStyle().Foreground(fgMuted).SetString("●")
768− s.Resource.AdditionalText = lipgloss.NewStyle().Foreground(fgSubtle)
769− s.Resource.CapabilityCount = lipgloss.NewStyle().Foreground(fgSubtle)
770− s.Resource.RowTitleBase = lipgloss.NewStyle().Foreground(fgBase)
771− s.Resource.RowDescBase = lipgloss.NewStyle().Foreground(fgBase)
772− s.Resource.DefaultTitleFg = fgMuted
773− s.Resource.DefaultDescFg = fgSubtle
724+ s.Resource.Heading = lipgloss.NewStyle().Foreground(o.fgMostSubtle)
725+ s.Resource.Name = lipgloss.NewStyle().Foreground(o.fgMoreSubtle)
726+ s.Resource.StatusText = lipgloss.NewStyle().Foreground(o.fgMostSubtle)
727+ s.Resource.OfflineIcon = lipgloss.NewStyle().Foreground(o.bgMostVisible).SetString("●")
728+ s.Resource.BusyIcon = s.Resource.OfflineIcon.Foreground(o.busy)
729+ s.Resource.ErrorIcon = s.Resource.OfflineIcon.Foreground(o.destructive)
730+ s.Resource.OnlineIcon = s.Resource.OfflineIcon.Foreground(o.successMostSubtle)
731+ s.Resource.DisabledIcon = lipgloss.NewStyle().Foreground(o.fgMoreSubtle).SetString("●")
732+ s.Resource.AdditionalText = lipgloss.NewStyle().Foreground(o.fgMostSubtle)
733+ s.Resource.CapabilityCount = lipgloss.NewStyle().Foreground(o.fgMostSubtle)
734+ s.Resource.RowTitleBase = lipgloss.NewStyle().Foreground(o.fgBase)
735+ s.Resource.RowDescBase = lipgloss.NewStyle().Foreground(o.fgBase)
736+ s.Resource.DefaultTitleFg = o.fgMoreSubtle
737+ s.Resource.DefaultDescFg = o.fgMostSubtle
774738
775739 // LSP
776− s.LSP.ErrorDiagnostic = base.Foreground(error)
777− s.LSP.WarningDiagnostic = base.Foreground(warning)
778− s.LSP.HintDiagnostic = base.Foreground(fgHalfMuted)
779− s.LSP.InfoDiagnostic = base.Foreground(info)
740+ s.LSP.ErrorDiagnostic = base.Foreground(o.error)
741+ s.LSP.WarningDiagnostic = base.Foreground(o.warningSubtle)
742+ s.LSP.HintDiagnostic = base.Foreground(o.fgSubtle)
743+ s.LSP.InfoDiagnostic = base.Foreground(o.info)
780744
781745 // Files
782− s.Files.Path = lipgloss.NewStyle().Foreground(fgMuted)
783− s.Files.Additions = lipgloss.NewStyle().Foreground(successMuted)
784− s.Files.Deletions = lipgloss.NewStyle().Foreground(error)
785− s.Files.SectionTitle = lipgloss.NewStyle().Foreground(fgSubtle)
786− s.Files.EmptyMessage = lipgloss.NewStyle().Foreground(fgSubtle)
787− s.Files.TruncationHint = lipgloss.NewStyle().Foreground(fgSubtle)
746+ s.Files.Path = lipgloss.NewStyle().Foreground(o.fgMoreSubtle)
747+ s.Files.Additions = lipgloss.NewStyle().Foreground(o.successMostSubtle)
748+ s.Files.Deletions = lipgloss.NewStyle().Foreground(o.error)
749+ s.Files.SectionTitle = lipgloss.NewStyle().Foreground(o.fgMostSubtle)
750+ s.Files.EmptyMessage = lipgloss.NewStyle().Foreground(o.fgMostSubtle)
751+ s.Files.TruncationHint = lipgloss.NewStyle().Foreground(o.fgMostSubtle)
788752
789753 // Sidebar
790− s.Sidebar.SessionTitle = lipgloss.NewStyle().Foreground(fgMuted)
791− s.Sidebar.WorkingDir = lipgloss.NewStyle().Foreground(fgMuted)
754+ s.Sidebar.SessionTitle = lipgloss.NewStyle().Foreground(o.fgMoreSubtle)
755+ s.Sidebar.WorkingDir = lipgloss.NewStyle().Foreground(o.fgMoreSubtle)
792756
793757 // ModelInfo
794− s.ModelInfo.Icon = lipgloss.NewStyle().Foreground(fgSubtle)
795− s.ModelInfo.Name = lipgloss.NewStyle().Foreground(fgBase)
796− s.ModelInfo.Provider = lipgloss.NewStyle().Foreground(fgMuted)
797− s.ModelInfo.ProviderFallback = lipgloss.NewStyle().Foreground(fgMuted).PaddingLeft(2)
798− s.ModelInfo.Reasoning = lipgloss.NewStyle().Foreground(fgSubtle).PaddingLeft(2)
799− s.ModelInfo.TokenCount = lipgloss.NewStyle().Foreground(fgSubtle)
800− s.ModelInfo.TokenPercentage = lipgloss.NewStyle().Foreground(fgMuted)
801− s.ModelInfo.Cost = lipgloss.NewStyle().Foreground(fgMuted)
758+ s.ModelInfo.Icon = lipgloss.NewStyle().Foreground(o.fgMostSubtle)
759+ s.ModelInfo.Name = lipgloss.NewStyle().Foreground(o.fgBase)
760+ s.ModelInfo.Provider = lipgloss.NewStyle().Foreground(o.fgMoreSubtle)
761+ s.ModelInfo.ProviderFallback = lipgloss.NewStyle().Foreground(o.fgMoreSubtle).PaddingLeft(2)
762+ s.ModelInfo.Reasoning = lipgloss.NewStyle().Foreground(o.fgMostSubtle).PaddingLeft(2)
763+ s.ModelInfo.TokenCount = lipgloss.NewStyle().Foreground(o.fgMostSubtle)
764+ s.ModelInfo.TokenPercentage = lipgloss.NewStyle().Foreground(o.fgMoreSubtle)
765+ s.ModelInfo.Cost = lipgloss.NewStyle().Foreground(o.fgMoreSubtle)
802766
803767 // ResourceGroup
804− s.Resource.DefaultTitleFg = fgMuted
805− s.Resource.DefaultDescFg = fgSubtle
768+ s.Resource.DefaultTitleFg = o.fgMoreSubtle
769+ s.Resource.DefaultDescFg = o.fgMostSubtle
806770
807771 // Chat
808772 messageFocussedBorder := lipgloss.Border{
809773 Left: "▌",
810774 }
811775
812− s.Messages.NoContent = lipgloss.NewStyle().Foreground(fgBase)
776+ s.Messages.NoContent = lipgloss.NewStyle().Foreground(o.fgBase)
813777 s.Messages.UserBlurred = s.Messages.NoContent.PaddingLeft(1).BorderLeft(true).
814− BorderForeground(primary).BorderStyle(lipgloss.NormalBorder())
778+ BorderForeground(o.primary).BorderStyle(lipgloss.NormalBorder())
815779 s.Messages.UserFocused = s.Messages.NoContent.PaddingLeft(1).BorderLeft(true).
816− BorderForeground(primary).BorderStyle(messageFocussedBorder)
780+ BorderForeground(o.primary).BorderStyle(messageFocussedBorder)
817781 s.Messages.AssistantBlurred = s.Messages.NoContent.PaddingLeft(2)
818782 s.Messages.AssistantFocused = s.Messages.NoContent.PaddingLeft(1).BorderLeft(true).
819− BorderForeground(successMuted).BorderStyle(messageFocussedBorder)
783+ BorderForeground(o.successMostSubtle).BorderStyle(messageFocussedBorder)
820784 s.Messages.Thinking = lipgloss.NewStyle().MaxHeight(10)
821785 s.Messages.ErrorTag = lipgloss.NewStyle().Padding(0, 1).
822− Background(danger).Foreground(onAccent)
823− s.Messages.ErrorTitle = lipgloss.NewStyle().Foreground(fgHalfMuted)
824− s.Messages.ErrorDetails = lipgloss.NewStyle().Foreground(fgSubtle)
786+ Background(o.destructive).Foreground(o.primary)
787+ s.Messages.ErrorTitle = lipgloss.NewStyle().Foreground(o.fgSubtle)
788+ s.Messages.ErrorDetails = lipgloss.NewStyle().Foreground(o.fgMostSubtle)
825789
826790 // Message item styles
827791 s.Messages.ToolCallFocused = muted.PaddingLeft(1).
828792 BorderStyle(messageFocussedBorder).
829793 BorderLeft(true).
830− BorderForeground(successMuted)
794+ BorderForeground(o.successMostSubtle)
831795 s.Messages.ToolCallBlurred = muted.PaddingLeft(2)
832796 // No padding or border for compact tool calls within messages
833797 s.Messages.ToolCallCompact = muted
@@ -836,144 +800,144 @@ func quickStyle(o quickStyleOpts) Styles {
836800 s.Messages.AssistantInfoModel = muted
837801 s.Messages.AssistantInfoProvider = subtle
838802 s.Messages.AssistantInfoDuration = subtle
839− s.Messages.AssistantCanceled = lipgloss.NewStyle().Foreground(fgBase).Italic(true)
803+ s.Messages.AssistantCanceled = lipgloss.NewStyle().Foreground(o.fgBase).Italic(true)
840804
841805 // Thinking section styles
842− s.Messages.ThinkingBox = subtle.Background(bgBaseLighter)
806+ s.Messages.ThinkingBox = subtle.Background(o.bgLeastVisible)
843807 s.Messages.ThinkingTruncationHint = muted
844808 s.Messages.ThinkingFooterTitle = muted
845809 s.Messages.ThinkingFooterDuration = subtle
846810
847811 // Text selection.
848− s.TextSelection = lipgloss.NewStyle().Foreground(onPrimary).Background(primary)
812+ s.TextSelection = lipgloss.NewStyle().Foreground(o.onPrimary).Background(o.primary)
849813
850814 // Dialog styles
851− s.Dialog.Title = base.Padding(0, 1).Foreground(primary)
852− s.Dialog.TitleText = base.Foreground(primary)
853− s.Dialog.TitleError = base.Foreground(danger)
854− s.Dialog.TitleAccent = base.Foreground(success).Bold(true)
815+ s.Dialog.Title = base.Padding(0, 1).Foreground(o.primary)
816+ s.Dialog.TitleText = base.Foreground(o.primary)
817+ s.Dialog.TitleError = base.Foreground(o.destructive)
818+ s.Dialog.TitleAccent = base.Foreground(o.success).Bold(true)
855819 s.Dialog.TitleLineBase = lipgloss.NewStyle()
856− s.Dialog.TitleGradFromColor = primary
857− s.Dialog.TitleGradToColor = secondary
820+ s.Dialog.TitleGradFromColor = o.primary
821+ s.Dialog.TitleGradToColor = o.secondary
858822
859823 // Dialog.ListItem (commands, reasoning, models)
860− s.Dialog.ListItem.InfoBlurred = lipgloss.NewStyle().Foreground(fgBase)
861− s.Dialog.ListItem.InfoFocused = lipgloss.NewStyle().Foreground(fgBase)
824+ s.Dialog.ListItem.InfoBlurred = lipgloss.NewStyle().Foreground(o.fgBase)
825+ s.Dialog.ListItem.InfoFocused = lipgloss.NewStyle().Foreground(o.fgBase)
862826
863827 // Dialog.Models
864− s.Dialog.Models.ConfiguredText = lipgloss.NewStyle().Foreground(fgSubtle)
828+ s.Dialog.Models.ConfiguredText = lipgloss.NewStyle().Foreground(o.fgMostSubtle)
865829
866830 // Dialog.Permissions
867− s.Dialog.Permissions.KeyText = lipgloss.NewStyle().Foreground(fgMuted)
868− s.Dialog.Permissions.ValueText = lipgloss.NewStyle().Foreground(fgBase)
869− s.Dialog.Permissions.ParamsBg = bgSubtle
831+ s.Dialog.Permissions.KeyText = lipgloss.NewStyle().Foreground(o.fgMoreSubtle)
832+ s.Dialog.Permissions.ValueText = lipgloss.NewStyle().Foreground(o.fgBase)
833+ s.Dialog.Permissions.ParamsBg = o.bgLessVisible
870834
871835 // Dialog.Quit
872− s.Dialog.Quit.Content = lipgloss.NewStyle().Foreground(fgBase)
873− s.Dialog.Quit.Frame = lipgloss.NewStyle().BorderForeground(borderFocus).Border(lipgloss.RoundedBorder()).Padding(1, 2)
874− s.Dialog.View = base.Border(lipgloss.RoundedBorder()).BorderForeground(borderFocus)
875− s.Dialog.PrimaryText = base.Padding(0, 1).Foreground(primary)
876− s.Dialog.SecondaryText = base.Padding(0, 1).Foreground(fgSubtle)
836+ s.Dialog.Quit.Content = lipgloss.NewStyle().Foreground(o.fgBase)
837+ s.Dialog.Quit.Frame = lipgloss.NewStyle().BorderForeground(o.primary).Border(lipgloss.RoundedBorder()).Padding(1, 2)
838+ s.Dialog.View = base.Border(lipgloss.RoundedBorder()).BorderForeground(o.primary)
839+ s.Dialog.PrimaryText = base.Padding(0, 1).Foreground(o.primary)
840+ s.Dialog.SecondaryText = base.Padding(0, 1).Foreground(o.fgMostSubtle)
877841 s.Dialog.HelpView = base.Padding(0, 1).AlignHorizontal(lipgloss.Left)
878− s.Dialog.Help.ShortKey = base.Foreground(fgMuted)
879− s.Dialog.Help.ShortDesc = base.Foreground(fgSubtle)
880− s.Dialog.Help.ShortSeparator = base.Foreground(border)
881− s.Dialog.Help.Ellipsis = base.Foreground(border)
882− s.Dialog.Help.FullKey = base.Foreground(fgMuted)
883− s.Dialog.Help.FullDesc = base.Foreground(fgSubtle)
884− s.Dialog.Help.FullSeparator = base.Foreground(border)
885− s.Dialog.NormalItem = base.Padding(0, 1).Foreground(fgBase)
886− s.Dialog.SelectedItem = base.Padding(0, 1).Background(primary).Foreground(fgBase)
842+ s.Dialog.Help.ShortKey = base.Foreground(o.fgMoreSubtle)
843+ s.Dialog.Help.ShortDesc = base.Foreground(o.fgMostSubtle)
844+ s.Dialog.Help.ShortSeparator = base.Foreground(o.separator)
845+ s.Dialog.Help.Ellipsis = base.Foreground(o.separator)
846+ s.Dialog.Help.FullKey = base.Foreground(o.fgMoreSubtle)
847+ s.Dialog.Help.FullDesc = base.Foreground(o.fgMostSubtle)
848+ s.Dialog.Help.FullSeparator = base.Foreground(o.separator)
849+ s.Dialog.NormalItem = base.Padding(0, 1).Foreground(o.fgBase)
850+ s.Dialog.SelectedItem = base.Padding(0, 1).Background(o.primary).Foreground(o.fgBase)
887851 s.Dialog.InputPrompt = base.Margin(1, 1)
888852
889853 s.Dialog.List = base.Margin(0, 0, 1, 0)
890− s.Dialog.ContentPanel = base.Background(bgSubtle).Foreground(fgBase).Padding(1, 2)
891− s.Dialog.Spinner = base.Foreground(secondary)
892− s.Dialog.ScrollbarThumb = base.Foreground(secondary)
893− s.Dialog.ScrollbarTrack = base.Foreground(border)
854+ s.Dialog.ContentPanel = base.Background(o.bgLessVisible).Foreground(o.fgBase).Padding(1, 2)
855+ s.Dialog.Spinner = base.Foreground(o.secondary)
856+ s.Dialog.ScrollbarThumb = base.Foreground(o.secondary)
857+ s.Dialog.ScrollbarTrack = base.Foreground(o.separator)
894858
895− s.Dialog.ImagePreview = lipgloss.NewStyle().Padding(0, 1).Foreground(fgSubtle)
859+ s.Dialog.ImagePreview = lipgloss.NewStyle().Padding(0, 1).Foreground(o.fgMostSubtle)
896860
897861 // API key input dialog
898− s.Dialog.APIKey.Spinner = base.Foreground(success)
862+ s.Dialog.APIKey.Spinner = base.Foreground(o.success)
899863
900864 // OAuth dialog
901− s.Dialog.OAuth.Spinner = base.Foreground(successSubtle)
902− s.Dialog.OAuth.Instructions = lipgloss.NewStyle().Foreground(onAccent)
903− s.Dialog.OAuth.UserCode = lipgloss.NewStyle().Bold(true).Foreground(onAccent)
904− s.Dialog.OAuth.Success = lipgloss.NewStyle().Foreground(successSubtle)
905− s.Dialog.OAuth.Link = lipgloss.NewStyle().Foreground(successMuted).Underline(true)
906− s.Dialog.OAuth.Enter = lipgloss.NewStyle().Foreground(primary)
907− s.Dialog.OAuth.ErrorText = lipgloss.NewStyle().Foreground(error)
908− s.Dialog.OAuth.StatusText = lipgloss.NewStyle().Foreground(fgMuted)
909− s.Dialog.OAuth.UserCodeBg = bgBaseLighter
865+ s.Dialog.OAuth.Spinner = base.Foreground(o.successMoreSubtle)
866+ s.Dialog.OAuth.Instructions = lipgloss.NewStyle().Foreground(o.primary)
867+ s.Dialog.OAuth.UserCode = lipgloss.NewStyle().Bold(true).Foreground(o.primary)
868+ s.Dialog.OAuth.Success = lipgloss.NewStyle().Foreground(o.successMoreSubtle)
869+ s.Dialog.OAuth.Link = lipgloss.NewStyle().Foreground(o.successMostSubtle).Underline(true)
870+ s.Dialog.OAuth.Enter = lipgloss.NewStyle().Foreground(o.primary)
871+ s.Dialog.OAuth.ErrorText = lipgloss.NewStyle().Foreground(o.error)
872+ s.Dialog.OAuth.StatusText = lipgloss.NewStyle().Foreground(o.fgMoreSubtle)
873+ s.Dialog.OAuth.UserCodeBg = o.bgLeastVisible
910874
911875 s.Dialog.Arguments.Content = base.Padding(1)
912876 s.Dialog.Arguments.Description = base.MarginBottom(1).MaxHeight(3)
913− s.Dialog.Arguments.InputLabelBlurred = base.Foreground(fgMuted)
877+ s.Dialog.Arguments.InputLabelBlurred = base.Foreground(o.fgMoreSubtle)
914878 s.Dialog.Arguments.InputLabelFocused = base.Bold(true)
915− s.Dialog.Arguments.InputRequiredMarkBlurred = base.Foreground(fgMuted).SetString("*")
916− s.Dialog.Arguments.InputRequiredMarkFocused = base.Foreground(primary).Bold(true).SetString("*")
879+ s.Dialog.Arguments.InputRequiredMarkBlurred = base.Foreground(o.fgMoreSubtle).SetString("*")
880+ s.Dialog.Arguments.InputRequiredMarkFocused = base.Foreground(o.primary).Bold(true).SetString("*")
917881
918− s.Dialog.Sessions.DeletingTitle = s.Dialog.Title.Foreground(danger)
919− s.Dialog.Sessions.DeletingView = s.Dialog.View.BorderForeground(danger)
882+ s.Dialog.Sessions.DeletingTitle = s.Dialog.Title.Foreground(o.destructive)
883+ s.Dialog.Sessions.DeletingView = s.Dialog.View.BorderForeground(o.destructive)
920884 s.Dialog.Sessions.DeletingMessage = base.Padding(1)
921− s.Dialog.Sessions.DeletingTitleGradientFromColor = danger
922− s.Dialog.Sessions.DeletingTitleGradientToColor = primary
923− s.Dialog.Sessions.DeletingItemBlurred = s.Dialog.NormalItem.Foreground(fgSubtle)
924− s.Dialog.Sessions.DeletingItemFocused = s.Dialog.SelectedItem.Background(danger).Foreground(onAccent)
885+ s.Dialog.Sessions.DeletingTitleGradientFromColor = o.destructive
886+ s.Dialog.Sessions.DeletingTitleGradientToColor = o.primary
887+ s.Dialog.Sessions.DeletingItemBlurred = s.Dialog.NormalItem.Foreground(o.fgMostSubtle)
888+ s.Dialog.Sessions.DeletingItemFocused = s.Dialog.SelectedItem.Background(o.destructive).Foreground(o.onPrimary)
925889
926− s.Dialog.Sessions.RenamingingTitle = s.Dialog.Title.Foreground(warning)
927− s.Dialog.Sessions.RenamingView = s.Dialog.View.BorderForeground(warning)
890+ s.Dialog.Sessions.RenamingingTitle = s.Dialog.Title.Foreground(o.warningSubtle)
891+ s.Dialog.Sessions.RenamingView = s.Dialog.View.BorderForeground(o.warningSubtle)
928892 s.Dialog.Sessions.RenamingingMessage = base.Padding(1)
929− s.Dialog.Sessions.RenamingTitleGradientFromColor = warning
930− s.Dialog.Sessions.RenamingTitleGradientToColor = tertiary
931− s.Dialog.Sessions.RenamingItemBlurred = s.Dialog.NormalItem.Foreground(fgSubtle)
893+ s.Dialog.Sessions.RenamingTitleGradientFromColor = o.warningSubtle
894+ s.Dialog.Sessions.RenamingTitleGradientToColor = o.accent
895+ s.Dialog.Sessions.RenamingItemBlurred = s.Dialog.NormalItem.Foreground(o.fgMostSubtle)
932896 s.Dialog.Sessions.RenamingingItemFocused = s.Dialog.SelectedItem.UnsetBackground().UnsetForeground()
933− s.Dialog.Sessions.RenamingPlaceholder = base.Foreground(fgMuted)
934− s.Dialog.Sessions.InfoBlurred = lipgloss.NewStyle().Foreground(fgSubtle)
935− s.Dialog.Sessions.InfoFocused = lipgloss.NewStyle().Foreground(fgBase)
897+ s.Dialog.Sessions.RenamingPlaceholder = base.Foreground(o.fgMoreSubtle)
898+ s.Dialog.Sessions.InfoBlurred = lipgloss.NewStyle().Foreground(o.fgMostSubtle)
899+ s.Dialog.Sessions.InfoFocused = lipgloss.NewStyle().Foreground(o.fgBase)
936900
937901 s.Status.Help = lipgloss.NewStyle().Padding(0, 1)
938− s.Status.SuccessIndicator = base.Foreground(bgSubtle).Background(success).Padding(0, 1).Bold(true).SetString("OKAY!")
902+ s.Status.SuccessIndicator = base.Foreground(o.bgLessVisible).Background(o.success).Padding(0, 1).Bold(true).SetString("OKAY!")
939903 s.Status.InfoIndicator = s.Status.SuccessIndicator
940904 s.Status.UpdateIndicator = s.Status.SuccessIndicator.SetString("HEY!")
941− s.Status.WarnIndicator = s.Status.SuccessIndicator.Foreground(bgOverlay).Background(warningStrong).SetString("WARNING")
942− s.Status.ErrorIndicator = s.Status.SuccessIndicator.Foreground(bgBase).Background(danger).SetString("ERROR")
943− s.Status.SuccessMessage = base.Foreground(bgSubtle).Background(successMuted).Padding(0, 1)
905+ s.Status.WarnIndicator = s.Status.SuccessIndicator.Foreground(o.bgMostVisible).Background(o.warning).SetString("WARNING")
906+ s.Status.ErrorIndicator = s.Status.SuccessIndicator.Foreground(o.bgBase).Background(o.destructive).SetString("ERROR")
907+ s.Status.SuccessMessage = base.Foreground(o.bgLessVisible).Background(o.successMostSubtle).Padding(0, 1)
944908 s.Status.InfoMessage = s.Status.SuccessMessage
945909 s.Status.UpdateMessage = s.Status.SuccessMessage
946− s.Status.WarnMessage = s.Status.SuccessMessage.Foreground(bgOverlay).Background(warning)
947− s.Status.ErrorMessage = s.Status.SuccessMessage.Foreground(onAccent).Background(error)
910+ s.Status.WarnMessage = s.Status.SuccessMessage.Foreground(o.bgMostVisible).Background(o.warningSubtle)
911+ s.Status.ErrorMessage = s.Status.SuccessMessage.Foreground(o.primary).Background(o.error)
948912
949913 // Completions styles
950− s.Completions.Normal = base.Background(bgSubtle).Foreground(fgBase)
951− s.Completions.Focused = base.Background(primary).Foreground(onAccent)
914+ s.Completions.Normal = base.Background(o.bgLessVisible).Foreground(o.fgBase)
915+ s.Completions.Focused = base.Background(o.primary).Foreground(o.primary)
952916 s.Completions.Match = base.Underline(true)
953917
954918 // Attachments styles
955− attachmentIconStyle := base.Foreground(bgSubtle).Background(success).Padding(0, 1)
919+ attachmentIconStyle := base.Foreground(o.bgLessVisible).Background(o.success).Padding(0, 1)
956920 s.Attachments.Image = attachmentIconStyle.SetString(ImageIcon)
957921 s.Attachments.Text = attachmentIconStyle.SetString(TextIcon)
958− s.Attachments.Normal = base.Padding(0, 1).MarginRight(1).Background(fgMuted).Foreground(fgBase)
959− s.Attachments.Deleting = base.Padding(0, 1).Bold(true).Background(danger).Foreground(fgBase)
922+ s.Attachments.Normal = base.Padding(0, 1).MarginRight(1).Background(o.fgMoreSubtle).Foreground(o.fgBase)
923+ s.Attachments.Deleting = base.Padding(0, 1).Bold(true).Background(o.destructive).Foreground(o.fgBase)
960924
961925 // Pills styles
962926 s.Pills.Base = base.Padding(0, 1)
963− s.Pills.Focused = base.Padding(0, 1).BorderStyle(lipgloss.RoundedBorder()).BorderForeground(bgOverlay)
927+ s.Pills.Focused = base.Padding(0, 1).BorderStyle(lipgloss.RoundedBorder()).BorderForeground(o.bgMostVisible)
964928 s.Pills.Blurred = base.Padding(0, 1).BorderStyle(lipgloss.HiddenBorder())
965− s.Pills.QueueItemPrefix = lipgloss.NewStyle().Foreground(fgMuted).SetString(" •")
966− s.Pills.QueueItemText = lipgloss.NewStyle().Foreground(fgMuted)
967− s.Pills.QueueLabel = lipgloss.NewStyle().Foreground(fgBase)
968− s.Pills.QueueIconBase = lipgloss.NewStyle().Foreground(fgBase)
969− s.Pills.QueueGradFromColor = error
970− s.Pills.QueueGradToColor = secondary
971− s.Pills.TodoLabel = lipgloss.NewStyle().Foreground(fgBase)
972− s.Pills.TodoProgress = lipgloss.NewStyle().Foreground(fgMuted)
973− s.Pills.TodoCurrentTask = lipgloss.NewStyle().Foreground(fgSubtle)
974− s.Pills.TodoSpinner = lipgloss.NewStyle().Foreground(successMuted)
975− s.Pills.HelpKey = lipgloss.NewStyle().Foreground(fgMuted)
976− s.Pills.HelpText = lipgloss.NewStyle().Foreground(fgSubtle)
929+ s.Pills.QueueItemPrefix = lipgloss.NewStyle().Foreground(o.fgMoreSubtle).SetString(" •")
930+ s.Pills.QueueItemText = lipgloss.NewStyle().Foreground(o.fgMoreSubtle)
931+ s.Pills.QueueLabel = lipgloss.NewStyle().Foreground(o.fgBase)
932+ s.Pills.QueueIconBase = lipgloss.NewStyle().Foreground(o.fgBase)
933+ s.Pills.QueueGradFromColor = o.error
934+ s.Pills.QueueGradToColor = o.secondary
935+ s.Pills.TodoLabel = lipgloss.NewStyle().Foreground(o.fgBase)
936+ s.Pills.TodoProgress = lipgloss.NewStyle().Foreground(o.fgMoreSubtle)
937+ s.Pills.TodoCurrentTask = lipgloss.NewStyle().Foreground(o.fgMostSubtle)
938+ s.Pills.TodoSpinner = lipgloss.NewStyle().Foreground(o.successMostSubtle)
939+ s.Pills.HelpKey = lipgloss.NewStyle().Foreground(o.fgMoreSubtle)
940+ s.Pills.HelpText = lipgloss.NewStyle().Foreground(o.fgMostSubtle)
977941 s.Pills.Area = base
978942
979943 return s
internal/ui/styles/themes.go+44−48
@@ -20,35 +20,33 @@ func CharmtonePantera() Styles {
2020 return quickStyle(quickStyleOpts{
2121 primary: charmtone.Charple,
2222 secondary: charmtone.Dolly,
23− tertiary: charmtone.Bok,
23+ accent: charmtone.Bok,
2424
25− fgBase: charmtone.Ash,
26− fgMuted: charmtone.Squid,
27− fgHalfMuted: charmtone.Smoke,
28− fgSubtle: charmtone.Oyster,
25+ fgBase: charmtone.Ash,
26+ fgMoreSubtle: charmtone.Squid,
27+ fgSubtle: charmtone.Smoke,
28+ fgMostSubtle: charmtone.Oyster,
2929
30− onPrimary: charmtone.Salt,
31− onAccent: charmtone.Butter,
30+ onPrimary: charmtone.Butter,
3231
33− bgBase: charmtone.Pepper,
34− bgBaseLighter: charmtone.BBQ,
35− bgSubtle: charmtone.Charcoal,
36− bgOverlay: charmtone.Iron,
32+ bgBase: charmtone.Pepper,
33+ bgLeastVisible: charmtone.BBQ,
34+ bgLessVisible: charmtone.Charcoal,
35+ bgMostVisible: charmtone.Iron,
3736
38− border: charmtone.Charcoal,
39− borderFocus: charmtone.Charple,
37+ separator: charmtone.Charcoal,
4038
41− danger: charmtone.Coral,
42− error: charmtone.Sriracha,
43− warning: charmtone.Zest,
44− warningStrong: charmtone.Mustard,
45− busy: charmtone.Citron,
46− info: charmtone.Malibu,
47− infoSubtle: charmtone.Sardine,
48− infoMuted: charmtone.Damson,
49− success: charmtone.Julep,
50− successSubtle: charmtone.Bok,
51− successMuted: charmtone.Guac,
39+ destructive: charmtone.Coral,
40+ error: charmtone.Sriracha,
41+ warningSubtle: charmtone.Zest,
42+ warning: charmtone.Mustard,
43+ busy: charmtone.Citron,
44+ info: charmtone.Malibu,
45+ infoMoreSubtle: charmtone.Sardine,
46+ infoMostSubtle: charmtone.Damson,
47+ success: charmtone.Julep,
48+ successMoreSubtle: charmtone.Bok,
49+ successMostSubtle: charmtone.Guac,
5250 })
5351}
5452
@@ -57,34 +55,32 @@ func HypercrushObsidiana() Styles {
5755 return quickStyle(quickStyleOpts{
5856 primary: charmtone.Charple,
5957 secondary: charmtone.Dolly,
60− tertiary: charmtone.Bok,
58+ accent: charmtone.Bok,
6159
62− fgBase: charmtone.Ash,
63− fgMuted: charmtone.Squid,
64− fgHalfMuted: charmtone.Smoke,
65− fgSubtle: charmtone.Oyster,
60+ fgBase: charmtone.Ash,
61+ fgMoreSubtle: charmtone.Squid,
62+ fgSubtle: charmtone.Smoke,
63+ fgMostSubtle: charmtone.Oyster,
6664
67− onPrimary: charmtone.Salt,
68− onAccent: charmtone.Butter,
65+ onPrimary: charmtone.Butter,
6966
70− bgBase: charmtone.Pepper,
71− bgBaseLighter: charmtone.BBQ,
72− bgSubtle: charmtone.Charcoal,
73− bgOverlay: charmtone.Iron,
67+ bgBase: charmtone.Pepper,
68+ bgLeastVisible: charmtone.BBQ,
69+ bgLessVisible: charmtone.Charcoal,
70+ bgMostVisible: charmtone.Iron,
7471
75− border: charmtone.Charcoal,
76− borderFocus: charmtone.Charple,
72+ separator: charmtone.Charcoal,
7773
78− danger: charmtone.Coral,
79− error: charmtone.Sriracha,
80− warning: charmtone.Zest,
81− warningStrong: charmtone.Mustard,
82− busy: charmtone.Citron,
83− info: charmtone.Malibu,
84− infoSubtle: charmtone.Sardine,
85− infoMuted: charmtone.Damson,
86− success: charmtone.Julep,
87− successSubtle: charmtone.Bok,
88− successMuted: charmtone.Guac,
74+ destructive: charmtone.Coral,
75+ error: charmtone.Sriracha,
76+ warningSubtle: charmtone.Zest,
77+ warning: charmtone.Mustard,
78+ busy: charmtone.Citron,
79+ info: charmtone.Malibu,
80+ infoMoreSubtle: charmtone.Sardine,
81+ infoMostSubtle: charmtone.Damson,
82+ success: charmtone.Julep,
83+ successMoreSubtle: charmtone.Bok,
84+ successMostSubtle: charmtone.Guac,
8985 })
9086}