Skip to main content

max / balanced_breakfast

Put Balanced Breakfast on the house fonts BB defined no font tokens at all: one hardcoded -apple-system stack on body, and shared-updater.js reaching for --font-body, a token this app never defined, behind a fallback that quietly rendered sans-serif instead. Both now resolve to --font-sans out of the generated typography.css. The faces are cut into frontend/fonts/ at build time by quasi-type, whose rev is the one shop and the Alloy image name.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-08-17 16:23 UTC
Signed with PGP, not checked
Commit: 06e8358b09ecadacc24d8fd29eef7acfd295f70c
Parent: ec57095
7 files changed, +194 insertions, -29 deletions
M .gitignore +4
@@ -42,6 +42,10 @@
42 42 # Generated by src-tauri/build.rs from makeover-geometry's scale
43 43 /src-tauri/frontend/css/geometry.css
44 44 /src-tauri/frontend/css/layout.css
45 + /src-tauri/frontend/css/typography.css
46 + # The house faces, cut by quasi-type in build.rs. The pipeline is the source;
47 + # a committed face is a second one that nothing rebuilds.
48 + /src-tauri/frontend/fonts/
45 49
46 50 # Secrets and credentials. The baseline every repo under ~/Code carries, kept
47 51 # identical so no repo is the one that forgot. Suffix-matched rather than
M Cargo.lock +153 -20
@@ -431,6 +431,7 @@
431 431 "makeover-build",
432 432 "open",
433 433 "parking_lot",
434 + "quasi-type",
434 435 "rand 0.10.2",
435 436 "regex",
436 437 "roxmltree",
@@ -705,6 +706,20 @@
705 706 version = "1.25.2"
706 707 source = "registry+https://github.com/rust-lang/crates.io-index"
707 708 checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797"
709 + dependencies = [
710 + "bytemuck_derive",
711 + ]
712 +
713 + [[package]]
714 + name = "bytemuck_derive"
715 + version = "1.12.0"
716 + source = "registry+https://github.com/rust-lang/crates.io-index"
717 + checksum = "fc0e56a716f1e132ff6bf4bdac1c944a3fcdc1cae65f70a4a2a1ac3b401d2d1f"
718 + dependencies = [
719 + "proc-macro2",
720 + "quote",
721 + "syn 3.0.3",
722 + ]
708 723
709 724 [[package]]
710 725 name = "byteorder"
@@ -1633,6 +1648,15 @@
1633 1648 "windows-sys 0.61.2",
1634 1649 ]
1635 1650
1651 + [[package]]
1652 + name = "euclid"
1653 + version = "0.22.14"
1654 + source = "registry+https://github.com/rust-lang/crates.io-index"
1655 + checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06"
1656 + dependencies = [
1657 + "num-traits",
1658 + ]
1659 +
1636 1660 [[package]]
1637 1661 name = "event-listener"
1638 1662 version = "5.4.2"
@@ -1720,6 +1744,7 @@
1720 1744 dependencies = [
1721 1745 "crc32fast",
1722 1746 "miniz_oxide",
1747 + "zlib-rs",
1723 1748 ]
1724 1749
1725 1750 [[package]]
@@ -1734,6 +1759,15 @@
1734 1759 source = "registry+https://github.com/rust-lang/crates.io-index"
1735 1760 checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
1736 1761
1762 + [[package]]
1763 + name = "font-types"
1764 + version = "0.12.3"
1765 + source = "registry+https://github.com/rust-lang/crates.io-index"
1766 + checksum = "75382bc7392ef10aad10935f92fc3db36d2d4dad0e5d96d8d65e04f89a07ec39"
1767 + dependencies = [
1768 + "bytemuck",
1769 + ]
1770 +
1737 1771 [[package]]
1738 1772 name = "foreign-types"
1739 1773 version = "0.5.0"
@@ -2982,6 +3016,18 @@
2982 3016 "selectors 0.22.0",
2983 3017 ]
2984 3018
3019 + [[package]]
3020 + name = "kurbo"
3021 + version = "0.13.1"
3022 + source = "registry+https://github.com/rust-lang/crates.io-index"
3023 + checksum = "4b60dfc32f652b926df6192e55525b16d186c69d47876c3ead4da5cc9f8450e2"
3024 + dependencies = [
3025 + "arrayvec",
3026 + "euclid",
3027 + "polycool",
3028 + "smallvec",
3029 + ]
3030 +
2985 3031 [[package]]
2986 3032 name = "lazy_static"
2987 3033 version = "1.5.0"
@@ -3130,9 +3176,7 @@
3130 3176
3131 3177 [[package]]
3132 3178 name = "makeover"
3133 - version = "2.6.0"
3134 - source = "registry+https://github.com/rust-lang/crates.io-index"
3135 - checksum = "63f2504fc551cc50ca2766440ee1addd2452bfad02ec203411afe94a7d0a47a7"
3179 + version = "2.7.0"
3136 3180 dependencies = [
3137 3181 "include_dir",
3138 3182 "serde",
@@ -3141,9 +3185,7 @@
3141 3185
3142 3186 [[package]]
3143 3187 name = "makeover-build"
3144 - version = "0.39.0"
3145 - source = "registry+https://github.com/rust-lang/crates.io-index"
3146 - checksum = "52baae176ab62ac8d79238301be5dc112f1615630f647ab1465b57b5872edee0"
3188 + version = "0.40.0"
3147 3189 dependencies = [
3148 3190 "makeover",
3149 3191 "makeover-geometry",
@@ -4108,6 +4150,15 @@
4108 4150 "universal-hash",
4109 4151 ]
4110 4152
4153 + [[package]]
4154 + name = "polycool"
4155 + version = "0.4.0"
4156 + source = "registry+https://github.com/rust-lang/crates.io-index"
4157 + checksum = "50596ddc09eb5ad5f75cacd40209568e66df71baf86e1499a0e99c4cff12a5a6"
4158 + dependencies = [
4159 + "arrayvec",
4160 + ]
4161 +
4111 4162 [[package]]
4112 4163 name = "polyval"
4113 4164 version = "0.7.3"
@@ -4299,6 +4350,22 @@
4299 4350 source = "registry+https://github.com/rust-lang/crates.io-index"
4300 4351 checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae"
4301 4352
4353 + [[package]]
4354 + name = "quasi-type"
4355 + version = "0.1.0"
4356 + dependencies = [
4357 + "brotli",
4358 + "font-types",
4359 + "kurbo",
4360 + "read-fonts",
4361 + "serde",
4362 + "sha2 0.10.9",
4363 + "skrifa",
4364 + "toml 1.1.4+spec-1.1.0",
4365 + "write-fonts",
4366 + "zip 6.0.0",
4367 + ]
4368 +
4302 4369 [[package]]
4303 4370 name = "quick-xml"
4304 4371 version = "0.41.0"
@@ -4435,6 +4502,17 @@
4435 4502 source = "registry+https://github.com/rust-lang/crates.io-index"
4436 4503 checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539"
4437 4504
4505 + [[package]]
4506 + name = "read-fonts"
4507 + version = "0.43.0"
4508 + source = "registry+https://github.com/rust-lang/crates.io-index"
4509 + checksum = "a6b5cae85882cfb0167038e7726a426f47ebd808e67af78c2d6bcbb02acbf3ce"
4510 + dependencies = [
4511 + "bytemuck",
4512 + "font-types",
4513 + "once_cell",
4514 + ]
4515 +
4438 4516 [[package]]
4439 4517 name = "readable-readability"
4440 4518 version = "0.4.0"
@@ -5291,6 +5369,16 @@
5291 5369 source = "registry+https://github.com/rust-lang/crates.io-index"
5292 5370 checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649"
5293 5371
5372 + [[package]]
5373 + name = "skrifa"
5374 + version = "0.46.0"
5375 + source = "registry+https://github.com/rust-lang/crates.io-index"
5376 + checksum = "de0bbcc507e438bfe765692ae5228059959781db7430fe36e1cfd569e7c88c89"
5377 + dependencies = [
5378 + "bytemuck",
5379 + "read-fonts",
5380 + ]
5381 +
5294 5382 [[package]]
5295 5383 name = "slab"
5296 5384 version = "0.4.12"
@@ -5931,7 +6019,7 @@
5931 6019 "tokio",
5932 6020 "url",
5933 6021 "windows-sys 0.60.2",
5934 - "zip",
6022 + "zip 4.6.1",
5935 6023 ]
5936 6024
5937 6025 [[package]]
@@ -6031,7 +6119,7 @@
6031 6119 "serde_with",
6032 6120 "swift-rs",
6033 6121 "thiserror 2.0.20",
6034 - "toml 0.9.12+spec-1.1.0",
6122 + "toml 1.1.4+spec-1.1.0",
6035 6123 "url",
6036 6124 "urlpattern",
6037 6125 "uuid",
@@ -7573,6 +7661,19 @@
7573 7661 source = "registry+https://github.com/rust-lang/crates.io-index"
7574 7662 checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
7575 7663
7664 + [[package]]
7665 + name = "write-fonts"
7666 + version = "0.52.0"
7667 + source = "registry+https://github.com/rust-lang/crates.io-index"
7668 + checksum = "843cebb7bd36359861dbce43d54ac8b33dfdf7b80a95913adc1ef7c7bb881e62"
7669 + dependencies = [
7670 + "font-types",
7671 + "indexmap 2.14.0",
7672 + "kurbo",
7673 + "log",
7674 + "read-fonts",
7675 + ]
7676 +
7576 7677 [[package]]
7577 7678 name = "writeable"
7578 7679 version = "0.6.3"
@@ -7893,12 +7994,44 @@
7893 7994 "memchr",
7894 7995 ]
7895 7996
7997 + [[package]]
7998 + name = "zip"
7999 + version = "6.0.0"
8000 + source = "registry+https://github.com/rust-lang/crates.io-index"
8001 + checksum = "eb2a05c7c36fde6c09b08576c9f7fb4cda705990f73b58fe011abf7dfb24168b"
8002 + dependencies = [
8003 + "arbitrary",
8004 + "crc32fast",
8005 + "flate2",
8006 + "indexmap 2.14.0",
8007 + "memchr",
8008 + "zopfli",
8009 + ]
8010 +
8011 + [[package]]
8012 + name = "zlib-rs"
8013 + version = "0.6.7"
8014 + source = "registry+https://github.com/rust-lang/crates.io-index"
8015 + checksum = "34b31d188d9d685a4f9c7b46d6e36631b07058d2cfe190267adce54dc230bf12"
8016 +
7896 8017 [[package]]
7897 8018 name = "zmij"
7898 8019 version = "1.0.23"
7899 8020 source = "registry+https://github.com/rust-lang/crates.io-index"
7900 8021 checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
7901 8022
8023 + [[package]]
8024 + name = "zopfli"
8025 + version = "0.8.3"
8026 + source = "registry+https://github.com/rust-lang/crates.io-index"
8027 + checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249"
8028 + dependencies = [
8029 + "bumpalo",
8030 + "crc32fast",
8031 + "log",
8032 + "simd-adler32",
8033 + ]
8034 +
7902 8035 [[package]]
7903 8036 name = "zvariant"
7904 8037 version = "5.14.0"
@@ -7940,6 +8073,18 @@
7940 8073 "winnow 1.0.4",
7941 8074 ]
7942 8075
8076 + [[patch.unused]]
8077 + name = "kberg"
8078 + version = "0.1.0"
8079 +
8080 + [[patch.unused]]
8081 + name = "ops-status"
8082 + version = "0.1.0"
8083 +
8084 + [[patch.unused]]
8085 + name = "painhours"
8086 + version = "0.1.0"
8087 +
7943 8088 [[patch.unused]]
7944 8089 name = "quasi-axum"
7945 8090 version = "0.18.0"
@@ -7971,15 +8116,3 @@
7971 8116 [[patch.unused]]
7972 8117 name = "quasi-webview"
7973 8118 version = "0.18.0"
7974 -
7975 - [[patch.unused]]
7976 - name = "kberg"
7977 - version = "0.1.0"
7978 -
7979 - [[patch.unused]]
7980 - name = "ops-status"
7981 - version = "0.1.0"
7982 -
7983 - [[patch.unused]]
7984 - name = "painhours"
7985 - version = "0.1.0"
M Cargo.toml +1 -1
@@ -59,7 +59,7 @@
59 59 # Utilities
60 60 chrono = { version = "0.4.43", features = ["serde"] }
61 61 uuid = { version = "1.20.0", features = ["v4", "serde"] }
62 - makeover = "2.5"
62 + makeover = "2.7"
63 63 # The invariant half of the design system: relational spacing. makeover
64 64 # resolves colour, which a theme may override; this carries what no theme may.
65 65 toml = "1.1"
@@ -15,10 +15,16 @@
15 15
16 16 [build-dependencies]
17 17 tauri-build = { version = "2.5.5", features = [] }
18 - # Materialises all three generated files: themes/, geometry.css, layout.css.
19 - # The build script needs nothing else; makeover and makeover-geometry reach it
20 - # through here.
21 - makeover-build = "0.39.0"
18 + # Materialises the generated files: themes/, geometry.css, layout.css,
19 + # typography.css. makeover and makeover-geometry reach the build script through
20 + # here rather than as pins of their own.
21 + makeover-build = "0.40.0"
22 + # Cuts the two house faces into frontend/fonts/. A git dependency because
23 + # quasi-type is `publish = false`, which is also why makeover-build cannot do
24 + # this and only emits the CSS that fetches the result. The rev is the one
25 + # shop's `shop-font` and Alloy's `QUASI_TYPE_REV` name: the house face is one
26 + # face, so the three move together or a user sees two Quasi Monos.
27 + quasi-type = { git = "https://makenot.work/git/max/quasi-type.git", version = "0.1", rev = "e40330602e68fbdd2a9d2917bdec33a7ce573a1f" }
22 28
23 29 [dependencies]
24 30 bb-interface.workspace = true
@@ -1,14 +1,33 @@
1 1 fn main() {
2 - // All three generated files: themes/, geometry.css, layout.css. The
3 - // geometry emitter moved out too once density selection was settled:
2 + // The generated files: themes/, geometry.css, layout.css, typography.css.
3 + // The geometry emitter moved out once density selection was settled --
4 4 // touch is a capability, so it hangs off (hover: none), (pointer: coarse)
5 - // rather than a user-agent string or a breakpoint.
5 + // rather than a user-agent string or a breakpoint -- and typography
6 + // followed it for the same reason, once there was a house answer to state.
6 7 makeover_build::tauri_frontend(
7 8 env!("CARGO_MANIFEST_DIR"),
8 9 &makeover_build::Emit::default(),
9 10 None,
10 11 );
11 12
13 + // The faces typography.css fetches. Cut rather than committed, the rule
14 + // shop and the Alloy image already follow: a face in the repository is a
15 + // second source of truth that nothing rebuilds. The base is downloaded into
16 + // OUT_DIR once and checksummed against quasi-type's pins, so a warm target
17 + // directory needs no network.
18 + quasi_type::cut_web(
19 + &std::path::Path::new(env!("CARGO_MANIFEST_DIR"))
20 + .join("frontend")
21 + .join("fonts"),
22 + &std::path::Path::new(&std::env::var("OUT_DIR").expect("cargo sets OUT_DIR")).join("bases"),
23 + false,
24 + &[
25 + ("quasi-mono", makeover_build::WEBFONT_MONO_FILE),
26 + ("quasi-body", makeover_build::WEBFONT_SANS_FILE),
27 + ],
28 + )
29 + .expect("cut the house faces");
30 +
12 31 // The generated files above cannot drift from makeover-geometry: they ask
13 32 // it for the answer. The hand-written ones state it, so they are checked
14 33 // rather than trusted. goingson had both checks and this app had neither,
@@ -21,6 +21,9 @@
21 21 <!-- Generated from makeover-geometry and makeover-webview by
22 22 src-tauri/build.rs, both into `@layer makeover`. Geometry first, so the
23 23 stylesheet can read --gap-* and --step-* off :root. -->
24 + <!-- Typography first: it defines --font-mono and --font-sans, and its
25 + @font-face rules are what start the faces downloading. -->
26 + <link rel="stylesheet" href="css/typography.css">
24 27 <link rel="stylesheet" href="css/geometry.css">
25 28 <link rel="stylesheet" href="css/layout.css">
26 29 <link rel="stylesheet" href="css/styles.css">
@@ -278,7 +278,7 @@
278 278
279 279 /* === 4. Layout shell: body & #app ==================================== */
280 280 body {
281 - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
281 + font-family: var(--font-sans);
282 282 background-color: var(--surface-page);
283 283 color: var(--content);
284 284 line-height: 1.5;