2026-07-14 09:58:53 +00:00
<!doctype html>
< html lang = "sv" >
< head >
< meta charset = "UTF-8" / >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0, viewport-fit=cover" / >
2026-07-05 06:41:32 +00:00
2026-07-14 09:58:53 +00:00
< 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 >
2026-07-05 06:41:32 +00:00
2026-07-14 09:58:53 +00:00
< 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 >
2026-07-05 06:41:32 +00:00
< / div >
< / div >
2026-07-14 09:58:53 +00:00
<!-- 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 >
2026-07-05 06:41:32 +00:00
< / div >
< style >
2026-07-14 09:58:53 +00:00
@ keyframes spin { to { transform : rotate ( 360 deg ) ; } }
2026-07-05 06:41:32 +00:00
< / style >
2026-07-14 09:58:53 +00:00
< 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' ;
2026-07-05 06:41:32 +00:00
}
2026-07-14 09:58:53 +00:00
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' ;
2026-07-05 06:41:32 +00:00
}
2026-07-14 09:58:53 +00:00
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 >
2026-07-05 06:41:32 +00:00
2026-07-14 09:58:53 +00:00
<!-- Deploy Warning -->
< script > fetch ( "deploy-warning.html" ) . then ( r => r . text ( ) ) . then ( h => document . body . insertAdjacentHTML ( "beforeend" , h ) ) < / script >
2026-07-05 06:41:32 +00:00
< / body >
< / html >