{
  "version": 3,
  "sources": ["../../src/store/selectors.js"],
  "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tgetBlockType,\n\tgetBlockTypes,\n\tgetBlockVariations,\n\tgetDefaultBlockName,\n\thasBlockSupport,\n\tgetPossibleBlockTransformations,\n\tswitchToBlockType,\n\tstore as blocksStore,\n\tprivateApis as blocksPrivateApis,\n} from '@wordpress/blocks';\nimport { Platform } from '@wordpress/element';\nimport { applyFilters } from '@wordpress/hooks';\nimport { symbol } from '@wordpress/icons';\nimport { create, remove, toHTMLString } from '@wordpress/rich-text';\nimport deprecated from '@wordpress/deprecated';\nimport { createSelector, createRegistrySelector } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport {\n\tisFiltered,\n\tcheckAllowListRecursive,\n\tcheckAllowList,\n\tgetAllPatternsDependants,\n\tgetInsertBlockTypeDependants,\n\tgetParsedPattern,\n\tgetGrammar,\n\tmapUserPattern,\n} from './utils';\nimport { orderBy } from '../utils/sorting';\nimport { STORE_NAME } from './constants';\nimport { unlock } from '../lock-unlock';\n\nimport {\n\tgetContentLockingParent,\n\tgetEditedContentOnlySection,\n\tgetSectionRootClientId,\n\tisSectionBlock,\n\tgetParentSectionBlock,\n\tisZoomOut,\n\tisContainerInsertableToInContentOnlyMode,\n} from './private-selectors';\n\nconst { isContentBlock } = unlock( blocksPrivateApis );\n\n/**\n * A block selection object.\n *\n * @typedef {Object} WPBlockSelection\n *\n * @property {string} clientId     A block client ID.\n * @property {string} attributeKey A block attribute key.\n * @property {number} offset       An attribute value offset, based on the rich\n *                                 text value. See `wp.richText.create`.\n */\n\n// Module constants.\nconst MILLISECONDS_PER_HOUR = 3600 * 1000;\nconst MILLISECONDS_PER_DAY = 24 * 3600 * 1000;\nconst MILLISECONDS_PER_WEEK = 7 * 24 * 3600 * 1000;\n\n/**\n * Shared reference to an empty array for cases where it is important to avoid\n * returning a new array reference on every invocation, as in a connected or\n * other pure component which performs `shouldComponentUpdate` check on props.\n * This should be used as a last resort, since the normalized data should be\n * maintained by the reducer result in state.\n *\n * @type {Array}\n */\nconst EMPTY_ARRAY = [];\n\n/**\n * Shared reference to an empty Set for cases where it is important to avoid\n * returning a new Set reference on every invocation, as in a connected or\n * other pure component which performs `shouldComponentUpdate` check on props.\n * This should be used as a last resort, since the normalized data should be\n * maintained by the reducer result in state.\n *\n * @type {Set}\n */\nconst EMPTY_SET = new Set();\n\nconst DEFAULT_INSERTER_OPTIONS = {\n\t[ isFiltered ]: true,\n};\n\n/**\n * Returns a block's name given its client ID, or null if no block exists with\n * the client ID.\n *\n * @param {Object} state    Editor state.\n * @param {string} clientId Block client ID.\n *\n * @return {string} Block name.\n */\nexport function getBlockName( state, clientId ) {\n\tconst block = state.blocks.byClientId.get( clientId );\n\tconst socialLinkName = 'core/social-link';\n\n\tif ( Platform.OS !== 'web' && block?.name === socialLinkName ) {\n\t\tconst attributes = state.blocks.attributes.get( clientId );\n\t\tconst { service } = attributes ?? {};\n\n\t\treturn service ? `${ socialLinkName }-${ service }` : socialLinkName;\n\t}\n\treturn block ? block.name : null;\n}\n\n/**\n * Returns whether a block is valid or not.\n *\n * @param {Object} state    Editor state.\n * @param {string} clientId Block client ID.\n *\n * @return {boolean} Is Valid.\n */\nexport function isBlockValid( state, clientId ) {\n\tconst block = state.blocks.byClientId.get( clientId );\n\treturn !! block && block.isValid;\n}\n\n/**\n * Returns a block's attributes given its client ID, or null if no block exists with\n * the client ID.\n *\n * @param {Object} state    Editor state.\n * @param {string} clientId Block client ID.\n *\n * @return {?Object} Block attributes.\n */\nexport function getBlockAttributes( state, clientId ) {\n\tconst block = state.blocks.byClientId.get( clientId );\n\tif ( ! block ) {\n\t\treturn null;\n\t}\n\n\treturn state.blocks.attributes.get( clientId );\n}\n\n/**\n * Returns a block given its client ID. This is a parsed copy of the block,\n * containing its `blockName`, `clientId`, and current `attributes` state. This\n * is not the block's registration settings, which must be retrieved from the\n * blocks module registration store.\n *\n * getBlock recurses through its inner blocks until all its children blocks have\n * been retrieved. Note that getBlock will not return the child inner blocks of\n * an inner block controller. This is because an inner block controller syncs\n * itself with its own entity, and should therefore not be included with the\n * blocks of a different entity. For example, say you call `getBlocks( TP )` to\n * get the blocks of a template part. If another template part is a child of TP,\n * then the nested template part's child blocks will not be returned. This way,\n * the template block itself is considered part of the parent, but the children\n * are not.\n *\n * @param {Object} state    Editor state.\n * @param {string} clientId Block client ID.\n *\n * @return {Object} Parsed block object.\n */\nexport function getBlock( state, clientId ) {\n\tif ( ! state.blocks.byClientId.has( clientId ) ) {\n\t\treturn null;\n\t}\n\n\treturn state.blocks.tree.get( clientId );\n}\n\nexport const __unstableGetBlockWithoutInnerBlocks = createSelector(\n\t( state, clientId ) => {\n\t\tconst block = state.blocks.byClientId.get( clientId );\n\t\tif ( ! block ) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn {\n\t\t\t...block,\n\t\t\tattributes: getBlockAttributes( state, clientId ),\n\t\t};\n\t},\n\t( state, clientId ) => [\n\t\tstate.blocks.byClientId.get( clientId ),\n\t\tstate.blocks.attributes.get( clientId ),\n\t]\n);\n\n/**\n * Returns all block objects for the current post being edited as an array in\n * the order they appear in the post. Note that this will exclude child blocks\n * of nested inner block controllers.\n *\n * @param {Object}  state        Editor state.\n * @param {?string} rootClientId Optional root client ID of block list.\n *\n * @return {Object[]} Post blocks.\n */\nexport function getBlocks( state, rootClientId ) {\n\tconst treeKey =\n\t\t! rootClientId || ! areInnerBlocksControlled( state, rootClientId )\n\t\t\t? rootClientId || ''\n\t\t\t: 'controlled||' + rootClientId;\n\treturn state.blocks.tree.get( treeKey )?.innerBlocks || EMPTY_ARRAY;\n}\n\n/**\n * Returns a stripped down block object containing only its client ID,\n * and its inner blocks' client IDs.\n *\n * @deprecated\n *\n * @param {Object} state    Editor state.\n * @param {string} clientId Client ID of the block to get.\n *\n * @return {Object} Client IDs of the post blocks.\n */\nexport const __unstableGetClientIdWithClientIdsTree = createSelector(\n\t( state, clientId ) => {\n\t\tdeprecated(\n\t\t\t\"wp.data.select( 'core/block-editor' ).__unstableGetClientIdWithClientIdsTree\",\n\t\t\t{\n\t\t\t\tsince: '6.3',\n\t\t\t\tversion: '6.5',\n\t\t\t}\n\t\t);\n\t\treturn {\n\t\t\tclientId,\n\t\t\tinnerBlocks: __unstableGetClientIdsTree( state, clientId ),\n\t\t};\n\t},\n\t( state ) => [ state.blocks.order ]\n);\n\n/**\n * Returns the block tree represented in the block-editor store from the\n * given root, consisting of stripped down block objects containing only\n * their client IDs, and their inner blocks' client IDs.\n *\n * @deprecated\n *\n * @param {Object}  state        Editor state.\n * @param {?string} rootClientId Optional root client ID of block list.\n *\n * @return {Object[]} Client IDs of the post blocks.\n */\nexport const __unstableGetClientIdsTree = createSelector(\n\t( state, rootClientId = '' ) => {\n\t\tdeprecated(\n\t\t\t\"wp.data.select( 'core/block-editor' ).__unstableGetClientIdsTree\",\n\t\t\t{\n\t\t\t\tsince: '6.3',\n\t\t\t\tversion: '6.5',\n\t\t\t}\n\t\t);\n\t\treturn getBlockOrder( state, rootClientId ).map( ( clientId ) =>\n\t\t\t__unstableGetClientIdWithClientIdsTree( state, clientId )\n\t\t);\n\t},\n\t( state ) => [ state.blocks.order ]\n);\n\n/**\n * Returns an array containing the clientIds of all descendants of the blocks\n * given. Returned ids are ordered first by the order of the ids given, then\n * by the order that they appear in the editor.\n *\n * @param {Object}          state   Global application state.\n * @param {string|string[]} rootIds Client ID(s) for which descendant blocks are to be returned.\n *\n * @return {Array} Client IDs of descendants.\n */\nexport const getClientIdsOfDescendants = createSelector(\n\t( state, rootIds ) => {\n\t\trootIds = Array.isArray( rootIds ) ? [ ...rootIds ] : [ rootIds ];\n\t\tconst ids = [];\n\n\t\t// Add the descendants of the root blocks first.\n\t\tfor ( const rootId of rootIds ) {\n\t\t\tconst order = state.blocks.order.get( rootId );\n\t\t\tif ( order ) {\n\t\t\t\tids.push( ...order );\n\t\t\t}\n\t\t}\n\n\t\tlet index = 0;\n\n\t\t// Add the descendants of the descendants, recursively.\n\t\twhile ( index < ids.length ) {\n\t\t\tconst id = ids[ index ];\n\t\t\tconst order = state.blocks.order.get( id );\n\t\t\tif ( order ) {\n\t\t\t\tids.splice( index + 1, 0, ...order );\n\t\t\t}\n\t\t\tindex++;\n\t\t}\n\n\t\treturn ids;\n\t},\n\t( state ) => [ state.blocks.order ]\n);\n\n/**\n * Returns an array containing the clientIds of the top-level blocks and\n * their descendants of any depth (for nested blocks). Ids are returned\n * in the same order that they appear in the editor.\n *\n * @param {Object} state Global application state.\n *\n * @return {Array} ids of top-level and descendant blocks.\n */\nexport const getClientIdsWithDescendants = ( state ) =>\n\tgetClientIdsOfDescendants( state, '' );\n\n/**\n * Returns the total number of blocks, or the total number of blocks with a specific name in a post.\n * The number returned includes nested blocks.\n *\n * @param {Object}  state     Global application state.\n * @param {?string} blockName Optional block name, if specified only blocks of that type will be counted.\n *\n * @return {number} Number of blocks in the post, or number of blocks with name equal to blockName.\n */\nexport const getGlobalBlockCount = createSelector(\n\t( state, blockName ) => {\n\t\tconst clientIds = getClientIdsWithDescendants( state );\n\t\tif ( ! blockName ) {\n\t\t\treturn clientIds.length;\n\t\t}\n\t\tlet count = 0;\n\t\tfor ( const clientId of clientIds ) {\n\t\t\tconst block = state.blocks.byClientId.get( clientId );\n\t\t\tif ( block.name === blockName ) {\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\t\treturn count;\n\t},\n\t( state ) => [ state.blocks.order, state.blocks.byClientId ]\n);\n\n/**\n * Returns all blocks that match a blockName. Results include nested blocks.\n *\n * @param {Object}   state     Global application state.\n * @param {string[]} blockName Block name(s) for which clientIds are to be returned.\n *\n * @return {Array} Array of clientIds of blocks with name equal to blockName.\n */\nexport const getBlocksByName = createSelector(\n\t( state, blockName ) => {\n\t\tif ( ! blockName ) {\n\t\t\treturn EMPTY_ARRAY;\n\t\t}\n\t\tconst blockNames = Array.isArray( blockName )\n\t\t\t? blockName\n\t\t\t: [ blockName ];\n\t\tconst clientIds = getClientIdsWithDescendants( state );\n\t\tconst foundBlocks = clientIds.filter( ( clientId ) => {\n\t\t\tconst block = state.blocks.byClientId.get( clientId );\n\t\t\treturn blockNames.includes( block.name );\n\t\t} );\n\t\treturn foundBlocks.length > 0 ? foundBlocks : EMPTY_ARRAY;\n\t},\n\t( state ) => [ state.blocks.order, state.blocks.byClientId ]\n);\n\n/**\n * Returns all global blocks that match a blockName. Results include nested blocks.\n *\n * @deprecated\n *\n * @param {Object}   state     Global application state.\n * @param {string[]} blockName Block name(s) for which clientIds are to be returned.\n *\n * @return {Array} Array of clientIds of blocks with name equal to blockName.\n */\nexport function __experimentalGetGlobalBlocksByName( state, blockName ) {\n\tdeprecated(\n\t\t\"wp.data.select( 'core/block-editor' ).__experimentalGetGlobalBlocksByName\",\n\t\t{\n\t\t\tsince: '6.5',\n\t\t\talternative: `wp.data.select( 'core/block-editor' ).getBlocksByName`,\n\t\t}\n\t);\n\treturn getBlocksByName( state, blockName );\n}\n\n/**\n * Given an array of block client IDs, returns the corresponding array of block\n * objects.\n *\n * @param {Object}   state     Editor state.\n * @param {string[]} clientIds Client IDs for which blocks are to be returned.\n *\n * @return {WPBlock[]} Block objects.\n */\nexport const getBlocksByClientId = createSelector(\n\t( state, clientIds ) =>\n\t\t( Array.isArray( clientIds ) ? clientIds : [ clientIds ] ).map(\n\t\t\t( clientId ) => getBlock( state, clientId )\n\t\t),\n\t( state, clientIds ) =>\n\t\t( Array.isArray( clientIds ) ? clientIds : [ clientIds ] ).map(\n\t\t\t( clientId ) => state.blocks.tree.get( clientId )\n\t\t)\n);\n\n/**\n * Given an array of block client IDs, returns the corresponding array of block\n * names.\n *\n * @param {Object}   state     Editor state.\n * @param {string[]} clientIds Client IDs for which block names are to be returned.\n *\n * @return {string[]} Block names.\n */\nexport const getBlockNamesByClientId = createSelector(\n\t( state, clientIds ) =>\n\t\tgetBlocksByClientId( state, clientIds )\n\t\t\t.filter( Boolean )\n\t\t\t.map( ( block ) => block.name ),\n\t( state, clientIds ) => getBlocksByClientId( state, clientIds )\n);\n\n/**\n * Returns the number of blocks currently present in the post.\n *\n * @param {Object}  state        Editor state.\n * @param {?string} rootClientId Optional root client ID of block list.\n *\n * @return {number} Number of blocks in the post.\n */\nexport function getBlockCount( state, rootClientId ) {\n\treturn getBlockOrder( state, rootClientId ).length;\n}\n\n/**\n * Returns the current selection start block client ID, attribute key and text\n * offset.\n *\n * @param {Object} state Block editor state.\n *\n * @return {WPBlockSelection} Selection start information.\n */\nexport function getSelectionStart( state ) {\n\treturn state.selection.selectionStart;\n}\n\n/**\n * Returns the current selection end block client ID, attribute key and text\n * offset.\n *\n * @param {Object} state Block editor state.\n *\n * @return {WPBlockSelection} Selection end information.\n */\nexport function getSelectionEnd( state ) {\n\treturn state.selection.selectionEnd;\n}\n\n/**\n * Returns the current block selection start. This value may be null, and it\n * may represent either a singular block selection or multi-selection start.\n * A selection is singular if its start and end match.\n *\n * @param {Object} state Global application state.\n *\n * @return {?string} Client ID of block selection start.\n */\nexport function getBlockSelectionStart( state ) {\n\treturn state.selection.selectionStart.clientId;\n}\n\n/**\n * Returns the current block selection end. This value may be null, and it\n * may represent either a singular block selection or multi-selection end.\n * A selection is singular if its start and end match.\n *\n * @param {Object} state Global application state.\n *\n * @return {?string} Client ID of block selection end.\n */\nexport function getBlockSelectionEnd( state ) {\n\treturn state.selection.selectionEnd.clientId;\n}\n\n/**\n * Returns the number of blocks currently selected in the post.\n *\n * @param {Object} state Global application state.\n *\n * @return {number} Number of blocks selected in the post.\n */\nexport function getSelectedBlockCount( state ) {\n\tconst multiSelectedBlockCount =\n\t\tgetMultiSelectedBlockClientIds( state ).length;\n\n\tif ( multiSelectedBlockCount ) {\n\t\treturn multiSelectedBlockCount;\n\t}\n\n\treturn state.selection.selectionStart.clientId ? 1 : 0;\n}\n\n/**\n * Returns true if there is a single selected block, or false otherwise.\n *\n * @param {Object} state Editor state.\n *\n * @return {boolean} Whether a single block is selected.\n */\nexport function hasSelectedBlock( state ) {\n\tconst { selectionStart, selectionEnd } = state.selection;\n\treturn (\n\t\t!! selectionStart.clientId &&\n\t\tselectionStart.clientId === selectionEnd.clientId\n\t);\n}\n\n/**\n * Returns the currently selected block client ID, or null if there is no\n * selected block.\n *\n * @param {Object} state Editor state.\n *\n * @return {?string} Selected block client ID.\n */\nexport function getSelectedBlockClientId( state ) {\n\tconst { selectionStart, selectionEnd } = state.selection;\n\tconst { clientId } = selectionStart;\n\n\tif ( ! clientId || clientId !== selectionEnd.clientId ) {\n\t\treturn null;\n\t}\n\n\treturn clientId;\n}\n\n/**\n * Returns the currently selected block, or null if there is no selected block.\n *\n * @param {Object} state Global application state.\n *\n * @example\n *\n *```js\n * import { select } from '@wordpress/data'\n * import { store as blockEditorStore } from '@wordpress/block-editor'\n *\n * // Set initial active block client ID\n * let activeBlockClientId = null\n *\n * const getActiveBlockData = () => {\n * \tconst activeBlock = select(blockEditorStore).getSelectedBlock()\n *\n * \tif (activeBlock && activeBlock.clientId !== activeBlockClientId) {\n * \t\tactiveBlockClientId = activeBlock.clientId\n *\n * \t\t// Get active block name and attributes\n * \t\tconst activeBlockName = activeBlock.name\n * \t\tconst activeBlockAttributes = activeBlock.attributes\n *\n * \t\t// Log active block name and attributes\n * \t\tconsole.log(activeBlockName, activeBlockAttributes)\n * \t\t}\n * \t}\n *\n * \t// Subscribe to changes in the editor\n * \t// wp.data.subscribe(() => {\n * \t\t// getActiveBlockData()\n * \t// })\n *\n * \t// Update active block data on click\n * \t// onclick=\"getActiveBlockData()\"\n *```\n *\n * @return {?Object} Selected block.\n */\nexport function getSelectedBlock( state ) {\n\tconst clientId = getSelectedBlockClientId( state );\n\treturn clientId ? getBlock( state, clientId ) : null;\n}\n\n/**\n * Given a block client ID, returns the root block from which the block is\n * nested, an empty string for top-level blocks, or null if the block does not\n * exist.\n *\n * @param {Object} state    Editor state.\n * @param {string} clientId Block from which to find root client ID.\n *\n * @return {?string} Root client ID, if exists\n */\nexport function getBlockRootClientId( state, clientId ) {\n\treturn state.blocks.parents.get( clientId ) ?? null;\n}\n\n/**\n * Given a block client ID, returns the list of all its parents from top to bottom.\n *\n * @param {Object}  state     Editor state.\n * @param {string}  clientId  Block from which to find root client ID.\n * @param {boolean} ascending Order results from bottom to top (true) or top to bottom (false).\n *\n * @return {Array} ClientIDs of the parent blocks.\n */\nexport const getBlockParents = createSelector(\n\t( state, clientId, ascending = false ) => {\n\t\tconst parents = [];\n\t\tlet current = clientId;\n\t\twhile ( ( current = state.blocks.parents.get( current ) ) ) {\n\t\t\tparents.push( current );\n\t\t}\n\n\t\tif ( ! parents.length ) {\n\t\t\treturn EMPTY_ARRAY;\n\t\t}\n\n\t\treturn ascending ? parents : parents.reverse();\n\t},\n\t( state ) => [ state.blocks.parents ]\n);\n\n/**\n * Given a block client ID and a block name, returns the list of all its parents\n * from top to bottom, filtered by the given name(s). For example, if passed\n * 'core/group' as the blockName, it will only return parents which are group\n * blocks. If passed `[ 'core/group', 'core/cover']`, as the blockName, it will\n * return parents which are group blocks and parents which are cover blocks.\n *\n * @param {Object}          state     Editor state.\n * @param {string}          clientId  Block from which to find root client ID.\n * @param {string|string[]} blockName Block name(s) to filter.\n * @param {boolean}         ascending Order results from bottom to top (true) or top to bottom (false).\n *\n * @return {Array} ClientIDs of the parent blocks.\n */\nexport const getBlockParentsByBlockName = createSelector(\n\t( state, clientId, blockName, ascending = false ) => {\n\t\tconst parents = getBlockParents( state, clientId, ascending );\n\t\tconst hasName = Array.isArray( blockName )\n\t\t\t? ( name ) => blockName.includes( name )\n\t\t\t: ( name ) => blockName === name;\n\t\treturn parents.filter( ( id ) => hasName( getBlockName( state, id ) ) );\n\t},\n\t( state ) => [ state.blocks.parents ]\n);\n/**\n * Given a block client ID, returns the root of the hierarchy from which the block is nested, return the block itself for root level blocks.\n *\n * @param {Object} state    Editor state.\n * @param {string} clientId Block from which to find root client ID.\n *\n * @return {string} Root client ID\n */\nexport function getBlockHierarchyRootClientId( state, clientId ) {\n\tlet current = clientId;\n\tlet parent;\n\tdo {\n\t\tparent = current;\n\t\tcurrent = state.blocks.parents.get( current );\n\t} while ( current );\n\treturn parent;\n}\n\n/**\n * Given a block client ID, returns the lowest common ancestor with selected client ID.\n *\n * @param {Object} state    Editor state.\n * @param {string} clientId Block from which to find common ancestor client ID.\n *\n * @return {string} Common ancestor client ID or undefined\n */\nexport function getLowestCommonAncestorWithSelectedBlock( state, clientId ) {\n\tconst selectedId = getSelectedBlockClientId( state );\n\tconst clientParents = [ ...getBlockParents( state, clientId ), clientId ];\n\tconst selectedParents = [\n\t\t...getBlockParents( state, selectedId ),\n\t\tselectedId,\n\t];\n\n\tlet lowestCommonAncestor;\n\n\tconst maxDepth = Math.min( clientParents.length, selectedParents.length );\n\tfor ( let index = 0; index < maxDepth; index++ ) {\n\t\tif ( clientParents[ index ] === selectedParents[ index ] ) {\n\t\t\tlowestCommonAncestor = clientParents[ index ];\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn lowestCommonAncestor;\n}\n\n/**\n * Returns the client ID of the block adjacent one at the given reference\n * startClientId and modifier directionality. Defaults start startClientId to\n * the selected block, and direction as next block. Returns null if there is no\n * adjacent block.\n *\n * @param {Object}  state         Editor state.\n * @param {?string} startClientId Optional client ID of block from which to\n *                                search.\n * @param {?number} modifier      Directionality multiplier (1 next, -1\n *                                previous).\n *\n * @return {?string} Return the client ID of the block, or null if none exists.\n */\nexport function getAdjacentBlockClientId( state, startClientId, modifier = 1 ) {\n\t// Default to selected block.\n\tif ( startClientId === undefined ) {\n\t\tstartClientId = getSelectedBlockClientId( state );\n\t}\n\n\t// Try multi-selection starting at extent based on modifier.\n\tif ( startClientId === undefined ) {\n\t\tif ( modifier < 0 ) {\n\t\t\tstartClientId = getFirstMultiSelectedBlockClientId( state );\n\t\t} else {\n\t\t\tstartClientId = getLastMultiSelectedBlockClientId( state );\n\t\t}\n\t}\n\n\t// Validate working start client ID.\n\tif ( ! startClientId ) {\n\t\treturn null;\n\t}\n\n\t// Retrieve start block root client ID, being careful to allow the falsey\n\t// empty string top-level root by explicitly testing against null.\n\tconst rootClientId = getBlockRootClientId( state, startClientId );\n\tif ( rootClientId === null ) {\n\t\treturn null;\n\t}\n\n\tconst { order } = state.blocks;\n\tconst orderSet = order.get( rootClientId );\n\tconst index = orderSet.indexOf( startClientId );\n\tconst nextIndex = index + 1 * modifier;\n\n\t// Block was first in set and we're attempting to get previous.\n\tif ( nextIndex < 0 ) {\n\t\treturn null;\n\t}\n\n\t// Block was last in set and we're attempting to get next.\n\tif ( nextIndex === orderSet.length ) {\n\t\treturn null;\n\t}\n\n\t// Assume incremented index is within the set.\n\treturn orderSet[ nextIndex ];\n}\n\n/**\n * Returns the previous block's client ID from the given reference start ID.\n * Defaults start to the selected block. Returns null if there is no previous\n * block.\n *\n * @param {Object}  state         Editor state.\n * @param {?string} startClientId Optional client ID of block from which to\n *                                search.\n *\n * @return {?string} Adjacent block's client ID, or null if none exists.\n */\nexport function getPreviousBlockClientId( state, startClientId ) {\n\treturn getAdjacentBlockClientId( state, startClientId, -1 );\n}\n\n/**\n * Returns the next block's client ID from the given reference start ID.\n * Defaults start to the selected block. Returns null if there is no next\n * block.\n *\n * @param {Object}  state         Editor state.\n * @param {?string} startClientId Optional client ID of block from which to\n *                                search.\n *\n * @return {?string} Adjacent block's client ID, or null if none exists.\n */\nexport function getNextBlockClientId( state, startClientId ) {\n\treturn getAdjacentBlockClientId( state, startClientId, 1 );\n}\n\n/**\n * Returns the initial caret position for the selected block.\n * This position is to used to position the caret properly when the selected block changes.\n * If the current block is not a RichText, having initial position set to 0 means \"focus block\"\n *\n * @param {Object} state Global application state.\n *\n * @return {0|-1|null} Initial position.\n */\nexport function getSelectedBlocksInitialCaretPosition( state ) {\n\treturn state.initialPosition;\n}\n\n/**\n * Returns the current selection set of block client IDs (multiselection or single selection).\n *\n * @param {Object} state Editor state.\n *\n * @return {Array} Multi-selected block client IDs.\n */\nexport const getSelectedBlockClientIds = createSelector(\n\t( state ) => {\n\t\tconst { selectionStart, selectionEnd } = state.selection;\n\n\t\tif ( ! selectionStart.clientId || ! selectionEnd.clientId ) {\n\t\t\treturn EMPTY_ARRAY;\n\t\t}\n\n\t\tif ( selectionStart.clientId === selectionEnd.clientId ) {\n\t\t\treturn [ selectionStart.clientId ];\n\t\t}\n\n\t\t// Retrieve root client ID to aid in retrieving relevant nested block\n\t\t// order, being careful to allow the falsey empty string top-level root\n\t\t// by explicitly testing against null.\n\t\tconst rootClientId = getBlockRootClientId(\n\t\t\tstate,\n\t\t\tselectionStart.clientId\n\t\t);\n\n\t\tif ( rootClientId === null ) {\n\t\t\treturn EMPTY_ARRAY;\n\t\t}\n\n\t\tconst blockOrder = getBlockOrder( state, rootClientId );\n\t\tconst startIndex = blockOrder.indexOf( selectionStart.clientId );\n\t\tconst endIndex = blockOrder.indexOf( selectionEnd.clientId );\n\n\t\tif ( startIndex > endIndex ) {\n\t\t\treturn blockOrder.slice( endIndex, startIndex + 1 );\n\t\t}\n\n\t\treturn blockOrder.slice( startIndex, endIndex + 1 );\n\t},\n\t( state ) => [\n\t\tstate.blocks.order,\n\t\tstate.selection.selectionStart.clientId,\n\t\tstate.selection.selectionEnd.clientId,\n\t]\n);\n\n/**\n * Returns the current multi-selection set of block client IDs, or an empty\n * array if there is no multi-selection.\n *\n * @param {Object} state Editor state.\n *\n * @return {Array} Multi-selected block client IDs.\n */\nexport function getMultiSelectedBlockClientIds( state ) {\n\tconst { selectionStart, selectionEnd } = state.selection;\n\n\tif ( selectionStart.clientId === selectionEnd.clientId ) {\n\t\treturn EMPTY_ARRAY;\n\t}\n\n\treturn getSelectedBlockClientIds( state );\n}\n\n/**\n * Returns the current multi-selection set of blocks, or an empty array if\n * there is no multi-selection.\n *\n * @param {Object} state Editor state.\n *\n * @return {Array} Multi-selected block objects.\n */\nexport const getMultiSelectedBlocks = createSelector(\n\t( state ) => {\n\t\tconst multiSelectedBlockClientIds =\n\t\t\tgetMultiSelectedBlockClientIds( state );\n\t\tif ( ! multiSelectedBlockClientIds.length ) {\n\t\t\treturn EMPTY_ARRAY;\n\t\t}\n\n\t\treturn multiSelectedBlockClientIds.map( ( clientId ) =>\n\t\t\tgetBlock( state, clientId )\n\t\t);\n\t},\n\t( state ) => [\n\t\t...getSelectedBlockClientIds.getDependants( state ),\n\t\tstate.blocks.byClientId,\n\t\tstate.blocks.order,\n\t\tstate.blocks.attributes,\n\t]\n);\n\n/**\n * Returns the client ID of the first block in the multi-selection set, or null\n * if there is no multi-selection.\n *\n * @param {Object} state Editor state.\n *\n * @return {?string} First block client ID in the multi-selection set.\n */\nexport function getFirstMultiSelectedBlockClientId( state ) {\n\treturn getMultiSelectedBlockClientIds( state )[ 0 ] || null;\n}\n\n/**\n * Returns the client ID of the last block in the multi-selection set, or null\n * if there is no multi-selection.\n *\n * @param {Object} state Editor state.\n *\n * @return {?string} Last block client ID in the multi-selection set.\n */\nexport function getLastMultiSelectedBlockClientId( state ) {\n\tconst selectedClientIds = getMultiSelectedBlockClientIds( state );\n\treturn selectedClientIds[ selectedClientIds.length - 1 ] || null;\n}\n\n/**\n * Returns true if a multi-selection exists, and the block corresponding to the\n * specified client ID is the first block of the multi-selection set, or false\n * otherwise.\n *\n * @param {Object} state    Editor state.\n * @param {string} clientId Block client ID.\n *\n * @return {boolean} Whether block is first in multi-selection.\n */\nexport function isFirstMultiSelectedBlock( state, clientId ) {\n\treturn getFirstMultiSelectedBlockClientId( state ) === clientId;\n}\n\n/**\n * Returns true if the client ID occurs within the block multi-selection, or\n * false otherwise.\n *\n * @param {Object} state    Editor state.\n * @param {string} clientId Block client ID.\n *\n * @return {boolean} Whether block is in multi-selection set.\n */\nexport function isBlockMultiSelected( state, clientId ) {\n\treturn getMultiSelectedBlockClientIds( state ).indexOf( clientId ) !== -1;\n}\n\n/**\n * Returns true if an ancestor of the block is multi-selected, or false\n * otherwise.\n *\n * @param {Object} state    Editor state.\n * @param {string} clientId Block client ID.\n *\n * @return {boolean} Whether an ancestor of the block is in multi-selection\n *                   set.\n */\nexport const isAncestorMultiSelected = createSelector(\n\t( state, clientId ) => {\n\t\tlet ancestorClientId = clientId;\n\t\tlet isMultiSelected = false;\n\t\twhile ( ancestorClientId && ! isMultiSelected ) {\n\t\t\tancestorClientId = getBlockRootClientId( state, ancestorClientId );\n\t\t\tisMultiSelected = isBlockMultiSelected( state, ancestorClientId );\n\t\t}\n\t\treturn isMultiSelected;\n\t},\n\t( state ) => [\n\t\tstate.blocks.order,\n\t\tstate.selection.selectionStart.clientId,\n\t\tstate.selection.selectionEnd.clientId,\n\t]\n);\n\n/**\n * Returns the client ID of the block which begins the multi-selection set, or\n * null if there is no multi-selection.\n *\n * This is not necessarily the first client ID in the selection.\n *\n * @see getFirstMultiSelectedBlockClientId\n *\n * @param {Object} state Editor state.\n *\n * @return {?string} Client ID of block beginning multi-selection.\n */\nexport function getMultiSelectedBlocksStartClientId( state ) {\n\tconst { selectionStart, selectionEnd } = state.selection;\n\n\tif ( selectionStart.clientId === selectionEnd.clientId ) {\n\t\treturn null;\n\t}\n\n\treturn selectionStart.clientId || null;\n}\n\n/**\n * Returns the client ID of the block which ends the multi-selection set, or\n * null if there is no multi-selection.\n *\n * This is not necessarily the last client ID in the selection.\n *\n * @see getLastMultiSelectedBlockClientId\n *\n * @param {Object} state Editor state.\n *\n * @return {?string} Client ID of block ending multi-selection.\n */\nexport function getMultiSelectedBlocksEndClientId( state ) {\n\tconst { selectionStart, selectionEnd } = state.selection;\n\n\tif ( selectionStart.clientId === selectionEnd.clientId ) {\n\t\treturn null;\n\t}\n\n\treturn selectionEnd.clientId || null;\n}\n\n/**\n * Returns true if the selection is not partial.\n *\n * @param {Object} state Editor state.\n *\n * @return {boolean} Whether the selection is mergeable.\n */\nexport function __unstableIsFullySelected( state ) {\n\tconst selectionAnchor = getSelectionStart( state );\n\tconst selectionFocus = getSelectionEnd( state );\n\treturn (\n\t\t! selectionAnchor.attributeKey &&\n\t\t! selectionFocus.attributeKey &&\n\t\ttypeof selectionAnchor.offset === 'undefined' &&\n\t\ttypeof selectionFocus.offset === 'undefined'\n\t);\n}\n\n/**\n * Returns true if the selection is collapsed.\n *\n * @param {Object} state Editor state.\n *\n * @return {boolean} Whether the selection is collapsed.\n */\nexport function __unstableIsSelectionCollapsed( state ) {\n\tconst selectionAnchor = getSelectionStart( state );\n\tconst selectionFocus = getSelectionEnd( state );\n\treturn (\n\t\t!! selectionAnchor &&\n\t\t!! selectionFocus &&\n\t\tselectionAnchor.clientId === selectionFocus.clientId &&\n\t\tselectionAnchor.attributeKey === selectionFocus.attributeKey &&\n\t\tselectionAnchor.offset === selectionFocus.offset\n\t);\n}\n\nexport function __unstableSelectionHasUnmergeableBlock( state ) {\n\treturn getSelectedBlockClientIds( state ).some( ( clientId ) => {\n\t\tconst blockName = getBlockName( state, clientId );\n\t\tconst blockType = getBlockType( blockName );\n\t\treturn ! blockType.merge;\n\t} );\n}\n\n/**\n * Check whether the selection is mergeable.\n *\n * @param {Object}  state     Editor state.\n * @param {boolean} isForward Whether to merge forwards.\n *\n * @return {boolean} Whether the selection is mergeable.\n */\nexport function __unstableIsSelectionMergeable( state, isForward ) {\n\tconst selectionAnchor = getSelectionStart( state );\n\tconst selectionFocus = getSelectionEnd( state );\n\n\t// It's not mergeable if the start and end are within the same block.\n\tif ( selectionAnchor.clientId === selectionFocus.clientId ) {\n\t\treturn false;\n\t}\n\n\t// It's not mergeable if there's no rich text selection.\n\tif (\n\t\t! selectionAnchor.attributeKey ||\n\t\t! selectionFocus.attributeKey ||\n\t\ttypeof selectionAnchor.offset === 'undefined' ||\n\t\ttypeof selectionFocus.offset === 'undefined'\n\t) {\n\t\treturn false;\n\t}\n\n\tconst anchorRootClientId = getBlockRootClientId(\n\t\tstate,\n\t\tselectionAnchor.clientId\n\t);\n\tconst focusRootClientId = getBlockRootClientId(\n\t\tstate,\n\t\tselectionFocus.clientId\n\t);\n\n\t// It's not mergeable if the selection doesn't start and end in the same\n\t// block list. Maybe in the future it should be allowed.\n\tif ( anchorRootClientId !== focusRootClientId ) {\n\t\treturn false;\n\t}\n\n\tconst blockOrder = getBlockOrder( state, anchorRootClientId );\n\tconst anchorIndex = blockOrder.indexOf( selectionAnchor.clientId );\n\tconst focusIndex = blockOrder.indexOf( selectionFocus.clientId );\n\n\t// Reassign selection start and end based on order.\n\tlet selectionStart, selectionEnd;\n\n\tif ( anchorIndex > focusIndex ) {\n\t\tselectionStart = selectionFocus;\n\t\tselectionEnd = selectionAnchor;\n\t} else {\n\t\tselectionStart = selectionAnchor;\n\t\tselectionEnd = selectionFocus;\n\t}\n\n\tconst targetBlockClientId = isForward\n\t\t? selectionEnd.clientId\n\t\t: selectionStart.clientId;\n\tconst blockToMergeClientId = isForward\n\t\t? selectionStart.clientId\n\t\t: selectionEnd.clientId;\n\n\tconst targetBlockName = getBlockName( state, targetBlockClientId );\n\tconst targetBlockType = getBlockType( targetBlockName );\n\n\tif ( ! targetBlockType.merge ) {\n\t\treturn false;\n\t}\n\n\tconst blockToMerge = getBlock( state, blockToMergeClientId );\n\n\t// It's mergeable if the blocks are of the same type.\n\tif ( blockToMerge.name === targetBlockName ) {\n\t\treturn true;\n\t}\n\n\t// If the blocks are of a different type, try to transform the block being\n\t// merged into the same type of block.\n\tconst blocksToMerge = switchToBlockType( blockToMerge, targetBlockName );\n\n\treturn blocksToMerge && blocksToMerge.length;\n}\n\n/**\n * Get partial selected blocks with their content updated\n * based on the selection.\n *\n * @param {Object} state Editor state.\n *\n * @return {Object[]} Updated partial selected blocks.\n */\nexport const __unstableGetSelectedBlocksWithPartialSelection = ( state ) => {\n\tconst selectionAnchor = getSelectionStart( state );\n\tconst selectionFocus = getSelectionEnd( state );\n\n\tif ( selectionAnchor.clientId === selectionFocus.clientId ) {\n\t\treturn EMPTY_ARRAY;\n\t}\n\n\t// Can't split if the selection is not set.\n\tif (\n\t\t! selectionAnchor.attributeKey ||\n\t\t! selectionFocus.attributeKey ||\n\t\ttypeof selectionAnchor.offset === 'undefined' ||\n\t\ttypeof selectionFocus.offset === 'undefined'\n\t) {\n\t\treturn EMPTY_ARRAY;\n\t}\n\n\tconst anchorRootClientId = getBlockRootClientId(\n\t\tstate,\n\t\tselectionAnchor.clientId\n\t);\n\tconst focusRootClientId = getBlockRootClientId(\n\t\tstate,\n\t\tselectionFocus.clientId\n\t);\n\n\t// It's not splittable if the selection doesn't start and end in the same\n\t// block list. Maybe in the future it should be allowed.\n\tif ( anchorRootClientId !== focusRootClientId ) {\n\t\treturn EMPTY_ARRAY;\n\t}\n\n\tconst blockOrder = getBlockOrder( state, anchorRootClientId );\n\tconst anchorIndex = blockOrder.indexOf( selectionAnchor.clientId );\n\tconst focusIndex = blockOrder.indexOf( selectionFocus.clientId );\n\n\t// Reassign selection start and end based on order.\n\tconst [ selectionStart, selectionEnd ] =\n\t\tanchorIndex > focusIndex\n\t\t\t? [ selectionFocus, selectionAnchor ]\n\t\t\t: [ selectionAnchor, selectionFocus ];\n\n\tconst blockA = getBlock( state, selectionStart.clientId );\n\tconst blockB = getBlock( state, selectionEnd.clientId );\n\n\tconst htmlA = blockA.attributes[ selectionStart.attributeKey ];\n\tconst htmlB = blockB.attributes[ selectionEnd.attributeKey ];\n\n\tlet valueA = create( { html: htmlA } );\n\tlet valueB = create( { html: htmlB } );\n\n\tvalueA = remove( valueA, 0, selectionStart.offset );\n\tvalueB = remove( valueB, selectionEnd.offset, valueB.text.length );\n\n\treturn [\n\t\t{\n\t\t\t...blockA,\n\t\t\tattributes: {\n\t\t\t\t...blockA.attributes,\n\t\t\t\t[ selectionStart.attributeKey ]: toHTMLString( {\n\t\t\t\t\tvalue: valueA,\n\t\t\t\t} ),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t...blockB,\n\t\t\tattributes: {\n\t\t\t\t...blockB.attributes,\n\t\t\t\t[ selectionEnd.attributeKey ]: toHTMLString( {\n\t\t\t\t\tvalue: valueB,\n\t\t\t\t} ),\n\t\t\t},\n\t\t},\n\t];\n};\n\n/**\n * Returns an array containing all block client IDs in the editor in the order\n * they appear. Optionally accepts a root client ID of the block list for which\n * the order should be returned, defaulting to the top-level block order.\n *\n * @param {Object}  state        Editor state.\n * @param {?string} rootClientId Optional root client ID of block list.\n *\n * @return {Array} Ordered client IDs of editor blocks.\n */\nexport function getBlockOrder( state, rootClientId ) {\n\treturn state.blocks.order.get( rootClientId || '' ) || EMPTY_ARRAY;\n}\n\n/**\n * Returns the index at which the block corresponding to the specified client\n * ID occurs within the block order, or `-1` if the block does not exist.\n *\n * @param {Object} state    Editor state.\n * @param {string} clientId Block client ID.\n *\n * @return {number} Index at which block exists in order.\n */\nexport function getBlockIndex( state, clientId ) {\n\tconst rootClientId = getBlockRootClientId( state, clientId );\n\treturn getBlockOrder( state, rootClientId ).indexOf( clientId );\n}\n\n/**\n * Returns true if the block corresponding to the specified client ID is\n * currently selected and no multi-selection exists, or false otherwise.\n *\n * @param {Object} state    Editor state.\n * @param {string} clientId Block client ID.\n *\n * @return {boolean} Whether block is selected and multi-selection exists.\n */\nexport function isBlockSelected( state, clientId ) {\n\tconst { selectionStart, selectionEnd } = state.selection;\n\n\tif ( selectionStart.clientId !== selectionEnd.clientId ) {\n\t\treturn false;\n\t}\n\n\treturn selectionStart.clientId === clientId;\n}\n\n/**\n * Returns true if one of the block's inner blocks is selected.\n *\n * @param {Object}  state    Editor state.\n * @param {string}  clientId Block client ID.\n * @param {boolean} deep     Perform a deep check.\n *\n * @return {boolean} Whether the block has an inner block selected\n */\nexport function hasSelectedInnerBlock( state, clientId, deep = false ) {\n\tconst selectedBlockClientIds = getSelectedBlockClientIds( state );\n\n\tif ( ! selectedBlockClientIds.length ) {\n\t\treturn false;\n\t}\n\n\tif ( deep ) {\n\t\treturn selectedBlockClientIds.some( ( id ) =>\n\t\t\t// Pass true because we don't care about order and it's more\n\t\t\t// performant.\n\t\t\tgetBlockParents( state, id, true ).includes( clientId )\n\t\t);\n\t}\n\n\treturn selectedBlockClientIds.some(\n\t\t( id ) => getBlockRootClientId( state, id ) === clientId\n\t);\n}\n\n/**\n * Returns true if one of the block's inner blocks is dragged.\n *\n * @param {Object}  state    Editor state.\n * @param {string}  clientId Block client ID.\n * @param {boolean} deep     Perform a deep check.\n *\n * @return {boolean} Whether the block has an inner block dragged\n */\nexport function hasDraggedInnerBlock( state, clientId, deep = false ) {\n\treturn getBlockOrder( state, clientId ).some(\n\t\t( innerClientId ) =>\n\t\t\tisBlockBeingDragged( state, innerClientId ) ||\n\t\t\t( deep && hasDraggedInnerBlock( state, innerClientId, deep ) )\n\t);\n}\n\n/**\n * Returns true if the block corresponding to the specified client ID is\n * currently selected but isn't the last of the selected blocks. Here \"last\"\n * refers to the block sequence in the document, _not_ the sequence of\n * multi-selection, which is why `state.selectionEnd` isn't used.\n *\n * @param {Object} state    Editor state.\n * @param {string} clientId Block client ID.\n *\n * @return {boolean} Whether block is selected and not the last in the\n *                   selection.\n */\nexport function isBlockWithinSelection( state, clientId ) {\n\tif ( ! clientId ) {\n\t\treturn false;\n\t}\n\n\tconst clientIds = getMultiSelectedBlockClientIds( state );\n\tconst index = clientIds.indexOf( clientId );\n\treturn index > -1 && index < clientIds.length - 1;\n}\n\n/**\n * Returns true if a multi-selection has been made, or false otherwise.\n *\n * @param {Object} state Editor state.\n *\n * @return {boolean} Whether multi-selection has been made.\n */\nexport function hasMultiSelection( state ) {\n\tconst { selectionStart, selectionEnd } = state.selection;\n\treturn selectionStart.clientId !== selectionEnd.clientId;\n}\n\n/**\n * Whether in the process of multi-selecting or not. This flag is only true\n * while the multi-selection is being selected (by mouse move), and is false\n * once the multi-selection has been settled.\n *\n * @see hasMultiSelection\n *\n * @param {Object} state Global application state.\n *\n * @return {boolean} True if multi-selecting, false if not.\n */\nexport function isMultiSelecting( state ) {\n\treturn state.isMultiSelecting;\n}\n\n/**\n * Selector that returns if multi-selection is enabled or not.\n *\n * @param {Object} state Global application state.\n *\n * @return {boolean} True if it should be possible to multi-select blocks, false if multi-selection is disabled.\n */\nexport function isSelectionEnabled( state ) {\n\treturn state.isSelectionEnabled;\n}\n\n/**\n * Returns the block's editing mode, defaulting to \"visual\" if not explicitly\n * assigned.\n *\n * @param {Object} state    Editor state.\n * @param {string} clientId Block client ID.\n *\n * @return {Object} Block editing mode.\n */\nexport function getBlockMode( state, clientId ) {\n\treturn state.blocksMode[ clientId ] || 'visual';\n}\n\n/**\n * Returns true if the user is typing, or false otherwise.\n *\n * @param {Object} state Global application state.\n *\n * @return {boolean} Whether user is typing.\n */\nexport function isTyping( state ) {\n\treturn state.isTyping;\n}\n\n/**\n * Returns true if the user is dragging blocks, or false otherwise.\n *\n * @param {Object} state Global application state.\n *\n * @return {boolean} Whether user is dragging blocks.\n */\nexport function isDraggingBlocks( state ) {\n\treturn !! state.draggedBlocks.length;\n}\n\n/**\n * Returns the client ids of any blocks being directly dragged.\n *\n * This does not include children of a parent being dragged.\n *\n * @param {Object} state Global application state.\n *\n * @return {string[]} Array of dragged block client ids.\n */\nexport function getDraggedBlockClientIds( state ) {\n\treturn state.draggedBlocks;\n}\n\n/**\n * Returns whether the block is being dragged.\n *\n * Only returns true if the block is being directly dragged,\n * not if the block is a child of a parent being dragged.\n * See `isAncestorBeingDragged` for child blocks.\n *\n * @param {Object} state    Global application state.\n * @param {string} clientId Client id for block to check.\n *\n * @return {boolean} Whether the block is being dragged.\n */\nexport function isBlockBeingDragged( state, clientId ) {\n\treturn state.draggedBlocks.includes( clientId );\n}\n\n/**\n * Returns whether a parent/ancestor of the block is being dragged.\n *\n * @param {Object} state    Global application state.\n * @param {string} clientId Client id for block to check.\n *\n * @return {boolean} Whether the block's ancestor is being dragged.\n */\nexport function isAncestorBeingDragged( state, clientId ) {\n\t// Return early if no blocks are being dragged rather than\n\t// the more expensive check for parents.\n\tif ( ! isDraggingBlocks( state ) ) {\n\t\treturn false;\n\t}\n\n\tconst parents = getBlockParents( state, clientId );\n\treturn parents.some( ( parentClientId ) =>\n\t\tisBlockBeingDragged( state, parentClientId )\n\t);\n}\n\n/**\n * Returns true if the caret is within formatted text, or false otherwise.\n *\n * @deprecated\n *\n * @return {boolean} Whether the caret is within formatted text.\n */\nexport function isCaretWithinFormattedText() {\n\tdeprecated(\n\t\t'wp.data.select( \"core/block-editor\" ).isCaretWithinFormattedText',\n\t\t{\n\t\t\tsince: '6.1',\n\t\t\tversion: '6.3',\n\t\t}\n\t);\n\n\treturn false;\n}\n\n/**\n * Returns the location of the insertion cue. Defaults to the last index.\n *\n * @param {Object} state Editor state.\n *\n * @return {Object} Insertion point object with `rootClientId`, `index`.\n */\nexport const getBlockInsertionPoint = createSelector(\n\t( state ) => {\n\t\tlet rootClientId, index;\n\n\t\tconst {\n\t\t\tinsertionCue,\n\t\t\tselection: { selectionEnd },\n\t\t} = state;\n\t\tif ( insertionCue !== null ) {\n\t\t\treturn insertionCue;\n\t\t}\n\n\t\tconst { clientId } = selectionEnd;\n\n\t\tif ( clientId ) {\n\t\t\trootClientId = getBlockRootClientId( state, clientId ) || undefined;\n\t\t\tindex = getBlockIndex( state, selectionEnd.clientId ) + 1;\n\t\t} else {\n\t\t\tindex = getBlockOrder( state ).length;\n\t\t}\n\n\t\treturn { rootClientId, index };\n\t},\n\t( state ) => [\n\t\tstate.insertionCue,\n\t\tstate.selection.selectionEnd.clientId,\n\t\tstate.blocks.parents,\n\t\tstate.blocks.order,\n\t]\n);\n\n/**\n * Returns true if the block insertion point is visible.\n *\n * @param {Object} state Global application state.\n *\n * @return {?boolean} Whether the insertion point is visible or not.\n */\nexport function isBlockInsertionPointVisible( state ) {\n\treturn state.insertionCue !== null;\n}\n\n/**\n * Returns whether the blocks matches the template or not.\n *\n * @param {boolean} state\n * @return {?boolean} Whether the template is valid or not.\n */\nexport function isValidTemplate( state ) {\n\treturn state.template.isValid;\n}\n\n/**\n * Returns the defined block template\n *\n * @param {boolean} state\n *\n * @return {?Array} Block Template.\n */\nexport function getTemplate( state ) {\n\treturn state.settings.template;\n}\n\n/**\n * Returns the defined block template lock. Optionally accepts a root block\n * client ID as context, otherwise defaulting to the global context.\n *\n * @param {Object}  state        Editor state.\n * @param {?string} rootClientId Optional block root client ID.\n *\n * @return {string|false} Block Template Lock\n */\nexport function getTemplateLock( state, rootClientId ) {\n\tif ( ! rootClientId ) {\n\t\treturn state.settings.templateLock ?? false;\n\t}\n\n\tconst blockListTemplateLock = getBlockListSettings(\n\t\tstate,\n\t\trootClientId\n\t)?.templateLock;\n\n\t// If this is a contentOnly template locked block that's in the process\n\t// of being edited, consider the template lock as temporarily inactive.\n\tif (\n\t\tblockListTemplateLock === 'contentOnly' &&\n\t\tstate.editedContentOnlySection === rootClientId\n\t) {\n\t\treturn false;\n\t}\n\n\treturn blockListTemplateLock ?? false;\n}\n\n/**\n * Determines if the given block type is visible in the inserter.\n * Note that this is different than whether a block is allowed to be inserted.\n * In some cases, the block is not allowed in a given position but\n * it should still be visible in the inserter to be able to add it\n * to a different position.\n *\n * @param {Object}        state           Editor state.\n * @param {string|Object} blockNameOrType The block type object, e.g., the response\n *                                        from the block directory; or a string name of\n *                                        an installed block type, e.g.' core/paragraph'.\n * @param {?string}       rootClientId    Optional root client ID of block list.\n *\n * @return {boolean} Whether the given block type is allowed to be inserted.\n */\nconst isBlockVisibleInTheInserter = (\n\tstate,\n\tblockNameOrType,\n\trootClientId = null\n) => {\n\tlet blockType;\n\tlet blockName;\n\n\tif ( blockNameOrType && 'object' === typeof blockNameOrType ) {\n\t\tblockType = blockNameOrType;\n\t\tblockName = blockNameOrType.name;\n\t} else {\n\t\tblockType = getBlockType( blockNameOrType );\n\t\tblockName = blockNameOrType;\n\t}\n\n\tif ( ! blockType ) {\n\t\treturn false;\n\t}\n\n\tconst { allowedBlockTypes } = getSettings( state );\n\n\tconst isBlockAllowedInEditor = checkAllowList(\n\t\tallowedBlockTypes,\n\t\tblockName,\n\t\ttrue\n\t);\n\tif ( ! isBlockAllowedInEditor ) {\n\t\treturn false;\n\t}\n\n\t// If parent blocks are not visible, child blocks should be hidden too.\n\tconst parents = (\n\t\tArray.isArray( blockType.parent ) ? blockType.parent : []\n\t).concat( Array.isArray( blockType.ancestor ) ? blockType.ancestor : [] );\n\tif ( parents.length > 0 ) {\n\t\t// This is an exception to the rule that says that all blocks are visible in the inserter.\n\t\t// Blocks that require a given parent or ancestor are only visible if we're within that parent.\n\t\tif ( parents.includes( 'core/post-content' ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tlet current = rootClientId;\n\t\tlet hasParent = false;\n\t\tdo {\n\t\t\tif ( parents.includes( getBlockName( state, current ) ) ) {\n\t\t\t\thasParent = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcurrent = state.blocks.parents.get( current );\n\t\t} while ( current );\n\n\t\treturn hasParent;\n\t}\n\n\treturn true;\n};\n\n/**\n * Determines if the given block type is allowed to be inserted into the block list.\n * This function is not exported and not memoized because using a memoized selector\n * inside another memoized selector is just a waste of time.\n *\n * @param {Object}        state        Editor state.\n * @param {string|Object} blockName    The block type object, e.g., the response\n *                                     from the block directory; or a string name of\n *                                     an installed block type, e.g.' core/paragraph'.\n * @param {?string}       rootClientId Optional root client ID of block list.\n *\n * @return {boolean} Whether the given block type is allowed to be inserted.\n */\nconst canInsertBlockTypeUnmemoized = (\n\tstate,\n\tblockName,\n\trootClientId = null\n) => {\n\t// Disable insertion in preview mode.\n\tif ( state.settings.isPreviewMode ) {\n\t\treturn false;\n\t}\n\n\tif ( ! isBlockVisibleInTheInserter( state, blockName, rootClientId ) ) {\n\t\treturn false;\n\t}\n\n\tlet blockType;\n\tif ( blockName && 'object' === typeof blockName ) {\n\t\tblockType = blockName;\n\t\tblockName = blockType.name;\n\t} else {\n\t\tblockType = getBlockType( blockName );\n\t}\n\n\tconst rootTemplateLock = getTemplateLock( state, rootClientId );\n\tif ( rootTemplateLock && rootTemplateLock !== 'contentOnly' ) {\n\t\treturn false;\n\t}\n\n\tconst blockEditingMode = getBlockEditingMode( state, rootClientId ?? '' );\n\n\t// Compute section context early so the disabled check below can use it.\n\tconst isParentSectionBlock = !! isSectionBlock( state, rootClientId );\n\tconst sectionClientId = isParentSectionBlock\n\t\t? rootClientId\n\t\t: getParentSectionBlock( state, rootClientId );\n\tconst isWithinSection = !! sectionClientId;\n\n\t// Disabled containers reject all blocks, with one exception: within a\n\t// section, the default block (paragraph) is allowed through so it can\n\t// reach the content-insertion logic further down (lines 1748-1772)\n\t// which conditionally permits it where a sibling paragraph exists.\n\tif (\n\t\tblockEditingMode === 'disabled' &&\n\t\t( ! isWithinSection || blockName !== getDefaultBlockName() )\n\t) {\n\t\treturn false;\n\t}\n\n\tconst parentBlockListSettings = getBlockListSettings( state, rootClientId );\n\n\t// The parent block doesn't have settings indicating it doesn't support\n\t// inner blocks, return false.\n\tif ( rootClientId && parentBlockListSettings === undefined ) {\n\t\treturn false;\n\t}\n\n\t// It shouldn't be possible to insert inside a section block unless in\n\t// some cases when the block is a content block.\n\tconst isContentRoleBlock = isContentBlock( blockName );\n\tif ( isWithinSection && ! isContentRoleBlock ) {\n\t\treturn false;\n\t}\n\n\t// Don't allow insertion into synced patterns.\n\tif (\n\t\tisWithinSection &&\n\t\tgetBlockName( state, sectionClientId ) === 'core/block'\n\t) {\n\t\treturn false;\n\t}\n\n\t// In content only mode, check if this container allows insertion.\n\t// We need the `isParentSectionBlock` check because section blocks\n\t// (synced patterns, contentOnly groups) have a `getBlockEditingMode`\n\t// of 'default', not 'contentOnly' \u2014 the 'contentOnly' mode is only\n\t// set on their *children*.\n\tif (\n\t\tisWithinSection &&\n\t\t( isParentSectionBlock || blockEditingMode === 'contentOnly' ) &&\n\t\t! isContainerInsertableToInContentOnlyMode(\n\t\t\tstate,\n\t\t\tblockName,\n\t\t\trootClientId\n\t\t)\n\t) {\n\t\tconst defaultBlockName = getDefaultBlockName();\n\t\t// Allow inserting the default block anywhere that another default block already exists\n\t\t// when in contentOnly mode.\n\t\tif ( blockName === defaultBlockName ) {\n\t\t\tconst existingBlocks = getBlockOrder( state, rootClientId );\n\t\t\tconst hasDefaultBlock = existingBlocks.some(\n\t\t\t\t( clientId ) =>\n\t\t\t\t\tgetBlockName( state, clientId ) === defaultBlockName\n\t\t\t);\n\t\t\tif ( ! hasDefaultBlock ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tconst parentName = getBlockName( state, rootClientId );\n\n\tconst parentBlockType = getBlockType( parentName );\n\n\t// Look at the `blockType.allowedBlocks` field to determine whether this is an allowed child block.\n\tconst parentAllowedChildBlocks = parentBlockType?.allowedBlocks;\n\n\tlet hasParentAllowedBlock = checkAllowList(\n\t\tparentAllowedChildBlocks,\n\t\tblockName\n\t);\n\n\t// The `allowedBlocks` block list setting can further limit which blocks are allowed children.\n\tif ( hasParentAllowedBlock !== false ) {\n\t\tconst parentAllowedBlocks = parentBlockListSettings?.allowedBlocks;\n\t\tconst hasParentListAllowedBlock = checkAllowList(\n\t\t\tparentAllowedBlocks,\n\t\t\tblockName\n\t\t);\n\t\t// Never downgrade the result from `true` to `null`\n\t\tif ( hasParentListAllowedBlock !== null ) {\n\t\t\thasParentAllowedBlock = hasParentListAllowedBlock;\n\t\t}\n\t}\n\n\tconst blockAllowedParentBlocks = blockType.parent;\n\tconst hasBlockAllowedParent = checkAllowList(\n\t\tblockAllowedParentBlocks,\n\t\tparentName\n\t);\n\n\tlet hasBlockAllowedAncestor = true;\n\tconst blockAllowedAncestorBlocks = blockType.ancestor;\n\tif ( blockAllowedAncestorBlocks ) {\n\t\tconst ancestors = [\n\t\t\trootClientId,\n\t\t\t...getBlockParents( state, rootClientId ),\n\t\t];\n\n\t\thasBlockAllowedAncestor = ancestors.some( ( ancestorClientId ) =>\n\t\t\tcheckAllowList(\n\t\t\t\tblockAllowedAncestorBlocks,\n\t\t\t\tgetBlockName( state, ancestorClientId )\n\t\t\t)\n\t\t);\n\t}\n\n\tconst canInsert =\n\t\thasBlockAllowedAncestor &&\n\t\t( ( hasParentAllowedBlock === null &&\n\t\t\thasBlockAllowedParent === null ) ||\n\t\t\thasParentAllowedBlock === true ||\n\t\t\thasBlockAllowedParent === true );\n\n\tif ( ! canInsert ) {\n\t\treturn canInsert;\n\t}\n\n\t/**\n\t * This filter is an ad-hoc solution to prevent adding template parts inside post content.\n\t * Conceptually, having a filter inside a selector is bad pattern so this code will be\n\t * replaced by a declarative API that doesn't the following drawbacks:\n\t *\n\t * Filters are not reactive: Upon switching between \"template mode\" and non \"template mode\",\n\t * the filter and selector won't necessarily be executed again. For now, it doesn't matter much\n\t * because you can't switch between the two modes while the inserter stays open.\n\t *\n\t * Filters are global: Once they're defined, they will affect all editor instances and all registries.\n\t * An ideal API would only affect specific editor instances.\n\t */\n\treturn applyFilters(\n\t\t'blockEditor.__unstableCanInsertBlockType',\n\t\tcanInsert,\n\t\tblockType,\n\t\trootClientId,\n\t\t{\n\t\t\t// Pass bound selectors of the current registry. If we're in a nested\n\t\t\t// context, the data will differ from the one selected from the root\n\t\t\t// registry.\n\t\t\tgetBlock: getBlock.bind( null, state ),\n\t\t\tgetBlockParentsByBlockName: getBlockParentsByBlockName.bind(\n\t\t\t\tnull,\n\t\t\t\tstate\n\t\t\t),\n\t\t}\n\t);\n};\n\n/**\n * Determines if the given block type is allowed to be inserted into the block list.\n *\n * @param {Object}  state        Editor state.\n * @param {string}  blockName    The name of the block type, e.g.' core/paragraph'.\n * @param {?string} rootClientId Optional root client ID of block list.\n *\n * @return {boolean} Whether the given block type is allowed to be inserted.\n */\nexport const canInsertBlockType = createRegistrySelector( ( select ) =>\n\tcreateSelector(\n\t\tcanInsertBlockTypeUnmemoized,\n\t\t( state, blockName, rootClientId ) =>\n\t\t\tgetInsertBlockTypeDependants( select )( state, rootClientId )\n\t)\n);\n\n/**\n * Determines if the given blocks are allowed to be inserted into the block\n * list.\n *\n * @param {Object}   state        Editor state.\n * @param {string[]} clientIds    The block client IDs to be inserted.\n * @param {?string}  rootClientId Optional root client ID of block list.\n *\n * @return {boolean} Whether the given blocks are allowed to be inserted.\n */\nexport function canInsertBlocks( state, clientIds, rootClientId = null ) {\n\treturn clientIds.every( ( id ) =>\n\t\tcanInsertBlockType( state, getBlockName( state, id ), rootClientId )\n\t);\n}\n\n/**\n * Determines if the given block is allowed to be deleted.\n *\n * @param {Object} state    Editor state.\n * @param {string} clientId The block client Id.\n *\n * @return {boolean} Whether the given block is allowed to be removed.\n */\nexport function canRemoveBlock( state, clientId ) {\n\t// Disable removal in preview mode.\n\tif ( state.settings.isPreviewMode ) {\n\t\treturn false;\n\t}\n\n\tconst attributes = getBlockAttributes( state, clientId );\n\tif ( attributes === null ) {\n\t\treturn true;\n\t}\n\tif ( attributes.lock?.remove !== undefined ) {\n\t\treturn ! attributes.lock.remove;\n\t}\n\n\tconst rootClientId = getBlockRootClientId( state, clientId );\n\tconst rootTemplateLock = getTemplateLock( state, rootClientId );\n\tif ( rootTemplateLock && rootTemplateLock !== 'contentOnly' ) {\n\t\treturn false;\n\t}\n\n\t// It shouldn't be possible to move in a section block unless in\n\t// some cases when the block is a content block.\n\tconst isParentSectionBlock = !! isSectionBlock( state, rootClientId );\n\tconst sectionClientId = isParentSectionBlock\n\t\t? rootClientId\n\t\t: getParentSectionBlock( state, rootClientId );\n\tconst isWithinSection = !! sectionClientId;\n\tconst isContentRoleBlock = isContentBlock(\n\t\tgetBlockName( state, clientId )\n\t);\n\tif ( isWithinSection && ! isContentRoleBlock ) {\n\t\treturn false;\n\t}\n\n\t// Disallow removal from synced patterns.\n\tif (\n\t\tisWithinSection &&\n\t\tgetBlockName( state, sectionClientId ) === 'core/block'\n\t) {\n\t\treturn false;\n\t}\n\n\tconst rootBlockEditingMode = getBlockEditingMode( state, rootClientId );\n\tconst blockName = getBlockName( state, clientId );\n\tconst defaultBlockName = getDefaultBlockName();\n\n\t// Check if the parent container allows insertion/removal in contentOnly\n\t// mode. We need the `isParentSectionBlock` check because section blocks\n\t// (synced patterns, contentOnly groups) have a `getBlockEditingMode` of\n\t// 'default', not 'contentOnly' \u2014 the 'contentOnly' mode is only set on\n\t// their *children*.\n\tif (\n\t\tisWithinSection &&\n\t\t( isParentSectionBlock ||\n\t\t\tblockName === defaultBlockName ||\n\t\t\trootBlockEditingMode === 'contentOnly' ) &&\n\t\t! isContainerInsertableToInContentOnlyMode(\n\t\t\tstate,\n\t\t\tgetBlockName( state, clientId ),\n\t\t\trootClientId\n\t\t)\n\t) {\n\t\t// Allow removing the default block when other default blocks exist\n\t\t// in contentOnly mode.\n\t\tif ( blockName === defaultBlockName ) {\n\t\t\tconst existingBlocks = getBlockOrder( state, rootClientId );\n\t\t\tconst defaultBlocks = existingBlocks.filter(\n\t\t\t\t( id ) => getBlockName( state, id ) === defaultBlockName\n\t\t\t);\n\t\t\t// Allow removal if there are other default blocks besides this one\n\t\t\tif ( defaultBlocks.length > 1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn rootBlockEditingMode !== 'disabled';\n}\n\n/**\n * Determines if the given blocks are allowed to be removed.\n *\n * @param {Object} state     Editor state.\n * @param {string} clientIds The block client IDs to be removed.\n *\n * @return {boolean} Whether the given blocks are allowed to be removed.\n */\nexport function canRemoveBlocks( state, clientIds ) {\n\treturn clientIds.every( ( clientId ) => canRemoveBlock( state, clientId ) );\n}\n\n/**\n * Determines if the given block is allowed to be moved.\n *\n * @param {Object} state    Editor state.\n * @param {string} clientId The block client Id.\n *\n * @return {boolean} Whether the given block is allowed to be moved.\n */\nexport function canMoveBlock( state, clientId ) {\n\t// Disable moving in preview mode.\n\tif ( state.settings.isPreviewMode ) {\n\t\treturn false;\n\t}\n\n\tconst attributes = getBlockAttributes( state, clientId );\n\tif ( attributes === null ) {\n\t\treturn true;\n\t}\n\tif ( attributes.lock?.move !== undefined ) {\n\t\treturn ! attributes.lock.move;\n\t}\n\n\tconst rootClientId = getBlockRootClientId( state, clientId );\n\tconst rootTemplateLock = getTemplateLock( state, rootClientId );\n\tif ( rootTemplateLock === 'all' ) {\n\t\treturn false;\n\t}\n\n\tconst isBlockWithinSection = !! getParentSectionBlock( state, clientId );\n\tconst isContentRoleBlock = isContentBlock(\n\t\tgetBlockName( state, clientId )\n\t);\n\tif ( isBlockWithinSection && ! isContentRoleBlock ) {\n\t\treturn false;\n\t}\n\n\t// If the block is within a section and the parent is either a section\n\t// block itself or has contentOnly editing mode, check whether the inner\n\t// block should be allowed to move. We need the `isParentSectionBlock`\n\t// check because section blocks (synced patterns, contentOnly groups)\n\t// have a `getBlockEditingMode` of 'default', not 'contentOnly' \u2014 the\n\t// 'contentOnly' mode is only set on their *children*.\n\tconst isParentSectionBlock = !! isSectionBlock( state, rootClientId );\n\tconst rootBlockEditingMode = getBlockEditingMode( state, rootClientId );\n\tif (\n\t\tisBlockWithinSection &&\n\t\t( isParentSectionBlock || rootBlockEditingMode === 'contentOnly' ) &&\n\t\t! isContainerInsertableToInContentOnlyMode(\n\t\t\tstate,\n\t\t\tgetBlockName( state, clientId ),\n\t\t\trootClientId\n\t\t)\n\t) {\n\t\treturn false;\n\t}\n\n\treturn getBlockEditingMode( state, rootClientId ) !== 'disabled';\n}\n\n/**\n * Determines if the given blocks are allowed to be moved.\n *\n * @param {Object} state     Editor state.\n * @param {string} clientIds The block client IDs to be moved.\n *\n * @return {boolean} Whether the given blocks are allowed to be moved.\n */\nexport function canMoveBlocks( state, clientIds ) {\n\treturn clientIds.every( ( clientId ) => canMoveBlock( state, clientId ) );\n}\n\n/**\n * Determines if the given block is allowed to be edited.\n *\n * @param {Object} state    Editor state.\n * @param {string} clientId The block client Id.\n *\n * @return {boolean} Whether the given block is allowed to be edited.\n */\nexport function canEditBlock( state, clientId ) {\n\t// Disable editing in preview mode.\n\tif ( state.settings.isPreviewMode ) {\n\t\treturn false;\n\t}\n\n\tconst attributes = getBlockAttributes( state, clientId );\n\tif ( attributes === null ) {\n\t\treturn true;\n\t}\n\n\tconst { lock } = attributes;\n\n\t// When the edit is true, we cannot edit the block.\n\treturn ! lock?.edit;\n}\n\n/**\n * Determines if the given block type can be locked/unlocked by a user.\n *\n * @param {Object}          state      Editor state.\n * @param {(string|Object)} nameOrType Block name or type object.\n *\n * @return {boolean} Whether a given block type can be locked/unlocked.\n */\nexport function canLockBlockType( state, nameOrType ) {\n\t// Disable locking in preview mode.\n\tif ( state.settings.isPreviewMode ) {\n\t\treturn false;\n\t}\n\n\tif ( ! hasBlockSupport( nameOrType, 'lock', true ) ) {\n\t\treturn false;\n\t}\n\n\t// Use block editor settings as the default value.\n\treturn !! state.settings?.canLockBlocks;\n}\n\n/**\n * Returns information about how recently and frequently a block has been inserted.\n *\n * @param {Object} state Global application state.\n * @param {string} id    A string which identifies the insert, e.g. 'core/block/12'\n *\n * @return {?{ time: number, count: number }} An object containing `time` which is when the last\n *                                            insert occurred as a UNIX epoch, and `count` which is\n *                                            the number of inserts that have occurred.\n */\nfunction getInsertUsage( state, id ) {\n\treturn state.preferences.insertUsage?.[ id ] ?? null;\n}\n\n/**\n * Returns whether we can show a block type in the inserter\n *\n * @param {Object}  state        Global State\n * @param {Object}  blockType    BlockType\n * @param {?string} rootClientId Optional root client ID of block list.\n *\n * @return {boolean} Whether the given block type is allowed to be shown in the inserter.\n */\nconst canIncludeBlockTypeInInserter = ( state, blockType, rootClientId ) => {\n\tif ( ! hasBlockSupport( blockType, 'inserter', true ) ) {\n\t\treturn false;\n\t}\n\n\treturn canInsertBlockTypeUnmemoized( state, blockType.name, rootClientId );\n};\n\n/**\n * Return a function to be used to transform a block variation to an inserter item\n *\n * @param {Object} state Global State\n * @param {Object} item  Denormalized inserter item\n * @return {Function} Function to transform a block variation to inserter item\n */\nconst getItemFromVariation = ( state, item ) => ( variation ) => {\n\tconst variationId = `${ item.id }/${ variation.name }`;\n\tconst { time, count = 0 } = getInsertUsage( state, variationId ) || {};\n\treturn {\n\t\t...item,\n\t\tid: variationId,\n\t\ticon: variation.icon || item.icon,\n\t\ttitle: variation.title || item.title,\n\t\tdescription: variation.description || item.description,\n\t\tcategory: variation.category || item.category,\n\t\t// If `example` is explicitly undefined for the variation, the preview will not be shown.\n\t\texample: variation.hasOwnProperty( 'example' )\n\t\t\t? variation.example\n\t\t\t: item.example,\n\t\tinitialAttributes: {\n\t\t\t...item.initialAttributes,\n\t\t\t...variation.attributes,\n\t\t},\n\t\tinnerBlocks: variation.innerBlocks,\n\t\tkeywords: variation.keywords || item.keywords,\n\t\tfrecency: calculateFrecency( time, count ),\n\t\t// Pass through search-only flag for block-scope variations.\n\t\tisSearchOnly: variation.isSearchOnly,\n\t};\n};\n\n/**\n * Returns the calculated frecency.\n *\n * 'frecency' is a heuristic (https://en.wikipedia.org/wiki/Frecency)\n * that combines block usage frequency and recency.\n *\n * @param {number} time  When the last insert occurred as a UNIX epoch\n * @param {number} count The number of inserts that have occurred.\n *\n * @return {number} The calculated frecency.\n */\nconst calculateFrecency = ( time, count ) => {\n\tif ( ! time ) {\n\t\treturn count;\n\t}\n\t// The selector is cached, which means Date.now() is the last time that the\n\t// relevant state changed. This suits our needs.\n\tconst duration = Date.now() - time;\n\tswitch ( true ) {\n\t\tcase duration < MILLISECONDS_PER_HOUR:\n\t\t\treturn count * 4;\n\t\tcase duration < MILLISECONDS_PER_DAY:\n\t\t\treturn count * 2;\n\t\tcase duration < MILLISECONDS_PER_WEEK:\n\t\t\treturn count / 2;\n\t\tdefault:\n\t\t\treturn count / 4;\n\t}\n};\n\n/**\n * Returns a function that accepts a block type and builds an item to be shown\n * in a specific context. It's used for building items for Inserter and available\n * block Transforms list.\n *\n * @param {Object} state              Editor state.\n * @param {Object} options            Options object for handling the building of a block type.\n * @param {string} options.buildScope The scope for which the item is going to be used.\n * @return {Function} Function returns an item to be shown in a specific context (Inserter|Transforms list).\n */\nconst buildBlockTypeItem =\n\t( state, { buildScope = 'inserter' } ) =>\n\t( blockType ) => {\n\t\tconst id = blockType.name;\n\n\t\tlet isDisabled = false;\n\t\tif ( ! hasBlockSupport( blockType.name, 'multiple', true ) ) {\n\t\t\tisDisabled = getBlocksByClientId(\n\t\t\t\tstate,\n\t\t\t\tgetClientIdsWithDescendants( state )\n\t\t\t).some( ( { name } ) => name === blockType.name );\n\t\t}\n\n\t\tconst { time, count = 0 } = getInsertUsage( state, id ) || {};\n\t\tconst blockItemBase = {\n\t\t\tid,\n\t\t\tname: blockType.name,\n\t\t\ttitle: blockType.title,\n\t\t\ticon: blockType.icon,\n\t\t\tisDisabled,\n\t\t\tfrecency: calculateFrecency( time, count ),\n\t\t};\n\t\tif ( buildScope === 'transform' ) {\n\t\t\treturn blockItemBase;\n\t\t}\n\n\t\tconst inserterVariations = getBlockVariations(\n\t\t\tblockType.name,\n\t\t\t'inserter'\n\t\t);\n\t\tconst blockVariations = getBlockVariations( blockType.name, 'block' );\n\t\tconst allVariations = [\n\t\t\t...inserterVariations,\n\t\t\t// Built-in heading level variations have block scope but allow\n\t\t\t// insertion via slash inserter.\n\t\t\t// See https://github.com/WordPress/gutenberg/issues/74233.\n\t\t\t...blockVariations\n\t\t\t\t.filter(\n\t\t\t\t\t( variation ) =>\n\t\t\t\t\t\tblockType.name === 'core/heading' &&\n\t\t\t\t\t\t[ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' ].includes(\n\t\t\t\t\t\t\tvariation.name\n\t\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\t.map( ( variation ) => ( {\n\t\t\t\t\t...variation,\n\t\t\t\t\tisSearchOnly: true,\n\t\t\t\t} ) ),\n\t\t];\n\t\treturn {\n\t\t\t...blockItemBase,\n\t\t\tinitialAttributes: {},\n\t\t\tdescription: blockType.description,\n\t\t\tcategory: blockType.category,\n\t\t\tkeywords: blockType.keywords,\n\t\t\tparent: blockType.parent,\n\t\t\tancestor: blockType.ancestor,\n\t\t\tvariations: allVariations,\n\t\t\texample: blockType.example,\n\t\t\tutility: 1, // Deprecated.\n\t\t};\n\t};\n\n/**\n * Determines the items that appear in the inserter. Includes both static\n * items (e.g. a regular block type) and dynamic items (e.g. a reusable block).\n *\n * Each item object contains what's necessary to display a button in the\n * inserter and handle its selection.\n *\n * The 'frecency' property is a heuristic (https://en.wikipedia.org/wiki/Frecency)\n * that combines block usage frequency and recency.\n *\n * Items are returned ordered descendingly by their 'utility' and 'frecency'.\n *\n * @param    {Object}   state             Editor state.\n * @param    {?string}  rootClientId      Optional root client ID of block list.\n *\n * @return {WPEditorInserterItem[]} Items that appear in inserter.\n *\n * @typedef {Object} WPEditorInserterItem\n * @property {string}   id                Unique identifier for the item.\n * @property {string}   name              The type of block to create.\n * @property {Object}   initialAttributes Attributes to pass to the newly created block.\n * @property {string}   title             Title of the item, as it appears in the inserter.\n * @property {string}   icon              Dashicon for the item, as it appears in the inserter.\n * @property {string}   category          Block category that the item is associated with.\n * @property {string[]} keywords          Keywords that can be searched to find this item.\n * @property {boolean}  isDisabled        Whether or not the user should be prevented from inserting\n *                                        this item.\n * @property {number}   frecency          Heuristic that combines frequency and recency.\n */\nexport const getInserterItems = createRegistrySelector( ( select ) =>\n\tcreateSelector(\n\t\t( state, rootClientId = null, options = DEFAULT_INSERTER_OPTIONS ) => {\n\t\t\tconst buildReusableBlockInserterItem = ( reusableBlock ) => {\n\t\t\t\tconst icon = ! reusableBlock.wp_pattern_sync_status\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tsrc: symbol,\n\t\t\t\t\t\t\tforeground: 'var(--wp-block-synced-color)',\n\t\t\t\t\t  }\n\t\t\t\t\t: symbol;\n\t\t\t\tconst userPattern = mapUserPattern( reusableBlock );\n\t\t\t\tconst { time, count = 0 } =\n\t\t\t\t\tgetInsertUsage( state, userPattern.name ) || {};\n\t\t\t\tconst frecency = calculateFrecency( time, count );\n\n\t\t\t\treturn {\n\t\t\t\t\tid: userPattern.name,\n\t\t\t\t\tname: 'core/block',\n\t\t\t\t\tinitialAttributes: { ref: reusableBlock.id },\n\t\t\t\t\ttitle: userPattern.title,\n\t\t\t\t\ticon,\n\t\t\t\t\tcategory: 'reusable',\n\t\t\t\t\tkeywords: [ 'reusable' ],\n\t\t\t\t\tisDisabled: false,\n\t\t\t\t\tutility: 1, // Deprecated.\n\t\t\t\t\tfrecency,\n\t\t\t\t\tcontent: userPattern.content,\n\t\t\t\t\tget blocks() {\n\t\t\t\t\t\treturn getParsedPattern( userPattern ).blocks;\n\t\t\t\t\t},\n\t\t\t\t\tsyncStatus: userPattern.syncStatus,\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tconst patternInserterItems = canInsertBlockTypeUnmemoized(\n\t\t\t\tstate,\n\t\t\t\t'core/block',\n\t\t\t\trootClientId\n\t\t\t)\n\t\t\t\t? unlock( select( STORE_NAME ) )\n\t\t\t\t\t\t.getReusableBlocks()\n\t\t\t\t\t\t.map( buildReusableBlockInserterItem )\n\t\t\t\t: [];\n\n\t\t\tconst buildBlockTypeInserterItem = buildBlockTypeItem( state, {\n\t\t\t\tbuildScope: 'inserter',\n\t\t\t} );\n\n\t\t\tlet blockTypeInserterItems = getBlockTypes()\n\t\t\t\t.filter( ( blockType ) =>\n\t\t\t\t\thasBlockSupport( blockType, 'inserter', true )\n\t\t\t\t)\n\t\t\t\t.map( buildBlockTypeInserterItem );\n\n\t\t\tif ( options[ isFiltered ] !== false ) {\n\t\t\t\tblockTypeInserterItems = blockTypeInserterItems.filter(\n\t\t\t\t\t( blockType ) =>\n\t\t\t\t\t\tcanIncludeBlockTypeInInserter(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tblockType,\n\t\t\t\t\t\t\trootClientId\n\t\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst { getClosestAllowedInsertionPoint } = unlock(\n\t\t\t\t\tselect( STORE_NAME )\n\t\t\t\t);\n\t\t\t\tblockTypeInserterItems = blockTypeInserterItems\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t( blockType ) =>\n\t\t\t\t\t\t\tisBlockVisibleInTheInserter(\n\t\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\t\tblockType,\n\t\t\t\t\t\t\t\trootClientId\n\t\t\t\t\t\t\t) &&\n\t\t\t\t\t\t\tgetClosestAllowedInsertionPoint(\n\t\t\t\t\t\t\t\tblockType.name,\n\t\t\t\t\t\t\t\trootClientId\n\t\t\t\t\t\t\t) !== null\n\t\t\t\t\t)\n\t\t\t\t\t.map( ( blockType ) => ( {\n\t\t\t\t\t\t...blockType,\n\t\t\t\t\t\tisAllowedInCurrentRoot: canIncludeBlockTypeInInserter(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tblockType,\n\t\t\t\t\t\t\trootClientId\n\t\t\t\t\t\t),\n\t\t\t\t\t} ) );\n\t\t\t}\n\n\t\t\tconst items = blockTypeInserterItems.reduce(\n\t\t\t\t( accumulator, item ) => {\n\t\t\t\t\tconst { variations = [] } = item;\n\t\t\t\t\t// Exclude any block type item that is to be replaced by a default variation.\n\t\t\t\t\tif ( ! variations.some( ( { isDefault } ) => isDefault ) ) {\n\t\t\t\t\t\taccumulator.push( item );\n\t\t\t\t\t}\n\t\t\t\t\tif ( variations.length ) {\n\t\t\t\t\t\tconst variationMapper = getItemFromVariation(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\titem\n\t\t\t\t\t\t);\n\t\t\t\t\t\taccumulator.push(\n\t\t\t\t\t\t\t...variations.map( variationMapper )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn accumulator;\n\t\t\t\t},\n\t\t\t\t[]\n\t\t\t);\n\n\t\t\t// Ensure core blocks are prioritized in the returned results,\n\t\t\t// because third party blocks can be registered earlier than\n\t\t\t// the core blocks (usually by using the `init` action),\n\t\t\t// thus affecting the display order.\n\t\t\t// We don't sort reusable blocks as they are handled differently.\n\t\t\tconst groupByType = ( blocks, block ) => {\n\t\t\t\tconst { core, noncore } = blocks;\n\t\t\t\tconst type = block.name.startsWith( 'core/' ) ? core : noncore;\n\n\t\t\t\ttype.push( block );\n\t\t\t\treturn blocks;\n\t\t\t};\n\t\t\tconst { core: coreItems, noncore: nonCoreItems } = items.reduce(\n\t\t\t\tgroupByType,\n\t\t\t\t{ core: [], noncore: [] }\n\t\t\t);\n\t\t\tconst sortedBlockTypes = [ ...coreItems, ...nonCoreItems ];\n\t\t\treturn [ ...sortedBlockTypes, ...patternInserterItems ];\n\t\t},\n\t\t( state, rootClientId ) => [\n\t\t\tgetBlockTypes(),\n\t\t\tunlock( select( STORE_NAME ) ).getReusableBlocks(),\n\t\t\tstate.blocks.order,\n\t\t\tstate.preferences.insertUsage,\n\t\t\t...getInsertBlockTypeDependants( select )( state, rootClientId ),\n\t\t]\n\t)\n);\n\n/**\n * Determines the items that appear in the available block transforms list.\n *\n * Each item object contains what's necessary to display a menu item in the\n * transform list and handle its selection.\n *\n * The 'frecency' property is a heuristic (https://en.wikipedia.org/wiki/Frecency)\n * that combines block usage frequency and recency.\n *\n * Items are returned ordered descendingly by their 'frecency'.\n *\n * @param    {Object}          state        Editor state.\n * @param    {Object|Object[]} blocks       Block object or array objects.\n * @param    {?string}         rootClientId Optional root client ID of block list.\n *\n * @return {WPEditorTransformItem[]} Items that appear in inserter.\n *\n * @typedef {Object} WPEditorTransformItem\n * @property {string}          id           Unique identifier for the item.\n * @property {string}          name         The type of block to create.\n * @property {string}          title        Title of the item, as it appears in the inserter.\n * @property {string}          icon         Dashicon for the item, as it appears in the inserter.\n * @property {boolean}         isDisabled   Whether or not the user should be prevented from inserting\n *                                          this item.\n * @property {number}          frecency     Heuristic that combines frequency and recency.\n */\nexport const getBlockTransformItems = createRegistrySelector( ( select ) =>\n\tcreateSelector(\n\t\t( state, blocks, rootClientId = null ) => {\n\t\t\tconst normalizedBlocks = Array.isArray( blocks )\n\t\t\t\t? blocks\n\t\t\t\t: [ blocks ];\n\t\t\tconst buildBlockTypeTransformItem = buildBlockTypeItem( state, {\n\t\t\t\tbuildScope: 'transform',\n\t\t\t} );\n\t\t\tconst blockTypeTransformItems = getBlockTypes()\n\t\t\t\t.filter( ( blockType ) =>\n\t\t\t\t\tcanIncludeBlockTypeInInserter(\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tblockType,\n\t\t\t\t\t\trootClientId\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\t.map( buildBlockTypeTransformItem );\n\n\t\t\tconst itemsByName = Object.fromEntries(\n\t\t\t\tObject.entries( blockTypeTransformItems ).map(\n\t\t\t\t\t( [ , value ] ) => [ value.name, value ]\n\t\t\t\t)\n\t\t\t);\n\n\t\t\tconst possibleTransforms = getPossibleBlockTransformations(\n\t\t\t\tnormalizedBlocks\n\t\t\t).reduce( ( accumulator, block ) => {\n\t\t\t\tif ( itemsByName[ block?.name ] ) {\n\t\t\t\t\taccumulator.push( itemsByName[ block.name ] );\n\t\t\t\t}\n\t\t\t\treturn accumulator;\n\t\t\t}, [] );\n\t\t\treturn orderBy(\n\t\t\t\tpossibleTransforms,\n\t\t\t\t( block ) => itemsByName[ block.name ].frecency,\n\t\t\t\t'desc'\n\t\t\t);\n\t\t},\n\t\t( state, blocks, rootClientId ) => [\n\t\t\tgetBlockTypes(),\n\t\t\tstate.preferences.insertUsage,\n\t\t\t...getInsertBlockTypeDependants( select )( state, rootClientId ),\n\t\t]\n\t)\n);\n\n/**\n * Determines whether there are items to show in the inserter.\n *\n * @param {Object}  state        Editor state.\n * @param {?string} rootClientId Optional root client ID of block list.\n *\n * @return {boolean} Items that appear in inserter.\n */\nexport const hasInserterItems = ( state, rootClientId = null ) => {\n\tconst hasBlockType = getBlockTypes().some( ( blockType ) =>\n\t\tcanIncludeBlockTypeInInserter( state, blockType, rootClientId )\n\t);\n\tif ( hasBlockType ) {\n\t\treturn true;\n\t}\n\tconst hasReusableBlock = canInsertBlockTypeUnmemoized(\n\t\tstate,\n\t\t'core/block',\n\t\trootClientId\n\t);\n\n\treturn hasReusableBlock;\n};\n\n/**\n * Returns the list of allowed inserter blocks for inner blocks children.\n *\n * @param {Object}  state        Editor state.\n * @param {?string} rootClientId Optional root client ID of block list.\n *\n * @return {Array?} The list of allowed block types.\n */\nexport const getAllowedBlocks = createRegistrySelector( ( select ) =>\n\tcreateSelector(\n\t\t( state, rootClientId = null ) => {\n\t\t\tif ( ! rootClientId ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst blockTypes = getBlockTypes().filter( ( blockType ) =>\n\t\t\t\tcanIncludeBlockTypeInInserter( state, blockType, rootClientId )\n\t\t\t);\n\n\t\t\tconst hasReusableBlock = canInsertBlockTypeUnmemoized(\n\t\t\t\tstate,\n\t\t\t\t'core/block',\n\t\t\t\trootClientId\n\t\t\t);\n\n\t\t\tif ( hasReusableBlock ) {\n\t\t\t\tblockTypes.push( 'core/block' );\n\t\t\t}\n\n\t\t\treturn blockTypes;\n\t\t},\n\t\t( state, rootClientId ) => [\n\t\t\tgetBlockTypes(),\n\t\t\t...getInsertBlockTypeDependants( select )( state, rootClientId ),\n\t\t]\n\t)\n);\n\nexport const __experimentalGetAllowedBlocks = createSelector(\n\t( state, rootClientId = null ) => {\n\t\tdeprecated(\n\t\t\t'wp.data.select( \"core/block-editor\" ).__experimentalGetAllowedBlocks',\n\t\t\t{\n\t\t\t\talternative:\n\t\t\t\t\t'wp.data.select( \"core/block-editor\" ).getAllowedBlocks',\n\t\t\t\tsince: '6.2',\n\t\t\t\tversion: '6.4',\n\t\t\t}\n\t\t);\n\t\treturn getAllowedBlocks( state, rootClientId );\n\t},\n\t( state, rootClientId ) =>\n\t\tgetAllowedBlocks.getDependants( state, rootClientId )\n);\n\n/**\n * Returns the block to be directly inserted by the block appender.\n *\n * @param    {Object}         state            Editor state.\n * @param    {?string}        rootClientId     Optional root client ID of block list.\n *\n * @return {WPDirectInsertBlock|undefined}              The block type to be directly inserted.\n *\n * @typedef {Object} WPDirectInsertBlock\n * @property {string}         name             The type of block.\n * @property {?Object}        attributes       Attributes to pass to the newly created block.\n * @property {?Array<string>} attributesToCopy Attributes to be copied from adjacent blocks when inserted.\n */\nexport function getDirectInsertBlock( state, rootClientId = null ) {\n\tif ( ! rootClientId ) {\n\t\treturn;\n\t}\n\tconst { defaultBlock, directInsert } =\n\t\tstate.blockListSettings[ rootClientId ] ?? {};\n\tif ( ! defaultBlock || ! directInsert ) {\n\t\treturn;\n\t}\n\n\treturn defaultBlock;\n}\n\nexport function __experimentalGetDirectInsertBlock(\n\tstate,\n\trootClientId = null\n) {\n\tdeprecated(\n\t\t'wp.data.select( \"core/block-editor\" ).__experimentalGetDirectInsertBlock',\n\t\t{\n\t\t\talternative:\n\t\t\t\t'wp.data.select( \"core/block-editor\" ).getDirectInsertBlock',\n\t\t\tsince: '6.3',\n\t\t\tversion: '6.4',\n\t\t}\n\t);\n\treturn getDirectInsertBlock( state, rootClientId );\n}\n\nexport const __experimentalGetParsedPattern = createRegistrySelector(\n\t( select ) => ( state, patternName ) => {\n\t\tconst pattern = unlock( select( STORE_NAME ) ).getPatternBySlug(\n\t\t\tpatternName\n\t\t);\n\t\treturn pattern ? getParsedPattern( pattern ) : null;\n\t}\n);\n\nconst getAllowedPatternsDependants = ( select ) => ( state, rootClientId ) => [\n\t...getAllPatternsDependants( select )( state ),\n\t...getInsertBlockTypeDependants( select )( state, rootClientId ),\n];\n\nconst patternsWithParsedBlocks = new WeakMap();\nfunction enhancePatternWithParsedBlocks( pattern ) {\n\tlet enhancedPattern = patternsWithParsedBlocks.get( pattern );\n\tif ( ! enhancedPattern ) {\n\t\tenhancedPattern = {\n\t\t\t...pattern,\n\t\t\tget blocks() {\n\t\t\t\treturn getParsedPattern( pattern ).blocks;\n\t\t\t},\n\t\t};\n\t\tpatternsWithParsedBlocks.set( pattern, enhancedPattern );\n\t}\n\treturn enhancedPattern;\n}\n\n/**\n * Returns the list of allowed patterns for inner blocks children.\n *\n * @param {Object}  state        Editor state.\n * @param {?string} rootClientId Optional target root client ID.\n *\n * @return {Array?} The list of allowed patterns.\n */\nexport const __experimentalGetAllowedPatterns = createRegistrySelector(\n\t( select ) => {\n\t\treturn createSelector(\n\t\t\t(\n\t\t\t\tstate,\n\t\t\t\trootClientId = null,\n\t\t\t\toptions = DEFAULT_INSERTER_OPTIONS\n\t\t\t) => {\n\t\t\t\tconst { getAllPatterns } = unlock( select( STORE_NAME ) );\n\t\t\t\tconst patterns = getAllPatterns();\n\t\t\t\tconst { allowedBlockTypes } = getSettings( state );\n\t\t\t\tconst parsedPatterns = patterns\n\t\t\t\t\t.filter( ( { inserter = true } ) => !! inserter )\n\t\t\t\t\t.map( enhancePatternWithParsedBlocks );\n\n\t\t\t\tconst availableParsedPatterns = parsedPatterns.filter(\n\t\t\t\t\t( pattern ) =>\n\t\t\t\t\t\tcheckAllowListRecursive(\n\t\t\t\t\t\t\tgetGrammar( pattern ),\n\t\t\t\t\t\t\tallowedBlockTypes\n\t\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\tconst patternsAllowed = availableParsedPatterns.filter(\n\t\t\t\t\t( pattern ) =>\n\t\t\t\t\t\tgetGrammar( pattern ).every( ( { blockName: name } ) =>\n\t\t\t\t\t\t\toptions[ isFiltered ] !== false\n\t\t\t\t\t\t\t\t? canInsertBlockType(\n\t\t\t\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\t\trootClientId\n\t\t\t\t\t\t\t\t  )\n\t\t\t\t\t\t\t\t: isBlockVisibleInTheInserter(\n\t\t\t\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\t\trootClientId\n\t\t\t\t\t\t\t\t  )\n\t\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\treturn patternsAllowed;\n\t\t\t},\n\t\t\tgetAllowedPatternsDependants( select )\n\t\t);\n\t}\n);\n\n/**\n * Returns the list of patterns based on their declared `blockTypes`\n * and a block's name.\n * Patterns can use `blockTypes` to integrate in work flows like\n * suggesting appropriate patterns in a Placeholder state(during insertion)\n * or blocks transformations.\n *\n * @param {Object}          state        Editor state.\n * @param {string|string[]} blockNames   Block's name or array of block names to find matching patterns.\n * @param {?string}         rootClientId Optional target root client ID.\n *\n * @return {Array} The list of matched block patterns based on declared `blockTypes` and block name.\n */\nexport const getPatternsByBlockTypes = createRegistrySelector( ( select ) =>\n\tcreateSelector(\n\t\t( state, blockNames, rootClientId = null ) => {\n\t\t\tif ( ! blockNames ) {\n\t\t\t\treturn EMPTY_ARRAY;\n\t\t\t}\n\t\t\tconst patterns =\n\t\t\t\tselect( STORE_NAME ).__experimentalGetAllowedPatterns(\n\t\t\t\t\trootClientId\n\t\t\t\t);\n\t\t\tconst normalizedBlockNames = Array.isArray( blockNames )\n\t\t\t\t? blockNames\n\t\t\t\t: [ blockNames ];\n\t\t\tconst filteredPatterns = patterns.filter( ( pattern ) =>\n\t\t\t\tpattern?.blockTypes?.some?.( ( blockName ) =>\n\t\t\t\t\tnormalizedBlockNames.includes( blockName )\n\t\t\t\t)\n\t\t\t);\n\t\t\tif ( filteredPatterns.length === 0 ) {\n\t\t\t\treturn EMPTY_ARRAY;\n\t\t\t}\n\t\t\treturn filteredPatterns;\n\t\t},\n\t\t( state, blockNames, rootClientId ) =>\n\t\t\tgetAllowedPatternsDependants( select )( state, rootClientId )\n\t)\n);\n\nexport const __experimentalGetPatternsByBlockTypes = createRegistrySelector(\n\t( select ) => {\n\t\tdeprecated(\n\t\t\t'wp.data.select( \"core/block-editor\" ).__experimentalGetPatternsByBlockTypes',\n\t\t\t{\n\t\t\t\talternative:\n\t\t\t\t\t'wp.data.select( \"core/block-editor\" ).getPatternsByBlockTypes',\n\t\t\t\tsince: '6.2',\n\t\t\t\tversion: '6.4',\n\t\t\t}\n\t\t);\n\t\treturn select( STORE_NAME ).getPatternsByBlockTypes;\n\t}\n);\n\n/**\n * Determines the items that appear in the available pattern transforms list.\n *\n * For now we only handle blocks without InnerBlocks and take into account\n * the `role` property of blocks' attributes for the transformation.\n *\n * We return the first set of possible eligible block patterns,\n * by checking the `blockTypes` property. We still have to recurse through\n * block pattern's blocks and try to find matches from the selected blocks.\n * Now this happens in the consumer to avoid heavy operations in the selector.\n *\n * @param {Object}   state        Editor state.\n * @param {Object[]} blocks       The selected blocks.\n * @param {?string}  rootClientId Optional root client ID of block list.\n *\n * @return {WPBlockPattern[]} Items that are eligible for a pattern transformation.\n */\nexport const __experimentalGetPatternTransformItems = createRegistrySelector(\n\t( select ) =>\n\t\tcreateSelector(\n\t\t\t( state, blocks, rootClientId = null ) => {\n\t\t\t\tif ( ! blocks ) {\n\t\t\t\t\treturn EMPTY_ARRAY;\n\t\t\t\t}\n\t\t\t\t/**\n\t\t\t\t * For now we only handle blocks without InnerBlocks and take into account\n\t\t\t\t * the `role` property of blocks' attributes for the transformation.\n\t\t\t\t * Note that the blocks have been retrieved through `getBlock`, which doesn't\n\t\t\t\t * return the inner blocks of an inner block controller, so we still need\n\t\t\t\t * to check for this case too.\n\t\t\t\t */\n\t\t\t\tif (\n\t\t\t\t\tblocks.some(\n\t\t\t\t\t\t( { clientId, innerBlocks } ) =>\n\t\t\t\t\t\t\tinnerBlocks.length ||\n\t\t\t\t\t\t\tareInnerBlocksControlled( state, clientId )\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\treturn EMPTY_ARRAY;\n\t\t\t\t}\n\n\t\t\t\t// Create a Set of the selected block names that is used in patterns filtering.\n\t\t\t\tconst selectedBlockNames = Array.from(\n\t\t\t\t\tnew Set( blocks.map( ( { name } ) => name ) )\n\t\t\t\t);\n\t\t\t\t/**\n\t\t\t\t * Here we will return first set of possible eligible block patterns,\n\t\t\t\t * by checking the `blockTypes` property. We still have to recurse through\n\t\t\t\t * block pattern's blocks and try to find matches from the selected blocks.\n\t\t\t\t * Now this happens in the consumer to avoid heavy operations in the selector.\n\t\t\t\t */\n\t\t\t\treturn select( STORE_NAME ).getPatternsByBlockTypes(\n\t\t\t\t\tselectedBlockNames,\n\t\t\t\t\trootClientId\n\t\t\t\t);\n\t\t\t},\n\t\t\t( state, blocks, rootClientId ) =>\n\t\t\t\tgetAllowedPatternsDependants( select )( state, rootClientId )\n\t\t)\n);\n\n/**\n * Returns the Block List settings of a block, if any exist.\n *\n * @param {Object}  state    Editor state.\n * @param {?string} clientId Block client ID.\n *\n * @return {?Object} Block settings of the block if set.\n */\nexport function getBlockListSettings( state, clientId ) {\n\treturn state.blockListSettings[ clientId ];\n}\n\n/**\n * Returns the editor settings.\n *\n * @param {Object} state Editor state.\n *\n * @return {Object} The editor settings object.\n */\nexport function getSettings( state ) {\n\treturn state.settings;\n}\n\n/**\n * Returns true if the most recent block change is be considered persistent, or\n * false otherwise. A persistent change is one committed by BlockEditorProvider\n * via its `onChange` callback, in addition to `onInput`.\n *\n * @param {Object} state Block editor state.\n *\n * @return {boolean} Whether the most recent block change was persistent.\n */\nexport function isLastBlockChangePersistent( state ) {\n\treturn state.blocks.isPersistentChange;\n}\n\n/**\n * Returns the block list settings for an array of blocks, if any exist.\n *\n * @param {Object} state     Editor state.\n * @param {Array}  clientIds Block client IDs.\n *\n * @return {Object} An object where the keys are client ids and the values are\n *                  a block list setting object.\n */\nexport const __experimentalGetBlockListSettingsForBlocks = createSelector(\n\t( state, clientIds = [] ) => {\n\t\treturn clientIds.reduce( ( blockListSettingsForBlocks, clientId ) => {\n\t\t\tif ( ! state.blockListSettings[ clientId ] ) {\n\t\t\t\treturn blockListSettingsForBlocks;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...blockListSettingsForBlocks,\n\t\t\t\t[ clientId ]: state.blockListSettings[ clientId ],\n\t\t\t};\n\t\t}, {} );\n\t},\n\t( state ) => [ state.blockListSettings ]\n);\n\n/**\n * Returns the title of a given reusable block\n *\n * @param {Object}        state Global application state.\n * @param {number|string} ref   The shared block's ID.\n *\n * @return {string} The reusable block saved title.\n */\nexport const __experimentalGetReusableBlockTitle = createRegistrySelector(\n\t( select ) =>\n\t\tcreateSelector(\n\t\t\t( state, ref ) => {\n\t\t\t\tdeprecated(\n\t\t\t\t\t\"wp.data.select( 'core/block-editor' ).__experimentalGetReusableBlockTitle\",\n\t\t\t\t\t{\n\t\t\t\t\t\tsince: '6.6',\n\t\t\t\t\t\tversion: '6.8',\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\tconst reusableBlock = unlock( select( STORE_NAME ) )\n\t\t\t\t\t.getReusableBlocks()\n\t\t\t\t\t.find( ( block ) => block.id === ref );\n\t\t\t\tif ( ! reusableBlock ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn reusableBlock.title?.raw;\n\t\t\t},\n\t\t\t() => [ unlock( select( STORE_NAME ) ).getReusableBlocks() ]\n\t\t)\n);\n\n/**\n * Returns true if the most recent block change is be considered ignored, or\n * false otherwise. An ignored change is one not to be committed by\n * BlockEditorProvider, neither via `onChange` nor `onInput`.\n *\n * @param {Object} state Block editor state.\n *\n * @return {boolean} Whether the most recent block change was ignored.\n */\nexport function __unstableIsLastBlockChangeIgnored( state ) {\n\t// TODO: Removal Plan: Changes incurred by RECEIVE_BLOCKS should not be\n\t// ignored if in-fact they result in a change in blocks state. The current\n\t// need to ignore changes not a result of user interaction should be\n\t// accounted for in the refactoring of reusable blocks as occurring within\n\t// their own separate block editor / state (#7119).\n\treturn state.blocks.isIgnoredChange;\n}\n\n/**\n * Returns the block attributes changed as a result of the last dispatched\n * action.\n *\n * @param {Object} state Block editor state.\n *\n * @return {Object<string,Object>} Subsets of block attributes changed, keyed\n *                                 by block client ID.\n */\nexport function __experimentalGetLastBlockAttributeChanges( state ) {\n\treturn state.lastBlockAttributesChange;\n}\n\n/**\n * Returns whether block moving mode is enabled.\n *\n * @deprecated\n */\nexport function hasBlockMovingClientId() {\n\tdeprecated(\n\t\t'wp.data.select( \"core/block-editor\" ).hasBlockMovingClientId',\n\t\t{\n\t\t\tsince: '6.7',\n\t\t\thint: 'Block moving mode feature has been removed',\n\t\t}\n\t);\n\treturn false;\n}\n\n/**\n * Returns true if the last change was an automatic change, false otherwise.\n *\n * @param {Object} state Global application state.\n *\n * @return {boolean} Whether the last change was automatic.\n */\nexport function didAutomaticChange( state ) {\n\treturn !! state.automaticChangeStatus;\n}\n\n/**\n * Returns true if the current highlighted block matches the block clientId.\n *\n * @param {Object} state    Global application state.\n * @param {string} clientId The block to check.\n *\n * @return {boolean} Whether the block is currently highlighted.\n */\nexport function isBlockHighlighted( state, clientId ) {\n\treturn state.highlightedBlock === clientId;\n}\n\n/**\n * Checks if a given block has controlled inner blocks.\n *\n * @param {Object} state    Global application state.\n * @param {string} clientId The block to check.\n *\n * @return {boolean} True if the block has controlled inner blocks.\n */\nexport function areInnerBlocksControlled( state, clientId ) {\n\treturn !! state.blocks.controlledInnerBlocks[ clientId ];\n}\n\n/**\n * Returns the clientId for the first 'active' block of a given array of block names.\n * A block is 'active' if it (or a child) is the selected block.\n * Returns the first match moving up the DOM from the selected block.\n *\n * @param {Object}   state            Global application state.\n * @param {string[]} validBlocksNames The names of block types to check for.\n *\n * @return {string} The matching block's clientId.\n */\nexport const __experimentalGetActiveBlockIdByBlockNames = createSelector(\n\t( state, validBlockNames ) => {\n\t\tif ( ! validBlockNames.length ) {\n\t\t\treturn null;\n\t\t}\n\t\t// Check if selected block is a valid entity area.\n\t\tconst selectedBlockClientId = getSelectedBlockClientId( state );\n\t\tif (\n\t\t\tvalidBlockNames.includes(\n\t\t\t\tgetBlockName( state, selectedBlockClientId )\n\t\t\t)\n\t\t) {\n\t\t\treturn selectedBlockClientId;\n\t\t}\n\t\t// Check if first selected block is a child of a valid entity area.\n\t\tconst multiSelectedBlockClientIds =\n\t\t\tgetMultiSelectedBlockClientIds( state );\n\t\tconst entityAreaParents = getBlockParentsByBlockName(\n\t\t\tstate,\n\t\t\tselectedBlockClientId || multiSelectedBlockClientIds[ 0 ],\n\t\t\tvalidBlockNames\n\t\t);\n\t\tif ( entityAreaParents ) {\n\t\t\t// Last parent closest/most interior.\n\t\t\treturn entityAreaParents[ entityAreaParents.length - 1 ];\n\t\t}\n\t\treturn null;\n\t},\n\t( state, validBlockNames ) => [\n\t\tstate.selection.selectionStart.clientId,\n\t\tstate.selection.selectionEnd.clientId,\n\t\tvalidBlockNames,\n\t]\n);\n\n/**\n * Tells if the block with the passed clientId was just inserted.\n *\n * @param {Object}  state    Global application state.\n * @param {Object}  clientId Client Id of the block.\n * @param {?string} source   Optional insertion source of the block.\n * @return {boolean} True if the block matches the last block inserted from the specified source.\n */\nexport function wasBlockJustInserted( state, clientId, source ) {\n\tconst { lastBlockInserted } = state;\n\treturn (\n\t\tlastBlockInserted.clientIds?.includes( clientId ) &&\n\t\tlastBlockInserted.source === source\n\t);\n}\n\n/**\n * Tells if the block is visible on the canvas or not.\n *\n * @param {Object} state    Global application state.\n * @param {Object} clientId Client Id of the block.\n * @return {boolean} True if the block is visible.\n */\nexport function isBlockVisible( state, clientId ) {\n\treturn state.blockVisibility?.[ clientId ] ?? true;\n}\n\n/**\n * Returns the currently hovered block.\n *\n * @deprecated\n */\nexport function getHoveredBlockClientId() {\n\tdeprecated(\n\t\t\"wp.data.select( 'core/block-editor' ).getHoveredBlockClientId\",\n\t\t{\n\t\t\tsince: '6.9',\n\t\t\tversion: '7.1',\n\t\t}\n\t);\n\treturn undefined;\n}\n\n/**\n * Returns the list of all hidden blocks.\n *\n * @param {Object} state Global application state.\n * @return {[string]} List of hidden blocks.\n */\nexport const __unstableGetVisibleBlocks = createSelector(\n\t( state ) => {\n\t\tconst visibleBlocks = new Set(\n\t\t\tObject.keys( state.blockVisibility ).filter(\n\t\t\t\t( key ) => state.blockVisibility[ key ]\n\t\t\t)\n\t\t);\n\t\tif ( visibleBlocks.size === 0 ) {\n\t\t\treturn EMPTY_SET;\n\t\t}\n\t\treturn visibleBlocks;\n\t},\n\t( state ) => [ state.blockVisibility ]\n);\n\nexport function __unstableHasActiveBlockOverlayActive( state, clientId ) {\n\t// Prevent overlay on blocks with a non-default editing mode. If the mode is\n\t// 'disabled' then the overlay is redundant since the block can't be\n\t// selected. If the mode is 'contentOnly' then the overlay is redundant\n\t// since there will be no controls to interact with once selected.\n\tif ( getBlockEditingMode( state, clientId ) !== 'default' ) {\n\t\treturn false;\n\t}\n\n\t// If the block editing is locked, the block overlay is always active.\n\tif ( ! canEditBlock( state, clientId ) ) {\n\t\treturn true;\n\t}\n\n\t// In zoom-out mode, the block overlay is always active for section level blocks.\n\tif ( isZoomOut( state ) ) {\n\t\tconst sectionRootClientId = getSectionRootClientId( state );\n\t\tif ( sectionRootClientId ) {\n\t\t\tconst sectionClientIds = getBlockOrder(\n\t\t\t\tstate,\n\t\t\t\tsectionRootClientId\n\t\t\t);\n\t\t\tif ( sectionClientIds?.includes( clientId ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else if ( clientId && ! getBlockRootClientId( state, clientId ) ) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// In navigation mode, the block overlay is active when the block is not\n\t// selected (and doesn't contain a selected child). The same behavior is\n\t// also enabled in all modes for blocks that have controlled children\n\t// (reusable block, template part, navigation), unless explicitly disabled\n\t// with `supports.__experimentalDisableBlockOverlay`.\n\tconst blockSupportDisable = hasBlockSupport(\n\t\tgetBlockName( state, clientId ),\n\t\t'__experimentalDisableBlockOverlay',\n\t\tfalse\n\t);\n\tconst shouldEnableIfUnselected = blockSupportDisable\n\t\t? false\n\t\t: areInnerBlocksControlled( state, clientId );\n\n\treturn (\n\t\tshouldEnableIfUnselected &&\n\t\t! isBlockSelected( state, clientId ) &&\n\t\t! hasSelectedInnerBlock( state, clientId, true )\n\t);\n}\n\nexport function __unstableIsWithinBlockOverlay( state, clientId ) {\n\tlet parent = state.blocks.parents.get( clientId );\n\twhile ( !! parent ) {\n\t\tif ( __unstableHasActiveBlockOverlayActive( state, parent ) ) {\n\t\t\treturn true;\n\t\t}\n\t\tparent = state.blocks.parents.get( parent );\n\t}\n\treturn false;\n}\n\n/**\n * @typedef {import('../components/block-editing-mode').BlockEditingMode} BlockEditingMode\n */\n\n/**\n * Returns the block editing mode for a given block.\n *\n * The mode can be one of three options:\n *\n * - `'disabled'`: Prevents editing the block entirely, i.e. it cannot be\n *   selected.\n * - `'contentOnly'`: Hides all non-content UI, e.g. auxiliary controls in the\n *   toolbar, the block movers, block settings.\n * - `'default'`: Allows editing the block as normal.\n *\n * Blocks can set a mode using the `useBlockEditingMode` hook.\n *\n * The mode is inherited by all of the block's inner blocks, unless they have\n * their own mode.\n *\n * A template lock can also set a mode. If the template lock is `'contentOnly'`,\n * the block's mode is overridden to `'contentOnly'` if the block has a content\n * role attribute, or `'disabled'` otherwise.\n *\n * @see useBlockEditingMode\n *\n * @param {Object} state    Global application state.\n * @param {string} clientId The block client ID, or `''` for the root container.\n *\n * @return {BlockEditingMode} The block editing mode. One of `'disabled'`,\n *                            `'contentOnly'`, or `'default'`.\n */\nexport function getBlockEditingMode( state, clientId = '' ) {\n\t// Some selectors that call this provide `null` as the default\n\t// rootClientId, but the default rootClientId is actually `''`.\n\tif ( clientId === null ) {\n\t\tclientId = '';\n\t}\n\n\t// Check if the clientId has an editing mode set in the regular derived map.\n\t// There may be an editing mode set here for synced patterns or in zoomed out\n\t// mode.\n\tif ( state.derivedBlockEditingModes?.has( clientId ) ) {\n\t\treturn state.derivedBlockEditingModes.get( clientId );\n\t}\n\n\t// In normal mode, consider that an explicitly set editing mode takes over.\n\tif ( state.blocks.blockEditingModes.has( clientId ) ) {\n\t\treturn state.blocks.blockEditingModes.get( clientId );\n\t}\n\n\treturn 'default';\n}\n\n/**\n * Indicates if a block is ungroupable.\n * A block is ungroupable if it is a single grouping block with inner blocks.\n * If a block has an `ungroup` transform, it is also ungroupable, without the\n * requirement of being the default grouping block.\n * Additionally a block can only be ungrouped if it has inner blocks and can\n * be removed.\n * Section blocks are not ungroupable.\n *\n * @param {Object} state    Global application state.\n * @param {string} clientId Client Id of the block. If not passed the selected block's client id will be used.\n * @return {boolean} True if the block is ungroupable.\n */\nexport const isUngroupable = createRegistrySelector(\n\t( select ) =>\n\t\t( state, clientId = '' ) => {\n\t\t\tconst _clientId = clientId || getSelectedBlockClientId( state );\n\t\t\tif ( ! _clientId ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Section blocks should not be ungroupable.\n\t\t\tif ( isSectionBlock( state, _clientId ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst { getGroupingBlockName } = select( blocksStore );\n\t\t\tconst block = getBlock( state, _clientId );\n\t\t\tconst groupingBlockName = getGroupingBlockName();\n\t\t\tconst _isUngroupable =\n\t\t\t\tblock &&\n\t\t\t\t( block.name === groupingBlockName ||\n\t\t\t\t\tgetBlockType( block.name )?.transforms?.ungroup ) &&\n\t\t\t\t!! block.innerBlocks.length;\n\n\t\t\treturn _isUngroupable && canRemoveBlock( state, _clientId );\n\t\t}\n);\n\n/**\n * Indicates if the provided blocks(by client ids) are groupable.\n * We need to have at least one block, have a grouping block name set and\n * be able to remove these blocks.\n *\n * @param {Object}   state     Global application state.\n * @param {string[]} clientIds Block client ids. If not passed the selected blocks client ids will be used.\n * @return {boolean} True if the blocks are groupable.\n */\nexport const isGroupable = createRegistrySelector(\n\t( select ) =>\n\t\t( state, clientIds = EMPTY_ARRAY ) => {\n\t\t\tconst { getGroupingBlockName } = select( blocksStore );\n\t\t\tconst groupingBlockName = getGroupingBlockName();\n\t\t\tconst _clientIds = clientIds?.length\n\t\t\t\t? clientIds\n\t\t\t\t: getSelectedBlockClientIds( state );\n\t\t\tconst rootClientId = _clientIds?.length\n\t\t\t\t? getBlockRootClientId( state, _clientIds[ 0 ] )\n\t\t\t\t: undefined;\n\t\t\tconst groupingBlockAvailable = canInsertBlockType(\n\t\t\t\tstate,\n\t\t\t\tgroupingBlockName,\n\t\t\t\trootClientId\n\t\t\t);\n\t\t\tconst _isGroupable = groupingBlockAvailable && _clientIds.length;\n\t\t\treturn _isGroupable && canRemoveBlocks( state, _clientIds );\n\t\t}\n);\n\n/**\n * DO-NOT-USE in production.\n * This selector is created for internal/experimental only usage and may be\n * removed anytime without any warning, causing breakage on any plugin or theme invoking it.\n *\n * @deprecated\n *\n * @param {Object} state    Global application state.\n * @param {Object} clientId Client Id of the block.\n *\n * @return {?string} Client ID of the ancestor block that is content locking the block.\n */\nexport const __unstableGetContentLockingParent = ( state, clientId ) => {\n\tdeprecated(\n\t\t\"wp.data.select( 'core/block-editor' ).__unstableGetContentLockingParent\",\n\t\t{\n\t\t\tsince: '6.1',\n\t\t\tversion: '6.7',\n\t\t}\n\t);\n\treturn getContentLockingParent( state, clientId );\n};\n\n/**\n * DO-NOT-USE in production.\n * This selector is created for internal/experimental only usage and may be\n * removed anytime without any warning, causing breakage on any plugin or theme invoking it.\n *\n * @deprecated\n *\n * @param {Object} state Global application state.\n */\nexport function __unstableGetTemporarilyEditingAsBlocks( state ) {\n\tdeprecated(\n\t\t\"wp.data.select( 'core/block-editor' ).__unstableGetTemporarilyEditingAsBlocks\",\n\t\t{\n\t\t\tsince: '6.1',\n\t\t\tversion: '6.7',\n\t\t}\n\t);\n\treturn getEditedContentOnlySection( state );\n}\n"],
  "mappings": "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",
  "names": ["blocksPrivateApis", "deprecated", "blocksStore"]
}
