Skip to main content

max / quasi

0.55.0: a screen can ask for a mount of its own Ruled by Max 2026-08-22 (goingson 3fb2526a), picking (b) of three: grow the vocabulary rather than let a host script or a menu item own the second window. WHAT WAS MISSING. Frame { verbs, status } landed in 0.54 and says what a mount puts around a screen, which is the whole of how goingson's compose differs between its two windows. Nothing said how anything asks for the second mount. Act had by_host, replacing, saving and awaiting, and no word for elsewhere, so the only ways left were a host script reaching around the description to a control the description already owns, or a menu item the description cannot see. Action::elsewhere is the same family as saves and replaces: all three say where the answer lands, and this one says it lands somewhere that is not here. Not a Destination, which says where the call goes -- the two are independent, and one address being the main window's compose screen and the compose window's is the point of Frame. DELIBERATELY NOT "A WINDOW". A mount is whatever a renderer puts a screen up in, and the three already differ: webview a second document, which the host opens immediate a viewport of its own terminal nothing; the call is performed where it stands The terminal's answer is the interesting one and it is not a gap. A second mount there would be a split or a tab, both of which are that renderer's furniture rather than the description's, so a screen asking for one would be asking for a layout. It navigates instead, which is the honest degradation Renderer exists to allow, and it gets a test rather than a silence: the failure mode next door is by_host's, a control that is drawn, is reachable and does nothing when pressed. THE WEBVIEW EMITS data-mount AND NO TRANSPORT, the shape by_host already has: no verb, no trigger, no href, since every one of those would put the answer in the mount the control is already in. data-mount and not data-sends, because a host that conflated them would post where it should open. No wait mark either -- putting up a mount is not a call that resolves, and a spinner on it reads as a hang. STEP::MOUNT CARRIES A REQUEST, not an address, so quasi-immediate needs no transport crate to build a URL and the new viewport asks for its screen the way the first one did. Built before the payload is absorbed: what a control collected belongs to the call it was collected for, and feeding a going-up mount a half-filled form would be this renderer inventing a screen state nobody described. Distinct from Step::Open, which is somewhere outside the app entirely. Five tests, one per renderer answer plus the two that would be silent if wrong: the carried view riding along (else the window opens on the wrong list), and an ordinary call untouched by the member existing. 0.55.0 rather than 0.54.1: a field on Action and a variant on Step are both breaking to cargo at 0.x. Consumers forward-fixed in the same pass.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-08-22 19:59 UTC
Signed with PGP, not checked
Commit: 4de123f2da3e0751b1e293cc93bdbc83e84a36ce
Parent: a39c363
22 files changed, +278 insertions, -48 deletions
M Cargo.lock +11 -11
@@ -3414,11 +3414,11 @@
3414 3414
3415 3415 [[package]]
3416 3416 name = "quasi"
3417 - version = "0.54.0"
3417 + version = "0.55.0"
3418 3418
3419 3419 [[package]]
3420 3420 name = "quasi-axum"
3421 - version = "0.54.0"
3421 + version = "0.55.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.54.0"
3435 + version = "0.55.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.54.0"
3445 + version = "0.55.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.54.0"
3460 + version = "0.55.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.54.0"
3469 + version = "0.55.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.54.0"
3479 + version = "0.55.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.54.0"
3487 + version = "0.55.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.54.0"
3504 + version = "0.55.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.54.0"
3517 + version = "0.55.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.54.0"
3529 + version = "0.55.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.54.0"
3 + version = "0.55.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.54.0" }
17 - quasi-http = { path = "../quasi-http", version = "0.54.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.55.0" }
17 + quasi-http = { path = "../quasi-http", version = "0.55.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.54.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.55.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.54.0"
3 + version = "0.55.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.54.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.55.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.54.0" }
24 - quasi-http = { path = "../quasi-http", version = "0.54.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.55.0" }
24 + quasi-http = { path = "../quasi-http", version = "0.55.0" }
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-bench"
3 - version = "0.54.0"
3 + version = "0.55.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.54.0" }
26 - quasi-webview = { path = "../quasi-webview", version = "0.54.0" }
27 - quasi-tui = { path = "../quasi-tui", version = "0.54.0" }
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" }
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.54.0" }
31 + quasi-http = { path = "../quasi-http", version = "0.55.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.54.0"
3 + version = "0.55.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.54.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.55.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.54.0"
3 + version = "0.55.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.54.0" }
15 + quasi-router = { path = "../quasi-router", version = "0.55.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.54.0"
3 + version = "0.55.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.54.0", optional = true }
27 + quasi-router = { path = "../quasi-router", version = "0.55.0", optional = true }
28 28 synckit-config = { git = "https://makenot.work/git/max/synckit.git", version = "0.2", optional = true }