Files
boc/academy-lesson-template.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

450 lines
10 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.0">
<title>Lektion: {{LESSON_TITLE}} — quiXzoom Academy</title>
<style>
:root {
--qx-black: #0a0a0a;
--qx-white: #ffffff;
--qx-blue: #0066FF;
--qx-green: #00C853;
--qx-gray: #F5F5F7;
--qx-dark-gray: #1a1a1a;
--qx-text-muted: #6e6e73;
--qx-purple: #7B61FF;
--qx-orange: #FF6B35;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Helvetica Neue', sans-serif;
color: var(--qx-black);
background: var(--qx-white);
line-height: 1.6;
}
/* Progress Bar */
.progress-container {
position: sticky;
top: 0;
background: white;
padding: 12px 20px;
border-bottom: 1px solid var(--qx-gray);
z-index: 100;
}
.progress-bar {
max-width: 600px;
margin: 0 auto;
background: var(--qx-gray);
border-radius: 10px;
height: 8px;
overflow: hidden;
}
.progress-fill {
background: var(--qx-green);
height: 100%;
width: 0%;
transition: width 0.5s ease;
}
/* Lesson Content */
.lesson-container {
max-width: 800px;
margin: 0 auto;
padding: 40px 20px;
}
.lesson-header {
margin-bottom: 40px;
}
.lesson-module {
color: var(--qx-blue);
font-size: 0.875rem;
text-transform: uppercase;
letter-spacing: 2px;
margin-bottom: 8px;
}
.lesson-title {
font-size: 2.5rem;
margin-bottom: 16px;
}
.lesson-meta {
color: var(--qx-text-muted);
font-size: 0.9rem;
}
/* Content Blocks */
.content-block {
margin-bottom: 40px;
}
.content-block h2 {
font-size: 1.5rem;
margin-bottom: 16px;
color: var(--qx-black);
}
.content-block p {
margin-bottom: 16px;
color: #333;
font-size: 1.05rem;
}
.content-block ul {
margin-left: 24px;
margin-bottom: 16px;
}
.content-block li {
margin-bottom: 8px;
}
/* Tip Box */
.tip-box {
background: #e8f4fd;
border-left: 4px solid var(--qx-blue);
padding: 20px;
margin: 24px 0;
border-radius: 0 12px 12px 0;
}
.tip-box strong {
color: var(--qx-blue);
}
/* Warning Box */
.warning-box {
background: #fff3cd;
border-left: 4px solid var(--qx-orange);
padding: 20px;
margin: 24px 0;
border-radius: 0 12px 12px 0;
}
.warning-box strong {
color: var(--qx-orange);
}
/* Example Box */
.example-box {
background: var(--qx-gray);
padding: 24px;
border-radius: 12px;
margin: 24px 0;
}
.example-box h4 {
margin-bottom: 12px;
color: var(--qx-dark-gray);
}
/* Image Comparison */
.image-comparison {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
margin: 24px 0;
}
.image-item {
text-align: center;
}
.image-item img {
width: 100%;
border-radius: 8px;
margin-bottom: 8px;
}
.image-label {
font-size: 0.875rem;
font-weight: 600;
}
.image-label.good { color: var(--qx-green); }
.image-label.bad { color: #ff4444; }
/* Quiz */
.quiz-container {
background: var(--qx-gray);
padding: 32px;
border-radius: 16px;
margin: 32px 0;
}
.quiz-question {
font-size: 1.25rem;
font-weight: 600;
margin-bottom: 24px;
}
.quiz-options {
list-style: none;
}
.quiz-option {
background: white;
padding: 16px 20px;
margin-bottom: 12px;
border-radius: 12px;
cursor: pointer;
transition: all 0.2s;
border: 2px solid transparent;
}
.quiz-option:hover {
border-color: var(--qx-blue);
transform: translateX(4px);
}
.quiz-option.correct {
background: var(--qx-green);
color: white;
border-color: var(--qx-green);
}
.quiz-option.wrong {
background: #ff4444;
color: white;
border-color: #ff4444;
}
.quiz-option.disabled {
pointer-events: none;
opacity: 0.7;
}
.quiz-feedback {
margin-top: 16px;
padding: 16px;
border-radius: 8px;
display: none;
}
.quiz-feedback.show { display: block; }
/* Navigation */
.lesson-nav {
display: flex;
justify-content: space-between;
margin-top: 60px;
padding-top: 40px;
border-top: 1px solid var(--qx-gray);
}
.nav-btn {
padding: 12px 24px;
border-radius: 8px;
text-decoration: none;
font-weight: 600;
transition: all 0.2s;
}
.nav-btn.prev {
background: var(--qx-gray);
color: var(--qx-black);
}
.nav-btn.next {
background: var(--qx-blue);
color: white;
}
.nav-btn:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
}
/* Complete Button */
.complete-btn {
display: block;
width: 100%;
max-width: 400px;
margin: 40px auto;
padding: 16px 32px;
background: var(--qx-green);
color: white;
border: none;
border-radius: 12px;
font-size: 1.1rem;
font-weight: 600;
cursor: pointer;
transition: all 0.2s;
}
.complete-btn:hover {
transform: translateY(-2px);
box-shadow: 0 4px 16px rgba(0,200,83,0.3);
}
.complete-btn.completed {
background: var(--qx-gray);
color: var(--qx-text-muted);
cursor: default;
}
/* Responsive */
@media (max-width: 768px) {
.lesson-title { font-size: 1.75rem; }
.image-comparison { grid-template-columns: 1fr; }
}
</style>
</head>
<body>
<div class="progress-container">
<div class="progress-bar">
<div class="progress-fill" id="lessonProgress"></div>
</div>
</div>
<div class="lesson-container">
<header class="lesson-header">
<div class="lesson-module">Modul 01 — Kom igång</div>
<h1 class="lesson-title">Välkommen till quiXzoom</h1>
<div class="lesson-meta">⏱️ 5 minuter · 🎯 Nybörjare</div>
</header>
<div class="content-block">
<h2>Vad är quiXzoom?</h2>
<p>quiXzoom är en crowdsourcing-plattform där du som <strong>Zoomer</strong> fotograferar infrastruktur, fastigheter och miljöer — och får betalt för varje godkänt uppdrag.</p>
<p>Tänk dig Uber, men istället för att köra människor fotograferar du platser. Du väljer helt själv när och var du vill arbeta.</p>
</div>
<div class="tip-box">
<strong>💡 Visste du?</strong> De mest aktiva Zoomers tjänar mellan 8 00015 000 kr per månad. Vissa gör det på heltid, andra som ett flexibelt extrajobb.
</div>
<div class="content-block">
<h2>Så här fungerar det</h2>
<ol>
<li><strong>Hitta uppdrag</strong> — Öppna appen och se tillgängliga uppdrag nära dig</li>
<li><strong>Fotografera</strong> — Följ instruktionerna och ta bilder med din smartphone</li>
<li><strong>Skicka in</strong> — Ladda upp bilderna direkt i appen</li>
<li><strong>Få betalt</strong> — Godkända uppdrag betalas ut varje måndag</li>
</ol>
</div>
<div class="example-box">
<h4>Exempel på uppdrag</h4>
<p><strong>Broinspektion i Stockholm:</strong> Fotografera 12 bilder av en bro från olika vinklar. Uppdraget tar cirka 20 minuter och betalar 350 kr.</p>
</div>
<div class="content-block">
<h2>Vad du behöver</h2>
<ul>
<li>📱 Smartphone med kamera (iPhone 12+ eller Android med 12MP+)</li>
<li>🏦 Svenskt bankkonto för utbetalningar</li>
<li>🆔 ID-handling (pass, körkort eller nationellt ID)</li>
<li>📶 Mobildata eller WiFi för att ladda upp bilder</li>
</ul>
</div>
<div class="warning-box">
<strong>⚠️ Viktigt:</strong> Du behöver INTE en professionell kamera. Din smartphone räcker alldeles utmärkt. Det viktiga är att bilderna är skarpa, välexponerade och följer instruktionerna.
</div>
<div class="quiz-container">
<div class="quiz-question">Vad behöver du minst för att bli Zoomer?</div>
<ul class="quiz-options">
<li class="quiz-option" onclick="checkAnswer(this, false)">
Professionell kamera och stativ
</li>
<li class="quiz-option" onclick="checkAnswer(this, true)">
Smartphone med kamera och svenskt bankkonto
</li>
<li class="quiz-option" onclick="checkAnswer(this, false)">
Egen bil och körkort
</li>
<li class="quiz-option" onclick="checkAnswer(this, false)">
Arbetsvisum och personnummer
</li>
</ul>
<div class="quiz-feedback" id="quizFeedback"></div>
</div>
<button class="complete-btn" id="completeBtn" onclick="completeLesson()">
✅ Markera lektion som klar
</button>
<nav class="lesson-nav">
<a href="/academy" class="nav-btn prev">← Tillbaka till Academy</a>
<a href="/academy/module1/lesson2" class="nav-btn next">Nästa lektion →</a>
</nav>
</div>
<script>
// Progress
const lessonId = 'm1l1';
const totalLessons = 24;
let completedLessons = JSON.parse(localStorage.getItem('academyProgress') || '[]');
function updateProgress() {
const completed = completedLessons.length;
const percentage = Math.round((completed / totalLessons) * 100);
document.getElementById('lessonProgress').style.width = percentage + '%';
}
// Quiz
function checkAnswer(element, isCorrect) {
const options = document.querySelectorAll('.quiz-option');
const feedback = document.getElementById('quizFeedback');
options.forEach(opt => opt.classList.add('disabled'));
if (isCorrect) {
element.classList.add('correct');
feedback.innerHTML = '<strong>✅ Rätt!</strong> Du behöver bara en smartphone och ett bankkonto för att komma igång.';
feedback.style.background = '#d4edda';
feedback.style.color = '#155724';
} else {
element.classList.add('wrong');
feedback.innerHTML = '<strong>❌ Inte riktigt.</strong> Professionell utrustning eller bil krävs inte. En smartphone räcker!';
feedback.style.background = '#f8d7da';
feedback.style.color = '#721c24';
}
feedback.classList.add('show');
}
// Complete lesson
function completeLesson() {
if (!completedLessons.includes(lessonId)) {
completedLessons.push(lessonId);
localStorage.setItem('academyProgress', JSON.stringify(completedLessons));
updateProgress();
const btn = document.getElementById('completeBtn');
btn.textContent = '✅ Lektion klar!';
btn.classList.add('completed');
btn.disabled = true;
// Celebration animation
btn.style.transform = 'scale(1.05)';
setTimeout(() => btn.style.transform = 'scale(1)', 200);
}
}
// Check if already completed
if (completedLessons.includes(lessonId)) {
const btn = document.getElementById('completeBtn');
btn.textContent = '✅ Lektion klar!';
btn.classList.add('completed');
btn.disabled = true;
}
updateProgress();
</script>
</body>
</html>