Proposal H pane migration: build the display rail's remaining sections - #194
Conversation
#164) Co-Authored-By: Claude <noreply@anthropic.com>
|
Wiki-maintenance check (CLAUDE.md's Tooling rules): confirmed against Merge-time checklist:
Full report (six-field standing format): https://github.com/ProxyPrints/ProxyPrints.github.io/blob/report-relay-proposal-h-pane-migration-99146/docs/reports/2026-07-19-proposal-h-pane-migration.md |
Closes #164
Summary
Builds the four rail sections
DisplayPage.tsx(/display) still had aslabeled stubs, per
docs/proposals/proposal-h-unified-display-page.md's§5 component-mapping table (the "left-panel unification" step of the pane
migration):
(
attributeChips.ts), now voted on via a shareduseTagVotinghookextracted from
AttributeChipPanel.tsx(unchanged public behavior,AttributeChipPanel.test.tsxstill green). The rail renders the sameChip/vote-submission logic in a plain vertical stack instead of a ringaround a card image, fetching this slot's tag consensus via the existing
APIGetTagConsensusendpoint (same onebleedPriorResolution.tsalreadyuses for the export-time bleed prior).
Force trimmed), reusing the exact
projectSliceselector/action and anewly-exported
isBleedNormalizationEligible(fromPDF.tsx) so theclassic PDF tab's
BleedOverrideSettingspanel and this rail sectionshare one eligibility rule instead of two that could drift. (The
original stub's "blocked on Proposal B PR-2" note is stale — that PR
shipped; see
docs/features/pdf-generator.md's Proposal B status.)ArtistSupportLinkdirectly, exactly asdocs/features/artist-support-links.mdanticipated this surface wouldonce built.
getCardSlotMenuActionslistCardSlot.tsx's3-dot dropdown/context menu use, rendered as a plain action list rather
than a dropdown overlay, per the design doc's own instruction for this
section.
Scope
This is #164 only (pane migration + left-panel unification). Explicitly
NOT touched, per the task's own scope fence:
PR #116 blocked on formatting/type-check failure #140; the existing Choose Image section (candidate/version picker) was
already built in an earlier PR and is unchanged here.
/displaythe default nav entry over/editor) and step 4 (retiring/editor) — not part of "left-panelunification" by name; flagged as an open decision below rather than
guessed at.
(§3) — still the plain-document-flow fallback below
md, unchanged.Performance benchmark (owner condition: before AND after)
Reused the existing scroll/virtualization benchmark harness landed by PR
#178 (
frontend/tests/perf/display-scroll.bench.spec.ts,playwright.perf.config.ts) unmodified — a 120-card/15-sheet deck,scrolled through in steps under 4x CPU throttling, sampling fps/heap/
mounted-
<img>-count/long-tasks. Ran it on the untouched baseline first(before any edit in this branch), then again after landing this change:
<img>tags (of 120)No regression — numbers are effectively flat, within normal run-to-run
noise. This is the expected result, not just a lucky one: this PR's
changes are confined to the rail (mounted per-slot on selection), and the
benchmark's own scroll flow never selects a slot — it exercises the sheet
stack's virtualization, which this PR doesn't touch. A flat result
confirms the rail work didn't regress sheet scroll performance; it isn't
evidence about the rail's own render cost under this harness, which wasn't
designed to measure that.
Verification
npx tsc --noEmit— clean.npx jest— 43 suites / 402 tests passed (includesAttributeChipPanel.test.tsx, unchanged behavior after theuseTagVotingextraction).npx playwright test(full suite, 273 tests) — 272 passed, 1(
ImportCSV.spec.ts) failed under full-suite resource contention andpassed cleanly in isolation (pre-existing flake, unrelated to this
change — not touched by this PR).
npx prettier@2.7.1 --checkon every changed frontend file — clean.tests/DisplayPage.spec.ts: fixed 3 existing assertions thatreferenced the old Attributes stub text, added
tagConsensusTwoUnresolvedTagsto every slot-selecting test's mocks (the Attributes section fetches on
slot-select regardless of whether it's expanded — same eager-fetch
precedent
ChooseImageSectionalready set), and added 4 new tests (oneper newly-built section).
Docs
docs/proposals/proposal-h-unified-display-page.md— status lineupdated (was still marked "zero feature code," despite Proposal H, Step 1: /display route shell behind a feature flag #87/Proposal H, Step 2 PR 2a: real candidate/version picker in the display rail #96/Proposal H, Step 2 PR 2b: requested-printing badge + Confirm affordance #102/
Proposal H, item 1: missing-image slots keep their card name #104/Proposal H, item 2: inline PDF export runs the real pipeline on /display #109/Item (c): requested-printing badge on editor slots #110/Proposal H, item 3: flat vertical scroll + sheet-level virtualization #115 having shipped since; now lists what's built vs.
still open).
docs/README.md— Proposal H's status row: HOLD → PARTIAL.docs/features/artist-support-links.md— the rail is now a third realsurface, not an anticipated follow-on.
docs/features/pdf-generator.md— notes the sharedisBleedNormalizationEligibleexport.docs/features/printing-tags.md— corrected a stale reference toChip's location after theattributeChipRender.tsxextraction.Open items for the owner
/displaythe default nav entry pointover
/editor) isn't part of "left-panel unification" by name — leftundone and unguessed. Separate call needed on when/whether to flip it.
Playwright coverage for the Print Options section — every existing
card fixture used in this PR's tests is Google-Drive-sourced, so the
ineligible branch is exercised only by the pre-existing
isBleedNormalizationEligible/BleedOverrideSettingscoverage, not anew dedicated test. Flagging so it's a known, not silent, gap.