Skip to content

Core Data: Rank link suggestions by type, and stop discarding merged results - #83407

Merged
jeryj merged 33 commits into
trunkfrom
update/link-suggestion-ranking
Oct 1, 2026
Merged

jeryj merged 33 commits into
trunkfrom
update/link-suggestion-ranking

Conversation

@jeryj

@jeryj jeryj commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

What?

Closes #63683

Changes __experimentalFetchLinkSuggestions to rank results by type (content, taxonomies, post formats, and attachments) and keeps all search results instead of slicing multi-type searches to the perPage value.

Why?

Since 6.7 an unscoped link search covers every type at once, and the complaints in #63683 are consistent — from WordPress VIP, Human Made and several agencies — that editors can no longer find their content:

Every post with a related tag and every relevant attachment fills the search results and the post isn't there.

There are two separate causes.

1. Every type competes on equal terms, and the score favours short titles. sortResults scores a title by how many of its tokens match, divided by its own token count:

const exactMatchScore = ( exactMatchingTokens.length / titleTokens.length ) * 10;

Searching coffee, an attachment called coffee-beans scores the maximum 10, while a page called Coffee Roasting Guide For Beginners scores 1/5 * 10 = 2.00 — marked down purely for being long.

2. Results are discarded and nothing can ask for them again. Four endpoints are queried at per_page: perPage, merged, sorted and cut to perPage. 60 potential matches are discarded. page is passed to each endpoint, so "page 2" returns items 21–40 of each type — it skips straight over whatever the merge discarded. Those results are unreachable.

Points 1 and 2 compound the issue: the search favors short terms like attachments and taxonomy terms and also cuts at 20 with no pagination possible, so large sites frequently don't get the result they want.

How?

Improve Ordering

Ordering is done by a series of comparisons:

how many of the words typed does the title hold
  → does the title contain what was typed
    → what type is it
      → does the title begin with what was typed
        → how much of the search does the title cover (by word, not total length)

Let's assume a search of "coffee beans":

  1. Number of word matches in the title: "coffee beans" matches above "coffee" in the title with "beans" in the body text of the post
  2. Ordering of the title matches. "The best coffee beans today" will match above "For the best coffee, you need the best beans" because of the separation between words
  3. Content Type: content > taxonomies > post formats > media
  4. Starting with search: "Coffee beans, lightly roasted" will rank above "The freshest coffee beans"
  5. Percentage of matched word: The search "cat" ranks the title "Cats" above the title "Caterpillar" since "cat" is 75% of "Cats" and only 27% of "Caterpillar"

Return all results

Instead of slicing by the perPage, we return all the pages from each query. This makes page work as well, and results are not lost.

Testing Instructions

Use a site with a media library, and images whose filenames share a word with some pages. I have been asking an agent to populate content to test this.

  1. Open a post, select some text, press Cmd/Ctrl+K, and search a word that matches both.
  2. Pages and posts now come first, with attachments below them — including attachments whose filenames start with the word.
  3. Create pages Our Coffee and Coffee Roasting Guide For Beginners, then search coffee. The one that starts with the word now leads; on trunk it comes last.
  4. Search two words that appear in a title but not together, such as coffee guide against Guide to Coffee. It is still returned, below the titles that hold the words together.
  5. Search a word matching many things. The list is longer than 20, because nothing that answers the search is discarded.
  6. Confirm a narrowed search is unchanged:
    ( await wp.coreData.__experimentalFetchLinkSuggestions( 'a', { type: 'term', perPage: 5 } ) ).length;  // 5
  7. Open a Link UI without typing anything. The initial suggestions are still a short list.

Automated coverage

npm run test:unit:vitest -- --run packages/core-data/src/fetch

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

🤖 PR meta 🤖

🎉 Props

Unlinked Accounts

The following contributors have not linked their GitHub and WordPress.org accounts: @swissky, @tonx, @devisan.

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: swissky, tonx, devisan.

Co-authored-by: jeryj <jeryj@git.wordpress.org>
Co-authored-by: draganescu <andraganescu@git.wordpress.org>
Co-authored-by: noisysocks <noisysocks@git.wordpress.org>
Co-authored-by: fabiankaegy <fabiankaegy@git.wordpress.org>
Co-authored-by: SainathPoojary <sainathpoojary@git.wordpress.org>
Co-authored-by: getdave <get_dave@git.wordpress.org>
Co-authored-by: t-hamano <wildworks@git.wordpress.org>
Co-authored-by: jasmussen <joen@git.wordpress.org>
Co-authored-by: jameskoster <jameskoster@git.wordpress.org>
Co-authored-by: graylaurenm <oncecoupled@git.wordpress.org>
Co-authored-by: rickcurran <rickcurran@git.wordpress.org>
Co-authored-by: roborourke <sanchothefat@git.wordpress.org>
Co-authored-by: richtabor <richtabor@git.wordpress.org>

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

Updated as activity occurs, without notifying anyone named here. Add the props-bot label to refresh.

📦 Bundle size

Size Change: +246 B (0%)

Total Size: 8.25 MB

📦 View Changed
Filename Size Change
build/scripts/core-data/index.min.js 38 kB +246 B (+0.65%)

174d158 Run

⚡ Performance

Show the results

Client side metrics exclude the server response time.

front-end-block-theme

Metric 8233642 trunk % Change
timeToFirstByte 59.35 ms +9.35% -3.54% 57.25 ms +13.71% -2.45% 3.67%
largestContentfulPaint 100 ms +4% -4% 100 ms +4% -8% 0%
lcpMinusTtfb 36.85 ms +22.66% -3.53% 36.7 ms +20.3% -8.04% 0.41%
wpBeforeTemplate 28.52 ms +16.23% -1.4% 28.27 ms +10.05% -1.49% 0.88%
wpTemplate 25.81 ms +3.33% -3.56% 24.6 ms +3.66% -1.46% 4.92%
wpTotal 55.45 ms +9.65% -3.62% 53.64 ms +13.42% -2.91% 3.37%
wpMemoryUsage 7.62 MB +0% -0% 7.59 MB +0% -0% 0.46%
wpDbQueries 17 +0% -0% 17 +0% -0% 0%

front-end-classic-theme

Metric 8233642 trunk % Change
timeToFirstByte 42.85 ms +5.72% -0.7% 50.35 ms +2.98% -3.08% -14.9%
largestContentfulPaint 92 ms +4.35% -0% 108 ms +0% -3.7% -14.81%
lcpMinusTtfb 49.45 ms +4.55% -0.61% 56.2 ms +3.56% -2.4% -12.01%
wpBeforeTemplate 26.14 ms +2.87% -1.42% 27.55 ms +5.84% -2% -5.12%
wpTemplate 13.72 ms +2.62% -0.66% 18.66 ms +6.27% -1.71% -26.47%
wpTotal 39.89 ms +6.49% -1.1% 47.01 ms +3.11% -3.21% -15.15%
wpMemoryUsage 6.11 MB +0% -0% 6.20 MB +0% -0% -1.57%
wpDbQueries 10 +0% -0% 14 +0% -0% -28.57%

media-processing

Metric 8233642 trunk % Change
mediaProcessingJpeg 401.1 ms +1.63% -0.85% 405.82 ms +2.84% -0.53% -1.16%
mediaProcessingAvif 6042.41 ms +0.23% -0.1% 6081.83 ms +0.07% -0.39% -0.65%
mediaProcessingJpegToAvif 4171.37 ms +0.49% -0.18% 4199.34 ms +0.16% -0.57% -0.67%

media-upload

Metric 8233642 trunk % Change
jpegUploadProcessing 1479.5 ms +29.96% -3.99% 1430.8 ms +1.57% -1.36% 3.4%
pngUploadProcessing 203.4 ms +25.29% -12.6% 182.36 ms +29.63% -3.11% 11.54%
largeJpegUploadProcessing 1412.92 ms +1.2% -0.64% 1419.44 ms +0.69% -1.12% -0.46%
multipleImageUploadProcessing 1633.38 ms +8.63% -1.59% 1612.57 ms +0.5% -3.34% 1.29%

post-editor

Metric 8233642 trunk % Change
serverResponse 528.14 ms +1.86% -7.14% 530.92 ms +1.16% -2.78% -0.52%
firstPaint 244.62 ms +21.11% -27.1% 217.1 ms +9.07% -6.44% 12.68%
domContentLoaded 1137.95 ms +0.72% -3.49% 1116.09 ms +0.87% -2.48% 1.96%
loaded 1139.26 ms +0.73% -3.5% 1117.48 ms +0.87% -2.48% 1.95%
firstContentfulPaint 465.12 ms +2.7% -7.74% 455.64 ms +5.74% -11.72% 2.08%
firstBlock 3378.04 ms +1.37% -1.39% 3313.37 ms +1.3% -1.39% 1.95%
type 19.69 ms +3.66% -5.03% 18.57 ms +3.98% -6.89% 6.03%
typeWithoutInspector 18.7 ms +7.81% -4.49% 18.06 ms +6.87% -4.43% 3.54%
typeWithTopToolbar 24.72 ms +4.05% -9.1% 24.37 ms +4.6% -5.13% 1.44%
typeContainer 9.44 ms +6.25% -10.81% 8.99 ms +5.01% -12.24% 5.01%
focus 78.84 ms +7.5% -11.04% 74.63 ms +24.13% -6.2% 5.64%
firstFocus 222.34 ms +0% -0% 207.03 ms +0% -0% 7.4%
selectAll 561.43 ms +3.79% -3.63% 547.77 ms +0.74% -4.83% 2.49%
listViewOpen 65.4 ms +13.82% -12.29% 65.22 ms +8.23% -8.3% 0.28%
inserterOpen 25.62 ms +7.34% -17.1% 23.84 ms +11.37% -6.71% 7.47%
inserterHover 2.32 ms +4.74% -7.76% 2.31 ms +15.15% -9.52% 0.43%
inserterSearch 8.32 ms +2.64% -7.09% 8 ms +5.37% -7.37% 4%
loadPatterns 666.95 ms +3.3% -3.76% 658.37 ms +3.19% -1.98% 1.3%
wpTotal 517.1 ms +2.16% -7.12% 520.55 ms +1.21% -2.83% -0.66%
wpMemoryUsage 13.17 MB +0% -0% 13.13 MB +0% -0% 0.28%
wpDbQueries 54 +0% -0% 54 +0% -0% 0%

site-editor

Metric 8233642 trunk % Change
serverResponse 506.03 ms +2.44% -7.76% 486.28 ms +5.95% -4.47% 4.06%
firstPaint 238.93 ms +7.19% -17.21% 300.24 ms +52.26% -29.71% -20.42%
domContentLoaded 1139.96 ms +2.21% -1.01% 1138.24 ms +3.04% -1.25% 0.15%
loaded 1141.26 ms +2.22% -1.03% 1139.4 ms +3.03% -1.23% 0.16%
firstContentfulPaint 457.23 ms +5.45% -5.21% 464.62 ms +2.13% -1.61% -1.59%
firstBlock 4117.71 ms +1.6% -0.38% 4221.45 ms +0.62% -0.55% -2.46%
type 18.53 ms +3.24% -3.18% 17.64 ms +8.5% -4.31% 5.05%
navigate 118.57 ms +1.65% -3.94% 102.97 ms +2.9% -1.79% 15.15%
loadPatterns 1444.67 ms +8.36% -8.7% 1322.45 ms +3.73% -2.87% 9.24%
loadPages 1052.55 ms +0.9% -1.38% 1056.66 ms +5.84% -3.2% -0.39%
wpTotal 496.67 ms +2.41% -8.02% 476.57 ms +6.05% -4.6% 4.22%
wpMemoryUsage 12.14 MB +0% -0% 12.09 MB +0% -0% 0.41%
wpDbQueries 43 +2.33% -0% 43 +2.33% -0% 0%

174d158 Run

@github-actions github-actions Bot added the [Package] Core data /packages/core-data label Sep 22, 2026
@jeryj jeryj self-assigned this Sep 22, 2026
@jeryj jeryj added [Feature] Link Editing Link components (LinkControl, URLInput) and integrations (RichText link formatting) [Type] Enhancement A suggestion for improvement. [Type] Bug An existing feature does not function as intended and removed [Type] Enhancement A suggestion for improvement. labels Sep 22, 2026
@jeryj
jeryj marked this pull request as ready for review September 24, 2026 13:37
@jeryj
jeryj requested a review from Mamaduka as a code owner September 24, 2026 13:37

@draganescu draganescu 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.

There are some nits but the big nit which may not be a nit is that perPage now is controlling:

  • page size sent to endpoints
  • a signal to cap the merged list
  • a signal to keep body only matches

This is not the best shape. perPage should only be page size sent to endpoints.

Second, the ranking and the body only thing could be separated. Only because discarding body only matches is unexpected - it is a bad UX to show unrelated titles, but instead of discarding results we could put it in the UI that the match is NOT in the title but in the body (like a snippet match +/- some chars?).

const kept = bounded
? sortedResults.slice( 0, perPage )
: sortedResults.filter( ( { found } ) => found > 0 );

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.

This could result in up to 80 items scrolling in the tiny link popover. Nit.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Yeah, but at least you can find them. Most of the time you'd never scroll that far, and since it's overflow hidden, the only people that would encounter that far of a scroll is if they needed those results.

// every title matching a word typed even if they exceed 20. Titles matching no word typed are
// left out: `/wp/v2/search` matches post content and excerpts too, with no way to narrow it.
// Explicitly passed perPage unscoped searches respect the perPage value.
const bounded = type || ! search || limit !== undefined;

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.

We could decide that we don't want body only matches from a word being typed, or through a separate condition and let page limit only be that.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Body results only come back because of how WordPress queries with an AND across post_title, post_content and post_excerpt columns. core data didn't offer a post_title only column option til recently, so when this code was written it wasn't possible to only search a title. #78683 reinforces the decision to only search from a title.

I would have been fine leaving this behavior as is (returning content matches), but it made the code more complicated to bring a behavior that was already iffy. So, I decided to cut it rather than make it work, only to remove it in a follow up PR.

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.

#78683 is about a page parent listing and the enforcement is done by specifying this in query. When linking it's not clear we should be looking for only titles.

@jeryj

jeryj commented Sep 24, 2026

Copy link
Copy Markdown
Contributor Author

perPage now is controlling:

  • page size sent to endpoints
  • a signal to cap the merged list
  • a signal to keep body only matches

This is not the best shape. perPage should only be page size sent to endpoints.

I agree, and am also unsure how to rework the API to provide the behavior in this PR, which is definitely a better end user experience than trunk. I'm very open to adding a new prop to communicate the behavior, but perPage is already a broken prop as it cannot accurately paginate on multi-type searches (default).

In its current form on trunk:

fetchLinkSuggestions( {
  perPage: 20,
  page: 1
} );

This performs a search for 20 results from four different areas (post-type, term, post-format, media) to return up to 80 results from page 1 of each type. Then, the 20 best matches are returned with up to 60 cut as low matches.

fetchLinkSuggestions( {
  perPage: 20,
  page: 2
} );

Fetching page 2 does not search from those 60 discarded results which might have been the results you wanted. It searches { perPage: 20, page: 2 } of each type, and those 60 lost are unreachable.

So, I went with, if perPage is not passed explicitly, we have no contract to honor, and return up to 80 matches. If someone wants the old behavior again, they can pass an explicit perPage: 20. This isn't ideal, but trying to make the most of a bad situation :)

I also considered adding an additional prop instead of relying on the absence of a perPage value:

  1. limit: allow perPage to be set and it operates as it does today. It searches 20 from each bucket but you can limit the results that come back. It's a bit odd since you'd think perPage was already the limit. limit could default to the perPage value. In this PR to get our desired behavior, we'd pass limit as 80 or maybe -1 to return everything.
  2. kind or behavior: Some kind of enum to allow you to use perPage as a limit or to allow more results to come through.
  3. ???? what else could be a good prop name?

@draganescu

Copy link
Copy Markdown
Contributor

I noticed this behaviour of double scrolling on this branch

double-scroll.mp4

@jeryj

jeryj commented Oct 1, 2026

Copy link
Copy Markdown
Contributor Author

@draganescu

I noticed this behaviour of double scrolling on this branch

I've noticed that before too, and I believe it's on trunk too. This PR doesn't touch any UI.

@draganescu draganescu 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.

a nit and a UI issue above but otherwise we can roll with this

*
* @return The weight to add to the result's score.
*/
function getTypeWeight( result: SearchResult ): number {

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.

We don't use this result as a weight so maybe getTypeRank ? And also the doc is talking about a weight but a.type - b.type (since getTypeWeight is assigned later to type in scored) is just a rank

@draganescu

Copy link
Copy Markdown
Contributor

Hmm, I did checkout trunk to see if the double scrollbar repros and it wasn't but I agree it may be a fluke.
🚢

jeryj and others added 9 commits October 1, 2026 08:49
…results

Fixes #63683, where attachments crowd out the pages and posts a link
search is looking for.

Results are weighted by search type — content, then taxonomies, then
attachments, then post formats. An attachment is a file rather than a
destination and a post format is a way of styling a post, so neither earns
anything. Weighing the search type rather than the subtype means every
custom post type counts as content and every custom taxonomy counts as a
taxonomy, with no list to keep up to date, and makes no claim about
whether a page beats a post.

Above the weight sit two facts about the title: whether it contains what
was typed, and whether it begins with it. The score no longer divides by
the title's length, so a long title is not marked down for being long and
repeating a word earns nothing; it counts how much of the search the title
covers, a whole word being worth far more than a word found inside a
longer one.

A search narrowed by `type` is one request, so `perPage` bounds it and
`page` pages through it, unchanged. An unscoped search merges four and
cannot be paginated — `page` applies per request, so anything the merge
discarded is unreachable rather than deferred — so it returns everything
it found, minus titles that do not contain what was typed. WordPress
matches bodies and excerpts too, and unbounded those would fill the list.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbpgaY282xpLjwA8aQv3x9
Seven of the tests added with the ranking assert what another already
covers. Four repeat a rule with different fixtures. Three are named for
concepts the ranking no longer has — a "whole title match", a post format
ranked below an entity, an attachment kept first for an exact title — and
each really asserts that a title containing the search outranks one that
does not, which one test already says plainly. Left in, they would teach a
reader a ranking that is not the one implemented.

Adds the test that was missing instead. Removing each sort key in turn and
running the suite showed nothing caught the loss of the first key, which
decides whether a title contains the search at all: every fixture that
reached it was already separated by the key below. A title that contains
the search without beginning with it, against a better-ranked type that
does not contain it, exercises it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbpgaY282xpLjwA8aQv3x9
Initial suggestions default to three results, but an unscoped preview was
returning one page of each type at once — nine or more before anything had
been typed. Nothing has been typed, so they are a preview rather than an
answer to a search and there is nothing in them to lose by cutting: bound
them as a narrowed search is bounded.

Also drops a paragraph describing the scoring this replaced, which had
survived below its own replacement, and a comment about a caller-supplied
order that does not exist here. Removes an unreachable branch in
`getTypeWeight`, where the search type is always one the order names.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbpgaY282xpLjwA8aQv3x9
The prefix ranking landed here rather than in #83287, which is closed. Its
entry travelled with the file when this branch was split out, leaving two
entries describing one change, one of them pointing at nothing.

Also records that the suggestions shown before anything is typed keep
their limit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbpgaY282xpLjwA8aQv3x9
… filename

Review of the ranking found two faults that undid what it set out to do.

A two-word search deleted titles that held both words apart. The filter
asked whether the title contained the search as one string, so searching
"coffee guide" removed "Guide to Coffee" and "Coffee Roasting Guide For
Beginners" from the results rather than ranking them lower. Keep a result
when the title has every word that was typed, wherever they sit; the
ranking still prefers them together and in that order.

Attachments still crowded out pages, which is the bug this set out to fix.
An attachment is named after its file, so its title very often begins with
what was typed, and beginning with the search was compared before the
type — a tie the type could never break. Compare the type first, which is
also what it means for a type order to drop that advantage.

Also: an unscoped search with nothing typed was neither filtered nor
bounded, so it returned everything four requests found where it used to
return one page. Bound anything that is not a search. And `get_the_title()`
runs `wptexturize`, so a title written with a straight apostrophe comes
back with a curly one and a search typed with a straight one matched
nothing; compare them as the same character.

The type weight moves out of the score, which is now only about the title,
and `perPage` and `page` say what they do not bound.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbpgaY282xpLjwA8aQv3x9
Removing each rule in turn and running the suite found one that nothing
caught: the curly quotes a title comes back from WordPress with. The code
handled them, but no test would have noticed the handling disappearing.

One test covers both characters rather than two covering one each.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbpgaY282xpLjwA8aQv3x9
One described the type comparison while sitting above the one for where
the match falls in the title. Another repeated, three lines later, why a
narrowed search is left alone.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbpgaY282xpLjwA8aQv3x9
jeryj and others added 14 commits October 1, 2026 08:49
`perPage` means at most this many everywhere else, so a caller that names
a number should get no more than it. Only a caller that names none is
taking whatever a page happens to hold, and only then can it be given
more than the default.

That keeps the exception where it is needed — an unscoped search cannot be
paged through, so a title it drops is one nothing could ask for again —
without the parameter meaning something different here than it does
anywhere else.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbpgaY282xpLjwA8aQv3x9
Extracting the coverage score dropped it between the comment describing
the sort and the function it describes, so the exported function had no
documentation and a private helper carried an explanation of four sort
keys it knows nothing about.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbpgaY282xpLjwA8aQv3x9
…closely

Three changes to the same idea, that a title answers a search as far as it
holds the words typed.

How many of those words a title holds is now compared before anything
else, and for every search rather than only an unscoped one. It was a
partition of the unscoped results, which meant the same two titles could
order differently depending on whether a `type` was passed, for reasons
that had nothing to do with the type.

With that band sorted first, the results a search answers are the front of
the list, so keeping them is a slice rather than three arrays and a
concatenation.

A word found inside a longer one is now worth how much of that word it is,
rather than a flat amount. "cat" was worth the same of "caterpillar" as
"cater" was; now "cater" is worth nearly twice as much, and a word that is
the whole of what it was found in is still worth all of it.

Also fixes `limit`, which held a number but was read as a boolean, so
`perPage: 0` fell through to the path it was meant to rule out.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbpgaY282xpLjwA8aQv3x9
The unscoped search with no `perPage` is asserted by the test that keeps
every title matching a word typed, which checks the same count and the
composition of the results besides. Breaking the cut rule three ways —
narrowing it to every word, widening it to everything, and removing the
floor — still fails a test without it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbpgaY282xpLjwA8aQv3x9
…coped ones

The filter sat inside the branch that applies `perPage`, so a search either had
its results capped or had title-less ones removed, never both. That made
`perPage` decide two unrelated things: how many results come back, and whether
a result matched on body text counts as one at all. Searching with an explicit
`perPage`, or narrowed to a type, still padded the list with titles holding
nothing that was typed.

Deciding which results count and how many of them to return are now separate
expressions, so `perPage` is a cap again and nothing else.

With nothing typed there is no word for a title to hold, so those searches
return before any of this, ranked but unfiltered.

A test fixture claimed to check the per page cap on a narrowed search while
feeding it thirty titles that held nothing of the search. It now holds titles
that match, with body-only rows beside them to prove they are excluded.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbpgaY282xpLjwA8aQv3x9
8.1.0 was cut while this branch was open, so merging trunk turned the heading
this entry sat under into a released version. CI rejects an unreleased change
filed under a published one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbpgaY282xpLjwA8aQv3x9
…ge them

`perPage` was doing three jobs: the page size sent to each endpoint, a cap on
the merged list, and — through its own absence — whether results matched on
body text were kept. Only the first is what `perPage` means anywhere else in
WordPress.

It now only sizes each request. Nothing is discarded, so an unscoped search
returns everything the four endpoints gave, ranked, with titles holding none of
the search last because `found` is the first comparison.

That also fixes paging rather than working around it. Cutting the merge was
what made results unreachable: `page` asks each endpoint for its own next page,
never for what the merge threw away, so anything cut was on no page at all.
Keeping it all means consecutive pages tile the whole result set — verified
with two endpoints of 25 rows at `perPage: 20`, where pages one and two return
40 and 10 results, covering all 50 with no overlap.

A search narrowed to one type is still a single request, so there `perPage`
remains the page boundary.

Fixes a fixture where the `brewing` case had been appended to a fall-through
group, so six endpoints returned its rows instead of nothing. The discarding
this commit removes was hiding it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbpgaY282xpLjwA8aQv3x9
`perPage` and `page` are the page size and page number for each type, so an
unscoped search asks several endpoints and returns what they all gave. Nothing
is trimmed afterwards, which is what makes `page` usable: it asks each endpoint
for its own next page, never for what a merge threw away, so anything cut here
would have been on no page at all.

Initial suggestions sort with everything else rather than returning in the
order the endpoints happened to answer.

With no cut there is nothing left that needs to read a result's score, so
`rankResults` folds back into `sortResults` and `ScoredResult` goes with it.

Drops a test that asserted a narrowed search trims to `perPage`. Its fixture
answered a request for 20 with 40 rows, which no endpoint does — the trimming
was re-enforcing what the server already guarantees.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbpgaY282xpLjwA8aQv3x9
…o longer reach

Several comments still described behaviour from earlier passes: that an
unscoped search cannot be paged through, that the type acts as a weight rather
than a band, and that a page outranks a partial match on type when the word
count is compared first. The changelog said results were cut because the merge
could not be paged, which is backwards — not cutting is what lets `page` reach
every result.

Removes two tests that no longer claimed anything the others do not, and the
nine fixture cases left unreachable by their removal. A case that was still
needed would fall through to the mock's sentinel row and change a count, so the
suite passing is what shows they were dead.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbpgaY282xpLjwA8aQv3x9
@jeryj
jeryj force-pushed the update/link-suggestion-ranking branch from 8a11a79 to 8eb6f2c Compare October 1, 2026 13:53
@jeryj
jeryj removed this pull request from stack #83658 October 1, 2026 14:05
@jeryj
jeryj enabled auto-merge (squash) October 1, 2026 14:10
@jeryj
jeryj merged commit 03432f8 into trunk Oct 1, 2026
112 checks passed
@jeryj
jeryj deleted the update/link-suggestion-ranking branch October 1, 2026 14:37
@github-actions github-actions Bot added this to the Gutenberg 24.2 milestone Oct 1, 2026
widoz pushed a commit to widoz/gutenberg that referenced this pull request Oct 2, 2026
…results (WordPress#83407)

Fixes WordPress#63683, where attachments crowd out the pages and posts a link
search is looking for. perPage on fetchLinkSuggestions now means 
how many results you want back from each requested type. This fixes
pagination for multi-type searches as well.

---------
Co-authored-by: jeryj <jeryj@git.wordpress.org>
Co-authored-by: draganescu <andraganescu@git.wordpress.org>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
wporg-sync pushed a commit to WordPress/WordPress that referenced this pull request Oct 20, 2026
This updates the pinned commit hash of the Gutenberg repository from 954fe7f9e04631c41aec4552acd627a7203a2aad to 7b95ee96b54de2e35886971ccf7eb449c324c830 (version 24.2.0).

A full list of changes included in this commit can be found on GitHub: WordPress/gutenberg@954fe7f...7b95ee9

- useServerSideRender: parse messages from caught errors (WordPress/gutenberg#83365)
- Docs: Fix published Vitest migration-guide links (WordPress/gutenberg#83449)
- Fix: Whitespace changes are not shown in the Resolve Block diff. (WordPress/gutenberg#82397)
- Editor: Use SearchableSelect for the post author field (WordPress/gutenberg#83323)
- Docs: Note that block attributes and global styles values are untrusted at render time (WordPress/gutenberg#83473)
- RichText: Remove dead exports and consolidate deprecations (WordPress/gutenberg#83461)
- Inserter: Manage roving tab index to skip re-rendering every item (WordPress/gutenberg#83437)
- SearchableSelectControl: Add to @wordpress/ui (WordPress/gutenberg#80979)
- Try: Bolder "B" icon (WordPress/gutenberg#83321)
- Ignore composer vendor files from top-level gitignore. (WordPress/gutenberg#22283)
- Tests: Add floating notes e2e coverage (WordPress/gutenberg#83477)
- Block Editor: Check the inserter's fallback containers unmemoized (WordPress/gutenberg#83446)
- Packages: Update Ariakit to 0.4.40 (WordPress/gutenberg#83278)
- Tests: Enforce per-call Vitest console expectations (WordPress/gutenberg#83095)
- Theme: Fix virtual modules, root styles, and seed validation (WordPress/gutenberg#83355)
- DataViews: Fix README to describe sort() as receiving field values, not items (WordPress/gutenberg#83483)
- Combobox: Label popup dialogs in stories (WordPress/gutenberg#83476)
- Block editor: Isolate mutable test fixtures (WordPress/gutenberg#83098)
- Blocks: Isolate registration state in tests (WordPress/gutenberg#83099)
- UI: Remove automatic Notice announcements (WordPress/gutenberg#82737)
- Text: Migrate Emotion styles to an SCSS Module (WordPress/gutenberg#82573)
- Block library: Isolate order-sensitive test interactions (WordPress/gutenberg#83101)
- Format Library: unify FormatEditProps to one type, move private types (WordPress/gutenberg#83487)
- UI: Announce selected chips in SearchableChipSelect (WordPress/gutenberg#82863)
- Card: Migrate from Emotion to SCSS modules (WordPress/gutenberg#82577)
- Components: Deprecate the private Menu API (WordPress/gutenberg#82947)
- CustomGradientPicker: Migrate control wrappers to an SCSS module (WordPress/gutenberg#82576)
- Components: Isolate order-sensitive UI tests (WordPress/gutenberg#83103)
- Tests: Isolate mutable configuration fixtures (WordPress/gutenberg#83104)
- Core data: Finish deferred selection updates in RTC test (WordPress/gutenberg#83366)
- Block editor: Wait for final keyboard link suggestions (WordPress/gutenberg#83489)
- Data: Assert and silence resolution error in useSuspenseSelect test (WordPress/gutenberg#83491)
- Tests: Isolate deprecation warning state (WordPress/gutenberg#83107)
- UI: Align selection popup checkmarks with the first label line (WordPress/gutenberg#82942)
- Tests: Resolve Browser Mode commands against the live iframe (WordPress/gutenberg#83495)
- Ensure position type is a string (WordPress/gutenberg#83500)
- MediaUpload: Fix console error when reopening Gallery media library (WordPress/gutenberg#76749)
- Refactor stylelint config detection in lint-style.js (WordPress/gutenberg#79280)
- Docs: Recommend UI Tabs for switching views (WordPress/gutenberg#83516)
- Popover: Close non-modal popovers on iframe interaction (WordPress/gutenberg#83509)
- Typography: List only the weights inside a variable font's range (WordPress/gutenberg#83128)
- Style book: Add link to example text. (WordPress/gutenberg#83448)
- Tests: Add Vitest Browser Mode failure artifacts (WordPress/gutenberg#83093)
- Theme: Make JavaScript token fallback transforms syntax-aware (WordPress/gutenberg#83356)
- Editor: Fix new posts being published with the `auto-draft` slug (WordPress/gutenberg#83518)
- Editor: Gather the View group of the Options menu into submenus (WordPress/gutenberg#82976)
- Tests: Fix PostCSS browser-externalized warnings in Vitest (WordPress/gutenberg#83091)
- Tests: Shuffle test cases in CI (WordPress/gutenberg#83111)
- Update Styles > Blocks description. (WordPress/gutenberg#83515)
- Columns: Remove the column count slider (WordPress/gutenberg#83262)
- BorderControl: Remove `%` from the border width units (WordPress/gutenberg#83492)
- Fields: Fix AuthorView for users who can't edit users (WordPress/gutenberg#83498)
- Update and add justify icons. (WordPress/gutenberg#83519)
- RichText: Refactor useMarkPersistent, fix StrictMode mount mark (WordPress/gutenberg#83463)
- Theme: Improve accessibility, API documentation, and compatibility checks (WordPress/gutenberg#83358)
- Theme: Preserve global token references in Lightning CSS (WordPress/gutenberg#83359)
- Tests: Migrate internal linting to Vitest and remove unused Jest dependencies (WordPress/gutenberg#83502)
- Improve specificity of lightbox button selector (WordPress/gutenberg#70800)
- TextControl: Use design system colors when disabled (WordPress/gutenberg#83307)
- Fix: Image lightbox: overlay becomes unusable (can't close) when it isn't a direct child of `<body>` (WordPress/gutenberg#83480)
- Notes: Extract note selection sync into useNoteSelection hook (WordPress/gutenberg#83528)
- Block Parser: Document `\WP_Block_Parser::$stack` as a list (WordPress/gutenberg#82695)
- CollapsibleCard: Scope the header focus ring to its own trigger (WordPress/gutenberg#81314)
- Fix broken links in docs (WordPress/gutenberg#83545)
- Icons: Use assertEqualHTML() in icons registry tests (WordPress/gutenberg#83544)
- Editor: Merge adjacent revision inline diffs (WordPress/gutenberg#80579)
- Date: Ignore trailing format backslash instead of printing undefined (WordPress/gutenberg#81528)
- Block Supports: Add background-clip block support infrastructure (WordPress/gutenberg#77141)
- Block Editor: Fix translator comments for block count announcements (WordPress/gutenberg#83555)
- Paste: replace non-breaking spaces at the edges of text with regular spaces (WordPress/gutenberg#83464)
- Media Editor: Fix pan drag flooding undo history after wheel zoom (WordPress/gutenberg#83558)
- Rich text: fix iOS double tap selection, preventing focus capture under editable host (WordPress/gutenberg#81042)
- Block editor: migrate state-control badges to UI Badge (WordPress/gutenberg#82608)
- Gallery: Add Order By controls for static gallery, consolidate controls in settings sidebar (WordPress/gutenberg#83438)
- Media editor: show an error when saving attachment details fails (WordPress/gutenberg#83560)
- Position controls: Fix useSelect warning for selected state viewports (WordPress/gutenberg#83570)
- Inserter: Use design system focus ring for previews (WordPress/gutenberg#83126)
- Image: Fix lightbox using thumbnail aspect ratio instead of original image ratio (WordPress/gutenberg#79058)
- Docs: Clarify @wordpress/ui icon color requirements (WordPress/gutenberg#83564)
- docker compose -T if stdin is not a tty (WordPress/gutenberg#78374)
- Storybook: Add new contributing page. (WordPress/gutenberg#83345)
- Widget Primitives: Avoid Vite warnings for runtime widget modules (WordPress/gutenberg#83602)
- Build: Update Vite to 8.3.1 and simplify Storybook tooling (WordPress/gutenberg#83569)
- doc(wp-env) Change core branch from trunk to master in doc (WordPress/gutenberg#83566)
- wp-build: Remove the unused boot, private-apis, and route optional peer dependencies (WordPress/gutenberg#83601)
- CI: Check CHANGELOG presence for published tooling and config packages (WordPress/gutenberg#83577)
- Tests: Enforce Vitest assertion coverage (WordPress/gutenberg#83572)
- Icons: Update heading level icons for optical balance (WordPress/gutenberg#83268)
- ESLint: Add allowUseWithCaution option to use-recommended-components (WordPress/gutenberg#83536)
- Notes: Refactor floating board measurement (WordPress/gutenberg#83485)
- Inserter: Stop re-rendering the block list on block selection change (WordPress/gutenberg#83284)
- Paste: Give each pasted data-URI image unique filename to avoid upload collisions. (WordPress/gutenberg#79480)
- Changelog validator: ignore markdown & configs d46223 (WordPress/gutenberg#83618)
- Font Library: Use UI Menu for collection actions (WordPress/gutenberg#82965)
- Storybook: Show prop descriptions in Canvas controls (WordPress/gutenberg#83581)
- test: Link upstream warning fixes in config (WordPress/gutenberg#83632)
- Storybook: Use one block-editor store module (WordPress/gutenberg#83636)
- Tests: Use strict assertions synced from Core changeset 63934. (WordPress/gutenberg#83619)
- Math: Store cell alignment in the MathML and polyfill alignment and overlines in Chromium (WordPress/gutenberg#83164)
- Storybook: Reuse PostCSS browser resolver in smoke tests (WordPress/gutenberg#83635)
- Editor: Use UI Menu for template options (WordPress/gutenberg#82964)
- RTC: Add a EntitySyncManager interface in core-data (WordPress/gutenberg#83410)
- Term Count: Add margin support (WordPress/gutenberg#83608)
- Archives: Add minimum height support (WordPress/gutenberg#83573)
- Media Editor: Stop the crop pixel snap from recording undo history (WordPress/gutenberg#83571)
- Term Name: Add margin support (WordPress/gutenberg#83606)
- Post Author Biography: Add text indent support (WordPress/gutenberg#83614)
- Code: Add minimum width and height support (WordPress/gutenberg#83574)
- Details: Add minimum width support (WordPress/gutenberg#83576)
- Post Content: Add minimum width support (WordPress/gutenberg#83575)
- Post Excerpt: Add minimum width and height support (WordPress/gutenberg#83578)
- Post Title: Add minimum width and height support (WordPress/gutenberg#83600)
- Footnotes: Add minimum width and height support (WordPress/gutenberg#83579)
- Storybook: Place Notice announcements under Components (WordPress/gutenberg#83617)
- InputControl: Darken the field border on hover (WordPress/gutenberg#83306)
- npm: Switch from legacy-peer-deps to strict-peer-deps (WordPress/gutenberg#81029)
- Term Name: Add minimum width and height support (WordPress/gutenberg#83599)
- Columns: Allow dropping a column at the outer edges (WordPress/gutenberg#83274)
- E2E: Pin the site title in the Interactivity API router specs and give the E2E Storybook build more heap. (WordPress/gutenberg#83474)
- Heading: Add minimum width and height support (WordPress/gutenberg#83580)
- Login/out: Add minimum width and height support (WordPress/gutenberg#83583)
- Verse: Add minimum width support (WordPress/gutenberg#83609)
- Video, Cover: Don't autoplay in the editor when reduced motion is preferred (WordPress/gutenberg#83337)
- Media & Text: Lower the specificity of the content padding (WordPress/gutenberg#83563)
- Pagination: Add padding, margin, and block gap support (WordPress/gutenberg#83743)
- Fix peer dependency conflicts left in the lockfile (WordPress/gutenberg#83754)
- Comments Pagination: Add padding, margin, and block gap support (WordPress/gutenberg#83744)
- Term Count: Add minimum width and height support (WordPress/gutenberg#83596)
- Read More: Add border style support (WordPress/gutenberg#83735)
- Cover: Don't autoplay embedded background videos when reduced motion is preferred (WordPress/gutenberg#83452)
- No Results: Add minimum width and height support (WordPress/gutenberg#83584)
- RichText: Rename utils.jsx to utils.js (WordPress/gutenberg#83758)
- Quote: Add minimum width support (WordPress/gutenberg#83592)
- Upgrade typescript-eslint to v8.70.1 (WordPress/gutenberg#83760)
- Tabs: Add minimum width support (WordPress/gutenberg#83595)
- Site Tagline: Add minimum width and height support (WordPress/gutenberg#83589)
- Heading: Add text indent support (WordPress/gutenberg#83615)
- Site Title: Add minimum width and height support (WordPress/gutenberg#83593)
- Home Link: Add padding and margin support (WordPress/gutenberg#83607)
- Preformatted: Add minimum width and height support (WordPress/gutenberg#83587)
- Include E2E Storybook sources in docgen (WordPress/gutenberg#83634)
- Extensible Site Editor: Pass custom block categories to the blocks store (WordPress/gutenberg#83762)
- Packages: Declare missing peer dependencies and check them in CI (WordPress/gutenberg#83765)
- Post Terms: Add minimum width and height support (WordPress/gutenberg#83586)
- Group, Cover: Track drop zone element in state (WordPress/gutenberg#83756)
- Global Styles: Add pseudo-state controls for Navigation Link (WordPress/gutenberg#83451)
- storybook: Register playground core blocks once (WordPress/gutenberg#83637)
- Document Outline: Show the design system focus ring instead of legacy box-shadow (WordPress/gutenberg#83755)
- storybook: Update BlockPopover fixture to API version 3 (WordPress/gutenberg#83642)
- Add typing to iAPI's getConfig() (WordPress/gutenberg#71692)
- Components: deprecate Badge (WordPress/gutenberg#82379)
- Block Editor: Fix style / nested attribute overwrite during multi-selection (WordPress/gutenberg#80070)
- Notes: Restrict menu actions for resolution notes and resolved threads (WordPress/gutenberg#73243)
- UI: Add change actions to form primitive stories (WordPress/gutenberg#83591)
- Icons: Support keyword-based search in the icons registry (WordPress/gutenberg#82367)
- Avatar: Explain that avatars use the Gravatar service (WordPress/gutenberg#83567)
- UI: Add item labels and descriptions to remaining popups (WordPress/gutenberg#83493)
- PaletteEdit: Stop changing the slug when renaming a preset (WordPress/gutenberg#83750)
- Storybook: Fix missing block styles in BlockCanvas playground stories (WordPress/gutenberg#81070)
- Tests: Enforce Vitest callback, promise, and title rules (WordPress/gutenberg#83620)
- ItemGroup: Use design system focus ring (WordPress/gutenberg#83764)
- Keep the legacy CheckboxControl visually consistent across viewports (WordPress/gutenberg#83612)
- Media editor: Use UI Menu for crop aspect ratio (WordPress/gutenberg#82968)
- Use strict assertions in override script tests (WordPress/gutenberg#83782)
- Home Link: Add minimum width and height support (WordPress/gutenberg#83582)
- Tab Panels: Add minimum height support (WordPress/gutenberg#83594)
- Post Time to Read: Add minimum width and height support (WordPress/gutenberg#83598)
- Term Description: Add minimum width and height support (WordPress/gutenberg#83597)
- UI: Keep InputLayout chrome at md on small viewports (WordPress/gutenberg#82764)
- Math: Add minimum width and height support (WordPress/gutenberg#83585)
- Tests: Bump undici in the AI development test lockfile (WordPress/gutenberg#83799)
- Bump brace-expansion in /test/ai-development (WordPress/gutenberg#83807)
- Bump js-yaml and promptfoo in /test/ai-development (WordPress/gutenberg#83797)
- Bump fast-uri from 3.1.7 to 3.1.8 (WordPress/gutenberg#83829)
- Update AI Development package versions after npm audit (WordPress/gutenberg#83830)
- Notes: Add show and hide options for floating notes (WordPress/gutenberg#83768)
- Add separators to item popup components (WordPress/gutenberg#83776)
- Components: Align RadioControl colors with UI Radio (WordPress/gutenberg#83270)
- E2E: Mock Openverse in image drag-and-drop inserter test (WordPress/gutenberg#83842)
- FormToggle: Match Switch colors across states (WordPress/gutenberg#83773)
- Bump `@react-spring/web` from 9.4.5 to 10.1.2 (WordPress/gutenberg#83796)
- ColorPalette: Show design system focus ring on custom color button (WordPress/gutenberg#83841)
- Docs: Remove CheckboxControl heading from InspectorControls example (WordPress/gutenberg#83844)
- Base Styles: Default the admin theme color to Blueberry (WordPress/gutenberg#83749)
- Menu: Guard against nesting Group and RadioGroup (WordPress/gutenberg#83792)
- Template Part: Fall back to rendering a template part from the theme file if the db version is unavailable (WordPress/gutenberg#83809)
- Tests: Reset deprecation history in shared Vitest setup (WordPress/gutenberg#83849)
- Menu: Disable triggers instead of roots in consumers (WordPress/gutenberg#83791)
- Playlist: Replace the waveform player patch with its no-autoinit entry (WordPress/gutenberg#83132)
- Update UI Spinner appearance and add a color prop (WordPress/gutenberg#83775)
- UI: Align component names with their semantics (WordPress/gutenberg#83789)
- Checkbox: Prevent rounded themes from making checkboxes circular (WordPress/gutenberg#83526)
- Storybook: Update manifest snapshot for Spinner color prop (WordPress/gutenberg#83856)
- Button: Only open the link popover on explicit user action (WordPress/gutenberg#30166)
- Gallery Lightbox: Prevent image click from closing the dialog when navigation is enabled (WordPress/gutenberg#78898)
- UI: Recommend Checkbox family components (WordPress/gutenberg#83771)
- RadioControl: Keep a 16px visual with a larger hit target (WordPress/gutenberg#83840)
- Table: replace deprecated word-break with overflow-wrap: anywhere (WordPress/gutenberg#82480)
- Tag Cloud: Update styles and add `!important` (WordPress/gutenberg#70224)
- Correctly document the `blockName` property as being nullable (WordPress/gutenberg#70900)
- Add inertValue helper and use it for setting inert attribute (WordPress/gutenberg#83871)
- Enable editableRoot for the list item block for multi-selection on mobile (WordPress/gutenberg#82816)
- Verify localized data retention in override script test (WordPress/gutenberg#83845)
- Tests: Bump ibm-cloud-sdk-core in the AI development test lockfile (WordPress/gutenberg#83887)
- UI: Recommend Notice component (WordPress/gutenberg#82685)
- Fix: MediaUpload `gallery` prop ignores `allowedTypes` (WordPress/gutenberg#78257)
- Media editor: Add a session boundary above the cropper (WordPress/gutenberg#83550)
- DataViews: Measure the container as the data view mounts to avoid a single column flash (WordPress/gutenberg#83752)
- Pullquote: Add minimum width support (WordPress/gutenberg#83588)
- Media editor: Remove initial state seeding from the session (WordPress/gutenberg#83893)
- UI: Add e2e Storybook popup item layout fixtures (WordPress/gutenberg#83488)
- Storybook: Give CI job a distinct name (WordPress/gutenberg#83869)
- Coding standards: Skip anonymous class methods in block library function name sniff (WordPress/gutenberg#83900)
- Pagination: Add border support (WordPress/gutenberg#83745)
- PR meta: Move the props list into the shared comment (WordPress/gutenberg#82302)
- Comments Pagination: Add border support (WordPress/gutenberg#83746)
- Scripts: Resolve default configs without hoisted dependencies (WordPress/gutenberg#83902)
- Image: Fix invalid CSS url() value in circle-mask style (WordPress/gutenberg#82333)
- Query Total: Add minimum width and height support (WordPress/gutenberg#83590)
- Scripts: Treat files passed after --fix as file arguments (WordPress/gutenberg#83521)
- Editor: Remove icon for 'Export' more menu item (WordPress/gutenberg#83901)
- Dashboard Widgets: let a mounted widget declare actions at runtime (WordPress/gutenberg#83877)
- Framework: Switch from hoisted to isolated dependencies (WordPress/gutenberg#83847)
- Test: Run Vitest type graph validation in process (WordPress/gutenberg#83851)
- Remove use-memo-one usage (missing React 19 compat) (WordPress/gutenberg#83952)
- Fix Post Featured Image crash when isLink is enabled (WordPress/gutenberg#81584)
- Experiment: restyle classic wp-admin controls from design system tokens (WordPress/gutenberg#82425)
- Tests: Lint JavaScript Vitest mock imports (WordPress/gutenberg#83783)
- Build: Remove patch-package (WordPress/gutenberg#83982)
- Docs: Update deprecation testing guidance for shared reset (WordPress/gutenberg#83989)
- DataViews: list hideable fields alphabetically in the view config (WordPress/gutenberg#83947)
- Core Data: Rank link suggestions by type, and stop discarding merged results (WordPress/gutenberg#83407)
- Add new react-inert-value package with inertValue helper (WordPress/gutenberg#83987)
- Connectors: Keep a stored API key read-only when it can't be verified (WordPress/gutenberg#83889)
- Navigation: Search every entity type from the link UI (WordPress/gutenberg#83408)
- Tests: Cover translation setup in override script tests (WordPress/gutenberg#83886)
- Build: Update Vite to 8.3.2 and remove the PostCSS browser resolver (WordPress/gutenberg#83992)
- Update readme title to match block name (WordPress/gutenberg#83999)
- RTC: Fix undo breaking for non-synced entities (WordPress/gutenberg#83888)
- CI: Cover the AI development lockfile with Dependabot instead of npm audit (WordPress/gutenberg#83997)
- Latest Posts: Add minimum width and height support (WordPress/gutenberg#83905)
- Avatar: Add shadow support (WordPress/gutenberg#83929)
- Tab List: Add shadow support (WordPress/gutenberg#83922)
- Buttons: Add minimum width and height support (WordPress/gutenberg#83894)
- Social Icons: Add shadow support (WordPress/gutenberg#83920)
- Columns: Add minimum width and height support (WordPress/gutenberg#83895)
- Gallery: Add shadow support (WordPress/gutenberg#83919)
- File: Add shadow support (WordPress/gutenberg#83918)
- Page List: Add minimum width and height support (WordPress/gutenberg#83908)
- Build Tooling: Read npm v12 pack --json output (WordPress/gutenberg#84011)
- Accordion Heading: Add line height support (WordPress/gutenberg#83958)
- Paragraph: Add shadow support (WordPress/gutenberg#83926)
- Media & Text: Add minimum width and height support (WordPress/gutenberg#83906)
- Tests: Patch basic-ftp in AI development dependencies (WordPress/gutenberg#84000)
- Env, E2E: Update dependencies that ran native install scripts (WordPress/gutenberg#84012)
- Tests: Update Vitest to 5.0.3 and Storybook to 10.6.1 (WordPress/gutenberg#83996)
- Search: Add padding support (WordPress/gutenberg#83984)
- Block editor: Honour background skip serialization in the editor (WordPress/gutenberg#83943)
- Framework: Declare React types in the workspaces that use them (WordPress/gutenberg#84013)
- Fit text: Size each block instance in a loop independently (WordPress/gutenberg#83985)
- FocalPointPicker: end a drag released over the editor canvas (WordPress/gutenberg#83348)
- Tests: Cover Menu scroll lock and LinkControl protocols in browsers (WordPress/gutenberg#83991)
- List: Add shadow support (WordPress/gutenberg#83923)
- UI: Add Progress with custom color support (WordPress/gutenberg#83781)
- ESLint: Allow non-module stylesheet imports in unit tests (WordPress/gutenberg#84019)
- Canvas loader: Use UI Progress and pass color via the indicator prop (WordPress/gutenberg#83860)
- Menu: Align group labels and separators with indented item labels. (WordPress/gutenberg#83993)
- react-inert-value: add missing types/react peer dep (WordPress/gutenberg#84024)
- Docs: Refine design system agent guidance (WordPress/gutenberg#84007)
- Navigation: List allowed blocks in the link UI search results + add transformSuggestions to Link Control (WordPress/gutenberg#83652)
- Sync: Remove exposed wp.sync package (WordPress/gutenberg#81999)
- Style: Update color to use CSS variable in edit-site (WordPress/gutenberg#79002)
- Popover: drop the will-change hint once the popover stops moving (WordPress/gutenberg#77359)
- MediaEdit: Show a checkerboard background behind image previews (WordPress/gutenberg#83846)
- Quote: Add button colour support (WordPress/gutenberg#83983)
- Media & Text: Add duotone support (WordPress/gutenberg#83981)
- Gallery: Add duotone support (WordPress/gutenberg#83978)
- Interactivity API Router: Add reactive navigation lifecycle and initiator API (WordPress/gutenberg#83280)
- Notes: Move floating notes into a canvas margin (WordPress/gutenberg#83786)
- Verse: Add text columns and indent support (WordPress/gutenberg#83962)
- Notes: Scroll floating notes with the canvas (WordPress/gutenberg#83852)
- Notes: Add Undo to deleted note snackbar (WordPress/gutenberg#83988)
- Framework: Move @typescript/native from the root to the workspaces that use it (WordPress/gutenberg#84027)
- Repair invalid peer dependencies in the lockfile (WordPress/gutenberg#84062)
- Term Template: Add minimum width and height support (WordPress/gutenberg#83914)
- Fix check type declarations (WordPress/gutenberg#84070)
- Media: track the original attachment id for edited images (WordPress/gutenberg#81803)
- Post Comments Form: Add font family support (WordPress/gutenberg#83967)
- Media Utils: Add `MediaEdit` as a private API (WordPress/gutenberg#84046)
- Build Tools: Fix flaky ESM package types test timeout (WordPress/gutenberg#84068)
- Embed: Add padding support (WordPress/gutenberg#83963)
- Interactivity API: Add a data-wp-html directive (WordPress/gutenberg#83092)
- Typography and "block-default icon polish. (WordPress/gutenberg#84073)
- Release Tooling: Read the npm v12 JSON output shapes (WordPress/gutenberg#84075)
- Menu: Align submenu labels and highlight open parents (WordPress/gutenberg#84031)
- Props Bot: Skip bare reviews that duplicate their review comment runs (WordPress/gutenberg#84076)
- Dataviews: use inertValue in CompositeGrid (WordPress/gutenberg#84072)
- UI: Add Meter (WordPress/gutenberg#83855)
- Media & Text: Add shadow support (WordPress/gutenberg#83976)
- Media editor: restore original image in modal (WordPress/gutenberg#81805)
- List: Add background image, size, and gradient support (WordPress/gutenberg#83935)
- List Item: Add background image, size, and gradient support (WordPress/gutenberg#83936)
- Block Editor: Fix 'Manage allowed blocks' not shown when its the only 'Advanced' control (WordPress/gutenberg#84067)
- Design System: Clarify tooltip labeling and UI review guidance (WordPress/gutenberg#83898)
- Gallery: Add minimum width and height support (WordPress/gutenberg#83897)
- File: Add minimum width and height support (WordPress/gutenberg#83896)
- Media: Return 0 from the edit root lookup when there is no edit root (WordPress/gutenberg#84096)
- Read More: Add minimum width and height support (WordPress/gutenberg#83912)
- UI: Recommend Radio family components (WordPress/gutenberg#83872)
- Latest Comments: Add minimum width and height support (WordPress/gutenberg#83904)
- chore: Use v24 in .nvmrc (WordPress/gutenberg#84061)
- Embed: Add minimum width and height support (WordPress/gutenberg#83903)
- Post Comments Form: Add minimum width and height support (WordPress/gutenberg#83910)
- Post Featured Image: Add border style support (WordPress/gutenberg#83956)
- Buttons: Add shadow support (WordPress/gutenberg#83916)
- Poetry: Add fit text support (WordPress/gutenberg#83980)
- Video: Add duotone support (WordPress/gutenberg#83979)
- Notes: Keep anchor writes out of undo history (WordPress/gutenberg#84079)
- ProgressBar: Use WPDS color tokens (WordPress/gutenberg#83779)
- REST API: Add action-trash link to posts and comments (WordPress/gutenberg#84045)
- RSS: Add minimum width and height support (WordPress/gutenberg#83913)
- Notes: Reset paragraph top margin in floating notes (WordPress/gutenberg#84101)
- Global Styles: Fix popover position in Styles screen (WordPress/gutenberg#84048)
- Block Switcher: Show design system focus ring on pattern previews (WordPress/gutenberg#83933)
- MediaEdit: Use design system focus ring (WordPress/gutenberg#83854)
- Notes: Delete permanently when the trash is disabled (WordPress/gutenberg#84102)
- Release: Rewrite SVN publication scripts in Node.js (WordPress/gutenberg#84034)
- ContentEditableControl: Keep a disabled field focusable (WordPress/gutenberg#84083)
- States: Scope per-instance rules to the block's root element (WordPress/gutenberg#83986)
- List Item: Add shadow support (WordPress/gutenberg#83925)
- DataViews: Truncate filter chips instead of wrapping them (WordPress/gutenberg#83879)
- Experiments: Turn the React 19 experiment on by default (WordPress/gutenberg#83784)
- Notes: Extract NoteReply and lift AddNote gating (WordPress/gutenberg#84106)
- Interactivity API: Remove expired deprecated behaviors (WordPress/gutenberg#84098)
- Breadcrumbs: Fix typo in aria label translation context (WordPress/gutenberg#84112)
- ESLint: Allow generated test titles (WordPress/gutenberg#83995)
- Icons: Add keywords to icon manifest (WordPress/gutenberg#83884)
- Tooltip: Control the hover delay cancellation test clock (WordPress/gutenberg#84113)
- VS Code: Add managed workspace config (WordPress/gutenberg#84025)
- Breadcrumb: fix getMeasurementRender for React 19 (WordPress/gutenberg#84069)
- Notes: Fix flaky thread scroll e2e test (WordPress/gutenberg#84118)
- Detect the database client in the unit test debug step. (WordPress/gutenberg#84089)
- UI: Preserve Autocomplete item type inference (WordPress/gutenberg#84095)
- UI: Recommend Switch family components (WordPress/gutenberg#84097)
- Env: Add an option to choose the MariaDB version (WordPress/gutenberg#83751)
- UI: Preserve Combobox source item generics (WordPress/gutenberg#84094)
- Menu: Tighten spacing, use 16px prefix icons, and cap width at 320px (WordPress/gutenberg#84028)
- Notes: Preserve unsent note and reply drafts (WordPress/gutenberg#84110)
- Theme: Add integration test coverage for seed colors in artifacts (WordPress/gutenberg#81161)
- Progress: Migrate remaining ProgressBar usages and recommend UI Progress (WordPress/gutenberg#84021)
- Components: Fix polymorphism typings leaking `as` prop (WordPress/gutenberg#82704)
- Media & Text: Add background image, size, and gradient support (WordPress/gutenberg#83927)
- Experiments: Use a mock plugin slug that no WordPress build ships in the unrelated-plugin test (WordPress/gutenberg#84133)
- Button: Add background image, size, and gradient support (WordPress/gutenberg#83950)
- Tests: Isolate Ajv per test in wp-env schema tests to avoid order dependence (WordPress/gutenberg#84139)
- Storybook: Read icon keywords from the manifest (WordPress/gutenberg#84127)
- SandBox: Fix embed previews that require a referrer in Safari (WordPress/gutenberg#84014)
- Notes: Restore child notes trashed along with their parent note (WordPress/gutenberg#84100)
- Style states: fix exception when there's no selected block (WordPress/gutenberg#84140)
- Chore: Use v24.20 in  `.nvmrc` config file. (WordPress/gutenberg#84138)
- Security: Opt in to the npm v12 supply-chain defaults (WordPress/gutenberg#82689)
- Docs: Describe isolated dependencies for agents and contributors (WordPress/gutenberg#84141)
- Upgrade code and types to React 19 (WordPress/gutenberg#83941)
- Latest Comments: Add border support (WordPress/gutenberg#84148)
- Add prettier, eslint and stylelint to the root package.json (WordPress/gutenberg#84017)
- FontSizePicker: Migrate Emotion styles to SCSS Modules (WordPress/gutenberg#84126)
- Fields API: Add the server-side registry and REST route (WordPress/gutenberg#84078)
- Block bindings: add support to `icon` attribute of `core/icon` (WordPress/gutenberg#80730)
- VisuallyHidden: Move hiding styles outside CSS cascade layers (WordPress/gutenberg#84114)
- Theme: Generate complete border token modes for Figma testing (WordPress/gutenberg#84035)
- Developer tools: Simplify editor setup and add Zed settings (WordPress/gutenberg#84143)
- Consolidate wp-admin container radiuses onto the design system scale (WordPress/gutenberg#82427)
- CustomGradientPicker: Extend control point targets to the bar height (WordPress/gutenberg#84124)
- Notes: Draw the canvas divider from body so it uses the theme text color (WordPress/gutenberg#84158)
- Icons: Experiment with proportional stroke scaling (WordPress/gutenberg#84081)
- Global Styles: Ignore theme.json values of unexpected types (WordPress/gutenberg#84523)
- React 19 codemod: apply defaultProps when rendering a memo component (WordPress/gutenberg#84568)
- React 19: add new incompatible plugins (WordPress/gutenberg#84607)
- Tests: Fix HTML comparison tests (WordPress/gutenberg#84294)
- Tests: Fix list item unsafe markup test on older WordPress versions (WordPress/gutenberg#84302)
- Experiments: don't invalidate saved option with a legacy key (WordPress/gutenberg#84619)
- Tests: Scope Classic block media checkbox locator (WordPress/gutenberg#84524)

Props mamaduka.
See #66340


Built from https://develop.svn.wordpress.org/trunk@64587


git-svn-id: http://core.svn.wordpress.org/trunk@63737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
dd32 pushed a commit to dd32/wordpress-develop that referenced this pull request Oct 20, 2026
This updates the pinned commit hash of the Gutenberg repository from 954fe7f9e04631c41aec4552acd627a7203a2aad to 7b95ee96b54de2e35886971ccf7eb449c324c830 (version 24.2.0).

A full list of changes included in this commit can be found on GitHub: WordPress/gutenberg@954fe7f...7b95ee9

- useServerSideRender: parse messages from caught errors (WordPress/gutenberg#83365)
- Docs: Fix published Vitest migration-guide links (WordPress/gutenberg#83449)
- Fix: Whitespace changes are not shown in the Resolve Block diff. (WordPress/gutenberg#82397)
- Editor: Use SearchableSelect for the post author field (WordPress/gutenberg#83323)
- Docs: Note that block attributes and global styles values are untrusted at render time (WordPress/gutenberg#83473)
- RichText: Remove dead exports and consolidate deprecations (WordPress/gutenberg#83461)
- Inserter: Manage roving tab index to skip re-rendering every item (WordPress/gutenberg#83437)
- SearchableSelectControl: Add to @wordpress/ui (WordPress/gutenberg#80979)
- Try: Bolder "B" icon (WordPress/gutenberg#83321)
- Ignore composer vendor files from top-level gitignore. (WordPress/gutenberg#22283)
- Tests: Add floating notes e2e coverage (WordPress/gutenberg#83477)
- Block Editor: Check the inserter's fallback containers unmemoized (WordPress/gutenberg#83446)
- Packages: Update Ariakit to 0.4.40 (WordPress/gutenberg#83278)
- Tests: Enforce per-call Vitest console expectations (WordPress/gutenberg#83095)
- Theme: Fix virtual modules, root styles, and seed validation (WordPress/gutenberg#83355)
- DataViews: Fix README to describe sort() as receiving field values, not items (WordPress/gutenberg#83483)
- Combobox: Label popup dialogs in stories (WordPress/gutenberg#83476)
- Block editor: Isolate mutable test fixtures (WordPress/gutenberg#83098)
- Blocks: Isolate registration state in tests (WordPress/gutenberg#83099)
- UI: Remove automatic Notice announcements (WordPress/gutenberg#82737)
- Text: Migrate Emotion styles to an SCSS Module (WordPress/gutenberg#82573)
- Block library: Isolate order-sensitive test interactions (WordPress/gutenberg#83101)
- Format Library: unify FormatEditProps to one type, move private types (WordPress/gutenberg#83487)
- UI: Announce selected chips in SearchableChipSelect (WordPress/gutenberg#82863)
- Card: Migrate from Emotion to SCSS modules (WordPress/gutenberg#82577)
- Components: Deprecate the private Menu API (WordPress/gutenberg#82947)
- CustomGradientPicker: Migrate control wrappers to an SCSS module (WordPress/gutenberg#82576)
- Components: Isolate order-sensitive UI tests (WordPress/gutenberg#83103)
- Tests: Isolate mutable configuration fixtures (WordPress/gutenberg#83104)
- Core data: Finish deferred selection updates in RTC test (WordPress/gutenberg#83366)
- Block editor: Wait for final keyboard link suggestions (WordPress/gutenberg#83489)
- Data: Assert and silence resolution error in useSuspenseSelect test (WordPress/gutenberg#83491)
- Tests: Isolate deprecation warning state (WordPress/gutenberg#83107)
- UI: Align selection popup checkmarks with the first label line (WordPress/gutenberg#82942)
- Tests: Resolve Browser Mode commands against the live iframe (WordPress/gutenberg#83495)
- Ensure position type is a string (WordPress/gutenberg#83500)
- MediaUpload: Fix console error when reopening Gallery media library (WordPress/gutenberg#76749)
- Refactor stylelint config detection in lint-style.js (WordPress/gutenberg#79280)
- Docs: Recommend UI Tabs for switching views (WordPress/gutenberg#83516)
- Popover: Close non-modal popovers on iframe interaction (WordPress/gutenberg#83509)
- Typography: List only the weights inside a variable font's range (WordPress/gutenberg#83128)
- Style book: Add link to example text. (WordPress/gutenberg#83448)
- Tests: Add Vitest Browser Mode failure artifacts (WordPress/gutenberg#83093)
- Theme: Make JavaScript token fallback transforms syntax-aware (WordPress/gutenberg#83356)
- Editor: Fix new posts being published with the `auto-draft` slug (WordPress/gutenberg#83518)
- Editor: Gather the View group of the Options menu into submenus (WordPress/gutenberg#82976)
- Tests: Fix PostCSS browser-externalized warnings in Vitest (WordPress/gutenberg#83091)
- Tests: Shuffle test cases in CI (WordPress/gutenberg#83111)
- Update Styles > Blocks description. (WordPress/gutenberg#83515)
- Columns: Remove the column count slider (WordPress/gutenberg#83262)
- BorderControl: Remove `%` from the border width units (WordPress/gutenberg#83492)
- Fields: Fix AuthorView for users who can't edit users (WordPress/gutenberg#83498)
- Update and add justify icons. (WordPress/gutenberg#83519)
- RichText: Refactor useMarkPersistent, fix StrictMode mount mark (WordPress/gutenberg#83463)
- Theme: Improve accessibility, API documentation, and compatibility checks (WordPress/gutenberg#83358)
- Theme: Preserve global token references in Lightning CSS (WordPress/gutenberg#83359)
- Tests: Migrate internal linting to Vitest and remove unused Jest dependencies (WordPress/gutenberg#83502)
- Improve specificity of lightbox button selector (WordPress/gutenberg#70800)
- TextControl: Use design system colors when disabled (WordPress/gutenberg#83307)
- Fix: Image lightbox: overlay becomes unusable (can't close) when it isn't a direct child of `<body>` (WordPress/gutenberg#83480)
- Notes: Extract note selection sync into useNoteSelection hook (WordPress/gutenberg#83528)
- Block Parser: Document `\WP_Block_Parser::$stack` as a list (WordPress/gutenberg#82695)
- CollapsibleCard: Scope the header focus ring to its own trigger (WordPress/gutenberg#81314)
- Fix broken links in docs (WordPress/gutenberg#83545)
- Icons: Use assertEqualHTML() in icons registry tests (WordPress/gutenberg#83544)
- Editor: Merge adjacent revision inline diffs (WordPress/gutenberg#80579)
- Date: Ignore trailing format backslash instead of printing undefined (WordPress/gutenberg#81528)
- Block Supports: Add background-clip block support infrastructure (WordPress/gutenberg#77141)
- Block Editor: Fix translator comments for block count announcements (WordPress/gutenberg#83555)
- Paste: replace non-breaking spaces at the edges of text with regular spaces (WordPress/gutenberg#83464)
- Media Editor: Fix pan drag flooding undo history after wheel zoom (WordPress/gutenberg#83558)
- Rich text: fix iOS double tap selection, preventing focus capture under editable host (WordPress/gutenberg#81042)
- Block editor: migrate state-control badges to UI Badge (WordPress/gutenberg#82608)
- Gallery: Add Order By controls for static gallery, consolidate controls in settings sidebar (WordPress/gutenberg#83438)
- Media editor: show an error when saving attachment details fails (WordPress/gutenberg#83560)
- Position controls: Fix useSelect warning for selected state viewports (WordPress/gutenberg#83570)
- Inserter: Use design system focus ring for previews (WordPress/gutenberg#83126)
- Image: Fix lightbox using thumbnail aspect ratio instead of original image ratio (WordPress/gutenberg#79058)
- Docs: Clarify @wordpress/ui icon color requirements (WordPress/gutenberg#83564)
- docker compose -T if stdin is not a tty (WordPress/gutenberg#78374)
- Storybook: Add new contributing page. (WordPress/gutenberg#83345)
- Widget Primitives: Avoid Vite warnings for runtime widget modules (WordPress/gutenberg#83602)
- Build: Update Vite to 8.3.1 and simplify Storybook tooling (WordPress/gutenberg#83569)
- doc(wp-env) Change core branch from trunk to master in doc (WordPress/gutenberg#83566)
- wp-build: Remove the unused boot, private-apis, and route optional peer dependencies (WordPress/gutenberg#83601)
- CI: Check CHANGELOG presence for published tooling and config packages (WordPress/gutenberg#83577)
- Tests: Enforce Vitest assertion coverage (WordPress/gutenberg#83572)
- Icons: Update heading level icons for optical balance (WordPress/gutenberg#83268)
- ESLint: Add allowUseWithCaution option to use-recommended-components (WordPress/gutenberg#83536)
- Notes: Refactor floating board measurement (WordPress/gutenberg#83485)
- Inserter: Stop re-rendering the block list on block selection change (WordPress/gutenberg#83284)
- Paste: Give each pasted data-URI image unique filename to avoid upload collisions. (WordPress/gutenberg#79480)
- Changelog validator: ignore markdown & configs d46223 (WordPress/gutenberg#83618)
- Font Library: Use UI Menu for collection actions (WordPress/gutenberg#82965)
- Storybook: Show prop descriptions in Canvas controls (WordPress/gutenberg#83581)
- test: Link upstream warning fixes in config (WordPress/gutenberg#83632)
- Storybook: Use one block-editor store module (WordPress/gutenberg#83636)
- Tests: Use strict assertions synced from Core changeset 63934. (WordPress/gutenberg#83619)
- Math: Store cell alignment in the MathML and polyfill alignment and overlines in Chromium (WordPress/gutenberg#83164)
- Storybook: Reuse PostCSS browser resolver in smoke tests (WordPress/gutenberg#83635)
- Editor: Use UI Menu for template options (WordPress/gutenberg#82964)
- RTC: Add a EntitySyncManager interface in core-data (WordPress/gutenberg#83410)
- Term Count: Add margin support (WordPress/gutenberg#83608)
- Archives: Add minimum height support (WordPress/gutenberg#83573)
- Media Editor: Stop the crop pixel snap from recording undo history (WordPress/gutenberg#83571)
- Term Name: Add margin support (WordPress/gutenberg#83606)
- Post Author Biography: Add text indent support (WordPress/gutenberg#83614)
- Code: Add minimum width and height support (WordPress/gutenberg#83574)
- Details: Add minimum width support (WordPress/gutenberg#83576)
- Post Content: Add minimum width support (WordPress/gutenberg#83575)
- Post Excerpt: Add minimum width and height support (WordPress/gutenberg#83578)
- Post Title: Add minimum width and height support (WordPress/gutenberg#83600)
- Footnotes: Add minimum width and height support (WordPress/gutenberg#83579)
- Storybook: Place Notice announcements under Components (WordPress/gutenberg#83617)
- InputControl: Darken the field border on hover (WordPress/gutenberg#83306)
- npm: Switch from legacy-peer-deps to strict-peer-deps (WordPress/gutenberg#81029)
- Term Name: Add minimum width and height support (WordPress/gutenberg#83599)
- Columns: Allow dropping a column at the outer edges (WordPress/gutenberg#83274)
- E2E: Pin the site title in the Interactivity API router specs and give the E2E Storybook build more heap. (WordPress/gutenberg#83474)
- Heading: Add minimum width and height support (WordPress/gutenberg#83580)
- Login/out: Add minimum width and height support (WordPress/gutenberg#83583)
- Verse: Add minimum width support (WordPress/gutenberg#83609)
- Video, Cover: Don't autoplay in the editor when reduced motion is preferred (WordPress/gutenberg#83337)
- Media & Text: Lower the specificity of the content padding (WordPress/gutenberg#83563)
- Pagination: Add padding, margin, and block gap support (WordPress/gutenberg#83743)
- Fix peer dependency conflicts left in the lockfile (WordPress/gutenberg#83754)
- Comments Pagination: Add padding, margin, and block gap support (WordPress/gutenberg#83744)
- Term Count: Add minimum width and height support (WordPress/gutenberg#83596)
- Read More: Add border style support (WordPress/gutenberg#83735)
- Cover: Don't autoplay embedded background videos when reduced motion is preferred (WordPress/gutenberg#83452)
- No Results: Add minimum width and height support (WordPress/gutenberg#83584)
- RichText: Rename utils.jsx to utils.js (WordPress/gutenberg#83758)
- Quote: Add minimum width support (WordPress/gutenberg#83592)
- Upgrade typescript-eslint to v8.70.1 (WordPress/gutenberg#83760)
- Tabs: Add minimum width support (WordPress/gutenberg#83595)
- Site Tagline: Add minimum width and height support (WordPress/gutenberg#83589)
- Heading: Add text indent support (WordPress/gutenberg#83615)
- Site Title: Add minimum width and height support (WordPress/gutenberg#83593)
- Home Link: Add padding and margin support (WordPress/gutenberg#83607)
- Preformatted: Add minimum width and height support (WordPress/gutenberg#83587)
- Include E2E Storybook sources in docgen (WordPress/gutenberg#83634)
- Extensible Site Editor: Pass custom block categories to the blocks store (WordPress/gutenberg#83762)
- Packages: Declare missing peer dependencies and check them in CI (WordPress/gutenberg#83765)
- Post Terms: Add minimum width and height support (WordPress/gutenberg#83586)
- Group, Cover: Track drop zone element in state (WordPress/gutenberg#83756)
- Global Styles: Add pseudo-state controls for Navigation Link (WordPress/gutenberg#83451)
- storybook: Register playground core blocks once (WordPress/gutenberg#83637)
- Document Outline: Show the design system focus ring instead of legacy box-shadow (WordPress/gutenberg#83755)
- storybook: Update BlockPopover fixture to API version 3 (WordPress/gutenberg#83642)
- Add typing to iAPI's getConfig() (WordPress/gutenberg#71692)
- Components: deprecate Badge (WordPress/gutenberg#82379)
- Block Editor: Fix style / nested attribute overwrite during multi-selection (WordPress/gutenberg#80070)
- Notes: Restrict menu actions for resolution notes and resolved threads (WordPress/gutenberg#73243)
- UI: Add change actions to form primitive stories (WordPress/gutenberg#83591)
- Icons: Support keyword-based search in the icons registry (WordPress/gutenberg#82367)
- Avatar: Explain that avatars use the Gravatar service (WordPress/gutenberg#83567)
- UI: Add item labels and descriptions to remaining popups (WordPress/gutenberg#83493)
- PaletteEdit: Stop changing the slug when renaming a preset (WordPress/gutenberg#83750)
- Storybook: Fix missing block styles in BlockCanvas playground stories (WordPress/gutenberg#81070)
- Tests: Enforce Vitest callback, promise, and title rules (WordPress/gutenberg#83620)
- ItemGroup: Use design system focus ring (WordPress/gutenberg#83764)
- Keep the legacy CheckboxControl visually consistent across viewports (WordPress/gutenberg#83612)
- Media editor: Use UI Menu for crop aspect ratio (WordPress/gutenberg#82968)
- Use strict assertions in override script tests (WordPress/gutenberg#83782)
- Home Link: Add minimum width and height support (WordPress/gutenberg#83582)
- Tab Panels: Add minimum height support (WordPress/gutenberg#83594)
- Post Time to Read: Add minimum width and height support (WordPress/gutenberg#83598)
- Term Description: Add minimum width and height support (WordPress/gutenberg#83597)
- UI: Keep InputLayout chrome at md on small viewports (WordPress/gutenberg#82764)
- Math: Add minimum width and height support (WordPress/gutenberg#83585)
- Tests: Bump undici in the AI development test lockfile (WordPress/gutenberg#83799)
- Bump brace-expansion in /test/ai-development (WordPress/gutenberg#83807)
- Bump js-yaml and promptfoo in /test/ai-development (WordPress/gutenberg#83797)
- Bump fast-uri from 3.1.7 to 3.1.8 (WordPress/gutenberg#83829)
- Update AI Development package versions after npm audit (WordPress/gutenberg#83830)
- Notes: Add show and hide options for floating notes (WordPress/gutenberg#83768)
- Add separators to item popup components (WordPress/gutenberg#83776)
- Components: Align RadioControl colors with UI Radio (WordPress/gutenberg#83270)
- E2E: Mock Openverse in image drag-and-drop inserter test (WordPress/gutenberg#83842)
- FormToggle: Match Switch colors across states (WordPress/gutenberg#83773)
- Bump `@react-spring/web` from 9.4.5 to 10.1.2 (WordPress/gutenberg#83796)
- ColorPalette: Show design system focus ring on custom color button (WordPress/gutenberg#83841)
- Docs: Remove CheckboxControl heading from InspectorControls example (WordPress/gutenberg#83844)
- Base Styles: Default the admin theme color to Blueberry (WordPress/gutenberg#83749)
- Menu: Guard against nesting Group and RadioGroup (WordPress/gutenberg#83792)
- Template Part: Fall back to rendering a template part from the theme file if the db version is unavailable (WordPress/gutenberg#83809)
- Tests: Reset deprecation history in shared Vitest setup (WordPress/gutenberg#83849)
- Menu: Disable triggers instead of roots in consumers (WordPress/gutenberg#83791)
- Playlist: Replace the waveform player patch with its no-autoinit entry (WordPress/gutenberg#83132)
- Update UI Spinner appearance and add a color prop (WordPress/gutenberg#83775)
- UI: Align component names with their semantics (WordPress/gutenberg#83789)
- Checkbox: Prevent rounded themes from making checkboxes circular (WordPress/gutenberg#83526)
- Storybook: Update manifest snapshot for Spinner color prop (WordPress/gutenberg#83856)
- Button: Only open the link popover on explicit user action (WordPress/gutenberg#30166)
- Gallery Lightbox: Prevent image click from closing the dialog when navigation is enabled (WordPress/gutenberg#78898)
- UI: Recommend Checkbox family components (WordPress/gutenberg#83771)
- RadioControl: Keep a 16px visual with a larger hit target (WordPress/gutenberg#83840)
- Table: replace deprecated word-break with overflow-wrap: anywhere (WordPress/gutenberg#82480)
- Tag Cloud: Update styles and add `!important` (WordPress/gutenberg#70224)
- Correctly document the `blockName` property as being nullable (WordPress/gutenberg#70900)
- Add inertValue helper and use it for setting inert attribute (WordPress/gutenberg#83871)
- Enable editableRoot for the list item block for multi-selection on mobile (WordPress/gutenberg#82816)
- Verify localized data retention in override script test (WordPress/gutenberg#83845)
- Tests: Bump ibm-cloud-sdk-core in the AI development test lockfile (WordPress/gutenberg#83887)
- UI: Recommend Notice component (WordPress/gutenberg#82685)
- Fix: MediaUpload `gallery` prop ignores `allowedTypes` (WordPress/gutenberg#78257)
- Media editor: Add a session boundary above the cropper (WordPress/gutenberg#83550)
- DataViews: Measure the container as the data view mounts to avoid a single column flash (WordPress/gutenberg#83752)
- Pullquote: Add minimum width support (WordPress/gutenberg#83588)
- Media editor: Remove initial state seeding from the session (WordPress/gutenberg#83893)
- UI: Add e2e Storybook popup item layout fixtures (WordPress/gutenberg#83488)
- Storybook: Give CI job a distinct name (WordPress/gutenberg#83869)
- Coding standards: Skip anonymous class methods in block library function name sniff (WordPress/gutenberg#83900)
- Pagination: Add border support (WordPress/gutenberg#83745)
- PR meta: Move the props list into the shared comment (WordPress/gutenberg#82302)
- Comments Pagination: Add border support (WordPress/gutenberg#83746)
- Scripts: Resolve default configs without hoisted dependencies (WordPress/gutenberg#83902)
- Image: Fix invalid CSS url() value in circle-mask style (WordPress/gutenberg#82333)
- Query Total: Add minimum width and height support (WordPress/gutenberg#83590)
- Scripts: Treat files passed after --fix as file arguments (WordPress/gutenberg#83521)
- Editor: Remove icon for 'Export' more menu item (WordPress/gutenberg#83901)
- Dashboard Widgets: let a mounted widget declare actions at runtime (WordPress/gutenberg#83877)
- Framework: Switch from hoisted to isolated dependencies (WordPress/gutenberg#83847)
- Test: Run Vitest type graph validation in process (WordPress/gutenberg#83851)
- Remove use-memo-one usage (missing React 19 compat) (WordPress/gutenberg#83952)
- Fix Post Featured Image crash when isLink is enabled (WordPress/gutenberg#81584)
- Experiment: restyle classic wp-admin controls from design system tokens (WordPress/gutenberg#82425)
- Tests: Lint JavaScript Vitest mock imports (WordPress/gutenberg#83783)
- Build: Remove patch-package (WordPress/gutenberg#83982)
- Docs: Update deprecation testing guidance for shared reset (WordPress/gutenberg#83989)
- DataViews: list hideable fields alphabetically in the view config (WordPress/gutenberg#83947)
- Core Data: Rank link suggestions by type, and stop discarding merged results (WordPress/gutenberg#83407)
- Add new react-inert-value package with inertValue helper (WordPress/gutenberg#83987)
- Connectors: Keep a stored API key read-only when it can't be verified (WordPress/gutenberg#83889)
- Navigation: Search every entity type from the link UI (WordPress/gutenberg#83408)
- Tests: Cover translation setup in override script tests (WordPress/gutenberg#83886)
- Build: Update Vite to 8.3.2 and remove the PostCSS browser resolver (WordPress/gutenberg#83992)
- Update readme title to match block name (WordPress/gutenberg#83999)
- RTC: Fix undo breaking for non-synced entities (WordPress/gutenberg#83888)
- CI: Cover the AI development lockfile with Dependabot instead of npm audit (WordPress/gutenberg#83997)
- Latest Posts: Add minimum width and height support (WordPress/gutenberg#83905)
- Avatar: Add shadow support (WordPress/gutenberg#83929)
- Tab List: Add shadow support (WordPress/gutenberg#83922)
- Buttons: Add minimum width and height support (WordPress/gutenberg#83894)
- Social Icons: Add shadow support (WordPress/gutenberg#83920)
- Columns: Add minimum width and height support (WordPress/gutenberg#83895)
- Gallery: Add shadow support (WordPress/gutenberg#83919)
- File: Add shadow support (WordPress/gutenberg#83918)
- Page List: Add minimum width and height support (WordPress/gutenberg#83908)
- Build Tooling: Read npm v12 pack --json output (WordPress/gutenberg#84011)
- Accordion Heading: Add line height support (WordPress/gutenberg#83958)
- Paragraph: Add shadow support (WordPress/gutenberg#83926)
- Media & Text: Add minimum width and height support (WordPress/gutenberg#83906)
- Tests: Patch basic-ftp in AI development dependencies (WordPress/gutenberg#84000)
- Env, E2E: Update dependencies that ran native install scripts (WordPress/gutenberg#84012)
- Tests: Update Vitest to 5.0.3 and Storybook to 10.6.1 (WordPress/gutenberg#83996)
- Search: Add padding support (WordPress/gutenberg#83984)
- Block editor: Honour background skip serialization in the editor (WordPress/gutenberg#83943)
- Framework: Declare React types in the workspaces that use them (WordPress/gutenberg#84013)
- Fit text: Size each block instance in a loop independently (WordPress/gutenberg#83985)
- FocalPointPicker: end a drag released over the editor canvas (WordPress/gutenberg#83348)
- Tests: Cover Menu scroll lock and LinkControl protocols in browsers (WordPress/gutenberg#83991)
- List: Add shadow support (WordPress/gutenberg#83923)
- UI: Add Progress with custom color support (WordPress/gutenberg#83781)
- ESLint: Allow non-module stylesheet imports in unit tests (WordPress/gutenberg#84019)
- Canvas loader: Use UI Progress and pass color via the indicator prop (WordPress/gutenberg#83860)
- Menu: Align group labels and separators with indented item labels. (WordPress/gutenberg#83993)
- react-inert-value: add missing types/react peer dep (WordPress/gutenberg#84024)
- Docs: Refine design system agent guidance (WordPress/gutenberg#84007)
- Navigation: List allowed blocks in the link UI search results + add transformSuggestions to Link Control (WordPress/gutenberg#83652)
- Sync: Remove exposed wp.sync package (WordPress/gutenberg#81999)
- Style: Update color to use CSS variable in edit-site (WordPress/gutenberg#79002)
- Popover: drop the will-change hint once the popover stops moving (WordPress/gutenberg#77359)
- MediaEdit: Show a checkerboard background behind image previews (WordPress/gutenberg#83846)
- Quote: Add button colour support (WordPress/gutenberg#83983)
- Media & Text: Add duotone support (WordPress/gutenberg#83981)
- Gallery: Add duotone support (WordPress/gutenberg#83978)
- Interactivity API Router: Add reactive navigation lifecycle and initiator API (WordPress/gutenberg#83280)
- Notes: Move floating notes into a canvas margin (WordPress/gutenberg#83786)
- Verse: Add text columns and indent support (WordPress/gutenberg#83962)
- Notes: Scroll floating notes with the canvas (WordPress/gutenberg#83852)
- Notes: Add Undo to deleted note snackbar (WordPress/gutenberg#83988)
- Framework: Move @typescript/native from the root to the workspaces that use it (WordPress/gutenberg#84027)
- Repair invalid peer dependencies in the lockfile (WordPress/gutenberg#84062)
- Term Template: Add minimum width and height support (WordPress/gutenberg#83914)
- Fix check type declarations (WordPress/gutenberg#84070)
- Media: track the original attachment id for edited images (WordPress/gutenberg#81803)
- Post Comments Form: Add font family support (WordPress/gutenberg#83967)
- Media Utils: Add `MediaEdit` as a private API (WordPress/gutenberg#84046)
- Build Tools: Fix flaky ESM package types test timeout (WordPress/gutenberg#84068)
- Embed: Add padding support (WordPress/gutenberg#83963)
- Interactivity API: Add a data-wp-html directive (WordPress/gutenberg#83092)
- Typography and "block-default icon polish. (WordPress/gutenberg#84073)
- Release Tooling: Read the npm v12 JSON output shapes (WordPress/gutenberg#84075)
- Menu: Align submenu labels and highlight open parents (WordPress/gutenberg#84031)
- Props Bot: Skip bare reviews that duplicate their review comment runs (WordPress/gutenberg#84076)
- Dataviews: use inertValue in CompositeGrid (WordPress/gutenberg#84072)
- UI: Add Meter (WordPress/gutenberg#83855)
- Media & Text: Add shadow support (WordPress/gutenberg#83976)
- Media editor: restore original image in modal (WordPress/gutenberg#81805)
- List: Add background image, size, and gradient support (WordPress/gutenberg#83935)
- List Item: Add background image, size, and gradient support (WordPress/gutenberg#83936)
- Block Editor: Fix 'Manage allowed blocks' not shown when its the only 'Advanced' control (WordPress/gutenberg#84067)
- Design System: Clarify tooltip labeling and UI review guidance (WordPress/gutenberg#83898)
- Gallery: Add minimum width and height support (WordPress/gutenberg#83897)
- File: Add minimum width and height support (WordPress/gutenberg#83896)
- Media: Return 0 from the edit root lookup when there is no edit root (WordPress/gutenberg#84096)
- Read More: Add minimum width and height support (WordPress/gutenberg#83912)
- UI: Recommend Radio family components (WordPress/gutenberg#83872)
- Latest Comments: Add minimum width and height support (WordPress/gutenberg#83904)
- chore: Use v24 in .nvmrc (WordPress/gutenberg#84061)
- Embed: Add minimum width and height support (WordPress/gutenberg#83903)
- Post Comments Form: Add minimum width and height support (WordPress/gutenberg#83910)
- Post Featured Image: Add border style support (WordPress/gutenberg#83956)
- Buttons: Add shadow support (WordPress/gutenberg#83916)
- Poetry: Add fit text support (WordPress/gutenberg#83980)
- Video: Add duotone support (WordPress/gutenberg#83979)
- Notes: Keep anchor writes out of undo history (WordPress/gutenberg#84079)
- ProgressBar: Use WPDS color tokens (WordPress/gutenberg#83779)
- REST API: Add action-trash link to posts and comments (WordPress/gutenberg#84045)
- RSS: Add minimum width and height support (WordPress/gutenberg#83913)
- Notes: Reset paragraph top margin in floating notes (WordPress/gutenberg#84101)
- Global Styles: Fix popover position in Styles screen (WordPress/gutenberg#84048)
- Block Switcher: Show design system focus ring on pattern previews (WordPress/gutenberg#83933)
- MediaEdit: Use design system focus ring (WordPress/gutenberg#83854)
- Notes: Delete permanently when the trash is disabled (WordPress/gutenberg#84102)
- Release: Rewrite SVN publication scripts in Node.js (WordPress/gutenberg#84034)
- ContentEditableControl: Keep a disabled field focusable (WordPress/gutenberg#84083)
- States: Scope per-instance rules to the block's root element (WordPress/gutenberg#83986)
- List Item: Add shadow support (WordPress/gutenberg#83925)
- DataViews: Truncate filter chips instead of wrapping them (WordPress/gutenberg#83879)
- Experiments: Turn the React 19 experiment on by default (WordPress/gutenberg#83784)
- Notes: Extract NoteReply and lift AddNote gating (WordPress/gutenberg#84106)
- Interactivity API: Remove expired deprecated behaviors (WordPress/gutenberg#84098)
- Breadcrumbs: Fix typo in aria label translation context (WordPress/gutenberg#84112)
- ESLint: Allow generated test titles (WordPress/gutenberg#83995)
- Icons: Add keywords to icon manifest (WordPress/gutenberg#83884)
- Tooltip: Control the hover delay cancellation test clock (WordPress/gutenberg#84113)
- VS Code: Add managed workspace config (WordPress/gutenberg#84025)
- Breadcrumb: fix getMeasurementRender for React 19 (WordPress/gutenberg#84069)
- Notes: Fix flaky thread scroll e2e test (WordPress/gutenberg#84118)
- Detect the database client in the unit test debug step. (WordPress/gutenberg#84089)
- UI: Preserve Autocomplete item type inference (WordPress/gutenberg#84095)
- UI: Recommend Switch family components (WordPress/gutenberg#84097)
- Env: Add an option to choose the MariaDB version (WordPress/gutenberg#83751)
- UI: Preserve Combobox source item generics (WordPress/gutenberg#84094)
- Menu: Tighten spacing, use 16px prefix icons, and cap width at 320px (WordPress/gutenberg#84028)
- Notes: Preserve unsent note and reply drafts (WordPress/gutenberg#84110)
- Theme: Add integration test coverage for seed colors in artifacts (WordPress/gutenberg#81161)
- Progress: Migrate remaining ProgressBar usages and recommend UI Progress (WordPress/gutenberg#84021)
- Components: Fix polymorphism typings leaking `as` prop (WordPress/gutenberg#82704)
- Media & Text: Add background image, size, and gradient support (WordPress/gutenberg#83927)
- Experiments: Use a mock plugin slug that no WordPress build ships in the unrelated-plugin test (WordPress/gutenberg#84133)
- Button: Add background image, size, and gradient support (WordPress/gutenberg#83950)
- Tests: Isolate Ajv per test in wp-env schema tests to avoid order dependence (WordPress/gutenberg#84139)
- Storybook: Read icon keywords from the manifest (WordPress/gutenberg#84127)
- SandBox: Fix embed previews that require a referrer in Safari (WordPress/gutenberg#84014)
- Notes: Restore child notes trashed along with their parent note (WordPress/gutenberg#84100)
- Style states: fix exception when there's no selected block (WordPress/gutenberg#84140)
- Chore: Use v24.20 in  `.nvmrc` config file. (WordPress/gutenberg#84138)
- Security: Opt in to the npm v12 supply-chain defaults (WordPress/gutenberg#82689)
- Docs: Describe isolated dependencies for agents and contributors (WordPress/gutenberg#84141)
- Upgrade code and types to React 19 (WordPress/gutenberg#83941)
- Latest Comments: Add border support (WordPress/gutenberg#84148)
- Add prettier, eslint and stylelint to the root package.json (WordPress/gutenberg#84017)
- FontSizePicker: Migrate Emotion styles to SCSS Modules (WordPress/gutenberg#84126)
- Fields API: Add the server-side registry and REST route (WordPress/gutenberg#84078)
- Block bindings: add support to `icon` attribute of `core/icon` (WordPress/gutenberg#80730)
- VisuallyHidden: Move hiding styles outside CSS cascade layers (WordPress/gutenberg#84114)
- Theme: Generate complete border token modes for Figma testing (WordPress/gutenberg#84035)
- Developer tools: Simplify editor setup and add Zed settings (WordPress/gutenberg#84143)
- Consolidate wp-admin container radiuses onto the design system scale (WordPress/gutenberg#82427)
- CustomGradientPicker: Extend control point targets to the bar height (WordPress/gutenberg#84124)
- Notes: Draw the canvas divider from body so it uses the theme text color (WordPress/gutenberg#84158)
- Icons: Experiment with proportional stroke scaling (WordPress/gutenberg#84081)
- Global Styles: Ignore theme.json values of unexpected types (WordPress/gutenberg#84523)
- React 19 codemod: apply defaultProps when rendering a memo component (WordPress/gutenberg#84568)
- React 19: add new incompatible plugins (WordPress/gutenberg#84607)
- Tests: Fix HTML comparison tests (WordPress/gutenberg#84294)
- Tests: Fix list item unsafe markup test on older WordPress versions (WordPress/gutenberg#84302)
- Experiments: don't invalidate saved option with a legacy key (WordPress/gutenberg#84619)
- Tests: Scope Classic block media checkbox locator (WordPress/gutenberg#84524)

Props mamaduka.
See #66340



git-svn-id: https://develop.svn.wordpress.org/trunk@64587 602fd350-edb4-49c9-b593-d223f7449a82
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[Feature] Link Editing Link components (LinkControl, URLInput) and integrations (RichText link formatting) [Package] Core data /packages/core-data [Type] Bug An existing feature does not function as intended

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Give posts (any type) higher priority in link search results

2 participants