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"
}
}