@nghyane/arcane 0.1.10 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/package.json +4 -4
  2. package/src/main.ts +3 -0
  3. package/src/modes/components/model-selector.ts +1 -1
  4. package/src/modes/components/status-line.ts +15 -40
  5. package/src/modes/components/user-message.ts +2 -0
  6. package/src/modes/components/welcome.ts +1 -1
  7. package/src/modes/interactive-mode.ts +2 -0
  8. package/src/modes/theme/dark.json +56 -59
  9. package/src/modes/theme/defaults/dark-catppuccin.json +47 -56
  10. package/src/modes/theme/defaults/dark-dracula.json +24 -32
  11. package/src/modes/theme/defaults/dark-gruvbox.json +53 -74
  12. package/src/modes/theme/defaults/dark-solarized.json +33 -35
  13. package/src/modes/theme/defaults/dark-tokyo-night.json +57 -67
  14. package/src/modes/theme/defaults/index.ts +3 -179
  15. package/src/modes/theme/defaults/light-catppuccin.json +42 -50
  16. package/src/modes/theme/defaults/light-github.json +68 -94
  17. package/src/modes/theme/defaults/light-solarized.json +41 -49
  18. package/src/modes/theme/light.json +14 -12
  19. package/src/modes/theme/theme-schema.json +4 -0
  20. package/src/modes/theme/theme.ts +89 -6
  21. package/src/tui/output-block.ts +2 -12
  22. package/src/modes/theme/defaults/alabaster.json +0 -93
  23. package/src/modes/theme/defaults/amethyst.json +0 -96
  24. package/src/modes/theme/defaults/anthracite.json +0 -93
  25. package/src/modes/theme/defaults/basalt.json +0 -91
  26. package/src/modes/theme/defaults/birch.json +0 -95
  27. package/src/modes/theme/defaults/dark-abyss.json +0 -91
  28. package/src/modes/theme/defaults/dark-arctic.json +0 -104
  29. package/src/modes/theme/defaults/dark-aurora.json +0 -95
  30. package/src/modes/theme/defaults/dark-cavern.json +0 -91
  31. package/src/modes/theme/defaults/dark-copper.json +0 -95
  32. package/src/modes/theme/defaults/dark-cosmos.json +0 -90
  33. package/src/modes/theme/defaults/dark-cyberpunk.json +0 -102
  34. package/src/modes/theme/defaults/dark-eclipse.json +0 -91
  35. package/src/modes/theme/defaults/dark-ember.json +0 -95
  36. package/src/modes/theme/defaults/dark-equinox.json +0 -90
  37. package/src/modes/theme/defaults/dark-forest.json +0 -96
  38. package/src/modes/theme/defaults/dark-github.json +0 -105
  39. package/src/modes/theme/defaults/dark-lavender.json +0 -95
  40. package/src/modes/theme/defaults/dark-lunar.json +0 -89
  41. package/src/modes/theme/defaults/dark-midnight.json +0 -95
  42. package/src/modes/theme/defaults/dark-monochrome.json +0 -94
  43. package/src/modes/theme/defaults/dark-monokai.json +0 -98
  44. package/src/modes/theme/defaults/dark-nebula.json +0 -90
  45. package/src/modes/theme/defaults/dark-nord.json +0 -97
  46. package/src/modes/theme/defaults/dark-ocean.json +0 -101
  47. package/src/modes/theme/defaults/dark-one.json +0 -100
  48. package/src/modes/theme/defaults/dark-rainforest.json +0 -91
  49. package/src/modes/theme/defaults/dark-reef.json +0 -91
  50. package/src/modes/theme/defaults/dark-retro.json +0 -92
  51. package/src/modes/theme/defaults/dark-rose-pine.json +0 -96
  52. package/src/modes/theme/defaults/dark-sakura.json +0 -95
  53. package/src/modes/theme/defaults/dark-slate.json +0 -95
  54. package/src/modes/theme/defaults/dark-solstice.json +0 -90
  55. package/src/modes/theme/defaults/dark-starfall.json +0 -91
  56. package/src/modes/theme/defaults/dark-sunset.json +0 -99
  57. package/src/modes/theme/defaults/dark-swamp.json +0 -90
  58. package/src/modes/theme/defaults/dark-synthwave.json +0 -103
  59. package/src/modes/theme/defaults/dark-taiga.json +0 -91
  60. package/src/modes/theme/defaults/dark-terminal.json +0 -95
  61. package/src/modes/theme/defaults/dark-tundra.json +0 -91
  62. package/src/modes/theme/defaults/dark-twilight.json +0 -91
  63. package/src/modes/theme/defaults/dark-volcanic.json +0 -91
  64. package/src/modes/theme/defaults/graphite.json +0 -92
  65. package/src/modes/theme/defaults/light-arctic.json +0 -107
  66. package/src/modes/theme/defaults/light-aurora-day.json +0 -91
  67. package/src/modes/theme/defaults/light-canyon.json +0 -91
  68. package/src/modes/theme/defaults/light-cirrus.json +0 -90
  69. package/src/modes/theme/defaults/light-coral.json +0 -95
  70. package/src/modes/theme/defaults/light-cyberpunk.json +0 -96
  71. package/src/modes/theme/defaults/light-dawn.json +0 -90
  72. package/src/modes/theme/defaults/light-dunes.json +0 -91
  73. package/src/modes/theme/defaults/light-eucalyptus.json +0 -95
  74. package/src/modes/theme/defaults/light-forest.json +0 -100
  75. package/src/modes/theme/defaults/light-frost.json +0 -95
  76. package/src/modes/theme/defaults/light-glacier.json +0 -91
  77. package/src/modes/theme/defaults/light-gruvbox.json +0 -108
  78. package/src/modes/theme/defaults/light-haze.json +0 -90
  79. package/src/modes/theme/defaults/light-honeycomb.json +0 -95
  80. package/src/modes/theme/defaults/light-lagoon.json +0 -91
  81. package/src/modes/theme/defaults/light-lavender.json +0 -95
  82. package/src/modes/theme/defaults/light-meadow.json +0 -91
  83. package/src/modes/theme/defaults/light-mint.json +0 -95
  84. package/src/modes/theme/defaults/light-monochrome.json +0 -101
  85. package/src/modes/theme/defaults/light-ocean.json +0 -99
  86. package/src/modes/theme/defaults/light-one.json +0 -99
  87. package/src/modes/theme/defaults/light-opal.json +0 -91
  88. package/src/modes/theme/defaults/light-orchard.json +0 -91
  89. package/src/modes/theme/defaults/light-paper.json +0 -95
  90. package/src/modes/theme/defaults/light-prism.json +0 -90
  91. package/src/modes/theme/defaults/light-retro.json +0 -98
  92. package/src/modes/theme/defaults/light-sand.json +0 -95
  93. package/src/modes/theme/defaults/light-savanna.json +0 -91
  94. package/src/modes/theme/defaults/light-soleil.json +0 -90
  95. package/src/modes/theme/defaults/light-sunset.json +0 -99
  96. package/src/modes/theme/defaults/light-synthwave.json +0 -98
  97. package/src/modes/theme/defaults/light-tokyo-night.json +0 -111
  98. package/src/modes/theme/defaults/light-wetland.json +0 -91
  99. package/src/modes/theme/defaults/light-zenith.json +0 -89
  100. package/src/modes/theme/defaults/limestone.json +0 -94
  101. package/src/modes/theme/defaults/mahogany.json +0 -97
  102. package/src/modes/theme/defaults/marble.json +0 -93
  103. package/src/modes/theme/defaults/obsidian.json +0 -91
  104. package/src/modes/theme/defaults/onyx.json +0 -91
  105. package/src/modes/theme/defaults/pearl.json +0 -93
  106. package/src/modes/theme/defaults/porcelain.json +0 -91
  107. package/src/modes/theme/defaults/quartz.json +0 -96
  108. package/src/modes/theme/defaults/sandstone.json +0 -95
  109. package/src/modes/theme/defaults/titanium.json +0 -90
@@ -6,7 +6,7 @@ import {
6
6
  supportsLanguage as nativeSupportsLanguage,
7
7
  } from "@nghyane/arcane-natives";
8
8
  import type { EditorTheme, MarkdownTheme, SelectListTheme, SymbolTheme } from "@nghyane/arcane-tui";
9
- import { adjustHsv, isEnoent, logger } from "@nghyane/arcane-utils";
9
+ import { adjustHsv, hexToHsv, hsvToHex, isEnoent, logger } from "@nghyane/arcane-utils";
10
10
  import { getCustomThemesDir } from "@nghyane/arcane-utils/dirs";
11
11
  import { type Static, Type } from "@sinclair/typebox";
12
12
  import { TypeCompiler } from "@sinclair/typebox/compiler";
@@ -959,7 +959,8 @@ export type ThemeBg =
959
959
  | "toolPendingBg"
960
960
  | "toolSuccessBg"
961
961
  | "toolErrorBg"
962
- | "statusLineBg";
962
+ | "statusLineBg"
963
+ | "appBg";
963
964
 
964
965
  type ColorMode = "truecolor" | "256color";
965
966
 
@@ -1015,7 +1016,7 @@ function resolveVarRefs(
1015
1016
  vars: Record<string, ColorValue>,
1016
1017
  visited = new Set<string>(),
1017
1018
  ): string | number {
1018
- if (typeof value === "number" || value === "" || value.startsWith("#")) {
1019
+ if (typeof value === "number" || value === "" || value.startsWith("#") || value.startsWith("^")) {
1019
1020
  return value;
1020
1021
  }
1021
1022
  if (visited.has(value)) {
@@ -1171,10 +1172,28 @@ export class Theme {
1171
1172
  return `${ansi}${text}\x1b[39m`; // Reset only foreground color
1172
1173
  }
1173
1174
 
1174
- bg(color: ThemeBg, text: string): string {
1175
+ /**
1176
+ * Wrap text with a background color, stabilizing inner SGR resets.
1177
+ * When terminal bg is not detected, uses reverse video as fallback.
1178
+ * This is the single source of truth for bg wrapping — all bg rendering goes through here.
1179
+ */
1180
+ wrapBg(color: ThemeBg, text: string): string {
1175
1181
  const ansi = this.#bgColors[color];
1176
1182
  if (!ansi) throw new Error(`Unknown theme background color: ${color}`);
1177
- return `${ansi}${text}\x1b[49m`; // Reset only background color
1183
+ if (ansi === "\x1b[49m") {
1184
+ // Transparent fallback: reverse video with fg color preservation
1185
+ const stabilized = text
1186
+ .replace(/\x1b\[(?:0)?m/g, m => `${m}\x1b[7m`)
1187
+ .replace(/\x1b\[(?:3[0-9]m|38;)/g, m => `\x1b[27m${m}`);
1188
+ return `\x1b[7m${stabilized}\x1b[27m`;
1189
+ }
1190
+ // Real bg: stabilize inner resets by re-applying bg after them
1191
+ const stabilized = text.replace(/\x1b\[(?:0)?m/g, m => `${m}${ansi}`).replace(/\x1b\[49m/g, m => `${m}${ansi}`);
1192
+ return `${ansi}${stabilized}${this.#bgColors.appBg}`;
1193
+ }
1194
+
1195
+ bg(color: ThemeBg, text: string): string {
1196
+ return this.wrapBg(color, text);
1178
1197
  }
1179
1198
 
1180
1199
  bold(text: string): string {
@@ -1209,6 +1228,19 @@ export class Theme {
1209
1228
  return ansi;
1210
1229
  }
1211
1230
 
1231
+ getAppBgAnsi(): string {
1232
+ return this.#bgColors.appBg;
1233
+ }
1234
+
1235
+ getAppBgPackedRgb(): number {
1236
+ const ansi = this.#bgColors.appBg;
1237
+ const match = ansi.match(/\x1b\[48;2;(\d+);(\d+);(\d+)m/);
1238
+ if (!match) return 0;
1239
+ return (
1240
+ ((Number(match[1]) & 0xff) << 16) | ((Number(match[2]) & 0xff) << 8) | (Number(match[3]) & 0xff) | 0x01000000
1241
+ );
1242
+ }
1243
+
1212
1244
  getColorMode(): ColorMode {
1213
1245
  return this.mode;
1214
1246
  }
@@ -1563,11 +1595,48 @@ interface CreateThemeOptions {
1563
1595
  mode?: ColorMode;
1564
1596
  symbolPresetOverride?: SymbolPreset;
1565
1597
  colorBlindMode?: boolean;
1598
+ terminalBg?: string;
1566
1599
  }
1567
1600
 
1568
1601
  /** HSV adjustment to shift green toward blue for colorblind mode (red-green colorblindness) */
1569
1602
  const COLORBLIND_ADJUSTMENT = { h: 60, s: 0.71 };
1570
1603
 
1604
+ /**
1605
+ * Resolve a relative bg color value against the terminal background.
1606
+ * Format: "^N" where N is a brightness adjustment percentage.
1607
+ * Positive = lighter, negative = darker. E.g., "^5" or "^-3".
1608
+ * Returns the resolved hex color, or the original value if not relative.
1609
+ */
1610
+ function resolveRelativeBg(value: string | number, terminalBg: string): string | number {
1611
+ if (typeof value !== "string" || !value.startsWith("^")) return value;
1612
+ const delta = parseFloat(value.slice(1));
1613
+ if (Number.isNaN(delta)) return value;
1614
+ const hsv = hexToHsv(terminalBg);
1615
+ hsv.v = Math.max(0, Math.min(1, hsv.v + delta / 100));
1616
+ return hsvToHex(hsv);
1617
+ }
1618
+
1619
+ function detectDefaultSymbolPreset(): SymbolPreset {
1620
+ const termProgram = Bun.env.TERM_PROGRAM ?? "";
1621
+ const term = Bun.env.TERM ?? "";
1622
+
1623
+ // Terminals with known Nerd Font fallback support
1624
+ const nerdFontTerminals = new Set([
1625
+ "iTerm.app",
1626
+ "WezTerm",
1627
+ "Hyper",
1628
+ "vscode",
1629
+ "Termius",
1630
+ "WarpTerminal",
1631
+ "ghostty",
1632
+ "Tabby",
1633
+ ]);
1634
+ if (nerdFontTerminals.has(termProgram)) return "nerd";
1635
+ if (term === "xterm-kitty") return "nerd";
1636
+
1637
+ return "unicode";
1638
+ }
1639
+
1571
1640
  function createTheme(themeJson: ThemeJson, options: CreateThemeOptions = {}): Theme {
1572
1641
  const { mode, symbolPresetOverride, colorBlindMode } = options;
1573
1642
  const colorMode = mode ?? detectColorMode();
@@ -1580,6 +1649,15 @@ function createTheme(themeJson: ThemeJson, options: CreateThemeOptions = {}): Th
1580
1649
  }
1581
1650
  }
1582
1651
 
1652
+ // Resolve relative bg colors (^N format) against terminal background
1653
+ const termBg = options.terminalBg;
1654
+ for (const key of Object.keys(resolvedColors) as Array<keyof typeof resolvedColors>) {
1655
+ const value = resolvedColors[key];
1656
+ if (typeof value === "string" && value.startsWith("^")) {
1657
+ resolvedColors[key] = termBg ? resolveRelativeBg(value, termBg) : "";
1658
+ }
1659
+ }
1660
+
1583
1661
  const fgColors: Record<ThemeColor, string | number> = {} as Record<ThemeColor, string | number>;
1584
1662
  const bgColors: Record<ThemeBg, string | number> = {} as Record<ThemeBg, string | number>;
1585
1663
  const bgColorKeys: Set<string> = new Set([
@@ -1590,6 +1668,7 @@ function createTheme(themeJson: ThemeJson, options: CreateThemeOptions = {}): Th
1590
1668
  "toolSuccessBg",
1591
1669
  "toolErrorBg",
1592
1670
  "statusLineBg",
1671
+ "appBg",
1593
1672
  ]);
1594
1673
  for (const [key, value] of Object.entries(resolvedColors)) {
1595
1674
  if (bgColorKeys.has(key)) {
@@ -1599,7 +1678,7 @@ function createTheme(themeJson: ThemeJson, options: CreateThemeOptions = {}): Th
1599
1678
  }
1600
1679
  }
1601
1680
  // Extract symbol configuration - settings override takes precedence over theme
1602
- const symbolPreset: SymbolPreset = symbolPresetOverride ?? themeJson.symbols?.preset ?? "unicode";
1681
+ const symbolPreset: SymbolPreset = symbolPresetOverride ?? themeJson.symbols?.preset ?? detectDefaultSymbolPreset();
1603
1682
  const symbolOverrides = themeJson.symbols?.overrides ?? {};
1604
1683
  return new Theme(fgColors, bgColors, colorMode, symbolPreset, symbolOverrides);
1605
1684
  }
@@ -1650,6 +1729,7 @@ export function getCurrentThemeName(): string | undefined {
1650
1729
  }
1651
1730
  var currentSymbolPresetOverride: SymbolPreset | undefined;
1652
1731
  var currentColorBlindMode: boolean = false;
1732
+ var currentTerminalBg: string | undefined;
1653
1733
  var themeWatcher: fs.FSWatcher | undefined;
1654
1734
  var sigwinchHandler: (() => void) | undefined;
1655
1735
  var autoDetectedTheme: boolean = false;
@@ -1662,6 +1742,7 @@ function getCurrentThemeOptions(): CreateThemeOptions {
1662
1742
  return {
1663
1743
  symbolPresetOverride: currentSymbolPresetOverride,
1664
1744
  colorBlindMode: currentColorBlindMode,
1745
+ terminalBg: currentTerminalBg,
1665
1746
  };
1666
1747
  }
1667
1748
 
@@ -1671,6 +1752,7 @@ export async function initTheme(
1671
1752
  colorBlindMode?: boolean,
1672
1753
  darkTheme?: string,
1673
1754
  lightTheme?: string,
1755
+ terminalBg?: string,
1674
1756
  ): Promise<void> {
1675
1757
  autoDetectedTheme = true;
1676
1758
  autoDarkTheme = darkTheme ?? "dark";
@@ -1679,6 +1761,7 @@ export async function initTheme(
1679
1761
  currentThemeName = name;
1680
1762
  currentSymbolPresetOverride = symbolPreset;
1681
1763
  currentColorBlindMode = colorBlindMode ?? false;
1764
+ currentTerminalBg = terminalBg;
1682
1765
  try {
1683
1766
  theme = await loadTheme(name, getCurrentThemeOptions());
1684
1767
  if (enableWatcher) {
@@ -32,18 +32,8 @@ export function renderOutputBlock(options: OutputBlockOptions, theme: Theme): st
32
32
  ? "accent"
33
33
  : "dim";
34
34
  const border = (text: string) => theme.fg(borderColor, text);
35
- const bgFn = (() => {
36
- if (!state || !applyBg) return undefined;
37
- const bgAnsi = theme.getBgAnsi(getStateBgColor(state));
38
- // Keep block background stable even if inner content contains SGR resets (e.g. "\x1b[0m"),
39
- // which would otherwise clear the outer background mid-line.
40
- return (text: string) => {
41
- const stabilized = text
42
- .replace(/\x1b\[(?:0)?m/g, m => `${m}${bgAnsi}`)
43
- .replace(/\x1b\[49m/g, m => `${m}${bgAnsi}`);
44
- return `${bgAnsi}${stabilized}\x1b[49m`;
45
- };
46
- })();
35
+ const bgColor = state && applyBg ? getStateBgColor(state) : undefined;
36
+ const bgFn = bgColor ? (text: string) => theme.wrapBg(bgColor, text) : undefined;
47
37
 
48
38
  const buildBarLine = (leftChar: string, rightChar: string, label?: string, meta?: string): string => {
49
39
  const left = border(`${leftChar}${cap}`);
@@ -1,93 +0,0 @@
1
- {
2
- "$schema": "https://raw.githubusercontent.com/nghyane/arcane/main/packages/coding-agent/theme-schema.json",
3
- "name": "alabaster",
4
- "vars": {
5
- "alabaster": "#fdfcfb",
6
- "chiseledBlack": "#1a1c20",
7
- "shadowGray": "#505860",
8
- "carvedDepth": "#6a7080",
9
- "subtleShadow": "#e8e8ec",
10
- "lightShadow": "#f0f0f4",
11
- "accent": "#404850",
12
- "warmShadow": "#8a7060",
13
- "selectedBg": "#f0eff0",
14
- "userMsgBg": "#f5f4f5",
15
- "toolPendingBg": "#f3f3f8",
16
- "toolSuccessBg": "#f4f5f4",
17
- "toolErrorBg": "#f8f3f3",
18
- "customMsgBg": "#f6f4f7"
19
- },
20
- "colors": {
21
- "accent": "shadowGray",
22
- "border": "subtleShadow",
23
- "borderAccent": "shadowGray",
24
- "borderMuted": "lightShadow",
25
- "success": "#405840",
26
- "error": "#704040",
27
- "warning": "#806850",
28
- "muted": "carvedDepth",
29
- "dim": "#909098",
30
- "text": "",
31
- "thinkingText": "carvedDepth",
32
- "selectedBg": "selectedBg",
33
- "userMessageBg": "userMsgBg",
34
- "userMessageText": "",
35
- "customMessageBg": "customMsgBg",
36
- "customMessageText": "",
37
- "customMessageLabel": "shadowGray",
38
- "toolPendingBg": "toolPendingBg",
39
- "toolSuccessBg": "toolSuccessBg",
40
- "toolErrorBg": "toolErrorBg",
41
- "toolTitle": "",
42
- "toolOutput": "carvedDepth",
43
- "mdHeading": "chiseledBlack",
44
- "mdLink": "shadowGray",
45
- "mdLinkUrl": "carvedDepth",
46
- "mdCode": "accent",
47
- "mdCodeBlock": "shadowGray",
48
- "mdCodeBlockBorder": "subtleShadow",
49
- "mdQuote": "carvedDepth",
50
- "mdQuoteBorder": "subtleShadow",
51
- "mdHr": "subtleShadow",
52
- "mdListBullet": "shadowGray",
53
- "toolDiffAdded": "#405840",
54
- "toolDiffRemoved": "#704040",
55
- "toolDiffContext": "carvedDepth",
56
- "syntaxComment": "#707880",
57
- "syntaxKeyword": "#303840",
58
- "syntaxFunction": "chiseledBlack",
59
- "syntaxVariable": "chiseledBlack",
60
- "syntaxString": "warmShadow",
61
- "syntaxNumber": "shadowGray",
62
- "syntaxType": "#303840",
63
- "syntaxOperator": "#404850",
64
- "syntaxPunctuation": "#505860",
65
- "thinkingOff": "#c0c0c8",
66
- "thinkingMinimal": "#a0a0a8",
67
- "thinkingLow": "#808090",
68
- "thinkingMedium": "#606870",
69
- "thinkingHigh": "#505860",
70
- "thinkingXhigh": "#303840",
71
- "bashMode": "#405840",
72
- "statusLineBg": "#ececf0",
73
- "statusLineSep": "#a0a0a8",
74
- "statusLineModel": "#505860",
75
- "statusLinePath": "#404850",
76
- "statusLineGitClean": "#305030",
77
- "statusLineGitDirty": "#806030",
78
- "statusLineContext": "#404860",
79
- "statusLineSpend": "#405050",
80
- "statusLineStaged": 28,
81
- "statusLineDirty": 136,
82
- "statusLineUntracked": 31,
83
- "statusLineOutput": 133,
84
- "statusLineCost": 133,
85
- "statusLineSubagents": "shadowGray",
86
- "pythonMode": "#f0c040"
87
- },
88
- "export": {
89
- "pageBg": "#fdfcfb",
90
- "cardBg": "#ffffff",
91
- "infoBg": "#faf9f8"
92
- }
93
- }
@@ -1,96 +0,0 @@
1
- {
2
- "$schema": "https://raw.githubusercontent.com/nghyane/arcane/main/packages/coding-agent/theme-schema.json",
3
- "name": "amethyst",
4
- "vars": {
5
- "amethyst": "#b48eff",
6
- "violet": "#9b6fd8",
7
- "deepPurple": "#6b4d9e",
8
- "quartz": "#f0e8f4",
9
- "roseQuartz": "#e5b4d4",
10
- "gold": "#d4af37",
11
- "lavender": "#c8a8e9",
12
- "crystalFacet": "#2a2435",
13
- "caveDark": "#140f18",
14
- "caveDeep": "#0f0b13",
15
- "selectedBg": "#221b28",
16
- "userMsgBg": "#1a1420",
17
- "toolPendingBg": "#1b1624",
18
- "toolSuccessBg": "#151220",
19
- "toolErrorBg": "#261418",
20
- "customMsgBg": "#1f1828"
21
- },
22
- "colors": {
23
- "accent": "amethyst",
24
- "border": "deepPurple",
25
- "borderAccent": "amethyst",
26
- "borderMuted": "crystalFacet",
27
- "success": "#8eb897",
28
- "error": "#d96c75",
29
- "warning": "gold",
30
- "muted": "#8b7a99",
31
- "dim": "#6a5a78",
32
- "text": "",
33
- "thinkingText": "#8b7a99",
34
- "selectedBg": "selectedBg",
35
- "userMessageBg": "userMsgBg",
36
- "userMessageText": "",
37
- "customMessageBg": "customMsgBg",
38
- "customMessageText": "",
39
- "customMessageLabel": "lavender",
40
- "toolPendingBg": "toolPendingBg",
41
- "toolSuccessBg": "toolSuccessBg",
42
- "toolErrorBg": "toolErrorBg",
43
- "toolTitle": "",
44
- "toolOutput": "#8b7a99",
45
- "mdHeading": "amethyst",
46
- "mdLink": "violet",
47
- "mdLinkUrl": "#6a5a78",
48
- "mdCode": "roseQuartz",
49
- "mdCodeBlock": "quartz",
50
- "mdCodeBlockBorder": "crystalFacet",
51
- "mdQuote": "#8b7a99",
52
- "mdQuoteBorder": "crystalFacet",
53
- "mdHr": "crystalFacet",
54
- "mdListBullet": "amethyst",
55
- "toolDiffAdded": "#8eb897",
56
- "toolDiffRemoved": "#d96c75",
57
- "toolDiffContext": "#8b7a99",
58
- "link": "violet",
59
- "syntaxComment": "#7a6b88",
60
- "syntaxKeyword": "amethyst",
61
- "syntaxFunction": "gold",
62
- "syntaxVariable": "lavender",
63
- "syntaxString": "roseQuartz",
64
- "syntaxNumber": "#a8c9b0",
65
- "syntaxType": "violet",
66
- "syntaxOperator": "quartz",
67
- "syntaxPunctuation": "#c0b0cf",
68
- "thinkingOff": "crystalFacet",
69
- "thinkingMinimal": "#6a5a78",
70
- "thinkingLow": "deepPurple",
71
- "thinkingMedium": "violet",
72
- "thinkingHigh": "amethyst",
73
- "thinkingXhigh": "lavender",
74
- "bashMode": "amethyst",
75
- "statusLineBg": "caveDeep",
76
- "statusLineSep": 240,
77
- "statusLineModel": "roseQuartz",
78
- "statusLinePath": "violet",
79
- "statusLineGitClean": "#8eb897",
80
- "statusLineGitDirty": "gold",
81
- "statusLineContext": "lavender",
82
- "statusLineSpend": "deepPurple",
83
- "statusLineStaged": 141,
84
- "statusLineDirty": 179,
85
- "statusLineUntracked": 183,
86
- "statusLineOutput": 213,
87
- "statusLineCost": 213,
88
- "statusLineSubagents": "amethyst",
89
- "pythonMode": "gold"
90
- },
91
- "export": {
92
- "pageBg": "caveDark",
93
- "cardBg": "#1b1520",
94
- "infoBg": "#251d2b"
95
- }
96
- }
@@ -1,93 +0,0 @@
1
- {
2
- "$schema": "https://raw.githubusercontent.com/nghyane/arcane/main/packages/coding-agent/theme-schema.json",
3
- "name": "anthracite",
4
- "vars": {
5
- "coal": "#121419",
6
- "steel": "#3d4555",
7
- "steelLight": "#4f5566",
8
- "ember": "#e8734a",
9
- "emberDim": "#b5583a",
10
- "ash": "#d4d8e4",
11
- "ashGray": "#9ca3b5",
12
- "soot": "#6b7280",
13
- "sootDark": "#4d5561",
14
- "coalLighter": "#1a1e25",
15
- "success": "#7fb069",
16
- "error": "#d9534f",
17
- "warning": "#e89c4a"
18
- },
19
- "colors": {
20
- "accent": "ember",
21
- "border": "steel",
22
- "borderAccent": "steelLight",
23
- "borderMuted": "sootDark",
24
- "success": "success",
25
- "error": "error",
26
- "warning": "warning",
27
- "muted": "ashGray",
28
- "dim": "soot",
29
- "text": "",
30
- "thinkingText": "soot",
31
- "selectedBg": "#252932",
32
- "userMessageBg": "#1a1511",
33
- "userMessageText": "",
34
- "customMessageBg": "#1f1a24",
35
- "customMessageText": "",
36
- "customMessageLabel": "#c99a6e",
37
- "toolPendingBg": "#171a21",
38
- "toolSuccessBg": "#141a16",
39
- "toolErrorBg": "#221617",
40
- "toolTitle": "",
41
- "toolOutput": "ashGray",
42
- "mdHeading": "ember",
43
- "mdLink": "#6ba3d4",
44
- "mdLinkUrl": "soot",
45
- "mdCode": "#e8b089",
46
- "mdCodeBlock": "#c1cfe0",
47
- "mdCodeBlockBorder": "steel",
48
- "mdQuote": "ashGray",
49
- "mdQuoteBorder": "sootDark",
50
- "mdHr": "steel",
51
- "mdListBullet": "ember",
52
- "toolDiffAdded": "success",
53
- "toolDiffRemoved": "error",
54
- "toolDiffContext": "soot",
55
- "link": "#6ba3d4",
56
- "syntaxComment": "#6b8099",
57
- "syntaxKeyword": "#7ba8d4",
58
- "syntaxFunction": "#e8a069",
59
- "syntaxVariable": "#a9b8cf",
60
- "syntaxString": "#c98963",
61
- "syntaxNumber": "#89b084",
62
- "syntaxType": "#67b8a8",
63
- "syntaxOperator": "#b8bfcc",
64
- "syntaxPunctuation": "#9ca3b5",
65
- "thinkingOff": "sootDark",
66
- "thinkingMinimal": "soot",
67
- "thinkingLow": "#5f7fa3",
68
- "thinkingMedium": "#6ba3d4",
69
- "thinkingHigh": "#c99a6e",
70
- "thinkingXhigh": "#e8b089",
71
- "bashMode": "#6ba3d4",
72
- "statusLineBg": "#0f1114",
73
- "statusLineSep": 240,
74
- "statusLineModel": "#c99a6e",
75
- "statusLinePath": "#6ba3d4",
76
- "statusLineGitClean": "#7fb069",
77
- "statusLineGitDirty": "#e89c4a",
78
- "statusLineContext": "#8791a6",
79
- "statusLineSpend": "#6ba3d4",
80
- "statusLineStaged": 107,
81
- "statusLineDirty": 179,
82
- "statusLineUntracked": 74,
83
- "statusLineOutput": 173,
84
- "statusLineCost": 173,
85
- "statusLineSubagents": "ember",
86
- "pythonMode": "#f0c040"
87
- },
88
- "export": {
89
- "pageBg": "#121419",
90
- "cardBg": "#1a1e25",
91
- "infoBg": "#2a2317"
92
- }
93
- }
@@ -1,91 +0,0 @@
1
- {
2
- "$schema": "https://raw.githubusercontent.com/nghyane/arcane/main/packages/coding-agent/theme-schema.json",
3
- "name": "basalt",
4
- "vars": {
5
- "charcoal": "#171613",
6
- "coolingLava": "#3a3530",
7
- "warmGray": "#4a433d",
8
- "pumice": "#e4e0d8",
9
- "dustyWhite": "#cac5bd",
10
- "ironOxide": "#c45a3a",
11
- "rustOrange": "#d97651",
12
- "mineralGreen": "#6a9a6a",
13
- "lichtenGreen": "#8bb88b",
14
- "obsidian": "#0f0d0b",
15
- "emberRed": "#b84a2c",
16
- "ashGray": "#5a524b"
17
- },
18
- "colors": {
19
- "accent": "#c45a3a",
20
- "border": "#3a3530",
21
- "borderAccent": "#4a433d",
22
- "borderMuted": "#2a2520",
23
- "success": "#6a9a6a",
24
- "error": "#b84a2c",
25
- "warning": "#d97651",
26
- "muted": "#5a524b",
27
- "dim": "#4a433d",
28
- "text": "",
29
- "thinkingText": "#cac5bd",
30
- "selectedBg": "#2a2520",
31
- "userMessageBg": "#3a3530",
32
- "userMessageText": "",
33
- "customMessageBg": "#4a433d",
34
- "customMessageText": "",
35
- "customMessageLabel": "#c45a3a",
36
- "toolPendingBg": "#2a2520",
37
- "toolSuccessBg": "#1f2520",
38
- "toolErrorBg": "#2a1f1d",
39
- "toolTitle": "",
40
- "toolOutput": "#cac5bd",
41
- "mdHeading": "#c45a3a",
42
- "mdLink": "#8bb88b",
43
- "mdLinkUrl": "#6a9a6a",
44
- "mdCode": "#d97651",
45
- "mdCodeBlock": "#cac5bd",
46
- "mdCodeBlockBorder": "#3a3530",
47
- "mdQuote": "#cac5bd",
48
- "mdQuoteBorder": "#4a433d",
49
- "mdHr": "#3a3530",
50
- "mdListBullet": "#c45a3a",
51
- "toolDiffAdded": "#6a9a6a",
52
- "toolDiffRemoved": "#b84a2c",
53
- "toolDiffContext": "#5a524b",
54
- "syntaxComment": "#5a524b",
55
- "syntaxKeyword": "#c45a3a",
56
- "syntaxFunction": "#8bb88b",
57
- "syntaxVariable": "#e4e0d8",
58
- "syntaxString": "#6a9a6a",
59
- "syntaxNumber": "#d97651",
60
- "syntaxType": "#c45a3a",
61
- "syntaxOperator": "#cac5bd",
62
- "syntaxPunctuation": "#cac5bd",
63
- "thinkingOff": "#3a3530",
64
- "thinkingMinimal": "#4a433d",
65
- "thinkingLow": "#5a524b",
66
- "thinkingMedium": "#6a605a",
67
- "thinkingHigh": "#7a706a",
68
- "thinkingXhigh": "#8a807a",
69
- "bashMode": "#c45a3a",
70
- "statusLineBg": "#0f0d0b",
71
- "statusLineSep": "#3a3530",
72
- "statusLineModel": "#c45a3a",
73
- "statusLinePath": "#cac5bd",
74
- "statusLineGitClean": "#6a9a6a",
75
- "statusLineGitDirty": "#d97651",
76
- "statusLineContext": "#8bb88b",
77
- "statusLineSpend": "#d97651",
78
- "statusLineStaged": "#6a9a6a",
79
- "statusLineDirty": "#d97651",
80
- "statusLineUntracked": "#5a524b",
81
- "statusLineOutput": "#cac5bd",
82
- "statusLineCost": "#d97651",
83
- "statusLineSubagents": "#c45a3a",
84
- "pythonMode": "#f0c040"
85
- },
86
- "export": {
87
- "pageBg": "#171613",
88
- "cardBg": "#1f1c19",
89
- "infoBg": "#2a2520"
90
- }
91
- }
@@ -1,95 +0,0 @@
1
- {
2
- "$schema": "https://raw.githubusercontent.com/nghyane/arcane/main/packages/coding-agent/theme-schema.json",
3
- "name": "birch",
4
- "vars": {
5
- "barkCream": "#f9f7f1",
6
- "barkCharcoal": "#505048",
7
- "mossSage": "#608058",
8
- "barkStriation": "#c8c4b8",
9
- "forestFloor": "#282820",
10
- "lightMoss": "#7a9a70",
11
- "darkMoss": "#4a603f",
12
- "warmGray": "#9a958a",
13
- "mutedSage": "#8a9d84",
14
- "deepBark": "#3a3832",
15
- "selectedBg": "#ede9df",
16
- "userMsgBg": "#f2efe7",
17
- "toolPendingBg": "#eef0ed",
18
- "toolSuccessBg": "#ecf2ea",
19
- "toolErrorBg": "#f5efed",
20
- "customMsgBg": "#eef5ec"
21
- },
22
- "colors": {
23
- "accent": "mossSage",
24
- "border": "barkStriation",
25
- "borderAccent": "mossSage",
26
- "borderMuted": "barkStriation",
27
- "success": "lightMoss",
28
- "error": "#b85a50",
29
- "warning": "#b8984a",
30
- "muted": "warmGray",
31
- "dim": "mutedSage",
32
- "text": "",
33
- "thinkingText": "warmGray",
34
- "selectedBg": "selectedBg",
35
- "userMessageBg": "userMsgBg",
36
- "userMessageText": "",
37
- "customMessageBg": "customMsgBg",
38
- "customMessageText": "",
39
- "customMessageLabel": "#5a7a52",
40
- "toolPendingBg": "toolPendingBg",
41
- "toolSuccessBg": "toolSuccessBg",
42
- "toolErrorBg": "toolErrorBg",
43
- "toolTitle": "",
44
- "toolOutput": "barkCharcoal",
45
- "mdHeading": "#8a7050",
46
- "mdLink": "#4a7060",
47
- "mdLinkUrl": "warmGray",
48
- "mdCode": "mossSage",
49
- "mdCodeBlock": "darkMoss",
50
- "mdCodeBlockBorder": "barkStriation",
51
- "mdQuote": "warmGray",
52
- "mdQuoteBorder": "barkStriation",
53
- "mdHr": "barkStriation",
54
- "mdListBullet": "lightMoss",
55
- "toolDiffAdded": "lightMoss",
56
- "toolDiffRemoved": "#b85a50",
57
- "toolDiffContext": "warmGray",
58
- "syntaxComment": "#7a8070",
59
- "syntaxKeyword": "#4a7060",
60
- "syntaxFunction": "#6a7a50",
61
- "syntaxVariable": "#3a5048",
62
- "syntaxString": "#8a604a",
63
- "syntaxNumber": "#4a7a5a",
64
- "syntaxType": "#5a6a70",
65
- "syntaxOperator": "barkCharcoal",
66
- "syntaxPunctuation": "barkCharcoal",
67
- "thinkingOff": "barkStriation",
68
- "thinkingMinimal": "mutedSage",
69
- "thinkingLow": "#6a8a70",
70
- "thinkingMedium": "mossSage",
71
- "thinkingHigh": "#5a7a60",
72
- "thinkingXhigh": "#4a6050",
73
- "bashMode": "lightMoss",
74
- "statusLineBg": "#ebe7dc",
75
- "statusLineSep": "barkStriation",
76
- "statusLineModel": "#5a6a5a",
77
- "statusLinePath": "#4a5a60",
78
- "statusLineGitClean": "darkMoss",
79
- "statusLineGitDirty": "#9a7040",
80
- "statusLineContext": "#6a6a70",
81
- "statusLineSpend": "#4a6a6a",
82
- "statusLineStaged": 28,
83
- "statusLineDirty": 136,
84
- "statusLineUntracked": 31,
85
- "statusLineOutput": 133,
86
- "statusLineCost": 133,
87
- "statusLineSubagents": "mossSage",
88
- "pythonMode": "#f0c040"
89
- },
90
- "export": {
91
- "pageBg": "#f9f7f1",
92
- "cardBg": "#fefdfb",
93
- "infoBg": "#f5f8f3"
94
- }
95
- }