Skip to main content

max / quasi

0.75.0: the theme picker, mirrored owned makeover-layout 0.38.0's FieldKind::Theme (518c650a, ruled by Max on 70028e00). ThemeChoice is the owned mirror, Field::themes and Field::follows the two members, Field::theme and Field::following the constructors. Its own type rather than Choice for the reason recorded on the borrowed original: a theme is four facts and an option is two, and the two extra ones are resolved by the theme layer and neither survives being written into a label. The conversion from makeover::ThemeOption stays with the app. quasi-router takes only makeover-layout, which takes nothing at all, so the crate that reads theme files off disk is not in this graph. Three call sites had to learn the kind, and the third is the one that would have been a live bug: a theme is picked in one gesture, so it belongs with the options and files rather than with the values a reader builds up character by character. Left alone, quasi-tui and quasi-immediate would have deferred the write to `leaving` and treated the picker as a text box. Nothing here sorts. The order arrives from whoever measured the tiers, and re-sorting at this layer would be deciding a question it cannot see the inputs to.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session
https://claude.ai/code/session_01AAbx8dxVmuVeyKbKoRrUL2
Author: Max Johnson <me@maxj.phd> · 2026-08-28 19:11 UTC
Signed with PGP, not checked
Commit: e3524cd68fcdd98469a47c21fd6f46102c61e18b
Parent: 2d8bd54
18 files changed, +239 insertions, -79 deletions
M Cargo.lock +31 -31
@@ -2588,9 +2588,9 @@
2588 2588
2589 2589 [[package]]
2590 2590 name = "makeover"
2591 - version = "3.0.0"
2591 + version = "3.1.0"
2592 2592 source = "registry+https://github.com/rust-lang/crates.io-index"
2593 - checksum = "3e6da78c376074e48eb2324394004afc847e674e05ed2ea4bec1331073990b3f"
2593 + checksum = "d0fba4022268d1d73423bb16126dfdaa714a63bd4ff24f826dd645255eb0aad4"
2594 2594 dependencies = [
2595 2595 "include_dir",
2596 2596 "serde",
@@ -2605,9 +2605,9 @@
2605 2605
2606 2606 [[package]]
2607 2607 name = "makeover-immediate"
2608 - version = "0.38.0"
2608 + version = "0.39.0"
2609 2609 source = "registry+https://github.com/rust-lang/crates.io-index"
2610 - checksum = "7ee9cb9fe796db8803518e8726e01708fafd64fc52595fd7d8f040fb9f4345fe"
2610 + checksum = "628f2e478a4bd00a305cc7b43ee1bdc229ccd8dd9c7077ba7d7cc1f85ba6994c"
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.37.0"
2620 + version = "0.38.0"
2621 2621 source = "registry+https://github.com/rust-lang/crates.io-index"
2622 - checksum = "369bc3c3e0ee91d24b3552f48f1ecb1764bca953725fb817df33b2dc80f2d34f"
2622 + checksum = "73ad4a03ed87470b838bd84be586739682f0a1210db1d7ad4a0146cb9ef7734b"
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.27.0"
2635 + version = "0.28.0"
2636 2636 source = "registry+https://github.com/rust-lang/crates.io-index"
2637 - checksum = "b180e22917189e05d291bfec0e930b5e6c2952dc7bf6e2f7a2262b903431cc72"
2637 + checksum = "10693ddd1a7c5aad0289bcee2bb02c25cef10e292820a60a2813d21411217a83"
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.37.0"
2645 + version = "0.38.0"
2646 2646 source = "registry+https://github.com/rust-lang/crates.io-index"
2647 - checksum = "b5e2ea93b84f2cb85fde760d360ff4c095320db242a0d0c08cbaf2f396a8de8e"
2647 + checksum = "0b2702bf3d12d4f978607a6209d5ebc9786e46adb13b2ee2c704881b391ec1bd"
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.64.0"
2657 + version = "0.65.0"
2658 2658 source = "registry+https://github.com/rust-lang/crates.io-index"
2659 - checksum = "6b91db6e169bc8b7c7225e17b6bc83f9c6f1879eb3bc6f1554e96cb621c84e5c"
2659 + checksum = "899e27bcbcf2d8de779c0404ca5e1e354d9ff0fa9d834f1855c5202d0271c80f"
2660 2660 dependencies = [
2661 2661 "makeover-geometry",
2662 2662 "makeover-layout",
@@ -3425,11 +3425,11 @@
3425 3425
3426 3426 [[package]]
3427 3427 name = "quasi"
3428 - version = "0.74.0"
3428 + version = "0.75.0"
3429 3429
3430 3430 [[package]]
3431 3431 name = "quasi-axum"
3432 - version = "0.74.0"
3432 + version = "0.75.0"
3433 3433 dependencies = [
3434 3434 "axum",
3435 3435 "http",
@@ -3443,7 +3443,7 @@
3443 3443
3444 3444 [[package]]
3445 3445 name = "quasi-basics"
3446 - version = "0.74.0"
3446 + version = "0.75.0"
3447 3447 dependencies = [
3448 3448 "makeover-layout",
3449 3449 "quasi-http",
@@ -3453,7 +3453,7 @@
3453 3453
3454 3454 [[package]]
3455 3455 name = "quasi-bench"
3456 - version = "0.74.0"
3456 + version = "0.75.0"
3457 3457 dependencies = [
3458 3458 "dhat",
3459 3459 "makeover",
@@ -3468,7 +3468,7 @@
3468 3468
3469 3469 [[package]]
3470 3470 name = "quasi-http"
3471 - version = "0.74.0"
3471 + version = "0.75.0"
3472 3472 dependencies = [
3473 3473 "form_urlencoded",
3474 3474 "http",
@@ -3477,7 +3477,7 @@
3477 3477
3478 3478 [[package]]
3479 3479 name = "quasi-immediate"
3480 - version = "0.74.0"
3480 + version = "0.75.0"
3481 3481 dependencies = [
3482 3482 "docengine",
3483 3483 "egui",
@@ -3488,7 +3488,7 @@
3488 3488
3489 3489 [[package]]
3490 3490 name = "quasi-notifs"
3491 - version = "0.74.0"
3491 + version = "0.75.0"
3492 3492 dependencies = [
3493 3493 "quasi-router",
3494 3494 "synckit-config",
@@ -3496,7 +3496,7 @@
3496 3496
3497 3497 [[package]]
3498 3498 name = "quasi-router"
3499 - version = "0.74.0"
3499 + version = "0.75.0"
3500 3500 dependencies = [
3501 3501 "makeover-layout",
3502 3502 ]
@@ -3513,7 +3513,7 @@
3513 3513
3514 3514 [[package]]
3515 3515 name = "quasi-tauri"
3516 - version = "0.74.0"
3516 + version = "0.75.0"
3517 3517 dependencies = [
3518 3518 "http",
3519 3519 "quasi-http",
@@ -3526,7 +3526,7 @@
3526 3526
3527 3527 [[package]]
3528 3528 name = "quasi-tui"
3529 - version = "0.74.0"
3529 + version = "0.75.0"
3530 3530 dependencies = [
3531 3531 "docengine",
3532 3532 "makeover",
@@ -3539,7 +3539,7 @@
3539 3539
3540 3540 [[package]]
3541 3541 name = "quasi-webview"
3542 - version = "0.74.0"
3542 + version = "0.75.0"
3543 3543 dependencies = [
3544 3544 "docengine",
3545 3545 "makeover-layout",
@@ -6211,6 +6211,14 @@
6211 6211 "winnow 1.0.4",
6212 6212 ]
6213 6213
6214 + [[patch.unused]]
6215 + name = "synckit-client"
6216 + version = "0.10.0"
6217 +
6218 + [[patch.unused]]
6219 + name = "quasi-type"
6220 + version = "0.1.2"
6221 +
6214 6222 [[patch.unused]]
6215 6223 name = "kberg"
6216 6224 version = "0.1.0"
@@ -6226,11 +6234,3 @@
6226 6234 [[patch.unused]]
6227 6235 name = "tagtree"
6228 6236 version = "0.4.1"
6229 -
6230 - [[patch.unused]]
6231 - name = "quasi-type"
6232 - version = "0.1.1"
6233 -
6234 - [[patch.unused]]
6235 - name = "synckit-client"
6236 - version = "0.9.1"
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-axum"
3 - version = "0.74.0"
3 + version = "0.75.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.74.0" }
17 - quasi-http = { path = "../quasi-http", version = "0.74.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.75.0" }
17 + quasi-http = { path = "../quasi-http", version = "0.75.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.74.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.75.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.74.0"
3 + version = "0.75.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.74.0" }
17 - makeover-layout = "0.37.0"
16 + quasi-router = { path = "../quasi-router", version = "0.75.0" }
17 + makeover-layout = "0.38.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.74.0" }
24 - quasi-http = { path = "../quasi-http", version = "0.74.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.75.0" }
24 + quasi-http = { path = "../quasi-http", version = "0.75.0" }
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-bench"
3 - version = "0.74.0"
3 + version = "0.75.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,19 +22,19 @@
22 22 count = ["dep:dhat"]
23 23
24 24 [dependencies]
25 - quasi-router = { path = "../quasi-router", version = "0.74.0" }
26 - quasi-webview = { path = "../quasi-webview", version = "0.74.0" }
27 - quasi-tui = { path = "../quasi-tui", version = "0.74.0" }
25 + quasi-router = { path = "../quasi-router", version = "0.75.0" }
26 + quasi-webview = { path = "../quasi-webview", version = "0.75.0" }
27 + quasi-tui = { path = "../quasi-tui", version = "0.75.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.74.0" }
32 - makeover-layout = "0.37.0"
33 - makeover-tui = { version = "0.37.0", features = ["theme"] }
31 + quasi-http = { path = "../quasi-http", version = "0.75.0" }
32 + makeover-layout = "0.38.0"
33 + makeover-tui = { version = "0.38.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.
37 - makeover = "3.0"
37 + makeover = "3.1"
38 38 ratatui = { version = "0.30", default-features = false }
39 39 # Allocation counting, and only that. Optional and off by default. It is here
40 40 # rather than a hand-written `GlobalAlloc` because the workspace forbids
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-http"
3 - version = "0.74.0"
3 + version = "0.75.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.74.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.75.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.74.0"
3 + version = "0.75.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.74.0" }
15 + quasi-router = { path = "../quasi-router", version = "0.75.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.38.0"
20 + makeover-immediate = "0.39.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
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-notifs"
3 - version = "0.74.0"
3 + version = "0.75.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.74.0", optional = true }
27 + quasi-router = { path = "../quasi-router", version = "0.75.0", optional = true }
28 28 synckit-config = { git = "https://makenot.work/git/max/synckit.git", version = "0.2", optional = true }