1
0
Fork 0
mirror of https://github.com/nix-community/home-manager.git synced 2025-11-08 19:46:05 +01:00

opencode: add themes option

Add themes option to configure custom themes through nix.
Define a submodule for the settings option, to give the `theme` setting
a description.
This commit is contained in:
Mirza Arnaut 2025-10-18 03:16:46 +02:00 committed by Austin Horstman
parent 722792af09
commit fc837be107
5 changed files with 488 additions and 2 deletions

View file

@ -137,6 +137,16 @@ in
''; '';
}; };
themes = mkOption {
inherit (jsonFormat) type;
default = { };
description = ''
Custom themes for opencode. The attribute name becomes the theme filename.
Themes are stored in {file}`$XDG_CONFIG_HOME/opencode/themes/` directory.
Set `programs.opencode.settings.theme` to enable the custom theme.
See <https://opencode.ai/docs/themes/> for the documentation.
'';
};
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
@ -167,6 +177,17 @@ in
lib.nameValuePair "opencode/agent/${name}.md" ( lib.nameValuePair "opencode/agent/${name}.md" (
if lib.isPath content then { source = content; } else { text = content; } if lib.isPath content then { source = content; } else { text = content; }
) )
) cfg.agents; ) cfg.agents
// lib.mapAttrs' (
name: content:
lib.nameValuePair "opencode/themes/${name}.json" {
source = jsonFormat.generate "opencode-${name}.json" (
{
"$schema" = "https://opencode.ai/theme.json";
}
// content
);
}
) cfg.themes;
}; };
} }

View file

@ -8,4 +8,5 @@
opencode-agents-path = ./agents-path.nix; opencode-agents-path = ./agents-path.nix;
opencode-commands-path = ./commands-path.nix; opencode-commands-path = ./commands-path.nix;
opencode-mixed-content = ./mixed-content.nix; opencode-mixed-content = ./mixed-content.nix;
opencode-themes = ./themes.nix;
} }

View file

@ -0,0 +1,9 @@
{
programs.opencode = {
enable = true;
themes = { };
};
nmt.script = ''
assertPathNotExists home-files/.config/opencode/themes
'';
}

View file

@ -0,0 +1,223 @@
{
"$schema": "https://opencode.ai/theme.json",
"defs": {
"nord0": "#2E3440",
"nord1": "#3B4252",
"nord10": "#5E81AC",
"nord11": "#BF616A",
"nord12": "#D08770",
"nord13": "#EBCB8B",
"nord14": "#A3BE8C",
"nord15": "#B48EAD",
"nord2": "#434C5E",
"nord3": "#4C566A",
"nord4": "#D8DEE9",
"nord5": "#E5E9F0",
"nord6": "#ECEFF4",
"nord7": "#8FBCBB",
"nord8": "#88C0D0",
"nord9": "#81A1C1"
},
"theme": {
"accent": {
"dark": "nord7",
"light": "nord7"
},
"background": {
"dark": "nord0",
"light": "nord6"
},
"backgroundElement": {
"dark": "nord1",
"light": "nord4"
},
"backgroundPanel": {
"dark": "nord1",
"light": "nord5"
},
"border": {
"dark": "nord2",
"light": "nord3"
},
"borderActive": {
"dark": "nord3",
"light": "nord2"
},
"borderSubtle": {
"dark": "nord2",
"light": "nord3"
},
"diffAdded": {
"dark": "nord14",
"light": "nord14"
},
"diffAddedBg": {
"dark": "#3B4252",
"light": "#E5E9F0"
},
"diffAddedLineNumberBg": {
"dark": "#3B4252",
"light": "#E5E9F0"
},
"diffContext": {
"dark": "nord3",
"light": "nord3"
},
"diffContextBg": {
"dark": "nord1",
"light": "nord5"
},
"diffHighlightAdded": {
"dark": "nord14",
"light": "nord14"
},
"diffHighlightRemoved": {
"dark": "nord11",
"light": "nord11"
},
"diffHunkHeader": {
"dark": "nord3",
"light": "nord3"
},
"diffLineNumber": {
"dark": "nord2",
"light": "nord4"
},
"diffRemoved": {
"dark": "nord11",
"light": "nord11"
},
"diffRemovedBg": {
"dark": "#3B4252",
"light": "#E5E9F0"
},
"diffRemovedLineNumberBg": {
"dark": "#3B4252",
"light": "#E5E9F0"
},
"error": {
"dark": "nord11",
"light": "nord11"
},
"info": {
"dark": "nord8",
"light": "nord10"
},
"markdownBlockQuote": {
"dark": "nord3",
"light": "nord3"
},
"markdownCode": {
"dark": "nord14",
"light": "nord14"
},
"markdownCodeBlock": {
"dark": "nord4",
"light": "nord0"
},
"markdownEmph": {
"dark": "nord12",
"light": "nord12"
},
"markdownHeading": {
"dark": "nord8",
"light": "nord10"
},
"markdownHorizontalRule": {
"dark": "nord3",
"light": "nord3"
},
"markdownImage": {
"dark": "nord9",
"light": "nord9"
},
"markdownImageText": {
"dark": "nord7",
"light": "nord7"
},
"markdownLink": {
"dark": "nord9",
"light": "nord9"
},
"markdownLinkText": {
"dark": "nord7",
"light": "nord7"
},
"markdownListEnumeration": {
"dark": "nord7",
"light": "nord7"
},
"markdownListItem": {
"dark": "nord8",
"light": "nord10"
},
"markdownStrong": {
"dark": "nord13",
"light": "nord13"
},
"markdownText": {
"dark": "nord4",
"light": "nord0"
},
"primary": {
"dark": "nord8",
"light": "nord10"
},
"secondary": {
"dark": "nord9",
"light": "nord9"
},
"success": {
"dark": "nord14",
"light": "nord14"
},
"syntaxComment": {
"dark": "nord3",
"light": "nord3"
},
"syntaxFunction": {
"dark": "nord8",
"light": "nord8"
},
"syntaxKeyword": {
"dark": "nord9",
"light": "nord9"
},
"syntaxNumber": {
"dark": "nord15",
"light": "nord15"
},
"syntaxOperator": {
"dark": "nord9",
"light": "nord9"
},
"syntaxPunctuation": {
"dark": "nord4",
"light": "nord0"
},
"syntaxString": {
"dark": "nord14",
"light": "nord14"
},
"syntaxType": {
"dark": "nord7",
"light": "nord7"
},
"syntaxVariable": {
"dark": "nord7",
"light": "nord7"
},
"text": {
"dark": "nord4",
"light": "nord0"
},
"textMuted": {
"dark": "nord3",
"light": "nord1"
},
"warning": {
"dark": "nord12",
"light": "nord12"
}
}
}

View file

@ -0,0 +1,232 @@
{
nmt.script = ''
assertFileExists home-files/.config/opencode/themes/my-theme.json
assertFileContent home-files/.config/opencode/themes/my-theme.json \
${./my-theme.json}
'';
programs.opencode = {
enable = true;
themes.my-theme = {
defs = {
nord0 = "#2E3440";
nord1 = "#3B4252";
nord10 = "#5E81AC";
nord11 = "#BF616A";
nord12 = "#D08770";
nord13 = "#EBCB8B";
nord14 = "#A3BE8C";
nord15 = "#B48EAD";
nord2 = "#434C5E";
nord3 = "#4C566A";
nord4 = "#D8DEE9";
nord5 = "#E5E9F0";
nord6 = "#ECEFF4";
nord7 = "#8FBCBB";
nord8 = "#88C0D0";
nord9 = "#81A1C1";
};
theme = {
accent = {
dark = "nord7";
light = "nord7";
};
background = {
dark = "nord0";
light = "nord6";
};
backgroundElement = {
dark = "nord1";
light = "nord4";
};
backgroundPanel = {
dark = "nord1";
light = "nord5";
};
border = {
dark = "nord2";
light = "nord3";
};
borderActive = {
dark = "nord3";
light = "nord2";
};
borderSubtle = {
dark = "nord2";
light = "nord3";
};
diffAdded = {
dark = "nord14";
light = "nord14";
};
diffAddedBg = {
dark = "#3B4252";
light = "#E5E9F0";
};
diffAddedLineNumberBg = {
dark = "#3B4252";
light = "#E5E9F0";
};
diffContext = {
dark = "nord3";
light = "nord3";
};
diffContextBg = {
dark = "nord1";
light = "nord5";
};
diffHighlightAdded = {
dark = "nord14";
light = "nord14";
};
diffHighlightRemoved = {
dark = "nord11";
light = "nord11";
};
diffHunkHeader = {
dark = "nord3";
light = "nord3";
};
diffLineNumber = {
dark = "nord2";
light = "nord4";
};
diffRemoved = {
dark = "nord11";
light = "nord11";
};
diffRemovedBg = {
dark = "#3B4252";
light = "#E5E9F0";
};
diffRemovedLineNumberBg = {
dark = "#3B4252";
light = "#E5E9F0";
};
error = {
dark = "nord11";
light = "nord11";
};
info = {
dark = "nord8";
light = "nord10";
};
markdownBlockQuote = {
dark = "nord3";
light = "nord3";
};
markdownCode = {
dark = "nord14";
light = "nord14";
};
markdownCodeBlock = {
dark = "nord4";
light = "nord0";
};
markdownEmph = {
dark = "nord12";
light = "nord12";
};
markdownHeading = {
dark = "nord8";
light = "nord10";
};
markdownHorizontalRule = {
dark = "nord3";
light = "nord3";
};
markdownImage = {
dark = "nord9";
light = "nord9";
};
markdownImageText = {
dark = "nord7";
light = "nord7";
};
markdownLink = {
dark = "nord9";
light = "nord9";
};
markdownLinkText = {
dark = "nord7";
light = "nord7";
};
markdownListEnumeration = {
dark = "nord7";
light = "nord7";
};
markdownListItem = {
dark = "nord8";
light = "nord10";
};
markdownStrong = {
dark = "nord13";
light = "nord13";
};
markdownText = {
dark = "nord4";
light = "nord0";
};
primary = {
dark = "nord8";
light = "nord10";
};
secondary = {
dark = "nord9";
light = "nord9";
};
success = {
dark = "nord14";
light = "nord14";
};
syntaxComment = {
dark = "nord3";
light = "nord3";
};
syntaxFunction = {
dark = "nord8";
light = "nord8";
};
syntaxKeyword = {
dark = "nord9";
light = "nord9";
};
syntaxNumber = {
dark = "nord15";
light = "nord15";
};
syntaxOperator = {
dark = "nord9";
light = "nord9";
};
syntaxPunctuation = {
dark = "nord4";
light = "nord0";
};
syntaxString = {
dark = "nord14";
light = "nord14";
};
syntaxType = {
dark = "nord7";
light = "nord7";
};
syntaxVariable = {
dark = "nord7";
light = "nord7";
};
text = {
dark = "nord4";
light = "nord0";
};
textMuted = {
dark = "nord3";
light = "nord1";
};
warning = {
dark = "nord12";
light = "nord12";
};
};
};
};
}