Skip to content

Release - #2923

Merged
selul merged 17 commits into
masterfrom
development
Jul 22, 2026
Merged

Release#2923
selul merged 17 commits into
masterfrom
development

Conversation

@abaicus

@abaicus abaicus commented Jul 16, 2026

Copy link
Copy Markdown
Contributor
  • Atomic Wind blocks styling is now loaded for any post that renders blocks on a particular page
  • Fixes issue with popup close close button not being clickable under positioned content

Linked issues

This release will close the following issues once merged:

Public changelog

  • Fixed an issue where the close button placed inside a popup could not be clicked when the popup content overlapped it.
  • Fixed an issue where blocks with animations nested inside a parent using a slide or similar animation stayed invisible until the page was scrolled.
  • Fixed an issue on WordPress 7.0 where content inserted from the Design Library was locked as a pattern instead of arriving as fully editable blocks.
  • Fixed an issue where form settings such as the recipient email and messages failed to save when the form used a Cloudflare Turnstile captcha.
  • Introduced block render tracking and late CSS output in the footer for blocks using Atomic Wind not rendered in the main query.

pirate-bot and others added 12 commits July 6, 2026 15:38
…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>
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
@pirate-bot

pirate-bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Bundle Size Diff

Package Old Size New Size Diff
Animations 178.27 KB 178.33 KB 62 B (0.03%)
Blocks 1.65 MB 1.65 MB 0 B (0.00%)
CSS 7.83 KB 7.83 KB 0 B (0.00%)
Dashboard 172.49 KB 172.49 KB 0 B (0.00%)
Onboarding 68.14 KB 68.14 KB 0 B (0.00%)
Export Import 4.73 KB 4.73 KB 0 B (0.00%)
Pro 439.82 KB 439.82 KB 0 B (0.00%)

@pirate-bot

pirate-bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Plugin build for 001d59b is ready 🛎️!

@pirate-bot

pirate-bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

E2E Tests

Playwright Test Status: See serial and parallel matrix jobs

Performance Results serverResponse: {"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}

lucadobrescu and others added 2 commits July 20, 2026 16:40
Fix: Design Library inserts lock as patterns instead of editable blocks in WP 7.0
Copilot AI review requested due to automatic review settings July 21, 2026 08:10
Fix: nested animated block stays hidden until scroll inside a transform-animated parent

Copilot AI 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.

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.

Comment on lines +459 to +467
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 );
Comment on lines +600 to +602
const blocks = stripPatternAttribution(
resolvePatternBlocks(parse(accentContent(pattern, accent)), allPatterns),
).filter(
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 21, 2026 08:20
@selul

selul commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Public changelog

Copilot AI 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.

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_footer after WordPress has already run wp_print_styles in 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/pattern block left by the resolver, but resolvePatternBlocks() 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>
Copilot AI review requested due to automatic review settings July 21, 2026 10:19

Copilot AI 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.

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_footer callback are not emitted automatically: WordPress' footer printer flushes scripts, not WP_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 any core/pattern block 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-action invocation; 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.

@selul
selul merged commit 04cec85 into master Jul 22, 2026
7 checks passed
@pirate-bot

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 3.2.1 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

@pirate-bot pirate-bot added the released Indicate that an issue has been resolved and released in a particular version of the product. label Jul 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

released Indicate that an issue has been resolved and released in a particular version of the product.

Projects

None yet

6 participants