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>
22 files changed,
+278 insertions,
-48 deletions
| 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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 }
|