Release - #2923
Conversation
…locks
Two failure modes when inserted pattern content carries wp:pattern
references. Registered references: WordPress 7.0 inlines them server-side
but stamps the blocks with metadata.patternName, which its editor locks
into content-only mode ("A block pattern" / "Edit pattern", no style
controls). Missing references: the raw core/pattern block reaches the
canvas and renders as an invisible, uneditable placeholder.
Expand references at insert time with the existing resolvePatternBlocks
helper (also covers pre-7.0 WordPress, which serves references raw), and
strip metadata.patternName from inserted blocks so unsynced Design
Library inserts stay fully editable. Other metadata (bindings, custom
labels) is preserved.
Closes #2854
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The Inside close button header had no z-index, so positioned popup content (e.g. Section columns, position:relative on desktop) painted over it and swallowed clicks. The z-index on the button itself was inert since the button is position:static. Fixes #2863 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…parents On load, elements were measured for viewport visibility one at a time, interleaved with processing that unblocks each element's animation. Unblocking a parent's animation applies its first keyframe transform immediately (animation-fill-mode: both), so nested children measured afterwards appeared displaced by the parent's height and were wrongly parked for scroll-triggered replay, staying invisible until the first scroll. Measure all elements before processing any of them. Fixes #2883 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…for better CSS handling
The main content of a singular page is guaranteed to render, so its cached CSS can load speculatively in the head instead of the footer, removing the flash of unstyled content for the post itself. Hooked layouts and embeds stay on the render-tracked footer path. The head pass records the post in the expected/inlined maps so the footer collector neither duplicates the blob nor re-fetches the meta. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Fix: popup Inside close button unclickable under positioned content
…amic-pages Feat/atomic wind styles on dynamic pages
Bundle Size Diff
|
|
Plugin build for 001d59b is ready 🛎️!
|
E2E TestsPlaywright Test Status: See serial and parallel matrix jobs Performance ResultsserverResponse: {"q25":360.3,"q50":365.35,"q75":393.5,"cnt":10}, firstPaint: {"q25":1342.6,"q50":1425.05,"q75":1494.9,"cnt":10}, domContentLoaded: {"q25":3647.9,"q50":3688.2,"q75":3712.4,"cnt":10}, loaded: {"q25":3650,"q50":3690.2,"q75":3714.3,"cnt":10}, firstContentfulPaint: {"q25":4134.9,"q50":4162.95,"q75":4186.3,"cnt":10}, firstBlock: {"q25":14370.9,"q50":14440,"q75":14502.2,"cnt":10}, type: {"q25":28.97,"q50":31.34,"q75":33.97,"cnt":10}, typeWithoutInspector: {"q25":24.51,"q50":24.85,"q75":26.94,"cnt":10}, typeWithTopToolbar: {"q25":34.41,"q50":36.14,"q75":39.05,"cnt":10}, typeContainer: {"q25":17.15,"q50":18.46,"q75":20.09,"cnt":10}, focus: {"q25":137.6,"q50":143.77,"q75":145.65,"cnt":10}, inserterOpen: {"q25":44.59,"q50":45.21,"q75":47.77,"cnt":10}, inserterSearch: {"q25":18.19,"q50":18.64,"q75":20.32,"cnt":10}, inserterHover: {"q25":5.8,"q50":6.18,"q75":6.43,"cnt":20}, loadPatterns: {"q25":1842.49,"q50":1850.19,"q75":1895.46,"cnt":10}, listViewOpen: {"q25":234.22,"q50":248.56,"q75":259.16,"cnt":10} |
Fix: Design Library inserts lock as patterns instead of editable blocks in WP 7.0
Fix: nested animated block stays hidden until scroll inside a transform-animated parent
There was a problem hiding this comment.
Pull request overview
This release bundles frontend rendering and editor reliability fixes across Atomic Wind, popups, animations, patterns, and forms.
Changes:
- Loads Atomic Wind CSS based on rendered blocks.
- Fixes popup close-button stacking and nested animations.
- Resolves pattern references and supports Turnstile form settings.
Reviewed changes
Copilot reviewed 12 out of 12 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
tests/test-options-settings.php |
Tests captcha schema and sanitization. |
tests/test-atomic-wind-blocks.php |
Tests frontend CSS loading behavior. |
src/blocks/test/e2e/blocks/popup.spec.js |
Tests clickable popup close buttons. |
src/blocks/test/e2e/blocks/form-turnstile.spec.js |
Tests Turnstile option persistence. |
src/blocks/test/e2e/blocks/design-library.spec.js |
Tests pattern-reference expansion. |
src/blocks/test/e2e/blocks/animations.spec.js |
Tests nested animations. |
src/blocks/plugins/patterns-library/library.js |
Resolves pattern references before insertion. |
src/blocks/blocks/popup/style.scss |
Raises the popup header stacking level. |
src/animation/frontend.js |
Pre-measures animated element visibility. |
packages/e2e-tests/mu-plugins/otter-e2e-pattern-fixtures.php |
Adds pattern-reference fixtures. |
inc/plugins/class-options-settings.php |
Registers and sanitizes captcha providers. |
inc/plugins/class-atomic-wind-blocks.php |
Implements render-tracked CSS loading. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| if ( ! empty( $blobs ) ) { | ||
| wp_register_style( 'atomic-wind-tailwind-late', false, [], OTTER_BLOCKS_VERSION ); | ||
| wp_enqueue_style( 'atomic-wind-tailwind-late' ); | ||
| wp_add_inline_style( 'atomic-wind-tailwind-late', implode( "\n", $blobs ) ); | ||
| } | ||
|
|
||
| if ( $needs_generator ) { | ||
| $this->enqueue_generator(); | ||
| } |
| add_filter( 'render_block', array( $this, 'render_animation_attrs' ), 10, 2 ); | ||
| add_filter( 'render_block', array( $this, 'render_state_attrs' ), 10, 2 ); | ||
| add_filter( 'render_block', array( $this, 'track_rendered_blocks' ), 10, 2 ); | ||
| add_action( 'wp_footer', array( $this, 'output_late_css' ), 19 ); |
| const blocks = stripPatternAttribution( | ||
| resolvePatternBlocks(parse(accentContent(pattern, accent)), allPatterns), | ||
| ).filter( |
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Public changelog
|
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 13 out of 13 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (3)
inc/plugins/class-atomic-wind-blocks.php:462
- These styles are enqueued from
wp_footerafter WordPress has already runwp_print_stylesin the head. The standard footer printer only emits scripts, so the cached CSS—and the base reset enqueued during block rendering—never reaches the HTML on archive/embedded-content paths. Explicitly print the late handles here (or emit them through another footer-safe style path); the current tests only inspect queue data and therefore miss this frontend failure.
if ( ! empty( $blobs ) ) {
wp_register_style( 'atomic-wind-tailwind-late', false, [], OTTER_BLOCKS_VERSION );
wp_enqueue_style( 'atomic-wind-tailwind-late' );
wp_add_inline_style( 'atomic-wind-tailwind-late', implode( "\n", $blobs ) );
.github/workflows/plugin-check.yml:1
- This deletes the repository's only WordPress Plugin Check workflow, with no replacement among
.github/workflows, while the PR description only calls out frontend Atomic Wind loading and the popup fix. That removes plugin-repository, security, and general guideline validation from every future PR. Restore the workflow or document and include the replacement validation path in this PR.
src/blocks/plugins/patterns-library/library.js:47 - This normalization preserves any
core/patternblock left by the resolver, butresolvePatternBlocks()returns its input unchanged beyond depth 4 (src/onboarding/utils.js:23-25). Deeply nested or cyclic references can therefore still be inserted in WordPress 7.0 as the locked pattern wrapper this change is intended to eliminate. Drop unresolved pattern blocks recursively after resolution.
const stripPatternAttribution = (blocks) =>
blocks.map((block) => {
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 14 out of 14 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (3)
inc/plugins/class-atomic-wind-blocks.php:462
- Styles enqueued from this
wp_footercallback are not emitted automatically: WordPress' footer printer flushes scripts, notWP_Styles. Consequently, cached CSS (and the base reset enqueued during rendering) for non-singular or late-rendered posts remains only in the queue and never reaches the page. Explicitly print the pending late styles after adding the inline CSS.
if ( ! empty( $blobs ) ) {
wp_register_style( 'atomic-wind-tailwind-late', false, [], OTTER_BLOCKS_VERSION );
wp_enqueue_style( 'atomic-wind-tailwind-late' );
wp_add_inline_style( 'atomic-wind-tailwind-late', implode( "\n", $blobs ) );
src/blocks/plugins/patterns-library/library.js:47
- A cyclic or more-than-five-level nested pattern can still survive this path as
core/pattern:resolvePatternBlocks()returns the unresolved input when its depth guard is reached, and this mapper only removes metadata. That recreates the locked pattern wrapper this change is intended to prevent. Drop anycore/patternblock that remains after resolution.
const stripPatternAttribution = (blocks) =>
blocks.map((block) => {
.github/workflows/plugin-check.yml:1
- Deleting this file removes the repository's only
wordpress/plugin-check-actioninvocation; no replacement workflow exists under.github/workflows. Future pull requests will therefore lose the automated WordPress.org security, general, and plugin-repository validation. Restore this check or move it to a documented replacement before deleting the workflow.
|
🎉 This PR is included in version 3.2.1 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
Linked issues
This release will close the following issues once merged:
captchaProvider is not a valid object property#2919 — Turnstile form settings fail to save withcaptchaProvider is not a valid object propertyPublic changelog