Skip to main content

max / makeover

0.10.0: add the neobrute theme audiofiles carried neobrute as a crate-local theme. Consolidating it onto the shared set would have dropped the theme: despite goingson.toml's note that it was 'formerly neobrute', the two palettes diverged and are visibly different, so goingson is not a replacement for it. Bring it in as an original and correct that note.
Author: Max Johnson <me@maxj.phd> · 2026-07-19 20:16 UTC
Commit: 8ffbd790795457fa60560b979f4e9184d8f7eaf4
Parent: dbad6be
7 files changed, +48 insertions, -6 deletions
M Cargo.toml +1 -1
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "makeover"
3 - version = "0.9.0"
3 + version = "0.10.0"
4 4 edition = "2024"
5 5 description = "Shared theme loading for the make-family apps: TOML theme files parsed into intent-based color tokens, with perceptual derivations and WCAG contrast."
6 6 license = "MIT"
M README.md +2 -2
@@ -6,7 +6,7 @@ The crate ships the theme set it loads, in `themes/`. Consumers get working them
6 6
7 7 Used by MNW server, GoingsOn, Balanced Breakfast, audiofiles, and Alloy.
8 8
9 - The crate ships 30 themes. `bundled_themes_dir()` hands back the directory; `embedded_themes()` hands back the same set as `(id, toml_source)` pairs with no filesystem path involved, for consumers that embed at compile time or bundle assets at build time.
9 + The crate ships 31 themes. `bundled_themes_dir()` hands back the directory; `embedded_themes()` hands back the same set as `(id, toml_source)` pairs with no filesystem path involved, for consumers that embed at compile time or bundle assets at build time.
10 10
11 11 ## Usage
12 12
@@ -39,7 +39,7 @@ if let Some(dir) = bundled_themes_dir() {
39 39
40 40 ## Theme File Format
41 41
42 - Colors are declared by **intent** (the role a color plays), not by hue. See `themes/` for the 30 bundled themes.
42 + Colors are declared by **intent** (the role a color plays), not by hue. See `themes/` for the 31 bundled themes.
43 43
44 44 ```toml
45 45 [meta]
@@ -88,6 +88,7 @@ this project's own work and carry no third-party claim:
88 88 - `goingson` — the GoingsOn application palette
89 89 - `audiofiles` — the audiofiles application palette
90 90 - `high-contrast` — an accessibility-oriented palette
91 + - `neobrute` — a cooler-toned light palette sharing an ancestry with `goingson`
91 92
92 93 ## Corrections
93 94
M src/lib.rs +2 -1
@@ -1032,7 +1032,8 @@ six = "#88c0d0"
1032 1032 fn adapted_themes_carry_inline_attribution() {
1033 1033 // Each adapted file must name its upstream in-file, so the credit
1034 1034 // survives someone copying a single .toml out of the crate.
1035 - const ORIGINALS: [&str; 4] = ["makenotwork", "goingson", "audiofiles", "high-contrast"];
1035 + const ORIGINALS: [&str; 5] =
1036 + ["makenotwork", "goingson", "audiofiles", "high-contrast", "neobrute"];
1036 1037 for (id, source) in embedded_themes() {
1037 1038 if ORIGINALS.contains(&id) {
1038 1039 continue;
@@ -1,6 +1,6 @@
1 1 # Themes
2 2
3 - The 30 theme files this crate ships. Consumers get them two ways: as a
3 + The 31 theme files this crate ships. Consumers get them two ways: as a
4 4 directory via `bundled_themes_dir()`, or embedded with no path at all via
5 5 `embedded_themes()`.
6 6
@@ -1,4 +1,5 @@
1 - # GoingsOn — the app's titular default skin (formerly "neobrute"). Also
1 + # GoingsOn — the app's titular default skin. Shares an ancestry with the
2 + # `neobrute` theme, which ships alongside it; the two have since diverged. Also
2 3 # available cross-app as a universal theme.
3 4
4 5 [meta]
@@ -0,0 +1,39 @@
1 + # Neobrute — an original palette, no third-party source.
2 + #
3 + # Distinct from the `goingson` theme despite a shared ancestry: the two
4 + # diverged, and neobrute keeps the cooler cyan-leaning surfaces.
5 +
6 + [meta]
7 + name = "Neobrute"
8 + variant = "light"
9 +
10 + [surface]
11 + page = "#E8F4F8"
12 + raised = "#FFFFFF"
13 + sunken = "#C0E2EC"
14 + overlay = "#D4EBF2"
15 +
16 + [content]
17 + primary = "#1B365D"
18 + secondary = "#3D5A80"
19 + muted = "#4d6b82"
20 +
21 + [action]
22 + primary = "#1B365D"
23 +
24 + [status]
25 + danger = "#DC3545"
26 + success = "#5CB85C"
27 + warning = "#F7D154"
28 + info = "#17A2B8"
29 +
30 + [line]
31 + border = "#1B365D"
32 +
33 + [category]
34 + one = "#DC3545"
35 + two = "#5CB85C"
36 + three = "#1B365D"
37 + four = "#F7D154"
38 + five = "#7B68EE"
39 + six = "#17A2B8"