Skip to content

feature: migrated from __experimentalText to Text in block-editor block-card - #77320

Closed
Raxen001 wants to merge 403 commits into
WordPress:trunkfrom
Raxen001:feature/text-edit
Closed

Raxen001 wants to merge 403 commits into
WordPress:trunkfrom
Raxen001:feature/text-edit

Conversation

@Raxen001

Copy link
Copy Markdown
Contributor

What?

Part of: #77265
Block card description — block-card/index.js uses Text for block description.

Why?

Migrate existing __experimentalText to @wordpress/ui Text

How?

Added @wordpress/ui to dependency.

Use of AI Tools

  • Claude 4.6: to sanity check my PR.

@github-actions github-actions Bot added [Package] Block editor /packages/block-editor First-time Contributor Pull request opened by a first-time contributor to Gutenberg repository labels Apr 14, 2026
@github-actions

Copy link
Copy Markdown

👋 Thanks for your first Pull Request and for helping build the future of Gutenberg and WordPress, @Raxen001! In case you missed it, we'd love to have you join us in our Slack community.

If you want to learn more about WordPress development in general, check out the Core Handbook full of helpful information.

@Raxen001
Raxen001 marked this pull request as ready for review April 14, 2026 11:28
@Raxen001
Raxen001 requested a review from ellatrix as a code owner April 14, 2026 11:28
@github-actions

github-actions Bot commented Apr 14, 2026 •

Copy link
Copy Markdown

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

Unlinked Accounts

The following contributors have not linked their GitHub and WordPress.org accounts: @gutenbergplugin, @danluu@git.wordpress.org.

Contributors, please read how to link your accounts to ensure your work is properly credited in WordPress releases.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Unlinked contributors: gutenbergplugin, danluu@git.wordpress.org.

Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
Co-authored-by: ramonjd <ramonopoly@git.wordpress.org>
Co-authored-by: DarkMatter-999 <lakshyajeet@git.wordpress.org>
Co-authored-by: tyxla <tyxla@git.wordpress.org>
Co-authored-by: gziolo <gziolo@git.wordpress.org>
Co-authored-by: amitraj2203 <amitraj2203@git.wordpress.org>
Co-authored-by: mirka <0mirka00@git.wordpress.org>
Co-authored-by: ntsekouras <ntsekouras@git.wordpress.org>
Co-authored-by: adamsilverstein <adamsilverstein@git.wordpress.org>
Co-authored-by: alecgeatches <alecgeatches@git.wordpress.org>
Co-authored-by: t-hamano <wildworks@git.wordpress.org>
Co-authored-by: kraftbj <kraftbj@git.wordpress.org>
Co-authored-by: jsnajdr <jsnajdr@git.wordpress.org>
Co-authored-by: yogeshbhutkar <yogeshbhutkar@git.wordpress.org>
Co-authored-by: ciampo <mciampini@git.wordpress.org>
Co-authored-by: simison <simison@git.wordpress.org>
Co-authored-by: USERSATOSHI <tusharbharti@git.wordpress.org>
Co-authored-by: himanshupathak95 <abcd95@git.wordpress.org>
Co-authored-by: Mamaduka <mamaduka@git.wordpress.org>
Co-authored-by: hi0001234d <emptyopssphere@git.wordpress.org>
Co-authored-by: manzoorwanijk <manzoorwanijk@git.wordpress.org>
Co-authored-by: jameskoster <jameskoster@git.wordpress.org>
Co-authored-by: danluu <danluu@git.wordpress.org>
Co-authored-by: retrofox <retrofox@git.wordpress.org>
Co-authored-by: peterwilsoncc <peterwilsoncc@git.wordpress.org>
Co-authored-by: Mustafabharmal <mustafabharmal@git.wordpress.org>
Co-authored-by: Takshil-Kunadia <takshil@git.wordpress.org>
Co-authored-by: hbhalodia <hbhalodia@git.wordpress.org>
Co-authored-by: aduth <aduth@git.wordpress.org>
Co-authored-by: andreawetzel <awetz583@git.wordpress.org>
Co-authored-by: im3dabasia <im3dabasia1@git.wordpress.org>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

andrewserong and others added 23 commits April 24, 2026 10:32
…ordPress#77591)

* Experimental Image Cropper: Ensure focus is on canvas when dragging

* Add a test and ensure focus has been mocked to get things passing

Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
Co-authored-by: ramonjd <ramonopoly@git.wordpress.org>
…terns and template parts (WordPress#77581)

Co-authored-by: ramonjd <ramonopoly@git.wordpress.org>
Co-authored-by: Mamaduka <mamaduka@git.wordpress.org>
Co-authored-by: talldan <talldanwp@git.wordpress.org>
… handles and canvas (WordPress#77639)

* Experimental Image Cropper: Tweak keyboard interactions for drag handles, canvas, and shift behaviour

* Don't rotate if a modifier key is held when r is pressed

* Add a CSS variable so that consumers can override the focus color

Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
Co-authored-by: ramonjd <ramonopoly@git.wordpress.org>
* fix: block-mover horizontal tooltip position

* fix: block-mover tooltip for smaller viewports

Co-authored-by: DarkMatter-999 <lakshyajeet@git.wordpress.org>
Co-authored-by: ciampo <mciampini@git.wordpress.org>
Co-authored-by: t-hamano <wildworks@git.wordpress.org>
Co-authored-by: lukecarbis <lukecarbis@git.wordpress.org>
Co-authored-by: mirka <0mirka00@git.wordpress.org>
Co-authored-by: jasmussen <joen@git.wordpress.org>
Use the design system `Badge` component for the Status column in the
taxonomies DataView — `stable` intent for Active, `draft` for Inactive —
instead of rendering the raw element label as text.

Co-authored-by: tyxla <tyxla@git.wordpress.org>
Co-authored-by: ntsekouras <ntsekouras@git.wordpress.org>
…ess#77592)

* Guidelines: Drop default_term from wp_guideline_type registration

Registering the taxonomy with default_term triggers cross-site
clean_term_cache work, which caused major load on multisite installs
with many sites even when no guidelines existed.

Replace it with a save_post_wp_guideline callback that assigns the
artifact fallback only when the post has no type term yet. The REST
controller's singleton path already sets content explicitly via
tax_input, so that flow is unaffected.

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

* Guidelines: Add unit tests for taxonomy default-term behavior

Covers:
- Regression guard that the taxonomy is registered without default_term.
- The save_post fallback assigns artifact only when the post has no type.
- An explicit type passed via tax_input is preserved, not overwritten.
- Updates to an existing post do not reset the term.
- The hook is scoped to wp_guideline and leaves other post types alone.

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

* Guidelines: Scope the save_post hook to Gutenberg's own registration

Move the save_post_wp_guideline registration inside the register()
method so it lives behind the same post_type_exists() guard as the
CPT itself. If WordPress core ever ships the guidelines CPT and its
own fallback hook, Gutenberg will skip both and avoid registering a
duplicate callback.

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

* Guidelines: Use get_the_terms so the check hits the object term cache

wp_get_object_terms() queries the database directly on every call.
get_the_terms() uses the object term cache populated by
update_object_term_cache(), which keeps repeated reads cheap within
the same request.

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

* Guidelines: Drop redundant autosave check and cover revisions in tests

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

---------

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

Co-authored-by: gziolo <gziolo@git.wordpress.org>
Co-authored-by: tyxla <tyxla@git.wordpress.org>
…ssion-notification, and form-submit-button (WordPress#61916)

* Update block categories for form, form-input, form-submission-notification, and form-submit-button

* Form blocks: move from Design to Widgets category

---------

Co-authored-by: amitraj2203 <amitraj2203@git.wordpress.org>
Co-authored-by: t-hamano <wildworks@git.wordpress.org>
Co-authored-by: Mamaduka <mamaduka@git.wordpress.org>
Co-authored-by: colorful-tones <colorful-tones@git.wordpress.org>
Co-authored-by: carolinan <poena@git.wordpress.org>
WordPress#77637)

Co-authored-by: tyxla <tyxla@git.wordpress.org>
Co-authored-by: ntsekouras <ntsekouras@git.wordpress.org>
* ButtonGroup: Inline z-index

* Add changelog

* Add changelog

Co-authored-by: mirka <0mirka00@git.wordpress.org>
Co-authored-by: ciampo <mciampini@git.wordpress.org>
…#77575)

* VisuallyHidden: Update guidance

* Migrate instances

* Add manifest tag

* Migrate remaining VisuallyHidden instances

* Switch over lint disable for test file

* Add ui tsconfig references

* Update stale snapshot

* Fixup

* Fix CI type errors

* Fixup

* Fix VisuallyHidden render props

* Tweak

* Fix missed spots

* Add changelog

* Keep `className` on host component

Co-authored-by: mirka <0mirka00@git.wordpress.org>
Co-authored-by: ciampo <mciampini@git.wordpress.org>
Co-authored-by: ntsekouras <ntsekouras@git.wordpress.org>
Co-authored-by: tyxla <tyxla@git.wordpress.org>
Co-authored-by: mirka <0mirka00@git.wordpress.org>
* FormToggle: Inline z-index

* Add changelog

* Add isolation

* Add changelog

* Clean up unnecessary `@use`

* Add code comment

Co-authored-by: mirka <0mirka00@git.wordpress.org>
Co-authored-by: ciampo <mciampini@git.wordpress.org>
* Inline ResizableBox handle z-index

* Add changelog

Co-authored-by: mirka <0mirka00@git.wordpress.org>
Co-authored-by: ciampo <mciampini@git.wordpress.org>
…ess#75993)

* Reduce VIPS library size in build output

The VIPS library added ~30MB of unnecessary files to the
build: source maps (~20MB) and duplicate unminified workers
(~10MB) containing inlined WASM. This disables sourcemaps
for script module builds, skips unminified builds for
packages with wpWorkers, adds a SCRIPT_DEBUG fallback for
missing unminified files, and excludes .map files from the
plugin ZIP.

* docblock cleanup

* Scope VIPS build optimizations to avoid side effects

The previous commit disabled sourcemaps and unminified builds
for all module packages. This narrows the changes to only the
vips package, which is the one that inlines large WASM binaries.

* Add wpScriptModuleMinifiedOnly package.json flag

Replace the hardcoded vips package name check with a generic
wpScriptModuleMinifiedOnly flag that any package can set in
its package.json to skip sourcemaps and unminified builds.

* Fix JSDoc line alignment in package-utils.mjs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Propagate minifiedOnly flag to PHP module registry

The previous commit added wpScriptModuleMinifiedOnly to
package.json but didn't pass the flag through to the PHP
registry data. Without the minified_only entry in the
registry, the PHP template couldn't override the .js
extension when SCRIPT_DEBUG is on, causing module resolution
failures for packages that only ship .min.js files.

* Rename wpScriptModuleMinifiedOnly to wpScriptDebugSupport

Broadens the flag to cover all build outputs (scripts, script
modules, and styles) instead of just script modules. When set
to false, skips unminified builds and sourcemaps for all
output types. Adds file_exists fallbacks in script and style
PHP templates so SCRIPT_DEBUG gracefully falls back to
minified files when unminified versions don't exist.

* Remove minifiedOnly from module registry data

The file_exists fallback in the PHP template handles missing
unminified files generically, making the per-module
minified_only flag in the registry unnecessary.

* Fix prettier and JSDoc lint errors in wp-build

- Collapse multiline `skipDebugBuilds` assignments to single lines (prettier)
- Re-align JSDoc @typedef/@Property columns in package-utils.mjs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Revert unrelated whitespace change in package-utils.mjs

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

* Remove unrelated comment and formatting changes from merge

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

* Remove hardcoded size from comment

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…ordPress#77631)

* Rotate rooms > MAX_ROOMS_PER_REQUEST in polling manager

* Add tests for rotateWindow, postSyncUpdate changes

* Only emit status changes to rooms in the current request pool

* Fix polling tests to expect a single room on first poll

* Fix tests by removing status changes from unregistered rooms
…routes pattern (WordPress#77443)

* scaffold new experiments screen

* wire up settings

* fix simplify entiry record usage

* add reset button

* fix use long array syntax

* fix remove trailing comma

* update e2e test helper to use rest api rather than manual post to settings screen

* add missing textdomain

* remove boilerplate code

* Update packages/edit-site/src/experiments.js

Co-authored-by: Daniel Richards <daniel.richards@automattic.com>

* fix phpcs warning

* uodates

* fix update experiments based on latest changes

* fix simplify code further

* fix remove trailing comma

* fix move experiments to single source of truth in PHP

* fix add back editor settings because the back button needs the site url to be available

* fix e2e tests

* handle special case of template activation

* add modal for confirming reset

* fix, initialize all settings as false to avoid ucontroled input change notice

* Experiments: Rebuild the screen using the wp-build routes pattern

Move the Experiments screen off the legacy `initializeExperiments()` bootstrap
in `@wordpress/edit-site` and onto the `wp-build` routes pattern used by
`connectors-home` and `font-list`, so it plugs into the same page/route
registration pipeline as the other wp-admin screens.

- Register a new `experiments` page in `wpPlugin.pages` and create
  `routes/experiments/` (route.ts + stage.tsx + style.scss + types.ts).
- Extend the `gutenberg-experiments` setting schema with `title`, `description`,
  `group`, and `separate_option`/`option_name` per property, so the experiment
  metadata can be read from the existing `OPTIONS /wp/v2/settings` endpoint
  instead of being injected via inline script.
- Replace `the_gutenberg_experiments()` with the auto-generated
  `gutenberg_experiments_wp_admin_render_page()` in the admin submenu.
- Redirect the legacy `?page=gutenberg-experiments` URL to
  `?page=experiments-wp-admin` via a hidden submenu + `load-*` hooks,
  following the same pattern as `edit-site-routes-backwards-compat.php`.
- Remove the now-unused experiments-app code from `@wordpress/edit-site`.

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

* Experiments: Align PHP bootstrap and route naming with sibling features

Relocate the experiments PHP bootstrap and rename the route package so both
match the existing conventions used by connectors, fonts, and guidelines.

- Move `lib/experiments-page.php` to `lib/experimental/experiments/load.php`,
  matching the `lib/experimental/{feature}/load.php` layout shared with
  `connectors`, `fonts`, and `guidelines`.
- Rename `routes/experiments/` to `routes/experiments-home/` and the package
  to `@wordpress/experiments-home-route`, matching the `-home` naming used by
  `connectors-home` and `fonts-home` for the root route of a page.

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

* Experiments: Remove Reset to default, notify save result via snackbar

Simplify the screen to only expose a Save action and surface its result via a
snackbar notice, so users get immediate feedback on save success/failure
consistent with how other wp-admin routes report save outcomes.

- Drop the Reset to default button, ConfirmDialog, and related reset state.
  The feature was a rarely-needed escape hatch and complicated the UI.
- Call `saveSettings({ throwOnError: true })` and dispatch
  `createSuccessNotice`/`createErrorNotice` from `@wordpress/notices` with
  `type: 'snackbar'` to report the outcome.

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

* Experiments: Switch to card layout, auto-save on toggle

Rework the form so each category is a collapsible card and changes are
persisted immediately, removing the Save step and its notice feedback.

- Group each experiment category as a `layout: { type: 'card' }` entry with
  `isCollapsible` and `isOpened: true`, and switch the outer form to
  `layout: { type: 'card' }`, so users see each category as a collapsible
  section instead of a single flat list.
- Change experiment fields from `Edit: 'checkbox'` to `Edit: 'toggle'`, which
  reads as an on/off control closer to how the settings behave.
- Drop the Save button and the snackbar notice: `setSettings` now calls
  `saveSettings()` right after `edit()`, so toggling a switch persists the
  change immediately and the toggle state itself is sufficient feedback.
  Removes the `@wordpress/notices` dependency and related imports.

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

* Experiments: Pad card body top so the first toggle's focus ring is visible

The card content wrapper uses `overflow: hidden` for the collapse animation,
which clips the focus outline of a toggle flush at the top. Add a small
padding-top on the first field inside each card so the focus ring renders
within the visible area.

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

* Experiments: Inline route types, remove types.ts

The two types (Experiment, SettingsSchema) were only used in stage.tsx, so a
dedicated types.ts was overkill. Inlining keeps the single-file route
self-contained, consistent with other small routes that don't carry a types
file.

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

* Experiments: Show a per-group snackbar notice on save

Surface a snackbar notice after each toggle so users get an explicit
confirmation that the change was persisted, with the group name included so
it's clear which section was updated.

- Pull the group label of the changed experiment and dispatch
  `createSuccessNotice`/`createErrorNotice` with the message
  `{Group} settings updated.` (or its failure variant).
- Omit the notice `id` so repeated updates within the same group fire a
  fresh snackbar instead of silently replacing the existing notice.

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

* Experiments: Use grid-unit variables for form padding

Replace hardcoded pixel values with `$grid-unit-*` variables from
`@wordpress/base-styles` so the experiments page padding stays aligned with
the project-wide spacing scale.

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

* Experiments: Center the form with a max-width, drop inner scroll

Constrain the form to a readable column and center it, instead of letting
it stretch edge-to-edge inside a scrollable region. The overall page
already provides scrolling, so an inner `overflow-y: auto` was redundant.

- Replace the left/right padding with a uniform `$grid-unit-30` padding and
  `max-width: 680px` + `margin: 0 auto` to keep line length comfortable on
  wide screens.
- Drop `overflow-y: auto`: the surrounding page layout handles scroll, and
  a nested scroll container produced two scrollbars on some viewports.

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

* Experiments: Group experiments server-side with slug, label, items

Restructure `gutenberg_get_experiments()` to return grouped data so the
group order and translated labels live in PHP. The settings schema now
exposes `group_label` per property, letting the React stage drop its
hardcoded `GROUP_LABELS` / `GROUP_ORDER` and derive both from the
server response.

* Experiments: Inline experiment groups into the settings registration

Fold `gutenberg_get_experiments()` into
`gutenberg_initialize_experiments_settings()` since it had no other
caller, and drop the `description` arg from `register_setting()` because
the new React UI never reads it from the schema.

* Experiments: Type the site settings record so index access typechecks

`useEntityRecord( 'root', 'site' )` returns `Partial<unknown>`, which
leaves `siteSettings[ key ]` un-typeable in strict TS. Pass an explicit
`recordId` (the singleton ignores it at runtime) and cast `editedRecord`
to a string-indexed record so the experiment id and option name lookups
type-check cleanly.

* Experiments: Drop verb prefixes from experiment labels

Trim the leading "Add" / verb from a few experiment titles so each card
header reads as a noun phrase, matching the rest of the list, and rename
the "contentOnly" group to "Content Only" so the heading reads as plain
English instead of a code identifier.

* Experiments: Drop entries that are not registered in trunk

The experiments list had drifted from the legacy trunk page: several
entries (Customizable Navigation Overlays, Hide blocks based on screen
size, Client-side media processing, Real time editing, Posts dashboard,
Quick Edit, contentOnly pattern insertion) had no backing
implementation, so toggling them did nothing. Pare the list down to the
experiments that actually exist on trunk, drop the now-empty
Collaboration and Content Only groups, and pull
`gutenberg-content-only-inspector-fields` into Data Views with its
trunk title and description.

* Experiments: Extract fetchExperiments into api.ts

Move the settings-schema fetch and the Experiment shape out of stage.tsx
into a dedicated api.ts, mirroring the Guidelines route layout. The
stage component now owns just the loading state and calls
`fetchExperiments()` from `useEffect`, instead of hiding the request
inside a custom `useExperiments` hook.

* Experiments: Drop the redundant admin_init registration

The legacy options.php form is no longer in use, so registering the
setting on `admin_init` only duplicates what `rest_api_init` already
does for the React UI's REST consumer. Reword the legacy-menu doc
comment to spell out the 403 it prevents, matching the wording of
`gutenberg_site_editor_menu` in lib/compat.

* Experiments: Co-locate the submenu registration with the rest of the feature

Move the Experiments submenu page out of `gutenberg_menu()` in
lib/init.php and into lib/experimental/experiments/load.php so the
feature's settings registration, page registration, and legacy
redirect all live together. Now disabling or removing the experiments
feature only touches one file.

* Experiments: Add a subtitle explaining what the page is for

Surface the page-level description on the Experiments screen so
visitors understand the experimental nature of these toggles before
flipping them. Reuses the longstanding wording previously attached to
the `register_setting()` description, which the new React UI never
rendered.

* Experiments: Document the separate-option storage split

The dual storage scheme (most flags inside the `gutenberg-experiments`
array, a few in their own top-level WP option) is non-obvious from the
code alone. Add three short comments where the distinction matters so
the next reader doesn't have to reverse-engineer the partitioning logic.

* Experiments: Wrap the Template Activation warning in parentheses

The warning note in the description felt like part of the main
sentence. Wrapping it in parentheses makes it visually distinct
as a secondary aside.

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

* Tests: Stop sending active_templates: null for unrelated experiments

setGutenbergExperiments unconditionally sent `active_templates: null`
whenever the flag was absent from the requested list. Because the
setting is registered as `type: 'object'` in REST, sending null
triggers a schema-validation 500 (`rest_invalid_stored_value`) and
breaks every test that enables a different experiment.

Only include `active_templates` in the payload when the caller
explicitly requests it; omitting the key leaves the stored value
untouched.

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

* Experiments: Remove unused OPTIONS preload from route loader

The loader was firing an OPTIONS request to /wp/v2/settings but
discarding the result, so it served no purpose.  The stage component
already fetches the same data via fetchExperiments().

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

* Tests: Fix active_templates option leaking between E2E test files

The active_templates REST schema only accepted "object", so sending
null to clear the option caused a validation error. Commit 1aefbde
worked around this by omitting null, but that left the option in the
database after setGutenbergExperiments([]), causing template-id-format
tests to leak state into site-editor-url-navigation tests.

Allow null in the REST schema so the test utility can delete the option
cleanly, and restore the else branch that sends null when the
experiment is not requested.

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

* Experiments: Hardcode active_templates instead of generic separateOption logic

The separateOption abstraction only serves a single key today.
Replace the generic filter/loop with a direct active_templates check
to reduce indirection and simplify both read and write paths.

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

* Experiments: Remove null from active_templates REST schema type

The active_templates option always resolves to an object (or empty
default).  Allowing null in the schema is unnecessary and can cause
unexpected validation behavior in the REST API.

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

* Tests: Stop sending active_templates: null for unrelated experiments

setGutenbergExperiments unconditionally sent `active_templates: null`
whenever the flag was absent from the requested list. Because the
setting is registered as `type: 'object'` in REST, sending null
triggers the stored-value guard in WP_REST_Settings_Controller
(`rest_invalid_stored_value`, 500) whenever the option does not yet
exist, breaking every test that enables a different experiment.

Only include `active_templates` in the payload when the caller
explicitly requests it; omitting the key leaves the stored value
untouched.

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

* Tests: Clear active_templates when resetting Gutenberg experiments

The previous commit stopped sending `active_templates: null` to avoid
the stored-value 500 that breaks unrelated experiment tests, but left
the option in the database after test runs that enable it — causing
state to leak across E2E spec files.

Probe the current site settings first and only include
`active_templates: null` in the payload when the option is actually
set. WP_REST_Settings_Controller's stored-value guard rejects null
updates when the stored value doesn't match the `type: 'object'`
schema (including the absent/`false` case), so gating on the current
value avoids the 500 while still deleting the option when it exists.

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

* Experiments: Document the editor bridge step in the settings registration

Registering an experiment in load.php only exposes it on the Experiments
screen; enabling it in the editor requires a matching JS global bridge in
editor-settings.php. Note this in the function docblock so future additions
do not silently stop at step one.

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

* Experiments: Align gutenberg-content-types label with sibling entries

The new `gutenberg-content-types` experiment was merged from trunk with a
verb-prefixed, colon-style label that did not match the noun-only style used by
the other entries in the Other group (Color randomizer, Workflow Palette,
Extensible Site Editor, Guidelines). Drop the verb prefix and mirror the
"under Settings" phrasing used by Guidelines so both entries describe where the
feature surfaces.

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

---------

Co-authored-by: fabiankaegy <fabiankaegy@git.wordpress.org>
Co-authored-by: t-hamano <wildworks@git.wordpress.org>
Co-authored-by: Mamaduka <mamaduka@git.wordpress.org>
Co-authored-by: ramonjd <ramonopoly@git.wordpress.org>
Co-authored-by: jameskoster <jameskoster@git.wordpress.org>
Co-authored-by: jeffpaul <jeffpaul@git.wordpress.org>
…heck (WordPress#77661)

The connectors UI determines plugin activation status by checking for
status === 'active' from the REST plugin endpoint. Multisite plugins
that are network-activated return status === 'network-active', which
caused them to be displayed as inactive with an Activate button even
though they were already running.

Accept 'network-active' as an active state alongside 'active'.

Fixes WordPress#77627

Co-authored-by: kraftbj <kraftbj@git.wordpress.org>
Co-authored-by: westonruter <westonruter@git.wordpress.org>
Co-authored-by: superdav42 <superdav42@git.wordpress.org>
* Build: print timimg of TS build

* Experiment: update TypeScript to tsgo (7.0)

* Fix type errors

* Add components changelog entry
WordPress#77664)

* Image editor: compare like-for-like in locked-ratio driver-axis selection

The driver-axis heuristic in computeLockedResizeRect compared
pixelDistW / pixelDistH (a pixel-space ratio) against normalizedRatio
(a normalized w/h ratio). On non-square images the two thresholds
differ by a factor of (imageW/imageH)^2, so the wrong axis could
drive the resize.

Repro: 1600x900 image, 1:1 locked crop, drag SE corner with
pixel motion (80, 100). Old behavior squished the result to 80x80;
correct behavior gives 100x100 (height drives because the user
moved further vertically).

Compute the equivalent pixel-space ratio from normalizedRatio and
compare in the same units.

* Image editor: use drag deltas above MIN_CROP_SIZE in driver-axis test

* Image editor: bail out of locked-ratio resize when ratio or image is zero

Reachable via keyboard arrows on a focused resize handle before the
image has loaded — at that point normalizedRatio is 0 and imageSize
dimensions are 0, so the divisions inside computeLockedResizeRect
would produce NaN/Infinity. Returning the start rect early avoids
both that path and lets the function drop the per-line imageSize
guards on dx/dy (the early return now covers them).

Co-authored-by: ramonjd <ramonopoly@git.wordpress.org>
Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
…ordPress#77663)

* Image editor: hold Shift while resizing to lock current aspect ratio

* Image editor: preserve ratio when shift-resize hits MIN_CROP_SIZE

Min-size clamping in computeShiftLockedResizeRect was applied to width
and height independently, which could violate the locked ratio when one
axis hit MIN_CROP_SIZE. Now the minimum is enforced on the driving axis
(scaled by the ratio so the dependent axis also satisfies the minimum),
and the dependent axis is recomputed from the ratio.

Co-authored-by: ramonjd <ramonopoly@git.wordpress.org>
Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
@t-hamano t-hamano added the [Type] Enhancement A suggestion for improvement. label Apr 27, 2026
@github-actions github-actions Bot added [Package] DOM ready /packages/dom-ready [Package] Hooks /packages/hooks [Package] i18n /packages/i18n [Package] is-shallow-equal /packages/is-shallow-equal [Package] Url /packages/url [Package] Word count /packages/wordcount [Package] Deprecated packages/deprecated [Package] Blob /packages/blob [Package] Compose /packages/compose [Package] Core data /packages/core-data [Package] API fetch /packages/api-fetch [Package] HTML entities /packages/html-entities [Package] Viewport /packages/viewport [Package] DOM /packages/dom [Package] Keycodes /packages/keycodes [Package] Plugins /packages/plugins [Package] Components /packages/components [Package] Blocks /packages/blocks [Package] Editor /packages/editor [Package] Redux Routine /packages/redux-routine [Package] Block library /packages/block-library [Package] Notices /packages/notices [Package] Token List /packages/token-list [Package] Format library /packages/format-library [Package] Rich text /packages/rich-text [Package] Edit Post /packages/edit-post [Package] Data Controls /packages/data-controls [Package] Priority Queue /packages/priority-queue [Package] Edit Widgets /packages/edit-widgets [Package] E2E Tests /packages/e2e-tests labels May 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

First-time Contributor Pull request opened by a first-time contributor to Gutenberg repository [Package] A11y /packages/a11y [Package] API fetch /packages/api-fetch [Package] Autop /packages/autop [Package] Base styles /packages/base-styles [Package] Blob /packages/blob [Package] Block editor /packages/block-editor [Package] Block library /packages/block-library [Package] Blocks /packages/blocks [Package] Commands /packages/commands [Package] Components /packages/components [Package] Compose /packages/compose [Package] Core commands /packages/core-commands [Package] Core data /packages/core-data [Package] Data Controls /packages/data-controls [Package] Data /packages/data [Package] DataViews /packages/dataviews [Package] Date /packages/date [Package] Deprecated packages/deprecated [Package] DOM ready /packages/dom-ready [Package] DOM /packages/dom [Package] E2E Tests /packages/e2e-tests [Package] Edit Post /packages/edit-post [Package] Edit Site /packages/edit-site [Package] Edit Widgets /packages/edit-widgets [Package] Editor /packages/editor [Package] Element /packages/element [Package] Escape HTML /packages/escape-html [Package] Fields /packages/fields [Package] Format library /packages/format-library [Package] Hooks /packages/hooks [Package] HTML entities /packages/html-entities [Package] i18n /packages/i18n [Package] Icons /packages/icons [Package] Interactivity Router /packages/interactivity-router [Package] Interactivity /packages/interactivity [Package] Interface /packages/interface [Package] is-shallow-equal /packages/is-shallow-equal [Package] Keyboard Shortcuts /packages/keyboard-shortcuts [Package] Keycodes /packages/keycodes [Package] Lazy import /packages/lazy-import [Package] Media Utils /packages/media-utils [Package] Notices /packages/notices [Package] Patterns /packages/patterns [Package] Plugins /packages/plugins [Package] Preferences /packages/preferences [Package] Primitives /packages/primitives [Package] Priority Queue /packages/priority-queue [Package] Private APIs /packages/private-apis [Package] Project management automation /packages/project-management-automation [Package] React i18n /packages/react-i18n [Package] Redux Routine /packages/redux-routine [Package] Rich text /packages/rich-text [Package] Router /packages/router [Package] Server Side Render /packages/server-side-render [Package] Style Engine /packages/style-engine [Package] Sync /packages/sync [Package] Theme /packages/theme [Package] Token List /packages/token-list [Package] UI /packages/ui [Package] Url /packages/url [Package] Viewport /packages/viewport [Package] Warning /packages/warning [Package] Word count /packages/wordcount [Type] Enhancement A suggestion for improvement.

Projects

None yet

Development

Successfully merging this pull request may close these issues.