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>
18 files changed,
+631 insertions,
-48 deletions
| 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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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
|