0.36.0: locality, and renderers classified client or hybrid
`210574ca`, ruled by Max 2026-08-18. An action was a route or an external
address, so the only unit of "something happens" was a request to a place and
anything happening without one could not be said. Ten vocabulary gaps had been
filed as ten findings; they were one missing idea.
The mark is `Destination::Local`, per element because an action is. What
happens locally is named by the member carrying the action, never by the
variant, which is what keeps it from becoming string dispatch again.
Renderers are classified: quasi-tui and quasi-immediate are Client and may
ignore the mark, quasi-webview is Hybrid and must read it. Both client runtimes
read "not a route" as "somewhere outside" and would have handed the host an
empty address to open; each now declines a local action instead. The webview
emits data-local rather than an address, because route_url would build
hx-get="", which htmx reads as "ask the page you are on". Its hyperscript half
is a separate task and is not started here.
`Action::with` puts values in `params` for a local action whatever the method
says: the read rule rests on the values being the address, and there is none.
- Detail
- wiki quasi-overview, "Locality landed, 2026-08-19".
25 files changed,
+505 insertions,
-57 deletions
| 3404 |
3404 |
|
|
| 3405 |
3405 |
|
[[package]]
|
| 3406 |
3406 |
|
name = "quasi"
|
| 3407 |
|
- |
version = "0.35.0"
|
|
3407 |
+ |
version = "0.36.0"
|
| 3408 |
3408 |
|
|
| 3409 |
3409 |
|
[[package]]
|
| 3410 |
3410 |
|
name = "quasi-axum"
|
| 3411 |
|
- |
version = "0.35.0"
|
|
3411 |
+ |
version = "0.36.0"
|
| 3412 |
3412 |
|
dependencies = [
|
| 3413 |
3413 |
|
"axum",
|
| 3414 |
3414 |
|
"http",
|
| 3422 |
3422 |
|
|
| 3423 |
3423 |
|
[[package]]
|
| 3424 |
3424 |
|
name = "quasi-basics"
|
| 3425 |
|
- |
version = "0.35.0"
|
|
3425 |
+ |
version = "0.36.0"
|
| 3426 |
3426 |
|
dependencies = [
|
| 3427 |
3427 |
|
"makeover-layout",
|
| 3428 |
3428 |
|
"quasi-http",
|
| 3432 |
3432 |
|
|
| 3433 |
3433 |
|
[[package]]
|
| 3434 |
3434 |
|
name = "quasi-bench"
|
| 3435 |
|
- |
version = "0.35.0"
|
|
3435 |
+ |
version = "0.36.0"
|
| 3436 |
3436 |
|
dependencies = [
|
| 3437 |
3437 |
|
"dhat",
|
| 3438 |
3438 |
|
"makeover",
|
| 3447 |
3447 |
|
|
| 3448 |
3448 |
|
[[package]]
|
| 3449 |
3449 |
|
name = "quasi-http"
|
| 3450 |
|
- |
version = "0.35.0"
|
|
3450 |
+ |
version = "0.36.0"
|
| 3451 |
3451 |
|
dependencies = [
|
| 3452 |
3452 |
|
"form_urlencoded",
|
| 3453 |
3453 |
|
"http",
|
| 3456 |
3456 |
|
|
| 3457 |
3457 |
|
[[package]]
|
| 3458 |
3458 |
|
name = "quasi-immediate"
|
| 3459 |
|
- |
version = "0.35.0"
|
|
3459 |
+ |
version = "0.36.0"
|
| 3460 |
3460 |
|
dependencies = [
|
| 3461 |
3461 |
|
"docengine",
|
| 3462 |
3462 |
|
"egui",
|
| 3466 |
3466 |
|
|
| 3467 |
3467 |
|
[[package]]
|
| 3468 |
3468 |
|
name = "quasi-notifs"
|
| 3469 |
|
- |
version = "0.35.0"
|
|
3469 |
+ |
version = "0.36.0"
|
| 3470 |
3470 |
|
dependencies = [
|
| 3471 |
3471 |
|
"quasi-router",
|
| 3472 |
3472 |
|
"synckit-config",
|
| 3474 |
3474 |
|
|
| 3475 |
3475 |
|
[[package]]
|
| 3476 |
3476 |
|
name = "quasi-router"
|
| 3477 |
|
- |
version = "0.35.0"
|
|
3477 |
+ |
version = "0.36.0"
|
| 3478 |
3478 |
|
dependencies = [
|
| 3479 |
3479 |
|
"makeover-layout",
|
| 3480 |
3480 |
|
]
|
| 3491 |
3491 |
|
|
| 3492 |
3492 |
|
[[package]]
|
| 3493 |
3493 |
|
name = "quasi-tauri"
|
| 3494 |
|
- |
version = "0.35.0"
|
|
3494 |
+ |
version = "0.36.0"
|
| 3495 |
3495 |
|
dependencies = [
|
| 3496 |
3496 |
|
"http",
|
| 3497 |
3497 |
|
"quasi-http",
|
| 3504 |
3504 |
|
|
| 3505 |
3505 |
|
[[package]]
|
| 3506 |
3506 |
|
name = "quasi-tui"
|
| 3507 |
|
- |
version = "0.35.0"
|
|
3507 |
+ |
version = "0.36.0"
|
| 3508 |
3508 |
|
dependencies = [
|
| 3509 |
3509 |
|
"docengine",
|
| 3510 |
3510 |
|
"makeover",
|
| 3516 |
3516 |
|
|
| 3517 |
3517 |
|
[[package]]
|
| 3518 |
3518 |
|
name = "quasi-webview"
|
| 3519 |
|
- |
version = "0.35.0"
|
|
3519 |
+ |
version = "0.36.0"
|
| 3520 |
3520 |
|
dependencies = [
|
| 3521 |
3521 |
|
"docengine",
|
| 3522 |
3522 |
|
"makeover-layout",
|
| 6191 |
6191 |
|
name = "makeover-build"
|
| 6192 |
6192 |
|
version = "0.46.0"
|
| 6193 |
6193 |
|
|
| 6194 |
|
- |
[[patch.unused]]
|
| 6195 |
|
- |
name = "quasi-type"
|
| 6196 |
|
- |
version = "0.1.0"
|
| 6197 |
|
- |
|
| 6198 |
|
- |
[[patch.unused]]
|
| 6199 |
|
- |
name = "synckit-client"
|
| 6200 |
|
- |
version = "0.8.0"
|
| 6201 |
|
- |
|
| 6202 |
6194 |
|
[[patch.unused]]
|
| 6203 |
6195 |
|
name = "kberg"
|
| 6204 |
6196 |
|
version = "0.1.0"
|
| 6214 |
6206 |
|
[[patch.unused]]
|
| 6215 |
6207 |
|
name = "tagtree"
|
| 6216 |
6208 |
|
version = "0.4.0"
|
|
6209 |
+ |
|
|
6210 |
+ |
[[patch.unused]]
|
|
6211 |
+ |
name = "quasi-type"
|
|
6212 |
+ |
version = "0.1.0"
|
|
6213 |
+ |
|
|
6214 |
+ |
[[patch.unused]]
|
|
6215 |
+ |
name = "synckit-client"
|
|
6216 |
+ |
version = "0.8.0"
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-axum"
|
| 3 |
|
- |
version = "0.35.0"
|
|
3 |
+ |
version = "0.36.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.35.0" }
|
| 17 |
|
- |
quasi-http = { path = "../quasi-http", version = "0.35.0" }
|
|
16 |
+ |
quasi-router = { path = "../quasi-router", version = "0.36.0" }
|
|
17 |
+ |
quasi-http = { path = "../quasi-http", version = "0.36.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.35.0" }
|
|
23 |
+ |
quasi-webview = { path = "../quasi-webview", version = "0.36.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.35.0"
|
|
3 |
+ |
version = "0.36.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.35.0" }
|
|
16 |
+ |
quasi-router = { path = "../quasi-router", version = "0.36.0" }
|
| 17 |
17 |
|
makeover-layout = "0.31.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.35.0" }
|
| 24 |
|
- |
quasi-http = { path = "../quasi-http", version = "0.35.0" }
|
|
23 |
+ |
quasi-webview = { path = "../quasi-webview", version = "0.36.0" }
|
|
24 |
+ |
quasi-http = { path = "../quasi-http", version = "0.36.0" }
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-bench"
|
| 3 |
|
- |
version = "0.35.0"
|
|
3 |
+ |
version = "0.36.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.35.0" }
|
| 26 |
|
- |
quasi-webview = { path = "../quasi-webview", version = "0.35.0" }
|
| 27 |
|
- |
quasi-tui = { path = "../quasi-tui", version = "0.35.0" }
|
|
25 |
+ |
quasi-router = { path = "../quasi-router", version = "0.36.0" }
|
|
26 |
+ |
quasi-webview = { path = "../quasi-webview", version = "0.36.0" }
|
|
27 |
+ |
quasi-tui = { path = "../quasi-tui", version = "0.36.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.35.0" }
|
|
31 |
+ |
quasi-http = { path = "../quasi-http", version = "0.36.0" }
|
| 32 |
32 |
|
makeover-layout = "0.31.0"
|
| 33 |
33 |
|
makeover-tui = { version = "0.30.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.35.0"
|
|
3 |
+ |
version = "0.36.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.35.0" }
|
|
16 |
+ |
quasi-router = { path = "../quasi-router", version = "0.36.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.35.0"
|
|
3 |
+ |
version = "0.36.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.35.0" }
|
|
15 |
+ |
quasi-router = { path = "../quasi-router", version = "0.36.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
|