48ea61cdcc
- Product documentation in docs/products/ - Updated MEMORY.md with product info - quiXzoom Auth Core as AAMOS Identity product
83 lines
4.3 KiB
HTML
83 lines
4.3 KiB
HTML
<!doctype html>
|
||
<html lang="sv">
|
||
<head>
|
||
<meta charset="UTF-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
|
||
|
||
<title>quiXzoom – Fotografera uppdrag och tjäna krediter</title>
|
||
<meta name="description" content="Den globala plattformen för mobilfotografi. Dokumentera, tjäna krediter och bidra till smart datainsamling – det ekonomiska och miljövänliga valet." />
|
||
<meta name="author" content="quiXzoom" />
|
||
|
||
<!-- PWA Meta Tags -->
|
||
<meta name="theme-color" content="#2F7A69" />
|
||
<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="quiXzoom" />
|
||
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
|
||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||
<link rel="icon" type="image/png" href="/favicon.png" />
|
||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
||
|
||
<!-- Canonical & Open Graph -->
|
||
<link rel="canonical" href="https://app.quixzoom.com/" />
|
||
<meta property="og:title" content="quiXzoom – Fotografera uppdrag och tjäna krediter" />
|
||
<meta property="og:description" content="Den globala plattformen för mobilfotografi. Dokumentera, tjäna krediter och bidra till smart datainsamling." />
|
||
<meta property="og:type" content="website" />
|
||
<meta property="og:url" content="https://app.quixzoom.com/" />
|
||
<meta property="og:locale" content="sv_SE" />
|
||
<meta property="og:image" content="https://app.quixzoom.com/og-image.jpg" />
|
||
|
||
<meta name="twitter:card" content="summary_large_image" />
|
||
<meta name="twitter:site" content="@quixzoom" />
|
||
<meta name="twitter:image" content="https://app.quixzoom.com/og-image.jpg" />
|
||
|
||
|
||
<link rel="manifest" href="/manifest.webmanifest"><script id="vite-plugin-pwa:register-sw" src="/registerSW.js"></script></head>
|
||
|
||
<body>
|
||
<div id="root"></div>
|
||
<!-- Loading indicator - shown while JS loads -->
|
||
<div id="loading" style="position:fixed;top:0;left:0;right:0;bottom:0;background:#F4F0EC;display:flex;align-items:center;justify-content:center;z-index:9999;transition:opacity 0.3s;">
|
||
<div style="text-align:center;">
|
||
<div style="width:40px;height:40px;border:3px solid #e5e5e5;border-top-color:#2F7A69;border-radius:50%;animation:spin 1s linear infinite;margin:0 auto;"></div>
|
||
<p style="margin-top:16px;color:#666;font-family:system-ui,sans-serif;font-size:14px;">Laddar quiXzoom...</p>
|
||
</div>
|
||
</div>
|
||
<!-- Error display - shows JS errors on screen -->
|
||
<div id="error-display" style="display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:#F4F0EC;z-index:10000;padding:20px;overflow:auto;font-family:monospace;font-size:12px;color:#333;">
|
||
<h3 style="color:#c00;margin-bottom:10px;">Fel vid uppstart:</h3>
|
||
<pre id="error-text" style="white-space:pre-wrap;word-break:break-all;background:#fff;padding:10px;border-radius:4px;"></pre>
|
||
</div>
|
||
<style>
|
||
@keyframes spin { to { transform: rotate(360deg); } }
|
||
</style>
|
||
<script>
|
||
// Global error handler - shows errors on screen
|
||
window.onerror = function(msg, url, line, col, err) {
|
||
var el = document.getElementById('error-display');
|
||
var txt = document.getElementById('error-text');
|
||
if (el && txt) {
|
||
txt.textContent = msg + '\n at ' + url + ':' + line + ':' + col + '\n' + (err && err.stack ? err.stack : '');
|
||
el.style.display = 'block';
|
||
}
|
||
console.error('[GLOBAL ERROR]', msg, err);
|
||
return false;
|
||
};
|
||
window.onunhandledrejection = function(e) {
|
||
var el = document.getElementById('error-display');
|
||
var txt = document.getElementById('error-text');
|
||
if (el && txt) {
|
||
txt.textContent = 'Unhandled Promise Rejection:\n' + (e.reason && e.reason.stack ? e.reason.stack : String(e.reason));
|
||
el.style.display = 'block';
|
||
}
|
||
console.error('[UNHANDLED REJECTION]', e.reason);
|
||
};
|
||
</script>
|
||
<link rel="stylesheet" crossorigin href="/assets/index-DPgFtObt.css">
|
||
<script type="module" crossorigin src="/assets/index-CZD3_4lD.js"></script>
|
||
|
||
<!-- Deploy Warning -->
|
||
<script>fetch("deploy-warning.html").then(r=>r.text()).then(h=>document.body.insertAdjacentHTML("beforeend",h))</script>
|
||
</body>
|
||
</html>
|