{"version":3,"file":"VRButton.cjs","sources":["../../src/webxr/VRButton.ts"],"sourcesContent":["import { WebGLRenderer } from 'three'\n\nclass VRButton {\n  static createButton(renderer: WebGLRenderer, sessionInit: XRSessionInit = {}): HTMLButtonElement | HTMLAnchorElement {\n    const button = document.createElement('button')\n\n    function showEnterVR(/*device*/): void {\n      let currentSession: XRSession | null = null\n\n      async function onSessionStarted(session: XRSession): Promise<void> {\n        session.addEventListener('end', onSessionEnded)\n\n        await renderer.xr.setSession(session as any)\n        button.textContent = 'EXIT VR'\n\n        currentSession = session\n      }\n\n      function onSessionEnded(/*event*/): void {\n        currentSession!.removeEventListener('end', onSessionEnded)\n\n        button.textContent = 'ENTER VR'\n\n        currentSession = null\n      }\n\n      //\n\n      button.style.display = ''\n\n      button.style.cursor = 'pointer'\n      button.style.left = 'calc(50% - 50px)'\n      button.style.width = '100px'\n\n      button.textContent = 'ENTER VR'\n\n      button.onmouseenter = (): void => {\n        button.style.opacity = '1.0'\n      }\n\n      button.onmouseleave = (): void => {\n        button.style.opacity = '0.5'\n      }\n\n      button.onclick = (): void => {\n        if (currentSession === null) {\n          // WebXR's requestReferenceSpace only works if the corresponding feature\n          // was requested at session creation time. For simplicity, just ask for\n          // the interesting ones as optional features, but be aware that the\n          // requestReferenceSpace call will fail if it turns out to be unavailable.\n          // ('local' is always available for immersive sessions and doesn't need to\n          // be requested separately.)\n\n          const optionalFeatures = [sessionInit.optionalFeatures, 'local-floor', 'bounded-floor', 'hand-tracking']\n            .flat()\n            .filter(Boolean) as string[]\n\n          ;(navigator as Navigator).xr\n            ?.requestSession('immersive-vr', { ...sessionInit, optionalFeatures })\n            .then(onSessionStarted)\n        } else {\n          currentSession.end()\n        }\n      }\n    }\n\n    function disableButton(): void {\n      button.style.display = ''\n\n      button.style.cursor = 'auto'\n      button.style.left = 'calc(50% - 75px)'\n      button.style.width = '150px'\n\n      button.onmouseenter = null\n      button.onmouseleave = null\n\n      button.onclick = null\n    }\n\n    function showWebXRNotFound(): void {\n      disableButton()\n\n      button.textContent = 'VR NOT SUPPORTED'\n    }\n\n    function stylizeElement(element: HTMLElement): void {\n      element.style.position = 'absolute'\n      element.style.bottom = '20px'\n      element.style.padding = '12px 6px'\n      element.style.border = '1px solid #fff'\n      element.style.borderRadius = '4px'\n      element.style.background = 'rgba(0,0,0,0.1)'\n      element.style.color = '#fff'\n      element.style.font = 'normal 13px sans-serif'\n      element.style.textAlign = 'center'\n      element.style.opacity = '0.5'\n      element.style.outline = 'none'\n      element.style.zIndex = '999'\n    }\n\n    if ('xr' in navigator) {\n      stylizeElement(button)\n      button.id = 'VRButton'\n      button.style.display = 'none'\n\n      // Query for session mode\n      navigator.xr!.isSessionSupported('immersive-vr').then((supported) => {\n        supported ? showEnterVR() : showWebXRNotFound()\n\n        if (supported && VRButton.xrSessionIsGranted) {\n          button.click()\n        }\n      })\n\n      return button\n    } else {\n      const message = document.createElement('a')\n\n      if (window.isSecureContext === false) {\n        message.href = document.location.href.replace(/^http:/, 'https:')\n        message.innerHTML = 'WEBXR NEEDS HTTPS' // TODO Improve message\n      } else {\n        message.href = 'https://immersiveweb.dev/'\n        message.innerHTML = 'WEBXR NOT AVAILABLE'\n      }\n\n      message.style.left = 'calc(50% - 90px)'\n      message.style.width = '180px'\n      message.style.textDecoration = 'none'\n\n      stylizeElement(message)\n\n      return message\n    }\n  }\n\n  static xrSessionIsGranted = false\n\n  static registerSessionGrantedListener(): void {\n    if (typeof navigator !== 'undefined' && 'xr' in navigator) {\n      ;(navigator as Navigator).xr!.addEventListener('sessiongranted', () => {\n        VRButton.xrSessionIsGranted = true\n      })\n    }\n  }\n}\n\nVRButton.registerSessionGrantedListener()\n\nexport { VRButton }\n"],"names":[],"mappings":";;;;;;;;AAEA,MAAM,YAAN,MAAe;AAAA,EACb,OAAO,aAAa,UAAyB,cAA6B,IAA2C;AAC7G,UAAA,SAAS,SAAS,cAAc,QAAQ;AAE9C,aAAS,cAA8B;AACrC,UAAI,iBAAmC;AAEvC,qBAAe,iBAAiB,SAAmC;AACzD,gBAAA,iBAAiB,OAAO,cAAc;AAExC,cAAA,SAAS,GAAG,WAAW,OAAc;AAC3C,eAAO,cAAc;AAEJ,yBAAA;AAAA,MACnB;AAEA,eAAS,iBAAgC;AACvB,uBAAA,oBAAoB,OAAO,cAAc;AAEzD,eAAO,cAAc;AAEJ,yBAAA;AAAA,MACnB;AAIA,aAAO,MAAM,UAAU;AAEvB,aAAO,MAAM,SAAS;AACtB,aAAO,MAAM,OAAO;AACpB,aAAO,MAAM,QAAQ;AAErB,aAAO,cAAc;AAErB,aAAO,eAAe,MAAY;AAChC,eAAO,MAAM,UAAU;AAAA,MAAA;AAGzB,aAAO,eAAe,MAAY;AAChC,eAAO,MAAM,UAAU;AAAA,MAAA;AAGzB,aAAO,UAAU,MAAY;;AAC3B,YAAI,mBAAmB,MAAM;AAQrB,gBAAA,mBAAmB,CAAC,YAAY,kBAAkB,eAAe,iBAAiB,eAAe,EACpG,KAAA,EACA,OAAO,OAAO;AAEf,0BAAwB,OAAxB,mBACE,eAAe,gBAAgB,EAAE,GAAG,aAAa,oBAClD,KAAK;AAAA,QAAgB,OACnB;AACL,yBAAe,IAAI;AAAA,QACrB;AAAA,MAAA;AAAA,IAEJ;AAEA,aAAS,gBAAsB;AAC7B,aAAO,MAAM,UAAU;AAEvB,aAAO,MAAM,SAAS;AACtB,aAAO,MAAM,OAAO;AACpB,aAAO,MAAM,QAAQ;AAErB,aAAO,eAAe;AACtB,aAAO,eAAe;AAEtB,aAAO,UAAU;AAAA,IACnB;AAEA,aAAS,oBAA0B;AACnB;AAEd,aAAO,cAAc;AAAA,IACvB;AAEA,aAAS,eAAe,SAA4B;AAClD,cAAQ,MAAM,WAAW;AACzB,cAAQ,MAAM,SAAS;AACvB,cAAQ,MAAM,UAAU;AACxB,cAAQ,MAAM,SAAS;AACvB,cAAQ,MAAM,eAAe;AAC7B,cAAQ,MAAM,aAAa;AAC3B,cAAQ,MAAM,QAAQ;AACtB,cAAQ,MAAM,OAAO;AACrB,cAAQ,MAAM,YAAY;AAC1B,cAAQ,MAAM,UAAU;AACxB,cAAQ,MAAM,UAAU;AACxB,cAAQ,MAAM,SAAS;AAAA,IACzB;AAEA,QAAI,QAAQ,WAAW;AACrB,qBAAe,MAAM;AACrB,aAAO,KAAK;AACZ,aAAO,MAAM,UAAU;AAGvB,gBAAU,GAAI,mBAAmB,cAAc,EAAE,KAAK,CAAC,cAAc;AACvD,oBAAA,gBAAgB;AAExB,YAAA,aAAa,UAAS,oBAAoB;AAC5C,iBAAO,MAAM;AAAA,QACf;AAAA,MAAA,CACD;AAEM,aAAA;AAAA,IAAA,OACF;AACC,YAAA,UAAU,SAAS,cAAc,GAAG;AAEtC,UAAA,OAAO,oBAAoB,OAAO;AACpC,gBAAQ,OAAO,SAAS,SAAS,KAAK,QAAQ,UAAU,QAAQ;AAChE,gBAAQ,YAAY;AAAA,MAAA,OACf;AACL,gBAAQ,OAAO;AACf,gBAAQ,YAAY;AAAA,MACtB;AAEA,cAAQ,MAAM,OAAO;AACrB,cAAQ,MAAM,QAAQ;AACtB,cAAQ,MAAM,iBAAiB;AAE/B,qBAAe,OAAO;AAEf,aAAA;AAAA,IACT;AAAA,EACF;AAAA,EAIA,OAAO,iCAAuC;AAC5C,QAAI,OAAO,cAAc,eAAe,QAAQ,WAAW;AACvD,gBAAwB,GAAI,iBAAiB,kBAAkB,MAAM;AACrE,kBAAS,qBAAqB;AAAA,MAAA,CAC/B;AAAA,IACH;AAAA,EACF;AACF;AA/IA,IAAM,WAAN;AAsIE,cAtII,UAsIG,sBAAqB;AAW9B,SAAS,+BAA+B;;"}