EmbyCrackedClient/web/modules/focusmanager.js

1 line
11 KiB
JavaScript
Raw Permalink Normal View History

2025-06-25 11:46:04 +08:00
import layoutManager from"./layoutmanager.js";import events from"./emby-apiclient/events.js";let defaultScope=document.body,scopes=[],_currentScope=defaultScope;function pushScope(elem){scopes.includes(elem)||(scopes.push(elem),_currentScope=elem)}function removeItemOnce(arr,value){value=arr.indexOf(value);return-1<value&&arr.splice(value,1),arr}function popScope(elem){removeItemOnce(scopes,elem),_currentScope=findCurrentScope()}function findCurrentScope(){return scopes[scopes.length-1]||defaultScope}function getCurrentScope(){return _currentScope}function hasExclusiveFocusScope(){return scopes.length}function isAutoFocusEnabled(elem){if(layoutManager.tv)return!0;if(elem)switch(elem.tagName){case"INPUT":switch(elem.type){case"checkbox":case"radio":case"file":case"hidden":case"range":return!1;default:return!0}case"TEXTAREA":return!0}return!1}function getElementToAutoFocus(view,options){var element;return options&&!1===options.findAutoFocusElement||!(element=view.querySelector(".autofocus"))||!isCurrentlyFocusableInternal(element,!0)?getFocusableElements(view,1,".noautofocus",options)[0]||getFocusableElements(view,1,null,options)[0]:element}function autoFocus(view,options){view=getElementToAutoFocus(view,options);return view&&focus(view,options)}function focus(element,options){for(;element.classList.contains("focusable");){var autoFocusElement=getElementToAutoFocus(element,options);if(!autoFocusElement)break;element=autoFocusElement}return options?.skipIfNotEnabled&&!isAutoFocusEnabled(element)?null:(focusInternal(element,options),element)}let lastFocusInfo={};function focusInternal(element,options){try{lastFocusInfo={element:element,options:options},element.focus({preventScroll:!0})}catch(err){console.log("Error in focusManager.focusInternal: "+err)}}let focusableTagNames=["INPUT","TEXTAREA","SELECT","BUTTON","A","DIV[tabindex]"],focusableQuerySelectors=focusableTagNames.map(function(t){return"A"===t&&(t+="[href]"),t+':not([tabindex="-1"]):not(:disabled)'}),focusableQuery=(focusableQuerySelectors.push(".focusable"),focusableQuerySelectors.join(","));function buildFocusableQuery(excludeSelector){if(!excludeSelector)return focusableQuery;var newQuerySelectors=[focusableQuerySelectors.length];for(let i=0,length=focusableQuerySelectors.length;i<length;i++)newQuerySelectors[i]=focusableQuerySelectors[i]+":not("+excludeSelector+")";return newQuerySelectors.join(",")}let focusableTagNameQuery=focusableTagNames.join(","),focusableParentQuery=focusableTagNames.join(",")+",.focusable";function focusableParent(elem,includeGroups){return!1===includeGroups?elem.closest(focusableTagNameQuery):elem.closest(focusableParentQuery)}function isCurrentlyFocusableInternal(elem,checkOffsetParent){return!(checkOffsetParent&&null===elem.offsetParent||elem.disabled)}function isCurrentlyFocusable(elem){return!!elem.matches(focusableQuery)&&isCurrentlyFocusableInternal(elem,!0)}function getFocusableElements(parent,limit,excludeSelector,options){var fn=(parent=parent||_currentScope).getFocusableElements;let elems;var focusableElements=[];for(let i=0,length=(elems=(elems=fn?fn(parent,document.activeElement,null,options):elems)||parent.querySelectorAll(buildFocusableQuery(excludeSelector))).length;i<length;i++){var elem=elems[i];if(isCurrentlyFocusableInternal(elem,limit)&&(focusableElements.push(elem),limit)&&limit<=focusableElements.length)break}return focusableElements}let focusContainerQueries=[".focuscontainer,.focuscontainer-x",".focuscontainer,.focuscontainer-x",".focuscontainer,.focuscontainer-y,.focuscontainer-up",".focuscontainer,.focuscontainer-y,.focuscontainer-down"];function getFocusContainer(elem,direction){var defaultScopeResult,direction=focusContainerQueries[direction],direction=elem.closest(direction);return direction||((direction=_currentScope)===(defaultScopeResult=defaultScope)||direction.contains(elem)?direction:defaultScopeResult)}function getNearestElement(activeElement,activeElementRect,direction,focusableElements,enableSingleElementOptimization,focusableContainer){if(enableSingleElementOptimization)return{element:enableSingl