From 0cb1318a1d1a59933df894fad205dda29fc607f0 Mon Sep 17 00:00:00 2001 From: Richard Zink Date: Tue, 22 Sep 2026 11:16:10 +0200 Subject: [PATCH] docs: add palette swatch images for both variants --- README.md | 11 ++++- images/ash-dark-palette.png | Bin 0 -> 26505 bytes images/ash-light-palette.png | Bin 0 -> 28260 bytes tools/make_palette_images.py | 78 +++++++++++++++++++++++++++++++++++ 4 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 images/ash-dark-palette.png create mode 100644 images/ash-light-palette.png create mode 100644 tools/make_palette_images.py diff --git a/README.md b/README.md index 6568afd..408273d 100644 --- a/README.md +++ b/README.md @@ -13,13 +13,22 @@ Harbor palette to Ash. ## Variants +### Ash Dark + +![Ash Dark palette](images/ash-dark-palette.png) + +### Ash Light + +![Ash Light palette](images/ash-light-palette.png) + | Theme dir | Style | Base surfaces | Accent | |------------|-------|----------------------------------|--------| | `ash-dark` | dark | void `#100f12`, panel `#1c1b1f`, raised `#29282c`, bone `#e6dfd1` | ember `#e0914f` | -| `ash-light`| light | paper `#e9e3d5`, raised `#f2ecdf`, deep `#dcd5c3`, ink `#2a2822` | ember `#a85f1d` | +| `ash-light`| light | paper `#e9e3d5` / ink `#2a2822` ยท raised `#f2ecdf`, deep `#dcd5c3` | ember `#a85f1d` | Accents: ember, gold, blood, rot, moss, steel, violet, rust (see `tools/recolor.py` for the exact terminal 16-colour mapping). +Regenerate the swatch images above with `python3 tools/make_palette_images.py .`. ## Install (local) diff --git a/images/ash-dark-palette.png b/images/ash-dark-palette.png new file mode 100644 index 0000000000000000000000000000000000000000..ee760db6b1d9b54e53b432233addb86dc157739a GIT binary patch literal 26505 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 literal 0 HcmV?d00001 diff --git a/images/ash-light-palette.png b/images/ash-light-palette.png new file mode 100644 index 0000000000000000000000000000000000000000..911cc0e300c931c2bd8a9c98c6a3b65442174adf GIT binary patch literal 28260 zcmeFZXH-*b*DegYl}8a!5mAsTMYnU^==#Xn*v)7thjW+V;Z*XfJ;_+|#>9M^_rfcw~EqHs-a{1?$n#1qjj6 zy?RGScSxIhwM0kfeVdMM`3W7JauOXK`^&UCLsi;8&OQa{JfQwQ&OIiL(`FdF0D4*s z%jd41V>!2dH7C|DnZTSkl`A3ZI>ZL%j0Smc&`H12Cy~#?) z>{5rd#=OzgVL7L`{6@!?3y!gB!SDycTN0w}wXv)X8C1WYN+ilb8hPGxVkjtGj8t0V zyMga6cW7=tx$J)(*P3wStp6I(PMX@@f4K7ZiEAJKJ^pW9kB-rC*4qQSD`q7&HBZ*f z>27PaeoBs?Gi%4;WC|9hYdAyv=wbVz>~vqk{pfk?{`1MKn9a4dw{E&&R}Rk7?Y|ta zakoz7Xrb09zkL1rwZQgm zml|WcN7;gQfiphi%q!~UL8U_NB{om&{jyumhCN?uYaQsPG4H5sXcZWmc23vJ-hZn` zbMrLqI-B67l!50d5wW!nd}r#;;+aQXX-l>*6}B#<>_(2D%^r*#R-em#_IuXn9^kp) z$KGMyzoQ)Y9IO)bnp+|MzD8Z{5uQc8>oJ7JoCS|Lei>cQEOQ z;2iSKixD8?OC|-%(@hq{9DG0z&m8@XH4sc6GUrkty{6mDRDOX}3W3LM*&Z_t2&naI z)VZy{rJvTYHx4$rLlU5yrYt+>mtz7%0ANi|?3t!OSzNFu^OVnnROplgY&X*suYQg0 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

C;$PLKZ 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

ycTXIF+RrF)5TYs1*b{Cs7o zY-!sEEunMd45B2=yXuu>y?papHKXdaM*t|U@KB@W@zeu}ieEA&tr<0SHyTxh1aPBJ zMzLuDkaoAdj65jV&J#_j;~`uQ72M@(f`SA~!@JnB>d4Qkknp0bi?s6S1(^_b9;i=6 zAOE?n9e#sS9@88QQEdrD@{Nvk&9n$$J`8PLzc_dq4NQTuf+~`EoJ*cq%E5gRW(k(~xV*B)q4>}OU zn6p`MRAsua%~-h#jr=mOy*rGS4tFq1rGnS`7F===+2Q)%JPf}!Fp`XiMSz&i@Ej0m zWxQvIRrG0?CW;k}TuiXrDCz_rjlccp7JvHNPLIq!Sb)Xf{$Q7kn4qQf@7JyG|Nr&B z-;G_n{?G5n%N?O@!~S0nk4=0Jd=A+_qn`p@ZwI>Ry4-gIzU)$0Q`c5jyQHkHZl!if w_o9}r+9gFbHC;8e&QliEfA@xaey*PGVgL9Ibw(S17W}0UBXh&@Yqx&+H*-vA6aWAK literal 0 HcmV?d00001 diff --git a/tools/make_palette_images.py b/tools/make_palette_images.py new file mode 100644 index 0000000..52f1d60 --- /dev/null +++ b/tools/make_palette_images.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +"""Render the Ash palette swatch images used in the README (blog-style strips). + +Usage: python3 tools/make_palette_images.py +Requires: ImageMagick (convert). +""" +import subprocess +import sys +from pathlib import Path + +SW = 120 # swatch width +SH = 80 # swatch height +GAP = 14 # horizontal gap +COLS = 8 +PAD = 24 # outer padding +LABEL_H = 40 # two text lines under a swatch +ROW_H = SH + LABEL_H + +VARIANTS = { + "light": { + "bg": "#e9e3d5", "fg": "#2a2822", "stroke": "#c9c1ad", + "rows": [ + [("paper", "#e9e3d5"), ("raised", "#f2ecdf"), ("deep", "#dcd5c3"), + ("border", "#c9c1ad"), ("muted", "#6f685c"), ("icon", "#5b5449"), + ("ink", "#2a2822"), ("ink dark", "#141310")], + [("ember", "#a85f1d"), ("gold", "#8a6a24"), ("blood", "#96392a"), + ("rot", "#7c4a66"), ("moss", "#5c6631"), ("steel", "#3d6b72"), + ("violet", "#6a4c72"), ("rust", "#7d4a2c")], + ], + }, + "dark": { + "bg": "#100f12", "fg": "#e6dfd1", "stroke": "#3a383d", + "rows": [ + [("void", "#100f12"), ("panel", "#1c1b1f"), ("raised", "#29282c"), + ("border", "#3a383d"), ("ash", "#6d6a63"), ("stone", "#999187"), + ("bone", "#e6dfd1"), ("chalk", "#f3ede1")], + [("ember", "#e0914f"), ("gold", "#d6b46a"), ("blood", "#c15c46"), + ("rot", "#b47e99"), ("moss", "#8f9a5c"), ("steel", "#7c9aa1"), + ("violet", "#a585ac"), ("rust", "#a86a48")], + ], + }, +} + + +def render(variant, cfg, out): + width = PAD * 2 + COLS * SW + (COLS - 1) * GAP + height = PAD * 2 + len(cfg["rows"]) * ROW_H + args = ["convert", "-size", f"{width}x{height}", f"xc:{cfg['bg']}", + "-font", "DejaVu-Sans"] + for r, row in enumerate(cfg["rows"]): + for c, (name, color) in enumerate(row): + x = PAD + c * (SW + GAP) + y = PAD + r * ROW_H + args += ["-fill", color, "-stroke", cfg["stroke"], "-strokewidth", "1", + "-draw", f"rectangle {x},{y} {x + SW},{y + SH}"] + cx = x + SW // 2 - width // 2 # gravity North anchors at top-center + args += ["-stroke", "none", "-fill", cfg["fg"], + "-pointsize", "14", "-gravity", "North", + "-annotate", f"+{cx}+{y + SH + 6}", name] + args += ["-pointsize", "13", "-fill", cfg["fg"], "-stroke", "none", + "-gravity", "North", + "-annotate", f"+{cx}+{y + SH + 24}", color] + args.append(str(out)) + subprocess.run(args, check=True) + + +def main(): + root = Path(sys.argv[1]).resolve() + img_dir = root / "images" + img_dir.mkdir(exist_ok=True) + for variant, cfg in VARIANTS.items(): + out = img_dir / f"ash-{variant}-palette.png" + render(variant, cfg, out) + print(f"wrote {out.relative_to(root)}") + + +if __name__ == "__main__": + main()