(renderer: CliRenderer)
| 654 | } |
| 655 | |
| 656 | export async function resolveRunTheme(renderer: CliRenderer): Promise<RunTheme> { |
| 657 | try { |
| 658 | const colors = await renderer.getPalette({ |
| 659 | size: 256, |
| 660 | }) |
| 661 | const bg = colors.defaultBackground ?? colors.palette[0] |
| 662 | if (!bg) { |
| 663 | return RUN_THEME_FALLBACK |
| 664 | } |
| 665 | |
| 666 | // Palette-only terminal reloads can leave renderer.themeMode stale, but |
| 667 | // ANSI slot zero is not the terminal background when OSC 11 is absent. |
| 668 | const pick = colors.defaultBackground |
| 669 | ? mode(RGBA.fromHex(colors.defaultBackground)) |
| 670 | : (renderer.themeMode ?? mode(RGBA.fromHex(bg))) |
| 671 | const footerTheme = resolveTheme(generateSystem(colors, pick), pick) |
| 672 | const indexed = indexedPalette(colors, 256) |
| 673 | const scrollbackTheme = quantizeTheme(footerTheme, indexed) |
| 674 | const shared = await import("@opencode-ai/tui/context/theme") |
| 675 | const syntaxTheme: SharedSyntaxTheme = { |
| 676 | ...scrollbackTheme, |
| 677 | _hasSelectedListItemText: true, |
| 678 | } |
| 679 | const syntax = shared.generateSyntax(syntaxTheme) |
| 680 | return map( |
| 681 | footerTheme, |
| 682 | scrollbackTheme, |
| 683 | splashTheme(scrollbackTheme, indexed), |
| 684 | syntax, |
| 685 | shared.generateSubtleSyntax(syntaxTheme), |
| 686 | ) |
| 687 | } catch { |
| 688 | return RUN_THEME_FALLBACK |
| 689 | } |
| 690 | } |
no test coverage detected