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/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) 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/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/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/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/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/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/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/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/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/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(); -}); 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.