Skip to main content

max / quasi

0.49.0: an interval, through the whole stack `Field::upper_name` and `Field::upper_value` mirror makeover-layout 0.34.0's `FieldKind::Interval`, and the three renderers draw the pair. The mirroring is what the cascade is for. `quasi_router::Field` declares itself independently of `makeover_layout::Field`, so a member that stopped at one of them would be silently absent everywhere downstream; `with_layout` is where the two meet and where a missing member shows up as nothing drawn. `upper_value` is the half a `pairs_with` member would not have paid for. A refusal has two values to hand back, and without a second one it returns the low end and drops the high one, so the user retypes half of an answer they already gave. `refilled` reads both names, and an absent end stays absent: "over 120 BPM" is an answer rather than a half-filled form. Renderer side, each host draws what it has. quasi-webview fills `Value::Between`, quasi-tui `Held::Between` off the view's two buffers, quasi-immediate `Filling::Between` off two of its own. The last of those also fires `changes` from either end with both ends in the payload: a handler reading only the box that moved would narrow the filter to a single bound every time either one was touched. `checkbox_node` and `upper_moved` are `field_node` split where the shapes genuinely differ, which is what kept it under the line-count lint.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-08-22 01:53 UTC
Signed with PGP, not checked
Commit: cf3f2f38ad7ea44626a36e1f895f09b4c85fba86
Parent: b23c0c0
16 files changed, +346 insertions, -69 deletions
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-axum"
3 - version = "0.48.0"
3 + version = "0.49.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.48.0" }
17 - quasi-http = { path = "../quasi-http", version = "0.48.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.49.0" }
17 + quasi-http = { path = "../quasi-http", version = "0.49.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.48.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.49.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.48.0"
3 + version = "0.49.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.48.0" }
17 - makeover-layout = "0.33.0"
16 + quasi-router = { path = "../quasi-router", version = "0.49.0" }
17 + makeover-layout = "0.34.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.48.0" }
24 - quasi-http = { path = "../quasi-http", version = "0.48.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.49.0" }
24 + quasi-http = { path = "../quasi-http", version = "0.49.0" }
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-bench"
3 - version = "0.48.0"
3 + version = "0.49.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,15 +22,15 @@
22 22 count = ["dep:dhat"]
23 23
24 24 [dependencies]
25 - quasi-router = { path = "../quasi-router", version = "0.48.0" }
26 - quasi-webview = { path = "../quasi-webview", version = "0.48.0" }
27 - quasi-tui = { path = "../quasi-tui", version = "0.48.0" }
25 + quasi-router = { path = "../quasi-router", version = "0.49.0" }
26 + quasi-webview = { path = "../quasi-webview", version = "0.49.0" }
27 + quasi-tui = { path = "../quasi-tui", version = "0.49.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.48.0" }
32 - makeover-layout = "0.33.0"
33 - makeover-tui = { version = "0.32.0", features = ["theme"] }
31 + quasi-http = { path = "../quasi-http", version = "0.49.0" }
32 + makeover-layout = "0.34.0"
33 + makeover-tui = { version = "0.33.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.
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-http"
3 - version = "0.48.0"
3 + version = "0.49.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.48.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.49.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.48.0"
3 + version = "0.49.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,12 +12,12 @@
12 12 categories = ["gui"]
13 13
14 14 [dependencies]
15 - quasi-router = { path = "../quasi-router", version = "0.48.0" }
15 + quasi-router = { path = "../quasi-router", version = "0.49.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
19 19 # renderer instead of one copy per app.
20 - makeover-immediate = "0.32.0"
20 + makeover-immediate = "0.33.0"
21 21 egui = { version = "0.35", default-features = false }
22 22 # Markdown to text for `Node::Rich`. The same crate the webview renderer takes,
23 23 # reading the same source: what differs is that it can emit markup and this
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-notifs"
3 - version = "0.48.0"
3 + version = "0.49.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.48.0", optional = true }
27 + quasi-router = { path = "../quasi-router", version = "0.49.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.48.0"
3 + version = "0.49.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.33.0"
16 + makeover-layout = "0.34.0"