Files
boc/quixzoom-landing-fixed/zoomer-onboarding-flow.html
T
Bernt aee0f09db8 landvex: Fixar och tester klara för alla komponenter
- Datafabrik: Dockerfile fix, agentorkestrering fungerar
- Vision: Identify-modell, FAISS, OCR alla testade
- API: Alla 7 integrationstester passerade
- Upplösare: Entitetsupplösning verifierad
2026-07-05 06:41:32 +00:00

991 lines
39 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">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>Zoomer Onboarding — quiXzoom</title>
<style>
/* ── iOS 26 / Apple Native — Light Mode ──────────────────────────────── */
:root {
--bg: #f2f2f7;
--bg-card: #ffffff;
--separator: rgba(60,60,67,0.18);
--label: #000000;
--label-secondary: rgba(60,60,67,0.6);
--label-tertiary: rgba(60,60,67,0.3);
--tint: #007AFF;
--tint-dark: #0056CC;
--green: #34C759;
--red: #FF3B30;
--yellow: #FF9500;
--purple: #AF52DE;
--fill: rgba(120,120,128,0.12);
--fill-secondary: rgba(120,120,128,0.06);
--radius: 12px;
--radius-lg: 16px;
--radius-xl: 22px;
--font: -apple-system, "SF Pro Display", "Helvetica Neue", sans-serif;
--font-rounded: -apple-system, "SF Pro Rounded", sans-serif;
--safe-top: env(safe-area-inset-top, 0px);
--safe-bottom: env(safe-area-inset-bottom, 0px);
}
* { box-sizing: border-box; margin: 0; padding: 0; -webkit-tap-highlight-color: transparent; }
body {
font-family: var(--font);
background: var(--bg);
color: var(--label);
min-height: 100dvh;
padding-top: var(--safe-top);
padding-bottom: var(--safe-bottom);
overflow-x: hidden;
}
/* ── Screen wrapper ───────────────────────────────────────────────────── */
.screen {
display: none;
min-height: 100dvh;
flex-direction: column;
}
.screen.active { display: flex; }
/* Slide animation */
@keyframes slideInRight {
from { transform: translateX(100%); opacity: 0; }
to { transform: translateX(0); opacity: 1; }
}
@keyframes slideInLeft {
from { transform: translateX(-60%); opacity: 0; }
to { transform: translateX(0); opacity: 1; }
}
.screen.slide-in-right { animation: slideInRight 0.32s cubic-bezier(0.32,0.72,0,1) forwards; }
.screen.slide-in-left { animation: slideInLeft 0.32s cubic-bezier(0.32,0.72,0,1) forwards; }
/* ── Nav Bar ─────────────────────────────────────────────────────────── */
.nav-bar {
position: sticky;
top: 0;
z-index: 100;
background: rgba(242,242,247,0.9);
-webkit-backdrop-filter: blur(20px) saturate(180%);
backdrop-filter: blur(20px) saturate(180%);
border-bottom: 0.5px solid var(--separator);
padding: calc(var(--safe-top) + 12px) 20px 12px;
display: flex;
align-items: center;
gap: 12px;
}
.nav-back {
display: flex;
align-items: center;
gap: 4px;
color: var(--tint);
font-size: 17px;
font-weight: 400;
background: none;
border: none;
cursor: pointer;
padding: 4px 0;
font-family: var(--font);
}
.nav-back:active { opacity: 0.6; }
.nav-back-arrow { font-size: 20px; line-height: 1; }
.nav-title-center {
flex: 1;
text-align: center;
font-size: 17px;
font-weight: 600;
letter-spacing: -0.4px;
color: var(--label);
}
.nav-spacer { width: 60px; }
/* ── Progress Indicator ──────────────────────────────────────────────── */
.progress-steps {
display: flex;
justify-content: center;
gap: 6px;
padding: 12px 20px 8px;
}
.step-dot {
height: 4px;
border-radius: 2px;
background: var(--fill);
transition: all 0.3s ease;
}
.step-dot.active { background: var(--tint); width: 20px; }
.step-dot.done { background: var(--green); width: 12px; }
.step-dot.pending { width: 8px; }
/* ── Hero Area ────────────────────────────────────────────────────────── */
.hero {
padding: 32px 28px 20px;
text-align: center;
}
.hero-emoji {
font-size: 64px;
line-height: 1;
margin-bottom: 16px;
display: block;
}
.hero-title {
font-size: 28px;
font-weight: 700;
letter-spacing: -0.5px;
color: var(--label);
line-height: 1.2;
margin-bottom: 8px;
}
.hero-sub {
font-size: 16px;
color: var(--label-secondary);
line-height: 1.5;
}
/* ── Content Area ────────────────────────────────────────────────────── */
.content {
flex: 1;
padding: 0 16px;
overflow-y: auto;
}
/* ── Card ─────────────────────────────────────────────────────────────── */
.card {
background: var(--bg-card);
border-radius: var(--radius-lg);
overflow: hidden;
margin-bottom: 16px;
box-shadow: 0 1px 4px rgba(0,0,0,0.06);
}
/* ── Form fields ─────────────────────────────────────────────────────── */
.field-row {
display: flex;
flex-direction: column;
gap: 2px;
padding: 14px 16px;
border-bottom: 0.5px solid var(--separator);
}
.field-row:last-child { border-bottom: none; }
.field-label {
font-size: 12px;
font-weight: 500;
color: var(--label-secondary);
text-transform: uppercase;
letter-spacing: 0.4px;
}
.field-value {
font-size: 17px;
color: var(--label);
background: transparent;
border: none;
outline: none;
font-family: var(--font);
width: 100%;
padding: 0;
caret-color: var(--tint);
}
.field-value::placeholder { color: var(--label-tertiary); }
.field-value::-webkit-date-and-time-value { text-align: left; }
/* ── Toggle row ──────────────────────────────────────────────────────── */
.toggle-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 14px 16px;
border-bottom: 0.5px solid var(--separator);
}
.toggle-row:last-child { border-bottom: none; }
.toggle-label-group {}
.toggle-title { font-size: 17px; color: var(--label); }
.toggle-sub { font-size: 13px; color: var(--label-secondary); margin-top: 2px; }
.ios-toggle {
width: 51px;
height: 31px;
background: #e5e5ea;
border-radius: 16px;
position: relative;
cursor: pointer;
transition: background 0.25s;
flex-shrink: 0;
-webkit-user-select: none;
user-select: none;
border: none;
padding: 0;
}
.ios-toggle.on { background: var(--green); }
.ios-toggle::after {
content: '';
position: absolute;
top: 2px; left: 2px;
width: 27px; height: 27px;
border-radius: 50%;
background: #fff;
box-shadow: 0 2px 4px rgba(0,0,0,0.22);
transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.ios-toggle.on::after { transform: translateX(20px); }
/* ── Info row ────────────────────────────────────────────────────────── */
.info-row {
display: flex;
align-items: center;
gap: 14px;
padding: 14px 16px;
border-bottom: 0.5px solid var(--separator);
}
.info-row:last-child { border-bottom: none; }
.info-icon {
width: 36px; height: 36px;
border-radius: 10px;
display: flex; align-items: center; justify-content: center;
font-size: 18px;
flex-shrink: 0;
}
.info-body { flex: 1; }
.info-title { font-size: 15px; font-weight: 500; color: var(--label); }
.info-sub { font-size: 13px; color: var(--label-secondary); margin-top: 2px; }
.info-chevron { color: var(--label-tertiary); font-size: 14px; }
/* ── Upload zone ──────────────────────────────────────────────────────── */
.upload-zone {
border: 2px dashed rgba(0,122,255,0.35);
border-radius: var(--radius);
padding: 32px 16px;
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
cursor: pointer;
margin: 12px 16px;
background: rgba(0,122,255,0.04);
transition: all 0.15s;
}
.upload-zone:active { background: rgba(0,122,255,0.08); }
.upload-icon { font-size: 36px; }
.upload-title { font-size: 15px; font-weight: 600; color: var(--tint); }
.upload-sub { font-size: 13px; color: var(--label-secondary); }
/* ── Summary list ────────────────────────────────────────────────────── */
.summary-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 13px 16px;
border-bottom: 0.5px solid var(--separator);
}
.summary-row:last-child { border-bottom: none; }
.summary-key { font-size: 15px; color: var(--label-secondary); }
.summary-val { font-size: 15px; font-weight: 500; color: var(--label); }
/* ── Mission card ────────────────────────────────────────────────────── */
.mission-card {
background: var(--bg-card);
border-radius: var(--radius-lg);
overflow: hidden;
margin: 0 16px 12px;
box-shadow: 0 1px 4px rgba(0,0,0,0.06);
}
.mission-header {
background: linear-gradient(135deg, #007AFF, #5AC8FA);
padding: 20px 16px;
color: #fff;
}
.mission-type { font-size: 12px; font-weight: 600; opacity: 0.85; text-transform: uppercase; letter-spacing: 0.5px; }
.mission-title { font-size: 20px; font-weight: 700; letter-spacing: -0.4px; margin-top: 4px; }
.mission-loc { font-size: 14px; opacity: 0.85; margin-top: 4px; }
.mission-detail {
padding: 14px 16px;
border-bottom: 0.5px solid var(--separator);
display: flex;
align-items: center;
justify-content: space-between;
}
.mission-detail:last-child { border-bottom: none; }
.mission-detail-key { font-size: 14px; color: var(--label-secondary); }
.mission-detail-val { font-size: 15px; font-weight: 600; color: var(--label); }
/* ── CTA / Primary Button ────────────────────────────────────────────── */
.cta-area {
padding: 16px 16px calc(var(--safe-bottom) + 24px);
background: transparent;
}
.btn-primary {
width: 100%;
background: var(--tint);
color: #fff;
font-family: var(--font);
font-size: 17px;
font-weight: 600;
letter-spacing: -0.3px;
border: none;
border-radius: var(--radius-xl);
padding: 16px;
cursor: pointer;
transition: all 0.15s;
-webkit-user-select: none;
user-select: none;
}
.btn-primary:active { transform: scale(0.97); opacity: 0.9; }
.btn-primary.green { background: var(--green); }
.btn-primary.red { background: var(--red); }
.btn-secondary {
width: 100%;
background: transparent;
color: var(--tint);
font-family: var(--font);
font-size: 17px;
font-weight: 400;
border: none;
cursor: pointer;
padding: 12px 16px;
margin-top: 4px;
border-radius: var(--radius-xl);
transition: opacity 0.15s;
}
.btn-secondary:active { opacity: 0.5; }
/* ── BankID specific ─────────────────────────────────────────────────── */
.bankid-frame {
margin: 12px 16px;
background: var(--bg-card);
border-radius: var(--radius-lg);
padding: 28px 20px;
text-align: center;
box-shadow: 0 1px 4px rgba(0,0,0,0.06);
}
.bankid-logo {
width: 72px;
height: 72px;
background: linear-gradient(135deg, #235971, #4E9CC0);
border-radius: 18px;
display: flex;
align-items: center;
justify-content: center;
font-size: 36px;
margin: 0 auto 16px;
}
.bankid-title {
font-size: 20px;
font-weight: 700;
color: var(--label);
margin-bottom: 6px;
}
.bankid-sub {
font-size: 14px;
color: var(--label-secondary);
line-height: 1.5;
}
/* ── Spinner ──────────────────────────────────────────────────────────── */
@keyframes spin { to { transform: rotate(360deg); } }
.spinner-inline {
display: inline-block;
width: 20px; height: 20px;
border: 2px solid rgba(255,255,255,0.4);
border-top-color: #fff;
border-radius: 50%;
animation: spin 0.7s linear infinite;
vertical-align: middle;
margin-right: 8px;
}
/* ── Success screen ──────────────────────────────────────────────────── */
@keyframes successPop {
0% { transform: scale(0.4); opacity: 0; }
70% { transform: scale(1.15); }
100% { transform: scale(1); opacity: 1; }
}
.success-icon-wrap {
display: flex;
justify-content: center;
margin: 40px 0 20px;
}
.success-circle {
width: 96px; height: 96px;
border-radius: 50%;
background: var(--green);
display: flex; align-items: center; justify-content: center;
font-size: 48px;
color: #fff;
animation: successPop 0.5s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
}
/* ── Equipment chips ─────────────────────────────────────────────────── */
.chip-grid {
display: flex;
flex-wrap: wrap;
gap: 10px;
padding: 14px 16px;
}
.equip-chip {
display: flex;
align-items: center;
gap: 8px;
background: var(--fill);
border-radius: var(--radius);
padding: 10px 14px;
cursor: pointer;
border: 2px solid transparent;
transition: all 0.15s;
-webkit-user-select: none;
user-select: none;
}
.equip-chip.selected {
background: rgba(0,122,255,0.1);
border-color: var(--tint);
}
.equip-chip:active { opacity: 0.7; }
.equip-chip-icon { font-size: 22px; }
.equip-chip-label { font-size: 14px; font-weight: 500; color: var(--label); }
/* ── Section label ───────────────────────────────────────────────────── */
.form-section-title {
font-size: 13px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.6px;
color: var(--label-secondary);
padding: 20px 20px 8px;
}
@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>
<script src="i18n.js"></script>
<meta property="og:type" content="website">
<meta property="og:title" content="Zoomer Onboarding — quiXzoom">
<meta property="og:description" content="quiXzoom — Earn per Mission. No Platform Fee.">
<meta property="og:url" content="https://www.quixzoom.com/zoomer-onboarding-flow.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 Zoomer onboarding — how to get started">
<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="Zoomer Onboarding — quiXzoom">
</head>
<body>
<h1 style="position:absolute;left:-9999px;">Zoomer Onboarding Flow</h1>
<!-- ══════════════════════════════════════════════════════════════════════ -->
<!-- SCREEN 1: Welcome ────────────────────────────────────────────────── -->
<div class="screen active" id="screen-1">
<div class="hero" style="padding-top: calc(var(--safe-top) + 48px)">
<span class="hero-emoji"></span>
<div class="hero-title">Become a Zoomer</div>
<div class="hero-sub">Earn money with your photography skills. Accept missions, deliver results, get paid fast.</div>
</div>
<div class="content">
<div class="card">
<div class="info-row">
<div class="info-icon" style="background:#007AFF22">📸</div>
<div class="info-body">
<div class="info-title">Photograph missions</div>
<div class="info-sub">Shops, products, events in your city</div>
</div>
<span class="info-chevron"></span>
</div>
<div class="info-row">
<div class="info-icon" style="background:#34C75922">💰</div>
<div class="info-body">
<div class="info-title">Fast payout</div>
<div class="info-sub">Direct to your account via Stripe Connect</div>
</div>
<span class="info-chevron"></span>
</div>
<div class="info-row">
<div class="info-icon" style="background:#FF950022">🗺️</div>
<div class="info-body">
<div class="info-title">Your choice</div>
<div class="info-sub">Only accept missions that suit you</div>
</div>
<span class="info-chevron"></span>
</div>
</div>
</div>
<div class="cta-area">
<button class="btn-primary" onclick="goTo(2)">Get started →</button>
<button class="btn-secondary" onclick="goTo(2)">I already have an account</button>
</div>
</div>
<!-- ══════════════════════════════════════════════════════════════════════ -->
<!-- SCREEN 2: BankID Verification ────────────────────────────────────── -->
<div class="screen" id="screen-2">
<div class="nav-bar">
<button class="nav-back" onclick="goBack(1)"><span class="nav-back-arrow"></span> Back</button>
<div class="nav-title-center">Identity</div>
<div class="nav-spacer"></div>
</div>
<div class="progress-steps" id="steps-2"></div>
<div class="content">
<div class="hero" style="padding-top:20px">
<span class="hero-emoji">🏦</span>
<div class="hero-title">Verify with BankID</div>
<div class="hero-sub">We need to verify your identity so you can receive payments.</div>
</div>
<div class="bankid-frame">
<div class="bankid-logo">🔐</div>
<div class="bankid-title">Open the BankID app</div>
<div class="bankid-sub">Tap the button below to start BankID sign-in on this device.</div>
</div>
<div class="form-section-title">Your personal ID number</div>
<div class="card">
<div class="field-row">
<div class="field-label">Personal ID number</div>
<input class="field-value" type="tel" placeholder="YYYYMMDD-XXXX" maxlength="13" id="ssn-input" inputmode="numeric">
</div>
</div>
</div>
<div class="cta-area">
<button class="btn-primary" id="bankid-btn" onclick="startBankID()">Open BankID</button>
<button class="btn-secondary" onclick="goTo(3)">Simulate approved (demo)</button>
</div>
</div>
<!-- ══════════════════════════════════════════════════════════════════════ -->
<!-- SCREEN 3: Profile Setup ──────────────────────────────────────────── -->
<div class="screen" id="screen-3">
<div class="nav-bar">
<button class="nav-back" onclick="goBack(2)"><span class="nav-back-arrow"></span> Back</button>
<div class="nav-title-center">Your profile</div>
<div class="nav-spacer"></div>
</div>
<div class="progress-steps" id="steps-3"></div>
<div class="content">
<div class="hero" style="padding-top:20px">
<span class="hero-emoji">👤</span>
<div class="hero-title">Tell us about yourself</div>
<div class="hero-sub">Clients see your profile when choosing a Zoomer for their missions.</div>
</div>
<div class="card">
<div class="field-row">
<div class="field-label">First name</div>
<input class="field-value" type="text" placeholder="Alex" id="fname">
</div>
<div class="field-row">
<div class="field-label">Last name</div>
<input class="field-value" type="text" placeholder="Smith" id="lname">
</div>
<div class="field-row">
<div class="field-label">Email address</div>
<input class="field-value" type="email" placeholder="alex@example.com" id="email">
</div>
<div class="field-row">
<div class="field-label">Mobile number</div>
<input class="field-value" type="tel" placeholder="+46 70 123 45 67" id="phone">
</div>
</div>
<div class="form-section-title">About you</div>
<div class="card">
<div class="field-row">
<div class="field-label">Bio (optional)</div>
<input class="field-value" type="text" placeholder="Experienced photographer with a passion for urban environments…" id="bio">
</div>
<div class="field-row">
<div class="field-label">City</div>
<input class="field-value" type="text" placeholder="Stockholm" id="city">
</div>
</div>
</div>
<div class="cta-area">
<button class="btn-primary" onclick="goTo(4)">Continue →</button>
</div>
</div>
<!-- ══════════════════════════════════════════════════════════════════════ -->
<!-- SCREEN 4: Equipment Declaration ──────────────────────────────────── -->
<div class="screen" id="screen-4">
<div class="nav-bar">
<button class="nav-back" onclick="goBack(3)"><span class="nav-back-arrow"></span> Back</button>
<div class="nav-title-center">Your equipment</div>
<div class="nav-spacer"></div>
</div>
<div class="progress-steps" id="steps-4"></div>
<div class="content">
<div class="hero" style="padding-top:20px">
<span class="hero-emoji">📷</span>
<div class="hero-title">What equipment do you have?</div>
<div class="hero-sub">Select all equipment you can use on missions. More options → more missions.</div>
</div>
<div class="form-section-title">Camera</div>
<div class="card">
<div class="chip-grid">
<div class="equip-chip selected" onclick="toggleChip(this)">
<span class="equip-chip-icon">📱</span>
<span class="equip-chip-label">Smartphone</span>
</div>
<div class="equip-chip" onclick="toggleChip(this)">
<span class="equip-chip-icon">📸</span>
<span class="equip-chip-label">Mirrorless</span>
</div>
<div class="equip-chip" onclick="toggleChip(this)">
<span class="equip-chip-icon">🎥</span>
<span class="equip-chip-label">DSLR</span>
</div>
<div class="equip-chip" onclick="toggleChip(this)">
<span class="equip-chip-icon">🚁</span>
<span class="equip-chip-label">Drone</span>
</div>
</div>
</div>
<div class="form-section-title">Accessories</div>
<div class="card">
<div class="chip-grid">
<div class="equip-chip" onclick="toggleChip(this)">
<span class="equip-chip-icon">🕯️</span>
<span class="equip-chip-label">Flash</span>
</div>
<div class="equip-chip" onclick="toggleChip(this)">
<span class="equip-chip-icon">🔦</span>
<span class="equip-chip-label">Lighting</span>
</div>
<div class="equip-chip" onclick="toggleChip(this)">
<span class="equip-chip-icon">📐</span>
<span class="equip-chip-label">Tripod</span>
</div>
</div>
</div>
<div class="form-section-title">Settings</div>
<div class="card">
<div class="toggle-row">
<div class="toggle-label-group">
<div class="toggle-title">Available now</div>
<div class="toggle-sub">Show that you can take missions immediately</div>
</div>
<button class="ios-toggle on" onclick="this.classList.toggle('on')"></button>
</div>
<div class="toggle-row">
<div class="toggle-label-group">
<div class="toggle-title">Push notifications</div>
<div class="toggle-sub">Get notified about new missions nearby</div>
</div>
<button class="ios-toggle on" onclick="this.classList.toggle('on')"></button>
</div>
</div>
</div>
<div class="cta-area">
<button class="btn-primary" onclick="goTo(5)">Continue →</button>
</div>
</div>
<!-- ══════════════════════════════════════════════════════════════════════ -->
<!-- SCREEN 5: KYC Document Upload ────────────────────────────────────── -->
<div class="screen" id="screen-5">
<div class="nav-bar">
<button class="nav-back" onclick="goBack(4)"><span class="nav-back-arrow"></span> Back</button>
<div class="nav-title-center">ID verification</div>
<div class="nav-spacer"></div>
</div>
<div class="progress-steps" id="steps-5"></div>
<div class="content">
<div class="hero" style="padding-top:20px">
<span class="hero-emoji">🪪</span>
<div class="hero-title">Upload ID document</div>
<div class="hero-sub">Required by law to verify your identity and enable payouts.</div>
</div>
<div class="form-section-title">Accepted documents</div>
<div class="card">
<div class="info-row" onclick="markDoc('passport', this)" style="cursor:pointer">
<div class="info-icon" style="background:#007AFF22" id="doc-passport-icon">📘</div>
<div class="info-body">
<div class="info-title">Passport</div>
<div class="info-sub">Valid passport with photo page</div>
</div>
<span class="info-chevron" id="doc-passport-check"></span>
</div>
<div class="info-row" onclick="markDoc('id', this)" style="cursor:pointer">
<div class="info-icon" style="background:#AF52DE22" id="doc-id-icon">🪪</div>
<div class="info-body">
<div class="info-title">National ID card</div>
<div class="info-sub">Front and back</div>
</div>
<span class="info-chevron" id="doc-id-check"></span>
</div>
<div class="info-row" onclick="markDoc('license', this)" style="cursor:pointer">
<div class="info-icon" style="background:#34C75922" id="doc-license-icon">🚗</div>
<div class="info-body">
<div class="info-title">Driving licence</div>
<div class="info-sub">Valid driving licence</div>
</div>
<span class="info-chevron" id="doc-license-check"></span>
</div>
</div>
<div class="upload-zone" onclick="simulateUpload()">
<span class="upload-icon" id="upload-icon">📎</span>
<span class="upload-title" id="upload-title">Choose file or take photo</span>
<span class="upload-sub" id="upload-sub">JPG, PNG eller PDF · Max 10 MB</span>
</div>
<div class="form-section-title">Bank details</div>
<div class="card">
<div class="field-row">
<div class="field-label">Stripe Connect</div>
<input class="field-value" type="tel" placeholder="3300" inputmode="numeric">
</div>
<div class="field-row">
<div class="field-label">Account number</div>
<input class="field-value" type="tel" placeholder="123456789" inputmode="numeric">
</div>
</div>
</div>
<div class="cta-area">
<button class="btn-primary" onclick="goTo(6)">Submit →</button>
</div>
</div>
<!-- ══════════════════════════════════════════════════════════════════════ -->
<!-- SCREEN 6: First Mission ──────────────────────────────────────────── -->
<div class="screen" id="screen-6">
<div class="nav-bar">
<button class="nav-back" onclick="goBack(5)"><span class="nav-back-arrow"></span> Back</button>
<div class="nav-title-center">Your first mission</div>
<div class="nav-spacer"></div>
</div>
<div class="progress-steps" id="steps-6"></div>
<div class="content" style="padding:0">
<div class="hero" style="padding-top:20px">
<span class="hero-emoji">🎯</span>
<div class="hero-title">Ready for your first mission?</div>
<div class="hero-sub">We found a mission near you!</div>
</div>
<div class="mission-card">
<div class="mission-header">
<div class="mission-type">📸 Store photography</div>
<div class="mission-title">H&M Flagship — Stockholm</div>
<div class="mission-loc">📍 Drottninggatan 55, Stockholm · 1.2 km away</div>
</div>
<div class="mission-detail">
<span class="mission-detail-key">Compensation</span>
<span class="mission-detail-val" style="color:var(--green)">380 kr</span>
</div>
<div class="mission-detail">
<span class="mission-detail-key">Time</span>
<span class="mission-detail-val">4560 min</span>
</div>
<div class="mission-detail">
<span class="mission-detail-key">Number of photos</span>
<span class="mission-detail-val">12 photos</span>
</div>
<div class="mission-detail">
<span class="mission-detail-key">Deadline</span>
<span class="mission-detail-val">Today 18:00</span>
</div>
<div class="mission-detail">
<span class="mission-detail-key">Requirements</span>
<span class="mission-detail-val">Smartphone OK</span>
</div>
</div>
<div style="padding: 0 16px 4px">
<div class="card">
<div class="summary-row">
<span class="summary-key">Client</span>
<span class="summary-val">H&M Sverige AB</span>
</div>
<div class="summary-row">
<span class="summary-key">Rating</span>
<span class="summary-val">⭐ 4.9 (47 missions)</span>
</div>
<div class="summary-row">
<span class="summary-key">Payout</span>
<span class="summary-val">Within 24h of approval</span>
</div>
</div>
</div>
</div>
<div class="cta-area">
<button class="btn-primary green" onclick="goTo(7)">✓ Accept mission</button>
<button class="btn-secondary" onclick="goTo(7)">View more missions</button>
</div>
</div>
<!-- ══════════════════════════════════════════════════════════════════════ -->
<!-- SCREEN 7: Success ────────────────────────────────────────────────── -->
<div class="screen" id="screen-7">
<div class="nav-bar" style="justify-content:center">
<div class="nav-title-center" style="color:var(--green)">🎉 Welcome!</div>
</div>
<div class="content" style="display:flex; flex-direction:column; align-items:center; text-align:center; padding-top:0">
<div class="success-icon-wrap">
<div class="success-circle"></div>
</div>
<div style="padding:0 28px 20px">
<div class="hero-title" style="margin-bottom:8px">You are now a Zoomer!</div>
<div class="hero-sub">Mission accepted. Head to the location and photograph according to the instructions.</div>
</div>
<div style="width:100%; padding:0 16px">
<div class="card">
<div class="summary-row">
<span class="summary-key">Status</span>
<span class="summary-val" style="color:var(--green)">✓ Active Zoomer</span>
</div>
<div class="summary-row">
<span class="summary-key">BankID</span>
<span class="summary-val" style="color:var(--green)">✓ Verifierad</span>
</div>
<div class="summary-row">
<span class="summary-key">KYC</span>
<span class="summary-val" style="color:var(--yellow)">⏳ Review in progress</span>
</div>
<div class="summary-row">
<span class="summary-key">First mission</span>
<span class="summary-val">H&M Stockholm</span>
</div>
<div class="summary-row">
<span class="summary-key">Expected earnings</span>
<span class="summary-val" style="color:var(--green)">380 kr</span>
</div>
</div>
</div>
<div style="padding:24px 28px 0; color:var(--label-secondary); font-size:14px; line-height:1.6">
📲 You will receive a confirmation email. Open the quiXzoom app to see details about your mission.
</div>
</div>
<div class="cta-area">
<button class="btn-primary" onclick="goTo(1)">Open the app →</button>
<button class="btn-secondary" onclick="goTo(1)">Restart demo</button>
</div>
</div>
<script>
// ── State ──────────────────────────────────────────────────────────────
const TOTAL_STEPS = 6; // screens 2-7
let currentScreen = 1;
let bankIDTimer = null;
// ── Navigation ─────────────────────────────────────────────────────────
function goTo(n, direction = 'right') {
const curr = document.getElementById(`screen-${currentScreen}`);
const next = document.getElementById(`screen-${n}`);
if (!next) return;
curr.classList.remove('active', 'slide-in-right', 'slide-in-left');
curr.style.display = 'none';
next.style.display = 'flex';
next.classList.add('active', direction === 'right' ? 'slide-in-right' : 'slide-in-left');
currentScreen = n;
renderSteps(n);
window.scrollTo(0, 0);
}
function goBack(n) {
goTo(n, 'left');
}
// ── Step dots ──────────────────────────────────────────────────────────
function renderSteps(screenN) {
if (screenN < 2) return;
const step = screenN - 1; // step 1..6
const el = document.getElementById(`steps-${screenN}`);
if (!el) return;
el.innerHTML = Array.from({length: TOTAL_STEPS}, (_, i) => {
const s = i + 1;
const cls = s < step ? 'done' : s === step ? 'active' : 'pending';
return `<div class="step-dot ${cls}"></div>`;
}).join('');
}
// ── BankID simulation ──────────────────────────────────────────────────
function startBankID() {
const btn = document.getElementById('bankid-btn');
btn.innerHTML = '<span class="spinner-inline"></span>Waiting for BankID…';
btn.disabled = true;
btn.style.opacity = '0.7';
clearTimeout(bankIDTimer);
bankIDTimer = setTimeout(() => {
btn.innerHTML = 'Open BankID';
btn.disabled = false;
btn.style.opacity = '1';
goTo(3);
}, 2500);
}
// ── Equipment chip toggle ──────────────────────────────────────────────
function toggleChip(el) {
el.classList.toggle('selected');
}
// ── Document selection ─────────────────────────────────────────────────
let selectedDoc = null;
function markDoc(type, row) {
['passport','id','license'].forEach(t => {
document.getElementById(`doc-${t}-check`).textContent = '';
});
selectedDoc = type;
document.getElementById(`doc-${type}-check`).textContent = '✓';
}
// ── Upload simulation ──────────────────────────────────────────────────
function simulateUpload() {
const icon = document.getElementById('upload-icon');
const title = document.getElementById('upload-title');
const sub = document.getElementById('upload-sub');
icon.textContent = '✅';
title.textContent = 'File uploaded';
sub.textContent = 'id_dokument.jpg · 2.4 MB';
}
// ── Init ──────────────────────────────────────────────────────────────
renderSteps(1);
</script>
</body>
</html>