Start building a theme for iTerm 2
- ID
ac5c0ba- date
2025-12-02 07:16:53+00:00- author
Alex Chan <alex@alexwlchan.net>- parent
c70058e- message
Start building a theme for iTerm 2- changed files
6 files, 383 additions, 7 deletions
Changed files
generate_palette_files.py (4277) → generate_palette_files.py (18626)
diff --git a/generate_palette_files.py b/generate_palette_files.py
index 94fba7f..669eccb 100755
--- a/generate_palette_files.py
+++ b/generate_palette_files.py
@@ -1,9 +1,12 @@
#!/usr/bin/env python3
from datetime import datetime, timezone
+import io
import json
from pathlib import Path
+import plistlib
import textwrap
+from typing import TypedDict
from jinja2 import Template
@@ -124,6 +127,376 @@ def generate_textmate_theme(colours: Colours, palette_id: str) -> str:
return out
+iTermColour = TypedDict(
+ "iTermColour",
+ {
+ "Red Component": float,
+ "Gren Component": float,
+ "Blue Component": float,
+ "Alpha Component": float,
+ "Color Space": str,
+ },
+)
+
+
+def to_iterm2_colour(hex_string) -> iTermColour:
+ r_255 = int(hex_string[1:3], 16)
+ g_255 = int(hex_string[3:5], 16)
+ b_255 = int(hex_string[5:7], 16)
+
+ return {
+ "Red Component": r_255 / 255,
+ "Green Component": g_255 / 255,
+ "Blue Component": b_255 / 255,
+ "Alpha Component": 1.0,
+ "Color Space": "SRGB",
+ }
+
+
+def generate_iterm2_theme(palette: Palette) -> bytes:
+ """
+ Generate an iTerm 2 theme based on my palette.
+ """
+ out = {
+ "Background Color (Dark)": to_iterm2_colour(palette["dark"]["background"]),
+ "Background Color (Light)": to_iterm2_colour(palette["light"]["background"]),
+ "Foreground Color (Dark)": to_iterm2_colour(palette["dark"]["text"]),
+ "Foreground Color (Light)": to_iterm2_colour(palette["light"]["text"]),
+ "Link Color (Dark)": to_iterm2_colour(palette["dark"]["blue"]),
+ "Link Color (Light)": to_iterm2_colour(palette["light"]["blue"]),
+ "Ansi 0 Color (Dark)": to_iterm2_colour(palette["dark"]["text"]),
+ "Ansi 0 Color (Light)": to_iterm2_colour(palette["light"]["text"]),
+ "Ansi 1 Color (Dark)": to_iterm2_colour(palette["dark"]["red"]),
+ "Ansi 1 Color (Light)": to_iterm2_colour(palette["light"]["red"]),
+ "Ansi 2 Color (Dark)": to_iterm2_colour(palette["dark"]["green"]),
+ "Ansi 2 Color (Light)": to_iterm2_colour(palette["light"]["green"]),
+ "Ansi 3 Color (Dark)": to_iterm2_colour(palette["dark"]["yellow"]),
+ "Ansi 3 Color (Light)": to_iterm2_colour(palette["light"]["yellow"]),
+ "Ansi 4 Color (Dark)": to_iterm2_colour(palette["dark"]["blue"]),
+ "Ansi 4 Color (Light)": to_iterm2_colour(palette["light"]["blue"]),
+ "Ansi 5 Color (Dark)": to_iterm2_colour(palette["dark"]["magenta"]),
+ "Ansi 5 Color (Light)": to_iterm2_colour(palette["light"]["magenta"]),
+ "Ansi 6 Color (Dark)": to_iterm2_colour(palette["dark"]["cyan"]),
+ "Ansi 6 Color (Light)": to_iterm2_colour(palette["light"]["cyan"]),
+ "Ansi 7 Color (Dark)": to_iterm2_colour(palette["dark"]["background"]),
+ "Ansi 7 Color (Light)": to_iterm2_colour(palette["light"]["background"]),
+ "Ansi 10 Color": {
+ "Alpha Component": 1.0,
+ "Blue Component": 0.45524293184280396,
+ "Color Space": "P3",
+ "Green Component": 0.42884403467178345,
+ "Red Component": 0.36227649450302124,
+ },
+ "Ansi 10 Color (Dark)": {
+ "Blue Component": 0.4588235294117647,
+ "Color Space": "sRGB",
+ "Green Component": 0.43137254901960786,
+ "Red Component": 0.34509803921568627,
+ },
+ "Ansi 10 Color (Light)": {
+ "Blue Component": 0.4588235294117647,
+ "Color Space": "sRGB",
+ "Green Component": 0.43137254901960786,
+ "Red Component": 0.34509803921568627,
+ },
+ "Ansi 11 Color": {
+ "Alpha Component": 1.0,
+ "Blue Component": 0.5097967982292175,
+ "Color Space": "P3",
+ "Green Component": 0.47979283332824707,
+ "Red Component": 0.41305190324783325,
+ },
+ "Ansi 11 Color (Dark)": {
+ "Blue Component": 0.5137254901960784,
+ "Color Space": "sRGB",
+ "Green Component": 0.4823529411764706,
+ "Red Component": 0.396078431372549,
+ },
+ "Ansi 11 Color (Light)": {
+ "Blue Component": 0.5137254901960784,
+ "Color Space": "sRGB",
+ "Green Component": 0.4823529411764706,
+ "Red Component": 0.396078431372549,
+ },
+ "Ansi 12 Color": {
+ "Alpha Component": 1.0,
+ "Blue Component": 0.5864985585212708,
+ "Color Space": "P3",
+ "Green Component": 0.5783330798149109,
+ "Red Component": 0.5263533592224121,
+ },
+ "Ansi 12 Color (Dark)": {
+ "Blue Component": 0.5882352941176471,
+ "Color Space": "sRGB",
+ "Green Component": 0.5803921568627451,
+ "Red Component": 0.5137254901960784,
+ },
+ "Ansi 12 Color (Light)": {
+ "Blue Component": 0.5882352941176471,
+ "Color Space": "sRGB",
+ "Green Component": 0.5803921568627451,
+ "Red Component": 0.5137254901960784,
+ },
+ "Ansi 13 Color": {
+ "Alpha Component": 1.0,
+ "Blue Component": 0.7465392351150513,
+ "Color Space": "P3",
+ "Green Component": 0.44249439239501953,
+ "Red Component": 0.42710167169570923,
+ },
+ "Ansi 13 Color (Dark)": {
+ "Blue Component": 0.7686274509803922,
+ "Color Space": "sRGB",
+ "Green Component": 0.44313725490196076,
+ "Red Component": 0.4235294117647059,
+ },
+ "Ansi 13 Color (Light)": {
+ "Blue Component": 0.7686274509803922,
+ "Color Space": "sRGB",
+ "Green Component": 0.44313725490196076,
+ "Red Component": 0.4235294117647059,
+ },
+ "Ansi 14 Color": {
+ "Alpha Component": 1.0,
+ "Blue Component": 0.6304863095283508,
+ "Color Space": "P3",
+ "Green Component": 0.6296467781066895,
+ "Red Component": 0.5867035984992981,
+ },
+ "Ansi 14 Color (Dark)": {
+ "Blue Component": 0.6313725490196078,
+ "Color Space": "sRGB",
+ "Green Component": 0.6313725490196078,
+ "Red Component": 0.5764705882352941,
+ },
+ "Ansi 14 Color (Light)": {
+ "Blue Component": 0.6313725490196078,
+ "Color Space": "sRGB",
+ "Green Component": 0.6313725490196078,
+ "Red Component": 0.5764705882352941,
+ },
+ "Ansi 15 Color": {
+ "Alpha Component": 1.0,
+ "Blue Component": 0.8977216482162476,
+ "Color Space": "P3",
+ "Green Component": 0.9656357169151306,
+ "Red Component": 0.9873548150062561,
+ },
+ "Ansi 15 Color (Dark)": {
+ "Blue Component": 0.8901960784313725,
+ "Color Space": "sRGB",
+ "Green Component": 0.9647058823529412,
+ "Red Component": 0.9921568627450981,
+ },
+ "Ansi 15 Color (Light)": {
+ "Blue Component": 0.8901960784313725,
+ "Color Space": "sRGB",
+ "Green Component": 0.9647058823529412,
+ "Red Component": 0.9921568627450981,
+ },
+ "Ansi 8 Color": {
+ "Alpha Component": 1.0,
+ "Blue Component": 0.2070317268371582,
+ "Color Space": "P3",
+ "Green Component": 0.16550064086914062,
+ "Red Component": 0.053836725652217865,
+ },
+ "Ansi 8 Color (Dark)": {
+ "Blue Component": 0.21176470588235294,
+ "Color Space": "sRGB",
+ "Green Component": 0.16862745098039217,
+ "Red Component": 0.0,
+ },
+ "Ansi 8 Color (Light)": {
+ "Blue Component": 0.21176470588235294,
+ "Color Space": "sRGB",
+ "Green Component": 0.16862745098039217,
+ "Red Component": 0.0,
+ },
+ "Ansi 9 Color": {
+ "Alpha Component": 1.0,
+ "Blue Component": 0.1624806821346283,
+ "Color Space": "P3",
+ "Green Component": 0.3279757499694824,
+ "Red Component": 0.7377541661262512,
+ },
+ "Ansi 9 Color (Dark)": {
+ "Blue Component": 0.08627450980392157,
+ "Color Space": "sRGB",
+ "Green Component": 0.29411764705882354,
+ "Red Component": 0.796078431372549,
+ },
+ "Ansi 9 Color (Light)": {
+ "Blue Component": 0.08627450980392157,
+ "Color Space": "sRGB",
+ "Green Component": 0.29411764705882354,
+ "Red Component": 0.796078431372549,
+ },
+ "Badge Color": {
+ "Alpha Component": 0.5,
+ "Blue Component": 0.14500156044960022,
+ "Color Space": "P3",
+ "Green Component": 0.25274839997291565,
+ "Red Component": 0.9191656708717346,
+ },
+ "Badge Color (Dark)": {
+ "Alpha Component": 0.5,
+ "Blue Component": 0.0,
+ "Color Space": "sRGB",
+ "Green Component": 0.1491314172744751,
+ "Red Component": 1.0,
+ },
+ "Badge Color (Light)": {
+ "Alpha Component": 0.5,
+ "Blue Component": 0.0,
+ "Color Space": "sRGB",
+ "Green Component": 0.1491314172744751,
+ "Red Component": 1.0,
+ },
+ "Bold Color": {
+ "Alpha Component": 1.0,
+ "Blue Component": 0.6304863095283508,
+ "Color Space": "P3",
+ "Green Component": 0.6296467781066895,
+ "Red Component": 0.5867035984992981,
+ },
+ "Bold Color (Dark)": {
+ "Blue Component": 0.6313725490196078,
+ "Color Space": "sRGB",
+ "Green Component": 0.6313725490196078,
+ "Red Component": 0.5764705882352941,
+ },
+ "Bold Color (Light)": {
+ "Blue Component": 0.4588235294117647,
+ "Color Space": "sRGB",
+ "Green Component": 0.43137254901960786,
+ "Red Component": 0.34509803921568627,
+ },
+ "Cursor Color": {
+ "Alpha Component": 1.0,
+ "Blue Component": 0.5864985585212708,
+ "Color Space": "P3",
+ "Green Component": 0.5783330798149109,
+ "Red Component": 0.5263533592224121,
+ },
+ "Cursor Color (Dark)": {
+ "Blue Component": 0.5882352941176471,
+ "Color Space": "sRGB",
+ "Green Component": 0.5803921568627451,
+ "Red Component": 0.5137254901960784,
+ },
+ "Cursor Color (Light)": {
+ "Blue Component": 0.5137254901960784,
+ "Color Space": "sRGB",
+ "Green Component": 0.4823529411764706,
+ "Red Component": 0.396078431372549,
+ },
+ "Cursor Guide Color": {
+ "Alpha Component": 0.25,
+ "Blue Component": 0.9907825589179993,
+ "Color Space": "P3",
+ "Green Component": 0.9204942584037781,
+ "Red Component": 0.7486235499382019,
+ },
+ "Cursor Guide Color (Dark)": {
+ "Alpha Component": 0.25,
+ "Blue Component": 1.0,
+ "Color Space": "sRGB",
+ "Green Component": 0.9268307089805603,
+ "Red Component": 0.7021318674087524,
+ },
+ "Cursor Guide Color (Light)": {
+ "Alpha Component": 0.25,
+ "Blue Component": 1.0,
+ "Color Space": "sRGB",
+ "Green Component": 0.9268307089805603,
+ "Red Component": 0.7021318674087524,
+ },
+ "Cursor Text Color": {
+ "Alpha Component": 1.0,
+ "Blue Component": 0.2535606920719147,
+ "Color Space": "P3",
+ "Green Component": 0.20825165510177612,
+ "Red Component": 0.08827308565378189,
+ },
+ "Cursor Text Color (Dark)": {
+ "Blue Component": 0.25882352941176473,
+ "Color Space": "sRGB",
+ "Green Component": 0.21176470588235294,
+ "Red Component": 0.027450980392156862,
+ },
+ "Cursor Text Color (Light)": {
+ "Blue Component": 0.8352941176470589,
+ "Color Space": "sRGB",
+ "Green Component": 0.9098039215686274,
+ "Red Component": 0.9333333333333333,
+ },
+ "Match Background Color": {
+ "Alpha Component": 1.0,
+ "Blue Component": 0.32116127014160156,
+ "Color Space": "P3",
+ "Green Component": 0.9860088229179382,
+ "Red Component": 0.9969714283943176,
+ },
+ "Match Background Color (Dark)": {
+ "Alpha Component": 1.0,
+ "Blue Component": 0.32116127014160156,
+ "Color Space": "P3",
+ "Green Component": 0.9860088229179382,
+ "Red Component": 0.9969714283943176,
+ },
+ "Match Background Color (Light)": {
+ "Alpha Component": 1.0,
+ "Blue Component": 0.32116127014160156,
+ "Color Space": "P3",
+ "Green Component": 0.9860088229179382,
+ "Red Component": 0.9969714283943176,
+ },
+ "Selected Text Color": {
+ "Alpha Component": 1.0,
+ "Blue Component": 0.6304863095283508,
+ "Color Space": "P3",
+ "Green Component": 0.6296467781066895,
+ "Red Component": 0.5867035984992981,
+ },
+ "Selected Text Color (Dark)": {
+ "Blue Component": 0.6313725490196078,
+ "Color Space": "sRGB",
+ "Green Component": 0.6313725490196078,
+ "Red Component": 0.5764705882352941,
+ },
+ "Selected Text Color (Light)": {
+ "Blue Component": 0.4588235294117647,
+ "Color Space": "sRGB",
+ "Green Component": 0.43137254901960786,
+ "Red Component": 0.34509803921568627,
+ },
+ "Selection Color": {
+ "Alpha Component": 1.0,
+ "Blue Component": 0.2535606920719147,
+ "Color Space": "P3",
+ "Green Component": 0.20825165510177612,
+ "Red Component": 0.08827308565378189,
+ },
+ "Selection Color (Dark)": {
+ "Blue Component": 0.25882352941176473,
+ "Color Space": "sRGB",
+ "Green Component": 0.21176470588235294,
+ "Red Component": 0.027450980392156862,
+ },
+ "Selection Color (Light)": {
+ "Blue Component": 0.8352941176470589,
+ "Color Space": "sRGB",
+ "Green Component": 0.9098039215686274,
+ "Red Component": 0.9333333333333333,
+ },
+ }
+
+ buffer = io.BytesIO()
+ plistlib.dump(out, buffer, fmt=plistlib.FMT_BINARY)
+ return buffer.getvalue()
+
+
if __name__ == "__main__":
palette_id, palette = get_palette()
@@ -136,3 +509,4 @@ if __name__ == "__main__":
(out_dir / "TextMate_dark.tmTheme").write_text(
generate_textmate_theme(colours=palette["dark"], palette_id=palette_id)
)
+ (out_dir / "alexwlchan.itermcolors").write_bytes(generate_iterm2_theme(palette))
out/TextMate_dark.tmTheme (3581) → out/TextMate_dark.tmTheme (3581)
diff --git a/out/TextMate_dark.tmTheme b/out/TextMate_dark.tmTheme
index 83fb317..14e6589 100644
--- a/out/TextMate_dark.tmTheme
+++ b/out/TextMate_dark.tmTheme
@@ -1,4 +1,4 @@
-// Generated from palette 2477498-94fa872 at 2025-12-01T07:52:12.960710+00:00
+// Generated from palette 2477498-94fa872 at 2025-12-02T07:12:18.012482+00:00
// See https://github.com/alexwlchan/colour-scheme
{ settings = (
{ settings = {
out/TextMate_light.tmTheme (3581) → out/TextMate_light.tmTheme (3581)
diff --git a/out/TextMate_light.tmTheme b/out/TextMate_light.tmTheme
index 72e7a47..0e343bf 100644
--- a/out/TextMate_light.tmTheme
+++ b/out/TextMate_light.tmTheme
@@ -1,4 +1,4 @@
-// Generated from palette 2477498-94fa872 at 2025-12-01T07:52:12.959067+00:00
+// Generated from palette 2477498-94fa872 at 2025-12-02T07:12:18.010804+00:00
// See https://github.com/alexwlchan/colour-scheme
{ settings = (
{ settings = {
out/alexwlchan.itermcolors (0) → out/alexwlchan.itermcolors (3964)
diff --git a/out/alexwlchan.itermcolors b/out/alexwlchan.itermcolors
new file mode 100644
index 0000000..b281fab
Binary files /dev/null and b/out/alexwlchan.itermcolors differ
palette.json (526) → palette.json (572)
diff --git a/palette.json b/palette.json
index e5c17cf..24cd139 100644
--- a/palette.json
+++ b/palette.json
@@ -9,7 +9,8 @@
"blue": "#115bda",
"magenta": "#c311d0",
"yellow": "#c8a711",
- "highlight": "#ffeb12b3"
+ "highlight": "#ffeb12b3",
+ "cyan": "#2dceb7"
},
"dark": {
"background": "#0d0d0d",
@@ -20,6 +21,7 @@
"blue": "#40c3ff",
"magenta": "#ff42fc",
"yellow": "#fffc42",
- "highlight": "#fffc4244"
+ "highlight": "#fffc4244",
+ "cyan": "#41f1df"
}
}
\ No newline at end of file
palette.py (861) → palette.py (814)
diff --git a/palette.py b/palette.py
index 3f9ceff..6620da4 100644
--- a/palette.py
+++ b/palette.py
@@ -10,10 +10,11 @@ class BaseColours(TypedDict):
blue: str
magenta: str
yellow: str
+ cyan: str
highlight: str
-class Colours(TypedDict):
+class Colours(BaseColours):
background: str
text: str
comment: str
@@ -26,14 +27,13 @@ class Colours(TypedDict):
def enrich_colours(c: BaseColours) -> Colours:
return {
- "background": c["background"],
+ **c,
"text": c["text"],
"comment": c["red"],
"literal": c["magenta"],
"string": c["green"],
"name": c["blue"],
"punctuation": c["accent_grey"],
- "highlight": c["highlight"],
}