Skip to main content

max / quasi

Name app-level chrome and the screen drawn over another A description named one screen's content and nothing said that an affordance is available everywhere and draws over what is under it. Two additions cover the class, because an overlay turns out to be a Screen and nothing else: Chrome, a set of key bindings held beside the Router, and Outcome::Over, a screen drawn over what is already there. Over is not a navigation: it touches no history, and dismissing it reveals the screen the user never left. In the TUI that means an overlay stack of screen-and-view pairs, each layer holding its own reach, focus, edits and scroll. Sharing one View would take the user's typing with the palette when it closed, which is the regression the tests pin. In the webview it is a retarget into a container the shell emits, with the bindings as htmx key triggers and no custom JS. Outcome is deliberately exhaustive, so the variant breaks every host on purpose and each one had to answer it. quasi-router through quasi-tauri go 0.1.0 to 0.2.0 together; goingson's pins and the template's git deps move with them, and those deps now carry the version requirement they should have had all along. egui is not covered and says so in makeover-immediate's header, rather than reading as a renderer that needs no palette.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-08-13 14:17 UTC
Signed with PGP, not checked
Commit: 5bdefcee458c3a116ea3ffb34f0492032bf15775
Parent: ed6ebc6
27 files changed, +1048 insertions, -48 deletions
M Cargo.lock +14 -14
@@ -2764,7 +2764,7 @@
2764 2764
2765 2765 [[package]]
2766 2766 name = "quasi-axum"
2767 - version = "0.1.0"
2767 + version = "0.2.0"
2768 2768 dependencies = [
2769 2769 "axum",
2770 2770 "http",
@@ -2778,7 +2778,7 @@
2778 2778
2779 2779 [[package]]
2780 2780 name = "quasi-http"
2781 - version = "0.1.0"
2781 + version = "0.2.0"
2782 2782 dependencies = [
2783 2783 "form_urlencoded",
2784 2784 "http",
@@ -2787,7 +2787,7 @@
2787 2787
2788 2788 [[package]]
2789 2789 name = "quasi-router"
2790 - version = "0.1.0"
2790 + version = "0.2.0"
2791 2791 dependencies = [
2792 2792 "makeover-layout",
2793 2793 ]
@@ -2804,7 +2804,7 @@
2804 2804
2805 2805 [[package]]
2806 2806 name = "quasi-tauri"
2807 - version = "0.1.0"
2807 + version = "0.2.0"
2808 2808 dependencies = [
2809 2809 "http",
2810 2810 "quasi-http",
@@ -2815,7 +2815,7 @@
2815 2815
2816 2816 [[package]]
2817 2817 name = "quasi-tui"
2818 - version = "0.1.0"
2818 + version = "0.2.0"
2819 2819 dependencies = [
2820 2820 "docengine",
2821 2821 "makeover",
@@ -2827,7 +2827,7 @@
2827 2827
2828 2828 [[package]]
2829 2829 name = "quasi-webview"
2830 - version = "0.1.0"
2830 + version = "0.2.0"
2831 2831 dependencies = [
2832 2832 "docengine",
2833 2833 "makeover-layout",
@@ -5159,6 +5159,14 @@
5159 5159 source = "registry+https://github.com/rust-lang/crates.io-index"
5160 5160 checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
5161 5161
5162 + [[patch.unused]]
5163 + name = "synckit-client"
5164 + version = "0.8.0"
5165 +
5166 + [[patch.unused]]
5167 + name = "synckit-config"
5168 + version = "0.2.0"
5169 +
5162 5170 [[patch.unused]]
5163 5171 name = "kberg"
5164 5172 version = "0.1.0"
@@ -5174,11 +5182,3 @@
5174 5182 [[patch.unused]]
5175 5183 name = "tagtree"
5176 5184 version = "0.4.0"
5177 -
5178 - [[patch.unused]]
5179 - name = "synckit-client"
5180 - version = "0.8.0"
5181 -
5182 - [[patch.unused]]
5183 - name = "synckit-config"
5184 - version = "0.2.0"
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-axum"
3 - version = "0.1.0"
3 + version = "0.2.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.1.0" }
17 - quasi-http = { path = "../quasi-http", version = "0.1.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.2.0" }
17 + quasi-http = { path = "../quasi-http", version = "0.2.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.1.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.2.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-http"
3 - version = "0.1.0"
3 + version = "0.2.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.1.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.2.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-router"
3 - version = "0.1.0"
3 + version = "0.2.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
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-tauri"
3 - version = "0.1.0"
3 + version = "0.2.0"
4 4 description = "The Tauri custom-protocol host adapter for quasi-router: a webview request in, a rendered description out"
5 5 edition.workspace = true
6 6 rust-version.workspace = true
@@ -13,8 +13,8 @@
13 13 workspace = true
14 14
15 15 [dependencies]
16 - quasi-router = { path = "../quasi-router", version = "0.1.0" }
17 - quasi-http = { path = "../quasi-http", version = "0.1.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.2.0" }
17 + quasi-http = { path = "../quasi-http", version = "0.2.0" }
18 18 http = "1.3.1"
19 19 # Default features off: this crate uses tauri's protocol registration and its
20 20 # blocking pool, and nothing else. An app brings the features it wants, and the
@@ -22,7 +22,7 @@
22 22 tauri = { version = "2.11.5", default-features = false }
23 23
24 24 [dev-dependencies]
25 - quasi-webview = { path = "../quasi-webview", version = "0.1.0" }
25 + quasi-webview = { path = "../quasi-webview", version = "0.2.0" }
26 26 # The doctest names a concrete `Runtime`, and `Wry` is behind a default feature
27 27 # this crate does not otherwise ask for. Only the example needs it: nothing in
28 28 # the test module builds a window, which is what keeps them runnable with no
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-tui"
3 - version = "0.1.0"
3 + version = "0.2.0"
4 4 description = "The terminal renderer for quasi: a screen description in, cells in a ratatui buffer out"
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.1.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.2.0" }
17 17 makeover-layout = "0.19.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
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-webview"
3 - version = "0.1.0"
3 + version = "0.2.0"
4 4 description = "The webview renderer for quasi: a screen description in, an htmx document out"
5 5 edition.workspace = true
6 6 rust-version.workspace = true
@@ -13,8 +13,8 @@
13 13 workspace = true
14 14
15 15 [dependencies]
16 - quasi-router = { path = "../quasi-router", version = "0.1.0" }
17 - quasi-http = { path = "../quasi-http", version = "0.1.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.2.0" }
17 + quasi-http = { path = "../quasi-http", version = "0.2.0" }
18 18 makeover-layout = "0.19.0"
19 19 makeover-webview = "0.35.0"
20 20 # `Node::Rich` carries markdown source and this is what turns it into markup.