@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.
- package/CHANGELOG.md +45 -1
- package/package.json +1 -1
- package/plugins/audit_mode.i18n.json +57 -15
- package/plugins/audit_mode.ts +907 -628
- package/plugins/config-schema.json +15 -35
- package/plugins/lib/fresh.d.ts +42 -0
- package/plugins/lib/virtual-buffer-factory.ts +8 -0
- package/plugins/schemas/package.schema.json +8 -0
- package/plugins/theme_editor.i18n.json +64 -8
- package/plugins/theme_editor.ts +107 -119
- package/themes/dark.json +5 -3
- package/themes/dracula.json +7 -2
- package/themes/high-contrast.json +6 -4
- package/themes/light.json +7 -2
- package/themes/nord.json +14 -9
- package/themes/nostalgia.json +1 -1
- package/themes/solarized-dark.json +16 -11
package/plugins/theme_editor.ts
CHANGED
|
@@ -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
|
-
/**
|
|
349
|
-
|
|
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: "
|
|
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
|
-
|
|
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
|
-
|
|
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]
|
|
690
|
+
editor.debug("[theme_editor] loadThemeRegistry: calling editor.getBuiltinThemes()");
|
|
675
691
|
const rawThemes = editor.getBuiltinThemes();
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
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
|
|
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
|
|
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(
|
|
716
|
+
function loadThemeFile(key: string): Record<string, unknown> | null {
|
|
694
717
|
try {
|
|
695
|
-
const data = editor.getThemeData(
|
|
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 '${
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
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(
|
|
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
|
-
|
|
2033
|
-
|
|
2034
|
-
// Auto-load the current theme (
|
|
2035
|
-
const
|
|
2036
|
-
const
|
|
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 =
|
|
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 '${
|
|
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
|
-
|
|
2448
|
-
editor.debug(`[theme_editor] loaded ${state.
|
|
2458
|
+
await loadThemeRegistry();
|
|
2459
|
+
editor.debug(`[theme_editor] loaded ${state.themeRegistry.size} themes (${state.builtinKeys.size} builtin)`);
|
|
2449
2460
|
|
|
2450
|
-
// Get current theme
|
|
2461
|
+
// Get current theme key from config
|
|
2451
2462
|
const config = editor.getConfig() as Record<string, unknown>;
|
|
2452
|
-
const
|
|
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
|
-
//
|
|
2460
|
-
const
|
|
2461
|
-
|
|
2462
|
-
|
|
2463
|
-
|
|
2464
|
-
|
|
2465
|
-
|
|
2466
|
-
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
|
|
2470
|
-
|
|
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
|
-
//
|
|
2671
|
-
const
|
|
2672
|
-
|
|
2673
|
-
|
|
2674
|
-
|
|
2675
|
-
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
|
|
2679
|
-
|
|
2680
|
-
|
|
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
|
|
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 = "
|
|
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": [
|
|
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": [
|
|
13
|
-
"diff_remove_bg": [70,
|
|
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
|
},
|
package/themes/dracula.json
CHANGED
|
@@ -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": [
|
|
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": [
|
|
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,
|
|
13
|
-
"diff_remove_bg": [
|
|
14
|
-
"diff_modify_bg": [
|
|
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": [
|
|
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": [
|
|
7
|
+
"selection_bg": [80, 92, 116],
|
|
8
8
|
"current_line_bg": [59, 66, 82],
|
|
9
|
-
"line_number_fg": [
|
|
9
|
+
"line_number_fg": [107, 118, 140],
|
|
10
10
|
"line_number_bg": [46, 52, 64],
|
|
11
|
-
"whitespace_indicator_fg": [
|
|
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": [
|
|
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": [
|
|
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": [
|
|
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": [
|
|
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": [
|
|
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
|
}
|
package/themes/nostalgia.json
CHANGED
|
@@ -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
|
+
"selection_bg": [22, 72, 86],
|
|
8
8
|
"current_line_bg": [7, 54, 66],
|
|
9
|
-
"line_number_fg": [
|
|
9
|
+
"line_number_fg": [101, 123, 131],
|
|
10
10
|
"line_number_bg": [0, 43, 54],
|
|
11
|
-
"whitespace_indicator_fg": [
|
|
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": [
|
|
25
|
+
"popup_border_fg": [101, 123, 131],
|
|
26
26
|
"popup_bg": [7, 54, 66],
|
|
27
27
|
"popup_selection_bg": [38, 139, 210],
|
|
28
|
-
"
|
|
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": [
|
|
33
|
+
"help_fg": [147, 161, 161],
|
|
33
34
|
"help_key_fg": [42, 161, 152],
|
|
34
|
-
"help_separator_fg": [
|
|
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": [
|
|
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": [
|
|
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": [
|
|
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
|
}
|