{"version":3,"file":"fullscreen.obs.js","sources":["../../../Framework/Controls/fullscreen.obs"],"sourcesContent":["<!-- Copyright by the Spark Development Network; Licensed under the Rock Community License -->\r\n<template>\r\n <div ref=\"containerElement\" :style=\"containerStyle\">\r\n <slot />\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\n // Define the browser-specific versions of these functions that older browsers\r\n // implemented before using the standard API.\r\n declare global {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n interface Document {\r\n mozCancelFullScreen?: () => Promise<void>;\r\n webkitExitFullscreen?: () => Promise<void>;\r\n mozFullScreenElement?: Element;\r\n webkitFullscreenElement?: Element;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n interface HTMLElement {\r\n mozRequestFullscreen?: () => Promise<void>;\r\n webkitRequestFullscreen?: () => Promise<void>;\r\n }\r\n }\r\n\r\n</script>\r\n\r\n<script setup lang=\"ts\">\r\n import { onBeforeUnmount } from \"vue\";\r\n import { onMounted, PropType, ref, watch } from \"vue\";\r\n\r\n /**\r\n * Request that the window enter true fullscreen mode for the given element.\r\n *\r\n * @param element The element that will be the root of the fullscreen view.\r\n *\r\n * @returns A promise that indicates when the operation has completed.\r\n */\r\n async function requestWindowFullscreen(element: HTMLElement): Promise<boolean> {\r\n try {\r\n if (element.requestFullscreen) {\r\n await element.requestFullscreen();\r\n }\r\n else if (element.mozRequestFullscreen) {\r\n await element.mozRequestFullscreen();\r\n }\r\n else if (element.webkitRequestFullscreen) {\r\n await element.webkitRequestFullscreen();\r\n }\r\n else {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n catch (ex) {\r\n return new Promise<boolean>((resolve, reject) => reject(ex));\r\n }\r\n }\r\n\r\n /**\r\n * Request that the window exit true fullscreen mode.\r\n *\r\n * @returns A promise that indicates when the operation has completed.\r\n */\r\n async function exitWindowFullscreen(): Promise<void> {\r\n if (document.exitFullscreen) {\r\n await document.exitFullscreen();\r\n }\r\n else if (document.mozCancelFullScreen) {\r\n await document.mozCancelFullScreen();\r\n }\r\n else if (document.webkitExitFullscreen) {\r\n document.webkitExitFullscreen();\r\n }\r\n }\r\n\r\n /** Indicates the full screen mode options available to our component. */\r\n const enum FullscreenMode {\r\n /* Not currently in fullscreen mode. */\r\n None = 0,\r\n\r\n /** Using in-page fullscreen mode. */\r\n Page = 1,\r\n\r\n /** Using full-window fullscreen mode. */\r\n Window = 2\r\n }\r\n\r\n const props = defineProps({\r\n modelValue: {\r\n type: Boolean as PropType<boolean>,\r\n default: false\r\n },\r\n\r\n isPageOnly: {\r\n type: Boolean as PropType<boolean>,\r\n default: true\r\n }\r\n });\r\n\r\n const emit = defineEmits<{\r\n (e: \"update:modelValue\", value: boolean): void;\r\n }>();\r\n\r\n /** The current fullscreen mode this component is in. */\r\n const fullscreenMode = ref(FullscreenMode.None);\r\n\r\n /** The container element used when transitioning into fullscreen mode. */\r\n const containerElement = ref<HTMLElement | null>(null);\r\n\r\n /** True if the teleport should be disabled, i.e. leave the content where it is. */\r\n const teleportDisabled = ref(true);\r\n\r\n /** The style classes to be applied to the container. */\r\n const containerStyle = ref<Record<string, string>>({});\r\n\r\n /**\r\n * Attempts to enter fullscreen mode using the currently configured\r\n * settings.\r\n */\r\n async function enterFullscreen(): Promise<void> {\r\n const body = document.getElementsByTagName(\"body\")[0];\r\n\r\n body.classList.add(\"is-fullscreen\");\r\n\r\n // TODO: This can be removed once the \"is-fullscreen\" class is implemented.\r\n if (body.style.overflowY === \"\") {\r\n body.style.overflowY = \"hidden\";\r\n }\r\n\r\n if (props.isPageOnly) {\r\n\r\n // Set the styles so our container floats above all other content\r\n // and handles its own scrolling.\r\n containerStyle.value = {\r\n position: \"fixed\",\r\n left: \"0\",\r\n top: \"0\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n \"overflow-y\": \"auto\",\r\n \"z-index\": \"1060\",\r\n \"background-color\": \"var(--body-background)\"\r\n };\r\n\r\n teleportDisabled.value = false;\r\n fullscreenMode.value = FullscreenMode.Page;\r\n }\r\n else {\r\n if (containerElement.value) {\r\n try {\r\n containerStyle.value = {\r\n \"background-color\": \"var(--body-background)\"\r\n };\r\n\r\n await requestWindowFullscreen(containerElement.value);\r\n\r\n fullscreenMode.value = FullscreenMode.Window;\r\n }\r\n catch (ex) {\r\n console.warn(ex);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Attempts to exit from the current fullscreen mode.\r\n */\r\n async function exitFullscreen(): Promise<void> {\r\n const body = document.getElementsByTagName(\"body\")[0];\r\n\r\n // TODO: This can be removed once the \"is-fullscreen\" class is implemented.\r\n if (body.style.overflowY === \"hidden\") {\r\n body.style.overflowY = \"\";\r\n }\r\n\r\n body.classList.remove(\"is-fullscreen\");\r\n\r\n if (fullscreenMode.value === FullscreenMode.Page) {\r\n containerStyle.value = {};\r\n\r\n teleportDisabled.value = true;\r\n fullscreenMode.value = FullscreenMode.None;\r\n }\r\n else if (fullscreenMode.value === FullscreenMode.Window) {\r\n try {\r\n const fullscreenElement = document.fullscreenElement ?? document.mozFullScreenElement ?? document.webkitFullscreenElement;\r\n\r\n // Only exit full screen if we are currently in it. The user\r\n // might have hit escape to exit fullscreen already.\r\n if (fullscreenElement) {\r\n await exitWindowFullscreen();\r\n }\r\n\r\n containerStyle.value = {};\r\n\r\n fullscreenMode.value = FullscreenMode.None;\r\n }\r\n catch (ex) {\r\n console.warn(ex);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Event handler when the window fullscreen mode changes.\r\n */\r\n function onFullscreenChange(ev: Event): void {\r\n const fullscreenElement = document.fullscreenElement ?? document.mozFullScreenElement ?? document.webkitFullscreenElement;\r\n\r\n if (ev.target === containerElement.value && fullscreenMode.value !== FullscreenMode.None && !fullscreenElement) {\r\n exitFullscreen();\r\n }\r\n }\r\n\r\n // Perform final initialization once we are mounted.\r\n onMounted(() => {\r\n document.addEventListener(\"fullscreenchange\", onFullscreenChange);\r\n document.addEventListener(\"mozfullscreenchange\", onFullscreenChange);\r\n document.addEventListener(\"webkitfullscreenchange\", onFullscreenChange);\r\n\r\n // Set initial full-screen state if requested.\r\n if (props.modelValue) {\r\n enterFullscreen();\r\n }\r\n });\r\n\r\n // Before we unmount, we need to attempt to exit fullscreen mode.\r\n onBeforeUnmount(() => {\r\n if (fullscreenMode.value !== FullscreenMode.None) {\r\n try {\r\n exitFullscreen();\r\n }\r\n catch (ex) {\r\n console.warn(ex);\r\n }\r\n }\r\n\r\n document.removeEventListener(\"webkitfullscreenchange\", onFullscreenChange);\r\n document.removeEventListener(\"mozfullscreenchange\", onFullscreenChange);\r\n document.removeEventListener(\"fullscreenchange\", onFullscreenChange);\r\n });\r\n\r\n // Any time the parent component signals us to change fullscreen mode\r\n // we need to attempt to match the state.\r\n watch(() => props.modelValue, () => {\r\n // Check if we are already in the correct state.\r\n if (!props.modelValue && fullscreenMode.value === FullscreenMode.None) {\r\n return;\r\n }\r\n else if (props.modelValue && fullscreenMode.value !== FullscreenMode.None) {\r\n return;\r\n }\r\n\r\n if (props.modelValue) {\r\n enterFullscreen();\r\n }\r\n else {\r\n exitFullscreen();\r\n }\r\n });\r\n\r\n // Any time our fullscreen mode changes, make sure the parent knows.\r\n watch(fullscreenMode, () => {\r\n emit(\"update:modelValue\", fullscreenMode.value !== FullscreenMode.None);\r\n });\r\n</script>\r\n"],"names":["FullscreenMode","requestWindowFullscreen","_x","_requestWindowFullscreen","apply","arguments","_asyncToGenerator","element","requestFullscreen","mozRequestFullscreen","webkitRequestFullscreen","ex","Promise","resolve","reject","exitWindowFullscreen","_exitWindowFullscreen","document","exitFullscreen","mozCancelFullScreen","webkitExitFullscreen","fullscreenMode","ref","None","containerElement","teleportDisabled","containerStyle","enterFullscreen","_enterFullscreen","body","getElementsByTagName","classList","add","style","overflowY","props","isPageOnly","value","position","left","top","width","height","Page","Window","console","warn","_exitFullscreen","remove","_ref3","_document$fullscreenE2","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","onFullscreenChange","ev","_ref2","_document$fullscreenE","target","onMounted","addEventListener","modelValue","onBeforeUnmount","removeEventListener","watch","emit"],"mappings":"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"}