Overview state rides the CLI tile too - #100
Merged
Merged
Conversation
From prod: "in the overview the spinning widget is still next to the icon, when it should be the animation around the icon like in the sidebar." #92 shipped the frame to the sidebar, both pane headers and the install mock, and deliberately left Overview on the standalone mark — the argument being that Overview is denser. The operator has decided the other way, so all three of its state slots move: - the card's row (`ov-id`) and the tile's head (`ovt-head`) drop the separate mark and hand the state to the `StateLogo` that replaces their plain `Logo` - the group's peek strip has no icon to frame, so it uses the frame-only form the legends already use Density was the original objection, so it is worth stating what actually happens: the card and tile frames measure **18x18, exactly the sidebar's**, and they replace a 15px mark plus an 18px tile sitting side by side. Those two rows get *narrower*, not denser. The strip's marks go from 15px wide to 12px. No new size was invented: both come from `StateLogo`'s own `size` prop. **The tile keeps its state word and loses its spinner.** `.ovt-state.running` drew an animated braille glyph next to the frame that is now animating a few pixels away — one small tile carrying two motions saying the same thing. The word stays because it says what the four-state frame cannot: `needs input`, `✓ done`, and `running` in the wider digest sense (`atWork`) that a frame reading `waiting` does not cover. `.status` is now rendered nowhere with a state class — only bare, by the provider dots in `UsagePanel` and the ready dot in `SettingsView`. Both keep working and both are still asserted. The `.status.<state>` rules stay: they are the reference implementation the mark-parity tests measure the spinner family against, so they are exercised even though the app no longer draws them. Tests: `stateLogo.test.mjs` gains the assertion that every state slot is a frame and no component renders a state-classed `.status` — verified to fail if any one site is reverted. `statusMark.render.test.mjs` loses its `overview-group-working` fixture, which measured the tile spinner this removes. Also fixed, and failing on main before this branch: `reader-info.test.mjs` asserted the pane header's state dot leads the centred name. #92 moved that onto the tile, so the assertion has been red since it merged; it now pins the new arrangement instead. 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.
Before/after, sizes and reduced-motion behaviour →
#92 shipped the frame to the sidebar, both pane headers and the install mock, and deliberately left Overview on the standalone mark — the argument being that Overview is denser. The operator has decided the other way, so all three of Overview's state slots move onto the tile:
Logobecomes aStateLogoDensity was the objection, so here are the numbers
The frame is not a shrunken version of the sidebar's — it is the same object at the same size, and on the card and tile it replaces a mark and a logo that sat side by side, so those two rows get narrower. The strip's marks get smaller. No new size was invented: both come from
StateLogo's ownsizeprop.The tile keeps its word and loses its spinner
.ovt-state.running::beforedrew an animated braille glyph in the line under the icon — so with the frame now animating a few pixels above it, one small tile carried two motions saying the same thing. The glyph is gone.The word stays, because it says what a four-state frame cannot:
needs input,✓ done, andrunningin the wider digest sense (atWork, which covers a session whose transcript is mid-task while its state readswaiting). In the sidebar the frame is all you get; on a tile the word still earns its place. Flagging the one consequence: in thatatWork-but-not-workingcase the tile no longer animates at all — the accent word is the whole signal. Say if you would rather keep the glyph.The bare
.statusblock, checked before touchingAfter this change
.statusis rendered nowhere with a state class — only bare, by the provider dots inUsagePanel.tsx:92and the ready dot inSettingsView.tsx:358. Both still work and both are still asserted instatusMark.render.test.mjs(provider still shows rgb(214, 69, 69),ready still shows rgb(46, 158, 91)) — the pair I broke in #82 and do not intend to break again.The
.status.<state>rules stay. They look dead but are not:statusMark.test.mjsandstatusMark.render.test.mjsmeasure.status.working::beforeas the reference for the spinner family that.ov-busyand.cx-runningare checked against. Removing them means rewriting those two suites, which is a separate change. I left a note rather than a trap.Four states, both themes, no motion
All four stay distinguishable at Overview's sizes (the screenshots force real states through the API, so the working dash is genuine rather than a class swap). Under
prefers-reduced-motionthe working frame keepsstroke-dasharray: 20px, 4pxwithanimation-name: noneand 0 running animations, while waiting has no dash rect at all — so working is still dashed against waiting's solid when nothing may move.Tests
stateLogo.test.mjsgains the assertion the brief asked for. The old declaration that Overview keeps the standalone mark was already gone — that suite was rewritten after my Move agent status onto CLI icon frames #92 review to pin structure rather than source text — so instead of editing it I added its opposite: every state slot is a frame, the strip uses the frame-only form, and no component renders a state-classed.status. Verified it fails if any one of the three sites is reverted.statusMark.render.test.mjsloses itsoverview-group-workingfixture, which existed only to measure the tile spinner this removes.One thing that was already broken
server/reader-info.test.mjsasserted "the state mark leads the centred name" — the pane header's standalone dot. #92 moved that onto the tile, so this has been failing on main since #92 merged; I confirmed it fails identically with my changes stashed:It now pins the arrangement #92 actually shipped (state on the tile, at the head of the row, no dot left behind).
npm run test:uigoes from red to green — 74 checks.Web suite: 15 suites.
npm run test:render: all checks.npm run test:ui: all three suites green.🤖 Generated with Claude Code