fix(terminal): Line height, colour palette and tab names (#141)

* 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.
This commit is contained in:
l0ng-ai
2026-10-28 20:56:38 +08:00
committed by GitHub
parent 44b2d11b2d
commit 8daeb21005
11 changed files with 194 additions and 42 deletions
+18 -6
View File
@@ -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 {
+22 -1
View File
@@ -295,7 +295,7 @@ a token.
<!-- BEGIN GENERATED TOKEN REFERENCE: pnpm gen:theme-docs -->
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 |
+1 -1
View File
@@ -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"]';
+9 -9
View File
@@ -264,16 +264,16 @@ function TerminalFont() {
aria-label="Terminal font size"
/>
</Row>
<Row label="Line height">
<NumberInput
value={lineHeight}
onChange={setLineHeight}
{...L.terminalLineHeight}
step={0.1}
aria-label="Terminal line height"
/>
</Row>
</Indented>
<Row label="Line height">
<NumberInput
value={lineHeight}
onChange={setLineHeight}
{...L.terminalLineHeight}
step={0.1}
aria-label="Terminal line height"
/>
</Row>
<Row label="Fallback font" htmlFor={fallbackId} hint="Used for characters the main font lacks.">
<Input
id={fallbackId}
+2 -2
View File
@@ -13,7 +13,7 @@ import { workflowSettings } from "@/platform/workflowSettings";
import { fitScheduler, settledResize } from "./fit";
import { findTerminalLinks } from "./links";
import { LINK_HANDLER, fontFor, openExternal, openFileLink } from "./session";
import { readTerminalTheme, remeasureWhenFontsLoad } from "./theme";
import { MIN_CONTRAST_RATIO, readTerminalTheme, remeasureWhenFontsLoad } from "./theme";
const live = new Set<Terminal>();
@@ -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(),
+19 -4
View File
@@ -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(
+10 -4
View File
@@ -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, SessionSnapshot>): 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, SessionSnapshot>): 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, SessionSnapshot>): 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. */
+12 -2
View File
@@ -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<string, SessionSnapshot> => ({
s1: { status: "running", exitCode: null, title: "zsh", appTitle, cwd: "/p" },
const snap = (appTitle: string | null, commandRunning = true): Record<string, SessionSnapshot> => ({
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", () => {
+13 -12
View File
@@ -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,
+69
View File
@@ -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"] {
@@ -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"
}
}