{
  "version": 3,
  "sources": ["../../src/tabs/edit.js"],
  "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tuseBlockProps,\n\tuseInnerBlocksProps,\n\tBlockContextProvider,\n\tstore as blockEditorStore,\n} from '@wordpress/block-editor';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useMemo, useEffect, useRef } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport Controls from './controls';\n\nconst EMPTY_ARRAY = [];\n\nconst TABS_TEMPLATE = [\n\t[\n\t\t'core/tabs-menu',\n\t\t{\n\t\t\tlock: {\n\t\t\t\tremove: true,\n\t\t\t},\n\t\t},\n\t\t[\n\t\t\t[ 'core/tabs-menu-item', {} ],\n\t\t\t[ 'core/tabs-menu-item', {} ],\n\t\t],\n\t],\n\t[\n\t\t'core/tab-panel',\n\t\t{\n\t\t\tlock: {\n\t\t\t\tremove: true,\n\t\t\t},\n\t\t},\n\t\t[\n\t\t\t[\n\t\t\t\t'core/tab',\n\t\t\t\t{\n\t\t\t\t\tlabel: __( 'Tab' ),\n\t\t\t\t},\n\t\t\t\t[ [ 'core/paragraph' ] ],\n\t\t\t],\n\t\t\t[\n\t\t\t\t'core/tab',\n\t\t\t\t{\n\t\t\t\t\tlabel: __( 'Tab' ),\n\t\t\t\t},\n\t\t\t\t[ [ 'core/paragraph' ] ],\n\t\t\t],\n\t\t],\n\t],\n];\n\nfunction Edit( {\n\tclientId,\n\tattributes,\n\tsetAttributes,\n\t__unstableLayoutClassNames: layoutClassNames,\n} ) {\n\tconst { anchor, activeTabIndex, editorActiveTabIndex } = attributes;\n\n\t/**\n\t * Initialize editorActiveTabIndex to activeTabIndex on mount.\n\t * This ensures the ephemeral editor state starts at the persisted default.\n\t */\n\tuseEffect( () => {\n\t\tif ( editorActiveTabIndex === undefined ) {\n\t\t\tsetAttributes( { editorActiveTabIndex: activeTabIndex } );\n\t\t}\n\t}, [] ); // eslint-disable-line react-hooks/exhaustive-deps\n\n\tconst { removeBlock, replaceInnerBlocks } = useDispatch( blockEditorStore );\n\n\tconst { tabs, tabPanelClientId, menuItems } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getBlocks } = select( blockEditorStore );\n\t\t\tconst innerBlocks = getBlocks( clientId );\n\n\t\t\tconst tabPanel = innerBlocks.find(\n\t\t\t\t( block ) => block.name === 'core/tab-panel'\n\t\t\t);\n\t\t\tconst tabsMenu = innerBlocks.find(\n\t\t\t\t( block ) => block.name === 'core/tabs-menu'\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\ttabs: tabPanel?.innerBlocks ?? EMPTY_ARRAY,\n\t\t\t\ttabPanelClientId: tabPanel?.clientId ?? null,\n\t\t\t\tmenuItems: tabsMenu?.innerBlocks ?? EMPTY_ARRAY,\n\t\t\t};\n\t\t},\n\t\t[ clientId ]\n\t);\n\n\t/**\n\t * Keep tabs and menu items in sync when either is deleted directly (e.g.\n\t * via the Backspace key or List View).\n\t *\n\t * TODO: This effect only handles deletions. The two lists can get out of\n\t * sync in other cases: if a user pastes a core/tab block into the tab-panel\n\t * (or duplicates one), no corresponding tabs-menu-item is created; if a\n\t * user drags and drops a tabs-menu-item, the tab panel is not copied with\n\t * it. We should extend this effect to handle insertions, detecting when\n\t * tabs.length > menuItems.length and inserting the missing menu\n\t * item(s) at the correct index.\n\t */\n\tconst prevSyncStateRef = useRef( null );\n\tuseEffect( () => {\n\t\tconst currentTabs = tabs.map( ( tab ) => ( {\n\t\t\tclientId: tab.clientId,\n\t\t} ) );\n\n\t\tif ( prevSyncStateRef.current === null ) {\n\t\t\tprevSyncStateRef.current = {\n\t\t\t\ttabs: currentTabs,\n\t\t\t\tmenuItems: [ ...menuItems ],\n\t\t\t};\n\t\t\treturn;\n\t\t}\n\n\t\tconst { tabs: prevTabs, menuItems: prevMenuItems } =\n\t\t\tprevSyncStateRef.current;\n\n\t\tconst tabsRemoved = currentTabs.length < prevTabs.length;\n\t\tconst menuItemsRemoved = menuItems.length < prevMenuItems.length;\n\t\tconst menuItemsReordered =\n\t\t\t! tabsRemoved &&\n\t\t\t! menuItemsRemoved &&\n\t\t\tmenuItems.length === prevMenuItems.length &&\n\t\t\tmenuItems.some(\n\t\t\t\t( m, i ) => m.clientId !== prevMenuItems[ i ]?.clientId\n\t\t\t);\n\n\t\t// Update snapshot to the current state.\n\t\t// Snapshot is updated eagerly; post-removal mutations keep it consistent\n\t\t// so the next effect invocation sees a stable baseline.\n\t\tprevSyncStateRef.current = {\n\t\t\ttabs: currentTabs,\n\t\t\tmenuItems: [ ...menuItems ],\n\t\t};\n\n\t\t// When menu items are reordered, move the corresponding tab content\n\t\t// blocks to match the new order.\n\t\tif ( menuItemsReordered && tabPanelClientId ) {\n\t\t\tconst reorderedTabs = menuItems\n\t\t\t\t.map( ( menuItem ) => {\n\t\t\t\t\tconst oldIndex = prevMenuItems.findIndex(\n\t\t\t\t\t\t( pm ) => pm.clientId === menuItem.clientId\n\t\t\t\t\t);\n\t\t\t\t\treturn oldIndex !== -1 ? tabs[ oldIndex ] : null;\n\t\t\t\t} )\n\t\t\t\t.filter( Boolean );\n\t\t\tif ( reorderedTabs.length === tabs.length ) {\n\t\t\t\treplaceInnerBlocks( tabPanelClientId, reorderedTabs, false );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Lists are in sync, nothing changed, or toolbar already removed both.\n\t\tif (\n\t\t\t( ! tabsRemoved && ! menuItemsRemoved ) ||\n\t\t\t( tabsRemoved && menuItemsRemoved )\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentTabIds = new Set( currentTabs.map( ( t ) => t.clientId ) );\n\t\tconst currentMenuItemIds = new Set(\n\t\t\tmenuItems.map( ( m ) => m.clientId )\n\t\t);\n\n\t\tif ( tabsRemoved ) {\n\t\t\t// Remove the menu item at the same position.\n\t\t\tconst removedIndex = prevTabs.findIndex(\n\t\t\t\t( t ) => ! currentTabIds.has( t.clientId )\n\t\t\t);\n\t\t\tif ( removedIndex >= 0 && menuItems[ removedIndex ] ) {\n\t\t\t\tremoveBlock( menuItems[ removedIndex ].clientId, false );\n\t\t\t\tprevSyncStateRef.current.menuItems =\n\t\t\t\t\tprevSyncStateRef.current.menuItems.filter(\n\t\t\t\t\t\t( _, i ) => i !== removedIndex\n\t\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\t// Remove the tab at the same position.\n\t\t\tconst removedIndex = prevMenuItems.findIndex(\n\t\t\t\t( m ) => ! currentMenuItemIds.has( m.clientId )\n\t\t\t);\n\t\t\tif ( removedIndex >= 0 && tabs[ removedIndex ] ) {\n\t\t\t\tremoveBlock( tabs[ removedIndex ].clientId, false );\n\t\t\t\tprevSyncStateRef.current.tabs =\n\t\t\t\t\tprevSyncStateRef.current.tabs.filter(\n\t\t\t\t\t\t( _, i ) => i !== removedIndex\n\t\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}, [ tabs, tabPanelClientId, menuItems, removeBlock, replaceInnerBlocks ] );\n\n\t/**\n\t * Memoize context value to prevent unnecessary re-renders.\n\t */\n\tconst contextValue = useMemo( () => {\n\t\t/**\n\t\t * Compute tabs list from innerblocks to provide via context.\n\t\t * This traverses the tab-panel block to find all tab blocks\n\t\t * and extracts their label and anchor for the tabs-menu to consume.\n\t\t */\n\t\tconst tabList = tabs.map( ( tab, index ) => ( {\n\t\t\tid: tab.attributes.anchor || `tab-${ index }`,\n\t\t\tlabel: tab.attributes.label || '',\n\t\t\tclientId: tab.clientId,\n\t\t\tindex,\n\t\t} ) );\n\n\t\treturn {\n\t\t\t'core/tabs-list': tabList,\n\t\t\t'core/tabs-id': anchor,\n\t\t\t'core/tabs-activeTabIndex': activeTabIndex,\n\t\t\t'core/tabs-editorActiveTabIndex': editorActiveTabIndex,\n\t\t};\n\t}, [ tabs, anchor, activeTabIndex, editorActiveTabIndex ] );\n\n\t/**\n\t * Block props for the tabs container.\n\t */\n\tconst blockProps = useBlockProps( {\n\t\tclassName: layoutClassNames,\n\t} );\n\n\t/**\n\t * Innerblocks props for the tabs container.\n\t */\n\tconst innerBlockProps = useInnerBlocksProps( blockProps, {\n\t\t__experimentalCaptureToolbars: true,\n\t\ttemplate: TABS_TEMPLATE,\n\t\ttemplateLock: false,\n\t\trenderAppender: false,\n\t} );\n\n\treturn (\n\t\t<BlockContextProvider value={ contextValue }>\n\t\t\t<div { ...innerBlockProps }>\n\t\t\t\t<Controls\n\t\t\t\t\tclientId={ clientId }\n\t\t\t\t\tattributes={ attributes }\n\t\t\t\t\tsetAttributes={ setAttributes }\n\t\t\t\t/>\n\t\t\t\t{ innerBlockProps.children }\n\t\t\t</div>\n\t\t</BlockContextProvider>\n\t);\n}\n\nexport default Edit;\n"],
  "mappings": "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",
  "names": ["blockEditorStore", "Controls"]
}
