Skip to content

AdminPage: stick JetpackFooter to the bottom of the viewport#49201

Closed
angelablake wants to merge 1 commit into
trunkfrom
update/admin-page-sticky-footer
Closed

AdminPage: stick JetpackFooter to the bottom of the viewport#49201
angelablake wants to merge 1 commit into
trunkfrom
update/admin-page-sticky-footer

Conversation

@angelablake
Copy link
Copy Markdown
Contributor

@angelablake angelablake commented May 27, 2026

Part 1 of a stacked PR series extracted from #48154 (Jetpack SEO: introduce new SEO product).

This is the smallest, foundational piece: make the shared AdminPage component a flex column with min-height: calc(100vh - --wp-admin--admin-bar--height), and give .jetpack-footer margin-top: auto. Every product using the shared admin shell gets a consistent sticky-footer layout instead of the footer floating up against short content.

Originally authored by @keoshi in #48154; extracted here so it can land independently and unblock the rest of the SEO product split.

Proposed changes

  • .admin-page becomes a flex column with a viewport-based min-height, fitting wp-admin's content area.
  • :global(.admin-ui-page) flex-grows inside that column.
  • :global(.jetpack-footer) claims any leftover vertical space via margin-top: auto.

Related product discussion/links

Screenshots

Before/after screenshots showing the footer position on a short Jetpack admin page (e.g. My Jetpack landing) — to be added.

Testing instructions

The change affects every Jetpack admin page that uses the shared AdminPage shell (My Jetpack, the main Jetpack settings page, Boost, Protect, Search, Backup, Stats, etc.).

Verify the footer sticks to the bottom on short pages:

  • Visit wp-admin/admin.php?page=my-jetpack. With short content, the JetpackFooter should sit at the bottom of the viewport, not float up against the content with empty space underneath.

Verify the footer appears normally on long pages:

  • Visit wp-admin/admin.php?page=jetpack#/settings and expand all the cards. The footer should appear at the end of the content with normal scrolling — no clipping, no overlap with content above.

Verify no visual regression on:

  • The header layout (JetpackLogo position, tabs alignment, sandbox-domain badge on dev sites)
  • Any page using AdminPage that already rendered correctly (Boost, Protect, Search, Backup, Stats dashboards)

Does this pull request change what data or activity we track or use?

No.

Make `.admin-page` a flex column with `min-height: calc(100vh - --wp-admin--admin-bar--height)` and give `.jetpack-footer` `margin-top: auto`, so every product using the shared `AdminPage` gets a consistent sticky-footer layout instead of having the footer float up against short content.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 27, 2026

Are you an Automattician? Please test your changes on all WordPress.com environments to help mitigate accidental explosions.

  • To test on WoA, go to the Plugins menu on a WoA dev site. Click on the "Upload" button and follow the upgrade flow to be able to upload, install, and activate the Jetpack Beta plugin. Once the plugin is active, go to Jetpack > Jetpack Beta, select your plugin (Jetpack or WordPress.com Site Helper), and enable the update/admin-page-sticky-footer branch.
  • To test on Simple, run the following command on your sandbox:
bin/jetpack-downloader test jetpack update/admin-page-sticky-footer
bin/jetpack-downloader test jetpack-mu-wpcom-plugin update/admin-page-sticky-footer

Interested in more tips and information?

  • In your local development environment, use the jetpack rsync command to sync your changes to a WoA dev blog.
  • Read more about our development workflow here: PCYsg-eg0-p2
  • Figure out when your changes will be shipped to customers here: PCYsg-eg5-p2

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 27, 2026

Thank you for your PR!

When contributing to Jetpack, we have a few suggestions that can help us test and review your patch:

  • ✅ Include a description of your PR changes.
  • ✅ Add a "[Status]" label (In Progress, Needs Review, ...).
  • ✅ Add testing instructions.
  • ✅ Specify whether this PR includes any changes to data or privacy.
  • ✅ Add changelog entries to affected projects

This comment will be updated as you work on your PR and make changes. If you think that some of those checks are not needed for your PR, please explain why you think so. Thanks for cooperation 🤖


Follow this PR Review Process:

  1. Ensure all required checks appearing at the bottom of this PR are passing.
  2. Make sure to test your changes on all platforms that it applies to. You're responsible for the quality of the code you ship.
  3. You can use GitHub's Reviewers functionality to request a review.
  4. When it's reviewed and merged, you will be pinged in Slack to deploy the changes to WordPress.com simple once the build is done.

If you have questions about anything, reach out in #jetpack-developers for guidance!

@github-actions github-actions Bot added the [Status] Needs Author Reply We need more details from you. This label will be auto-added until the PR meets all requirements. label May 27, 2026
@jp-launch-control
Copy link
Copy Markdown

jp-launch-control Bot commented May 27, 2026

Code Coverage Summary

This PR did not change code coverage!

That could be good or bad, depending on the situation. Everything covered before, and still is? Great! Nothing was covered before? Not so great. 🤷

Full summary · PHP report · JS report

@simison simison requested a review from a team May 28, 2026 12:00
@simison
Copy link
Copy Markdown
Member

simison commented May 28, 2026

Pretty sure there's a way to do this already without adding all these styles in the admin page component. 🤔 @CGastrell likely knows more. 👋

// comprehend old wp-admin floating containers, such as Hello Dolly
// (`clear: both`). Also make the Page a flex column that fills the
// wp-admin content area so `JetpackFooter` can stick to the bottom.
:global(.admin-ui-page) {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Using the internal CSS selector from admin-ui will break in future and cannot be used as a stable API.

// root, and the footer claims any leftover space via `margin-top: auto`.
display: flex;
flex-direction: column;
min-height: calc(100vh - var(--wp-admin--admin-bar--height, 32px));
Copy link
Copy Markdown
Member

@simison simison May 28, 2026

Choose a reason for hiding this comment

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

Likely works with variable, but noting that the default will be 48px when on mobile.

@CGastrell
Copy link
Copy Markdown
Contributor

Thanks for splitting this out, @angelablake ! Before this lands I want to flag two things: it overlaps with layout infrastructure we already have, and it couples the shared <AdminPage> to an admin-ui internal class we deliberately migrated away from.

The :global(.admin-ui-page) selector couples us to an admin-ui internal

This hunk is a faithful extraction of @keoshi's original change in #48154, but #48154 was branched off an older trunk. Back then the shared AdminPage module did style :global(.admin-ui-page) (the original diff in #48154 moves and extends that existing block). Since then trunk migrated every one of those rules to :global(.jp-admin-page__page) (#49006, #49018, #49080, #49101), on purpose: jp-admin-page__page is the className we pass to admin-ui's <Page>, so it's the one hook on that node we fully control. admin-ui's own page class is an internal CSS-module name, and it is not stable across builds — which is the whole reason for that migration.

Concretely, "the same" admin-ui 2.1.0 emits different classes depending on which build you run:

  • The standalone @wordpress/admin-ui@2.1.0 npm build (and upstream Gutenberg src, which moved Page to CSS Modules in #77088) renders clsx( styles.page, className ) where styles.page is a hashed name like _956b…__page — no literal admin-ui-page at all.
  • The WP core bundle in our current Docker image (WP 6.9.4) renders clsx( "admin-ui-page", className ) — a literal admin-ui-page.

Because Jetpack externalizes @wordpress/admin-ui at runtime (it resolves to window.wp.adminUi, i.e. whatever WP core ships), the class that actually lands in the DOM depends on the visitor's WP version. So :global(.admin-ui-page) happens to match on a current WP today, but it's betting on an admin-ui internal that upstream already hashes and that we don't control — exactly the coupling the .jp-admin-page__page convention exists to avoid. (The clear: both added here is also already present on .jp-admin-page__page.)

We already have this layout — jetpack-admin-page-layout

projects/js-packages/base-styles/admin-page-layout.scss already pins JetpackFooter to the bottom of the viewport, using the stable hooks: .jp-admin-page.jp-admin-page__page (flex: 1 1 auto) → a growing middle section that pushes .jetpack-footer (flex-shrink: 0) to the bottom. It also handles the wp-admin chrome a bare min-height: 100vh can't: hiding #wpfooter and #screen-meta-links, sidebar widths across the auto-fold / mobile / nav-unification breakpoints, and internal scroll containment. It's already opted into by Boost, Protect, Search, Backup, My Jetpack, VideoPress, Publicize, Newsletter, Activity Log, Podcast, Scan, and the Jetpack plugin — i.e. essentially every page this PR's testing instructions name.

Suggested path

To unblock the SEO series now (smallest change): drop the style.module.scss edits from this PR and have the SEO package opt into the mixin, the same way every other product does. The SEO shell uses the shared <AdminPage> with breadcrumbs/title (the admin-ui Page branch), so the -wp-build variant is the right one (it adds the breadcrumb resets):

@use "@automattic/jetpack-base-styles/admin-page-layout" as *;

:global {
  body.jetpack_page_jetpack-seo { // adjust to the SEO page's real body class
    @include jetpack-admin-page-layout-wp-build;
  }
}

That gives SEO the sticky footer (plus the rest of the chrome) on the stable selectors, with zero changes to the shared component.

If the real goal is to make sticky-footer the default for every AdminPage (which is what doing this in the shared module implies), that's a reasonable thing to want — but it should be a deliberate, separate change: implement it on .jp-admin-page__page / .jetpack-footer (not .admin-ui-page), and reconcile with the ~12 packages that already @include jetpack-admin-page-layout so they don't end up with a doubled flex chain or a double-counted min-height. Happy to pair on that if it's the direction you want.

One more heads-up

The SEO package's own _inc/style.module.scss in #48154 also targets :global(.admin-ui-page) / .admin-ui-page__content / .admin-ui-page__header. Those carry the same fragility — they lean on admin-ui's internal class, which is hashed in the standalone build and only literal in some WP core bundles, so they'll silently stop matching when that internal changes. Worth auditing in whichever stacked PR carries that file.

@angelablake
Copy link
Copy Markdown
Contributor Author

Thanks @CGastrell ! I'll take your suggestion.

angelablake pushed a commit that referenced this pull request May 28, 2026
Drops the SEO admin page's reliance on admin-ui's internal `.admin-ui-page*`
classes — which are hashed in the standalone `@wordpress/admin-ui` build and
only literal in some WP core bundles — in favor of the stable
`.jp-admin-page__page` hook that `<AdminPage>` forwards onto admin-ui's
`<Page>` and the shared `jetpack-admin-page-layout-wp-build` mixin from
`@automattic/jetpack-base-styles`.

This also delivers the sticky `JetpackFooter` behavior previously proposed
as a one-off in `<AdminPage>`'s own SCSS — the shared mixin already pins
the footer to the bottom of the viewport via the stable selector chain,
which is the same path Newsletter / Protect / Backup / Search / VideoPress
take. See CGastrell's review on #49201.

Per-page opt-in lives in a new non-module `_inc/admin-page-layout.scss`
(matching the Newsletter pattern), so the mixin's body-class scope stays
out of the CSS-modules file.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@angelablake
Copy link
Copy Markdown
Contributor Author

One more thing while I'm here — also addressed CGastrell's "one more heads-up" paragraph in the same commit: migrated the .neutralBg targets in projects/packages/seo/_inc/style.module.scss off :global(.admin-ui-page) / :global(.admin-ui-page__content) and onto the stable :global(.jp-admin-page__page) hook. So both the layout opt-in and the SEO package's own admin-ui-internal coupling are handled in 19d604e224.

Closing this PR — the work moves into #49203.

(Posted via Claude on Angela's behalf.)

@github-actions github-actions Bot removed [Status] In Progress [Status] Needs Author Reply We need more details from you. This label will be auto-added until the PR meets all requirements. labels May 28, 2026
dhasilva pushed a commit that referenced this pull request Jun 2, 2026
Drops the SEO admin page's reliance on admin-ui's internal `.admin-ui-page*`
classes — which are hashed in the standalone `@wordpress/admin-ui` build and
only literal in some WP core bundles — in favor of the stable
`.jp-admin-page__page` hook that `<AdminPage>` forwards onto admin-ui's
`<Page>` and the shared `jetpack-admin-page-layout-wp-build` mixin from
`@automattic/jetpack-base-styles`.

This also delivers the sticky `JetpackFooter` behavior previously proposed
as a one-off in `<AdminPage>`'s own SCSS — the shared mixin already pins
the footer to the bottom of the viewport via the stable selector chain,
which is the same path Newsletter / Protect / Backup / Search / VideoPress
take. See CGastrell's review on #49201.

Per-page opt-in lives in a new non-module `_inc/admin-page-layout.scss`
(matching the Newsletter pattern), so the mixin's body-class scope stays
out of the CSS-modules file.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
dhasilva added a commit that referenced this pull request Jun 2, 2026
#49203)

* Components: add BoundedLayout layout primitive

Add a shared `BoundedLayout` wrapper to `@automattic/jetpack-components` with two MSD-aligned presets — `compact` (660px) and `wide` (1344px) — so products can keep visual alignment across Overview / Settings / Dashboard screens.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Jetpack SEO: introduce package foundation and Site visibility Overview

Adds a new `automattic/jetpack-seo` package that mounts a React admin at
`wp-admin/admin.php?page=jetpack-seo`. Menu item gates on the `seo-tools`
module being active.

This PR is the first of a staged series introducing the Jetpack SEO product;
it ships only the package scaffold and the Overview screen's Site visibility
card. Follow-up PRs add the Settings, Per-post SEO (Content), and AI tabs,
along with their REST writers and respective Overview cards.

New package
- PHP: `Initializer` (admin menu registration + asset enqueue, gated on
  `seo-tools`), `REST_Controller` exposing `/jetpack-seo/v1/overview` only.
- React SPA: `createHashRouter` + `RouterProvider`, `AdminPage` from
  `@automattic/jetpack-components`, TanStack Query for server state.
- Single screen: Overview with a Site visibility card (search-engines
  allowed, sitemap active/inactive, SEO tools active/inactive). All other
  Overview cards land with the PRs that own their underlying features.

Jetpack plugin wiring
- `class.jetpack.php`: load the new package in `late_initialization()`.
- `composer.json`: require `automattic/jetpack-seo`.

Co-Authored-By: Angela Blake <angela.blake@a8c.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* SEO foundation: fix typecheck, project structure, and changelog format

CI feedback from the initial push surfaced four classes of issues:

- Typecheck failures from the partial scope:
  - Remove the unused "Manage settings" button from SiteVisibilityCard
    (referenced the trimmed JetpackSeoRoutes.Settings constant). The button
    returns in PR #3 when the Settings tab lands as its deep-link target.
  - Update useSimpleMutation onSuccess to TanStack Query v5's 4-arg form
    (data, variables, onMutateResult, context) — v5 added onMutateResult
    between variables and context.

- Project-structure expectations for a new package:
  - Add .phan/config.php so static analysis recognises the package's PHP.
  - Add changelog/.gitkeep so the changelog directory survives release.

- Changelog format:
  - Reset CHANGELOG.md to the keep-a-changelog header only (no pre-release
    `[0.1.0-alpha] - unreleased` block — pending entries live in changelog/).
  - Change the Jetpack-plugin changelog Type from `added` to `enhancement`
    (plugin/jetpack uses major|enhancement|compat|bugfix|other, not the
    keep-a-changelog vocabulary the packages use).

Co-Authored-By: Filipe Varela <filipe@automattic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* SEO foundation: address Phan + scope-leftover issues

CI surfaced two more issues on the foundation PR:

- Initializer still called `LLMS_Txt::init()`, `AI_Crawlers::init()`, and
  `Schema_Builder::init()` — those classes live in later PRs (#4 and #6).
  Remove the calls; they return when their classes land.

- Initializer registered `maybe_redirect_legacy_surfaces` on `admin_init`,
  which would have 301-redirected `?page=jetpack&tab=seo|traffic` to the
  new admin page. But the legacy Traffic page is still live on trunk in
  this PR's window, so redirecting now strands users mid-task. Remove the
  hook + the method entirely; the redirect lands in PR #5b alongside the
  discoverability banner and the actual deletion of the legacy surfaces.

- Phan can't see `Jetpack_SEO_Utils` (lives in plugins/jetpack, not this
  package). The runtime-safety `class_exists` checks already guard the
  calls; add `@phan-suppress-next-line PhanUndeclaredClassMethod` so
  static analysis stops flagging them.

Co-Authored-By: Filipe Varela <filipe@automattic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* SEO foundation: opt into shared admin-page-layout mixin

Drops the SEO admin page's reliance on admin-ui's internal `.admin-ui-page*`
classes — which are hashed in the standalone `@wordpress/admin-ui` build and
only literal in some WP core bundles — in favor of the stable
`.jp-admin-page__page` hook that `<AdminPage>` forwards onto admin-ui's
`<Page>` and the shared `jetpack-admin-page-layout-wp-build` mixin from
`@automattic/jetpack-base-styles`.

This also delivers the sticky `JetpackFooter` behavior previously proposed
as a one-off in `<AdminPage>`'s own SCSS — the shared mixin already pins
the footer to the bottom of the viewport via the stable selector chain,
which is the same path Newsletter / Protect / Backup / Search / VideoPress
take. See CGastrell's review on #49201.

Per-page opt-in lives in a new non-module `_inc/admin-page-layout.scss`
(matching the Newsletter pattern), so the mixin's body-class scope stays
out of the CSS-modules file.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* SEO foundation: ship PHPUnit + jest configs across the CI matrix

The first PR push only included `phpunit.11.xml.dist`, so CI's PHP test
matrix (PHP 7.4–8.5) failed at config-read because PHPUnit 8/9/12 had no
config to select. Adds `phpunit.8.xml.dist`, `phpunit.9.xml.dist`, and
`phpunit.12.xml.dist`, mirrored verbatim from `packages/ip`'s set.

Adds a `test` script + a `tests/jest.config.js` so the JS-tests CI job
doesn't error with `Missing script: test` either. Uses `--passWithNoTests`
so the package can ship before it grows JS tests, and inherits the shared
`jetpack-js-tools/jest/config.base.js` for when it does (asset stub for
`.scss` imports, ts/jsx transform, JSDOM environment).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* SEO foundation: add .gitattributes so build/ ships with the package

Without `.gitattributes`, the production-publish pipeline that vendors
`automattic/jetpack-seo` into the Jetpack plugin's `jetpack_vendor/`
respects `.gitignore` and drops the webpack-built `build/` directory.
The PHP source files come along (they're not gitignored), so the SEO
admin menu item appears and the mount `<div id="jetpack-seo-root">`
renders — but the enqueued `build/index.js` URL 404s, leaving the
admin page visually blank.

Mirrors Newsletter's `.gitattributes` (the canonical wp-build package):
- `/build/**  production-include` overrides gitignore for build output
- `*.tsx`/`*.ts`/`*.scss` under `_inc/` and `src/` are
  `production-exclude` since webpack has already compiled them into
  `build/`.

Confirmed against the 404 on
`wp-content/plugins/jetpack-dev/jetpack_vendor/automattic/jetpack-seo/build/index.js`
in JetpackBeta on `sweetly-partial-gazelle.jurassic.ninja`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Jetpack SEO: migrate Overview to the shared data-sync layer

Address review feedback on #49203 — replace hand-rolled data plumbing
with Jetpack's established patterns.

Data layer:
- Register a read-only `overview` data-sync entry (namespace
  `jetpack_seo`) via Data_Sync_Readonly + Schema, bootstrapped onto the
  page with attach_to_plugin() so the app hydrates from
  window.jetpack_seo without a round-trip.
- use-overview -> useDataSync; overview-types -> Zod OverviewSchema;
  providers -> DataSyncProvider.
- Delete class-rest-controller.php, use-simple-query.ts and the unused
  use-simple-mutation.ts; drop the dead jetpackSeoRest bootstrap and the
  now-unused @wordpress/api-fetch and @tanstack/react-query deps.

Module gating:
- Move the seo-tools module check up into Initializer::init() so no
  routes, menu, or assets register when the module is off (matches how
  other Jetpack modules gate), removing the redundant per-method check.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Jetpack SEO: adopt shared components and design tokens on the Overview

Address review feedback on #49203 — replace hand-rolled UI with the
platform's primitives.

- Collapse shell.tsx onto AdminPage (drop the header-actions slot/fill
  context and the background/padding CSS overrides); delete
  header-actions-context.tsx and _inc/style.module.scss.
- Use @wordpress/ui Notice (compound), Stack, and Link in place of
  @wordpress/components Notice/ExternalLink and flexbox CSS.
- Give StatusDot its own style module using @wordpress/theme color
  tokens; tokenize remaining colors and spacing.
- Extract ternary __() labels to module scope so i18n extraction
  survives the production minifier.
- Remove the unused BoundedLayout from @automattic/jetpack-components.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Jetpack SEO: rebuild the admin page on wp-build + script-data

Migrate the SEO foundation page off the custom webpack/React-Router setup
onto @wordpress/build (wp-build), matching the live pattern the other
recently-modernized Jetpack admin pages use (modeled on the Podcast package).

- Build: add the wpPlugin block + wp-build scripts, the routes/index entry
  (stage/route/package.json), and drop webpack.config.js, babel.config.js,
  react-router, and zod.
- Data layer: replace the data-sync Overview wiring with the shared
  script-data layer. wp-build pages load as ES modules, so wp_localize_script
  can't bootstrap them; the server now injects state onto
  window.JetpackScriptData.seo via the jetpack_admin_js_script_data filter
  (Podcast/Newsletter pattern), read synchronously in get-overview.ts.
- PHP: keep the seo-tools module gate and the Admin_Menu top-level menu;
  load build/build.php + register WP_Build_Polyfills and alias the screen id
  on current_screen so wp-build's self-hooked enqueue fires for our slug.
- Styles: convert CSS-module SCSS to plain prefixed SCSS (no wp-build package
  uses CSS modules).
- composer: drop wp-js-data-sync + schema, add wp-build-polyfills.

Verified: dev + production build, tsgo typecheck, php -l, phpcs, eslint, and
i18n string extraction all pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Jetpack SEO: align wp-build to trunk cohort (@wordpress/build 0.14.0)

Sync the branch with trunk and bump @wordpress/build 0.13.0 -> 0.14.0 to
match the current wp-build cohort. The branch had fallen ~99 commits behind
trunk, which had since bumped @wordpress/build; the stale 0.13.0 pin left the
PR-merge lockfile referencing build variants trunk no longer defines, failing
CI's frozen install. Regenerated pnpm-lock.yaml on the merged tree.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Jetpack SEO: refresh plugins/jetpack composer.lock for the SEO dep change

The SEO package's composer.json changed (dropped wp-js-data-sync + schema,
added wp-build-polyfills), so the consuming plugin's lock was stale and failed
CI's "Lock files are up to date" check. Regenerated via
tools/composer-update-monorepo.sh.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Jetpack SEO: fix Overview page padding and status-dot colors

Two CSS regressions from the wp-build rebuild, caught in JN testing:

- Page had no content padding: the layout SCSS included the
  `jetpack-admin-page-layout-wp-build` mixin, which only carries breadcrumb /
  anchor resets — not the content layout. Switch to the plain
  `jetpack-admin-page-layout` mixin (as Scan/Podcast do) and target both the
  top-level and Jetpack-submenu body classes.
- Status dots rendered near-black: the plain `--wpds-color-fg-content-*`
  tokens are the darkest text shades (#2900 / #470000). Use the `-weak`
  variants (#007f30 / #cc1818 / amber), the vivid indicator colors the
  shared StatusIndicator pattern uses.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Jetpack SEO: add content padding to the Overview page

The card sat flush against the header and page sides. `<AdminPage>` renders
its content with `horizontalSpacing={0}` and no `hasPadding`, so only the
header is padded — content padding is the consumer's responsibility (as in
Scan/Podcast). The earlier frontend cleanup removed the old `.paddedContent`
override without replacing it. Wrap the screen in `.jetpack-seo-page-content`
padded at `--wpds-dimension-padding-2xl` (24px) to align with the header.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Jetpack SEO: remove the broken sitemap "View" link from the Overview

The link pointed at home_url('/sitemap.xml'), which 404s: the "active"
signal comes from a placeholder option (jetpack_seo_sitemap_enabled, which
exists nowhere else in Jetpack) rather than the real `sitemaps` module, and
even when the module is active Jetpack generates the sitemap via cron so the
URL isn't live immediately. Drop the link to avoid shipping a dead link;
correct sitemap detection + URL is tracked as a follow-up. The status row
itself is unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Jetpack SEO: address #49203 review feedback (docs + cleanup)

- README: rewrite to match the shipped wp-build + script-data architecture
  (drop HashRouter/react-query/useSimpleQuery, REST API, pnpm run build/watch).
- composer.json: drop unused requires (jetpack-connection/constants/assets);
  keep admin-ui/status/wp-build-polyfills, which the Initializer actually uses.
- admin-page-layout.scss: use the -wp-build layout mixin variant so the code
  matches the changelog claim; it's a no-op superset until a tab adds breadcrumbs.
- Initializer: guard init() with a private static $initialized flag (Podcast
  pattern) so the body can't re-run when seo-tools is off; document the
  pre-wired sitemap_url / front_page_description Overview fields.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Jetpack SEO: regenerate jetpack composer.lock after trimming seo package deps

Follow-up to 8bc377e, which dropped the unused jetpack-connection/
constants/assets requires from the jetpack-seo package. The Jetpack
plugin's composer.lock still recorded the old require set for the
package, so the 'Lock files are up to date' check failed. Regenerated
with `composer update automattic/jetpack-seo`.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Jetpack SEO: gate the package behind the rsm_jetpack_seo feature flag

Gate the entire SEO surface (admin menu, wp-build bundle, script data)
behind the rsm_jetpack_seo filter, default false during roll-out, mirroring
how the Scan package gates itself. Consolidate the package changelog into a
single entry.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* remove product name translations

* Jetpack SEO: address review — drop wpds token fallbacks and fragile card CSS

- Remove hex fallbacks on --wpds-* design tokens to match @wordpress/theme's
  no-token-fallback-values convention (tokens are guaranteed under ThemeProvider).
- Remove the equal-height grid CSS that targeted @wordpress/ui's non-stable
  hashed Card internals; defer until a second Overview card exists.
- Use title="SEO" instead of title={ 'SEO' }.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Jetpack SEO: use logical margin-inline-end on the status dot for RTL

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Filipe Varela <filipe@automattic.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Angela Blake <angela.blake@a8c.com>
Co-authored-by: Angela Blake <angelablake@Angelas-MacBook-Pro.local>
Co-authored-by: Douglas <douglas.henri@automattic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants