Rimon519's picture
# Implementation Tasks
d8ee33b verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PosterCraft Studio - Task Management Dashboard</title>
<link rel="icon" type="image/x-icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🎨</text></svg>">
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://unpkg.com/feather-icons"></script>
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/animejs/lib/anime.iife.min.js"></script>
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap');
body { font-family: 'Inter', sans-serif; }
.task-card {
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
transform-style: preserve-3d;
}
.task-card:hover {
transform: translateY(-4px) rotateX(2deg);
}
.progress-ring {
transform: rotate(-90deg);
transform-origin: 50% 50%;
}
.glass-effect {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.2);
}
.gradient-bg {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.dark-gradient {
background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
}
@keyframes float {
0%, 100% { transform: translateY(0px); }
50% { transform: translateY(-20px); }
}
.float-animation {
animation: float 6s ease-in-out infinite;
}
.checkbox-custom {
appearance: none;
width: 20px;
height: 20px;
border: 2px solid #e5e7eb;
border-radius: 4px;
position: relative;
cursor: pointer;
transition: all 0.2s;
}
.checkbox-custom:checked {
background: linear-gradient(135deg, #667eea, #764ba2);
border-color: #667eea;
}
.checkbox-custom:checked::after {
content: '✓';
position: absolute;
color: white;
font-size: 14px;
top: -2px;
left: 2px;
}
.tag-pill {
transition: all 0.2s;
}
.tag-pill:hover {
transform: scale(1.05);
}
</style>
</head>
<body class="bg-gray-50 dark:bg-gray-900 transition-colors duration-300">
<!-- Header -->
<header class="bg-white dark:bg-gray-800 shadow-sm border-b border-gray-200 dark:border-gray-700 sticky top-0 z-50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex items-center justify-between h-16">
<div class="flex items-center space-x-4">
<div class="flex items-center space-x-2">
<div class="w-10 h-10 gradient-bg rounded-lg flex items-center justify-center float-animation">
<i data-feather="image" class="w-6 h-6 text-white"></i>
</div>
<h1 class="text-xl font-bold text-gray-900 dark:text-white">PosterCraft Studio</h1>
</div>
<span class="px-3 py-1 bg-purple-100 dark:bg-purple-900 text-purple-700 dark:text-purple-300 text-xs font-medium rounded-full">
Development Dashboard
</span>
</div>
<div class="flex items-center space-x-4">
<button onclick="toggleTheme()" class="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors">
<i data-feather="sun" class="w-5 h-5 text-gray-600 dark:text-gray-400 dark:hidden"></i>
<i data-feather="moon" class="w-5 h-5 text-gray-600 dark:text-gray-400 hidden dark:block"></i>
</button>
<nav class="hidden md:flex space-x-4">
<a href="index.html" class="px-3 py-2 text-sm font-medium text-purple-600 dark:text-purple-400 bg-purple-50 dark:bg-purple-900/50 rounded-md">
Dashboard
</a>
<a href="tasks.html" class="px-3 py-2 text-sm font-medium text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white rounded-md">
Tasks
</a>
</nav>
<button class="px-4 py-2 gradient-bg text-white rounded-lg hover:shadow-lg transition-all transform hover:scale-105">
<span class="flex items-center space-x-2">
<i data-feather="play" class="w-4 h-4"></i>
<span>Start Build</span>
</span>
</button>
</div>
</div>
</div>
</header>
<!-- Main Content -->
<main class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
<!-- Stats Overview -->
<div class="grid grid-cols-1 md:grid-cols-4 gap-6 mb-8">
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm p-6 border border-gray-200 dark:border-gray-700">
<div class="flex items-center justify-between mb-2">
<span class="text-sm font-medium text-gray-600 dark:text-gray-400">Total Tasks</span>
<i data-feather="check-square" class="w-5 h-5 text-purple-500"></i>
</div>
<div class="text-2xl font-bold text-gray-900 dark:text-white">42</div>
<div class="mt-2 flex items-center space-x-1">
<div class="w-full bg-gray-200 dark:bg-gray-700 rounded-full h-2">
<div class="bg-gradient-to-r from-purple-500 to-pink-500 h-2 rounded-full" style="width: 65%"></div>
</div>
<span class="text-xs text-gray-600 dark:text-gray-400">65%</span>
</div>
</div>
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm p-6 border border-gray-200 dark:border-gray-700">
<div class="flex items-center justify-between mb-2">
<span class="text-sm font-medium text-gray-600 dark:text-gray-400">Completed</span>
<i data-feather="check-circle" class="w-5 h-5 text-green-500"></i>
</div>
<div class="text-2xl font-bold text-gray-900 dark:text-white">27</div>
<div class="mt-2 text-xs text-green-600 dark:text-green-400 font-medium">+5 today</div>
</div>
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm p-6 border border-gray-200 dark:border-gray-700">
<div class="flex items-center justify-between mb-2">
<span class="text-sm font-medium text-gray-600 dark:text-gray-400">In Progress</span>
<i data-feather="clock" class="w-5 h-5 text-blue-500"></i>
</div>
<div class="text-2xl font-bold text-gray-900 dark:text-white">8</div>
<div class="mt-2 text-xs text-blue-600 dark:text-blue-400 font-medium">3 critical</div>
</div>
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm p-6 border border-gray-200 dark:border-gray-700">
<div class="flex items-center justify-between mb-2">
<span class="text-sm font-medium text-gray-600 dark:text-gray-400">Pending</span>
<i data-feather="alert-circle" class="w-5 h-5 text-yellow-500"></i>
</div>
<div class="text-2xl font-bold text-gray-900 dark:text-white">7</div>
<div class="mt-2 text-xs text-yellow-600 dark:text-yellow-400 font-medium">Ready to start</div>
</div>
</div>
<!-- Project Phases -->
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6 mb-8">
<!-- Phase 1: Project Setup -->
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700">
<div class="p-6 border-b border-gray-200 dark:border-gray-700">
<div class="flex items-center justify-between mb-2">
<h3 class="text-lg font-semibold text-gray-900 dark:text-white">Project Setup</h3>
<svg class="w-16 h-16 progress-ring">
<circle cx="32" cy="32" r="28" stroke="#e5e7eb" stroke-width="4" fill="none"></circle>
<circle cx="32" cy="32" r="28" stroke="url(#gradient1)" stroke-width="4" fill="none"
stroke-dasharray="176" stroke-dashoffset="44" stroke-linecap="round"></circle>
<defs>
<linearGradient id="gradient1" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#667eea;stop-opacity:1" />
<stop offset="100%" style="stop-color:#764ba2;stop-opacity:1" />
</linearGradient>
</defs>
</svg>
</div>
<p class="text-sm text-gray-600 dark:text-gray-400">75% Complete</p>
</div>
<div class="p-6 space-y-3">
<div class="flex items-start space-x-3">
<input type="checkbox" class="checkbox-custom mt-1" checked>
<div class="flex-1">
<p class="text-sm font-medium text-gray-900 dark:text-white line-through">Initialize TypeScript project</p>
<p class="text-xs text-gray-500 dark:text-gray-400">tsconfig.json configured</p>
</div>
</div>
<div class="flex items-start space-x-3">
<input type="checkbox" class="checkbox-custom mt-1" checked>
<div class="flex-1">
<p class="text-sm font-medium text-gray-900 dark:text-white line-through">Set up Vite + React</p>
<p class="text-xs text-gray-500 dark:text-gray-400">Frontend structure ready</p>
</div>
</div>
<div class="flex items-start space-x-3">
<input type="checkbox" class="checkbox-custom mt-1" checked>
<div class="flex-1">
<p class="text-sm font-medium text-gray-900 dark:text-white line-through">Express backend setup</p>
<p class="text-xs text-gray-500 dark:text-gray-400">TypeScript configured</p>
</div>
</div>
<div class="flex items-start space-x-3">
<input type="checkbox" class="checkbox-custom mt-1">
<div class="flex-1">
<p class="text-sm font-medium text-gray-900 dark:text-white">Docker containerization</p>
<p class="text-xs text-gray-500 dark:text-gray-400">Create Dockerfile & docker-compose</p>
</div>
</div>
<div class="flex items-start space-x-3">
<input type="checkbox" class="checkbox-custom mt-1">
<div class="flex-1">
<p class="text-sm font-medium text-gray-900 dark:text-white">GitHub Actions CI/CD</p>
<p class="text-xs text-gray-500 dark:text-gray-400">Set up automated pipeline</p>
</div>
</div>
</div>
</div>
<!-- Phase 2: Jellyfin Integration -->
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700">
<div class="p-6 border-b border-gray-200 dark:border-gray-700">
<div class="flex items-center justify-between mb-2">
<h3 class="text-lg font-semibold text-gray-900 dark:text-white">Jellyfin Integration</h3>
<span class="px-3 py-1 bg-yellow-100 dark:bg-yellow-900 text-yellow-700 dark:text-yellow-300 text-xs font-medium rounded-full">
In Progress
</span>
</div>
<p class="text-sm text-gray-600 dark:text-gray-400">40% Complete</p>
</div>
<div class="p-6 space-y-3">
<div class="flex items-start space-x-3">
<input type="checkbox" class="checkbox-custom mt-1" checked>
<div class="flex-1">
<p class="text-sm font-medium text-gray-900 dark:text-white line-through">API client setup</p>
<p class="text-xs text-gray-500 dark:text-gray-400">Authentication flow ready</p>
</div>
</div>
<div class="flex items-start space-x-3">
<input type="checkbox" class="checkbox-custom mt-1" checked>
<div class="flex-1">
<p class="text-sm font-medium text-gray-900 dark:text-white line-through">Library fetching</p>
<p class="text-xs text-gray-500 dark:text-gray-400">Media items retrieved</p>
</div>
</div>
<div class="flex items-start space-x-3">
<input type="checkbox" class="checkbox-custom mt-1">
<div class="flex-1">
<p class="text-sm font-medium text-gray-900 dark:text-white">Poster retrieval</p>
<p class="text-xs text-gray-500 dark:text-gray-400">Image loading implementation</p>
<div class="mt-2">
<div class="w-full bg-gray-200 dark:bg-gray-700 rounded-full h-1.5">
<div class="bg-blue-500 h-1.5 rounded-full" style="width: 60%"></div>
</div>
</div>
</div>
</div>
<div class="flex items-start space-x-3">
<input type="checkbox" class="checkbox-custom mt-1">
<div class="flex-1">
<p class="text-sm font-medium text-gray-900 dark:text-white">Poster upload</p>
<p class="text-xs text-gray-500 dark:text-gray-400">Save back to Jellyfin</p>
</div>
</div>
<div class="flex items-start space-x-3">
<input type="checkbox" class="checkbox-custom mt-1">
<div class="flex-1">
<p class="text-sm font-medium text-gray-900 dark:text-white">Error handling</p>
<p class="text-xs text-gray-500 dark:text-gray-400">Rate limiting & retry logic</p>
</div>
</div>
</div>
</div>
<!-- Phase 3: TMDb Integration -->
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700">
<div class="p-6 border-b border-gray-200 dark:border-gray-700">
<div class="flex items-center justify-between mb-2">
<h3 class="text-lg font-semibold text-gray-900 dark:text-white">TMDb Integration</h3>
<span class="px-3 py-1 bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300 text-xs font-medium rounded-full">
Pending
</span>
</div>
<p class="text-sm text-gray-600 dark:text-gray-400">0% Complete</p>
</div>
<div class="p-6 space-y-3">
<div class="flex items-start space-x-3">
<input type="checkbox" class="checkbox-custom mt-1">
<div class="flex-1">
<p class="text-sm font-medium text-gray-900 dark:text-white">TMDb API client</p>
<p class="text-xs text-gray-500 dark:text-gray-400">Initialize client setup</p>
</div>
</div>
<div class="flex items-start space-x-3">
<input type="checkbox" class="checkbox-custom mt-1">
<div class="flex-1">
<p class="text-sm font-medium text-gray-900 dark:text-white">Alternative posters</p>
<p class="text-xs text-gray-500 dark:text-gray-400">Fetch multiple options</p>
</div>
</div>
<div class="flex items-start space-x-3">
<input type="checkbox" class="checkbox-custom mt-1">
<div class="flex-1">
<p class="text-sm font-medium text-gray-900 dark:text-white">Metadata enrichment</p>
<p class="text-xs text-gray-500 dark:text-gray-400">Genres, year, overview</p>
</div>
</div>
<div class="flex items-start space-x-3">
<input type="checkbox" class="checkbox-custom mt-1">
<div class="flex-1">
<p class="text-sm font-medium text-gray-900 dark:text-white">Selection interface</p>
<p class="text-xs text-gray-500 dark:text-gray-400">UI for poster options</p>
</div>
</div>
</div>
</div>
</div>
<!-- Additional Phases Grid -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
<!-- Template System -->
<div class="task-card bg-white dark:bg-gray-800 rounded-xl shadow-sm p-6 border border-gray-200 dark:border-gray-700 hover:shadow-xl">
<div class="flex items-center justify-between mb-4">
<div class="p-2 bg-orange-100 dark:bg-orange-900 rounded-lg">
<i data-feather="layout" class="w-5 h-5 text-orange-600 dark:text-orange-400"></i>
</div>
<span class="text-xs font-medium text-gray-500 dark:text-gray-400">Phase 4</span>
</div>
<h4 class="font-semibold text-gray-900 dark:text-white mb-2">Template System</h4>
<p class="text-xs text-gray-600 dark:text-gray-400 mb-4">JSON schema, card types, custom templates</p>
<div class="space-y-2">
<div class="flex items-center justify-between text-xs">
<span class="text-gray-500 dark:text-gray-400">Progress</span>
<span class="font-medium text-gray-900 dark:text-white">0%</span>
</div>
<div class="w-full bg-gray-200 dark:bg-gray-700 rounded-full h-2">
<div class="bg-orange-500 h-2 rounded-full" style="width: 0%"></div>
</div>
</div>
<div class="mt-4 flex flex-wrap gap-1">
<span class="tag-pill px-2 py-1 bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 text-xs rounded">JSON</span>
<span class="tag-pill px-2 py-1 bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 text-xs rounded">UI</span>
</div>
</div>
<!-- Rendering Engine -->
<div class="task-card bg-white dark:bg-gray-800 rounded-xl shadow-sm p-6 border border-gray-200 dark:border-gray-700 hover:shadow-xl">
<div class="flex items-center justify-between mb-4">
<div class="p-2 bg-green-100 dark:bg-green-900 rounded-lg">
<i data-feather="cpu" class="w-5 h-5 text-green-600 dark:text-green-400"></i>
</div>
<span class="text-xs font-medium text-gray-500 dark:text-gray-400">Phase 5</span>
</div>
<h4 class="font-semibold text-gray-900 dark:text-white mb-2">Rendering Engine</h4>
<p class="text-xs text-gray-600 dark:text-gray-400 mb-4">Canvas, WebGL, real-time preview</p>
<div class="space-y-2">
<div class="flex items-center justify-between text-xs">
<span class="text-gray-500 dark:text-gray-400">Progress</span>
<span class="font-medium text-gray-900 dark:text-white">0%</span>
</div>
<div class="w-full bg-gray-200 dark:bg-gray-700 rounded-full h-2">
<div class="bg-green-500 h-2 rounded-full" style="width: 0%"></div>
</div>
</div>
<div class="mt-4 flex flex-wrap gap-1">
<span class="tag-pill px-2 py-1 bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 text-xs rounded">WebGL</span>
<span class="tag-pill px-2 py-1 bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 text-xs rounded">Canvas</span>
</div>
</div>
<!-- Font System -->
<div class="task-card bg-white dark:bg-gray-800 rounded-xl shadow-sm p-6 border border-gray-200 dark:border-gray-700 hover:shadow-xl">
<div class="flex items-center justify-between mb-4">
<div class="p-2 bg-blue-100 dark:bg-blue-900 rounded-lg">
<i data-feather="type" class="w-5 h-5 text-blue-600 dark:text-blue-400"></i>
</div>
<span class="text-xs font-medium text-gray-500 dark:text-gray-400">Phase 6</span>
</div>
<h4 class="font-semibold text-gray-900 dark:text-white mb-2">Font System</h4>
<p class="text-xs text-gray-600 dark:text-gray-400 mb-4">Fontkit, metrics, management</p>
<div class="space-y-2">
<div class="flex items-center justify-between text-xs">
<span class="text-gray-500 dark:text-gray-400">Progress</span>
<span class="font-medium text-gray-900 dark:text-white">0%</span>
</div>
<div class="w-full bg-gray-200 dark:bg-gray-700 rounded-full h-2">
<div class="bg-blue-500 h-2 rounded-full" style="width: 0%"></div>
</div>
</div>
<div class="mt-4 flex flex-wrap gap-1">
<span class="tag-pill px-2 py-1 bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 text-xs rounded">Fonts</span>
<span class="tag-pill px-2 py-1 bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 text-xs rounded">Typography</span>
</div>
</div>
<!-- User Interface -->
<div class="task-card bg-white dark:bg-gray-800 rounded-xl shadow-sm p-6 border border-gray-200 dark:border-gray-700 hover:shadow-xl">
<div class="flex items-center justify-between mb-4">
<div class="p-2 bg-purple-100 dark:bg-purple-900 rounded-lg">
<i data-feather="monitor" class="w-5 h-5 text-purple-600 dark:text-purple-400"></i>
</div>
<span class="text-xs font-medium text-gray-500 dark:text-gray-400">Phase 7</span>
</div>
<h4 class="font-semibold text-gray-900 dark:text-white mb-2">User Interface</h4>
<p class="text-xs text-gray-600 dark:text-gray-400 mb-4">Editor layout, controls, preview</p>
<div class="space-y-2">
<div class="flex items-center justify-between text-xs">
<span class="text-gray-500 dark:text-gray-400">Progress</span>
<span class="font-medium text-gray-900 dark:text-white">0%</span>
</div>
<div class="w-full bg-gray-200 dark:bg-gray-700 rounded-full h-2">
<div class="bg-purple-500 h-2 rounded-full" style="width: 0%"></div>
</div>
</div>
<div class="mt-4 flex flex-wrap gap-1">
<span class="tag-pill px-2 py-1 bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 text-xs rounded">React</span>
<span class="tag-pill px-2 py-1 bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 text-xs rounded">UI/UX</span>
</div>
</div>
</div>
<!-- Testing & Validation Section -->
<div class="mt-8 bg-gradient-to-r from-purple-600 to-pink-600 rounded-xl p-8 text-white">
<div class="flex items-center justify-between mb-6">
<div>
<h3 class="text-2xl font-bold mb-2">Testing & Validation</h3>
<p class="text-purple-100">Phase 8: Comprehensive testing strategy</p>
</div>
<div class="text-right">
<div class="text-3xl font-bold">0%</div>
<div class="text-sm text-purple-100">Not Started</div>
</div>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<div class="glass-effect rounded-lg p-4">
<div class="flex items-center space-x-3 mb-2">
<i data-feather="code" class="w-5 h-5"></i>
<h4 class="font-semibold">Unit Tests</h4>
</div>
<p class="text-sm text-purple-100">Core utilities and rendering logic</p>
<div class="mt-3 flex items-center space-x-2">
<span class="px-2 py-1 bg-white/20 text-xs rounded">Jest</span>
<span class="px-2 py-1 bg-white/20 text-xs rounded">Coverage: 0%</span>
</div>
</div>
<div class="glass-effect rounded-lg p-4">
<div class="flex items-center space-x-3 mb-2">
<i data-feather="layers" class="w-5 h-5"></i>
<h4 class="font-semibold">Component Tests</h4>
</div>
<p class="text-sm text-purple-100">UI elements and interactions</p>
<div class="mt-3 flex items-center space-x-2">
<span class="px-2 py-1 bg-white/20 text-xs rounded">RTL</span>
<span class="px-2 py-1 bg-white/20 text-xs rounded">Coverage: 0%</span>
</div>
</div>
<div class="glass-effect rounded-lg p-4">
<div class="flex items-center space-x-3 mb-2">
<i data-feather="globe" class="w-5 h-5"></i>
<h4 class="font-semibold">E2E Tests</h4>
</div>
<p class="text-sm text-purple-100">Full application workflows</p>
<div class="mt-3 flex items-center space-x-2">
<span class="px-2 py-1 bg-white/20 text-xs rounded">Playwright</span>
<span class="px-2 py-1 bg-white/20 text-xs rounded">Scenarios: 0</span>
</div>
</div>
</div>
</div>
</main>
<!-- Footer -->
<footer class="mt-12 bg-white dark:bg-gray-800 border-t border-gray-200 dark:border-gray-700">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6">
<div class="flex items-center justify-between">
<p class="text-sm text-gray-600 dark:text-gray-400">
© 2024 PosterCraft Studio. Building the ultimate poster customization tool.
</p>
<div class="flex items-center space-x-4">
<a href="#" class="text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors">
<i data-feather="github" class="w-5 h-5"></i>
</a>
<a href="#" class="text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors">
<i data-feather="external-link" class="w-5 h-5"></i>
</a>
</div>
</div>
</div>
</footer>
<script>
// Initialize Feather Icons
feather.replace();
// Theme Toggle
function toggleTheme() {
document.documentElement.classList.toggle('dark');
localStorage.setItem('theme', document.documentElement.classList.contains('dark') ? 'dark' : 'light');
}
// Load saved theme
if (localStorage.getItem('theme') === 'dark' || (!localStorage.getItem('theme') && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
document.documentElement.classList.add('dark');
}
// Animate stats on load
anime({
targets: '.task-card',
translateY: [50, 0],
opacity: [0, 1],
delay: anime.stagger(100),
duration: 800,
easing: 'easeOutExpo'
});
// Animate progress bars
anime({
targets: '[style*="width"]',
width: [0, function(el) {
return el.style.width;
}],
duration: 1500,
delay: 500,
easing: 'easeOutExpo'
});
// Interactive checkbox animations
document.querySelectorAll('.checkbox-custom').forEach(checkbox => {
checkbox.addEventListener('change', function() {
if (this.checked) {
anime({
targets: this,
scale: [1, 1.2, 1],
duration: 300,
easing: 'easeInOutQuad'
});
// Animate the text line-through
const textContainer = this.nextElementSibling.querySelector('p:first-child');
if (textContainer && !textContainer.classList.contains('line-through')) {
anime({
targets: textContainer,
opacity: [1, 0.5],
duration: 300
});
textContainer.classList.add('line-through');
}
}
});
});
// Add hover effect to cards
document.querySelectorAll('.task-card').forEach(card => {
card.addEventListener('mouseenter', function() {
anime({
targets: this,
scale: 1.02,
duration: 300,
easing: 'easeOutQuad'
});
});
card.addEventListener('mouseleave', function() {
anime({
targets: this,
scale: 1,
duration: 300,
easing: 'easeOutQuad'
});
});
});
// Simulate real-time updates
setInterval(() => {
const completed = document.querySelectorAll('.checkbox-custom:checked').length;
const total = document.querySelectorAll('.checkbox-custom').length;
const percentage = Math.round((completed / total) * 100);
// Update main progress stat
const mainProgress = document.querySelector('.bg-gradient-to-r.from-purple-500.to-pink-500');
if (mainProgress) {
mainProgress.style.width = percentage + '%';
}
}, 1000);
</script>
</body>
</html>