mirror of
https://github.com/legop3/MultiRoombaRover.git
synced 2026-09-15 17:12:59 -04:00
88 lines
3.4 KiB
HTML
88 lines
3.4 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<link rel="icon" type="image/png" href="/bitmap.png" />
|
|
<link rel="apple-touch-icon" href="/bitmap.png" />
|
|
<link rel="manifest" href="/manifest.json" />
|
|
<!-- Mobile driving uses dense press controls, so the viewport opts out of browser zoom gestures that can steal touches from the controls. -->
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
|
|
<meta name="theme-color" content="#020617" />
|
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
|
<meta name="apple-mobile-web-app-title" content="Roomba Rover" />
|
|
<!-- place analytics tags here and they will be injected into <head> of index.html at build time of the web UI. -->
|
|
<!-- these tags are loaded PAGE-WIDE, this means /, /spectate, /mini, etc. -->
|
|
|
|
<script>
|
|
/*
|
|
Build-time analytics adapter for the rover UI.
|
|
|
|
React only calls window.roverAnalytics.track/identify. Keeping the Umami
|
|
adapter here means analytics can still be removed, replaced, or configured
|
|
by changing this injected file instead of rebuilding app logic around a
|
|
specific analytics provider.
|
|
*/
|
|
(function () {
|
|
var pendingCalls = [];
|
|
var flushTimer = null;
|
|
|
|
function callUmami(method, args) {
|
|
if (!window.umami || typeof window.umami[method] !== 'function') return false;
|
|
window.umami[method].apply(window.umami, args);
|
|
return true;
|
|
}
|
|
|
|
function flushPendingCalls() {
|
|
if (!pendingCalls.length) return;
|
|
if (!window.umami) return;
|
|
|
|
pendingCalls = pendingCalls.filter(function (call) {
|
|
return !callUmami(call.method, call.args);
|
|
});
|
|
|
|
if (!pendingCalls.length && flushTimer) {
|
|
window.clearInterval(flushTimer);
|
|
flushTimer = null;
|
|
}
|
|
}
|
|
|
|
function enqueue(method, args) {
|
|
if (callUmami(method, args)) return;
|
|
pendingCalls.push({ method: method, args: args });
|
|
|
|
/*
|
|
The React app may fire route/session events before Umami's deferred
|
|
script has executed. Queueing preserves those early events while still
|
|
letting the whole adapter no-op harmlessly if the script is blocked.
|
|
*/
|
|
if (!flushTimer) {
|
|
flushTimer = window.setInterval(flushPendingCalls, 500);
|
|
}
|
|
}
|
|
|
|
window.roverAnalytics = {
|
|
track: function (name, data) {
|
|
enqueue('track', typeof data === 'undefined' ? [name] : [name, data]);
|
|
},
|
|
identify: function (data) {
|
|
enqueue('identify', [data || {}]);
|
|
},
|
|
};
|
|
|
|
window.addEventListener('load', flushPendingCalls);
|
|
})();
|
|
</script>
|
|
|
|
<!-- otterlytics testing for blocking local -->
|
|
<script defer src="https://analytics.otter.land/script.js" data-website-id="82dd56a5-db44-4279-bd1e-a4d9fee39af7" data-domains="rover.otter.land"></script>
|
|
<script defer src="https://analytics.otter.land/recorder.js" data-website-id="82dd56a5-db44-4279-bd1e-a4d9fee39af7" data-domains="rover.otter.land" data-sample-rate="0.15" data-mask-level="moderate" data-max-duration="300000"></script>
|
|
<title>Roomba Rover</title>
|
|
<script type="module" crossorigin src="/assets/index-Dqo9kxw3.js"></script>
|
|
<link rel="stylesheet" crossorigin href="/assets/index-ZpgWUPKf.css">
|
|
</head>
|
|
<body>
|
|
<div id="root"></div>
|
|
</body>
|
|
</html>
|