Skip to main content

max / quasi

0.64.0: the three renderers draw the wait they describe Phase 2 of wiki `loading-and-progress-standard`, all three surfaces in one pass because they are one reading and splitting them is how they diverge. quasi-immediate drew `ui.spinner()` for `Readiness::Pending` unconditionally: the only true rotating animation in the tree, and drawn identically whether the region was waiting on a measured payload or on nothing anyone could count. It draws the activity mark now, and a bar when something is watching delivery. quasi-tui's `busy_line` set `State::Disabled` and returned whatever the wait carried, so `Awaiting::of(41_943_040)` and `Awaiting::unmeasured()` produced identical output -- the amount was described, carried through the runtime, and dropped at the draw. The lock stays, which is rule 4; the mark is what it could not say. quasi-webview had been emitting `data-awaiting` for months with nothing styling either value. `makeover-webview` 0.60.0 draws it, and `AWAITING_JS` is the half neither of them could supply: `aria-busy` on the element while the request is in flight, and `--awaiting-share` from bytes the browser reports delivered. Not independent of htmx, unlike reveal, repeat and fill, so `without_htmx` drops it. The numerator is the host's on every surface. `Awaiting` carries the size of the payload and nothing can describe how much has arrived, because that is a fact about bytes in flight, so `View::delivered` is where it lands on the two native renderers and an XHR progress event is where it comes from in the browser. A wait nobody is counting draws the mark rather than an empty trough, and never a bar walking forward on elapsed time. Both native renderers gain `with_reduced_motion`. Neither surface has a `prefers-reduced-motion` to read, so the preference is the host's to obtain and it stills the mark rather than removing it.
Author: Max Johnson <me@maxj.phd> · 2026-08-26 19:54 UTC
Signed with PGP, not checked
Commit: 2b82cd53568de599949097249889b48b03d9acb5
Parent: 45a4f6f
27 files changed, +665 insertions, -82 deletions
M Cargo.lock +32 -21
@@ -2605,13 +2605,14 @@
2605 2605
2606 2606 [[package]]
2607 2607 name = "makeover-immediate"
2608 - version = "0.35.0"
2608 + version = "0.36.0"
2609 2609 source = "registry+https://github.com/rust-lang/crates.io-index"
2610 - checksum = "d12682cc00dee1866075ff3cd9890d393e68b801c1c93e9dd525d332a8dadee0"
2610 + checksum = "8747a39c2a5de617b357978354ffc0d850c1be7ac95098952b4c6850c2b0d51f"
2611 2611 dependencies = [
2612 2612 "egui",
2613 2613 "egui_extras",
2614 2614 "makeover-layout",
2615 + "makeover-timing",
2615 2616 ]
2616 2617
2617 2618 [[package]]
@@ -2620,6 +2621,15 @@
2620 2621 source = "registry+https://github.com/rust-lang/crates.io-index"
2621 2622 checksum = "774bfd81b003f0d0059ff50daa8e625e6969175bc0132ddf7c2108bba40c47d5"
2622 2623
2624 + [[package]]
2625 + name = "makeover-timing"
2626 + version = "0.1.1"
2627 + source = "registry+https://github.com/rust-lang/crates.io-index"
2628 + checksum = "c83b1e0502c0179754752e59dd98fa4b15df8f9d0b454e0291b80c984aa2bd49"
2629 + dependencies = [
2630 + "makeover-geometry",
2631 + ]
2632 +
2623 2633 [[package]]
2624 2634 name = "makeover-touch"
2625 2635 version = "0.24.0"
@@ -2632,20 +2642,21 @@
2632 2642
2633 2643 [[package]]
2634 2644 name = "makeover-tui"
2635 - version = "0.34.0"
2645 + version = "0.35.0"
2636 2646 source = "registry+https://github.com/rust-lang/crates.io-index"
2637 - checksum = "a82de62265dfd6ac30dad6479cb3f5d72c6fc5306a29543e74e50d665ab00f0e"
2647 + checksum = "5414d705d290c20740119b634d246ee88012860fcc8a2cf20c5db584a92a7932"
2638 2648 dependencies = [
2639 2649 "makeover",
2640 2650 "makeover-layout",
2651 + "makeover-timing",
2641 2652 "ratatui",
2642 2653 ]
2643 2654
2644 2655 [[package]]
2645 2656 name = "makeover-webview"
2646 - version = "0.59.1"
2657 + version = "0.60.0"
2647 2658 source = "registry+https://github.com/rust-lang/crates.io-index"
2648 - checksum = "59714ea075f5c266616199eb8345808f85092be04278471ffde546bdb0f43cb6"
2659 + checksum = "203b3a259e249ed32ffd9d48d75a6c12e4aa173095607cc2c852f2c1f3fe9c0e"
2649 2660 dependencies = [
2650 2661 "makeover-geometry",
2651 2662 "makeover-layout",
@@ -3414,11 +3425,11 @@
3414 3425
3415 3426 [[package]]
3416 3427 name = "quasi"
3417 - version = "0.63.0"
3428 + version = "0.64.0"
3418 3429
3419 3430 [[package]]
3420 3431 name = "quasi-axum"
3421 - version = "0.63.0"
3432 + version = "0.64.0"
3422 3433 dependencies = [
3423 3434 "axum",
3424 3435 "http",
@@ -3432,7 +3443,7 @@
3432 3443
3433 3444 [[package]]
3434 3445 name = "quasi-basics"
3435 - version = "0.63.0"
3446 + version = "0.64.0"
3436 3447 dependencies = [
3437 3448 "makeover-layout",
3438 3449 "quasi-http",
@@ -3442,7 +3453,7 @@
3442 3453
3443 3454 [[package]]
3444 3455 name = "quasi-bench"
3445 - version = "0.63.0"
3456 + version = "0.64.0"
3446 3457 dependencies = [
3447 3458 "dhat",
3448 3459 "makeover",
@@ -3457,7 +3468,7 @@
3457 3468
3458 3469 [[package]]
3459 3470 name = "quasi-http"
3460 - version = "0.63.0"
3471 + version = "0.64.0"
3461 3472 dependencies = [
3462 3473 "form_urlencoded",
3463 3474 "http",
@@ -3466,7 +3477,7 @@
3466 3477
3467 3478 [[package]]
3468 3479 name = "quasi-immediate"
3469 - version = "0.63.0"
3480 + version = "0.64.0"
3470 3481 dependencies = [
3471 3482 "docengine",
3472 3483 "egui",
@@ -3476,7 +3487,7 @@
3476 3487
3477 3488 [[package]]
3478 3489 name = "quasi-notifs"
3479 - version = "0.63.0"
3490 + version = "0.64.0"
3480 3491 dependencies = [
3481 3492 "quasi-router",
3482 3493 "synckit-config",
@@ -3484,7 +3495,7 @@
3484 3495
3485 3496 [[package]]
3486 3497 name = "quasi-router"
3487 - version = "0.63.0"
3498 + version = "0.64.0"
3488 3499 dependencies = [
3489 3500 "makeover-layout",
3490 3501 ]
@@ -3501,7 +3512,7 @@
3501 3512
3502 3513 [[package]]
3503 3514 name = "quasi-tauri"
3504 - version = "0.63.0"
3515 + version = "0.64.0"
3505 3516 dependencies = [
3506 3517 "http",
3507 3518 "quasi-http",
@@ -3514,7 +3525,7 @@
3514 3525
3515 3526 [[package]]
3516 3527 name = "quasi-tui"
3517 - version = "0.63.0"
3528 + version = "0.64.0"
3518 3529 dependencies = [
3519 3530 "docengine",
3520 3531 "makeover",
@@ -3526,7 +3537,7 @@
3526 3537
3527 3538 [[package]]
3528 3539 name = "quasi-webview"
3529 - version = "0.63.0"
3540 + version = "0.64.0"
3530 3541 dependencies = [
3531 3542 "docengine",
3532 3543 "makeover-layout",
@@ -6201,10 +6212,6 @@
6201 6212 name = "quasi-type"
6202 6213 version = "0.1.0"
6203 6214
6204 - [[patch.unused]]
6205 - name = "synckit-client"
6206 - version = "0.9.1"
6207 -
6208 6215 [[patch.unused]]
6209 6216 name = "kberg"
6210 6217 version = "0.1.0"
@@ -6220,3 +6227,7 @@
6220 6227 [[patch.unused]]
6221 6228 name = "tagtree"
6222 6229 version = "0.4.1"
6230 +
6231 + [[patch.unused]]
6232 + name = "synckit-client"
6233 + version = "0.9.1"
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-axum"
3 - version = "0.63.0"
3 + version = "0.64.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.63.0" }
17 - quasi-http = { path = "../quasi-http", version = "0.63.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.64.0" }
17 + quasi-http = { path = "../quasi-http", version = "0.64.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.63.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.64.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.63.0"
3 + version = "0.64.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.63.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.64.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.63.0" }
24 - quasi-http = { path = "../quasi-http", version = "0.63.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.64.0" }
24 + quasi-http = { path = "../quasi-http", version = "0.64.0" }
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-bench"
3 - version = "0.63.0"
3 + version = "0.64.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,15 +22,15 @@
22 22 count = ["dep:dhat"]
23 23
24 24 [dependencies]
25 - quasi-router = { path = "../quasi-router", version = "0.63.0" }
26 - quasi-webview = { path = "../quasi-webview", version = "0.63.0" }
27 - quasi-tui = { path = "../quasi-tui", version = "0.63.0" }
25 + quasi-router = { path = "../quasi-router", version = "0.64.0" }
26 + quasi-webview = { path = "../quasi-webview", version = "0.64.0" }
27 + quasi-tui = { path = "../quasi-tui", version = "0.64.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.63.0" }
31 + quasi-http = { path = "../quasi-http", version = "0.64.0" }
32 32 makeover-layout = "0.35.0"
33 - makeover-tui = { version = "0.34.0", features = ["theme"] }
33 + makeover-tui = { version = "0.35.0", features = ["theme"] }
34 34 # Only to load a bundled theme file. `makeover_tui::Theme` is `#[non_exhaustive]`,
35 35 # so `Theme::from_theme` is the one way to get one, the same reason quasi-tui's
36 36 # tests take this.
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-http"
3 - version = "0.63.0"
3 + version = "0.64.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.63.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.64.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.63.0"
3 + version = "0.64.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 +12,12 @@
12 12 categories = ["gui"]
13 13
14 14 [dependencies]
15 - quasi-router = { path = "../quasi-router", version = "0.63.0" }
15 + quasi-router = { path = "../quasi-router", version = "0.64.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
19 19 # renderer instead of one copy per app.
20 - makeover-immediate = "0.35.0"
20 + makeover-immediate = "0.36.0"
21 21 egui = { version = "0.35", default-features = false }
22 22 # Markdown to text for `Node::Rich`. The same crate the webview renderer takes,
23 23 # reading the same source: what differs is that it can emit markup and this
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-notifs"
3 - version = "0.63.0"
3 + version = "0.64.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.63.0", optional = true }
27 + quasi-router = { path = "../quasi-router", version = "0.64.0", optional = true }
28 28 synckit-config = { git = "https://makenot.work/git/max/synckit.git", version = "0.2", optional = true }