UNPKG

@wordpress/block-library

Version:
8 lines (7 loc) 7.61 kB
{ "version": 3, "sources": ["../../src/tabs/view.js"], "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tstore,\n\tgetContext,\n\tgetElement,\n\twithSyncEvent,\n} from '@wordpress/interactivity';\n\nconst { actions, state } = store(\n\t'core/tabs',\n\t{\n\t\tstate: {\n\t\t\t/**\n\t\t\t * Gets a contextually aware list of tabs for the current tabs block.\n\t\t\t *\n\t\t\t * @type {Array}\n\t\t\t */\n\t\t\tget tabsList() {\n\t\t\t\tconst context = getContext();\n\t\t\t\tconst tabsId = context?.tabsId;\n\t\t\t\tconst tabsList = state[ tabsId ];\n\t\t\t\treturn tabsList;\n\t\t\t},\n\t\t\t/**\n\t\t\t * Gets the index of the active tab element whether it\n\t\t\t * is a tab label or tab panel.\n\t\t\t *\n\t\t\t * @type {number|null}\n\t\t\t */\n\t\t\tget tabIndex() {\n\t\t\t\tconst { attributes } = getElement();\n\t\t\t\tconst tabId = attributes?.id?.replace( 'tab__', '' ) || null;\n\t\t\t\tif ( ! tabId ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst { tabsList } = state;\n\t\t\t\tconst tabIndex = tabsList.findIndex( ( t ) => t === tabId );\n\t\t\t\treturn tabIndex;\n\t\t\t},\n\t\t\t/**\n\t\t\t * Whether the tab panel or tab label is the active tab.\n\t\t\t *\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tget isActiveTab() {\n\t\t\t\tconst { activeTabIndex } = getContext();\n\t\t\t\tconst { tabIndex } = state;\n\t\t\t\treturn activeTabIndex === tabIndex;\n\t\t\t},\n\t\t\t/**\n\t\t\t * The value of the tabindex attribute for tab buttons.\n\t\t\t * Only the active tab should be in the tab sequence.\n\t\t\t *\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tget tabIndexAttribute() {\n\t\t\t\treturn state.isActiveTab ? 0 : -1;\n\t\t\t},\n\t\t},\n\t\tactions: {\n\t\t\t/**\n\t\t\t * Handles the keydown events for the tab label and tabs controller.\n\t\t\t *\n\t\t\t * @param {KeyboardEvent} event The keydown event.\n\t\t\t */\n\t\t\thandleTabKeyDown: withSyncEvent( ( event ) => {\n\t\t\t\tconst { tabIndex } = state;\n\n\t\t\t\tif ( tabIndex === null ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( event.key === 'ArrowRight' ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tactions.moveFocus( tabIndex + 1 );\n\t\t\t\t} else if ( event.key === 'ArrowLeft' ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tactions.moveFocus( tabIndex - 1 );\n\t\t\t\t}\n\t\t\t} ),\n\t\t\t/**\n\t\t\t * Handles the click event for the tab label.\n\t\t\t *\n\t\t\t * @param {MouseEvent} event The click event.\n\t\t\t */\n\t\t\thandleTabClick: withSyncEvent( ( event ) => {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tconst { tabIndex } = state;\n\t\t\t\tif ( tabIndex !== null ) {\n\t\t\t\t\tactions.setActiveTab( tabIndex );\n\t\t\t\t}\n\t\t\t} ),\n\t\t\t/**\n\t\t\t * Moves focus to a specific tab without activating it.\n\t\t\t *\n\t\t\t * @param {number} tabIndex The index to move focus to.\n\t\t\t */\n\t\t\tmoveFocus: ( tabIndex ) => {\n\t\t\t\tconst { tabsList } = state;\n\n\t\t\t\tif ( ! tabsList || tabsList.length === 0 ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet newIndex = tabIndex;\n\t\t\t\tif ( newIndex < 0 ) {\n\t\t\t\t\tnewIndex = tabsList.length - 1;\n\t\t\t\t} else if ( newIndex >= tabsList.length ) {\n\t\t\t\t\tnewIndex = 0;\n\t\t\t\t}\n\n\t\t\t\tconst tabId = tabsList[ newIndex ];\n\t\t\t\tconst tabElement = document.getElementById( 'tab__' + tabId );\n\t\t\t\tif ( tabElement ) {\n\t\t\t\t\ttabElement.focus();\n\t\t\t\t}\n\t\t\t},\n\t\t\t/**\n\t\t\t * Sets the active tab index.\n\t\t\t *\n\t\t\t * @param {number} tabIndex The index of the active tab.\n\t\t\t * @param {boolean} scrollToTab Whether to scroll to the tab element.\n\t\t\t */\n\t\t\tsetActiveTab: ( tabIndex, scrollToTab = false ) => {\n\t\t\t\tconst { tabsList } = state;\n\n\t\t\t\tif ( ! tabsList || tabsList.length === 0 ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet newIndex = tabIndex;\n\t\t\t\tif ( newIndex < 0 ) {\n\t\t\t\t\tnewIndex = 0;\n\t\t\t\t} else if ( newIndex >= tabsList.length ) {\n\t\t\t\t\tnewIndex = tabsList.length - 1;\n\t\t\t\t}\n\n\t\t\t\tconst context = getContext();\n\t\t\t\tcontext.activeTabIndex = newIndex;\n\n\t\t\t\tif ( scrollToTab ) {\n\t\t\t\t\tconst tabId = tabsList[ newIndex ];\n\t\t\t\t\tconst tabElement = document.getElementById( tabId );\n\t\t\t\t\tif ( tabElement ) {\n\t\t\t\t\t\tsetTimeout( () => {\n\t\t\t\t\t\t\ttabElement.scrollIntoView( { behavior: 'smooth' } );\n\t\t\t\t\t\t}, 100 );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tcallbacks: {\n\t\t\t/**\n\t\t\t * When the tabs are initialized, we need to check if there is a hash in the url and if so if it exists in the current tabsList, set the active tab to that index.\n\t\t\t *\n\t\t\t */\n\t\t\tonTabsInit: () => {\n\t\t\t\tconst { tabsList } = state;\n\t\t\t\tif ( tabsList.length === 0 ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst { hash } = window.location;\n\t\t\t\tconst tabId = hash.replace( '#', '' );\n\t\t\t\tconst tabIndex = tabsList.findIndex( ( t ) => t === tabId );\n\t\t\t\t// Check if tabIndex is a positive number and if so we'll auto activate that tab.\n\t\t\t\tif ( tabIndex >= 0 ) {\n\t\t\t\t\tactions.setActiveTab( tabIndex, true );\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\tlock: true,\n\t}\n);\n"], "mappings": "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", "names": [] }