From 8daeb21005df1e6842228f007d338af8335e92bf Mon Sep 17 00:00:00 2001 From: l0ng-ai <24760907+l0ng-ai@users.noreply.github.com> Date: Wed, 28 Oct 2026 20:56:38 +0800 Subject: [PATCH] fix(terminal): Line height, colour palette and tab names (#141) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(terminal): Line height, colour palette and tab names - Line height: with "Use editor font" the terminal took the editor's roomier line height (about 1.33 cells), stretching ASCII art and box drawing. It now always uses Settings › Tools › Terminal › Line height (default 1.0); that field moves out of the "Use editor font" group since it applies either way. - Colours: the terminal gets its own --terminal-ansi-* palette (the light and Darcula terminal colours); the Run console keeps --ansi-*. High-contrast and palette themes keep their console colours. Colours below a 4.5:1 contrast with the background are adjusted (xterm's minimumContrastRatio), so yellow stays readable on white. - Tab names: tabs keep their default name ("Local", "Local (2)") at the prompt and show the title a program sets only while a command runs. Shell integration now marks command start and end (OSC 133 C / D) for zsh, bash 4.4+ (PS0) and fish. * fix(themes): Document the terminal ANSI palette for theme plugins The --terminal-ansi-* tokens belong in a theme's editor colour scheme, like --ansi-*. The theme plugin template sets them and the token reference lists them. --- crates/ide-terminal/src/integration.rs | 24 +++++-- docs/plugins/themes.md | 23 ++++++- scripts/theme/tokens.ts | 2 +- src/features/settings/pages/tools.tsx | 18 ++--- src/features/terminal/embedded.ts | 4 +- src/features/terminal/session.ts | 23 +++++-- src/features/terminal/store.ts | 14 ++-- src/features/terminal/terminal.test.ts | 14 +++- src/features/terminal/theme.ts | 25 +++---- src/styles/tokens.css | 69 +++++++++++++++++++ .../themes/harbor-night.scheme.json | 20 +++++- 11 files changed, 194 insertions(+), 42 deletions(-) diff --git a/crates/ide-terminal/src/integration.rs b/crates/ide-terminal/src/integration.rs index 8d047548..7e55db42 100644 --- a/crates/ide-terminal/src/integration.rs +++ b/crates/ide-terminal/src/integration.rs @@ -1,6 +1,8 @@ //! Shell integration (Settings › Tools › Terminal › Shell integration): the //! shell reports its working directory (OSC 7) at every prompt, so links and -//! new splits resolve against the directory the user `cd`-ed into. +//! new splits resolve against the directory the user `cd`-ed into, and marks +//! where a command starts and ends (OSC 133 C / D), so the tab shows the +//! running program's title only while one runs. //! //! zsh starts with `ZDOTDIR` pointing at generated startup files that source //! the user's own ones first; bash gets an `--init-file` that replays the @@ -29,8 +31,11 @@ ZDOTDIR=$OPENIDEA_USER_ZDOTDIR [[ -f $ZDOTDIR/.zshrc ]] && . $ZDOTDIR/.zshrc OPENIDEA_USER_ZDOTDIR=$ZDOTDIR ZDOTDIR=$_openidea_dir -_openidea_osc7() { printf '\e]7;file://%s%s\a' "${HOST}" "${PWD}" } -autoload -Uz add-zsh-hook 2>/dev/null && add-zsh-hook precmd _openidea_osc7 +_openidea_osc7() { printf '\e]133;D\a\e]7;file://%s%s\a' "${HOST}" "${PWD}" } +_openidea_preexec() { printf '\e]133;C\a' } +# First, so the command counts as finished before other hooks set the prompt's title. +precmd_functions=(_openidea_osc7 ${precmd_functions:#_openidea_osc7}) +preexec_functions+=(_openidea_preexec) if [[ ! -o login ]]; then ZDOTDIR=$OPENIDEA_USER_ZDOTDIR unset OPENIDEA_USER_ZDOTDIR _openidea_dir @@ -54,15 +59,22 @@ if [ "${OPENIDEA_LOGIN:-}" = 1 ]; then else [ -f ~/.bashrc ] && . ~/.bashrc fi -__openidea_osc7() { printf '\e]7;file://%s%s\a' "${HOSTNAME}" "${PWD}"; } +__openidea_osc7() { printf '\e]133;D\a\e]7;file://%s%s\a' "${HOSTNAME}" "${PWD}"; } case ";${PROMPT_COMMAND:-};" in *";__openidea_osc7;"*) ;; *) PROMPT_COMMAND="__openidea_osc7${PROMPT_COMMAND:+;$PROMPT_COMMAND}" ;; esac +# PS0 (bash 4.4+) prints before each command runs. +case "${PS0:-}" in + *'133;C'*) ;; + *) PS0="${PS0:-}\e]133;C\a" ;; +esac "#; -const FISH_INIT: &str = - r#"function __openidea_osc7 --on-event fish_prompt; printf '\e]7;file://%s%s\a' (hostname) $PWD; end"#; +const FISH_INIT: &str = concat!( + r#"function __openidea_osc7 --on-event fish_prompt; printf '\e]133;D\a\e]7;file://%s%s\a' (hostname) $PWD; end; "#, + r#"function __openidea_preexec --on-event fish_preexec; printf '\e]133;C\a'; end"#, +); /// Directory holding the generated startup files (written on demand). fn scripts_dir() -> PathBuf { diff --git a/docs/plugins/themes.md b/docs/plugins/themes.md index d9defba9..ecd72301 100644 --- a/docs/plugins/themes.md +++ b/docs/plugins/themes.md @@ -295,7 +295,7 @@ a token. -203 themeable tokens: 113 in the UI theme file, 90 in the editor colour scheme file. +219 themeable tokens: 113 in the UI theme file, 106 in the editor colour scheme file. ### Surfaces (UI theme) @@ -480,6 +480,27 @@ a token. | `--ansi-bright-cyan` | `#00e5e5` | `#1b9ea3` | | `--ansi-bright-white` | `#ffffff` | `#5f6269` | +### Terminal ANSI palette (editor scheme) + +| Token | Islands Dark | Islands Light | +|---|---|---| +| `--terminal-ansi-black` | `#000000` | `#000000` | +| `--terminal-ansi-red` | `#f27481` | `#c93645` | +| `--terminal-ansi-green` | `#6bcc62` | `#357d1f` | +| `--terminal-ansi-yellow` | `#e0ce70` | `#b2a400` | +| `--terminal-ansi-blue` | `#5594fa` | `#225cd6` | +| `--terminal-ansi-magenta` | `#c092fa` | `#6e32e5` | +| `--terminal-ansi-cyan` | `#47ccbd` | `#007a80` | +| `--terminal-ansi-white` | `#ced0d6` | `#bec0c5` | +| `--terminal-ansi-bright-black` | `#4e5157` | `#6c707e` | +| `--terminal-ansi-bright-red` | `#ff6b7a` | `#ff5462` | +| `--terminal-ansi-bright-green` | `#67ff59` | `#3dcc3d` | +| `--terminal-ansi-bright-yellow` | `#ffec1a` | `#d4bb00` | +| `--terminal-ansi-bright-blue` | `#3399ff` | `#009dff` | +| `--terminal-ansi-bright-magenta` | `#d970ff` | `#d659ff` | +| `--terminal-ansi-bright-cyan` | `#40ffe9` | `#31c4b3` | +| `--terminal-ansi-bright-white` | `#ffffff` | `#d2d4d9` | + ### Shadows and window controls (UI theme) | Token | Islands Dark | Islands Light | diff --git a/scripts/theme/tokens.ts b/scripts/theme/tokens.ts index 6a70305d..58c773f4 100644 --- a/scripts/theme/tokens.ts +++ b/scripts/theme/tokens.ts @@ -23,7 +23,7 @@ export interface TokenGroup { } /** tokens.css sections that IntelliJ keeps in an editor scheme (`.icls`). */ -export const SCHEME_GROUPS = ["syntax", "editor", "ANSI palette"]; +export const SCHEME_GROUPS = ["syntax", "editor", "ANSI palette", "terminal ANSI palette"]; const LIGHT_SELECTOR = ':root[data-theme="light"]'; diff --git a/src/features/settings/pages/tools.tsx b/src/features/settings/pages/tools.tsx index e831de26..f95d0447 100644 --- a/src/features/settings/pages/tools.tsx +++ b/src/features/settings/pages/tools.tsx @@ -264,16 +264,16 @@ function TerminalFont() { aria-label="Terminal font size" /> - - - + + + (); @@ -42,7 +42,7 @@ export function createEmbeddedTerminal(host: HTMLElement, opts: EmbeddedTerminal macOptionIsMeta: settings.optionAsMeta, macOptionClickForcesSelection: true, drawBoldTextInBrightColors: false, - minimumContrastRatio: 1, + minimumContrastRatio: MIN_CONTRAST_RATIO, smoothScrollDuration: 0, convertEol: false, theme: readTerminalTheme(), diff --git a/src/features/terminal/session.ts b/src/features/terminal/session.ts index f4926af8..9c7c0f8c 100644 --- a/src/features/terminal/session.ts +++ b/src/features/terminal/session.ts @@ -23,6 +23,7 @@ import { terminalFont, type EditorFont, type TerminalFontSettings, + MIN_CONTRAST_RATIO, } from "./theme"; export interface TerminalSearchOptions { @@ -46,6 +47,8 @@ export interface SessionSnapshot { title: string; /** Window title set by the running program (OSC 0/2), null when unset or blank. */ appTitle: string | null; + /** A command is running (shell integration's OSC 133 C … D), or the session runs a non-shell program. */ + commandRunning: boolean; /** Current directory (initial cwd, updated by OSC 7). */ cwd: string; } @@ -177,7 +180,14 @@ export class TerminalSession { constructor(opts: SessionOptions) { this.opts = opts; this.key = opts.key; - this.snapshot = { status: "idle", exitCode: null, title: "Local", appTitle: null, cwd: opts.cwd }; + this.snapshot = { + status: "idle", + exitCode: null, + title: "Local", + appTitle: null, + commandRunning: false, + cwd: opts.cwd, + }; this.host = document.createElement("div"); this.host.className = "openidea-terminal-host"; this.host.dataset.terminalSession = opts.key; @@ -203,7 +213,7 @@ export class TerminalSession { macOptionClickForcesSelection: true, rightClickSelectsWord: false, drawBoldTextInBrightColors: false, - minimumContrastRatio: 1, + minimumContrastRatio: MIN_CONTRAST_RATIO, smoothScrollDuration: 0, // Same width as the IDE's scrollbars (global.css); the slider is styled there too (Terminal.module.css). overviewRuler: { width: 10 }, @@ -230,6 +240,11 @@ export class TerminalSession { } return true; }), + // OSC 133 (shell integration): C = a command starts, D = it finished. + this.term.parser.registerOscHandler(133, (data) => { + if (data === "C" || data.startsWith("D")) this.update({ commandRunning: data === "C" }); + return true; + }), this.term.registerLinkProvider({ provideLinks: (y, callback) => callback(workflowSettings().terminal.highlightHyperlinks ? this.linksAt(y) : undefined), @@ -373,7 +388,8 @@ export class TerminalSession { async start() { if (this.disposed || this.snapshot.status === "starting" || this.snapshot.status === "running") return; const generation = ++this.generation; - this.update({ status: "starting", exitCode: null, appTitle: null }); + const custom = this.opts.command; + this.update({ status: "starting", exitCode: null, appTitle: null, commandRunning: !!custom && !custom.shell }); if (!isTauri()) { this.term.writeln("\x1b[2mTerminal is unavailable outside the desktop app.\x1b[0m"); this.update({ status: "error" }); @@ -389,7 +405,6 @@ export class TerminalSession { try { const t = workflowSettings().terminal; const [shellPath, ...shellArgs] = splitCommandLine(t.shellPath); - const custom = this.opts.command; const shell = custom ? custom.program : shellPath; const args = custom ? custom.args : shellArgs; const info = await call( diff --git a/src/features/terminal/store.ts b/src/features/terminal/store.ts index f88e30b8..463bfb6b 100644 --- a/src/features/terminal/store.ts +++ b/src/features/terminal/store.ts @@ -103,19 +103,25 @@ export function trimMiddle(text: string, max: number): string { const APP_TITLE_MAX = 30; +/** The title the program in the tab's active pane set, while a command runs (at the prompt it is the shell's own). */ +function appTitle(tab: TerminalTab, sessions?: Record): string | null { + const s = sessions?.[tab.activePane]; + return s?.commandRunning ? s.appTitle : null; +} + /** - * The tab's label, as in IDEA: a name the user gave it, else the title the - * program in its active pane set (OSC 0/2, middle-trimmed), else the default name. + * The tab's label: a name the user gave it, else the title the running command + * set (OSC 0/2, middle-trimmed), else the default name. */ export function tabTitle(tab: TerminalTab, sessions?: Record): string { if (tab.customName) return tab.customName; - const app = sessions?.[tab.activePane]?.appTitle; + const app = appTitle(tab, sessions); return app ? trimMiddle(app, APP_TITLE_MAX) : tab.name; } /** Untrimmed title for the tab's tooltip. */ export function tabFullTitle(tab: TerminalTab, sessions?: Record): string { - return tab.customName ?? sessions?.[tab.activePane]?.appTitle ?? tab.name; + return tab.customName ?? appTitle(tab, sessions) ?? tab.name; } /** Settings › Terminal › Start directory, resolved against the project root. */ diff --git a/src/features/terminal/terminal.test.ts b/src/features/terminal/terminal.test.ts index b15fbd96..831ebe87 100644 --- a/src/features/terminal/terminal.test.ts +++ b/src/features/terminal/terminal.test.ts @@ -301,6 +301,11 @@ describe("terminalFont", () => { expect([f.weight, f.boldWeight]).toEqual([400, 700]); }); + it("keeps the terminal's line height with Use editor font", () => { + expect(terminalFont(t, { ...editor, lineHeight: 21 }, BASE).lineHeight).toBe(1); + expect(terminalFont({ ...t, lineHeight: 1.2 }, editor, BASE).lineHeight).toBe(1.2); + }); + it("turns the column width into letter spacing", () => { expect(terminalFont({ ...t, useEditorFont: false }, editor, BASE).letterSpacing).toBe(0); expect(terminalFont({ ...t, useEditorFont: false, columnWidth: 1.5 }, editor, BASE).letterSpacing).toBe(3); @@ -309,8 +314,13 @@ describe("terminalFont", () => { describe("terminal tab titles", () => { const tab: TerminalTab = { id: "t1", name: "Local", customName: null, panes: ["s1"], layout: "s1", activePane: "s1" }; - const snap = (appTitle: string | null): Record => ({ - s1: { status: "running", exitCode: null, title: "zsh", appTitle, cwd: "/p" }, + const snap = (appTitle: string | null, commandRunning = true): Record => ({ + s1: { status: "running", exitCode: null, title: "zsh", appTitle, commandRunning, cwd: "/p" }, + }); + + it("shows the default name at the prompt, whatever title the shell sets", () => { + expect(tabTitle(tab, snap("thomas@mac: ~/repo", false))).toBe("Local"); + expect(tabFullTitle(tab, snap("thomas@mac: ~/repo", false))).toBe("Local"); }); it("follows the title the running program sets, else the default name", () => { diff --git a/src/features/terminal/theme.ts b/src/features/terminal/theme.ts index aaaa79ca..5996a12d 100644 --- a/src/features/terminal/theme.ts +++ b/src/features/terminal/theme.ts @@ -1,8 +1,8 @@ /** * xterm.js theme read from the design tokens at runtime, so the terminal - * follows the active theme. The 16-colour palette comes from the `--ansi-*` - * tokens (PyCharm's console colours per theme); when a theme lacks them it is - * derived from the status + syntax tokens. + * follows the active theme. The 16-colour palette comes from the `--terminal-ansi-*` + * tokens, else the console's `--ansi-*`; when a theme lacks both it is derived + * from the status + syntax tokens. */ import type { ITheme, Terminal } from "@xterm/xterm"; import { fontWeightOf } from "@/platform/editorSettings"; @@ -24,6 +24,9 @@ export function mix(a: Rgba, b: Rgba, t: number): Rgba { return [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t, a[2] + (b[2] - a[2]) * t, 1]; } +/** Lifts colours that read poorly on the background (yellow on white) to WCAG AA. */ +export const MIN_CONTRAST_RATIO = 4.5; + /** Reads a token as a colour; `fallback` when missing or unparsable. */ export type TokenReader = (name: string) => string; @@ -46,7 +49,8 @@ export function buildTheme(read: TokenReader): ITheme { const accent = color("--accent"); const caret = color("--caret", toHex(accent)); const selection = parseColor(read("--bg-editor-selection")); - const ansi = (name: string, derived: () => Rgba): Rgba => parseColor(read(`--ansi-${name}`)) ?? derived(); + const ansi = (name: string, derived: () => Rgba): Rgba => + parseColor(read(`--terminal-ansi-${name}`)) ?? parseColor(read(`--ansi-${name}`)) ?? derived(); const red = ansi("red", () => color("--danger", "#c97a6f")); const green = ansi("green", () => color("--success", "#8fae7e")); @@ -195,8 +199,9 @@ function cssNumber(name: string): number { /** * Font from Settings › Tools › Terminal: the editor font (Editor › Font, with its - * fallback and Typography Settings weights) or the terminal's own family / size / line height (a multiple of the - * cell height). The family resolves like the editor's (`monoFontFamily`), so the + * fallback and Typography Settings weights) or the terminal's own family / size. The line + * height (a multiple of the cell height) is always the terminal's: the editor's roomier + * spacing would stretch box drawing and ASCII art. The family resolves like the editor's (`monoFontFamily`), so the * bundled JetBrains Mono is used where it isn't installed; `base` is the resolved * `--font-mono` stack, since xterm measures on a canvas and can't use `var()`. * The column width (a multiple of the cell width) becomes xterm's letter spacing, @@ -207,21 +212,17 @@ export function terminalFont( editor: EditorFont | undefined, base = monoStack(), ): TerminalFont { - let family: string, fallback: string, size: number, lineHeight: number; + let family: string, fallback: string, size: number; let weight = 400, boldWeight = 700; if (!t.useEditorFont) { family = t.fontFamily; fallback = t.fallbackFontFamily; size = t.fontSize; - lineHeight = t.lineHeight; } else { family = editor?.fontFamily || BUNDLED_MONO_FAMILY; fallback = t.fallbackFontFamily.trim() || editor?.fallbackFont || ""; size = editor?.fontSize || cssNumber("--fs-code") || 13; - const lh = editor?.lineHeight ?? (editor?.fontSize ? size * 1.6 : cssNumber("--lh-code") || 21); - // xterm's lineHeight is a multiplier of the cell height (≈ 1.2 × font size); aim for the editor's line height. - lineHeight = Math.max(1, Math.round((lh / (size * 1.2)) * 100) / 100); weight = fontWeightOf(editor?.fontWeight, weight); boldWeight = fontWeightOf(editor?.boldFontWeight, boldWeight); } @@ -229,7 +230,7 @@ export function terminalFont( return { family: withNerdFonts(monoFontFamily(family, fallback, base)), size, - lineHeight, + lineHeight: t.lineHeight, letterSpacing, weight, boldWeight, diff --git a/src/styles/tokens.css b/src/styles/tokens.css index c123c345..cb856a08 100644 --- a/src/styles/tokens.css +++ b/src/styles/tokens.css @@ -182,6 +182,24 @@ html { --ansi-bright-cyan: #00e5e5; --ansi-bright-white: #ffffff; + /* terminal ANSI palette (the Run console keeps --ansi-*) */ + --terminal-ansi-black: #000000; + --terminal-ansi-red: #f27481; + --terminal-ansi-green: #6bcc62; + --terminal-ansi-yellow: #e0ce70; + --terminal-ansi-blue: #5594fa; + --terminal-ansi-magenta: #c092fa; + --terminal-ansi-cyan: #47ccbd; + --terminal-ansi-white: #ced0d6; + --terminal-ansi-bright-black: #4e5157; + --terminal-ansi-bright-red: #ff6b7a; + --terminal-ansi-bright-green: #67ff59; + --terminal-ansi-bright-yellow: #ffec1a; + --terminal-ansi-bright-blue: #3399ff; + --terminal-ansi-bright-magenta: #d970ff; + --terminal-ansi-bright-cyan: #40ffe9; + --terminal-ansi-bright-white: #ffffff; + /* typography (Inter 13 UI, JetBrains Mono 13 editor) */ --font-ui: "Inter Variable", Inter, system-ui, -apple-system, sans-serif; /* Shortcut glyphs (⌘⇧⌥⌃↵) render best in the system UI font, as in macOS menus. */ @@ -527,6 +545,24 @@ html { --ansi-bright-cyan: #1b9ea3; --ansi-bright-white: #5f6269; + /* terminal ANSI palette (the Run console keeps --ansi-*) */ + --terminal-ansi-black: #000000; + --terminal-ansi-red: #c93645; + --terminal-ansi-green: #357d1f; + --terminal-ansi-yellow: #b2a400; + --terminal-ansi-blue: #225cd6; + --terminal-ansi-magenta: #6e32e5; + --terminal-ansi-cyan: #007a80; + --terminal-ansi-white: #bec0c5; + --terminal-ansi-bright-black: #6c707e; + --terminal-ansi-bright-red: #ff5462; + --terminal-ansi-bright-green: #3dcc3d; + --terminal-ansi-bright-yellow: #d4bb00; + --terminal-ansi-bright-blue: #009dff; + --terminal-ansi-bright-magenta: #d659ff; + --terminal-ansi-bright-cyan: #31c4b3; + --terminal-ansi-bright-white: #d2d4d9; + /* shadows and window controls */ --shadow-popup: 0 6px 20px rgba(0, 0, 0, 0.12); --shadow-dialog: 0 0 0 0.5px rgba(0, 0, 0, 0.1), 0 10px 24px rgba(0, 0, 0, 0.1), 0 24px 72px rgba(0, 0, 0, 0.2); @@ -754,6 +790,23 @@ html { --ansi-bright-magenta: #ff9cff; --ansi-bright-cyan: #4ff0f0; --ansi-bright-white: #ffffff; + /* the terminal keeps the high-contrast console palette */ + --terminal-ansi-black: var(--ansi-black); + --terminal-ansi-red: var(--ansi-red); + --terminal-ansi-green: var(--ansi-green); + --terminal-ansi-yellow: var(--ansi-yellow); + --terminal-ansi-blue: var(--ansi-blue); + --terminal-ansi-magenta: var(--ansi-magenta); + --terminal-ansi-cyan: var(--ansi-cyan); + --terminal-ansi-white: var(--ansi-white); + --terminal-ansi-bright-black: var(--ansi-bright-black); + --terminal-ansi-bright-red: var(--ansi-bright-red); + --terminal-ansi-bright-green: var(--ansi-bright-green); + --terminal-ansi-bright-yellow: var(--ansi-bright-yellow); + --terminal-ansi-bright-blue: var(--ansi-bright-blue); + --terminal-ansi-bright-magenta: var(--ansi-bright-magenta); + --terminal-ansi-bright-cyan: var(--ansi-bright-cyan); + --terminal-ansi-bright-white: var(--ansi-bright-white); --bg-tooltip: #24262b; --fg-tooltip: #ffffff; @@ -1034,6 +1087,22 @@ html { --ansi-bright-cyan: var(--palette-ansi-bright-cyan); --ansi-white: var(--palette-ansi-white); --ansi-bright-white: var(--palette-ansi-bright-white); + --terminal-ansi-black: var(--ansi-black); + --terminal-ansi-red: var(--ansi-red); + --terminal-ansi-green: var(--ansi-green); + --terminal-ansi-yellow: var(--ansi-yellow); + --terminal-ansi-blue: var(--ansi-blue); + --terminal-ansi-magenta: var(--ansi-magenta); + --terminal-ansi-cyan: var(--ansi-cyan); + --terminal-ansi-white: var(--ansi-white); + --terminal-ansi-bright-black: var(--ansi-bright-black); + --terminal-ansi-bright-red: var(--ansi-bright-red); + --terminal-ansi-bright-green: var(--ansi-bright-green); + --terminal-ansi-bright-yellow: var(--ansi-bright-yellow); + --terminal-ansi-bright-blue: var(--ansi-bright-blue); + --terminal-ansi-bright-magenta: var(--ansi-bright-magenta); + --terminal-ansi-bright-cyan: var(--ansi-bright-cyan); + --terminal-ansi-bright-white: var(--ansi-bright-white); } :root[data-color-theme="solarized-light"] { diff --git a/templates/theme-plugin/themes/harbor-night.scheme.json b/templates/theme-plugin/themes/harbor-night.scheme.json index bfc82470..892744ea 100644 --- a/templates/theme-plugin/themes/harbor-night.scheme.json +++ b/templates/theme-plugin/themes/harbor-night.scheme.json @@ -97,6 +97,24 @@ "--ansi-bright-blue": "#3be3d8", "--ansi-bright-magenta": "#ed7eed", "--ansi-bright-cyan": "#00e5e5", - "--ansi-bright-white": "#ffffff" + "--ansi-bright-white": "#ffffff", + + // Terminal ANSI palette + "--terminal-ansi-black": "#000000", + "--terminal-ansi-red": "#f0524f", + "--terminal-ansi-green": "#5c962c", + "--terminal-ansi-yellow": "#a68a0d", + "--terminal-ansi-blue": "#4cc1b9", + "--terminal-ansi-magenta": "#a771bf", + "--terminal-ansi-cyan": "#00a3a3", + "--terminal-ansi-white": "#6e7b8d", + "--terminal-ansi-bright-black": "#4c5561", + "--terminal-ansi-bright-red": "#ff4050", + "--terminal-ansi-bright-green": "#4fc414", + "--terminal-ansi-bright-yellow": "#e5bf00", + "--terminal-ansi-bright-blue": "#3be3d8", + "--terminal-ansi-bright-magenta": "#ed7eed", + "--terminal-ansi-bright-cyan": "#00e5e5", + "--terminal-ansi-bright-white": "#ffffff" } }