Skip to main content

max / quasi

0.40.0: a toast goes away on its own, and each renderer holds the deadline `4453bf82`, the notice half of the ruling on `f00244a6` (Max, 2026-08-18): the renderer owns the expiry, and `Notice::Toast` is not advisory. The filed task read as though the description said nothing about a toast's lifetime. It says the thing that matters -- `Notice::transient()` is already there and already routes a toast to `Fill::Overlay` -- and only the when was missing, which is presentation policy of the same class as how long an undo stays offered. So no vocabulary member was added. What was missing is that all three renderers drew a self-dismissing message and then never dismissed it. Each renderer names the duration once, as `LINGER`, and the three carry the same four seconds for the reason the clock spellings match: a screen described once and drawn three times should not keep its messages for three different lengths of time. A banner is never on a clock, and goes when the condition it reports is fixed. quasi-tui and quasi-immediate hold an instant per toast beside the screen and answer `Runtime::expires`, which takes away the ones whose time is up and says whether one went. The bookkeeping is positional, because a notice has no identity to key on: a toast joins the screen at the end of the list or arrives inside a whole screen, and a screen arriving, or coming back out from under an overlay, starts every toast on it lingering from then. `Runtime::tick_in` now answers what is left of the nearest toast's linger as well as the finest cadence the screen's readouts demand, so a terminal blocking on a key wakes to take the message off, and `tick_in_at`/`expires_at` are the seam a caller holding a clock uses. quasi-immediate calls `expires` itself once a frame and asks the context for the frame that finds the deadline, so an app drawing that runtime gets it without doing anything. quasi-webview emits `data-notice="toast"` beside the class -- an attribute for `data-clock`'s reason, since a class carries the host's prefix and a script shipped by this crate cannot know it -- and `CLOCK_JS` takes the element off the page when its time is up. It rides in the clock script rather than in a second script the host has to serve, because it is the same fact: what a browser knows about the time and a description cannot. A timer per toast there, which is what the readouts deliberately avoid; the reasoning comes out the other way because a page carries one or two toasts whose timer runs once. Consumers forward-fixed to 0.40: MNW server, audiofiles, goingson. The scaffolder's template was pinning 0.30 and is current again.
Author: Max Johnson <me@maxj.phd> · 2026-08-20 15:56 UTC
Signed with PGP, not checked
Commit: cb028ced1c89c67ea95f82537152622a1a1c751b
Parent: 2001c9a
26 files changed, +543 insertions, -64 deletions
M Cargo.lock +15 -15
@@ -3404,11 +3404,11 @@
3404 3404
3405 3405 [[package]]
3406 3406 name = "quasi"
3407 - version = "0.39.0"
3407 + version = "0.40.0"
3408 3408
3409 3409 [[package]]
3410 3410 name = "quasi-axum"
3411 - version = "0.39.0"
3411 + version = "0.40.0"
3412 3412 dependencies = [
3413 3413 "axum",
3414 3414 "http",
@@ -3422,7 +3422,7 @@
3422 3422
3423 3423 [[package]]
3424 3424 name = "quasi-basics"
3425 - version = "0.39.0"
3425 + version = "0.40.0"
3426 3426 dependencies = [
3427 3427 "makeover-layout",
3428 3428 "quasi-http",
@@ -3432,7 +3432,7 @@
3432 3432
3433 3433 [[package]]
3434 3434 name = "quasi-bench"
3435 - version = "0.39.0"
3435 + version = "0.40.0"
3436 3436 dependencies = [
3437 3437 "dhat",
3438 3438 "makeover",
@@ -3447,7 +3447,7 @@
3447 3447
3448 3448 [[package]]
3449 3449 name = "quasi-http"
3450 - version = "0.39.0"
3450 + version = "0.40.0"
3451 3451 dependencies = [
3452 3452 "form_urlencoded",
3453 3453 "http",
@@ -3456,7 +3456,7 @@
3456 3456
3457 3457 [[package]]
3458 3458 name = "quasi-immediate"
3459 - version = "0.39.0"
3459 + version = "0.40.0"
3460 3460 dependencies = [
3461 3461 "docengine",
3462 3462 "egui",
@@ -3466,7 +3466,7 @@
3466 3466
3467 3467 [[package]]
3468 3468 name = "quasi-notifs"
3469 - version = "0.39.0"
3469 + version = "0.40.0"
3470 3470 dependencies = [
3471 3471 "quasi-router",
3472 3472 "synckit-config",
@@ -3474,7 +3474,7 @@
3474 3474
3475 3475 [[package]]
3476 3476 name = "quasi-router"
3477 - version = "0.39.0"
3477 + version = "0.40.0"
3478 3478 dependencies = [
3479 3479 "makeover-layout",
3480 3480 ]
@@ -3491,7 +3491,7 @@
3491 3491
3492 3492 [[package]]
3493 3493 name = "quasi-tauri"
3494 - version = "0.39.0"
3494 + version = "0.40.0"
3495 3495 dependencies = [
3496 3496 "http",
3497 3497 "quasi-http",
@@ -3504,7 +3504,7 @@
3504 3504
3505 3505 [[package]]
3506 3506 name = "quasi-tui"
3507 - version = "0.39.0"
3507 + version = "0.40.0"
3508 3508 dependencies = [
3509 3509 "docengine",
3510 3510 "makeover",
@@ -3516,7 +3516,7 @@
3516 3516
3517 3517 [[package]]
3518 3518 name = "quasi-webview"
3519 - version = "0.39.0"
3519 + version = "0.40.0"
3520 3520 dependencies = [
3521 3521 "docengine",
3522 3522 "makeover-layout",
@@ -6195,6 +6195,10 @@
6195 6195 name = "quasi-type"
6196 6196 version = "0.1.0"
6197 6197
6198 + [[patch.unused]]
6199 + name = "synckit-client"
6200 + version = "0.8.0"
6201 +
6198 6202 [[patch.unused]]
6199 6203 name = "kberg"
6200 6204 version = "0.1.0"
@@ -6210,7 +6214,3 @@
6210 6214 [[patch.unused]]
6211 6215 name = "tagtree"
6212 6216 version = "0.4.0"
6213 -
6214 - [[patch.unused]]
6215 - name = "synckit-client"
6216 - version = "0.8.0"
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-axum"
3 - version = "0.39.0"
3 + version = "0.40.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.39.0" }
17 - quasi-http = { path = "../quasi-http", version = "0.39.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.40.0" }
17 + quasi-http = { path = "../quasi-http", version = "0.40.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.39.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.40.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.39.0"
3 + version = "0.40.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.39.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.40.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.39.0" }
24 - quasi-http = { path = "../quasi-http", version = "0.39.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.40.0" }
24 + quasi-http = { path = "../quasi-http", version = "0.40.0" }
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-bench"
3 - version = "0.39.0"
3 + version = "0.40.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.39.0" }
26 - quasi-webview = { path = "../quasi-webview", version = "0.39.0" }
27 - quasi-tui = { path = "../quasi-tui", version = "0.39.0" }
25 + quasi-router = { path = "../quasi-router", version = "0.40.0" }
26 + quasi-webview = { path = "../quasi-webview", version = "0.40.0" }
27 + quasi-tui = { path = "../quasi-tui", version = "0.40.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.39.0" }
31 + quasi-http = { path = "../quasi-http", version = "0.40.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,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-http"
3 - version = "0.39.0"
3 + version = "0.40.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.39.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.40.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.39.0"
3 + version = "0.40.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.39.0" }
15 + quasi-router = { path = "../quasi-router", version = "0.40.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.39.0"
3 + version = "0.40.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.39.0", optional = true }
27 + quasi-router = { path = "../quasi-router", version = "0.40.0", optional = true }
28 28 synckit-config = { git = "https://makenot.work/git/max/synckit.git", version = "0.2", optional = true }