Redesign navbar + add three-tier footer, cut nav to five surfaces - #313
Merged
Conversation
Nav shrinks to Editor (-> /display)/What's That Card?/Wiki + Sources + compact auth dropdown, goes full-width, and drops What's New?/Explore/My Decks/Download/Contributions/Guide (absorbed or moved to the footer). New Footer.tsx carries Contributions/Wiki/Sources, About/Privacy/Terms, and the GitHub/Reddit/Discord + chilli_axe credit links. AuthWidget's signed-in state becomes a monogram-avatar user menu instead of a wrapping text pair. Adds a genuine Terms of Use section to /about with its own anchor, and relocates the cloud download-queue counter from the navbar to the two export surfaces that actually enqueue downloads (FinishFooter + print.tsx). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
4 tasks
WilfordGrimley
added a commit
that referenced
this pull request
Jul 22, 2026
…ailure) Boundary-clamp the scroll-position IntersectionObserver in DisplayPage.tsx so it can correctly report the first/last sheet at true scroll extremes; the center-band heuristic alone could never do so once a boundary sheet was too short to reach the band. Real, reproducible bug (not flaky), pre-existing since #313, unrelated to this PR's own /whatsthat changes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
WilfordGrimley
added a commit
that referenced
this pull request
Jul 22, 2026
) * Fix /whatsthat question-box overflow and desync'd reveal animation Word stack rendered ~1.4x the mockup's proportion and, since #310 bounded the hero to one viewport row, ate directly into the question box's budget - even Level 1 didn't fit without an internal scroll. Shrinks the word stack via a viewport-relative clamp(), trims chrome-only spacing (HeroGrid row-gap, StarburstBackground padding/margin), and trims the Level 1 reference thumbnail, with a new hard Playwright assertion (no overflow + all four L1 controls fully on-screen at 1400x900). Also syncs the reveal fade / word pop / card pulse to the subject card's actual image-load event (via a shared imageLoaded gate + each animation's own animation-play-state), instead of firing independently at mount time. Along the way, fixed a real dependency-array bug this surfaced: an identifier-keyed catch-up effect silently skipped re-running on a duplicate fetch resolution (legitimate per the existing chipStates comment, and routine under dev-mode Strict Mode), permanently stranding the UI on "Loading..." - fixed by keying it on a generation counter bumped unconditionally in the reset block instead. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Fix /display sheet-position pill under-reporting last sheet (D17 CI failure) Boundary-clamp the scroll-position IntersectionObserver in DisplayPage.tsx so it can correctly report the first/last sheet at true scroll extremes; the center-band heuristic alone could never do so once a boundary sheet was too short to reach the band. Real, reproducible bug (not flaky), pre-existing since #313, unrelated to this PR's own /whatsthat changes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
4 tasks
WilfordGrimley
added a commit
that referenced
this pull request
Jul 24, 2026
* Swap Proposal H's unified page onto /editor, redirect /display Nav-redesign PR #313 only pointed the "Editor" nav label at /display while the classic grid page stayed live at /editor - per the owner's explicit directive, this completes the actual route swap: the unified sheet+rail page now serves at /editor, /display is a client-side redirect preserving query params/hash, and the classic ProjectEditor is fully unrouted (component kept in-tree, deletion is a later decision). Ports ProjectEditor's beforeunload unsaved-work guard onto DisplayPage (it lived only in the now-unrouted component, so it wasn't naturally inherited). Fixes a real, unrelated redirect-preservation bug found in useBackendSetter.ts while verifying (documented in troubleshooting.md, not fixed here - pre-existing, affects every page, out of scope). ~190 Playwright tests that exercised classic-/editor-only UI (CardSlot grid, SelectedImagesRibbon bulk-select, GridSelectorModal-as-modal, etc. - issue #272's own tracked parity gaps) are now individually skipped with a standard citation rather than left red or silently deleted. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Port chunkErrorRecovery/DisplayLeftRailFidelity specs to the unified-page route (proposal-h) * Port import/card-detail/export test clusters onto DisplayPage (#395) * Port parity wave 1: import/card-detail/export test clusters onto DisplayPage Un-skips and ports 58 tests from the classic /editor grid onto the unified page (issue #272 wave 1): ImportCSV/ImportText/ImportXML + visual (29), the CardDetailedViewModal ecosystem via Browse mode (20), ExportDecklist/ ExportXML content-correctness (6), AddCardToProjectForm (3). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Fix orphan-cardback test's dangling importXML reference in ImportXML.spec.ts * Adapt orphan-cardback test's badge assertion to the sheet's per-slot corner badge (#398) --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * Port ChangeQueryModal/Toasts/a11y/InvalidIdentifiers/SelectVersionSection clusters onto DisplayPage (#403) Wave 2 of issue #272: un-skips and ports 44 Playwright tests from the classic /editor grid onto the unified DisplayPage (issue #272 wave 2): SelectVersionSection (7, already-adapted, just needed its skip removed), ChangeQueryModal via the shared CardSlotContextMenu (9), 3 Toasts.spec.ts tests that fire on plain landing-page mount, GeneralUIAccessibility's per-slot a11y checks (3), InvalidIdentifiersStatus (5) + its visual companion, and SearchSettings.visual (1). Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * Port pin-persistence tests to unified-page routing * Port GridSelectorModal/CardSlot clusters onto DisplayPage (#410) * Port GridSelectorModal/CardSlot clusters onto DisplayPage (issue #272 wave 3) Un-skips 30 of 55 deferred tests (GridSelectorModal.spec.ts + GridSelectorModalVariants.spec.ts fully, CardSlot.spec.ts partially), retargeted onto CardbackToolbarButton's cardback picker and the sheet's page-preview-slot context menu; ports 2 of 6 CardSlot.visual.spec.ts aria-snapshot tests, regex-tolerant on unrelated pre-existing icon-font rendering leaves. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Fold the DOM-API sheet gap into the doc body per edit-in-place convention --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> --------- 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.
Summary
Implements the owner-approved nav+footer redesign (spec:
docs/reports/...not committed here — spec/mockup were provided out-of-band as/tmp/nav-footer-redesign/), with the owner's final decisions layered on top:/display, plain label, no "beta" tag) · What's That Card? (forced one line) · Wiki (renamed from Guide, same/guidetarget) · Sources · a compact auth user-menu. Cut entirely: What's New?, Explore, My Decks, Download (desktop tool), Contributions, the old Guide label. The classic/editorpage leaves the nav but stays URL-reachable (its in-page toggle back is a separate later task, per the owner's note).ContentMaxWidthcap), reusing themax-width: none+fluidmechanism from the Widen /display's sheet region past the 1200px ContentMaxWidth cap (#287) #289fullWidthwork, with generous link spacing now that there's room.Dropdownuser menu (monogram avatar + username + caret) instead of the wrapping "Signed in as X (moderator)" / "Sign out" text pair. Signed-out Discord pill is unchanged behaviorally, justnowrap./about(own#terms-of-useanchor) — acceptable use, no-warranty, and the index-not-store posture, in the page's existing voice.FinishFooter.tsx(next to the existing Export ▾ menu on/display) andprint.tsx(top-right, covering the PDF/desktop-tool downloads that page's ownFinishedMyProject/PDFGeneratortrigger). Both read the same globalfileDownloadsSlice, so either always shows the full count.Deviations from spec (owner-directed or discovered during implementation)
coffee-btn; the owner explicitly declined this in the task brief. The chilli_axe credit link (to their GitHub) is the standing branding requirement's only footer presence now.components/Coffee.tsx/SupportDeveloperModalelsewhere in the app is untouched.isUnifiedDisplayPageEnabled()flag gate, in addition toanyBackendConfigured. The spec's own gating table only listsanyBackendConfigured, but dropping the flag would leave zero editing surface reachable from the nav whileNEXT_PUBLIC_UNIFIED_DISPLAY_ENABLEDis off (the old classic-editor link this replaces is gone, and/displayitself still renders its own "Page Not Found" fallback behind that same flag).playwright.config.tsalready runs the whole e2e suite with the flag on, so this doesn't affect any test. Open item: confirmNEXT_PUBLIC_UNIFIED_DISPLAY_ENABLEDis (or will be) turned on in the production deploy variable before/alongside merging, or the Editor link won't render at all.Dropdowncomponent as desktop, not a separate "inline, no nested dropdown" render path the spec's mockup describes for phone width. React-bootstrap'sDropdownis tap-driven (not hover-only) and works correctly inside the collapsed nav panel; building a second bespoke mobile-only render path for a marginal UX gain wasn't worth the added complexity/risk for a spec preference that was itself just the designer's own review-only mockup aesthetic.BackendConfigoffcanvas (via its own small local state), rather than the spec's suggested simpler "plain link" — there's no dedicated/sourcesroute to link to, and a dead link seemed worse than the trivial duplicated offcanvas state. This surfaced a real gap: no jest test had ever renderedBackendConfig's component tree before, which needed a manual mock (frontend/__mocks__/@googleworkspace/drive-picker-react.js) for an ESM-only dependency that isn'trequire()-resolvable as installed on this machine — unrelated pre-existing infra gap, now fixed generally (not just papered over for this one test).Test plan
npx tsc --noEmit— clean except one pre-existing, unrelated baseline error (docsSite.ts/ missingmarkedmodule, present onmastertoo, confirmed not introduced by this PR).npx jest— 508/508 passing (addedNavbar.test.tsx: one-line items, cut-item absence, auth states out/in/moderator; extendedFooter.test.tsxfor the new links/Sources-offcanvas/no-coffee-button).npx prettier@2.7.1 --checkon all changed files — clean.Navbar.spec.ts,ModerationQueue.spec.ts(auth dropdown open-then-assert),SavedDecks.spec.ts(My Decks nav-entry rework + direct-nav replacements for removed nav clicks),DisplayFinishFooter.spec.ts(+ new download-manager-toggle test),SelectVersionSection.spec.ts,UnsavedWorkGuard.spec.ts, and the fullDisplayPage.spec.ts(28 tests, renamed"Display (beta)"→"Editor"throughout) — all green (two isolated flakes under 4-worker parallelism on this sandbox reproduced as passing in isolation/single-worker reruns, unrelated to nav content: a Fronts/Backs text lookup and an unrelated scroll-position-pill race)./displayFinish footer download badge,/printpage download badge) — matches the mockup's visual contract.perf/display-scroll.bench.spec.tsmanual benchmark (out of scope, not CI-gated; only its"Editor"label rename was applied).Docs
docs/user-guide.md: renamed "Display" page references to "Editor" (disambiguated from the classic lowercase "editor"), noted My Decks' loss of a nav entry and its remaining discovery paths, and noted the download-counter relocation. This file auto-publishes to the wiki'sUser-Guidepage (and/guide) on merge — no manual wiki edit needed.docs/features/homepage-panel.md: fixed a now-stale claim thatNavbar.tsxgatesMy Decksthe same way it gates/whatsthat(My Decks has no nav entry at all now, unconditionally).Open items / decisions needed
NEXT_PUBLIC_UNIFIED_DISPLAY_ENABLEDdeploy state (see deviation Promote PringlePrints to a full ordering tab #2).WORKERS.mdcoordination row could not be added — this session's harness enforces worktree isolation and refuses writes to the shared main-checkout path (including this gitignored, machine-local file). No overlapping active row was found for frontend files at task start.Do not merge — owner review requested.