Skip to main content

max / balanced_breakfast

Fail the build when a rule takes a property the generated sheet already sets Four overlaps existed when the check was switched on and three were real: the disabled button restated makeover's muted colour and `not-allowed` cursor verbatim, and the article row's title and subtitle restated `.row-primary` and `.row-secondary`'s colours with the same tokens. App CSS is unlayered, so each was the app taking a property off the design system and handing back the same value, which is the arrangement that looks fine until the design system changes its mind and nothing moves. Nothing about the rendering changed when they went. The remaining two are `.button`'s resting colour and cursor, which makeover does not state: it draws the disabled and tone arms and this app draws the pressable one. Those are declared with the reason, and an entry that stops colliding fails the build, so the list cannot outlive what it describes.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-08-12 01:49 UTC
Commit: a685f8b3a605e44d09e4315f5489685d5bf8ed7d
Parent: 72b8a82
4 files changed, +42 insertions, -18 deletions
M Cargo.lock +12 -12
@@ -3141,9 +3141,9 @@
3141 3141
3142 3142 [[package]]
3143 3143 name = "makeover-build"
3144 - version = "0.21.0"
3144 + version = "0.23.1"
3145 3145 source = "registry+https://github.com/rust-lang/crates.io-index"
3146 - checksum = "1b2484a18b0a0355762c4c5feaaaa8165b38ec33ce55fd2df6092dd0887b4a49"
3146 + checksum = "09326dad8b7fdbf1ae4359f866e8f4432a86c837f5a8bf1576bf0c298afcd41b"
3147 3147 dependencies = [
3148 3148 "makeover",
3149 3149 "makeover-geometry",
@@ -3174,9 +3174,9 @@
3174 3174
3175 3175 [[package]]
3176 3176 name = "makeover-webview"
3177 - version = "0.28.0"
3177 + version = "0.30.1"
3178 3178 source = "registry+https://github.com/rust-lang/crates.io-index"
3179 - checksum = "d2402af6249ca10f0a7ddbad2b5eb81725676ffca84093cb86bc1cadfa5b2272"
3179 + checksum = "d6f86fc082c5fc0d73192a3f3f5f74840848ba2cc815154ab207b1fc707f7c64"
3180 3180 dependencies = [
3181 3181 "makeover-geometry",
3182 3182 "makeover-layout",
@@ -7940,6 +7940,14 @@
7940 7940 "winnow 1.0.4",
7941 7941 ]
7942 7942
7943 + [[patch.unused]]
7944 + name = "kberg"
7945 + version = "0.1.0"
7946 +
7947 + [[patch.unused]]
7948 + name = "painhours"
7949 + version = "0.1.0"
7950 +
7943 7951 [[patch.unused]]
7944 7952 name = "quasi-axum"
7945 7953 version = "0.1.0"
@@ -7963,11 +7971,3 @@
7963 7971 [[patch.unused]]
7964 7972 name = "quasi-webview"
7965 7973 version = "0.1.0"
7966 -
7967 - [[patch.unused]]
7968 - name = "kberg"
7969 - version = "0.1.0"
7970 -
7971 - [[patch.unused]]
7972 - name = "painhours"
7973 - version = "0.1.0"
@@ -18,7 +18,7 @@
18 18 # Materialises all three generated files: themes/, geometry.css, layout.css.
19 19 # The build script needs nothing else; makeover and makeover-geometry reach it
20 20 # through here.
21 - makeover-build = "0.21.0"
21 + makeover-build = "0.23.1"
22 22
23 23 [dependencies]
24 24 bb-interface.workspace = true
@@ -21,7 +21,34 @@
21 21 // The list is for a width that tunes the inside of a shell, and adding one
22 22 // to silence this check is how a real boundary escapes it.
23 23 makeover_build::check_breakpoints(&frontend, &[]);
24 + makeover_build::check_vocabulary(
25 + &frontend,
26 + &makeover_build::Emit::default(),
27 + &["geometry.css", "layout.css"],
28 + REVIEWED_OVERLAPS,
29 + );
24 30 makeover_build::check_touch_density(frontend.join("js"));
25 31
26 32 tauri_build::build();
27 33 }
34 +
35 + /// Class-and-property overlaps with the generated stylesheet that have been
36 + /// read and kept.
37 + ///
38 + /// Both are the two sheets styling **different selector arms** of `.button`:
39 + /// makeover draws the disabled and tone arms, this app draws the resting one.
40 + /// `.button { color: var(--content) }` and `cursor: pointer` are what a button
41 + /// looks like when you can press it, and makeover states neither. The check
42 + /// collapses arms, because separating them would need a selector matcher and a
43 + /// checker that guesses wrong about specificity fails correct builds, so the
44 + /// judgement is recorded here instead.
45 + ///
46 + /// Three other overlaps existed when this check was first switched on and were
47 + /// deletions rather than entries: `.button:disabled` restated makeover's muted
48 + /// colour and `not-allowed` cursor verbatim, and `.row--article`'s title and
49 + /// subtitle restated `.row-primary` and `.row-secondary`'s colours with the
50 + /// same tokens. Nothing about the rendering changed when they went.
51 + ///
52 + /// An entry that stops colliding fails the build, so this list cannot outlive
53 + /// what it describes.
54 + const REVIEWED_OVERLAPS: &[(&str, &str)] = &[("button", "color"), ("button", "cursor")];
@@ -510,12 +510,10 @@
510 510 -webkit-box-orient: vertical;
511 511 overflow: hidden;
512 512 font-weight: 400;
513 - color: var(--content);
514 513 line-height: 1.4;
515 514 font-size: var(--font-size-base);
516 515 }
517 516 .row--article .row-secondary {
518 - color: var(--content-secondary);
519 517 font-size: var(--font-size-md);
520 518 margin-top: var(--step-hair);
521 519 }
@@ -598,11 +596,10 @@
598 596 border-color: var(--border-strong);
599 597 }
600 598 /* Disabled keeps its bevel. The object is still there; greying the content
601 - is what says the action is unavailable. */
599 + is what says the action is unavailable -- and the greying is the generated
600 + sheet's, along with the cursor. Only the edge is this app's. */
602 601 .button:disabled {
603 - color: var(--content-muted);
604 602 border-color: var(--content-muted);
605 - cursor: not-allowed;
606 603 }
607 604 /* The `.button:disabled:hover, .button:disabled:active` pair that used to
608 605 sit here is gone. It existed to out-specify the generated hover and