From 8ae5b56b5b463a51d8821d259983d033d6b88af3 Mon Sep 17 00:00:00 2001 From: "Daniel R. Neal" Date: Tue, 31 Mar 2026 18:08:28 -0700 Subject: [PATCH] feat(ui): add Tokyo Night theme (#24054) Co-authored-by: Gal Zahavi <38544478+galz10@users.noreply.github.com> --- docs/assets/theme-tokyonight-dark.png | Bin 0 -> 55614 bytes docs/cli/themes.md | 5 + .../src/ui/components/MainContent.test.tsx | 4 + .../__snapshots__/MainContent.test.tsx.snap | 8 +- .../__snapshots__/ThemeDialog.test.tsx.snap | 24 +-- .../ui/themes/builtin/dark/tokyonight-dark.ts | 155 ++++++++++++++++++ packages/cli/src/ui/themes/theme-manager.ts | 2 + 7 files changed, 182 insertions(+), 16 deletions(-) create mode 100644 docs/assets/theme-tokyonight-dark.png create mode 100644 packages/cli/src/ui/themes/builtin/dark/tokyonight-dark.ts diff --git a/docs/assets/theme-tokyonight-dark.png b/docs/assets/theme-tokyonight-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ebeec9354820a30d0c60fd81c1041d68fe633523 GIT binary patch literal 55614 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 literal 0 HcmV?d00001 diff --git a/docs/cli/themes.md b/docs/cli/themes.md index 55acc75625..93912032c0 100644 --- a/docs/cli/themes.md +++ b/docs/cli/themes.md @@ -19,6 +19,7 @@ using the `/theme` command within Gemini CLI: - `Holiday` - `Shades Of Purple` - `Solarized Dark` + - `Tokyo Night` - **Light themes:** - `ANSI Light` - `Ayu Light` @@ -252,6 +253,10 @@ identify their source, for example: `shades-of-green (green-extension)`. Solarized Dark theme +### Tokyo Night + +Tokyo Night theme + ## Light themes ### ANSI Light diff --git a/packages/cli/src/ui/components/MainContent.test.tsx b/packages/cli/src/ui/components/MainContent.test.tsx index 93d77e0dfe..2bc6ee27bc 100644 --- a/packages/cli/src/ui/components/MainContent.test.tsx +++ b/packages/cli/src/ui/components/MainContent.test.tsx @@ -27,6 +27,10 @@ import { } from '../hooks/useConfirmingTool.js'; // Mock dependencies +vi.mock('ink-spinner', () => ({ + default: () => , +})); + const mockUseSettings = vi.fn().mockReturnValue({ merged: { ui: { diff --git a/packages/cli/src/ui/components/__snapshots__/MainContent.test.tsx.snap b/packages/cli/src/ui/components/__snapshots__/MainContent.test.tsx.snap index 07a28039d1..f0260ddc91 100644 --- a/packages/cli/src/ui/components/__snapshots__/MainContent.test.tsx.snap +++ b/packages/cli/src/ui/components/__snapshots__/MainContent.test.tsx.snap @@ -4,7 +4,7 @@ exports[`MainContent > MainContent Tool Output Height Logic > 'ASB mode - Focuse "ScrollableList AppHeader(full) ╭──────────────────────────────────────────────────────────────────────────────────────────────╮ -│ ⊶ Shell Command Running a long command... │ +│ ⠋ Shell Command Running a long command... │ │ │ │ Line 11 │ │ Line 12 │ @@ -24,7 +24,7 @@ exports[`MainContent > MainContent Tool Output Height Logic > 'ASB mode - Unfocu "ScrollableList AppHeader(full) ╭──────────────────────────────────────────────────────────────────────────────────────────────╮ -│ ⊶ Shell Command Running a long command... │ +│ ⠋ Shell Command Running a long command... │ │ │ │ Line 11 │ │ Line 12 │ @@ -43,7 +43,7 @@ AppHeader(full) exports[`MainContent > MainContent Tool Output Height Logic > 'Normal mode - Constrained height' 1`] = ` "AppHeader(full) ╭──────────────────────────────────────────────────────────────────────────────────────────────╮ -│ ⊶ Shell Command Running a long command... │ +│ ⠋ Shell Command Running a long command... │ │ │ │ ... first 11 lines hidden (Ctrl+O to show) ... │ │ Line 12 │ @@ -62,7 +62,7 @@ exports[`MainContent > MainContent Tool Output Height Logic > 'Normal mode - Con exports[`MainContent > MainContent Tool Output Height Logic > 'Normal mode - Unconstrained height' 1`] = ` "AppHeader(full) ╭──────────────────────────────────────────────────────────────────────────────────────────────╮ -│ ⊶ Shell Command Running a long command... │ +│ ⠋ Shell Command Running a long command... │ │ │ │ Line 1 │ │ Line 2 │ diff --git a/packages/cli/src/ui/components/__snapshots__/ThemeDialog.test.tsx.snap b/packages/cli/src/ui/components/__snapshots__/ThemeDialog.test.tsx.snap index 4a5b30fc5c..2b9090e237 100644 --- a/packages/cli/src/ui/components/__snapshots__/ThemeDialog.test.tsx.snap +++ b/packages/cli/src/ui/components/__snapshots__/ThemeDialog.test.tsx.snap @@ -14,9 +14,9 @@ exports[`Initial Theme Selection > should default to a dark theme when terminal │ 7. Holiday Dark │ 6 return a │ │ │ 8. Shades Of Purple Dark │ │ │ │ 9. Solarized Dark │ 1 - print("Hello, " + name) │ │ -│ 10. ANSI Light │ 1 + print(f"Hello, {name}!") │ │ -│ 11. Ayu Light │ │ │ -│ 12. Default Light └─────────────────────────────────────────────────┘ │ +│ 10. Tokyo Night Dark │ 1 + print(f"Hello, {name}!") │ │ +│ 11. ANSI Light │ │ │ +│ 12. Ayu Light └─────────────────────────────────────────────────┘ │ │ ▼ │ │ │ │ (Use Enter to select, Tab to configure scope, Esc to close) │ @@ -64,9 +64,9 @@ exports[`Initial Theme Selection > should use the theme from settings even if te │ 7. Holiday Dark │ 6 return a │ │ │ 8. Shades Of Purple Dark │ │ │ │ 9. Solarized Dark │ 1 - print("Hello, " + name) │ │ -│ 10. ANSI Light │ 1 + print(f"Hello, {name}!") │ │ -│ 11. Ayu Light │ │ │ -│ 12. Default Light └─────────────────────────────────────────────────┘ │ +│ 10. Tokyo Night Dark │ 1 + print(f"Hello, {name}!") │ │ +│ 11. ANSI Light │ │ │ +│ 12. Ayu Light └─────────────────────────────────────────────────┘ │ │ ▼ │ │ │ │ (Use Enter to select, Tab to configure scope, Esc to close) │ @@ -103,9 +103,9 @@ exports[`ThemeDialog Snapshots > should render correctly in theme selection mode │ 7. Holiday Dark │ 6 return a │ │ │ 8. Shades Of Purple Dark │ │ │ │ 9. Solarized Dark │ 1 - print("Hello, " + name) │ │ -│ 10. ANSI Light │ 1 + print(f"Hello, {name}!") │ │ -│ 11. Ayu Light │ │ │ -│ 12. Default Light └─────────────────────────────────────────────────┘ │ +│ 10. Tokyo Night Dark │ 1 + print(f"Hello, {name}!") │ │ +│ 11. ANSI Light │ │ │ +│ 12. Ayu Light └─────────────────────────────────────────────────┘ │ │ ▼ │ │ │ │ (Use Enter to select, Tab to configure scope, Esc to close) │ @@ -128,9 +128,9 @@ exports[`ThemeDialog Snapshots > should render correctly in theme selection mode │ 7. Holiday Dark │ 6 return a │ │ │ 8. Shades Of Purple Dark │ │ │ │ 9. Solarized Dark │ 1 - print("Hello, " + name) │ │ -│ 10. ANSI Light │ 1 + print(f"Hello, {name}!") │ │ -│ 11. Ayu Light │ │ │ -│ 12. Default Light └─────────────────────────────────────────────────┘ │ +│ 10. Tokyo Night Dark │ 1 + print(f"Hello, {name}!") │ │ +│ 11. ANSI Light │ │ │ +│ 12. Ayu Light └─────────────────────────────────────────────────┘ │ │ ▼ │ │ ╭─────────────────────────────────────────────────╮ │ │ │ DEVELOPER TOOLS (Not visible to users) │ │ diff --git a/packages/cli/src/ui/themes/builtin/dark/tokyonight-dark.ts b/packages/cli/src/ui/themes/builtin/dark/tokyonight-dark.ts new file mode 100644 index 0000000000..ca2c242eaa --- /dev/null +++ b/packages/cli/src/ui/themes/builtin/dark/tokyonight-dark.ts @@ -0,0 +1,155 @@ +/** + * @license + * Copyright 2026 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import { type ColorsTheme, Theme } from '../../theme.js'; +import { interpolateColor } from '../../color-utils.js'; + +const palette = { + bg: '#1a1b26', + bg_dark: '#16161e', + bg_dark1: '#0C0E14', + bg_highlight: '#292e42', + blue: '#7aa2f7', + blue0: '#3d59a1', + blue1: '#2ac3de', + blue2: '#0db9d7', + blue5: '#89ddff', + blue6: '#b4f9f8', + blue7: '#394b70', + comment: '#565f89', + cyan: '#7dcfff', + fg: '#c0caf5', + fg_dark: '#a9b1d6', + fg_gutter: '#3b4261', + green: '#9ece6a', + green1: '#73daca', + green2: '#41a6b5', + magenta: '#bb9af7', + magenta2: '#ff007c', + orange: '#ff9e64', + purple: '#9d7cd8', + red: '#f7768e', + red1: '#db4b4b', + teal: '#1abc9c', + yellow: '#e0af68', + diff: { + add: '#243e4a', + change: '#1f2231', + delete: '#4a272f', + }, +}; + +const tokyoNightColors: ColorsTheme = { + type: 'dark', + Background: palette.bg, + Foreground: palette.fg, + LightBlue: palette.purple, + AccentBlue: palette.magenta, + AccentPurple: palette.blue, + AccentCyan: palette.cyan, + AccentGreen: palette.teal, + AccentYellow: palette.yellow, + AccentRed: palette.red1, + DiffAdded: palette.diff.add, + DiffRemoved: palette.diff.delete, + Comment: palette.comment, + Gray: palette.fg_dark, + DarkGray: palette.fg_gutter, + FocusColor: palette.blue, + GradientColors: [palette.blue, palette.magenta, palette.cyan], +}; + +export const TokyoNight: Theme = new Theme( + 'Tokyo Night', + 'dark', + { + hljs: { + display: 'block', + overflowX: 'auto', + padding: '0.5em', + background: palette.bg, + color: palette.fg, + }, + 'hljs-addition': { background: palette.diff.add }, + 'hljs-attr': { color: palette.green1 }, + 'hljs-attribute': { color: palette.green1 }, + 'hljs-brace': { color: palette.fg_dark }, + 'hljs-built_in': { color: palette.blue1 }, + 'hljs-builtin-symbol': { color: palette.blue1 }, + 'hljs-bullet': { + color: palette.orange, + fontWeight: 'bold', + }, + 'hljs-char': { color: palette.green }, + 'hljs-char-escape': { color: palette.magenta }, + 'hljs-character': { color: palette.green }, + 'hljs-class': { color: palette.blue1 }, + 'hljs-class-title': { color: palette.blue1 }, + 'hljs-code': { color: palette.green }, + 'hljs-comment': { + color: palette.comment, + fontStyle: 'italic', + }, + 'hljs-computation-expression': { color: palette.cyan }, + 'hljs-deletion': { background: palette.diff.delete }, + 'hljs-doctag': { color: palette.yellow }, + 'hljs-emphasis': { fontStyle: 'italic' }, + 'hljs-function': { color: palette.blue }, + 'hljs-function-dispatch': { color: palette.blue }, + 'hljs-keyword': { + color: palette.magenta, + fontStyle: 'italic', + }, + 'hljs-label': { color: palette.blue }, + 'hljs-link': { color: palette.teal }, + 'hljs-literal': { color: palette.orange }, + 'hljs-message-name': { color: palette.blue }, + 'hljs-meta': { color: palette.cyan }, + 'hljs-meta-prompt': { color: palette.fg_dark }, + 'hljs-name': { color: palette.magenta }, + 'hljs-named-character': { color: palette.blue1 }, + 'hljs-number': { color: palette.orange }, + 'hljs-operator': { color: palette.blue5 }, + 'hljs-params': { color: palette.yellow }, + 'hljs-property': { color: palette.green1 }, + 'hljs-punctuation': { color: palette.fg_dark }, + 'hljs-quote': { + color: palette.comment, + fontStyle: 'italic', + }, + 'hljs-regex': { color: palette.blue6 }, + 'hljs-regexp': { color: palette.blue6 }, + 'hljs-rest_arg': { + color: interpolateColor(palette.yellow, palette.fg, 0.8), + }, + 'hljs-section': { + color: palette.blue, + fontWeight: 'bold', + }, + 'hljs-selector-attr': { color: palette.cyan }, + 'hljs-selector-class': { color: palette.green1 }, + 'hljs-selector-id': { color: palette.green1 }, + 'hljs-selector-pseudo': { color: palette.cyan }, + 'hljs-selector-tag': { color: palette.magenta }, + 'hljs-string': { color: palette.green }, + 'hljs-strong': { fontWeight: 'bold' }, + 'hljs-subst': { color: palette.blue5 }, + 'hljs-symbol': { color: palette.magenta }, + 'hljs-tag': { color: palette.blue1 }, + 'hljs-template-tag': { color: palette.blue5 }, + 'hljs-template-variable': { color: palette.fg }, + 'hljs-title': { color: palette.blue }, + 'hljs-title-class': { color: palette.blue1 }, + 'hljs-title-class-inherited': { color: palette.blue1 }, + 'hljs-title-function': { color: palette.blue }, + 'hljs-title-function-invoke': { color: palette.blue }, + 'hljs-type': { color: palette.blue1 }, + 'hljs-variable': { color: palette.fg }, + 'hljs-variable-constant': { color: palette.orange }, + 'hljs-variable-language': { color: palette.red }, + }, + tokyoNightColors, +); diff --git a/packages/cli/src/ui/themes/theme-manager.ts b/packages/cli/src/ui/themes/theme-manager.ts index 96b4fea4e3..9f0a7e528a 100644 --- a/packages/cli/src/ui/themes/theme-manager.ts +++ b/packages/cli/src/ui/themes/theme-manager.ts @@ -18,6 +18,7 @@ import { ShadesOfPurple } from './builtin/dark/shades-of-purple-dark.js'; import { SolarizedDark } from './builtin/dark/solarized-dark.js'; import { SolarizedLight } from './builtin/light/solarized-light.js'; import { XCode } from './builtin/light/xcode-light.js'; +import { TokyoNight } from './builtin/dark/tokyonight-dark.js'; import * as fs from 'node:fs'; import * as path from 'node:path'; import type { Theme, ThemeType, ColorsTheme, CustomTheme } from './theme.js'; @@ -84,6 +85,7 @@ class ThemeManager { SolarizedDark, SolarizedLight, XCode, + TokyoNight, ANSI, ANSILight, ];