Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
205 commits
Select commit Hold shift + click to select a range
9e4bfb3
Add ReactionEmojiPicker component for Notes
adamsilverstein Feb 2, 2026
461eead
Add ReactionDisplay component for Notes
adamsilverstein Feb 2, 2026
3432f96
Add ReactionDetailsPopover component for Notes
adamsilverstein Feb 2, 2026
6a8a24b
Add reaction CRUD functions to useBlockCommentsActions
adamsilverstein Feb 2, 2026
426927f
Integrate emoji reactions into Notes UI
adamsilverstein Feb 2, 2026
866d095
Add styles for emoji reactions in Notes
adamsilverstein Feb 2, 2026
d440bba
Add E2E tests for emoji reactions in Notes
adamsilverstein Feb 2, 2026
f996e50
Merge trunk and fix emoji reaction E2E test failures
adamsilverstein Feb 5, 2026
2b793d6
Fix emoji reaction button: use smiley icon, fix focus, and improve st…
adamsilverstein Feb 5, 2026
1b66eb9
Move emoji reaction button to header and register _wp_reactions meta
adamsilverstein Feb 5, 2026
9f3c8e4
Fix emoji reaction pills dark background
adamsilverstein Feb 5, 2026
b12a044
Override Button is-pressed style on reaction pills
adamsilverstein Feb 6, 2026
427f25d
Make reaction pill buttons more circular
adamsilverstein Feb 6, 2026
d4d39e3
update docblock
adamsilverstein Feb 6, 2026
de66f7d
Refactor to use 'Composite' component
Mamaduka Feb 6, 2026
888c837
Move _wp_reactions meta to wordpress-7.0 compat
adamsilverstein Feb 6, 2026
a031099
Remove unnecessary login checks from reaction handlers
adamsilverstein Feb 6, 2026
bbb61a9
Remove reflowComments from reaction handlers
adamsilverstein Feb 6, 2026
b28f67e
Batch user fetching in reaction details popover
adamsilverstein Feb 6, 2026
39f9d35
Update reaction button icon per design feedback
adamsilverstein Feb 6, 2026
e4f9139
Replace thumbs down reaction with thinking emoji
adamsilverstein Feb 6, 2026
30d4a7e
type fix
adamsilverstein Feb 6, 2026
b2b46d1
Linter and styling fixes
adamsilverstein Feb 6, 2026
b9f1383
Store emoji slugs in database instead of emoji characters
adamsilverstein Feb 10, 2026
d7445c7
Use Button component in emoji picker / simplify CSS
adamsilverstein Feb 10, 2026
2c1526c
finish switch to button and emoji as slugs
adamsilverstein Feb 10, 2026
240c410
Make emoji reaction picker vertical
adamsilverstein Feb 10, 2026
792ac67
Reduce emoji reactions to five skin-tone-safe options
adamsilverstein Feb 10, 2026
b1c9d35
more style cleanup
adamsilverstein Feb 10, 2026
bd8064d
Use Button component in emoji picker to reduce CSS
adamsilverstein Feb 10, 2026
765605e
Improve reaction button styling
adamsilverstein Feb 10, 2026
31d15de
Rename _wp_reactions meta key to _wp_note_reactions
adamsilverstein Feb 13, 2026
2e71e3d
Apply suggestion from @t-hamano
adamsilverstein Feb 13, 2026
1afeb81
Move currentUserId selector into ReactionDisplay
adamsilverstein Feb 13, 2026
1d3fe41
Replace reaction details popover with tooltips
adamsilverstein Feb 13, 2026
ebc07c5
Consolidate reaction functions into onToggleReaction
adamsilverstein Feb 13, 2026
9edaaca
Move reaction button to comment content area
adamsilverstein Feb 13, 2026
e9c5b6c
Add missing primitives reference to editor tsconfig
adamsilverstein Feb 13, 2026
6b092af
Fix CI: update package-lock.json and E2E emoji reaction tests
adamsilverstein Feb 13, 2026
2f5d925
Close emoji picker popover after selecting a reaction
adamsilverstein Feb 13, 2026
1f02b4f
Update packages/editor/src/components/collab-sidebar/style.scss
adamsilverstein Feb 14, 2026
96ff549
Update lib/compat/wordpress-6.9/block-comments.php
adamsilverstein Feb 14, 2026
335ad3d
Add backport changelog entry for core PR 10930
adamsilverstein Feb 14, 2026
cbc4d99
move backport changelog to 7.0
adamsilverstein Feb 14, 2026
10f745d
Switch emoji reactions to custom comment type
adamsilverstein Feb 15, 2026
941b736
Add backport changelog entry for PR 75549
adamsilverstein Feb 15, 2026
6b21598
Show add-reaction button on touch devices
adamsilverstein Feb 15, 2026
7117448
Show add-reaction button only on hover on desktop
adamsilverstein Feb 15, 2026
a9f1490
Merge branch 'add-notes-emoji-reactions' into add-notes-emoji-reactio…
adamsilverstein Feb 15, 2026
e304dff
Add note_reaction_emojis filter for emoji list
adamsilverstein Feb 15, 2026
52690b2
Inject note reaction emojis into editor settings
adamsilverstein Feb 15, 2026
869c89e
Read reaction emojis from editor settings
adamsilverstein Feb 15, 2026
ea6413e
Use settings-based emoji list in ReactionDisplay
adamsilverstein Feb 15, 2026
cb92b59
Make reaction emoji list filterable via settings
adamsilverstein Feb 15, 2026
007854e
Move add-reaction button to reactions row
adamsilverstein Feb 16, 2026
857c84f
Simplify reaction placement and style from Mamaduka
adamsilverstein Feb 17, 2026
db5e541
Merge branch 'add-notes-emoji-reactions' into add-notes-emoji-reactio…
adamsilverstein Feb 17, 2026
3b2512d
Remove stray add_action for nonexistent metadata registration function
adamsilverstein Feb 17, 2026
b9e4284
Revert filterable emoji list for note reactions
adamsilverstein Feb 18, 2026
326c7ed
Rename note_reaction comment type to reaction
adamsilverstein Feb 18, 2026
5664b64
Move reaction PHP code to lib/compat/wordpress-7.1
adamsilverstein Feb 18, 2026
db49d96
Expose allowed reaction emojis via REST API schema
adamsilverstein Feb 18, 2026
e6082a1
Merge trunk into add-notes-emoji-reactions-try-addditional-comment-type
adamsilverstein Mar 23, 2026
8d5457d
Fix CI: add new PR to backport changelog and fix PHP alignment
adamsilverstein Mar 23, 2026
d97cf1a
Fix children link type for notes, unmount safety, and stale closure
adamsilverstein Mar 23, 2026
5028f97
Fix schema tests to call get_item_schema() directly
adamsilverstein Mar 23, 2026
c6b5c81
Fix prettier formatting in reaction-emoji-picker
adamsilverstein Mar 23, 2026
64cd35e
Add reaction_summary field to note REST responses
adamsilverstein Apr 3, 2026
1c95873
Use reaction_summary from REST API instead of fetching all reactions
adamsilverstein Apr 3, 2026
6ae1c82
Add PHP tests for reaction_summary field
adamsilverstein Apr 3, 2026
e1ae515
Fix PHP alignment warnings
adamsilverstein Apr 3, 2026
8253d31
Fix PHP alignment in test file
adamsilverstein Apr 3, 2026
73eb5dc
Move smiley icon to @wordpress/icons package
adamsilverstein Apr 4, 2026
776efb9
Lazy-load user names for reaction tooltips on hover
adamsilverstein Apr 4, 2026
0a0350d
Replace GROUP_CONCAT with separate user query for reaction summaries
adamsilverstein Apr 4, 2026
e257b7e
Merge branch 'trunk' into add-notes-emoji-reactions-try-addditional-c…
adamsilverstein Apr 23, 2026
74a114e
Merge branch 'trunk' into add-notes-emoji-reactions-try-addditional-c…
adamsilverstein Apr 29, 2026
2015ad2
Merge branch 'trunk' into add-notes-emoji-reactions-try-addditional-c…
adamsilverstein Apr 29, 2026
9064196
Notes: Document rationale for storing reactions as a custom comment type
adamsilverstein Apr 29, 2026
acf83b7
Notes: Update reaction E2E tests to renamed fixture and method
adamsilverstein Apr 29, 2026
729f47f
Merge branch 'trunk' into add-notes-emoji-reactions-try-addditional-c…
adamsilverstein Apr 29, 2026
73b0fd7
Notes: Use --wpds-cursor-control token on add-reaction button
adamsilverstein Apr 29, 2026
a99bc46
Merge branch 'trunk' into add-notes-emoji-reactions-try-addditional-c…
adamsilverstein Apr 29, 2026
ea19200
Notes: Centralize internal comment types via gutenberg_get_internal_c…
adamsilverstein Apr 29, 2026
265f24a
Notes: Add Frimousse-based full emoji picker behind a + button
adamsilverstein May 7, 2026
9df4145
Notes: Bundle Frimousse emoji data, normalize reaction storage
adamsilverstein May 7, 2026
e430b3d
Notes: Move full picker to a sibling button + add E2E tests
adamsilverstein May 7, 2026
f5ffa57
Notes: Serve emojibase data from plugins_url, drop bundle inflation
adamsilverstein May 7, 2026
9495517
Notes: Replace Menu.Popover with Dropdown so reaction popovers escape…
adamsilverstein May 7, 2026
05a6c1f
Notes: Add E2E tests pinning the popover-portal and selection-persist…
adamsilverstein May 7, 2026
b1c45e5
Notes: Wrap Frimousse popover tightly to its picker
adamsilverstein May 7, 2026
06c8169
Notes: Size Frimousse picker to its 8-column grid, not an arbitrary s…
adamsilverstein May 7, 2026
ca79a82
Notes: Allow re-adding a reaction after removing it on the same note
adamsilverstein May 8, 2026
4d74489
Notes: Drop empty wordpress-7.0/block-comments.php compat shim
adamsilverstein May 8, 2026
1c2f0d3
Notes: Force-delete reactions and refetch only the toggled note's record
adamsilverstein May 8, 2026
f2a21ac
Notes: Pin re-add-reaction test against duplicate-reaction error and …
adamsilverstein May 10, 2026
96ad388
Notes: Replace Frimousse picker with native SearchControl + Composite…
adamsilverstein May 11, 2026
e24a397
Notes: Move full emoji picker to a follow-up PR
adamsilverstein May 11, 2026
3524f99
Notes: Drop hex-key storage helpers and orphan picker CSS
adamsilverstein May 11, 2026
6aa1aec
Notes: Add full emoji picker behind a + button
adamsilverstein May 11, 2026
61d19a0
Notes: Consolidate reaction failure-case tests with a data provider
adamsilverstein May 11, 2026
c40bdcf
Notes: Switch curated reaction picker from vertical to horizontal
adamsilverstein May 11, 2026
85ed2c7
Update backport-changelog/7.0/10930.md
adamsilverstein May 15, 2026
23bd527
Update packages/editor/src/components/collab-sidebar/style.scss
adamsilverstein May 15, 2026
b6e3cb1
Notes: Standardize add-reaction button to 24px height
adamsilverstein May 15, 2026
89289cf
Notes: Disable add-reaction button on resolved threads
adamsilverstein May 15, 2026
b7db753
Notes: Switch emoji slug lookups to a memoized Map
adamsilverstein May 15, 2026
033e765
Notes: Inline smiley icon, drop from public @wordpress/icons
adamsilverstein May 15, 2026
a8cfa0c
Merge branch 'add-notes-emoji-reactions-try-addditional-comment-type'…
adamsilverstein May 31, 2026
9af7fae
Merge remote-tracking branch 'origin/trunk' into add-notes-emoji-reac…
adamsilverstein Jun 11, 2026
411ba15
Merge branch 'add-notes-emoji-reactions-try-addditional-comment-type'…
adamsilverstein Jun 15, 2026
a47d635
Update build.mjs
adamsilverstein Jun 15, 2026
3299acc
Notes: Move emojibase copy script to tools/build-scripts workspace
adamsilverstein Jun 15, 2026
9e7442e
Notes: Remove redundant __nextHasNoMarginBottom from SearchControl
adamsilverstein Jun 15, 2026
b73893f
Merge trunk into add-notes-emoji-reactions-try-addditional-comment-type
adamsilverstein Jun 20, 2026
d836ac2
Merge branch 'trunk' into add-notes-emoji-reactions-try-addditional-c…
adamsilverstein Jun 24, 2026
e5d9415
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Jun 24, 2026
72d5d3b
Merge remote-tracking branch 'origin/trunk' into add-notes-emoji-reac…
adamsilverstein Jun 24, 2026
1d80e8e
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Jun 24, 2026
9488cf1
Notes: Harden note and reaction creation permissions
adamsilverstein Jun 25, 2026
dee5d00
Notes: Stop overriding note children link with reactions
adamsilverstein Jun 25, 2026
87384c8
Notes: Drop OPTIONS emoji fetch in favor of curated client list
adamsilverstein Jun 25, 2026
1b0c65e
Collab sidebar: update renamed WPDS color tokens
adamsilverstein Jun 26, 2026
5fa099e
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Jun 26, 2026
95535a2
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Jul 5, 2026
033b1cf
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Jul 8, 2026
3fc3c8a
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Jul 8, 2026
8cf346a
Notes full picker: address design review feedback
adamsilverstein Jul 8, 2026
ec5f642
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Jul 8, 2026
e7bdbc6
Add Storybook story for the Notes emoji picker
adamsilverstein Jul 8, 2026
9a682b5
Add Storybook story for the full Notes reaction row
adamsilverstein Jul 8, 2026
ed4c39b
Consolidate reaction triggers into a single smiley button
adamsilverstein Jul 8, 2026
e41a6eb
Add a skin tone picker to the full emoji picker
adamsilverstein Jul 9, 2026
b4a2ee4
Add e2e coverage for the emoji skin tone preference
adamsilverstein Jul 9, 2026
50aacc5
Add a Frequently used section to the full emoji picker
adamsilverstein Jul 10, 2026
e984905
Add e2e coverage for the Frequently used emoji section
adamsilverstein Jul 10, 2026
496d549
Notes: Author the emoji picker modules as TypeScript
adamsilverstein Jul 10, 2026
b7dfa8c
Merge remote-tracking branch 'origin/trunk' into add-notes-emoji-reac…
adamsilverstein Jul 11, 2026
379bdff
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Jul 11, 2026
ff10c2f
Notes: Fix build failures from trunk merge
adamsilverstein Jul 11, 2026
0d9df50
Notes: Drop stale 'Reaction added.' snackbar assertions from e2e
adamsilverstein Jul 11, 2026
70cff94
Merge updated base (trunk-current #76767) into full-picker
adamsilverstein Jul 11, 2026
76ccc26
Notes: Decode emoji code points without mbstring
adamsilverstein Jul 13, 2026
a06fd32
Notes: Normalize full-picker picks against the filtered emoji list
adamsilverstein Jul 13, 2026
ccfff03
Notes: Announce emoji search result counts
adamsilverstein Jul 13, 2026
f92a981
Notes: Focus the selected skin tone when the flyout opens
adamsilverstein Jul 13, 2026
ac9d380
Notes: Expose picker categories to AT and flatten search results
adamsilverstein Jul 13, 2026
e883e28
Notes: Match the emoji picker popover to standard popover chrome
adamsilverstein Jul 13, 2026
d9a475b
Notes: Add editor CHANGELOG entry for the full emoji picker
adamsilverstein Jul 13, 2026
d08d3e5
Merge branch 'add-notes-emoji-reactions-try-addditional-comment-type'…
adamsilverstein Jul 13, 2026
6ede323
Notes: Open the full emoji picker directly from the add-reaction button
adamsilverstein Jul 15, 2026
5643a47
Notes: Fix emoji grid focus ring clipping and phantom active highlight
adamsilverstein Jul 15, 2026
d776cff
Notes: Drop the redundant 'emoji' suffix from reaction tooltips
adamsilverstein Jul 15, 2026
1d04ff3
Notes: Give reaction pills more breathing room
adamsilverstein Jul 15, 2026
f38bc94
Notes: Expose the skin-tone listbox's horizontal orientation
adamsilverstein Jul 22, 2026
755bc44
Notes: Derive the reactor tooltip from names plus the current label
adamsilverstein Jul 22, 2026
d6b6d55
Notes: Name the reaction picker popups and advertise them on triggers
adamsilverstein Jul 22, 2026
777f0b8
Notes: Extract the add-reaction picker and survive full-picker failures
adamsilverstein Jul 22, 2026
25313a8
Notes: Configure the emoji picker through editor settings, not globals
adamsilverstein Jul 22, 2026
a1e7d01
Notes: Derive picker geometry from WPDS tokens
adamsilverstein Jul 22, 2026
8d973ba
Notes: Assert Escape focus return and nested-overlay dismissal in e2e
adamsilverstein Jul 22, 2026
e2fa31a
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Jul 22, 2026
db8ac3a
Merge branch 'add-notes-emoji-reactions-try-addditional-comment-type'…
adamsilverstein Aug 11, 2026
5209f0d
Update the picker keynav test and drop stale dependency-group comments
adamsilverstein Aug 11, 2026
7a10cd5
Merge branch 'add-notes-emoji-reactions-try-addditional-comment-type'…
adamsilverstein Aug 11, 2026
ca95c99
Keep reaction hex keys in one normal form
adamsilverstein Aug 26, 2026
2905c6e
Fix the emoji picker's loading, announcement and tooltip edges
adamsilverstein Aug 26, 2026
4edeefd
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Aug 26, 2026
084bf12
Align reaction tests with the merged curated picker
adamsilverstein Aug 26, 2026
669b089
Convert the emoji picker's new test and story files to TypeScript
adamsilverstein Aug 26, 2026
19164b4
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Aug 26, 2026
53380fe
Add backport changelog entry for PR #78176
adamsilverstein Aug 26, 2026
649b766
Accept hex code-point reaction slugs from the full picker
adamsilverstein Aug 26, 2026
366e53f
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Aug 27, 2026
5c6367a
Drop 'emoji' from the reaction tooltip assertion
adamsilverstein Aug 27, 2026
27ffc8c
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Aug 28, 2026
9713a89
Merge commit '85042b89cbd' into add-notes-emoji-reactions-full-picker
adamsilverstein Aug 28, 2026
5294abb
Merge commit '7e3a89c33df' into add-notes-emoji-reactions-full-picker
adamsilverstein Aug 28, 2026
a1ccbcc
Merge branch 'add-notes-emoji-reactions-try-addditional-comment-type'…
adamsilverstein Aug 29, 2026
7880ae3
Rename emoji picker tests to the jsdom test naming convention
adamsilverstein Aug 29, 2026
669b874
Merge branch 'add-notes-emoji-reactions-try-addditional-comment-type'…
adamsilverstein Aug 30, 2026
3c6e363
Merge branch 'add-notes-emoji-reactions-try-addditional-comment-type'…
adamsilverstein Aug 30, 2026
11a5127
Move the emojibase data compat file to the WordPress 7.2 directory
adamsilverstein Aug 30, 2026
8c17d82
Tighten inline documentation across the emoji picker
adamsilverstein Aug 31, 2026
1aed735
Merge commit '4b591065801' into add-notes-emoji-reactions-full-picker
adamsilverstein Aug 31, 2026
06558d6
Move the emoji picker changelog entry to Unreleased
adamsilverstein Aug 31, 2026
4e66600
Emoji picker: use Unicode's own category names for the group headings
adamsilverstein Aug 31, 2026
5787b53
Merge trunk into add-notes-emoji-reactions-full-picker
adamsilverstein Aug 31, 2026
44f5e24
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Sep 15, 2026
0467594
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Sep 15, 2026
5bca0cf
Tests: Run the emoji picker tests under Vitest
adamsilverstein Sep 15, 2026
ab14021
Tests: Type the module mocks and mock matchMedia for the skin tone fl…
adamsilverstein Sep 15, 2026
f2fb3f5
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Sep 15, 2026
0ef5a47
Editor: Declare the Vitest test env types for the dev project
adamsilverstein Sep 15, 2026
3add4b4
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Sep 15, 2026
5dd9ae6
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Sep 18, 2026
ef0e27f
Reformat ternary continuations for Prettier 3.9.6
adamsilverstein Sep 18, 2026
75625d0
Notes: reveal the add-reaction trigger on hover instead of reserving …
adamsilverstein Sep 18, 2026
25e7637
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Sep 23, 2026
59ad5e8
Notes: Use the reaction icon for the add reaction trigger
adamsilverstein Sep 23, 2026
1c7479e
Merge #76767 into #78176 now that it carries the hover trigger
adamsilverstein Sep 23, 2026
e0febbf
Merge branch 'add-notes-emoji-reactions-try-addditional-comment-type'…
adamsilverstein Sep 24, 2026
e789531
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Sep 25, 2026
c9c7f1c
Merge remote-tracking branch 'origin/add-notes-emoji-reactions-try-ad…
adamsilverstein Sep 25, 2026
78a52b6
Notes: Match the emoji picker to its design and reach the grid from s…
adamsilverstein Sep 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions backport-changelog/7.0/10930.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
https://github.com/WordPress/wordpress-develop/pull/10930

* https://github.com/WordPress/gutenberg/pull/76767
* https://github.com/WordPress/gutenberg/pull/78176
Original file line number Diff line number Diff line change
Expand Up @@ -470,17 +470,39 @@ public function create_item( $request ) {
);
}

// Validate the reaction content against the allowed emoji list
// (filterable via `gutenberg_note_reaction_emojis`). Only a slug
// from that list is accepted: it is the one value the picker can
// render back as an emoji and label. Raw emoji bytes are rejected
// because the comments table is not guaranteed to be utf8mb4
// across all WordPress installs; clients submit the slug instead.
// Validate the reaction content. We accept either:
// - a curated slug (e.g. "heart") from the allowed emoji list
// (filterable via `gutenberg_note_reaction_emojis`), or
// - a lowercase hex-codepoint sequence joined by `-` (e.g.
// "1f44d" for πŸ‘ or "1f468-200d-1f4bb" for πŸ‘¨β€πŸ’»), which is how
// the full emoji picker stores a pick outside that list.
// Raw emoji bytes are rejected because the comments table is
// not guaranteed to be utf8mb4 across all WordPress installs;
// clients normalize before submitting.
$emojis = gutenberg_get_note_reaction_emojis();
$valid_slugs = wp_list_pluck( $emojis, 'value' );
$emoji_slug = isset( $request['content'] ) ? wp_strip_all_tags( $request['content'] ) : '';

if ( ! in_array( $emoji_slug, $valid_slugs, true ) ) {
$is_curated_slug = in_array( $emoji_slug, $valid_slugs, true );
$is_hex_key = (bool) preg_match(
'/^[0-9a-f]{2,6}(-[0-9a-f]{2,6}){0,15}$/',
$emoji_slug
);

// A hex-shaped slug must still be made of assignable Unicode code
// points: reject anything above U+10FFFF or in the UTF-16 surrogate
// range (U+D800–U+DFFF).
if ( $is_hex_key ) {
foreach ( explode( '-', $emoji_slug ) as $codepoint ) {
$value = hexdec( $codepoint );
if ( $value > 0x10FFFF || ( $value >= 0xD800 && $value <= 0xDFFF ) ) {
$is_hex_key = false;
break;
}
}
}

if ( ! $is_curated_slug && ! $is_hex_key ) {
return new WP_Error(
'rest_comment_invalid_reaction',
__( 'Invalid reaction emoji.', 'gutenberg' ),
Expand Down
129 changes: 129 additions & 0 deletions lib/compat/wordpress-7.2/emojibase-data.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
<?php
/**
* Exposes a same-origin URL for the bundled Emojibase data, so the Notes
* emoji picker fetches its dataset without an external CDN.
*
* `tools/build-scripts/copy-emojibase-data.mjs` copies the files into
* `build/emojibase-data/{locale}/` at plugin build time.
*
* @package gutenberg
* @since 7.2.0
*/

/**
* Injects the Emojibase dataset URL and per-emoji label overrides into the
* block editor settings, where the Notes picker reads them. npm consumers
* of `@wordpress/editor` opt in by supplying the same two settings.
*
* @since 7.2.0
*
* @param array $settings Existing block editor settings.
* @return array Updated block editor settings.
*/
function gutenberg_add_emojibase_settings( $settings ) {
$settings['noteEmojibaseUrl'] = gutenberg_url( 'build/emojibase-data' );
$settings['noteEmojiLabelOverrides'] = gutenberg_get_emoji_picker_label_overrides();
return $settings;
}
add_filter( 'block_editor_settings_all', 'gutenberg_add_emojibase_settings' );

/**
* Convert an emoji character to Emojibase's uppercase `hexcode` form:
* Variation Selector-16 stripped and each code point padded to four
* digits (`00A9`, not `A9`).
*
* Decodes UTF-8 by hand because `mbstring` is recommended but not
* required by WordPress, and `mb_ord()` is not polyfilled on all
* supported versions.
*
* @since 7.2.0
*
* @param string $emoji Emoji character.
* @return string Uppercase four-digit-padded hex code-points joined by
* `-`, or empty string.
*/
function gutenberg_emoji_to_hexcode( $emoji ) {
if ( ! is_string( $emoji ) || '' === $emoji ) {
return '';
}
$length = strlen( $emoji );
$parts = array();
for ( $i = 0; $i < $length; ) {
$byte = ord( $emoji[ $i ] );
if ( $byte < 0x80 ) {
$codepoint = $byte;
$size = 1;
} elseif ( 0xC0 === ( $byte & 0xE0 ) ) {
$codepoint = $byte & 0x1F;
$size = 2;
} elseif ( 0xE0 === ( $byte & 0xF0 ) ) {
$codepoint = $byte & 0x0F;
$size = 3;
} elseif ( 0xF0 === ( $byte & 0xF8 ) ) {
$codepoint = $byte & 0x07;
$size = 4;
} else {
return '';
}
for ( $j = 1; $j < $size; $j++ ) {
if ( $i + $j >= $length || 0x80 !== ( ord( $emoji[ $i + $j ] ) & 0xC0 ) ) {
return '';
}
$codepoint = ( $codepoint << 6 ) | ( ord( $emoji[ $i + $j ] ) & 0x3F );
}
$i += $size;
// Skip Variation Selector-16 so qualified `❀️` (2764 FE0F)
// matches Emojibase's unqualified `2764` entry.
if ( 0xFE0F === $codepoint ) {
continue;
}
$parts[] = str_pad( strtoupper( dechex( $codepoint ) ), 4, '0', STR_PAD_LEFT );
}
Comment thread
ciampo marked this conversation as resolved.
return implode( '-', $parts );
}

/**
* Builds the per-emoji label override map exposed to the editor's picker.
*
* Emojibase translates labels for 28 locales only; the filter below lets
* sites fill the gap for the emojis they care about. Seeded with the
* curated reactions so both rows show the same label.
*
* @since 7.2.0
*
* @return array Map of `hexcode => translated label`.
*/
function gutenberg_get_emoji_picker_label_overrides() {
$defaults = array();
if ( function_exists( 'gutenberg_get_note_reaction_emojis' ) ) {
foreach ( gutenberg_get_note_reaction_emojis() as $entry ) {
if ( empty( $entry['emoji'] ) || empty( $entry['label'] ) ) {
continue;
}
$hex = gutenberg_emoji_to_hexcode( $entry['emoji'] );
if ( '' !== $hex ) {
$defaults[ $hex ] = $entry['label'];
}
}
}

/**
* Filters the emoji label overrides exposed to the Notes picker.
*
* Keys are uppercase Emojibase `hexcode` values: each code point
* zero-padded to four digits with U+FE0F stripped, e.g. `2764` for
* ❀️ and `00A9` for ©️.
*
* @since 7.2.0
*
* @param array $overrides Map of `hexcode => translated label`.
*/
$overrides = apply_filters(
'gutenberg_emoji_picker_label_overrides',
$defaults
);

// A non-string label would crash `label.toLowerCase()` in searchEmojis().
$overrides = is_array( $overrides ) ? $overrides : array();
return array_filter( $overrides, 'is_string' );
}
1 change: 1 addition & 0 deletions lib/load.php
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ function gutenberg_is_experiment_enabled( $name ) {
require __DIR__ . '/compat/wordpress-7.2/view-config-api.php';
require __DIR__ . '/compat/wordpress-7.2/class-gutenberg-rest-view-config-controller-7-2.php';
require __DIR__ . '/compat/wordpress-7.2/note-reactions.php';
require __DIR__ . '/compat/wordpress-7.2/emojibase-data.php';
require __DIR__ . '/compat/wordpress-7.2/class-gutenberg-rest-comment-controller-7-2.php';
require __DIR__ . '/compat/wordpress-7.2/rest-api.php';

Expand Down
15 changes: 15 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 21 additions & 0 deletions packages/e2e-tests/plugins/note-emojibase-unavailable.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php
/**
* Plugin Name: Gutenberg Test Note Emojibase Unavailable
* Plugin URI: https://github.com/WordPress/gutenberg
* Author: Gutenberg Team
*
* @package gutenberg-test-note-emojibase-unavailable
*/

/**
* Drops the Emojibase dataset URL so the editor falls back to the curated
* quick row. Runs late to win over `gutenberg_add_emojibase_settings()`.
*
* @param array $settings Existing block editor settings.
* @return array Updated block editor settings.
*/
function gutenberg_test_remove_emojibase_url( $settings ) {
unset( $settings['noteEmojibaseUrl'] );
return $settings;
}
add_filter( 'block_editor_settings_all', 'gutenberg_test_remove_emojibase_url', 20 );
1 change: 1 addition & 0 deletions packages/editor/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
### New Features

- Notes: allow reacting to a note with an emoji. Reactions display as pill buttons on the note with per-emoji counts, backed by a new `reaction` comment type. The add-reaction trigger fades in on hover or focus in the note's top corner, so a note with no reactions costs no vertical space for the option ([#76767](https://github.com/WordPress/gutenberg/pull/76767)).
- Notes: the add-reaction popover now offers a full searchable emoji picker with a per-user skin tone preference, powered by a self-hosted Emojibase dataset configured via the `noteEmojibaseUrl` editor setting (with optional `noteEmojiLabelOverrides`) ([#78176](https://github.com/WordPress/gutenberg/pull/78176)).

### Enhancements

Expand Down
1 change: 1 addition & 0 deletions packages/editor/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@
"@testing-library/user-event": "^14.6.1",
"@wordpress/block-library": "file:../block-library",
"deep-freeze": "^0.0.1",
"storybook": "^10.5.3",
"vitest": "^5.0.0",
"vitest-browser-react": "^2.3.0"
},
Expand Down
Loading
Loading