Skip to main content

max / quasi

Take makeover-layout 0.41.0: describe a one-region screen Arrangement::Single arrived because both existing members divide a width between two regions. The three renderers each grew an arm: the webview names a `single` class and emits no --region-share, since share() answers None where there is no division; the TUI and egui stack the body slots down the whole area. Screen::single is the constructor a host reaches for. Pins move across the whole makeover cone, which moves together because makeover-layout carries `links`.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session
https://claude.ai/code/session_01DwpiantpUgohzML4xr6KeQ
Author: Max Johnson <me@maxj.phd> · 2026-08-30 18:40 UTC
Signed with PGP, not checked
Commit: 63991ba2cd94b517fd7ae3db47cb312fa880fc07
Parent: f2a61e3
12 files changed, +68 insertions, -29 deletions
M Cargo.lock +14 -14
@@ -2605,9 +2605,9 @@
2605 2605
2606 2606 [[package]]
2607 2607 name = "makeover-immediate"
2608 - version = "0.41.0"
2608 + version = "0.42.0"
2609 2609 source = "registry+https://github.com/rust-lang/crates.io-index"
2610 - checksum = "5fecbd8dd999dfab40e6c642f2adf76196f46d31096557c8a83405df61e2884b"
2610 + checksum = "ec7b9057f4f623299570e7b560d38bae3ca5fe42d13a60a558656f87b4057f36"
2611 2611 dependencies = [
2612 2612 "egui",
2613 2613 "egui_extras",
@@ -2617,9 +2617,9 @@
2617 2617
2618 2618 [[package]]
2619 2619 name = "makeover-layout"
2620 - version = "0.40.0"
2620 + version = "0.41.0"
2621 2621 source = "registry+https://github.com/rust-lang/crates.io-index"
2622 - checksum = "c2f7ecec1a7e3b5026f731aec88607a5856fc21945cca478d4130d08724deb96"
2622 + checksum = "668c1ae75b3cc6617b9ef840f7980b0f576a93564f244c920191c90794fc8e17"
2623 2623
2624 2624 [[package]]
2625 2625 name = "makeover-timing"
@@ -2632,9 +2632,9 @@
2632 2632
2633 2633 [[package]]
2634 2634 name = "makeover-touch"
2635 - version = "0.30.0"
2635 + version = "0.31.0"
2636 2636 source = "registry+https://github.com/rust-lang/crates.io-index"
2637 - checksum = "9c2111c223a33cb980a2cdc74ab784c428064bcf820a8e89c3cfb06fd6801f21"
2637 + checksum = "8b59944f2258db046b4c7ea325eaef71a9e681e854432cd88e1355ea891eecc1"
2638 2638 dependencies = [
2639 2639 "makeover-geometry",
2640 2640 "makeover-layout",
@@ -2642,9 +2642,9 @@
2642 2642
2643 2643 [[package]]
2644 2644 name = "makeover-tui"
2645 - version = "0.40.0"
2645 + version = "0.41.0"
2646 2646 source = "registry+https://github.com/rust-lang/crates.io-index"
2647 - checksum = "4aa7a3663b98a7e52b31a57127fe3e32f641d9c5cae593f5656f449a05903d53"
2647 + checksum = "3d1ea0f2ab4d28552f7442f01688a8c65b4100a326c8cc79eadb0535a860dbe0"
2648 2648 dependencies = [
2649 2649 "makeover",
2650 2650 "makeover-layout",
@@ -2654,9 +2654,9 @@
2654 2654
2655 2655 [[package]]
2656 2656 name = "makeover-webview"
2657 - version = "0.69.0"
2657 + version = "0.70.0"
2658 2658 source = "registry+https://github.com/rust-lang/crates.io-index"
2659 - checksum = "78d0f434b4a70830f0c647d1d67bcb19ef9e59e6ded2577bcc45901c0d1e2b37"
2659 + checksum = "ef402e7badce6073d49320837ec3262bfaa6f739561c0f4e27926e94fee29ad0"
2660 2660 dependencies = [
2661 2661 "makeover-geometry",
2662 2662 "makeover-layout",
@@ -6211,10 +6211,6 @@
6211 6211 "winnow 1.0.4",
6212 6212 ]
6213 6213
6214 - [[patch.unused]]
6215 - name = "synckit-client"
6216 - version = "0.10.0"
6217 -
6218 6214 [[patch.unused]]
6219 6215 name = "quasi-type"
6220 6216 version = "0.1.3"
@@ -6234,3 +6230,7 @@
6234 6230 [[patch.unused]]
6235 6231 name = "tagtree"
6236 6232 version = "0.4.1"
6233 +
6234 + [[patch.unused]]
6235 + name = "synckit-client"
6236 + version = "0.10.0"
@@ -14,7 +14,7 @@
14 14
15 15 [dependencies]
16 16 quasi-router = { path = "../quasi-router", version = "0.81.0" }
17 - makeover-layout = "0.40.0"
17 + makeover-layout = "0.41.0"
18 18
19 19 [dev-dependencies]
20 20 # A widget's guarantees are claims about what a renderer draws, so they are
@@ -29,8 +29,8 @@
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 31 quasi-http = { path = "../quasi-http", version = "0.81.0" }
32 - makeover-layout = "0.40.0"
33 - makeover-tui = { version = "0.40.0", features = ["theme"] }
32 + makeover-layout = "0.41.0"
33 + makeover-tui = { version = "0.41.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
36 36 # tests take this.
@@ -17,7 +17,7 @@
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 - makeover-immediate = "0.41.0"
20 + makeover-immediate = "0.42.0"
21 21 # The one place a duration is named rather than numbered. `Intent::Dismiss` is
22 22 # how long a transient notice lives, and `notice_lifetime` is the seam: the
23 23 # description says a toast goes away on its own and declines to say when, so
@@ -13,4 +13,4 @@
13 13 workspace = true
14 14
15 15 [dependencies]
16 - makeover-layout = "0.40.0"
16 + makeover-layout = "0.41.0"
@@ -14,13 +14,13 @@
14 14
15 15 [dependencies]
16 16 quasi-router = { path = "../quasi-router", version = "0.81.0" }
17 - makeover-layout = "0.40.0"
17 + makeover-layout = "0.41.0"
18 18 # The depth palette, the theme bridge and the table. Everything else this crate
19 19 # draws is written here first and lifted upstream once a second consumer wants
20 20 # it, which is the order the suite has always moved in: the constrained consumer
21 21 # finds the shape, and the shared crate takes it after it is known rather than
22 22 # before.
23 - makeover-tui = { version = "0.40.0", features = ["theme"] }
23 + makeover-tui = { version = "0.41.0", features = ["theme"] }
24 24 # The one place a duration is named rather than numbered. `Intent::Dismiss` is
25 25 # how long a transient notice lives, and `notice_lifetime` is the seam: the
26 26 # description says a toast goes away on its own and declines to say when, so
@@ -15,8 +15,8 @@
15 15 [dependencies]
16 16 quasi-router = { path = "../quasi-router", version = "0.81.0" }
17 17 quasi-http = { path = "../quasi-http", version = "0.81.0" }
18 - makeover-layout = "0.40.0"
19 - makeover-webview = "0.69.0"
18 + makeover-layout = "0.41.0"
19 + makeover-webview = "0.70.0"
20 20 # `Node::Rich` carries markdown source and this is what turns it into markup.
21 21 # Sanitising comes with it, which is why the node can carry what a user typed.
22 22 #
@@ -151,6 +151,14 @@
151 151 });
152 152 }
153 153 }
154 +
155 + // One region filling the frame. Down the page, because there is no
156 + // division to put anything beside.
157 + Arrangement::Single => {
158 + for slot in body {
159 + scrolled(ui, slot, pass);
160 + }
161 + }
154 162 }
155 163 }
156 164
@@ -7497,6 +7497,16 @@
7497 7497 Self::new(title, layout::Arrangement::sidebar_content())
7498 7498 }
7499 7499
7500 + /// One region, filling the document.
7501 + ///
7502 + /// `52699de6`. What a screen with nothing beside anything says. Before this
7503 + /// existed such a screen borrowed [`list_detail`](Self::list_detail) with
7504 + /// `tabbed: false` and the host cancelled the grid that produced, which is a
7505 + /// host writing CSS to contradict the description rather than to add to it.
7506 + pub fn single(title: impl Into<String>) -> Self {
7507 + Self::new(title, layout::Arrangement::Single)
7508 + }
7509 +
7500 7510 /// Add a region, chaining.
7501 7511 #[must_use]
7502 7512 pub fn with(mut self, slot: Slot) -> Self {