Skip to main content

max / goingson

Say the board's three peers as a row of fills `RegionKind::Columns` is retired (quasicoherent `cf981aaa`). Three peers is a row whose every member asks to fill: they divide the room equally by `Width::Fill`'s own rule and choose nothing about each other, which is the whole of what the variant said. The row says one thing more. `Wrap` is what the board does when three columns no longer fit across, which the variant could not state and every renderer had to invent for itself. The test counts the fills rather than matching a class, because the count is the peers half: two fills and a content member would be a master-detail wearing a board's markup.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session
https://claude.ai/code/session_01P8ostB2UmZJGj5WjSHRSot
Author: Max Johnson <me@maxj.phd> · 2026-09-07 19:20 UTC
Signed with PGP, not checked
Commit: 7e10f3dd373eb24fc05347f4a5f3c1ae213de1ec
Parent: 4e6f2bd
4 files changed, +55 insertions, -43 deletions
M Cargo.lock +24 -27
@@ -1387,7 +1387,7 @@
1387 1387 "libc",
1388 1388 "option-ext",
1389 1389 "redox_users",
1390 - "windows-sys 0.60.2",
1390 + "windows-sys 0.61.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.60.2",
1631 + "windows-sys 0.61.2",
1632 1632 ]
1633 1633
1634 1634 [[package]]
@@ -3444,9 +3444,7 @@
3444 3444
3445 3445 [[package]]
3446 3446 name = "makeover-build"
3447 - version = "0.66.0"
3448 - source = "registry+https://github.com/rust-lang/crates.io-index"
3449 - checksum = "2f8840f2b76405ef33abf0a305f2bbb43cfbde1b3eb70e964e3c9a1260d3a1ea"
3447 + version = "0.67.0"
3450 3448 dependencies = [
3451 3449 "makeover",
3452 3450 "makeover-geometry",
@@ -3499,9 +3497,7 @@
3499 3497
3500 3498 [[package]]
3501 3499 name = "makeover-webview"
3502 - version = "0.73.0"
3503 - source = "registry+https://github.com/rust-lang/crates.io-index"
3504 - checksum = "848a255b34e7edd66a10cdc8ae0e16319b22f7f96f2ad9bae3dc67b595f184a9"
3500 + version = "0.74.0"
3505 3501 dependencies = [
3506 3502 "makeover-geometry",
3507 3503 "makeover-layout",
@@ -3650,7 +3646,7 @@
3650 3646 "png 0.18.1",
3651 3647 "serde",
3652 3648 "thiserror 2.0.20",
3653 - "windows-sys 0.60.2",
3649 + "windows-sys 0.61.2",
3654 3650 ]
3655 3651
3656 3652 [[package]]
@@ -3783,7 +3779,7 @@
3783 3779 source = "registry+https://github.com/rust-lang/crates.io-index"
3784 3780 checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
3785 3781 dependencies = [
3786 - "windows-sys 0.60.2",
3782 + "windows-sys 0.61.2",
3787 3783 ]
3788 3784
3789 3785 [[package]]
@@ -4717,16 +4713,17 @@
4717 4713
4718 4714 [[package]]
4719 4715 name = "quasi-declare"
4720 - version = "0.1.0"
4716 + version = "0.1.10"
4721 4717 dependencies = [
4722 4718 "proc-macro2",
4723 4719 "quote",
4724 4720 "syn 2.0.119",
4721 + "toml 1.1.4+spec-1.1.0",
4725 4722 ]
4726 4723
4727 4724 [[package]]
4728 4725 name = "quasi-http"
4729 - version = "0.101.1"
4726 + version = "0.102.0"
4730 4727 dependencies = [
4731 4728 "form_urlencoded",
4732 4729 "http",
@@ -4735,7 +4732,7 @@
4735 4732
4736 4733 [[package]]
4737 4734 name = "quasi-notifs"
4738 - version = "0.101.2"
4735 + version = "0.102.0"
4739 4736 dependencies = [
4740 4737 "quasi-router",
4741 4738 "synckit-config",
@@ -4745,14 +4742,14 @@
4745 4742
4746 4743 [[package]]
4747 4744 name = "quasi-router"
4748 - version = "0.101.13"
4745 + version = "0.102.0"
4749 4746 dependencies = [
4750 4747 "makeover-layout",
4751 4748 ]
4752 4749
4753 4750 [[package]]
4754 4751 name = "quasi-tauri"
4755 - version = "0.101.1"
4752 + version = "0.102.0"
4756 4753 dependencies = [
4757 4754 "http",
4758 4755 "quasi-http",
@@ -4778,7 +4775,7 @@
4778 4775
4779 4776 [[package]]
4780 4777 name = "quasi-webview"
4781 - version = "0.101.1"
4778 + version = "0.102.0"
4782 4779 dependencies = [
4783 4780 "docengine",
4784 4781 "makeover-layout",
@@ -5217,7 +5214,7 @@
5217 5214 "errno",
5218 5215 "libc",
5219 5216 "linux-raw-sys",
5220 - "windows-sys 0.60.2",
5217 + "windows-sys 0.61.2",
5221 5218 ]
5222 5219
5223 5220 [[package]]
@@ -5274,7 +5271,7 @@
5274 5271 "security-framework",
5275 5272 "security-framework-sys",
5276 5273 "webpki-root-certs",
5277 - "windows-sys 0.60.2",
5274 + "windows-sys 0.61.2",
5278 5275 ]
5279 5276
5280 5277 [[package]]
@@ -5814,7 +5811,7 @@
5814 5811 checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4"
5815 5812 dependencies = [
5816 5813 "libc",
5817 - "windows-sys 0.60.2",
5814 + "windows-sys 0.61.2",
5818 5815 ]
5819 5816
5820 5817 [[package]]
@@ -6560,7 +6557,7 @@
6560 6557 "getrandom 0.4.3",
6561 6558 "once_cell",
6562 6559 "rustix",
6563 - "windows-sys 0.60.2",
6560 + "windows-sys 0.61.2",
6564 6561 ]
6565 6562
6566 6563 [[package]]
@@ -6582,7 +6579,7 @@
6582 6579 "parking_lot",
6583 6580 "rustix",
6584 6581 "signal-hook",
6585 - "windows-sys 0.60.2",
6582 + "windows-sys 0.61.2",
6586 6583 ]
6587 6584
6588 6585 [[package]]
@@ -7064,7 +7061,7 @@
7064 7061 "png 0.18.1",
7065 7062 "serde",
7066 7063 "thiserror 2.0.20",
7067 - "windows-sys 0.60.2",
7064 + "windows-sys 0.61.2",
7068 7065 ]
7069 7066
7070 7067 [[package]]
@@ -7099,7 +7096,7 @@
7099 7096 dependencies = [
7100 7097 "memoffset",
7101 7098 "tempfile",
7102 - "windows-sys 0.60.2",
7099 + "windows-sys 0.61.2",
7103 7100 ]
7104 7101
7105 7102 [[package]]
@@ -7629,7 +7626,7 @@
7629 7626 source = "registry+https://github.com/rust-lang/crates.io-index"
7630 7627 checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
7631 7628 dependencies = [
7632 - "windows-sys 0.60.2",
7629 + "windows-sys 0.61.2",
7633 7630 ]
7634 7631
7635 7632 [[package]]
@@ -8488,15 +8485,15 @@
8488 8485
8489 8486 [[patch.unused]]
8490 8487 name = "quasi-axum"
8491 - version = "0.101.1"
8488 + version = "0.102.0"
8492 8489
8493 8490 [[patch.unused]]
8494 8491 name = "quasi-basics"
8495 - version = "0.101.1"
8492 + version = "0.102.0"
8496 8493
8497 8494 [[patch.unused]]
8498 8495 name = "quasi-immediate"
8499 - version = "0.101.1"
8496 + version = "0.102.0"
8500 8497
8501 8498 [[patch.unused]]
8502 8499 name = "quasi-store"
@@ -18,7 +18,7 @@
18 18 # Materialises all three generated files: themes/, geometry.css, layout.css,
19 19 # and holds both drift checks this build.rs used to carry itself: touch density
20 20 # as of 0.17, breakpoints as of 0.18.
21 - makeover-build = "0.66"
21 + makeover-build = "0.67"
22 22 # Cuts the two house faces into frontend/fonts/. A git dependency because
23 23 # quasi-type is `publish = false`, which is also why makeover-build cannot do
24 24 # this and only emits the CSS that fetches the result. The rev is the one
@@ -28,7 +28,7 @@
28 28 # The table CSS is generated here too: the columns are this app's, so the
29 29 # shared helper cannot know them, but the tracks and the narrowing rules come
30 30 # from the description rather than from hand-written nth-child cuts.
31 - makeover-webview = "0.73"
31 + makeover-webview = "0.74"
32 32 makeover-layout = "0.44"
33 33 # Width. Direct rather than through makeover-webview, because the narrow table
34 34 # pass keys off SizeClass::Compact and a boundary reached transitively is a
@@ -36,7 +36,7 @@
36 36 makeover-geometry = "0.7"
37 37 # Only to write its selection and clock scripts into the frontend. Those two are
38 38 # the whole of `frontend/js/` since the swap.
39 - quasi-webview = { git = "https://makenot.work/git/max/quasi.git", version = "0.101" }
39 + quasi-webview = { git = "https://makenot.work/git/max/quasi.git", version = "0.102" }
40 40
41 41 [dependencies]
42 42 goingson-core = { workspace = true }
@@ -54,10 +54,10 @@
54 54 # dependency's source even with the feature off -- so a public clone could not
55 55 # build at all against a URL it could not reach. quasi went public that day and
56 56 # the URL moved here with it.
57 - quasi-router = { git = "https://makenot.work/git/max/quasi.git", version = "0.101" }
58 - quasi-http = { git = "https://makenot.work/git/max/quasi.git", version = "0.101" }
59 - quasi-webview = { git = "https://makenot.work/git/max/quasi.git", version = "0.101" }
60 - quasi-tauri = { git = "https://makenot.work/git/max/quasi.git", version = "0.101" }
57 + quasi-router = { git = "https://makenot.work/git/max/quasi.git", version = "0.102" }
58 + quasi-http = { git = "https://makenot.work/git/max/quasi.git", version = "0.102" }
59 + quasi-webview = { git = "https://makenot.work/git/max/quasi.git", version = "0.102" }
60 + quasi-tauri = { git = "https://makenot.work/git/max/quasi.git", version = "0.102" }
61 61 quasi-declare = { git = "https://makenot.work/git/max/quasi.git", version = "0.1" }
62 62
63 63 # The notification declaration, and it is NOT behind the `quasi` feature: the
@@ -70,7 +70,7 @@
70 70 # so an app wanting eight lines over `tauri-plugin-notification` had to link the
71 71 # whole description stack for them. quasicoherent `c231ff13` moved it here,
72 72 # where the `Deliver` trait it implements already lives.
73 - quasi-notifs = { git = "https://makenot.work/git/max/quasi.git", version = "0.101", features = ["synckit", "describe", "tauri"] }
73 + quasi-notifs = { git = "https://makenot.work/git/max/quasi.git", version = "0.102", features = ["synckit", "describe", "tauri"] }
74 74
75 75 # Tauri
76 76 tauri = { workspace = true, features = ["image-png", "devtools"] }
@@ -135,7 +135,7 @@
135 135 # The forms emitter and the description it renders. Runtime deps, not build:
136 136 # form markup depends on the value, the error and the options at the moment a
137 137 # modal opens, so it cannot be materialised the way the stylesheet is.
138 - makeover-webview = "0.73"
138 + makeover-webview = "0.74"
139 139 makeover-layout = "0.44"
140 140 # Browser opening
141 141 open = { workspace = true }
@@ -6,8 +6,15 @@
6 6 //! project and the due date are meta, the blocked and unblocks markers are
7 7 //! tokens, subtask progress is a `Meter`, opening a card is `activate` and the
8 8 //! context menu is `menu`. A column is a heading, a count and a list. That the
9 - //! three columns are **peers** is [`RegionKind::Columns`]; a board described as
10 - //! list-detail or sidebar-content is a lie about the screen.
9 + //! three columns are **peers** is a row whose every member asks to fill: they
10 + //! divide the room equally by `Width::Fill`'s own rule, and no member chooses
11 + //! what another shows. A board described as list-detail or sidebar-content is a
12 + //! lie about the screen.
13 + //!
14 + //! It was `RegionKind::Columns` until that variant was retired (quasicoherent
15 + //! `cf981aaa`). The row says the same thing and one thing more: `Wrap` is what
16 + //! the board does when three columns no longer fit across, which the variant
17 + //! could not state and every renderer had to invent.
11 18 //!
12 19 //! # The shape
13 20 //!
@@ -270,9 +277,11 @@
270 277 /// The board itself, as one region of peer columns.
271 278 shape board_region(tasks: &[Task]) -> Slot;
272 279
273 - region "board" as Columns {
274 - for lane in COLUMNS {
275 - include column(tasks, lane);
280 + region "board" as Group {
281 + across Wrap {
282 + for lane in COLUMNS {
283 + beside Essential Fill include column(tasks, lane);
284 + }
276 285 }
277 286 }
278 287 }
@@ -96,8 +96,14 @@
96 96 // The whole point of the member. Before 0.25.0 this screen could only have
97 97 // been described as list-detail, which says the left column chooses what
98 98 // the right shows -- a lie about a board.
99 - assert!(markup.contains("columns"), "{markup}");
100 - assert!(!markup.contains("split"), "{markup}");
99 + //
100 + // `RegionKind::Columns` said it until that variant was retired
101 + // (quasicoherent `cf981aaa`). Three peers is now three members of one row
102 + // that each ask to fill, which divide the room equally by `Width::Fill`'s
103 + // own rule and choose nothing about each other. Counted rather than
104 + // matched, because the count is the "peers" half: two fills and a content
105 + // member would be a master-detail wearing a board's markup.
106 + assert_eq!(markup.matches("data-width=\"fill\"").count(), 3, "{markup}");
101 107 for label in ["Pending", "Started", "Completed"] {
102 108 assert!(markup.contains(label), "{markup}");
103 109 }