@wordpress/block-editor 15.15.0 → 15.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/components/block-inspector/index.cjs +2 -1
  3. package/build/components/block-inspector/index.cjs.map +2 -2
  4. package/build/components/block-visibility/modal.cjs +2 -2
  5. package/build/components/block-visibility/modal.cjs.map +1 -1
  6. package/build/components/block-visibility/viewport-visibility-info.cjs +6 -1
  7. package/build/components/block-visibility/viewport-visibility-info.cjs.map +2 -2
  8. package/build/components/global-styles/background-panel.cjs +142 -33
  9. package/build/components/global-styles/background-panel.cjs.map +2 -2
  10. package/build/components/global-styles/color-panel.cjs +18 -7
  11. package/build/components/global-styles/color-panel.cjs.map +2 -2
  12. package/build/components/global-styles/hooks.cjs +8 -4
  13. package/build/components/global-styles/hooks.cjs.map +2 -2
  14. package/build/components/inspector-controls-tabs/styles-tab.cjs +2 -1
  15. package/build/components/inspector-controls-tabs/styles-tab.cjs.map +2 -2
  16. package/build/hooks/background.cjs +74 -21
  17. package/build/hooks/background.cjs.map +3 -3
  18. package/build/hooks/cross-origin-isolation.cjs +6 -6
  19. package/build/hooks/cross-origin-isolation.cjs.map +2 -2
  20. package/build/hooks/custom-css.cjs +5 -0
  21. package/build/hooks/custom-css.cjs.map +2 -2
  22. package/build/hooks/fit-text.cjs +46 -58
  23. package/build/hooks/fit-text.cjs.map +3 -3
  24. package/build/hooks/utils.cjs +5 -1
  25. package/build/hooks/utils.cjs.map +2 -2
  26. package/build/store/actions.cjs +8 -4
  27. package/build/store/actions.cjs.map +2 -2
  28. package/build/store/private-selectors.cjs +2 -2
  29. package/build/store/private-selectors.cjs.map +2 -2
  30. package/build/store/reducer.cjs +62 -95
  31. package/build/store/reducer.cjs.map +2 -2
  32. package/build/store/selectors.cjs +2 -2
  33. package/build/store/selectors.cjs.map +2 -2
  34. package/build-module/components/block-inspector/index.mjs +2 -1
  35. package/build-module/components/block-inspector/index.mjs.map +2 -2
  36. package/build-module/components/block-visibility/modal.mjs +2 -2
  37. package/build-module/components/block-visibility/modal.mjs.map +1 -1
  38. package/build-module/components/block-visibility/viewport-visibility-info.mjs +6 -1
  39. package/build-module/components/block-visibility/viewport-visibility-info.mjs.map +2 -2
  40. package/build-module/components/global-styles/background-panel.mjs +141 -34
  41. package/build-module/components/global-styles/background-panel.mjs.map +2 -2
  42. package/build-module/components/global-styles/color-panel.mjs +17 -7
  43. package/build-module/components/global-styles/color-panel.mjs.map +2 -2
  44. package/build-module/components/global-styles/hooks.mjs +8 -4
  45. package/build-module/components/global-styles/hooks.mjs.map +2 -2
  46. package/build-module/components/inspector-controls-tabs/styles-tab.mjs +2 -1
  47. package/build-module/components/inspector-controls-tabs/styles-tab.mjs.map +2 -2
  48. package/build-module/hooks/background.mjs +76 -22
  49. package/build-module/hooks/background.mjs.map +2 -2
  50. package/build-module/hooks/cross-origin-isolation.mjs +6 -6
  51. package/build-module/hooks/cross-origin-isolation.mjs.map +2 -2
  52. package/build-module/hooks/custom-css.mjs +5 -0
  53. package/build-module/hooks/custom-css.mjs.map +2 -2
  54. package/build-module/hooks/fit-text.mjs +46 -58
  55. package/build-module/hooks/fit-text.mjs.map +2 -2
  56. package/build-module/hooks/utils.mjs +5 -1
  57. package/build-module/hooks/utils.mjs.map +2 -2
  58. package/build-module/store/actions.mjs +8 -4
  59. package/build-module/store/actions.mjs.map +2 -2
  60. package/build-module/store/private-selectors.mjs +2 -2
  61. package/build-module/store/private-selectors.mjs.map +2 -2
  62. package/build-module/store/reducer.mjs +62 -94
  63. package/build-module/store/reducer.mjs.map +2 -2
  64. package/build-module/store/selectors.mjs +2 -2
  65. package/build-module/store/selectors.mjs.map +2 -2
  66. package/build-style/content-rtl.css +2 -2
  67. package/build-style/content.css +2 -2
  68. package/build-style/style-rtl.css +35 -7
  69. package/build-style/style.css +35 -7
  70. package/package.json +39 -39
  71. package/src/components/background-image-control/style.scss +0 -4
  72. package/src/components/block-inspector/index.js +1 -0
  73. package/src/components/block-visibility/viewport-visibility-info.js +8 -1
  74. package/src/components/fit-text-size-warning/style.scss +1 -5
  75. package/src/components/global-styles/background-panel.js +157 -11
  76. package/src/components/global-styles/color-panel.js +23 -7
  77. package/src/components/global-styles/hooks.js +12 -4
  78. package/src/components/global-styles/test/background-panel.js +44 -1
  79. package/src/components/inspector-controls-tabs/styles-tab.js +1 -0
  80. package/src/hooks/background.js +122 -21
  81. package/src/hooks/background.scss +45 -0
  82. package/src/hooks/cross-origin-isolation.js +6 -6
  83. package/src/hooks/custom-css.js +6 -0
  84. package/src/hooks/fit-text.js +73 -83
  85. package/src/hooks/test/cross-origin-isolation.js +7 -3
  86. package/src/hooks/utils.js +4 -0
  87. package/src/store/actions.js +9 -8
  88. package/src/store/private-selectors.js +2 -2
  89. package/src/store/reducer.js +84 -128
  90. package/src/store/selectors.js +2 -2
  91. package/src/store/test/private-selectors.js +67 -34
  92. package/src/store/test/reducer.js +436 -66
  93. package/src/store/test/selectors.js +81 -63
  94. package/src/style.scss +1 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/store/reducer.js"],
4
- "sourcesContent": ["/**\n * External dependencies\n */\nimport fastDeepEqual from 'fast-deep-equal/es6/index.js';\n\n/**\n * WordPress dependencies\n */\nimport { pipe } from '@wordpress/compose';\nimport { combineReducers, select } from '@wordpress/data';\nimport deprecated from '@wordpress/deprecated';\nimport {\n\tstore as blocksStore,\n\tprivateApis as blocksPrivateApis,\n} from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport { PREFERENCES_DEFAULTS, SETTINGS_DEFAULTS } from './defaults';\nimport { insertAt, moveTo } from './array';\nimport { sectionRootClientIdKey, isIsolatedEditorKey } from './private-keys';\nimport { unlock } from '../lock-unlock';\n\nconst { isContentBlock } = unlock( blocksPrivateApis );\n\nconst identity = ( x ) => x;\n\n/**\n * Given an array of blocks, returns an object where each key is a nesting\n * context, the value of which is an array of block client IDs existing within\n * that nesting context.\n *\n * @param {Array} blocks Blocks to map.\n * @param {?string} rootClientId Assumed root client ID.\n *\n * @return {Object} Block order map object.\n */\nfunction mapBlockOrder( blocks, rootClientId = '' ) {\n\tconst result = new Map();\n\tconst current = [];\n\tresult.set( rootClientId, current );\n\tblocks.forEach( ( block ) => {\n\t\tconst { clientId, innerBlocks } = block;\n\t\tcurrent.push( clientId );\n\t\tmapBlockOrder( innerBlocks, clientId ).forEach(\n\t\t\t( order, subClientId ) => {\n\t\t\t\tresult.set( subClientId, order );\n\t\t\t}\n\t\t);\n\t} );\n\treturn result;\n}\n\n/**\n * Given an array of blocks, returns an object where each key contains\n * the clientId of the block and the value is the parent of the block.\n *\n * @param {Array} blocks Blocks to map.\n * @param {?string} rootClientId Assumed root client ID.\n *\n * @return {Object} Block order map object.\n */\nfunction mapBlockParents( blocks, rootClientId = '' ) {\n\tconst result = [];\n\tconst stack = [ [ rootClientId, blocks ] ];\n\twhile ( stack.length ) {\n\t\tconst [ parent, currentBlocks ] = stack.shift();\n\t\tcurrentBlocks.forEach( ( { innerBlocks, ...block } ) => {\n\t\t\tresult.push( [ block.clientId, parent ] );\n\t\t\tif ( innerBlocks?.length ) {\n\t\t\t\tstack.push( [ block.clientId, innerBlocks ] );\n\t\t\t}\n\t\t} );\n\t}\n\treturn result;\n}\n\n/**\n * Helper method to iterate through all blocks, recursing into inner blocks,\n * applying a transformation function to each one.\n * Returns a flattened object with the transformed blocks.\n *\n * @param {Array} blocks Blocks to flatten.\n * @param {Function} transform Transforming function to be applied to each block.\n *\n * @return {Array} Flattened object.\n */\nfunction flattenBlocks( blocks, transform = identity ) {\n\tconst result = [];\n\n\tconst stack = [ ...blocks ];\n\twhile ( stack.length ) {\n\t\tconst { innerBlocks, ...block } = stack.shift();\n\t\tstack.push( ...innerBlocks );\n\t\tresult.push( [ block.clientId, transform( block ) ] );\n\t}\n\n\treturn result;\n}\n\nfunction getFlattenedClientIds( blocks ) {\n\tconst result = {};\n\tconst stack = [ ...blocks ];\n\twhile ( stack.length ) {\n\t\tconst { innerBlocks, ...block } = stack.shift();\n\t\tstack.push( ...innerBlocks );\n\t\tresult[ block.clientId ] = true;\n\t}\n\n\treturn result;\n}\n\n/**\n * Given an array of blocks, returns an object containing all blocks, without\n * attributes, recursing into inner blocks. Keys correspond to the block client\n * ID, the value of which is the attributes object.\n *\n * @param {Array} blocks Blocks to flatten.\n *\n * @return {Array} Flattened block attributes object.\n */\nfunction getFlattenedBlocksWithoutAttributes( blocks ) {\n\treturn flattenBlocks( blocks, ( block ) => {\n\t\tconst { attributes, ...restBlock } = block;\n\t\treturn restBlock;\n\t} );\n}\n\n/**\n * Given an array of blocks, returns an object containing all block attributes,\n * recursing into inner blocks. Keys correspond to the block client ID, the\n * value of which is the attributes object.\n *\n * @param {Array} blocks Blocks to flatten.\n *\n * @return {Array} Flattened block attributes object.\n */\nfunction getFlattenedBlockAttributes( blocks ) {\n\treturn flattenBlocks( blocks, ( block ) => block.attributes );\n}\n\n/**\n * Returns true if the two object arguments have the same keys, or false\n * otherwise.\n *\n * @param {Object} a First object.\n * @param {Object} b Second object.\n *\n * @return {boolean} Whether the two objects have the same keys.\n */\nexport function hasSameKeys( a, b ) {\n\treturn fastDeepEqual( Object.keys( a ), Object.keys( b ) );\n}\n\n/**\n * Returns true if, given the currently dispatching action and the previously\n * dispatched action, the two actions are updating the same block attribute, or\n * false otherwise.\n *\n * @param {Object} action Currently dispatching action.\n * @param {Object} lastAction Previously dispatched action.\n *\n * @return {boolean} Whether actions are updating the same block attribute.\n */\nexport function isUpdatingSameBlockAttribute( action, lastAction ) {\n\treturn (\n\t\taction.type === 'UPDATE_BLOCK_ATTRIBUTES' &&\n\t\tlastAction !== undefined &&\n\t\tlastAction.type === 'UPDATE_BLOCK_ATTRIBUTES' &&\n\t\tfastDeepEqual( action.clientIds, lastAction.clientIds ) &&\n\t\thasSameKeys( action.attributes, lastAction.attributes )\n\t);\n}\n\nfunction updateBlockTreeForBlocks( state, blocks ) {\n\tconst treeToUpdate = state.tree;\n\tconst stack = [ ...blocks ];\n\tconst flattenedBlocks = [ ...blocks ];\n\twhile ( stack.length ) {\n\t\tconst block = stack.shift();\n\t\tstack.push( ...block.innerBlocks );\n\t\tflattenedBlocks.push( ...block.innerBlocks );\n\t}\n\t// Create objects before mutating them, that way it's always defined.\n\tfor ( const block of flattenedBlocks ) {\n\t\ttreeToUpdate.set( block.clientId, {} );\n\t}\n\tfor ( const block of flattenedBlocks ) {\n\t\ttreeToUpdate.set(\n\t\t\tblock.clientId,\n\t\t\tObject.assign( treeToUpdate.get( block.clientId ), {\n\t\t\t\t...state.byClientId.get( block.clientId ),\n\t\t\t\tattributes: state.attributes.get( block.clientId ),\n\t\t\t\tinnerBlocks: block.innerBlocks.map( ( subBlock ) =>\n\t\t\t\t\ttreeToUpdate.get( subBlock.clientId )\n\t\t\t\t),\n\t\t\t} )\n\t\t);\n\t}\n}\n\nfunction updateParentInnerBlocksInTree(\n\tstate,\n\tupdatedClientIds,\n\tupdateChildrenOfUpdatedClientIds = false\n) {\n\tconst treeToUpdate = state.tree;\n\tconst uncontrolledParents = new Set( [] );\n\tconst controlledParents = new Set();\n\tfor ( const clientId of updatedClientIds ) {\n\t\tlet current = updateChildrenOfUpdatedClientIds\n\t\t\t? clientId\n\t\t\t: state.parents.get( clientId );\n\t\tdo {\n\t\t\tif ( state.controlledInnerBlocks[ current ] ) {\n\t\t\t\t// Should stop on controlled blocks.\n\t\t\t\t// If we reach a controlled parent, break out of the loop.\n\t\t\t\tcontrolledParents.add( current );\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\t// Else continue traversing up through parents.\n\t\t\t\tuncontrolledParents.add( current );\n\t\t\t\tcurrent = state.parents.get( current );\n\t\t\t}\n\t\t} while ( current !== undefined );\n\t}\n\n\t// To make sure the order of assignments doesn't matter,\n\t// we first create empty objects and mutates the inner blocks later.\n\tfor ( const clientId of uncontrolledParents ) {\n\t\ttreeToUpdate.set( clientId, { ...treeToUpdate.get( clientId ) } );\n\t}\n\tfor ( const clientId of uncontrolledParents ) {\n\t\ttreeToUpdate.get( clientId ).innerBlocks = (\n\t\t\tstate.order.get( clientId ) || []\n\t\t).map( ( subClientId ) => treeToUpdate.get( subClientId ) );\n\t}\n\n\t// Controlled parent blocks, need a dedicated key for their inner blocks\n\t// to be used when doing getBlocks( controlledBlockClientId ).\n\tfor ( const clientId of controlledParents ) {\n\t\ttreeToUpdate.set( 'controlled||' + clientId, {\n\t\t\tinnerBlocks: ( state.order.get( clientId ) || [] ).map(\n\t\t\t\t( subClientId ) => treeToUpdate.get( subClientId )\n\t\t\t),\n\t\t} );\n\t}\n}\n\n/**\n * Higher-order reducer intended to compute full block objects key for each block in the post.\n * This is a denormalization to optimize the performance of the getBlock selectors and avoid\n * recomputing the block objects and avoid heavy memoization.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nconst withBlockTree =\n\t( reducer ) =>\n\t( state = {}, action ) => {\n\t\tconst newState = reducer( state, action );\n\n\t\tif ( newState === state ) {\n\t\t\treturn state;\n\t\t}\n\n\t\tnewState.tree = state.tree ? state.tree : new Map();\n\t\tswitch ( action.type ) {\n\t\t\tcase 'RECEIVE_BLOCKS':\n\t\t\tcase 'INSERT_BLOCKS': {\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\tupdateBlockTreeForBlocks( newState, action.blocks );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\taction.rootClientId ? [ action.rootClientId ] : [ '' ],\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'UPDATE_BLOCK':\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\tnewState.tree.set( action.clientId, {\n\t\t\t\t\t...newState.tree.get( action.clientId ),\n\t\t\t\t\t...newState.byClientId.get( action.clientId ),\n\t\t\t\t\tattributes: newState.attributes.get( action.clientId ),\n\t\t\t\t} );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\t[ action.clientId ],\n\t\t\t\t\tfalse\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase 'SYNC_DERIVED_BLOCK_ATTRIBUTES':\n\t\t\tcase 'UPDATE_BLOCK_ATTRIBUTES': {\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\taction.clientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.tree.set( clientId, {\n\t\t\t\t\t\t...newState.tree.get( clientId ),\n\t\t\t\t\t\tattributes: newState.attributes.get( clientId ),\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\taction.clientIds,\n\t\t\t\t\tfalse\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst inserterClientIds = getFlattenedClientIds(\n\t\t\t\t\taction.blocks\n\t\t\t\t);\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\taction.replacedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.tree.delete( clientId );\n\t\t\t\t\t// Controlled inner blocks are only removed\n\t\t\t\t\t// if the block doesn't move to another position\n\t\t\t\t\t// otherwise their content will be lost.\n\t\t\t\t\tif ( ! inserterClientIds[ clientId ] ) {\n\t\t\t\t\t\tnewState.tree.delete( 'controlled||' + clientId );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tupdateBlockTreeForBlocks( newState, action.blocks );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\taction.blocks.map( ( b ) => b.clientId ),\n\t\t\t\t\tfalse\n\t\t\t\t);\n\n\t\t\t\t// If there are no replaced blocks, it means we're removing blocks so we need to update their parent.\n\t\t\t\tconst parentsOfRemovedBlocks = [];\n\t\t\t\tfor ( const clientId of action.clientIds ) {\n\t\t\t\t\tconst parentId = state.parents.get( clientId );\n\t\t\t\t\tif (\n\t\t\t\t\t\tparentId !== undefined &&\n\t\t\t\t\t\t( parentId === '' ||\n\t\t\t\t\t\t\tnewState.byClientId.get( parentId ) )\n\t\t\t\t\t) {\n\t\t\t\t\t\tparentsOfRemovedBlocks.push( parentId );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\tparentsOfRemovedBlocks,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN':\n\t\t\t\tconst parentsOfRemovedBlocks = [];\n\t\t\t\tfor ( const clientId of action.clientIds ) {\n\t\t\t\t\tconst parentId = state.parents.get( clientId );\n\t\t\t\t\tif (\n\t\t\t\t\t\tparentId !== undefined &&\n\t\t\t\t\t\t( parentId === '' ||\n\t\t\t\t\t\t\tnewState.byClientId.get( parentId ) )\n\t\t\t\t\t) {\n\t\t\t\t\t\tparentsOfRemovedBlocks.push( parentId );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\taction.removedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.tree.delete( clientId );\n\t\t\t\t\tnewState.tree.delete( 'controlled||' + clientId );\n\t\t\t\t} );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\tparentsOfRemovedBlocks,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase 'MOVE_BLOCKS_TO_POSITION': {\n\t\t\t\tconst updatedBlockUids = [];\n\t\t\t\tif ( action.fromRootClientId ) {\n\t\t\t\t\tupdatedBlockUids.push( action.fromRootClientId );\n\t\t\t\t} else {\n\t\t\t\t\tupdatedBlockUids.push( '' );\n\t\t\t\t}\n\t\t\t\tif ( action.toRootClientId ) {\n\t\t\t\t\tupdatedBlockUids.push( action.toRootClientId );\n\t\t\t\t}\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\tupdatedBlockUids,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'MOVE_BLOCKS_UP':\n\t\t\tcase 'MOVE_BLOCKS_DOWN': {\n\t\t\t\tconst updatedBlockUids = [\n\t\t\t\t\taction.rootClientId ? action.rootClientId : '',\n\t\t\t\t];\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\tupdatedBlockUids,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'SAVE_REUSABLE_BLOCK_SUCCESS': {\n\t\t\t\tconst updatedBlockUids = [];\n\t\t\t\tnewState.attributes.forEach( ( attributes, clientId ) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tnewState.byClientId.get( clientId ).name ===\n\t\t\t\t\t\t\t'core/block' &&\n\t\t\t\t\t\tattributes.ref === action.updatedId\n\t\t\t\t\t) {\n\t\t\t\t\t\tupdatedBlockUids.push( clientId );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\tupdatedBlockUids.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.tree.set( clientId, {\n\t\t\t\t\t\t...newState.byClientId.get( clientId ),\n\t\t\t\t\t\tattributes: newState.attributes.get( clientId ),\n\t\t\t\t\t\tinnerBlocks: newState.tree.get( clientId ).innerBlocks,\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\tupdatedBlockUids,\n\t\t\t\t\tfalse\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn newState;\n\t};\n\n/**\n * Higher-order reducer intended to augment the blocks reducer, assigning an\n * `isPersistentChange` property value corresponding to whether a change in\n * state can be considered as persistent. All changes are considered persistent\n * except when updating the same block attribute as in the previous action.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nfunction withPersistentBlockChange( reducer ) {\n\tlet lastAction;\n\tlet markNextChangeAsNotPersistent = false;\n\tlet explicitPersistent;\n\n\treturn ( state, action ) => {\n\t\tlet nextState = reducer( state, action );\n\n\t\tlet nextIsPersistentChange;\n\t\tif ( action.type === 'SET_EXPLICIT_PERSISTENT' ) {\n\t\t\texplicitPersistent = action.isPersistentChange;\n\t\t\tnextIsPersistentChange = state.isPersistentChange ?? true;\n\t\t}\n\n\t\tif ( explicitPersistent !== undefined ) {\n\t\t\tnextIsPersistentChange = explicitPersistent;\n\t\t\treturn nextIsPersistentChange === nextState.isPersistentChange\n\t\t\t\t? nextState\n\t\t\t\t: {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tisPersistentChange: nextIsPersistentChange,\n\t\t\t\t };\n\t\t}\n\n\t\tconst isExplicitPersistentChange =\n\t\t\taction.type === 'MARK_LAST_CHANGE_AS_PERSISTENT' ||\n\t\t\tmarkNextChangeAsNotPersistent;\n\n\t\t// Defer to previous state value (or default) unless changing or\n\t\t// explicitly marking as persistent.\n\t\tif ( state === nextState && ! isExplicitPersistentChange ) {\n\t\t\tmarkNextChangeAsNotPersistent =\n\t\t\t\taction.type === 'MARK_NEXT_CHANGE_AS_NOT_PERSISTENT';\n\n\t\t\tnextIsPersistentChange = state?.isPersistentChange ?? true;\n\t\t\tif ( state.isPersistentChange === nextIsPersistentChange ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...nextState,\n\t\t\t\tisPersistentChange: nextIsPersistentChange,\n\t\t\t};\n\t\t}\n\n\t\tnextState = {\n\t\t\t...nextState,\n\t\t\tisPersistentChange: isExplicitPersistentChange\n\t\t\t\t? ! markNextChangeAsNotPersistent\n\t\t\t\t: ! isUpdatingSameBlockAttribute( action, lastAction ),\n\t\t};\n\n\t\t// In comparing against the previous action, consider only those which\n\t\t// would have qualified as one which would have been ignored or not\n\t\t// have resulted in a changed state.\n\t\tlastAction = action;\n\t\tmarkNextChangeAsNotPersistent =\n\t\t\taction.type === 'MARK_NEXT_CHANGE_AS_NOT_PERSISTENT';\n\n\t\treturn nextState;\n\t};\n}\n\n/**\n * Higher-order reducer intended to augment the blocks reducer, assigning an\n * `isIgnoredChange` property value corresponding to whether a change in state\n * can be considered as ignored. A change is considered ignored when the result\n * of an action not incurred by direct user interaction.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nfunction withIgnoredBlockChange( reducer ) {\n\t/**\n\t * Set of action types for which a blocks state change should be ignored.\n\t *\n\t * @type {Set}\n\t */\n\tconst IGNORED_ACTION_TYPES = new Set( [ 'RECEIVE_BLOCKS' ] );\n\n\treturn ( state, action ) => {\n\t\tconst nextState = reducer( state, action );\n\n\t\tif ( nextState !== state ) {\n\t\t\tnextState.isIgnoredChange = IGNORED_ACTION_TYPES.has( action.type );\n\t\t}\n\n\t\treturn nextState;\n\t};\n}\n\n/**\n * Higher-order reducer targeting the combined blocks reducer, augmenting\n * block client IDs in remove action to include cascade of inner blocks.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nconst withInnerBlocksRemoveCascade = ( reducer ) => ( state, action ) => {\n\t// Gets all children which need to be removed.\n\tconst getAllChildren = ( clientIds ) => {\n\t\tlet result = clientIds;\n\t\tfor ( let i = 0; i < result.length; i++ ) {\n\t\t\tif (\n\t\t\t\t! state.order.get( result[ i ] ) ||\n\t\t\t\t( action.keepControlledInnerBlocks &&\n\t\t\t\t\taction.keepControlledInnerBlocks[ result[ i ] ] )\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( result === clientIds ) {\n\t\t\t\tresult = [ ...result ];\n\t\t\t}\n\n\t\t\tresult.push( ...state.order.get( result[ i ] ) );\n\t\t}\n\t\treturn result;\n\t};\n\n\tif ( state ) {\n\t\tswitch ( action.type ) {\n\t\t\tcase 'REMOVE_BLOCKS':\n\t\t\t\taction = {\n\t\t\t\t\t...action,\n\t\t\t\t\ttype: 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN',\n\t\t\t\t\tremovedClientIds: getAllChildren( action.clientIds ),\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase 'REPLACE_BLOCKS':\n\t\t\t\taction = {\n\t\t\t\t\t...action,\n\t\t\t\t\ttype: 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN',\n\t\t\t\t\treplacedClientIds: getAllChildren( action.clientIds ),\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn reducer( state, action );\n};\n\n/**\n * Higher-order reducer which targets the combined blocks reducer and handles\n * the `RESET_BLOCKS` action. When dispatched, this action will replace all\n * blocks that exist in the post, leaving blocks that exist only in state (e.g.\n * reusable blocks and blocks controlled by inner blocks controllers) alone.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nconst withBlockReset = ( reducer ) => ( state, action ) => {\n\tif ( action.type === 'RESET_BLOCKS' ) {\n\t\t/**\n\t\t * Preserve controlled inner block flags across RESET_BLOCKS.\n\t\t * Previously this was cleared to `{}`, which caused nested\n\t\t * controllers (e.g. post-content, patterns) to lose their\n\t\t * controlled status and unnecessarily re-clone blocks. Stale\n\t\t * flags are cleaned up naturally by unsetControlledBlocks()\n\t\t * when useBlockSync unmounts.\n\t\t */\n\t\tconst preservedControlledInnerBlocks =\n\t\t\tstate?.controlledInnerBlocks ?? {};\n\n\t\tconst newState = {\n\t\t\t...state,\n\t\t\tbyClientId: new Map(\n\t\t\t\tgetFlattenedBlocksWithoutAttributes( action.blocks )\n\t\t\t),\n\t\t\tattributes: new Map( getFlattenedBlockAttributes( action.blocks ) ),\n\t\t\torder: mapBlockOrder( action.blocks ),\n\t\t\tparents: new Map( mapBlockParents( action.blocks ) ),\n\t\t\tcontrolledInnerBlocks: preservedControlledInnerBlocks,\n\t\t};\n\n\t\t// Preserve controlled inner blocks data from the old state.\n\t\t// The maps above are rebuilt solely from action.blocks, but\n\t\t// controlled inner blocks live under cloned IDs that aren't\n\t\t// present in action.blocks. Re-inject them so the state\n\t\t// remains consistent with the preserved flags.\n\t\tif ( state?.order ) {\n\t\t\tfor ( const clientId of Object.keys(\n\t\t\t\tpreservedControlledInnerBlocks\n\t\t\t) ) {\n\t\t\t\tif ( ! preservedControlledInnerBlocks[ clientId ] ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// Only preserve if the parent block still exists.\n\t\t\t\tif ( ! newState.byClientId.has( clientId ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst oldOrder = state.order.get( clientId );\n\t\t\t\tif ( ! oldOrder?.length ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tnewState.order.set( clientId, oldOrder );\n\t\t\t\tconst preserveBlock = ( blockId, parentId ) => {\n\t\t\t\t\tconst blockData = state.byClientId?.get( blockId );\n\t\t\t\t\tif ( ! blockData ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tnewState.byClientId.set( blockId, blockData );\n\t\t\t\t\tnewState.attributes.set(\n\t\t\t\t\t\tblockId,\n\t\t\t\t\t\tstate.attributes?.get( blockId )\n\t\t\t\t\t);\n\t\t\t\t\tnewState.parents.set( blockId, parentId );\n\t\t\t\t\tconst childOrder = state.order?.get( blockId ) || [];\n\t\t\t\t\tnewState.order.set( blockId, childOrder );\n\t\t\t\t\tchildOrder.forEach( ( childId ) =>\n\t\t\t\t\t\tpreserveBlock( childId, blockId )\n\t\t\t\t\t);\n\t\t\t\t};\n\t\t\t\toldOrder.forEach( ( id ) => preserveBlock( id, clientId ) );\n\t\t\t}\n\t\t}\n\n\t\tnewState.tree = new Map( state?.tree );\n\t\tupdateBlockTreeForBlocks( newState, action.blocks );\n\n\t\t// Fix tree entries for controlled blocks. updateBlockTreeForBlocks\n\t\t// built tree entries using action.blocks' inner block structure\n\t\t// (entity-level IDs), but we need them to reference the preserved\n\t\t// cloned inner blocks instead. Mutating the existing object\n\t\t// preserves references held by ancestor tree entries.\n\t\tfor ( const clientId of Object.keys(\n\t\t\tpreservedControlledInnerBlocks\n\t\t) ) {\n\t\t\tif ( ! preservedControlledInnerBlocks[ clientId ] ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif ( ! newState.byClientId.has( clientId ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst controlledOrder = newState.order.get( clientId );\n\t\t\tif ( ! controlledOrder?.length ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst innerBlocks = controlledOrder.map( ( id ) =>\n\t\t\t\tnewState.tree.get( id )\n\t\t\t);\n\t\t\tconst existingEntry = newState.tree.get( clientId );\n\t\t\tif ( existingEntry ) {\n\t\t\t\texistingEntry.innerBlocks = innerBlocks;\n\t\t\t}\n\t\t\tnewState.tree.set( 'controlled||' + clientId, { innerBlocks } );\n\t\t}\n\n\t\tnewState.tree.set( '', {\n\t\t\tinnerBlocks: action.blocks.map( ( subBlock ) =>\n\t\t\t\tnewState.tree.get( subBlock.clientId )\n\t\t\t),\n\t\t} );\n\n\t\treturn newState;\n\t}\n\n\treturn reducer( state, action );\n};\n\n/**\n * Higher-order reducer which targets the combined blocks reducer and handles\n * the `REPLACE_INNER_BLOCKS` action. When dispatched, this action the state\n * should become equivalent to the execution of a `REMOVE_BLOCKS` action\n * containing all the child's of the root block followed by the execution of\n * `INSERT_BLOCKS` with the new blocks.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nconst withReplaceInnerBlocks = ( reducer ) => ( state, action ) => {\n\tif ( action.type !== 'REPLACE_INNER_BLOCKS' ) {\n\t\treturn reducer( state, action );\n\t}\n\n\t// Finds every nested inner block controller. We must check the action blocks\n\t// and not just the block parent state because some inner block controllers\n\t// should be deleted if specified, whereas others should not be deleted. If\n\t// a controlled should not be deleted, then we need to avoid deleting its\n\t// inner blocks from the block state because its inner blocks will not be\n\t// attached to the block in the action.\n\tconst nestedControllers = {};\n\tif ( Object.keys( state.controlledInnerBlocks ).length ) {\n\t\tconst stack = [ ...action.blocks ];\n\t\twhile ( stack.length ) {\n\t\t\tconst { innerBlocks, ...block } = stack.shift();\n\t\t\tstack.push( ...innerBlocks );\n\t\t\tif ( !! state.controlledInnerBlocks[ block.clientId ] ) {\n\t\t\t\tnestedControllers[ block.clientId ] = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t// The `keepControlledInnerBlocks` prop will keep the inner blocks of the\n\t// marked block in the block state so that they can be reattached to the\n\t// marked block when we re-insert everything a few lines below.\n\tlet stateAfterBlocksRemoval = state;\n\tif ( state.order.get( action.rootClientId ) ) {\n\t\tstateAfterBlocksRemoval = reducer( stateAfterBlocksRemoval, {\n\t\t\ttype: 'REMOVE_BLOCKS',\n\t\t\tkeepControlledInnerBlocks: nestedControllers,\n\t\t\tclientIds: state.order.get( action.rootClientId ),\n\t\t} );\n\t}\n\tlet stateAfterInsert = stateAfterBlocksRemoval;\n\tif ( action.blocks.length ) {\n\t\tstateAfterInsert = reducer( stateAfterInsert, {\n\t\t\t...action,\n\t\t\ttype: 'INSERT_BLOCKS',\n\t\t\tindex: 0,\n\t\t} );\n\n\t\t// We need to re-attach the controlled inner blocks to the blocks tree and\n\t\t// preserve their block order. Otherwise, an inner block controller's blocks\n\t\t// will be deleted entirely from its entity.\n\t\tconst stateAfterInsertOrder = new Map( stateAfterInsert.order );\n\t\tObject.keys( nestedControllers ).forEach( ( key ) => {\n\t\t\tif ( state.order.get( key ) ) {\n\t\t\t\tstateAfterInsertOrder.set( key, state.order.get( key ) );\n\t\t\t}\n\t\t} );\n\t\tstateAfterInsert.order = stateAfterInsertOrder;\n\t\tstateAfterInsert.tree = new Map( stateAfterInsert.tree );\n\t\tObject.keys( nestedControllers ).forEach( ( _key ) => {\n\t\t\tconst key = `controlled||${ _key }`;\n\t\t\tif ( state.tree.has( key ) ) {\n\t\t\t\tstateAfterInsert.tree.set( key, state.tree.get( key ) );\n\t\t\t}\n\t\t} );\n\t}\n\treturn stateAfterInsert;\n};\n\n/**\n * Higher-order reducer which targets the combined blocks reducer and handles\n * the `SAVE_REUSABLE_BLOCK_SUCCESS` action. This action can't be handled by\n * regular reducers and needs a higher-order reducer since it needs access to\n * both `byClientId` and `attributes` simultaneously.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nconst withSaveReusableBlock = ( reducer ) => ( state, action ) => {\n\tif ( state && action.type === 'SAVE_REUSABLE_BLOCK_SUCCESS' ) {\n\t\tconst { id, updatedId } = action;\n\n\t\t// If a temporary reusable block is saved, we swap the temporary id with the final one.\n\t\tif ( id === updatedId ) {\n\t\t\treturn state;\n\t\t}\n\n\t\tstate = { ...state };\n\t\tstate.attributes = new Map( state.attributes );\n\t\tstate.attributes.forEach( ( attributes, clientId ) => {\n\t\t\tconst { name } = state.byClientId.get( clientId );\n\t\t\tif ( name === 'core/block' && attributes.ref === id ) {\n\t\t\t\tstate.attributes.set( clientId, {\n\t\t\t\t\t...attributes,\n\t\t\t\t\tref: updatedId,\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t}\n\n\treturn reducer( state, action );\n};\n/**\n * Higher-order reducer which removes blocks from state when switching parent block controlled state.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nconst withResetControlledBlocks = ( reducer ) => ( state, action ) => {\n\tif ( action.type === 'SET_HAS_CONTROLLED_INNER_BLOCKS' ) {\n\t\t// When switching a block from controlled to uncontrolled or inverse,\n\t\t// we need to remove its content first \u2014 but only if there are inner\n\t\t// blocks to remove. Skipping the no-op dispatch is important because\n\t\t// REPLACE_INNER_BLOCKS creates new state references even when empty,\n\t\t// which propagates tree changes up to the root and triggers false-\n\t\t// positive change detection in parent subscriptions.\n\t\tconst innerBlockOrder = state.order.get( action.clientId );\n\t\tif ( innerBlockOrder?.length ) {\n\t\t\tconst tempState = reducer( state, {\n\t\t\t\ttype: 'REPLACE_INNER_BLOCKS',\n\t\t\t\trootClientId: action.clientId,\n\t\t\t\tblocks: [],\n\t\t\t} );\n\t\t\treturn reducer( tempState, action );\n\t\t}\n\t\treturn reducer( state, action );\n\t}\n\n\treturn reducer( state, action );\n};\n\n/**\n * Reducer returning the blocks state.\n *\n * @param {Object} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport const blocks = pipe(\n\tcombineReducers,\n\twithSaveReusableBlock, // Needs to be before withBlockCache.\n\twithBlockTree, // Needs to be before withInnerBlocksRemoveCascade.\n\twithInnerBlocksRemoveCascade,\n\twithReplaceInnerBlocks, // Needs to be after withInnerBlocksRemoveCascade.\n\twithBlockReset,\n\twithPersistentBlockChange,\n\twithIgnoredBlockChange,\n\twithResetControlledBlocks\n)( {\n\t// The state is using a Map instead of a plain object for performance reasons.\n\t// You can run the \"./test/performance.js\" unit test to check the impact\n\t// code changes can have on this reducer.\n\tbyClientId( state = new Map(), action ) {\n\t\tswitch ( action.type ) {\n\t\t\tcase 'RECEIVE_BLOCKS':\n\t\t\tcase 'INSERT_BLOCKS': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tgetFlattenedBlocksWithoutAttributes( action.blocks ).forEach(\n\t\t\t\t\t( [ key, value ] ) => {\n\t\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t\tcase 'UPDATE_BLOCK': {\n\t\t\t\t// Ignore updates if block isn't known.\n\t\t\t\tif ( ! state.has( action.clientId ) ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\t// Do nothing if only attributes change.\n\t\t\t\tconst { attributes, ...changes } = action.updates;\n\t\t\t\tif ( Object.values( changes ).length === 0 ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tnewState.set( action.clientId, {\n\t\t\t\t\t...state.get( action.clientId ),\n\t\t\t\t\t...changes,\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tif ( ! action.blocks ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.replacedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\n\t\t\t\tgetFlattenedBlocksWithoutAttributes( action.blocks ).forEach(\n\t\t\t\t\t( [ key, value ] ) => {\n\t\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.removedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t}\n\n\t\treturn state;\n\t},\n\n\t// The state is using a Map instead of a plain object for performance reasons.\n\t// You can run the \"./test/performance.js\" unit test to check the impact\n\t// code changes can have on this reducer.\n\tattributes( state = new Map(), action ) {\n\t\tswitch ( action.type ) {\n\t\t\tcase 'RECEIVE_BLOCKS':\n\t\t\tcase 'INSERT_BLOCKS': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tgetFlattenedBlockAttributes( action.blocks ).forEach(\n\t\t\t\t\t( [ key, value ] ) => {\n\t\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'UPDATE_BLOCK': {\n\t\t\t\t// Ignore updates if block isn't known or there are no attribute changes.\n\t\t\t\tif (\n\t\t\t\t\t! state.get( action.clientId ) ||\n\t\t\t\t\t! action.updates.attributes\n\t\t\t\t) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tnewState.set( action.clientId, {\n\t\t\t\t\t...state.get( action.clientId ),\n\t\t\t\t\t...action.updates.attributes,\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'SYNC_DERIVED_BLOCK_ATTRIBUTES':\n\t\t\tcase 'UPDATE_BLOCK_ATTRIBUTES': {\n\t\t\t\t// Avoid a state change if none of the block IDs are known.\n\t\t\t\tif ( action.clientIds.every( ( id ) => ! state.get( id ) ) ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tlet hasChange = false;\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tfor ( const clientId of action.clientIds ) {\n\t\t\t\t\tconst updatedAttributeEntries = Object.entries(\n\t\t\t\t\t\t!! action.options?.uniqueByBlock\n\t\t\t\t\t\t\t? action.attributes[ clientId ]\n\t\t\t\t\t\t\t: action.attributes ?? {}\n\t\t\t\t\t);\n\t\t\t\t\tif ( updatedAttributeEntries.length === 0 ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tlet hasUpdatedAttributes = false;\n\t\t\t\t\tconst existingAttributes = state.get( clientId );\n\t\t\t\t\tconst newAttributes = {};\n\t\t\t\t\tupdatedAttributeEntries.forEach( ( [ key, value ] ) => {\n\t\t\t\t\t\tif ( existingAttributes[ key ] !== value ) {\n\t\t\t\t\t\t\thasUpdatedAttributes = true;\n\t\t\t\t\t\t\tnewAttributes[ key ] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t\thasChange = hasChange || hasUpdatedAttributes;\n\t\t\t\t\tif ( hasUpdatedAttributes ) {\n\t\t\t\t\t\tnewState.set( clientId, {\n\t\t\t\t\t\t\t...existingAttributes,\n\t\t\t\t\t\t\t...newAttributes,\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn hasChange ? newState : state;\n\t\t\t}\n\n\t\t\tcase 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tif ( ! action.blocks ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.replacedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\tgetFlattenedBlockAttributes( action.blocks ).forEach(\n\t\t\t\t\t( [ key, value ] ) => {\n\t\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.removedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t}\n\n\t\treturn state;\n\t},\n\n\t// The state is using a Map instead of a plain object for performance reasons.\n\t// You can run the \"./test/performance.js\" unit test to check the impact\n\t// code changes can have on this reducer.\n\torder( state = new Map(), action ) {\n\t\tswitch ( action.type ) {\n\t\t\tcase 'RECEIVE_BLOCKS': {\n\t\t\t\tconst blockOrder = mapBlockOrder( action.blocks );\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tblockOrder.forEach( ( order, clientId ) => {\n\t\t\t\t\tif ( clientId !== '' ) {\n\t\t\t\t\t\tnewState.set( clientId, order );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tnewState.set(\n\t\t\t\t\t'',\n\t\t\t\t\t( state.get( '' ) ?? [] ).concat( blockOrder[ '' ] )\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t\tcase 'INSERT_BLOCKS': {\n\t\t\t\tconst { rootClientId = '' } = action;\n\t\t\t\tconst subState = state.get( rootClientId ) || [];\n\t\t\t\tconst mappedBlocks = mapBlockOrder(\n\t\t\t\t\taction.blocks,\n\t\t\t\t\trootClientId\n\t\t\t\t);\n\t\t\t\tconst { index = subState.length } = action;\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tmappedBlocks.forEach( ( order, clientId ) => {\n\t\t\t\t\tnewState.set( clientId, order );\n\t\t\t\t} );\n\t\t\t\tnewState.set(\n\t\t\t\t\trootClientId,\n\t\t\t\t\tinsertAt(\n\t\t\t\t\t\tsubState,\n\t\t\t\t\t\tmappedBlocks.get( rootClientId ),\n\t\t\t\t\t\tindex\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'MOVE_BLOCKS_TO_POSITION': {\n\t\t\t\tconst {\n\t\t\t\t\tfromRootClientId = '',\n\t\t\t\t\ttoRootClientId = '',\n\t\t\t\t\tclientIds,\n\t\t\t\t} = action;\n\t\t\t\tconst { index = state.get( toRootClientId ).length } = action;\n\n\t\t\t\t// Moving inside the same parent block.\n\t\t\t\tif ( fromRootClientId === toRootClientId ) {\n\t\t\t\t\tconst subState = state.get( toRootClientId );\n\t\t\t\t\tconst fromIndex = subState.indexOf( clientIds[ 0 ] );\n\t\t\t\t\tif ( fromIndex === -1 ) {\n\t\t\t\t\t\treturn state;\n\t\t\t\t\t}\n\t\t\t\t\tconst newState = new Map( state );\n\t\t\t\t\tnewState.set(\n\t\t\t\t\t\ttoRootClientId,\n\t\t\t\t\t\tmoveTo(\n\t\t\t\t\t\t\tstate.get( toRootClientId ),\n\t\t\t\t\t\t\tfromIndex,\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\tclientIds.length\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\treturn newState;\n\t\t\t\t}\n\n\t\t\t\t// Moving from a parent block to another.\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tnewState.set(\n\t\t\t\t\tfromRootClientId,\n\t\t\t\t\tstate\n\t\t\t\t\t\t.get( fromRootClientId )\n\t\t\t\t\t\t?.filter( ( id ) => ! clientIds.includes( id ) ) ?? []\n\t\t\t\t);\n\t\t\t\tnewState.set(\n\t\t\t\t\ttoRootClientId,\n\t\t\t\t\tinsertAt( state.get( toRootClientId ), clientIds, index )\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'MOVE_BLOCKS_UP': {\n\t\t\t\tconst { clientIds, rootClientId = '' } = action;\n\t\t\t\tconst firstClientId = clientIds[ 0 ];\n\t\t\t\tconst subState = state.get( rootClientId );\n\n\t\t\t\tif ( ! subState.length || firstClientId === subState[ 0 ] ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst firstIndex = subState.indexOf( firstClientId );\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tnewState.set(\n\t\t\t\t\trootClientId,\n\t\t\t\t\tmoveTo(\n\t\t\t\t\t\tsubState,\n\t\t\t\t\t\tfirstIndex,\n\t\t\t\t\t\tfirstIndex - 1,\n\t\t\t\t\t\tclientIds.length\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'MOVE_BLOCKS_DOWN': {\n\t\t\t\tconst { clientIds, rootClientId = '' } = action;\n\t\t\t\tconst firstClientId = clientIds[ 0 ];\n\t\t\t\tconst lastClientId = clientIds[ clientIds.length - 1 ];\n\t\t\t\tconst subState = state.get( rootClientId );\n\n\t\t\t\tif (\n\t\t\t\t\t! subState.length ||\n\t\t\t\t\tlastClientId === subState[ subState.length - 1 ]\n\t\t\t\t) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst firstIndex = subState.indexOf( firstClientId );\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tnewState.set(\n\t\t\t\t\trootClientId,\n\t\t\t\t\tmoveTo(\n\t\t\t\t\t\tsubState,\n\t\t\t\t\t\tfirstIndex,\n\t\t\t\t\t\tfirstIndex + 1,\n\t\t\t\t\t\tclientIds.length\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst { clientIds } = action;\n\t\t\t\tif ( ! action.blocks ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst mappedBlocks = mapBlockOrder( action.blocks );\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.replacedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\tmappedBlocks.forEach( ( order, clientId ) => {\n\t\t\t\t\tif ( clientId !== '' ) {\n\t\t\t\t\t\tnewState.set( clientId, order );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tnewState.forEach( ( order, clientId ) => {\n\t\t\t\t\tconst newSubOrder = Object.values( order ).reduce(\n\t\t\t\t\t\t( result, subClientId ) => {\n\t\t\t\t\t\t\tif ( subClientId === clientIds[ 0 ] ) {\n\t\t\t\t\t\t\t\treturn [ ...result, ...mappedBlocks.get( '' ) ];\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( clientIds.indexOf( subClientId ) === -1 ) {\n\t\t\t\t\t\t\t\tresult.push( subClientId );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[]\n\t\t\t\t\t);\n\t\t\t\t\tnewState.set( clientId, newSubOrder );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\t// Remove inner block ordering for removed blocks.\n\t\t\t\taction.removedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\tnewState.forEach( ( order, clientId ) => {\n\t\t\t\t\tconst newSubOrder =\n\t\t\t\t\t\torder?.filter(\n\t\t\t\t\t\t\t( id ) => ! action.removedClientIds.includes( id )\n\t\t\t\t\t\t) ?? [];\n\t\t\t\t\tif ( newSubOrder.length !== order.length ) {\n\t\t\t\t\t\tnewState.set( clientId, newSubOrder );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t}\n\n\t\treturn state;\n\t},\n\n\t// While technically redundant data as the inverse of `order`, it serves as\n\t// an optimization for the selectors which derive the ancestry of a block.\n\tparents( state = new Map(), action ) {\n\t\tswitch ( action.type ) {\n\t\t\tcase 'RECEIVE_BLOCKS': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tmapBlockParents( action.blocks ).forEach(\n\t\t\t\t\t( [ key, value ] ) => {\n\t\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t\tcase 'INSERT_BLOCKS': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tmapBlockParents(\n\t\t\t\t\taction.blocks,\n\t\t\t\t\taction.rootClientId || ''\n\t\t\t\t).forEach( ( [ key, value ] ) => {\n\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t\tcase 'MOVE_BLOCKS_TO_POSITION': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.clientIds.forEach( ( id ) => {\n\t\t\t\t\tnewState.set( id, action.toRootClientId || '' );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.replacedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\tmapBlockParents(\n\t\t\t\t\taction.blocks,\n\t\t\t\t\tstate.get( action.clientIds[ 0 ] )\n\t\t\t\t).forEach( ( [ key, value ] ) => {\n\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t\tcase 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.removedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t}\n\n\t\treturn state;\n\t},\n\n\tcontrolledInnerBlocks(\n\t\tstate = {},\n\t\t{ type, clientId, hasControlledInnerBlocks }\n\t) {\n\t\tif ( type === 'SET_HAS_CONTROLLED_INNER_BLOCKS' ) {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t[ clientId ]: hasControlledInnerBlocks,\n\t\t\t};\n\t\t}\n\t\treturn state;\n\t},\n} );\n\n/**\n * Reducer returning visibility status of block interface.\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function isBlockInterfaceHidden( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'HIDE_BLOCK_INTERFACE':\n\t\t\treturn true;\n\n\t\tcase 'SHOW_BLOCK_INTERFACE':\n\t\t\treturn false;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning typing state.\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function isTyping( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'START_TYPING':\n\t\t\treturn true;\n\n\t\tcase 'STOP_TYPING':\n\t\t\treturn false;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning dragging state. It is possible for a user to be dragging\n * data from outside of the editor, so this state is separate from `draggedBlocks`.\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function isDragging( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'START_DRAGGING':\n\t\t\treturn true;\n\n\t\tcase 'STOP_DRAGGING':\n\t\t\treturn false;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning dragged block client id.\n *\n * @param {string[]} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {string[]} Updated state.\n */\nexport function draggedBlocks( state = [], action ) {\n\tswitch ( action.type ) {\n\t\tcase 'START_DRAGGING_BLOCKS':\n\t\t\treturn action.clientIds;\n\n\t\tcase 'STOP_DRAGGING_BLOCKS':\n\t\t\treturn [];\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer tracking the visible blocks.\n *\n * @param {Record<string,boolean>} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Record<string,boolean>} Block visibility.\n */\nexport function blockVisibility( state = {}, action ) {\n\tif ( action.type === 'SET_BLOCK_VISIBILITY' ) {\n\t\treturn {\n\t\t\t...state,\n\t\t\t...action.updates,\n\t\t};\n\t}\n\n\treturn state;\n}\n\n/**\n * Internal helper reducer for selectionStart and selectionEnd. Can hold a block\n * selection, represented by an object with property clientId.\n *\n * @param {Object} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nfunction selectionHelper( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'CLEAR_SELECTED_BLOCK': {\n\t\t\tif ( state.clientId ) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn state;\n\t\t}\n\t\tcase 'SELECT_BLOCK':\n\t\t\tif ( action.clientId === state.clientId ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\treturn { clientId: action.clientId };\n\t\tcase 'REPLACE_INNER_BLOCKS':\n\t\tcase 'INSERT_BLOCKS': {\n\t\t\tif ( ! action.updateSelection || ! action.blocks.length ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\treturn { clientId: action.blocks[ 0 ].clientId };\n\t\t}\n\t\tcase 'REMOVE_BLOCKS':\n\t\t\tif (\n\t\t\t\t! action.clientIds ||\n\t\t\t\t! action.clientIds.length ||\n\t\t\t\taction.clientIds.indexOf( state.clientId ) === -1\n\t\t\t) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\treturn {};\n\t\tcase 'REPLACE_BLOCKS': {\n\t\t\tif ( action.clientIds.indexOf( state.clientId ) === -1 ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\tconst blockToSelect =\n\t\t\t\taction.blocks[ action.indexToSelect ] ||\n\t\t\t\taction.blocks[ action.blocks.length - 1 ];\n\n\t\t\tif ( ! blockToSelect ) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\tif ( blockToSelect.clientId === state.clientId ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\treturn { clientId: blockToSelect.clientId };\n\t\t}\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the selection state.\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function selection( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SELECTION_CHANGE':\n\t\t\tif ( action.clientId ) {\n\t\t\t\treturn {\n\t\t\t\t\tselectionStart: {\n\t\t\t\t\t\tclientId: action.clientId,\n\t\t\t\t\t\tattributeKey: action.attributeKey,\n\t\t\t\t\t\toffset: action.startOffset,\n\t\t\t\t\t},\n\t\t\t\t\tselectionEnd: {\n\t\t\t\t\t\tclientId: action.clientId,\n\t\t\t\t\t\tattributeKey: action.attributeKey,\n\t\t\t\t\t\toffset: action.endOffset,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tselectionStart: action.start || state.selectionStart,\n\t\t\t\tselectionEnd: action.end || state.selectionEnd,\n\t\t\t};\n\t\tcase 'RESET_SELECTION':\n\t\t\tconst { selectionStart, selectionEnd } = action;\n\t\t\treturn {\n\t\t\t\tselectionStart,\n\t\t\t\tselectionEnd,\n\t\t\t};\n\t\tcase 'MULTI_SELECT':\n\t\t\tconst { start, end } = action;\n\n\t\t\tif (\n\t\t\t\tstart === state.selectionStart?.clientId &&\n\t\t\t\tend === state.selectionEnd?.clientId\n\t\t\t) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tselectionStart: { clientId: start },\n\t\t\t\tselectionEnd: { clientId: end },\n\t\t\t};\n\t\tcase 'RESET_BLOCKS':\n\t\t\tconst startClientId = state?.selectionStart?.clientId;\n\t\t\tconst endClientId = state?.selectionEnd?.clientId;\n\n\t\t\t// Do nothing if there's no selected block.\n\t\t\tif ( ! startClientId && ! endClientId ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\t// If the start of the selection won't exist after reset, remove selection.\n\t\t\tif (\n\t\t\t\t! action.blocks.some(\n\t\t\t\t\t( block ) => block.clientId === startClientId\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\tselectionStart: {},\n\t\t\t\t\tselectionEnd: {},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If the end of the selection won't exist after reset, collapse selection.\n\t\t\tif (\n\t\t\t\t! action.blocks.some(\n\t\t\t\t\t( block ) => block.clientId === endClientId\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\t...state,\n\t\t\t\t\tselectionEnd: state.selectionStart,\n\t\t\t\t};\n\t\t\t}\n\t}\n\n\tconst selectionStart = selectionHelper( state.selectionStart, action );\n\tconst selectionEnd = selectionHelper( state.selectionEnd, action );\n\n\tif (\n\t\tselectionStart === state.selectionStart &&\n\t\tselectionEnd === state.selectionEnd\n\t) {\n\t\treturn state;\n\t}\n\n\treturn {\n\t\tselectionStart,\n\t\tselectionEnd,\n\t};\n}\n\n/**\n * Reducer returning whether the user is multi-selecting.\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function isMultiSelecting( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'START_MULTI_SELECT':\n\t\t\treturn true;\n\n\t\tcase 'STOP_MULTI_SELECT':\n\t\t\treturn false;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning whether selection is enabled.\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function isSelectionEnabled( state = true, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'TOGGLE_SELECTION':\n\t\t\treturn action.isSelectionEnabled;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the client IDs for the viewport modal,\n * or null if the modal is not open.\n *\n * @param {string[]|null} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {string[]|null} Client IDs for the viewport modal.\n */\nexport function viewportModalClientIds( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SHOW_VIEWPORT_MODAL':\n\t\t\treturn action.clientIds;\n\t\tcase 'HIDE_VIEWPORT_MODAL':\n\t\t\treturn null;\n\t}\n\treturn state;\n}\n\n/**\n * Reducer returning the data needed to display a prompt when certain blocks\n * are removed, or `false` if no such prompt is requested.\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object|false} Data for removal prompt display, if any.\n */\nfunction removalPromptData( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'DISPLAY_BLOCK_REMOVAL_PROMPT':\n\t\t\tconst { clientIds, selectPrevious, message } = action;\n\t\t\treturn {\n\t\t\t\tclientIds,\n\t\t\t\tselectPrevious,\n\t\t\t\tmessage,\n\t\t\t};\n\t\tcase 'CLEAR_BLOCK_REMOVAL_PROMPT':\n\t\t\treturn false;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning any rules that a block editor may provide in order to\n * prevent a user from accidentally removing certain blocks. These rules are\n * then used to display a confirmation prompt to the user. For instance, in the\n * Site Editor, the Query Loop block is important enough to warrant such\n * confirmation.\n *\n * The data is a record whose keys are block types (e.g. 'core/query') and\n * whose values are the explanation to be shown to users (e.g. 'Query Loop\n * displays a list of posts or pages.').\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Record<string,string>} Updated state.\n */\nfunction blockRemovalRules( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_BLOCK_REMOVAL_RULES':\n\t\t\treturn action.rules;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the initial block selection.\n *\n * Currently this in only used to restore the selection after block deletion and\n * pasting new content.This reducer should eventually be removed in favour of setting\n * selection directly.\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {number|null} Initial position: 0, -1 or null.\n */\nexport function initialPosition( state = null, action ) {\n\tif (\n\t\taction.type === 'REPLACE_BLOCKS' &&\n\t\taction.initialPosition !== undefined\n\t) {\n\t\treturn action.initialPosition;\n\t} else if (\n\t\t[\n\t\t\t'MULTI_SELECT',\n\t\t\t'SELECT_BLOCK',\n\t\t\t'RESET_SELECTION',\n\t\t\t'INSERT_BLOCKS',\n\t\t\t'REPLACE_INNER_BLOCKS',\n\t\t].includes( action.type )\n\t) {\n\t\treturn action.initialPosition;\n\t}\n\n\treturn state;\n}\n\nexport function blocksMode( state = {}, action ) {\n\tif ( action.type === 'TOGGLE_BLOCK_MODE' ) {\n\t\tconst { clientId } = action;\n\t\treturn {\n\t\t\t...state,\n\t\t\t[ clientId ]:\n\t\t\t\tstate[ clientId ] && state[ clientId ] === 'html'\n\t\t\t\t\t? 'visual'\n\t\t\t\t\t: 'html',\n\t\t};\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the block insertion point visibility, either null if there\n * is not an explicit insertion point assigned, or an object of its `index` and\n * `rootClientId`.\n *\n * @param {Object} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport function insertionCue( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SHOW_INSERTION_POINT': {\n\t\t\tconst {\n\t\t\t\trootClientId,\n\t\t\t\tindex,\n\t\t\t\t__unstableWithInserter,\n\t\t\t\toperation,\n\t\t\t\tnearestSide,\n\t\t\t} = action;\n\t\t\tconst nextState = {\n\t\t\t\trootClientId,\n\t\t\t\tindex,\n\t\t\t\t__unstableWithInserter,\n\t\t\t\toperation,\n\t\t\t\tnearestSide,\n\t\t\t};\n\n\t\t\t// Bail out updates if the states are the same.\n\t\t\treturn fastDeepEqual( state, nextState ) ? state : nextState;\n\t\t}\n\n\t\tcase 'HIDE_INSERTION_POINT':\n\t\t\treturn null;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning whether the post blocks match the defined template or not.\n *\n * @param {Object} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function template( state = { isValid: true }, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_TEMPLATE_VALIDITY':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisValid: action.isValid,\n\t\t\t};\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the editor setting.\n *\n * @param {Object} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport function settings( state = SETTINGS_DEFAULTS, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'UPDATE_SETTINGS': {\n\t\t\tconst updatedSettings = action.reset\n\t\t\t\t? {\n\t\t\t\t\t\t...SETTINGS_DEFAULTS,\n\t\t\t\t\t\t...action.settings,\n\t\t\t\t }\n\t\t\t\t: {\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\t...action.settings,\n\t\t\t\t };\n\n\t\t\tObject.defineProperty( updatedSettings, '__unstableIsPreviewMode', {\n\t\t\t\tget() {\n\t\t\t\t\tdeprecated( '__unstableIsPreviewMode', {\n\t\t\t\t\t\tsince: '6.8',\n\t\t\t\t\t\talternative: 'isPreviewMode',\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn this.isPreviewMode;\n\t\t\t\t},\n\t\t\t} );\n\n\t\t\treturn updatedSettings;\n\t\t}\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the user preferences.\n *\n * @param {Object} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {string} Updated state.\n */\nexport function preferences( state = PREFERENCES_DEFAULTS, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'INSERT_BLOCKS':\n\t\tcase 'REPLACE_BLOCKS': {\n\t\t\tconst nextInsertUsage = action.blocks.reduce(\n\t\t\t\t( prevUsage, block ) => {\n\t\t\t\t\tconst { attributes, name: blockName } = block;\n\t\t\t\t\tlet id = blockName;\n\t\t\t\t\t// If a block variation match is found change the name to be the same with the\n\t\t\t\t\t// one that is used for block variations in the Inserter (`getItemFromVariation`).\n\t\t\t\t\tconst match = select( blocksStore ).getActiveBlockVariation(\n\t\t\t\t\t\tblockName,\n\t\t\t\t\t\tattributes\n\t\t\t\t\t);\n\t\t\t\t\tif ( match?.name ) {\n\t\t\t\t\t\tid += '/' + match.name;\n\t\t\t\t\t}\n\t\t\t\t\tif ( blockName === 'core/block' ) {\n\t\t\t\t\t\tid += '/' + attributes.ref;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...prevUsage,\n\t\t\t\t\t\t[ id ]: {\n\t\t\t\t\t\t\ttime: action.time,\n\t\t\t\t\t\t\tcount: prevUsage[ id ]\n\t\t\t\t\t\t\t\t? prevUsage[ id ].count + 1\n\t\t\t\t\t\t\t\t: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tstate.insertUsage\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tinsertUsage: nextInsertUsage,\n\t\t\t};\n\t\t}\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning an object where each key is a block client ID, its value\n * representing the settings for its nested blocks.\n *\n * @param {Object} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport const blockListSettings = ( state = {}, action ) => {\n\tswitch ( action.type ) {\n\t\tcase 'REPLACE_BLOCKS': {\n\t\t\t// Collect all clientIds from replacement blocks. If a clientId\n\t\t\t// is reused, preserve its settings \u2014 the block instance (and\n\t\t\t// its InnerBlocks config) survived the replace. Settings for\n\t\t\t// clientIds that are truly removed get cleaned up so stale\n\t\t\t// config from old block types doesn't linger.\n\t\t\tconst replacementIds = new Set();\n\t\t\tconst stack = [ ...action.blocks ];\n\t\t\twhile ( stack.length ) {\n\t\t\t\tconst block = stack.shift();\n\t\t\t\treplacementIds.add( block.clientId );\n\t\t\t\tstack.push( ...block.innerBlocks );\n\t\t\t}\n\t\t\treturn Object.fromEntries(\n\t\t\t\tObject.entries( state ).filter(\n\t\t\t\t\t( [ id ] ) =>\n\t\t\t\t\t\t! action.clientIds.includes( id ) ||\n\t\t\t\t\t\treplacementIds.has( id )\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tcase 'REMOVE_BLOCKS': {\n\t\t\treturn Object.fromEntries(\n\t\t\t\tObject.entries( state ).filter(\n\t\t\t\t\t( [ id ] ) => ! action.clientIds.includes( id )\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tcase 'UPDATE_BLOCK_LIST_SETTINGS': {\n\t\t\tconst updates =\n\t\t\t\ttypeof action.clientId === 'string'\n\t\t\t\t\t? { [ action.clientId ]: action.settings }\n\t\t\t\t\t: action.clientId;\n\n\t\t\t// Remove settings that are the same as the current state.\n\t\t\tfor ( const clientId in updates ) {\n\t\t\t\tif ( ! updates[ clientId ] ) {\n\t\t\t\t\tif ( ! state[ clientId ] ) {\n\t\t\t\t\t\tdelete updates[ clientId ];\n\t\t\t\t\t}\n\t\t\t\t} else if (\n\t\t\t\t\tfastDeepEqual( state[ clientId ], updates[ clientId ] )\n\t\t\t\t) {\n\t\t\t\t\tdelete updates[ clientId ];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( Object.keys( updates ).length === 0 ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\tconst merged = { ...state, ...updates };\n\n\t\t\tfor ( const clientId in updates ) {\n\t\t\t\tif ( ! updates[ clientId ] ) {\n\t\t\t\t\tdelete merged[ clientId ];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn merged;\n\t\t}\n\t}\n\treturn state;\n};\n\n/**\n * Reducer return an updated state representing the most recent block attribute\n * update. The state is structured as an object where the keys represent the\n * client IDs of blocks, the values a subset of attributes from the most recent\n * block update. The state is always reset to null if the last action is\n * anything other than an attributes update.\n *\n * @param {Object<string,Object>} state Current state.\n * @param {Object} action Action object.\n *\n * @return {[string,Object]} Updated state.\n */\nexport function lastBlockAttributesChange( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'UPDATE_BLOCK':\n\t\t\tif ( ! action.updates.attributes ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treturn { [ action.clientId ]: action.updates.attributes };\n\n\t\tcase 'UPDATE_BLOCK_ATTRIBUTES':\n\t\t\treturn action.clientIds.reduce(\n\t\t\t\t( accumulator, id ) => ( {\n\t\t\t\t\t...accumulator,\n\t\t\t\t\t[ id ]: !! action.options?.uniqueByBlock\n\t\t\t\t\t\t? action.attributes[ id ]\n\t\t\t\t\t\t: action.attributes,\n\t\t\t\t} ),\n\t\t\t\t{}\n\t\t\t);\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning current highlighted block.\n *\n * @param {boolean} state Current highlighted block.\n * @param {Object} action Dispatched action.\n *\n * @return {string} Updated state.\n */\nexport function highlightedBlock( state, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'TOGGLE_BLOCK_HIGHLIGHT':\n\t\t\tconst { clientId, isHighlighted } = action;\n\n\t\t\tif ( isHighlighted ) {\n\t\t\t\treturn clientId;\n\t\t\t} else if ( state === clientId ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn state;\n\t\tcase 'SELECT_BLOCK':\n\t\t\tif ( action.clientId !== state ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning current spotlighted block.\n *\n * @param {string|null} state Current clientId or null.\n * @param {Object} action Dispatched action.\n *\n * @return {string|null} Updated state.\n */\nexport function hasBlockSpotlight( state, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'TOGGLE_BLOCK_SPOTLIGHT':\n\t\t\tconst { clientId, hasBlockSpotlight: _hasBlockSpotlight } = action;\n\n\t\t\tif ( _hasBlockSpotlight ) {\n\t\t\t\treturn clientId;\n\t\t\t} else if ( state === clientId ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn state;\n\t\tcase 'SELECT_BLOCK':\n\t\t\tif ( action.clientId !== state ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn state;\n\t\tcase 'SELECTION_CHANGE':\n\t\t\tif (\n\t\t\t\taction.start?.clientId !== state ||\n\t\t\t\taction.end?.clientId !== state\n\t\t\t) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn state;\n\t\tcase 'CLEAR_SELECTED_BLOCK':\n\t\t\treturn null;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning current expanded block in the list view.\n *\n * @param {string|null} state Current expanded block.\n * @param {Object} action Dispatched action.\n *\n * @return {string|null} Updated state.\n */\nexport function expandedBlock( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_BLOCK_EXPANDED_IN_LIST_VIEW':\n\t\t\treturn action.clientId;\n\t\tcase 'SELECT_BLOCK':\n\t\t\tif ( action.clientId !== state ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the block insertion event list state.\n *\n * @param {Object} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport function lastBlockInserted( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'INSERT_BLOCKS':\n\t\tcase 'REPLACE_BLOCKS':\n\t\t\tif ( ! action.blocks.length ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\tconst clientIds = action.blocks.map( ( block ) => {\n\t\t\t\treturn block.clientId;\n\t\t\t} );\n\n\t\t\tconst source = action.meta?.source;\n\n\t\t\treturn { clientIds, source };\n\t\tcase 'RESET_BLOCKS':\n\t\t\treturn {};\n\t}\n\treturn state;\n}\n\n/**\n * Reducer returning the contentOnly block that is being edited.\n *\n * @param {string|undefined} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {string|undefined} Updated state.\n */\nexport function editedContentOnlySection( state, action ) {\n\tif ( action.type === 'EDIT_CONTENT_ONLY_SECTION' ) {\n\t\treturn action.clientId;\n\t}\n\treturn state;\n}\n\n/**\n * Reducer returning a map of block client IDs to block editing modes.\n *\n * @param {Map} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Map} Updated state.\n */\nexport function blockEditingModes( state = new Map(), action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_BLOCK_EDITING_MODE':\n\t\t\tif ( state.get( action.clientId ) === action.mode ) {\n\t\t\t\treturn state;\n\t\t\t}\n\t\t\treturn new Map( state ).set( action.clientId, action.mode );\n\t\tcase 'UNSET_BLOCK_EDITING_MODE': {\n\t\t\tif ( ! state.has( action.clientId ) ) {\n\t\t\t\treturn state;\n\t\t\t}\n\t\t\tconst newState = new Map( state );\n\t\t\tnewState.delete( action.clientId );\n\t\t\treturn newState;\n\t\t}\n\t\tcase 'RESET_BLOCKS': {\n\t\t\treturn state.has( '' )\n\t\t\t\t? new Map().set( '', state.get( '' ) )\n\t\t\t\t: state;\n\t\t}\n\t}\n\treturn state;\n}\n\n/**\n * Reducer returning a map of style IDs to style overrides.\n *\n * @param {Map} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Map} Updated state.\n */\nexport function styleOverrides( state = new Map(), action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_STYLE_OVERRIDE':\n\t\t\treturn new Map( state ).set( action.id, action.style );\n\t\tcase 'DELETE_STYLE_OVERRIDE': {\n\t\t\tconst newState = new Map( state );\n\t\t\tnewState.delete( action.id );\n\t\t\treturn newState;\n\t\t}\n\t}\n\treturn state;\n}\n\n/**\n * Reducer returning a map of the registered inserter media categories.\n *\n * @param {Array} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Array} Updated state.\n */\nexport function registeredInserterMediaCategories( state = [], action ) {\n\tswitch ( action.type ) {\n\t\tcase 'REGISTER_INSERTER_MEDIA_CATEGORY':\n\t\t\treturn [ ...state, action.category ];\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer setting last focused element\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function lastFocus( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'LAST_FOCUS':\n\t\t\treturn action.lastFocus;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer setting zoom out state.\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {number} Updated state.\n */\nexport function zoomLevel( state = 100, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_ZOOM_LEVEL':\n\t\t\treturn action.zoom;\n\t\tcase 'RESET_ZOOM_LEVEL':\n\t\t\treturn 100;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer setting the insertion point\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport function insertionPoint( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_INSERTION_POINT':\n\t\t\treturn action.value;\n\t\tcase 'SELECT_BLOCK':\n\t\t\treturn null;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the opened List View panels state.\n *\n * @param {Object} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nfunction openedListViewPanels(\n\tstate = { allOpen: false, panels: {} },\n\taction\n) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_OPEN_LIST_VIEW_PANEL':\n\t\t\t// Open only the specified panel, close all others\n\t\t\treturn {\n\t\t\t\tallOpen: false,\n\t\t\t\tpanels: action.clientId ? { [ action.clientId ]: true } : {},\n\t\t\t};\n\t\tcase 'SET_ALL_LIST_VIEW_PANELS_OPEN':\n\t\t\t// Set flag to open all panels\n\t\t\treturn { allOpen: true, panels: {} };\n\t\tcase 'TOGGLE_LIST_VIEW_PANEL':\n\t\t\t// If we're in \"all open\" mode, exit it when user manually toggles\n\t\t\treturn {\n\t\t\t\tallOpen: false,\n\t\t\t\tpanels: {\n\t\t\t\t\t...state.panels,\n\t\t\t\t\t[ action.clientId ]: action.isOpen,\n\t\t\t\t},\n\t\t\t};\n\t\tcase 'REPLACE_BLOCKS':\n\t\tcase 'REMOVE_BLOCKS': {\n\t\t\t// Clean up stale entries when blocks are removed or replaced\n\t\t\tif ( ! action.clientIds || action.clientIds.length === 0 ) {\n\t\t\t\treturn state;\n\t\t\t}\n\t\t\tconst newPanels = { ...state.panels };\n\t\t\tlet hasChanges = false;\n\t\t\taction.clientIds.forEach( ( clientId ) => {\n\t\t\t\tif ( clientId in newPanels ) {\n\t\t\t\t\tdelete newPanels[ clientId ];\n\t\t\t\t\thasChanges = true;\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn hasChanges ? { ...state, panels: newPanels } : state;\n\t\t}\n\t}\n\treturn state;\n}\n\n/**\n * Reducer returning the List View expand revision.\n *\n * This is a counter used to force ListView components to remount. When incremented,\n * the ListView key changes, causing the component to remount with a fresh\n * isExpanded=true state.\n *\n * @param {number} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {number} Updated state.\n */\nfunction listViewExpandRevision( state = 0, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'INCREMENT_LIST_VIEW_EXPAND_REVISION':\n\t\t\treturn state + 1;\n\t}\n\treturn state;\n}\n\n/**\n * Reducer tracking whether the list view content panel popover is open.\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function listViewContentPanelOpen( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'OPEN_LIST_VIEW_CONTENT_PANEL':\n\t\t\treturn true;\n\n\t\tcase 'CLOSE_LIST_VIEW_CONTENT_PANEL':\n\t\t\treturn false;\n\n\t\t// Close when selection is cleared\n\t\tcase 'CLEAR_SELECTED_BLOCK':\n\t\t\treturn false;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer tracking the requested inspector tab state.\n * Stores a request to open a specific inspector tab with optional configuration.\n *\n * @param {Object|null} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object|null} Updated state.\n */\nexport function requestedInspectorTab( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'REQUEST_INSPECTOR_TAB':\n\t\t\treturn {\n\t\t\t\ttabName: action.tabName,\n\t\t\t\toptions: action.options,\n\t\t\t};\n\t\tcase 'CLEAR_REQUESTED_INSPECTOR_TAB':\n\t\t\treturn null;\n\t}\n\n\treturn state;\n}\n\nconst combinedReducers = combineReducers( {\n\tblocks,\n\tisDragging,\n\tisTyping,\n\tisBlockInterfaceHidden,\n\tdraggedBlocks,\n\tselection,\n\tisMultiSelecting,\n\tisSelectionEnabled,\n\tinitialPosition,\n\tblocksMode,\n\tblockListSettings,\n\tinsertionPoint,\n\tinsertionCue,\n\ttemplate,\n\tsettings,\n\tpreferences,\n\tlastBlockAttributesChange,\n\tlastFocus,\n\texpandedBlock,\n\thighlightedBlock,\n\tlastBlockInserted,\n\teditedContentOnlySection,\n\tblockVisibility,\n\tviewportModalClientIds,\n\tblockEditingModes,\n\tstyleOverrides,\n\tremovalPromptData,\n\tblockRemovalRules,\n\tregisteredInserterMediaCategories,\n\tzoomLevel,\n\thasBlockSpotlight,\n\topenedListViewPanels,\n\tlistViewExpandRevision,\n\tlistViewContentPanelOpen,\n\trequestedInspectorTab,\n} );\n\n/**\n * Retrieves a block's tree structure, handling both controlled and uncontrolled inner blocks.\n *\n * @param {Object} state The current state object.\n * @param {string} clientId The client ID of the block to retrieve.\n *\n * @return {Object|undefined} The block tree object, or undefined if not found. For controlled blocks,\n * returns a merged tree with controlled inner blocks.\n */\nfunction getBlockTreeBlock( state, clientId ) {\n\tif ( clientId === '' ) {\n\t\tconst rootBlock = state.blocks.tree.get( clientId );\n\n\t\tif ( ! rootBlock ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Patch the root block to have a clientId property.\n\t\t// TODO - consider updating the blocks reducer so that the root block has this property.\n\t\treturn {\n\t\t\tclientId: '',\n\t\t\t...rootBlock,\n\t\t};\n\t}\n\n\tif ( ! state.blocks.controlledInnerBlocks[ clientId ] ) {\n\t\treturn state.blocks.tree.get( clientId );\n\t}\n\n\tconst controlledTree = state.blocks.tree.get( `controlled||${ clientId }` );\n\tconst regularTree = state.blocks.tree.get( clientId );\n\n\treturn {\n\t\t...regularTree,\n\t\tinnerBlocks: controlledTree?.innerBlocks,\n\t};\n}\n\n/**\n * Recursively traverses through a block tree of a given block and executes a callback for each block.\n *\n * @param {Object} state The store state.\n * @param {string} clientId The clientId of the block to start traversing from.\n * @param {Function} callback Function to execute for each block encountered during traversal.\n * The callback receives the current block as its argument.\n */\nfunction traverseBlockTree( state, clientId, callback ) {\n\tconst tree = getBlockTreeBlock( state, clientId );\n\tif ( ! tree ) {\n\t\treturn;\n\t}\n\n\tcallback( tree );\n\n\tif ( ! tree?.innerBlocks?.length ) {\n\t\treturn;\n\t}\n\n\tfor ( const innerBlock of tree?.innerBlocks ) {\n\t\ttraverseBlockTree( state, innerBlock.clientId, callback );\n\t}\n}\n\n/**\n * Checks if a block has a parent in a list of client IDs, and if so returns the client ID of the parent.\n *\n * @param {Object} state The current state object.\n * @param {string} clientId The client ID of the block to search the parents of.\n * @param {Array} clientIds The client IDs of the blocks to check.\n *\n * @return {string|undefined} The client ID of the parent block if found, undefined otherwise.\n */\nfunction findParentInClientIdsList( state, clientId, clientIds ) {\n\tif ( ! clientIds.length ) {\n\t\treturn;\n\t}\n\n\tlet parent = state.blocks.parents.get( clientId );\n\twhile ( parent !== undefined ) {\n\t\tif ( clientIds.includes( parent ) ) {\n\t\t\treturn parent;\n\t\t}\n\t\tparent = state.blocks.parents.get( parent );\n\t}\n}\n\n/**\n * Checks if a block has any bindings in its metadata attributes.\n *\n * @param {Object} block The block object to check for bindings.\n * @return {boolean} True if the block has bindings, false otherwise.\n */\nfunction hasBindings( block ) {\n\treturn (\n\t\tblock?.attributes?.metadata?.bindings &&\n\t\tObject.keys( block?.attributes?.metadata?.bindings ).length\n\t);\n}\n\n/**\n * Computes and returns derived block editing modes for a given block tree.\n *\n * This function calculates the editing modes for each block in the tree, taking into account\n * various factors such as zoom level, sections, and synced patterns.\n *\n * @param {Object} state The current state object.\n * @param {string} treeClientId The client ID of the root block for the tree. Defaults to an empty string.\n * @return {Map} A Map containing the derived block editing modes, keyed by block client ID.\n */\nfunction getDerivedBlockEditingModesForTree( state, treeClientId = '' ) {\n\tconst isZoomedOut =\n\t\tstate?.zoomLevel < 100 || state?.zoomLevel === 'auto-scaled';\n\tconst derivedBlockEditingModes = new Map();\n\n\t// When there are sections, the majority of blocks are disabled,\n\t// so the default block editing mode is set to disabled.\n\tconst sectionRootClientId = state.settings?.[ sectionRootClientIdKey ];\n\tconst sectionClientIds = state.blocks.order.get( sectionRootClientId );\n\tconst hasDisabledBlocks = Array.from( state.blockEditingModes ).some(\n\t\t( [ , mode ] ) => mode === 'disabled'\n\t);\n\tconst templatePartClientIds = [];\n\tconst syncedPatternClientIds = [];\n\n\tObject.keys( state.blocks.controlledInnerBlocks ).forEach( ( clientId ) => {\n\t\tconst block = state.blocks.byClientId?.get( clientId );\n\n\t\tif ( block?.name === 'core/template-part' ) {\n\t\t\ttemplatePartClientIds.push( clientId );\n\t\t}\n\n\t\tif ( block?.name === 'core/block' ) {\n\t\t\tsyncedPatternClientIds.push( clientId );\n\t\t}\n\t} );\n\tconst contentOnlyTemplateLockedClientIds = Object.keys(\n\t\tstate.blockListSettings\n\t).filter(\n\t\t( clientId ) =>\n\t\t\tstate.blockListSettings[ clientId ]?.templateLock === 'contentOnly'\n\t);\n\n\t// When in an isolated editing context (e.g., editing a template part or pattern directly),\n\t// don't apply contentOnly mode to nested unsynced patterns or template parts.\n\tconst isIsolatedEditor = state.settings?.[ isIsolatedEditorKey ];\n\n\tconst disableContentOnlyForUnsyncedPatterns =\n\t\tstate.settings?.disableContentOnlyForUnsyncedPatterns;\n\n\t// Use array.from for better back compat. Older versions of the iterator returned\n\t// from `keys()` didn't have the `filter` method.\n\tconst unsyncedPatternClientIds =\n\t\tisIsolatedEditor || disableContentOnlyForUnsyncedPatterns\n\t\t\t? []\n\t\t\t: Array.from( state.blocks.attributes.keys() ).filter(\n\t\t\t\t\t( clientId ) =>\n\t\t\t\t\t\tstate.blocks.attributes.get( clientId )?.metadata\n\t\t\t\t\t\t\t?.patternName\n\t\t\t );\n\tconst disableContentOnlyForTemplateParts =\n\t\tstate.settings?.disableContentOnlyForTemplateParts;\n\n\tconst contentOnlyParents = [\n\t\t...contentOnlyTemplateLockedClientIds,\n\t\t...unsyncedPatternClientIds,\n\t\t...( isIsolatedEditor || disableContentOnlyForTemplateParts\n\t\t\t? []\n\t\t\t: templatePartClientIds ),\n\t];\n\n\ttraverseBlockTree( state, treeClientId, ( block ) => {\n\t\tconst { clientId, name: blockName } = block;\n\n\t\tconst hasEditedContentOnlySection = !! state.editedContentOnlySection;\n\t\tlet isWithinEditedContentOnlySection = false;\n\t\tif ( hasEditedContentOnlySection ) {\n\t\t\tisWithinEditedContentOnlySection =\n\t\t\t\tclientId === state.editedContentOnlySection ||\n\t\t\t\t!! findParentInClientIdsList( state, clientId, [\n\t\t\t\t\tstate.editedContentOnlySection,\n\t\t\t\t] );\n\n\t\t\t// When a contentOnly section is being edited, all blocks outside\n\t\t\t// the section are disabled. This should never be overridable by any\n\t\t\t// other block editing modes, it helps to constrain keyboard navigation\n\t\t\t// to within the edited section.\n\t\t\tif ( ! isWithinEditedContentOnlySection ) {\n\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// If the block already has an explicit block editing mode set,\n\t\t// don't override it.\n\t\tif ( state.blockEditingModes.has( clientId ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Disabled explicit block editing modes are inherited by children.\n\t\t// It's an expensive calculation, so only do it if there are disabled blocks.\n\t\tif ( hasDisabledBlocks ) {\n\t\t\t// Look through parents to find one with an explicit block editing mode.\n\t\t\tlet ancestorBlockEditingMode;\n\t\t\tlet parent = state.blocks.parents.get( clientId );\n\t\t\twhile ( parent !== undefined ) {\n\t\t\t\tif ( state.blockEditingModes.has( parent ) ) {\n\t\t\t\t\t// Checking the explicit block editing mode will be slower,\n\t\t\t\t\t// as the block editing mode is more likely to be set on a\n\t\t\t\t\t// distant ancestor.\n\t\t\t\t\tancestorBlockEditingMode =\n\t\t\t\t\t\tstate.blockEditingModes.get( parent );\n\t\t\t\t}\n\t\t\t\tif ( ancestorBlockEditingMode ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tparent = state.blocks.parents.get( parent );\n\t\t\t}\n\n\t\t\t// If the ancestor block editing mode is disabled, it's inherited by the child.\n\t\t\tif ( ancestorBlockEditingMode === 'disabled' ) {\n\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif ( isZoomedOut ) {\n\t\t\t// If the root block is the section root set its editing mode to contentOnly.\n\t\t\tif ( clientId === sectionRootClientId ) {\n\t\t\t\tderivedBlockEditingModes.set( clientId, 'contentOnly' );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// There are no sections, so everything else is disabled.\n\t\t\tif ( ! sectionClientIds?.length ) {\n\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( sectionClientIds.includes( clientId ) ) {\n\t\t\t\tderivedBlockEditingModes.set( clientId, 'contentOnly' );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If zoomed out, all blocks that aren't sections or the section root are\n\t\t\t// disabled.\n\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( syncedPatternClientIds.length ) {\n\t\t\t// Synced pattern blocks (core/block).\n\t\t\tif ( syncedPatternClientIds.includes( clientId ) ) {\n\t\t\t\t// This is a synced pattern nested in another synced pattern,\n\t\t\t\t// disable the core/block itself.\n\t\t\t\tif (\n\t\t\t\t\tfindParentInClientIdsList(\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\tsyncedPatternClientIds\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Else do nothing, use the default block editing mode.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Inner blocks of synced patterns.\n\t\t\tconst parentSyncedPatternClientId = findParentInClientIdsList(\n\t\t\t\tstate,\n\t\t\t\tclientId,\n\t\t\t\tsyncedPatternClientIds\n\t\t\t);\n\t\t\tif ( parentSyncedPatternClientId ) {\n\t\t\t\t// This is an inner block of a synced pattern that's nested in another synced pattern,\n\t\t\t\t// disable its contents.\n\t\t\t\tif (\n\t\t\t\t\tfindParentInClientIdsList(\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tparentSyncedPatternClientId,\n\t\t\t\t\t\tsyncedPatternClientIds\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( hasBindings( block ) ) {\n\t\t\t\t\tderivedBlockEditingModes.set( clientId, 'contentOnly' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Synced pattern content without a binding isn't editable\n\t\t\t\t// from the instance, the user has to edit the pattern source,\n\t\t\t\t// so return 'disabled'.\n\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Set the edited section and all blocks within it to 'default', so that all changes can be made.\n\t\tif ( hasEditedContentOnlySection && isWithinEditedContentOnlySection ) {\n\t\t\tderivedBlockEditingModes.set( clientId, 'default' );\n\t\t\t// When there's an editedContentOnlySection, it overrides any modes that are usually\n\t\t\t// set for `contentOnlyParents`, return early to prevent continuing to code below.\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle `templateLock=contentOnly` blocks and unsynced patterns.\n\t\tif ( contentOnlyParents.length ) {\n\t\t\tconst hasContentOnlyParent = !! findParentInClientIdsList(\n\t\t\t\tstate,\n\t\t\t\tclientId,\n\t\t\t\tcontentOnlyParents\n\t\t\t);\n\t\t\tif ( hasContentOnlyParent ) {\n\t\t\t\tif ( isContentBlock( blockName ) ) {\n\t\t\t\t\tderivedBlockEditingModes.set( clientId, 'contentOnly' );\n\t\t\t\t} else {\n\t\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} );\n\n\treturn derivedBlockEditingModes;\n}\n\n/**\n * Updates the derived block editing modes based on added and removed blocks.\n *\n * This function handles the updating of block editing modes when blocks are added,\n * removed, or moved within the editor.\n *\n * It only returns a value when modifications are made to the block editing modes.\n *\n * @param {Object} options The options for updating derived block editing modes.\n * @param {Object} options.prevState The previous state object.\n * @param {Object} options.nextState The next state object.\n * @param {Array} [options.addedBlocks] An array of blocks that were added.\n * @param {Array} [options.removedClientIds] An array of client IDs of blocks that were removed.\n * @return {Map|undefined} The updated derived block editing modes, or undefined if no changes were made.\n */\nfunction getDerivedBlockEditingModesUpdates( {\n\tprevState,\n\tnextState,\n\taddedBlocks,\n\tremovedClientIds,\n} ) {\n\tconst prevDerivedBlockEditingModes = prevState.derivedBlockEditingModes;\n\tlet nextDerivedBlockEditingModes;\n\n\t// Perform removals before additions to handle cases like the `MOVE_BLOCKS_TO_POSITION` action.\n\t// That action removes a set of clientIds, but adds the same blocks back in a different location.\n\t// If removals were performed after additions, those moved clientIds would be removed incorrectly.\n\tremovedClientIds?.forEach( ( clientId ) => {\n\t\t// The actions only receive parent block IDs for removal.\n\t\t// Recurse through the block tree to ensure all blocks are removed.\n\t\t// Specifically use the previous state, before the blocks were removed.\n\t\ttraverseBlockTree( prevState, clientId, ( block ) => {\n\t\t\tif ( prevDerivedBlockEditingModes.has( block.clientId ) ) {\n\t\t\t\tif ( ! nextDerivedBlockEditingModes ) {\n\t\t\t\t\tnextDerivedBlockEditingModes = new Map(\n\t\t\t\t\t\tprevDerivedBlockEditingModes\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tnextDerivedBlockEditingModes.delete( block.clientId );\n\t\t\t}\n\t\t} );\n\t} );\n\n\taddedBlocks?.forEach( ( addedBlock ) => {\n\t\tconst updates = getDerivedBlockEditingModesForTree(\n\t\t\tnextState,\n\t\t\taddedBlock.clientId\n\t\t);\n\n\t\tif ( updates.size ) {\n\t\t\tif ( ! nextDerivedBlockEditingModes ) {\n\t\t\t\tnextDerivedBlockEditingModes = new Map( [\n\t\t\t\t\t...( prevDerivedBlockEditingModes?.size\n\t\t\t\t\t\t? prevDerivedBlockEditingModes\n\t\t\t\t\t\t: [] ),\n\t\t\t\t\t...updates,\n\t\t\t\t] );\n\t\t\t} else {\n\t\t\t\tnextDerivedBlockEditingModes = new Map( [\n\t\t\t\t\t...( nextDerivedBlockEditingModes?.size\n\t\t\t\t\t\t? nextDerivedBlockEditingModes\n\t\t\t\t\t\t: [] ),\n\t\t\t\t\t...updates,\n\t\t\t\t] );\n\t\t\t}\n\t\t}\n\t} );\n\n\treturn nextDerivedBlockEditingModes;\n}\n\n/**\n * Higher-order reducer that adds derived block editing modes to the state.\n *\n * This function wraps a reducer and enhances it to handle actions that affect\n * block editing modes. It updates the derivedBlockEditingModes in the state\n * based on various actions such as adding, removing, or moving blocks, or changing\n * the editor mode.\n *\n * @param {Function} reducer The original reducer function to be wrapped.\n * @return {Function} A new reducer function that includes derived block editing modes handling.\n */\nexport function withDerivedBlockEditingModes( reducer ) {\n\treturn ( state, action ) => {\n\t\tconst nextState = reducer( state, action );\n\n\t\t// An exception is needed here to still recompute the block editing modes when\n\t\t// the editor mode changes since the editor mode isn't stored within the\n\t\t// block editor state and changing it won't trigger an altered new state.\n\t\tif ( action.type !== 'SET_EDITOR_MODE' && nextState === state ) {\n\t\t\treturn state;\n\t\t}\n\n\t\tswitch ( action.type ) {\n\t\t\tcase 'REMOVE_BLOCKS': {\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\tremovedClientIds: action.clientIds,\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'RECEIVE_BLOCKS':\n\t\t\tcase 'INSERT_BLOCKS': {\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\taddedBlocks: action.blocks,\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'UPDATE_BLOCK_ATTRIBUTES': {\n\t\t\t\t// Handle unsynced patterns which indicate their contentOnly-ness via\n\t\t\t\t// the `attributes.metadata.patternName` property.\n\t\t\t\t// Check when this is added or removed and update blockEditingModes.\n\t\t\t\tconst disableContentOnlyForUnsyncedPatterns =\n\t\t\t\t\tnextState.settings?.disableContentOnlyForUnsyncedPatterns;\n\n\t\t\t\tif ( disableContentOnlyForUnsyncedPatterns ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst addedBlocks = [];\n\t\t\t\tconst removedClientIds = [];\n\n\t\t\t\tfor ( const clientId of action?.clientIds ) {\n\t\t\t\t\tconst attributes = action.options?.uniqueByBlock\n\t\t\t\t\t\t? action.attributes[ clientId ]\n\t\t\t\t\t\t: action.attributes;\n\n\t\t\t\t\tif ( ! attributes ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (\n\t\t\t\t\t\t// patternName is switching from falsy to truthy, indicating\n\t\t\t\t\t\t// this block is becoming an unsynced pattern.\n\t\t\t\t\t\tattributes.metadata?.patternName &&\n\t\t\t\t\t\t! state.blocks.attributes.get( clientId )?.metadata\n\t\t\t\t\t\t\t?.patternName\n\t\t\t\t\t) {\n\t\t\t\t\t\taddedBlocks.push(\n\t\t\t\t\t\t\tnextState.blocks.tree.get( clientId )\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (\n\t\t\t\t\t\t// patternName is switching from truthy to falsy, this block is becoming\n\t\t\t\t\t\t// a regular block but was an unsynced pattern.\n\t\t\t\t\t\t// Check that `metadata` is part of the included attributes, as\n\t\t\t\t\t\t// `updateBlockAttributes` merges attributes, if it isn't present\n\t\t\t\t\t\t// the previous `metadata` would be retained.\n\t\t\t\t\t\tattributes.metadata &&\n\t\t\t\t\t\t! attributes.metadata?.patternName &&\n\t\t\t\t\t\tstate.blocks.attributes.get( clientId )?.metadata\n\t\t\t\t\t\t\t?.patternName\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Include it in 'removedClientIds'.\n\t\t\t\t\t\tremovedClientIds.push( clientId );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( ! addedBlocks?.length && ! removedClientIds?.length ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\taddedBlocks,\n\t\t\t\t\t\tremovedClientIds,\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'UPDATE_BLOCK_LIST_SETTINGS': {\n\t\t\t\t// Handle the addition and removal of contentOnly template locked blocks.\n\t\t\t\tconst addedBlocks = [];\n\t\t\t\tconst removedClientIds = [];\n\n\t\t\t\tconst updates =\n\t\t\t\t\ttypeof action.clientId === 'string'\n\t\t\t\t\t\t? { [ action.clientId ]: action.settings }\n\t\t\t\t\t\t: action.clientId;\n\n\t\t\t\tfor ( const clientId in updates ) {\n\t\t\t\t\tconst isNewContentOnlyBlock =\n\t\t\t\t\t\tstate.blockListSettings[ clientId ]?.templateLock !==\n\t\t\t\t\t\t\t'contentOnly' &&\n\t\t\t\t\t\tnextState.blockListSettings[ clientId ]\n\t\t\t\t\t\t\t?.templateLock === 'contentOnly';\n\n\t\t\t\t\tconst wasContentOnlyBlock =\n\t\t\t\t\t\tstate.blockListSettings[ clientId ]?.templateLock ===\n\t\t\t\t\t\t\t'contentOnly' &&\n\t\t\t\t\t\tnextState.blockListSettings[ clientId ]\n\t\t\t\t\t\t\t?.templateLock !== 'contentOnly';\n\n\t\t\t\t\tif ( isNewContentOnlyBlock ) {\n\t\t\t\t\t\taddedBlocks.push(\n\t\t\t\t\t\t\tnextState.blocks.tree.get( clientId )\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if ( wasContentOnlyBlock ) {\n\t\t\t\t\t\tremovedClientIds.push( clientId );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( ! addedBlocks.length && ! removedClientIds.length ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\taddedBlocks,\n\t\t\t\t\t\tremovedClientIds,\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'SET_BLOCK_EDITING_MODE':\n\t\t\tcase 'UNSET_BLOCK_EDITING_MODE':\n\t\t\tcase 'SET_HAS_CONTROLLED_INNER_BLOCKS': {\n\t\t\t\tconst updatedBlock = getBlockTreeBlock(\n\t\t\t\t\tnextState,\n\t\t\t\t\taction.clientId\n\t\t\t\t);\n\n\t\t\t\t// The block might have been removed in which case it'll be\n\t\t\t\t// handled by the `REMOVE_BLOCKS` action.\n\t\t\t\tif ( ! updatedBlock ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\tremovedClientIds: [ action.clientId ],\n\t\t\t\t\t\taddedBlocks: [ updatedBlock ],\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'REPLACE_BLOCKS': {\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\taddedBlocks: action.blocks,\n\t\t\t\t\t\tremovedClientIds: action.clientIds,\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'REPLACE_INNER_BLOCKS': {\n\t\t\t\t// Get the clientIds of the blocks that are being replaced\n\t\t\t\t// from the old state, before they were removed.\n\t\t\t\tconst removedClientIds = state.blocks.order.get(\n\t\t\t\t\taction.rootClientId\n\t\t\t\t);\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\taddedBlocks: action.blocks,\n\t\t\t\t\t\tremovedClientIds,\n\t\t\t\t\t} );\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'MOVE_BLOCKS_TO_POSITION': {\n\t\t\t\tconst addedBlocks = action.clientIds.map( ( clientId ) => {\n\t\t\t\t\treturn nextState.blocks.byClientId.get( clientId );\n\t\t\t\t} );\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\taddedBlocks,\n\t\t\t\t\t\tremovedClientIds: action.clientIds,\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'UPDATE_SETTINGS': {\n\t\t\t\t// Recompute the entire tree if the section root,\n\t\t\t\t// the effective disableContentOnlyForUnsyncedPatterns value,\n\t\t\t\t// the isIsolatedEditor value, or the\n\t\t\t\t// disableContentOnlyForTemplateParts value changes.\n\t\t\t\t// These are all values that affect the computation.\n\t\t\t\tif (\n\t\t\t\t\tstate?.settings?.[ sectionRootClientIdKey ] !==\n\t\t\t\t\t\tnextState?.settings?.[ sectionRootClientIdKey ] ||\n\t\t\t\t\t!! state?.settings\n\t\t\t\t\t\t?.disableContentOnlyForUnsyncedPatterns !==\n\t\t\t\t\t\t!! nextState?.settings\n\t\t\t\t\t\t\t?.disableContentOnlyForUnsyncedPatterns ||\n\t\t\t\t\t!! state?.settings?.[ isIsolatedEditorKey ] !==\n\t\t\t\t\t\t!! nextState?.settings?.[ isIsolatedEditorKey ] ||\n\t\t\t\t\t!! state?.settings?.disableContentOnlyForTemplateParts !==\n\t\t\t\t\t\t!! nextState?.settings\n\t\t\t\t\t\t\t?.disableContentOnlyForTemplateParts\n\t\t\t\t) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tgetDerivedBlockEditingModesForTree( nextState ),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'RESET_BLOCKS':\n\t\t\tcase 'EDIT_CONTENT_ONLY_SECTION':\n\t\t\tcase 'SET_EDITOR_MODE':\n\t\t\tcase 'RESET_ZOOM_LEVEL':\n\t\t\tcase 'SET_ZOOM_LEVEL': {\n\t\t\t\t// Recompute the entire tree if the editor mode or zoom level changes,\n\t\t\t\t// or if all the blocks are reset.\n\t\t\t\treturn {\n\t\t\t\t\t...nextState,\n\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\tgetDerivedBlockEditingModesForTree( nextState ),\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// If there's no change, the derivedBlockEditingModes from the previous\n\t\t// state need to be preserved.\n\t\tnextState.derivedBlockEditingModes =\n\t\t\tstate?.derivedBlockEditingModes ?? new Map();\n\n\t\treturn nextState;\n\t};\n}\n\nfunction withAutomaticChangeReset( reducer ) {\n\treturn ( state, action ) => {\n\t\tconst nextState = reducer( state, action );\n\n\t\tif ( ! state ) {\n\t\t\treturn nextState;\n\t\t}\n\n\t\t// Take over the last value without creating a new reference.\n\t\tnextState.automaticChangeStatus = state.automaticChangeStatus;\n\n\t\tif ( action.type === 'MARK_AUTOMATIC_CHANGE' ) {\n\t\t\treturn {\n\t\t\t\t...nextState,\n\t\t\t\tautomaticChangeStatus: 'pending',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\taction.type === 'MARK_AUTOMATIC_CHANGE_FINAL' &&\n\t\t\tstate.automaticChangeStatus === 'pending'\n\t\t) {\n\t\t\treturn {\n\t\t\t\t...nextState,\n\t\t\t\tautomaticChangeStatus: 'final',\n\t\t\t};\n\t\t}\n\n\t\t// If there's a change that doesn't affect blocks or selection, maintain\n\t\t// the current status.\n\t\tif (\n\t\t\tnextState.blocks === state.blocks &&\n\t\t\tnextState.selection === state.selection\n\t\t) {\n\t\t\treturn nextState;\n\t\t}\n\n\t\t// As long as the state is not final, ignore any selection changes.\n\t\tif (\n\t\t\tnextState.automaticChangeStatus !== 'final' &&\n\t\t\tnextState.selection !== state.selection\n\t\t) {\n\t\t\treturn nextState;\n\t\t}\n\n\t\t// Reset the status if blocks change or selection changes (when status is final).\n\t\treturn {\n\t\t\t...nextState,\n\t\t\tautomaticChangeStatus: undefined,\n\t\t};\n\t};\n}\n\nexport default pipe(\n\twithDerivedBlockEditingModes,\n\twithAutomaticChangeReset\n)( combinedReducers );\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * External dependencies\n */\nimport fastDeepEqual from 'fast-deep-equal/es6/index.js';\n\n/**\n * WordPress dependencies\n */\nimport { pipe } from '@wordpress/compose';\nimport { combineReducers, select } from '@wordpress/data';\nimport deprecated from '@wordpress/deprecated';\nimport {\n\tstore as blocksStore,\n\tprivateApis as blocksPrivateApis,\n} from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport { PREFERENCES_DEFAULTS, SETTINGS_DEFAULTS } from './defaults';\nimport { insertAt, moveTo } from './array';\nimport { sectionRootClientIdKey, isIsolatedEditorKey } from './private-keys';\nimport { unlock } from '../lock-unlock';\n\nconst { isContentBlock } = unlock( blocksPrivateApis );\n\nconst identity = ( x ) => x;\n\n/**\n * Given an array of blocks, returns an object where each key is a nesting\n * context, the value of which is an array of block client IDs existing within\n * that nesting context.\n *\n * @param {Array} blocks Blocks to map.\n * @param {?string} rootClientId Assumed root client ID.\n *\n * @return {Object} Block order map object.\n */\nfunction mapBlockOrder( blocks, rootClientId = '' ) {\n\tconst result = new Map();\n\tconst current = [];\n\tresult.set( rootClientId, current );\n\tblocks.forEach( ( block ) => {\n\t\tconst { clientId, innerBlocks } = block;\n\t\tcurrent.push( clientId );\n\t\tmapBlockOrder( innerBlocks, clientId ).forEach(\n\t\t\t( order, subClientId ) => {\n\t\t\t\tresult.set( subClientId, order );\n\t\t\t}\n\t\t);\n\t} );\n\treturn result;\n}\n\n/**\n * Given an array of blocks, returns an object where each key contains\n * the clientId of the block and the value is the parent of the block.\n *\n * @param {Array} blocks Blocks to map.\n * @param {?string} rootClientId Assumed root client ID.\n *\n * @return {Object} Block order map object.\n */\nfunction mapBlockParents( blocks, rootClientId = '' ) {\n\tconst result = [];\n\tconst stack = [ [ rootClientId, blocks ] ];\n\twhile ( stack.length ) {\n\t\tconst [ parent, currentBlocks ] = stack.shift();\n\t\tcurrentBlocks.forEach( ( { innerBlocks, ...block } ) => {\n\t\t\tresult.push( [ block.clientId, parent ] );\n\t\t\tif ( innerBlocks?.length ) {\n\t\t\t\tstack.push( [ block.clientId, innerBlocks ] );\n\t\t\t}\n\t\t} );\n\t}\n\treturn result;\n}\n\n/**\n * Helper method to iterate through all blocks, recursing into inner blocks,\n * applying a transformation function to each one.\n * Returns a flattened object with the transformed blocks.\n *\n * @param {Array} blocks Blocks to flatten.\n * @param {Function} transform Transforming function to be applied to each block.\n *\n * @return {Array} Flattened object.\n */\nfunction flattenBlocks( blocks, transform = identity ) {\n\tconst result = [];\n\n\tconst stack = [ ...blocks ];\n\twhile ( stack.length ) {\n\t\tconst { innerBlocks, ...block } = stack.shift();\n\t\tstack.push( ...innerBlocks );\n\t\tresult.push( [ block.clientId, transform( block ) ] );\n\t}\n\n\treturn result;\n}\n\nfunction getFlattenedClientIds( blocks ) {\n\tconst result = {};\n\tconst stack = [ ...blocks ];\n\twhile ( stack.length ) {\n\t\tconst { innerBlocks, ...block } = stack.shift();\n\t\tstack.push( ...innerBlocks );\n\t\tresult[ block.clientId ] = true;\n\t}\n\n\treturn result;\n}\n\n/**\n * Given an array of blocks, returns an object containing all blocks, without\n * attributes, recursing into inner blocks. Keys correspond to the block client\n * ID, the value of which is the attributes object.\n *\n * @param {Array} blocks Blocks to flatten.\n *\n * @return {Array} Flattened block attributes object.\n */\nfunction getFlattenedBlocksWithoutAttributes( blocks ) {\n\treturn flattenBlocks( blocks, ( block ) => {\n\t\tconst { attributes, ...restBlock } = block;\n\t\treturn restBlock;\n\t} );\n}\n\n/**\n * Given an array of blocks, returns an object containing all block attributes,\n * recursing into inner blocks. Keys correspond to the block client ID, the\n * value of which is the attributes object.\n *\n * @param {Array} blocks Blocks to flatten.\n *\n * @return {Array} Flattened block attributes object.\n */\nfunction getFlattenedBlockAttributes( blocks ) {\n\treturn flattenBlocks( blocks, ( block ) => block.attributes );\n}\n\n/**\n * Returns true if the two object arguments have the same keys, or false\n * otherwise.\n *\n * @param {Object} a First object.\n * @param {Object} b Second object.\n *\n * @return {boolean} Whether the two objects have the same keys.\n */\nexport function hasSameKeys( a, b ) {\n\treturn fastDeepEqual( Object.keys( a ), Object.keys( b ) );\n}\n\n/**\n * Returns true if, given the currently dispatching action and the previously\n * dispatched action, the two actions are updating the same block attribute, or\n * false otherwise.\n *\n * @param {Object} action Currently dispatching action.\n * @param {Object} lastAction Previously dispatched action.\n *\n * @return {boolean} Whether actions are updating the same block attribute.\n */\nexport function isUpdatingSameBlockAttribute( action, lastAction ) {\n\treturn (\n\t\taction.type === 'UPDATE_BLOCK_ATTRIBUTES' &&\n\t\tlastAction !== undefined &&\n\t\tlastAction.type === 'UPDATE_BLOCK_ATTRIBUTES' &&\n\t\tfastDeepEqual( action.clientIds, lastAction.clientIds ) &&\n\t\thasSameKeys( action.attributes, lastAction.attributes )\n\t);\n}\n\nfunction updateBlockTreeForBlocks( state, blocks ) {\n\tconst treeToUpdate = state.tree;\n\tconst stack = [ ...blocks ];\n\tconst flattenedBlocks = [ ...blocks ];\n\twhile ( stack.length ) {\n\t\tconst block = stack.shift();\n\t\tstack.push( ...block.innerBlocks );\n\t\tflattenedBlocks.push( ...block.innerBlocks );\n\t}\n\t// Create objects before mutating them, that way it's always defined.\n\tfor ( const block of flattenedBlocks ) {\n\t\ttreeToUpdate.set( block.clientId, {} );\n\t}\n\tfor ( const block of flattenedBlocks ) {\n\t\ttreeToUpdate.set(\n\t\t\tblock.clientId,\n\t\t\tObject.assign( treeToUpdate.get( block.clientId ), {\n\t\t\t\t...state.byClientId.get( block.clientId ),\n\t\t\t\tattributes: state.attributes.get( block.clientId ),\n\t\t\t\tinnerBlocks: block.innerBlocks.map( ( subBlock ) =>\n\t\t\t\t\ttreeToUpdate.get( subBlock.clientId )\n\t\t\t\t),\n\t\t\t} )\n\t\t);\n\t}\n}\n\nfunction updateParentInnerBlocksInTree(\n\tstate,\n\tupdatedClientIds,\n\tupdateChildrenOfUpdatedClientIds = false\n) {\n\tconst treeToUpdate = state.tree;\n\tconst uncontrolledParents = new Set( [] );\n\tconst controlledParents = new Set();\n\tfor ( const clientId of updatedClientIds ) {\n\t\tlet current = updateChildrenOfUpdatedClientIds\n\t\t\t? clientId\n\t\t\t: state.parents.get( clientId );\n\t\tdo {\n\t\t\tif ( state.controlledInnerBlocks[ current ] ) {\n\t\t\t\t// Should stop on controlled blocks.\n\t\t\t\t// If we reach a controlled parent, break out of the loop.\n\t\t\t\tcontrolledParents.add( current );\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\t// Else continue traversing up through parents.\n\t\t\t\tuncontrolledParents.add( current );\n\t\t\t\tcurrent = state.parents.get( current );\n\t\t\t}\n\t\t} while ( current !== undefined );\n\t}\n\n\t// To make sure the order of assignments doesn't matter,\n\t// we first create empty objects and mutates the inner blocks later.\n\tfor ( const clientId of uncontrolledParents ) {\n\t\ttreeToUpdate.set( clientId, { ...treeToUpdate.get( clientId ) } );\n\t}\n\tfor ( const clientId of uncontrolledParents ) {\n\t\ttreeToUpdate.get( clientId ).innerBlocks = (\n\t\t\tstate.order.get( clientId ) || []\n\t\t).map( ( subClientId ) => treeToUpdate.get( subClientId ) );\n\t}\n\n\t// Controlled parent blocks, need a dedicated key for their inner blocks\n\t// to be used when doing getBlocks( controlledBlockClientId ).\n\tfor ( const clientId of controlledParents ) {\n\t\ttreeToUpdate.set( 'controlled||' + clientId, {\n\t\t\tinnerBlocks: ( state.order.get( clientId ) || [] ).map(\n\t\t\t\t( subClientId ) => treeToUpdate.get( subClientId )\n\t\t\t),\n\t\t} );\n\t}\n}\n\n/**\n * Higher-order reducer intended to compute full block objects key for each block in the post.\n * This is a denormalization to optimize the performance of the getBlock selectors and avoid\n * recomputing the block objects and avoid heavy memoization.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nconst withBlockTree =\n\t( reducer ) =>\n\t( state = {}, action ) => {\n\t\tconst newState = reducer( state, action );\n\n\t\tif ( newState === state ) {\n\t\t\treturn state;\n\t\t}\n\n\t\tnewState.tree = state.tree ? state.tree : new Map();\n\t\tswitch ( action.type ) {\n\t\t\tcase 'RECEIVE_BLOCKS':\n\t\t\tcase 'INSERT_BLOCKS': {\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\tupdateBlockTreeForBlocks( newState, action.blocks );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\taction.rootClientId ? [ action.rootClientId ] : [ '' ],\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'UPDATE_BLOCK':\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\tnewState.tree.set( action.clientId, {\n\t\t\t\t\t...newState.tree.get( action.clientId ),\n\t\t\t\t\t...newState.byClientId.get( action.clientId ),\n\t\t\t\t\tattributes: newState.attributes.get( action.clientId ),\n\t\t\t\t} );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\t[ action.clientId ],\n\t\t\t\t\tfalse\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase 'SYNC_DERIVED_BLOCK_ATTRIBUTES':\n\t\t\tcase 'UPDATE_BLOCK_ATTRIBUTES': {\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\taction.clientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.tree.set( clientId, {\n\t\t\t\t\t\t...newState.tree.get( clientId ),\n\t\t\t\t\t\tattributes: newState.attributes.get( clientId ),\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\taction.clientIds,\n\t\t\t\t\tfalse\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst inserterClientIds = getFlattenedClientIds(\n\t\t\t\t\taction.blocks\n\t\t\t\t);\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\taction.replacedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.tree.delete( clientId );\n\t\t\t\t\t// Controlled inner blocks are only removed\n\t\t\t\t\t// if the block doesn't move to another position\n\t\t\t\t\t// otherwise their content will be lost.\n\t\t\t\t\tif ( ! inserterClientIds[ clientId ] ) {\n\t\t\t\t\t\tnewState.tree.delete( 'controlled||' + clientId );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tupdateBlockTreeForBlocks( newState, action.blocks );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\taction.blocks.map( ( b ) => b.clientId ),\n\t\t\t\t\tfalse\n\t\t\t\t);\n\n\t\t\t\t// If there are no replaced blocks, it means we're removing blocks so we need to update their parent.\n\t\t\t\tconst parentsOfRemovedBlocks = [];\n\t\t\t\tfor ( const clientId of action.clientIds ) {\n\t\t\t\t\tconst parentId = state.parents.get( clientId );\n\t\t\t\t\tif (\n\t\t\t\t\t\tparentId !== undefined &&\n\t\t\t\t\t\t( parentId === '' ||\n\t\t\t\t\t\t\tnewState.byClientId.get( parentId ) )\n\t\t\t\t\t) {\n\t\t\t\t\t\tparentsOfRemovedBlocks.push( parentId );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\tparentsOfRemovedBlocks,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN':\n\t\t\t\tconst parentsOfRemovedBlocks = [];\n\t\t\t\tfor ( const clientId of action.clientIds ) {\n\t\t\t\t\tconst parentId = state.parents.get( clientId );\n\t\t\t\t\tif (\n\t\t\t\t\t\tparentId !== undefined &&\n\t\t\t\t\t\t( parentId === '' ||\n\t\t\t\t\t\t\tnewState.byClientId.get( parentId ) )\n\t\t\t\t\t) {\n\t\t\t\t\t\tparentsOfRemovedBlocks.push( parentId );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\taction.removedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.tree.delete( clientId );\n\t\t\t\t\tnewState.tree.delete( 'controlled||' + clientId );\n\t\t\t\t} );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\tparentsOfRemovedBlocks,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase 'MOVE_BLOCKS_TO_POSITION': {\n\t\t\t\tconst updatedBlockUids = [];\n\t\t\t\tif ( action.fromRootClientId ) {\n\t\t\t\t\tupdatedBlockUids.push( action.fromRootClientId );\n\t\t\t\t} else {\n\t\t\t\t\tupdatedBlockUids.push( '' );\n\t\t\t\t}\n\t\t\t\tif ( action.toRootClientId ) {\n\t\t\t\t\tupdatedBlockUids.push( action.toRootClientId );\n\t\t\t\t}\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\tupdatedBlockUids,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'MOVE_BLOCKS_UP':\n\t\t\tcase 'MOVE_BLOCKS_DOWN': {\n\t\t\t\tconst updatedBlockUids = [\n\t\t\t\t\taction.rootClientId ? action.rootClientId : '',\n\t\t\t\t];\n\t\t\t\tnewState.tree = new Map( newState.tree );\n\t\t\t\tupdateParentInnerBlocksInTree(\n\t\t\t\t\tnewState,\n\t\t\t\t\tupdatedBlockUids,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn newState;\n\t};\n\n/**\n * Higher-order reducer intended to augment the blocks reducer, assigning an\n * `isPersistentChange` property value corresponding to whether a change in\n * state can be considered as persistent. All changes are considered persistent\n * except when updating the same block attribute as in the previous action.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nfunction withPersistentBlockChange( reducer ) {\n\tlet lastAction;\n\tlet markNextChangeAsNotPersistent = false;\n\tlet explicitPersistent;\n\n\treturn ( state, action ) => {\n\t\tlet nextState = reducer( state, action );\n\n\t\tlet nextIsPersistentChange;\n\t\tif ( action.type === 'SET_EXPLICIT_PERSISTENT' ) {\n\t\t\texplicitPersistent = action.isPersistentChange;\n\t\t\tnextIsPersistentChange = state.isPersistentChange ?? true;\n\t\t}\n\n\t\tif ( explicitPersistent !== undefined ) {\n\t\t\tnextIsPersistentChange = explicitPersistent;\n\t\t\treturn nextIsPersistentChange === nextState.isPersistentChange\n\t\t\t\t? nextState\n\t\t\t\t: {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tisPersistentChange: nextIsPersistentChange,\n\t\t\t\t };\n\t\t}\n\n\t\tconst isExplicitPersistentChange =\n\t\t\taction.type === 'MARK_LAST_CHANGE_AS_PERSISTENT' ||\n\t\t\tmarkNextChangeAsNotPersistent;\n\n\t\t// Defer to previous state value (or default) unless changing or\n\t\t// explicitly marking as persistent.\n\t\tif ( state === nextState && ! isExplicitPersistentChange ) {\n\t\t\tmarkNextChangeAsNotPersistent =\n\t\t\t\taction.type === 'MARK_NEXT_CHANGE_AS_NOT_PERSISTENT';\n\n\t\t\tnextIsPersistentChange = state?.isPersistentChange ?? true;\n\t\t\tif ( state.isPersistentChange === nextIsPersistentChange ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...nextState,\n\t\t\t\tisPersistentChange: nextIsPersistentChange,\n\t\t\t};\n\t\t}\n\n\t\tnextState = {\n\t\t\t...nextState,\n\t\t\tisPersistentChange: isExplicitPersistentChange\n\t\t\t\t? ! markNextChangeAsNotPersistent\n\t\t\t\t: ! isUpdatingSameBlockAttribute( action, lastAction ),\n\t\t};\n\n\t\t// In comparing against the previous action, consider only those which\n\t\t// would have qualified as one which would have been ignored or not\n\t\t// have resulted in a changed state.\n\t\tlastAction = action;\n\t\tmarkNextChangeAsNotPersistent =\n\t\t\taction.type === 'MARK_NEXT_CHANGE_AS_NOT_PERSISTENT';\n\n\t\treturn nextState;\n\t};\n}\n\n/**\n * Higher-order reducer intended to augment the blocks reducer, assigning an\n * `isIgnoredChange` property value corresponding to whether a change in state\n * can be considered as ignored. A change is considered ignored when the result\n * of an action not incurred by direct user interaction.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nfunction withIgnoredBlockChange( reducer ) {\n\t/**\n\t * Set of action types for which a blocks state change should be ignored.\n\t *\n\t * @type {Set}\n\t */\n\tconst IGNORED_ACTION_TYPES = new Set( [ 'RECEIVE_BLOCKS' ] );\n\n\treturn ( state, action ) => {\n\t\tconst nextState = reducer( state, action );\n\n\t\tif ( nextState !== state ) {\n\t\t\tnextState.isIgnoredChange = IGNORED_ACTION_TYPES.has( action.type );\n\t\t}\n\n\t\treturn nextState;\n\t};\n}\n\n/**\n * Higher-order reducer targeting the combined blocks reducer, augmenting\n * block client IDs in remove action to include cascade of inner blocks.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nconst withInnerBlocksRemoveCascade = ( reducer ) => ( state, action ) => {\n\t// Gets all children which need to be removed.\n\tconst getAllChildren = ( clientIds ) => {\n\t\tlet result = clientIds;\n\t\tfor ( let i = 0; i < result.length; i++ ) {\n\t\t\tif (\n\t\t\t\t! state.order.get( result[ i ] ) ||\n\t\t\t\t( action.keepControlledInnerBlocks &&\n\t\t\t\t\taction.keepControlledInnerBlocks[ result[ i ] ] )\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( result === clientIds ) {\n\t\t\t\tresult = [ ...result ];\n\t\t\t}\n\n\t\t\tresult.push( ...state.order.get( result[ i ] ) );\n\t\t}\n\t\treturn result;\n\t};\n\n\tif ( state ) {\n\t\tswitch ( action.type ) {\n\t\t\tcase 'REMOVE_BLOCKS':\n\t\t\t\taction = {\n\t\t\t\t\t...action,\n\t\t\t\t\ttype: 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN',\n\t\t\t\t\tremovedClientIds: getAllChildren( action.clientIds ),\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase 'REPLACE_BLOCKS':\n\t\t\t\taction = {\n\t\t\t\t\t...action,\n\t\t\t\t\ttype: 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN',\n\t\t\t\t\treplacedClientIds: getAllChildren( action.clientIds ),\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn reducer( state, action );\n};\n\n/**\n * Higher-order reducer which targets the combined blocks reducer and handles\n * the `RESET_BLOCKS` action. When dispatched, this action will replace all\n * blocks that exist in the post, leaving blocks that exist only in state (e.g.\n * reusable blocks and blocks controlled by inner blocks controllers) alone.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nconst withBlockReset = ( reducer ) => ( state, action ) => {\n\tif ( action.type === 'RESET_BLOCKS' ) {\n\t\t/**\n\t\t * Preserve controlled inner block flags across RESET_BLOCKS.\n\t\t * If there are old and new blocks that:\n\t\t * - have the same `clientId`\n\t\t * - have the `controlledInnerBlocks` flag\n\t\t * - don't have any own, uncontrolled children\n\t\t * then we preserve the `controlledInnerBlocks` flag and the controlled sub-trees.\n\t\t * Nested controllers (e.g., `post-content`, patterns) don't lose their\n\t\t * controlled status and don't unnecessarily re-clone blocks.\n\t\t */\n\t\tconst newState = reducer( undefined, {\n\t\t\ttype: 'INSERT_BLOCKS',\n\t\t\trootClientId: '',\n\t\t\tblocks: action.blocks,\n\t\t} );\n\n\t\tconst preservedControlledInnerBlocks =\n\t\t\tstate?.controlledInnerBlocks ?? {};\n\n\t\t// Preserve controlled inner blocks data from the old state.\n\t\t// The maps above are rebuilt solely from action.blocks, but\n\t\t// controlled inner blocks live under cloned IDs that aren't\n\t\t// present in action.blocks. Re-inject them so the state\n\t\t// remains consistent with the preserved flags.\n\t\tif ( state?.order ) {\n\t\t\tfor ( const clientId of Object.keys(\n\t\t\t\tpreservedControlledInnerBlocks\n\t\t\t) ) {\n\t\t\t\tif ( ! preservedControlledInnerBlocks[ clientId ] ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// Only preserve if the parent block still exists.\n\t\t\t\tif ( ! newState.byClientId.has( clientId ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tnewState.controlledInnerBlocks[ clientId ] = true;\n\t\t\t\tconst oldOrder = state.order.get( clientId );\n\t\t\t\tif ( ! oldOrder?.length ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tnewState.order.set( clientId, oldOrder );\n\t\t\t\tconst preserveBlock = ( blockId, parentId ) => {\n\t\t\t\t\tconst blockData = state.byClientId.get( blockId );\n\t\t\t\t\tif ( ! blockData ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tnewState.byClientId.set( blockId, blockData );\n\t\t\t\t\tnewState.attributes.set(\n\t\t\t\t\t\tblockId,\n\t\t\t\t\t\tstate.attributes.get( blockId )\n\t\t\t\t\t);\n\t\t\t\t\tnewState.parents.set( blockId, parentId );\n\t\t\t\t\tconst childOrder = state.order.get( blockId ) || [];\n\t\t\t\t\tnewState.order.set( blockId, childOrder );\n\t\t\t\t\tchildOrder.forEach( ( childId ) =>\n\t\t\t\t\t\tpreserveBlock( childId, blockId )\n\t\t\t\t\t);\n\t\t\t\t};\n\t\t\t\toldOrder.forEach( ( id ) => preserveBlock( id, clientId ) );\n\t\t\t}\n\t\t}\n\n\t\t// Fix tree entries for controlled blocks. updateBlockTreeForBlocks\n\t\t// built tree entries using action.blocks' inner block structure\n\t\t// (entity-level IDs), but we need them to reference the preserved\n\t\t// cloned inner blocks instead. Mutating the existing object\n\t\t// preserves references held by ancestor tree entries.\n\t\tfor ( const clientId of Object.keys(\n\t\t\tnewState.controlledInnerBlocks\n\t\t) ) {\n\t\t\tconst controlledOrder = newState.order.get( clientId );\n\t\t\tif ( ! controlledOrder?.length ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst innerBlocks = controlledOrder.map( ( id ) =>\n\t\t\t\tstate.tree.get( id )\n\t\t\t);\n\t\t\tconst existingEntry = newState.tree.get( clientId );\n\t\t\tif ( existingEntry ) {\n\t\t\t\texistingEntry.innerBlocks = innerBlocks;\n\t\t\t}\n\t\t\tnewState.tree.set( 'controlled||' + clientId, { innerBlocks } );\n\t\t\tconst preserveTreeEntry = ( blockId ) => {\n\t\t\t\tconst treeEntry = state.tree.get( blockId );\n\t\t\t\tif ( ! treeEntry ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tnewState.tree.set( blockId, treeEntry );\n\t\t\t\tconst childOrder = newState.order.get( blockId ) || [];\n\t\t\t\tchildOrder.forEach( preserveTreeEntry );\n\t\t\t};\n\t\t\tcontrolledOrder.forEach( preserveTreeEntry );\n\t\t}\n\n\t\t// Preserve block editing modes for blocks that are not removed.\n\t\tconst preservedBlockEditingModes =\n\t\t\tstate?.blockEditingModes ?? new Map();\n\t\tfor ( const [ clientId, mode ] of preservedBlockEditingModes ) {\n\t\t\tif ( ! newState.tree.has( clientId ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tnewState.blockEditingModes.set( clientId, mode );\n\t\t}\n\n\t\treturn newState;\n\t}\n\n\treturn reducer( state, action );\n};\n\n/**\n * Higher-order reducer which targets the combined blocks reducer and handles\n * the `REPLACE_INNER_BLOCKS` action. When dispatched, this action the state\n * should become equivalent to the execution of a `REMOVE_BLOCKS` action\n * containing all the child's of the root block followed by the execution of\n * `INSERT_BLOCKS` with the new blocks.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nconst withReplaceInnerBlocks = ( reducer ) => ( state, action ) => {\n\tif ( action.type !== 'REPLACE_INNER_BLOCKS' ) {\n\t\treturn reducer( state, action );\n\t}\n\n\t// Finds every nested inner block controller. We must check the action blocks\n\t// and not just the block parent state because some inner block controllers\n\t// should be deleted if specified, whereas others should not be deleted. If\n\t// a controlled should not be deleted, then we need to avoid deleting its\n\t// inner blocks from the block state because its inner blocks will not be\n\t// attached to the block in the action.\n\tconst nestedControllers = {};\n\tif ( Object.keys( state.controlledInnerBlocks ).length ) {\n\t\tconst stack = [ ...action.blocks ];\n\t\twhile ( stack.length ) {\n\t\t\tconst { innerBlocks, ...block } = stack.shift();\n\t\t\tstack.push( ...innerBlocks );\n\t\t\tif ( !! state.controlledInnerBlocks[ block.clientId ] ) {\n\t\t\t\tnestedControllers[ block.clientId ] = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t// The `keepControlledInnerBlocks` prop will keep the inner blocks of the\n\t// marked block in the block state so that they can be reattached to the\n\t// marked block when we re-insert everything a few lines below.\n\tlet stateAfterBlocksRemoval = state;\n\tif ( state.order.get( action.rootClientId ) ) {\n\t\tstateAfterBlocksRemoval = reducer( stateAfterBlocksRemoval, {\n\t\t\ttype: 'REMOVE_BLOCKS',\n\t\t\tkeepControlledInnerBlocks: nestedControllers,\n\t\t\tclientIds: state.order.get( action.rootClientId ),\n\t\t} );\n\t}\n\tlet stateAfterInsert = stateAfterBlocksRemoval;\n\tif ( action.blocks.length ) {\n\t\tstateAfterInsert = reducer( stateAfterInsert, {\n\t\t\t...action,\n\t\t\ttype: 'INSERT_BLOCKS',\n\t\t\tindex: 0,\n\t\t} );\n\n\t\t// We need to re-attach the controlled inner blocks to the blocks tree and\n\t\t// preserve their block order. Otherwise, an inner block controller's blocks\n\t\t// will be deleted entirely from its entity.\n\t\tconst stateAfterInsertOrder = new Map( stateAfterInsert.order );\n\t\tObject.keys( nestedControllers ).forEach( ( key ) => {\n\t\t\tif ( state.order.get( key ) ) {\n\t\t\t\tstateAfterInsertOrder.set( key, state.order.get( key ) );\n\t\t\t}\n\t\t} );\n\t\tstateAfterInsert.order = stateAfterInsertOrder;\n\t\tstateAfterInsert.tree = new Map( stateAfterInsert.tree );\n\t\tObject.keys( nestedControllers ).forEach( ( _key ) => {\n\t\t\tconst key = `controlled||${ _key }`;\n\t\t\tif ( state.tree.has( key ) ) {\n\t\t\t\tstateAfterInsert.tree.set( key, state.tree.get( key ) );\n\t\t\t}\n\t\t} );\n\t}\n\treturn stateAfterInsert;\n};\n\n/**\n * Higher-order reducer which removes blocks from state when switching parent block controlled state.\n *\n * @param {Function} reducer Original reducer function.\n *\n * @return {Function} Enhanced reducer function.\n */\nconst withResetControlledBlocks = ( reducer ) => ( state, action ) => {\n\tif ( action.type === 'SET_HAS_CONTROLLED_INNER_BLOCKS' ) {\n\t\t// When switching a block from controlled to uncontrolled or inverse,\n\t\t// we need to remove its content first \u2014 but only if there are inner\n\t\t// blocks to remove. Skipping the no-op dispatch is important because\n\t\t// REPLACE_INNER_BLOCKS creates new state references even when empty,\n\t\t// which propagates tree changes up to the root and triggers false-\n\t\t// positive change detection in parent subscriptions.\n\t\tconst innerBlockOrder = state.order.get( action.clientId );\n\t\tif ( innerBlockOrder?.length ) {\n\t\t\tconst tempState = reducer( state, {\n\t\t\t\ttype: 'REPLACE_INNER_BLOCKS',\n\t\t\t\trootClientId: action.clientId,\n\t\t\t\tblocks: [],\n\t\t\t} );\n\t\t\treturn reducer( tempState, action );\n\t\t}\n\t\treturn reducer( state, action );\n\t}\n\n\treturn reducer( state, action );\n};\n\n/**\n * Reducer returning the blocks state.\n *\n * @param {Object} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport const blocks = pipe(\n\tcombineReducers,\n\twithBlockTree, // Needs to be before withInnerBlocksRemoveCascade.\n\twithInnerBlocksRemoveCascade,\n\twithReplaceInnerBlocks, // Needs to be after withInnerBlocksRemoveCascade.\n\twithBlockReset,\n\twithPersistentBlockChange,\n\twithIgnoredBlockChange,\n\twithResetControlledBlocks\n)( {\n\t// The state is using a Map instead of a plain object for performance reasons.\n\t// You can run the \"./test/performance.js\" unit test to check the impact\n\t// code changes can have on this reducer.\n\tbyClientId( state = new Map(), action ) {\n\t\tswitch ( action.type ) {\n\t\t\tcase 'RECEIVE_BLOCKS':\n\t\t\tcase 'INSERT_BLOCKS': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tgetFlattenedBlocksWithoutAttributes( action.blocks ).forEach(\n\t\t\t\t\t( [ key, value ] ) => {\n\t\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t\tcase 'UPDATE_BLOCK': {\n\t\t\t\t// Ignore updates if block isn't known.\n\t\t\t\tif ( ! state.has( action.clientId ) ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\t// Do nothing if only attributes change.\n\t\t\t\tconst { attributes, ...changes } = action.updates;\n\t\t\t\tif ( Object.values( changes ).length === 0 ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tnewState.set( action.clientId, {\n\t\t\t\t\t...state.get( action.clientId ),\n\t\t\t\t\t...changes,\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tif ( ! action.blocks ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.replacedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\n\t\t\t\tgetFlattenedBlocksWithoutAttributes( action.blocks ).forEach(\n\t\t\t\t\t( [ key, value ] ) => {\n\t\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.removedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t}\n\n\t\treturn state;\n\t},\n\n\t// The state is using a Map instead of a plain object for performance reasons.\n\t// You can run the \"./test/performance.js\" unit test to check the impact\n\t// code changes can have on this reducer.\n\tattributes( state = new Map(), action ) {\n\t\tswitch ( action.type ) {\n\t\t\tcase 'RECEIVE_BLOCKS':\n\t\t\tcase 'INSERT_BLOCKS': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tgetFlattenedBlockAttributes( action.blocks ).forEach(\n\t\t\t\t\t( [ key, value ] ) => {\n\t\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'UPDATE_BLOCK': {\n\t\t\t\t// Ignore updates if block isn't known or there are no attribute changes.\n\t\t\t\tif (\n\t\t\t\t\t! state.get( action.clientId ) ||\n\t\t\t\t\t! action.updates.attributes\n\t\t\t\t) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tnewState.set( action.clientId, {\n\t\t\t\t\t...state.get( action.clientId ),\n\t\t\t\t\t...action.updates.attributes,\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'SYNC_DERIVED_BLOCK_ATTRIBUTES':\n\t\t\tcase 'UPDATE_BLOCK_ATTRIBUTES': {\n\t\t\t\t// Avoid a state change if none of the block IDs are known.\n\t\t\t\tif ( action.clientIds.every( ( id ) => ! state.get( id ) ) ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tlet hasChange = false;\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tfor ( const clientId of action.clientIds ) {\n\t\t\t\t\tconst updatedAttributeEntries = Object.entries(\n\t\t\t\t\t\t!! action.options?.uniqueByBlock\n\t\t\t\t\t\t\t? action.attributes[ clientId ]\n\t\t\t\t\t\t\t: action.attributes ?? {}\n\t\t\t\t\t);\n\t\t\t\t\tif ( updatedAttributeEntries.length === 0 ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tlet hasUpdatedAttributes = false;\n\t\t\t\t\tconst existingAttributes = state.get( clientId );\n\t\t\t\t\tconst newAttributes = {};\n\t\t\t\t\tupdatedAttributeEntries.forEach( ( [ key, value ] ) => {\n\t\t\t\t\t\tif ( existingAttributes[ key ] !== value ) {\n\t\t\t\t\t\t\thasUpdatedAttributes = true;\n\t\t\t\t\t\t\tnewAttributes[ key ] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t\thasChange = hasChange || hasUpdatedAttributes;\n\t\t\t\t\tif ( hasUpdatedAttributes ) {\n\t\t\t\t\t\tnewState.set( clientId, {\n\t\t\t\t\t\t\t...existingAttributes,\n\t\t\t\t\t\t\t...newAttributes,\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn hasChange ? newState : state;\n\t\t\t}\n\n\t\t\tcase 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tif ( ! action.blocks ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.replacedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\tgetFlattenedBlockAttributes( action.blocks ).forEach(\n\t\t\t\t\t( [ key, value ] ) => {\n\t\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.removedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t}\n\n\t\treturn state;\n\t},\n\n\t// The state is using a Map instead of a plain object for performance reasons.\n\t// You can run the \"./test/performance.js\" unit test to check the impact\n\t// code changes can have on this reducer.\n\torder( state = new Map(), action ) {\n\t\tswitch ( action.type ) {\n\t\t\tcase 'RECEIVE_BLOCKS': {\n\t\t\t\tconst blockOrder = mapBlockOrder( action.blocks );\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tblockOrder.forEach( ( order, clientId ) => {\n\t\t\t\t\tif ( clientId !== '' ) {\n\t\t\t\t\t\tnewState.set( clientId, order );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tnewState.set(\n\t\t\t\t\t'',\n\t\t\t\t\t( state.get( '' ) ?? [] ).concat( blockOrder[ '' ] )\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t\tcase 'INSERT_BLOCKS': {\n\t\t\t\tconst { rootClientId = '' } = action;\n\t\t\t\tconst subState = state.get( rootClientId ) || [];\n\t\t\t\tconst mappedBlocks = mapBlockOrder(\n\t\t\t\t\taction.blocks,\n\t\t\t\t\trootClientId\n\t\t\t\t);\n\t\t\t\tconst { index = subState.length } = action;\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tmappedBlocks.forEach( ( order, clientId ) => {\n\t\t\t\t\tnewState.set( clientId, order );\n\t\t\t\t} );\n\t\t\t\tnewState.set(\n\t\t\t\t\trootClientId,\n\t\t\t\t\tinsertAt(\n\t\t\t\t\t\tsubState,\n\t\t\t\t\t\tmappedBlocks.get( rootClientId ),\n\t\t\t\t\t\tindex\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'MOVE_BLOCKS_TO_POSITION': {\n\t\t\t\tconst {\n\t\t\t\t\tfromRootClientId = '',\n\t\t\t\t\ttoRootClientId = '',\n\t\t\t\t\tclientIds,\n\t\t\t\t} = action;\n\t\t\t\tconst { index = state.get( toRootClientId ).length } = action;\n\n\t\t\t\t// Moving inside the same parent block.\n\t\t\t\tif ( fromRootClientId === toRootClientId ) {\n\t\t\t\t\tconst subState = state.get( toRootClientId );\n\t\t\t\t\tconst fromIndex = subState.indexOf( clientIds[ 0 ] );\n\t\t\t\t\tif ( fromIndex === -1 ) {\n\t\t\t\t\t\treturn state;\n\t\t\t\t\t}\n\t\t\t\t\tconst newState = new Map( state );\n\t\t\t\t\tnewState.set(\n\t\t\t\t\t\ttoRootClientId,\n\t\t\t\t\t\tmoveTo(\n\t\t\t\t\t\t\tstate.get( toRootClientId ),\n\t\t\t\t\t\t\tfromIndex,\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\tclientIds.length\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\treturn newState;\n\t\t\t\t}\n\n\t\t\t\t// Moving from a parent block to another.\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tnewState.set(\n\t\t\t\t\tfromRootClientId,\n\t\t\t\t\tstate\n\t\t\t\t\t\t.get( fromRootClientId )\n\t\t\t\t\t\t?.filter( ( id ) => ! clientIds.includes( id ) ) ?? []\n\t\t\t\t);\n\t\t\t\tnewState.set(\n\t\t\t\t\ttoRootClientId,\n\t\t\t\t\tinsertAt( state.get( toRootClientId ), clientIds, index )\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'MOVE_BLOCKS_UP': {\n\t\t\t\tconst { clientIds, rootClientId = '' } = action;\n\t\t\t\tconst firstClientId = clientIds[ 0 ];\n\t\t\t\tconst subState = state.get( rootClientId );\n\n\t\t\t\tif ( ! subState.length || firstClientId === subState[ 0 ] ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst firstIndex = subState.indexOf( firstClientId );\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tnewState.set(\n\t\t\t\t\trootClientId,\n\t\t\t\t\tmoveTo(\n\t\t\t\t\t\tsubState,\n\t\t\t\t\t\tfirstIndex,\n\t\t\t\t\t\tfirstIndex - 1,\n\t\t\t\t\t\tclientIds.length\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'MOVE_BLOCKS_DOWN': {\n\t\t\t\tconst { clientIds, rootClientId = '' } = action;\n\t\t\t\tconst firstClientId = clientIds[ 0 ];\n\t\t\t\tconst lastClientId = clientIds[ clientIds.length - 1 ];\n\t\t\t\tconst subState = state.get( rootClientId );\n\n\t\t\t\tif (\n\t\t\t\t\t! subState.length ||\n\t\t\t\t\tlastClientId === subState[ subState.length - 1 ]\n\t\t\t\t) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst firstIndex = subState.indexOf( firstClientId );\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tnewState.set(\n\t\t\t\t\trootClientId,\n\t\t\t\t\tmoveTo(\n\t\t\t\t\t\tsubState,\n\t\t\t\t\t\tfirstIndex,\n\t\t\t\t\t\tfirstIndex + 1,\n\t\t\t\t\t\tclientIds.length\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst { clientIds } = action;\n\t\t\t\tif ( ! action.blocks ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\n\t\t\t\tconst mappedBlocks = mapBlockOrder( action.blocks );\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.replacedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\tmappedBlocks.forEach( ( order, clientId ) => {\n\t\t\t\t\tif ( clientId !== '' ) {\n\t\t\t\t\t\tnewState.set( clientId, order );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tnewState.forEach( ( order, clientId ) => {\n\t\t\t\t\tconst newSubOrder = Object.values( order ).reduce(\n\t\t\t\t\t\t( result, subClientId ) => {\n\t\t\t\t\t\t\tif ( subClientId === clientIds[ 0 ] ) {\n\t\t\t\t\t\t\t\treturn [ ...result, ...mappedBlocks.get( '' ) ];\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( clientIds.indexOf( subClientId ) === -1 ) {\n\t\t\t\t\t\t\t\tresult.push( subClientId );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[]\n\t\t\t\t\t);\n\t\t\t\t\tnewState.set( clientId, newSubOrder );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\t// Remove inner block ordering for removed blocks.\n\t\t\t\taction.removedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\tnewState.forEach( ( order, clientId ) => {\n\t\t\t\t\tconst newSubOrder =\n\t\t\t\t\t\torder?.filter(\n\t\t\t\t\t\t\t( id ) => ! action.removedClientIds.includes( id )\n\t\t\t\t\t\t) ?? [];\n\t\t\t\t\tif ( newSubOrder.length !== order.length ) {\n\t\t\t\t\t\tnewState.set( clientId, newSubOrder );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t}\n\n\t\treturn state;\n\t},\n\n\t// While technically redundant data as the inverse of `order`, it serves as\n\t// an optimization for the selectors which derive the ancestry of a block.\n\tparents( state = new Map(), action ) {\n\t\tswitch ( action.type ) {\n\t\t\tcase 'RECEIVE_BLOCKS': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tmapBlockParents( action.blocks ).forEach(\n\t\t\t\t\t( [ key, value ] ) => {\n\t\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t\tcase 'INSERT_BLOCKS': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tmapBlockParents(\n\t\t\t\t\taction.blocks,\n\t\t\t\t\taction.rootClientId || ''\n\t\t\t\t).forEach( ( [ key, value ] ) => {\n\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t\tcase 'MOVE_BLOCKS_TO_POSITION': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.clientIds.forEach( ( id ) => {\n\t\t\t\t\tnewState.set( id, action.toRootClientId || '' );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\n\t\t\tcase 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.replacedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\tmapBlockParents(\n\t\t\t\t\taction.blocks,\n\t\t\t\t\tstate.get( action.clientIds[ 0 ] )\n\t\t\t\t).forEach( ( [ key, value ] ) => {\n\t\t\t\t\tnewState.set( key, value );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t\tcase 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN': {\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\taction.removedClientIds.forEach( ( clientId ) => {\n\t\t\t\t\tnewState.delete( clientId );\n\t\t\t\t} );\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t}\n\n\t\treturn state;\n\t},\n\n\tcontrolledInnerBlocks(\n\t\tstate = {},\n\t\t{ type, clientId, hasControlledInnerBlocks }\n\t) {\n\t\tif ( type === 'SET_HAS_CONTROLLED_INNER_BLOCKS' ) {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t[ clientId ]: hasControlledInnerBlocks,\n\t\t\t};\n\t\t}\n\t\treturn state;\n\t},\n\n\tblockEditingModes( state = new Map(), action ) {\n\t\tswitch ( action.type ) {\n\t\t\tcase 'SET_BLOCK_EDITING_MODE':\n\t\t\t\tif ( state.get( action.clientId ) === action.mode ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\t\t\t\treturn new Map( state ).set( action.clientId, action.mode );\n\t\t\tcase 'UNSET_BLOCK_EDITING_MODE': {\n\t\t\t\tif ( ! state.has( action.clientId ) ) {\n\t\t\t\t\treturn state;\n\t\t\t\t}\n\t\t\t\tconst newState = new Map( state );\n\t\t\t\tnewState.delete( action.clientId );\n\t\t\t\treturn newState;\n\t\t\t}\n\t\t}\n\t\treturn state;\n\t},\n} );\n\n/**\n * Reducer returning visibility status of block interface.\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function isBlockInterfaceHidden( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'HIDE_BLOCK_INTERFACE':\n\t\t\treturn true;\n\n\t\tcase 'SHOW_BLOCK_INTERFACE':\n\t\t\treturn false;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning typing state.\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function isTyping( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'START_TYPING':\n\t\t\treturn true;\n\n\t\tcase 'STOP_TYPING':\n\t\t\treturn false;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning dragging state. It is possible for a user to be dragging\n * data from outside of the editor, so this state is separate from `draggedBlocks`.\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function isDragging( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'START_DRAGGING':\n\t\t\treturn true;\n\n\t\tcase 'STOP_DRAGGING':\n\t\t\treturn false;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning dragged block client id.\n *\n * @param {string[]} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {string[]} Updated state.\n */\nexport function draggedBlocks( state = [], action ) {\n\tswitch ( action.type ) {\n\t\tcase 'START_DRAGGING_BLOCKS':\n\t\t\treturn action.clientIds;\n\n\t\tcase 'STOP_DRAGGING_BLOCKS':\n\t\t\treturn [];\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer tracking the visible blocks.\n *\n * @param {Record<string,boolean>} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Record<string,boolean>} Block visibility.\n */\nexport function blockVisibility( state = {}, action ) {\n\tif ( action.type === 'SET_BLOCK_VISIBILITY' ) {\n\t\treturn {\n\t\t\t...state,\n\t\t\t...action.updates,\n\t\t};\n\t}\n\n\treturn state;\n}\n\n/**\n * Internal helper reducer for selectionStart and selectionEnd. Can hold a block\n * selection, represented by an object with property clientId.\n *\n * @param {Object} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nfunction selectionHelper( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'CLEAR_SELECTED_BLOCK': {\n\t\t\tif ( state.clientId ) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn state;\n\t\t}\n\t\tcase 'SELECT_BLOCK':\n\t\t\tif ( action.clientId === state.clientId ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\treturn { clientId: action.clientId };\n\t\tcase 'REPLACE_INNER_BLOCKS':\n\t\tcase 'INSERT_BLOCKS': {\n\t\t\tif ( ! action.updateSelection || ! action.blocks.length ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\treturn { clientId: action.blocks[ 0 ].clientId };\n\t\t}\n\t\tcase 'REMOVE_BLOCKS':\n\t\t\tif (\n\t\t\t\t! action.clientIds ||\n\t\t\t\t! action.clientIds.length ||\n\t\t\t\taction.clientIds.indexOf( state.clientId ) === -1\n\t\t\t) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\treturn {};\n\t\tcase 'REPLACE_BLOCKS': {\n\t\t\tif ( action.clientIds.indexOf( state.clientId ) === -1 ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\tconst blockToSelect =\n\t\t\t\taction.blocks[ action.indexToSelect ] ||\n\t\t\t\taction.blocks[ action.blocks.length - 1 ];\n\n\t\t\tif ( ! blockToSelect ) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\tif ( blockToSelect.clientId === state.clientId ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\treturn { clientId: blockToSelect.clientId };\n\t\t}\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the selection state.\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function selection( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SELECTION_CHANGE':\n\t\t\tif ( action.clientId ) {\n\t\t\t\treturn {\n\t\t\t\t\tselectionStart: {\n\t\t\t\t\t\tclientId: action.clientId,\n\t\t\t\t\t\tattributeKey: action.attributeKey,\n\t\t\t\t\t\toffset: action.startOffset,\n\t\t\t\t\t},\n\t\t\t\t\tselectionEnd: {\n\t\t\t\t\t\tclientId: action.clientId,\n\t\t\t\t\t\tattributeKey: action.attributeKey,\n\t\t\t\t\t\toffset: action.endOffset,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tselectionStart: action.start || state.selectionStart,\n\t\t\t\tselectionEnd: action.end || state.selectionEnd,\n\t\t\t};\n\t\tcase 'RESET_SELECTION':\n\t\t\tconst { selectionStart, selectionEnd } = action;\n\t\t\treturn {\n\t\t\t\tselectionStart,\n\t\t\t\tselectionEnd,\n\t\t\t};\n\t\tcase 'MULTI_SELECT':\n\t\t\tconst { start, end } = action;\n\n\t\t\tif (\n\t\t\t\tstart === state.selectionStart?.clientId &&\n\t\t\t\tend === state.selectionEnd?.clientId\n\t\t\t) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tselectionStart: { clientId: start },\n\t\t\t\tselectionEnd: { clientId: end },\n\t\t\t};\n\t\tcase 'RESET_BLOCKS':\n\t\t\tconst startClientId = state?.selectionStart?.clientId;\n\t\t\tconst endClientId = state?.selectionEnd?.clientId;\n\n\t\t\t// Do nothing if there's no selected block.\n\t\t\tif ( ! startClientId && ! endClientId ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\t// If the start of the selection won't exist after reset, remove selection.\n\t\t\tif (\n\t\t\t\t! action.blocks.some(\n\t\t\t\t\t( block ) => block.clientId === startClientId\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\tselectionStart: {},\n\t\t\t\t\tselectionEnd: {},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If the end of the selection won't exist after reset, collapse selection.\n\t\t\tif (\n\t\t\t\t! action.blocks.some(\n\t\t\t\t\t( block ) => block.clientId === endClientId\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\t...state,\n\t\t\t\t\tselectionEnd: state.selectionStart,\n\t\t\t\t};\n\t\t\t}\n\t}\n\n\tconst selectionStart = selectionHelper( state.selectionStart, action );\n\tconst selectionEnd = selectionHelper( state.selectionEnd, action );\n\n\tif (\n\t\tselectionStart === state.selectionStart &&\n\t\tselectionEnd === state.selectionEnd\n\t) {\n\t\treturn state;\n\t}\n\n\treturn {\n\t\tselectionStart,\n\t\tselectionEnd,\n\t};\n}\n\n/**\n * Reducer returning whether the user is multi-selecting.\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function isMultiSelecting( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'START_MULTI_SELECT':\n\t\t\treturn true;\n\n\t\tcase 'STOP_MULTI_SELECT':\n\t\t\treturn false;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning whether selection is enabled.\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function isSelectionEnabled( state = true, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'TOGGLE_SELECTION':\n\t\t\treturn action.isSelectionEnabled;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the client IDs for the viewport modal,\n * or null if the modal is not open.\n *\n * @param {string[]|null} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {string[]|null} Client IDs for the viewport modal.\n */\nexport function viewportModalClientIds( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SHOW_VIEWPORT_MODAL':\n\t\t\treturn action.clientIds;\n\t\tcase 'HIDE_VIEWPORT_MODAL':\n\t\t\treturn null;\n\t}\n\treturn state;\n}\n\n/**\n * Reducer returning the data needed to display a prompt when certain blocks\n * are removed, or `false` if no such prompt is requested.\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object|false} Data for removal prompt display, if any.\n */\nfunction removalPromptData( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'DISPLAY_BLOCK_REMOVAL_PROMPT':\n\t\t\tconst { clientIds, selectPrevious, message } = action;\n\t\t\treturn {\n\t\t\t\tclientIds,\n\t\t\t\tselectPrevious,\n\t\t\t\tmessage,\n\t\t\t};\n\t\tcase 'CLEAR_BLOCK_REMOVAL_PROMPT':\n\t\t\treturn false;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning any rules that a block editor may provide in order to\n * prevent a user from accidentally removing certain blocks. These rules are\n * then used to display a confirmation prompt to the user. For instance, in the\n * Site Editor, the Query Loop block is important enough to warrant such\n * confirmation.\n *\n * The data is a record whose keys are block types (e.g. 'core/query') and\n * whose values are the explanation to be shown to users (e.g. 'Query Loop\n * displays a list of posts or pages.').\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Record<string,string>} Updated state.\n */\nfunction blockRemovalRules( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_BLOCK_REMOVAL_RULES':\n\t\t\treturn action.rules;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the initial block selection.\n *\n * Currently this in only used to restore the selection after block deletion and\n * pasting new content.This reducer should eventually be removed in favour of setting\n * selection directly.\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {number|null} Initial position: 0, -1 or null.\n */\nexport function initialPosition( state = null, action ) {\n\tif (\n\t\taction.type === 'REPLACE_BLOCKS' &&\n\t\taction.initialPosition !== undefined\n\t) {\n\t\treturn action.initialPosition;\n\t} else if (\n\t\t[\n\t\t\t'MULTI_SELECT',\n\t\t\t'SELECT_BLOCK',\n\t\t\t'RESET_SELECTION',\n\t\t\t'INSERT_BLOCKS',\n\t\t\t'REPLACE_INNER_BLOCKS',\n\t\t].includes( action.type )\n\t) {\n\t\treturn action.initialPosition;\n\t}\n\n\treturn state;\n}\n\nexport function blocksMode( state = {}, action ) {\n\tif ( action.type === 'TOGGLE_BLOCK_MODE' ) {\n\t\tconst { clientId } = action;\n\t\treturn {\n\t\t\t...state,\n\t\t\t[ clientId ]:\n\t\t\t\tstate[ clientId ] && state[ clientId ] === 'html'\n\t\t\t\t\t? 'visual'\n\t\t\t\t\t: 'html',\n\t\t};\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the block insertion point visibility, either null if there\n * is not an explicit insertion point assigned, or an object of its `index` and\n * `rootClientId`.\n *\n * @param {Object} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport function insertionCue( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SHOW_INSERTION_POINT': {\n\t\t\tconst {\n\t\t\t\trootClientId,\n\t\t\t\tindex,\n\t\t\t\t__unstableWithInserter,\n\t\t\t\toperation,\n\t\t\t\tnearestSide,\n\t\t\t} = action;\n\t\t\tconst nextState = {\n\t\t\t\trootClientId,\n\t\t\t\tindex,\n\t\t\t\t__unstableWithInserter,\n\t\t\t\toperation,\n\t\t\t\tnearestSide,\n\t\t\t};\n\n\t\t\t// Bail out updates if the states are the same.\n\t\t\treturn fastDeepEqual( state, nextState ) ? state : nextState;\n\t\t}\n\n\t\tcase 'HIDE_INSERTION_POINT':\n\t\t\treturn null;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning whether the post blocks match the defined template or not.\n *\n * @param {Object} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function template( state = { isValid: true }, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_TEMPLATE_VALIDITY':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisValid: action.isValid,\n\t\t\t};\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the editor setting.\n *\n * @param {Object} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport function settings( state = SETTINGS_DEFAULTS, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'UPDATE_SETTINGS': {\n\t\t\tconst updatedSettings = action.reset\n\t\t\t\t? {\n\t\t\t\t\t\t...SETTINGS_DEFAULTS,\n\t\t\t\t\t\t...action.settings,\n\t\t\t\t }\n\t\t\t\t: {\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\t...action.settings,\n\t\t\t\t };\n\n\t\t\tObject.defineProperty( updatedSettings, '__unstableIsPreviewMode', {\n\t\t\t\tget() {\n\t\t\t\t\tdeprecated( '__unstableIsPreviewMode', {\n\t\t\t\t\t\tsince: '6.8',\n\t\t\t\t\t\talternative: 'isPreviewMode',\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn this.isPreviewMode;\n\t\t\t\t},\n\t\t\t} );\n\n\t\t\treturn updatedSettings;\n\t\t}\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the user preferences.\n *\n * @param {Object} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {string} Updated state.\n */\nexport function preferences( state = PREFERENCES_DEFAULTS, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'INSERT_BLOCKS':\n\t\tcase 'REPLACE_BLOCKS': {\n\t\t\tconst nextInsertUsage = action.blocks.reduce(\n\t\t\t\t( prevUsage, block ) => {\n\t\t\t\t\tconst { attributes, name: blockName } = block;\n\t\t\t\t\tlet id = blockName;\n\t\t\t\t\t// If a block variation match is found change the name to be the same with the\n\t\t\t\t\t// one that is used for block variations in the Inserter (`getItemFromVariation`).\n\t\t\t\t\tconst match = select( blocksStore ).getActiveBlockVariation(\n\t\t\t\t\t\tblockName,\n\t\t\t\t\t\tattributes\n\t\t\t\t\t);\n\t\t\t\t\tif ( match?.name ) {\n\t\t\t\t\t\tid += '/' + match.name;\n\t\t\t\t\t}\n\t\t\t\t\tif ( blockName === 'core/block' ) {\n\t\t\t\t\t\tid += '/' + attributes.ref;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...prevUsage,\n\t\t\t\t\t\t[ id ]: {\n\t\t\t\t\t\t\ttime: action.time,\n\t\t\t\t\t\t\tcount: prevUsage[ id ]\n\t\t\t\t\t\t\t\t? prevUsage[ id ].count + 1\n\t\t\t\t\t\t\t\t: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tstate.insertUsage\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tinsertUsage: nextInsertUsage,\n\t\t\t};\n\t\t}\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning an object where each key is a block client ID, its value\n * representing the settings for its nested blocks.\n *\n * @param {Object} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport const blockListSettings = ( state = {}, action ) => {\n\tswitch ( action.type ) {\n\t\tcase 'REPLACE_BLOCKS': {\n\t\t\t// Collect all clientIds from replacement blocks. If a clientId\n\t\t\t// is reused, preserve its settings \u2014 the block instance (and\n\t\t\t// its InnerBlocks config) survived the replace. Settings for\n\t\t\t// clientIds that are truly removed get cleaned up so stale\n\t\t\t// config from old block types doesn't linger.\n\t\t\tconst replacementIds = new Set();\n\t\t\tconst stack = [ ...action.blocks ];\n\t\t\twhile ( stack.length ) {\n\t\t\t\tconst block = stack.shift();\n\t\t\t\treplacementIds.add( block.clientId );\n\t\t\t\tstack.push( ...block.innerBlocks );\n\t\t\t}\n\t\t\treturn Object.fromEntries(\n\t\t\t\tObject.entries( state ).filter(\n\t\t\t\t\t( [ id ] ) =>\n\t\t\t\t\t\t! action.clientIds.includes( id ) ||\n\t\t\t\t\t\treplacementIds.has( id )\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tcase 'REMOVE_BLOCKS': {\n\t\t\treturn Object.fromEntries(\n\t\t\t\tObject.entries( state ).filter(\n\t\t\t\t\t( [ id ] ) => ! action.clientIds.includes( id )\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tcase 'UPDATE_BLOCK_LIST_SETTINGS': {\n\t\t\tconst updates =\n\t\t\t\ttypeof action.clientId === 'string'\n\t\t\t\t\t? { [ action.clientId ]: action.settings }\n\t\t\t\t\t: action.clientId;\n\n\t\t\t// Remove settings that are the same as the current state.\n\t\t\tfor ( const clientId in updates ) {\n\t\t\t\tif ( ! updates[ clientId ] ) {\n\t\t\t\t\tif ( ! state[ clientId ] ) {\n\t\t\t\t\t\tdelete updates[ clientId ];\n\t\t\t\t\t}\n\t\t\t\t} else if (\n\t\t\t\t\tfastDeepEqual( state[ clientId ], updates[ clientId ] )\n\t\t\t\t) {\n\t\t\t\t\tdelete updates[ clientId ];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( Object.keys( updates ).length === 0 ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\tconst merged = { ...state, ...updates };\n\n\t\t\tfor ( const clientId in updates ) {\n\t\t\t\tif ( ! updates[ clientId ] ) {\n\t\t\t\t\tdelete merged[ clientId ];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn merged;\n\t\t}\n\t}\n\treturn state;\n};\n\n/**\n * Reducer return an updated state representing the most recent block attribute\n * update. The state is structured as an object where the keys represent the\n * client IDs of blocks, the values a subset of attributes from the most recent\n * block update. The state is always reset to null if the last action is\n * anything other than an attributes update.\n *\n * @param {Object<string,Object>} state Current state.\n * @param {Object} action Action object.\n *\n * @return {[string,Object]} Updated state.\n */\nexport function lastBlockAttributesChange( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'UPDATE_BLOCK':\n\t\t\tif ( ! action.updates.attributes ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treturn { [ action.clientId ]: action.updates.attributes };\n\n\t\tcase 'UPDATE_BLOCK_ATTRIBUTES':\n\t\t\treturn action.clientIds.reduce(\n\t\t\t\t( accumulator, id ) => ( {\n\t\t\t\t\t...accumulator,\n\t\t\t\t\t[ id ]: !! action.options?.uniqueByBlock\n\t\t\t\t\t\t? action.attributes[ id ]\n\t\t\t\t\t\t: action.attributes,\n\t\t\t\t} ),\n\t\t\t\t{}\n\t\t\t);\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning current highlighted block.\n *\n * @param {boolean} state Current highlighted block.\n * @param {Object} action Dispatched action.\n *\n * @return {string} Updated state.\n */\nexport function highlightedBlock( state, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'TOGGLE_BLOCK_HIGHLIGHT':\n\t\t\tconst { clientId, isHighlighted } = action;\n\n\t\t\tif ( isHighlighted ) {\n\t\t\t\treturn clientId;\n\t\t\t} else if ( state === clientId ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn state;\n\t\tcase 'SELECT_BLOCK':\n\t\t\tif ( action.clientId !== state ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning current spotlighted block.\n *\n * @param {string|null} state Current clientId or null.\n * @param {Object} action Dispatched action.\n *\n * @return {string|null} Updated state.\n */\nexport function hasBlockSpotlight( state, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'TOGGLE_BLOCK_SPOTLIGHT':\n\t\t\tconst { clientId, hasBlockSpotlight: _hasBlockSpotlight } = action;\n\n\t\t\tif ( _hasBlockSpotlight ) {\n\t\t\t\treturn clientId;\n\t\t\t} else if ( state === clientId ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn state;\n\t\tcase 'SELECT_BLOCK':\n\t\t\tif ( action.clientId !== state ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn state;\n\t\tcase 'SELECTION_CHANGE':\n\t\t\tif (\n\t\t\t\taction.start?.clientId !== state ||\n\t\t\t\taction.end?.clientId !== state\n\t\t\t) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn state;\n\t\tcase 'CLEAR_SELECTED_BLOCK':\n\t\t\treturn null;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning current expanded block in the list view.\n *\n * @param {string|null} state Current expanded block.\n * @param {Object} action Dispatched action.\n *\n * @return {string|null} Updated state.\n */\nexport function expandedBlock( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_BLOCK_EXPANDED_IN_LIST_VIEW':\n\t\t\treturn action.clientId;\n\t\tcase 'SELECT_BLOCK':\n\t\t\tif ( action.clientId !== state ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the block insertion event list state.\n *\n * @param {Object} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport function lastBlockInserted( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'INSERT_BLOCKS':\n\t\tcase 'REPLACE_BLOCKS':\n\t\t\tif ( ! action.blocks.length ) {\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\t\tconst clientIds = action.blocks.map( ( block ) => {\n\t\t\t\treturn block.clientId;\n\t\t\t} );\n\n\t\t\tconst source = action.meta?.source;\n\n\t\t\treturn { clientIds, source };\n\t\tcase 'RESET_BLOCKS':\n\t\t\treturn {};\n\t}\n\treturn state;\n}\n\n/**\n * Reducer returning the contentOnly block that is being edited.\n *\n * @param {string|undefined} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {string|undefined} Updated state.\n */\nexport function editedContentOnlySection( state, action ) {\n\tif ( action.type === 'EDIT_CONTENT_ONLY_SECTION' ) {\n\t\treturn action.clientId;\n\t}\n\n\t// Early return if there's no section being edited.\n\tif ( ! state ) {\n\t\treturn state;\n\t}\n\n\tswitch ( action.type ) {\n\t\tcase 'REMOVE_BLOCKS':\n\t\tcase 'REPLACE_BLOCKS':\n\t\t\t// Clear if the edited section is directly among the removed/replaced blocks.\n\t\t\t// Note: this doesn't catch the case where a parent of the edited section\n\t\t\t// is removed, since action.clientIds only contains the top-level IDs.\n\t\t\t// That edge case is handled by the StopEditingContentOnlySectionOnOutsideSelect\n\t\t\t// component in block-list/index.js.\n\t\t\tif ( action.clientIds.includes( state ) ) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'RESET_BLOCKS':\n\t\t\t// When all blocks are reset (e.g. navigating to a different post),\n\t\t\t// check whether the edited section still exists in the new block tree.\n\t\t\tif ( ! getFlattenedClientIds( action.blocks )[ state ] ) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning a map of style IDs to style overrides.\n *\n * @param {Map} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Map} Updated state.\n */\nexport function styleOverrides( state = new Map(), action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_STYLE_OVERRIDE':\n\t\t\treturn new Map( state ).set( action.id, action.style );\n\t\tcase 'DELETE_STYLE_OVERRIDE': {\n\t\t\tconst newState = new Map( state );\n\t\t\tnewState.delete( action.id );\n\t\t\treturn newState;\n\t\t}\n\t}\n\treturn state;\n}\n\n/**\n * Reducer returning a map of the registered inserter media categories.\n *\n * @param {Array} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Array} Updated state.\n */\nexport function registeredInserterMediaCategories( state = [], action ) {\n\tswitch ( action.type ) {\n\t\tcase 'REGISTER_INSERTER_MEDIA_CATEGORY':\n\t\t\treturn [ ...state, action.category ];\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer setting last focused element\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function lastFocus( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'LAST_FOCUS':\n\t\t\treturn action.lastFocus;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer setting zoom out state.\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {number} Updated state.\n */\nexport function zoomLevel( state = 100, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_ZOOM_LEVEL':\n\t\t\treturn action.zoom;\n\t\tcase 'RESET_ZOOM_LEVEL':\n\t\t\treturn 100;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer setting the insertion point\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport function insertionPoint( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_INSERTION_POINT':\n\t\t\treturn action.value;\n\t\tcase 'SELECT_BLOCK':\n\t\t\treturn null;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning the opened List View panels state.\n *\n * @param {Object} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nfunction openedListViewPanels(\n\tstate = { allOpen: false, panels: {} },\n\taction\n) {\n\tswitch ( action.type ) {\n\t\tcase 'SET_OPEN_LIST_VIEW_PANEL':\n\t\t\t// Open only the specified panel, close all others\n\t\t\treturn {\n\t\t\t\tallOpen: false,\n\t\t\t\tpanels: action.clientId ? { [ action.clientId ]: true } : {},\n\t\t\t};\n\t\tcase 'SET_ALL_LIST_VIEW_PANELS_OPEN':\n\t\t\t// Set flag to open all panels\n\t\t\treturn { allOpen: true, panels: {} };\n\t\tcase 'TOGGLE_LIST_VIEW_PANEL':\n\t\t\t// If we're in \"all open\" mode, exit it when user manually toggles\n\t\t\treturn {\n\t\t\t\tallOpen: false,\n\t\t\t\tpanels: {\n\t\t\t\t\t...state.panels,\n\t\t\t\t\t[ action.clientId ]: action.isOpen,\n\t\t\t\t},\n\t\t\t};\n\t\tcase 'REPLACE_BLOCKS':\n\t\tcase 'REMOVE_BLOCKS': {\n\t\t\t// Clean up stale entries when blocks are removed or replaced\n\t\t\tif ( ! action.clientIds || action.clientIds.length === 0 ) {\n\t\t\t\treturn state;\n\t\t\t}\n\t\t\tconst newPanels = { ...state.panels };\n\t\t\tlet hasChanges = false;\n\t\t\taction.clientIds.forEach( ( clientId ) => {\n\t\t\t\tif ( clientId in newPanels ) {\n\t\t\t\t\tdelete newPanels[ clientId ];\n\t\t\t\t\thasChanges = true;\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn hasChanges ? { ...state, panels: newPanels } : state;\n\t\t}\n\t}\n\treturn state;\n}\n\n/**\n * Reducer returning the List View expand revision.\n *\n * This is a counter used to force ListView components to remount. When incremented,\n * the ListView key changes, causing the component to remount with a fresh\n * isExpanded=true state.\n *\n * @param {number} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {number} Updated state.\n */\nfunction listViewExpandRevision( state = 0, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'INCREMENT_LIST_VIEW_EXPAND_REVISION':\n\t\t\treturn state + 1;\n\t}\n\treturn state;\n}\n\n/**\n * Reducer tracking whether the list view content panel popover is open.\n *\n * @param {boolean} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {boolean} Updated state.\n */\nexport function listViewContentPanelOpen( state = false, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'OPEN_LIST_VIEW_CONTENT_PANEL':\n\t\t\treturn true;\n\n\t\tcase 'CLOSE_LIST_VIEW_CONTENT_PANEL':\n\t\t\treturn false;\n\n\t\t// Close when selection is cleared\n\t\tcase 'CLEAR_SELECTED_BLOCK':\n\t\t\treturn false;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer tracking the requested inspector tab state.\n * Stores a request to open a specific inspector tab with optional configuration.\n *\n * @param {Object|null} state Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object|null} Updated state.\n */\nexport function requestedInspectorTab( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'REQUEST_INSPECTOR_TAB':\n\t\t\treturn {\n\t\t\t\ttabName: action.tabName,\n\t\t\t\toptions: action.options,\n\t\t\t};\n\t\tcase 'CLEAR_REQUESTED_INSPECTOR_TAB':\n\t\t\treturn null;\n\t}\n\n\treturn state;\n}\n\nconst combinedReducers = combineReducers( {\n\tblocks,\n\tisDragging,\n\tisTyping,\n\tisBlockInterfaceHidden,\n\tdraggedBlocks,\n\tselection,\n\tisMultiSelecting,\n\tisSelectionEnabled,\n\tinitialPosition,\n\tblocksMode,\n\tblockListSettings,\n\tinsertionPoint,\n\tinsertionCue,\n\ttemplate,\n\tsettings,\n\tpreferences,\n\tlastBlockAttributesChange,\n\tlastFocus,\n\texpandedBlock,\n\thighlightedBlock,\n\tlastBlockInserted,\n\teditedContentOnlySection,\n\tblockVisibility,\n\tviewportModalClientIds,\n\tstyleOverrides,\n\tremovalPromptData,\n\tblockRemovalRules,\n\tregisteredInserterMediaCategories,\n\tzoomLevel,\n\thasBlockSpotlight,\n\topenedListViewPanels,\n\tlistViewExpandRevision,\n\tlistViewContentPanelOpen,\n\trequestedInspectorTab,\n} );\n\n/**\n * Retrieves a block's tree structure, handling both controlled and uncontrolled inner blocks.\n *\n * @param {Object} state The current state object.\n * @param {string} clientId The client ID of the block to retrieve.\n *\n * @return {Object|undefined} The block tree object, or undefined if not found. For controlled blocks,\n * returns a merged tree with controlled inner blocks.\n */\nfunction getBlockTreeBlock( state, clientId ) {\n\tif ( clientId === '' ) {\n\t\tconst rootBlock = state.blocks.tree.get( clientId );\n\n\t\tif ( ! rootBlock ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Patch the root block to have a clientId property.\n\t\t// TODO - consider updating the blocks reducer so that the root block has this property.\n\t\treturn {\n\t\t\tclientId: '',\n\t\t\t...rootBlock,\n\t\t};\n\t}\n\n\tif ( ! state.blocks.controlledInnerBlocks[ clientId ] ) {\n\t\treturn state.blocks.tree.get( clientId );\n\t}\n\n\tconst controlledTree = state.blocks.tree.get( `controlled||${ clientId }` );\n\tconst regularTree = state.blocks.tree.get( clientId );\n\n\treturn {\n\t\t...regularTree,\n\t\tinnerBlocks: controlledTree?.innerBlocks,\n\t};\n}\n\n/**\n * Recursively traverses through a block tree of a given block and executes a callback for each block.\n *\n * @param {Object} state The store state.\n * @param {string} clientId The clientId of the block to start traversing from.\n * @param {Function} callback Function to execute for each block encountered during traversal.\n * The callback receives the current block as its argument.\n */\nfunction traverseBlockTree( state, clientId, callback ) {\n\tconst tree = getBlockTreeBlock( state, clientId );\n\tif ( ! tree ) {\n\t\treturn;\n\t}\n\n\tcallback( tree );\n\n\tif ( ! tree?.innerBlocks?.length ) {\n\t\treturn;\n\t}\n\n\tfor ( const innerBlock of tree?.innerBlocks ) {\n\t\ttraverseBlockTree( state, innerBlock.clientId, callback );\n\t}\n}\n\n/**\n * Checks if a block has a parent in a list of client IDs, and if so returns the client ID of the parent.\n *\n * @param {Object} state The current state object.\n * @param {string} clientId The client ID of the block to search the parents of.\n * @param {Array} clientIds The client IDs of the blocks to check.\n *\n * @return {string|undefined} The client ID of the parent block if found, undefined otherwise.\n */\nfunction findParentInClientIdsList( state, clientId, clientIds ) {\n\tif ( ! clientIds.length ) {\n\t\treturn;\n\t}\n\n\tlet parent = state.blocks.parents.get( clientId );\n\twhile ( parent !== undefined ) {\n\t\tif ( clientIds.includes( parent ) ) {\n\t\t\treturn parent;\n\t\t}\n\t\tparent = state.blocks.parents.get( parent );\n\t}\n}\n\n/**\n * Checks if a block has any bindings in its metadata attributes.\n *\n * @param {Object} block The block object to check for bindings.\n * @return {boolean} True if the block has bindings, false otherwise.\n */\nfunction hasBindings( block ) {\n\treturn (\n\t\tblock?.attributes?.metadata?.bindings &&\n\t\tObject.keys( block?.attributes?.metadata?.bindings ).length\n\t);\n}\n\n/**\n * Computes and returns derived block editing modes for a given block tree.\n *\n * This function calculates the editing modes for each block in the tree, taking into account\n * various factors such as zoom level, sections, and synced patterns.\n *\n * @param {Object} state The current state object.\n * @param {string} treeClientId The client ID of the root block for the tree. Defaults to an empty string.\n * @return {Map} A Map containing the derived block editing modes, keyed by block client ID.\n */\nfunction getDerivedBlockEditingModesForTree( state, treeClientId = '' ) {\n\tconst isZoomedOut =\n\t\tstate?.zoomLevel < 100 || state?.zoomLevel === 'auto-scaled';\n\tconst derivedBlockEditingModes = new Map();\n\n\t// When there are sections, the majority of blocks are disabled,\n\t// so the default block editing mode is set to disabled.\n\tconst sectionRootClientId = state.settings?.[ sectionRootClientIdKey ];\n\tconst sectionClientIds = state.blocks.order.get( sectionRootClientId );\n\tconst hasDisabledBlocks = Array.from( state.blocks.blockEditingModes ).some(\n\t\t( [ , mode ] ) => mode === 'disabled'\n\t);\n\tconst templatePartClientIds = [];\n\tconst syncedPatternClientIds = [];\n\n\tObject.keys( state.blocks.controlledInnerBlocks ).forEach( ( clientId ) => {\n\t\tconst block = state.blocks.byClientId?.get( clientId );\n\n\t\tif ( block?.name === 'core/template-part' ) {\n\t\t\ttemplatePartClientIds.push( clientId );\n\t\t}\n\n\t\tif ( block?.name === 'core/block' ) {\n\t\t\tsyncedPatternClientIds.push( clientId );\n\t\t}\n\t} );\n\tconst contentOnlyTemplateLockedClientIds = Object.keys(\n\t\tstate.blockListSettings\n\t).filter(\n\t\t( clientId ) =>\n\t\t\tstate.blockListSettings[ clientId ]?.templateLock === 'contentOnly'\n\t);\n\n\t// When in an isolated editing context (e.g., editing a template part or pattern directly),\n\t// don't apply contentOnly mode to nested unsynced patterns or template parts.\n\tconst isIsolatedEditor = state.settings?.[ isIsolatedEditorKey ];\n\n\tconst disableContentOnlyForUnsyncedPatterns =\n\t\tstate.settings?.disableContentOnlyForUnsyncedPatterns;\n\n\t// Use array.from for better back compat. Older versions of the iterator returned\n\t// from `keys()` didn't have the `filter` method.\n\tconst unsyncedPatternClientIds =\n\t\tisIsolatedEditor || disableContentOnlyForUnsyncedPatterns\n\t\t\t? []\n\t\t\t: Array.from( state.blocks.attributes.keys() ).filter(\n\t\t\t\t\t( clientId ) =>\n\t\t\t\t\t\tstate.blocks.attributes.get( clientId )?.metadata\n\t\t\t\t\t\t\t?.patternName\n\t\t\t );\n\tconst disableContentOnlyForTemplateParts =\n\t\tstate.settings?.disableContentOnlyForTemplateParts;\n\n\tconst contentOnlyParents = [\n\t\t...contentOnlyTemplateLockedClientIds,\n\t\t...unsyncedPatternClientIds,\n\t\t...( isIsolatedEditor || disableContentOnlyForTemplateParts\n\t\t\t? []\n\t\t\t: templatePartClientIds ),\n\t];\n\n\ttraverseBlockTree( state, treeClientId, ( block ) => {\n\t\tconst { clientId, name: blockName } = block;\n\n\t\tconst hasEditedContentOnlySection = !! state.editedContentOnlySection;\n\t\tlet isWithinEditedContentOnlySection = false;\n\t\tif ( hasEditedContentOnlySection ) {\n\t\t\tisWithinEditedContentOnlySection =\n\t\t\t\tclientId === state.editedContentOnlySection ||\n\t\t\t\t!! findParentInClientIdsList( state, clientId, [\n\t\t\t\t\tstate.editedContentOnlySection,\n\t\t\t\t] );\n\n\t\t\t// When a contentOnly section is being edited, all blocks outside\n\t\t\t// the section are disabled. This should never be overridable by any\n\t\t\t// other block editing modes, it helps to constrain keyboard navigation\n\t\t\t// to within the edited section.\n\t\t\tif ( ! isWithinEditedContentOnlySection ) {\n\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// If the block already has an explicit block editing mode set,\n\t\t// don't override it.\n\t\tif ( state.blocks.blockEditingModes.has( clientId ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Disabled explicit block editing modes are inherited by children.\n\t\t// It's an expensive calculation, so only do it if there are disabled blocks.\n\t\tif ( hasDisabledBlocks ) {\n\t\t\t// Look through parents to find one with an explicit block editing mode.\n\t\t\tlet ancestorBlockEditingMode;\n\t\t\tlet parent = state.blocks.parents.get( clientId );\n\t\t\twhile ( parent !== undefined ) {\n\t\t\t\tif ( state.blocks.blockEditingModes.has( parent ) ) {\n\t\t\t\t\t// Checking the explicit block editing mode will be slower,\n\t\t\t\t\t// as the block editing mode is more likely to be set on a\n\t\t\t\t\t// distant ancestor.\n\t\t\t\t\tancestorBlockEditingMode =\n\t\t\t\t\t\tstate.blocks.blockEditingModes.get( parent );\n\t\t\t\t}\n\t\t\t\tif ( ancestorBlockEditingMode ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tparent = state.blocks.parents.get( parent );\n\t\t\t}\n\n\t\t\t// If the ancestor block editing mode is disabled, it's inherited by the child.\n\t\t\tif ( ancestorBlockEditingMode === 'disabled' ) {\n\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif ( isZoomedOut ) {\n\t\t\t// If the root block is the section root set its editing mode to contentOnly.\n\t\t\tif ( clientId === sectionRootClientId ) {\n\t\t\t\tderivedBlockEditingModes.set( clientId, 'contentOnly' );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// There are no sections, so everything else is disabled.\n\t\t\tif ( ! sectionClientIds?.length ) {\n\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( sectionClientIds.includes( clientId ) ) {\n\t\t\t\tderivedBlockEditingModes.set( clientId, 'contentOnly' );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If zoomed out, all blocks that aren't sections or the section root are\n\t\t\t// disabled.\n\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( syncedPatternClientIds.length ) {\n\t\t\t// Synced pattern blocks (core/block).\n\t\t\tif ( syncedPatternClientIds.includes( clientId ) ) {\n\t\t\t\t// This is a synced pattern nested in another synced pattern,\n\t\t\t\t// disable the core/block itself.\n\t\t\t\tif (\n\t\t\t\t\tfindParentInClientIdsList(\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\tsyncedPatternClientIds\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Else do nothing, use the default block editing mode.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Inner blocks of synced patterns.\n\t\t\tconst parentSyncedPatternClientId = findParentInClientIdsList(\n\t\t\t\tstate,\n\t\t\t\tclientId,\n\t\t\t\tsyncedPatternClientIds\n\t\t\t);\n\t\t\tif ( parentSyncedPatternClientId ) {\n\t\t\t\t// This is an inner block of a synced pattern that's nested in another synced pattern,\n\t\t\t\t// disable its contents.\n\t\t\t\tif (\n\t\t\t\t\tfindParentInClientIdsList(\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tparentSyncedPatternClientId,\n\t\t\t\t\t\tsyncedPatternClientIds\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( hasBindings( block ) ) {\n\t\t\t\t\tderivedBlockEditingModes.set( clientId, 'contentOnly' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Synced pattern content without a binding isn't editable\n\t\t\t\t// from the instance, the user has to edit the pattern source,\n\t\t\t\t// so return 'disabled'.\n\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Set the edited section and all blocks within it to 'default', so that all changes can be made.\n\t\tif ( hasEditedContentOnlySection && isWithinEditedContentOnlySection ) {\n\t\t\tderivedBlockEditingModes.set( clientId, 'default' );\n\t\t\t// When there's an editedContentOnlySection, it overrides any modes that are usually\n\t\t\t// set for `contentOnlyParents`, return early to prevent continuing to code below.\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle `templateLock=contentOnly` blocks and unsynced patterns.\n\t\tif ( contentOnlyParents.length ) {\n\t\t\tconst hasContentOnlyParent = !! findParentInClientIdsList(\n\t\t\t\tstate,\n\t\t\t\tclientId,\n\t\t\t\tcontentOnlyParents\n\t\t\t);\n\t\t\tif ( hasContentOnlyParent ) {\n\t\t\t\tif ( isContentBlock( blockName ) ) {\n\t\t\t\t\tderivedBlockEditingModes.set( clientId, 'contentOnly' );\n\t\t\t\t} else {\n\t\t\t\t\tderivedBlockEditingModes.set( clientId, 'disabled' );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} );\n\n\treturn derivedBlockEditingModes;\n}\n\n/**\n * Updates the derived block editing modes based on added and removed blocks.\n *\n * This function handles the updating of block editing modes when blocks are added,\n * removed, or moved within the editor.\n *\n * It only returns a value when modifications are made to the block editing modes.\n *\n * @param {Object} options The options for updating derived block editing modes.\n * @param {Object} options.prevState The previous state object.\n * @param {Object} options.nextState The next state object.\n * @param {Array} [options.addedBlocks] An array of blocks that were added.\n * @param {Array} [options.removedClientIds] An array of client IDs of blocks that were removed.\n * @return {Map|undefined} The updated derived block editing modes, or undefined if no changes were made.\n */\nfunction getDerivedBlockEditingModesUpdates( {\n\tprevState,\n\tnextState,\n\taddedBlocks,\n\tremovedClientIds,\n} ) {\n\tconst prevDerivedBlockEditingModes = prevState.derivedBlockEditingModes;\n\tlet nextDerivedBlockEditingModes;\n\n\t// Perform removals before additions to handle cases like the `MOVE_BLOCKS_TO_POSITION` action.\n\t// That action removes a set of clientIds, but adds the same blocks back in a different location.\n\t// If removals were performed after additions, those moved clientIds would be removed incorrectly.\n\tremovedClientIds?.forEach( ( clientId ) => {\n\t\t// The actions only receive parent block IDs for removal.\n\t\t// Recurse through the block tree to ensure all blocks are removed.\n\t\t// Specifically use the previous state, before the blocks were removed.\n\t\ttraverseBlockTree( prevState, clientId, ( block ) => {\n\t\t\tif ( prevDerivedBlockEditingModes.has( block.clientId ) ) {\n\t\t\t\tif ( ! nextDerivedBlockEditingModes ) {\n\t\t\t\t\tnextDerivedBlockEditingModes = new Map(\n\t\t\t\t\t\tprevDerivedBlockEditingModes\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tnextDerivedBlockEditingModes.delete( block.clientId );\n\t\t\t}\n\t\t} );\n\t} );\n\n\taddedBlocks?.forEach( ( addedBlock ) => {\n\t\tconst updates = getDerivedBlockEditingModesForTree(\n\t\t\tnextState,\n\t\t\taddedBlock.clientId\n\t\t);\n\n\t\tif ( updates.size ) {\n\t\t\tif ( ! nextDerivedBlockEditingModes ) {\n\t\t\t\tnextDerivedBlockEditingModes = new Map( [\n\t\t\t\t\t...( prevDerivedBlockEditingModes?.size\n\t\t\t\t\t\t? prevDerivedBlockEditingModes\n\t\t\t\t\t\t: [] ),\n\t\t\t\t\t...updates,\n\t\t\t\t] );\n\t\t\t} else {\n\t\t\t\tnextDerivedBlockEditingModes = new Map( [\n\t\t\t\t\t...( nextDerivedBlockEditingModes?.size\n\t\t\t\t\t\t? nextDerivedBlockEditingModes\n\t\t\t\t\t\t: [] ),\n\t\t\t\t\t...updates,\n\t\t\t\t] );\n\t\t\t}\n\t\t}\n\t} );\n\n\treturn nextDerivedBlockEditingModes;\n}\n\n/**\n * Higher-order reducer that adds derived block editing modes to the state.\n *\n * This function wraps a reducer and enhances it to handle actions that affect\n * block editing modes. It updates the derivedBlockEditingModes in the state\n * based on various actions such as adding, removing, or moving blocks, or changing\n * the editor mode.\n *\n * @param {Function} reducer The original reducer function to be wrapped.\n * @return {Function} A new reducer function that includes derived block editing modes handling.\n */\nexport function withDerivedBlockEditingModes( reducer ) {\n\treturn ( state, action ) => {\n\t\tconst nextState = reducer( state, action );\n\n\t\t// An exception is needed here to still recompute the block editing modes when\n\t\t// the editor mode changes since the editor mode isn't stored within the\n\t\t// block editor state and changing it won't trigger an altered new state.\n\t\tif ( action.type !== 'SET_EDITOR_MODE' && nextState === state ) {\n\t\t\treturn state;\n\t\t}\n\n\t\tswitch ( action.type ) {\n\t\t\tcase 'REMOVE_BLOCKS': {\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\tremovedClientIds: action.clientIds,\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'RECEIVE_BLOCKS':\n\t\t\tcase 'INSERT_BLOCKS': {\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\taddedBlocks: action.blocks,\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'UPDATE_BLOCK_ATTRIBUTES': {\n\t\t\t\t// Handle unsynced patterns which indicate their contentOnly-ness via\n\t\t\t\t// the `attributes.metadata.patternName` property.\n\t\t\t\t// Check when this is added or removed and update blockEditingModes.\n\t\t\t\tconst disableContentOnlyForUnsyncedPatterns =\n\t\t\t\t\tnextState.settings?.disableContentOnlyForUnsyncedPatterns;\n\n\t\t\t\tif ( disableContentOnlyForUnsyncedPatterns ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst addedBlocks = [];\n\t\t\t\tconst removedClientIds = [];\n\n\t\t\t\tfor ( const clientId of action?.clientIds ) {\n\t\t\t\t\tconst attributes = action.options?.uniqueByBlock\n\t\t\t\t\t\t? action.attributes[ clientId ]\n\t\t\t\t\t\t: action.attributes;\n\n\t\t\t\t\tif ( ! attributes ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (\n\t\t\t\t\t\t// patternName is switching from falsy to truthy, indicating\n\t\t\t\t\t\t// this block is becoming an unsynced pattern.\n\t\t\t\t\t\tattributes.metadata?.patternName &&\n\t\t\t\t\t\t! state.blocks.attributes.get( clientId )?.metadata\n\t\t\t\t\t\t\t?.patternName\n\t\t\t\t\t) {\n\t\t\t\t\t\taddedBlocks.push(\n\t\t\t\t\t\t\tnextState.blocks.tree.get( clientId )\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (\n\t\t\t\t\t\t// patternName is switching from truthy to falsy, this block is becoming\n\t\t\t\t\t\t// a regular block but was an unsynced pattern.\n\t\t\t\t\t\t// Check that `metadata` is part of the included attributes, as\n\t\t\t\t\t\t// `updateBlockAttributes` merges attributes, if it isn't present\n\t\t\t\t\t\t// the previous `metadata` would be retained.\n\t\t\t\t\t\tattributes.metadata &&\n\t\t\t\t\t\t! attributes.metadata?.patternName &&\n\t\t\t\t\t\tstate.blocks.attributes.get( clientId )?.metadata\n\t\t\t\t\t\t\t?.patternName\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Include it in 'removedClientIds'.\n\t\t\t\t\t\tremovedClientIds.push( clientId );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( ! addedBlocks?.length && ! removedClientIds?.length ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\taddedBlocks,\n\t\t\t\t\t\tremovedClientIds,\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'UPDATE_BLOCK_LIST_SETTINGS': {\n\t\t\t\t// Handle the addition and removal of contentOnly template locked blocks.\n\t\t\t\tconst addedBlocks = [];\n\t\t\t\tconst removedClientIds = [];\n\n\t\t\t\tconst updates =\n\t\t\t\t\ttypeof action.clientId === 'string'\n\t\t\t\t\t\t? { [ action.clientId ]: action.settings }\n\t\t\t\t\t\t: action.clientId;\n\n\t\t\t\tfor ( const clientId in updates ) {\n\t\t\t\t\tconst isNewContentOnlyBlock =\n\t\t\t\t\t\tstate.blockListSettings[ clientId ]?.templateLock !==\n\t\t\t\t\t\t\t'contentOnly' &&\n\t\t\t\t\t\tnextState.blockListSettings[ clientId ]\n\t\t\t\t\t\t\t?.templateLock === 'contentOnly';\n\n\t\t\t\t\tconst wasContentOnlyBlock =\n\t\t\t\t\t\tstate.blockListSettings[ clientId ]?.templateLock ===\n\t\t\t\t\t\t\t'contentOnly' &&\n\t\t\t\t\t\tnextState.blockListSettings[ clientId ]\n\t\t\t\t\t\t\t?.templateLock !== 'contentOnly';\n\n\t\t\t\t\tif ( isNewContentOnlyBlock ) {\n\t\t\t\t\t\taddedBlocks.push(\n\t\t\t\t\t\t\tnextState.blocks.tree.get( clientId )\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if ( wasContentOnlyBlock ) {\n\t\t\t\t\t\tremovedClientIds.push( clientId );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( ! addedBlocks.length && ! removedClientIds.length ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\taddedBlocks,\n\t\t\t\t\t\tremovedClientIds,\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'SET_BLOCK_EDITING_MODE':\n\t\t\tcase 'UNSET_BLOCK_EDITING_MODE':\n\t\t\tcase 'SET_HAS_CONTROLLED_INNER_BLOCKS': {\n\t\t\t\tconst updatedBlock = getBlockTreeBlock(\n\t\t\t\t\tnextState,\n\t\t\t\t\taction.clientId\n\t\t\t\t);\n\n\t\t\t\t// The block might have been removed in which case it'll be\n\t\t\t\t// handled by the `REMOVE_BLOCKS` action.\n\t\t\t\tif ( ! updatedBlock ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\tremovedClientIds: [ action.clientId ],\n\t\t\t\t\t\taddedBlocks: [ updatedBlock ],\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'REPLACE_BLOCKS': {\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\taddedBlocks: action.blocks,\n\t\t\t\t\t\tremovedClientIds: action.clientIds,\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'REPLACE_INNER_BLOCKS': {\n\t\t\t\t// Get the clientIds of the blocks that are being replaced\n\t\t\t\t// from the old state, before they were removed.\n\t\t\t\tconst removedClientIds = state.blocks.order.get(\n\t\t\t\t\taction.rootClientId\n\t\t\t\t);\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\taddedBlocks: action.blocks,\n\t\t\t\t\t\tremovedClientIds,\n\t\t\t\t\t} );\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'MOVE_BLOCKS_TO_POSITION': {\n\t\t\t\tconst addedBlocks = action.clientIds.map( ( clientId ) => {\n\t\t\t\t\treturn nextState.blocks.byClientId.get( clientId );\n\t\t\t\t} );\n\t\t\t\tconst nextDerivedBlockEditingModes =\n\t\t\t\t\tgetDerivedBlockEditingModesUpdates( {\n\t\t\t\t\t\tprevState: state,\n\t\t\t\t\t\tnextState,\n\t\t\t\t\t\taddedBlocks,\n\t\t\t\t\t\tremovedClientIds: action.clientIds,\n\t\t\t\t\t} );\n\n\t\t\t\tif ( nextDerivedBlockEditingModes ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tnextDerivedBlockEditingModes ??\n\t\t\t\t\t\t\tstate.derivedBlockEditingModes,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'UPDATE_SETTINGS': {\n\t\t\t\t// Recompute the entire tree if the section root,\n\t\t\t\t// the effective disableContentOnlyForUnsyncedPatterns value,\n\t\t\t\t// the isIsolatedEditor value, or the\n\t\t\t\t// disableContentOnlyForTemplateParts value changes.\n\t\t\t\t// These are all values that affect the computation.\n\t\t\t\tif (\n\t\t\t\t\tstate?.settings?.[ sectionRootClientIdKey ] !==\n\t\t\t\t\t\tnextState?.settings?.[ sectionRootClientIdKey ] ||\n\t\t\t\t\t!! state?.settings\n\t\t\t\t\t\t?.disableContentOnlyForUnsyncedPatterns !==\n\t\t\t\t\t\t!! nextState?.settings\n\t\t\t\t\t\t\t?.disableContentOnlyForUnsyncedPatterns ||\n\t\t\t\t\t!! state?.settings?.[ isIsolatedEditorKey ] !==\n\t\t\t\t\t\t!! nextState?.settings?.[ isIsolatedEditorKey ] ||\n\t\t\t\t\t!! state?.settings?.disableContentOnlyForTemplateParts !==\n\t\t\t\t\t\t!! nextState?.settings\n\t\t\t\t\t\t\t?.disableContentOnlyForTemplateParts\n\t\t\t\t) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...nextState,\n\t\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\t\tgetDerivedBlockEditingModesForTree( nextState ),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'RESET_BLOCKS':\n\t\t\tcase 'EDIT_CONTENT_ONLY_SECTION':\n\t\t\tcase 'SET_EDITOR_MODE':\n\t\t\tcase 'RESET_ZOOM_LEVEL':\n\t\t\tcase 'SET_ZOOM_LEVEL': {\n\t\t\t\t// Recompute the entire tree if the editor mode or zoom level changes,\n\t\t\t\t// or if all the blocks are reset.\n\t\t\t\treturn {\n\t\t\t\t\t...nextState,\n\t\t\t\t\tderivedBlockEditingModes:\n\t\t\t\t\t\tgetDerivedBlockEditingModesForTree( nextState ),\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// If there's no change, the derivedBlockEditingModes from the previous\n\t\t// state need to be preserved.\n\t\tnextState.derivedBlockEditingModes =\n\t\t\tstate?.derivedBlockEditingModes ?? new Map();\n\n\t\treturn nextState;\n\t};\n}\n\nfunction withAutomaticChangeReset( reducer ) {\n\treturn ( state, action ) => {\n\t\tconst nextState = reducer( state, action );\n\n\t\tif ( ! state ) {\n\t\t\treturn nextState;\n\t\t}\n\n\t\t// Take over the last value without creating a new reference.\n\t\tnextState.automaticChangeStatus = state.automaticChangeStatus;\n\n\t\tif ( action.type === 'MARK_AUTOMATIC_CHANGE' ) {\n\t\t\treturn {\n\t\t\t\t...nextState,\n\t\t\t\tautomaticChangeStatus: 'pending',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\taction.type === 'MARK_AUTOMATIC_CHANGE_FINAL' &&\n\t\t\tstate.automaticChangeStatus === 'pending'\n\t\t) {\n\t\t\treturn {\n\t\t\t\t...nextState,\n\t\t\t\tautomaticChangeStatus: 'final',\n\t\t\t};\n\t\t}\n\n\t\t// If there's a change that doesn't affect blocks or selection, maintain\n\t\t// the current status.\n\t\tif (\n\t\t\tnextState.blocks === state.blocks &&\n\t\t\tnextState.selection === state.selection\n\t\t) {\n\t\t\treturn nextState;\n\t\t}\n\n\t\t// As long as the state is not final, ignore any selection changes.\n\t\tif (\n\t\t\tnextState.automaticChangeStatus !== 'final' &&\n\t\t\tnextState.selection !== state.selection\n\t\t) {\n\t\t\treturn nextState;\n\t\t}\n\n\t\t// Reset the status if blocks change or selection changes (when status is final).\n\t\treturn {\n\t\t\t...nextState,\n\t\t\tautomaticChangeStatus: undefined,\n\t\t};\n\t};\n}\n\nexport default pipe(\n\twithDerivedBlockEditingModes,\n\twithAutomaticChangeReset\n)( combinedReducers );\n"],
5
+ "mappings": "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",
6
6
  "names": ["blocksPrivateApis", "blocks", "fastDeepEqual", "parentsOfRemovedBlocks", "newState", "selectionStart", "selectionEnd", "deprecated", "blocksStore"]
7
7
  }