From 87f8e1e6f49b6b50566cc79677b2eb7e59a3b3e6 Mon Sep 17 00:00:00 2001 From: amosblomqvist Date: Sun, 4 Oct 2026 22:54:17 +0300 Subject: [PATCH] proposition pick: persistent lifted selection, live count, honest affordances MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause of 'doesn't register': the slice-6 floating-bar edit never landed (a silent no-match replace) — the Body accepted selectMode but the bar ignored it, so the picker showed Clear + Delete and nothing ever confirmed. Found by re-reading; the test suite never pinned the select-mode bar. The owner vision instead: the chain table's selection is PERSISTENT and caller-owned. - ChainTableOverlay gains controlledSelection/onSelectionChange (every check, clear, and delete-prune reports up immediately; uncontrolled fallback keeps the delete flow self-contained). - Select mode's floating bar: Done (closes; the pick already registered) — the delete fence never renders while picking. - GraphView threads the lifted set through, resolving ids → nodes against the live snapshot. - Home: the pick bar above the composer shows 'N propositions selected' + Clear in EITHER mode (dashed 'Pick propositions from the map' hint only in practice mode with nothing picked); visible hover (bg-accent) so the chip reads clickable. Practice sends still seed from the pick set. --- components/chain-table.tsx | 97 +++++++++++++++++++------------ components/graph-view.tsx | 28 ++++++--- components/home.tsx | 35 ++++++----- tests/render-chain-table.test.tsx | 40 ++++++++++++- 4 files changed, 139 insertions(+), 61 deletions(-) diff --git a/components/chain-table.tsx b/components/chain-table.tsx index b1e7538..ff268f2 100644 --- a/components/chain-table.tsx +++ b/components/chain-table.tsx @@ -502,21 +502,36 @@ export function ChainTableBody({ > Clear - {/* The danger fence (owner ruling): a divider quarantines - the destructive action at the bar's right end — the - safe actions and the kill switch never blend. The - full-death confirm dialog catches the misclick. */} -