Skip to main content

max / quasi

Follow the Bespoke split, and let a terminal say when a fill is missing `RegionKind::Bespoke` becomes `Handover` and `Ceded`, with `Slot::handover` and `Slot::ceded`. The renderers are where the split pays: quasi-tui gains `node::UNFILLED` and quasi-immediate `unfilled()`, siblings of the `UNDRAWN`/`undrawn` idioms already there, and an unfilled `Handover` now says the fill is missing instead of drawing an empty box. An unfilled `Ceded` stays quiet, because nothing is owed. quasi-webview treats the two alike, which is right there: it always has markup. `a_fill_counts_toward_the_rows_its_region_wants` moves onto a `ceded` slot, since an unfilled handover is no longer zero rows, and a second test asserts the distinction directly and that the notice goes away once the host supplies what it owed.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session
https://claude.ai/code/session_01MptwXZ8k65v19rFmdGAyki
Author: Max Johnson <me@maxj.phd> · 2026-09-01 22:06 UTC
Signed with PGP, not checked
Commit: 1ea586291189ae75e848595ee8c5bbd5541344a4
Parent: a58bd46
18 files changed, +215 insertions, -79 deletions
M Cargo.lock +13 -13
@@ -2656,7 +2656,7 @@
2656 2656
2657 2657 [[package]]
2658 2658 name = "makeover-immediate"
2659 - version = "0.43.0"
2659 + version = "0.44.0"
2660 2660 dependencies = [
2661 2661 "egui",
2662 2662 "egui_extras",
@@ -2666,7 +2666,7 @@
2666 2666
2667 2667 [[package]]
2668 2668 name = "makeover-layout"
2669 - version = "0.42.0"
2669 + version = "0.43.0"
2670 2670
2671 2671 [[package]]
2672 2672 name = "makeover-timing"
@@ -2679,7 +2679,7 @@
2679 2679
2680 2680 [[package]]
2681 2681 name = "makeover-touch"
2682 - version = "0.32.0"
2682 + version = "0.33.0"
2683 2683 dependencies = [
2684 2684 "makeover-geometry",
2685 2685 "makeover-layout",
@@ -2687,7 +2687,7 @@
2687 2687
2688 2688 [[package]]
2689 2689 name = "makeover-tui"
2690 - version = "0.42.0"
2690 + version = "0.43.0"
2691 2691 dependencies = [
2692 2692 "makeover",
2693 2693 "makeover-layout",
@@ -2697,7 +2697,7 @@
2697 2697
2698 2698 [[package]]
2699 2699 name = "makeover-webview"
2700 - version = "0.71.0"
2700 + version = "0.72.0"
2701 2701 dependencies = [
2702 2702 "makeover-geometry",
2703 2703 "makeover-layout",
@@ -6261,6 +6261,14 @@
6261 6261 name = "synckit-client"
6262 6262 version = "0.10.0"
6263 6263
6264 + [[patch.unused]]
6265 + name = "alloy_tui"
6266 + version = "14.0.0"
6267 +
6268 + [[patch.unused]]
6269 + name = "makeover-build"
6270 + version = "0.65.0"
6271 +
6264 6272 [[patch.unused]]
6265 6273 name = "quasi-type"
6266 6274 version = "0.1.3"
@@ -6280,11 +6288,3 @@
6280 6288 [[patch.unused]]
6281 6289 name = "tagtree"
6282 6290 version = "0.4.1"
6283 -
6284 - [[patch.unused]]
6285 - name = "alloy_tui"
6286 - version = "13.0.0"
6287 -
6288 - [[patch.unused]]
6289 - name = "makeover-build"
6290 - version = "0.64.0"
@@ -14,7 +14,7 @@
14 14
15 15 [dependencies]
16 16 quasi-router = { path = "../quasi-router", version = "0.97.0" }
17 - makeover-layout = "0.42"
17 + makeover-layout = "0.43"
18 18
19 19 [dev-dependencies]
20 20 # A widget's guarantees are claims about what a renderer draws, so they are
@@ -33,11 +33,11 @@
33 33 # webview is measured through. Taken directly rather than through quasi-webview
34 34 # because a bench calling a trait method should name the trait it calls.
35 35 quasi-http = { path = "../quasi-http", version = "0.97.0" }
36 - makeover-layout = "0.42"
36 + makeover-layout = "0.43"
37 37 # The renderer's own escaper, so the staged path fills a hole exactly the way
38 38 # `Node::Text` does and the guarantee is not quietly reimplemented.
39 - makeover-webview = "0.71"
40 - makeover-tui = { version = "0.42", features = ["theme"] }
39 + makeover-webview = "0.72"
40 + makeover-tui = { version = "0.43", features = ["theme"] }
41 41 # Only to load a bundled theme file. `makeover_tui::Theme` is `#[non_exhaustive]`,
42 42 # so `Theme::from_theme` is the one way to get one, the same reason quasi-tui's
43 43 # 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.43"
20 + makeover-immediate = "0.44"
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.42"
16 + makeover-layout = "0.43"
@@ -14,13 +14,13 @@
14 14
15 15 [dependencies]
16 16 quasi-router = { path = "../quasi-router", version = "0.97.0" }
17 - makeover-layout = "0.42"
17 + makeover-layout = "0.43"
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.42", features = ["theme"] }
23 + makeover-tui = { version = "0.43", 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.97.0" }
17 17 quasi-http = { path = "../quasi-http", version = "0.97.0" }
18 - makeover-layout = "0.42"
19 - makeover-webview = "0.71"
18 + makeover-layout = "0.43"
19 + makeover-webview = "0.72"
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 #
@@ -31,7 +31,7 @@
31 31 //!
32 32 //! A thing that needs a member the vocabulary does not have is still a finding
33 33 //! about the vocabulary. A thing specific to one app is still
34 - //! [`Region::Bespoke`](makeover_layout::Region::Bespoke).
34 + //! [`Region::Handover`](makeover_layout::Region::Handover).
35 35 //!
36 36 //! # Adopting one in a webview app
37 37 //!