refactor(website): drop the marketing footer from the docs tree - #932
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
Contributor
Every /docs route now wears the sidebar control plane, and a marketing footer bolted under the article column breaks that single-pane read. The footer is mounted once in the root layout, so a route gate is its only opt-out: SiteFooter suppresses it on /docs and /docs/*, and every other route is untouched. Verified against the prerendered build: all 122 docs pages ship without footer-root, every other page still has it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
blove
force-pushed
the
blove/docs-footer-removal-2ca5e3
branch
from
September 1, 2026 17:19
809a348 to
308c175
Compare
blove
enabled auto-merge (squash)
September 1, 2026 17:19
Contributor
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Contributor
This was referenced Sep 1, 2026
blove
added a commit
that referenced
this pull request
Sep 1, 2026
…changes PR #932 changed three files under apps/website/src and ran 41 `Cockpit — e2e` lanes. Two independent scoping defects stacked up. 1. apps/cockpit carried `scope:cockpit-e2e`. The cockpit-e2e matrix dispatches `nx e2e` for the standalone Angular cap apps under cockpit/**; none of the 40 caps depends on the apps/cockpit Next.js shell, and no workflow runs the shell's own `e2e` target. The tag could never select real work — only over-select. And it did: apps/cockpit statically depends on apps/website, so a website-only PR made the shell nx-affected and flipped cockpit_e2e true. 2. cockpit-matrix matched affected projects on `cap.angular` only. A cap is two unlinked nx projects (Angular app + python backend), so a python-only cap change attributed nothing, which main() reads as "nx found no cap" and answers with the full fleet — 40 lanes to cover one cap. Measured on this checkout, before → after: website-only (PR #932 base..head) 41 lanes → 0 (job gate is now false) python-only cap change 40 lanes → 1 (the cap that changed) libs/chat change 40 lanes → 40 (unchanged; no coverage lost) The python sibling's nx name is read from its own project.json rather than derived from the path, because a wrong guess fails open to the full fleet without ever reporting that it guessed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
blove
added a commit
that referenced
this pull request
Sep 1, 2026
…changes (#939) PR #932 changed three files under apps/website/src and ran 41 `Cockpit — e2e` lanes. Two independent scoping defects stacked up. 1. apps/cockpit carried `scope:cockpit-e2e`. The cockpit-e2e matrix dispatches `nx e2e` for the standalone Angular cap apps under cockpit/**; none of the 40 caps depends on the apps/cockpit Next.js shell, and no workflow runs the shell's own `e2e` target. The tag could never select real work — only over-select. And it did: apps/cockpit statically depends on apps/website, so a website-only PR made the shell nx-affected and flipped cockpit_e2e true. 2. cockpit-matrix matched affected projects on `cap.angular` only. A cap is two unlinked nx projects (Angular app + python backend), so a python-only cap change attributed nothing, which main() reads as "nx found no cap" and answers with the full fleet — 40 lanes to cover one cap. Measured on this checkout, before → after: website-only (PR #932 base..head) 41 lanes → 0 (job gate is now false) python-only cap change 40 lanes → 1 (the cap that changed) libs/chat change 40 lanes → 40 (unchanged; no coverage lost) The python sibling's nx name is read from its own project.json rather than derived from the path, because a wrong guess fails open to the full fleet without ever reporting that it guessed. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
blove
added a commit
that referenced
this pull request
Sep 1, 2026
…fects Polish pass over the /docs single-pane reading experience, following the footer removal in #932. Three real defects, each measured rather than inferred, plus the parity gap on the one route that wore no chrome. --nav-h was wrong by 15px from 768px to 1023px. The nav has three heights, not two: padding steps at md (768) but the tall `hidden lg:flex` link row only appears at lg (1024), leaving a 66px nav in between. The variable jumped straight to 81px at md, so every offset in that band overshot — dead space above the docs column, and the mobile drawer (top: nav-h - 1px) hanging 14px below the nav it attaches to. This is the nav-height coupling the migration comment in pages.css deferred; it lived in chrome.css, not in the docs shell, and it is site-wide. The article's `overflow-x-hidden` is removed rather than relocated. It was redundant — global.css already clips the body — and it was the very mistake that rule's own comment warns about: `overflow-x: hidden` computes `overflow-y: auto`, so it made every docs article a scroll container. All 123 docs URLs were swept at 375px with it removed; none overflow. The breadcrumb/page-header block now shares the article's md:max-w-3xl measure, which the article and the prev/next rail already used. It had stretched to the full content width, floating PageActions ~500px right of its column (1272px against 768px at 1920). /docs/choosing-an-adapter gains the TOC rail. It carries as many headings as any library page but had no rail. It stays library-neutral, so it takes no breadcrumb or page header — both are keyed to a library it deliberately has not picked. Tests: e2e/nav-height.spec.ts pins --nav-h to the rendered nav at all six breakpoint edges (jsdom cannot measure layout, so a real browser is the only place these can be compared). e2e/docs-shell.spec.ts covers the TOC rail, which had no tests at all, and the shared column edge. The existing horizontal-overflow guard in website.spec.ts was vacuous: it measured documentElement.scrollWidth, which the global body clip pins to the viewport, so its 24 assertions could never fail. It now measures whether content escapes its own column, exempting content inside its own horizontal scroller. Every new and rewritten guard was mutation-tested against the defect it describes. Verified: 447 unit tests pass (unchanged), 72 e2e pass (59 pre-existing + 13 new), lint 0 errors, production build succeeds. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
blove
added a commit
that referenced
this pull request
Sep 1, 2026
…fects (#942) Polish pass over the /docs single-pane reading experience, following the footer removal in #932. Three real defects, each measured rather than inferred, plus the parity gap on the one route that wore no chrome. --nav-h was wrong by 15px from 768px to 1023px. The nav has three heights, not two: padding steps at md (768) but the tall `hidden lg:flex` link row only appears at lg (1024), leaving a 66px nav in between. The variable jumped straight to 81px at md, so every offset in that band overshot — dead space above the docs column, and the mobile drawer (top: nav-h - 1px) hanging 14px below the nav it attaches to. This is the nav-height coupling the migration comment in pages.css deferred; it lived in chrome.css, not in the docs shell, and it is site-wide. The article's `overflow-x-hidden` is removed rather than relocated. It was redundant — global.css already clips the body — and it was the very mistake that rule's own comment warns about: `overflow-x: hidden` computes `overflow-y: auto`, so it made every docs article a scroll container. All 123 docs URLs were swept at 375px with it removed; none overflow. The breadcrumb/page-header block now shares the article's md:max-w-3xl measure, which the article and the prev/next rail already used. It had stretched to the full content width, floating PageActions ~500px right of its column (1272px against 768px at 1920). /docs/choosing-an-adapter gains the TOC rail. It carries as many headings as any library page but had no rail. It stays library-neutral, so it takes no breadcrumb or page header — both are keyed to a library it deliberately has not picked. Tests: e2e/nav-height.spec.ts pins --nav-h to the rendered nav at all six breakpoint edges (jsdom cannot measure layout, so a real browser is the only place these can be compared). e2e/docs-shell.spec.ts covers the TOC rail, which had no tests at all, and the shared column edge. The existing horizontal-overflow guard in website.spec.ts was vacuous: it measured documentElement.scrollWidth, which the global body clip pins to the viewport, so its 24 assertions could never fail. It now measures whether content escapes its own column, exempting content inside its own horizontal scroller. Every new and rewritten guard was mutation-tested against the defect it describes. Verified: 447 unit tests pass (unchanged), 72 e2e pass (59 pre-existing + 13 new), lint 0 errors, production build succeeds. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
blove
added a commit
that referenced
this pull request
Sep 2, 2026
`examples-ag-ui-e2e` had no `if:` at all. It ran on every push and every pull request — a Playwright suite with a 35-minute timeout, executing on docs-only and website-only PRs. On #932 (three files under apps/website/src) it ran to completion for nothing. It was also absent from `required-pr-checks`, so an ag-ui e2e failure never blocked a merge. Both halves are fixed here deliberately: gating it without requiring it would leave a suite that is skipped often and ignored when it fails. The plumbing was half-built rather than missing. examples/ag-ui/project.json and examples/ag-ui/angular/project.json already carried `scope:examples-ag-ui`, but `examples_ag_ui` was never added to SCOPE_KEYS, so classifyFromAffected read the tag and discarded it — there was no output for the job to gate on. Also tags examples/ag-ui/python, which had no tags at all. That is the backend the e2e job `uv sync`s and drives the Angular app against, so leaving it untagged would have made a python-only change silently skip the suite — buying speed by dropping coverage. examples/chat/python already carries its `scope:examples-chat` tag the same way. Verified against real commits: website-only #932 base..head → false; an ag-ui angular change → true; an isolated python-only change → true, with examples_chat and website both false. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
blove
added a commit
that referenced
this pull request
Sep 2, 2026
) `examples-ag-ui-e2e` had no `if:` at all. It ran on every push and every pull request — a Playwright suite with a 35-minute timeout, executing on docs-only and website-only PRs. On #932 (three files under apps/website/src) it ran to completion for nothing. It was also absent from `required-pr-checks`, so an ag-ui e2e failure never blocked a merge. Both halves are fixed here deliberately: gating it without requiring it would leave a suite that is skipped often and ignored when it fails. The plumbing was half-built rather than missing. examples/ag-ui/project.json and examples/ag-ui/angular/project.json already carried `scope:examples-ag-ui`, but `examples_ag_ui` was never added to SCOPE_KEYS, so classifyFromAffected read the tag and discarded it — there was no output for the job to gate on. Also tags examples/ag-ui/python, which had no tags at all. That is the backend the e2e job `uv sync`s and drives the Angular app against, so leaving it untagged would have made a python-only change silently skip the suite — buying speed by dropping coverage. examples/chat/python already carries its `scope:examples-chat` tag the same way. Verified against real commits: website-only #932 base..head → false; an ag-ui angular change → true; an isolated python-only change → true, with examples_chat and website both false. 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.
Why
Every
/docsroute now wears the sidebar control plane (#920, #921, #923). A marketing footer bolted under the article column breaks that single-pane reading experience — you scroll past prev/next into a newsletter form and a link farm.What
The footer is mounted once in the root layout, so it gets every route unless something opts out.
SiteFooteris that gate: it returnsnullon/docsand/docs/*, and renders<Footer />everywhere else. Nothing else moves — no route-group restructuring, no CSS hiding, the node is genuinely absent from the tree.Articles now end at
DocsPrevNextwith 48px of air; the docs index ends at the ⌘K search block with the same 48px. Themt-24that separated the footer lived on the footer itself, so it left with it — no dangling whitespace.Verification
/docsHTML files contain zerofooter-root; every other page still has one. (_global-error.htmldoesn't, which is expected: it replaces the root layout entirely.)/docs,/docs/choosing-an-adapter, and/docs/langgraph/getting-started/quickstartall 0.vitest run447/447 pass. The new spec pins both directions; mutation-tested by stubbing the guard out, which fails exactly the 3 suppression cases, so it isn't passing vacuously.nx lint websiteclean (warnings only, no errors) ·nx build websitesucceeds.🤖 Generated with Claude Code