Skip to main content

max / quasi

0.28.0: a row group says what it does when it runs out of room Task 111910aa, ruling wiki layout-room-and-fallback (Max 2026-08-18). Region::Band names goingson's .page-header in its own doc, and nothing named that a Band and a TabGroup's strip occupy one row. goingson asserted that adjacency in a stylesheet -- position: absolute, top 0, right 0 -- which is the one construction the description layer cannot audit. Out of flow the toolbar contributed no width to the row it shared, so nothing could collide with it and nothing prevented the collision: at 913 CSS pixels the help control clipped off the edge, at 700 the search field sat on the "Contacts" pill, at 560 the new contact button left the viewport and could not be reached at all. Slot::run is the missing sentence. Run carries the required Fallback and the members that share the row, ranked. across(fallback) takes the fallback as an argument and there is no form that omits one, so rule 2 is held by the signature; beside() asserts the row was declared, Row::part's precedent, so a member cannot be added to a row that never said what it does when it is tight. No sizes. The description says what the row holds and each renderer derives the minimum in its own units. Room is measured per render and never authored. A tab group's strip stays generated from its children's labels rather than becoming a node, so the case is described without a new Region member. What shares the strip's row is Run::members. Describing the strip in its own right is makeover-layout 978d24f8 and is not needed for this. Priority per member was already here: Ranked has carried one since 0.27.4, so Shed and Menu read what the vocabulary already said. The run is walked with the body in find, find_mut and feeds_into. A region that moved out of the pane and stopped being addressable would stop updating, which is a worse bug than the overlap the move fixes. Boxed for fed_by's reason: Node::Region holds a Slot by value. Breaking, so every consumer moves in this pass: MNW server, goingson and audiofiles take quasi 0.28, and the whole tree takes makeover-layout 0.29.
Author: Max Johnson <me@maxj.phd> · 2026-08-18 19:24 UTC
Signed with PGP, not checked
Commit: f17f0fe829ea1dc795b62fb79894558895cfffa9
Parent: 365145a
14 files changed, +327 insertions, -69 deletions
M Cargo.lock +16 -26
@@ -2606,8 +2606,6 @@
2606 2606 [[package]]
2607 2607 name = "makeover-immediate"
2608 2608 version = "0.28.0"
2609 - source = "registry+https://github.com/rust-lang/crates.io-index"
2610 - checksum = "53eb783cd5fda606d921e021af39d4c4604e6a7bd3fe9747c3739fe5ff7224b1"
2611 2609 dependencies = [
2612 2610 "egui",
2613 2611 "egui_extras",
@@ -2616,15 +2614,11 @@
2616 2614
2617 2615 [[package]]
2618 2616 name = "makeover-layout"
2619 - version = "0.28.2"
2620 - source = "registry+https://github.com/rust-lang/crates.io-index"
2621 - checksum = "23a39310f0553033a02c056725a24295519e4d28ecb5597796fbfc7b2aa81dfa"
2617 + version = "0.29.0"
2622 2618
2623 2619 [[package]]
2624 2620 name = "makeover-touch"
2625 2621 version = "0.20.0"
2626 - source = "registry+https://github.com/rust-lang/crates.io-index"
2627 - checksum = "0f2f1181373d7a2762512060ebd0804910c456bc99e7d8263a7967dbb63c10a3"
2628 2622 dependencies = [
2629 2623 "makeover-geometry",
2630 2624 "makeover-layout",
@@ -2633,8 +2627,6 @@
2633 2627 [[package]]
2634 2628 name = "makeover-tui"
2635 2629 version = "0.28.0"
2636 - source = "registry+https://github.com/rust-lang/crates.io-index"
2637 - checksum = "6d0d5477580f4514a63a66c0955ea32323798fedcf78433c11769bee7ef65268"
2638 2630 dependencies = [
2639 2631 "makeover",
2640 2632 "makeover-layout",
@@ -2644,8 +2636,6 @@
2644 2636 [[package]]
2645 2637 name = "makeover-webview"
2646 2638 version = "0.48.0"
2647 - source = "registry+https://github.com/rust-lang/crates.io-index"
2648 - checksum = "62ed5f0d1d82e482e7fc7a933e9c84647a3f3ead0c14c4304a537c1820c3aaf2"
2649 2639 dependencies = [
2650 2640 "makeover-geometry",
2651 2641 "makeover-layout",
@@ -3414,11 +3404,11 @@
3414 3404
3415 3405 [[package]]
3416 3406 name = "quasi"
3417 - version = "0.27.0"
3407 + version = "0.28.0"
3418 3408
3419 3409 [[package]]
3420 3410 name = "quasi-axum"
3421 - version = "0.27.0"
3411 + version = "0.28.0"
3422 3412 dependencies = [
3423 3413 "axum",
3424 3414 "http",
@@ -3432,7 +3422,7 @@
3432 3422
3433 3423 [[package]]
3434 3424 name = "quasi-basics"
3435 - version = "0.27.0"
3425 + version = "0.28.0"
3436 3426 dependencies = [
3437 3427 "makeover-layout",
3438 3428 "quasi-http",
@@ -3442,7 +3432,7 @@
3442 3432
3443 3433 [[package]]
3444 3434 name = "quasi-bench"
3445 - version = "0.27.0"
3435 + version = "0.28.0"
3446 3436 dependencies = [
3447 3437 "dhat",
3448 3438 "makeover",
@@ -3457,7 +3447,7 @@
3457 3447
3458 3448 [[package]]
3459 3449 name = "quasi-http"
3460 - version = "0.27.0"
3450 + version = "0.28.0"
3461 3451 dependencies = [
3462 3452 "form_urlencoded",
3463 3453 "http",
@@ -3466,7 +3456,7 @@
3466 3456
3467 3457 [[package]]
3468 3458 name = "quasi-immediate"
3469 - version = "0.27.0"
3459 + version = "0.28.0"
3470 3460 dependencies = [
3471 3461 "docengine",
3472 3462 "egui",
@@ -3476,7 +3466,7 @@
3476 3466
3477 3467 [[package]]
3478 3468 name = "quasi-notifs"
3479 - version = "0.27.0"
3469 + version = "0.28.0"
3480 3470 dependencies = [
3481 3471 "quasi-router",
3482 3472 "synckit-config",
@@ -3484,7 +3474,7 @@
3484 3474
3485 3475 [[package]]
3486 3476 name = "quasi-router"
3487 - version = "0.27.0"
3477 + version = "0.28.0"
3488 3478 dependencies = [
3489 3479 "makeover-layout",
3490 3480 ]
@@ -3501,7 +3491,7 @@
3501 3491
3502 3492 [[package]]
3503 3493 name = "quasi-tauri"
3504 - version = "0.27.0"
3494 + version = "0.28.0"
3505 3495 dependencies = [
3506 3496 "http",
3507 3497 "quasi-http",
@@ -3514,7 +3504,7 @@
3514 3504
3515 3505 [[package]]
3516 3506 name = "quasi-tui"
3517 - version = "0.27.0"
3507 + version = "0.28.0"
3518 3508 dependencies = [
3519 3509 "docengine",
3520 3510 "makeover",
@@ -3526,7 +3516,7 @@
3526 3516
3527 3517 [[package]]
3528 3518 name = "quasi-webview"
3529 - version = "0.27.0"
3519 + version = "0.28.0"
3530 3520 dependencies = [
3531 3521 "docengine",
3532 3522 "makeover-layout",
@@ -6197,6 +6187,10 @@
6197 6187 "winnow 1.0.4",
6198 6188 ]
6199 6189
6190 + [[patch.unused]]
6191 + name = "quasi-type"
6192 + version = "0.1.0"
6193 +
6200 6194 [[patch.unused]]
6201 6195 name = "kberg"
6202 6196 version = "0.1.0"
@@ -6216,7 +6210,3 @@
6216 6210 [[patch.unused]]
6217 6211 name = "synckit-client"
6218 6212 version = "0.8.0"
6219 -
6220 - [[patch.unused]]
6221 - name = "quasi-type"
6222 - version = "0.1.0"
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-axum"
3 - version = "0.27.0"
3 + version = "0.28.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.27.0" }
17 - quasi-http = { path = "../quasi-http", version = "0.27.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.28.0" }
17 + quasi-http = { path = "../quasi-http", version = "0.28.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.27.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.28.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.27.0"
3 + version = "0.28.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.27.0" }
17 - makeover-layout = "0.28.2"
16 + quasi-router = { path = "../quasi-router", version = "0.28.0" }
17 + makeover-layout = "0.29.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.27.0" }
24 - quasi-http = { path = "../quasi-http", version = "0.27.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.28.0" }
24 + quasi-http = { path = "../quasi-http", version = "0.28.0" }
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-bench"
3 - version = "0.27.0"
3 + version = "0.28.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,14 +22,14 @@
22 22 count = ["dep:dhat"]
23 23
24 24 [dependencies]
25 - quasi-router = { path = "../quasi-router", version = "0.27.0" }
26 - quasi-webview = { path = "../quasi-webview", version = "0.27.0" }
27 - quasi-tui = { path = "../quasi-tui", version = "0.27.0" }
25 + quasi-router = { path = "../quasi-router", version = "0.28.0" }
26 + quasi-webview = { path = "../quasi-webview", version = "0.28.0" }
27 + quasi-tui = { path = "../quasi-tui", version = "0.28.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.27.0" }
32 - makeover-layout = "0.28.2"
31 + quasi-http = { path = "../quasi-http", version = "0.28.0" }
32 + makeover-layout = "0.29.0"
33 33 makeover-tui = { version = "0.28.0", features = ["theme"] }
34 34 # Only to load a bundled theme file. `makeover_tui::Theme` is `#[non_exhaustive]`,
35 35 # so `Theme::from_theme` is the one way to get one, the same reason quasi-tui's
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-http"
3 - version = "0.27.0"
3 + version = "0.28.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.27.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.28.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.27.0"
3 + version = "0.28.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.27.0" }
15 + quasi-router = { path = "../quasi-router", version = "0.28.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.27.0"
3 + version = "0.28.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.27.0", optional = true }
27 + quasi-router = { path = "../quasi-router", version = "0.28.0", optional = true }
28 28 synckit-config = { git = "https://makenot.work/git/max/synckit.git", version = "0.2", optional = true }
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-router"
3 - version = "0.27.0"
3 + version = "0.28.0"
4 4 description = "Host-agnostic router: a request in, a renderer-agnostic description out"
5 5 edition.workspace = true
6 6 rust-version.workspace = true
@@ -13,4 +13,4 @@
13 13 workspace = true
14 14
15 15 [dependencies]
16 - makeover-layout = "0.28.2"
16 + makeover-layout = "0.29.0"