Files
boc/quixzoom-landing-fixed/app-store-guide.html
T
Bernt 48ea61cdcc docs: add quixzoom-auth-core product to AAMOS
- Product documentation in docs/products/
- Updated MEMORY.md with product info
- quiXzoom Auth Core as AAMOS Identity product
2026-07-14 09:58:53 +00:00

901 lines
40 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="sv" data-theme="dark">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<title>App Store Guide — quiXzoom</title>
<link rel="stylesheet" >
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: var(--font-text);
background: var(--grouped-background-primary);
color: var(--label-primary);
min-height: 100dvh;
padding-top: env(safe-area-inset-top, 44px);
padding-bottom: calc(env(safe-area-inset-bottom, 34px) + 40px);
-webkit-font-smoothing: antialiased;
}
.nav-bar {
position: sticky; top: 0; z-index: 200;
display: flex; align-items: center; justify-content: space-between;
height: 44px; padding: 0 16px;
background: var(--navbar-bg);
backdrop-filter: saturate(180%) blur(20px);
-webkit-backdrop-filter: saturate(180%) blur(20px);
border-bottom: 0.5px solid var(--separator);
}
.nav-title { font-size: 17px; font-weight: 600; letter-spacing: -0.41px; }
.nav-badge {
font-size: 12px; font-weight: 600; padding: 4px 10px;
background: rgba(10,132,255,0.15); color: var(--ios-blue);
border-radius: var(--radius-xl);
}
/* Hero */
.hero {
padding: 28px 20px 24px;
text-align: center;
background: linear-gradient(180deg, rgba(10,132,255,0.08) 0%, transparent 100%);
}
.hero-icon { font-size: 64px; margin-bottom: 12px; line-height: 1; }
.hero-title {
font-family: var(--font-display);
font-size: 28px; font-weight: 800; letter-spacing: -0.5px;
margin-bottom: 8px;
}
.hero-sub { font-size: 15px; color: var(--label-secondary); line-height: 1.5; }
/* Progress overview */
.progress-overview {
margin: 0 16px 20px;
background: var(--background-secondary);
border-radius: var(--radius-lg); overflow: hidden;
border: 0.5px solid var(--separator);
padding: 16px;
}
.progress-label {
display: flex; justify-content: space-between; align-items: center;
margin-bottom: 10px;
}
.progress-label-text { font-size: 14px; color: var(--label-secondary); }
.progress-label-count { font-size: 14px; font-weight: 700; color: var(--ios-blue); }
.progress-track {
height: 8px; background: var(--fill-secondary); border-radius: var(--radius-sm); overflow: hidden;
}
.progress-fill {
height: 100%; border-radius: var(--radius-sm);
background: linear-gradient(90deg, var(--ios-blue), var(--ios-indigo));
transition: width 0.8s cubic-bezier(0.34,1.56,0.64,1);
}
.progress-chips {
display: flex; gap: 8px; margin-top: 12px; flex-wrap: wrap;
}
.progress-chip {
font-size: 12px; font-weight: 500; padding: 4px 10px; border-radius: var(--radius-md);
}
.chip-done { background: rgba(48,209,88,0.15); color: var(--ios-green); }
.chip-todo { background: var(--fill-secondary); color: var(--label-secondary); }
/* Section */
.section { margin: 0 16px 28px; }
.section-header {
font-size: 13px; font-weight: 600; color: var(--label-secondary);
text-transform: uppercase; letter-spacing: 0.5px;
padding: 0 4px 10px;
}
/* Steps */
.steps-list { display: flex; flex-direction: column; gap: 0; }
.step-card {
background: var(--background-secondary);
border-radius: 0; overflow: hidden;
border: 0.5px solid var(--separator);
margin-bottom: -0.5px;
}
.step-card:first-child { border-radius: var(--radius-lg) 14px 0 0; }
.step-card:last-child { border-radius: 0 0 14px 14px; margin-bottom: 0; }
.step-card:only-child { border-radius: var(--radius-lg); }
.step-header {
display: flex; align-items: center; gap: 14px;
padding: 16px; cursor: pointer;
}
.step-number {
width: 32px; height: 32px; border-radius: var(--radius-full);
display: flex; align-items: center; justify-content: center;
font-size: 14px; font-weight: 700; flex-shrink: 0;
}
.step-num-done { background: var(--ios-green); color: #fff; }
.step-num-todo { background: var(--fill-secondary); color: var(--label-secondary); }
.step-num-progress { background: var(--ios-blue); color: #fff; }
.step-info { flex: 1; }
.step-title { font-size: 16px; font-weight: 600; }
.step-desc { font-size: 13px; color: var(--label-secondary); margin-top: 2px; }
.step-check { font-size: 18px; }
.step-body {
padding: 0 16px 16px 62px;
font-size: 14px; color: var(--label-secondary);
line-height: 1.6;
display: none;
}
.step-body.open { display: block; }
.step-detail-row {
display: flex; gap: 8px; margin-bottom: 8px; align-items: flex-start;
}
.step-detail-dot { margin-top: 5px; width: 5px; height: 5px; border-radius: var(--radius-full); background: var(--ios-blue); flex-shrink: 0; }
.step-detail-text { flex: 1; color: var(--label-primary); }
.step-code {
font-family: var(--font-mono); font-size: 13px;
background: var(--fill-secondary); padding: 2px 7px; border-radius: var(--radius-sm);
color: var(--ios-teal);
}
.step-cta {
display: inline-flex; align-items: center; gap: 6px;
margin-top: 10px; padding: 9px 16px; border-radius: var(--radius-md);
background: rgba(10,132,255,0.12); color: var(--ios-blue);
font-size: 14px; font-weight: 600; text-decoration: none;
transition: opacity 0.12s;
}
.step-cta:active { opacity: 0.7; }
/* Legal checklist */
.legal-card {
background: var(--background-secondary);
border-radius: var(--radius-lg); overflow: hidden;
border: 0.5px solid var(--separator);
}
.legal-row {
display: flex; align-items: center; gap: 14px;
padding: 13px 16px;
border-bottom: 0.5px solid var(--separator);
}
.legal-row:last-child { border-bottom: none; }
.legal-icon { font-size: 20px; }
.legal-info { flex: 1; }
.legal-title { font-size: 15px; font-weight: 500; }
.legal-sub { font-size: 12px; color: var(--label-secondary); margin-top: 2px; }
.legal-status { font-size: 16px; }
/* Screenshot guide */
.screenshot-grid {
display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px;
margin-top: 0;
}
.screenshot-card {
background: var(--background-secondary);
border-radius: var(--radius-md); overflow: hidden;
border: 0.5px solid var(--separator);
padding: 14px 10px; text-align: center;
}
.screenshot-icon { font-size: 28px; margin-bottom: 8px; }
.screenshot-size { font-size: 12px; font-weight: 700; color: var(--label-primary); }
.screenshot-note { font-size: 11px; color: var(--label-secondary); margin-top: 3px; }
/* Info card */
.info-card {
background: rgba(10,132,255,0.08);
border: 0.5px solid rgba(10,132,255,0.2);
border-radius: var(--radius-lg); padding: 14px 16px;
margin-top: 12px;
}
.info-card-title { font-size: 13px; font-weight: 600; color: var(--ios-blue); margin-bottom: 4px; }
.info-card-body { font-size: 13px; color: var(--label-secondary); line-height: 1.5; }
/* Warning card */
.warn-card {
background: rgba(255,159,10,0.08);
border: 0.5px solid rgba(255,159,10,0.2);
border-radius: var(--radius-lg); padding: 14px 16px;
margin: 16px 16px 8px;
}
.warn-card-title { font-size: 13px; font-weight: 600; color: var(--ios-orange); margin-bottom: 4px; }
.warn-card-body { font-size: 13px; color: var(--label-secondary); line-height: 1.5; }
@media (max-width: 640px) {
.hero h1 { font-size: 2rem !important; }
.hero p { font-size: 1rem !important; }
.card { padding: 1.5rem !important; }
.grid { grid-template-columns: 1fr !important; }
.btn { padding: 0.75rem 1.5rem !important; font-size: 1rem !important; }
}
</style>
<style id="wcag-contrast-enforcement">
/* AAMOS GLOBAL CONTRAST ENFORCEMENT — WCAG AA (4.5:1 minimum) */
/* Regel: Ingen text under 70% opacity. Aldrig. */
body { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
/* Fix common low-contrast patterns */
[style*="rgba(60,60,67,0.4)"] { color: rgba(60,60,67,0.65) !important; }
[style*="rgba(60,60,67,0.3)"] { color: rgba(60,60,67,0.65) !important; }
[style*="rgba(255,255,255,0.4)"] { color: rgba(255,255,255,0.72) !important; }
[style*="rgba(255,255,255,0.3)"] { color: rgba(255,255,255,0.72) !important; }
[style*="opacity: 0.4"] { opacity: 0.72 !important; }
[style*="opacity: 0.3"] { opacity: 0.72 !important; }
@media (max-width: 640px) {
.hero h1 { font-size: 2rem !important; }
.hero p { font-size: 1rem !important; }
.card { padding: 1.5rem !important; }
.grid { grid-template-columns: 1fr !important; }
.btn { padding: 0.75rem 1.5rem !important; font-size: 1rem !important; }
}
</style>
<meta property="og:type" content="website">
<meta property="og:title" content="App Store Guide — quiXzoom">
<meta property="og:description" content="quiXzoom — Earn per Mission. No Platform Fee.">
<meta property="og:url" content="https://www.quixzoom.com/app-store-guide.html">
<meta property="og:image" content="https://www.quixzoom.com/images/app-screenshot.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="quiXzoom App Store guide — download on iOS and Android">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="https://www.quixzoom.com/images/app-screenshot.jpg">
<meta name="twitter:title" content="App Store Guide — quiXzoom">
<script type="module" src="https://auth.quixzoom.com/site-auth-snippet.js"></script>
</head>
<body>
<!-- Nav -->
<div class="nav-bar">
<span class="nav-title">App Store Guide</span>
<span class="nav-badge">3 / 9 klara</span>
</div>
<!-- Hero -->
<div class="hero">
<div class="hero-icon"></div>
<div class="hero-title">App Store Submission</div>
<div class="hero-sub">Steg-för-steg guide för quiXzoom<br>iOS App — augusti 2026</div>
</div>
<!-- Progress -->
<div class="progress-overview">
<div class="progress-label">
<span class="progress-label-text">Inlämningssteg slutförda</span>
<span class="progress-label-count">3 av 9</span>
</div>
<div class="progress-track">
<div class="progress-fill" id="progress-fill" style="width:33%"></div>
</div>
<div class="progress-chips">
<span class="progress-chip chip-done"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#22c55e" stroke-width="2"/><path d="M6 10L9 13L14 7" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Privacy Policy</span>
<span class="progress-chip chip-done"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#22c55e" stroke-width="2"/><path d="M6 10L9 13L14 7" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Support URL</span>
<span class="progress-chip chip-done"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#22c55e" stroke-width="2"/><path d="M6 10L9 13L14 7" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Terms of Service</span>
<span class="progress-chip chip-todo">⏳ SwiftUI App</span>
<span class="progress-chip chip-todo">⏳ Screenshots</span>
<span class="progress-chip chip-todo">⏳ App Store Connect</span>
</div>
</div>
<!-- Steps -->
<div class="section">
<div class="section-header">Inlämningssteg</div>
<div class="steps-list">
<!-- Step 1 -->
<div class="step-card" onclick="toggle(1)">
<div class="step-header">
<div class="step-number step-num-todo">1</div>
<div class="step-info">
<div class="step-title">App Store Connect konto</div>
<div class="step-desc">Apple Developer Program · $99/år</div>
</div>
<span class="step-check"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M10 3L17 17H3L10 3Z" stroke="#f59e0b" stroke-width="2"/><path d="M10 8V12M10 14V14.5" stroke="#f59e0b" stroke-width="2" stroke-linecap="round"/></svg></span>
</div>
<div class="step-body" id="step-1">
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Logga in på <strong>appstoreconnect.apple.com</strong> med <span class="step-code">erik@hypbit.com</span></div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Verifiera att Apple Developer Program ($99/år) är aktivt — kan ta 2448h att aktivera om nytt</div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Navigera till "Apps" → klicka "+" → "New App"</div>
</div>
<a class="step-cta" href="https://appstoreconnect.apple.com" target="_blank">
Öppna App Store Connect
</a>
</div>
</div>
<!-- Step 2 -->
<div class="step-card" onclick="toggle(2)">
<div class="step-header">
<div class="step-number step-num-todo">2</div>
<div class="step-info">
<div class="step-title">App ID & Bundle ID</div>
<div class="step-desc">Registrera unik identifierare</div>
</div>
<span class="step-check"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M10 3L17 17H3L10 3Z" stroke="#f59e0b" stroke-width="2"/><path d="M10 8V12M10 14V14.5" stroke="#f59e0b" stroke-width="2" stroke-linecap="round"/></svg></span>
</div>
<div class="step-body" id="step-2">
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Gå till <strong>developer.apple.com/account</strong> → Certificates, IDs & Profiles → Identifiers</div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Klicka "+" → App IDs → App → Continue</div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Bundle ID (Explicit): <span class="step-code">se.wavult.quixzoom</span></div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Capabilities att aktivera: Push Notifications, Sign in with Apple, Location Services</div>
</div>
<div class="info-card">
<div class="info-card-title"> Bundle ID</div>
<div class="info-card-body">Bundle ID är permanent och kan inte ändras efter publicering. Använd <code>se.wavult.quixzoom</code> exakt.</div>
</div>
</div>
</div>
<!-- Step 3 -->
<div class="step-card" onclick="toggle(3)">
<div class="step-header">
<div class="step-number step-num-todo">3</div>
<div class="step-info">
<div class="step-title">App Metadata</div>
<div class="step-desc">Namn, kategori, beskrivning</div>
</div>
<span class="step-check"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M10 3L17 17H3L10 3Z" stroke="#f59e0b" stroke-width="2"/><path d="M10 8V12M10 14V14.5" stroke="#f59e0b" stroke-width="2" stroke-linecap="round"/></svg></span>
</div>
<div class="step-body" id="step-3">
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">App Name: <span class="step-code">quiXzoom</span></div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Subtitle (max 30 tecken): <span class="step-code">Drönartjänster på begäran</span></div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Primary Category: <strong>Business</strong></div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Secondary Category: <strong>Productivity</strong></div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Keywords (max 100 tecken): <span class="step-code">drönare, scanning, uppdrag, zoomer, fastighet, inspektiön</span></div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Description: Skriv en övertygande 4000-tecken beskrivning på svenska och engelska</div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">What's New (v1.0): <span class="step-code">quiXzoom lanseras i Sverige! Ta drönarppdrag när det passar dig.</span></div>
</div>
</div>
</div>
<!-- Step 4 -->
<div class="step-card" onclick="toggle(4)">
<div class="step-header">
<div class="step-number step-num-todo">4</div>
<div class="step-info">
<div class="step-title">Screenshots</div>
<div class="step-desc">3 storlekar krävda av Apple</div>
</div>
<span class="step-check"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M10 3L17 17H3L10 3Z" stroke="#f59e0b" stroke-width="2"/><path d="M10 8V12M10 14V14.5" stroke="#f59e0b" stroke-width="2" stroke-linecap="round"/></svg></span>
</div>
<div class="step-body" id="step-4">
<div class="screenshot-grid">
<div class="screenshot-card">
<div class="screenshot-icon"></div>
<div class="screenshot-size">6.7"</div>
<div class="screenshot-note">iPhone 15 Plus<br>1290×2796</div>
</div>
<div class="screenshot-card">
<div class="screenshot-icon"></div>
<div class="screenshot-size">6.1"</div>
<div class="screenshot-note">iPhone 15<br>1179×2556</div>
</div>
<div class="screenshot-card">
<div class="screenshot-icon"></div>
<div class="screenshot-size">iPad 12.9"</div>
<div class="screenshot-note">iPad Pro<br>2048×2732</div>
</div>
</div>
<div class="step-detail-row" style="margin-top:14px">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Minimum 3 screenshots, max 10 per enhet</div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Visa: Uppdragskarta, Zoomer-profil, Betalningsflöde, Onboarding</div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Verktyg: Figma + iPhone Simulator (Xcode), eller Rottenwood/AppLaunchpad</div>
</div>
<div class="info-card">
<div class="info-card-title"> Pro tip</div>
<div class="info-card-body">Lägg till device frames och svenska texter i bilderna. Localize screenshots till SV för bättre konvertering.</div>
</div>
</div>
</div>
<!-- Step 5 -->
<div class="step-card" onclick="toggle(5)">
<div class="step-header">
<div class="step-number step-num-todo">5</div>
<div class="step-info">
<div class="step-title">App Review Information</div>
<div class="step-desc">Kontaktinfo + demouppgifter</div>
</div>
<span class="step-check"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M10 3L17 17H3L10 3Z" stroke="#f59e0b" stroke-width="2"/><path d="M10 8V12M10 14V14.5" stroke="#f59e0b" stroke-width="2" stroke-linecap="round"/></svg></span>
</div>
<div class="step-body" id="step-5">
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">First Name / Last Name: <span class="step-code">Erik Svensson</span></div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Email: <span class="step-code">erik@hypbit.com</span></div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Phone: <span class="step-code">+46709123223</span></div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Demo Account: Skapa ett test-zoomer-konto med verifierad KYC för review-teamet</div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Review Notes: "quiXzoom is a gig economy platform for drone operators. Use the demo account to browse available missions. Location access is required for the mission map feature."</div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Attachment: Valfri — överväg att bifoga en kort video (MP4, max 2 min) som demonstrerar appen</div>
</div>
</div>
</div>
<!-- Step 6 -->
<div class="step-card" onclick="toggle(6)">
<div class="step-header">
<div class="step-number step-num-done">6</div>
<div class="step-info">
<div class="step-title">Privacy Policy URL</div>
<div class="step-desc">GDPR-kompatibel · live</div>
</div>
<span class="step-check"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#22c55e" stroke-width="2"/><path d="M6 10L9 13L14 7" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
</div>
<div class="step-body" id="step-6">
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">URL: <span class="step-code">https://quixzoom.com/privacy</span> <svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#22c55e" stroke-width="2"/><path d="M6 10L9 13L14 7" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Live</div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">GDPR compliance: <svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#22c55e" stroke-width="2"/><path d="M6 10L9 13L14 7" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Täcker datainsamling, behandling, raderingsrätt</div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Måste vara tillgänglig utan inloggning (publikt URL)</div>
</div>
<a class="step-cta" href="https://quixzoom.com/privacy" target="_blank">
Visa Privacy Policy
</a>
</div>
</div>
<!-- Step 7 -->
<div class="step-card" onclick="toggle(7)">
<div class="step-header">
<div class="step-number step-num-done">7</div>
<div class="step-info">
<div class="step-title">Support URL</div>
<div class="step-desc">Kundservice · live</div>
</div>
<span class="step-check"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#22c55e" stroke-width="2"/><path d="M6 10L9 13L14 7" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
</div>
<div class="step-body" id="step-7">
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">URL: <span class="step-code">https://quixzoom.com/support</span> <svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#22c55e" stroke-width="2"/><path d="M6 10L9 13L14 7" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Live</div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Email: <span class="step-code">support@quixzoom.com</span></div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Phone: <span class="step-code">+46 8 123 45 67</span></div>
</div>
<a class="step-cta" href="https://quixzoom.com/support" target="_blank">
Visa Support-sida
</a>
</div>
</div>
<!-- Step 8 -->
<div class="step-card" onclick="toggle(8)">
<div class="step-header">
<div class="step-number step-num-todo">8</div>
<div class="step-info">
<div class="step-title">Marketing URL</div>
<div class="step-desc">Valfritt — produktsida</div>
</div>
<span class="step-check"></span>
</div>
<div class="step-body" id="step-8">
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Valfri men rekommenderad — ökar trovärdighet hos Apple</div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Förslag: <span class="step-code">https://quixzoom.com</span> (landningssida)</div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Alternativt: <span class="step-code">https://quixzoom.com/app</span> — specifik nedladdningssida</div>
</div>
</div>
</div>
<!-- Step 9 -->
<div class="step-card" onclick="toggle(9)">
<div class="step-header">
<div class="step-number step-num-todo">9</div>
<div class="step-info">
<div class="step-title">Submit for Review</div>
<div class="step-desc">Sista steget · 17 dagar väntetid</div>
</div>
<span class="step-check"></span>
</div>
<div class="step-body" id="step-9">
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Kontrollera att alla tidigare steg är klara (grön check)</div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Klicka "Add for Review" → välj release type: <strong>Automatic release</strong></div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Genomsnittlig granskningstid: 2448h (kan vara upp till 7 dagar v1.0)</div>
</div>
<div class="step-detail-row">
<div class="step-detail-dot"></div>
<div class="step-detail-text">Planera inlämning: <strong>senast 24 juli</strong> för lansering 1 augusti</div>
</div>
<div class="info-card">
<div class="info-card-title">⏱ Tidslinje</div>
<div class="info-card-body">Lämna in senast 24 juli → App Review 25 dagar → Klar 3031 juli → Launch Day 1 augusti <svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 2L10 8L14 9L8 14L6 8L2 7L8 2Z" fill="#666"/></svg></div>
</div>
</div>
</div>
</div>
</div>
<!-- Legal checklist -->
<div class="section">
<div class="section-header">Juridisk checklista</div>
<div class="legal-card">
<div class="legal-row">
<span class="legal-icon"></span>
<div class="legal-info">
<div class="legal-title">GDPR Compliance</div>
<div class="legal-sub">Privacy policy live, dataskyddsombud</div>
</div>
<span class="legal-status"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#22c55e" stroke-width="2"/><path d="M6 10L9 13L14 7" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
</div>
<div class="legal-row">
<span class="legal-icon"></span>
<div class="legal-info">
<div class="legal-title">DAC7 Rapportering</div>
<div class="legal-sub">EU-direktiv för plattformsekonomin — pågår</div>
</div>
<span class="legal-status"></span>
</div>
<div class="legal-row">
<span class="legal-icon"></span>
<div class="legal-info">
<div class="legal-title">Zoomer-avtal</div>
<div class="legal-sub">Uppdragstagares villkor — behövs innan launch</div>
</div>
<span class="legal-status"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#ef4444" stroke-width="2"/><path d="M7 7L13 13M13 7L7 13" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg></span>
</div>
<div class="legal-row">
<span class="legal-icon"></span>
<div class="legal-info">
<div class="legal-title">SwiftUI App</div>
<div class="legal-sub">Native iOS-app för App Store</div>
</div>
<span class="legal-status"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#ef4444" stroke-width="2"/><path d="M7 7L13 13M13 7L7 13" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg></span>
</div>
<div class="legal-row">
<span class="legal-icon"></span>
<div class="legal-info">
<div class="legal-title">Terms of Service</div>
<div class="legal-sub">Användarvillkor live</div>
</div>
<span class="legal-status"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#22c55e" stroke-width="2"/><path d="M6 10L9 13L14 7" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
</div>
<div class="legal-row">
<span class="legal-icon"></span>
<div class="legal-info">
<div class="legal-title">Drönartillstånd (LFV/Transportstyrelsen)</div>
<div class="legal-sub">Zoomer ansvarar för eget tillstånd</div>
</div>
<span class="legal-status"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M10 3L17 17H3L10 3Z" stroke="#f59e0b" stroke-width="2"/><path d="M10 8V12M10 14V14.5" stroke="#f59e0b" stroke-width="2" stroke-linecap="round"/></svg></span>
</div>
</div>
</div>
<!-- Critical path warning -->
<div class="warn-card">
<div class="warn-card-title"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M10 3L17 17H3L10 3Z" stroke="#f59e0b" stroke-width="2"/><path d="M10 8V12M10 14V14.5" stroke="#f59e0b" stroke-width="2" stroke-linecap="round"/></svg> Kritisk väg till 1 augusti</div>
<div class="warn-card-body">SwiftUI-app måste vara klar senast <strong>5 juni</strong> för att hinna med screenshots, testning och App Review-processen. Det är den enda blockande faktorn för en lyckad launch.</div>
</div>
<div style="height:32px"></div>
<script>
const openSteps = new Set();
function toggle(n) {
const el = document.getElementById('step-' + n);
if (!el) return;
if (openSteps.has(n)) {
el.classList.remove('open');
openSteps.delete(n);
} else {
el.classList.add('open');
openSteps.add(n);
}
}
// Auto-open step 1 on load
toggle(1);
</script>
<!-- quiXzoom Mina Sidor - Universal Header Component -->
<!-- Injicera detta i <head> på alla quiXzoom-sajter -->
<style>
.qz-auth-bar {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 48px;
background: #0A0A0A;
border-bottom: 1px solid rgba(255,255,255,0.1);
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
z-index: 9999;
font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Segoe UI', Roboto, sans-serif;
}
.qz-auth-bar .qz-logo {
font-size: 18px;
font-weight: 700;
color: #fff;
text-decoration: none;
letter-spacing: -0.5px;
}
.qz-auth-bar .qz-logo span {
color: #007AFF;
}
.qz-auth-bar .qz-nav {
display: flex;
gap: 8px;
align-items: center;
}
.qz-auth-bar .qz-btn {
padding: 8px 16px;
border-radius: 8px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s;
border: none;
text-decoration: none;
}
.qz-auth-bar .qz-btn-primary {
background: #007AFF;
color: white;
}
.qz-auth-bar .qz-btn-primary:hover {
background: #0056CC;
}
.qz-auth-bar .qz-btn-ghost {
background: transparent;
color: rgba(255,255,255,0.8);
}
.qz-auth-bar .qz-btn-ghost:hover {
background: rgba(255,255,255,0.1);
color: white;
}
.qz-auth-bar .qz-user {
display: flex;
align-items: center;
gap: 8px;
color: white;
font-size: 14px;
}
.qz-auth-bar .qz-avatar {
width: 32px;
height: 32px;
border-radius: 50%;
background: #007AFF;
display: flex;
align-items: center;
justify-content: center;
font-weight: 600;
font-size: 14px;
}
.qz-auth-bar .qz-dropdown {
position: relative;
}
.qz-auth-bar .qz-dropdown-menu {
position: absolute;
top: 40px;
right: 0;
background: #1C1C1E;
border: 1px solid rgba(255,255,255,0.1);
border-radius: 12px;
padding: 8px;
min-width: 200px;
display: none;
box-shadow: 0 8px 32px rgba(0,0,0,0.4);
}
.qz-auth-bar .qz-dropdown-menu.active {
display: block;
}
.qz-auth-bar .qz-dropdown-item {
padding: 10px 12px;
border-radius: 8px;
color: white;
text-decoration: none;
display: flex;
align-items: center;
gap: 10px;
font-size: 14px;
transition: background 0.2s;
}
.qz-auth-bar .qz-dropdown-item:hover {
background: rgba(255,255,255,0.1);
}
.qz-auth-bar .qz-dropdown-divider {
height: 1px;
background: rgba(255,255,255,0.1);
margin: 8px 0;
}
.qz-auth-bar .qz-balance {
background: rgba(0,122,255,0.15);
color: #007AFF;
padding: 4px 10px;
border-radius: 6px;
font-size: 13px;
font-weight: 600;
}
@media (max-width: 640px) {
.qz-auth-bar .qz-nav .qz-btn-ghost:not(.qz-user) {
display: none;
}
}
</style>
<div id="qz-auth-bar" class="qz-auth-bar">
<a href="https://quixzoom.com" class="qz-logo">qui<span>X</span>zoom</a>
<div class="qz-nav">
<div id="qz-auth-guest">
<a href="https://app.quixzoom.com/login" class="qz-btn qz-btn-ghost">Logga in</a>
<a href="https://app.quixzoom.com/register" class="qz-btn qz-btn-primary">Bli Zoomer</a>
</div>
<div id="qz-auth-user" style="display:none;">
<span class="qz-balance" id="qz-balance">$0.00</span>
<div class="qz-dropdown">
<button class="qz-btn qz-btn-ghost qz-user" onclick="qzToggleDropdown()">
<div class="qz-avatar" id="qz-avatar">E</div>
<span id="qz-user-name">Erik</span>
<svg width="12" height="12" viewBox="0 0 12 12" fill="none"><path d="M2.5 4.5L6 8L9.5 4.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>
</button>
<div class="qz-dropdown-menu" id="qz-dropdown-menu">
<a href="https://app.quixzoom.com/dashboard" class="qz-dropdown-item">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="7" height="7" rx="1"/><rect x="14" y="3" width="7" height="7" rx="1"/><rect x="14" y="14" width="7" height="7" rx="1"/><rect x="3" y="14" width="7" height="7" rx="1"/></svg>
Dashboard
</a>
<a href="https://app.quixzoom.com/wallet" class="qz-dropdown-item">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 12V7H5a2 2 0 0 1 0-4h14v4"/><path d="M3 5v14a2 2 0 0 0 2 2h16v-5"/><path d="M18 12a2 2 0 0 0 0 4h4v-4h-4z"/></svg>
Plånbok
</a>
<a href="https://app.quixzoom.com/missions" class="qz-dropdown-item">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2L2 7l10 5 10-5-10-5z"/><path d="M2 17l10 5 10-5"/><path d="M2 12l10 5 10-5"/></svg>
Mina uppdrag
</a>
<div class="qz-dropdown-divider"></div>
<a href="https://app.quixzoom.com/settings" class="qz-dropdown-item">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06A1.65 1.65 0 0 0 4.67 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.67 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06A1.65 1.65 0 0 0 9 4.67a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg>
Inställningar
</a>
<a href="#" onclick="qzLogout(); return false;" class="qz-dropdown-item">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"/><polyline points="16 17 21 12 16 7"/><line x1="21" y1="12" x2="9" y2="12"/></svg>
Logga ut
</a>
</div>
</div>
</div>
</div>
</div>
<script>
(function() {
const SSO_BASE = 'https://auth.quixzoom.com';
const APP_BASE = 'https://app.quixzoom.com';
// Check auth status
async function qzCheckAuth() {
try {
const res = await fetch(SSO_BASE + '/auth/check', {
credentials: 'include',
});
if (res.ok) {
const data = await res.json();
if (data.authenticated) {
document.getElementById('qz-auth-guest').style.display = 'none';
document.getElementById('qz-auth-user').style.display = 'flex';
document.getElementById('qz-user-name').textContent = data.user.name || data.user.email;
document.getElementById('qz-avatar').textContent = (data.user.name || data.user.email)[0].toUpperCase();
if (data.user.balance !== undefined) {
document.getElementById('qz-balance').textContent = '$' + data.user.balance.toFixed(2);
}
}
}
} catch (e) {
// Silent fail - show guest state
}
}
// Toggle dropdown
window.qzToggleDropdown = function() {
document.getElementById('qz-dropdown-menu').classList.toggle('active');
};
// Close dropdown on outside click
document.addEventListener('click', function(e) {
if (!e.target.closest('.qz-dropdown')) {
document.getElementById('qz-dropdown-menu').classList.remove('active');
}
});
// Logout
window.qzLogout = async function() {
try {
await fetch(SSO_BASE + '/auth/logout', {
method: 'POST',
credentials: 'include',
});
} catch (e) {}
document.cookie = 'qz_access_token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; domain=.quixzoom.com; path=/;';
document.cookie = 'qz_refresh_token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; domain=.quixzoom.com; path=/;';
window.location.reload();
};
// Init
qzCheckAuth();
})();
</script>
</body>
</html>