Skip to main content

max / goingson

Say why the task list still returns two nodes The table has carried its own Rest since quasi 0.15.0, so the doc comment claiming a table cannot say there is more outlived the thing it explained. The second node is the ceiling sentence, which is a different fact.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session
https://claude.ai/code/session_01WHu5vBgpCULUFXsEJBHryC
Author: Max Johnson <me@maxj.phd> · 2026-08-31 00:38 UTC
Signed with PGP, not checked
Commit: d94a59af33a249234636a4d109c310b5a3d3229c
Parent: de0472e
4 files changed, +58 insertions, -24 deletions
M Cargo.lock +20 -20
@@ -1387,7 +1387,7 @@
1387 1387 "libc",
1388 1388 "option-ext",
1389 1389 "redox_users",
1390 - "windows-sys 0.61.2",
1390 + "windows-sys 0.60.2",
1391 1391 ]
1392 1392
1393 1393 [[package]]
@@ -1628,7 +1628,7 @@
1628 1628 checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
1629 1629 dependencies = [
1630 1630 "libc",
1631 - "windows-sys 0.61.2",
1631 + "windows-sys 0.60.2",
1632 1632 ]
1633 1633
1634 1634 [[package]]
@@ -3650,7 +3650,7 @@
3650 3650 "png 0.18.1",
3651 3651 "serde",
3652 3652 "thiserror 2.0.20",
3653 - "windows-sys 0.61.2",
3653 + "windows-sys 0.60.2",
3654 3654 ]
3655 3655
3656 3656 [[package]]
@@ -3783,7 +3783,7 @@
3783 3783 source = "registry+https://github.com/rust-lang/crates.io-index"
3784 3784 checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
3785 3785 dependencies = [
3786 - "windows-sys 0.61.2",
3786 + "windows-sys 0.60.2",
3787 3787 ]
3788 3788
3789 3789 [[package]]
@@ -4717,7 +4717,7 @@
4717 4717
4718 4718 [[package]]
4719 4719 name = "quasi-http"
4720 - version = "0.91.0"
4720 + version = "0.91.1"
4721 4721 dependencies = [
4722 4722 "form_urlencoded",
4723 4723 "http",
@@ -4726,7 +4726,7 @@
4726 4726
4727 4727 [[package]]
4728 4728 name = "quasi-notifs"
4729 - version = "0.91.0"
4729 + version = "0.91.1"
4730 4730 dependencies = [
4731 4731 "quasi-router",
4732 4732 "synckit-config",
@@ -4736,14 +4736,14 @@
4736 4736
4737 4737 [[package]]
4738 4738 name = "quasi-router"
4739 - version = "0.91.0"
4739 + version = "0.91.1"
4740 4740 dependencies = [
4741 4741 "makeover-layout",
4742 4742 ]
4743 4743
4744 4744 [[package]]
4745 4745 name = "quasi-tauri"
4746 - version = "0.91.0"
4746 + version = "0.91.1"
4747 4747 dependencies = [
4748 4748 "http",
4749 4749 "quasi-http",
@@ -4769,7 +4769,7 @@
4769 4769
4770 4770 [[package]]
4771 4771 name = "quasi-webview"
4772 - version = "0.91.0"
4772 + version = "0.91.1"
4773 4773 dependencies = [
4774 4774 "docengine",
4775 4775 "makeover-layout",
@@ -5208,7 +5208,7 @@
5208 5208 "errno",
5209 5209 "libc",
5210 5210 "linux-raw-sys",
5211 - "windows-sys 0.61.2",
5211 + "windows-sys 0.60.2",
5212 5212 ]
5213 5213
5214 5214 [[package]]
@@ -5265,7 +5265,7 @@
5265 5265 "security-framework",
5266 5266 "security-framework-sys",
5267 5267 "webpki-root-certs",
5268 - "windows-sys 0.61.2",
5268 + "windows-sys 0.60.2",
5269 5269 ]
5270 5270
5271 5271 [[package]]
@@ -5805,7 +5805,7 @@
5805 5805 checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4"
5806 5806 dependencies = [
5807 5807 "libc",
5808 - "windows-sys 0.61.2",
5808 + "windows-sys 0.60.2",
5809 5809 ]
5810 5810
5811 5811 [[package]]
@@ -6565,7 +6565,7 @@
6565 6565 "getrandom 0.4.3",
6566 6566 "once_cell",
6567 6567 "rustix",
6568 - "windows-sys 0.61.2",
6568 + "windows-sys 0.60.2",
6569 6569 ]
6570 6570
6571 6571 [[package]]
@@ -6587,7 +6587,7 @@
6587 6587 "parking_lot",
6588 6588 "rustix",
6589 6589 "signal-hook",
6590 - "windows-sys 0.61.2",
6590 + "windows-sys 0.60.2",
6591 6591 ]
6592 6592
6593 6593 [[package]]
@@ -7069,7 +7069,7 @@
7069 7069 "png 0.18.1",
7070 7070 "serde",
7071 7071 "thiserror 2.0.20",
7072 - "windows-sys 0.61.2",
7072 + "windows-sys 0.60.2",
7073 7073 ]
7074 7074
7075 7075 [[package]]
@@ -7104,7 +7104,7 @@
7104 7104 dependencies = [
7105 7105 "memoffset",
7106 7106 "tempfile",
7107 - "windows-sys 0.61.2",
7107 + "windows-sys 0.60.2",
7108 7108 ]
7109 7109
7110 7110 [[package]]
@@ -7634,7 +7634,7 @@
7634 7634 source = "registry+https://github.com/rust-lang/crates.io-index"
7635 7635 checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
7636 7636 dependencies = [
7637 - "windows-sys 0.61.2",
7637 + "windows-sys 0.60.2",
7638 7638 ]
7639 7639
7640 7640 [[package]]
@@ -8493,15 +8493,15 @@
8493 8493
8494 8494 [[patch.unused]]
8495 8495 name = "quasi-axum"
8496 - version = "0.91.0"
8496 + version = "0.91.1"
8497 8497
8498 8498 [[patch.unused]]
8499 8499 name = "quasi-basics"
8500 - version = "0.91.0"
8500 + version = "0.91.1"
8501 8501
8502 8502 [[patch.unused]]
8503 8503 name = "quasi-immediate"
8504 - version = "0.91.0"
8504 + version = "0.91.1"
8505 8505
8506 8506 [[patch.unused]]
8507 8507 name = "quasi-store"
@@ -56,7 +56,14 @@
56 56 * same one-variable walk the Rust side makes.
57 57 */
58 58 const settle = (row) => {
59 - let shut = null;
59 + // Seeded from the row that was just pressed, which is the whole of
60 + // `d131a14c`: this started at `null` and only ever learned about a
61 + // *descendant's* chevron, so shutting a branch hid nothing at all.
62 + // Every row under a shut one is hidden, and the row's own state is the
63 + // only thing that says whether it is shut.
64 + let shut = row.querySelector(DISCLOSE)?.getAttribute("aria-expanded") === "false"
65 + ? depth(row)
66 + : null;
60 67 for (const next of under(row)) {
61 68 const level = depth(next);
62 69 if (shut !== null && level <= shut) shut = null;
@@ -69,6 +76,21 @@
69 76 }
70 77 };
71 78
79 + // Capture, so this runs before anything bound on the way down.
80 + //
81 + // Found 2026-08-30 by the first test written against this file. Bubbling,
82 + // `stopPropagation` here stopped nothing that had already run: a listener
83 + // on the row is *below* the document in the bubble path, so it fires
84 + // first. That is not hypothetical -- `node.rs` hangs a table row's
85 + // `activate` on the row element (`Fires::ClickBeside`) and filters it with
86 + // `click[!event.target.closest('[data-act]')]`, which a chevron is not, so
87 + // pressing the chevron on a row that both discloses and activates folded
88 + // the branch *and* navigated away from it. The emitter's own comment
89 + // already claimed otherwise: "filters by it, pressing its chevron does
90 + // not."
91 + //
92 + // Fixed here rather than by widening that filter, because this is the one
93 + // place that knows what a chevron is.
72 94 document.addEventListener("click", (event) => {
73 95 const chevron = event.target.closest(DISCLOSE);
74 96 if (!chevron) return;
@@ -84,5 +106,5 @@
84 106 chevron.setAttribute("aria-expanded", String(!open));
85 107 chevron.setAttribute("aria-label", open ? "Expand" : "Collapse");
86 108 settle(row);
87 - });
109 + }, true);
88 110 })();
@@ -908,8 +908,10 @@
908 908
909 909 /// The table, and the way to more of it.
910 910 ///
911 - /// Two nodes rather than one because a table cannot say there is more; finding
912 - /// 2 in the module header.
911 + /// The table says there is more itself, since quasi 0.15.0 gave `Node::Table` a
912 + /// `Rest`; finding 2 in the module header. The second node this can return is
913 + /// the ceiling sentence, which is a different thing: at `PAGE * PAGES` there is
914 + /// no address left to offer and the honest answer is a sentence.
913 915 fn table(state: &AppState, view: &View) -> Result<Vec<Node>, RouteError> {
914 916 let (tasks, total) = page(state, view)?;
915 917
@@ -1182,3 +1182,13 @@
1182 1182 "{pane}"
1183 1183 );
1184 1184 }
1185 +
1186 + #[tokio::test]
1187 + async fn tmp_dump_appearance() {
1188 + let state = state().await;
1189 + let page = html(get(&state, "/settings/appearance"));
1190 + let at = page
1191 + .find("name=\"theme\"")
1192 + .map_or(0, |i| i.saturating_sub(1200));
1193 + eprintln!("---\n{}\n---", &page[at..(at + 2400).min(page.len())]);
1194 + }