 1a66ebdfc4
			
		
	
	
		1a66ebdfc4
		
	
	
	
	
		
			
			- 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
 |