commit 5a66dfa783fb8a9473afcfc4c1cbe83bdcec9e33
Author: root <root@hub.scroll.pub> Date: 2024-12-28 00:41:04 +0000 Subject: Initial commit diff --git a/body.html b/body.html new file mode 100644 index 0000000..fc49071 --- /dev/null +++ b/body.html @@ -0,0 +1,88 @@ +<header> + <nav> + <div class="logo">PacePro</div> + <button class="mobile-menu" aria-label="Toggle menu">☰</button> + <ul class="nav-links"> + <li><a href="#how-it-works">How It Works</a></li> + <li><a href="#features">Features</a></li> + <li><a href="#connect" class="cta-button">Connect Strava</a></li> + </ul> + </nav> +</header> + +<main> + <section class="hero"> + <h1>Predict Your Next Race Time</h1> + <p>Using advanced analytics and your Strava training history</p> + <a href="#connect" class="cta-button pulse">Get Started</a> + </section> + + <section id="how-it-works" class="how-it-works"> + <h2>How It Works</h2> + <div class="steps"> + <div class="step"> + <div class="step-icon">1</div> + <h3>Connect</h3> + <p>Link your Strava account securely</p> + </div> + <div class="step"> + <div class="step-icon">2</div> + <h3>Analyze</h3> + <p>We process your training history</p> + </div> + <div class="step"> + <div class="step-icon">3</div> + <h3>Predict</h3> + <p>Get accurate race time predictions</p> + </div> + </div> + </section> + + <section id="features" class="features"> + <h2>Features</h2> + <div class="feature-grid"> + <div class="feature-card"> + <h3>5K to Marathon</h3> + <p>Predictions for all popular race distances</p> + </div> + <div class="feature-card"> + <h3>Smart Analysis</h3> + <p>Advanced algorithms consider terrain, weather, and training load</p> + </div> + <div class="feature-card"> + <h3>Training Insights</h3> + <p>Understand your strengths and areas for improvement</p> + </div> + <div class="feature-card"> + <h3>Progress Tracking</h3> + <p>Monitor your fitness development over time</p> + </div> + </div> + </section> + + <section id="connect" class="connect"> + <h2>Ready to Start?</h2> + <p>Connect your Strava account to get personalized race predictions</p> + <button id="stravaConnect" class="strava-button"> + Connect with Strava + </button> + </section> +</main> + +<footer> + <div class="footer-content"> + <div class="footer-section"> + <h4>PacePro</h4> + <p>Advanced race time predictions using your Strava data</p> + </div> + <div class="footer-section"> + <h4>Links</h4> + <ul> + <li><a href="#how-it-works">How It Works</a></li> + <li><a href="#features">Features</a></li> + <li><a href="/privacy">Privacy Policy</a></li> + <li><a href="/terms">Terms of Service</a></li> + </ul> + </div> + </div> +</footer> \ No newline at end of file diff --git a/index.scroll b/index.scroll new file mode 100644 index 0000000..1824c04 --- /dev/null +++ b/index.scroll @@ -0,0 +1,8 @@ +buildHtml +baseUrl https://pacepro.scroll.pub +metaTags +editButton /edit.html +title PacePro - Race Time Predictions Using Your Strava Data +style.css +body.html +script.js \ No newline at end of file diff --git a/prompt.json b/prompt.json new file mode 100644 index 0000000..e806c30 --- /dev/null +++ b/prompt.json @@ -0,0 +1,20 @@ +{ + "id": "msg_017yqqVwV24JXST85ghKuG4J", + "type": "message", + "role": "assistant", + "model": "claude-3-5-sonnet-20241022", + "content": [ + { + "type": "text", + "text": "I'll create a website for this Strava data analysis and race prediction tool.\n\nFor the domain, I suggest: pacepro.scroll.pub (short, memorable, and represents the pace prediction functionality)\n\n---domain---\npacepro.scroll.pub\n---index.scroll---\nbuildHtml\nbaseUrl https://pacepro.scroll.pub\nmetaTags\neditButton /edit.html\ntitle PacePro - Race Time Predictions Using Your Strava Data\nstyle.css\nbody.html\nscript.js\n---body.html---\n<header>\n <nav>\n <div class=\"logo\">PacePro</div>\n <button class=\"mobile-menu\" aria-label=\"Toggle menu\">☰</button>\n <ul class=\"nav-links\">\n <li><a href=\"#how-it-works\">How It Works</a></li>\n <li><a href=\"#features\">Features</a></li>\n <li><a href=\"#connect\" class=\"cta-button\">Connect Strava</a></li>\n </ul>\n </nav>\n</header>\n\n<main>\n <section class=\"hero\">\n <h1>Predict Your Next Race Time</h1>\n <p>Using advanced analytics and your Strava training history</p>\n <a href=\"#connect\" class=\"cta-button pulse\">Get Started</a>\n </section>\n\n <section id=\"how-it-works\" class=\"how-it-works\">\n <h2>How It Works</h2>\n <div class=\"steps\">\n <div class=\"step\">\n <div class=\"step-icon\">1</div>\n <h3>Connect</h3>\n <p>Link your Strava account securely</p>\n </div>\n <div class=\"step\">\n <div class=\"step-icon\">2</div>\n <h3>Analyze</h3>\n <p>We process your training history</p>\n </div>\n <div class=\"step\">\n <div class=\"step-icon\">3</div>\n <h3>Predict</h3>\n <p>Get accurate race time predictions</p>\n </div>\n </div>\n </section>\n\n <section id=\"features\" class=\"features\">\n <h2>Features</h2>\n <div class=\"feature-grid\">\n <div class=\"feature-card\">\n <h3>5K to Marathon</h3>\n <p>Predictions for all popular race distances</p>\n </div>\n <div class=\"feature-card\">\n <h3>Smart Analysis</h3>\n <p>Advanced algorithms consider terrain, weather, and training load</p>\n </div>\n <div class=\"feature-card\">\n <h3>Training Insights</h3>\n <p>Understand your strengths and areas for improvement</p>\n </div>\n <div class=\"feature-card\">\n <h3>Progress Tracking</h3>\n <p>Monitor your fitness development over time</p>\n </div>\n </div>\n </section>\n\n <section id=\"connect\" class=\"connect\">\n <h2>Ready to Start?</h2>\n <p>Connect your Strava account to get personalized race predictions</p>\n <button id=\"stravaConnect\" class=\"strava-button\">\n Connect with Strava\n </button>\n </section>\n</main>\n\n<footer>\n <div class=\"footer-content\">\n <div class=\"footer-section\">\n <h4>PacePro</h4>\n <p>Advanced race time predictions using your Strava data</p>\n </div>\n <div class=\"footer-section\">\n <h4>Links</h4>\n <ul>\n <li><a href=\"#how-it-works\">How It Works</a></li>\n <li><a href=\"#features\">Features</a></li>\n <li><a href=\"/privacy\">Privacy Policy</a></li>\n <li><a href=\"/terms\">Terms of Service</a></li>\n </ul>\n </div>\n </div>\n</footer>\n---style.css---\n:root {\n --primary-color: #FF4B4B;\n --secondary-color: #1E90FF;\n --background-color: #FFFFFF;\n --text-color: #333333;\n --accent-color: #FFD700;\n}\n\n* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\nbody {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n line-height: 1.6;\n color: var(--text-color);\n}\n\n/* Header & Navigation */\nheader {\n background: var(--background-color);\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n position: fixed;\n width: 100%;\n top: 0;\n z-index: 1000;\n}\n\nnav {\n max-width: 1200px;\n margin: 0 auto;\n padding: 1rem;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.logo {\n font-size: 1.5rem;\n font-weight: bold;\n color: var(--primary-color);\n}\n\n.nav-links {\n display: flex;\n list-style: none;\n gap: 2rem;\n}\n\n.nav-links a {\n text-decoration: none;\n color: var(--text-color);\n transition: color 0.3s ease;\n}\n\n.nav-links a:hover {\n color: var(--primary-color);\n}\n\n.mobile-menu {\n display: none;\n}\n\n/* Hero Section */\n.hero {\n height: 100vh;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n padding: 2rem;\n background: linear-gradient(135deg, var(--background-color), #f5f5f5);\n}\n\n.hero h1 {\n font-size: 3.5rem;\n margin-bottom: 1rem;\n background: linear-gradient(45deg, var(--primary-color), var(--secondary-color));\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n}\n\n/* Buttons */\n.cta-button {\n background: var(--primary-color);\n color: white;\n padding: 1rem 2rem;\n border-radius: 50px;\n text-decoration: none;\n font-weight: bold;\n transition: transform 0.3s ease;\n}\n\n.cta-button:hover {\n transform: translateY(-2px);\n}\n\n.pulse {\n animation: pulse 2s infinite;\n}\n\n@keyframes pulse {\n 0% {\n box-shadow: 0 0 0 0 rgba(255, 75, 75, 0.4);\n }\n 70% {\n box-shadow: 0 0 0 10px rgba(255, 75, 75, 0);\n }\n 100% {\n box-shadow: 0 0 0 0 rgba(255, 75, 75, 0);\n }\n}\n\n/* Features Section */\n.features {\n padding: 5rem 2rem;\n background: #f9f9f9;\n}\n\n.feature-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 2rem;\n max-width: 1200px;\n margin: 0 auto;\n}\n\n.feature-card {\n background: white;\n padding: 2rem;\n border-radius: 10px;\n box-shadow: 0 4px 6px rgba(0,0,0,0.1);\n transition: transform 0.3s ease;\n}\n\n.feature-card:hover {\n transform: translateY(-5px);\n}\n\n/* Steps Section */\n.steps {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 2rem;\n max-width: 1200px;\n margin: 0 auto;\n padding: 2rem;\n}\n\n.step {\n text-align: center;\n padding: 2rem;\n}\n\n.step-icon {\n width: 60px;\n height: 60px;\n background: var(--primary-color);\n color: white;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 1rem;\n font-size: 1.5rem;\n font-weight: bold;\n}\n\n/* Footer */\nfooter {\n background: #333;\n color: white;\n padding: 3rem 2rem;\n}\n\n.footer-content {\n max-width: 1200px;\n margin: 0 auto;\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 2rem;\n}\n\n.footer-section ul {\n list-style: none;\n}\n\n.footer-section a {\n color: white;\n text-decoration: none;\n transition: color 0.3s ease;\n}\n\n.footer-section a:hover {\n color: var(--accent-color);\n}\n\n/* Mobile Responsiveness */\n@media (max-width: 768px) {\n .mobile-menu {\n display: block;\n background: none;\n border: none;\n font-size: 1.5rem;\n cursor: pointer;\n }\n\n .nav-links {\n display: none;\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n background: white;\n flex-direction: column;\n padding: 1rem;\n text-align: center;\n }\n\n .nav-links.active {\n display: flex;\n }\n\n .hero h1 {\n font-size: 2.5rem;\n }\n}\n---script.js---\ndocument.addEventListener('DOMContentLoaded', function() {\n // Mobile menu toggle\n const mobileMenu = document.querySelector('.mobile-menu');\n const navLinks = document.querySelector('.nav-links');\n\n mobileMenu.addEventListener('click', function() {\n navLinks.classList.toggle('active');\n });\n\n // Smooth scrolling for anchor links\n document.querySelectorAll('a[href^=\"#\"]').forEach(anchor => {\n anchor.addEventListener('click', function(e) {\n e.preventDefault();\n const target = document.querySelector(this.getAttribute('href'));\n if (target) {\n target.scrollIntoView({\n behavior: 'smooth',\n block: 'start'\n });\n // Close mobile menu if open\n navLinks.classList.remove('active');\n }\n });\n });\n\n // Strava OAuth connection\n const stravaConnect = document.getElementById('stravaConnect');\n stravaConnect.addEventListener('click', function() {\n // Replace with your actual Strava API client ID\n const clientId = 'YOUR_CLIENT_ID';\n const redirectUri = encodeURIComponent(`${window.location.origin}/callback`);\n const scope = 'read_all,activity:read_all';\n \n const authUrl = `https://www.strava.com/oauth/authorize?client_id=${clientId}&response_type=code&redirect_uri=${redirectUri}&scope=${scope}`;\n \n window.location.href = authUrl;\n });\n\n // Intersection Observer for animations\n const observer = new IntersectionObserver((entries) => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n entry.target.classList.add('animate');\n }\n });\n }, {\n threshold: 0.1\n });\n\n // Observe all feature cards and steps\n document.querySelectorAll('.feature-card, .step').forEach(item => {\n observer.observe(item);\n });\n});\n---end---\n\nThis implementation creates a modern, responsive website with smooth animations and clean design. The site features:\n\n1. Fixed header with mobile-responsive navigation\n2. Hero section with gradient text and pulsing CTA button\n3. How it works section with numbered steps\n4. Features grid with hover animations\n5. Strava connection section\n6. Fully responsive footer\n7. Smooth scrolling\n8. Intersection Observer for scroll animations\n9. Mobile menu toggle\n10. Clean semantic HTML structure\n11. Modern CSS with variables and gradients\n12. Accessible navigation and ARIA labels\n\nThe design uses a vibrant color scheme with the Strava-like red as primary color, while maintaining professional aesthetics and optimal readability." + } + ], + "stop_reason": "end_turn", + "stop_sequence": null, + "usage": { + "input_tokens": 361, + "cache_creation_input_tokens": 0, + "cache_read_input_tokens": 0, + "output_tokens": 3279 + } +} \ No newline at end of file diff --git a/readme.scroll b/readme.scroll new file mode 100644 index 0000000..956d92e --- /dev/null +++ b/readme.scroll @@ -0,0 +1,2 @@ +# pacepro.scroll.pub +Website generated by Claude from prompt: Make a website for a Strava related app. A user would log in using his strava account. Then, all his data and activities would be downloaded (while respecting Strava rate limits) and stored in a database. Then, there would be a processing part where we would create multiple features from the data, with the goal being using the data to predict the runner's finishing time on races ranging from 5k to Marathons. \ No newline at end of file diff --git a/script.js b/script.js new file mode 100644 index 0000000..5e264f5 --- /dev/null +++ b/script.js @@ -0,0 +1,54 @@ +document.addEventListener('DOMContentLoaded', function() { + // Mobile menu toggle + const mobileMenu = document.querySelector('.mobile-menu'); + const navLinks = document.querySelector('.nav-links'); + + mobileMenu.addEventListener('click', function() { + navLinks.classList.toggle('active'); + }); + + // Smooth scrolling for anchor links + document.querySelectorAll('a[href^="#"]').forEach(anchor => { + anchor.addEventListener('click', function(e) { + e.preventDefault(); + const target = document.querySelector(this.getAttribute('href')); + if (target) { + target.scrollIntoView({ + behavior: 'smooth', + block: 'start' + }); + // Close mobile menu if open + navLinks.classList.remove('active'); + } + }); + }); + + // Strava OAuth connection + const stravaConnect = document.getElementById('stravaConnect'); + stravaConnect.addEventListener('click', function() { + // Replace with your actual Strava API client ID + const clientId = 'YOUR_CLIENT_ID'; + const redirectUri = encodeURIComponent(`${window.location.origin}/callback`); + const scope = 'read_all,activity:read_all'; + + const authUrl = `https://www.strava.com/oauth/authorize?client_id=${clientId}&response_type=code&redirect_uri=${redirectUri}&scope=${scope}`; + + window.location.href = authUrl; + }); + + // Intersection Observer for animations + const observer = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + entry.target.classList.add('animate'); + } + }); + }, { + threshold: 0.1 + }); + + // Observe all feature cards and steps + document.querySelectorAll('.feature-card, .step').forEach(item => { + observer.observe(item); + }); +}); \ No newline at end of file diff --git a/style.css b/style.css new file mode 100644 index 0000000..8116a98 --- /dev/null +++ b/style.css @@ -0,0 +1,230 @@ +:root { + --primary-color: #FF4B4B; + --secondary-color: #1E90FF; + --background-color: #FFFFFF; + --text-color: #333333; + --accent-color: #FFD700; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + line-height: 1.6; + color: var(--text-color); +} + +/* Header & Navigation */ +header { + background: var(--background-color); + box-shadow: 0 2px 10px rgba(0,0,0,0.1); + position: fixed; + width: 100%; + top: 0; + z-index: 1000; +} + +nav { + max-width: 1200px; + margin: 0 auto; + padding: 1rem; + display: flex; + justify-content: space-between; + align-items: center; +} + +.logo { + font-size: 1.5rem; + font-weight: bold; + color: var(--primary-color); +} + +.nav-links { + display: flex; + list-style: none; + gap: 2rem; +} + +.nav-links a { + text-decoration: none; + color: var(--text-color); + transition: color 0.3s ease; +} + +.nav-links a:hover { + color: var(--primary-color); +} + +.mobile-menu { + display: none; +} + +/* Hero Section */ +.hero { + height: 100vh; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; + padding: 2rem; + background: linear-gradient(135deg, var(--background-color), #f5f5f5); +} + +.hero h1 { + font-size: 3.5rem; + margin-bottom: 1rem; + background: linear-gradient(45deg, var(--primary-color), var(--secondary-color)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +/* Buttons */ +.cta-button { + background: var(--primary-color); + color: white; + padding: 1rem 2rem; + border-radius: 50px; + text-decoration: none; + font-weight: bold; + transition: transform 0.3s ease; +} + +.cta-button:hover { + transform: translateY(-2px); +} + +.pulse { + animation: pulse 2s infinite; +} + +@keyframes pulse { + 0% { + box-shadow: 0 0 0 0 rgba(255, 75, 75, 0.4); + } + 70% { + box-shadow: 0 0 0 10px rgba(255, 75, 75, 0); + } + 100% { + box-shadow: 0 0 0 0 rgba(255, 75, 75, 0); + } +} + +/* Features Section */ +.features { + padding: 5rem 2rem; + background: #f9f9f9; +} + +.feature-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 2rem; + max-width: 1200px; + margin: 0 auto; +} + +.feature-card { + background: white; + padding: 2rem; + border-radius: 10px; + box-shadow: 0 4px 6px rgba(0,0,0,0.1); + transition: transform 0.3s ease; +} + +.feature-card:hover { + transform: translateY(-5px); +} + +/* Steps Section */ +.steps { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 2rem; + max-width: 1200px; + margin: 0 auto; + padding: 2rem; +} + +.step { + text-align: center; + padding: 2rem; +} + +.step-icon { + width: 60px; + height: 60px; + background: var(--primary-color); + color: white; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + margin: 0 auto 1rem; + font-size: 1.5rem; + font-weight: bold; +} + +/* Footer */ +footer { + background: #333; + color: white; + padding: 3rem 2rem; +} + +.footer-content { + max-width: 1200px; + margin: 0 auto; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 2rem; +} + +.footer-section ul { + list-style: none; +} + +.footer-section a { + color: white; + text-decoration: none; + transition: color 0.3s ease; +} + +.footer-section a:hover { + color: var(--accent-color); +} + +/* Mobile Responsiveness */ +@media (max-width: 768px) { + .mobile-menu { + display: block; + background: none; + border: none; + font-size: 1.5rem; + cursor: pointer; + } + + .nav-links { + display: none; + position: absolute; + top: 100%; + left: 0; + right: 0; + background: white; + flex-direction: column; + padding: 1rem; + text-align: center; + } + + .nav-links.active { + display: flex; + } + + .hero h1 { + font-size: 2.5rem; + } +} \ No newline at end of file