Skip to content

refactor(website): drop the marketing footer from the docs tree - #932

Merged
blove merged 2 commits into
mainfrom
blove/docs-footer-removal-2ca5e3
Sep 1, 2026
Merged

refactor(website): drop the marketing footer from the docs tree#932
blove merged 2 commits into
mainfrom
blove/docs-footer-removal-2ca5e3

Conversation

@blove

@blove blove commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Why

Every /docs route 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. SiteFooter is that gate: it returns null on /docs and /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 DocsPrevNext with 48px of air; the docs index ends at the ⌘K search block with the same 48px. The mt-24 that separated the footer lived on the footer itself, so it left with it — no dangling whitespace.

Verification

  • Prerendered build output — all 122 /docs HTML files contain zero footer-root; every other page still has one. (_global-error.html doesn't, which is expected: it replaces the root layout entirely.)
  • Live dev server — homepage 1 footer; /docs, /docs/choosing-an-adapter, and /docs/langgraph/getting-started/quickstart all 0.
  • Testsvitest run 447/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 website clean (warnings only, no errors) · nx build website succeeds.

🤖 Generated with Claude Code

@vercel

vercel Bot commented Sep 1, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
threadplane Ignored Ignored Preview Sep 1, 2026 5:48pm UTC

Request Review

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated approval: this PR received an intelligent (AI) code review. See the review comments on this PR.

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Claude finished @blove's task in 0s —— View job


I'll analyze this and get back to you.

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
blove force-pushed the blove/docs-footer-removal-2ca5e3 branch from 809a348 to 308c175 Compare September 1, 2026 17:19
@blove
blove enabled auto-merge (squash) September 1, 2026 17:19
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Claude finished @blove's task in 0s —— View job


I'll analyze this and get back to you.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Claude finished @blove's task in 0s —— View job


I'll analyze this and get back to you.

@blove
blove merged commit a8a603f into main Sep 1, 2026
65 checks passed
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>
@blove
blove deleted the blove/docs-footer-removal-2ca5e3 branch September 3, 2026 22:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant