Repository navigation
Notes: Email users mentioned in a note - #79606
Conversation
…ers/className The trunk `useRichText` now consumes `allowedFormats`, `withoutInteractiveFormatting`, and a format-type handler context directly, returning `formatTypes` alongside the editor state. Lean on that and drop the duplicated `useFormatTypes` / editor-only-format wrappers. Add `autocompleters` (forwarded to `useBlockEditorAutocompleteProps`) and `className` props so callers like the Notes inline form can wire `@`-mention completers and customize the contenteditable styling. Route the stylesheet through the block-editor entry instead of importing the SCSS from JS.
Add `@wordpress/block-editor` to the fields package's dependencies — the new `RichTextControl` is imported via private APIs and the dependency was missing, tripping `import/no-extraneous-dependencies`. In `fields/rich-text/edit.tsx`, forward the new `className` and `autocompleters` config to `RichTextControl` and make `config` itself optional (consumers like the title field do not pass one). Drop the commented placeholder `ConfiguredRichTextEdit` in the title field.
Add focused unit tests covering: - `RichTextControl`: labeled-textbox markup, `hideLabelFromVision`, `disableLineBreaks`/`aria-multiline` toggling, and consumer-supplied `className` merging. - `fields/rich-text/edit`: that the wrapper forwards field label/value/id to the underlying control, that change events flow through `field.setValue` back to the consumer's `onChange`, that optional config props (`clientId`, `placeholder`, `allowedFormats`, etc.) are passed through, and that a missing config object does not crash.
A `<label for>` only contributes an accessible name to native form
controls, not to a `<div role="textbox">`. Mirroring `label` onto
`aria-label` gives the contenteditable a stable accessible name so
assistive tech and Playwright `getByRole('textbox', { name })` lookups
resolve consistently regardless of `hideLabelFromVision`.
The wrapper's prop type was `Pick<DataFormControlProps, ...> & { config: RichTextFieldConfig }`,
which is not contravariantly assignable to `ComponentType<DataFormControlProps<Item>>`
because the rich-text `config` shape diverges from the generic one. Accepting the
standard `DataFormControlProps` and narrowing `config` at the call site keeps the
wrapper usable as a `Field.Edit` and drops the now-unneeded `@ts-expect-error`.
`@wordpress/block-editor` ships no `.d.ts` files, so the type-declaration build (`tsgo --build`) fails to resolve the import even though the package is declared as a runtime dependency. Use `@ts-ignore` (rather than the `@ts-expect-error` that was dropped earlier) so the directive does not flip to "unused" under per-package `tsc` checks that happen to resolve the source successfully.
`FormatEdit` populates `keyboardShortcuts` and `inputEvents` Sets via context, but `RichTextControl` never attached a `keydown` or `input` listener to the contenteditable, so registered shortcuts (Cmd+B, Cmd+I, Cmd+K, etc.) and native InputEvents (formatBold/formatItalic) never fired. Cmd+K also bubbled past the control to open the WordPress command palette because no shortcut consumed it. Attach the existing `shortcuts` and `input-events` listeners while the control is focused, mirroring the in-canvas `RichText` wiring. The link format's `RichTextShortcut` now calls `preventDefault()` on Cmd+K, which causes the command palette's global handler (which bails on `defaultPrevented`) to skip opening. Add unit tests covering shortcut dispatch on focus, no dispatch when unfocused, and listener teardown on blur.
`RichTextControl` now invokes each format type's `__unstableInputRule` on `input`/`compositionend` events, so e.g. typing `` `code` `` in a notes field auto-applies `core/code`'s inline-code format the same way it does in the canvas. The block-editor's existing `input-rules.js` listener handles three distinct concerns (block prefix transforms, block input transforms, format input rules), and pulls in `@wordpress/blocks`, block-editor store actions, and `onReplace`/`selectionChange` callbacks. None of those apply to a standalone field control — so wire a focused handler that only runs the format-rule reduce, mirroring the same branch inline. Also set `suppressContentEditableWarning` on the contenteditable so React doesn't warn when `useRichText` writes value into the DOM directly (matching in-canvas `RichText`).
`isVisible` controls whether a format's toolbar button is shown — it's
how a format hides its toolbar surface in contexts that don't have a
toolbar (e.g., the standalone `RichTextControl` used in DataForm
fields). It should not gate the link popover itself: the popover is
triggered by `Cmd+K` (or the toolbar button) and represents the link
editing UI, not a toolbar element.
Before this change, `RichTextControl` consumers that hid format
toolbars (`isVisible={false}`) could press `Cmd+K` on a selection and
nothing visible would happen — the shortcut fired, `addingLink`
flipped true, but `InlineLinkUI` was suppressed by the same flag that
hid the toolbar button.
When a format type opens a popover from inside `RichTextControl` (the inline link UI on Cmd+K, or any similar format-spawned UI), focus moves out of the contenteditable to the popover's first focusable element. That fired the textbox's onBlur, which flipped `isSelected` to false, unmounted `FormatEdit`, and tore the popover down before it ever rendered. Defer the `isSelected = false` flip via a 0ms `setTimeout` so the new focus target has a chance to land. If the active element is inside `.components-popover`, leave the control selected — it's a format popover keeping the user in this control's interaction scope. Verified with a new unit test covering the popover-focus case in addition to the existing focus/blur shortcut tests.
RichTextControl deliberately drops the block-editor selection coupling that focuses the in-canvas RichText, so a standalone consumer (e.g. a note form) has no way to place the caret in the field when it opens — regressing focus-on-open behavior the old RichText got for free. Add an opt-in focusOnMount prop that focuses the contenteditable on mount via useRefEffect (mirroring the existing eventListenersRef pattern in this file). Off by default so DataForms and other consumers are unaffected. Named focusOnMount rather than autoFocus to match @wordpress/compose's useFocusOnMount and to avoid the jsx-a11y/no-autofocus rule, since this is not the browser autofocus attribute. Covered by unit tests for both the default-off and opt-in cases.
…l package The new control is intended for standalone form fields and does not touch the block tree or selection, so it does not belong in @wordpress/block-editor. Hosting it there forced @wordpress/fields to take a dependency on the entire block-editor module graph just to render a single form input. Move RichTextControl into a new lower-level package that depends only on @wordpress/rich-text plus @wordpress/components/compose/element. The new package vendors the small helpers it owns (getAllowedFormats, the keyboard and input-event contexts, the two event-listener modules, and a BlockContext-free FormatEdit) so block-editor's canvas RichText keeps its own copies untouched. The autocompleters prop is dropped from this initial release; it depended on block-editor's autocomplete component and no current consumer wires it. @wordpress/fields now imports the control via the new package's private API and the @wordpress/block-editor dependency is removed.
Format types (e.g. the inline link UI) open portaled popovers. Blur handling previously kept the field selected whenever focus moved into any `.components-popover`, which can match popovers this control did not open. Host the format UI in a private `SlotFillProvider` paired with the control's own `Popover.Slot`, wrapped in a `data-rich-text-control-popover-slot` marker and portaled to the field's document body (so popovers escape any scroll/overflow container). Blur handling then matches that marker precisely, plus `[data-wp-compat-overlay-slot]` for popovers migrated to `@wordpress/ui`. This also avoids leaking format fills into an ambient slot registry and removes the `SlotFillProvider` warning that a bare `Popover.Slot` emits without a provider. Update tests: focus into the dedicated slot or the compat overlay keeps the field selected; focus into an unrelated popover now deselects.
Register a story so the control can be tested in isolation as popovers and other UI migrate to `@wordpress/ui`. The story renders a controlled field (Default and WithInitialValue), wraps it in a `SlotFillProvider`, and imports `@wordpress/format-library` so the formatting shortcuts (Cmd+B/I) and the inline link popover can be exercised without the editor.
Standard format types (bold, link, …) render `RichTextShortcut` and `RichTextInputEvent`, which read `keyboardShortcutContext` / `inputEventContext`. Those contexts and components lived in `@wordpress/block-editor` and were only provided inside the in-canvas `RichText`. A standalone field like `RichTextControl` vendored its own separate context objects, so the block-editor components found no provider and threw `Cannot read properties of undefined (reading 'current')` on focus — breaking the field anywhere outside the block canvas (e.g. a DataForms title). Move the two contexts and the two components into `@wordpress/rich-text` private APIs, the lowest-level shared home. `@wordpress/block-editor` re-exports them for back-compat (so `@wordpress/format-library` and native are unchanged), and both block-editor's `RichText` and the standalone `RichTextControl` now provide the exact same context objects the format components read. - rich-text: add private `keyboardShortcutContext`, `inputEventContext`, `RichTextShortcut`, `RichTextInputEvent` (rewritten lint-clean). - block-editor: source the contexts from rich-text and re-export; `shortcut.js`/`input-event.js` become thin re-export shims. Drop their now stale eslint suppressions. - rich-text-control: provide the shared contexts via `unlock`; remove the vendored `contexts.js`; point the test's fake shortcut at the shared context.
The story exercises format UI from `@wordpress/format-library` and the inline link popover (`LinkControl`) from `@wordpress/block-editor`. Without those package stylesheets the link popover rendered cramped and unstyled in Storybook. Register the `richtextcontrol` component id in the package-styles config so it lazy-loads `components`, `block-editor`, and `format-library` styles, matching how the field renders in the editor.
…mport
Importing `style.scss` directly from the story tripped the
`@wordpress/no-non-module-stylesheet-imports` lint rule (caught by the full
`lint:js` CI step, which the changed-files-only pre-commit hook didn't run).
Drop the JS stylesheet import and load the control's own styles through the
Storybook package-styles mechanism instead: add
`rich-text-control-{ltr,rtl}.lazy.scss` and include them in the
`richtextcontrol` config entry, alongside components/block-editor/format-library.
…ivate API The package has no wpScript/wpModuleExports, so it is a bundled npm-only package. The private-apis lock/unlock layer exists to share private APIs across the wp.* namespace at runtime; for a directly-imported package it adds overhead without benefit, and project guidance advises against using private APIs in bundled packages. Export RichTextControl directly from the package index and update the @wordpress/fields consumer to a plain import. The local lock-unlock helper and the private-apis allowlist entry remain because control.js still consumes @wordpress/rich-text's private APIs.
…om block-editor keyboardShortcutContext and inputEventContext are private and were never part of the public block-editor API, so the back-compat re-export was unnecessary. The only internal consumer (block-fields RichTextControl) now reads them directly from @wordpress/rich-text via unlock, matching how the other rich text package consumers already work.
The richTextField definition was an orphan: nothing imports it, it is not exported from the package's public index, and it is not registered in any field list. The shared RichTextEdit component it referenced is still used directly by the title field, so only the field stub is removed. Addresses review feedback on #78825.
…ol-package # Conflicts: # packages/dataviews/CHANGELOG.md # packages/fields/CHANGELOG.md
Co-authored-by: talldan <talldanwp@git.wordpress.org> Co-authored-by: adamsilverstein <adamsilverstein@git.wordpress.org> Co-authored-by: westonruter <westonruter@git.wordpress.org> Co-authored-by: Mamaduka <mamaduka@git.wordpress.org> Co-authored-by: sethrubenstein <smrubenstein@git.wordpress.org>
|
I just cherry-picked this PR to the wp/7.1 branch to get it included in the next release: d8f2c5f |
|
As we are approaching the 7.1 RC1 release tomorrow, I would like to confirm whether it has been agreed to backport this PR to 7.1. The milestone for the core ticket is also not set to 7.1. My understanding was that the mention feature in the 7.1 release would only include autocomplete, with email notifications postponed. cc @annezazu |
|
I thought this (mentions) was a blessed task. Without notifications, adding a mention to a note does nothing, so the feature doesn't make sense. If we can't ship the notification, then it's better to exclude mentions as well. |
I did milestone the core backport for 7.1 (and update the trac ticket description) and it is mainly awaiting review. I also wasn't sure we were shipping with notifications, but I was convinced my @Mamaduka's argument that mentions are of little value without them. Also we de-scoped the feature quite a bit, removing deep links and the follow + unfollow mechanism, edit tracking and so on for now until we have a more comprehensive notification API in place. All the feature does now is notify mentioned users when a note is created. This is pretty similar to what we added for notes themselves. That said, I am also fine with punting the mention feature entirely @t-hamano and will let the release team decide. I do agree that if we remove the notification part, we should probably remove the mention capability entirely. what do you think? |
perhaps we should be able to ship this feature if there is consensus among the release squads. Let's confirm on Slack. https://wordpress.slack.com/archives/C0B4Q0RJVAT/p1785826459345539?thread_ts=1783621633.996009&cid=C0B4Q0RJVAT |
|
I will commit the backport before RC and gather feedback. |
|
Just for transparency, commenting here that this is good to land. I agree that this is a necessary and well scoped change to include for the @mentions feature to be more meaningful. |
Introduce `wp_notify_note_mentions()` on `rest_insert_comment`, alongside the existing post author notification, which parses those IDs out of the saved note and emails each mentioned user in their own locale with a link back to the post editor. Recipients are limited to users who can `edit_comment` the note, matching `WP_REST_Comments_Controller::check_read_permission()`, so an email cannot carry note content to someone who cannot see the note in the editor. The note's own author is skipped, as is the post author, who `wp_new_comment_via_rest_notify_postauthor()` already notifies about every note. Only note creation notifies, and the existing `wp_notes_notify` option turns the whole path off. See related Gutenberg pull request: WordPress/gutenberg#79606. Follow-up to [62832]. Props westonruter, mamaduka. Fixes #65639. git-svn-id: https://develop.svn.wordpress.org/trunk@63012 602fd350-edb4-49c9-b593-d223f7449a82
Introduce `wp_notify_note_mentions()` on `rest_insert_comment`, alongside the existing post author notification, which parses those IDs out of the saved note and emails each mentioned user in their own locale with a link back to the post editor. Recipients are limited to users who can `edit_comment` the note, matching `WP_REST_Comments_Controller::check_read_permission()`, so an email cannot carry note content to someone who cannot see the note in the editor. The note's own author is skipped, as is the post author, who `wp_new_comment_via_rest_notify_postauthor()` already notifies about every note. Only note creation notifies, and the existing `wp_notes_notify` option turns the whole path off. See related Gutenberg pull request: WordPress/gutenberg#79606. Follow-up to [62832]. Props westonruter, mamaduka. Fixes #65639. Built from https://develop.svn.wordpress.org/trunk@63012 git-svn-id: http://core.svn.wordpress.org/trunk@62231 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This updates the pinned commit hash of the Gutenberg repository from `fd715a6833679d098d9fee84b642f8f1bc27341b` to `f05e40e91c54f29c449b1f33d0db89f5166812d9`. A full list of changes included in this commit can be found on GitHub: WordPress/gutenberg@fd715a6...f05e40e - Writing flow: forward delete an empty paragraph without breaking apart the next block (WordPress/gutenberg#80813) - Upload Media: Fail the item when the /finalize request fails (WordPress/gutenberg#80725) - Fix template `modified` and `date` return value for file templates (WordPress/gutenberg#80733) - Boot: Adjust specificity of the image reset styles so components can size their own images (WordPress/gutenberg#80845) - Quote: Ensure paragraph placeholder appears after deleting nested blocks (WordPress/gutenberg#77151) - Block editor: make the Group action wrap blocks with a group transform (WordPress/gutenberg#80891) - Copy: preserve the block when its entire text is selected (WordPress/gutenberg#80994) - Add opt-out for block style state controls (WordPress/gutenberg#80956) (WordPress/gutenberg#81004) - Tabs: Support Home and End keys for keyboard navigation (WordPress/gutenberg#80912) - Rename blockStatesEnabled setting to blockStatesEditingEnabled (WordPress/gutenberg#81058) - [WP 7.1] Background: Fix the legacy gradient UI where a gradient cannot be selected (WordPress/gutenberg#81059) - Views: honor developer-defined view config overrides (WordPress/gutenberg#80832) - Playlist: Add track icon (WordPress/gutenberg#81078) - Remove the CODEOWNERS file from wp/7.1. (WordPress/gutenberg#81104) - Notes: Email users mentioned in a note (WordPress/gutenberg#79606) - Backport 81068 80744 80642 (WordPress/gutenberg#81135) - Site Editor: Add E2E coverage for view config extensibility (WordPress/gutenberg#80577) - change from WordPress/gutenberg#81068 (WordPress/gutenberg#81140) - Link Control: Restore the preview title underline (WordPress/gutenberg#81083) - Button: Suppress UA focus ring when focused and pressed (WordPress/gutenberg#81113) - View config: add reference docs (WordPress/gutenberg#81149) - Editor: Fix document tools button focus ring (WordPress/gutenberg#81115) - Interface: Increase footer breadcrumb height to prevent focus ring clipping (WordPress/gutenberg#81156) - Post editor: Add ThemeProvider for admin color schemes (WordPress/gutenberg#81112) - Pass Playlist controls to track blocks (WordPress/gutenberg#81158) - Theme: Omit color properties when neither provided nor inherited (WordPress/gutenberg#80600) (WordPress/gutenberg#81172) - Media: Improve the HEIC upload error and keep any upload errors up until dismissed (WordPress/gutenberg#81130) - Video: Hide settings for the GIF variation (WordPress/gutenberg#81142) - Video: clarify the Video variation description (WordPress/gutenberg#81181) - Button: turn on the width setting by default in theme.json (WordPress/gutenberg#81196) - Edit Widgets: Fix header toolbar button focus ring (WordPress/gutenberg#81176) - Build: Wrap script bundles in an IIFE to contain 'use strict' (WordPress/gutenberg#79792) - Customizer widgets: Add ThemeProvider for admin color schemes (WordPress/gutenberg#81174) - Fix: Tabs block: Start with empty tab labels with placeholders (WordPress/gutenberg#81197) - PanelColorSettings: Restore the missing space below the panel header (WordPress/gutenberg#81155) - Visual revisions: add shareable urls (WordPress/gutenberg#81205) - Notes: fix the mention notification email composition (WordPress/gutenberg#81187) - Fix ESLint warnings for 'navigateRegionsProps' spread (WordPress/gutenberg#81208) - Widgets editor: Add ThemeProvider for admin color schemes (WordPress/gutenberg#81173) - Remove the editableRoot opt-in from the paragraph block (WordPress/gutenberg#81184) - Media Attached to: Fix issue with the popover unexpectedly flipping, tweak wording (WordPress/gutenberg#81206) - Ensure device preview is always accurate when window is zoomed in (WordPress/gutenberg#81215) Props wildworks. See #65529. git-svn-id: https://develop.svn.wordpress.org/trunk@63026 602fd350-edb4-49c9-b593-d223f7449a82
This updates the pinned commit hash of the Gutenberg repository from `fd715a6833679d098d9fee84b642f8f1bc27341b` to `f05e40e91c54f29c449b1f33d0db89f5166812d9`. A full list of changes included in this commit can be found on GitHub: WordPress/gutenberg@fd715a6...f05e40e - Writing flow: forward delete an empty paragraph without breaking apart the next block (WordPress/gutenberg#80813) - Upload Media: Fail the item when the /finalize request fails (WordPress/gutenberg#80725) - Fix template `modified` and `date` return value for file templates (WordPress/gutenberg#80733) - Boot: Adjust specificity of the image reset styles so components can size their own images (WordPress/gutenberg#80845) - Quote: Ensure paragraph placeholder appears after deleting nested blocks (WordPress/gutenberg#77151) - Block editor: make the Group action wrap blocks with a group transform (WordPress/gutenberg#80891) - Copy: preserve the block when its entire text is selected (WordPress/gutenberg#80994) - Add opt-out for block style state controls (WordPress/gutenberg#80956) (WordPress/gutenberg#81004) - Tabs: Support Home and End keys for keyboard navigation (WordPress/gutenberg#80912) - Rename blockStatesEnabled setting to blockStatesEditingEnabled (WordPress/gutenberg#81058) - [WP 7.1] Background: Fix the legacy gradient UI where a gradient cannot be selected (WordPress/gutenberg#81059) - Views: honor developer-defined view config overrides (WordPress/gutenberg#80832) - Playlist: Add track icon (WordPress/gutenberg#81078) - Remove the CODEOWNERS file from wp/7.1. (WordPress/gutenberg#81104) - Notes: Email users mentioned in a note (WordPress/gutenberg#79606) - Backport 81068 80744 80642 (WordPress/gutenberg#81135) - Site Editor: Add E2E coverage for view config extensibility (WordPress/gutenberg#80577) - change from WordPress/gutenberg#81068 (WordPress/gutenberg#81140) - Link Control: Restore the preview title underline (WordPress/gutenberg#81083) - Button: Suppress UA focus ring when focused and pressed (WordPress/gutenberg#81113) - View config: add reference docs (WordPress/gutenberg#81149) - Editor: Fix document tools button focus ring (WordPress/gutenberg#81115) - Interface: Increase footer breadcrumb height to prevent focus ring clipping (WordPress/gutenberg#81156) - Post editor: Add ThemeProvider for admin color schemes (WordPress/gutenberg#81112) - Pass Playlist controls to track blocks (WordPress/gutenberg#81158) - Theme: Omit color properties when neither provided nor inherited (WordPress/gutenberg#80600) (WordPress/gutenberg#81172) - Media: Improve the HEIC upload error and keep any upload errors up until dismissed (WordPress/gutenberg#81130) - Video: Hide settings for the GIF variation (WordPress/gutenberg#81142) - Video: clarify the Video variation description (WordPress/gutenberg#81181) - Button: turn on the width setting by default in theme.json (WordPress/gutenberg#81196) - Edit Widgets: Fix header toolbar button focus ring (WordPress/gutenberg#81176) - Build: Wrap script bundles in an IIFE to contain 'use strict' (WordPress/gutenberg#79792) - Customizer widgets: Add ThemeProvider for admin color schemes (WordPress/gutenberg#81174) - Fix: Tabs block: Start with empty tab labels with placeholders (WordPress/gutenberg#81197) - PanelColorSettings: Restore the missing space below the panel header (WordPress/gutenberg#81155) - Visual revisions: add shareable urls (WordPress/gutenberg#81205) - Notes: fix the mention notification email composition (WordPress/gutenberg#81187) - Fix ESLint warnings for 'navigateRegionsProps' spread (WordPress/gutenberg#81208) - Widgets editor: Add ThemeProvider for admin color schemes (WordPress/gutenberg#81173) - Remove the editableRoot opt-in from the paragraph block (WordPress/gutenberg#81184) - Media Attached to: Fix issue with the popover unexpectedly flipping, tweak wording (WordPress/gutenberg#81206) - Ensure device preview is always accurate when window is zoomed in (WordPress/gutenberg#81215) Props wildworks. See #65529. Built from https://develop.svn.wordpress.org/trunk@63026 git-svn-id: http://core.svn.wordpress.org/trunk@62245 1a063a9b-81f0-0310-95a4-ce76da25c4cd
Introduce `wp_notify_note_mentions()` on `rest_insert_comment`, alongside the existing post author notification, which parses those IDs out of the saved note and emails each mentioned user in their own locale with a link back to the post editor. Recipients are limited to users who can `edit_comment` the note, matching `WP_REST_Comments_Controller::check_read_permission()`, so an email cannot carry note content to someone who cannot see the note in the editor. The note's own author is skipped, as is the post author, who `wp_new_comment_via_rest_notify_postauthor()` already notifies about every note. Only note creation notifies, and the existing `wp_notes_notify` option turns the whole path off. See related Gutenberg pull request: WordPress/gutenberg#79606. Follow-up to [62832]. Props westonruter, mamaduka. Fixes #65639. git-svn-id: https://develop.svn.wordpress.org/trunk@63012 602fd350-edb4-49c9-b593-d223f7449a82
This updates the pinned commit hash of the Gutenberg repository from `fd715a6833679d098d9fee84b642f8f1bc27341b` to `f05e40e91c54f29c449b1f33d0db89f5166812d9`. A full list of changes included in this commit can be found on GitHub: WordPress/gutenberg@fd715a6...f05e40e - Writing flow: forward delete an empty paragraph without breaking apart the next block (WordPress/gutenberg#80813) - Upload Media: Fail the item when the /finalize request fails (WordPress/gutenberg#80725) - Fix template `modified` and `date` return value for file templates (WordPress/gutenberg#80733) - Boot: Adjust specificity of the image reset styles so components can size their own images (WordPress/gutenberg#80845) - Quote: Ensure paragraph placeholder appears after deleting nested blocks (WordPress/gutenberg#77151) - Block editor: make the Group action wrap blocks with a group transform (WordPress/gutenberg#80891) - Copy: preserve the block when its entire text is selected (WordPress/gutenberg#80994) - Add opt-out for block style state controls (WordPress/gutenberg#80956) (WordPress/gutenberg#81004) - Tabs: Support Home and End keys for keyboard navigation (WordPress/gutenberg#80912) - Rename blockStatesEnabled setting to blockStatesEditingEnabled (WordPress/gutenberg#81058) - [WP 7.1] Background: Fix the legacy gradient UI where a gradient cannot be selected (WordPress/gutenberg#81059) - Views: honor developer-defined view config overrides (WordPress/gutenberg#80832) - Playlist: Add track icon (WordPress/gutenberg#81078) - Remove the CODEOWNERS file from wp/7.1. (WordPress/gutenberg#81104) - Notes: Email users mentioned in a note (WordPress/gutenberg#79606) - Backport 81068 80744 80642 (WordPress/gutenberg#81135) - Site Editor: Add E2E coverage for view config extensibility (WordPress/gutenberg#80577) - change from WordPress/gutenberg#81068 (WordPress/gutenberg#81140) - Link Control: Restore the preview title underline (WordPress/gutenberg#81083) - Button: Suppress UA focus ring when focused and pressed (WordPress/gutenberg#81113) - View config: add reference docs (WordPress/gutenberg#81149) - Editor: Fix document tools button focus ring (WordPress/gutenberg#81115) - Interface: Increase footer breadcrumb height to prevent focus ring clipping (WordPress/gutenberg#81156) - Post editor: Add ThemeProvider for admin color schemes (WordPress/gutenberg#81112) - Pass Playlist controls to track blocks (WordPress/gutenberg#81158) - Theme: Omit color properties when neither provided nor inherited (WordPress/gutenberg#80600) (WordPress/gutenberg#81172) - Media: Improve the HEIC upload error and keep any upload errors up until dismissed (WordPress/gutenberg#81130) - Video: Hide settings for the GIF variation (WordPress/gutenberg#81142) - Video: clarify the Video variation description (WordPress/gutenberg#81181) - Button: turn on the width setting by default in theme.json (WordPress/gutenberg#81196) - Edit Widgets: Fix header toolbar button focus ring (WordPress/gutenberg#81176) - Build: Wrap script bundles in an IIFE to contain 'use strict' (WordPress/gutenberg#79792) - Customizer widgets: Add ThemeProvider for admin color schemes (WordPress/gutenberg#81174) - Fix: Tabs block: Start with empty tab labels with placeholders (WordPress/gutenberg#81197) - PanelColorSettings: Restore the missing space below the panel header (WordPress/gutenberg#81155) - Visual revisions: add shareable urls (WordPress/gutenberg#81205) - Notes: fix the mention notification email composition (WordPress/gutenberg#81187) - Fix ESLint warnings for 'navigateRegionsProps' spread (WordPress/gutenberg#81208) - Widgets editor: Add ThemeProvider for admin color schemes (WordPress/gutenberg#81173) - Remove the editableRoot opt-in from the paragraph block (WordPress/gutenberg#81184) - Media Attached to: Fix issue with the popover unexpectedly flipping, tweak wording (WordPress/gutenberg#81206) - Ensure device preview is always accurate when window is zoomed in (WordPress/gutenberg#81215) Props wildworks. See #65529. git-svn-id: https://develop.svn.wordpress.org/trunk@63026 602fd350-edb4-49c9-b593-d223f7449a82
Co-authored-by: talldan <talldanwp@git.wordpress.org> Co-authored-by: adamsilverstein <adamsilverstein@git.wordpress.org> Co-authored-by: westonruter <westonruter@git.wordpress.org> Co-authored-by: Mamaduka <mamaduka@git.wordpress.org> Co-authored-by: sethrubenstein <smrubenstein@git.wordpress.org>
|
One concern with the current implementation is that wp_mail() is called synchronously for every mentioned user from the rest_insert_comment callback. This means that a note mentioning many users can result in many mail operations being performed within the same REST request. A slow or failing mail transport can therefore make the request slow/fail after only part of the notification batch has been delivered. There also doesn't appear to be persistent notification state/idempotency around these sends, so a client retry after a request timeout could potentially result in another notification batch. Would it make sense to track this as a follow-up issue for asynchronous notification delivery, retry/backoff, and idempotency? I think this would also make the implementation more resilient for sites with a larger number of eligible note recipients. Another consideration is notification volume. The implementation deduplicates repeated mentions of the same user, which is good, but I don't see a notification-specific limit on the number of recipients or notification events generated by a user. Even if the expected number of recipients is normally small, it may be worth considering a server-side bound or throttling mechanism so that notification volume cannot grow unexpectedly. I suggest a follow-up issue covering:
The current synchronous implementation seems acceptable as an initial compatibility implementation, but these would be useful safeguards for production deployments. |
@ArchitectOfRuin some improvements are certainly welcome here and probably an issue with your specific recommendations. Might be worth doing some research on previous efforts and also the discussion on the related effort to enable following/unfollowing discussion threads: And: |
This updates the pinned commit hash of the Gutenberg repository from `5a0417990a9404cc2562cdd35e3054cb0d3e546e` (version `23.7.0`) to `ae8b34d78e1abc6d1c866fdc00080a1452de82ad` (version `23.8.0`). A full list of changes included in this commit can be found on GitHub: https://github.com/WordPress/gutenberg/compare/v23.7.0..v23.8.0. - Fix: New route-based admin pages are empty when no JS (WordPress/gutenberg#80628) - Report flaky tests: declare @types/node (WordPress/gutenberg#80838) - Storybook e2e: add small, compact and icon examples to button matrix (WordPress/gutenberg#80793) - ESLint: Drop @eslint/compat fixup for jest-dom and testing-library (WordPress/gutenberg#80842) - Storybook: Use SelectControl in Motion tokens story (WordPress/gutenberg#80790) - Writing flow: forward delete an empty paragraph without breaking apart the next block (WordPress/gutenberg#80813) - ToggleControl: Add "With Visual" Storybook story (WordPress/gutenberg#80803) - Bump the github-actions group across 1 directory with 5 updates (WordPress/gutenberg#80684) - Update Ariakit packages (WordPress/gutenberg#80765) - Components: Update Floating UI to 2.1.9 (WordPress/gutenberg#80761) - Improve pre-flight npm access checks (WordPress/gutenberg#80334) - Ensure static checks can run for private mirrors (WordPress/gutenberg#80817) - Components: Update react-day-picker to 9.14.0 (WordPress/gutenberg#80792) - Testing: Remove the jest-puppeteer-axe package (WordPress/gutenberg#80775) - Tools: Use native agent skill discovery (WordPress/gutenberg#80811) - Table of Contents: Replace "Convert to static list" with confirmed "Detach" action (WordPress/gutenberg#80844) - Page List: Rename the Edit action to Detach and confirm it in a dialog (WordPress/gutenberg#80847) - URLInput: Simplify keyboard handling and fix arrow keys with a text selection (WordPress/gutenberg#80780) - Upload Media: Fail the item when the /finalize request fails (WordPress/gutenberg#80725) - Jest preset: support self-referencing via exports (WordPress/gutenberg#80837) - Fix template `modified` and `date` return value for file templates (WordPress/gutenberg#80733) - Element: Make the package importable in React 19 (WordPress/gutenberg#80053) - Add CheckboxControl with-visual Storybook story. (WordPress/gutenberg#80849) - UI: Add Combobox.InputGroup primitive (WordPress/gutenberg#80869) - Block Editor: Clear the moving animation's z-index when it finishes (WordPress/gutenberg#80824) - SearchableChipSelect: Add form primitive to @wordpress/ui (WordPress/gutenberg#80779) - Playlist: Add track icon (WordPress/gutenberg#80959) - Flaky tests: fix router navigate latest HTML (WordPress/gutenberg#80178) - Components: Update polymorphism types to allow all attributes when specifying `as` (WordPress/gutenberg#80705) - Block JSON schema & PHP-only blocks: Add `autoRegister` support (WordPress/gutenberg#80173) - Boot: Adjust specificity of the image reset styles so components can size their own images (WordPress/gutenberg#80845) - Components: Opt-in ConfirmDialog for auto-documentation (WordPress/gutenberg#80866) - RichText: don't apply input transform when there's no onReplace (WordPress/gutenberg#80978) - Quote: Ensure paragraph placeholder appears after deleting nested blocks (WordPress/gutenberg#77151) - Block editor: make the Group action wrap blocks with a group transform (WordPress/gutenberg#80891) - Copy: preserve the block when its entire text is selected (WordPress/gutenberg#80994) - Add opt-out for block style state controls (WordPress/gutenberg#80956) - Upgrade Playwright to v1.62 (WordPress/gutenberg#81001) - List View: Speed up opening by removing a forced style recalculation (WordPress/gutenberg#80929) - Widget Dashboard: preserve widget chrome flex layout (WordPress/gutenberg#80570) - Widget Primitives: document actions as verbs, not links (WordPress/gutenberg#80974) - Core Data: add missing @wordpress/base-styles dependency (WordPress/gutenberg#81012) - Ignore node_modules in schema integration test globs (WordPress/gutenberg#81013) - RichText: fix paste handler crash when pasting files (WordPress/gutenberg#81010) - Docs: Add VS Code setup guidance (WordPress/gutenberg#77913) - Perf Tests: Merge selection event windows instead of summing durations (WordPress/gutenberg#81002) - Storybook: move smoke-test deps into the storybook workspace (WordPress/gutenberg#81017) - Unit Tests: Reorganise the jest config file. (WordPress/gutenberg#80940) - Performance Tests: Ignore the locally generated artifacts directory (WordPress/gutenberg#81024) - Editor: Remove sidebar tabs focus sync effect (WordPress/gutenberg#81020) - Widgets: carry a declarative `icon` through the widget pipeline (WordPress/gutenberg#80969) - RTC: Remove excess autosave notices (when not useful) (WordPress/gutenberg#80539) - UI: Use focus styles from base-styles (WordPress/gutenberg#80635) - Automated Testing: Add Storybook component documentation regression testing (WordPress/gutenberg#80655) - Pass Playlist controls to track blocks (WordPress/gutenberg#80368) - Components: Deprecate Surface (WordPress/gutenberg#80943) - Tabs: Support Home and End keys for keyboard navigation (WordPress/gutenberg#80912) - Fix typos in code `comments` and `JSDoc` (WordPress/gutenberg#81045) - Interface: Remove incorrect aria-expanded from pin-to-toolbar button (WordPress/gutenberg#79874) - List View: Speed up opening by removing a second render pass (WordPress/gutenberg#80935) - Docs: Use `gutenberg` instead of `Gutenberg` in package name (WordPress/gutenberg#81051) - Fix ESLint warnings for 'navigateRegionsProps' spread (WordPress/gutenberg#81052) - Tests: Replace page-level selectors with locators in e2e specs (WordPress/gutenberg#81053) - RTC: Disable custom autosave controller when RTC is disabled (WordPress/gutenberg#80769) - Background: Fix the legacy gradient UI where a gradient cannot be selected (WordPress/gutenberg#81056) - Rename blockStatesEnabled setting to blockStatesEditingEnabled (WordPress/gutenberg#81058) - Background: Fix the legacy gradient UI where a gradient cannot be selected - Add missing change log (WordPress/gutenberg#81060) - Declare missing prettier and stylelint workspace dependencies (WordPress/gutenberg#81065) - Notes: Display shortcut for form action buttons (WordPress/gutenberg#81064) - View config: lowercase dynamic filter names (WordPress/gutenberg#81068) - CI: cache the system packages Playwright dowloads for WebKit (WordPress/gutenberg#80846) - List View: Collapse off-window placeholder rows into a single spacer row (WordPress/gutenberg#80953) - devops: balance Playwright shards by duration (WordPress/gutenberg#79479) - Views: honor developer-defined view config overrides (WordPress/gutenberg#80832) - Components: Migrate ItemGroup to SCSS module (WordPress/gutenberg#80797) - Test: Add Vitest migration routing guardrails (WordPress/gutenberg#81036) - Visual revisions: Add a code diff view inside the editor (WordPress/gutenberg#80314) - Bump actions/labeler from 6.1.0 to 7.0.0 in /.github/workflows (WordPress/gutenberg#80966) - Visual revisions: add shareable urls (WordPress/gutenberg#79934) - Fix e2e tests that break when shard rebalancing changes their neighbors (WordPress/gutenberg#81117) - Query: guard non-scalar queryId to avoid fatal in enhanced pagination (WordPress/gutenberg#80724) - Replace deprecated useResizeObserver for useScaleCanvas (WordPress/gutenberg#67508) - CI: Add job timeouts to E2E, static checks, bundle size, and create block (WordPress/gutenberg#80801) - Allow organization or repository variable to dictate the Actions runner (WordPress/gutenberg#81087) - List View: Only subscribe to the block subtree for rows that can show images (WordPress/gutenberg#81076) - Editor: Migrate settings sidebar to Tabs from @wordpress/ui (WordPress/gutenberg#81054) - Notes: Email users mentioned in a note (WordPress/gutenberg#79606) - List View: Narrow the dependants of the memoized List View tree (WordPress/gutenberg#81129) - List View: Pass only minimal required data to sub-tree branches (WordPress/gutenberg#81111) - DataViews: Add `time` field type and control (WordPress/gutenberg#80830) - Post Author Biography: Fix horizontal overflow with long unbroken text (WordPress/gutenberg#81018) - Link Control: Restore the preview title underline (WordPress/gutenberg#81083) - Views: Add React to the package's dev dependencies (WordPress/gutenberg#81139) - feat: Add target param in proxy (WordPress/gutenberg#81141) - Fix: flaky revisions pagination e2e cross-page diff assertion (WordPress/gutenberg#81119) - Button: Suppress UA focus ring when focused and pressed (WordPress/gutenberg#81113) - View config: add reference docs (WordPress/gutenberg#81149) - Editor: Fix document tools button focus ring (WordPress/gutenberg#81115) - List View: Replace expand/collapse callbacks with reducer dispatch (WordPress/gutenberg#81138) - CI: resolve Playwright through the workspace that declares it (WordPress/gutenberg#81137) - CI: build once and reuse the build across e2e tests shards (WordPress/gutenberg#81031) - Fix: Tabs block: Start with empty tab labels with placeholders (WordPress/gutenberg#81009) - Interface: Increase footer breadcrumb height to prevent focus ring clipping (WordPress/gutenberg#81145) - Editor: clarify autosave failure notice (WordPress/gutenberg#76470) - Theme: Omit color properties when neither provided nor inherited (WordPress/gutenberg#80600) - Post editor: Add ThemeProvider for admin color schemes (WordPress/gutenberg#81112) - Core Data: saveDirtyEntities: improve messaging of server errors (WordPress/gutenberg#81151) - Global Styles: kebab-case preset slugs when converting references to custom properties (WordPress/gutenberg#80583) - Revise CODEOWNERS for package ownership (removing nerrad) (WordPress/gutenberg#81175) - Build: Wrap script bundles in an IIFE to contain 'use strict' (WordPress/gutenberg#79792) - Media: Improve the HEIC upload error and keep any upload errors up until dismissed (WordPress/gutenberg#81130) - Block Supports: Guard against non-string attribute values to avoid fatal errors (WordPress/gutenberg#80501) - Video: Hide settings for the GIF variation (WordPress/gutenberg#81142) - Video: clarify the Video variation description (WordPress/gutenberg#81181) - Media Editor: Render sidebar tabs via ComplementaryArea's render prop (WordPress/gutenberg#81133) - Bump docker/login-action (WordPress/gutenberg#80962) - Bump actions/setup-node from 6.4.0 to 7.0.0 in /.github/setup-node (WordPress/gutenberg#80963) - fix(admin-ui): reset the wp-admin li margin that misaligns Breadcrumbs (WordPress/gutenberg#81134) - Bump astral-sh/setup-uv from 8.3.2 to 9.0.0 in /.github/workflows (WordPress/gutenberg#80964) - Fix/79643 rtc awareness mixed block selection (WordPress/gutenberg#79836) - Agents: Add a defensive data design skill and route to the copy guide (WordPress/gutenberg#81131) - ESLint: Ban `@ts-ignore` in favour of `@ts-expect-error` (WordPress/gutenberg#81148) - Types: Replace remaining `@ts-expect-error` suppressions with proper typing (WordPress/gutenberg#81200) - Button: turn on the width setting by default in theme.json (WordPress/gutenberg#81196) - Notes: fix the mention notification email composition (WordPress/gutenberg#81187) - Edit Widgets: Fix header toolbar button focus ring (WordPress/gutenberg#81176) - List View: Reduce per-row store subscriptions (WordPress/gutenberg#81136) - Customizer widgets: Add ThemeProvider for admin color schemes (WordPress/gutenberg#81174) - Blocks: Declare the `@types/react-is` devDependency (WordPress/gutenberg#81203) - Widgets editor: Add ThemeProvider for admin color schemes (WordPress/gutenberg#81173) - PanelColorSettings: Restore the missing space below the panel header (WordPress/gutenberg#81155) - Remove the editableRoot opt-in from the paragraph block (WordPress/gutenberg#81184) - Media Attached to: Fix issue with the popover unexpectedly flipping, tweak wording (WordPress/gutenberg#81206) - Components: Add allowForms prop to SandBox component (WordPress/gutenberg#76471) - Ensure device preview is always accurate when window is zoomed in (WordPress/gutenberg#81193) - DataViews: Pass only eligible items to a bulk action callback (WordPress/gutenberg#81198) - DataViews: Make grid and table item preview aspect ratio configurable (WordPress/gutenberg#79329) - Block Editor: Return false from isBlockSelected when there is no client ID (WordPress/gutenberg#81212) - Blocks: Update hpq to 1.4.0 and drop the ts-expect-error suppressions (WordPress/gutenberg#81199) - DataViews: Fix the between `date` filter losing a manually typed date on blur (WordPress/gutenberg#81150) - Block Editor: Fix Select all freezing on large posts (WordPress/gutenberg#81210) - List View: Split the context and drop dead props to cut re-renders on expand and collapse (WordPress/gutenberg#81159) - Docs: Fix broken Figma links on the design resources page. (WordPress/gutenberg#81166) - Blocks: Support static block templates in block type settings (WordPress/gutenberg#80027) - AGENTS: Update development tips section (WordPress/gutenberg#81224) - URLInput: Skip search requests while an IME composition is in progress (WordPress/gutenberg#80602) - Components: Deprecate Animate (WordPress/gutenberg#80931) - Fix: Trunk e2e failures caused by the navigation spec leaving plain permalinks (WordPress/gutenberg#81238) - Use p elements for callout alerts in components docs (WordPress/gutenberg#81234) - Storybook: Enable design system theme tool globally (WordPress/gutenberg#81116) - Media: Cover client-side big image scaling and orphaned files (WordPress/gutenberg#81061) - Footnotes: guard against invalid post meta values (WordPress/gutenberg#81201) - Block editor: unify what a new sibling block inherits (WordPress/gutenberg#81250) - Global Styles: Remove unused duplicate font family preview utilities (WordPress/gutenberg#81194) - Docs: explain how the theme.json schema fixtures work (WordPress/gutenberg#81263) - theme.json schema: fix block pseudo-classes and custom states (WordPress/gutenberg#81209) - List View: Migrate label wrapper to UI Stack and drop Badge from the anchor (WordPress/gutenberg#81266) - Docs: Remove dependency group import guidance (WordPress/gutenberg#81245) - ESLint: Define dependency import rules (WordPress/gutenberg#81246) - Flaky tests: Report as a PR comment only, stop creating issues (WordPress/gutenberg#81218) - Dashboard Widgets: remove the Hello Dolly download action (WordPress/gutenberg#81272) - Block Directory: Make downloadable block item labels translatable. (WordPress/gutenberg#81237) - Icons: move the inline image icon into the library (WordPress/gutenberg#81271) - Update phpcs, wpcs dependencies (WordPress/gutenberg#81279) - fix: add optional chaining for empty reusable block (WordPress/gutenberg#81165) (WordPress/gutenberg#81177) - DataViews: Inline the kebabCase utility from components (WordPress/gutenberg#81284) - Navigation: Complete the DocBlocks for the responsive container and overlay style helpers (WordPress/gutenberg#80622) - Style states: fix state deselection when selecting the already selected block (WordPress/gutenberg#81277) - Fix missing return value in force_filtered_html_on_import footnotes filter (WordPress/gutenberg#81293) - Packages: Recover July 29 npm release metadata (WordPress/gutenberg#81303) - Global styles: render element styles set only inside a breakpoint (WordPress/gutenberg#81265) - Style states: Fix phantom pseudo element style output (WordPress/gutenberg#81291) - Docs: remove breakpoint-only element style example from global styles guide (WordPress/gutenberg#81308) - Render viewport state element styles in the editor (WordPress/gutenberg#81307) - theme.json schema: responsive states belong to blocks (WordPress/gutenberg#81253) - theme.json schema: allow responsive states on block style variations (WordPress/gutenberg#81309) - Block Inspector: Disable the 'Edit original' button when the entity ID is missing (WordPress/gutenberg#81288) - Site Editor: Decode HTML entities in Identity fields (WordPress/gutenberg#81269) - Document editEntityRecord's options.isCached param (WordPress/gutenberg#81318) - Theme: Colocate plugin tests with implementations (WordPress/gutenberg#81247) - Block Editor: Bail out of hasSelectedInnerBlock when there is no clientId (WordPress/gutenberg#81315) - ESLint: Replace strict config with bulk suppressions (WordPress/gutenberg#81248) - Block Library: Document security patch releases (WordPress/gutenberg#81295) - ESLint: Remove legacy import suppressions (WordPress/gutenberg#81338) - Components: Migrate Spinner styles from Emotion to SCSS module (WordPress/gutenberg#80511) - DataViews: Use the public `@wordpress/ui` Badge instead of the private one (WordPress/gutenberg#81236) - Pert Tests: Avoid inflating interaction metrics with startTracing (WordPress/gutenberg#81264) - Block Editor: Simplify InspectorControlsFill rendering logic (WordPress/gutenberg#81286) - Keycodes: Make `withIgnoreIMEEvents` a public API (WordPress/gutenberg#81343) - Docs: Fix broken links to the removed JavaScript build setup guide. (WordPress/gutenberg#81232) - Markdownlint: disable the MD033 (no-inline-html) rule project-wide (WordPress/gutenberg#81213) - Docs: Fix typo in block file structure guide (WordPress/gutenberg#81348) - Playlist: Normalize Waveform Player configuration handling (WordPress/gutenberg#81342) - Site editor: fix unreadable sidebar hover color (WordPress/gutenberg#81317) - Global Styles: Migrate font size presets to the shared preset layer (WordPress/gutenberg#79811) - Block Editor: Convert useBlockVisibility hook to TypeScript (WordPress/gutenberg#80390) - Scope breakpoint media queries to screen so printing does not look like a resize (WordPress/gutenberg#81367) - New `kebab-case` package: extract utility and migrate private API calls (WordPress/gutenberg#81294) - Remove content types experiment (WordPress/gutenberg#81340) - Editor: Keep the canvas height stable while resizing the canvas (WordPress/gutenberg#81163) - Dashboard Widgets: add icon and relevance to the widget action envelope (WordPress/gutenberg#81275) - Playlist: Improve audio conversion and track selection (WordPress/gutenberg#80926) - Try: Set post navigation link icon to next. (WordPress/gutenberg#81384) - UI: Derive Base UI direction from WordPress i18n (WordPress/gutenberg#80399) - DataViews: Fix `array` field type validation for empty values (WordPress/gutenberg#81378) - Bump github/codeql-action/upload-sarif (WordPress/gutenberg#81287) - Bump actions/stale from 10.4.0 to 11.0.0 in /.github/workflows (WordPress/gutenberg#81219) - Monitor all setup-related composite Actions. (WordPress/gutenberg#81192) - IconButton: Improve keyboard shortcut accessibility (WordPress/gutenberg#80402) - Interface: Stop the secondary sidebar animating into place on page load (WordPress/gutenberg#81362) - Fix: flaky list view paste block styles e2e test (WordPress/gutenberg#81229) - Docs: Add error message guidance. (WordPress/gutenberg#81143) - wp-build: Render the no-JS fallback in the generated page templates (WordPress/gutenberg#81365) - Changed Build Process Link and remove unused tags (WordPress/gutenberg#81360) - Scripts: Prevent a UTF-8 BOM in the middle of extracted CSS (WordPress/gutenberg#81383) - Global Styles: Migrate shadows presets to use the preset management layer. (WordPress/gutenberg#79812) - Global Styles: report border, shadow, outline, filter and dimension changes (WordPress/gutenberg#81407) - Dashboard Widgets: split action icons into wire and resolved forms (WordPress/gutenberg#81381) - Block Editor: Fix Escape from the block toolbar and stop redundant last focus dispatches (WordPress/gutenberg#81319) - Block Mover: Add the keyboard shortcut to the buttons' spoken description (WordPress/gutenberg#81380) - Format Library: Remove unused CSS rule (WordPress/gutenberg#77831) - Core Data: Fix post staying dirty after saving edited post meta with RTC enabled (WordPress/gutenberg#81392) - Widget Dashboard: host-tunable tile spacing via public custom properties (WordPress/gutenberg#81352) - DataForm: Fix hidden fields validation (WordPress/gutenberg#81377) - Tools: Make agent setup a workspace (WordPress/gutenberg#81418) - Test: Add private Vitest config and migrate a pilot test (WordPress/gutenberg#81037) - Interface: Let CSS own the ComplementaryArea width and use AnimatePresence custom for exit (WordPress/gutenberg#81363) - Notes: Fix text wrapping for long usernames in collaboration sidebar (WordPress/gutenberg#81406) - DataViews: vendor `ValidatedSelectControl` (WordPress/gutenberg#81391) - UI: Add `Calendar` and `RangeCalendar`, moved from `components` private APIs (WordPress/gutenberg#81337) - Feature: Tabs block: consider using the tab title in the Document Overview instead of a generic "Tab" label (WordPress/gutenberg#81427) - fix: order site identity changes predictably (WordPress/gutenberg#81283) - Docs: Fix broken link to the Node.js debugging guide. (WordPress/gutenberg#81398) - Navigation Overlay Close: Inherit typography and color from the overlay (WordPress/gutenberg#80751) - Fix: Regression: Tabs block: Start with empty tab labels with placeholders (WordPress/gutenberg#81429) - components/Menu: Restore Modal focus return when menu items close (WordPress/gutenberg#81164) - DataViews: Move the rich text control into the editor package (WordPress/gutenberg#81430) - Components: Remove ValidatedTextControl private API (WordPress/gutenberg#80680) - Cover: Avoid passing null as the featured image size (WordPress/gutenberg#81444) - DataViews: vendor `ValidatedNumberControl` (WordPress/gutenberg#81433) - DataViews: vendor ValidatedCheckboxControl (WordPress/gutenberg#81435) - DataViews: vendor ValidatedRadioControl (WordPress/gutenberg#81434) - UI: Upgrade React DayPicker to version 10 (WordPress/gutenberg#81439) - Block editor: render a real default block in place of the default appender (WordPress/gutenberg#81231) - Spacing Sizes Control: Make the control label translatable independently of the input aria label. (WordPress/gutenberg#81240) - Writing flow: stop the caret on containers that do not merge with the text flow (WordPress/gutenberg#81456) - Remove an unmodified wrapper when all its inner blocks are removed (WordPress/gutenberg#42503) - Normalize block gap values in layout (WordPress/gutenberg#81460) - Docs: Add Block Actions Readme (WordPress/gutenberg#69408) - Block editor: disclose the nested block count of a multi selection (WordPress/gutenberg#80745) - Fix: flaky autosave shareable URL revisions e2e test. (WordPress/gutenberg#81455) - Fix empty list block with anchor persisting after backspace deletion (WordPress/gutenberg#77000) - Docs: Add Block List Readme (WordPress/gutenberg#69432) - Docs: Add Block Lock Readme (WordPress/gutenberg#69434) - Backport core fixes for finalize route (WordPress/gutenberg#81465) - ESLint: Rename root eslint.config.cjs to eslint.config.mjs (WordPress/gutenberg#81468) - Update 23.8 release branch (WordPress/gutenberg#81486) - RTC: Couple RTC and polling provider as an opt-in experiment (WordPress/gutenberg#80658) - Align collaboration migration version markers with the 23.8.0 release (WordPress/gutenberg#81789) Fixes #66066. git-svn-id: https://develop.svn.wordpress.org/trunk@63534 602fd350-edb4-49c9-b593-d223f7449a82
This updates the pinned commit hash of the Gutenberg repository from `5a0417990a9404cc2562cdd35e3054cb0d3e546e` (version `23.7.0`) to `ae8b34d78e1abc6d1c866fdc00080a1452de82ad` (version `23.8.0`). A full list of changes included in this commit can be found on GitHub: https://github.com/WordPress/gutenberg/compare/v23.7.0..v23.8.0. - Fix: New route-based admin pages are empty when no JS (WordPress/gutenberg#80628) - Report flaky tests: declare @types/node (WordPress/gutenberg#80838) - Storybook e2e: add small, compact and icon examples to button matrix (WordPress/gutenberg#80793) - ESLint: Drop @eslint/compat fixup for jest-dom and testing-library (WordPress/gutenberg#80842) - Storybook: Use SelectControl in Motion tokens story (WordPress/gutenberg#80790) - Writing flow: forward delete an empty paragraph without breaking apart the next block (WordPress/gutenberg#80813) - ToggleControl: Add "With Visual" Storybook story (WordPress/gutenberg#80803) - Bump the github-actions group across 1 directory with 5 updates (WordPress/gutenberg#80684) - Update Ariakit packages (WordPress/gutenberg#80765) - Components: Update Floating UI to 2.1.9 (WordPress/gutenberg#80761) - Improve pre-flight npm access checks (WordPress/gutenberg#80334) - Ensure static checks can run for private mirrors (WordPress/gutenberg#80817) - Components: Update react-day-picker to 9.14.0 (WordPress/gutenberg#80792) - Testing: Remove the jest-puppeteer-axe package (WordPress/gutenberg#80775) - Tools: Use native agent skill discovery (WordPress/gutenberg#80811) - Table of Contents: Replace "Convert to static list" with confirmed "Detach" action (WordPress/gutenberg#80844) - Page List: Rename the Edit action to Detach and confirm it in a dialog (WordPress/gutenberg#80847) - URLInput: Simplify keyboard handling and fix arrow keys with a text selection (WordPress/gutenberg#80780) - Upload Media: Fail the item when the /finalize request fails (WordPress/gutenberg#80725) - Jest preset: support self-referencing via exports (WordPress/gutenberg#80837) - Fix template `modified` and `date` return value for file templates (WordPress/gutenberg#80733) - Element: Make the package importable in React 19 (WordPress/gutenberg#80053) - Add CheckboxControl with-visual Storybook story. (WordPress/gutenberg#80849) - UI: Add Combobox.InputGroup primitive (WordPress/gutenberg#80869) - Block Editor: Clear the moving animation's z-index when it finishes (WordPress/gutenberg#80824) - SearchableChipSelect: Add form primitive to @wordpress/ui (WordPress/gutenberg#80779) - Playlist: Add track icon (WordPress/gutenberg#80959) - Flaky tests: fix router navigate latest HTML (WordPress/gutenberg#80178) - Components: Update polymorphism types to allow all attributes when specifying `as` (WordPress/gutenberg#80705) - Block JSON schema & PHP-only blocks: Add `autoRegister` support (WordPress/gutenberg#80173) - Boot: Adjust specificity of the image reset styles so components can size their own images (WordPress/gutenberg#80845) - Components: Opt-in ConfirmDialog for auto-documentation (WordPress/gutenberg#80866) - RichText: don't apply input transform when there's no onReplace (WordPress/gutenberg#80978) - Quote: Ensure paragraph placeholder appears after deleting nested blocks (WordPress/gutenberg#77151) - Block editor: make the Group action wrap blocks with a group transform (WordPress/gutenberg#80891) - Copy: preserve the block when its entire text is selected (WordPress/gutenberg#80994) - Add opt-out for block style state controls (WordPress/gutenberg#80956) - Upgrade Playwright to v1.62 (WordPress/gutenberg#81001) - List View: Speed up opening by removing a forced style recalculation (WordPress/gutenberg#80929) - Widget Dashboard: preserve widget chrome flex layout (WordPress/gutenberg#80570) - Widget Primitives: document actions as verbs, not links (WordPress/gutenberg#80974) - Core Data: add missing @wordpress/base-styles dependency (WordPress/gutenberg#81012) - Ignore node_modules in schema integration test globs (WordPress/gutenberg#81013) - RichText: fix paste handler crash when pasting files (WordPress/gutenberg#81010) - Docs: Add VS Code setup guidance (WordPress/gutenberg#77913) - Perf Tests: Merge selection event windows instead of summing durations (WordPress/gutenberg#81002) - Storybook: move smoke-test deps into the storybook workspace (WordPress/gutenberg#81017) - Unit Tests: Reorganise the jest config file. (WordPress/gutenberg#80940) - Performance Tests: Ignore the locally generated artifacts directory (WordPress/gutenberg#81024) - Editor: Remove sidebar tabs focus sync effect (WordPress/gutenberg#81020) - Widgets: carry a declarative `icon` through the widget pipeline (WordPress/gutenberg#80969) - RTC: Remove excess autosave notices (when not useful) (WordPress/gutenberg#80539) - UI: Use focus styles from base-styles (WordPress/gutenberg#80635) - Automated Testing: Add Storybook component documentation regression testing (WordPress/gutenberg#80655) - Pass Playlist controls to track blocks (WordPress/gutenberg#80368) - Components: Deprecate Surface (WordPress/gutenberg#80943) - Tabs: Support Home and End keys for keyboard navigation (WordPress/gutenberg#80912) - Fix typos in code `comments` and `JSDoc` (WordPress/gutenberg#81045) - Interface: Remove incorrect aria-expanded from pin-to-toolbar button (WordPress/gutenberg#79874) - List View: Speed up opening by removing a second render pass (WordPress/gutenberg#80935) - Docs: Use `gutenberg` instead of `Gutenberg` in package name (WordPress/gutenberg#81051) - Fix ESLint warnings for 'navigateRegionsProps' spread (WordPress/gutenberg#81052) - Tests: Replace page-level selectors with locators in e2e specs (WordPress/gutenberg#81053) - RTC: Disable custom autosave controller when RTC is disabled (WordPress/gutenberg#80769) - Background: Fix the legacy gradient UI where a gradient cannot be selected (WordPress/gutenberg#81056) - Rename blockStatesEnabled setting to blockStatesEditingEnabled (WordPress/gutenberg#81058) - Background: Fix the legacy gradient UI where a gradient cannot be selected - Add missing change log (WordPress/gutenberg#81060) - Declare missing prettier and stylelint workspace dependencies (WordPress/gutenberg#81065) - Notes: Display shortcut for form action buttons (WordPress/gutenberg#81064) - View config: lowercase dynamic filter names (WordPress/gutenberg#81068) - CI: cache the system packages Playwright dowloads for WebKit (WordPress/gutenberg#80846) - List View: Collapse off-window placeholder rows into a single spacer row (WordPress/gutenberg#80953) - devops: balance Playwright shards by duration (WordPress/gutenberg#79479) - Views: honor developer-defined view config overrides (WordPress/gutenberg#80832) - Components: Migrate ItemGroup to SCSS module (WordPress/gutenberg#80797) - Test: Add Vitest migration routing guardrails (WordPress/gutenberg#81036) - Visual revisions: Add a code diff view inside the editor (WordPress/gutenberg#80314) - Bump actions/labeler from 6.1.0 to 7.0.0 in /.github/workflows (WordPress/gutenberg#80966) - Visual revisions: add shareable urls (WordPress/gutenberg#79934) - Fix e2e tests that break when shard rebalancing changes their neighbors (WordPress/gutenberg#81117) - Query: guard non-scalar queryId to avoid fatal in enhanced pagination (WordPress/gutenberg#80724) - Replace deprecated useResizeObserver for useScaleCanvas (WordPress/gutenberg#67508) - CI: Add job timeouts to E2E, static checks, bundle size, and create block (WordPress/gutenberg#80801) - Allow organization or repository variable to dictate the Actions runner (WordPress/gutenberg#81087) - List View: Only subscribe to the block subtree for rows that can show images (WordPress/gutenberg#81076) - Editor: Migrate settings sidebar to Tabs from @wordpress/ui (WordPress/gutenberg#81054) - Notes: Email users mentioned in a note (WordPress/gutenberg#79606) - List View: Narrow the dependants of the memoized List View tree (WordPress/gutenberg#81129) - List View: Pass only minimal required data to sub-tree branches (WordPress/gutenberg#81111) - DataViews: Add `time` field type and control (WordPress/gutenberg#80830) - Post Author Biography: Fix horizontal overflow with long unbroken text (WordPress/gutenberg#81018) - Link Control: Restore the preview title underline (WordPress/gutenberg#81083) - Views: Add React to the package's dev dependencies (WordPress/gutenberg#81139) - feat: Add target param in proxy (WordPress/gutenberg#81141) - Fix: flaky revisions pagination e2e cross-page diff assertion (WordPress/gutenberg#81119) - Button: Suppress UA focus ring when focused and pressed (WordPress/gutenberg#81113) - View config: add reference docs (WordPress/gutenberg#81149) - Editor: Fix document tools button focus ring (WordPress/gutenberg#81115) - List View: Replace expand/collapse callbacks with reducer dispatch (WordPress/gutenberg#81138) - CI: resolve Playwright through the workspace that declares it (WordPress/gutenberg#81137) - CI: build once and reuse the build across e2e tests shards (WordPress/gutenberg#81031) - Fix: Tabs block: Start with empty tab labels with placeholders (WordPress/gutenberg#81009) - Interface: Increase footer breadcrumb height to prevent focus ring clipping (WordPress/gutenberg#81145) - Editor: clarify autosave failure notice (WordPress/gutenberg#76470) - Theme: Omit color properties when neither provided nor inherited (WordPress/gutenberg#80600) - Post editor: Add ThemeProvider for admin color schemes (WordPress/gutenberg#81112) - Core Data: saveDirtyEntities: improve messaging of server errors (WordPress/gutenberg#81151) - Global Styles: kebab-case preset slugs when converting references to custom properties (WordPress/gutenberg#80583) - Revise CODEOWNERS for package ownership (removing nerrad) (WordPress/gutenberg#81175) - Build: Wrap script bundles in an IIFE to contain 'use strict' (WordPress/gutenberg#79792) - Media: Improve the HEIC upload error and keep any upload errors up until dismissed (WordPress/gutenberg#81130) - Block Supports: Guard against non-string attribute values to avoid fatal errors (WordPress/gutenberg#80501) - Video: Hide settings for the GIF variation (WordPress/gutenberg#81142) - Video: clarify the Video variation description (WordPress/gutenberg#81181) - Media Editor: Render sidebar tabs via ComplementaryArea's render prop (WordPress/gutenberg#81133) - Bump docker/login-action (WordPress/gutenberg#80962) - Bump actions/setup-node from 6.4.0 to 7.0.0 in /.github/setup-node (WordPress/gutenberg#80963) - fix(admin-ui): reset the wp-admin li margin that misaligns Breadcrumbs (WordPress/gutenberg#81134) - Bump astral-sh/setup-uv from 8.3.2 to 9.0.0 in /.github/workflows (WordPress/gutenberg#80964) - Fix/79643 rtc awareness mixed block selection (WordPress/gutenberg#79836) - Agents: Add a defensive data design skill and route to the copy guide (WordPress/gutenberg#81131) - ESLint: Ban `@ts-ignore` in favour of `@ts-expect-error` (WordPress/gutenberg#81148) - Types: Replace remaining `@ts-expect-error` suppressions with proper typing (WordPress/gutenberg#81200) - Button: turn on the width setting by default in theme.json (WordPress/gutenberg#81196) - Notes: fix the mention notification email composition (WordPress/gutenberg#81187) - Edit Widgets: Fix header toolbar button focus ring (WordPress/gutenberg#81176) - List View: Reduce per-row store subscriptions (WordPress/gutenberg#81136) - Customizer widgets: Add ThemeProvider for admin color schemes (WordPress/gutenberg#81174) - Blocks: Declare the `@types/react-is` devDependency (WordPress/gutenberg#81203) - Widgets editor: Add ThemeProvider for admin color schemes (WordPress/gutenberg#81173) - PanelColorSettings: Restore the missing space below the panel header (WordPress/gutenberg#81155) - Remove the editableRoot opt-in from the paragraph block (WordPress/gutenberg#81184) - Media Attached to: Fix issue with the popover unexpectedly flipping, tweak wording (WordPress/gutenberg#81206) - Components: Add allowForms prop to SandBox component (WordPress/gutenberg#76471) - Ensure device preview is always accurate when window is zoomed in (WordPress/gutenberg#81193) - DataViews: Pass only eligible items to a bulk action callback (WordPress/gutenberg#81198) - DataViews: Make grid and table item preview aspect ratio configurable (WordPress/gutenberg#79329) - Block Editor: Return false from isBlockSelected when there is no client ID (WordPress/gutenberg#81212) - Blocks: Update hpq to 1.4.0 and drop the ts-expect-error suppressions (WordPress/gutenberg#81199) - DataViews: Fix the between `date` filter losing a manually typed date on blur (WordPress/gutenberg#81150) - Block Editor: Fix Select all freezing on large posts (WordPress/gutenberg#81210) - List View: Split the context and drop dead props to cut re-renders on expand and collapse (WordPress/gutenberg#81159) - Docs: Fix broken Figma links on the design resources page. (WordPress/gutenberg#81166) - Blocks: Support static block templates in block type settings (WordPress/gutenberg#80027) - AGENTS: Update development tips section (WordPress/gutenberg#81224) - URLInput: Skip search requests while an IME composition is in progress (WordPress/gutenberg#80602) - Components: Deprecate Animate (WordPress/gutenberg#80931) - Fix: Trunk e2e failures caused by the navigation spec leaving plain permalinks (WordPress/gutenberg#81238) - Use p elements for callout alerts in components docs (WordPress/gutenberg#81234) - Storybook: Enable design system theme tool globally (WordPress/gutenberg#81116) - Media: Cover client-side big image scaling and orphaned files (WordPress/gutenberg#81061) - Footnotes: guard against invalid post meta values (WordPress/gutenberg#81201) - Block editor: unify what a new sibling block inherits (WordPress/gutenberg#81250) - Global Styles: Remove unused duplicate font family preview utilities (WordPress/gutenberg#81194) - Docs: explain how the theme.json schema fixtures work (WordPress/gutenberg#81263) - theme.json schema: fix block pseudo-classes and custom states (WordPress/gutenberg#81209) - List View: Migrate label wrapper to UI Stack and drop Badge from the anchor (WordPress/gutenberg#81266) - Docs: Remove dependency group import guidance (WordPress/gutenberg#81245) - ESLint: Define dependency import rules (WordPress/gutenberg#81246) - Flaky tests: Report as a PR comment only, stop creating issues (WordPress/gutenberg#81218) - Dashboard Widgets: remove the Hello Dolly download action (WordPress/gutenberg#81272) - Block Directory: Make downloadable block item labels translatable. (WordPress/gutenberg#81237) - Icons: move the inline image icon into the library (WordPress/gutenberg#81271) - Update phpcs, wpcs dependencies (WordPress/gutenberg#81279) - fix: add optional chaining for empty reusable block (WordPress/gutenberg#81165) (WordPress/gutenberg#81177) - DataViews: Inline the kebabCase utility from components (WordPress/gutenberg#81284) - Navigation: Complete the DocBlocks for the responsive container and overlay style helpers (WordPress/gutenberg#80622) - Style states: fix state deselection when selecting the already selected block (WordPress/gutenberg#81277) - Fix missing return value in force_filtered_html_on_import footnotes filter (WordPress/gutenberg#81293) - Packages: Recover July 29 npm release metadata (WordPress/gutenberg#81303) - Global styles: render element styles set only inside a breakpoint (WordPress/gutenberg#81265) - Style states: Fix phantom pseudo element style output (WordPress/gutenberg#81291) - Docs: remove breakpoint-only element style example from global styles guide (WordPress/gutenberg#81308) - Render viewport state element styles in the editor (WordPress/gutenberg#81307) - theme.json schema: responsive states belong to blocks (WordPress/gutenberg#81253) - theme.json schema: allow responsive states on block style variations (WordPress/gutenberg#81309) - Block Inspector: Disable the 'Edit original' button when the entity ID is missing (WordPress/gutenberg#81288) - Site Editor: Decode HTML entities in Identity fields (WordPress/gutenberg#81269) - Document editEntityRecord's options.isCached param (WordPress/gutenberg#81318) - Theme: Colocate plugin tests with implementations (WordPress/gutenberg#81247) - Block Editor: Bail out of hasSelectedInnerBlock when there is no clientId (WordPress/gutenberg#81315) - ESLint: Replace strict config with bulk suppressions (WordPress/gutenberg#81248) - Block Library: Document security patch releases (WordPress/gutenberg#81295) - ESLint: Remove legacy import suppressions (WordPress/gutenberg#81338) - Components: Migrate Spinner styles from Emotion to SCSS module (WordPress/gutenberg#80511) - DataViews: Use the public `@wordpress/ui` Badge instead of the private one (WordPress/gutenberg#81236) - Pert Tests: Avoid inflating interaction metrics with startTracing (WordPress/gutenberg#81264) - Block Editor: Simplify InspectorControlsFill rendering logic (WordPress/gutenberg#81286) - Keycodes: Make `withIgnoreIMEEvents` a public API (WordPress/gutenberg#81343) - Docs: Fix broken links to the removed JavaScript build setup guide. (WordPress/gutenberg#81232) - Markdownlint: disable the MD033 (no-inline-html) rule project-wide (WordPress/gutenberg#81213) - Docs: Fix typo in block file structure guide (WordPress/gutenberg#81348) - Playlist: Normalize Waveform Player configuration handling (WordPress/gutenberg#81342) - Site editor: fix unreadable sidebar hover color (WordPress/gutenberg#81317) - Global Styles: Migrate font size presets to the shared preset layer (WordPress/gutenberg#79811) - Block Editor: Convert useBlockVisibility hook to TypeScript (WordPress/gutenberg#80390) - Scope breakpoint media queries to screen so printing does not look like a resize (WordPress/gutenberg#81367) - New `kebab-case` package: extract utility and migrate private API calls (WordPress/gutenberg#81294) - Remove content types experiment (WordPress/gutenberg#81340) - Editor: Keep the canvas height stable while resizing the canvas (WordPress/gutenberg#81163) - Dashboard Widgets: add icon and relevance to the widget action envelope (WordPress/gutenberg#81275) - Playlist: Improve audio conversion and track selection (WordPress/gutenberg#80926) - Try: Set post navigation link icon to next. (WordPress/gutenberg#81384) - UI: Derive Base UI direction from WordPress i18n (WordPress/gutenberg#80399) - DataViews: Fix `array` field type validation for empty values (WordPress/gutenberg#81378) - Bump github/codeql-action/upload-sarif (WordPress/gutenberg#81287) - Bump actions/stale from 10.4.0 to 11.0.0 in /.github/workflows (WordPress/gutenberg#81219) - Monitor all setup-related composite Actions. (WordPress/gutenberg#81192) - IconButton: Improve keyboard shortcut accessibility (WordPress/gutenberg#80402) - Interface: Stop the secondary sidebar animating into place on page load (WordPress/gutenberg#81362) - Fix: flaky list view paste block styles e2e test (WordPress/gutenberg#81229) - Docs: Add error message guidance. (WordPress/gutenberg#81143) - wp-build: Render the no-JS fallback in the generated page templates (WordPress/gutenberg#81365) - Changed Build Process Link and remove unused tags (WordPress/gutenberg#81360) - Scripts: Prevent a UTF-8 BOM in the middle of extracted CSS (WordPress/gutenberg#81383) - Global Styles: Migrate shadows presets to use the preset management layer. (WordPress/gutenberg#79812) - Global Styles: report border, shadow, outline, filter and dimension changes (WordPress/gutenberg#81407) - Dashboard Widgets: split action icons into wire and resolved forms (WordPress/gutenberg#81381) - Block Editor: Fix Escape from the block toolbar and stop redundant last focus dispatches (WordPress/gutenberg#81319) - Block Mover: Add the keyboard shortcut to the buttons' spoken description (WordPress/gutenberg#81380) - Format Library: Remove unused CSS rule (WordPress/gutenberg#77831) - Core Data: Fix post staying dirty after saving edited post meta with RTC enabled (WordPress/gutenberg#81392) - Widget Dashboard: host-tunable tile spacing via public custom properties (WordPress/gutenberg#81352) - DataForm: Fix hidden fields validation (WordPress/gutenberg#81377) - Tools: Make agent setup a workspace (WordPress/gutenberg#81418) - Test: Add private Vitest config and migrate a pilot test (WordPress/gutenberg#81037) - Interface: Let CSS own the ComplementaryArea width and use AnimatePresence custom for exit (WordPress/gutenberg#81363) - Notes: Fix text wrapping for long usernames in collaboration sidebar (WordPress/gutenberg#81406) - DataViews: vendor `ValidatedSelectControl` (WordPress/gutenberg#81391) - UI: Add `Calendar` and `RangeCalendar`, moved from `components` private APIs (WordPress/gutenberg#81337) - Feature: Tabs block: consider using the tab title in the Document Overview instead of a generic "Tab" label (WordPress/gutenberg#81427) - fix: order site identity changes predictably (WordPress/gutenberg#81283) - Docs: Fix broken link to the Node.js debugging guide. (WordPress/gutenberg#81398) - Navigation Overlay Close: Inherit typography and color from the overlay (WordPress/gutenberg#80751) - Fix: Regression: Tabs block: Start with empty tab labels with placeholders (WordPress/gutenberg#81429) - components/Menu: Restore Modal focus return when menu items close (WordPress/gutenberg#81164) - DataViews: Move the rich text control into the editor package (WordPress/gutenberg#81430) - Components: Remove ValidatedTextControl private API (WordPress/gutenberg#80680) - Cover: Avoid passing null as the featured image size (WordPress/gutenberg#81444) - DataViews: vendor `ValidatedNumberControl` (WordPress/gutenberg#81433) - DataViews: vendor ValidatedCheckboxControl (WordPress/gutenberg#81435) - DataViews: vendor ValidatedRadioControl (WordPress/gutenberg#81434) - UI: Upgrade React DayPicker to version 10 (WordPress/gutenberg#81439) - Block editor: render a real default block in place of the default appender (WordPress/gutenberg#81231) - Spacing Sizes Control: Make the control label translatable independently of the input aria label. (WordPress/gutenberg#81240) - Writing flow: stop the caret on containers that do not merge with the text flow (WordPress/gutenberg#81456) - Remove an unmodified wrapper when all its inner blocks are removed (WordPress/gutenberg#42503) - Normalize block gap values in layout (WordPress/gutenberg#81460) - Docs: Add Block Actions Readme (WordPress/gutenberg#69408) - Block editor: disclose the nested block count of a multi selection (WordPress/gutenberg#80745) - Fix: flaky autosave shareable URL revisions e2e test. (WordPress/gutenberg#81455) - Fix empty list block with anchor persisting after backspace deletion (WordPress/gutenberg#77000) - Docs: Add Block List Readme (WordPress/gutenberg#69432) - Docs: Add Block Lock Readme (WordPress/gutenberg#69434) - Backport core fixes for finalize route (WordPress/gutenberg#81465) - ESLint: Rename root eslint.config.cjs to eslint.config.mjs (WordPress/gutenberg#81468) - Update 23.8 release branch (WordPress/gutenberg#81486) - RTC: Couple RTC and polling provider as an opt-in experiment (WordPress/gutenberg#80658) - Align collaboration migration version markers with the 23.8.0 release (WordPress/gutenberg#81789) Fixes #66066. Built from https://develop.svn.wordpress.org/trunk@63534 git-svn-id: http://core.svn.wordpress.org/trunk@62710 1a063a9b-81f0-0310-95a4-ce76da25c4cd
What
Emails users who are
@mentioned in a note. The mention autocomplete UI landed in #79604; this is the notification half of that feature.Fixes #80719
Related: #73415 - that issue covered both halves, and the autocompleter shipped in #79604.
Note
This PR has been trimmed to the minimal version. Earlier revisions carried a per-thread followers model, which is now tracked in #80279, and a deep link that opened the editor focused on the linked thread, which is a separate enhancement and can follow in a later release.
How
On
rest_insert_commentfornotecomments - the same hook core uses for its post-author notification -gutenberg_notify_note_mentions()parses the mentions out of the saved content and emails each mentioned user.Mentions are stored as chips carrying the mentioned user's ID in a class token:
<span class="wp-note-mention user-N">@Name</span>, the markup #79604 and #80528 landed. Only elements carrying both classes are treated as mentions. The email is composed in the recipient's locale viaswitch_to_user_locale()and links to the post editor withget_edit_post_link(), the same way core's own note notification does.Notification audience
wp_new_comment_via_rest_notify_postauthor(), so excluding them here avoids a duplicate email.edit_commentthe note, the same bar as the REST API's read permission for notes, so emails can't leak note content to users who can't see the note in the editor.wp_notes_notifypreference.Extensibility
No new filters. Core's
comment_notification_recipientsalready runs on every note throughwp_notify_postauthor(), so extra recipients can be added there;pre_wp_mailandwp_mailcan suppress or reroute delivery to another channel; andgutenberg_send_note_notification()is a plain function, so a plugin can notify anyone it likes from its ownrest_insert_commentcallback.Testing
@mention the second user.phpunit/notes-mentions-test.phpcovers mention parsing (non-mention spans and plain anchors ignored, IDs deduped), the mentioned-user email, email content and the editor link, author self-exclusion, post-author exclusion, capability gating, nonexistent-user mentions, thewp_notes_notifyoff switch, and - through real REST dispatches - that creating a note viaPOST /wp/v2/commentstriggers the email while updating one doesn't, which guards therest_insert_commentwiring itself.12 tests pass locally. Worth noting the parser previously looked for
<a class="wp-note-mention ...">anchors, which was the markup before #80528 switched mentions tospanchips - against current trunk it matched nothing and no email was ever sent. Reverting just the tag name in the parser turns 5 of these tests red, so the coverage does hold the fix down.Follow-up
@mentioned by a later edit of a note. Today only creation notifies. Doing this well means persisting the mentioned set when the email goes out and diffing it on each update, so nobody gets mailed twice - state keeping that is better as its own change.lib/compat/wordpress-7.1/layer in the mean time.