| <!DOCTYPE html> |
| <html lang="en" class="dark"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Web3 Africa - Learn Blockchain & Crypto</title> |
| <script src="https://cdn.tailwindcss.com"></script> |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
| <script> |
| tailwind.config = { |
| darkMode: 'class', |
| theme: { |
| extend: { |
| colors: { |
| africa: { |
| dark: '#000000', |
| red: '#E30613', |
| yellow: '#FCD116', |
| green: '#008751', |
| orange: '#EF7D00', |
| } |
| } |
| } |
| } |
| } |
| </script> |
| <style> |
| @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap'); |
| |
| body { |
| font-family: 'Poppins', sans-serif; |
| background-color: #000; |
| color: #fff; |
| min-height: 100vh; |
| } |
| |
| .gradient-bg { |
| background: linear-gradient(135deg, #000000 0%, #E30613 50%, #FCD116 100%); |
| } |
| |
| .course-card:hover { |
| transform: translateY(-5px); |
| box-shadow: 0 10px 25px rgba(239, 125, 0, 0.3); |
| } |
| |
| .progress-ring__circle { |
| transition: stroke-dashoffset 0.35s; |
| transform: rotate(-90deg); |
| transform-origin: 50% 50%; |
| } |
| |
| .wallet-connected { |
| animation: pulse 2s infinite; |
| } |
| |
| @keyframes pulse { |
| 0% { |
| box-shadow: 0 0 0 0 rgba(239, 125, 0, 0.7); |
| } |
| 70% { |
| box-shadow: 0 0 0 10px rgba(239, 125, 0, 0); |
| } |
| 100% { |
| box-shadow: 0 0 0 0 rgba(239, 125, 0, 0); |
| } |
| } |
| |
| |
| .mobile-menu { |
| transition: all 0.3s ease-in-out; |
| } |
| |
| .mobile-menu-hidden { |
| transform: translateX(100%); |
| opacity: 0; |
| } |
| |
| .mobile-menu-visible { |
| transform: translateX(0); |
| opacity: 1; |
| } |
| |
| |
| .spinner { |
| animation: spin 1s linear infinite; |
| } |
| |
| @keyframes spin { |
| 0% { transform: rotate(0deg); } |
| 100% { transform: rotate(360deg); } |
| } |
| </style> |
| </head> |
| <body class="bg-africa-dark text-white"> |
| |
| <script> |
| |
| const db = { |
| users: [], |
| courses: [ |
| { |
| id: 'course-1', |
| title: 'Blockchain Fundamentals', |
| description: 'Learn the basics of blockchain technology and how it works.', |
| level: 'Beginner', |
| duration: '2 weeks', |
| modules: [ |
| { |
| id: 'module-1-1', |
| title: 'What is Blockchain?', |
| content: 'Blockchain is a decentralized, distributed ledger technology that records transactions across many computers...', |
| videoUrl: '', |
| imageUrl: '', |
| quiz: { |
| questions: [ |
| { |
| id: 'q1', |
| text: 'What is the main characteristic of blockchain?', |
| options: [ |
| 'Centralized control', |
| 'Decentralized ledger', |
| 'Single point of failure', |
| 'Mutable records' |
| ], |
| correctAnswer: 1 |
| } |
| ] |
| } |
| } |
| ], |
| imageUrl: '' |
| }, |
| { |
| id: 'course-2', |
| title: 'Smart Contracts 101', |
| description: 'Introduction to writing and deploying smart contracts on Ethereum.', |
| level: 'Intermediate', |
| duration: '3 weeks', |
| modules: [], |
| imageUrl: '' |
| } |
| ], |
| jobs: [ |
| { |
| id: 'job-1', |
| title: 'Blockchain Developer', |
| company: 'AfriChain Labs', |
| location: 'Remote', |
| description: 'We are looking for a skilled blockchain developer to join our team...' |
| } |
| ] |
| }; |
| |
| |
| let currentUser = null; |
| let isAdmin = false; |
| let walletConnected = false; |
| |
| |
| const api = { |
| login: (email, password) => { |
| |
| const user = db.users.find(u => u.email === email && u.password === password); |
| if (user) { |
| currentUser = user; |
| return { success: true, user }; |
| } |
| return { success: false, message: 'Invalid credentials' }; |
| }, |
| |
| signup: (email, password, name) => { |
| |
| if (db.users.some(u => u.email === email)) { |
| return { success: false, message: 'Email already registered' }; |
| } |
| |
| const newUser = { |
| id: `user-${db.users.length + 1}`, |
| email, |
| password, |
| name, |
| progress: {}, |
| savedResources: [], |
| joinedAt: new Date().toISOString() |
| }; |
| |
| db.users.push(newUser); |
| currentUser = newUser; |
| return { success: true, user: newUser }; |
| }, |
| |
| connectWallet: () => { |
| |
| walletConnected = true; |
| |
| if (!currentUser) { |
| |
| const newUser = { |
| id: `wallet-user-${Date.now()}`, |
| walletAddress: '0x123...abc', |
| name: 'Wallet User', |
| progress: {}, |
| savedResources: [], |
| joinedAt: new Date().toISOString() |
| }; |
| |
| db.users.push(newUser); |
| currentUser = newUser; |
| } |
| |
| return { success: true, user: currentUser }; |
| }, |
| |
| getCourses: () => { |
| return db.courses; |
| }, |
| |
| getCourse: (id) => { |
| return db.courses.find(c => c.id === id); |
| }, |
| |
| saveProgress: (userId, courseId, moduleId, quizScore) => { |
| if (!currentUser) return { success: false }; |
| |
| if (!currentUser.progress[courseId]) { |
| currentUser.progress[courseId] = { completedModules: [], quizScores: {} }; |
| } |
| |
| if (!currentUser.progress[courseId].completedModules.includes(moduleId)) { |
| currentUser.progress[courseId].completedModules.push(moduleId); |
| } |
| |
| if (quizScore !== undefined) { |
| currentUser.progress[courseId].quizScores[moduleId] = quizScore; |
| } |
| |
| return { success: true }; |
| }, |
| |
| getJobs: () => { |
| return db.jobs; |
| } |
| }; |
| </script> |
|
|
| |
| <div id="app" class="min-h-screen flex flex-col"> |
| |
| <header class="bg-africa-dark border-b border-africa-orange/20"> |
| <div class="container mx-auto px-4 py-3 flex justify-between items-center"> |
| <div class="flex items-center space-x-2"> |
| <div class="w-10 h-10 rounded-full bg-gradient-to-br from-africa-red to-africa-yellow flex items-center justify-center"> |
| <span class="font-bold text-africa-dark">W3A</span> |
| </div> |
| <h1 class="text-xl font-bold bg-clip-text text-transparent bg-gradient-to-r from-africa-yellow to-africa-orange"> |
| Web3Africa |
| </h1> |
| </div> |
| |
| <div class="hidden md:flex items-center space-x-6"> |
| <nav class="flex space-x-6"> |
| <a href="#" onclick="showView('home')" class="hover:text-africa-yellow transition">Home</a> |
| <a href="#" onclick="showView('courses')" class="hover:text-africa-yellow transition">Courses</a> |
| <a href="#" onclick="showView('career')" class="hover:text-africa-yellow transition">Career</a> |
| <a href="#" onclick="showView('about')" class="hover:text-africa-yellow transition">About</a> |
| </nav> |
| |
| <div class="flex items-center space-x-4"> |
| <button id="wallet-btn" onclick="connectWallet()" |
| class="px-4 py-2 rounded-full border border-africa-orange text-africa-orange hover:bg-africa-orange hover:text-africa-dark transition flex items-center space-x-2"> |
| <i class="fab fa-ethereum"></i> |
| <span>Connect Wallet</span> |
| </button> |
| |
| <button id="auth-btn" onclick="showView('login')" |
| class="px-4 py-2 rounded-full bg-africa-orange text-africa-dark hover:bg-africa-yellow transition"> |
| Sign In |
| </button> |
| |
| <button onclick="toggleDarkMode()" class="p-2 rounded-full hover:bg-africa-orange/20 transition"> |
| <i class="fas fa-moon"></i> |
| </button> |
| </div> |
| </div> |
| |
| <button id="mobile-menu-btn" onclick="toggleMobileMenu()" class="md:hidden p-2 rounded-full hover:bg-africa-orange/20 transition"> |
| <i class="fas fa-bars text-xl"></i> |
| </button> |
| </div> |
| </header> |
| |
| |
| <div id="mobile-menu" class="mobile-menu mobile-menu-hidden fixed inset-0 bg-africa-dark z-50 p-6 transition-all duration-300"> |
| <div class="flex justify-between items-center mb-8"> |
| <div class="flex items-center space-x-2"> |
| <div class="w-10 h-10 rounded-full bg-gradient-to-br from-africa-red to-africa-yellow flex items-center justify-center"> |
| <span class="font-bold text-africa-dark">W3A</span> |
| </div> |
| <h1 class="text-xl font-bold bg-clip-text text-transparent bg-gradient-to-r from-africa-yellow to-africa-orange"> |
| Web3Africa |
| </h1> |
| </div> |
| <button onclick="toggleMobileMenu()" class="p-2 rounded-full hover:bg-africa-orange/20 transition"> |
| <i class="fas fa-times text-xl"></i> |
| </button> |
| </div> |
| |
| <nav class="flex flex-col space-y-6 mb-8"> |
| <a href="#" onclick="showView('home'); toggleMobileMenu()" class="text-xl hover:text-africa-yellow transition">Home</a> |
| <a href="#" onclick="showView('courses'); toggleMobileMenu()" class="text-xl hover:text-africa-yellow transition">Courses</a> |
| <a href="#" onclick="showView('career'); toggleMobileMenu()" class="text-xl hover:text-africa-yellow transition">Career</a> |
| <a href="#" onclick="showView('about'); toggleMobileMenu()" class="text-xl hover:text-africa-yellow transition">About</a> |
| </nav> |
| |
| <div class="flex flex-col space-y-4"> |
| <button id="mobile-wallet-btn" onclick="connectWallet(); toggleMobileMenu()" |
| class="px-6 py-3 rounded-full border border-africa-orange text-africa-orange hover:bg-africa-orange hover:text-africa-dark transition flex items-center justify-center space-x-2"> |
| <i class="fab fa-ethereum"></i> |
| <span>Connect Wallet</span> |
| </button> |
| |
| <button id="mobile-auth-btn" onclick="showView('login'); toggleMobileMenu()" |
| class="px-6 py-3 rounded-full bg-africa-orange text-africa-dark hover:bg-africa-yellow transition"> |
| Sign In |
| </button> |
| |
| <button onclick="toggleDarkMode(); toggleMobileMenu()" class="px-6 py-3 rounded-full border border-africa-orange/50 hover:bg-africa-orange/20 transition flex items-center justify-center space-x-2"> |
| <i class="fas fa-moon"></i> |
| <span>Toggle Theme</span> |
| </button> |
| </div> |
| </div> |
| |
| |
| <main class="flex-grow container mx-auto px-4 py-8"> |
| |
| <div id="home-view" class="view"> |
| <section class="mb-16"> |
| <div class="gradient-bg rounded-3xl p-8 md:p-12 text-center"> |
| <h1 class="text-4xl md:text-6xl font-bold mb-6">Empowering Africa with Web3 Knowledge</h1> |
| <p class="text-xl md:text-2xl mb-8 max-w-3xl mx-auto">Free, accessible education on blockchain, cryptocurrency, and decentralized technologies for Africans.</p> |
| <div class="flex flex-col md:flex-row justify-center space-y-4 md:space-y-0 md:space-x-4"> |
| <button onclick="showView('courses')" class="px-8 py-4 rounded-full bg-africa-orange text-africa-dark hover:bg-africa-yellow font-bold transition">Explore Courses</button> |
| <button onclick="showView('career')" class="px-8 py-4 rounded-full border-2 border-white hover:bg-white hover:text-africa-dark font-bold transition">Career Resources</button> |
| </div> |
| </div> |
| </section> |
| |
| <section class="mb-16"> |
| <h2 class="text-3xl font-bold mb-8 text-center">Why Learn Web3?</h2> |
| <div class="grid grid-cols-1 md:grid-cols-3 gap-8"> |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-xl p-6 hover:border-africa-orange transition"> |
| <div class="w-14 h-14 rounded-full bg-africa-red flex items-center justify-center mb-4"> |
| <i class="fas fa-university text-2xl"></i> |
| </div> |
| <h3 class="text-xl font-bold mb-2">Financial Inclusion</h3> |
| <p class="text-gray-300">Web3 technologies provide access to financial services for the unbanked population across Africa.</p> |
| </div> |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-xl p-6 hover:border-africa-orange transition"> |
| <div class="w-14 h-14 rounded-full bg-africa-yellow flex items-center justify-center mb-4"> |
| <i class="fas fa-briefcase text-2xl text-africa-dark"></i> |
| </div> |
| <h3 class="text-xl font-bold mb-2">Career Opportunities</h3> |
| <p class="text-gray-300">Blockchain developers are in high demand globally with competitive salaries.</p> |
| </div> |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-xl p-6 hover:border-africa-orange transition"> |
| <div class="w-14 h-14 rounded-full bg-africa-green flex items-center justify-center mb-4"> |
| <i class="fas fa-globe-africa text-2xl"></i> |
| </div> |
| <h3 class="text-xl font-bold mb-2">African Innovation</h3> |
| <p class="text-gray-300">Be part of the movement building Africa's decentralized future.</p> |
| </div> |
| </div> |
| </section> |
| |
| <section class="mb-16"> |
| <h2 class="text-3xl font-bold mb-8 text-center">Featured Courses</h2> |
| <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6" id="featured-courses"> |
| |
| </div> |
| <div class="text-center mt-8"> |
| <button onclick="showView('courses')" class="px-6 py-3 rounded-full bg-africa-orange text-africa-dark hover:bg-africa-yellow font-bold transition">View All Courses</button> |
| </div> |
| </section> |
| |
| <section> |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-xl p-8 md:p-12"> |
| <div class="flex flex-col md:flex-row items-center"> |
| <div class="md:w-1/2 mb-8 md:mb-0 md:pr-8"> |
| <h2 class="text-3xl font-bold mb-4">Ready to start your Web3 journey?</h2> |
| <p class="text-xl mb-6">Join thousands of Africans learning blockchain technology for free.</p> |
| <button onclick="showView('signup')" class="px-8 py-3 rounded-full bg-africa-orange text-africa-dark hover:bg-africa-yellow font-bold transition">Sign Up Now</button> |
| </div> |
| <div class="md:w-1/2"> |
| <div class="bg-africa-orange/10 border border-africa-orange/20 rounded-xl p-6"> |
| <div class="flex items-center mb-4"> |
| <div class="w-10 h-10 rounded-full bg-africa-yellow flex items-center justify-center mr-4"> |
| <i class="fas fa-user-graduate text-africa-dark"></i> |
| </div> |
| <div> |
| <h3 class="font-bold">Student Success</h3> |
| <p class="text-sm text-gray-300">"This platform helped me land my first blockchain developer job!"</p> |
| </div> |
| </div> |
| <div class="flex items-center mb-4"> |
| <div class="w-10 h-10 rounded-full bg-africa-green flex items-center justify-center mr-4"> |
| <i class="fas fa-chart-line"></i> |
| </div> |
| <div> |
| <h3 class="font-bold">Growing Community</h3> |
| <p class="text-sm text-gray-300">10,000+ active learners across Africa</p> |
| </div> |
| </div> |
| <div class="flex items-center"> |
| <div class="w-10 h-10 rounded-full bg-africa-red flex items-center justify-center mr-4"> |
| <i class="fas fa-gem"></i> |
| </div> |
| <div> |
| <h3 class="font-bold">Quality Content</h3> |
| <p class="text-sm text-gray-300">Courses created by industry experts</p> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </section> |
| </div> |
| |
| |
| <div id="courses-view" class="view hidden"> |
| <div class="flex flex-col md:flex-row justify-between items-start md:items-center mb-8"> |
| <h2 class="text-3xl font-bold mb-4 md:mb-0">All Courses</h2> |
| <div class="flex space-x-2"> |
| <button id="filter-all" onclick="filterCourses('all')" class="px-4 py-2 rounded-full bg-africa-orange text-africa-dark">All</button> |
| <button id="filter-beginner" onclick="filterCourses('beginner')" class="px-4 py-2 rounded-full border border-africa-orange hover:bg-africa-orange/20">Beginner</button> |
| <button id="filter-intermediate" onclick="filterCourses('intermediate')" class="px-4 py-2 rounded-full border border-africa-orange hover:bg-africa-orange/20">Intermediate</button> |
| <button id="filter-advanced" onclick="filterCourses('advanced')" class="px-4 py-2 rounded-full border border-africa-orange hover:bg-africa-orange/20">Advanced</button> |
| </div> |
| </div> |
| |
| <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6" id="all-courses"> |
| |
| </div> |
| </div> |
| |
| |
| <div id="course-detail-view" class="view hidden"> |
| <div class="mb-6"> |
| <button onclick="showView('courses')" class="flex items-center text-africa-orange hover:text-africa-yellow transition"> |
| <i class="fas fa-arrow-left mr-2"></i> Back to Courses |
| </button> |
| </div> |
| |
| <div id="course-detail-content"> |
| |
| </div> |
| </div> |
| |
| |
| <div id="module-detail-view" class="view hidden"> |
| <div class="mb-6"> |
| <button onclick="backToCourseDetail()" class="flex items-center text-africa-orange hover:text-africa-yellow transition"> |
| <i class="fas fa-arrow-left mr-2"></i> Back to Course |
| </button> |
| </div> |
| |
| <div id="module-detail-content"> |
| |
| </div> |
| |
| <div id="quiz-section" class="mt-12 hidden"> |
| <h3 class="text-2xl font-bold mb-6 border-b border-africa-orange/30 pb-2">Module Quiz</h3> |
| <div id="quiz-questions"> |
| |
| </div> |
| <button id="submit-quiz" onclick="submitQuiz()" class="mt-6 px-6 py-3 rounded-full bg-africa-orange text-africa-dark hover:bg-africa-yellow font-bold transition">Submit Quiz</button> |
| </div> |
| |
| <div id="quiz-result" class="mt-12 hidden"> |
| |
| </div> |
| </div> |
| |
| |
| <div id="career-view" class="view hidden"> |
| <h2 class="text-3xl font-bold mb-8">Web3 Career Center</h2> |
| |
| <div class="grid grid-cols-1 md:grid-cols-3 gap-8 mb-12"> |
| <div class="md:col-span-2"> |
| <h3 class="text-2xl font-bold mb-4">Building a Web3 Career</h3> |
| <p class="mb-6">The Web3 ecosystem offers numerous opportunities for Africans to build rewarding careers in blockchain development, smart contract engineering, decentralized finance (DeFi), and more.</p> |
| |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-xl p-6 mb-6"> |
| <h4 class="text-xl font-bold mb-3 text-africa-yellow">Career Paths</h4> |
| <ul class="space-y-3"> |
| <li class="flex items-start"> |
| <span class="text-africa-orange mr-2">•</span> |
| <span><strong>Blockchain Developer:</strong> Build decentralized applications (dApps) on various blockchains</span> |
| </li> |
| <li class="flex items-start"> |
| <span class="text-africa-orange mr-2">•</span> |
| <span><strong>Smart Contract Engineer:</strong> Write and audit secure smart contracts</span> |
| </li> |
| <li class="flex items-start"> |
| <span class="text-africa-orange mr-2">•</span> |
| <span><strong>DeFi Specialist:</strong> Work with decentralized finance protocols and applications</span> |
| </li> |
| <li class="flex items-start"> |
| <span class="text-africa-orange mr-2">•</span> |
| <span><strong>Web3 UX Designer:</strong> Design user-friendly interfaces for decentralized applications</span> |
| </li> |
| </ul> |
| </div> |
| |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-xl p-6"> |
| <h4 class="text-xl font-bold mb-3 text-africa-yellow">Resources</h4> |
| <ul class="space-y-3"> |
| <li class="flex items-start"> |
| <span class="text-africa-orange mr-2">•</span> |
| <span><strong>Portfolio Building:</strong> Contribute to open-source Web3 projects to showcase your skills</span> |
| </li> |
| <li class="flex items-start"> |
| <span class="text-africa-orange mr-2">•</span> |
| <span><strong>Networking:</strong> Join African Web3 communities and attend blockchain events</span> |
| </li> |
| <li class="flex items-start"> |
| <span class="text-africa-orange mr-2">•</span> |
| <span><strong>Freelancing:</strong> Start with small projects on Web3 freelance platforms</span> |
| </li> |
| </ul> |
| </div> |
| </div> |
| |
| <div> |
| <h3 class="text-2xl font-bold mb-4">Job Opportunities</h3> |
| <p class="mb-6">Browse the latest Web3 job opportunities available to Africans.</p> |
| |
| <div id="job-listings" class="space-y-4"> |
| |
| </div> |
| </div> |
| </div> |
| |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-xl p-8"> |
| <h3 class="text-2xl font-bold mb-4 text-center">African Web3 Communities</h3> |
| <div class="grid grid-cols-1 md:grid-cols-3 gap-6"> |
| <a href="#" class="bg-africa-dark border border-africa-orange/20 rounded-xl p-6 hover:border-africa-orange transition group"> |
| <div class="w-12 h-12 rounded-full bg-africa-red flex items-center justify-center mb-4 mx-auto"> |
| <i class="fab fa-telegram text-xl"></i> |
| </div> |
| <h4 class="text-lg font-bold mb-2 text-center group-hover:text-africa-yellow">Nigeria Web3 Devs</h4> |
| <p class="text-center text-sm text-gray-300">Largest Nigerian blockchain developer community</p> |
| </a> |
| <a href="#" class="bg-africa-dark border border-africa-orange/20 rounded-xl p-6 hover:border-africa-orange transition group"> |
| <div class="w-12 h-12 rounded-full bg-africa-green flex items-center justify-center mb-4 mx-auto"> |
| <i class="fab fa-discord text-xl"></i> |
| </div> |
| <h4 class="text-lg font-bold mb-2 text-center group-hover:text-africa-yellow">Kenya Blockchain Hub</h4> |
| <p class="text-center text-sm text-gray-300">East Africa's premier blockchain community</p> |
| </a> |
| <a href="#" class="bg-africa-dark border border-africa-orange/20 rounded-xl p-6 hover:border-africa-orange transition group"> |
| <div class="w-12 h-12 rounded-full bg-africa-yellow flex items-center justify-center mb-4 mx-auto"> |
| <i class="fab fa-twitter text-xl text-africa-dark"></i> |
| </div> |
| <h4 class="text-lg font-bold mb-2 text-center group-hover:text-africa-yellow">Africa Web3 Space</h4> |
| <p class="text-center text-sm text-gray-300">Pan-African Web3 discussions and opportunities</p> |
| </a> |
| </div> |
| </div> |
| </div> |
| |
| |
| <div id="about-view" class="view hidden"> |
| <h2 class="text-3xl font-bold mb-8">About Web3Africa</h2> |
| |
| <div class="grid grid-cols-1 md:grid-cols-2 gap-12 mb-12"> |
| <div> |
| <h3 class="text-2xl font-bold mb-4 text-africa-yellow">Our Mission</h3> |
| <p class="mb-6">Web3Africa is a non-profit initiative dedicated to providing free, high-quality education on blockchain and Web3 technologies to Africans.</p> |
| <p>We believe that decentralized technologies present a unique opportunity for Africa to leapfrog traditional financial and technological infrastructure, creating more inclusive and equitable systems.</p> |
| </div> |
| |
| <div> |
| <h3 class="text-2xl font-bold mb-4 text-africa-yellow">Our Approach</h3> |
| <ul class="space-y-4"> |
| <li class="flex items-start"> |
| <div class="w-8 h-8 rounded-full bg-africa-orange flex items-center justify-center mr-3 mt-1 flex-shrink-0"> |
| <i class="fas fa-check text-africa-dark text-sm"></i> |
| </div> |
| <span><strong>Free Access:</strong> All our courses and resources are completely free to ensure accessibility.</span> |
| </li> |
| <li class="flex items-start"> |
| <div class="w-8 h-8 rounded-full bg-africa-orange flex items-center justify-center mr-3 mt-1 flex-shrink-0"> |
| <i class="fas fa-check text-africa-dark text-sm"></i> |
| </div> |
| <span><strong>Practical Focus:</strong> We emphasize hands-on learning with real-world projects.</span> |
| </li> |
| <li class="flex items-start"> |
| <div class="w-8 h-8 rounded-full bg-africa-orange flex items-center justify-center mr-3 mt-1 flex-shrink-0"> |
| <i class="fas fa-check text-africa-dark text-sm"></i> |
| </div> |
| <span><strong>Community Driven:</strong> Our content is created and reviewed by African Web3 professionals.</span> |
| </li> |
| <li class="flex items-start"> |
| <div class="w-8 h-8 rounded-full bg-africa-orange flex items-center justify-center mr-3 mt-1 flex-shrink-0"> |
| <i class="fas fa-check text-africa-dark text-sm"></i> |
| </div> |
| <span><strong>Mobile Optimized:</strong> Designed for learners with limited bandwidth and mobile-only access.</span> |
| </li> |
| </ul> |
| </div> |
| </div> |
| |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-xl p-8 mb-12"> |
| <h3 class="text-2xl font-bold mb-6 text-center">Our Team</h3> |
| <div class="grid grid-cols-1 md:grid-cols-3 gap-8"> |
| <div class="text-center"> |
| <div class="w-32 h-32 rounded-full bg-africa-orange/20 border border-africa-orange/30 mx-auto mb-4 overflow-hidden"> |
| <img src="https://randomuser.me/api/portraits/women/44.jpg" alt="Team member" class="w-full h-full object-cover"> |
| </div> |
| <h4 class="font-bold text-lg">Amina Diallo</h4> |
| <p class="text-africa-orange mb-2">Founder & Lead Educator</p> |
| <p class="text-sm text-gray-300">Former blockchain developer at major DeFi protocol</p> |
| </div> |
| <div class="text-center"> |
| <div class="w-32 h-32 rounded-full bg-africa-orange/20 border border-africa-orange/30 mx-auto mb-4 overflow-hidden"> |
| <img src="https://randomuser.me/api/portraits/men/32.jpg" alt="Team member" class="w-full h-full object-cover"> |
| </div> |
| <h4 class="font-bold text-lg">Kwame Osei</h4> |
| <p class="text-africa-orange mb-2">Technical Director</p> |
| <p class="text-sm text-gray-300">Smart contract auditor with 5+ years experience</p> |
| </div> |
| <div class="text-center"> |
| <div class="w-32 h-32 rounded-full bg-africa-orange/20 border border-africa-orange/30 mx-auto mb-4 overflow-hidden"> |
| <img src="https://randomuser.me/api/portraits/women/68.jpg" alt="Team member" class="w-full h-full object-cover"> |
| </div> |
| <h4 class="font-bold text-lg">Naledi Banda</h4> |
| <p class="text-africa-orange mb-2">Community Manager</p> |
| <p class="text-sm text-gray-300">Organizer of Africa Blockchain Week</p> |
| </div> |
| </div> |
| </div> |
| |
| <div class="text-center"> |
| <h3 class="text-2xl font-bold mb-4">Support Our Mission</h3> |
| <p class="mb-6 max-w-2xl mx-auto">Web3Africa is funded by donations and grants. Help us keep education free and accessible to all Africans.</p> |
| <button class="px-8 py-3 rounded-full bg-africa-orange text-africa-dark hover:bg-africa-yellow font-bold transition">Donate Now</button> |
| </div> |
| </div> |
| |
| |
| <div id="login-view" class="view hidden max-w-md mx-auto"> |
| <h2 class="text-3xl font-bold mb-2">Welcome Back</h2> |
| <p class="text-gray-300 mb-8">Sign in to continue your Web3 learning journey</p> |
| |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-xl p-6 mb-6"> |
| <form id="login-form" onsubmit="handleLogin(event)"> |
| <div class="mb-4"> |
| <label for="login-email" class="block mb-2">Email</label> |
| <input type="email" id="login-email" required class="w-full px-4 py-3 rounded-lg bg-africa-dark border border-africa-orange/30 focus:border-africa-orange focus:outline-none"> |
| </div> |
| <div class="mb-6"> |
| <label for="login-password" class="block mb-2">Password</label> |
| <input type="password" id="login-password" required class="w-full px-4 py-3 rounded-lg bg-africa-dark border border-africa-orange/30 focus:border-africa-orange focus:outline-none"> |
| </div> |
| <button type="submit" class="w-full py-3 rounded-full bg-africa-orange text-africa-dark hover:bg-africa-yellow font-bold transition">Sign In</button> |
| </form> |
| </div> |
| |
| <div class="text-center mb-6"> |
| <p class="text-gray-300">Or connect with</p> |
| </div> |
| |
| <button onclick="connectWallet()" class="w-full py-3 rounded-full border border-africa-orange text-africa-orange hover:bg-africa-orange/10 font-bold transition mb-6 flex items-center justify-center space-x-2"> |
| <i class="fab fa-ethereum"></i> |
| <span>Wallet Connect</span> |
| </button> |
| |
| <div class="text-center"> |
| <p class="text-gray-300">Don't have an account? <button onclick="showView('signup')" class="text-africa-orange hover:text-africa-yellow">Sign up</button></p> |
| </div> |
| </div> |
| |
| |
| <div id="signup-view" class="view hidden max-w-md mx-auto"> |
| <h2 class="text-3xl font-bold mb-2">Join Web3Africa</h2> |
| <p class="text-gray-300 mb-8">Create your free account to start learning</p> |
| |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-xl p-6 mb-6"> |
| <form id="signup-form" onsubmit="handleSignup(event)"> |
| <div class="mb-4"> |
| <label for="signup-name" class="block mb-2">Full Name</label> |
| <input type="text" id="signup-name" required class="w-full px-4 py-3 rounded-lg bg-africa-dark border border-africa-orange/30 focus:border-africa-orange focus:outline-none"> |
| </div> |
| <div class="mb-4"> |
| <label for="signup-email" class="block mb-2">Email</label> |
| <input type="email" id="signup-email" required class="w-full px-4 py-3 rounded-lg bg-africa-dark border border-africa-orange/30 focus:border-africa-orange focus:outline-none"> |
| </div> |
| <div class="mb-6"> |
| <label for="signup-password" class="block mb-2">Password</label> |
| <input type="password" id="signup-password" required minlength="6" class="w-full px-4 py-3 rounded-lg bg-africa-dark border border-africa-orange/30 focus:border-africa-orange focus:outline-none"> |
| </div> |
| <button type="submit" class="w-full py-3 rounded-full bg-africa-orange text-africa-dark hover:bg-africa-yellow font-bold transition">Create Account</button> |
| </form> |
| </div> |
| |
| <div class="text-center mb-6"> |
| <p class="text-gray-300">Or connect with</p> |
| </div> |
| |
| <button onclick="connectWallet()" class="w-full py-3 rounded-full border border-africa-orange text-africa-orange hover:bg-africa-orange/10 font-bold transition mb-6 flex items-center justify-center space-x-2"> |
| <i class="fab fa-ethereum"></i> |
| <span>Wallet Connect</span> |
| </button> |
| |
| <div class="text-center"> |
| <p class="text-gray-300">Already have an account? <button onclick="showView('login')" class="text-africa-orange hover:text-africa-yellow">Sign in</button></p> |
| </div> |
| </div> |
| |
| |
| <div id="dashboard-view" class="view hidden"> |
| <h2 class="text-3xl font-bold mb-6">My Dashboard</h2> |
| |
| <div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8"> |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-xl p-6"> |
| <h3 class="text-xl font-bold mb-4 flex items-center"> |
| <span class="w-8 h-8 rounded-full bg-africa-red flex items-center justify-center mr-3"> |
| <i class="fas fa-book text-sm"></i> |
| </span> |
| My Courses |
| </h3> |
| <div id="enrolled-courses"> |
| |
| <p class="text-gray-300">You haven't enrolled in any courses yet.</p> |
| </div> |
| </div> |
| |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-xl p-6"> |
| <h3 class="text-xl font-bold mb-4 flex items-center"> |
| <span class="w-8 h-8 rounded-full bg-africa-yellow flex items-center justify-center mr-3"> |
| <i class="fas fa-chart-line text-sm text-africa-dark"></i> |
| </span> |
| My Progress |
| </h3> |
| <div class="flex flex-col items-center"> |
| <div class="relative w-32 h-32 mb-4"> |
| <svg class="w-full h-full" viewBox="0 0 100 100"> |
| <circle class="text-africa-dark/20" stroke-width="10" stroke="currentColor" fill="transparent" r="40" cx="50" cy="50" /> |
| <circle class="text-africa-orange progress-ring__circle" stroke-width="10" stroke-linecap="round" stroke="currentColor" fill="transparent" r="40" cx="50" cy="50" stroke-dasharray="251.2" stroke-dashoffset="175.84" /> |
| </svg> |
| <div class="absolute inset-0 flex items-center justify-center"> |
| <span class="text-2xl font-bold">30%</span> |
| </div> |
| </div> |
| <p class="text-center text-gray-300">Overall course completion</p> |
| </div> |
| </div> |
| |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-xl p-6"> |
| <h3 class="text-xl font-bold mb-4 flex items-center"> |
| <span class="w-8 h-8 rounded-full bg-africa-green flex items-center justify-center mr-3"> |
| <i class="fas fa-trophy text-sm"></i> |
| </span> |
| Achievements |
| </h3> |
| <div class="grid grid-cols-3 gap-3"> |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-lg p-3 flex flex-col items-center"> |
| <div class="w-12 h-12 rounded-full bg-africa-orange/20 flex items-center justify-center mb-2"> |
| <i class="fas fa-medal text-africa-orange"></i> |
| </div> |
| <span class="text-xs text-center">First Course</span> |
| </div> |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-lg p-3 flex flex-col items-center opacity-50"> |
| <div class="w-12 h-12 rounded-full bg-africa-orange/10 flex items-center justify-center mb-2"> |
| <i class="fas fa-star text-gray-500"></i> |
| </div> |
| <span class="text-xs text-center text-gray-500">Quiz Master</span> |
| </div> |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-lg p-3 flex flex-col items-center opacity-50"> |
| <div class="w-12 h-12 rounded-full bg-africa-orange/10 flex items-center justify-center mb-2"> |
| <i class="fas fa-code text-gray-500"></i> |
| </div> |
| <span class="text-xs text-center text-gray-500">Developer</span> |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-xl p-6 mb-8"> |
| <h3 class="text-xl font-bold mb-4 flex items-center"> |
| <span class="w-8 h-8 rounded-full bg-africa-orange flex items-center justify-center mr-3"> |
| <i class="fas fa-bookmark text-sm text-africa-dark"></i> |
| </span> |
| Saved Resources |
| </h3> |
| <div id="saved-resources"> |
| <p class="text-gray-300">You haven't saved any resources yet.</p> |
| </div> |
| </div> |
| |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-xl p-6"> |
| <h3 class="text-xl font-bold mb-4 flex items-center"> |
| <span class="w-8 h-8 rounded-full bg-africa-red flex items-center justify-center mr-3"> |
| <i class="fas fa-history text-sm"></i> |
| </span> |
| Recent Activity |
| </h3> |
| <div id="recent-activity"> |
| <div class="flex items-start py-3 border-b border-africa-orange/10 last:border-0"> |
| <div class="w-8 h-8 rounded-full bg-africa-orange/20 flex items-center justify-center mr-3 mt-1"> |
| <i class="fas fa-book text-africa-orange text-sm"></i> |
| </div> |
| <div> |
| <p class="text-sm">You started <strong>Blockchain Fundamentals</strong> course</p> |
| <p class="text-xs text-gray-400">2 days ago</p> |
| </div> |
| </div> |
| <div class="flex items-start py-3 border-b border-africa-orange/10 last:border-0"> |
| <div class="w-8 h-8 rounded-full bg-africa-green/20 flex items-center justify-center mr-3 mt-1"> |
| <i class="fas fa-user-plus text-africa-green text-sm"></i> |
| </div> |
| <div> |
| <p class="text-sm">You joined Web3Africa</p> |
| <p class="text-xs text-gray-400">1 week ago</p> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| |
| <div id="admin-view" class="view hidden"> |
| <h2 class="text-3xl font-bold mb-6">Admin Panel</h2> |
| |
| <div class="mb-8"> |
| <div class="flex flex-wrap gap-2 mb-6"> |
| <button onclick="showAdminSection('courses')" class="px-4 py-2 rounded-full bg-africa-orange text-africa-dark">Manage Courses</button> |
| <button onclick="showAdminSection('users')" class="px-4 py-2 rounded-full border border-africa-orange hover:bg-africa-orange/20">Manage Users</button> |
| <button onclick="showAdminSection('content')" class="px-4 py-2 rounded-full border border-africa-orange hover:bg-africa-orange/20">Manage Content</button> |
| <button onclick="showAdminSection('analytics')" class="px-4 py-2 rounded-full border border-africa-orange hover:bg-africa-orange/20">Analytics</button> |
| </div> |
| |
| <div id="admin-courses-section"> |
| <div class="flex justify-between items-center mb-6"> |
| <h3 class="text-2xl font-bold">Courses</h3> |
| <button onclick="showAddCourseModal()" class="px-4 py-2 rounded-full bg-africa-green hover:bg-africa-green/80 text-africa-dark font-bold"> |
| <i class="fas fa-plus mr-2"></i> Add Course |
| </button> |
| </div> |
| |
| <div class="overflow-x-auto"> |
| <table class="w-full border-collapse"> |
| <thead> |
| <tr class="border-b border-africa-orange/20"> |
| <th class="text-left py-3 px-4">Title</th> |
| <th class="text-left py-3 px-4">Level</th> |
| <th class="text-left py-3 px-4">Modules</th> |
| <th class="text-left py-3 px-4">Enrollments</th> |
| <th class="text-left py-3 px-4">Actions</th> |
| </tr> |
| </thead> |
| <tbody id="admin-courses-list"> |
| |
| </tbody> |
| </table> |
| </div> |
| </div> |
| |
| <div id="admin-users-section" class="hidden"> |
| <h3 class="text-2xl font-bold mb-6">Users</h3> |
| <div class="overflow-x-auto"> |
| <table class="w-full border-collapse"> |
| <thead> |
| <tr class="border-b border-africa-orange/20"> |
| <th class="text-left py-3 px-4">Name</th> |
| <th class="text-left py-3 px-4">Email</th> |
| <th class="text-left py-3 px-4">Joined</th> |
| <th class="text-left py-3 px-4">Progress</th> |
| <th class="text-left py-3 px-4">Actions</th> |
| </tr> |
| </thead> |
| <tbody id="admin-users-list"> |
| |
| </tbody> |
| </table> |
| </div> |
| </div> |
| </div> |
| </div> |
| </main> |
| |
| |
| <footer class="bg-africa-dark border-t border-africa-orange/20 py-8"> |
| <div class="container mx-auto px-4"> |
| <div class="grid grid-cols-1 md:grid-cols-4 gap-8 mb-8"> |
| <div> |
| <div class="flex items-center space-x-2 mb-4"> |
| <div class="w-8 h-8 rounded-full bg-gradient-to-br from-africa-red to-africa-yellow flex items-center justify-center"> |
| <span class="font-bold text-xs text-africa-dark">W3A</span> |
| </div> |
| <h3 class="font-bold">Web3Africa</h3> |
| </div> |
| <p class="text-gray-300 text-sm">Empowering Africa through blockchain education.</p> |
| </div> |
| |
| <div> |
| <h4 class="font-bold mb-4">Learn</h4> |
| <ul class="space-y-2"> |
| <li><a href="#" onclick="showView('courses')" class="text-gray-300 hover:text-africa-orange text-sm transition">Courses</a></li> |
| <li><a href="#" class="text-gray-300 hover:text-africa-orange text-sm transition">Resources</a></li> |
| <li><a href="#" class="text-gray-300 hover:text-africa-orange text-sm transition">Blog</a></li> |
| <li><a href="#" class="text-gray-300 hover:text-africa-orange text-sm transition">FAQ</a></li> |
| </ul> |
| </div> |
| |
| <div> |
| <h4 class="font-bold mb-4">Community</h4> |
| <ul class="space-y-2"> |
| <li><a href="#" class="text-gray-300 hover:text-africa-orange text-sm transition">Discord</a></li> |
| <li><a href="#" class="text-gray-300 hover:text-africa-orange text-sm transition">Telegram</a></li> |
| <li><a href="#" class="text-gray-300 hover:text-africa-orange text-sm transition">Twitter</a></li> |
| <li><a href="#" class="text-gray-300 hover:text-africa-orange text-sm transition">GitHub</a></li> |
| </ul> |
| </div> |
| |
| <div> |
| <h4 class="font-bold mb-4">Support Us</h4> |
| <ul class="space-y-2"> |
| <li><a href="#" class="text-gray-300 hover:text-africa-orange text-sm transition">Donate</a></li> |
| <li><a href="#" class="text-gray-300 hover:text-africa-orange text-sm transition">Volunteer</a></li> |
| <li><a href="#" class="text-gray-300 hover:text-africa-orange text-sm transition">Partnerships</a></li> |
| </ul> |
| </div> |
| </div> |
| |
| <div class="pt-6 border-t border-africa-orange/10 flex flex-col md:flex-row justify-between items-center"> |
| <p class="text-gray-400 text-sm mb-4 md:mb-0">© 2023 Web3Africa. All rights reserved.</p> |
| <div class="flex space-x-4"> |
| <a href="#" class="text-gray-400 hover:text-africa-orange transition"><i class="fab fa-twitter"></i></a> |
| <a href="#" class="text-gray-400 hover:text-africa-orange transition"><i class="fab fa-discord"></i></a> |
| <a href="#" class="text-gray-400 hover:text-africa-orange transition"><i class="fab fa-telegram"></i></a> |
| <a href="#" class="text-gray-400 hover:text-africa-orange transition"><i class="fab fa-github"></i></a> |
| </div> |
| </div> |
| </div> |
| </footer> |
| </div> |
| |
| |
| <div id="add-course-modal" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 hidden"> |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-xl p-6 w-full max-w-md"> |
| <div class="flex justify-between items-center mb-4"> |
| <h3 class="text-xl font-bold">Add New Course</h3> |
| <button onclick="hideAddCourseModal()" class="p-2 rounded-full hover:bg-africa-orange/20 transition"> |
| <i class="fas fa-times"></i> |
| </button> |
| </div> |
| |
| <form id="add-course-form" onsubmit="addNewCourse(event)"> |
| <div class="mb-4"> |
| <label for="course-title" class="block mb-2">Title</label> |
| <input type="text" id="course-title" required class="w-full px-4 py-3 rounded-lg bg-africa-dark border border-africa-orange/30 focus:border-africa-orange focus:outline-none"> |
| </div> |
| |
| <div class="mb-4"> |
| <label for="course-description" class="block mb-2">Description</label> |
| <textarea id="course-description" required rows="3" class="w-full px-4 py-3 rounded-lg bg-africa-dark border border-africa-orange/30 focus:border-africa-orange focus:outline-none"></textarea> |
| </div> |
| |
| <div class="mb-4"> |
| <label for="course-level" class="block mb-2">Level</label> |
| <select id="course-level" required class="w-full px-4 py-3 rounded-lg bg-africa-dark border border-africa-orange/30 focus:border-africa-orange focus:outline-none"> |
| <option value="beginner">Beginner</option> |
| <option value="intermediate">Intermediate</option> |
| <option value="advanced">Advanced</option> |
| </select> |
| </div> |
| |
| <div class="mb-4"> |
| <label for="course-duration" class="block mb-2">Duration</label> |
| <input type="text" id="course-duration" required class="w-full px-4 py-3 rounded-lg bg-africa-dark border border-africa-orange/30 focus:border-africa-orange focus:outline-none" placeholder="e.g. 2 weeks"> |
| </div> |
| |
| <div class="flex justify-end space-x-3"> |
| <button type="button" onclick="hideAddCourseModal()" class="px-4 py-2 rounded-full border border-africa-orange hover:bg-africa-orange/20 transition">Cancel</button> |
| <button type="submit" class="px-4 py-2 rounded-full bg-africa-orange text-africa-dark hover:bg-africa-yellow font-bold transition">Add Course</button> |
| </div> |
| </form> |
| </div> |
| </div> |
| |
| |
| <div id="loading-overlay" class="fixed inset-0 bg-black bg-opacity-70 flex items-center justify-center z-50 hidden"> |
| <div class="text-center"> |
| <div class="w-16 h-16 border-4 border-africa-orange border-t-transparent rounded-full spinner mb-4 mx-auto"></div> |
| <p class="text-white">Loading...</p> |
| </div> |
| </div> |
| |
| |
| <script> |
| |
| let currentView = 'home'; |
| let currentCourseId = null; |
| let currentModuleId = null; |
| let quizAnswers = {}; |
| |
| |
| function initApp() { |
| showView('home'); |
| loadFeaturedCourses(); |
| loadAllCourses(); |
| loadJobs(); |
| |
| |
| if (currentUser) { |
| updateAuthUI(); |
| } |
| |
| |
| if (isAdmin) { |
| document.getElementById('auth-btn').innerHTML = 'Admin'; |
| document.getElementById('mobile-auth-btn').innerHTML = 'Admin'; |
| loadAdminCourses(); |
| loadAdminUsers(); |
| } |
| } |
| |
| |
| function showView(viewId) { |
| |
| document.querySelectorAll('.view').forEach(view => { |
| view.classList.add('hidden'); |
| }); |
| |
| |
| document.getElementById(`${viewId}-view`).classList.remove('hidden'); |
| |
| |
| currentView = viewId; |
| |
| |
| if (viewId === 'dashboard' && currentUser) { |
| loadDashboard(); |
| } |
| } |
| |
| |
| function toggleMobileMenu() { |
| const menu = document.getElementById('mobile-menu'); |
| menu.classList.toggle('mobile-menu-hidden'); |
| menu.classList.toggle('mobile-menu-visible'); |
| } |
| |
| |
| function toggleDarkMode() { |
| document.documentElement.classList.toggle('dark'); |
| } |
| |
| |
| function connectWallet() { |
| showLoading(); |
| |
| |
| setTimeout(() => { |
| const result = api.connectWallet(); |
| |
| if (result.success) { |
| walletConnected = true; |
| updateAuthUI(); |
| |
| |
| const walletBtn = document.getElementById('wallet-btn'); |
| const mobileWalletBtn = document.getElementById('mobile-wallet-btn'); |
| |
| walletBtn.innerHTML = '<i class="fab fa-ethereum"></i> <span>0x123...abc</span>'; |
| mobileWalletBtn.innerHTML = '<i class="fab fa-ethereum"></i> <span>0x123...abc</span>'; |
| |
| walletBtn.classList.add('wallet-connected'); |
| mobileWalletBtn.classList.add('wallet-connected'); |
| |
| |
| showView('dashboard'); |
| } |
| |
| hideLoading(); |
| }, 1500); |
| } |
| |
| |
| function updateAuthUI() { |
| if (currentUser) { |
| document.getElementById('auth-btn').innerHTML = currentUser.name || 'My Account'; |
| document.getElementById('mobile-auth-btn').innerHTML = currentUser.name || 'My Account'; |
| |
| |
| document.getElementById('auth-btn').onclick = () => showView('dashboard'); |
| document.getElementById('mobile-auth-btn').onclick = () => { |
| showView('dashboard'); |
| toggleMobileMenu(); |
| }; |
| } |
| } |
| |
| |
| function handleLogin(event) { |
| event.preventDefault(); |
| showLoading(); |
| |
| const email = document.getElementById('login-email').value; |
| const password = document.getElementById('login-password').value; |
| |
| setTimeout(() => { |
| const result = api.login(email, password); |
| |
| if (result.success) { |
| currentUser = result.user; |
| updateAuthUI(); |
| showView('dashboard'); |
| } else { |
| alert(result.message || 'Login failed'); |
| } |
| |
| hideLoading(); |
| }, 1000); |
| } |
| |
| |
| function handleSignup(event) { |
| event.preventDefault(); |
| showLoading(); |
| |
| const name = document.getElementById('signup-name').value; |
| const email = document.getElementById('signup-email').value; |
| const password = document.getElementById('signup-password').value; |
| |
| setTimeout(() => { |
| const result = api.signup(email, password, name); |
| |
| if (result.success) { |
| currentUser = result.user; |
| updateAuthUI(); |
| showView('dashboard'); |
| } else { |
| alert(result.message || 'Signup failed'); |
| } |
| |
| hideLoading(); |
| }, 1000); |
| } |
| |
| |
| function filterCourses(level) { |
| const allCourses = api.getCourses(); |
| const container = document.getElementById('all-courses'); |
| |
| |
| document.querySelectorAll('[id^="filter-"]').forEach(btn => { |
| btn.classList.remove('bg-africa-orange', 'text-africa-dark'); |
| btn.classList.add('border', 'border-africa-orange', 'hover:bg-africa-orange/20'); |
| }); |
| |
| document.getElementById(`filter-${level}`).classList.add('bg-africa-orange', 'text-africa-dark'); |
| document.getElementById(`filter-${level}`).classList.remove('border', 'border-africa-orange', 'hover:bg-africa-orange/20'); |
| |
| |
| const filteredCourses = level === 'all' |
| ? allCourses |
| : allCourses.filter(course => course.level.toLowerCase() === level); |
| |
| |
| container.innerHTML = ''; |
| filteredCourses.forEach(course => { |
| container.innerHTML += createCourseCard(course); |
| }); |
| } |
| |
| |
| function loadFeaturedCourses() { |
| const courses = api.getCourses().slice(0, 3); |
| const container = document.getElementById('featured-courses'); |
| |
| container.innerHTML = ''; |
| courses.forEach(course => { |
| container.innerHTML += createCourseCard(course); |
| }); |
| } |
| |
| |
| function loadAllCourses() { |
| const courses = api.getCourses(); |
| const container = document.getElementById('all-courses'); |
| |
| container.innerHTML = ''; |
| courses.forEach(course => { |
| container.innerHTML += createCourseCard(course); |
| }); |
| } |
| |
| |
| function createCourseCard(course) { |
| const levelColor = { |
| beginner: 'green', |
| intermediate: 'yellow', |
| advanced: 'red' |
| }; |
| |
| return ` |
| <div class="course-card bg-africa-dark border border-africa-orange/20 rounded-xl overflow-hidden transition duration-300"> |
| <div class="h-40 bg-africa-${levelColor[course.level.toLowerCase()]}/10 flex items-center justify-center"> |
| <i class="fas fa-laptop-code text-4xl text-africa-${levelColor[course.level.toLowerCase()]}"></i> |
| </div> |
| <div class="p-6"> |
| <div class="flex justify-between items-start mb-2"> |
| <h3 class="font-bold text-lg">${course.title}</h3> |
| <span class="text-xs px-2 py-1 rounded-full bg-africa-${levelColor[course.level.toLowerCase()]}/20 text-africa-${levelColor[course.level.toLowerCase()]}">${course.level}</span> |
| </div> |
| <p class="text-gray-300 text-sm mb-4">${course.description}</p> |
| <div class="flex justify-between items-center"> |
| <span class="text-xs text-gray-400">${course.duration}</span> |
| <button onclick="showCourseDetail('${course.id}')" class="text-xs px-3 py-1 rounded-full bg-africa-orange text-africa-dark hover:bg-africa-yellow transition">View Course</button> |
| </div> |
| </div> |
| </div> |
| `; |
| } |
| |
| |
| function showCourseDetail(courseId) { |
| currentCourseId = courseId; |
| const course = api.getCourse(courseId); |
| |
| if (!course) { |
| alert('Course not found'); |
| return; |
| } |
| |
| const container = document.getElementById('course-detail-content'); |
| |
| const levelColor = { |
| beginner: 'green', |
| intermediate: 'yellow', |
| advanced: 'red' |
| }; |
| |
| |
| let modulesHtml = ''; |
| if (course.modules && course.modules.length > 0) { |
| modulesHtml = ` |
| <div class="mt-8"> |
| <h3 class="text-2xl font-bold mb-6">Course Modules</h3> |
| <div class="space-y-3"> |
| ${course.modules.map(module => ` |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-lg p-4 hover:border-africa-orange transition cursor-pointer" onclick="showModuleDetail('${courseId}', '${module.id}')"> |
| <div class="flex justify-between items-center"> |
| <h4 class="font-bold">${module.title}</h4> |
| <i class="fas fa-chevron-right text-africa-orange"></i> |
| </div> |
| </div> |
| `).join('')} |
| </div> |
| </div> |
| `; |
| } else { |
| modulesHtml = ` |
| <div class="mt-8 bg-africa-dark border border-africa-orange/20 rounded-lg p-8 text-center"> |
| <i class="fas fa-book-open text-4xl text-africa-orange mb-4"></i> |
| <p class="text-gray-300">More modules coming soon!</p> |
| </div> |
| `; |
| } |
| |
| container.innerHTML = ` |
| <div class="flex flex-col md:flex-row gap-8 mb-8"> |
| <div class="md:w-1/3"> |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-xl p-6"> |
| <div class="h-40 bg-africa-${levelColor[course.level.toLowerCase()]}/10 flex items-center justify-center rounded-lg mb-4"> |
| <i class="fas fa-laptop-code text-4xl text-africa-${levelColor[course.level.toLowerCase()]}"></i> |
| </div> |
| <div class="space-y-4"> |
| <div> |
| <span class="text-xs text-gray-400">Level</span> |
| <p class="font-bold">${course.level}</p> |
| </div> |
| <div> |
| <span class="text-xs text-gray-400">Duration</span> |
| <p class="font-bold">${course.duration}</p> |
| </div> |
| <div> |
| <span class="text-xs text-gray-400">Modules</span> |
| <p class="font-bold">${course.modules ? course.modules.length : 0}</p> |
| </div> |
| <button class="w-full py-2 rounded-full bg-africa-orange text-africa-dark hover:bg-africa-yellow font-bold transition"> |
| Enroll Now |
| </button> |
| </div> |
| </div> |
| </div> |
| <div class="md:w-2/3"> |
| <h2 class="text-3xl font-bold mb-4">${course.title}</h2> |
| <div class="flex items-center mb-6"> |
| <span class="text-xs px-2 py-1 rounded-full bg-africa-${levelColor[course.level.toLowerCase()]}/20 text-africa-${levelColor[course.level.toLowerCase()]} mr-3">${course.level}</span> |
| <span class="text-gray-400 text-sm">${course.duration} • ${course.modules ? course.modules.length : 0} modules</span> |
| </div> |
| <p class="mb-6">${course.description}</p> |
| |
| ${modulesHtml} |
| </div> |
| </div> |
| `; |
| |
| showView('course-detail'); |
| } |
| |
| |
| function showModuleDetail(courseId, moduleId) { |
| currentCourseId = courseId; |
| currentModuleId = moduleId; |
| |
| const course = api.getCourse(courseId); |
| if (!course) { |
| alert('Course not found'); |
| return; |
| } |
| |
| const module = course.modules.find(m => m.id === moduleId); |
| if (!module) { |
| alert('Module not found'); |
| return; |
| } |
| |
| const container = document.getElementById('module-detail-content'); |
| |
| container.innerHTML = ` |
| <div class="mb-8"> |
| <h2 class="text-2xl font-bold mb-2">${module.title}</h2> |
| <p class="text-gray-400 mb-6">From: ${course.title}</p> |
| |
| <div class="bg-africa-dark border border-africa-orange/20 rounded-xl p-6"> |
| <h3 class="text-xl font-bold mb-4">Content</h3> |
| <div class="prose prose-invert max-w-none"> |
| <p>${module.content || 'No content available yet.'}</p> |
| </div> |
| |
| ${module.videoUrl ? ` |
| <div class="mt-6"> |
| <h3 class="text-xl font-bold mb-4">Video</h3> |
| <div class="aspect-w-16 aspect-h-9 bg-africa-orange/10 rounded-lg overflow-hidden flex items-center justify-center"> |
| <i class="fas fa-play text-4xl text-africa-orange"></i> |
| </div> |
| </div> |
| ` : ''} |
| |
| ${module.imageUrl ? ` |
| <div class="mt-6"> |
| <h3 class="text-xl font-bold mb-4">Image</h3> |
| <div class="bg-africa-orange/10 rounded-lg overflow-hidden flex items-center justify-center h-48"> |
| <i class="fas fa-image text-4xl text-africa-orange"></i> |
| </div> |
| </div> |
| ` : ''} |
| </div> |
| </div> |
| `; |
| |
| |
| const quizSection = document.getElementById('quiz-section'); |
| const quizResult = document.getElementById('quiz-result'); |
| |
| if (module.quiz && module.quiz.questions.length > 0) { |
| loadQuizQuestions(module.quiz.questions); |
| quizSection.classList.remove('hidden'); |
| quizResult.classList.add('hidden'); |
| } else { |
| quizSection.classList.add('hidden'); |
| quizResult.classList.add('hidden'); |
| } |
| |
| showView('module-detail'); |
| } |
| |
| |
| function backToCourseDetail() { |
| showCourseDetail(currentCourseId); |
| } |
| |
| |
| function loadQuizQuestions(questions) { |
| const container = document.getElementById('quiz-questions'); |
| |
| container.innerHTML = ''; |
| questions.forEach((question, qIndex) => { |
| container.innerHTML += ` |
| <div class="mb-8"> |
| <h4 class="font-bold mb-4">${qIndex + 1}. ${question.text}</h4> |
| |
| </html> |