Skip to main content

max / quasi

Give a region row's members a Width, and retire the kinds it said Max's ruling on quasicoherent `b1d4c5d7`, built as `cf981aaa`. `Ranked` gains a `layout::Width` beside its `Priority`, so a row can say how the room is divided while there is enough of it as well as what goes first when there is not. `Column` has said both since it existed; a region row could say only one. `RegionKind::Split` and `RegionKind::Columns` are gone. Both were arrangement spelled as containment: they said nothing about scroll, depth or what may be inside, only how the room is divided. A run says it and says more, because the row also carries a `Fallback` and can state what happens when the room runs out, which neither variant could. Split is content then fill; Columns is a row of fills, which divide equally by that type's own rule. `Sidebar` was measured with them and stays. It marks which region is the side of a `SidebarContent` screen, which quasi-tui and quasi-immediate both match on to place it, and no width on a row member can say that. `Band` is a separate judgement and is untouched. `Content` is the default because that is what a run member already drew: a flex item with a min-content floor and no grow, a terminal cell count, an egui galley. So every member written before this keeps its drawing and a screen opts into dividing the room by saying so. All three renderers honour it. The webview writes `data-width` and leans on makeover-webview 0.74's rule; the terminal hands the leftover of a packed line to that line's fills, one cell each for the remainder; egui allocates an equal share of what is left where the member stands, which is exact when the fills follow the members that take what they need. `declare!` grows one production: `beside <priority> [<width>] <emission>`, with the width told from the member by what a member is. Refused on a region's body and on a row of a list, because a stack gives every member the whole width and a list row places its parts by name. Also: a copy loop is told from a hole by the string literal after the word. `copy` is a legal binding and audiofiles has one, which the first landing missed by verifying MNW and this workspace and not the app trees.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session
https://claude.ai/code/session_01P8ostB2UmZJGj5WjSHRSot
Author: Max Johnson <me@maxj.phd> · 2026-09-07 19:20 UTC
Signed with PGP, not checked
Commit: a7d46b92cfb1d989961ac418fa00c85d28e28c0f
Parent: 2c39a11
25 files changed, +470 insertions, -130 deletions
M Cargo.lock +25 -23
@@ -1029,7 +1029,7 @@
1029 1029 "libc",
1030 1030 "option-ext",
1031 1031 "redox_users",
1032 - "windows-sys 0.59.0",
1032 + "windows-sys 0.61.2",
1033 1033 ]
1034 1034
1035 1035 [[package]]
@@ -1328,7 +1328,7 @@
1328 1328 checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
1329 1329 dependencies = [
1330 1330 "libc",
1331 - "windows-sys 0.59.0",
1331 + "windows-sys 0.61.2",
1332 1332 ]
1333 1333
1334 1334 [[package]]
@@ -2705,9 +2705,7 @@
2705 2705
2706 2706 [[package]]
2707 2707 name = "makeover-webview"
2708 - version = "0.73.0"
2709 - source = "registry+https://github.com/rust-lang/crates.io-index"
2710 - checksum = "848a255b34e7edd66a10cdc8ae0e16319b22f7f96f2ad9bae3dc67b595f184a9"
2708 + version = "0.74.0"
2711 2709 dependencies = [
2712 2710 "makeover-geometry",
2713 2711 "makeover-layout",
@@ -3476,11 +3474,11 @@
3476 3474
3477 3475 [[package]]
3478 3476 name = "quasi"
3479 - version = "0.101.1"
3477 + version = "0.102.0"
3480 3478
3481 3479 [[package]]
3482 3480 name = "quasi-axum"
3483 - version = "0.101.1"
3481 + version = "0.102.0"
3484 3482 dependencies = [
3485 3483 "axum",
3486 3484 "http",
@@ -3494,7 +3492,7 @@
3494 3492
3495 3493 [[package]]
3496 3494 name = "quasi-basics"
3497 - version = "0.101.2"
3495 + version = "0.102.0"
3498 3496 dependencies = [
3499 3497 "makeover-layout",
3500 3498 "quasi-declare",
@@ -3505,7 +3503,7 @@
3505 3503
3506 3504 [[package]]
3507 3505 name = "quasi-bench"
3508 - version = "0.101.1"
3506 + version = "0.102.0"
3509 3507 dependencies = [
3510 3508 "askama",
3511 3509 "dhat",
@@ -3526,7 +3524,7 @@
3526 3524
3527 3525 [[package]]
3528 3526 name = "quasi-declare"
3529 - version = "0.1.9"
3527 + version = "0.1.10"
3530 3528 dependencies = [
3531 3529 "proc-macro2",
3532 3530 "quasi-router",
@@ -3538,7 +3536,7 @@
3538 3536
3539 3537 [[package]]
3540 3538 name = "quasi-http"
3541 - version = "0.101.1"
3539 + version = "0.102.0"
3542 3540 dependencies = [
3543 3541 "form_urlencoded",
3544 3542 "http",
@@ -3547,7 +3545,7 @@
3547 3545
3548 3546 [[package]]
3549 3547 name = "quasi-immediate"
3550 - version = "0.101.1"
3548 + version = "0.102.0"
3551 3549 dependencies = [
3552 3550 "docengine",
3553 3551 "egui",
@@ -3558,7 +3556,7 @@
3558 3556
3559 3557 [[package]]
3560 3558 name = "quasi-notifs"
3561 - version = "0.101.2"
3559 + version = "0.102.0"
3562 3560 dependencies = [
3563 3561 "quasi-router",
3564 3562 "synckit-config",
@@ -3568,7 +3566,7 @@
3568 3566
3569 3567 [[package]]
3570 3568 name = "quasi-router"
3571 - version = "0.101.15"
3569 + version = "0.102.0"
3572 3570 dependencies = [
3573 3571 "makeover-layout",
3574 3572 ]
@@ -3585,7 +3583,7 @@
3585 3583
3586 3584 [[package]]
3587 3585 name = "quasi-tauri"
3588 - version = "0.101.1"
3586 + version = "0.102.0"
3589 3587 dependencies = [
3590 3588 "http",
3591 3589 "quasi-http",
@@ -3596,7 +3594,7 @@
3596 3594
3597 3595 [[package]]
3598 3596 name = "quasi-tui"
3599 - version = "0.101.1"
3597 + version = "0.102.0"
3600 3598 dependencies = [
3601 3599 "docengine",
3602 3600 "makeover",
@@ -3609,7 +3607,7 @@
3609 3607
3610 3608 [[package]]
3611 3609 name = "quasi-webview"
3612 - version = "0.101.2"
3610 + version = "0.102.0"
3613 3611 dependencies = [
3614 3612 "docengine",
3615 3613 "makeover-layout",
@@ -3907,7 +3905,7 @@
3907 3905 "errno",
3908 3906 "libc",
3909 3907 "linux-raw-sys",
3910 - "windows-sys 0.59.0",
3908 + "windows-sys 0.61.2",
3911 3909 ]
3912 3910
3913 3911 [[package]]
@@ -4776,7 +4774,7 @@
4776 4774 "serde_with",
4777 4775 "swift-rs",
4778 4776 "thiserror 2.0.20",
4779 - "toml 0.9.12+spec-1.1.0",
4777 + "toml 1.1.4+spec-1.1.0",
4780 4778 "url",
4781 4779 "urlpattern",
4782 4780 "uuid",
@@ -4815,7 +4813,7 @@
4815 4813 "getrandom 0.4.3",
4816 4814 "once_cell",
4817 4815 "rustix",
4818 - "windows-sys 0.59.0",
4816 + "windows-sys 0.61.2",
4819 4817 ]
4820 4818
4821 4819 [[package]]
@@ -5657,7 +5655,7 @@
5657 5655 source = "registry+https://github.com/rust-lang/crates.io-index"
5658 5656 checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
5659 5657 dependencies = [
5660 - "windows-sys 0.59.0",
5658 + "windows-sys 0.61.2",
5661 5659 ]
5662 5660
5663 5661 [[package]]
@@ -6330,10 +6328,14 @@
6330 6328 name = "tagtree"
6331 6329 version = "0.4.1"
6332 6330
6331 + [[patch.unused]]
6332 + name = "synckit-client"
6333 + version = "0.10.0"
6334 +
6333 6335 [[patch.unused]]
6334 6336 name = "quasi-type"
6335 6337 version = "0.1.3"
6336 6338
6337 6339 [[patch.unused]]
6338 - name = "synckit-client"
6339 - version = "0.10.0"
6340 + name = "makeover-build"
6341 + version = "0.67.0"
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-axum"
3 - version = "0.101.1"
3 + version = "0.102.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.101.1" }
17 - quasi-http = { path = "../quasi-http", version = "0.101.1" }
16 + quasi-router = { path = "../quasi-router", version = "0.102" }
17 + quasi-http = { path = "../quasi-http", version = "0.102" }
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.101.1" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.102" }
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.101.2"
3 + version = "0.102.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,7 +13,7 @@
13 13 workspace = true
14 14
15 15 [dependencies]
16 - quasi-router = { path = "../quasi-router", version = "0.101.1" }
16 + quasi-router = { path = "../quasi-router", version = "0.102" }
17 17 quasi-declare = { path = "../quasi-declare", version = "0.1" }
18 18 makeover-layout = "0.44"
19 19
@@ -21,5 +21,5 @@
21 21 # A widget's guarantees are claims about what a renderer draws, so they are
22 22 # tested against a real one rather than by walking the tree the assembly just
23 23 # built. The webview is the renderer that recognises names today.
24 - quasi-webview = { path = "../quasi-webview", version = "0.101.1" }
25 - quasi-http = { path = "../quasi-http", version = "0.101.1" }
24 + quasi-webview = { path = "../quasi-webview", version = "0.102" }
25 + quasi-http = { path = "../quasi-http", version = "0.102" }
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-bench"
3 - version = "0.101.1"
3 + version = "0.102.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
@@ -26,14 +26,14 @@
26 26 askama = ["dep:askama"]
27 27
28 28 [dependencies]
29 - quasi-router = { path = "../quasi-router", version = "0.101.1" }
30 - quasi-webview = { path = "../quasi-webview", version = "0.101.1" }
31 - quasi-tui = { path = "../quasi-tui", version = "0.101.1" }
32 - quasi-immediate = { path = "../quasi-immediate", version = "0.101.1" }
29 + quasi-router = { path = "../quasi-router", version = "0.102" }
30 + quasi-webview = { path = "../quasi-webview", version = "0.102" }
31 + quasi-tui = { path = "../quasi-tui", version = "0.102" }
32 + quasi-immediate = { path = "../quasi-immediate", version = "0.102" }
33 33 # `Serves` is the trait carrying `screen` and `fragment`, which is what the
34 34 # webview is measured through. Taken directly rather than through quasi-webview
35 35 # because a bench calling a trait method should name the trait it calls.
36 - quasi-http = { path = "../quasi-http", version = "0.101.1" }
36 + quasi-http = { path = "../quasi-http", version = "0.102" }
37 37 # The macro under measurement. The bench holds the declared copy of the same
38 38 # screen `staging.rs` writes by hand, so the staged column measures what the
39 39 # server actually serves rather than a shape written for a benchmark.
@@ -41,7 +41,7 @@
41 41 makeover-layout = "0.44"
42 42 # The renderer's own escaper, so the staged path fills a hole exactly the way
43 43 # `Node::Text` does and the guarantee is not quietly reimplemented.
44 - makeover-webview = "0.73"
44 + makeover-webview = "0.74"
45 45 makeover-tui = { version = "0.44", features = ["theme"] }
46 46 # Only to load a bundled theme file. `makeover_tui::Theme` is `#[non_exhaustive]`,
47 47 # 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-declare"
3 - version = "0.1.9"
3 + version = "0.1.10"
4 4 description = "The declare! form: a screen description compiled to Rust at build time."
5 5 edition.workspace = true
6 6 rust-version.workspace = true
@@ -31,4 +31,4 @@
31 31 trybuild = "1"
32 32 # The generated code names the vocabulary, so a case that is meant to COMPILE
33 33 # needs it. A proc-macro crate cannot depend on it outside dev.
34 - quasi-router = { path = "../quasi-router", version = "0.101" }
34 + quasi-router = { path = "../quasi-router", version = "0.102" }