@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
1 lines • 2.53 kB
JavaScript
import*as ComponentHelpers from"../components/helpers/helpers.js";import{XElement}from"./XElement.js";let observer=null;const storedScrollPositions=new WeakMap;export class XWidget extends XElement{visible;shadowRootInternal;defaultFocusedElement;elementsToRestoreScrollPositionsFor;onShownCallback;onHiddenCallback;onResizedCallback;constructor(){super(),this.style.setProperty("display","flex"),this.style.setProperty("flex-direction","column"),this.style.setProperty("align-items","stretch"),this.style.setProperty("justify-content","flex-start"),this.style.setProperty("contain","layout style"),this.visible=!1,this.defaultFocusedElement=null,this.elementsToRestoreScrollPositionsFor=[],observer||(observer=new ResizeObserver((e=>{for(const s of e){const e=s.target;e.visible&&e.onResizedCallback&&e.onResizedCallback.call(null)}}))),observer.observe(this),this.setElementsToRestoreScrollPositionsFor([this])}isShowing(){return this.visible}setOnShown(e){this.onShownCallback=e}setOnHidden(e){this.onHiddenCallback=e}setOnResized(e){this.onResizedCallback=e}setElementsToRestoreScrollPositionsFor(e){for(const e of this.elementsToRestoreScrollPositionsFor)e.removeEventListener("scroll",XWidget.storeScrollPosition,{capture:!1});this.elementsToRestoreScrollPositionsFor=e;for(const e of this.elementsToRestoreScrollPositionsFor)e.addEventListener("scroll",XWidget.storeScrollPosition,{passive:!0,capture:!1})}restoreScrollPositions(){for(const e of this.elementsToRestoreScrollPositionsFor){const s=storedScrollPositions.get(e);s&&(e.scrollTop=s.scrollTop,e.scrollLeft=s.scrollLeft)}}static storeScrollPosition(e){const s=e.currentTarget;storedScrollPositions.set(s,{scrollLeft:s.scrollLeft,scrollTop:s.scrollTop})}setDefaultFocusedElement(e){if(e&&!this.isSelfOrAncestor(e))throw new Error("Default focus must be descendant");this.defaultFocusedElement=e}focus(){if(!this.visible)return;let e;if(this.defaultFocusedElement&&this.isSelfOrAncestor(this.defaultFocusedElement))e=this.defaultFocusedElement;else if(-1!==this.tabIndex)e=this;else{let s=this.traverseNextNode(this);for(;s;){if(s instanceof XWidget&&s.visible){e=s;break}s=s.traverseNextNode(this)}}e&&!e.hasFocus()&&(e===this?HTMLElement.prototype.focus.call(this):e.focus())}connectedCallback(){this.visible=!0,this.restoreScrollPositions(),this.onShownCallback&&this.onShownCallback.call(null)}disconnectedCallback(){this.visible=!1,this.onHiddenCallback&&this.onHiddenCallback.call(null)}}ComponentHelpers.CustomElements.defineComponent("x-widget",XWidget);