202 lines
5.9 KiB
HTML
Executable File
202 lines
5.9 KiB
HTML
Executable File
<html>
|
|
<head>
|
|
|
|
<title>Iris</title>
|
|
|
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
|
<meta content="width=device-width, initial-scale=1" name="viewport" />
|
|
<meta name="viewport" content="width=device-width" />
|
|
|
|
<link rel="manifest" href="/iris/manifest.json" crossorigin="use-credentials" />
|
|
|
|
<!-- App setup -->
|
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
<meta name="apple-mobile-web-app-title" content="Iris" />
|
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
<meta name="apple-mobile-web-app-status-bar-style" content="#121212" />
|
|
<meta name="mobile-web-app-capable" content="yes" />
|
|
<meta name="theme-color" content="#222222" />
|
|
|
|
<!-- Icons -->
|
|
<link rel="apple-touch-startup-image" href="/iris/assets/app-icon_512.png" />
|
|
<link rel="apple-touch-icon" sizes="192x192" href="/iris/assets/app-icon_192.png" />
|
|
<link rel="apple-touch-icon" sizes="512x512" href="/iris/assets/app-icon_512.png" />
|
|
<link rel="apple-touch-icon" sizes="57x57" href="/iris/assets/app-icon_57.png">
|
|
<link rel="apple-touch-icon" sizes="60x60" href="/iris/assets/app-icon_60.png">
|
|
<link rel="apple-touch-icon" sizes="72x72" href="/iris/assets/app-icon_72.png">
|
|
<link rel="apple-touch-icon" sizes="76x76" href="/iris/assets/app-icon_76.png">
|
|
<link rel="apple-touch-icon" sizes="114x114" href="/iris/assets/app-icon_114.png">
|
|
<link rel="apple-touch-icon" sizes="120x120" href="/iris/assets/app-icon_120.png">
|
|
<link rel="apple-touch-icon" sizes="144x144" href="/iris/assets/app-icon_144.png">
|
|
<link rel="apple-touch-icon" sizes="152x152" href="/iris/assets/app-icon_152.png">
|
|
<link rel="apple-touch-icon" sizes="180x180" href="/iris/assets/app-icon_180.png">
|
|
|
|
<link class="favicon" rel="shortcut icon" type="image/ico" href="/iris/assets/favicon.png" />
|
|
<link class="favicon" rel="shortcut icon" type="image/x-icon" href="/iris/assets/favicon.png" />
|
|
<link class="favicon" rel="shortcut-icon" href="/iris/assets/favicon.png" />
|
|
|
|
<link rel="mask-icon" href="/iris/assets/app-icon.svg" color="#08d58f" />
|
|
|
|
<!-- Loading screen styles -->
|
|
<style>
|
|
html {
|
|
background-color: #121212;
|
|
}
|
|
@keyframes loader {
|
|
0% { left: 0; right: 100%; }
|
|
50% { left: 0; right: 0; }
|
|
100% { left: 100%; right: 0; }
|
|
}
|
|
#app-loading {
|
|
position: fixed;
|
|
top: 50vh;
|
|
left: 0;
|
|
right: 0;
|
|
transform: translateY(-50%);
|
|
text-align: center;
|
|
padding: 30px 0;
|
|
}
|
|
#app-loading-logo {
|
|
filter: brightness(0) invert(1);
|
|
margin: 0 auto;
|
|
display: block;
|
|
width: 60vw;
|
|
max-width: 100px;
|
|
opacity: 0.25;
|
|
}
|
|
#app-loading-loader.loading {
|
|
position: relative;
|
|
margin: 30px auto 0;
|
|
width: 80vw;
|
|
max-width: 200px;
|
|
height: 3px;
|
|
border-radius: 3px;
|
|
overflow: hidden;
|
|
background-color: #1A1A1A;
|
|
}
|
|
#app-loading-loader.loading::before {
|
|
position: absolute;
|
|
display: block;
|
|
content: '';
|
|
height: 100%;
|
|
animation-name: loader;
|
|
background: #444444;
|
|
animation-duration: 1.8s;
|
|
animation-timing-function: ease-in-out;
|
|
animation-iteration-count: infinite;
|
|
}
|
|
#app-loading-message {
|
|
color: white;
|
|
font-family: Arial, Helvetica, sans-serif;
|
|
font-size: 12px;
|
|
line-height: 20px;
|
|
padding: 10px;
|
|
opacity: 0.3;
|
|
}
|
|
</style>
|
|
|
|
</head>
|
|
<body>
|
|
|
|
<div id="app">
|
|
<!-- ReactJS app gets injected here, replacing the loader -->
|
|
<div id="app-loading">
|
|
<img src="/iris/assets/app-icon.svg" id="app-loading-logo" />
|
|
<div id="app-loading-loader" class="loading"></div>
|
|
<div id="app-loading-message">
|
|
<div id="app-loading-message-base"></div>
|
|
<div id="app-loading-message-js"></div>
|
|
<div id="app-loading-message-css"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</body>
|
|
|
|
<script type="text/javascript">
|
|
if ('serviceWorker' in navigator){
|
|
navigator.serviceWorker.register('/iris/service-worker.js')
|
|
.then(function(registration){
|
|
console.log('Service worker registered');
|
|
}).catch(function(error){
|
|
console.error('Service worker registration failed:', error);
|
|
});
|
|
}
|
|
</script>
|
|
|
|
<script type="text/javascript">
|
|
var setMessage = function(type = '', content = '') {
|
|
var element = document.getElementById(`app-loading-message-${type}`);
|
|
if (element) {
|
|
element.innerHTML += content;
|
|
}
|
|
}
|
|
var setLoading = function(loading) {
|
|
var element = document.getElementById('app-loading-loader');
|
|
if (element) {
|
|
element.className = loading ? 'loading' : '';
|
|
}
|
|
}
|
|
|
|
// Release details
|
|
// These are automatically injected to built HTML
|
|
var build = "BUILD_HERE";
|
|
var version = "VERSION_HERE";
|
|
|
|
// Construct the script tag
|
|
var js = document.createElement("script");
|
|
js.type = "application/javascript";
|
|
|
|
// Construct our css tag
|
|
var css = document.createElement("link");
|
|
css.rel = "stylesheet";
|
|
|
|
// Check for test mode. This is toggled under Settings > Debug > Test mode or can
|
|
// be manually triggered with the URL var "?test_mode=1"
|
|
if (window.location.href.indexOf('test_mode=1') > -1) {
|
|
window.test_mode = true;
|
|
localStorage.setItem('test_mode', true);
|
|
} else if (window.location.href.indexOf('test_mode=0') > -1) {
|
|
window.test_mode = false;
|
|
localStorage.removeItem('test_mode');
|
|
} else {
|
|
window.test_mode = localStorage.getItem('test_mode');
|
|
}
|
|
if (window.test_mode) {
|
|
setMessage('base', 'Test mode detected<br />');
|
|
}
|
|
|
|
if (window.test_mode){ // Test mode, use un-minified code
|
|
css.href = '/iris/app.css?v='+build;
|
|
js.src = '/iris/app.js?v='+build;
|
|
} else { // Production-grade, minified app
|
|
css.href = '/iris/app.min.css?v='+build;
|
|
js.src = '/iris/app.min.js?v='+build;
|
|
}
|
|
|
|
setMessage('js', 'Loading core... ');
|
|
setMessage('css', 'Loading interface... ');
|
|
js.onload = function(){
|
|
setMessage('js', 'done');
|
|
}
|
|
js.onerror = function(){
|
|
setLoading(false);
|
|
setMessage('js', 'failed');
|
|
}
|
|
css.onload = function(){
|
|
setMessage('css', 'done');
|
|
}
|
|
css.onerror = function(){
|
|
setLoading(false);
|
|
setMessage('css', 'failed');
|
|
}
|
|
|
|
// And finally inject our CSS/JS tags
|
|
document.body.appendChild(css);
|
|
document.body.appendChild(js);
|
|
|
|
</script>
|
|
|
|
</html>
|
|
|