QA pass on v1.0.0-rc1: popup width, block-inspector default, Safari shortcut, dead CSS, status docs - #76
Conversation
EmptyState.Root from @wordpress/ui carries max-width: 320px, narrower than the 380px popup. .wpd-empty centres itself with margin: 0 auto and paints --wpd-surface, so the 30px left over on each side showed --wpd-bg through as a band on "Not a WordPress site" and "Nothing to inspect here" — the only two views that were not full-bleed. Invisible in light mode, where both tokens resolve to #fff, and visible in dark, where they are #121315 against #1c1f22.
loadBlockInspectorPref read only wp_preferences_v1[origin], so a value set in the _global namespace never reached the page. loadAdminBarPref, directly above it, already implements the documented precedence — per-origin choice first, then the options-page default — and this brings the block inspector in line with it. The popup's usePrefs merges _global for every key, so the two disagreed: its Highlight Blocks toggle would read on while the page never outlined anything.
commands.getAll() returns the binding already formatted for the platform on Chrome, but Safari returns the raw "Alt+Shift+E" spelling on macOS, so the popup showed a Windows-style shortcut on a Mac. Normalise the value the API returns rather than falling back to the static suggested-key hint, so a binding the user customised is still shown, just in the notation macOS uses. Splitting on "+" instead of substring-replacing avoids mangling "MacCtrl" into "Mac^", and leaves a value that is already glyphs untouched, since it has no "+" to split on. IS_MAC moves to module scope: it is constant for the life of the popup process, and reading it inside the effect would otherwise make it a dependency.
.wpd-section__label, .wpd-siteinfo__row-tag (and its dark-mode contrast override), and the .wpd-info-row block are not rendered by any component. Verified against every JS, HTML and SCSS file in the tree, and by rendering all eight popup states and counting live elements — zero matches for each. .wpd-info-row__link stays: it is still rendered, though only inside .wpd-toggle-hint, so its BEM block no longer exists. Renaming it is a refactor rather than a removal and is left alone here.
README's Status section still described v0.10.x as current and the v0.11.x store-readiness phase in the future tense, on the front page of a repo whose manifest and package version both read 1.0.0 and whose latest tag is v1.0.0-rc1. ROADMAP carried the same drift: v0.11.x sat at "shipping" after v0.11.2 went out, and v1.0 was still gated on both store-readiness phases when only the Safari one remains.
jakemgold
left a comment
There was a problem hiding this comment.
Reviewed with a full local verification pass: clean rebuild reproduces both committed bundles byte for byte, Safari mirror has zero drift, 282 test assertions pass, and each of the five fixes was independently verified (including a hunt for dynamically composed uses of the removed CSS classes — none exist). The precedence fix correctly mirrors loadAdminBarPref including the explicit-false guard, and the glyph conversion is display-only and correct for the shipped binding. Exceptionally well-documented QA pass; the A/B verification notes made review straightforward. A small follow-up lands next with a regression test for the new precedence path and a ROADMAP touch-up for store states not visible outside the maintainer dashboards.
) Lands the two follow-ups from the #76 review, plus one piece of local-tooling hygiene. ## Regression test for the precedence fix #76's change to `loadBlockInspectorPref` shipped with no coverage; the review verified empirically that reintroducing the exact bug the new guard prevents (explicit per-origin `false` falling through to a `_global` `true`) passed the whole suite. New content-lifecycle block [41] closes that: it stubs `WPDBlockInspector` on the harness context and asserts all four precedence outcomes through the real content script. The suite is now 286 assertions; the injected-regression check fails as intended with the new block in place. ## ROADMAP accuracy Store states an external contributor cannot see from the repo: - v0.11.x status now reads "readiness complete; CWS submission approved, publication pending" — the unlisted Chrome Web Store submission is approved but has not been published, so "shipped" overstated it. - The Safari row moves the App Store Connect record, listing assets, and the submitted 1.0.0 build into Done, with App Review outcome as the remaining gate; status is now "in review". The store-readiness checklist ticks the bundle-identifier rename (#72) and the publisher account to match. ## eslint ignore for build/ `build/` (gitignored since #75) holds the App Store archive and exported installer. The archived `.app` contains copies of the shipped bundles, so a local archive breaks `npm run lint` with ~175 errors on files that are not lintable source. Added to the eslint ignores alongside `safari-build/`. No runtime changes; `dist/` untouched. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
The Status section still named v1.0.0-rc1 (written in #76 before rc2 existed) and linked no release. Visitors and testers landing on the repo front page had no direct path to the build they should actually test, and the GitHub "Latest" badge compounds it by pointing at v0.11.2. Now the section links the current candidate, tells testers to start there, and explains the Latest badge in one sentence. The companion change is already live outside the repo: the v0.11.2 release notes carry a pointer to rc2 at the top, so both places a "latest release" seeker can land now route forward. Docs only; no runtime changes. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Summary
A QA revalidation pass over the
v1.0.0-rc1release candidate, run against both Chrome and Safari. This PR carries the issues that pass turned up, plus the cleanup that came out of it.None of these are regressions from rc1 — they are pre-existing, and none of them break the extension. They are the kind of thing worth clearing before the 1.0 final rather than after.
There are no tracker issues for these, so they are numbered locally and referenced by that number below.
1. Empty-state views did not span the popup width
EmptyState.Rootfrom@wordpress/uicarriesmax-width: 320px, narrower than the 380px popup..wpd-emptycentres itself withmargin: 0 autoand paints--wpd-surface, so the 30px left over on each side showed--wpd-bgthrough as a band. It affected "Not a WordPress site" and "Nothing to inspect here" — the only two views that were not full-bleed.Invisible in light mode, where both tokens resolve to
#fff. Visible in dark, where they are#121315against#1c1f22.Measured in the real popup, before → after:
2. Block inspector ignored the options-page default
loadBlockInspectorPrefread onlywp_preferences_v1[origin], so a value set in the_globalnamespace never reached the page.loadAdminBarPref, directly above it, already implements the documented precedence — per-origin choice first, then the options-page default.The popup's
usePrefsmerges_globalfor every key, so the two disagreed: the Highlight Blocks toggle would read on while the page never outlined anything.Verified by setting only
_global.blockInspectorEnabledand loading a page with blocks:3. Edit shortcut showed Windows notation on macOS Safari
commands.getAll()returns the binding already formatted for the platform on Chrome, but Safari returns the rawAlt+Shift+Espelling on macOS, so the popup showed a Windows-style shortcut on a Mac.This normalises what the API returns rather than falling back to the static suggested-key hint, so a binding the user customised is still shown, just in the notation macOS uses. Splitting on
+instead of substring-replacing avoids manglingMacCtrlintoMac^, and leaves an already-glyphed value untouched, since it has no+to split on:4. Three unused CSS rules
.wpd-section__label,.wpd-siteinfo__row-tag(and its dark-mode contrast override), and the.wpd-info-rowblock are not rendered by any component. Verified against every JS, HTML and SCSS file in the tree, and by rendering all eight popup states and counting live elements — zero matches for each..wpd-info-row__linkstays: it is still rendered, though only inside.wpd-toggle-hint, so its BEM block no longer exists. Renaming it is a refactor rather than a removal, so it is left alone here.5. Status copy still described v0.10.x
README's Status section described v0.10.x as current and the v0.11.x store-readiness phase in the future tense, on the front page of a repo whose manifest and package version both read1.0.0and whose latest tag isv1.0.0-rc1.ROADMAPcarried the same drift: v0.11.x sat at "shipping" after v0.11.2 went out, and v1.0 was still gated on both store-readiness phases when only the Safari one remains.Testing
npm run lintclean (0 problems) ·npm test282 assertions, 0 failures · production build byte-reproducible · SafariResources/mirrored vianpm run build:safari, zero drift ·npm run package:chromeintegrity gate passes (22 files).Chrome — loaded unpacked and driven over the DevTools Protocol on a throwaway profile:
Safari — Xcode project rebuilds (
BUILD SUCCEEDED), all 16 shipping files byte-identical in the built.appex, and all three fixes confirmed present in the bundle. Behavioural checks against the running extension — admin-bar hide, wp-admin exclusion, per-origin pref isolation, andearly.jsbeating first paint — all pass.A rule-level diff of the compiled
dist/popup.cssconfirms the stylesheet changed in exactly the intended ways: four rules removed,.wpd-emptygaining onlymax-width: none, and nothing else.background.jsis untouched by this branch.