feat: add favicon, one stylesheet, base.html
This commit is contained in:
		
							parent
							
								
									2e9bda85c7
								
							
						
					
					
						commit
						7a31bb7e3a
					
				
					 7 changed files with 1166 additions and 671 deletions
				
			
		
							
								
								
									
										69
									
								
								templates/base.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								templates/base.html
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,69 @@ | |||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
| <head> | ||||
|   <meta charset="UTF-8" /> | ||||
|   <meta | ||||
|     name="viewport" | ||||
|     content="width=device-width, initial-scale=1, viewport-fit=cover" | ||||
|   /> | ||||
|   <title>{% block title %}RideAware{% endblock %}</title> | ||||
| 
 | ||||
|   <link | ||||
|     href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" | ||||
|     rel="stylesheet" | ||||
|   /> | ||||
|   <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | ||||
|   <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"> | ||||
|   <link | ||||
|     rel="stylesheet" | ||||
|     href="{{ url_for('static', filename='css/styles.css') }}" | ||||
|   /> | ||||
| 
 | ||||
|   <link | ||||
|     rel="alternate icon" | ||||
|     type="image/png" | ||||
|     sizes="32x32" | ||||
|     href="{{ url_for('static', filename='assets/32x32.png') }}" | ||||
|   /> | ||||
|   <link | ||||
|     rel="apple-touch-icon" | ||||
|     sizes="180x180" | ||||
|     href="{{ url_for('static', filename='assets/apple-touch-icon.png') }}" | ||||
|   /> | ||||
|   <link | ||||
|     rel="manifest" | ||||
|     href="{{ url_for('static', filename='assets/site.webmanifest') }}" | ||||
|   /> | ||||
|   <meta | ||||
|     name="theme-color" | ||||
|     content="#0f172a" | ||||
|   /> | ||||
| 
 | ||||
|   {% block extra_head %}{% endblock %} | ||||
| </head> | ||||
| <body> | ||||
|   <nav class="navbar"> | ||||
|     <div class="nav-container"> | ||||
|       <a href="/" class="logo">Ride<span class="logo-accent">Aware</span></a> | ||||
|       <ul class="nav-links"> | ||||
|         <li><a href="#features">Features</a></li> | ||||
|         <li><a href="/newsletters">Newsletters</a></li> | ||||
|       </ul> | ||||
|     </div> | ||||
|   </nav> | ||||
| 
 | ||||
|   {% block content %}{% endblock %} | ||||
| 
 | ||||
|   <footer class="footer"> | ||||
|     <p>© 2025 RideAware. All rights reserved.</p> | ||||
|   </footer> | ||||
| 
 | ||||
|   <script | ||||
|     defer | ||||
|     src="https://cdn.statically.io/gl/rideaware/landing/06d19988c7df53636277f945f9ed853bda76471b/static/js/main.min.js" | ||||
|     crossorigin="anonymous" | ||||
|   ></script> | ||||
| 
 | ||||
|   {% block extra_scripts %}{% endblock %} | ||||
| </body> | ||||
| </html> | ||||
|  | @ -1,164 +1,204 @@ | |||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
| <head> | ||||
|     <meta charset="UTF-8"> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
|     <title>RideAware - Smart Cycling Training Platform</title> | ||||
|     <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet"> | ||||
|     <link rel="preconnect" href="https://cdn.statically.io" crossorigin> | ||||
|     <link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}"> | ||||
| <!-- templates/index.html --> | ||||
| {% extends "base.html" %} | ||||
| 
 | ||||
| </head> | ||||
| <body> | ||||
|     <!-- Navigation --> | ||||
|     <nav class="navbar"> | ||||
|         <div class="nav-container"> | ||||
|             <a href="#" class="logo">Ride<span class="logo-accent">Aware</span></a> | ||||
|             <ul class="nav-links"> | ||||
|                 <li><a href="#features">Features</a></li> | ||||
|                 <li><a href="/newsletters">Newsletters</a></li> | ||||
|             </ul> | ||||
| {% block title %}RideAware - Smart Cycling Training Platform{% endblock %} | ||||
| 
 | ||||
| {% block content %} | ||||
|   <!-- Hero Section --> | ||||
|   <section class="hero"> | ||||
|     <div class="hero-container"> | ||||
|       <div class="hero-content"> | ||||
|         <h1>Elevate Your Cycling Journey</h1> | ||||
|         <p class="subtitle"> | ||||
|           The ultimate smart training platform for cyclists who demand excellence | ||||
|           in every ride. | ||||
|         </p> | ||||
| 
 | ||||
|         <div class="cta-section"> | ||||
|           <h3>Coming soon!</h3> | ||||
|           <p>Join us while waiting for launch</p> | ||||
| 
 | ||||
|           <div class="email-form"> | ||||
|             <input | ||||
|               type="email" | ||||
|               class="email-input" | ||||
|               id="email-input" | ||||
|               placeholder="Enter your email address" | ||||
|               required | ||||
|             /> | ||||
|             <button class="notify-btn" id="notify-button">Notify Me</button> | ||||
|           </div> | ||||
|         </div> | ||||
|     </nav> | ||||
|       </div> | ||||
| 
 | ||||
|     <!-- Hero Section --> | ||||
|     <section class="hero"> | ||||
|         <div class="hero-container"> | ||||
|             <div class="hero-content"> | ||||
|                 <h1>Elevate Your Cycling Journey</h1> | ||||
|                 <p class="subtitle">The ultimate smart training platform for cyclists who demand excellence in every ride.</p> | ||||
|                  | ||||
|                 <div class="cta-section"> | ||||
|                     <h3>Coming soon!</h3> | ||||
|                     <p>Join us while waiting for launch</p> | ||||
|                      | ||||
|                     <div class="email-form"> | ||||
|                         <input type="email" class="email-input" id="email-input" placeholder="Enter your email address" required> | ||||
|                         <button class="notify-btn" id="notify-button">Notify Me</button> | ||||
|                     </div> | ||||
|                 </div> | ||||
|             </div> | ||||
| 
 | ||||
|             <div class="hero-visual"> | ||||
|                 <div class="phone-mockup"> | ||||
|                     <div class="screen"> | ||||
|                         <div class="app-interface"> | ||||
|                             <div class="app-logo">RideAware</div> | ||||
|                             <div class="stats-grid"> | ||||
|                                 <div class="stat-card"> | ||||
|                                     <div class="stat-number">24.5</div> | ||||
|                                     <div class="stat-label">KM/H AVG</div> | ||||
|                                 </div> | ||||
|                                 <div class="stat-card"> | ||||
|                                     <div class="stat-number">45</div> | ||||
|                                     <div class="stat-label">MINUTES</div> | ||||
|                                 </div> | ||||
|                                 <div class="stat-card"> | ||||
|                                     <div class="stat-number">285</div> | ||||
|                                     <div class="stat-label">CALORIES</div> | ||||
|                                 </div> | ||||
|                                 <div class="stat-card"> | ||||
|                                     <div class="stat-number">18.2</div> | ||||
|                                     <div class="stat-label">DISTANCE</div> | ||||
|                                 </div> | ||||
|                             </div> | ||||
|                         </div> | ||||
|                     </div> | ||||
|       <div class="hero-visual"> | ||||
|         <div class="phone-mockup"> | ||||
|           <div class="screen"> | ||||
|             <div class="app-interface"> | ||||
|               <div class="app-logo">RideAware</div> | ||||
|               <div class="stats-grid"> | ||||
|                 <div class="stat-card"> | ||||
|                   <div class="stat-number">24.5</div> | ||||
|                   <div class="stat-label">KM/H AVG</div> | ||||
|                 </div> | ||||
|                 <div class="stat-card"> | ||||
|                   <div class="stat-number">45</div> | ||||
|                   <div class="stat-label">MINUTES</div> | ||||
|                 </div> | ||||
|                 <div class="stat-card"> | ||||
|                   <div class="stat-number">285</div> | ||||
|                   <div class="stat-label">CALORIES</div> | ||||
|                 </div> | ||||
|                 <div class="stat-card"> | ||||
|                   <div class="stat-number">18.2</div> | ||||
|                   <div class="stat-label">DISTANCE</div> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|     </section> | ||||
|       </div> | ||||
|     </div> | ||||
|   </section> | ||||
| 
 | ||||
|     <!-- Features Section --> | ||||
|     <section class="features" id="features"> | ||||
|         <div class="section-header"> | ||||
|             <h2>Powerful Features for Every Cyclist</h2> | ||||
|             <p>From beginners to professionals, RideAware provides comprehensive tools to optimize your training and performance.</p> | ||||
|   <!-- Features Section --> | ||||
|   <section class="features" id="features"> | ||||
|     <div class="section-header"> | ||||
|       <h2>Powerful Features for Every Cyclist</h2> | ||||
|       <p> | ||||
|         From beginners to professionals, RideAware provides comprehensive tools | ||||
|         to optimize your training and performance. | ||||
|       </p> | ||||
|     </div> | ||||
| 
 | ||||
|     <div class="features-container"> | ||||
|       <div class="features-grid"> | ||||
|         <div class="feature-card"> | ||||
|           <div class="feature-icon"> | ||||
|             <i class="fas fa-calendar-alt"></i> | ||||
|           </div> | ||||
|           <h3>Smart Training Plans</h3> | ||||
|           <ul class="feature-list"> | ||||
|             <li> | ||||
|               <strong>AI-Powered Planning:</strong> Customized training plans | ||||
|               based on your goals and fitness level | ||||
|             </li> | ||||
|             <li> | ||||
|               <strong>Adaptive Scheduling:</strong> Smart workout scheduling | ||||
|               with automated reminders | ||||
|             </li> | ||||
|             <li> | ||||
|               <strong>Goal Tracking:</strong> Set and monitor your cycling | ||||
|               objectives in real-time | ||||
|             </li> | ||||
|           </ul> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="features-container"> | ||||
|             <div class="features-grid"> | ||||
|                 <div class="feature-card"> | ||||
|                     <div class="feature-icon"> | ||||
|                         <i class="fas fa-calendar-alt"></i> | ||||
|                     </div> | ||||
|                     <h3>Smart Training Plans</h3> | ||||
|                     <ul class="feature-list"> | ||||
|                         <li><strong>AI-Powered Planning:</strong> Customized training plans based on your goals and fitness level</li> | ||||
|                         <li><strong>Adaptive Scheduling:</strong> Smart workout scheduling with automated reminders</li> | ||||
|                         <li><strong>Goal Tracking:</strong> Set and monitor your cycling objectives in real-time</li> | ||||
|                     </ul> | ||||
|                 </div> | ||||
| 
 | ||||
|                 <div class="feature-card"> | ||||
|                     <div class="feature-icon"> | ||||
|                         <i class="fas fa-chart-line"></i> | ||||
|                     </div> | ||||
|                     <h3>Advanced Analytics</h3> | ||||
|                     <ul class="feature-list"> | ||||
|                         <li><strong>Detailed Logging:</strong> Track exercises, sets, reps, and performance metrics</li> | ||||
|                         <li><strong>Data Visualization:</strong> Interactive charts, graphs, and progress statistics</li> | ||||
|                         <li><strong>Progress Insights:</strong> Monitor your improvement over time with AI analysis</li> | ||||
|                     </ul> | ||||
|                 </div> | ||||
| 
 | ||||
|                 <div class="feature-card"> | ||||
|                     <div class="feature-icon"> | ||||
|                         <i class="fas fa-bicycle"></i> | ||||
|                     </div> | ||||
|                     <h3>Virtual Training</h3> | ||||
|                     <ul class="feature-list"> | ||||
|                         <li><strong>Expert Coaching:</strong> Professional guidance to achieve your cycling goals</li> | ||||
|                         <li><strong>Immersive Rides:</strong> Virtual training experiences to boost performance</li> | ||||
|                         <li><strong>Structured Workouts:</strong> Designed programs for fitness and performance gains</li> | ||||
|                     </ul> | ||||
|                 </div> | ||||
| 
 | ||||
|                 <div class="feature-card"> | ||||
|                     <div class="feature-icon"> | ||||
|                         <i class="fas fa-heart"></i> | ||||
|                     </div> | ||||
|                     <h3>Health & Recovery</h3> | ||||
|                     <ul class="feature-list"> | ||||
|                         <li><strong>Nutrition Tracking:</strong> Plan and monitor your dietary intake for optimal performance</li> | ||||
|                         <li><strong>Recovery Optimization:</strong> Tools and resources for effective rest and recovery</li> | ||||
|                         <li><strong>Injury Prevention:</strong> Proactive measures to prevent and manage injuries</li> | ||||
|                     </ul> | ||||
|                 </div> | ||||
| 
 | ||||
|                 <div class="feature-card"> | ||||
|                     <div class="feature-icon"> | ||||
|                         <i class="fas fa-users"></i> | ||||
|                     </div> | ||||
|                     <h3>Community & Social</h3> | ||||
|                     <ul class="feature-list"> | ||||
|                         <li><strong>Social Sharing:</strong> Share achievements and progress on social platforms</li> | ||||
|                         <li><strong>Active Community:</strong> Connect with fellow cyclists and share experiences</li> | ||||
|                         <li><strong>Competitive Leaderboards:</strong> Challenge yourself against the community</li> | ||||
|                     </ul> | ||||
|                 </div> | ||||
| 
 | ||||
|                 <div class="feature-card"> | ||||
|                     <div class="feature-icon"> | ||||
|                         <i class="fas fa-sync-alt"></i> | ||||
|                     </div> | ||||
|                     <h3>Smart Integration</h3> | ||||
|                     <ul class="feature-list"> | ||||
|                         <li><strong>Wearable Sync:</strong> Connect with fitness trackers and smart devices</li> | ||||
|                         <li><strong>Music Integration:</strong> Seamlessly sync with your favorite music services</li> | ||||
|                         <li><strong>Data Portability:</strong> Easy import/export to other cycling platforms</li> | ||||
|                     </ul> | ||||
|                 </div> | ||||
|             </div> | ||||
|         <div class="feature-card"> | ||||
|           <div class="feature-icon"> | ||||
|             <i class="fas fa-chart-line"></i> | ||||
|           </div> | ||||
|           <h3>Advanced Analytics</h3> | ||||
|           <ul class="feature-list"> | ||||
|             <li> | ||||
|               <strong>Detailed Logging:</strong> Track exercises, sets, reps, | ||||
|               and performance metrics | ||||
|             </li> | ||||
|             <li> | ||||
|               <strong>Data Visualization:</strong> Interactive charts, graphs, | ||||
|               and progress statistics | ||||
|             </li> | ||||
|             <li> | ||||
|               <strong>Progress Insights:</strong> Monitor your improvement over | ||||
|               time with AI analysis | ||||
|             </li> | ||||
|           </ul> | ||||
|         </div> | ||||
|     </section> | ||||
| 
 | ||||
|     <!-- Footer --> | ||||
|     <footer class="footer"> | ||||
|         <p>© 2025 RideAware. All rights reserved.</p> | ||||
|     </footer> | ||||
|     <script defer | ||||
|     src="https://cdn.statically.io/gl/rideaware/landing/06d19988c7df53636277f945f9ed853bda76471b/static/js/main.min.js" | ||||
|     crossorigin="anonymous"></script> | ||||
| </body> | ||||
| </html> | ||||
|         <div class="feature-card"> | ||||
|           <div class="feature-icon"> | ||||
|             <i class="fas fa-bicycle"></i> | ||||
|           </div> | ||||
|           <h3>Virtual Training</h3> | ||||
|           <ul class="feature-list"> | ||||
|             <li> | ||||
|               <strong>Expert Coaching:</strong> Professional guidance to achieve | ||||
|               your cycling goals | ||||
|             </li> | ||||
|             <li> | ||||
|               <strong>Immersive Rides:</strong> Virtual training experiences to | ||||
|               boost performance | ||||
|             </li> | ||||
|             <li> | ||||
|               <strong>Structured Workouts:</strong> Designed programs for | ||||
|               fitness and performance gains | ||||
|             </li> | ||||
|           </ul> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="feature-card"> | ||||
|           <div class="feature-icon"> | ||||
|             <i class="fas fa-heart"></i> | ||||
|           </div> | ||||
|           <h3>Health & Recovery</h3> | ||||
|           <ul class="feature-list"> | ||||
|             <li> | ||||
|               <strong>Nutrition Tracking:</strong> Plan and monitor your dietary | ||||
|               intake for optimal performance | ||||
|             </li> | ||||
|             <li> | ||||
|               <strong>Recovery Optimization:</strong> Tools and resources for | ||||
|               effective rest and recovery | ||||
|             </li> | ||||
|             <li> | ||||
|               <strong>Injury Prevention:</strong> Proactive measures to prevent | ||||
|               and manage injuries | ||||
|             </li> | ||||
|           </ul> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="feature-card"> | ||||
|           <div class="feature-icon"> | ||||
|             <i class="fas fa-users"></i> | ||||
|           </div> | ||||
|           <h3>Community & Social</h3> | ||||
|           <ul class="feature-list"> | ||||
|             <li> | ||||
|               <strong>Social Sharing:</strong> Share achievements and progress | ||||
|               on social platforms | ||||
|             </li> | ||||
|             <li> | ||||
|               <strong>Active Community:</strong> Connect with fellow cyclists | ||||
|               and share experiences | ||||
|             </li> | ||||
|             <li> | ||||
|               <strong>Competitive Leaderboards:</strong> Challenge yourself | ||||
|               against the community | ||||
|             </li> | ||||
|           </ul> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="feature-card"> | ||||
|           <div class="feature-icon"> | ||||
|             <i class="fas fa-sync-alt"></i> | ||||
|           </div> | ||||
|           <h3>Smart Integration</h3> | ||||
|           <ul class="feature-list"> | ||||
|             <li> | ||||
|               <strong>Wearable Sync:</strong> Connect with fitness trackers and | ||||
|               smart devices | ||||
|             </li> | ||||
|             <li> | ||||
|               <strong>Music Integration:</strong> Seamlessly sync with your | ||||
|               favorite music services | ||||
|             </li> | ||||
|             <li> | ||||
|               <strong>Data Portability:</strong> Easy import/export to other | ||||
|               cycling platforms | ||||
|             </li> | ||||
|           </ul> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|   </section> | ||||
| {% endblock %} | ||||
|  | @ -1,130 +1,114 @@ | |||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
| <head> | ||||
|     <meta charset="UTF-8"> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
|     <title>RideAware - {{ newsletter.subject if newsletter else 'Newsletter Detail' }}</title> | ||||
|     <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet"> | ||||
|     <link rel="preconnect" href="https://cdn.statically.io" crossorigin> | ||||
| {% extends "base.html" %} | ||||
| 
 | ||||
|     <link rel="preload" as="style" | ||||
|         href="https://cdn.statically.io/gl/rideaware/landing/main/static/css/newsletter_styles.min.css" | ||||
|         onload="this.onload=null;this.rel='stylesheet'"> | ||||
|     <noscript> | ||||
|     <link rel="stylesheet" | ||||
|             href="https://cdn.statically.io/gl/rideaware/landing/main/static/css/newsletter_styles.min.css"> | ||||
|     </noscript> | ||||
| </head> | ||||
| <body> | ||||
|     <!-- Navigation --> | ||||
|     <nav class="navbar"> | ||||
|         <div class="nav-container"> | ||||
|             <a href="/" class="logo">Ride<span class="logo-accent">Aware</span></a> | ||||
|             <ul class="nav-links"> | ||||
|                 <li><a href="/">Home</a></li> | ||||
|                 <li><a href="/newsletters">Newsletters</a></li> | ||||
|             </ul> | ||||
| {% block title %} | ||||
|   RideAware - {{ newsletter.subject if newsletter else 'Newsletter Detail' }} | ||||
| {% endblock %} | ||||
| 
 | ||||
| {% block content %} | ||||
|   <div class="article-wrap"> | ||||
|     <aside class="article-aside"> | ||||
|       <a href="/newsletters" class="back-link"> | ||||
|         <i class="fas fa-arrow-left"></i> | ||||
|         Back to Newsletters | ||||
|       </a> | ||||
| 
 | ||||
|       <div class="article-meta"> | ||||
|         <h2 class="article-title">{{ newsletter.subject if newsletter else 'Newsletter Title' }}</h2> | ||||
|         <div class="meta-row"> | ||||
|           <i class="fas fa-calendar-alt"></i> | ||||
|           <span>{{ newsletter.sent_at if newsletter else 'Published Date' }}</span> | ||||
|         </div> | ||||
|     </nav> | ||||
|         {% if newsletter and newsletter.get('reading_time') %} | ||||
|         <div class="meta-row"> | ||||
|           <i class="fas fa-clock"></i> | ||||
|           <span>{{ newsletter.reading_time }} min read</span> | ||||
|         </div> | ||||
|         {% endif %} | ||||
|         {% if newsletter and newsletter.get('author') %} | ||||
|         <div class="meta-row"> | ||||
|           <i class="fas fa-user"></i> | ||||
|           <span>{{ newsletter.author }}</span> | ||||
|         </div> | ||||
|         {% endif %} | ||||
| 
 | ||||
|     <!-- Back Navigation --> | ||||
|     <div class="back-navigation"> | ||||
|         <a href="/newsletters" class="back-link"> | ||||
|             <i class="fas fa-arrow-left"></i> | ||||
|             Back to Newsletters | ||||
|         {% if newsletter and newsletter.get('tags') %} | ||||
|         <div class="article-tags"> | ||||
|           {% for tag in newsletter.tags %} | ||||
|           <span class="tag">{{ tag }}</span> | ||||
|           {% endfor %} | ||||
|         </div> | ||||
|         {% endif %} | ||||
|       </div> | ||||
| 
 | ||||
|       <nav class="toc"> | ||||
|         <div class="toc-title">On this page</div> | ||||
|         <ol id="toc-list"></ol> | ||||
|       </nav> | ||||
|     </aside> | ||||
| 
 | ||||
|     <main class="article-main"> | ||||
|       <header class="article-hero"> | ||||
|         <div class="newsletter-icon"><i class="fas fa-envelope-open-text"></i></div> | ||||
|         <h1>{{ newsletter.subject if newsletter else 'Newsletter Title' }}</h1> | ||||
|       </header> | ||||
| 
 | ||||
|       <article class="newsletter-content" id="article"> | ||||
|         {% if newsletter %} | ||||
|           {{ newsletter.body | safe }} | ||||
|         {% else %} | ||||
|           <h2>Welcome to RideAware Newsletter</h2> | ||||
|           <p>Sample content…</p> | ||||
|         {% endif %} | ||||
|       </article> | ||||
| 
 | ||||
|       <div class="newsletter-actions"> | ||||
|         <a href="/newsletters" class="action-btn primary"> | ||||
|           <i class="fas fa-list"></i> | ||||
|           View All Newsletters | ||||
|         </a> | ||||
|     </div> | ||||
| 
 | ||||
|     <!-- Main Content --> | ||||
|     <main class="main-content"> | ||||
|         <!-- Newsletter Header --> | ||||
|         <div class="newsletter-header"> | ||||
|             <div class="newsletter-icon"> | ||||
|                 <i class="fas fa-envelope-open-text"></i> | ||||
|             </div> | ||||
|             <h1>{{ newsletter.subject if newsletter else 'Newsletter Title' }}</h1> | ||||
|              | ||||
|             <div class="newsletter-meta"> | ||||
|                 <div class="meta-item"> | ||||
|                     <i class="fas fa-calendar-alt"></i> | ||||
|                     <span>{{ newsletter.sent_at if newsletter else 'Published Date' }}</span> | ||||
|                 </div> | ||||
|                 {% if newsletter and newsletter.get('reading_time') %} | ||||
|                 <div class="meta-item"> | ||||
|                     <i class="fas fa-clock"></i> | ||||
|                     <span>{{ newsletter.reading_time }} min read</span> | ||||
|                 </div> | ||||
|                 {% endif %} | ||||
|                 {% if newsletter and newsletter.get('author') %} | ||||
|                 <div class="meta-item"> | ||||
|                     <i class="fas fa-user"></i> | ||||
|                     <span>{{ newsletter.author }}</span> | ||||
|                 </div> | ||||
|                 {% endif %} | ||||
|             </div> | ||||
| 
 | ||||
|             {% if newsletter and newsletter.get('tags') %} | ||||
|             <div class="newsletter-tags"> | ||||
|                 {% for tag in newsletter.tags %} | ||||
|                 <span class="tag">{{ tag }}</span> | ||||
|                 {% endfor %} | ||||
|             </div> | ||||
|             {% else %} | ||||
|             <div class="newsletter-tags"> | ||||
|                 <span class="tag">Cycling Tips</span> | ||||
|                 <span class="tag">Training</span> | ||||
|                 <span class="tag">Performance</span> | ||||
|             </div> | ||||
|             {% endif %} | ||||
|         </div> | ||||
| 
 | ||||
|         <!-- Newsletter Content --> | ||||
|         <article class="newsletter-content"> | ||||
|             {% if newsletter %} | ||||
|                 {{ newsletter.body | safe }} | ||||
|             {% else %} | ||||
|                 <h2>Welcome to RideAware Newsletter</h2> | ||||
|                 <p>This is a sample newsletter content that demonstrates the modern, clean design of our newsletter system. The content would typically include cycling tips, training advice, and product updates.</p> | ||||
|                  | ||||
|                 <h3>This Week's Highlights</h3> | ||||
|                 <ul> | ||||
|                     <li>New training features released</li> | ||||
|                     <li>Community spotlight on top performers</li> | ||||
|                     <li>Upcoming events and challenges</li> | ||||
|                     <li>Expert tips from professional cyclists</li> | ||||
|                 </ul> | ||||
| 
 | ||||
|                 <blockquote> | ||||
|                     "The bicycle is a curious vehicle. Its passenger is its engine." - John Howard | ||||
|                 </blockquote> | ||||
| 
 | ||||
|                 <p>Stay tuned for more exciting content and updates from the RideAware team. We're committed to helping you achieve your cycling goals with the best tools and community support.</p> | ||||
|             {% endif %} | ||||
|         </article> | ||||
| 
 | ||||
|         <!-- Action Buttons --> | ||||
|         <div class="newsletter-actions"> | ||||
|             <a href="/newsletters" class="action-btn primary"> | ||||
|                 <i class="fas fa-list"></i> | ||||
|                 View All Newsletters | ||||
|             </a> | ||||
|             <button onclick="window.print()" class="action-btn secondary"> | ||||
|                 <i class="fas fa-print"></i> | ||||
|                 Print Newsletter | ||||
|             </button> | ||||
|             <button onclick="shareNewsletter()" class="action-btn secondary"> | ||||
|                 <i class="fas fa-share-alt"></i> | ||||
|                 Share | ||||
|             </button> | ||||
|         </div> | ||||
|         <button onclick="window.print()" class="action-btn secondary"> | ||||
|           <i class="fas fa-print"></i> | ||||
|           Print | ||||
|         </button> | ||||
|         <button onclick="shareNewsletter()" class="action-btn secondary"> | ||||
|           <i class="fas fa-share-alt"></i> | ||||
|           Share | ||||
|         </button> | ||||
|       </div> | ||||
|     </main> | ||||
|   </div> | ||||
| {% endblock %} | ||||
| 
 | ||||
|     <!-- Footer --> | ||||
|     <footer class="footer"> | ||||
|         <p>© 2025 RideAware. All rights reserved.</p> | ||||
|     </footer> | ||||
|     <script defer | ||||
|     src="https://cdn.statically.io/gl/rideaware/landing/06d19988c7df53636277f945f9ed853bda76471b/static/js/main.min.js" | ||||
|     crossorigin="anonymous"></script> | ||||
| </body> | ||||
| </html> | ||||
| {% block extra_scripts %} | ||||
| <script> | ||||
|   function shareNewsletter() { | ||||
|     if (navigator.share) { | ||||
|       navigator.share({ title: document.title, url: location.href }).catch(() => {}); | ||||
|     } else { | ||||
|       navigator.clipboard.writeText(location.href); | ||||
|       alert('Link copied to clipboard!'); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // Build TOC from h2/h3 inside the article | ||||
|   (function buildTOC() { | ||||
|     const article = document.getElementById('article'); | ||||
|     if (!article) return; | ||||
|     const headings = article.querySelectorAll('h2, h3'); | ||||
|     const list = document.getElementById('toc-list'); | ||||
|     if (!headings.length || !list) return; | ||||
| 
 | ||||
|     headings.forEach((h, idx) => { | ||||
|       const id = h.id || `h-${idx}`; | ||||
|       h.id = id; | ||||
|       const li = document.createElement('li'); | ||||
|       li.className = h.tagName === 'H2' ? 'toc-h2' : 'toc-h3'; | ||||
|       const a = document.createElement('a'); | ||||
|       a.href = `#${id}`; | ||||
|       a.textContent = h.textContent; | ||||
|       li.appendChild(a); | ||||
|       list.appendChild(li); | ||||
|     }); | ||||
|   })(); | ||||
| </script> | ||||
| {% endblock %} | ||||
|  | @ -1,99 +1,75 @@ | |||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
| <head> | ||||
|     <meta charset="UTF-8"> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
|     <title>RideAware - Newsletters</title> | ||||
|     <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet"> | ||||
|     <link rel="preload" as="style" | ||||
|         href="https://cdn.statically.io/gl/rideaware/landing/main/static/css/newsletter_styles.min.css" | ||||
|         onload="this.onload=null;this.rel='stylesheet'"> | ||||
|     <noscript> | ||||
|     <link rel="stylesheet" | ||||
|             href="https://cdn.statically.io/gl/rideaware/landing/main/static/css/newsletter_styles.min.css"> | ||||
|     </noscript> | ||||
| `</head> | ||||
| <body> | ||||
|     <!-- Navigation --> | ||||
|     <nav class="navbar"> | ||||
|         <div class="nav-container"> | ||||
|             <a href="/" class="logo">Ride<span class="logo-accent">Aware</span></a> | ||||
|             <ul class="nav-links"> | ||||
|                 <li><a href="/">Home</a></li> | ||||
|                 <li><a href="/newsletters" class="active">Newsletters</a></li> | ||||
|             </ul> | ||||
| {% extends "base.html" %} | ||||
| 
 | ||||
| {% block title %}RideAware - Newsletters{% endblock %} | ||||
| 
 | ||||
| {% block content %} | ||||
|   <!-- Page Header --> | ||||
|   <section class="page-header"> | ||||
|     <div class="page-header-content"> | ||||
|       <div class="header-icon"> | ||||
|         <i class="fas fa-newspaper"></i> | ||||
|       </div> | ||||
|       <h1>RideAware Newsletters</h1> | ||||
|       <p> | ||||
|         Stay updated with the latest cycling tips, training insights, and | ||||
|         product updates from our team. | ||||
|       </p> | ||||
|     </div> | ||||
|   </section> | ||||
| 
 | ||||
|   <!-- Main Content --> | ||||
|   <main class="main-content"> | ||||
|     {% if newsletters %} | ||||
|       <div class="newsletters-grid"> | ||||
|         {% for nl in newsletters %} | ||||
|           <article class="newsletter-card"> | ||||
|             <div class="newsletter-header"> | ||||
|               <div class="newsletter-icon"> | ||||
|                 <i class="fas fa-envelope-open-text"></i> | ||||
|               </div> | ||||
|               <div class="newsletter-info"> | ||||
|                 <h2> | ||||
|                   <a href="/newsletter/{{ nl['id'] }}">{{ nl['subject'] }}</a> | ||||
|                 </h2> | ||||
|               </div> | ||||
|             </div> | ||||
| 
 | ||||
|             <div class="newsletter-date"> | ||||
|               <i class="fas fa-calendar-alt"></i> | ||||
|               <span>Sent on: {{ nl['sent_at'] }}</span> | ||||
|             </div> | ||||
| 
 | ||||
|             <div class="newsletter-excerpt"> | ||||
|               {% if nl.get('preview') %} | ||||
|                 {{ nl['preview'][:150] }}... | ||||
|               {% else %} | ||||
|                 Get the latest updates on cycling training, performance tips, and | ||||
|                 RideAware features in this newsletter edition. | ||||
|               {% endif %} | ||||
|             </div> | ||||
| 
 | ||||
|             <a href="/newsletter/{{ nl['id'] }}" class="read-more-btn"> | ||||
|               Read Full Newsletter | ||||
|               <i class="fas fa-arrow-right"></i> | ||||
|             </a> | ||||
|           </article> | ||||
|         {% endfor %} | ||||
|       </div> | ||||
|     {% else %} | ||||
|       <div class="empty-state"> | ||||
|         <div class="empty-icon"> | ||||
|           <i class="fas fa-inbox"></i> | ||||
|         </div> | ||||
|     </nav> | ||||
| 
 | ||||
|     <!-- Page Header --> | ||||
|     <section class="page-header"> | ||||
|         <div class="page-header-content"> | ||||
|             <div class="header-icon"> | ||||
|                 <i class="fas fa-newspaper"></i> | ||||
|             </div> | ||||
|             <h1>RideAware Newsletters</h1> | ||||
|             <p>Stay updated with the latest cycling tips, training insights, and product updates from our team.</p> | ||||
|         </div> | ||||
|     </section> | ||||
| 
 | ||||
|     <!-- Main Content --> | ||||
|     <main class="main-content"> | ||||
|         {% if newsletters %} | ||||
|             <div class="newsletters-grid"> | ||||
|                 {% for nl in newsletters %} | ||||
|                     <article class="newsletter-card"> | ||||
|                         <div class="newsletter-header"> | ||||
|                             <div class="newsletter-icon"> | ||||
|                                 <i class="fas fa-envelope-open-text"></i> | ||||
|                             </div> | ||||
|                             <div class="newsletter-info"> | ||||
|                                 <h2> | ||||
|                                     <a href="/newsletter/{{ nl['id'] }}">{{ nl['subject'] }}</a> | ||||
|                                 </h2> | ||||
|                             </div> | ||||
|                         </div> | ||||
|                          | ||||
|                         <div class="newsletter-date"> | ||||
|                             <i class="fas fa-calendar-alt"></i> | ||||
|                             <span>Sent on: {{ nl['sent_at'] }}</span> | ||||
|                         </div> | ||||
| 
 | ||||
|                         <div class="newsletter-excerpt"> | ||||
|                             {% if nl.get('preview') %} | ||||
|                                 {{ nl['preview'][:150] }}... | ||||
|                             {% else %} | ||||
|                                 Get the latest updates on cycling training, performance tips, and RideAware features in this newsletter edition. | ||||
|                             {% endif %} | ||||
|                         </div> | ||||
| 
 | ||||
|                         <a href="/newsletter/{{ nl['id'] }}" class="read-more-btn"> | ||||
|                             Read Full Newsletter | ||||
|                             <i class="fas fa-arrow-right"></i> | ||||
|                         </a> | ||||
|                     </article> | ||||
|                 {% endfor %} | ||||
|             </div> | ||||
|         {% else %} | ||||
|             <div class="empty-state"> | ||||
|                 <div class="empty-icon"> | ||||
|                     <i class="fas fa-inbox"></i> | ||||
|                 </div> | ||||
|                 <h3>No Newsletters Yet</h3> | ||||
|                 <p>We're working on some amazing content for you. Subscribe to be the first to know when we publish our newsletters!</p> | ||||
|                 <a href="/" class="subscribe-prompt"> | ||||
|                     <i class="fas fa-bell"></i> | ||||
|                     Subscribe for Updates | ||||
|                 </a> | ||||
|             </div> | ||||
|         {% endif %} | ||||
|     </main> | ||||
| 
 | ||||
|     <!-- Footer --> | ||||
|     <footer class="footer"> | ||||
|         <p>© 2025 RideAware. All rights reserved.</p> | ||||
|     </footer> | ||||
|     <script defer | ||||
|     src="https://cdn.statically.io/gl/rideaware/landing/06d19988c7df53636277f945f9ed853bda76471b/static/js/main.min.js" | ||||
|     crossorigin="anonymous"></script> | ||||
| </body> | ||||
| </html> | ||||
|         <h3>No Newsletters Yet</h3> | ||||
|         <p> | ||||
|           We're working on some amazing content for you. Subscribe to be the | ||||
|           first to know when we publish our newsletters! | ||||
|         </p> | ||||
|         <a href="/" class="subscribe-prompt"> | ||||
|           <i class="fas fa-bell"></i> | ||||
|           Subscribe for Updates | ||||
|         </a> | ||||
|       </div> | ||||
|     {% endif %} | ||||
|   </main> | ||||
| {% endblock %} | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Cipher Vance
						Cipher Vance