Skip to content

feat(blocks): fork I4 widgets cluster (search, latest-posts) (#412) - #479

Merged
ViewFromTheBox merged 3 commits into
release/1.0from
feature/412-widgets-cluster
May 29, 2026
Merged

ViewFromTheBox merged 3 commits into
release/1.0from
feature/412-widgets-cluster

Conversation

@ViewFromTheBox

@ViewFromTheBox ViewFromTheBox commented May 29, 2026 •

Copy link
Copy Markdown
Member

Description

Forks the I4 widgets cluster (core/search, core/latest-posts) into the artisanpack/* namespace per docs/plans/13-block-fork.md §2.2.1 + §3, and (as a follow-on cleanup) hides the now-superseded core/* blocks from the I1–I4 clusters from the editor inserter.

Closes: #412

Type of Change

  • New feature (adds new functionality)

Related Issue

Issue: #412

Motivation and Context

#331 inverts V1's "adopt @wordpress/block-library wholesale" bet by owning the block source under artisanpack/*. I4 is the 2-block widgets cluster. Shipping the fork inside 1.0.0 means no host has persisted core/* trees, so there is no migration to perform — only a namespace swap with full three-renderer parity.

Changes Made

artisanpack/search (static fork — I1–I3 pattern)

artisanpack/latest-posts (dynamic fork — artisanpack/form pattern)

  • Block dir with full upstream attribute schema, <ServerSideRender>-backed editor preview + ported inspector, null save, category-string deprecation, bidirectional transforms, tests.
  • New LatestPostsBlock DynamicBlock (PHP) querying cms-framework's Post model (modeled on ArchivesBlock), registered behind the BlogManager guard. As a dynamic block it's served by the Blade DynamicBlockRegistry, so — like categories/archives/form — it's intentionally absent from renderer-parity.json.

Cleanup (separate commit): hide forked core/* from the inserter (I1–I4 cutover)

  • Generalizes the existing I0 paragraph cutover: a blocks.registerBlockType filter stamps supports.inserter = false on every forked core/* block (installed before registerCoreBlocks, so no registry mutation). Blocks stay registered → legacy markup still deserializes and from:core/* transforms keep working; only the inserter surface changes.
  • enabled_blocks reorganized so the forks are the canonical names; unforked entity/taxonomy/query blocks stay core/*.
  • This is the inserter-level cutover only — dropping registerCoreBlocks / removing core/* renderers is the full I7 cutover, gated on all clusters being forked.

Pinned upstream: @wordpress/block-library v9.43.0.

How Has This Been Tested?

Testing Environment:

  • Operating System: macOS (Darwin 25.5)
  • Browser (if applicable): tested in the editor via the symlinked jmwd-keystone-cms host app
  • PHP Version: 8.4
  • Project Version: 1.0.0 (release/1.0)

Tests Performed:

  1. Automated: JS suite 1400 passing (200 files); PHP suite 485 passing; npm run build succeeds; verify:parity OK.
  2. Manual (keystone-cms): inserted Search (toggled "use button with icon" → labelled icon button in canvas + has-icon/aria-label/<svg> on the front end) and Latest Posts (server-rendered preview lists real posts; inspector toggles update it); verified core/* ↔ artisanpack/* transforms.
  3. Manual: confirmed the inserter now shows only the artisanpack/* versions for all forked clusters; existing core/* content still opens and renders.

Accessibility Tests Run

  • Keyboard navigation tested
  • Screen reader tested
  • Color contrast verified
  • ARIA labels checked

Details: The #338 fix (carried forward to artisanpack/search across all three renderers) ensures the icon-only search submit button always exposes an accessible name (buttonText → label → "Search") plus the magnifier SVG with has-icon. Verified the labelled button output in Blade/React/Vue via tests and in-canvas.

Tests Added

  • Unit tests added/updated
  • All tests passing

Test details: Per-block save/edit/transforms/deprecated suites for both forks; LatestPostsBlockTest (PHP) for the dynamic renderer; #338 carry-forward assertions in all three renderer suites; forked-block-cutover test for the cutover filter + allow-list. Updated EnabledBlockNamesTest to the new allow-list.

Documentation

  • Inline code documentation added

Documentation details: Each forked block ships an upstream-state.json documenting the per-file fork status and divergences from upstream v9.43.0.

Pre-Submission Checklist

  • Code passes all tests
  • Code follows project style guide
  • Self-review completed
  • Comments added for complex code
  • No new warnings generated

Note: One pre-existing failure on release/1.0 is unrelated to this PR — BlocksControllerTest › returns the registered block types from block.json manifests fails on the clean base branch (no paragraph manifest under core-blocks/). Left untouched.

Summary by CodeRabbit

  • New Features

    • Added Latest Posts block (configurable filtering, list/grid layouts, metadata toggles) and a forked Search block (configurable button positioning).
    • Added bidirectional conversion between core and forked block variants for seamless migration.
  • Bug Fixes

    • Improved Search button accessibility: icon-only buttons now receive proper aria-labels.
  • Tests

    • Added extensive unit and integration tests covering Latest Posts, Search, transforms, and editor cutover behavior.

Review Change Stack

ViewFromTheBox and others added 2 commits May 28, 2026 20:10
Forks the 2-block widgets cluster from `core/*` → `artisanpack/*` per
docs/plans/13-block-fork.md §2.2.1 + §3.

artisanpack/search — static fork (I1–I3 pattern): block.json, TS-ported
edit (drops the block-library-internal ToolsPanel dropdown hook), null
save (search is rendered outside save), empty deprecation chain,
bidirectional core/search ↔ artisanpack/search transforms, the default
variation, inline inserter icon, combined CSS, upstream-state.json, and the
four-test suite. The Blade view delegates to core/search and the React/Vue
renderers reuse the core/search component, so V1's #338 button-icon a11y
fix carries forward unchanged — covered by a carry-forward test in each
renderer. The Vue renderer never received the #338 fix, so it's brought
into parity here (has-icon + aria-label + svg) to match Blade/React.

artisanpack/latest-posts — dynamic fork (artisanpack/form pattern):
block.json (full upstream attribute schema), edit previews through the
package's <ServerSideRender> seam with a ported PanelBody inspector, null
save, the category-string deprecation, bidirectional transforms, inline
icon, and tests. Server rendering is a new LatestPostsBlock DynamicBlock
querying cms-framework's Post model (modeled on ArchivesBlock), registered
in the service provider behind the BlogManager guard. As a dynamic block it
is served by the Blade DynamicBlockRegistry, so — like categories/archives/
form — it is intentionally absent from renderer-parity.json.

Pinned upstream: @wordpress/block-library v9.43.0.

Closes #412

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

Now that the content (I1), media (I2), layout (I3), and widgets (I4)
clusters ship `artisanpack/*` forks, hide their upstream `core/*`
counterparts from the editor inserter so authors only reach for the forks
— generalizing the existing I0 paragraph cutover to the whole forked set.

- editor/forked-block-cutover.ts: install a `blocks.registerBlockType`
  filter (before registerCoreBlocks) that stamps `supports.inserter = false`
  on each forked core block. The blocks stay registered, so legacy
  `<!-- wp:* -->` markup still deserializes through its deprecation chain
  and the from:core/* transforms keep working — only the inserter surface
  changes. Idempotent via the hooks registry; no post-registration mutation
  of the block registry. core/paragraph stays with cutoverParagraphFork
  (it also re-homes the default block); core/row + core/stack are covered
  by suppressing core/group.
- config/visual-editor.php: reflect the forks as the canonical names in the
  enabled_blocks allow-list (artisanpack/* in, forked core/* out; unforked
  entity/taxonomy/query blocks stay core/*).
- Tests for the cutover filter + the updated allow-list.

This is the inserter-level cutover only; dropping registerCoreBlocks and
removing the core/* renderers is the full I7 cutover, gated on all clusters
being forked.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@ViewFromTheBox ViewFromTheBox moved this from Backlog to In Review in ArtisanPack UI Overview May 29, 2026
@ViewFromTheBox ViewFromTheBox linked an issue May 29, 2026 that may be closed by this pull request
4 tasks
@ViewFromTheBox

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented May 29, 2026

Copy link
Copy Markdown
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai

coderabbitai Bot commented May 29, 2026 •

Copy link
Copy Markdown

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 393b521e-cc2e-4a08-a378-bb85d0c2333c

📥 Commits

Reviewing files that changed from the base of the PR and between df246d9 and 1d6c4de.

📒 Files selected for processing (7)
  • packages/visual-editor-renderer-vue/tests/BlockTree.test.ts
  • resources/js/visual-editor/blocks/latest-posts/__tests__/deprecated.test.ts
  • resources/js/visual-editor/blocks/latest-posts/deprecated.ts
  • resources/js/visual-editor/blocks/latest-posts/upstream-state.json
  • resources/js/visual-editor/blocks/search/upstream-state.json
  • src/Blocks/Core/LatestPostsBlock.php
  • tests/Unit/VisualEditor/Blocks/Core/LatestPostsBlockTest.php
✅ Files skipped from review due to trivial changes (1)
  • resources/js/visual-editor/blocks/search/upstream-state.json
🚧 Files skipped from review as they are similar to previous changes (5)
  • resources/js/visual-editor/blocks/latest-posts/tests/deprecated.test.ts
  • resources/js/visual-editor/blocks/latest-posts/deprecated.ts
  • packages/visual-editor-renderer-vue/tests/BlockTree.test.ts
  • resources/js/visual-editor/blocks/latest-posts/upstream-state.json
  • src/Blocks/Core/LatestPostsBlock.php

📝 Walkthrough

Walkthrough

Adds artisanpack/search and artisanpack/latest-posts forks: editor entrypoints, metadata, transforms, styles, variations, tests, three-renderer parity (Blade/React/Vue) with a11y fixes for search, PHP dynamic rendering for latest-posts, and cutover/config updates to prefer artisanpack/* block names.

Changes

Search Block Widget Fork

Layer / File(s) Summary
Search metadata, constants, variations, upstream-state
resources/js/visual-editor/blocks/search/block.json, resources/js/visual-editor/blocks/search/constants.ts, resources/js/visual-editor/blocks/search/deprecated.ts, resources/js/visual-editor/blocks/search/variations.ts, resources/js/visual-editor/blocks/search/upstream-state.json
Adds artisanpack/search block.json, width/unit constants, empty deprecated array, default variation, and upstream-state manifest.
Search editor UI and interaction
resources/js/visual-editor/blocks/search/edit.tsx
SearchEdit TSX implementing label/placeholder, ResizableBox width controls, button modes (icon/text), inspector UI, and aria-label precedence (buttonText → label → "Search").
Search save, transforms, icon, and styles
resources/js/visual-editor/blocks/search/save.tsx, resources/js/visual-editor/blocks/search/transforms.ts, resources/js/visual-editor/blocks/search/inserter-icon.tsx, resources/js/visual-editor/blocks/search/search.css
Dynamic save returns null; bidirectional transforms with core/search; inline inserter SVG icon; editor CSS for layout/button sizing.
Three-renderer parity and tests (Blade/React/Vue)
packages/visual-editor-renderer-blade/resources/views/blocks/artisanpack/search.blade.php, packages/visual-editor-renderer-react/src/blocks/registerCoreBlocks.ts, packages/visual-editor-renderer-vue/src/blocks/core/design.ts, tests under packages/.../tests and resources/js/.../__tests__
Blade delegates to core view; React/Vue renderer maps artisanpack/search to existing SearchBlock and implement #338 accessibility fix (icon SVG + aria-label); tests assert icon-button aria-label and SVG presence without empty fallback button.

Latest Posts Block Widget Fork

Layer / File(s) Summary
Latest Posts metadata and constants
resources/js/visual-editor/blocks/latest-posts/block.json, resources/js/visual-editor/blocks/latest-posts/constants.ts
Adds artisanpack/latest-posts block.json and exported constants for excerpt/columns/defaults.
Latest Posts editor UI with ServerSideRender preview
resources/js/visual-editor/blocks/latest-posts/edit.tsx, resources/js/visual-editor/blocks/latest-posts/index.ts, resources/js/visual-editor/blocks/latest-posts/inserter-icon.tsx
LatestPostsEdit renders inspector panels (content/meta/image/sorting), conditionally shows controls (excerpt-length, columns), and previews via ServerSideRender with block="artisanpack/latest-posts".
Latest Posts deprecated/transforms/save
resources/js/visual-editor/blocks/latest-posts/deprecated.ts, resources/js/visual-editor/blocks/latest-posts/transforms.ts, resources/js/visual-editor/blocks/latest-posts/save.tsx
Adds v1 deprecation entry migrating legacy string categories to array-of-objects with eligibility/migrate logic; transforms for core/latest-posts ↔ artisanpack/latest-posts; save returns null.
Latest Posts PHP dynamic renderer and helpers
src/Blocks/Core/LatestPostsBlock.php
Adds LatestPostsBlock dynamic class: validateAttrs, fetchPosts via Post model (category/author filters), render/renderItem/renderFeaturedImage/renderContent, trimming, category normalization, and wrapper class logic.
Latest Posts tests & upstream-state
resources/js/visual-editor/blocks/latest-posts/__tests__/*, tests/Unit/VisualEditor/Blocks/Core/LatestPostsBlockTest.php, resources/js/visual-editor/blocks/latest-posts/upstream-state.json
Vitest suites for editor/save/transforms/deprecated and PHPUnit tests for PHP renderer, covering excerpt trimming, featured-image behavior, grid classes, escaping, attribute normalization, and searchableText; upstream-state manifest added.

Block Registration, Cutover, and Configuration

Layer / File(s) Summary
Forked core block cutover mechanism & tests
resources/js/visual-editor/editor/forked-block-cutover.ts, resources/js/visual-editor/editor/__tests__/forked-block-cutover.test.ts
Adds FORKED_CORE_BLOCKS list, suppressForkedBlockInserter transform, idempotent registerForkedBlockCutoverFilter, and tests asserting inclusion, suppression, and idempotency.
Editor integration
resources/js/visual-editor/editor/editor-app.tsx
Installs registerForkedBlockCutoverFilter during editor registerOnce() before registerCoreBlocks().
Config: enabled_blocks allow-list
config/visual-editor.php
Switches enabled_blocks entries from core/* to artisanpack/* for content/media/layout/widgets clusters and adds artisanpack/latest-posts to widgets cluster with updated comments.
Renderer parity and service provider
packages/renderer-parity.json, src/VisualEditorServiceProvider.php
Adds artisanpack/search to renderer-parity.json; VisualEditorServiceProvider conditionally loads latest-posts block.json and registers LatestPostsBlock dynamic type when BlogManager exists.
Test snapshot updates for enabled blocks
tests/Unit/VisualEditor/EnabledBlockNamesTest.php
Updates snapshot expectations to reflect artisanpack/* block names for forked clusters.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related issues

  • #309: Related — overlaps with forked core blocks, search a11y (#338), and cutover registration/test patterns.

Possibly related PRs

Poem

"A rabbit hums a tiny cheer,
Search and Posts now hop near,
Forks aligned across each view,
Accessibility hopped through,
Tests and blades all singing clear."

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 44.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately reflects the main change: forking the I4 widgets cluster (search and latest-posts blocks) into artisanpack namespace.
Linked Issues check ✅ Passed The PR successfully implements all coding requirements from #412: both blocks register as artisanpack/*, #338 a11y fix carried forward, transforms working, and three-renderer parity established with comprehensive tests.
Out of Scope Changes check ✅ Passed All changes align with issue #412 scope: block forking (search/latest-posts), accessibility fix, transforms, and block visibility management via forked-block-cutover filter are all explicitly scoped.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/412-widgets-cluster

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


Comment @coderabbitai help to get the list of available commands and usage tips.

@ViewFromTheBox
ViewFromTheBox marked this pull request as ready for review May 29, 2026 01:23

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🧹 Nitpick comments (1)
src/Blocks/Core/LatestPostsBlock.php (1)

79-101: ⚡ Quick win

Validate attributes at render() entry to prevent undefined-key paths.

render() currently assumes attrs are already normalized, but downstream helpers dereference required keys directly. Normalizing once at entry makes this method safe and consistent with searchableText().

Proposed patch
 public function render( array $attrs ): string
 {
-	$posts   = $this->fetchPosts( $attrs );
-	$classes = $this->wrapperClasses( $attrs );
+	$attrs   = $this->validateAttrs( $attrs );
+	$posts   = $this->fetchPosts( $attrs );
+	$classes = $this->wrapperClasses( $attrs );
@@
-	$items = $posts->map(
-		fn ( object $post ): string => $this->renderItem( $post, $attrs )
-	)->implode( '' );
+	$items = $posts->map(
+		fn ( object $post ): string => $this->renderItem( $post, $attrs )
+	)->implode( '' );
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/Blocks/Core/LatestPostsBlock.php` around lines 79 - 101, render() assumes
$attrs are normalized which lets downstream helpers like fetchPosts() and
wrapperClasses() dereference keys directly; validate and normalize $attrs at the
start of render() (the same approach used by searchableText())—call an existing
normalizer (e.g. $this->normalizeAttributes($attrs)) or add one if missing, then
use the normalized $attrs for fetchPosts($attrs), wrapperClasses($attrs) and
renderItem calls so undefined-key access is prevented.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/visual-editor-renderer-vue/tests/BlockTree.test.ts`:
- Around line 576-584: The test named "carries the `#338` a11y fix forward to
artisanpack/search (I4 fork)" creates a tree via makeBlock and renders it with
renderTree into html but is missing the negative assertion present in the other
tests; add a negative assertion after the existing positive expects that ensures
the empty search button element with class "wp-block-search__button" is not
present in html (i.e., assert html does not contain an empty button element for
that class) to match parity with the core/search, React, and Blade tests.

In `@resources/js/visual-editor/blocks/latest-posts/deprecated.ts`:
- Around line 32-39: The migrate function may produce categories with id: NaN
because it blindly uses Number(oldAttributes.categories); update migrate (in
deprecated.ts) to parse and validate the legacy value before emitting a category
object: parse the legacy id (e.g., const parsed =
parseInt(oldAttributes.categories as string, 10)), check with
Number.isFinite(parsed) or !Number.isNaN(parsed), and only return categories: [{
id: parsed }] when valid; otherwise return a safe fallback such as categories:
[] (or omit the category) so malformed legacy values don’t become NaN IDs.

In `@resources/js/visual-editor/blocks/search/upstream-state.json`:
- Line 23: The transforms.ts entry in upstream-state.json incorrectly uses
status: "extended" while upstream: "n/a"; update that entry to status: "added"
(same treatment as the deprecated.ts entry) so the entry correctly reflects a
file unique to the fork and matches the schema legend.

In `@src/Blocks/Core/LatestPostsBlock.php`:
- Around line 271-273: In LatestPostsBlock (the branch handling $media),
currently returning (string) $media->url can produce an empty string; change the
guard so it checks that $media is an object and $media->url is non-empty (e.g.
using !empty($media->url) or trim check) and return null for empty values
instead of an empty string so empty featuredImageMedia->url is treated the same
as other null URL branches.

---

Nitpick comments:
In `@src/Blocks/Core/LatestPostsBlock.php`:
- Around line 79-101: render() assumes $attrs are normalized which lets
downstream helpers like fetchPosts() and wrapperClasses() dereference keys
directly; validate and normalize $attrs at the start of render() (the same
approach used by searchableText())—call an existing normalizer (e.g.
$this->normalizeAttributes($attrs)) or add one if missing, then use the
normalized $attrs for fetchPosts($attrs), wrapperClasses($attrs) and renderItem
calls so undefined-key access is prevented.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 2da259f0-a8ee-471c-9697-92da60d5fd6d

📥 Commits

Reviewing files that changed from the base of the PR and between deb744f and df246d9.

📒 Files selected for processing (44)
  • config/visual-editor.php
  • packages/renderer-parity.json
  • packages/visual-editor-renderer-blade/resources/views/blocks/artisanpack/search.blade.php
  • packages/visual-editor-renderer-blade/tests/Unit/BlockRendererTest.php
  • packages/visual-editor-renderer-react/src/blocks/registerCoreBlocks.ts
  • packages/visual-editor-renderer-react/tests/BlockTree.test.tsx
  • packages/visual-editor-renderer-vue/src/blocks/core/design.ts
  • packages/visual-editor-renderer-vue/src/blocks/registerCoreBlocks.ts
  • packages/visual-editor-renderer-vue/tests/BlockTree.test.ts
  • resources/js/visual-editor/blocks/latest-posts/__tests__/deprecated.test.ts
  • resources/js/visual-editor/blocks/latest-posts/__tests__/edit.test.tsx
  • resources/js/visual-editor/blocks/latest-posts/__tests__/save.test.tsx
  • resources/js/visual-editor/blocks/latest-posts/__tests__/transforms.test.ts
  • resources/js/visual-editor/blocks/latest-posts/block.json
  • resources/js/visual-editor/blocks/latest-posts/constants.ts
  • resources/js/visual-editor/blocks/latest-posts/deprecated.ts
  • resources/js/visual-editor/blocks/latest-posts/edit.tsx
  • resources/js/visual-editor/blocks/latest-posts/index.ts
  • resources/js/visual-editor/blocks/latest-posts/inserter-icon.tsx
  • resources/js/visual-editor/blocks/latest-posts/save.tsx
  • resources/js/visual-editor/blocks/latest-posts/transforms.ts
  • resources/js/visual-editor/blocks/latest-posts/upstream-state.json
  • resources/js/visual-editor/blocks/search/__tests__/deprecated.test.ts
  • resources/js/visual-editor/blocks/search/__tests__/edit.test.tsx
  • resources/js/visual-editor/blocks/search/__tests__/save.test.tsx
  • resources/js/visual-editor/blocks/search/__tests__/transforms.test.ts
  • resources/js/visual-editor/blocks/search/block.json
  • resources/js/visual-editor/blocks/search/constants.ts
  • resources/js/visual-editor/blocks/search/deprecated.ts
  • resources/js/visual-editor/blocks/search/edit.tsx
  • resources/js/visual-editor/blocks/search/index.ts
  • resources/js/visual-editor/blocks/search/inserter-icon.tsx
  • resources/js/visual-editor/blocks/search/save.tsx
  • resources/js/visual-editor/blocks/search/search.css
  • resources/js/visual-editor/blocks/search/transforms.ts
  • resources/js/visual-editor/blocks/search/upstream-state.json
  • resources/js/visual-editor/blocks/search/variations.ts
  • resources/js/visual-editor/editor/__tests__/forked-block-cutover.test.ts
  • resources/js/visual-editor/editor/editor-app.tsx
  • resources/js/visual-editor/editor/forked-block-cutover.ts
  • src/Blocks/Core/LatestPostsBlock.php
  • src/VisualEditorServiceProvider.php
  • tests/Unit/VisualEditor/Blocks/Core/LatestPostsBlockTest.php
  • tests/Unit/VisualEditor/EnabledBlockNamesTest.php

Comment thread packages/visual-editor-renderer-vue/tests/BlockTree.test.ts
Comment thread resources/js/visual-editor/blocks/latest-posts/deprecated.ts
Comment thread resources/js/visual-editor/blocks/search/upstream-state.json Outdated
Comment thread src/Blocks/Core/LatestPostsBlock.php
- latest-posts deprecation: guard the legacy string→id conversion so a
  malformed value drops the category instead of migrating to { id: NaN }.
- LatestPostsBlock::featuredImageUrl(): treat an empty media-relation url
  as null so the renderer never emits src="".
- Vue artisanpack/search a11y test: add the missing negative assertion
  (no empty submit button), matching the core/React/Blade tests.
- upstream-state.json (search + latest-posts): transforms.ts is `added`
  (no upstream file), not `extended`, per the schema legend.
- Tests for the NaN-guard and the media-relation url branches.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@ViewFromTheBox
ViewFromTheBox merged commit e3b3f56 into release/1.0 May 29, 2026
1 check passed
@ViewFromTheBox
ViewFromTheBox deleted the feature/412-widgets-cluster branch May 29, 2026 01:39
@github-project-automation github-project-automation Bot moved this from In Review to Done in ArtisanPack UI Overview May 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Development

Successfully merging this pull request may close these issues.

Block fork I4 · Widgets cluster (search, latest-posts)

1 participant