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
				
			
		
							
								
								
									
										
											BIN
										
									
								
								static/assets/32x32.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								static/assets/32x32.png
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 4.6 KiB | 
							
								
								
									
										
											BIN
										
									
								
								static/assets/apple-touch-icon.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								static/assets/apple-touch-icon.png
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 4.6 KiB | 
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										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> | <!-- templates/index.html --> | ||||||
| <html lang="en"> | {% extends "base.html" %} | ||||||
| <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') }}"> |  | ||||||
| 
 | 
 | ||||||
| </head> | {% block title %}RideAware - Smart Cycling Training Platform{% endblock %} | ||||||
| <body> | 
 | ||||||
|     <!-- Navigation --> | {% block content %} | ||||||
|     <nav class="navbar"> |   <!-- Hero Section --> | ||||||
|         <div class="nav-container"> |   <section class="hero"> | ||||||
|             <a href="#" class="logo">Ride<span class="logo-accent">Aware</span></a> |     <div class="hero-container"> | ||||||
|             <ul class="nav-links"> |       <div class="hero-content"> | ||||||
|                 <li><a href="#features">Features</a></li> |         <h1>Elevate Your Cycling Journey</h1> | ||||||
|                 <li><a href="/newsletters">Newsletters</a></li> |         <p class="subtitle"> | ||||||
|             </ul> |           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> | ||||||
|     </nav> |       </div> | ||||||
| 
 | 
 | ||||||
|     <!-- Hero Section --> |       <div class="hero-visual"> | ||||||
|     <section class="hero"> |         <div class="phone-mockup"> | ||||||
|         <div class="hero-container"> |           <div class="screen"> | ||||||
|             <div class="hero-content"> |             <div class="app-interface"> | ||||||
|                 <h1>Elevate Your Cycling Journey</h1> |               <div class="app-logo">RideAware</div> | ||||||
|                 <p class="subtitle">The ultimate smart training platform for cyclists who demand excellence in every ride.</p> |               <div class="stats-grid"> | ||||||
|                  |                 <div class="stat-card"> | ||||||
|                 <div class="cta-section"> |                   <div class="stat-number">24.5</div> | ||||||
|                     <h3>Coming soon!</h3> |                   <div class="stat-label">KM/H AVG</div> | ||||||
|                     <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> |                 </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> | ||||||
|         </div> |         </div> | ||||||
|     </section> |       </div> | ||||||
|  |     </div> | ||||||
|  |   </section> | ||||||
| 
 | 
 | ||||||
|     <!-- Features Section --> |   <!-- Features Section --> | ||||||
|     <section class="features" id="features"> |   <section class="features" id="features"> | ||||||
|         <div class="section-header"> |     <div class="section-header"> | ||||||
|             <h2>Powerful Features for Every Cyclist</h2> |       <h2>Powerful Features for Every Cyclist</h2> | ||||||
|             <p>From beginners to professionals, RideAware provides comprehensive tools to optimize your training and performance.</p> |       <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> | ||||||
| 
 | 
 | ||||||
|         <div class="features-container"> |         <div class="feature-card"> | ||||||
|             <div class="features-grid"> |           <div class="feature-icon"> | ||||||
|                 <div class="feature-card"> |             <i class="fas fa-chart-line"></i> | ||||||
|                     <div class="feature-icon"> |           </div> | ||||||
|                         <i class="fas fa-calendar-alt"></i> |           <h3>Advanced Analytics</h3> | ||||||
|                     </div> |           <ul class="feature-list"> | ||||||
|                     <h3>Smart Training Plans</h3> |             <li> | ||||||
|                     <ul class="feature-list"> |               <strong>Detailed Logging:</strong> Track exercises, sets, reps, | ||||||
|                         <li><strong>AI-Powered Planning:</strong> Customized training plans based on your goals and fitness level</li> |               and performance metrics | ||||||
|                         <li><strong>Adaptive Scheduling:</strong> Smart workout scheduling with automated reminders</li> |             </li> | ||||||
|                         <li><strong>Goal Tracking:</strong> Set and monitor your cycling objectives in real-time</li> |             <li> | ||||||
|                     </ul> |               <strong>Data Visualization:</strong> Interactive charts, graphs, | ||||||
|                 </div> |               and progress statistics | ||||||
| 
 |             </li> | ||||||
|                 <div class="feature-card"> |             <li> | ||||||
|                     <div class="feature-icon"> |               <strong>Progress Insights:</strong> Monitor your improvement over | ||||||
|                         <i class="fas fa-chart-line"></i> |               time with AI analysis | ||||||
|                     </div> |             </li> | ||||||
|                     <h3>Advanced Analytics</h3> |           </ul> | ||||||
|                     <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> |         </div> | ||||||
|     </section> |  | ||||||
| 
 | 
 | ||||||
|     <!-- Footer --> |         <div class="feature-card"> | ||||||
|     <footer class="footer"> |           <div class="feature-icon"> | ||||||
|         <p>© 2025 RideAware. All rights reserved.</p> |             <i class="fas fa-bicycle"></i> | ||||||
|     </footer> |           </div> | ||||||
|     <script defer |           <h3>Virtual Training</h3> | ||||||
|     src="https://cdn.statically.io/gl/rideaware/landing/06d19988c7df53636277f945f9ed853bda76471b/static/js/main.min.js" |           <ul class="feature-list"> | ||||||
|     crossorigin="anonymous"></script> |             <li> | ||||||
| </body> |               <strong>Expert Coaching:</strong> Professional guidance to achieve | ||||||
| </html> |               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> | {% extends "base.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> |  | ||||||
| 
 | 
 | ||||||
|     <link rel="preload" as="style" | {% block title %} | ||||||
|         href="https://cdn.statically.io/gl/rideaware/landing/main/static/css/newsletter_styles.min.css" |   RideAware - {{ newsletter.subject if newsletter else 'Newsletter Detail' }} | ||||||
|         onload="this.onload=null;this.rel='stylesheet'"> | {% endblock %} | ||||||
|     <noscript> | 
 | ||||||
|     <link rel="stylesheet" | {% block content %} | ||||||
|             href="https://cdn.statically.io/gl/rideaware/landing/main/static/css/newsletter_styles.min.css"> |   <div class="article-wrap"> | ||||||
|     </noscript> |     <aside class="article-aside"> | ||||||
| </head> |       <a href="/newsletters" class="back-link"> | ||||||
| <body> |         <i class="fas fa-arrow-left"></i> | ||||||
|     <!-- Navigation --> |         Back to Newsletters | ||||||
|     <nav class="navbar"> |       </a> | ||||||
|         <div class="nav-container"> | 
 | ||||||
|             <a href="/" class="logo">Ride<span class="logo-accent">Aware</span></a> |       <div class="article-meta"> | ||||||
|             <ul class="nav-links"> |         <h2 class="article-title">{{ newsletter.subject if newsletter else 'Newsletter Title' }}</h2> | ||||||
|                 <li><a href="/">Home</a></li> |         <div class="meta-row"> | ||||||
|                 <li><a href="/newsletters">Newsletters</a></li> |           <i class="fas fa-calendar-alt"></i> | ||||||
|             </ul> |           <span>{{ newsletter.sent_at if newsletter else 'Published Date' }}</span> | ||||||
|         </div> |         </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 --> |         {% if newsletter and newsletter.get('tags') %} | ||||||
|     <div class="back-navigation"> |         <div class="article-tags"> | ||||||
|         <a href="/newsletters" class="back-link"> |           {% for tag in newsletter.tags %} | ||||||
|             <i class="fas fa-arrow-left"></i> |           <span class="tag">{{ tag }}</span> | ||||||
|             Back to Newsletters |           {% 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> |         </a> | ||||||
|     </div> |         <button onclick="window.print()" class="action-btn secondary"> | ||||||
| 
 |           <i class="fas fa-print"></i> | ||||||
|     <!-- Main Content --> |           Print | ||||||
|     <main class="main-content"> |         </button> | ||||||
|         <!-- Newsletter Header --> |         <button onclick="shareNewsletter()" class="action-btn secondary"> | ||||||
|         <div class="newsletter-header"> |           <i class="fas fa-share-alt"></i> | ||||||
|             <div class="newsletter-icon"> |           Share | ||||||
|                 <i class="fas fa-envelope-open-text"></i> |         </button> | ||||||
|             </div> |       </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> |  | ||||||
|     </main> |     </main> | ||||||
|  |   </div> | ||||||
|  | {% endblock %} | ||||||
| 
 | 
 | ||||||
|     <!-- Footer --> | {% block extra_scripts %} | ||||||
|     <footer class="footer"> | <script> | ||||||
|         <p>© 2025 RideAware. All rights reserved.</p> |   function shareNewsletter() { | ||||||
|     </footer> |     if (navigator.share) { | ||||||
|     <script defer |       navigator.share({ title: document.title, url: location.href }).catch(() => {}); | ||||||
|     src="https://cdn.statically.io/gl/rideaware/landing/06d19988c7df53636277f945f9ed853bda76471b/static/js/main.min.js" |     } else { | ||||||
|     crossorigin="anonymous"></script> |       navigator.clipboard.writeText(location.href); | ||||||
| </body> |       alert('Link copied to clipboard!'); | ||||||
| </html> |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // 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> | {% extends "base.html" %} | ||||||
| <html lang="en"> | 
 | ||||||
| <head> | {% block title %}RideAware - Newsletters{% endblock %} | ||||||
|     <meta charset="UTF-8"> | 
 | ||||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | {% block content %} | ||||||
|     <title>RideAware - Newsletters</title> |   <!-- Page Header --> | ||||||
|     <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet"> |   <section class="page-header"> | ||||||
|     <link rel="preload" as="style" |     <div class="page-header-content"> | ||||||
|         href="https://cdn.statically.io/gl/rideaware/landing/main/static/css/newsletter_styles.min.css" |       <div class="header-icon"> | ||||||
|         onload="this.onload=null;this.rel='stylesheet'"> |         <i class="fas fa-newspaper"></i> | ||||||
|     <noscript> |       </div> | ||||||
|     <link rel="stylesheet" |       <h1>RideAware Newsletters</h1> | ||||||
|             href="https://cdn.statically.io/gl/rideaware/landing/main/static/css/newsletter_styles.min.css"> |       <p> | ||||||
|     </noscript> |         Stay updated with the latest cycling tips, training insights, and | ||||||
| `</head> |         product updates from our team. | ||||||
| <body> |       </p> | ||||||
|     <!-- Navigation --> |     </div> | ||||||
|     <nav class="navbar"> |   </section> | ||||||
|         <div class="nav-container"> | 
 | ||||||
|             <a href="/" class="logo">Ride<span class="logo-accent">Aware</span></a> |   <!-- Main Content --> | ||||||
|             <ul class="nav-links"> |   <main class="main-content"> | ||||||
|                 <li><a href="/">Home</a></li> |     {% if newsletters %} | ||||||
|                 <li><a href="/newsletters" class="active">Newsletters</a></li> |       <div class="newsletters-grid"> | ||||||
|             </ul> |         {% 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> |         </div> | ||||||
|     </nav> |         <h3>No Newsletters Yet</h3> | ||||||
| 
 |         <p> | ||||||
|     <!-- Page Header --> |           We're working on some amazing content for you. Subscribe to be the | ||||||
|     <section class="page-header"> |           first to know when we publish our newsletters! | ||||||
|         <div class="page-header-content"> |         </p> | ||||||
|             <div class="header-icon"> |         <a href="/" class="subscribe-prompt"> | ||||||
|                 <i class="fas fa-newspaper"></i> |           <i class="fas fa-bell"></i> | ||||||
|             </div> |           Subscribe for Updates | ||||||
|             <h1>RideAware Newsletters</h1> |         </a> | ||||||
|             <p>Stay updated with the latest cycling tips, training insights, and product updates from our team.</p> |       </div> | ||||||
|         </div> |     {% endif %} | ||||||
|     </section> |   </main> | ||||||
| 
 | {% endblock %} | ||||||
|     <!-- 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> |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Cipher Vance
						Cipher Vance