UNPKG

@wordpress/block-library

Version:
78 lines (76 loc) 1.98 kB
/** * WordPress dependencies */ import { store, getContext, getElement, withSyncEvent, } from '@wordpress/interactivity'; const { actions } = store( 'core/search', { state: { get ariaLabel() { const { isSearchInputVisible, ariaLabelCollapsed, ariaLabelExpanded, } = getContext(); return isSearchInputVisible ? ariaLabelExpanded : ariaLabelCollapsed; }, get ariaControls() { const { isSearchInputVisible, inputId } = getContext(); return isSearchInputVisible ? null : inputId; }, get type() { const { isSearchInputVisible } = getContext(); return isSearchInputVisible ? 'submit' : 'button'; }, get tabindex() { const { isSearchInputVisible } = getContext(); return isSearchInputVisible ? '0' : '-1'; }, }, actions: { openSearchInput: withSyncEvent( ( event ) => { const ctx = getContext(); const { ref } = getElement(); if ( ! ctx.isSearchInputVisible ) { event.preventDefault(); ctx.isSearchInputVisible = true; ref.parentElement.querySelector( 'input' ).focus(); } } ), closeSearchInput() { const ctx = getContext(); ctx.isSearchInputVisible = false; }, handleSearchKeydown( event ) { const { ref } = getElement(); // If Escape close the menu. if ( event?.key === 'Escape' ) { actions.closeSearchInput(); ref.querySelector( 'button' ).focus(); } }, handleSearchFocusout( event ) { const { ref } = getElement(); // If focus is outside search form, and in the document, close menu // event.target === The element losing focus // event.relatedTarget === The element receiving focus (if any) // When focusout is outside the document, // `window.document.activeElement` doesn't change. if ( ! ref.contains( event.relatedTarget ) && event.target !== window.document.activeElement ) { actions.closeSearchInput(); } }, }, }, { lock: true } );