Skip to main content

max / quasi

0.56.0: this renderer says which classes it is responsible for goingson `43a682b0`. `makeover_build::check_vocabulary_use` asked "which generated classes does no markup emit" by reading an app's own `index.html` and the scripts beside it. goingson's swap deleted all of them, so the call was left out of that app's build rather than run against nothing: an app cannot see its own document any more, because its document is Rust in a dependency. That dependency is this crate, so the question moves here. THE SET IS CLOSED, WHICH IS THE USEFUL PART. A description has no word for a class. Measured across goingson's src/quasi/, the largest described app in the tree: zero class names, because the vocabulary offers no way to write one. So `covers` is not a lower bound on what an app's stylesheet may legitimately match, it is the whole of it, and a selector outside it is dead rather than merely unaccounted for. That is what turns a drift check on a stylesheet from advisory into exact, and it is what tells goingson how much of a 9,830-line sheet to delete. ONE FAMILY IS OPEN AND IT IS NOT OURS. `col-<name>` comes from makeover_webview::list, built from an app-declared column name. No list can hold it, which is why `covers` exists beside `names` and is the function to check with: an app comparing against `names` alone would call every table rule dead and delete the styling. WRITTEN DOWN RATHER THAN SCRAPED, because there is nothing to scrape. makeover parses the stylesheet it just generated and has no second source to drift from; this crate generates no CSS. So the honesty comes from two tests instead, and both directions are needed: - every class the corpus emits is one `vocabulary` covers. A name added to an emitter and not to the list fails here, rather than quietly shrinking the set an app checks against. - every name in OWN is one the corpus still emits. This is the direction that fails unsafely if it is missing: a stale entry is a class an app believes is live, so it keeps a rule for markup nothing produces -- the dead CSS the check exists to find, preserved by the check itself. The corpus is one screen carrying every node kind, every notice, every row and table affordance, plus one screen per region kind, arrangement and measure. Writing it was not ceremony: a careful read of the emitters produced 35 names, and the corpus found 14 more, the `col-` family among them. MAKEOVER_UNLISTED is three classes makeover emits that its own `vocabulary::names` does not contain -- `cell-fill`, `form-group`, `form-label` -- found by the same guard. Kept separate from OWN because they are not this crate's to name; when makeover's set grows to include them the constant becomes empty and can go. Until then an app checking against makeover alone would call three live rules dead. 0.56.0 rather than a patch: a new public module is additive, but the workspace versions in lockstep and consumers take the whole set.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-08-22 21:36 UTC
Signed with PGP, not checked
Commit: e2e145fb549a22b129bb87492fcdbcd0913aec9d
Parent: 0f241ce
18 files changed, +631 insertions, -48 deletions
M Cargo.lock +11 -11
@@ -3414,11 +3414,11 @@
3414 3414
3415 3415 [[package]]
3416 3416 name = "quasi"
3417 - version = "0.55.0"
3417 + version = "0.56.0"
3418 3418
3419 3419 [[package]]
3420 3420 name = "quasi-axum"
3421 - version = "0.55.0"
3421 + version = "0.56.0"
3422 3422 dependencies = [
3423 3423 "axum",
3424 3424 "http",
@@ -3432,7 +3432,7 @@
3432 3432
3433 3433 [[package]]
3434 3434 name = "quasi-basics"
3435 - version = "0.55.0"
3435 + version = "0.56.0"
3436 3436 dependencies = [
3437 3437 "makeover-layout",
3438 3438 "quasi-http",
@@ -3442,7 +3442,7 @@
3442 3442
3443 3443 [[package]]
3444 3444 name = "quasi-bench"
3445 - version = "0.55.0"
3445 + version = "0.56.0"
3446 3446 dependencies = [
3447 3447 "dhat",
3448 3448 "makeover",
@@ -3457,7 +3457,7 @@
3457 3457
3458 3458 [[package]]
3459 3459 name = "quasi-http"
3460 - version = "0.55.0"
3460 + version = "0.56.0"
3461 3461 dependencies = [
3462 3462 "form_urlencoded",
3463 3463 "http",
@@ -3466,7 +3466,7 @@
3466 3466
3467 3467 [[package]]
3468 3468 name = "quasi-immediate"
3469 - version = "0.55.0"
3469 + version = "0.56.0"
3470 3470 dependencies = [
3471 3471 "docengine",
3472 3472 "egui",
@@ -3476,7 +3476,7 @@
3476 3476
3477 3477 [[package]]
3478 3478 name = "quasi-notifs"
3479 - version = "0.55.0"
3479 + version = "0.56.0"
3480 3480 dependencies = [
3481 3481 "quasi-router",
3482 3482 "synckit-config",
@@ -3484,7 +3484,7 @@
3484 3484
3485 3485 [[package]]
3486 3486 name = "quasi-router"
3487 - version = "0.55.0"
3487 + version = "0.56.0"
3488 3488 dependencies = [
3489 3489 "makeover-layout",
3490 3490 ]
@@ -3501,7 +3501,7 @@
3501 3501
3502 3502 [[package]]
3503 3503 name = "quasi-tauri"
3504 - version = "0.55.0"
3504 + version = "0.56.0"
3505 3505 dependencies = [
3506 3506 "http",
3507 3507 "quasi-http",
@@ -3514,7 +3514,7 @@
3514 3514
3515 3515 [[package]]
3516 3516 name = "quasi-tui"
3517 - version = "0.55.0"
3517 + version = "0.56.0"
3518 3518 dependencies = [
3519 3519 "docengine",
3520 3520 "makeover",
@@ -3526,7 +3526,7 @@
3526 3526
3527 3527 [[package]]
3528 3528 name = "quasi-webview"
3529 - version = "0.55.0"
3529 + version = "0.56.0"
3530 3530 dependencies = [
3531 3531 "docengine",
3532 3532 "makeover-layout",
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-axum"
3 - version = "0.55.0"
3 + version = "0.56.0"
4 4 description = "The axum host adapter for quasi-router: an HTTP request in, a rendered description out"
5 5 edition.workspace = true
6 6 rust-version.workspace = true
@@ -13,14 +13,14 @@
13 13 workspace = true
14 14
15 15 [dependencies]
16 - quasi-router = { path = "../quasi-router", version = "0.55.0" }
17 - quasi-http = { path = "../quasi-http", version = "0.55.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.56.0" }
17 + quasi-http = { path = "../quasi-http", version = "0.56.0" }
18 18 axum = "0.8.8"
19 19 http = "1.3.1"
20 20 tokio = { version = "1.50.0", features = ["rt"] }
21 21
22 22 [dev-dependencies]
23 - quasi-webview = { path = "../quasi-webview", version = "0.55.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.56.0" }
24 24 tokio = { version = "1.50.0", features = ["macros", "rt-multi-thread"] }
25 25 tower = { version = "0.5.3", features = ["util"] }
26 26 http-body-util = "0.1.3"
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-basics"
3 - version = "0.55.0"
3 + version = "0.56.0"
4 4 description = "The first-party widget set: named assemblies of primitives, shared across our apps"
5 5 edition.workspace = true
6 6 rust-version.workspace = true
@@ -13,12 +13,12 @@
13 13 workspace = true
14 14
15 15 [dependencies]
16 - quasi-router = { path = "../quasi-router", version = "0.55.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.56.0" }
17 17 makeover-layout = "0.35.0"
18 18
19 19 [dev-dependencies]
20 20 # A widget's guarantees are claims about what a renderer draws, so they are
21 21 # tested against a real one rather than by walking the tree the assembly just
22 22 # built. The webview is the renderer that recognises names today.
23 - quasi-webview = { path = "../quasi-webview", version = "0.55.0" }
24 - quasi-http = { path = "../quasi-http", version = "0.55.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.56.0" }
24 + quasi-http = { path = "../quasi-http", version = "0.56.0" }
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-bench"
3 - version = "0.55.0"
3 + version = "0.56.0"
4 4 description = "What a described screen costs to render, in time and in allocations"
5 5 edition.workspace = true
6 6 rust-version.workspace = true
@@ -22,13 +22,13 @@
22 22 count = ["dep:dhat"]
23 23
24 24 [dependencies]
25 - quasi-router = { path = "../quasi-router", version = "0.55.0" }
26 - quasi-webview = { path = "../quasi-webview", version = "0.55.0" }
27 - quasi-tui = { path = "../quasi-tui", version = "0.55.0" }
25 + quasi-router = { path = "../quasi-router", version = "0.56.0" }
26 + quasi-webview = { path = "../quasi-webview", version = "0.56.0" }
27 + quasi-tui = { path = "../quasi-tui", version = "0.56.0" }
28 28 # `Serves` is the trait carrying `screen` and `fragment`, which is what the
29 29 # webview is measured through. Taken directly rather than through quasi-webview
30 30 # because a bench calling a trait method should name the trait it calls.
31 - quasi-http = { path = "../quasi-http", version = "0.55.0" }
31 + quasi-http = { path = "../quasi-http", version = "0.56.0" }
32 32 makeover-layout = "0.35.0"
33 33 makeover-tui = { version = "0.33.0", features = ["theme"] }
34 34 # Only to load a bundled theme file. `makeover_tui::Theme` is `#[non_exhaustive]`,
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-http"
3 - version = "0.55.0"
3 + version = "0.56.0"
4 4 description = "The http-shaped seam quasi's webview host adapters share: decoding in, a rendered description out"
5 5 edition.workspace = true
6 6 rust-version.workspace = true
@@ -13,6 +13,6 @@
13 13 workspace = true
14 14
15 15 [dependencies]
16 - quasi-router = { path = "../quasi-router", version = "0.55.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.56.0" }
17 17 http = "1.3.1"
18 18 form_urlencoded = "1.2.2"
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-immediate"
3 - version = "0.55.0"
3 + version = "0.56.0"
4 4 edition = "2024"
5 5 description = "The immediate-mode renderer for quasi-router: a described screen in, an egui frame out. Immediate mode is the constraint that matters, not the library."
6 6 license = "MIT"
@@ -12,7 +12,7 @@
12 12 categories = ["gui"]
13 13
14 14 [dependencies]
15 - quasi-router = { path = "../quasi-router", version = "0.55.0" }
15 + quasi-router = { path = "../quasi-router", version = "0.56.0" }
16 16 # The node drawing, which is the makeover layer's and not this crate's. Every
17 17 # widget here that is not a container comes from it: a screen walk that painted
18 18 # its own meter would be the divergence the suite exists to end, one copy per
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-notifs"
3 - version = "0.55.0"
3 + version = "0.56.0"
4 4 description = "Declared notification kinds and the registry that holds them: what a notification says and what it is for, apart from how it reaches a person"
5 5 edition.workspace = true
6 6 rust-version.workspace = true
@@ -24,5 +24,5 @@
24 24 describe = ["dep:quasi-router"]
25 25
26 26 [dependencies]
27 - quasi-router = { path = "../quasi-router", version = "0.55.0", optional = true }
27 + quasi-router = { path = "../quasi-router", version = "0.56.0", optional = true }
28 28 synckit-config = { git = "https://makenot.work/git/max/synckit.git", version = "0.2", optional = true }
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-router"
3 - version = "0.55.0"
3 + version = "0.56.0"
4 4 description = "Host-agnostic router: a request in, a renderer-agnostic description out"
5 5 edition.workspace = true
6 6 rust-version.workspace = true