diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md index 89dfdf8cdfc13c..08082f99a00b92 100644 --- a/packages/components/CHANGELOG.md +++ b/packages/components/CHANGELOG.md @@ -9,6 +9,8 @@ ### Bug Fix - `ToolsPanelItem`: Use useLayoutEffect to prevent rendering glitch for last panel item styling. ([#56536](https://github.com/WordPress/gutenberg/pull/56536)). +- `FormTokenField`: Fix broken suggestions scrollbar when the `__experimentalExpandOnFocus` prop is defined ([#56426](https://github.com/WordPress/gutenberg/pull/56426)). +- `FormTokenField`: `onFocus` prop is now typed as a React `FocusEvent` ([#56426](https://github.com/WordPress/gutenberg/pull/56426)). ### Experimental diff --git a/packages/components/src/form-token-field/index.tsx b/packages/components/src/form-token-field/index.tsx index b3a5c5a53d4c0a..bdc3c2a53ae1d0 100644 --- a/packages/components/src/form-token-field/index.tsx +++ b/packages/components/src/form-token-field/index.tsx @@ -2,7 +2,7 @@ * External dependencies */ import classnames from 'classnames'; -import type { KeyboardEvent, MouseEvent, TouchEvent } from 'react'; +import type { KeyboardEvent, MouseEvent, TouchEvent, FocusEvent } from 'react'; /** * WordPress dependencies @@ -162,7 +162,7 @@ export function FormTokenField( props: FormTokenFieldProps ) { } } - function onBlur() { + function onBlur( event: FocusEvent ) { if ( inputHasValidValue() && __experimentalValidateInput( incompleteTokenValue ) @@ -176,7 +176,15 @@ export function FormTokenField( props: FormTokenFieldProps ) { setIncompleteTokenValue( '' ); setInputOffsetFromEnd( 0 ); setIsActive( false ); - setIsExpanded( false ); + + // If `__experimentalExpandOnFocus` is true, don't close the suggestions list when + // the user clicks on it (`tokensAndInput` will be the element that caused the blur). + const shouldKeepSuggestionsExpanded = + ! __experimentalExpandOnFocus || + ( __experimentalExpandOnFocus && + event.relatedTarget === tokensAndInput.current ); + setIsExpanded( shouldKeepSuggestionsExpanded ); + setSelectedSuggestionIndex( -1 ); setSelectedSuggestionScroll( false ); } diff --git a/packages/components/src/form-token-field/token-input.tsx b/packages/components/src/form-token-field/token-input.tsx index a8367695670b20..c2b4983c51cb9d 100644 --- a/packages/components/src/form-token-field/token-input.tsx +++ b/packages/components/src/form-token-field/token-input.tsx @@ -48,9 +48,7 @@ export function UnForwardedTokenInput( onFocus?.( e ); }; - const onBlurHandler: React.FocusEventHandler< HTMLInputElement > = ( - e - ) => { + const onBlurHandler: FocusEventHandler< HTMLInputElement > = ( e ) => { setHasFocus( false ); onBlur?.( e ); }; diff --git a/packages/components/src/form-token-field/types.ts b/packages/components/src/form-token-field/types.ts index e7eabd381a66a6..db4549a7f0779c 100644 --- a/packages/components/src/form-token-field/types.ts +++ b/packages/components/src/form-token-field/types.ts @@ -5,6 +5,7 @@ import type { ComponentPropsWithRef, MouseEventHandler, ReactNode, + FocusEvent, } from 'react'; type Messages = {