sojorn/sojorn_app/web/index.html
Patrick Britton d5fc89b97a
2026-02-16 07:27:41 -06:00

90 lines
3 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<base href="$FLUTTER_BASE_HREF">
<meta charset="UTF-8">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<meta name="description" content="Sojorn - Friend's Only. A product of MPLS LLC.">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="theme-color" content="#0A1128">
<!-- iOS meta tags & icons -->
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-title" content="sojorn">
<link rel="apple-touch-icon" href="icons/Icon-192.png">
<!-- Favicon -->
<link rel="icon" type="image/png" href="favicon.png"/>
<!-- Preconnect to CDN origins for faster sub-resource fetching -->
<link rel="preconnect" href="https://www.gstatic.com" crossorigin>
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<title>sojorn</title>
<link rel="manifest" href="manifest.json">
<!-- Pre-Flutter loading screen (renders before any JS executes) -->
<style>
body { margin: 0; padding: 0; }
#loading {
position: fixed; inset: 0; z-index: 9999;
display: flex; flex-direction: column;
align-items: center; justify-content: center;
background: #0A1128;
transition: opacity .3s ease;
}
#loading .logo {
width: 64px; height: 64px;
border-radius: 16px;
margin-bottom: 24px;
}
#loading .spinner {
width: 28px; height: 28px;
border: 3px solid rgba(255,255,255,.15);
border-top-color: #4A90D9;
border-radius: 50%;
animation: spin .8s linear infinite;
}
@keyframes spin { to { transform: rotate(360deg); } }
</style>
<script src="https://www.gstatic.com/firebasejs/10.7.0/firebase-app-compat.js" async></script>
<script src="https://www.gstatic.com/firebasejs/10.7.0/firebase-messaging-compat.js" async></script>
<script>
// Suppress flutter_inappwebview plugin warning on web platform
window.flutter_inappwebview_plugin = { ready: Promise.resolve() };
</script>
</head>
<body>
<!-- Shown instantly while Flutter engine + app JS loads -->
<div id="loading">
<img class="logo" src="icons/Icon-192.png" alt="sojorn">
<div class="spinner"></div>
</div>
<script src="flutter_bootstrap.js" async></script>
<script>
// Remove loading screen once Flutter's glass pane is in the DOM
(function() {
var observer = new MutationObserver(function() {
if (document.querySelector('flt-glass-pane')) {
var el = document.getElementById('loading');
if (el) {
el.style.opacity = '0';
setTimeout(function() { el.remove(); }, 300);
}
observer.disconnect();
}
});
observer.observe(document.body, { childList: true, subtree: true });
})();
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/firebase-messaging-sw.js');
}
</script>
</body>
</html>