Editor-polish round: rail-head enlargement, Sources de-grey, D14 restyle, compare-on-pill, consent gate - #421
Merged
Conversation
…umbnails, D14 restyle, compare-on-pill, consent gate Implements SPEC-editor-polish.md EP1-EP11 + the slot-menu cue revision against the /editor left rail and Select Version funnel, per the owner-approved consolidated polish round. Co-Authored-By: Claude Fable 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.
Description
Implements
SPEC-editor-polish.md's EP1-EP11 + the⋯slot-menu cue revision (the owner-approved consolidated /editor polish round) againstDisplayPage.tsx's left rail andSelectVersionResults.tsx's funnel. Maps to the spec's own item numbering:+NSelectVersionResults.tsx(GhostThumb/GhostDim/GhostPlus/GhostCap).btn-outline-secondarytoolbar ghosts get an explicit#22303f/#ebebeb/1px #46586afloor, scoped to the toolbar onlyDisplayPage.tsx(ToolbarRoot)#4E5D6B→#22303f/#2b3e50viaAutofillCollapse's new additiveheaderBackground/bodyBackgroundprops; rows to 34px (toggle 52×31, pin 30×30, name 12px); filter border brightened; list capped at 10 with a "Showing N of M — filter to narrow" caption (not true virtualization — no new dependency, §B's own rule)SourcesAccordion.tsx,AutofillCollapse.tsx32×30icon row beside the subject, viaSlotActionsSection's newcompactprop; removed from the bottom control stack entirelyDisplayPage.tsx,SlotActionsSection.tsx.subjectwidth REVDisplayPage.tsx(RailRoot)ToggleButtonGrouppreviews the OTHER face's own art (preview-only, never touches selection state); sheet's reserved top-right⟲corner flips that ONE slot's rendered face, gated on a separatecontent.flippableflag (notimageUrl— gating on the currently-shown face would strand the user the moment they flip to a face with no art)DisplayPage.tsx,PagePreview.tsxSortByOptionsselect on this surface; "Community vote weight" renders nothing (amendment 2 — no seam yet, no disabled placeholder)SelectVersionResults.tsx.notthis/.idtogglerestyled to the pre-#413 tinted rounded-pill idiom (radius 10px)ConfidenceElement.tsx,DisplayPage.tsxleft:126px); hover/focus on fine pointers, tap-toggle on(pointer:coarse)(mutually exclusive per pointer type — see below)ConfidenceElement.tsx,DisplayPage.tsxcomponents/Spinner.tsxreplaces the (previously entirely absent) loading state in the Select Version grid, gated onsearch.displaySpinnerSelectVersionResults.tsxSharedDeckViewer.tsx,SharedDeckPage.tsx⋯cue 20×20→26×26, higher contrast, gated on "slot holds a card AND context menu wired" (was gated on the menu alone)PagePreview.tsxDisplayPage.tsxDeviations from spec (flagged, not silent)
PagePreviewsheet cells, for a recipient viewing "a shared deck" through/editor. But perdocs/features/foreign-order-resilience.md's own "Explicitly deferred" note,/editor's project state is always the current session's own (never "someone else's" deck), and the ONE real "recipient of someone else's shared deck" surface in this codebase,SharedDeckViewer.tsx, is a completely separate plain read-only list — noPagePreviewsheet, no rail, and (per that same doc) it doesn't even synthesize orphanCardDocuments today. I stopped and re-scoped rather than fabricate a non-existent "shared deck inside /editor" flow: EP11 ships onSharedDeckViewer.tsxinstead — the real surface the deferred note explicitly named as future work — reusing the exact same tokens/mechanics (deny-by-default,useConsentToast, per-deck key, reversible banner) adapted to that component's own row/list shape rather thanPagePreview's.cell.ext/.extbannerDOM literally.EPcue/E24 flip still ship onPagePreview.tsxas spec'd (independent of item 11's own conflict).(Confirmation status, DPI, File size, Pinned-first, Name/Date)— a 5-item list where the original 7-item enumeration had "Name (A→Z)" and "Date added" as two SEPARATE orderings. I implemented "Name (A→Z)" only (the literal wording used elsewhere in the doc for that bucket) to honor the "five" count; "Date added" isn't a selectable option this round. Flagged, not hidden.§B's own "no new dependencies" constraint rules outreact-window; functionally equivalent for this list's actual size (never more than a few hundred sources), just without scroll-position windowing..comparereveal panel, once open, visually covers its own D14 pill trigger (its own aspect-ratio height reaches down into the band below the rail head) — withoutpointer-events: noneon the panel this creates a live mouseenter/mouseleave oscillation loop (confirmed via a Playwright repro before the fix — the state never settled toopen). Fixed by making the reveal purely visual/non-interactive; documented inline inDisplayPage.tsx.Self-verification (measured, not asserted)
Computed-style delta: 26 rows extracted via Playwright
getComputedStyleat 1400px againstSPEC-editor-polish.md's §D literal values (rail-head subject/icon-row/fbtoggle, D14 padding/notthis pill, Sources header/list/filter-border, compare panel position/left/pointer-events, sortsel, control-stack padding, sheet cue/flip sizing) — 0 mismatches, 26/26 pass.tsc --noEmit: clean.jest: 65 suites / 573 tests, all pass (includes the newSharedDeckViewer.test.tsx, 5 tests).prettier@2.7.1 --checkon every changed file: clean.DisplayLeftRailFidelity.spec.ts(11, includes new EPcue/EP6/EP8/EP9/amendment-1 coverage),DisplayPage.spec.ts(33, includes new EP6 flip-button test),SelectVersionSection.spec.ts(9, includes new EP1/EP7/EP10 coverage),PagePreview.spec.ts,GridSelectorModal(Variants).spec.ts,SavedDecks.spec.ts,OrphanRendering.spec.ts,DisplayFinishFooter.spec.ts,DisplaySlotStates.spec.ts,CardSlot.spec.ts,GeneralUIAccessibility.spec.ts,HomepagePanel.spec.ts,SelectedImagesRibbon.spec.ts,ChangeQueryModal.spec.ts,VotePickers.spec.ts,ArtistSupportLink.spec.ts— all pass (12 pre-existing skips, unrelated)./home/ubuntu/.claude/jobs/e893dbef/tmp/polish-build/v-1400-rail-compare.png/v-390-top.png/v-390-bottom.png. Deferred: the 390 consent/denied screenshot — EP11 shipped onSharedDeckViewer.tsx(deviation 1 above), which needs a real encrypted-deck round-trip to reach live in a browser; verified instead via the 5 jest/RTL tests inSharedDeckViewer.test.tsx(prompt, decline→hidden, accept→revealed, reversible banner, per-deck-id independence), not a screenshot.Dropped-test justifications
None dropped —
DisplayLeftRailFidelity.spec.ts's two rows that would have broken (Slot Actions no longer inside the control stack;.src-listbackground token) were adapted to the new DOM/tokens, not removed, per the task's own "adapted not weakened" instruction.Wiki checklist
docs/features/display-left-rail.md/ the /editor wiki page — the rail-head now shows a 116px subject + Front/Back toggle + compact icon row, Sources is de-greyed/densified/capped, Sort is data-driven, and the wrong-printing affordance is a pill — worth a wiki mention next admin-facing pass.Checklist
pre-commitand installed the hooks withpre-commit installbefore creating any commits.docs/features/foreign-order-resilience.md(item 11 shipped),docs/features/grid-selector.md(ghost-tile/sort/cue/flip descriptions).Do not merge — leaving for owner review per standing instruction.
🤖 Generated with Claude Code