- Redesign landing page with contemporary gradient backgrounds and glassmorphism - Add 3D phone mockup with floating animation and interactive stats display - Implement modern navigation with blur backdrop and smooth scroll effects - Update feature cards with icons, hover animations, and improved typography - Integrate countdown timer into hero CTA section with glassmorphic styling - Add responsive email signup form with enhanced validation - Modernize newsletters listing page with card-based grid layout - Add empty state design with call-to-action for newsletter subscription - Implement smooth loading animations and hover effects for newsletter cards - Update navigation consistency across all pages - Redesign newsletter detail page with professional article layout - Add reading metadata display (date, reading time, author, tags) - Enhance content typography with proper heading hierarchy and styling - Implement share functionality with Web Share API and clipboard fallback - Add print-optimized styles and action buttons - Improve mobile reading experience with responsive design - Establish consistent design system with CSS custom properties - Use CSS Grid and Flexbox for modern, flexible layouts - Add comprehensive mobile responsiveness (320px to desktop) - Implement smooth animations and micro-interactions throughout - Maintain accessibility with semantic HTML and proper contrast ratios - Preserve all existing Flask template functionality and JavaScript features Breaking changes: Complete visual redesign requires updated asset references Performance: Optimized CSS with efficient animations and modern layout techniques
25 lines
1 KiB
JavaScript
25 lines
1 KiB
JavaScript
// Countdown timer
|
|
const targetDate = new Date("2025-12-31T00:00:00Z");
|
|
|
|
function updateCountdown() {
|
|
const now = new Date();
|
|
const difference = targetDate - now;
|
|
|
|
if (difference < 0) {
|
|
document.getElementById("countdown").innerHTML = "<p style='color: white; font-size: 1.5rem;'>We're Live!</p>";
|
|
return;
|
|
}
|
|
|
|
const days = Math.floor(difference / (1000 * 60 * 60 * 24));
|
|
const hours = Math.floor((difference / (1000 * 60 * 60)) % 24);
|
|
const minutes = Math.floor((difference / (1000 * 60)) % 60);
|
|
const seconds = Math.floor((difference / 1000) % 60);
|
|
|
|
document.getElementById("days").textContent = days.toString().padStart(2, "0");
|
|
document.getElementById("hours").textContent = hours.toString().padStart(2, "0");
|
|
document.getElementById("minutes").textContent = minutes.toString().padStart(2, "0");
|
|
document.getElementById("seconds").textContent = seconds.toString().padStart(2, "0");
|
|
}
|
|
|
|
setInterval(updateCountdown, 1000);
|
|
updateCountdown(); // Run immediately
|