Skip to main content

max / quasi

0.8.0: label a track by its unit rather than by assumption quasi-webview's ruler formatted every tick as a wall clock. Held against a day-granularity track it printed 00:00 over a month while placing the spans exactly right, because Track::fraction is unit-agnostic and nothing else in the path noticed. makeover-layout 0.26.1's Track::unit closes it, and the match here is written so a unit added later falls through to no label rather than silently taking the clock -- which is how this shipped in the first place. Days label from one, not zero. A strip's offsets are zero-based like every axis here and nobody calls the first of the month the zeroth. Two tests, both halves: a month strip labels days and never 00:00, and a day view still labels 09:00. Fixing the strip must not cost the screen the vocabulary was added for. Takes the makeover 0.26.1 cascade: layout 0.26.1, webview 0.44.0, tui 0.24.0, immediate 0.24.0.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-08-15 16:55 UTC
Signed with PGP, not checked
Commit: 51972ee2e30f3c1f017b82a3b824244964894f73
Parent: 77d18dd
12 files changed, +122 insertions, -62 deletions
M Cargo.lock +27 -27
@@ -2296,9 +2296,9 @@
2296 2296
2297 2297 [[package]]
2298 2298 name = "makeover-immediate"
2299 - version = "0.23.0"
2299 + version = "0.24.0"
2300 2300 source = "registry+https://github.com/rust-lang/crates.io-index"
2301 - checksum = "cf5a321862c506ee387d2cff5b8ccf29e8f4f26e736e889eeb3c9c8d8db4c3d4"
2301 + checksum = "03abc4ce154f0ac923c8712215b8611fd9442471edea8abf945f7b64d2f07d49"
2302 2302 dependencies = [
2303 2303 "egui",
2304 2304 "egui_extras",
@@ -2307,15 +2307,15 @@
2307 2307
2308 2308 [[package]]
2309 2309 name = "makeover-layout"
2310 - version = "0.25.0"
2310 + version = "0.26.1"
2311 2311 source = "registry+https://github.com/rust-lang/crates.io-index"
2312 - checksum = "f7480bdecd1ccca99dbfd744327f5598d67dd9be3157c48928466b5e20d4aed3"
2312 + checksum = "58967567e03caca4b9b991734184d7952ac54e2075882cff42312f04f5214bab"
2313 2313
2314 2314 [[package]]
2315 2315 name = "makeover-touch"
2316 - version = "0.17.0"
2316 + version = "0.18.0"
2317 2317 source = "registry+https://github.com/rust-lang/crates.io-index"
2318 - checksum = "bd1cac03a0e0b912a16f07044a79099c5bf8be3741403cd2b980d0aa4e57adac"
2318 + checksum = "bf59a17d309e376a9c501235f3b6f6f8f3f94922ef46b4e9a780fc41149fe0be"
2319 2319 dependencies = [
2320 2320 "makeover-geometry",
2321 2321 "makeover-layout",
@@ -2323,9 +2323,9 @@
2323 2323
2324 2324 [[package]]
2325 2325 name = "makeover-tui"
2326 - version = "0.23.0"
2326 + version = "0.24.0"
2327 2327 source = "registry+https://github.com/rust-lang/crates.io-index"
2328 - checksum = "d2c1f0eb73f3d89511a1a731b0f7e6705c39c7e06a7c944fcde1cbc7aebe5604"
2328 + checksum = "0381a77d593cddee4a3420e383d9a90a9a98c91723532cafabbfc2c18766a84a"
2329 2329 dependencies = [
2330 2330 "makeover",
2331 2331 "makeover-layout",
@@ -2334,9 +2334,9 @@
2334 2334
2335 2335 [[package]]
2336 2336 name = "makeover-webview"
2337 - version = "0.43.0"
2337 + version = "0.44.0"
2338 2338 source = "registry+https://github.com/rust-lang/crates.io-index"
2339 - checksum = "1fc6f622ba5546e4ce0b8393addbb23c905dad5b1888ee7b588f04c696fecca4"
2339 + checksum = "d6aa378fc8c66a495fccb751dbf1e6d4e56e07e16f0384e06606ebaa4ff5263d"
2340 2340 dependencies = [
2341 2341 "makeover-geometry",
2342 2342 "makeover-layout",
@@ -3025,11 +3025,11 @@
3025 3025
3026 3026 [[package]]
3027 3027 name = "quasi"
3028 - version = "0.7.0"
3028 + version = "0.8.0"
3029 3029
3030 3030 [[package]]
3031 3031 name = "quasi-axum"
3032 - version = "0.7.0"
3032 + version = "0.8.0"
3033 3033 dependencies = [
3034 3034 "axum",
3035 3035 "http",
@@ -3043,7 +3043,7 @@
3043 3043
3044 3044 [[package]]
3045 3045 name = "quasi-basics"
3046 - version = "0.7.0"
3046 + version = "0.8.0"
3047 3047 dependencies = [
3048 3048 "makeover-layout",
3049 3049 "quasi-http",
@@ -3053,7 +3053,7 @@
3053 3053
3054 3054 [[package]]
3055 3055 name = "quasi-http"
3056 - version = "0.7.0"
3056 + version = "0.8.0"
3057 3057 dependencies = [
3058 3058 "form_urlencoded",
3059 3059 "http",
@@ -3062,7 +3062,7 @@
3062 3062
3063 3063 [[package]]
3064 3064 name = "quasi-immediate"
3065 - version = "0.7.0"
3065 + version = "0.8.0"
3066 3066 dependencies = [
3067 3067 "docengine",
3068 3068 "egui",
@@ -3072,7 +3072,7 @@
3072 3072
3073 3073 [[package]]
3074 3074 name = "quasi-router"
3075 - version = "0.7.0"
3075 + version = "0.8.0"
3076 3076 dependencies = [
3077 3077 "makeover-layout",
3078 3078 ]
@@ -3089,7 +3089,7 @@
3089 3089
3090 3090 [[package]]
3091 3091 name = "quasi-tauri"
3092 - version = "0.7.0"
3092 + version = "0.8.0"
3093 3093 dependencies = [
3094 3094 "http",
3095 3095 "quasi-http",
@@ -3100,7 +3100,7 @@
3100 3100
3101 3101 [[package]]
3102 3102 name = "quasi-tui"
3103 - version = "0.7.0"
3103 + version = "0.8.0"
3104 3104 dependencies = [
3105 3105 "docengine",
3106 3106 "makeover",
@@ -3112,7 +3112,7 @@
3112 3112
3113 3113 [[package]]
3114 3114 name = "quasi-webview"
3115 - version = "0.7.0"
3115 + version = "0.8.0"
3116 3116 dependencies = [
3117 3117 "docengine",
3118 3118 "makeover-layout",
@@ -5524,14 +5524,6 @@
5524 5524 source = "registry+https://github.com/rust-lang/crates.io-index"
5525 5525 checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
5526 5526
5527 - [[patch.unused]]
5528 - name = "synckit-client"
5529 - version = "0.8.0"
5530 -
5531 - [[patch.unused]]
5532 - name = "synckit-config"
5533 - version = "0.2.0"
5534 -
5535 5527 [[patch.unused]]
5536 5528 name = "kberg"
5537 5529 version = "0.1.0"
@@ -5547,3 +5539,11 @@
5547 5539 [[patch.unused]]
5548 5540 name = "tagtree"
5549 5541 version = "0.4.0"
5542 +
5543 + [[patch.unused]]
5544 + name = "synckit-client"
5545 + version = "0.8.0"
5546 +
5547 + [[patch.unused]]
5548 + name = "synckit-config"
5549 + version = "0.2.0"
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-axum"
3 - version = "0.7.0"
3 + version = "0.8.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.7.0" }
17 - quasi-http = { path = "../quasi-http", version = "0.7.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.8.0" }
17 + quasi-http = { path = "../quasi-http", version = "0.8.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.7.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.8.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.7.0"
3 + version = "0.8.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.7.0" }
17 - makeover-layout = "0.25.0"
16 + quasi-router = { path = "../quasi-router", version = "0.8.0" }
17 + makeover-layout = "0.26.1"
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.7.0" }
24 - quasi-http = { path = "../quasi-http", version = "0.7.0" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.8.0" }
24 + quasi-http = { path = "../quasi-http", version = "0.8.0" }
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-http"
3 - version = "0.7.0"
3 + version = "0.8.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.7.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.8.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.7.0"
3 + version = "0.8.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"
@@ -10,12 +10,12 @@
10 10 categories = ["gui"]
11 11
12 12 [dependencies]
13 - quasi-router = { path = "../quasi-router", version = "0.7.0" }
13 + quasi-router = { path = "../quasi-router", version = "0.8.0" }
14 14 # The node drawing, which is the makeover layer's and not this crate's. Every
15 15 # widget here that is not a container comes from it: a screen walk that painted
16 16 # its own meter would be the divergence the suite exists to end, one copy per
17 17 # renderer instead of one copy per app.
18 - makeover-immediate = "0.23.0"
18 + makeover-immediate = "0.24.0"
19 19 egui = { version = "0.35", default-features = false }
20 20 # Markdown to text for `Node::Rich`. The same crate the webview renderer takes,
21 21 # 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-router"
3 - version = "0.7.0"
3 + version = "0.8.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.25.0"
16 + makeover-layout = "0.26.1"
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-tauri"
3 - version = "0.7.0"
3 + version = "0.8.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.7.0" }
17 - quasi-http = { path = "../quasi-http", version = "0.7.0" }
16 + quasi-router = { path = "../quasi-router", version = "0.8.0" }
17 + quasi-http = { path = "../quasi-http", version = "0.8.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.7.0" }
25 + quasi-webview = { path = "../quasi-webview", version = "0.8.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.7.0"
3 + version = "0.8.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,14 +13,14 @@
13 13 workspace = true
14 14
15 15 [dependencies]
16 - quasi-router = { path = "../quasi-router", version = "0.7.0" }
17 - makeover-layout = "0.25.0"
16 + quasi-router = { path = "../quasi-router", version = "0.8.0" }
17 + makeover-layout = "0.26.1"
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.23.0", features = ["theme"] }
23 + makeover-tui = { version = "0.24.0", features = ["theme"] }
24 24 ratatui = { version = "0.30", default-features = false }
25 25 # `Node::Rich` carries markdown source. A terminal has no markup to hand it to,
26 26 # so it takes the runs: `render_runs` is the words with the marks that were over
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-webview"
3 - version = "0.7.0"
3 + version = "0.8.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,10 +13,10 @@
13 13 workspace = true
14 14
15 15 [dependencies]
16 - quasi-router = { path = "../quasi-router", version = "0.7.0" }
17 - quasi-http = { path = "../quasi-http", version = "0.7.0" }
18 - makeover-layout = "0.25.0"
19 - makeover-webview = "0.43.0"
16 + quasi-router = { path = "../quasi-router", version = "0.8.0" }
17 + quasi-http = { path = "../quasi-http", version = "0.8.0" }
18 + makeover-layout = "0.26.1"
19 + makeover-webview = "0.44.0"
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 #