Schnittstelle für einen digitalen Schulrundgang hinzugefügt

This commit is contained in:
Denys Konovalov 2020-11-17 19:57:27 +01:00
parent af97e6dc9f
commit 719211d7c4
666 changed files with 3342 additions and 5 deletions

@ -123,6 +123,12 @@ hasChildren = true
URL = "https://moodle.bildung-lsa.de/gcg"
weight = 2
[[menu.main]]
parent = "Digitale Angebote"
name = "Digitale führung durch das Schulhaus"
URL = "vr"
weight = 3
[[menu.main]]
name = "Für Schüler und Eltern"
weight = 3
@ -168,7 +174,6 @@ name = "Kontakt"
URL = "contact"
weight = 5
# footer menu
[[menu.footer]]

@ -127,11 +127,15 @@ about:
* Da die Wesite noch im Aufbau ist fehlen noch viele Inhalte und mehrere Bereiche. \n
* Der Quellcode der Website ist [hier](https://github.com/eesev9ie/gcg-website) abrufbar. \n
* Dieser Bereich wird in der Zukunft einen Kurztext über die Schule enthalten.\n
* Weitere Informationen gibt es im [passenden Blogbeitrag](/de/blog/new-site/)"
* Weitere Informationen gibt es im [passenden Blogbeitrag](/de/blog/new-site/)
## Tag der offenen Tür
Da in diesem Schuljahr kein gewöhnlicher Tag der offenen Tür stattfinden kann, bieten wir hiermit eine digitale Führung durch das Schulhaus an."
button:
enable : true
label : "Über die Schule"
link : "about"
label : "Digitale Führung durch das Schulhaus"
link : "vr"
############################# Course ################################

@ -114,7 +114,7 @@ h6, .h6 {
background: #ffab08;
color: #ffbc3b; }
.btn-primary:not(:disabled):not(.disabled).active,
.btn-primary.active:not(:disabled):not(.disabled),
.btn-primary:not(:disabled):not(.disabled):active,
.show > .btn-primary.dropdown-toggle {
color: #fff;

213
static/vr/data.js Normal file

@ -0,0 +1,213 @@
var APP_DATA = {
"scenes": [
{
"id": "0-san-francisco",
"name": "San Francisco",
"levels": [
{
"tileSize": 256,
"size": 256,
"fallbackOnly": true
},
{
"tileSize": 512,
"size": 512
},
{
"tileSize": 512,
"size": 1024
},
{
"tileSize": 512,
"size": 2048
}
],
"faceSize": 1571.5,
"initialViewParameters": {
"yaw": 1.628731098497962,
"pitch": 0.112272279609261,
"fov": 1.3900591270580378
},
"linkHotspots": [
{
"yaw": 1.6728928501031755,
"pitch": -0.08252116146336874,
"rotation": 6.283185307179586,
"target": "2-schlafzimmer"
}
],
"infoHotspots": [
{
"yaw": 2.1959942749563464,
"pitch": 0.3502609665210201,
"title": "Lorem ipsum<br>",
"text": "<div><b>Lorem ipsum<b> dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.<img src='/media/gcg.JPG'></div>"
}
]
},
{
"id": "1-golden-gate-bridge",
"name": "Golden Gate Bridge",
"levels": [
{
"tileSize": 256,
"size": 256,
"fallbackOnly": true
},
{
"tileSize": 512,
"size": 512
},
{
"tileSize": 512,
"size": 1024
},
{
"tileSize": 512,
"size": 2048
}
],
"faceSize": 1568.5,
"initialViewParameters": {
"pitch": 0,
"yaw": 0,
"fov": 1.5707963267948966
},
"linkHotspots": [
{
"yaw": -1.3626509967165372,
"pitch": 0.1809987436227729,
"rotation": 0,
"target": "3-miami"
},
{
"yaw": 3.12673487759844,
"pitch": 0.3545497178692312,
"rotation": 0,
"target": "2-schlafzimmer"
}
],
"infoHotspots": []
},
{
"id": "2-schlafzimmer",
"name": "Schlafzimmer",
"levels": [
{
"tileSize": 256,
"size": 256,
"fallbackOnly": true
},
{
"tileSize": 512,
"size": 512
},
{
"tileSize": 512,
"size": 1024
},
{
"tileSize": 512,
"size": 2048
}
],
"faceSize": 1718.5,
"initialViewParameters": {
"pitch": 0,
"yaw": 0,
"fov": 1.5707963267948966
},
"linkHotspots": [
{
"yaw": 0.36315495679741616,
"pitch": 0.157679890305376,
"rotation": 0,
"target": "1-golden-gate-bridge"
}
],
"infoHotspots": []
},
{
"id": "3-miami",
"name": "Miami",
"levels": [
{
"tileSize": 256,
"size": 256,
"fallbackOnly": true
},
{
"tileSize": 512,
"size": 512
},
{
"tileSize": 512,
"size": 1024
},
{
"tileSize": 512,
"size": 2048
}
],
"faceSize": 2048,
"initialViewParameters": {
"pitch": 0,
"yaw": 0,
"fov": 1.5707963267948966
},
"linkHotspots": [
{
"yaw": 1.9039237094892787,
"pitch": 0.2814622722785156,
"rotation": 0,
"target": "4-panorama"
},
{
"yaw": 3.0436352502239483,
"pitch": 0.22521519934523582,
"rotation": 0,
"target": "0-san-francisco"
}
],
"infoHotspots": []
},
{
"id": "4-panorama",
"name": "Panorama",
"levels": [
{
"tileSize": 256,
"size": 256,
"fallbackOnly": true
},
{
"tileSize": 512,
"size": 512
},
{
"tileSize": 512,
"size": 1024
},
{
"tileSize": 512,
"size": 2048
}
],
"faceSize": 1824,
"initialViewParameters": {
"pitch": 0,
"yaw": 0,
"fov": 1.5707963267948966
},
"linkHotspots": [],
"infoHotspots": []
}
],
"name": "Georg-Cantor-Gymnasium: Virtueller Tag der offenen Tür",
"settings": {
"mouseViewMode": "drag",
"autorotateEnabled": true,
"fullscreenButton": true,
"viewControlButtons": true
}
};

BIN
static/vr/img/close.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
static/vr/img/collapse.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
static/vr/img/down.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
static/vr/img/expand.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
static/vr/img/info.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
static/vr/img/left.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
static/vr/img/link.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
static/vr/img/minus.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
static/vr/img/pause.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
static/vr/img/play.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
static/vr/img/plus.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
static/vr/img/right.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
static/vr/img/up.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
static/vr/img/windowed.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

92
static/vr/index.html Normal file

@ -0,0 +1,92 @@
<!DOCTYPE html>
<html>
<head>
<title>Georg-Cantor-Gymnasium: Virtueller Tag der offenen Tür</title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="target-densitydpi=device-dpi, width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, minimal-ui" />
<style> @-ms-viewport { width: device-width; } </style>
<link rel="stylesheet" href="vendor/reset.min.css">
<link rel="stylesheet" href="style.css">
</head>
<body class="multiple-scenes view-control-buttons">
<div id="pano"></div>
<div id="sceneList">
<ul class="scenes">
<a href="javascript:void(0)" class="scene" data-id="0-san-francisco">
<li class="text">San Francisco</li>
</a>
<a href="javascript:void(0)" class="scene" data-id="1-golden-gate-bridge">
<li class="text">Golden Gate Bridge</li>
</a>
<a href="javascript:void(0)" class="scene" data-id="2-schlafzimmer">
<li class="text">Schlafzimmer</li>
</a>
<a href="javascript:void(0)" class="scene" data-id="3-miami">
<li class="text">Miami</li>
</a>
<a href="javascript:void(0)" class="scene" data-id="4-panorama">
<li class="text">Panorama</li>
</a>
</ul>
</div>
<div id="titleBar">
<h1 class="sceneName"></h1>
</div>
<a href="javascript:void(0)" id="autorotateToggle">
<img class="icon off" src="img/play.png">
<img class="icon on" src="img/pause.png">
</a>
<a href="javascript:void(0)" id="fullscreenToggle">
<img class="icon off" src="img/fullscreen.png">
<img class="icon on" src="img/windowed.png">
</a>
<a href="javascript:void(0)" id="sceneListToggle">
<img class="icon off" src="img/expand.png">
<img class="icon on" src="img/collapse.png">
</a>
<a href="javascript:void(0)" id="viewUp" class="viewControlButton viewControlButton-1">
<img class="icon" src="img/up.png">
</a>
<a href="javascript:void(0)" id="viewDown" class="viewControlButton viewControlButton-2">
<img class="icon" src="img/down.png">
</a>
<a href="javascript:void(0)" id="viewLeft" class="viewControlButton viewControlButton-3">
<img class="icon" src="img/left.png">
</a>
<a href="javascript:void(0)" id="viewRight" class="viewControlButton viewControlButton-4">
<img class="icon" src="img/right.png">
</a>
<a href="javascript:void(0)" id="viewIn" class="viewControlButton viewControlButton-5">
<img class="icon" src="img/plus.png">
</a>
<a href="javascript:void(0)" id="viewOut" class="viewControlButton viewControlButton-6">
<img class="icon" src="img/minus.png">
</a>
<script src="vendor/es5-shim.js"></script>
<script src="vendor/eventShim.js"></script>
<script src="vendor/classList.js"></script>
<script src="vendor/requestAnimationFrame.js" ></script>
<script src="vendor/screenfull.min.js" ></script>
<script src="vendor/bowser.min.js" ></script>
<script src="vendor/marzipano.js" ></script>
<script src="data.js"></script>
<script src="index.js"></script>
</body>
</html>

392
static/vr/index.js Normal file

@ -0,0 +1,392 @@
/*
* Copyright 2016 Google Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
'use strict';
(function() {
var Marzipano = window.Marzipano;
var bowser = window.bowser;
var screenfull = window.screenfull;
var data = window.APP_DATA;
// Grab elements from DOM.
var panoElement = document.querySelector('#pano');
var sceneNameElement = document.querySelector('#titleBar .sceneName');
var sceneListElement = document.querySelector('#sceneList');
var sceneElements = document.querySelectorAll('#sceneList .scene');
var sceneListToggleElement = document.querySelector('#sceneListToggle');
var autorotateToggleElement = document.querySelector('#autorotateToggle');
var fullscreenToggleElement = document.querySelector('#fullscreenToggle');
// Detect desktop or mobile mode.
if (window.matchMedia) {
var setMode = function() {
if (mql.matches) {
document.body.classList.remove('desktop');
document.body.classList.add('mobile');
} else {
document.body.classList.remove('mobile');
document.body.classList.add('desktop');
}
};
var mql = matchMedia("(max-width: 500px), (max-height: 500px)");
setMode();
mql.addListener(setMode);
} else {
document.body.classList.add('desktop');
}
// Detect whether we are on a touch device.
document.body.classList.add('no-touch');
window.addEventListener('touchstart', function() {
document.body.classList.remove('no-touch');
document.body.classList.add('touch');
});
// Use tooltip fallback mode on IE < 11.
if (bowser.msie && parseFloat(bowser.version) < 11) {
document.body.classList.add('tooltip-fallback');
}
// Viewer options.
var viewerOpts = {
controls: {
mouseViewMode: data.settings.mouseViewMode
}
};
// Initialize viewer.
var viewer = new Marzipano.Viewer(panoElement, viewerOpts);
// Create scenes.
var scenes = data.scenes.map(function(data) {
var urlPrefix = "tiles";
var source = Marzipano.ImageUrlSource.fromString(
urlPrefix + "/" + data.id + "/{z}/{f}/{y}/{x}.jpg",
{ cubeMapPreviewUrl: urlPrefix + "/" + data.id + "/preview.jpg" });
var geometry = new Marzipano.CubeGeometry(data.levels);
var limiter = Marzipano.RectilinearView.limit.traditional(data.faceSize, 100*Math.PI/180, 120*Math.PI/180);
var view = new Marzipano.RectilinearView(data.initialViewParameters, limiter);
var scene = viewer.createScene({
source: source,
geometry: geometry,
view: view,
pinFirstLevel: true
});
// Create link hotspots.
data.linkHotspots.forEach(function(hotspot) {
var element = createLinkHotspotElement(hotspot);
scene.hotspotContainer().createHotspot(element, { yaw: hotspot.yaw, pitch: hotspot.pitch });
});
// Create info hotspots.
data.infoHotspots.forEach(function(hotspot) {
var element = createInfoHotspotElement(hotspot);
scene.hotspotContainer().createHotspot(element, { yaw: hotspot.yaw, pitch: hotspot.pitch });
});
return {
data: data,
scene: scene,
view: view
};
});
// Set up autorotate, if enabled.
var autorotate = Marzipano.autorotate({
yawSpeed: 0.03,
targetPitch: 0,
targetFov: Math.PI/2
});
if (data.settings.autorotateEnabled) {
autorotateToggleElement.classList.add('enabled');
}
// Set handler for autorotate toggle.
autorotateToggleElement.addEventListener('click', toggleAutorotate);
// Set up fullscreen mode, if supported.
if (screenfull.enabled && data.settings.fullscreenButton) {
document.body.classList.add('fullscreen-enabled');
fullscreenToggleElement.addEventListener('click', function() {
screenfull.toggle();
});
screenfull.on('change', function() {
if (screenfull.isFullscreen) {
fullscreenToggleElement.classList.add('enabled');
} else {
fullscreenToggleElement.classList.remove('enabled');
}
});
} else {
document.body.classList.add('fullscreen-disabled');
}
// Set handler for scene list toggle.
sceneListToggleElement.addEventListener('click', toggleSceneList);
// Start with the scene list open on desktop.
if (!document.body.classList.contains('mobile')) {
showSceneList();
}
// Set handler for scene switch.
scenes.forEach(function(scene) {
var el = document.querySelector('#sceneList .scene[data-id="' + scene.data.id + '"]');
el.addEventListener('click', function() {
switchScene(scene);
// On mobile, hide scene list after selecting a scene.
if (document.body.classList.contains('mobile')) {
hideSceneList();
}
});
});
// DOM elements for view controls.
var viewUpElement = document.querySelector('#viewUp');
var viewDownElement = document.querySelector('#viewDown');
var viewLeftElement = document.querySelector('#viewLeft');
var viewRightElement = document.querySelector('#viewRight');
var viewInElement = document.querySelector('#viewIn');
var viewOutElement = document.querySelector('#viewOut');
// Dynamic parameters for controls.
var velocity = 0.7;
var friction = 3;
// Associate view controls with elements.
var controls = viewer.controls();
controls.registerMethod('upElement', new Marzipano.ElementPressControlMethod(viewUpElement, 'y', -velocity, friction), true);
controls.registerMethod('downElement', new Marzipano.ElementPressControlMethod(viewDownElement, 'y', velocity, friction), true);
controls.registerMethod('leftElement', new Marzipano.ElementPressControlMethod(viewLeftElement, 'x', -velocity, friction), true);
controls.registerMethod('rightElement', new Marzipano.ElementPressControlMethod(viewRightElement, 'x', velocity, friction), true);
controls.registerMethod('inElement', new Marzipano.ElementPressControlMethod(viewInElement, 'zoom', -velocity, friction), true);
controls.registerMethod('outElement', new Marzipano.ElementPressControlMethod(viewOutElement, 'zoom', velocity, friction), true);
function sanitize(s) {
return s.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;');
}
function switchScene(scene) {
stopAutorotate();
scene.view.setParameters(scene.data.initialViewParameters);
scene.scene.switchTo();
startAutorotate();
updateSceneName(scene);
updateSceneList(scene);
}
function updateSceneName(scene) {
sceneNameElement.innerHTML = sanitize(scene.data.name);
}
function updateSceneList(scene) {
for (var i = 0; i < sceneElements.length; i++) {
var el = sceneElements[i];
if (el.getAttribute('data-id') === scene.data.id) {
el.classList.add('current');
} else {
el.classList.remove('current');
}
}
}
function showSceneList() {
sceneListElement.classList.add('enabled');
sceneListToggleElement.classList.add('enabled');
}
function hideSceneList() {
sceneListElement.classList.remove('enabled');
sceneListToggleElement.classList.remove('enabled');
}
function toggleSceneList() {
sceneListElement.classList.toggle('enabled');
sceneListToggleElement.classList.toggle('enabled');
}
function startAutorotate() {
if (!autorotateToggleElement.classList.contains('enabled')) {
return;
}
viewer.startMovement(autorotate);
viewer.setIdleMovement(3000, autorotate);
}
function stopAutorotate() {
viewer.stopMovement();
viewer.setIdleMovement(Infinity);
}
function toggleAutorotate() {
if (autorotateToggleElement.classList.contains('enabled')) {
autorotateToggleElement.classList.remove('enabled');
stopAutorotate();
} else {
autorotateToggleElement.classList.add('enabled');
startAutorotate();
}
}
function createLinkHotspotElement(hotspot) {
// Create wrapper element to hold icon and tooltip.
var wrapper = document.createElement('div');
wrapper.classList.add('hotspot');
wrapper.classList.add('link-hotspot');
// Create image element.
var icon = document.createElement('img');
icon.src = 'img/link.png';
icon.classList.add('link-hotspot-icon');
// Set rotation transform.
var transformProperties = [ '-ms-transform', '-webkit-transform', 'transform' ];
for (var i = 0; i < transformProperties.length; i++) {
var property = transformProperties[i];
icon.style[property] = 'rotate(' + hotspot.rotation + 'rad)';
}
// Add click event handler.
wrapper.addEventListener('click', function() {
switchScene(findSceneById(hotspot.target));
});
// Prevent touch and scroll events from reaching the parent element.
// This prevents the view control logic from interfering with the hotspot.
stopTouchAndScrollEventPropagation(wrapper);
// Create tooltip element.
var tooltip = document.createElement('div');
tooltip.classList.add('hotspot-tooltip');
tooltip.classList.add('link-hotspot-tooltip');
tooltip.innerHTML = findSceneDataById(hotspot.target).name;
wrapper.appendChild(icon);
wrapper.appendChild(tooltip);
return wrapper;
}
function createInfoHotspotElement(hotspot) {
// Create wrapper element to hold icon and tooltip.
var wrapper = document.createElement('div');
wrapper.classList.add('hotspot');
wrapper.classList.add('info-hotspot');
// Create hotspot/tooltip header.
var header = document.createElement('div');
header.classList.add('info-hotspot-header');
// Create image element.
var iconWrapper = document.createElement('div');
iconWrapper.classList.add('info-hotspot-icon-wrapper');
var icon = document.createElement('img');
icon.src = 'img/info.png';
icon.classList.add('info-hotspot-icon');
iconWrapper.appendChild(icon);
// Create title element.
var titleWrapper = document.createElement('div');
titleWrapper.classList.add('info-hotspot-title-wrapper');
var title = document.createElement('div');
title.classList.add('info-hotspot-title');
title.innerHTML = hotspot.title;
titleWrapper.appendChild(title);
// Create close element.
var closeWrapper = document.createElement('div');
closeWrapper.classList.add('info-hotspot-close-wrapper');
var closeIcon = document.createElement('img');
closeIcon.src = 'img/close.png';
closeIcon.classList.add('info-hotspot-close-icon');
closeWrapper.appendChild(closeIcon);
// Construct header element.
header.appendChild(iconWrapper);
header.appendChild(titleWrapper);
header.appendChild(closeWrapper);
// Create text element.
var text = document.createElement('div');
text.classList.add('info-hotspot-text');
text.innerHTML = hotspot.text;
// Place header and text into wrapper element.
wrapper.appendChild(header);
wrapper.appendChild(text);
// Create a modal for the hotspot content to appear on mobile mode.
var modal = document.createElement('div');
modal.innerHTML = wrapper.innerHTML;
modal.classList.add('info-hotspot-modal');
document.body.appendChild(modal);
var toggle = function() {
wrapper.classList.toggle('visible');
modal.classList.toggle('visible');
};
// Show content when hotspot is clicked.
wrapper.querySelector('.info-hotspot-header').addEventListener('click', toggle);
// Hide content when close icon is clicked.
modal.querySelector('.info-hotspot-close-wrapper').addEventListener('click', toggle);
// Prevent touch and scroll events from reaching the parent element.
// This prevents the view control logic from interfering with the hotspot.
stopTouchAndScrollEventPropagation(wrapper);
return wrapper;
}
// Prevent touch and scroll events from reaching the parent element.
function stopTouchAndScrollEventPropagation(element, eventList) {
var eventList = [ 'touchstart', 'touchmove', 'touchend', 'touchcancel',
'wheel', 'mousewheel' ];
for (var i = 0; i < eventList.length; i++) {
element.addEventListener(eventList[i], function(event) {
event.stopPropagation();
});
}
}
function findSceneById(id) {
for (var i = 0; i < scenes.length; i++) {
if (scenes[i].data.id === id) {
return scenes[i];
}
}
return null;
}
function findSceneDataById(id) {
for (var i = 0; i < data.scenes.length; i++) {
if (data.scenes[i].id === id) {
return data.scenes[i];
}
}
return null;
}
// Display the initial scene.
switchScene(scenes[0]);
})();

831
static/vr/style.css Executable file

@ -0,0 +1,831 @@
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
-ms-text-size-adjust: none;
-moz-text-size-adjust: none;
-webkit-text-size-adjust: none;
text-size-adjust: none;
-webkit-user-drag: none;
-webkit-touch-callout: none;
-ms-content-zooming: none;
-webkit-tap-highlight-color: rgba(0,0,0,0);
}
html, body {
width: 100%;
height: 100%;
padding: 0;
margin: 0;
overflow: hidden;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 16px;
background-color: #000;
color: #fff;
}
a, a:hover, a:active, a:visited {
text-decoration: none;
color: inherit;
}
#pano {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
overflow: hidden;
}
#titleBar {
position: absolute;
top: 0;
left: 0;
right: 40px;
height: 40px;
text-align: center;
}
.mobile #titleBar {
height: 50px;
right: 50px;
}
/* If there is a fullscreen button the title bar must make space for it */
body.fullscreen-enabled #titleBar {
right: 80px;
}
body.fullscreen-enabled.mobile #titleBar {
right: 100px;
}
/* If there are multiple scenes the title bar must make space for the scene list toggle */
body.multiple-scenes #titleBar {
left: 40px;
}
body.multiple-scenes.mobile #titleBar {
left: 50px;
}
#titleBar .sceneName {
width: 100%;
height: 100%;
line-height: 30px;
padding: 5px;
background-color: #1a1a37;
background-color: #1a1a37;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
-moz-user-select: text;
-webkit-user-select: text;
-ms-user-select: text;
user-select: text;
}
.mobile #titleBar .sceneName {
line-height: 40px;
}
#fullscreenToggle {
display: none;
position: absolute;
top: 0;
right: 0;
width: 40px;
height: 40px;
padding: 5px;
background-color: #ffbc3b;
}
.mobile #fullscreenToggle {
width: 50px;
height: 50px;
}
body.fullscreen-enabled #fullscreenToggle {
display: block;
}
#fullscreenToggle .icon {
position: absolute;
top: 5px;
right: 5px;
width: 30px;
height: 30px;
}
.mobile #fullscreenToggle .icon {
top: 10px;
right: 10px;
}
#fullscreenToggle .icon.on {
display: none;
}
#fullscreenToggle .icon.off {
display: block;
}
#fullscreenToggle.enabled .icon.on {
display: block;
}
#fullscreenToggle.enabled .icon.off {
display: none;
}
#autorotateToggle {
display: block;
position: absolute;
top: 0;
right: 0;
width: 40px;
height: 40px;
padding: 5px;
background-color: #ffbc3b;
}
.mobile #autorotateToggle {
width: 50px;
height: 50px;
}
/* If there is a fullscreen button, autorotate must placed a bit to the left */
body.fullscreen-enabled #autorotateToggle {
right: 40px;
}
body.fullscreen-enabled.mobile #autorotateToggle {
right: 50px;
}
#autorotateToggle .icon {
position: absolute;
top: 5px;
right: 5px;
width: 30px;
height: 30px;
}
.mobile #autorotateToggle .icon {
top: 10px;
right: 10px;
}
#autorotateToggle .icon.on {
display: none;
}
#autorotateToggle .icon.off {
display: block;
}
#autorotateToggle.enabled .icon.on {
display: block;
}
#autorotateToggle.enabled .icon.off {
display: none;
}
#sceneListToggle {
position: absolute;
top: 0;
left: 0;
width: 40px;
height: 40px;
padding: 5px;
background-color: #ffbc3b;
}
.mobile #sceneListToggle {
width: 50px;
height: 50px;
}
#sceneListToggle .text {
position: absolute;
top: 5px;
left: 15px;
width: 100%;
line-height: 30px;
}
#sceneListToggle .icon {
position: absolute;
top: 5px;
right: 5px;
width: 30px;
height: 30px;
}
.mobile #sceneListToggle .icon {
top: 10px;
right: 10px;
}
#sceneListToggle .icon.on {
display: none;
}
#sceneListToggle .icon.off {
display: block;
}
#sceneListToggle.enabled .icon.on {
display: block;
}
#sceneListToggle.enabled .icon.off {
display: none;
}
#sceneList {
position: absolute;
top: 0;
left: -220px;
padding-top: 40px;
width: 220px;
max-height: 100%;
overflow-x: hidden;
overflow-y: auto;
margin-left: 0;
-webkit-transition: margin-left 0.5s ease-in-out;
transition: margin-left 0.5s ease-in-out;
}
.mobile #sceneList {
padding-top: 50px;
}
#sceneList .scenes {
width: 100%;
background-color: #1a1a37;
}
.mobile #sceneList {
width: 100%;
height: 100%;
left: -100%;
}
.mobile #sceneList.enabled {
margin-left: 100%;
}
.mobile #sceneList .scenes {
height: 100%;
}
#sceneList.enabled {
margin-left: 220px;
}
#sceneList .scene {
display: block;
width: 100%;
height: 30px;
}
.mobile #sceneList .scene {
height: 40px;
}
#sceneList .scene .text {
width: 100%;
height: 100%;
padding: 0 15px;
line-height: 30px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.mobile #sceneList .scene .text {
line-height: 40px;
}
.no-touch #sceneList .scene:hover {
background-color: rgb(103,115,131);
background-color: rgba(103,115,131,0.8);
}
#sceneList .scene.current {
background-color: rgb(103,115,131);
background-color: #ffbc3b;
}
/* Hide scene list when only a single scene exists */
body.single-scene #sceneList, body.single-scene #sceneListToggle {
display: none;
}
/* Link hotspot */
.link-hotspot {
width: 60px;
height: 60px;
margin-left: -30px;
margin-top: -30px;
opacity: 0.9;
-webkit-transition: opacity 0.2s;
transition: opacity 0.2s;
}
.no-touch .link-hotspot:hover {
opacity: 1;
}
.mobile .link-hotspot {
width: 70px;
height: 70px;
}
.link-hotspot-icon {
width: 100%;
height: 100%;
cursor: pointer;
}
.link-hotspot-tooltip {
position: absolute;
left: 100%;
top: 14px; /* ( 60 - (16 + 2*8) ) / 2 */
margin-left: 3px;
font-size: 16px;
max-width: 300px;
padding: 8px 10px;
border-radius: 5px;
background-color: rgb(58,68,84);
background-color: #1a1a37;
color: #fff;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
cursor: pointer;
opacity: 0;
-ms-transform: translateX(-8px);
-webkit-transform: translateX(-8px);
transform: translateX(-8px);
-webkit-transition: -ms-transform 0.3s,
-webkit-transform 0.3s,
transform 0.3s,
opacity 0.3s;
transition: -ms-transform 0.3s,
-webkit-transform 0.3s,
transform 0.3s,
opacity 0.3s;
}
.mobile .link-hotspot {
top: 19px; /* ( 70 - (16 + 2*8) ) / 2 */
}
.no-touch .link-hotspot:hover .link-hotspot-tooltip {
opacity: 1;
-ms-transform: translateX(0);
-webkit-transform: translateX(0);
transform: translateX(0);
}
/* Prevent tooltip from triggering */
.link-hotspot-tooltip {
pointer-events: none;
}
.no-touch .link-hotspot:hover .link-hotspot-tooltip {
pointer-events: all;
}
/* Fallback mode without pointer-events (IE8-10) */
.tooltip-fallback .link-hotspot-tooltip {
display: none;
}
.no-touch .tooltip-fallback .link-hotspot:hover .link-hotspot-tooltip {
display: block;
}
/* Info hotspot */
.info-hotspot {
line-height: 1.2em;
opacity: 0.9;
-webkit-transition: opacity 0.2s 0.2s;
transition: opacity 0.2s 0.2s;
}
.no-touch .info-hotspot:hover {
opacity: 1;
-webkit-transition: opacity 0.2s;
transition: opacity 0.2s;
}
.info-hotspot.visible {
opacity: 1
}
.info-hotspot .info-hotspot-header {
width: 40px;
height: 40px;
border-radius: 20px;
background-color: #1a1a37;
cursor: pointer;
-webkit-transition: width 0.3s ease-in-out 0.5s,
border-radius 0.3s ease-in-out 0.5s;
transition: width 0.3s ease-in-out 0.5s,
border-radius 0.3s ease-in-out 0.5s;
}
.mobile .info-hotspot .info-hotspot-header {
width: 50px;
height: 50px;
border-radius: 25px;
}
.desktop.no-touch .info-hotspot .info-hotspot-header:hover {
width: 460px;
border-radius: 5px;
-webkit-transition: width 0.3s ease-in-out,
border-radius 0.3s ease-in-out;
transition: width 0.3s ease-in-out,
border-radius 0.3s ease-in-out;
}
.desktop .info-hotspot.visible .info-hotspot-header,
.desktop.no-touch .info-hotspot.visible .info-hotspot-header:hover {
width: 460px;
border-radius: 5px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
-webkit-transition: width 0.3s ease-in-out,
border-radius 0.3s ease-in-out;
transition: width 0.3s ease-in-out,
border-radius 0.3s ease-in-out;
}
.info-hotspot .info-hotspot-icon-wrapper {
width: 40px;
height: 40px;
}
.mobile .info-hotspot .info-hotspot-icon-wrapper {
width: 50px;
height: 50px;
}
.info-hotspot .info-hotspot-icon {
width: 90%;
height: 90%;
margin: 5%;
}
.info-hotspot .info-hotspot-title-wrapper {
position: absolute;
left: 40px;
top: 0;
width: 0;
height: 40px;
padding: 0;
overflow: hidden;
-webkit-transition: width 0s 0.4s,
padding 0s 0.4s;
transition: width 0s 0.4s,
padding 0s 0.4s;
}
.desktop .info-hotspot.visible .info-hotspot-title-wrapper,
.desktop.no-touch .info-hotspot .info-hotspot-header:hover .info-hotspot-title-wrapper {
width: 420px;
padding: 0 5px;
-webkit-transition: width 0s 0.4s,
padding 0s 0.4s;
transition: width 0s 0.4s,
padding 0s 0.4s;
}
.info-hotspot .info-hotspot-title-wrapper:before {
content: '';
display: inline-block;
vertical-align: middle;
height: 100%;
}
.info-hotspot .info-hotspot-title {
display: inline-block;
vertical-align: middle;
-moz-user-select: text;
-webkit-user-select: text;
-ms-user-select: text;
user-select: text;
}
.info-hotspot .info-hotspot-close-wrapper {
position: absolute;
left: 460px;
top: 0;
height: 40px;
width: 40px;
border-top-right-radius: 5px;
background-color: #ffbc3b;
visibility: hidden;
-ms-transform: perspective(200px) rotateY(90deg);
-webkit-transform: perspective(200px) rotateY(90deg);
transform: perspective(200px) rotateY(90deg);
-ms-transform-origin: 0 50% 0;
-webkit-transform-origin: 0 50% 0;
transform-origin: 0 50% 0;
-webkit-transition: -ms-transform 0.3s 0.3s,
-webkit-transform 0.3s 0.3s,
transform 0.3s 0.3s,
visibility 0s 0.6s;
transition: -ms-transform 0.3s 0.3s,
-webkit-transform 0.3s 0.3s,
transform 0.3s 0.3s,
visibility 0s 0.6s;
}
.desktop .info-hotspot.visible .info-hotspot-close-wrapper {
visibility: visible;
-ms-transform: perspective(200px) rotateY(0deg);
-webkit-transform: perspective(200px) rotateY(0deg);
transform: perspective(200px) rotateY(0deg);
-webkit-transition: -ms-transform 0.3s,
-webkit-transform 0.3s,
transform 0.3s,
visibility 0s 0s;
transition: -ms-transform 0.3s,
-webkit-transform 0.3s,
transform 0.3s,
visibility 0s 0s;
}
.info-hotspot .info-hotspot-close-icon {
width: 70%;
height: 70%;
margin: 15%;
}
.info-hotspot .info-hotspot-text {
position: absolute;
width: 400px;
height: auto;
max-height: 200px;
top: 40px;
left: 0;
padding: 10px;
background-color: #1a1a37;
border-bottom-right-radius: 5px;
border-bottom-left-radius: 5px;
overflow-y: auto;
visibility: hidden;
/* rotate(90deg) causes transition flicker on Firefox 58 */
-ms-transform: perspective(200px) rotateX(-89.999deg);
-webkit-transform: perspective(200px) rotateX(-89.999deg);
transform: perspective(200px) rotateX(-89.999deg);
-ms-transform-origin: 50% 0 0;
-webkit-transform-origin: 50% 0 0;
transform-origin: 50% 0 0;
-webkit-transition: -ms-transform 0.3s,
-webkit-transform 0.3s,
transform 0.3s,
visibility 0s 0.3s;
transition: -ms-transform 0.3s,
-webkit-transform 0.3s,
transform 0.3s,
visibility 0s 0.3s;
-moz-user-select: text;
-webkit-user-select: text;
-ms-user-select: text;
user-select: text;
}
.desktop .info-hotspot.visible .info-hotspot-text {
visibility: visible;
-ms-transform: perspective(200px) rotateX(0deg);
-webkit-transform: perspective(200px) rotateX(0deg);
transform: perspective(200px) rotateX(0deg);
-webkit-transition: -ms-transform 0.3s 0.3s,
-webkit-transform 0.3s 0.3s,
transform 0.3s 0.3s,
visibility 0s 0s;
transition: -ms-transform 0.3s 0.3s,
-webkit-transform 0.3s 0.3s,
transform 0.3s 0.3s,
visibility 0s 0s;
}
/* Info hotspot modal */
.desktop .info-hotspot-modal {
display: none;
}
.info-hotspot-modal {
top: 0;
left: 0;
position: absolute;
width: 100%;
height: 100%;
overflow: hidden;
z-index: 11000 !important;
background-color: rgba(0,0,0,.5);
line-height: 1.2em;
opacity: 0;
visibility: hidden;
-webkit-transition: opacity 0.2s ease-in-out 0.5s,
visibility 0s 0.7s;
transition: opacity 0.2s ease-in-out 0.5s,
visibility 0s 0.7s;
}
.info-hotspot-modal.visible {
opacity: 1;
visibility: visible;
-webkit-transition: opacity 0.2s ease-in-out,
visibility 0s 0s;
transition: opacity 0.2s ease-in-out,
visibility 0s 0s;
}
.info-hotspot-modal .info-hotspot-header {
position: absolute;
top: 60px;
left: 10px;
right: 10px;
width: auto;
height: 50px;
background-color: rgb(103,115,131);
background-color: rgba(103,115,131,0.8);
opacity: 0;
-webkit-transition: opacity 0.3s ease-in-out 0.2s;
transition: opacity 0.3s ease-in-out 0.2s;
}
.info-hotspot-modal.visible .info-hotspot-header {
opacity: 1;
-webkit-transition: opacity 0.3s ease-in-out 0.2s;
transition: opacity 0.3s ease-in-out 0.2s;
}
.info-hotspot-modal .info-hotspot-icon-wrapper {
width: 50px;
height: 50px;
}
.info-hotspot-modal .info-hotspot-icon {
width: 90%;
height: 90%;
margin: 5%;
}
.info-hotspot-modal .info-hotspot-title-wrapper {
position: absolute;
top: 0;
left: 50px;
right: 50px;
width: auto;
height: 50px;
padding: 0 10px;
}
.info-hotspot-modal .info-hotspot-title-wrapper:before {
content: '';
display: inline-block;
vertical-align: middle;
height: 100%;
}
.info-hotspot-modal .info-hotspot-title {
display: inline-block;
vertical-align: middle;
-moz-user-select: text;
-webkit-user-select: text;
-ms-user-select: text;
user-select: text;
}
.info-hotspot-modal .info-hotspot-close-wrapper {
position: absolute;
top: 0;
right: 0;
width: 50px;
height: 50px;
background-color: rgb(78,88,104);
background-color: rgba(78,88,104,0.8);
cursor: pointer;
}
.info-hotspot-modal .info-hotspot-close-icon {
width: 70%;
height: 70%;
margin: 15%;
}
.info-hotspot-modal .info-hotspot-text {
position: absolute;
top: 110px;
bottom: 10px;
left: 10px;
right: 10px;
padding: 10px;
background-color: rgb(58,68,84);
background-color: rgba(58,68,84,0.8);
overflow-y: auto;
opacity: 0;
-webkit-transition: opacity 0.3s ease-in-out;
transition: opacity 0.3s ease-in-out;
-moz-user-select: text;
-webkit-user-select: text;
-ms-user-select: text;
user-select: text;
}
.info-hotspot-modal.visible .info-hotspot-text {
opacity: 1;
-webkit-transition: opacity 0.3s ease-in-out 0.4s;
transition: opacity 0.3s ease-in-out 0.4s;
}
/* View control buttons */
.viewControlButton {
display: none;
position: absolute;
bottom: 0;
left: 50%;
width: 40px;
height: 40px;
padding: 5px;
background-color: rgb(103,115,131);
background-color: #ffbc3b;
}
body.view-control-buttons .viewControlButton {
display: block;
}
/* Hide controls when width is too small */
@media (max-width: 600px) {
body.view-control-buttons .viewControlButton {
display: none;
}
}
.viewControlButton .icon {
position: absolute;
top: 5px;
right: 5px;
width: 30px;
height: 30px;
}
/* Center is at margin-left: -20px */
.viewControlButton-1 {
margin-left: -145px;
}
.viewControlButton-2 {
margin-left: -95px;
}
.viewControlButton-3 {
margin-left: -45px;
}
.viewControlButton-4 {
margin-left: 5px;
}
.viewControlButton-5 {
margin-left: 55px;
}
.viewControlButton-6 {
margin-left: 105px;
}
.feature-icon {
font-size: 60px;
display: inline-block;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Some files were not shown because too many files have changed in this diff Show More