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.
26 files changed,
+543 insertions,
-64 deletions
| 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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 }
|