Remove groups: every row moves on its own - #99
Merged
Merged
Conversation
A `group` string made several rows one unit in the editor — a press on a kpi tile took its value, its label and its delta chip; a marquee that caught one member took the rest; the selection drew a dashed box round the union. Kyle's ruling: a text box that cannot be moved away from the box beside it is the wrong object, and the link cost more in editing than it ever paid in dragging. The prop leaves the contract (validate names it), the engine (grp(), the marquee's expansion, the .gbox outline), the library's composite slots, and what chart rows and diagramSlide() emit. create strips a `group` an older model still carries, so such a deck still builds. Multi-row moves are unchanged and are the human's: ⌘-click, a marquee, arrow nudge. The gap gate keeps the two cases groups were waving through, on geometry instead of a link: containment is judged on what the model declares (a card holds its copy even when the line-count estimate overflows it), and two text rows inside ONE painted box that are apart only on an estimate are the card's interior, not a collision. A pair overlapping on an axis both rows declare still fails. npm test: 346 pass, 0 fail, 0 skipped. verify:deck: VERIFY PASS. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed
groupleaves decklet. A row no longer carries a link to another row, so every text box, tile, bar, node and chip selects, drags, nudges and deletes on its own.groupprop —validateerrors on it: "groupis gone — every row moves on its own"template.html)grp(), the marquee's group expansion, the.gboxunion outline and its CSSgroup: 'modern', is a different thing and stays)lib/chart.mjslib/diagram.mjscreatestrips agroupa model written against an older skill still carries, so such a deck still builds, minus the dead link.Multi-row moves are unchanged and belong to the human: ⌘-click adds a row, a marquee takes what it contains, arrows nudge the lot, and the selection is gone at the next click.
Why
Kyle, 2026-09-15: a text box that cannot be moved away from the box beside it is the wrong object. The link complicated every edit — a press anywhere on a card took the whole card, and taking one row back needed a modifier.
The one non-obvious consequence
The gap gate used a shared
groupas a collision exemption, and the library leaned on it in two places. Both now rest on geometry:verifymeasures the real glyphs in a browser.validate --strictstays clean across the library, the 99 templates and the examples.Verification
npm test— 346 pass, 0 fail, 0 skipped (baseline onmain: 342 pass, 0 fail).npm run verify:deck— VERIFY PASS, all 12 slides.deck.html,library.html,library-speaker.htmlandlibrary-reading.htmlrebuilt from the new engine.New and rewritten gates:
test/group.test.mjsis the gate for the absence: the prop rejected,createstripping it, no library slot carrying one, charts and figures emitting none, the engine free ofgrp/.gbox, plus a live Chromium proof that a card's tile drags alone while its text rows stay, that a text row drags out of its card, and that a marquee still takes what it contains.test/diagram.test.mjsreads a figure's parts back out of the rows themselves: a zone is a dashedover:1box, a node is a row with anid, an edge is a run oflinerows closed byto.test/editor.test.mjs,test/gate.test.mjs,test/layouts.test.mjs,test/templates.test.mjs,test/icons.test.mjsandtest/chart.test.mjsupdated to the new contract.🤖 Generated with Claude Code