Skip to main content

max / quasi

0.65.0: a toast's lifetime is named once, and it is 3000ms `84a99fe6`, under Max's ruling on `eea7ba88`: (b), "3000 for now". The three renderers held the same four seconds written out three times, against `makeover_timing::Intent::Dismiss`'s 3000. The value the crate publishes wins and the literals go. quasi-tui and quasi-immediate take `makeover-timing` and derive `LINGER` from `notice_lifetime(true)`; both `expires_at` sites now resolve one call rather than checking transience and reading a constant, which is the same branch said once. The public `LINGER` name stays in both, since both re-export it. quasi-webview reads `--timing-dismiss` off the computed style instead. That is the property makeover-build has written into every consumer's `timing.css` since 0.52.0, and it had no consumer until now. The script keeps a fallback for a page that ships it without the stylesheet, pinned to `Intent::Dismiss.ms()` by a test, on the same footing as the two elapsed-time format implementations that already agree across two languages by test. Not done here and filed as quasicoherent `43bdbff7`: the done condition's "waiting Motion::Fade before removing the node". No renderer has a leaving, the webview has nowhere to put the rule (the stylesheet is makeover-webview's, which carries no toast styling), and adding the wait without the fade is only a longer message. Consumers forward-fixed in the same pass: MNW server, audiofiles, goingson. MNW's static/quasi-clock.js is generated from CLOCK_JS by build.rs, so it follows on its next build.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-08-27 02:04 UTC
Signed with PGP, not checked
Commit: e97b09a51b74bc33f721374344e3bc41025cf2ec
Parent: fe0a6ef
21 files changed, +205 insertions, -102 deletions
M Cargo.lock +22 -19
@@ -2632,9 +2632,9 @@
2632 2632
2633 2633 [[package]]
2634 2634 name = "makeover-touch"
2635 - version = "0.24.0"
2635 + version = "0.25.0"
2636 2636 source = "registry+https://github.com/rust-lang/crates.io-index"
2637 - checksum = "75c49f37baa4360fc06e87834a39978b8adc70c256430864a8b234fcf2abfa45"
2637 + checksum = "c479d37b37002c0f5d3bb8ec7ac1c99bf85eaa6ff2eae06590ab53182893114c"
2638 2638 dependencies = [
2639 2639 "makeover-geometry",
2640 2640 "makeover-layout",
@@ -2654,9 +2654,9 @@
2654 2654
2655 2655 [[package]]
2656 2656 name = "makeover-webview"
2657 - version = "0.60.0"
2657 + version = "0.61.0"
2658 2658 source = "registry+https://github.com/rust-lang/crates.io-index"
2659 - checksum = "203b3a259e249ed32ffd9d48d75a6c12e4aa173095607cc2c852f2c1f3fe9c0e"
2659 + checksum = "6399dc739e0d326e3577bc80643c1a9ab2afcc005ec240a7c9765e060f359f34"
2660 2660 dependencies = [
2661 2661 "makeover-geometry",
2662 2662 "makeover-layout",
@@ -3425,11 +3425,11 @@
3425 3425
3426 3426 [[package]]
3427 3427 name = "quasi"
3428 - version = "0.64.0"
3428 + version = "0.65.0"
3429 3429
3430 3430 [[package]]
3431 3431 name = "quasi-axum"
3432 - version = "0.64.0"
3432 + version = "0.65.0"
3433 3433 dependencies = [
3434 3434 "axum",
3435 3435 "http",
@@ -3443,7 +3443,7 @@
3443 3443
3444 3444 [[package]]
3445 3445 name = "quasi-basics"
3446 - version = "0.64.0"
3446 + version = "0.65.0"
3447 3447 dependencies = [
3448 3448 "makeover-layout",
3449 3449 "quasi-http",
@@ -3453,7 +3453,7 @@
3453 3453
3454 3454 [[package]]
3455 3455 name = "quasi-bench"
3456 - version = "0.64.0"
3456 + version = "0.65.0"
3457 3457 dependencies = [
3458 3458 "dhat",
3459 3459 "makeover",
@@ -3468,7 +3468,7 @@
3468 3468
3469 3469 [[package]]
3470 3470 name = "quasi-http"
3471 - version = "0.64.0"
3471 + version = "0.65.0"
3472 3472 dependencies = [
3473 3473 "form_urlencoded",
3474 3474 "http",
@@ -3477,17 +3477,18 @@
3477 3477
3478 3478 [[package]]
3479 3479 name = "quasi-immediate"
3480 - version = "0.64.0"
3480 + version = "0.65.0"
3481 3481 dependencies = [
3482 3482 "docengine",
3483 3483 "egui",
3484 3484 "makeover-immediate",
3485 + "makeover-timing",
3485 3486 "quasi-router",
3486 3487 ]
3487 3488
3488 3489 [[package]]
3489 3490 name = "quasi-notifs"
3490 - version = "0.64.0"
3491 + version = "0.65.0"
3491 3492 dependencies = [
3492 3493 "quasi-router",
3493 3494 "synckit-config",
@@ -3495,7 +3496,7 @@
3495 3496
3496 3497 [[package]]
3497 3498 name = "quasi-router"
3498 - version = "0.64.0"
3499 + version = "0.65.0"
3499 3500 dependencies = [
3500 3501 "makeover-layout",
3501 3502 ]
@@ -3512,7 +3513,7 @@
3512 3513
3513 3514 [[package]]
3514 3515 name = "quasi-tauri"
3515 - version = "0.64.0"
3516 + version = "0.65.0"
3516 3517 dependencies = [
3517 3518 "http",
3518 3519 "quasi-http",
@@ -3525,11 +3526,12 @@
3525 3526
3526 3527 [[package]]
3527 3528 name = "quasi-tui"
3528 - version = "0.64.0"
3529 + version = "0.65.0"
3529 3530 dependencies = [
3530 3531 "docengine",
3531 3532 "makeover",
3532 3533 "makeover-layout",
3534 + "makeover-timing",
3533 3535 "makeover-tui",
3534 3536 "quasi-router",
3535 3537 "ratatui",
@@ -3537,10 +3539,11 @@
3537 3539
3538 3540 [[package]]
3539 3541 name = "quasi-webview"
3540 - version = "0.64.0"
3542 + version = "0.65.0"
3541 3543 dependencies = [
3542 3544 "docengine",
3543 3545 "makeover-layout",
3546 + "makeover-timing",
3544 3547 "makeover-webview",
3545 3548 "quasi-http",
3546 3549 "quasi-router",
@@ -6224,10 +6227,10 @@
6224 6227 name = "tagtree"
6225 6228 version = "0.4.1"
6226 6229
6227 - [[patch.unused]]
6228 - name = "quasi-type"
6229 - version = "0.1.0"
6230 -
6231 6230 [[patch.unused]]
6232 6231 name = "synckit-client"
6233 6232 version = "0.9.1"
6233 +
6234 + [[patch.unused]]
6235 + name = "quasi-type"
6236 + version = "0.1.0"
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-axum"
3 - version = "0.64.0"
3 + version = "0.65.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.64.0" }
17 - quasi-http = { path = "../quasi-http", version = "0.64.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.65.0" }
17 + quasi-http = { path = "../quasi-http", version = "0.65.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.64.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.65.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.64.0"
3 + version = "0.65.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.64.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.65.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.64.0" }
24 - quasi-http = { path = "../quasi-http", version = "0.64.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.65.0" }
24 + quasi-http = { path = "../quasi-http", version = "0.65.0" }
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-bench"
3 - version = "0.64.0"
3 + version = "0.65.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.64.0" }
26 - quasi-webview = { path = "../quasi-webview", version = "0.64.0" }
27 - quasi-tui = { path = "../quasi-tui", version = "0.64.0" }
25 + quasi-router = { path = "../quasi-router", version = "0.65.0" }
26 + quasi-webview = { path = "../quasi-webview", version = "0.65.0" }
27 + quasi-tui = { path = "../quasi-tui", version = "0.65.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.64.0" }
31 + quasi-http = { path = "../quasi-http", version = "0.65.0" }
32 32 makeover-layout = "0.35.0"
33 33 makeover-tui = { version = "0.35.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.64.0"
3 + version = "0.65.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.64.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.65.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.64.0"
3 + version = "0.65.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 +12,18 @@
12 12 categories = ["gui"]
13 13
14 14 [dependencies]
15 - quasi-router = { path = "../quasi-router", version = "0.64.0" }
15 + quasi-router = { path = "../quasi-router", version = "0.65.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
19 19 # renderer instead of one copy per app.
20 20 makeover-immediate = "0.36.0"
21 + # The one place a duration is named rather than numbered. `Intent::Dismiss` is
22 + # how long a transient notice lives, and `notice_lifetime` is the seam: the
23 + # description says a toast goes away on its own and declines to say when, so
24 + # the when is the renderer's and this is where the renderers keep it. One
25 + # number for all three rather than the same literal written three times.
26 + makeover-timing = "0.1.1"
21 27 egui = { version = "0.35", default-features = false }
22 28 # Markdown to text for `Node::Rich`. The same crate the webview renderer takes,
23 29 # reading the same source: what differs is that it can emit markup and this
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-notifs"
3 - version = "0.64.0"
3 + version = "0.65.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.64.0", optional = true }
27 + quasi-router = { path = "../quasi-router", version = "0.65.0", optional = true }
28 28 synckit-config = { git = "https://makenot.work/git/max/synckit.git", version = "0.2", optional = true }