Skip to main content

max / quasi

Rest learns which pages a reader can go straight to Decided in quasicoherent 0ce21f4b (Max chose a: grow the vocabulary). Rest::jumps is a page number and an address per page. An address per page and not a count, because a renderer cannot build page 5's address out of forward and back without knowing the address grammar, and that grammar is the private vocabulary a conversion exists to retire. The router names the addresses and the renderer draws them, which is the split Row::activate already makes. The number is carried rather than implied by position: what a strip offers is a window around the reader -- MNW's build_pagination_range already windows to five of twenty -- so an index into that list is not the page it names. Which pages to offer stays the host's for the same reason it computes them today; a renderer choosing its own would give a different answer per host for one list. Where the description offered jumps, all three renderers put the strip in place of the "3 / 8" readout rather than beside it: the strip says both numbers already, and printing the position twice is a control arguing with itself. The page being read is drawn as text and not as a control in all three, because one that reloads the page it is on is the lying control control_tag exists to prevent. Rest::is_here answers that once rather than three times. The premise this was filed on was half stale, and it is worth saying which half: position and total were already there. layout::Paging has carried page() and pages_total() since Rest existed, so only the jumps were missing. Also fixed, found while doing it and in the code this had to change: quasi-tui's pager line claimed ONE focus position for a line the focus walk had pushed TWO stops into, so every control below a pager with both directions drew its caret one place early. That is the same defect the_drawing_counts_the_same_table_rows_the_walk_stops_on records for a table of tickable rows, in a second place, and the jumps would have widened it. The line is a list of pieces now -- Prev, the position or the pages, Next -- and the drawing and the focus walk both read it, so they cannot count differently. Prev and Next are printed whether or not they can be pressed, which they were not before: Next had no words at all. Rest::showing is the last piece. audiofiles held the only two struct literals of this type, for a real shape the constructors did not name -- a cap that is a rendering budget, with nothing to press because nothing is missing -- and a literal breaks on every field this type gains. It broke on jumps.
Author: Max Johnson <me@maxj.phd> · 2026-08-30 22:10 UTC
Signed with PGP, not checked
Commit: 68f38dd146f347e22ecaddfb7eeb05aa7d5b0974
Parent: 015926a
25 files changed, +596 insertions, -127 deletions
M Cargo.lock +15 -15
@@ -3425,11 +3425,11 @@
3425 3425
3426 3426 [[package]]
3427 3427 name = "quasi"
3428 - version = "0.90.0"
3428 + version = "0.91.0"
3429 3429
3430 3430 [[package]]
3431 3431 name = "quasi-axum"
3432 - version = "0.90.0"
3432 + version = "0.91.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.90.0"
3446 + version = "0.91.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.90.0"
3456 + version = "0.91.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.90.0"
3471 + version = "0.91.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.90.0"
3480 + version = "0.91.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.90.0"
3491 + version = "0.91.0"
3492 3492 dependencies = [
3493 3493 "quasi-router",
3494 3494 "synckit-config",
@@ -3498,7 +3498,7 @@
3498 3498
3499 3499 [[package]]
3500 3500 name = "quasi-router"
3501 - version = "0.90.0"
3501 + version = "0.91.0"
3502 3502 dependencies = [
3503 3503 "makeover-layout",
3504 3504 ]
@@ -3515,7 +3515,7 @@
3515 3515
3516 3516 [[package]]
3517 3517 name = "quasi-tauri"
3518 - version = "0.90.0"
3518 + version = "0.91.0"
3519 3519 dependencies = [
3520 3520 "http",
3521 3521 "quasi-http",
@@ -3526,7 +3526,7 @@
3526 3526
3527 3527 [[package]]
3528 3528 name = "quasi-tui"
3529 - version = "0.90.0"
3529 + version = "0.91.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.90.0"
3542 + version = "0.91.0"
3543 3543 dependencies = [
3544 3544 "docengine",
3545 3545 "makeover-layout",
@@ -6215,6 +6215,10 @@
6215 6215 name = "quasi-type"
6216 6216 version = "0.1.3"
6217 6217
6218 + [[patch.unused]]
6219 + name = "synckit-client"
6220 + version = "0.10.0"
6221 +
6218 6222 [[patch.unused]]
6219 6223 name = "kberg"
6220 6224 version = "0.1.0"
@@ -6230,7 +6234,3 @@
6230 6234 [[patch.unused]]
6231 6235 name = "tagtree"
6232 6236 version = "0.4.1"
6233 -
6234 - [[patch.unused]]
6235 - name = "synckit-client"
6236 - version = "0.10.0"
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-axum"
3 - version = "0.90.0"
3 + version = "0.91.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.90.0" }
17 - quasi-http = { path = "../quasi-http", version = "0.90.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.91.0" }
17 + quasi-http = { path = "../quasi-http", version = "0.91.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.90.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.91.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.90.0"
3 + version = "0.91.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.90.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.91.0" }
17 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
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.90.0" }
24 - quasi-http = { path = "../quasi-http", version = "0.90.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.91.0" }
24 + quasi-http = { path = "../quasi-http", version = "0.91.0" }
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-bench"
3 - version = "0.90.0"
3 + version = "0.91.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,13 +22,13 @@
22 22 count = ["dep:dhat"]
23 23
24 24 [dependencies]
25 - quasi-router = { path = "../quasi-router", version = "0.90.0" }
26 - quasi-webview = { path = "../quasi-webview", version = "0.90.0" }
27 - quasi-tui = { path = "../quasi-tui", version = "0.90.0" }
25 + quasi-router = { path = "../quasi-router", version = "0.91.0" }
26 + quasi-webview = { path = "../quasi-webview", version = "0.91.0" }
27 + quasi-tui = { path = "../quasi-tui", version = "0.91.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.90.0" }
31 + quasi-http = { path = "../quasi-http", version = "0.91.0" }
32 32 makeover-layout = "0.41.0"
33 33 makeover-tui = { version = "0.41.0", features = ["theme"] }
34 34 # Only to load a bundled theme file. `makeover_tui::Theme` is `#[non_exhaustive]`,
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-http"
3 - version = "0.90.0"
3 + version = "0.91.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.90.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.91.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.90.0"
3 + version = "0.91.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,7 +12,7 @@
12 12 categories = ["gui"]
13 13
14 14 [dependencies]
15 - quasi-router = { path = "../quasi-router", version = "0.90.0" }
15 + quasi-router = { path = "../quasi-router", version = "0.91.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
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-notifs"
3 - version = "0.90.0"
3 + version = "0.91.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
@@ -28,7 +28,7 @@
28 28 tauri = ["dep:tauri", "dep:tauri-plugin-notification"]
29 29
30 30 [dependencies]
31 - quasi-router = { path = "../quasi-router", version = "0.90.0", optional = true }
31 + quasi-router = { path = "../quasi-router", version = "0.91.0", optional = true }
32 32 synckit-config = { git = "https://makenot.work/git/max/synckit.git", version = "0.2", optional = true }
33 33 tauri-plugin-notification = { version = "2.3.3", optional = true }
34 34 # Default features off, for `quasi-tauri`'s reason: this takes an `AppHandle`