Skip to main content

max / quasi

0.18.0: a region member says what it is worth Slot.body becomes Vec<Ranked>: a node, and what it is worth when there is not room for everything. Until now the only placement that could declare its rank was a column, so anything that was not a table hand-rolled its responsiveness, and hand-rolling means measuring, and measuring means keeping the measurement, which is how a layout becomes a function of the width it came from rather than of the width it is at. audiofiles had four such breakpoints and one measure-and-correct loop. The rank sits on the placement and not on the node, the way Column already puts it on the column and not on the cell's contents. Default Essential, which never drops and is exactly what every region did before, so Slot::with keeps its signature and every screen in the tree says what it said. The narrowing member is Slot::with_ranked. A wrapping Node::Optional was refused: a renderer that has not learned a member draws it as one muted stand-in line, so wrapped content would go invisible in any renderer that had not caught up, which is the wrong failure for a member whose job is deciding what disappears. A type change makes every renderer fail to compile instead. Each renderer raises a cutoff over CUTOFFS and never counts, so the same width is the same answer whatever came before it. The webview emits the drop class makeover-webview's stylesheet already hides per size class and is told no width at all; the terminal reads a cutoff off its cells; egui reads one off makeover-geometry's size class boundaries, quoted rather than reinvented, so a window and a webview narrow at the same width. Two things this leaves open, both recorded in the code. The terminal's focus walk has no width and so still reaches a member the width has dropped, and fixing that means the navigation walk knowing what the drawing knows. makeover-webview's priority-to-class mapping is private, so quasi-webview names cell-drops-first and cell-drops-next by hand rather than sharing one encoding. Also: the generated template pinned quasi at 0.10 against a remote at 0.14, which cargo rejects at resolution, and makeover-tui at 0.18 against a published 0.25. Both moved to what the tree holds.
Author: Max Johnson <me@maxj.phd> · 2026-08-16 21:53 UTC
Signed with PGP, not checked
Commit: c4b679a3572d3d1929ca590ecba5b25b710138df
Parent: 5e9badc
25 files changed, +514 insertions, -82 deletions
M Cargo.lock +10 -10
@@ -3092,11 +3092,11 @@
3092 3092
3093 3093 [[package]]
3094 3094 name = "quasi"
3095 - version = "0.17.0"
3095 + version = "0.18.0"
3096 3096
3097 3097 [[package]]
3098 3098 name = "quasi-axum"
3099 - version = "0.17.0"
3099 + version = "0.18.0"
3100 3100 dependencies = [
3101 3101 "axum",
3102 3102 "http",
@@ -3110,7 +3110,7 @@
3110 3110
3111 3111 [[package]]
3112 3112 name = "quasi-basics"
3113 - version = "0.17.0"
3113 + version = "0.18.0"
3114 3114 dependencies = [
3115 3115 "makeover-layout",
3116 3116 "quasi-http",
@@ -3120,7 +3120,7 @@
3120 3120
3121 3121 [[package]]
3122 3122 name = "quasi-bench"
3123 - version = "0.17.0"
3123 + version = "0.18.0"
3124 3124 dependencies = [
3125 3125 "dhat",
3126 3126 "makeover",
@@ -3135,7 +3135,7 @@
3135 3135
3136 3136 [[package]]
3137 3137 name = "quasi-http"
3138 - version = "0.17.0"
3138 + version = "0.18.0"
3139 3139 dependencies = [
3140 3140 "form_urlencoded",
3141 3141 "http",
@@ -3144,7 +3144,7 @@
3144 3144
3145 3145 [[package]]
3146 3146 name = "quasi-immediate"
3147 - version = "0.17.0"
3147 + version = "0.18.0"
3148 3148 dependencies = [
3149 3149 "docengine",
3150 3150 "egui",
@@ -3154,7 +3154,7 @@
3154 3154
3155 3155 [[package]]
3156 3156 name = "quasi-router"
3157 - version = "0.17.0"
3157 + version = "0.18.0"
3158 3158 dependencies = [
3159 3159 "makeover-layout",
3160 3160 ]
@@ -3171,7 +3171,7 @@
3171 3171
3172 3172 [[package]]
3173 3173 name = "quasi-tauri"
3174 - version = "0.17.0"
3174 + version = "0.18.0"
3175 3175 dependencies = [
3176 3176 "http",
3177 3177 "quasi-http",
@@ -3182,7 +3182,7 @@
3182 3182
3183 3183 [[package]]
3184 3184 name = "quasi-tui"
3185 - version = "0.17.0"
3185 + version = "0.18.0"
3186 3186 dependencies = [
3187 3187 "docengine",
3188 3188 "makeover",
@@ -3194,7 +3194,7 @@
3194 3194
3195 3195 [[package]]
3196 3196 name = "quasi-webview"
3197 - version = "0.17.0"
3197 + version = "0.18.0"
3198 3198 dependencies = [
3199 3199 "docengine",
3200 3200 "makeover-layout",
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-axum"
3 - version = "0.17.0"
3 + version = "0.18.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.17.0" }
17 - quasi-http = { path = "../quasi-http", version = "0.17.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.18.0" }
17 + quasi-http = { path = "../quasi-http", version = "0.18.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.17.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.18.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.17.0"
3 + version = "0.18.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.17.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.18.0" }
17 17 makeover-layout = "0.27.3"
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.17.0" }
24 - quasi-http = { path = "../quasi-http", version = "0.17.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.18.0" }
24 + quasi-http = { path = "../quasi-http", version = "0.18.0" }
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-bench"
3 - version = "0.17.0"
3 + version = "0.18.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.17.0" }
26 - quasi-webview = { path = "../quasi-webview", version = "0.17.0" }
27 - quasi-tui = { path = "../quasi-tui", version = "0.17.0" }
25 + quasi-router = { path = "../quasi-router", version = "0.18.0" }
26 + quasi-webview = { path = "../quasi-webview", version = "0.18.0" }
27 + quasi-tui = { path = "../quasi-tui", version = "0.18.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.17.0" }
31 + quasi-http = { path = "../quasi-http", version = "0.18.0" }
32 32 makeover-layout = "0.27.3"
33 33 makeover-tui = { version = "0.25.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.17.0"
3 + version = "0.18.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.17.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.18.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.17.0"
3 + version = "0.18.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.17.0" }
15 + quasi-router = { path = "../quasi-router", version = "0.18.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-router"
3 - version = "0.17.0"
3 + version = "0.18.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