From 590f6e7dc24759cf05ffc3db79884a41471f1aa6 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 17 Mar 2026 02:59:36 +0530 Subject: [PATCH] Added a clean simple homepage --- .vscode/settings.json | 3 + homepage/Home script.js | 401 +++++++++ homepage/Home style.css | 1759 +++++++++++++++++++++++++++++++++++++++ homepage/OPENDOT.jpg | Bin 0 -> 83020 bytes homepage/home.html | 685 +++++++++++++++ 5 files changed, 2848 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 homepage/Home script.js create mode 100644 homepage/Home style.css create mode 100644 homepage/OPENDOT.jpg create mode 100644 homepage/home.html diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..6f3a291 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "liveServer.settings.port": 5501 +} \ No newline at end of file diff --git a/homepage/Home script.js b/homepage/Home script.js new file mode 100644 index 0000000..7fb9015 --- /dev/null +++ b/homepage/Home script.js @@ -0,0 +1,401 @@ +// OpenDots - Stunning Homepage JavaScript + +const CHAR_SPEED = 28; // faster = lower number +const LINE_PAUSE = 500; // gap between the two lines +const START_DELAY = 600; // wait before typing begins +document.addEventListener('DOMContentLoaded', function() { + + + // SMOOTH SCROLLING + + const links = document.querySelectorAll('a[href^="#"]'); + + links.forEach(link => { + link.addEventListener('click', function(e) { + const href = this.getAttribute('href'); + + if (href === '#') { + e.preventDefault(); + return; + } + + const target = document.querySelector(href); + + if (target) { + e.preventDefault(); + const navHeight = document.querySelector('.navbar').offsetHeight; + const targetPosition = target.offsetTop - navHeight - 20; + + window.scrollTo({ + top: targetPosition, + behavior: 'smooth' + }); + } + }); + }); + + + // NAVBAR SCROLL EFFECT + + const navbar = document.querySelector('.navbar'); + let lastScroll = 0; + + window.addEventListener('scroll', function() { + const currentScroll = window.pageYOffset; + + if (currentScroll > 100) { + navbar.classList.add('scrolled'); + } else { + navbar.classList.remove('scrolled'); + } + + lastScroll = currentScroll; + }); + + + // INTERSECTION OBSERVER FOR ANIMATIONS + + const observerOptions = { + threshold: 0.1, + rootMargin: '0px 0px -100px 0px' + }; + + const observer = new IntersectionObserver(function(entries) { + entries.forEach(entry => { + if (entry.isIntersecting) { + entry.target.style.opacity = '1'; + entry.target.style.transform = 'translateY(0)'; + } + }); + }, observerOptions); + + // Observe elements for scroll animation + const animatedElements = document.querySelectorAll('.feature-card, .use-case-card, .tech-category'); + animatedElements.forEach((element, index) => { + element.style.opacity = '0'; + element.style.transform = 'translateY(50px)'; + element.style.transition = `opacity 0.6s ease ${index * 0.1}s, transform 0.6s ease ${index * 0.1}s`; + observer.observe(element); + }); + + + // DYNAMIC GRADIENT ORB MOVEMENT + + const orbs = document.querySelectorAll('.gradient-orb'); + let mouseX = 0; + let mouseY = 0; + + document.addEventListener('mousemove', function(e) { + mouseX = e.clientX / window.innerWidth; + mouseY = e.clientY / window.innerHeight; + + orbs.forEach((orb, index) => { + const speed = (index + 1) * 0.5; + const x = (mouseX - 0.5) * 50 * speed; + const y = (mouseY - 0.5) * 50 * speed; + + orb.style.transform = `translate(${x}px, ${y}px)`; + }); + }); + + + // FLOATING CARDS PARALLAX + + const floatingCards = document.querySelectorAll('.floating-card'); + + window.addEventListener('scroll', function() { + const scrolled = window.pageYOffset; + + floatingCards.forEach((card, index) => { + const speed = (index + 1) * 0.1; + const yPos = -(scrolled * speed); + card.style.transform = `translateY(${yPos}px)`; + }); + }); + + + // ANIMATED NUMBERS (Stats Counter) + + const stats = document.querySelectorAll('.stat-number'); + let hasAnimated = false; + + const statsObserver = new IntersectionObserver(function(entries) { + entries.forEach(entry => { + if (entry.isIntersecting && !hasAnimated) { + hasAnimated = true; + animateStats(); + } + }); + }, { threshold: 0.5 }); + + const heroStats = document.querySelector('.hero-stats'); + if (heroStats) { + statsObserver.observe(heroStats); + } + + function animateStats() { + stats.forEach(stat => { + const text = stat.textContent; + // Only animate if it's a number + if (!isNaN(text.replace('%', ''))) { + const target = parseInt(text); + let current = 0; + const increment = target / 50; + + const timer = setInterval(() => { + current += increment; + if (current >= target) { + stat.textContent = text; + clearInterval(timer); + } else { + stat.textContent = Math.floor(current) + (text.includes('%') ? '%' : ''); + } + }, 30); + } + }); + } + + + // BUTTON RIPPLE EFFECT + + const buttons = document.querySelectorAll('.btn'); + + buttons.forEach(button => { + button.addEventListener('click', function(e) { + const ripple = document.createElement('span'); + const rect = this.getBoundingClientRect(); + const size = Math.max(rect.width, rect.height); + const x = e.clientX - rect.left - size / 2; + const y = e.clientY - rect.top - size / 2; + + ripple.style.cssText = ` + position: absolute; + width: ${size}px; + height: ${size}px; + border-radius: 50%; + background: rgba(255, 255, 255, 0.6); + left: ${x}px; + top: ${y}px; + pointer-events: none; + transform: scale(0); + animation: ripple-animation 0.6s ease-out; + `; + + this.style.position = 'relative'; + this.style.overflow = 'hidden'; + this.appendChild(ripple); + + setTimeout(() => ripple.remove(), 600); + }); + }); + + // Add ripple animation CSS + const style = document.createElement('style'); + style.textContent = ` + @keyframes ripple-animation { + to { + transform: scale(4); + opacity: 0; + } + } + `; + document.head.appendChild(style); + + + // FEATURE CARDS TILT EFFECT + + const featureCards = document.querySelectorAll('.feature-card'); + + featureCards.forEach(card => { + card.addEventListener('mousemove', function(e) { + const rect = this.getBoundingClientRect(); + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; + + const centerX = rect.width / 2; + const centerY = rect.height / 2; + + const rotateX = (y - centerY) / 20; + const rotateY = (centerX - x) / 20; + + this.style.transform = `perspective(1000px) rotateX(${rotateX}deg) rotateY(${rotateY}deg) translateY(-12px)`; + }); + + card.addEventListener('mouseleave', function() { + this.style.transform = ''; + }); + }); + + + // PROGRESS BAR ANIMATION + + const progressBars = document.querySelectorAll('.progress-fill'); + + progressBars.forEach(bar => { + const animate = () => { + bar.style.width = '0%'; + setTimeout(() => { + bar.style.transition = 'width 2s ease-in-out'; + bar.style.width = '70%'; + }, 100); + }; + + animate(); + setInterval(animate, 3000); + }); + + + // TECH TAGS WAVE ANIMATION + + const techTags = document.querySelectorAll('.tech-tag'); + + techTags.forEach((tag, index) => { + setTimeout(() => { + tag.style.opacity = '0'; + tag.style.transform = 'translateY(10px)'; + tag.style.transition = 'opacity 0.5s ease, transform 0.5s ease'; + + setTimeout(() => { + tag.style.opacity = '1'; + tag.style.transform = 'translateY(0)'; + }, 50); + }, index * 50); + }); + + + // LAZY LOADING OPTIMIZATION + + if ('IntersectionObserver' in window) { + const imageObserver = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + const img = entry.target; + img.src = img.dataset.src; + img.classList.remove('lazy'); + imageObserver.unobserve(img); + } + }); + }); + + const images = document.querySelectorAll('img[data-src]'); + images.forEach(img => imageObserver.observe(img)); + } + + + // PERFORMANCE MONITORING + + if ('requestIdleCallback' in window) { + requestIdleCallback(() => { + // Preload critical resources + const criticalLinks = document.querySelectorAll('a[href="index.html"]'); + criticalLinks.forEach(link => { + const preloadLink = document.createElement('link'); + preloadLink.rel = 'prefetch'; + preloadLink.href = link.getAttribute('href'); + document.head.appendChild(preloadLink); + }); + }); + } + + + // EASTER EGGS + + console.log('%cšŸš€ OpenDots', 'font-size: 32px; font-weight: bold; background: linear-gradient(135deg, #000 0%, #666 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent;'); + console.log('%c✨ Stunning Black & White Design', 'font-size: 16px; color: #666;'); + console.log('%cšŸŽØ Featuring: Gradients • Glassmorphism • Animations', 'font-size: 14px; color: #999;'); + console.log('%cšŸ’» GitHub: https://github.com/multiverseweb/OpenDots', 'font-size: 14px; color: #000; font-weight: bold;'); + console.log('%cšŸ¤ Interested in contributing? We\'d love to have you!', 'font-size: 14px; color: #22c55e; font-weight: bold;'); + + // Konami Code Easter Egg + let konamiCode = []; + const konamiSequence = ['ArrowUp', 'ArrowUp', 'ArrowDown', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowLeft', 'ArrowRight', 'b', 'a']; + + document.addEventListener('keydown', (e) => { + konamiCode.push(e.key); + konamiCode = konamiCode.slice(-konamiSequence.length); + + if (konamiCode.join('') === konamiSequence.join('')) { + console.log('%cšŸŽ® KONAMI CODE ACTIVATED! šŸŽ®', 'font-size: 24px; color: #000; font-weight: bold; text-shadow: 2px 2px 4px rgba(0,0,0,0.3);'); + console.log('%c🌟 You found the secret! Thanks for exploring!', 'font-size: 16px; color: #666;'); + + // Add fun visual effect + document.body.style.animation = 'rainbow 2s ease-in-out'; + setTimeout(() => { + document.body.style.animation = ''; + }, 2000); + } + }); + + // Rainbow animation for easter egg + const rainbowStyle = document.createElement('style'); + rainbowStyle.textContent = ` + @keyframes rainbow { + 0%, 100% { filter: hue-rotate(0deg); } + 50% { filter: hue-rotate(360deg); } + } + `; + document.head.appendChild(rainbowStyle); + + + // ACCESSIBILITY ENHANCEMENTS + + // Add keyboard navigation for cards + const interactiveCards = document.querySelectorAll('.feature-card, .use-case-card, .tech-category'); + + interactiveCards.forEach(card => { + card.setAttribute('tabindex', '0'); + + card.addEventListener('keydown', (e) => { + if (e.key === 'Enter' || e.key === ' ') { + card.click(); + } + }); + }); + + + // PAGE LOAD PERFORMANCE + + window.addEventListener('load', () => { + // Remove loading class if exists + document.body.classList.remove('loading'); + + // Log performance metrics + if ('performance' in window) { + const perfData = window.performance.timing; + const pageLoadTime = perfData.loadEventEnd - perfData.navigationStart; + console.log(`%c⚔ Page loaded in ${pageLoadTime}ms`, 'color: #22c55e; font-weight: bold;'); + } + }); +}); + +// ============================================ +// UTILITY FUNCTIONS +// ============================================ +function debounce(func, wait) { + let timeout; + return function executedFunction(...args) { + const later = () => { + clearTimeout(timeout); + func(...args); + }; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + }; +} + +function throttle(func, limit) { + let inThrottle; + return function(...args) { + if (!inThrottle) { + func.apply(this, args); + inThrottle = true; + setTimeout(() => inThrottle = false, limit); + } + }; +} + + +// Export for potential module use +if (typeof module !== 'undefined' && module.exports) { + module.exports = { debounce, throttle }; +} \ No newline at end of file diff --git a/homepage/Home style.css b/homepage/Home style.css new file mode 100644 index 0000000..eb29710 --- /dev/null +++ b/homepage/Home style.css @@ -0,0 +1,1759 @@ +/* ============================================ + STUNNING BLACK & WHITE THEME - OPENDOTS + Modern • Gradient • Glassmorphism • Animated + ============================================ */ + +/* ============================================ + CSS VARIABLES + ============================================ */ +:root { + /* Core Colors */ + --black: #000000; + --white: #ffffff; + --gray-50: #fafafa; + --gray-100: #f5f5f5; + --gray-200: #e5e5e5; + --gray-300: #d4d4d4; + --gray-400: #a3a3a3; + --gray-500: #737373; + --gray-600: #525252; + --gray-700: #404040; + --gray-800: #262626; + --gray-900: #171717; + + /* Gradients */ + --gradient-dark: linear-gradient(135deg, #000000 0%, #1a1a1a 100%); + --gradient-light: linear-gradient(135deg, #ffffff 0%, #f5f5f5 100%); + --gradient-gray: linear-gradient(135deg, #f5f5f5 0%, #e5e5e5 100%); + --gradient-radial: radial-gradient(circle at 50% 50%, #ffffff 0%, #f5f5f5 100%); + + /* Typography */ + --font-main: 'Space Grotesk', -apple-system, BlinkMacSystemFont, sans-serif; + --font-mono: 'JetBrains Mono', monospace; + + /* Spacing */ + --space-xs: 0.5rem; + --space-sm: 1rem; + --space-md: 1.5rem; + --space-lg: 2rem; + --space-xl: 3rem; + --space-2xl: 4rem; + --space-3xl: 6rem; + + /* Effects */ + --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1); + --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1); + --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); + --shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25); + + --blur-sm: blur(8px); + --blur-md: blur(16px); + --blur-lg: blur(24px); +} + +/* ============================================ + RESET & BASE + ============================================ */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; + overflow-x: hidden; +} + +body { + font-family: var(--font-main); + background: var(--white); + color: var(--gray-900); + line-height: 1.6; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + overflow-x: hidden; +} + +/* ============================================ + ANIMATED BACKGROUND + ============================================ */ +.bg-animation { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 0; + pointer-events: none; + overflow: hidden; +} + +.gradient-orb { + position: absolute; + border-radius: 50%; + filter: blur(80px); + opacity: 0.3; + animation: float 20s ease-in-out infinite; +} + +.orb-1 { + width: 600px; + height: 600px; + background: radial-gradient(circle, rgba(0,0,0,0.2) 0%, transparent 70%); + top: -200px; + left: -200px; + animation-delay: 0s; +} + +.orb-2 { + width: 500px; + height: 500px; + background: radial-gradient(circle, rgba(0,0,0,0.15) 0%, transparent 70%); + bottom: -150px; + right: -150px; + animation-delay: 7s; +} + +.orb-3 { + width: 400px; + height: 400px; + background: radial-gradient(circle, rgba(0,0,0,0.1) 0%, transparent 70%); + top: 40%; + right: 20%; + animation-delay: 14s; +} + +.grid-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + linear-gradient(rgba(0,0,0,0.02) 1px, transparent 1px), + linear-gradient(90deg, rgba(0,0,0,0.02) 1px, transparent 1px); + background-size: 50px 50px; + opacity: 0.4; +} + +@keyframes float { + 0%, 100% { + transform: translate(0, 0) scale(1); + } + 33% { + transform: translate(30px, -30px) scale(1.1); + } + 66% { + transform: translate(-20px, 20px) scale(0.9); + } +} + +/* ============================================ + NAVIGATION + ============================================ */ +.navbar { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 1000; + backdrop-filter: var(--blur-md); + background: rgba(255, 255, 255, 0.8); + border-bottom: 1px solid rgba(0, 0, 0, 0.1); + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +.navbar.scrolled { + background: rgba(255, 255, 255, 0.95); + box-shadow: var(--shadow-lg); +} + +.nav-container { + max-width: 1200px; + margin: 0 auto; + padding: var(--space-md) var(--space-lg); + display: flex; + align-items: center; + justify-content: space-between; +} + +.nav-logo { + display: flex; + align-items: center; + gap: var(--space-sm); +} + +.logo-wrapper { + position: relative; + width: 40px; + height: 40px; +} + +.logo-icon { + width: 100%; + height: 100%; + position: relative; + z-index: 2; +} + +.logo-glow { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: radial-gradient(circle, rgba(0,0,0,0.1) 0%, transparent 70%); + filter: blur(10px); + animation: pulse 3s ease-in-out infinite; +} + +.logo-text { + font-size: 1.5rem; + font-weight: 700; + color: var(--black); + letter-spacing: -0.02em; +} + +.logo-badge { + padding: 0.25rem 0.5rem; + background: var(--black); + color: var(--white); + font-size: 0.75rem; + font-weight: 600; + border-radius: 4px; +} + +.nav-links { + display: flex; + align-items: center; + gap: var(--space-lg); +} + +.nav-link { + font-size: 0.9375rem; + font-weight: 500; + color: var(--gray-700); + text-decoration: none; + position: relative; + transition: color 0.3s ease; +} + +.nav-link::after { + content: ''; + position: absolute; + bottom: -4px; + left: 0; + width: 0; + height: 2px; + background: var(--black); + transition: width 0.3s ease; +} + +.nav-link:hover { + color: var(--black); +} + +.nav-link:hover::after { + width: 100%; +} + +.btn-github { + display: flex; + align-items: center; + gap: var(--space-xs); + padding: 0.5rem 1rem; + background: var(--black); + color: var(--white); + border-radius: 8px; + font-weight: 600; + text-decoration: none; + transition: all 0.3s ease; + box-shadow: var(--shadow-md); +} + +.btn-github:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-xl); +} + +/* ============================================ + HERO SECTION + ============================================ */ +.hero { + position: relative; + min-height: 100vh; + display: flex; + align-items: center; + padding: var(--space-3xl) var(--space-lg); + margin-top: 80px; +} + +.hero-container { + position: relative; + z-index: 1; + max-width: 1200px; + margin: 0 auto; + display: grid; + grid-template-columns: 1fr 1fr; + gap: var(--space-3xl); + align-items: center; +} + +.hero-badge-wrapper { + position: relative; + display: inline-flex; + margin-bottom: var(--space-lg); +} + +.pulse-ring { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 100%; + height: 100%; + border-radius: 100px; + border: 2px solid var(--black); + animation: pulse-ring 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; +} + +@keyframes pulse-ring { + 0% { + transform: translate(-50%, -50%) scale(1); + opacity: 1; + } + 100% { + transform: translate(-50%, -50%) scale(1.3); + opacity: 0; + } +} + +.hero-badge { + position: relative; + display: flex; + align-items: center; + gap: var(--space-xs); + padding: var(--space-xs) var(--space-md); + background: rgba(0, 0, 0, 0.05); + backdrop-filter: var(--blur-sm); + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 100px; + font-size: 0.875rem; + font-weight: 500; +} + +.badge-icon { + font-size: 1.25rem; + animation: pulse 2s ease-in-out infinite; +} + +@keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } +} + +.hero-title { + font-size: 4rem; + font-weight: 700; + line-height: 1.1; + letter-spacing: -0.03em; + margin-bottom: var(--space-lg); + display: flex; + flex-direction: column; +} + +.title-line { + color: var(--gray-900); +} + +.title-highlight { + background: linear-gradient(135deg, var(--black) 0%, var(--gray-700) 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + position: relative; + display: inline-block; +} + +.title-highlight::after { + content: ''; + position: absolute; + bottom: 0.5rem; + left: 0; + right: 0; + height: 0.75rem; + background: linear-gradient(90deg, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.05) 100%); + z-index: -1; + border-radius: 4px; +} + +.hero-description { + font-size: 1.125rem; + line-height: 1.7; + color: var(--gray-600); + margin-bottom: var(--space-xl); + max-width: 540px; +} + +.hero-buttons { + display: flex; + gap: var(--space-md); + margin-bottom: var(--space-xl); +} + +.btn { + display: inline-flex; + align-items: center; + gap: var(--space-xs); + padding: 1rem 2rem; + font-size: 1rem; + font-weight: 600; + border-radius: 12px; + text-decoration: none; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + position: relative; + overflow: hidden; +} + +.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 ease; +} + +.btn:hover::before { + left: 100%; +} + +.btn-primary { + background: var(--black); + color: var(--white); + box-shadow: var(--shadow-lg); +} + +.btn-primary:hover { + transform: translateY(-3px); + box-shadow: var(--shadow-2xl); +} + +.btn-secondary { + background: var(--white); + color: var(--black); + border: 2px solid var(--black); +} + +.btn-secondary:hover { + background: var(--black); + color: var(--white); + transform: translateY(-3px); +} + +.btn-large { + padding: 1.25rem 2.5rem; + font-size: 1.125rem; +} + +.hero-stats { + display: flex; + align-items: center; + gap: var(--space-lg); + padding: var(--space-lg); + background: rgba(0, 0, 0, 0.02); + backdrop-filter: var(--blur-sm); + border-radius: 16px; + border: 1px solid rgba(0, 0, 0, 0.05); +} + +.stat-item { + display: flex; + align-items: center; + gap: var(--space-sm); +} + +.stat-icon { + font-size: 2rem; +} + +.stat-number { + font-size: 1.25rem; + font-weight: 700; + color: var(--black); + line-height: 1; +} + +.stat-label { + font-size: 0.875rem; + color: var(--gray-600); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.stat-divider { + width: 1px; + height: 40px; + background: rgba(0, 0, 0, 0.1); +} + +/* ============================================ + HERO VISUAL - FLOATING CARDS + ============================================ */ +.hero-visual { + position: relative; + height: 600px; +} + +.visual-wrapper { + position: relative; + width: 100%; + height: 100%; +} + +.floating-card { + position: absolute; + background: rgba(255, 255, 255, 0.9); + backdrop-filter: var(--blur-md); + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 16px; + padding: var(--space-lg); + box-shadow: var(--shadow-xl); + transition: all 0.3s ease; +} + +.floating-card:hover { + transform: translateY(-10px); + box-shadow: var(--shadow-2xl); +} + +.card-1 { + top: 10%; + left: 0; + width: 280px; + animation: float-1 6s ease-in-out infinite; +} + +.card-2 { + top: 40%; + right: 0; + width: 300px; + animation: float-2 7s ease-in-out infinite; +} + +.card-3 { + bottom: 10%; + left: 10%; + width: 260px; + animation: float-3 5s ease-in-out infinite; +} + +@keyframes float-1 { + 0%, 100% { transform: translateY(0) rotate(-2deg); } + 50% { transform: translateY(-20px) rotate(2deg); } +} + +@keyframes float-2 { + 0%, 100% { transform: translateY(0) rotate(2deg); } + 50% { transform: translateY(-25px) rotate(-2deg); } +} + +@keyframes float-3 { + 0%, 100% { transform: translateY(0) rotate(-1deg); } + 50% { transform: translateY(-15px) rotate(1deg); } +} + +.card-glow { + position: absolute; + top: -50%; + left: -50%; + width: 200%; + height: 200%; + background: radial-gradient(circle, rgba(0,0,0,0.05) 0%, transparent 70%); + filter: blur(30px); + z-index: -1; +} + +.card-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: var(--space-md); +} + +.card-title { + font-size: 0.875rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.status-dot { + width: 10px; + height: 10px; + background: #22c55e; + border-radius: 50%; + animation: pulse-dot 2s ease-in-out infinite; +} + +@keyframes pulse-dot { + 0%, 100% { opacity: 1; transform: scale(1); } + 50% { opacity: 0.5; transform: scale(1.2); } +} + +.mini-chart { + height: 80px; + background: linear-gradient(135deg, rgba(0,0,0,0.05) 0%, rgba(0,0,0,0.02) 100%); + border-radius: 8px; + margin-bottom: var(--space-md); + position: relative; + overflow: hidden; +} + +.chart-line { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 60%; + background: linear-gradient(135deg, var(--black) 0%, var(--gray-700) 100%); + clip-path: polygon(0 70%, 20% 50%, 40% 60%, 60% 30%, 80% 40%, 100% 20%, 100% 100%, 0 100%); + animation: chart-wave 3s ease-in-out infinite; +} + +@keyframes chart-wave { + 0%, 100% { opacity: 0.8; } + 50% { opacity: 1; } +} + +.card-footer { + display: flex; + justify-content: space-between; + font-size: 0.875rem; + font-weight: 600; +} + +.metric { + padding: 0.25rem 0.5rem; + background: rgba(0, 0, 0, 0.05); + border-radius: 6px; +} + +.code-preview { + font-family: var(--font-mono); + font-size: 0.875rem; + line-height: 1.6; +} + +.code-line { + color: var(--gray-700); + margin-bottom: 0.25rem; +} + +.code-keyword { + color: var(--black); + font-weight: 600; +} + +.code-number { + color: var(--gray-600); +} + +.code-string { + color: var(--gray-500); +} + +.ai-indicator { + display: flex; + align-items: center; + gap: var(--space-sm); + margin-bottom: var(--space-sm); + font-size: 0.875rem; + font-weight: 600; +} + +.ai-pulse { + width: 8px; + height: 8px; + background: var(--black); + border-radius: 50%; + animation: pulse-dot 1s ease-in-out infinite; +} + +.progress-bar { + height: 8px; + background: rgba(0, 0, 0, 0.1); + border-radius: 100px; + overflow: hidden; +} + +.progress-fill { + height: 100%; + background: linear-gradient(90deg, var(--black) 0%, var(--gray-700) 100%); + width: 70%; + animation: progress 2s ease-in-out infinite; +} + +@keyframes progress { + 0% { width: 0%; } + 50% { width: 70%; } + 100% { width: 0%; } +} + +.geometric-shape { + position: absolute; + border: 2px solid rgba(0, 0, 0, 0.1); + border-radius: 12px; + animation: rotate-shape 20s linear infinite; +} + +.shape-1 { + width: 100px; + height: 100px; + top: 5%; + right: 5%; + animation-duration: 15s; +} + +.shape-2 { + width: 80px; + height: 80px; + bottom: 30%; + right: 15%; + animation-duration: 20s; + animation-direction: reverse; +} + +.shape-3 { + width: 60px; + height: 60px; + top: 50%; + left: 5%; + animation-duration: 25s; +} + +@keyframes rotate-shape { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } +} + +/* ============================================ + SECTIONS + ============================================ */ +.features, +.tech-stack, +.use-cases { + position: relative; + z-index: 1; + padding: var(--space-3xl) var(--space-lg); +} + +.features { + background: var(--gradient-light); +} + +.tech-stack { + background: var(--white); +} + +.use-cases { + background: var(--gradient-gray); +} + +.section-container { + max-width: 1200px; + margin: 0 auto; +} + +.section-header { + text-align: center; + margin-bottom: var(--space-3xl); +} + +.section-tag { + display: inline-block; + padding: 0.5rem 1rem; + background: var(--black); + color: var(--white); + font-size: 0.75rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.1em; + border-radius: 6px; + margin-bottom: var(--space-md); +} + +.section-title { + font-size: 3rem; + font-weight: 700; + line-height: 1.2; + margin-bottom: var(--space-md); +} + +.title-gradient { + background: linear-gradient(135deg, var(--black) 0%, var(--gray-600) 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.section-description { + font-size: 1.125rem; + color: var(--gray-600); + max-width: 600px; + margin: 0 auto; +} + +/* ============================================ + FEATURES GRID + ============================================ */ +.features-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); + gap: var(--space-xl); +} + +.feature-card { + position: relative; + padding: var(--space-xl); + background: rgba(255, 255, 255, 0.9); + backdrop-filter: var(--blur-md); + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 20px; + transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1); + overflow: hidden; +} + +.feature-card::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 4px; + background: linear-gradient(90deg, var(--black), var(--gray-700)); + transform: scaleX(0); + transform-origin: left; + transition: transform 0.4s ease; +} + +.feature-card:hover::before { + transform: scaleX(1); +} + +.feature-card:hover { + transform: translateY(-12px); + box-shadow: var(--shadow-2xl); + border-color: rgba(0, 0, 0, 0.2); +} + +.feature-number { + position: absolute; + top: var(--space-lg); + right: var(--space-lg); + font-size: 3rem; + font-weight: 700; + color: rgba(0, 0, 0, 0.03); + line-height: 1; +} + +.feature-icon { + margin-bottom: var(--space-md); + color: var(--black); +} + +.feature-title { + font-size: 1.5rem; + font-weight: 700; + margin-bottom: var(--space-sm); + color: var(--black); +} + +.feature-description { + color: var(--gray-600); + line-height: 1.6; +} + +.feature-hover-effect { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 0; + background: linear-gradient(0deg, rgba(0,0,0,0.02), transparent); + transition: height 0.4s ease; +} + +.feature-card:hover .feature-hover-effect { + height: 100%; +} + +/* ============================================ + TECH STACK + ============================================ */ +.tech-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: var(--space-xl); +} + +.tech-category { + padding: var(--space-xl); + background: var(--gradient-light); + border-radius: 16px; + border: 1px solid rgba(0, 0, 0, 0.05); + transition: all 0.3s ease; +} + +.tech-category:hover { + transform: translateY(-8px); + box-shadow: var(--shadow-lg); +} + +.tech-icon { + font-size: 3rem; + margin-bottom: var(--space-md); +} + +.tech-heading { + font-size: 1.25rem; + font-weight: 700; + margin-bottom: var(--space-md); +} + +.tech-tags { + display: flex; + flex-wrap: wrap; + gap: var(--space-sm); +} + +.tech-tag { + padding: 0.5rem 1rem; + background: var(--white); + color: var(--black); + font-size: 0.875rem; + font-weight: 500; + border-radius: 8px; + border: 1px solid rgba(0, 0, 0, 0.1); + transition: all 0.3s ease; + cursor: default; +} + +.tech-tag:hover { + background: var(--black); + color: var(--white); + transform: translateY(-2px); +} + +/* ============================================ + USE CASES + ============================================ */ +.use-cases-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); + gap: var(--space-lg); +} + +.use-case-card { + padding: var(--space-xl); + background: rgba(255, 255, 255, 0.9); + backdrop-filter: var(--blur-md); + border-radius: 16px; + border: 1px solid rgba(0, 0, 0, 0.1); + text-align: center; + transition: all 0.3s ease; +} + +.use-case-card:hover { + transform: translateY(-8px) scale(1.02); + box-shadow: var(--shadow-xl); +} + +.use-case-icon { + font-size: 3.5rem; + margin-bottom: var(--space-md); +} + +.use-case-title { + font-size: 1.25rem; + font-weight: 700; + margin-bottom: var(--space-sm); +} + +.use-case-description { + color: var(--gray-600); + line-height: 1.6; +} + +/* ============================================ + CTA SECTION + ============================================ */ +.cta { + position: relative; + padding: var(--space-3xl) var(--space-lg); + background: var(--gradient-dark); + color: var(--white); + overflow: hidden; +} + +.cta-container { + position: relative; + z-index: 1; + max-width: 800px; + margin: 0 auto; + text-align: center; +} + +.cta-glow { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 600px; + height: 600px; + background: radial-gradient(circle, rgba(255,255,255,0.1) 0%, transparent 70%); + filter: blur(60px); +} + +.cta-title { + font-size: 3rem; + font-weight: 700; + margin-bottom: var(--space-md); + line-height: 1.2; +} + +.cta-description { + font-size: 1.25rem; + margin-bottom: var(--space-xl); + color: var(--gray-300); +} + +.cta-buttons { + display: flex; + justify-content: center; + gap: var(--space-md); +} + +.cta .btn-primary { + background: var(--white); + color: var(--black); +} + +.cta .btn-primary:hover { + background: var(--gray-100); +} + +.cta .btn-secondary { + background: transparent; + color: var(--white); + border-color: var(--white); +} + +.cta .btn-secondary:hover { + background: var(--white); + color: var(--black); +} + +/* ============================================ + FOOTER + ============================================ */ +.footer { + background: var(--white); + border-top: 1px solid rgba(0, 0, 0, 0.1); + padding: var(--space-3xl) var(--space-lg) var(--space-lg); +} + +.footer-container { + max-width: 1200px; + margin: 0 auto; +} + +.footer-content { + display: grid; + grid-template-columns: 2fr 1fr 1fr 1fr; + gap: var(--space-xl); + margin-bottom: var(--space-xl); + padding-bottom: var(--space-xl); + border-bottom: 1px solid rgba(0, 0, 0, 0.1); +} + +.footer-logo { + display: flex; + align-items: center; + gap: var(--space-sm); + margin-bottom: var(--space-md); +} + +.footer-logo-icon { + width: 32px; + height: 32px; +} + +.footer-logo-text { + font-size: 1.5rem; + font-weight: 700; +} + +.footer-tagline { + color: var(--gray-600); + margin-bottom: var(--space-md); + line-height: 1.6; +} + +.footer-social { + display: flex; + gap: var(--space-sm); +} + +.social-link { + display: flex; + align-items: center; + justify-content: center; + width: 40px; + height: 40px; + background: var(--black); + color: var(--white); + border-radius: 8px; + transition: all 0.3s ease; +} + +.social-link:hover { + transform: translateY(-3px); + box-shadow: var(--shadow-lg); +} + +.footer-heading { + font-size: 1rem; + font-weight: 700; + margin-bottom: var(--space-md); +} + +.footer-list { + list-style: none; +} + +.footer-list li { + margin-bottom: var(--space-xs); +} + +.footer-list a { + color: var(--gray-600); + text-decoration: none; + transition: color 0.3s ease; +} + +.footer-list a:hover { + color: var(--black); +} + +.footer-bottom { + text-align: center; +} + +.footer-copyright { + color: var(--gray-600); + font-size: 0.875rem; +} + +.footer-copyright a { + color: var(--gray-800); + text-decoration: none; + font-weight: 600; + transition: color 0.3s ease; +} + +.footer-copyright a:hover { + color: var(--black); +} + +/* ============================================ + RESPONSIVE DESIGN + ============================================ */ +@media (max-width: 1024px) { + .hero-container { + grid-template-columns: 1fr; + } + + .hero-visual { + height: 500px; + order: -1; + } + + .footer-content { + grid-template-columns: 1fr 1fr; + } +} + +@media (max-width: 768px) { + .nav-links { + gap: var(--space-md); + } + + .btn-github span { + display: none; + } + + .hero-title { + font-size: 2.5rem; + } + + .hero-buttons { + flex-direction: column; + } + + .btn { + width: 100%; + justify-content: center; + } + + .hero-stats { + flex-direction: column; + } + + .stat-divider { + width: 100%; + height: 1px; + } + + .section-title { + font-size: 2rem; + } + + .features-grid { + grid-template-columns: 1fr; + } + + .footer-content { + grid-template-columns: 1fr; + } + + .cta-title { + font-size: 2rem; + } + + .cta-buttons { + flex-direction: column; + } +} + +@media (max-width: 480px) { + .hero-title { + font-size: 2rem; + } + + .hero-visual { + height: 400px; + } + + .floating-card { + padding: var(--space-md); + } +} +/* ============================================ + DARK MODE VARIABLES & OVERRIDES + ============================================ */ +:root { + --dm-transition: background 0.4s ease, color 0.4s ease, border-color 0.4s ease; +} + +html.dark { + --white: #0d0d0d; + --black: #f5f5f5; + --gray-50: #111111; + --gray-100: #1a1a1a; + --gray-200: #242424; + --gray-300: #2e2e2e; + --gray-400: #555555; + --gray-500: #777777; + --gray-600: #aaaaaa; + --gray-700: #cccccc; + --gray-800: #e0e0e0; + --gray-900: #f5f5f5; + --gradient-dark: linear-gradient(135deg, #f5f5f5 0%, #e5e5e5 100%); + --gradient-light: linear-gradient(135deg, #1a1a1a 0%, #222222 100%); + --gradient-gray: linear-gradient(135deg, #1a1a1a 0%, #222222 100%); +} + +html.dark body { + background: #0d0d0d; + color: #f5f5f5; +} + +html.dark .navbar { + background: rgba(13, 13, 13, 0.85); + border-bottom-color: rgba(255,255,255,0.08); +} + +html.dark .navbar.scrolled { + background: rgba(13, 13, 13, 0.97); +} + +html.dark .hero-badge { + background: rgba(255,255,255,0.07); + border-color: rgba(255,255,255,0.12); +} + +html.dark .floating-card { + background: rgba(30,30,30,0.9); + border-color: rgba(255,255,255,0.08); +} + +html.dark .feature-card { + background: rgba(20,20,20,0.9); + border-color: rgba(255,255,255,0.07); +} + +html.dark .tech-category { + background: linear-gradient(135deg, #1a1a1a 0%, #222 100%); + border-color: rgba(255,255,255,0.07); +} + +html.dark .tech-tag { + background: #0d0d0d; + color: #f5f5f5; + border-color: rgba(255,255,255,0.1); +} + +html.dark .tech-tag:hover { + background: #f5f5f5; + color: #0d0d0d; +} + +html.dark .use-case-card { + background: rgba(20,20,20,0.9); + border-color: rgba(255,255,255,0.07); +} + +html.dark .footer { + background: #0d0d0d; + border-top-color: rgba(255,255,255,0.08); +} + +html.dark .footer-content { + border-bottom-color: rgba(255,255,255,0.08); +} + +html.dark .grid-overlay { + background-image: + linear-gradient(rgba(255,255,255,0.03) 1px, transparent 1px), + linear-gradient(90deg, rgba(255,255,255,0.03) 1px, transparent 1px); +} + +html.dark .orb-1 { background: radial-gradient(circle, rgba(255,255,255,0.05) 0%, transparent 70%); } +html.dark .orb-2 { background: radial-gradient(circle, rgba(255,255,255,0.04) 0%, transparent 70%); } +html.dark .orb-3 { background: radial-gradient(circle, rgba(255,255,255,0.03) 0%, transparent 70%); } + +html.dark .preview-browser { + background: #181818; + border-color: rgba(255,255,255,0.1); + box-shadow: 0 40px 80px rgba(0,0,0,0.6); +} + +html.dark .browser-bar { + background: #111; + border-bottom-color: rgba(255,255,255,0.08); +} + +html.dark .browser-url { + background: #1a1a1a; + color: #aaa; + border-color: rgba(255,255,255,0.08); +} + +html.dark .preview-badge { + background: rgba(20,20,20,0.9); + border-color: rgba(255,255,255,0.08); +} + +html.dark .faq-item { + border-color: rgba(255,255,255,0.08); + background: rgba(20,20,20,0.6); +} + +html.dark .faq-question { + color: #f5f5f5; +} + +html.dark .faq-item.open { + border-color: rgba(255,255,255,0.2); + background: rgba(30,30,30,0.8); +} + +html.dark .faq-answer p { + color: #aaa; +} + +html.dark .faq-answer a { + color: #ddd; +} + +html.dark .section-tag { + background: rgba(255,255,255,0.07); + color: #999; + border-color: rgba(255,255,255,0.1); +} + +/* ============================================ + DARK MODE TOGGLE BUTTON + ============================================ */ +.dark-mode-toggle { + display: flex; + align-items: center; + justify-content: center; + width: 40px; + height: 40px; + border-radius: 50%; + border: 1.5px solid rgba(0,0,0,0.15); + background: transparent; + cursor: pointer; + font-size: 1.1rem; + transition: all 0.3s ease; + position: relative; + overflow: hidden; +} + +.dark-mode-toggle:hover { + background: rgba(0,0,0,0.05); + transform: rotate(20deg); +} + +html.dark .dark-mode-toggle { + border-color: rgba(255,255,255,0.15); +} + +html.dark .dark-mode-toggle:hover { + background: rgba(255,255,255,0.07); +} + +.toggle-icon { + position: absolute; + transition: opacity 0.3s ease, transform 0.3s ease; +} + +.sun-icon { + opacity: 1; + transform: scale(1); +} + +.moon-icon { + opacity: 0; + transform: scale(0.5); +} + +html.dark .sun-icon { + opacity: 0; + transform: scale(0.5); +} + +html.dark .moon-icon { + opacity: 1; + transform: scale(1); +} + +/* ============================================ + PREVIEW SECTION + ============================================ */ +.preview-section { + position: relative; + z-index: 1; + padding: var(--space-3xl) var(--space-lg); + background: var(--gray-50); +} + +.preview-wrapper { + display: flex; + flex-direction: column; + align-items: center; + gap: var(--space-xl); +} + +.preview-browser { + width: 100%; + max-width: 1000px; + border-radius: 16px; + border: 1px solid rgba(0,0,0,0.12); + overflow: hidden; + background: #fff; + box-shadow: 0 40px 80px rgba(0,0,0,0.12), 0 0 0 1px rgba(0,0,0,0.05); + transition: transform 0.4s ease, box-shadow 0.4s ease; +} + +.preview-browser:hover { + transform: translateY(-6px); + box-shadow: 0 60px 100px rgba(0,0,0,0.18); +} + +.browser-bar { + display: flex; + align-items: center; + gap: var(--space-md); + padding: 0.75rem 1rem; + background: #f5f5f5; + border-bottom: 1px solid rgba(0,0,0,0.08); +} + +.browser-dots { + display: flex; + gap: 6px; + flex-shrink: 0; +} + +.browser-dot { + width: 12px; + height: 12px; + border-radius: 50%; +} + +.dot-red { background: #ff5f57; } +.dot-yellow { background: #ffbd2e; } +.dot-green { background: #28c840; } + +.browser-url { + flex: 1; + display: flex; + align-items: center; + gap: 6px; + padding: 0.3rem 0.75rem; + background: white; + border-radius: 6px; + font-size: 0.8rem; + color: #666; + font-family: var(--font-mono); + border: 1px solid rgba(0,0,0,0.08); +} + +.browser-actions { + color: #999; + flex-shrink: 0; +} + +.preview-screen { + position: relative; + overflow: hidden; + max-height: 540px; +} + +.preview-screenshot { + width: 100%; + display: block; + object-fit: cover; + object-position: top; + transition: transform 6s ease; +} + +.preview-browser:hover .preview-screenshot { + transform: translateY(-5%); +} + +.preview-overlay { + position: absolute; + inset: 0; + background: linear-gradient(to top, rgba(0,0,0,0.6) 0%, transparent 60%); + display: flex; + align-items: flex-end; + justify-content: center; + padding-bottom: var(--space-xl); + opacity: 0; + transition: opacity 0.3s ease; +} + +.preview-browser:hover .preview-overlay { + opacity: 1; +} + +.preview-cta-btn { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 0.75rem 1.5rem; + background: white; + color: black; + border-radius: 50px; + font-weight: 700; + font-size: 0.95rem; + text-decoration: none; + transition: all 0.2s ease; + box-shadow: 0 4px 20px rgba(0,0,0,0.3); +} + +.preview-cta-btn:hover { + transform: scale(1.05); +} + +.preview-badges { + display: flex; + gap: var(--space-lg); + flex-wrap: wrap; + justify-content: center; +} + +.preview-badge { + display: flex; + align-items: center; + gap: var(--space-sm); + padding: var(--space-sm) var(--space-md); + background: rgba(255,255,255,0.9); + backdrop-filter: blur(12px); + border: 1px solid rgba(0,0,0,0.08); + border-radius: 12px; + transition: all 0.3s ease; + box-shadow: 0 2px 12px rgba(0,0,0,0.05); +} + +.preview-badge:hover { + transform: translateY(-4px); + box-shadow: 0 8px 24px rgba(0,0,0,0.1); +} + +.pbadge-icon { + font-size: 1.75rem; +} + +.pbadge-title { + font-weight: 700; + font-size: 0.95rem; + color: var(--gray-900); +} + +.pbadge-sub { + font-size: 0.8rem; + color: var(--gray-500); +} + +/* ============================================ + FAQ SECTION + ============================================ */ +.faq-section { + position: relative; + z-index: 1; + padding: var(--space-3xl) var(--space-lg); + background: var(--white); +} + +.faq-grid { + max-width: 800px; + margin: 0 auto; + display: flex; + flex-direction: column; + gap: var(--space-sm); +} + +.faq-item { + border: 1px solid rgba(0,0,0,0.08); + border-radius: 12px; + overflow: hidden; + transition: all 0.3s ease; + background: rgba(255,255,255,0.7); + backdrop-filter: blur(8px); +} + +.faq-item.open { + border-color: rgba(0,0,0,0.2); + box-shadow: 0 4px 20px rgba(0,0,0,0.06); + background: rgba(255,255,255,0.95); +} + +.faq-question { + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + padding: 1.25rem 1.5rem; + background: none; + border: none; + cursor: pointer; + font-family: var(--font-main); + font-size: 1rem; + font-weight: 600; + color: var(--gray-900); + text-align: left; + gap: var(--space-md); + transition: color 0.2s ease; +} + +.faq-question:hover { + color: var(--black); +} + +.faq-icon { + font-size: 1.5rem; + font-weight: 300; + line-height: 1; + flex-shrink: 0; + transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); + color: var(--gray-500); +} + +.faq-item.open .faq-icon { + transform: rotate(45deg); + color: var(--black); +} + +.faq-answer { + max-height: 0; + overflow: hidden; + transition: max-height 0.4s cubic-bezier(0.4, 0, 0.2, 1), padding 0.3s ease; +} + +.faq-item.open .faq-answer { + max-height: 300px; +} + +.faq-answer p { + padding: 0 1.5rem 1.25rem; + color: var(--gray-600); + line-height: 1.7; + font-size: 0.9375rem; +} + +.faq-answer a { + color: var(--gray-800); + font-weight: 600; + text-decoration: underline; + text-underline-offset: 3px; +} + +.faq-answer a:hover { + color: var(--black); +} + +@media (max-width: 768px) { + .preview-badges { + flex-direction: column; + align-items: stretch; + } + + .browser-url span { + display: none; + } + + .faq-question { + font-size: 0.9375rem; + padding: 1rem 1.25rem; + } +} + +/* ============================================ + TYPING ANIMATION CURSOR + ============================================ */ +.typing-cursor { + display: inline-block; + font-weight: 300; + color: var(--gray-500); + margin-left: 1px; + vertical-align: baseline; + user-select: none; + animation: none; /* controlled via JS */ +} + +#heroTyping { + min-height: 3.4em; /* reserve space so layout doesn't jump */ +} \ No newline at end of file diff --git a/homepage/OPENDOT.jpg b/homepage/OPENDOT.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6099f625c22c79cdab11ec04228c96d8bb1b14f0 GIT binary patch literal 83020 zcmeFZWmH_vwl3T_1Shx$Nl38ZZXs9*5JGSb4o%azLnFZ*0wlN-+}(m(a0~9PjW*WY ze)rz*yZ1f&+;5zF@Av19aTdLL)aX@JYd*7TRn0k{xp@5jxC$V6C#xU}Kte(SxFP-k zj|%{4017hlA0Nbliuj;mqM@OpqCLUDK*z*+f`fzo1REO{kB9&lj}Q+Vn}C#n@F_6~ z2?-89896C2IT0}l@gJQap&;6zqG6$-VG-kE;}ZXGACEr)gqTRbQ8G}F7y!tGNGOCz zkKF(|000RMA?+Um|KmVHM#zYcfr<458&RQ_0Dz2yf`W{S@`u!j+TMuk08~OWqGw!E z=ucHYV=&kgbNj_+VKTm{>>&9#e#*pS?BI{}gp`b&f|B|93znC!c=`AR1cij9-^$3! z$t%25`=qX+sim!BVrph?VQFRU=;Z9;>gMhd@Fg%PI3zSIF8*smV$!$o$=Nx%dHDrD z3X7_$YijH28ycHBySjUN`}zk4Cnl$+XJ&uT&9AL*Y;JAu?C$MD&(1F{udZP?w}0S5 z0-*dI)?di}11>@YE@V_x6jY2qa3LYPB2E-SRJ3PY=tNSg7@zH*GI0B062FPfs_ejG zo$tX$<>qjZr(h1*%*b)*pxlrQey;MRL;u zY7`r&0|FZGFmET>H!ayV<9KTCd-RuoORUNK)+V{%zRDQ^Tc5PBpPs8hIlkvF50vfA zzu9*+AM6ylj^XPL0Bjh)Rv*AlWQ^Y%b~x{HHz^hW?j6hK_>gWnD)_7}nWM9R;P3Jk zepPiLmHtPMX2kk|F^_=1%ko`@?6au^;y$9=SNW=l`{Mt1i~rUYVm|y|&XR9P#sG>J znIwm&K7A787LykuE3h}V>vc2VKlUmV1aUFGUd*Z&{4Gxn?)60ITQ2fu_((2wd3xO1 z5Vu7s*X;mKFtkLuztBTxtt)ZZr?UM0n{N?@bZP`)N52@WVYdXDmqMl%_V1p=dK(U( zKGxlO1@}!A|F__3K_>K$O_~DKaYV1UI|8+|j-Kl0Yo%I>u7s1EsEGm2om8&B7^i#1 zRWD21F}>KKbdh{V0t!_Xamye%$lP|T8V&~$e{9qh`A_xd;T2UvhJSxjn(3Z;F+%Z! zCKVHm19WPpeuY~(=e*(Qk=pqi&tMlosxMoG3jgww=s&; z+$CbIcZ~bB<#zpt$`Q5_EqssUOs*Op8)ugN->Imfg*^3!q<0m`Un_Bc?3WtZl`w3 zHvFZS>|zP+bYjH$CbwG_Na$IAi_g|_z= zcdAlQ?;6X}woy+ouZ~u{%jZyaWS)%^5(8c8r$1LUHBY72>wU#(_BDkyLW>TrW;}9- z?OluZU9PSswEL*RTe;87?aoL)pC`WGAg9>a+UK@fQA8eJyu(&}s1SXbZ&^2Qq6
    ^tv5$Z>8; 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 literal 0 HcmV?d00001 diff --git a/homepage/home.html b/homepage/home.html new file mode 100644 index 0000000..4bd6619 --- /dev/null +++ b/homepage/home.html @@ -0,0 +1,685 @@ + + + + + + + OpenDots - Transform IoT Data Into Intelligence + + + + + + + + + +
    +
    +
    +
    +
    +
    + + + + + +
    +
    +
    +
    +
    +
    + ⚔ + Open Source • Real-Time • AI-Powered +
    +
    + +

    + Transform Your + IoT Data + Into Intelligence +

    + +

    + + + +
    +
    +
    šŸš€
    +
    +
    100%
    +
    Open Source
    +
    +
    +
    +
    +
    ⚔
    +
    +
    Real-Time
    +
    Data Streaming
    +
    +
    +
    +
    +
    šŸ¤–
    +
    +
    AI-Powered
    +
    Insights
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + Live Dashboard +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    const data = sensors.read();
    +
    if (data.temp > 25) {
    +
    alert.send("High temp");
    +
    }
    +
    +
    +
    + +
    +
    +
    +
    +
    + AI Analyzing... +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    + +

    + See OpenDots In Action +

    +

    + Real-time air quality monitoring with AI-powered insights — powered by OpenDots +

    +
    +
    +
    +
    +
    + + + +
    +
    + + multiverseweb.github.io/OpenDots +
    +
    + +
    +
    + +
    +
    +
    + šŸ“” +
    +
    Live Data
    +
    WebSocket streaming
    +
    +
    +
    + šŸ¤– +
    +
    Infinity AI
    +
    Chat-based insights
    +
    +
    +
    + šŸ“Š +
    +
    Multi-sensor
    +
    6+ chart types
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    + +

    + Powerful Tools for Your IoT Journey +

    +

    + Everything you need to collect, visualize, and analyze IoT data in one unified platform +

    +
    + +
    +
    +
    01
    +
    + + + + + + +
    +

    Customizable Dashboards

    +

    + Build pixel-perfect dashboards with drag-and-drop widgets. Flexible layouts, + real-time updates, and beautiful visualizations. +

    +
    +
    + +
    +
    02
    +
    + + + +
    +

    Real-Time Streaming

    +

    + WebSocket-powered live data streams. See sensor changes instantly with + zero latency and automatic reconnection. +

    +
    +
    + +
    +
    03
    +
    + + + + + +
    +

    AI-Powered Insights

    +

    + Ask questions in natural language. Get trends, anomalies, and predictions + powered by advanced AI models. +

    +
    +
    + +
    +
    04
    +
    + + + + + +
    +

    Platform Integration

    +

    + Seamlessly connect with ThingSpeak, Adafruit IO, Blynk, Grafana, and + any MQTT broker. Works with your existing setup. +

    +
    +
    + +
    +
    05
    +
    + + + + + + +
    +

    Share & Collaborate

    +

    + Create public project pages. Perfect for academic research, student projects, + and community monitoring initiatives. +

    +
    +
    + +
    +
    06
    +
    + + + + +
    +

    Camera Support

    +

    + Integrate live video feeds alongside sensor data. Monitor visual and + numerical data in perfect synchronization. +

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

    + Real-World Applications +

    +
    + +
    +
    +
    šŸŽ“
    +

    Academic Projects

    +

    + Student and research projects with easy data sharing and professional visualization +

    +
    + +
    +
    🌱
    +

    Environmental Monitoring

    +

    + Track air quality, weather patterns, and environmental data for communities +

    +
    + +
    +
    šŸ”¬
    +

    Research Data

    +

    + Real-time monitoring and analysis for scientific experiments and studies +

    +
    + +
    +
    šŸ 
    +

    Smart Systems

    +

    + Home automation, energy monitoring, and industrial IoT dashboards +

    +
    +
    +
    +
    + + +
    +
    +
    + +

    + Frequently Asked Questions +

    +

    + Everything you need to know about OpenDots +

    +
    +
    +
    + +
    +

    OpenDots is an open-source, integrated IoT data visualization and insight platform. It helps users turn raw sensor data into meaningful, real-time visuals and AI-powered insights. It is hardware-agnostic, data-first, and easy to extend.

    +
    +
    +
    + +
    +

    OpenDots integrates with ThingSpeak, Adafruit IO, Blynk, and Grafana out of the box. It also supports Arduino-based systems, MQTT brokers, and any platform that can send HTTP/WebSocket data.

    +
    +
    +
    + +
    +

    Yes! OpenDots is 100% open-source under the MIT License. You can use it freely for personal, academic, and commercial projects. Contributions from the community are always welcome.

    +
    +
    +
    + +
    +

    Infinity AI is OpenDots' built-in chat-based assistant. You can ask it natural-language questions about your sensor data — it provides trends, summaries, anomaly detection, and predictions based on your live data stream.

    +
    +
    +
    + +
    +

    The frontend is built with HTML, CSS, JavaScript, and React.js. The backend uses Node.js and Express.js with MongoDB for storage. Real-time communication is handled via WebSockets, and AI features are powered by Python and LLM integrations.

    +
    +
    +
    + +
    +

    Head over to the GitHub repository, fork the project, and submit a pull request. You can also open issues for bugs or feature requests. All contributors are credited on the project page.

    +
    +
    +
    + +
    +

    Yes! OpenDots supports live camera feed integration alongside sensor data, allowing you to monitor visual and numerical data in perfect synchronization on the same dashboard.

    +
    +
    +
    + +
    +

    Absolutely. OpenDots supports deployment on Vercel, Netlify, and standard cloud hosting. Check the documentation for step-by-step deployment guides including environment variable configuration and database setup.

    +
    +
    +
    +
    +
    + + +
    +
    +
    +

    Ready to Transform Your Data?

    +

    + Join developers and researchers building the future of IoT visualization +

    + +
    +
    + + + + + + + + + + \ No newline at end of file