Repository navigation
Conversation
|
👋 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. |
|
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 Unlinked AccountsThe 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. To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook. |
…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>
What?
Part of: #77265
Block card description — block-card/index.js uses Text for block description.Why?
Migrate existing
__experimentalTextto@wordpress/ui TextHow?
Added
@wordpress/uito dependency.Use of AI Tools