@fresh-editor/fresh-editor 0.2.21 → 0.2.22

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.
@@ -333,8 +333,10 @@ interface ThemeEditorState {
333
333
  themeData: Record<string, unknown>;
334
334
  /** Original theme data (for change detection) */
335
335
  originalThemeData: Record<string, unknown>;
336
- /** Theme name */
336
+ /** Theme display name */
337
337
  themeName: string;
338
+ /** Theme registry key (for lookups) */
339
+ themeKey: string;
338
340
  /** Theme file path (null for new themes) */
339
341
  themePath: string | null;
340
342
  /** Expanded sections */
@@ -345,8 +347,10 @@ interface ThemeEditorState {
345
347
  selectedIndex: number;
346
348
  /** Whether there are unsaved changes */
347
349
  hasChanges: boolean;
348
- /** Available built-in themes */
349
- builtinThemes: string[];
350
+ /** All themes from registry: key → {name, pack} */
351
+ themeRegistry: Map<string, {name: string; pack: string}>;
352
+ /** Keys of builtin themes (empty pack) */
353
+ builtinKeys: Set<string>;
350
354
  /** Pending save name for overwrite confirmation */
351
355
  pendingSaveName: string | null;
352
356
  /** Whether current theme is a built-in (requires Save As) */
@@ -411,13 +415,15 @@ const state: ThemeEditorState = {
411
415
  sourceBufferId: null,
412
416
  themeData: {},
413
417
  originalThemeData: {},
414
- themeName: "custom",
418
+ themeName: "",
419
+ themeKey: "",
415
420
  themePath: null,
416
421
  expandedSections: new Set(["editor", "syntax"]),
417
422
  visibleFields: [],
418
423
  selectedIndex: 0,
419
424
  hasChanges: false,
420
- builtinThemes: [],
425
+ themeRegistry: new Map(),
426
+ builtinKeys: new Set(),
421
427
  pendingSaveName: null,
422
428
  isBuiltin: false,
423
429
  savedCursorPath: null,
@@ -669,33 +675,50 @@ function findThemesDir(): string {
669
675
  /**
670
676
  * Load list of available built-in themes
671
677
  */
672
- async function loadBuiltinThemes(): Promise<string[]> {
678
+ /**
679
+ * Load all themes from the registry, returning a map of key → display name.
680
+ *
681
+ * The registry is keyed by unique keys (repo URLs, file:// paths, or bare
682
+ * names for builtins). Each value contains a `name` field (display name)
683
+ * and `_key`/`_pack` metadata.
684
+ */
685
+ /**
686
+ * Load theme registry and populate state.themeRegistry + state.builtinKeys.
687
+ */
688
+ async function loadThemeRegistry(): Promise<void> {
673
689
  try {
674
- editor.debug("[theme_editor] loadBuiltinThemes: calling editor.getBuiltinThemes()");
690
+ editor.debug("[theme_editor] loadThemeRegistry: calling editor.getBuiltinThemes()");
675
691
  const rawThemes = editor.getBuiltinThemes();
676
- editor.debug(`[theme_editor] loadBuiltinThemes: got rawThemes type=${typeof rawThemes}`);
677
- // getBuiltinThemes returns a JSON string, need to parse it
678
- const builtinThemes = typeof rawThemes === "string"
679
- ? JSON.parse(rawThemes) as Record<string, string>
680
- : rawThemes as Record<string, string>;
681
- editor.debug(`[theme_editor] loadBuiltinThemes: parsed ${Object.keys(builtinThemes).length} themes`);
682
- return Object.keys(builtinThemes);
692
+ const themes = typeof rawThemes === "string"
693
+ ? JSON.parse(rawThemes) as Record<string, Record<string, unknown>>
694
+ : rawThemes as Record<string, Record<string, unknown>>;
695
+ state.themeRegistry = new Map();
696
+ state.builtinKeys = new Set();
697
+ for (const [key, data] of Object.entries(themes)) {
698
+ const name = (data?.name as string) || key;
699
+ const pack = (data?._pack as string) || "";
700
+ state.themeRegistry.set(key, {name, pack});
701
+ // Builtin themes have an empty pack; user themes start with "user"
702
+ if (!pack || (!pack.startsWith("user") && !pack.startsWith("pkg"))) {
703
+ state.builtinKeys.add(key);
704
+ }
705
+ }
706
+ editor.debug(`[theme_editor] loadThemeRegistry: loaded ${state.themeRegistry.size} themes (${state.builtinKeys.size} builtin)`);
683
707
  } catch (e) {
684
- editor.debug(`[theme_editor] Failed to load built-in themes list: ${e}`);
708
+ editor.debug(`[theme_editor] Failed to load theme registry: ${e}`);
685
709
  throw e;
686
710
  }
687
711
  }
688
712
 
689
713
  /**
690
- * Load theme data by name from the in-memory theme registry.
691
- * Works for all theme types (builtin, user, package) — no file I/O needed.
714
+ * Load theme data by key from the in-memory theme registry.
692
715
  */
693
- function loadThemeFile(name: string): Record<string, unknown> | null {
716
+ function loadThemeFile(key: string): Record<string, unknown> | null {
694
717
  try {
695
- const data = editor.getThemeData(name);
718
+ const data = editor.getThemeData(key);
696
719
  return data as Record<string, unknown> | null;
697
720
  } catch (e) {
698
- editor.debug(`[theme_editor] Failed to load theme data for '${name}': ${e}`);
721
+ editor.debug(`[theme_editor] Failed to load theme data for '${key}': ${e}`);
699
722
  return null;
700
723
  }
701
724
  }
@@ -1559,28 +1582,17 @@ async function onThemeOpenPromptConfirmed(args: {
1559
1582
  }): Promise<boolean> {
1560
1583
  if (args.prompt_type !== "theme-open") return true;
1561
1584
 
1562
- const value = args.input.trim();
1585
+ const key = args.input.trim();
1586
+ const isBuiltin = state.builtinKeys.has(key);
1587
+ const entry = state.themeRegistry.get(key);
1588
+ const themeName = entry?.name || key;
1563
1589
 
1564
- // Parse the value to determine if it's user or builtin
1565
- let isBuiltin = false;
1566
- let themeName = value;
1567
-
1568
- if (value.startsWith("user:")) {
1569
- themeName = value.slice(5);
1570
- isBuiltin = false;
1571
- } else if (value.startsWith("builtin:")) {
1572
- themeName = value.slice(8);
1573
- isBuiltin = true;
1574
- } else {
1575
- // Fallback: check if it's a builtin theme
1576
- isBuiltin = state.builtinThemes.includes(value);
1577
- }
1578
-
1579
- const themeData = loadThemeFile(themeName);
1590
+ const themeData = loadThemeFile(key);
1580
1591
  if (themeData) {
1581
1592
  state.themeData = deepClone(themeData);
1582
1593
  state.originalThemeData = deepClone(themeData);
1583
1594
  state.themeName = themeName;
1595
+ state.themeKey = key;
1584
1596
  state.themePath = null;
1585
1597
  state.isBuiltin = isBuiltin;
1586
1598
  state.hasChanges = false;
@@ -1623,7 +1635,7 @@ async function onThemeSaveAsPromptConfirmed(args: {
1623
1635
  state.saveAsPreFilled = false;
1624
1636
 
1625
1637
  // Reject names that match a built-in theme
1626
- if (state.builtinThemes.includes(name)) {
1638
+ if (state.builtinKeys.has(name)) {
1627
1639
  editor.startPromptWithInitial(editor.t("prompt.save_as_builtin_error"), "theme-save-as", name);
1628
1640
  editor.setPromptSuggestions([{
1629
1641
  text: state.themeName,
@@ -1693,30 +1705,19 @@ async function onThemeSelectInitialPromptConfirmed(args: {
1693
1705
  }
1694
1706
  editor.debug(`[theme_editor] prompt_type matched, processing selection...`);
1695
1707
 
1696
- const value = args.input.trim();
1697
-
1698
- // Parse the value to determine if it's user or builtin
1699
- let isBuiltin = false;
1700
- let themeName = value;
1701
-
1702
- if (value.startsWith("user:")) {
1703
- themeName = value.slice(5);
1704
- isBuiltin = false;
1705
- } else if (value.startsWith("builtin:")) {
1706
- themeName = value.slice(8);
1707
- isBuiltin = true;
1708
- } else {
1709
- // Fallback: check if it's a builtin theme
1710
- isBuiltin = state.builtinThemes.includes(value);
1711
- }
1708
+ const key = args.input.trim();
1709
+ const isBuiltin = state.builtinKeys.has(key);
1710
+ const entry = state.themeRegistry.get(key);
1711
+ const themeName = entry?.name || key;
1712
1712
 
1713
1713
  editor.debug(editor.t("status.loading"));
1714
1714
 
1715
- const themeData = loadThemeFile(themeName);
1715
+ const themeData = loadThemeFile(key);
1716
1716
  if (themeData) {
1717
1717
  state.themeData = deepClone(themeData);
1718
1718
  state.originalThemeData = deepClone(themeData);
1719
1719
  state.themeName = themeName;
1720
+ state.themeKey = key;
1720
1721
  state.themePath = null;
1721
1722
  state.isBuiltin = isBuiltin;
1722
1723
  state.hasChanges = false;
@@ -1758,6 +1759,11 @@ async function saveTheme(name?: string, restorePath?: string | null): Promise<bo
1758
1759
  // (must match Rust's normalize_theme_name so config name matches filename)
1759
1760
  const themeName = (name || state.themeName).toLowerCase().replace(/[_ ]/g, "-");
1760
1761
 
1762
+ if (!themeName) {
1763
+ editor.setStatus(editor.t("status.save_failed", { error: "No theme name" }));
1764
+ return false;
1765
+ }
1766
+
1761
1767
  try {
1762
1768
  // Build a complete theme object from all known fields.
1763
1769
  // This ensures we always write every field, even if state.themeData
@@ -1781,6 +1787,7 @@ async function saveTheme(name?: string, restorePath?: string | null): Promise<bo
1781
1787
 
1782
1788
  state.themePath = savedPath;
1783
1789
  state.themeName = themeName;
1790
+ state.themeKey = `file://${savedPath}`;
1784
1791
  state.isBuiltin = false; // After saving, it's now a user theme
1785
1792
  state.originalThemeData = deepClone(state.themeData);
1786
1793
  state.hasChanges = false;
@@ -2029,20 +2036,24 @@ async function onThemeInspectKey(data: {
2029
2036
  // Save context
2030
2037
  state.sourceSplitId = editor.getActiveSplitId();
2031
2038
  state.sourceBufferId = editor.getActiveBufferId();
2032
- state.builtinThemes = await loadBuiltinThemes();
2033
-
2034
- // Auto-load the current theme (builtin or user)
2035
- const isBuiltin = state.builtinThemes.includes(data.theme_name);
2036
- const themeData = loadThemeFile(data.theme_name);
2039
+ await loadThemeRegistry();
2040
+
2041
+ // Auto-load the current theme (data.theme_name is the config key)
2042
+ const themeKey = data.theme_name;
2043
+ const isBuiltin = state.builtinKeys.has(themeKey);
2044
+ const entry = state.themeRegistry.get(themeKey);
2045
+ const themeName = entry?.name || themeKey;
2046
+ const themeData = loadThemeFile(themeKey);
2037
2047
  if (themeData) {
2038
2048
  state.themeData = deepClone(themeData);
2039
2049
  state.originalThemeData = deepClone(themeData);
2040
- state.themeName = data.theme_name;
2050
+ state.themeName = themeName;
2051
+ state.themeKey = themeKey;
2041
2052
  state.themePath = null;
2042
2053
  state.isBuiltin = isBuiltin;
2043
2054
  state.hasChanges = false;
2044
2055
  } else {
2045
- editor.setStatus(`Failed to load theme '${data.theme_name}'`);
2056
+ editor.setStatus(`Failed to load theme '${themeName}'`);
2046
2057
  return;
2047
2058
  }
2048
2059
 
@@ -2444,46 +2455,35 @@ async function open_theme_editor() : Promise<void> {
2444
2455
 
2445
2456
  editor.debug("[theme_editor] loading builtin themes...");
2446
2457
  // Load available themes
2447
- state.builtinThemes = await loadBuiltinThemes();
2448
- editor.debug(`[theme_editor] loaded ${state.builtinThemes.length} builtin themes`);
2458
+ await loadThemeRegistry();
2459
+ editor.debug(`[theme_editor] loaded ${state.themeRegistry.size} themes (${state.builtinKeys.size} builtin)`);
2449
2460
 
2450
- // Get current theme name from config
2461
+ // Get current theme key from config
2451
2462
  const config = editor.getConfig() as Record<string, unknown>;
2452
- const currentThemeName = (config?.theme as string) || "dark";
2463
+ const currentThemeKey = (config?.theme as string) || "dark";
2453
2464
 
2454
2465
  // Prompt user to select which theme to edit
2455
2466
  editor.startPrompt(editor.t("prompt.select_theme_to_edit"), "theme-select-initial");
2456
2467
 
2457
2468
  const suggestions: PromptSuggestion[] = [];
2458
2469
 
2459
- // Add user themes first (from themes directory)
2460
- const userThemesDir = editor.getThemesDir();
2461
- try {
2462
- const entries = editor.readDir(userThemesDir);
2463
- for (const e of entries) {
2464
- if (e.is_file && e.name.endsWith(".json")) {
2465
- const name = e.name.replace(".json", "");
2466
- const isCurrent = name === currentThemeName;
2467
- suggestions.push({
2468
- text: name,
2469
- description: isCurrent ? editor.t("suggestion.user_theme_current") : editor.t("suggestion.user_theme"),
2470
- value: `user:${name}`,
2471
- });
2472
- }
2470
+ // Build suggestions from theme registry (user themes first, then builtins)
2471
+ const userSuggestions: PromptSuggestion[] = [];
2472
+ const builtinSuggestions: PromptSuggestion[] = [];
2473
+ for (const [key, {name}] of state.themeRegistry) {
2474
+ const isCurrent = key === currentThemeKey || name === currentThemeKey;
2475
+ const isBuiltin = state.builtinKeys.has(key);
2476
+ const desc = isBuiltin
2477
+ ? (isCurrent ? editor.t("suggestion.builtin_theme_current") : editor.t("suggestion.builtin_theme"))
2478
+ : (isCurrent ? editor.t("suggestion.user_theme_current") : editor.t("suggestion.user_theme"));
2479
+ const suggestion = { text: name, description: desc, value: key };
2480
+ if (isBuiltin) {
2481
+ builtinSuggestions.push(suggestion);
2482
+ } else {
2483
+ userSuggestions.push(suggestion);
2473
2484
  }
2474
- } catch {
2475
- // No user themes directory
2476
- }
2477
-
2478
- // Add built-in themes
2479
- for (const name of state.builtinThemes) {
2480
- const isCurrent = name === currentThemeName;
2481
- suggestions.push({
2482
- text: name,
2483
- description: isCurrent ? editor.t("suggestion.builtin_theme_current") : editor.t("suggestion.builtin_theme"),
2484
- value: `builtin:${name}`,
2485
- });
2486
2485
  }
2486
+ suggestions.push(...userSuggestions, ...builtinSuggestions);
2487
2487
 
2488
2488
  // Sort suggestions to put current theme first
2489
2489
  suggestions.sort((a, b) => {
@@ -2667,32 +2667,20 @@ function theme_editor_open() : void {
2667
2667
 
2668
2668
  const suggestions: PromptSuggestion[] = [];
2669
2669
 
2670
- // Add user themes first (from themes directory)
2671
- const userThemesDir = editor.getThemesDir();
2672
- try {
2673
- const entries = editor.readDir(userThemesDir);
2674
- for (const e of entries) {
2675
- if (e.is_file && e.name.endsWith(".json")) {
2676
- const name = e.name.replace(".json", "");
2677
- suggestions.push({
2678
- text: name,
2679
- description: editor.t("suggestion.user_theme"),
2680
- value: `user:${name}`,
2681
- });
2682
- }
2670
+ // Build suggestions from theme registry (user themes first, then builtins)
2671
+ const userSuggestions: PromptSuggestion[] = [];
2672
+ const builtinSuggestions: PromptSuggestion[] = [];
2673
+ for (const [key, {name}] of state.themeRegistry) {
2674
+ const isBuiltin = state.builtinKeys.has(key);
2675
+ const desc = isBuiltin ? editor.t("suggestion.builtin_theme") : editor.t("suggestion.user_theme");
2676
+ const suggestion = { text: name, description: desc, value: key };
2677
+ if (isBuiltin) {
2678
+ builtinSuggestions.push(suggestion);
2679
+ } else {
2680
+ userSuggestions.push(suggestion);
2683
2681
  }
2684
- } catch {
2685
- // No user themes directory
2686
- }
2687
-
2688
- // Add built-in themes
2689
- for (const name of state.builtinThemes) {
2690
- suggestions.push({
2691
- text: name,
2692
- description: editor.t("suggestion.builtin_theme"),
2693
- value: `builtin:${name}`,
2694
- });
2695
2682
  }
2683
+ suggestions.push(...userSuggestions, ...builtinSuggestions);
2696
2684
 
2697
2685
  editor.setPromptSuggestions(suggestions);
2698
2686
  }
@@ -2799,8 +2787,7 @@ registerHandler("theme_editor_save_as", theme_editor_save_as);
2799
2787
  */
2800
2788
  async function theme_editor_reload() : Promise<void> {
2801
2789
  if (state.themePath) {
2802
- const themeName = state.themeName;
2803
- const themeData = loadThemeFile(themeName);
2790
+ const themeData = loadThemeFile(state.themeKey);
2804
2791
  if (themeData) {
2805
2792
  state.themeData = deepClone(themeData);
2806
2793
  state.originalThemeData = deepClone(themeData);
@@ -2867,7 +2854,8 @@ async function onThemeDeletePromptConfirmed(args: {
2867
2854
  // Reset to default theme
2868
2855
  state.themeData = createDefaultTheme();
2869
2856
  state.originalThemeData = deepClone(state.themeData);
2870
- state.themeName = "custom";
2857
+ state.themeName = "";
2858
+ state.themeKey = "";
2871
2859
  state.themePath = null;
2872
2860
  state.hasChanges = false;
2873
2861
  updateDisplay();
package/themes/dark.json CHANGED
@@ -5,12 +5,14 @@
5
5
  "fg": [212, 212, 212],
6
6
  "cursor": [255, 255, 255],
7
7
  "inactive_cursor": [100, 100, 100],
8
- "selection_bg": [38, 79, 120],
8
+ "selection_bg": [50, 50, 60],
9
9
  "current_line_bg": [40, 40, 40],
10
10
  "line_number_fg": [100, 100, 100],
11
11
  "line_number_bg": [30, 30, 30],
12
- "diff_add_bg": [35, 60, 35],
13
- "diff_remove_bg": [70, 35, 35],
12
+ "diff_add_bg": [30, 60, 30],
13
+ "diff_remove_bg": [70, 30, 30],
14
+ "diff_add_highlight_bg": [35, 80, 35],
15
+ "diff_remove_highlight_bg": [95, 35, 35],
14
16
  "diff_modify_bg": [40, 38, 30],
15
17
  "whitespace_indicator_fg": [70, 70, 70]
16
18
  },
@@ -8,6 +8,10 @@
8
8
  "current_line_bg": [50, 52, 66],
9
9
  "line_number_fg": [98, 114, 164],
10
10
  "line_number_bg": [40, 42, 54],
11
+ "diff_add_bg": [40, 65, 45],
12
+ "diff_remove_bg": [75, 40, 45],
13
+ "diff_add_highlight_bg": [45, 85, 50],
14
+ "diff_remove_highlight_bg": [100, 40, 50],
11
15
  "whitespace_indicator_fg": [68, 71, 90]
12
16
  },
13
17
  "ui": {
@@ -54,8 +58,9 @@
54
58
  "scrollbar_thumb_fg": [98, 114, 164],
55
59
  "scrollbar_track_hover_fg": [80, 83, 100],
56
60
  "scrollbar_thumb_hover_fg": [139, 233, 253],
57
- "settings_selected_bg": [68, 71, 90],
58
- "settings_selected_fg": [248, 248, 242]
61
+ "settings_selected_bg": [80, 83, 110],
62
+ "settings_selected_fg": [248, 248, 242],
63
+ "popup_selection_fg": [248, 248, 242]
59
64
  },
60
65
  "search": {
61
66
  "match_bg": [241, 250, 140],
@@ -5,13 +5,15 @@
5
5
  "fg": [255, 255, 255],
6
6
  "cursor": [255, 255, 255],
7
7
  "inactive_cursor": [127, 127, 127],
8
- "selection_bg": [0, 100, 200],
8
+ "selection_bg": [50, 60, 90],
9
9
  "current_line_bg": [20, 20, 20],
10
10
  "line_number_fg": [140, 140, 140],
11
11
  "line_number_bg": [0, 0, 0],
12
- "diff_add_bg": [0, 35, 0],
13
- "diff_remove_bg": [50, 0, 0],
14
- "diff_modify_bg": [25, 22, 0],
12
+ "diff_add_bg": [0, 80, 0],
13
+ "diff_remove_bg": [100, 0, 0],
14
+ "diff_modify_bg": [60, 55, 0],
15
+ "diff_add_highlight_bg": [0, 110, 0],
16
+ "diff_remove_highlight_bg": [140, 0, 0],
15
17
  "whitespace_indicator_fg": [80, 80, 80]
16
18
  },
17
19
  "ui": {
package/themes/light.json CHANGED
@@ -5,12 +5,14 @@
5
5
  "fg": [0, 0, 0],
6
6
  "cursor": [0, 0, 0],
7
7
  "inactive_cursor": [180, 180, 180],
8
- "selection_bg": [173, 214, 255],
8
+ "selection_bg": [225, 232, 242],
9
9
  "current_line_bg": [245, 245, 245],
10
10
  "line_number_fg": [115, 115, 115],
11
11
  "line_number_bg": [255, 255, 255],
12
12
  "diff_add_bg": [200, 255, 200],
13
13
  "diff_remove_bg": [255, 200, 200],
14
+ "diff_add_highlight_bg": [150, 235, 150],
15
+ "diff_remove_highlight_bg": [235, 150, 150],
14
16
  "diff_modify_bg": [255, 252, 240],
15
17
  "whitespace_indicator_fg": [200, 200, 200]
16
18
  },
@@ -47,6 +49,7 @@
47
49
  "popup_selection_bg": [209, 226, 243],
48
50
  "popup_text_fg": [30, 30, 30],
49
51
  "suggestion_bg": [232, 238, 245],
52
+ "popup_selection_fg": [0, 0, 0],
50
53
  "suggestion_selected_bg": [209, 226, 243],
51
54
  "help_bg": [255, 255, 255],
52
55
  "help_fg": [0, 0, 0],
@@ -98,6 +101,8 @@
98
101
  "type": [0, 128, 128],
99
102
  "variable": [0, 16, 128],
100
103
  "constant": [0, 112, 193],
101
- "operator": [0, 0, 0]
104
+ "operator": [0, 0, 0],
105
+ "punctuation_bracket": [50, 50, 50],
106
+ "punctuation_delimiter": [50, 50, 50]
102
107
  }
103
108
  }
package/themes/nord.json CHANGED
@@ -4,11 +4,11 @@
4
4
  "bg": [46, 52, 64],
5
5
  "fg": [216, 222, 233],
6
6
  "cursor": [136, 192, 208],
7
- "selection_bg": [67, 76, 94],
7
+ "selection_bg": [80, 92, 116],
8
8
  "current_line_bg": [59, 66, 82],
9
- "line_number_fg": [76, 86, 106],
9
+ "line_number_fg": [107, 118, 140],
10
10
  "line_number_bg": [46, 52, 64],
11
- "whitespace_indicator_fg": [67, 76, 94]
11
+ "whitespace_indicator_fg": [90, 100, 120]
12
12
  },
13
13
  "ui": {
14
14
  "tab_active_fg": [236, 239, 244],
@@ -22,19 +22,22 @@
22
22
  "prompt_bg": [163, 190, 140],
23
23
  "prompt_selection_fg": [236, 239, 244],
24
24
  "prompt_selection_bg": [94, 129, 172],
25
- "popup_border_fg": [76, 86, 106],
25
+ "popup_border_fg": [107, 118, 140],
26
26
  "popup_bg": [59, 66, 82],
27
27
  "popup_selection_bg": [94, 129, 172],
28
+ "popup_selection_fg": [236, 239, 244],
28
29
  "popup_text_fg": [216, 222, 233],
29
30
  "suggestion_bg": [59, 66, 82],
30
31
  "suggestion_selected_bg": [94, 129, 172],
31
32
  "help_bg": [46, 52, 64],
32
33
  "help_fg": [216, 222, 233],
33
34
  "help_key_fg": [136, 192, 208],
34
- "help_separator_fg": [76, 86, 106],
35
+ "help_separator_fg": [107, 118, 140],
35
36
  "help_indicator_fg": [191, 97, 106],
36
37
  "help_indicator_bg": [46, 52, 64],
37
- "split_separator_fg": [76, 86, 106]
38
+ "split_separator_fg": [107, 118, 140],
39
+ "settings_selected_bg": [94, 129, 172],
40
+ "settings_selected_fg": [236, 239, 244]
38
41
  },
39
42
  "search": {
40
43
  "match_bg": [235, 203, 139],
@@ -47,17 +50,19 @@
47
50
  "warning_bg": [59, 56, 46],
48
51
  "info_fg": [129, 161, 193],
49
52
  "info_bg": [46, 52, 64],
50
- "hint_fg": [76, 86, 106],
53
+ "hint_fg": [107, 118, 140],
51
54
  "hint_bg": [46, 52, 64]
52
55
  },
53
56
  "syntax": {
54
57
  "keyword": [129, 161, 193],
55
58
  "string": [163, 190, 140],
56
- "comment": [76, 86, 106],
59
+ "comment": [107, 118, 140],
57
60
  "function": [136, 192, 208],
58
61
  "type": [143, 188, 187],
59
62
  "variable": [216, 222, 233],
60
63
  "constant": [180, 142, 173],
61
- "operator": [129, 161, 193]
64
+ "operator": [129, 161, 193],
65
+ "punctuation_bracket": [180, 188, 200],
66
+ "punctuation_delimiter": [180, 188, 200]
62
67
  }
63
68
  }
@@ -5,7 +5,7 @@
5
5
  "fg": [255, 255, 85],
6
6
  "cursor": [255, 255, 255],
7
7
  "inactive_cursor": [170, 170, 170],
8
- "selection_bg": [170, 170, 170],
8
+ "selection_bg": [30, 30, 200],
9
9
  "current_line_bg": [0, 0, 128],
10
10
  "line_number_fg": [85, 255, 255],
11
11
  "line_number_bg": [0, 0, 170],
@@ -4,11 +4,11 @@
4
4
  "bg": [0, 43, 54],
5
5
  "fg": [131, 148, 150],
6
6
  "cursor": [38, 139, 210],
7
- "selection_bg": [7, 54, 66],
7
+ "selection_bg": [22, 72, 86],
8
8
  "current_line_bg": [7, 54, 66],
9
- "line_number_fg": [88, 110, 117],
9
+ "line_number_fg": [101, 123, 131],
10
10
  "line_number_bg": [0, 43, 54],
11
- "whitespace_indicator_fg": [0, 60, 75]
11
+ "whitespace_indicator_fg": [40, 80, 95]
12
12
  },
13
13
  "ui": {
14
14
  "tab_active_fg": [253, 246, 227],
@@ -22,19 +22,22 @@
22
22
  "prompt_bg": [181, 137, 0],
23
23
  "prompt_selection_fg": [253, 246, 227],
24
24
  "prompt_selection_bg": [38, 139, 210],
25
- "popup_border_fg": [88, 110, 117],
25
+ "popup_border_fg": [101, 123, 131],
26
26
  "popup_bg": [7, 54, 66],
27
27
  "popup_selection_bg": [38, 139, 210],
28
- "popup_text_fg": [131, 148, 150],
28
+ "popup_selection_fg": [253, 246, 227],
29
+ "popup_text_fg": [147, 161, 161],
29
30
  "suggestion_bg": [7, 54, 66],
30
31
  "suggestion_selected_bg": [38, 139, 210],
31
32
  "help_bg": [0, 43, 54],
32
- "help_fg": [131, 148, 150],
33
+ "help_fg": [147, 161, 161],
33
34
  "help_key_fg": [42, 161, 152],
34
- "help_separator_fg": [88, 110, 117],
35
+ "help_separator_fg": [101, 123, 131],
35
36
  "help_indicator_fg": [220, 50, 47],
36
37
  "help_indicator_bg": [0, 43, 54],
37
- "split_separator_fg": [88, 110, 117]
38
+ "split_separator_fg": [101, 123, 131],
39
+ "settings_selected_bg": [38, 139, 210],
40
+ "settings_selected_fg": [253, 246, 227]
38
41
  },
39
42
  "search": {
40
43
  "match_bg": [181, 137, 0],
@@ -47,17 +50,19 @@
47
50
  "warning_bg": [30, 54, 54],
48
51
  "info_fg": [38, 139, 210],
49
52
  "info_bg": [0, 50, 66],
50
- "hint_fg": [88, 110, 117],
53
+ "hint_fg": [101, 123, 131],
51
54
  "hint_bg": [0, 43, 54]
52
55
  },
53
56
  "syntax": {
54
57
  "keyword": [133, 153, 0],
55
58
  "string": [42, 161, 152],
56
- "comment": [88, 110, 117],
59
+ "comment": [101, 123, 131],
57
60
  "function": [38, 139, 210],
58
61
  "type": [181, 137, 0],
59
62
  "variable": [131, 148, 150],
60
63
  "constant": [203, 75, 22],
61
- "operator": [131, 148, 150]
64
+ "operator": [131, 148, 150],
65
+ "punctuation_bracket": [147, 161, 161],
66
+ "punctuation_delimiter": [147, 161, 161]
62
67
  }
63
68
  }