From a8640b03ac50eec6c95388e4f2a130952fdba202 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Feb 2026 15:43:54 +0000 Subject: [PATCH 1/4] Initial plan From 68fc076547bbb3351f66687c8a6715e4f74f7106 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Feb 2026 15:48:07 +0000 Subject: [PATCH 2/4] Restore repository to last organic commit before AI interference (Oct 1, 2025) Co-authored-by: NekshaDeSilva <102156620+NekshaDeSilva@users.noreply.github.com> --- about.html | 12 +- community.html | 26 +- dashboard.html | 2 +- form/css/styles.css | 7 +- i/chethina.html | 2 +- i/menul.html | 2 +- i/mihitha.html | 2 +- i/navindu.html | 2 +- i/neksha.html | 2 +- i/senul.html | 2 +- i/tharusha.html | 2 +- i/thisitha.html | 2 +- i/thulana.html | 2 +- i/vidul.html | 2 +- i/viruna.html | 2 +- index.html | 1231 ++++++++++++++++++++++++---------- join.html | 7 +- landing.html | 2 +- opennetwork-banner-demo.html | 2 +- reg/21.html | 4 +- scripts/parrot-assistant.js | 208 ++++++ simple-integration-test.html | 2 +- styles/community.css | 18 +- styles/dashboard.css | 4 +- styles/hackclub-style.css | 316 +++------ styles/lms-main.css | 4 +- styles/main.css | 50 +- test-community.html | 2 +- 28 files changed, 1225 insertions(+), 694 deletions(-) create mode 100644 scripts/parrot-assistant.js diff --git a/about.html b/about.html index 35b56ff..0fa8e54 100644 --- a/about.html +++ b/about.html @@ -11,13 +11,9 @@ - + + + + + + + + + + + + + +
+
+
+ + Solve issues in our GitHub repositories and earn rewards. +
+ +

+ We build the future + together +

+ + + +
+ + +
+ Student builder + Young developers +
+
+ + +
+
+
+
+ +
+

HackClub DayDream Sri Lanka

+ Coming September 27th +
+
LIVE EVENT
+
+ +
+

+ 🎮 Create amazing games in just 24 hours! Join developers across Colombo and various locations + throughout Sri Lanka for an epic game development hackathon inspired by HackClub's global maker community. +

+ +
+

What is HackClub DayDream?

+

DayDream is a 24-hour game development jam where teenage developers and makers come together to create incredible games from scratch. Inspired by HackClub's philosophy of learning by building, this event encourages participants to explore game development, experiment with new tools, and collaborate with fellow builders.

+ +

What You'll Do:

+
    +
  • 🎯 Form teams with other developers (or work solo)
  • +
  • 🎨 Brainstorm and design your game concept
  • +
  • ⚡ Build your game using Unity, Unreal Engine, Scratch, JavaScript, or any tool you prefer
  • +
  • 🎵 Create graphics, sounds, and gameplay mechanics
  • +
  • 🏆 Present your creation to judges and fellow participants
  • +
  • 🎉 Win awesome prizes and gain recognition in the community
  • +
+ +

Perfect For:

+
    +
  • 🔰 Beginners: New to coding? We'll provide tutorials and mentors!
  • +
  • 📈 Intermediate: Ready to try new frameworks and tools
  • +
  • 🚀 Advanced: Push the boundaries with complex game mechanics
  • +
+
+ +
+
+ + Colombo & Multiple Locations, Sri Lanka +
+
+ + 24-Hour Game Jam Challenge +
+
+ + Open to All Skill Levels +
+
+ + Unity, Unreal, JavaScript & Any Game Engine +
+
+ + Prizes, Recognition & Portfolio Building +
+
+ + Live Community Support & Updates +
+
+ + +
+
+
+
+ + +
+
+
+ 31+ + GitHub Followers +
+
+ 18+ + Open Repositories +
+
+ 2.9k+ + GitHub Stars +
+
+ 24/7 + Active Community +
+
+
+ + +
+ + +
+
+
+

I'M A BUILDER

+

Qualifications which unlock an amazing future in the tech world through open-source contributions and collaborative development.

+ +
+
+
+
+

I'M AN EMPLOYER

+

Support young people by hiring contributors, volunteering, or making partnerships with OpenRockets community.

+ +
+
+
+ + +
+
+

With a network of contributors from

+

Universities, High schools and Secondary schools from Sri Lanka, India and Maldives.

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+
+

Build Amazing Things

+

+ Whether you're just starting out or you're a seasoned developer, + OpenRockets provides everything you need to create and collaborate on open-source projects. +

+
+ +
+
+
+ Modern Development +
+
+
+ DEVELOPMENT +
+

Open Source Projects

+

+ Contribute to real-world projects like OpenSocial, our comprehensive social media platform, + and web-dev-error-solutions with 2.9k+ GitHub stars. +

+ + View Projects + +
+
+ +
+
+ +
+
+
+ COMMUNITY +
+

Global Community

+

+ Connect with builders from Sri Lanka and around the world. Share knowledge, + get feedback, and collaborate on innovative solutions. +

+ + Join Community + +
+
+ +
+
+ Learning Resources +
+
+
+ LEARNING +
+

Learn by Building

+

+ Master new technologies through hands-on projects. From JavaScript to complex + web applications, learn with real-world experience. +

+ + Start Learning + +
+
+ +
+
+ +
+
+
+ EVENTS +
+

Hackathons & Events

+

+ Participate in coding competitions, workshops, and hackathons. Win prizes, + gain recognition, and showcase your skills to the community. +

+ + View Events + +
+
+ +
+
+ Developer Tools +
+
+
+ TOOLS +
+

Modern Tools

+

+ Access cutting-edge development tools, GitHub integration, and + infrastructure to bring your innovative ideas to life. +

+ + Explore Tools + +
+
+ +
+
+ +
+
+
+ REWARDS +
+

Recognition & Rewards

+

+ Top contributors receive free domain names, full project ownership, + and media recognition. Build your reputation in the open-source community. +

+ + Get Recognized + +
+
+
+
+
+
+
+

+ In partnetship with, +

+
+
+ + + + +
+
+
+ +
+
+
+
+
+ +
+
+ "OpenRockets is cool, I'm wodering how they could pitch this innovative idea in Sri Lanka, This is a whole new ecosystem. When I leave Sri Lanka at 12, it was so different. I hope to visit Sri Lanka again." +
+
+

Ranithu Raddolugama

+

Seattle, Washington, United States

+
+
+
+ Community +
+
+
+
+ + +
+ + +
+
+
+

LATEST NEWS AND FEATURES

+

+ Check out some of the incredible open-source projects our community has built and maintains. +

+
+ View all +
+ +
+
+
+ OpenSocial Platform +
+
+
+ PROJECT + • SEPTEMBER 21 2025 +
+

OpenSocial Platform Remains Top for 4th Year in a row!

+

+ Build Sri Lanka's most comprehensive open-source social media platform! + Top 3 contributors receive free domain names and full platform ownership. +

+ + Open Source + +
+
+ +
+
+ Web Development +
+
+
+ COMMUNITY STORY + • SEPTEMBER 18 2025 +
+

Web Dev Error Solutions – Community Spotlight

+

+ A community-curated handbook with 2,948+ GitHub stars for common web development + errors. Find fixes for JavaScript, React, Node.js, CSS, and more! +

+ + Community + +
+
+ +
+
+ CityofGits Game +
+
+
+ PROJECT + • AUGUST 15 2025 +
+

CityOfGits

+

+ CityofGits was created by Neksha DeSilva, with partnership with OpenRockets Founadation. You must play it! +

+ + Projects + +
+
+
+
+ + +
+
+

Upcoming Events

+

+ Join our exciting events, hackathons, and game jams happening around Sri Lanka and online. +

+
+ +
+ + +
+
+ +
+

Weekly Coding Sessions

+

+ Join our weekly coding sessions where we work on open-source projects, + share knowledge, and help each other grow as developers. +

+ + View Calendar + +
+ +
+
+ +
+

Contribution Challenges

+

+ Take part in our monthly contribution challenges. Solve GitHub issues, + win prizes, and get recognition in the developer community. +

+ + View Challenges + +
+
+
+ + +
+
+

Join Our Community

+

+ Connect with builders from around the world and collaborate on amazing open-source projects. +

+
+ +
+
+
+ +
+

Discord Server

+

+ Join our active Discord community where developers collaborate, share knowledge, + and get help with coding challenges 24/7. +

+ + Join Discord + +
+ +
+
+ +
+

GitHub Organization

+

+ Contribute to our 18+ repositories, create pull requests, and collaborate + with developers worldwide on innovative projects. +

+ + View Organization + +
+ +
+
+ +
+

Official Contact

+

+ Reach out for partnerships, collaborations, or general inquiries. + We're always open to new opportunities and connections. +

+ + Contact Us + +
+
+
+ + +
+
+

Latest Updates

+

+ Stay up to date with OpenRockets announcements, project updates, and community highlights. +

+
+ +
+
+ + + +
+
+
+ + +
+ + + + + +
+
+

Ready to Start Building?

+

+ Join 31+ followers on GitHub and contribute to innovative open-source projects. + Level up, Challenge, Grow, Contribute with OpenRockets. +

+ +
+
+ + + + + + + + + +
+
+ Parrot Assistant +
+
+ Welcome to OpenRockets! 🚀 +
+
+
+
Tips
+
+ +
+ + + + + + + diff --git a/join.html b/join.html index 75f0424..3b591da 100644 --- a/join.html +++ b/join.html @@ -8,12 +8,7 @@ - - +
diff --git a/landing.html b/landing.html index 3ccb46d..b142928 100644 --- a/landing.html +++ b/landing.html @@ -106,7 +106,7 @@

Welcome to the Future of Programming Education

JD
John Doe
-
Just completed the React course!
+
Just completed the React course! 🚀
diff --git a/opennetwork-banner-demo.html b/opennetwork-banner-demo.html index 9b7b484..e36c270 100644 --- a/opennetwork-banner-demo.html +++ b/opennetwork-banner-demo.html @@ -125,7 +125,7 @@
-

OpenNetwork Banner Demo

+

🚀 OpenNetwork Banner Demo

Welcome to the OpenNetwork Collective Banner demonstration!

diff --git a/reg/21.html b/reg/21.html index 957fb6d..1cfbce3 100644 --- a/reg/21.html +++ b/reg/21.html @@ -328,7 +328,7 @@

Register for M diff --git a/scripts/parrot-assistant.js b/scripts/parrot-assistant.js new file mode 100644 index 0000000..f0d7a22 --- /dev/null +++ b/scripts/parrot-assistant.js @@ -0,0 +1,208 @@ +// Parrot Assistant - Interactive Screen Friend +class ParrotAssistant { + constructor() { + this.parrot = document.getElementById('parrot-assistant'); + this.bubble = document.getElementById('parrot-bubble'); + this.bubbleContent = document.getElementById('bubble-content'); + this.categoryBadge = document.getElementById('category-badge'); + this.parrotGif = this.parrot.querySelector('.parrot-gif'); + + this.currentMessageIndex = 0; + this.isVisible = false; + this.messageTimeout = null; + + // Message categories with content + this.messages = { + tips: [ + "Need free laptop stickers? Solve issues in our GitHub and we will contact you.", + "It's really lonely here to stay all the day..", + "Building an Innovation? Shall we give you 20 dollars FREE?", + "Not from India, Sri Lanka, Maldives, Malaysia? Let's start a new club in your country!", + "Hmm.." + ], + announcements: [ + "DAYDREAM SRI LANKA is happening 27th in Colombo!! Join it!", + "Weekly coding meetups every Saturday - virtual and in-person available!", + "Top 3 contributors get free domain names and full project ownership!", + "We've reached 2.9k+ GitHub stars! Thank you amazing community!" + ], + memes: [ + "Why do programmers prefer dark mode? Because light attracts bugs!", + "Me: I'll just fix this one small bug... 3 hours later... why is everything broken?", + "99 little bugs in the code, 99 little bugs... Take one down, patch it around... 127 little bugs in the code!", + "Git commit -m 'fixed everything' ...famous last words!", + "Coffee: Because debugging at 3 AM is a lifestyle choice, not a requirement!" + ], + ideas: [ + "Idea: Create a mobile app version of your favorite OpenRockets project!", + "Brainstorm: What if we added AR features to CityofGits? Build in 3D space!", + "Vision: AI-powered code review bot for our repositories!", + "Concept: Design system library for consistent OpenRockets branding!", + "Dream: Global coding bootcamp program powered by our community!" + ] + }; + + this.init(); + } + + init() { + // Add entrance animation + setTimeout(() => { + this.parrot.classList.add('animate-entrance'); + }, 1000); + + // Set up event listeners + this.setupEventListeners(); + + // Start showing messages + setTimeout(() => { + this.showRandomMessage(); + this.startMessageCycle(); + }, 3000); + } + + setupEventListeners() { + // Parrot click interaction + this.parrotGif.addEventListener('click', () => { + this.bounceParrot(); + this.showRandomMessage(); + }); + + // Scroll-triggered messages + let scrollTimeout; + window.addEventListener('scroll', () => { + clearTimeout(scrollTimeout); + scrollTimeout = setTimeout(() => { + if (Math.random() < 0.1) { // 10% chance on scroll + this.showRandomMessage(); + } + }, 500); + }); + + // Hover interactions on feature cards + document.querySelectorAll('.feature-card, .btn').forEach(element => { + element.addEventListener('mouseenter', () => { + if (Math.random() < 0.15) { // 15% chance on hover + this.showContextualMessage(element); + } + }); + }); + + // Hide bubble when clicking outside + document.addEventListener('click', (e) => { + if (!this.parrot.contains(e.target)) { + this.hideBubble(); + } + }); + } + + showRandomMessage() { + const categories = Object.keys(this.messages); + const randomCategory = categories[Math.floor(Math.random() * categories.length)]; + const messages = this.messages[randomCategory]; + const randomMessage = messages[Math.floor(Math.random() * messages.length)]; + + this.displayMessage(randomMessage, randomCategory); + } + + showContextualMessage(element) { + let message = ""; + let category = "tips"; + + // Context-aware messages based on element + if (element.classList.contains('btn-primary')) { + message = "🚀 Ready to start your coding journey? Click that button and let's build something amazing!"; + category = "announcements"; + } else if (element.classList.contains('feature-card')) { + const tips = [ + "This feature is perfect for beginners! Don't be afraid to dive in!", + "Hover over me more often for secret tips and tricks!", + "Each feature connects to real projects you can contribute to!" + ]; + message = tips[Math.floor(Math.random() * tips.length)]; + category = "tips"; + } + + if (message) { + this.displayMessage(message, category); + } + } + + displayMessage(message, category = 'tips') { + this.bubbleContent.textContent = message; + this.categoryBadge.textContent = category.toUpperCase(); + + // Update category badge color based on type + const categoryColors = { + tips: 'var(--gradient-electric)', + announcements: 'var(--gradient-sunset)', + memes: 'var(--gradient-cosmic)', + ideas: 'var(--gradient-neon)' + }; + + this.categoryBadge.style.background = categoryColors[category] || 'var(--gradient-electric)'; + + // Show bubble and badge + this.bubble.classList.add('show'); + this.categoryBadge.classList.add('show'); + this.isVisible = true; + + // Bounce parrot + this.bounceParrot(); + + // Auto-hide after 8 seconds + clearTimeout(this.messageTimeout); + this.messageTimeout = setTimeout(() => { + this.hideBubble(); + }, 8000); + } + + hideBubble() { + this.bubble.classList.remove('show'); + this.categoryBadge.classList.remove('show'); + this.isVisible = false; + } + + bounceParrot() { + this.parrotGif.classList.remove('bounce'); + setTimeout(() => { + this.parrotGif.classList.add('bounce'); + }, 10); + + setTimeout(() => { + this.parrotGif.classList.remove('bounce'); + }, 600); + } + + startMessageCycle() { + // Show random messages every 15-30 seconds + const showMessage = () => { + if (!this.isVisible) { + this.showRandomMessage(); + } + + // Random interval between 15-30 seconds + const nextInterval = 15000 + Math.random() * 15000; + setTimeout(showMessage, nextInterval); + }; + + setTimeout(showMessage, 20000); // First cycle after 20 seconds + } +} + +// Initialize when DOM is loaded +document.addEventListener('DOMContentLoaded', () => { + new ParrotAssistant(); +}); + +// Add some fun Easter eggs +document.addEventListener('keydown', (e) => { + // Konami code easter egg (up, up, down, down, left, right, left, right, b, a) + if (e.code === 'KeyP' && e.ctrlKey) { // Ctrl+P for parrot party + const parrot = document.getElementById('parrot-assistant'); + if (parrot) { + const assistant = new ParrotAssistant(); + assistant.displayMessage("🎉 *SQUAWK SQUAWK* You found the secret parrot party! 🦜🎊", "memes"); + } + } +}); diff --git a/simple-integration-test.html b/simple-integration-test.html index 40afb4b..c320289 100644 --- a/simple-integration-test.html +++ b/simple-integration-test.html @@ -32,7 +32,7 @@
-

Simple Integration Test

+

🚀 Simple Integration Test

This page demonstrates the most basic integration of the OpenNetwork Banner.

Just include the script and the banner automatically appears!

Domain detected: Loading...

diff --git a/styles/community.css b/styles/community.css index 9f0923f..bc30497 100644 --- a/styles/community.css +++ b/styles/community.css @@ -1,19 +1,19 @@ /* ===== COMMUNITY SPECIFIC STYLES ===== */ -/* Import Professional Color Variables */ +/* Import Hack Club gradient variables */ :root { - --gradient-electric: #1A73E8; - --gradient-sunset: #1A73E8; - --gradient-cosmic: #1A73E8; - --gradient-neon: #1A73E8; - --font-display: 'Google Sans', sans-serif; - --font-mono: 'Google Sans', sans-serif; + --gradient-electric: linear-gradient(135deg, #7C3AED 0%, #06B6D4 100%); + --gradient-sunset: linear-gradient(135deg, #F59E0B 0%, #EF4444 100%); + --gradient-cosmic: linear-gradient(135deg, #8B5CF6 0%, #EC4899 100%); + --gradient-neon: linear-gradient(135deg, #10B981 0%, #06B6D4 100%); + --font-display: 'Kanit', sans-serif; + --font-mono: 'Space Mono', monospace; } /* Community Layout */ .community-container { padding: 24px; - font-family: 'Google Sans', -apple-system, sans-serif; + font-family: 'Space Grotesk', -apple-system, sans-serif; } .community-layout { @@ -142,7 +142,7 @@ text-align: left; cursor: pointer; font-size: 1rem; - font-family: 'Google Sans', sans-serif; + font-family: 'Space Grotesk', sans-serif; transition: all 0.3s ease; } diff --git a/styles/dashboard.css b/styles/dashboard.css index 0c85e9c..3089d63 100644 --- a/styles/dashboard.css +++ b/styles/dashboard.css @@ -24,8 +24,8 @@ --gradient-primary: linear-gradient(135deg, var(--accent-primary), #7b68ee); /* Fonts */ - --font-primary: 'Google Sans', system-ui, sans-serif; - --font-mono: 'Google Sans', monospace; + --font-primary: 'Inter', system-ui, sans-serif; + --font-mono: 'Space Mono', monospace; /* Spacing */ --sidebar-width: 280px; diff --git a/styles/hackclub-style.css b/styles/hackclub-style.css index 891d39b..84a7d6e 100644 --- a/styles/hackclub-style.css +++ b/styles/hackclub-style.css @@ -1,49 +1,50 @@ -/* OpenRockets - Professional Design System */ -@import url('https://fonts.googleapis.com/css2?family=Google+Sans:wght@400;500;700&display=swap'); - +/* OpenRockets - Hack Club Inspired Design System */ +@import url('https://fonts.googleapis.com/css2?family=Phantom+Sans:wght@400;700;800;900&family=Space+Grotesk:wght@300;400;500;600;700;800;900&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Asimovian&family=Michroma&family=Zalando+Sans+Expanded:ital,wght@0,200..900;1,200..900&display=swap'); :root { - /* Professional Color Palette */ - --primary-white: #FFFFFF; - --primary-black: #000000; - --primary-blue: #1A73E8; - --secondary-blue: #4285F4; - --accent-red: #DC3545; - --light-gray: #F8F9FA; - --medium-gray: #6C757D; - --dark-gray: #343A40; - --border-gray: #DEE2E6; - - /* Simplified color references */ - --ada-blue: var(--primary-blue); - --ada-light-gray: var(--light-gray); - --ada-dark-gray: var(--dark-gray); - --ada-purple: #8B5CF6; + /* Ada College Inspired Color Palette */ --ada-yellow: #FFD23F; - --ada-green: #10B981; - --ada-orange: #FF8C42; - --ada-pink: #EC4899; - - /* Legacy color compatibility */ - --hc-blue: var(--primary-blue); - --hc-slate: var(--dark-gray); - --hc-muted: var(--medium-gray); - --hc-smoke: var(--light-gray); - --hc-snow: var(--primary-white); - --hc-dark: var(--dark-gray); - --hc-black: var(--primary-black); - - /* OpenRockets color system */ - --or-primary: var(--primary-blue); - --or-secondary: var(--secondary-blue); - --or-accent: var(--accent-red); - --or-dark: var(--dark-gray); - --or-darker: var(--primary-black); - --or-light: var(--light-gray); + --ada-green: #7CB342; + --ada-blue: #42A5F5; + --ada-purple: #BA68C8; + --ada-orange: #FF7043; + --ada-pink: #EC407A; + --ada-light-gray: #F8F9FA; + --ada-dark-gray: #263238; + + /* Modern Gradients - Ada Inspired */ + --gradient-primary: linear-gradient(135deg, var(--ada-yellow) 0%, var(--ada-orange) 100%); + --gradient-secondary: linear-gradient(135deg, var(--ada-green) 0%, var(--ada-blue) 100%); + --gradient-accent: linear-gradient(135deg, var(--ada-purple) 0%, var(--ada-pink) 100%); + --gradient-hero: linear-gradient(135deg, var(--ada-blue) 0%, var(--ada-purple) 50%, var(--ada-pink) 100%); + --gradient-geometric: linear-gradient(45deg, var(--ada-yellow) 25%, var(--ada-green) 25%, var(--ada-green) 50%, var(--ada-blue) 50%, var(--ada-blue) 75%, var(--ada-purple) 75%); + + /* Legacy Hack Club Colors (maintained for compatibility) */ + --hc-red: var(--ada-orange); + --hc-orange: var(--ada-yellow); + --hc-yellow: var(--ada-yellow); + --hc-green: var(--ada-green); + --hc-blue: var(--ada-blue); + --hc-purple: var(--ada-purple); + --hc-slate: #34495E; + --hc-muted: #7F8C8D; + --hc-smoke: #ECF0F1; + --hc-snow: #FFFFFF; + --hc-dark: #2C3E50; + --hc-black: #1A252F; + + /* Custom OpenRockets Extensions - Ada Style */ + --or-primary: var(--ada-blue); + --or-secondary: var(--ada-green); + --or-accent: var(--ada-yellow); + --or-dark: var(--ada-dark-gray); + --or-darker: #1A252F; + --or-light: var(--ada-light-gray); /* Typography */ - --font-primary: 'Google Sans', -apple-system, BlinkMacSystemFont, sans-serif; - --font-display: 'Google Sans', sans-serif; - --font-modern: 'Google Sans', sans-serif; + --font-primary: 'Space Grotesk', -apple-system, BlinkMacSystemFont, sans-serif; + --font-display: "Asimovian", sans-serif; + --font-modern: "Asimovian", sans-serif; /* Spacing */ --space-1: 0.25rem; @@ -69,41 +70,6 @@ /* Animations */ --transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); --transition-slow: all 0.4s cubic-bezier(0.4, 0, 0.2, 1); - --transition-base: all 0.3s ease; - - /* Additional missing variables */ - --white: #FFFFFF; - --hc-red: #EC3750; - --hc-orange: #FF8C37; - --ada-dark: var(--dark-gray); - --primary-purple: var(--ada-purple); - --primary-color: var(--primary-black); - --primary-light: var(--light-gray); - --accent-color: var(--primary-blue); - --gray-300: #DEE2E6; - --gray-400: var(--medium-gray); - --bg-primary: var(--dark-gray); - --bg-secondary: var(--primary-black); - --bg-tertiary: #1a1a1a; - - /* Additional spacing */ - --space-xs: 0.25rem; - --space-sm: 0.5rem; - --space-md: 1rem; - --space-lg: 1.5rem; - --space-xl: 2rem; - --space-2xl: 3rem; - --space-3xl: 4rem; - - /* Text sizes */ - --text-sm: 0.875rem; - --text-base: 1rem; - --text-lg: 1.125rem; - - /* Gradients */ - --gradient-primary: linear-gradient(135deg, var(--ada-yellow), var(--ada-orange)); - --gradient-secondary: linear-gradient(135deg, var(--ada-blue), var(--ada-purple)); - --gradient-sunset: linear-gradient(135deg, var(--ada-orange), var(--ada-pink)); } /* Reset */ @@ -119,8 +85,9 @@ html { body { font-family: var(--font-primary); - background: var(--primary-white); - color: var(--primary-black); + background: linear-gradient(135deg, var(--ada-light-gray) 0%, #FFFFFF 25%, var(--ada-light-gray) 50%, #F0F3F7 75%, var(--ada-light-gray) 100%); + background-attachment: fixed; + color: var(--ada-dark-gray); line-height: 1.6; overflow-x: hidden; font-weight: 400; @@ -128,6 +95,22 @@ body { position: relative; } +/* Ambient background effects - Ada Style Geometric Patterns */ +body::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: + radial-gradient(circle at 20% 80%, rgba(175, 122, 197, 0.08) 0%, transparent 50%), + radial-gradient(circle at 80% 20%, rgba(143, 209, 79, 0.08) 0%, transparent 50%), + radial-gradient(circle at 50% 50%, rgba(255, 210, 63, 0.05) 0%, transparent 50%); + pointer-events: none; + z-index: -1; +} + /* Canvas Background */ #canvas-bg { position: fixed; @@ -139,18 +122,20 @@ body { opacity: 0.1; } -/* Navigation - Professional Style */ +/* Navigation - Ada Style */ .navbar { position: fixed; top: 0; left: 0; right: 0; z-index: 1000; - background: var(--primary-white); - border-bottom: 1px solid var(--border-gray); + background: rgba(0, 0, 0, 0.95); + -webkit-backdrop-filter: blur(20px); + backdrop-filter: blur(20px); + border-bottom: 3px solid var(--ada-yellow); padding: var(--space-3) 0; transition: var(--transition); - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + box-shadow: 0 2px 20px rgba(0, 0, 0, 0.08); } .nav-container { @@ -190,8 +175,12 @@ body { .brand-text { font-family: var(--font-display); font-size: 1.5rem; - font-weight: 700; - color: var(--primary-black); + font-weight: 800; + + background: var(--ada-light-gray); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; line-height: 1; } @@ -336,8 +325,8 @@ body { font-weight: 900; line-height: 0.95; margin-bottom: var(--space-4); - background: linear-gradient(45deg, var(--primary-black), var(--dark-gray)); - filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1)); + background: linear-gradient(45deg, white, #ffffff); + filter: drop-shadow(0 0 50px black); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; @@ -2852,156 +2841,3 @@ body.nav-open { opacity: 0.7; } - -/* Magazine Announcement Section */ -.magazine-announcement { - padding: var(--space-6) var(--space-4); - background: var(--light-gray); - border-bottom: 1px solid var(--border-gray); -} - -.magazine-announcement .container { - max-width: 1200px; - margin: 0 auto; -} - -.announcement-content { - background: var(--primary-white); - padding: var(--space-5); - border-radius: var(--radius-lg); - box-shadow: var(--shadow-lg); - text-align: center; -} - -.announcement-header h2 { - margin-bottom: var(--space-4); -} - -.announcement-body p { - max-width: 800px; - margin: 0 auto var(--space-4); -} - -/* Impact Report Section */ -.impact-report { - padding: var(--space-6) var(--space-4); - background: var(--primary-white); -} - -.impact-report .container { - max-width: 1200px; - margin: 0 auto; -} - -.report-header { - text-align: center; - margin-bottom: var(--space-5); -} - -.report-meta { - color: var(--medium-gray); - font-size: 0.9rem; - margin-top: var(--space-2); -} - -.report-content { - background: var(--light-gray); - padding: var(--space-5); - border-radius: var(--radius-lg); - border: 1px solid var(--border-gray); -} - -.report-intro { - font-size: 1.1rem; - line-height: 1.8; - margin-bottom: var(--space-5); - color: var(--dark-gray); -} - -.milestones-section h3 { - font-size: 1.8rem; - margin-bottom: var(--space-4); - color: var(--primary-black); - font-weight: 700; -} - -.milestones-list { - list-style: none; - padding: 0; -} - -.milestones-list li { - background: var(--primary-white); - padding: var(--space-4); - margin-bottom: var(--space-3); - border-radius: var(--radius); - border-left: 4px solid var(--primary-blue); - box-shadow: var(--shadow-sm); -} - -.milestones-list li strong { - color: var(--primary-blue); - font-weight: 700; -} - -.report-cta { - margin-top: var(--space-5); - display: flex; - gap: var(--space-3); - justify-content: center; - flex-wrap: wrap; -} - -/* Professional Button Styles */ -.btn-primary { - background: var(--primary-blue); - color: var(--primary-white); - border: none; -} - -.btn-primary:hover { - background: var(--secondary-blue); - transform: translateY(-2px); - box-shadow: 0 4px 12px rgba(26, 115, 232, 0.3); -} - -.btn-secondary { - background: var(--primary-white); - color: var(--primary-blue); - border: 2px solid var(--primary-blue); -} - -.btn-secondary:hover { - background: var(--primary-blue); - color: var(--primary-white); - transform: translateY(-2px); -} - -/* Remove all gradient backgrounds for professional look */ -body::before, -.hero::before, -.hero::after { - display: none; -} - -/* Professional footer */ -.footer { - background: var(--dark-gray) !important; - color: var(--primary-white) !important; - border-top: 1px solid var(--border-gray); -} - -.footer-section h4, -.footer-section h5 { - color: var(--primary-white) !important; -} - -.footer-section a, -.footer-section span { - color: var(--light-gray) !important; -} - -.footer-section a:hover { - color: var(--primary-blue) !important; -} - diff --git a/styles/lms-main.css b/styles/lms-main.css index cdf35a8..febf98c 100644 --- a/styles/lms-main.css +++ b/styles/lms-main.css @@ -32,8 +32,8 @@ --shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.5); /* Fonts */ - --font-primary: 'Google Sans', -apple-system, BlinkMacSystemFont, sans-serif; - --font-mono: 'Google Sans', 'Fira Code', monospace; + --font-primary: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; + --font-mono: 'Space Mono', 'Fira Code', monospace; } /* ===== RESET & BASE STYLES ===== */ diff --git a/styles/main.css b/styles/main.css index 24eb7de..b3842dd 100644 --- a/styles/main.css +++ b/styles/main.css @@ -6,39 +6,39 @@ } :root { - /* Professional Color Palette */ - --primary-color: #1A73E8; - --primary-dark: #1557B0; - --primary-light: #4285F4; - --secondary-color: #000000; - --secondary-dark: #000000; - --accent-color: #DC3545; - --accent-dark: #C82333; + /* Color Palette */ + --primary-color: #22ff00; + --primary-dark: #004499; + --primary-light: #000000; + --secondary-color: #ff6b35; + --secondary-dark: #e55a2b; + --accent-color: #00d4aa; + --accent-dark: #00b894; /* Neutral Colors */ --white: #ffffff; - --gray-50: #f8f9fa; - --gray-100: #e9ecef; - --gray-200: #dee2e6; - --gray-300: #ced4da; - --gray-400: #adb5bd; - --gray-500: #6c757d; - --gray-600: #495057; - --gray-700: #343a40; - --gray-800: #212529; - --gray-900: #000000; + --gray-50: #f8fafc; + --gray-100: #f1f5f9; + --gray-200: #e2e8f0; + --gray-300: #cbd5e1; + --gray-400: #94a3b8; + --gray-500: #64748b; + --gray-600: #475569; + --gray-700: #334155; + --gray-800: #1e293b; + --gray-900: #0f172a; --black: #000000; /* Background Colors */ - --bg-primary: #ffffff; - --bg-secondary: #f8f9fa; - --bg-tertiary: #e9ecef; - --bg-glass: rgba(255, 255, 255, 0.95); - --bg-glass-hover: rgba(255, 255, 255, 1); + --bg-primary: #0a0a0f; + --bg-secondary: #1a1a2e; + --bg-tertiary: #16213e; + --bg-glass: rgba(255, 255, 255, 0.05); + --bg-glass-hover: rgba(255, 255, 255, 0.1); /* Typography */ - --font-primary: 'Google Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; - --font-mono: 'Google Sans', 'Roboto Mono', monospace; + --font-primary: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; + --font-mono: 'Space Mono', 'Fira Code', 'Monaco', 'Consolas', monospace; /* Font Weights */ --font-light: 300; diff --git a/test-community.html b/test-community.html index d3f0dae..5984478 100644 --- a/test-community.html +++ b/test-community.html @@ -83,7 +83,7 @@
-

OpenRockets Community System Test

+

🚀 OpenRockets Community System Test

This page tests all the community features to identify what's working and what needs to be fixed.

From 1f5c484a6e48636fe2cdb6c748864b56e743ffe4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Feb 2026 15:48:43 +0000 Subject: [PATCH 3/4] Add restoration notice to README documenting removal of AI commits Co-authored-by: NekshaDeSilva <102156620+NekshaDeSilva@users.noreply.github.com> --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 811538b..6ebd746 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # OpenRockets LMS - Complete Learning Management System +> **Repository Restoration Notice (February 15, 2026)**: This repository has been restored to its last organic commit from October 1, 2025 (commit `55b35d0`), removing all AI-generated commits and pull requests that were merged after that date. The repository now reflects the authentic version of the website created by the OpenRockets community before AI bot interference. + A modern, full-stack Learning Management System built with Node.js, Express, and AstraDB. Features include user authentication, course management, community interactions, real-time messaging, and calendar-based event scheduling. ![preview](https://github.com/user-attachments/assets/c6b74ca6-0056-41fe-b895-41ccc0d123cc) From 559598eea57275eab3ae54f38fe68276e91ad207 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 15 Feb 2026 15:49:20 +0000 Subject: [PATCH 4/4] Remove AI-added files (PWA manifests, components, security.txt, etc.) Co-authored-by: NekshaDeSilva <102156620+NekshaDeSilva@users.noreply.github.com> --- .well-known/security.txt | 5 - .../magazine/openrockets-foundation-logo.png | Bin 20351 -> 0 bytes assets/magazine/openrockets-magazine-logo.png | Bin 22763 -> 0 bytes components/footer.html | 51 - components/header.html | 21 - mag-reference | 1 - manifest.json | 70 -- robots.txt | 23 - scripts/enhancements.js | 363 ------ sitemap.xml | 39 - styles/foundation.css | 1018 ----------------- styles/super-enhancements.css | 486 -------- sw.js | 83 -- 13 files changed, 2160 deletions(-) delete mode 100644 .well-known/security.txt delete mode 100644 assets/magazine/openrockets-foundation-logo.png delete mode 100644 assets/magazine/openrockets-magazine-logo.png delete mode 100644 components/footer.html delete mode 100644 components/header.html delete mode 160000 mag-reference delete mode 100644 manifest.json delete mode 100644 robots.txt delete mode 100644 scripts/enhancements.js delete mode 100644 sitemap.xml delete mode 100644 styles/foundation.css delete mode 100644 styles/super-enhancements.css delete mode 100644 sw.js diff --git a/.well-known/security.txt b/.well-known/security.txt deleted file mode 100644 index 9bd71db..0000000 --- a/.well-known/security.txt +++ /dev/null @@ -1,5 +0,0 @@ -Contact: mailto:official@openrockets.com -Preferred-Languages: en -Canonical: https://openrockets.com/.well-known/security.txt -Policy: https://github.com/OpenRockets/openrockets.com/security/policy -Acknowledgments: https://github.com/OpenRockets/openrockets.com/graphs/contributors diff --git a/assets/magazine/openrockets-foundation-logo.png b/assets/magazine/openrockets-foundation-logo.png deleted file mode 100644 index 3539677e5eaeea23bc13bcad6e4ea51228189c6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20351 zcmb@N1y@_&)3$N9mKN9I?iRdgDMbntDK4cHcPF^J)8bBXDeg`}@uI;cxC99j;N|y! zzQQ|eMb1gG_spEVlQnZ+iPBJ0!pEV&K|(^p|DY`Y83_qF=;b*G3*+Tpt{x%%@__96 zS?N7e%>>oK%K@6T>?c_yr1}J0gcoE3654*Yi{VBEB530nprYj%H{D&|hD732pvhN>% zC1rkh8*Hie#$%L6`z;eCuc`9s966|b6^#gsNyq(Yz6(C}ye@Isb9)1^trc2Wv(0Oq z?7Ea522Qrk|FoTOoVfezC^ZkU&H3^D|GzC#Ojx!Qyx1m1pUuT_LCZkgQZ>4>{Qu6G zjnx0perCK#OYjA4yTnqt!`QSX_$9;?ZxehLl~9EDlGV7$5;-aQ(VhV9*EoQr`n7jfwdcpLHBC$ zwUw141g~+(I94Xxplch0Qv~eG9Zw`s&F;UbMVb8?@H|A8MM2cx|Md4sB8nGl#-o8TZ=3K_c+_63c*)^)#Cb}b*-mp=V_A9a z*Qp$d?EcRiJ6wvOXCX1p0jkBs6)d@gsS`M#*>OTRBmjVmh_A$pIdUBrG^g5izXQsi z=9tU9*g)()_1zhcFCctj%>F;$7T-`JGb z7>Igw{})DPB;_D3g&FOj`?FCgt$akpkWIML&G8bja{F2HfA1jc+in1NKch2rfH`T| zGoA%Tp?NI-b2WDJ>R@*D_0)$&j8>F&`2)23@q6i&wfGUzmN!@MhUfc&j5kT z@%e_ruo+cvpiSns(8#Mir9s~KNhs*mGZB}%RQJdKTx@0L9eHqBRJrS+^_c~ts`=jz z(5hwQke_R1@R+DMQ&CY7v^VBiWocz_8{J!xZ%fY~z*(Oj<}MN^QfiF5?#XgGEF2xr zZemDza+9Z}N?axKlwGo=flqT0Qdb3U@+OfZDBqJSj$i`z(A|K&1)@~4|7BeW56@ZT z_qRbik=SgdgK1yGpPNF2he-R_QaagaLvWnh-LC{4Y8(^n!~6PbnUYOb1>xc0802$T zbY#n|iZ?kN2k`@n07|II+XpA9jszk{$*bID(#fa*Nq00Db!bEf?r@J{ck*VgFzSCn za&Iy*&JU+teDjQpYgM|`nupkDx>A`iIRq=k;DQY~H}#~HeJ;Er2|S+=cRR_oel>qF zUXom6GD_54DOe1h$T^DLOVzx2dXhRL^J&IvzCiZw{;FDbZL+%Qh4FcSKW|flx{r7; zJlwwUMto&Fk&+@Ft@hPyIc>V)Ok-f{a8EQp2tF#wU+(I p+f<(+2hc#d~UDMGBy34TXfmvaXw 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 R%L!P-5R8_QX019d>VKvu`<(y) diff --git a/components/footer.html b/components/footer.html deleted file mode 100644 index 0dd375c..0000000 --- a/components/footer.html +++ /dev/null @@ -1,51 +0,0 @@ - -
-
- - -
-
diff --git a/components/header.html b/components/header.html deleted file mode 100644 index 8a8d265..0000000 --- a/components/header.html +++ /dev/null @@ -1,21 +0,0 @@ - - diff --git a/mag-reference b/mag-reference deleted file mode 160000 index 44095fb..0000000 --- a/mag-reference +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 44095fb843b383951a5928e0879716f956e93734 diff --git a/manifest.json b/manifest.json deleted file mode 100644 index 263191d..0000000 --- a/manifest.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "name": "OpenRockets - Build the Future Together", - "short_name": "OpenRockets", - "description": "OpenRockets OSS - Advancing software, education, and data innovation through the power of open-source. Level up, Challenge, Grow, Contribute.", - "start_url": "/", - "display": "standalone", - "background_color": "#ffffff", - "theme_color": "#EC3750", - "orientation": "portrait-primary", - "icons": [ - { - "src": "/i/assets/static/openthread_logo_bash-trans-removebg-preview (1).png", - "sizes": "192x192", - "type": "image/png", - "purpose": "any maskable" - }, - { - "src": "/v/openrockets.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "any maskable" - } - ], - "categories": ["education", "development", "productivity"], - "screenshots": [ - { - "src": "/v/cityofgits-summercap-dark-lg-4000x1010.png", - "sizes": "4000x1010", - "type": "image/png" - } - ], - "shortcuts": [ - { - "name": "Join OpenRockets", - "short_name": "Join", - "description": "Join the OpenRockets community", - "url": "/join.html", - "icons": [ - { - "src": "/v/openrockets.png", - "sizes": "192x192" - } - ] - }, - { - "name": "Events Calendar", - "short_name": "Events", - "description": "View upcoming events and hackathons", - "url": "/calendar.html", - "icons": [ - { - "src": "/v/openrockets.png", - "sizes": "192x192" - } - ] - }, - { - "name": "Community", - "short_name": "Community", - "description": "Connect with the OpenRockets community", - "url": "/community.html", - "icons": [ - { - "src": "/v/openrockets.png", - "sizes": "192x192" - } - ] - } - ] -} diff --git a/robots.txt b/robots.txt deleted file mode 100644 index a5e0030..0000000 --- a/robots.txt +++ /dev/null @@ -1,23 +0,0 @@ -# robots.txt for OpenRockets.com - -User-agent: * -Allow: / - -# Sitemap location -Sitemap: https://openrockets.com/sitemap.xml - -# Disallow private directories -Disallow: /node_modules/ -Disallow: /.git/ -Disallow: /.vscode/ -Disallow: /uploads/ -Disallow: /form/js/ - -# Allow important resources -Allow: /scripts/ -Allow: /styles/ -Allow: /v/ -Allow: /assets/ - -# Crawl-delay (be nice to smaller bots) -Crawl-delay: 1 diff --git a/scripts/enhancements.js b/scripts/enhancements.js deleted file mode 100644 index f9c4b26..0000000 --- a/scripts/enhancements.js +++ /dev/null @@ -1,363 +0,0 @@ -// Enhanced UX Features for OpenRockets -// Smooth scrolling, animations, lazy loading, and more - -// 1. Smooth Scrolling for all anchor links -document.querySelectorAll('a[href^="#"]').forEach(anchor => { - anchor.addEventListener('click', function (e) { - const href = this.getAttribute('href'); - if (href === '#' || !href) return; - - e.preventDefault(); - const target = document.querySelector(href); - - if (target) { - target.scrollIntoView({ - behavior: 'smooth', - block: 'start' - }); - - // Update URL without jumping - history.pushState(null, null, href); - } - }); -}); - -// 2. Intersection Observer for fade-in animations -const observerOptions = { - threshold: 0.1, - rootMargin: '0px 0px -50px 0px' -}; - -const fadeInObserver = new IntersectionObserver((entries) => { - entries.forEach(entry => { - if (entry.isIntersecting) { - entry.target.classList.add('animate-fade-in'); - fadeInObserver.unobserve(entry.target); - } - }); -}, observerOptions); - -// Observe elements for fade-in -document.addEventListener('DOMContentLoaded', () => { - const elementsToAnimate = document.querySelectorAll( - '.feature-card, .stat-item, .update-item, .news-content, .event-card' - ); - - elementsToAnimate.forEach(el => { - el.style.opacity = '0'; - el.style.transform = 'translateY(20px)'; - el.style.transition = 'opacity 0.6s ease, transform 0.6s ease'; - fadeInObserver.observe(el); - }); -}); - -// 3. Lazy Loading for Images -if ('loading' in HTMLImageElement.prototype) { - const images = document.querySelectorAll('img[data-src]'); - images.forEach(img => { - img.src = img.dataset.src; - }); -} else { - // Fallback for browsers that don't support native lazy loading - const lazyImages = document.querySelectorAll('img[data-src]'); - - const imageObserver = new IntersectionObserver((entries) => { - entries.forEach(entry => { - if (entry.isIntersecting) { - const img = entry.target; - img.src = img.dataset.src; - img.classList.add('loaded'); - imageObserver.unobserve(img); - } - }); - }); - - lazyImages.forEach(img => imageObserver.observe(img)); -} - -// 4. Add loading animation class -const style = document.createElement('style'); -style.textContent = ` - .animate-fade-in { - opacity: 1 !important; - transform: translateY(0) !important; - } - - .pulse-animation { - animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; - } - - @keyframes pulse { - 0%, 100% { - opacity: 1; - } - 50% { - opacity: .7; - } - } - - .slide-in-left { - animation: slideInLeft 0.6s ease-out; - } - - @keyframes slideInLeft { - from { - transform: translateX(-50px); - opacity: 0; - } - to { - transform: translateX(0); - opacity: 1; - } - } - - .slide-in-right { - animation: slideInRight 0.6s ease-out; - } - - @keyframes slideInRight { - from { - transform: translateX(50px); - opacity: 0; - } - to { - transform: translateX(0); - opacity: 1; - } - } - - /* Skeleton loading screens */ - .skeleton { - background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); - background-size: 200% 100%; - animation: loading 1.5s ease-in-out infinite; - } - - @keyframes loading { - 0% { - background-position: 200% 0; - } - 100% { - background-position: -200% 0; - } - } - - /* Scroll progress indicator */ - .scroll-progress { - position: fixed; - top: 0; - left: 0; - width: 0; - height: 3px; - background: linear-gradient(90deg, var(--ada-pink, #EC3750), var(--ada-orange, #FF8C37)); - z-index: 9999; - transition: width 0.1s ease; - } -`; -document.head.appendChild(style); - -// 5. Scroll Progress Indicator -const createScrollProgress = () => { - const progressBar = document.createElement('div'); - progressBar.className = 'scroll-progress'; - document.body.appendChild(progressBar); - - window.addEventListener('scroll', () => { - const windowHeight = window.innerHeight; - const documentHeight = document.documentElement.scrollHeight; - const scrollTop = window.pageYOffset || document.documentElement.scrollTop; - const scrollPercentage = (scrollTop / (documentHeight - windowHeight)) * 100; - - progressBar.style.width = `${scrollPercentage}%`; - }); -}; - -// 6. Back to Top Button -const createBackToTop = () => { - const button = document.createElement('button'); - button.innerHTML = ''; - button.className = 'back-to-top'; - button.setAttribute('aria-label', 'Back to top'); - button.style.cssText = ` - position: fixed; - bottom: 30px; - right: 30px; - width: 50px; - height: 50px; - border-radius: 50%; - background: linear-gradient(135deg, #EC3750, #FF8C37); - color: white; - border: none; - cursor: pointer; - opacity: 0; - visibility: hidden; - transition: all 0.3s ease; - z-index: 1000; - box-shadow: 0 4px 20px rgba(236, 55, 80, 0.4); - font-size: 20px; - `; - - button.addEventListener('mouseenter', () => { - button.style.transform = 'scale(1.1) translateY(-2px)'; - button.style.boxShadow = '0 6px 25px rgba(236, 55, 80, 0.5)'; - }); - - button.addEventListener('mouseleave', () => { - button.style.transform = 'scale(1) translateY(0)'; - button.style.boxShadow = '0 4px 20px rgba(236, 55, 80, 0.4)'; - }); - - window.addEventListener('scroll', () => { - if (window.pageYOffset > 300) { - button.style.opacity = '1'; - button.style.visibility = 'visible'; - } else { - button.style.opacity = '0'; - button.style.visibility = 'hidden'; - } - }); - - button.addEventListener('click', () => { - window.scrollTo({ - top: 0, - behavior: 'smooth' - }); - }); - - document.body.appendChild(button); -}; - -// 7. Enhanced Card Hover Effects -document.addEventListener('DOMContentLoaded', () => { - const cards = document.querySelectorAll('.feature-card, .stat-item'); - - cards.forEach(card => { - card.addEventListener('mouseenter', function() { - this.style.transform = 'translateY(-8px)'; - this.style.transition = 'transform 0.3s ease, box-shadow 0.3s ease'; - }); - - card.addEventListener('mouseleave', function() { - this.style.transform = 'translateY(0)'; - }); - }); -}); - -// 8. Performance Monitoring -const measurePerformance = () => { - if ('PerformanceObserver' in window) { - const observer = new PerformanceObserver((list) => { - for (const entry of list.getEntries()) { - if (entry.entryType === 'largest-contentful-paint') { - console.log('LCP:', entry.renderTime || entry.loadTime); - } - } - }); - - observer.observe({ entryTypes: ['largest-contentful-paint'] }); - } - - // Log Core Web Vitals - if ('performance' in window) { - window.addEventListener('load', () => { - const perfData = performance.getEntriesByType('navigation')[0]; - console.log('Page Load Time:', perfData.loadEventEnd - perfData.fetchStart, 'ms'); - }); - } -}; - -// 9. Parallax Effect for Hero Section -const initParallax = () => { - const heroSection = document.querySelector('.hero'); - if (heroSection) { - window.addEventListener('scroll', () => { - const scrolled = window.pageYOffset; - const parallaxSpeed = 0.5; - heroSection.style.transform = `translateY(${scrolled * parallaxSpeed}px)`; - }); - } -}; - -// 10. Initialize all enhancements -document.addEventListener('DOMContentLoaded', () => { - createScrollProgress(); - createBackToTop(); - measurePerformance(); - // Parallax can be heavy, uncomment if desired - // initParallax(); - - // Add loaded class to body for CSS animations - document.body.classList.add('page-loaded'); -}); - -// 11. Service Worker Registration for PWA -if ('serviceWorker' in navigator) { - window.addEventListener('load', () => { - navigator.serviceWorker - .register('/sw.js') - .then(registration => { - console.log('ServiceWorker registered:', registration.scope); - }) - .catch(error => { - console.log('ServiceWorker registration failed:', error); - }); - }); -} - -// 12. Add to Home Screen Prompt (PWA) -let deferredPrompt; -window.addEventListener('beforeinstallprompt', (e) => { - e.preventDefault(); - deferredPrompt = e; - - // Show install button - const installButton = document.createElement('button'); - installButton.textContent = '📱 Install App'; - installButton.className = 'install-app-btn'; - installButton.style.cssText = ` - position: fixed; - bottom: 90px; - right: 30px; - padding: 12px 24px; - background: linear-gradient(135deg, #EC3750, #FF8C37); - color: white; - border: none; - border-radius: 25px; - cursor: pointer; - font-weight: 600; - box-shadow: 0 4px 15px rgba(236, 55, 80, 0.4); - z-index: 999; - animation: slideInRight 0.5s ease; - `; - - installButton.addEventListener('click', async () => { - installButton.style.display = 'none'; - deferredPrompt.prompt(); - const { outcome } = await deferredPrompt.userChoice; - console.log(`User response to install prompt: ${outcome}`); - deferredPrompt = null; - }); - - document.body.appendChild(installButton); -}); - -// 13. Keyboard Accessibility Enhancements -document.addEventListener('keydown', (e) => { - // Press '/' to focus search (if search exists) - if (e.key === '/' && !e.target.matches('input, textarea')) { - e.preventDefault(); - const searchInput = document.querySelector('input[type="search"], input[placeholder*="search" i]'); - if (searchInput) searchInput.focus(); - } - - // Press 'Escape' to close modals - if (e.key === 'Escape') { - const modals = document.querySelectorAll('.modal.show, [role="dialog"][aria-hidden="false"]'); - modals.forEach(modal => { - modal.classList.remove('show'); - modal.setAttribute('aria-hidden', 'true'); - }); - } -}); - -console.log('✨ Enhanced UX features loaded successfully!'); diff --git a/sitemap.xml b/sitemap.xml deleted file mode 100644 index d0f672e..0000000 --- a/sitemap.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - https://openrockets.com/ - 2026-01-18 - daily - 1.0 - - - https://openrockets.com/index.html - 2026-01-18 - daily - 1.0 - - - https://openrockets.com/about.html - 2026-01-18 - weekly - 0.8 - - - https://openrockets.com/join.html - 2026-01-18 - weekly - 0.9 - - - https://openrockets.com/calendar.html - 2026-01-18 - weekly - 0.8 - - - https://openrockets.com/community.html - 2026-01-18 - daily - 0.8 - - diff --git a/styles/foundation.css b/styles/foundation.css deleted file mode 100644 index 4c05aa3..0000000 --- a/styles/foundation.css +++ /dev/null @@ -1,1018 +0,0 @@ -/* Open Rockets Foundation - Professional Design System */ -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap'); - -:root { - /* Linux Foundation Inspired Color Palette */ - --primary-black: #1a1a1a; - --dark-gray: #333333; - --medium-gray: #666666; - --light-gray: #f8f9fa; - --border-gray: #e1e5e9; - --white: #ffffff; - - --primary-blue: #0066cc; - --secondary-blue: #0052a3; - --accent-color: #0066cc; - --success-green: #28a745; - - /* Spacing - Foundation Scale */ - --space-xs: 0.25rem; - --space-sm: 0.5rem; - --space-md: 1rem; - --space-lg: 2rem; - --space-xl: 4rem; - --space-2xl: 6rem; - - /* Magazine-Inspired Typography System */ - --font-headline: 'Playfair Display', Georgia, serif; - --font-body: Georgia, serif; - --font-ui: 'Ubuntu', -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif; - --font-weight-normal: 400; - --font-weight-medium: 500; - --font-weight-semibold: 600; - --font-weight-bold: 700; - --font-weight-black: 900; - - /* UI Elements */ - --radius: 6px; - --shadow-sm: 0 1px 3px rgba(0,0,0,0.12); - --shadow-md: 0 4px 12px rgba(0,0,0,0.15); - --transition: all 0.2s ease; -} - -/* Reset & Base */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: var(--font-body); - background-color: var(--white); - color: var(--dark-gray); - line-height: 1.6; - font-size: 16px; - -webkit-font-smoothing: antialiased; - font-smoothing: antialiased; -} - -a { - color: var(--primary-blue); - text-decoration: none; - transition: color 0.2s ease; -} - -a:hover { - color: var(--secondary-blue); - text-decoration: underline; -} - -ul { - list-style: none; -} - -h1, h2, h3, h4, h5, h6 { - font-family: var(--font-headline); - color: var(--primary-black); - font-weight: var(--font-weight-bold); - line-height: 1.2; - margin-bottom: var(--space-md); -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 0 var(--space-lg); -} - -/* Navigation - Magazine Style */ -.navbar { - background: var(--white); - border-bottom: 2px solid var(--primary-black); - padding: var(--space-md) 0; - position: sticky; - top: 0; - z-index: 1000; -} - -.nav-container { - max-width: 1200px; - margin: 0 auto; - padding: 0 var(--space-lg); - display: flex; - justify-content: space-between; - align-items: center; -} - -.nav-brand { - display: flex; - align-items: center; - gap: 1rem; - text-decoration: none !important; -} - -.nav-brand img { - height: 40px; - width: auto; - /* Remove inversion - magazine logo should work on white */ - transition: opacity 0.3s ease; -} - -.brand-text { - font-family: var(--font-ui); - font-weight: var(--font-weight-semibold); - color: var(--primary-black); - font-size: 1.1rem; -} - -.nav-menu { - display: flex; - gap: 2rem; -} - -.nav-link { - font-family: var(--font-ui); - color: var(--medium-gray); - font-weight: var(--font-weight-medium); - font-size: 0.95rem; - text-transform: uppercase; - letter-spacing: 0.5px; -} - -.nav-link:hover, .nav-link.active { - color: var(--primary-blue); - text-decoration: none; -} - -.nav-toggle { - display: none; - background: none; - border: none; - font-size: 1.5rem; - cursor: pointer; -} - -/* Hero Section - Magazine Editorial Style */ -.hero { - padding: var(--space-2xl) 0; - background: var(--white); - text-align: center; - border-bottom: 2px solid var(--primary-black); - min-height: 60vh; - display: flex; - align-items: center; - position: relative; -} - -.hero::after { - content: ''; - position: absolute; - bottom: 0; - left: 50%; - width: 60px; - height: 4px; - background: var(--primary-blue); - transform: translateX(-50%); -} - -.hero-content { - max-width: 800px; - margin: 0 auto; -} - -.hero-title { - font-family: var(--font-headline); - font-size: 3.5rem; - font-weight: var(--font-weight-black); - line-height: 1.1; - margin-bottom: var(--space-md); - color: var(--primary-black); -} - -.hero-subtitle { - font-family: var(--font-headline); - font-size: 3rem; - font-weight: var(--font-weight-bold); - color: var(--primary-blue); - margin-bottom: var(--space-lg); - font-style: italic; -} - -.hero-description { - font-family: var(--font-body); - font-size: 1.25rem; - color: var(--dark-gray); - line-height: 1.6; - margin-bottom: var(--space-xl); - max-width: 700px; - margin-left: auto; - margin-right: auto; -} - -.hero-cta { - display: flex; - gap: var(--space-md); - justify-content: center; - flex-wrap: wrap; -} -} - -.hero-title { - font-size: 3.5rem; - margin-bottom: 1rem; - letter-spacing: -0.02em; -} - -.hero-subtitle { - font-size: 1.75rem; - font-weight: 500; - color: var(--medium-gray); - margin-bottom: 1.5rem; -} - -.hero-description { - font-size: 1.125rem; - color: var(--medium-gray); - max-width: 700px; - margin: 0 auto 3rem; -} - -.hero-cta { - display: flex; - justify-content: center; - gap: 1rem; - flex-wrap: wrap; -} - -/* Buttons */ -.btn { - display: inline-flex; - align-items: center; - justify-content: center; - padding: 0.75rem 1.5rem; - border-radius: var(--radius); - font-weight: 600; - font-size: 1rem; - cursor: pointer; - text-decoration: none !important; - transition: all 0.2s ease; - gap: 0.5rem; -} - -.btn-large { - padding: 1rem 2rem; - font-size: 1.125rem; -} - -.btn-primary { - background-color: var(--primary-blue); - color: var(--white); - border: 1px solid var(--primary-blue); -} - -.btn-primary:hover { - background-color: var(--secondary-blue); - border-color: var(--secondary-blue); - color: var(--white); -} - -.btn-secondary { - background-color: var(--white); - color: var(--dark-gray); - border: 1px solid var(--border-gray); -} - -.btn-secondary:hover { - border-color: var(--dark-gray); - background-color: var(--light-gray); - color: var(--primary-black); -} - -/* Sections */ -section { - padding: var(--space-xl) 0; -} - -.section-title { - font-size: 2.25rem; - margin-bottom: 0.5rem; - text-align: center; -} - -.section-subtitle { - text-align: center; - color: var(--medium-gray); - max-width: 700px; - margin: 0 auto 3rem; - font-size: 1.125rem; -} - -/* Impact Report / Generic Content Block */ -.impact-report { - background: var(--white); -} - -.report-header { - text-align: center; - margin-bottom: 3rem; -} - -.report-meta { - text-transform: uppercase; - font-size: 0.875rem; - letter-spacing: 0.05em; - color: var(--medium-gray); - font-weight: 600; -} - -.report-content { - background: var(--white); - max-width: 1000px; - margin: 0 auto; -} - -.report-intro p { - font-size: 1.25rem; - color: var(--dark-gray); - text-align: center; - max-width: 800px; - margin: 0 auto 3rem; -} - -.milestones-section h3 { - font-size: 1.5rem; - border-bottom: 2px solid var(--primary-blue); - padding-bottom: 0.5rem; - display: inline-block; - margin-bottom: 1.5rem; -} - -.milestones-list { - display: grid; - gap: 1.5rem; -} - -.milestones-list li { - padding: 1.5rem; - background: var(--light-gray); - border-radius: var(--radius); - border: 1px solid var(--border-gray); -} - -.milestones-list li strong { - color: var(--primary-blue); - display: block; - margin-bottom: 0.5rem; - font-size: 1.1rem; -} - -.report-cta { - margin-top: 3rem; - text-align: center; - display: flex; - justify-content: center; - gap: 1rem; - flex-wrap: wrap; -} - -/* Stats */ -.stats { - background: var(--primary-black); - color: var(--white); - padding: 4rem 0; -} - -.stats-grid { - max-width: 1200px; - margin: 0 auto; - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 2rem; - text-align: center; -} - -.stat-number { - display: block; - font-size: 3rem; - font-weight: 700; - margin-bottom: 0.5rem; - color: var(--white); -} - -.stat-label { - font-size: 0.9rem; - text-transform: uppercase; - letter-spacing: 0.05em; - opacity: 0.8; -} - -/* Features / Projects Grid */ -.features-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); - gap: 2rem; - max-width: 1200px; - margin: 0 auto; - padding: 0 var(--space-lg); -} - -.feature-card { - background: var(--white); - border: 1px solid var(--border-gray); - border-radius: var(--radius); - overflow: hidden; - transition: transform 0.2s ease, box-shadow 0.2s ease; -} - -.feature-card:hover { - transform: translateY(-2px); - box-shadow: var(--shadow-md); -} - -.feature-card-image { - height: 200px; - background: var(--light-gray); - display: flex; - align-items: center; - justify-content: center; - overflow: hidden; -} - -.feature-card-image img { - width: 100%; - height: 100%; - object-fit: cover; -} - -.feature-card-content { - padding: 1.5rem; -} - -.feature-meta { - font-size: 0.75rem; - color: var(--medium-gray); - margin-bottom: 0.5rem; - text-transform: uppercase; - font-weight: 600; -} - -.feature-title { - font-size: 1.25rem; - margin-bottom: 0.75rem; -} - -.feature-description { - font-size: 0.95rem; - color: var(--medium-gray); - margin-bottom: 1.5rem; -} - -.feature-link { - font-weight: 600; - font-size: 0.9rem; - display: inline-flex; - align-items: center; - gap: 0.25rem; -} - -.view-all-link { - display: none; /* Simplify interface */ -} - -/* News Section */ -.news-section { - background: var(--light-gray); -} - -.news-container { - max-width: 1200px; - margin: 0 auto; - padding: 0 var(--space-lg); -} - -.news-content { - display: grid; - grid-template-columns: 2fr 1fr; - gap: 3rem; -} - -.twitter-timeline-container, .quick-links { - background: var(--white); - padding: 2rem; - border-radius: var(--radius); - border: 1px solid var(--border-gray); -} - -.timeline-title, .quick-links-title { - font-size: 1.25rem; - margin-bottom: 1.5rem; - border-bottom: 1px solid var(--border-gray); - padding-bottom: 1rem; -} - -.update-item { - padding: 1rem 0; - border-bottom: 1px solid var(--border-gray); -} - -.update-item:last-child { - border-bottom: none; -} - -.update-content h4 { - font-size: 1rem; - margin-bottom: 0.25rem; -} - -.update-content p { - font-size: 0.9rem; - color: var(--medium-gray); - margin-bottom: 0.5rem; -} - -.update-link { - font-size: 0.85rem; - font-weight: 600; -} - -/* CTA */ -.cta { - background: var(--primary-blue); - color: var(--white); - text-align: center; - padding: 5rem 0; -} - -.cta-title { - color: var(--white); - font-size: 2.5rem; -} - -.cta-description { - color: rgba(255, 255, 255, 0.9); - max-width: 700px; - margin: 0 auto 2rem; - font-size: 1.125rem; -} - -.cta .btn-primary { - background: var(--white); - color: var(--primary-blue); - border-color: var(--white); -} - -.cta .btn-primary:hover { - background: var(--light-gray); - color: var(--secondary-blue); -} - -.cta .btn-secondary { - background: transparent; - color: var(--white); - border-color: var(--white); -} - -.cta .btn-secondary:hover { - background: rgba(255,255,255,0.1); -} - -/* Footer */ -.footer { - background: var(--primary-black); - color: var(--white); - padding: 4rem 0 2rem; -} - -.footer-content { - display: grid; - grid-template-columns: 1fr 2fr; - gap: 4rem; - margin-bottom: 3rem; -} - -.footer-brand p { - font-family: var(--font-body); - color: rgba(255,255,255,0.6); - margin-top: 1rem; - font-style: italic; -} - -.footer-links { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 2rem; -} - -.footer-section h5 { - font-family: var(--font-ui); - color: var(--white); - font-size: 1rem; - margin-bottom: 1.5rem; - text-transform: uppercase; - letter-spacing: 0.05em; - font-weight: var(--font-weight-semibold); -} - -.footer-section ul li { - margin-bottom: 0.75rem; -} - -.footer-section a, .footer-section span { - color: rgba(255,255,255,0.7); - font-size: 0.9rem; -} - -.footer-section a:hover { - color: var(--white); - text-decoration: none; -} - -.footer-bottom { - border-top: 1px solid rgba(255,255,255,0.1); - padding-top: 2rem; - font-size: 0.85rem; - color: rgba(255,255,255,0.5); - text-align: center; -} - -/* Footer Logo Fix */ -.footer-brand img { - /* Remove inversion for magazine logo */ - width: 180px; - height: auto; - margin-bottom: var(--space-sm); -} - -/* Statistics Section */ -.stats { - background: var(--light-gray); - padding: var(--space-xl) 0; -} - -.stats-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); - gap: var(--space-lg); - max-width: 1000px; - margin: 0 auto; - padding: 0 var(--space-lg); -} - -.stat-item { - text-align: center; - padding: var(--space-lg); - background: var(--white); - border-radius: var(--radius); - box-shadow: var(--shadow-sm); -} - -.stat-number { - display: block; - font-size: 2.5rem; - font-weight: var(--font-weight-bold); - color: var(--primary-blue); - margin-bottom: var(--space-sm); -} - -.stat-label { - font-size: 1rem; - color: var(--dark-gray); - font-weight: var(--font-weight-medium); -} - -/* Platform and Magazine Sections */ -.platform-section, .magazine-section, .impact-section, .sponsorship-section { - padding: var(--space-2xl) 0; -} - -.magazine-section { - background: var(--light-gray); -} - -.section-header { - text-align: center; - max-width: 700px; - margin: 0 auto var(--space-xl); -} - -.section-title { - font-family: var(--font-headline); - font-size: 2.5rem; - font-weight: var(--font-weight-black); - margin-bottom: var(--space-md); - color: var(--primary-black); -} - -.section-subtitle { - font-family: var(--font-body); - font-size: 1.25rem; - color: var(--medium-gray); - line-height: 1.6; - font-style: italic; -} - -/* Feature Cards */ -.features-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); - gap: var(--space-lg); - margin-bottom: var(--space-xl); -} - -.feature-card { - background: var(--white); - padding: var(--space-xl); - border-radius: var(--radius); - box-shadow: var(--shadow-sm); - text-align: center; - transition: var(--transition); -} - -.feature-card:hover { - transform: translateY(-4px); - box-shadow: var(--shadow-md); -} - -.feature-icon { - width: 60px; - height: 60px; - background: var(--primary-blue); - color: var(--white); - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - margin: 0 auto var(--space-lg); - font-size: 1.5rem; -} - -.feature-card h3 { - font-family: var(--font-headline); - font-size: 1.25rem; - font-weight: var(--font-weight-bold); - margin-bottom: var(--space-md); -} - -.feature-card p { - font-family: var(--font-body); - color: var(--medium-gray); - line-height: 1.6; -} - -/* Magazine Features */ -.magazine-features { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); - gap: var(--space-xl); - margin-bottom: var(--space-xl); -} - -.magazine-feature { - background: var(--white); - padding: var(--space-xl); - border-radius: var(--radius); - box-shadow: var(--shadow-sm); -} - -.magazine-feature h3 { - font-family: var(--font-headline); - font-size: 1.5rem; - font-weight: var(--font-weight-bold); - margin-bottom: var(--space-lg); - color: var(--primary-black); -} - -.magazine-feature ul { - list-style: none; -} - -.magazine-feature li { - padding: var(--space-sm) 0; - border-bottom: 1px solid var(--border-gray); - position: relative; - padding-left: var(--space-lg); -} - -.magazine-feature li::before { - content: '✓'; - position: absolute; - left: 0; - color: var(--success-green); - font-weight: bold; -} - -.magazine-feature li:last-child { - border-bottom: none; -} - -/* Impact Metrics */ -.impact-metrics { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); - gap: var(--space-lg); - margin-bottom: var(--space-xl); -} - -.metric-card { - background: var(--white); - padding: var(--space-xl); - border-radius: var(--radius); - box-shadow: var(--shadow-sm); - border-left: 4px solid var(--primary-blue); -} - -.metric-card h3 { - font-family: var(--font-headline); - font-size: 1.25rem; - font-weight: var(--font-weight-bold); - margin-bottom: var(--space-lg); - color: var(--primary-blue); -} - -.metric-card ul { - list-style: none; -} - -.metric-card li { - padding: var(--space-sm) 0; - color: var(--dark-gray); - line-height: 1.5; -} - -/* Sponsorship Section */ -.sponsorship-section { - background: var(--light-gray); -} - -.sponsorship-content { - max-width: 800px; - margin: 0 auto; - text-align: center; -} - -.sponsorship-info h2 { - font-family: var(--font-headline); - font-size: 2rem; - font-weight: var(--font-weight-black); - margin-bottom: var(--space-lg); -} - -.sponsorship-info p { - font-family: var(--font-body); - font-size: 1.125rem; - color: var(--medium-gray); - line-height: 1.6; - margin-bottom: var(--space-lg); -} - -.legal-status { - display: flex; - justify-content: center; - gap: var(--space-md); - flex-wrap: wrap; -} - -.status-badge { - background: var(--primary-blue); - color: var(--white); - padding: var(--space-sm) var(--space-md); - border-radius: var(--radius); - font-size: 0.875rem; - font-weight: var(--font-weight-medium); -} - -/* Section CTAs */ -.section-cta { - text-align: center; -} - -.section-cta .btn + .btn { - margin-left: var(--space-md); -} - -/* Buttons - Linux Foundation Style */ -.btn { - display: inline-flex; - align-items: center; - gap: var(--space-sm); - padding: 12px 24px; - border: 2px solid transparent; - border-radius: var(--radius); - font-family: var(--font-ui); - font-size: 1rem; - font-weight: var(--font-weight-medium); - text-decoration: none; - transition: var(--transition); - cursor: pointer; - text-transform: uppercase; - letter-spacing: 0.5px; -} - -.btn-primary { - background: var(--primary-blue); - color: var(--white); - border-color: var(--primary-blue); -} - -.btn-primary:hover { - background: var(--secondary-blue); - border-color: var(--secondary-blue); - text-decoration: none; - transform: translateY(-2px); -} - -.btn-secondary { - background: transparent; - color: var(--primary-blue); - border-color: var(--primary-blue); -} - -.btn-secondary:hover { - background: var(--primary-blue); - color: var(--white); - text-decoration: none; - transform: translateY(-2px); -} - -.btn i { - font-size: 0.875rem; -} - -/* Navigation Updates */ -.nav-link-cta { - background: var(--primary-blue); - color: var(--white) !important; - padding: var(--space-sm) var(--space-md); - border-radius: var(--radius); - margin-left: var(--space-md); -} - -.nav-link-cta:hover { - background: var(--secondary-blue); - transform: translateY(-1px); -} - -/* Mobile Navigation */ -.nav-toggle { - display: none; - background: none; - border: none; - cursor: pointer; - flex-direction: column; - padding: var(--space-sm); -} - -.nav-toggle span { - display: block; - width: 24px; - height: 3px; - background: var(--primary-black); - margin: 3px 0; - transition: var(--transition); -} - -/* Utilities */ -.text-gradient { - /* No gradient for professional look, just color */ - color: var(--primary-blue); -} - -/* Responsive */ -@media (max-width: 768px) { - .nav-menu { - display: none; /* Add JS toggle support if needed, or keeping simple */ - } - .nav-toggle { - display: flex; - } - .hero-title { - font-size: 2.5rem; - } - .hero-subtitle { - font-size: 2rem; - } - .section-title { - font-size: 2rem; - } - .footer-content { - grid-template-columns: 1fr; - gap: 2rem; - } - .footer-links { - grid-template-columns: 1fr 1fr; - } - .features-grid, .magazine-features, .impact-metrics { - grid-template-columns: 1fr; - } - .stats-grid { - grid-template-columns: repeat(2, 1fr); - } - .section-cta .btn { - display: block; - margin-bottom: var(--space-sm); - } - .section-cta .btn + .btn { - margin-left: 0; - } -} diff --git a/styles/super-enhancements.css b/styles/super-enhancements.css deleted file mode 100644 index c8a9b1d..0000000 --- a/styles/super-enhancements.css +++ /dev/null @@ -1,486 +0,0 @@ -/* Super Website Enhancements - Performance & Visual Polish */ - -/* ========================================== - 1. PERFORMANCE OPTIMIZATIONS - ========================================== */ - -/* Smooth scrolling for the entire page */ -html { - scroll-behavior: smooth; -} - -/* Hardware acceleration for transforms */ -* { - -webkit-transform: translateZ(0); - -webkit-backface-visibility: hidden; - -webkit-perspective: 1000; -} - -/* Reduce motion for users who prefer it */ -@media (prefers-reduced-motion: reduce) { - *, - *::before, - *::after { - animation-duration: 0.01ms !important; - animation-iteration-count: 1 !important; - transition-duration: 0.01ms !important; - scroll-behavior: auto !important; - } -} - -/* ========================================== - 2. LOADING STATES - ========================================== */ - -/* Page load animation */ -body:not(.page-loaded) { - opacity: 0; - animation: fadeIn 0.5s ease forwards; -} - -@keyframes fadeIn { - to { - opacity: 1; - } -} - -/* Skeleton loading for images */ -img { - background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); - background-size: 200% 100%; -} - -img.loaded, -img[src] { - animation: none; - background: transparent; -} - -/* ========================================== - 3. ENHANCED ANIMATIONS - ========================================== */ - -/* Smooth hover transitions */ -.feature-card, -.stat-item, -.project-link, -.btn { - transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); -} - -/* Enhanced card hover with 3D effect */ -.feature-card:hover { - transform: translateY(-8px) scale(1.02); - box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15); -} - -/* Button hover effects */ -.btn { - position: relative; - overflow: hidden; - z-index: 1; -} - -.btn::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); - transition: left 0.5s; - z-index: -1; -} - -.btn:hover::before { - left: 100%; -} - -/* Pulse animation for CTA buttons */ -@keyframes pulse-glow { - 0%, 100% { - box-shadow: 0 0 0 0 rgba(236, 55, 80, 0.7); - } - 50% { - box-shadow: 0 0 0 10px rgba(236, 55, 80, 0); - } -} - -.btn-primary.pulse { - animation: pulse-glow 2s infinite; -} - -/* ========================================== - 4. MICRO-INTERACTIONS - ========================================== */ - -/* Link hover underline effect */ -.nav-link { - position: relative; -} - -.nav-link::after { - content: ''; - position: absolute; - bottom: -2px; - left: 0; - width: 0; - height: 2px; - background: linear-gradient(90deg, #EC3750, #FF8C37); - transition: width 0.3s ease; -} - -.nav-link:hover::after, -.nav-link.active::after { - width: 100%; -} - -/* Icon rotation on hover */ -.feature-link i, -.project-link i { - transition: transform 0.3s ease; -} - -.feature-link:hover i, -.project-link:hover i { - transform: translateX(5px); -} - -/* ========================================== - 5. SCROLL ANIMATIONS - ========================================== */ - -/* Fade in from bottom */ -@keyframes fadeInUp { - from { - opacity: 0; - transform: translateY(30px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.animate-on-scroll { - opacity: 0; - animation: fadeInUp 0.6s ease forwards; -} - -/* Stagger animation for multiple items */ -.feature-card:nth-child(1) { animation-delay: 0.1s; } -.feature-card:nth-child(2) { animation-delay: 0.2s; } -.feature-card:nth-child(3) { animation-delay: 0.3s; } -.feature-card:nth-child(4) { animation-delay: 0.4s; } -.feature-card:nth-child(5) { animation-delay: 0.5s; } -.feature-card:nth-child(6) { animation-delay: 0.6s; } - -/* ========================================== - 6. ENHANCED TYPOGRAPHY - ========================================== */ - -/* Better text rendering */ -body { - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - text-rendering: optimizeLegibility; -} - -/* Text selection styling */ -::selection { - background: rgba(236, 55, 80, 0.3); - color: inherit; -} - -::-moz-selection { - background: rgba(236, 55, 80, 0.3); - color: inherit; -} - -/* ========================================== - 7. LOADING SPINNER - ========================================== */ - -.spinner { - width: 50px; - height: 50px; - border: 5px solid #f3f3f3; - border-top: 5px solid #EC3750; - border-radius: 50%; - animation: spin 1s linear infinite; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* ========================================== - 8. TOAST NOTIFICATIONS - ========================================== */ - -.toast { - position: fixed; - bottom: 20px; - right: 20px; - background: white; - padding: 16px 24px; - border-radius: 12px; - box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2); - display: flex; - align-items: center; - gap: 12px; - animation: slideInRight 0.3s ease; - z-index: 10000; -} - -.toast.success { - border-left: 4px solid #28a745; -} - -.toast.error { - border-left: 4px solid #dc3545; -} - -.toast.info { - border-left: 4px solid #17a2b8; -} - -/* ========================================== - 9. FOCUS STYLES FOR ACCESSIBILITY - ========================================== */ - -/* Better focus indicators */ -*:focus { - outline: 2px solid #EC3750; - outline-offset: 2px; -} - -/* Remove outline for mouse users, keep for keyboard users */ -*:focus:not(:focus-visible) { - outline: none; -} - -*:focus-visible { - outline: 2px solid #EC3750; - outline-offset: 2px; -} - -/* Skip to main content link */ -.skip-to-main { - position: absolute; - top: -40px; - left: 0; - background: #EC3750; - color: white; - padding: 8px 16px; - text-decoration: none; - z-index: 100; -} - -.skip-to-main:focus { - top: 0; -} - -/* ========================================== - 10. DARK MODE SUPPORT - ========================================== */ - -@media (prefers-color-scheme: dark) { - /* Adjust colors for dark mode users if not already implemented */ - img { - opacity: 0.9; - } -} - -/* ========================================== - 11. PRINT STYLES - ========================================== */ - -@media print { - /* Hide non-essential elements when printing */ - .nav-toggle, - .back-to-top, - .install-app-btn, - .scroll-progress, - .parrot-assistant, - .hero-illustrations { - display: none !important; - } - - /* Optimize for print */ - * { - background: white !important; - color: black !important; - } - - a[href]::after { - content: " (" attr(href) ")"; - } -} - -/* ========================================== - 12. RESPONSIVE ENHANCEMENTS - ========================================== */ - -/* Better touch targets for mobile */ -@media (max-width: 768px) { - button, - a, - input, - select, - textarea { - min-height: 44px; - min-width: 44px; - } - - /* Reduce animations on mobile for performance */ - * { - animation-duration: 0.3s !important; - transition-duration: 0.2s !important; - } -} - -/* ========================================== - 13. GRID ENHANCEMENTS - ========================================== */ - -/* Better grid spacing */ -.features-grid { - display: grid; - gap: 2rem; - grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); -} - -/* ========================================== - 14. UTILITIES - ========================================== */ - -/* Screen reader only */ -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; -} - -/* Hide on mobile */ -@media (max-width: 768px) { - .hide-mobile { - display: none !important; - } -} - -/* Hide on desktop */ -@media (min-width: 769px) { - .hide-desktop { - display: none !important; - } -} - -/* ========================================== - 15. GRADIENT TEXT - ========================================== */ - -.text-gradient { - background: linear-gradient(135deg, #EC3750, #FF8C37); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} - -/* ========================================== - 16. GLASSMORPHISM EFFECT - ========================================== */ - -.glass-effect { - background: rgba(255, 255, 255, 0.1); - backdrop-filter: blur(10px); - -webkit-backdrop-filter: blur(10px); - border: 1px solid rgba(255, 255, 255, 0.2); -} - -/* ========================================== - 17. ANIMATION PRESETS - ========================================== */ - -.bounce { - animation: bounce 1s infinite; -} - -@keyframes bounce { - 0%, 100% { - transform: translateY(0); - } - 50% { - transform: translateY(-10px); - } -} - -.shake { - animation: shake 0.5s; -} - -@keyframes shake { - 0%, 100% { transform: translateX(0); } - 10%, 30%, 50%, 70%, 90% { transform: translateX(-10px); } - 20%, 40%, 60%, 80% { transform: translateX(10px); } -} - -/* ========================================== - 18. IMAGE OPTIMIZATION - ========================================== */ - -img { - max-width: 100%; - height: auto; - display: block; -} - -/* Prevent layout shift */ -img[width][height] { - height: auto; -} - -/* ========================================== - 19. PERFORMANCE - Will-change hints - ========================================== */ - -.feature-card, -.btn, -.nav-link { - will-change: transform; -} - -/* ========================================== - 20. CUSTOM SCROLLBAR - ========================================== */ - -::-webkit-scrollbar { - width: 12px; -} - -::-webkit-scrollbar-track { - background: #f1f1f1; -} - -::-webkit-scrollbar-thumb { - background: linear-gradient(135deg, #EC3750, #FF8C37); - border-radius: 6px; -} - -::-webkit-scrollbar-thumb:hover { - background: linear-gradient(135deg, #d62f45, #e67a2f); -} - -/* Firefox scrollbar */ -* { - scrollbar-width: thin; - scrollbar-color: #EC3750 #f1f1f1; -} diff --git a/sw.js b/sw.js deleted file mode 100644 index b460847..0000000 --- a/sw.js +++ /dev/null @@ -1,83 +0,0 @@ -const CACHE_NAME = 'openrockets-foundation-v2'; -const urlsToCache = [ - '/', - '/index.html', - '/join.html', - '/styles/foundation.css', - '/scripts/navigation.js', - '/scripts/hackclub-interactions.js', - '/scripts/enhancements.js', - '/v/openrockets.png', - '/i/assets/static/openthread_logo_bash-trans-removebg-preview (1).png' -]; - -// Install event - cache resources -self.addEventListener('install', (event) => { - event.waitUntil( - caches.open(CACHE_NAME) - .then((cache) => { - console.log('Opened cache'); - return cache.addAll(urlsToCache); - }) - .catch((error) => { - console.log('Cache install error:', error); - }) - ); - self.skipWaiting(); -}); - -// Fetch event - serve from cache, fallback to network -self.addEventListener('fetch', (event) => { - event.respondWith( - caches.match(event.request) - .then((response) => { - // Cache hit - return response - if (response) { - return response; - } - - // Clone the request - const fetchRequest = event.request.clone(); - - return fetch(fetchRequest).then((response) => { - // Check if valid response - if (!response || response.status !== 200 || response.type !== 'basic') { - return response; - } - - // Clone the response - const responseToCache = response.clone(); - - caches.open(CACHE_NAME) - .then((cache) => { - cache.put(event.request, responseToCache); - }); - - return response; - }); - }) - .catch(() => { - // Return offline page if available - return caches.match('/index.html'); - }) - ); -}); - -// Activate event - clean up old caches -self.addEventListener('activate', (event) => { - const cacheWhitelist = [CACHE_NAME]; - - event.waitUntil( - caches.keys().then((cacheNames) => { - return Promise.all( - cacheNames.map((cacheName) => { - if (cacheWhitelist.indexOf(cacheName) === -1) { - return caches.delete(cacheName); - } - }) - ); - }) - ); - - return self.clients.claim(); -});