{
  "version": 3,
  "sources": ["../../../src/components/writing-flow/use-preview-mode-nav.js"],
  "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useRefEffect } from '@wordpress/compose';\nimport { useSelect } from '@wordpress/data';\nimport { TAB, UP, DOWN, LEFT, RIGHT } from '@wordpress/keycodes';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\n\n/**\n * In preview mode, handles Tab and arrow key navigation to move only between\n * block elements, skipping all other focusable content.\n *\n * @return {Function} Ref callback.\n */\nexport function usePreviewModeNav() {\n\tconst isPreviewMode = useSelect(\n\t\t( select ) => select( blockEditorStore ).getSettings().isPreviewMode,\n\t\t[]\n\t);\n\n\treturn useRefEffect(\n\t\t( node ) => {\n\t\t\tif ( ! isPreviewMode ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfunction onKeyDown( event ) {\n\t\t\t\tconst { keyCode, shiftKey, target } = event;\n\n\t\t\t\tconst isTab = keyCode === TAB;\n\t\t\t\tconst isUp = keyCode === UP;\n\t\t\t\tconst isDown = keyCode === DOWN;\n\t\t\t\tconst isLeft = keyCode === LEFT;\n\t\t\t\tconst isRight = keyCode === RIGHT;\n\t\t\t\tconst isArrow = isUp || isDown || isLeft || isRight;\n\n\t\t\t\tif ( ! isTab && ! isArrow ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst isReverse = isTab ? shiftKey : isUp || isLeft;\n\n\t\t\t\tconst blocks = Array.from(\n\t\t\t\t\tnode.querySelectorAll( '[data-block]' )\n\t\t\t\t);\n\n\t\t\t\tif ( ! blocks.length ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst currentBlock = target.closest( '[data-block]' );\n\t\t\t\tconst currentIndex = currentBlock\n\t\t\t\t\t? blocks.indexOf( currentBlock )\n\t\t\t\t\t: -1;\n\n\t\t\t\t// If focus is not on a block, don't intercept navigation.\n\t\t\t\tif ( currentIndex === -1 ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// For Tab navigation, allow escaping the block list at boundaries.\n\t\t\t\t// For arrow keys, wrap around.\n\t\t\t\tif ( isTab ) {\n\t\t\t\t\tif ( isReverse && currentIndex === 0 ) {\n\t\t\t\t\t\t// At first block, Shift+Tab should exit the block list.\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif ( ! isReverse && currentIndex === blocks.length - 1 ) {\n\t\t\t\t\t\t// At last block, Tab should exit the block list.\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet nextIndex;\n\t\t\t\tif ( isReverse ) {\n\t\t\t\t\tnextIndex =\n\t\t\t\t\t\tcurrentIndex <= 0\n\t\t\t\t\t\t\t? blocks.length - 1\n\t\t\t\t\t\t\t: currentIndex - 1;\n\t\t\t\t} else {\n\t\t\t\t\tnextIndex =\n\t\t\t\t\t\tcurrentIndex === -1 || currentIndex >= blocks.length - 1\n\t\t\t\t\t\t\t? 0\n\t\t\t\t\t\t\t: currentIndex + 1;\n\t\t\t\t}\n\n\t\t\t\tevent.preventDefault();\n\t\t\t\tblocks[ nextIndex ].focus();\n\t\t\t}\n\n\t\t\tnode.addEventListener( 'keydown', onKeyDown );\n\t\t\treturn () => {\n\t\t\t\tnode.removeEventListener( 'keydown', onKeyDown );\n\t\t\t};\n\t\t},\n\t\t[ isPreviewMode ]\n\t);\n}\n"],
  "mappings": ";AAGA,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;AAC1B,SAAS,KAAK,IAAI,MAAM,MAAM,aAAa;AAK3C,SAAS,SAAS,wBAAwB;AAQnC,SAAS,oBAAoB;AACnC,QAAM,gBAAgB;AAAA,IACrB,CAAE,WAAY,OAAQ,gBAAiB,EAAE,YAAY,EAAE;AAAA,IACvD,CAAC;AAAA,EACF;AAEA,SAAO;AAAA,IACN,CAAE,SAAU;AACX,UAAK,CAAE,eAAgB;AACtB;AAAA,MACD;AAEA,eAAS,UAAW,OAAQ;AAC3B,cAAM,EAAE,SAAS,UAAU,OAAO,IAAI;AAEtC,cAAM,QAAQ,YAAY;AAC1B,cAAM,OAAO,YAAY;AACzB,cAAM,SAAS,YAAY;AAC3B,cAAM,SAAS,YAAY;AAC3B,cAAM,UAAU,YAAY;AAC5B,cAAM,UAAU,QAAQ,UAAU,UAAU;AAE5C,YAAK,CAAE,SAAS,CAAE,SAAU;AAC3B;AAAA,QACD;AAEA,cAAM,YAAY,QAAQ,WAAW,QAAQ;AAE7C,cAAM,SAAS,MAAM;AAAA,UACpB,KAAK,iBAAkB,cAAe;AAAA,QACvC;AAEA,YAAK,CAAE,OAAO,QAAS;AACtB;AAAA,QACD;AAEA,cAAM,eAAe,OAAO,QAAS,cAAe;AACpD,cAAM,eAAe,eAClB,OAAO,QAAS,YAAa,IAC7B;AAGH,YAAK,iBAAiB,IAAK;AAC1B;AAAA,QACD;AAIA,YAAK,OAAQ;AACZ,cAAK,aAAa,iBAAiB,GAAI;AAEtC;AAAA,UACD;AACA,cAAK,CAAE,aAAa,iBAAiB,OAAO,SAAS,GAAI;AAExD;AAAA,UACD;AAAA,QACD;AAEA,YAAI;AACJ,YAAK,WAAY;AAChB,sBACC,gBAAgB,IACb,OAAO,SAAS,IAChB,eAAe;AAAA,QACpB,OAAO;AACN,sBACC,iBAAiB,MAAM,gBAAgB,OAAO,SAAS,IACpD,IACA,eAAe;AAAA,QACpB;AAEA,cAAM,eAAe;AACrB,eAAQ,SAAU,EAAE,MAAM;AAAA,MAC3B;AAEA,WAAK,iBAAkB,WAAW,SAAU;AAC5C,aAAO,MAAM;AACZ,aAAK,oBAAqB,WAAW,SAAU;AAAA,MAChD;AAAA,IACD;AAAA,IACA,CAAE,aAAc;AAAA,EACjB;AACD;",
  "names": []
}
