|
|
<!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 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 class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8"> |
|
|
|
|
|
<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> |
|
|
|
|
|
|
|
|
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6 mb-8"> |
|
|
|
|
|
<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> |
|
|
|
|
|
|
|
|
<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> |
|
|
|
|
|
|
|
|
<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> |
|
|
|
|
|
|
|
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6"> |
|
|
|
|
|
<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> |
|
|
|
|
|
|
|
|
<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> |
|
|
|
|
|
|
|
|
<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> |
|
|
|
|
|
|
|
|
<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> |
|
|
|
|
|
|
|
|
<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 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> |
|
|
|
|
|
feather.replace(); |
|
|
|
|
|
|
|
|
function toggleTheme() { |
|
|
document.documentElement.classList.toggle('dark'); |
|
|
localStorage.setItem('theme', document.documentElement.classList.contains('dark') ? 'dark' : 'light'); |
|
|
} |
|
|
|
|
|
|
|
|
if (localStorage.getItem('theme') === 'dark' || (!localStorage.getItem('theme') && window.matchMedia('(prefers-color-scheme: dark)').matches)) { |
|
|
document.documentElement.classList.add('dark'); |
|
|
} |
|
|
|
|
|
|
|
|
anime({ |
|
|
targets: '.task-card', |
|
|
translateY: [50, 0], |
|
|
opacity: [0, 1], |
|
|
delay: anime.stagger(100), |
|
|
duration: 800, |
|
|
easing: 'easeOutExpo' |
|
|
}); |
|
|
|
|
|
|
|
|
anime({ |
|
|
targets: '[style*="width"]', |
|
|
width: [0, function(el) { |
|
|
return el.style.width; |
|
|
}], |
|
|
duration: 1500, |
|
|
delay: 500, |
|
|
easing: 'easeOutExpo' |
|
|
}); |
|
|
|
|
|
|
|
|
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' |
|
|
}); |
|
|
|
|
|
|
|
|
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'); |
|
|
} |
|
|
} |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
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' |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
setInterval(() => { |
|
|
const completed = document.querySelectorAll('.checkbox-custom:checked').length; |
|
|
const total = document.querySelectorAll('.checkbox-custom').length; |
|
|
const percentage = Math.round((completed / total) * 100); |
|
|
|
|
|
|
|
|
const mainProgress = document.querySelector('.bg-gradient-to-r.from-purple-500.to-pink-500'); |
|
|
if (mainProgress) { |
|
|
mainProgress.style.width = percentage + '%'; |
|
|
} |
|
|
}, 1000); |
|
|
</script> |
|
|
</body> |
|
|
</html> |
|
|
|