Skip to main content

max / makenotwork

Build the shortcuts table's rows with the constructor that survived the merge Wave 2a. The 28 shape files needed nothing: the grammar's surface is unchanged, and `git_repos`' conditional Visibility column still names its cell rather than counting to it. One site broke, and it broke the way an alias breaks things. `Cells::new` took the row's cells; `Cells` is `Row` now, so it resolves to `Row::new`, which takes the primary column's text. The compiler caught it here because an array is not `Into<String>`, but the same spelling with a single string would have compiled into a different row. `Row::cells` is what that call became, and the alias's doc now says so. The rest is prose: four doc references to members that live on `Row`. 2688 lib tests green, clippy clean with -D warnings.
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-06 16:57 UTC
Signed with PGP, not checked
Commit: f12a899bcd06a64b4d56e7a7bf985568da6e441b
Parent: 945e99e
5 files changed, +12 insertions, -8 deletions
@@ -32,7 +32,7 @@
32 32 //! # What the row is
33 33 //!
34 34 //! A whole row is the link, which is what the markup said with `<a
35 - //! class="feed-table-row">` wrapping five spans. [`Cells::activate`] is that,
35 + //! class="feed-table-row">` wrapping five spans. [`Row::activate`] is that,
36 36 //! and it carries [`Action::navigating`] because an item page is a page: a bare
37 37 //! `Action::get` emits an `href` *and* an `hx-get` with no target, and htmx
38 38 //! puts the whole document inside the row that was pressed. That is
@@ -78,7 +78,7 @@
78 78 //!
79 79 //! [`Action::replacing`]: quasi_router::Action::replacing
80 80 //! [`Action::navigating`]: quasi_router::Action::navigating
81 - //! [`Cells::activate`]: quasi_router::screen::Cells::activate
81 + //! [`Row::activate`]: quasi_router::screen::Row::activate
82 82 //! [`Cell::part`]: quasi_router::screen::Cell::part
83 83
84 84 use makeover_layout as layout;
@@ -557,7 +557,7 @@
557 557 );
558 558
559 559 // `id`, not `data-value`. The link beside each number points at `#L2`,
560 - // and only an id is what `#L2` reaches -- `Cells::identified` is the
560 + // and only an id is what `#L2` reaches -- `Row::identified` is the
561 561 // app's own name for a row and reaches the document as `data-value`,
562 562 // which is what this asserted while every anchor pointed at nothing.
563 563 assert!(html.contains("id=\"L1\""), "{html}");
@@ -15,7 +15,7 @@
15 15 //!
16 16 //! # The diff carries the ruling
17 17 //!
18 - //! `19d7602d` added [`layout::Change`] and `Cells::changed` for this page, and
18 + //! `19d7602d` added [`layout::Change`] and `Row::changed` for this page, and
19 19 //! this is their only consumer. A diff row says which side it is on and the
20 20 //! renderer decides what that looks like: a tint in a webview, a leading sign
21 21 //! in a terminal. What the description does not do is spell `+` or `-` into the
@@ -158,7 +158,7 @@
158 158 /// The empty list is what the figures accrete onto. `Node::stats` takes the
159 159 /// whole list and this one is built a card at a time, so `Node::figure` is
160 160 /// the accreting half, on the rule that closed `Table::column`,
161 - /// `Cells::cell` and `Field::options` before it.
161 + /// `Row::cell` and `Field::options` before it.
162 162 shape figures(stats: &[StatCard]) -> Node;
163 163
164 164 stats [] {
@@ -20,7 +20,7 @@
20 20 //! `/pricing` would give the site-wide shortcut a pricing-shaped address and
21 21 //! move it the first time a second screen converted.
22 22
23 - use quasi_router::screen::{Cell, Cells, Column, Table};
23 + use quasi_router::screen::{Cell, Cells, Column, Row, Table};
24 24 use quasi_router::{
25 25 Action, Chrome, Node, Outcome, RegionKind, Request, Response, RouteError, Router, Screen, Slot,
26 26 };
@@ -64,15 +64,19 @@
64 64 /// shipped overlay was a hand-written `<table>` inside a string of markup in
65 65 /// `keyboard.js`, and this is the same thing said once.
66 66 pub fn screen(_state: &(), _request: Request) -> Result<Response, RouteError> {
67 + // `Row::cells`, not `Row::new`: this row answers the two columns above
68 + // positionally, and `new` names the primary column of the default set. The
69 + // 2026-09-05 collapse made `Cells::new` resolve to `Row::new`, so the old
70 + // spelling is now a different constructor rather than a renamed one.
67 71 let mut rows: Vec<Cells> = chrome()
68 72 .bindings
69 73 .iter()
70 - .map(|binding| Cells::new([Cell::new(&binding.key), Cell::new(&binding.label)]))
74 + .map(|binding| Row::cells([Cell::new(&binding.key), Cell::new(&binding.label)]))
71 75 .collect();
72 76 rows.extend(
73 77 HOST_KEYS
74 78 .iter()
75 - .map(|(key, what)| Cells::new([Cell::new(*key), Cell::new(*what)])),
79 + .map(|(key, what)| Row::cells([Cell::new(*key), Cell::new(*what)])),
76 80 );
77 81
78 82 Ok(Outcome::Over(