diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz index e21ccef..4376ad6 100644 Binary files a/.yarn/install-state.gz and b/.yarn/install-state.gz differ diff --git a/astro.config.mjs b/astro.config.mjs index 63952dc..dafb14e 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -5,8 +5,8 @@ import tailwindcss from '@tailwindcss/vite'; // https://astro.build/config export default defineConfig({ server: { port: 9000 }, - site: 'https://jostvim.github.io', - base: '/jostvim.org', + site: 'https://luxvim.github.io', + base: '/luxvim.org', vite: { plugins: [tailwindcss()] } diff --git a/package.json b/package.json index 380db8f..3a11bc2 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "jostvim.org", + "name": "luxvim.org", "type": "module", "version": "0.0.1", "scripts": { diff --git a/src/components/Navbar.astro b/src/components/Navbar.astro index c477f7e..41ac75b 100644 --- a/src/components/Navbar.astro +++ b/src/components/Navbar.astro @@ -43,7 +43,7 @@ const { - JostVim + LuxVim diff --git a/src/components/ThemeToggle.astro b/src/components/ThemeToggle.astro index 9380e07..6f07a01 100644 --- a/src/components/ThemeToggle.astro +++ b/src/components/ThemeToggle.astro @@ -7,65 +7,58 @@ \ No newline at end of file + themeButton.addEventListener('click', toggleTheme); + themeButton.addEventListener('mouseleave', () => setTimeout(() => themeButton.blur(), 100)); + diff --git a/src/controllers/galaxy_controller.js b/src/controllers/galaxy_controller.js index 26e9a08..5c4c612 100644 --- a/src/controllers/galaxy_controller.js +++ b/src/controllers/galaxy_controller.js @@ -7,10 +7,19 @@ export default class extends Controller { connect() { // Initialize galaxy animation this.initializeGalaxy() - + // Handle window resize this.handleResize = this.handleResize.bind(this) window.addEventListener('resize', this.handleResize) + + // Handle theme changes + this.handleThemeChange = this.handleThemeChange.bind(this) + const observer = new MutationObserver(this.handleThemeChange) + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['class'] + }) + this.themeObserver = observer } disconnect() { @@ -18,31 +27,33 @@ export default class extends Controller { cancelAnimationFrame(this.animationId) } window.removeEventListener('resize', this.handleResize) + if (this.themeObserver) { + this.themeObserver.disconnect() + } } - - - initializeGalaxy() { - const canvas = document.getElementById('galaxy-canvas') + // Find canvas within this controller's scope + const canvas = this.element.querySelector('canvas') if (!canvas) return this.canvas = canvas this.ctx = canvas.getContext('2d') this.particles = [] this.mouse = { x: 0, y: 0 } - + this.time = 0 + this.resizeCanvas() this.createParticles() this.animate() - + // Add mouse interaction canvas.addEventListener('mousemove', (e) => { const rect = canvas.getBoundingClientRect() this.mouse.x = e.clientX - rect.left this.mouse.y = e.clientY - rect.top }) - + canvas.addEventListener('click', () => { this.addParticles(3) }) @@ -50,15 +61,15 @@ export default class extends Controller { resizeCanvas() { if (!this.canvas) return - + this.canvas.width = window.innerWidth this.canvas.height = window.innerHeight } createParticles() { - const particleCount = Math.floor((this.canvas.width * this.canvas.height) / 15000) + const particleCount = Math.floor((this.canvas.width * this.canvas.height) / 8000) this.particles = [] - + for (let i = 0; i < particleCount; i++) { this.particles.push(this.createParticle()) } @@ -66,20 +77,56 @@ export default class extends Controller { createParticle() { const isDark = document.documentElement.classList.contains('dark') - const colors = isDark - ? ['#ffffff', '#a855f7', '#ec4899', '#3b82f6', '#10b981'] - : ['#1f2937', '#7c3aed', '#be185d', '#1d4ed8', '#047857'] - + const colors = isDark + ? ['#ffffff', '#f8fafc', '#e2e8f0', '#cbd5e1', '#fbbf24', '#fde047'] + : ['#1e293b', '#334155', '#475569', '#64748b', '#0f172a', '#1e40af'] + + // Random distribution across the sky + const x = Math.random() * this.canvas.width + const y = Math.random() * this.canvas.height + + // Gentle drift motion + const driftSpeed = 0.1 + const driftAngle = Math.random() * Math.PI * 2 + const vx = Math.cos(driftAngle) * driftSpeed * (Math.random() - 0.5) + const vy = Math.sin(driftAngle) * driftSpeed * (Math.random() - 0.5) + + // Star characteristics - some are brighter/bigger than others + const brightness = Math.random() + const starType = Math.random() + let baseRadius, baseOpacity, twinkleSpeed + + if (starType < 0.1) { + // Bright stars (10%) + baseRadius = brightness * 2.5 + 1.5 + baseOpacity = isDark ? 0.9 : 0.8 + twinkleSpeed = 0.03 + } else if (starType < 0.3) { + // Medium stars (20%) + baseRadius = brightness * 1.5 + 0.8 + baseOpacity = isDark ? 0.7 : 0.6 + twinkleSpeed = 0.02 + } else { + // Dim stars (70%) + baseRadius = brightness * 0.8 + 0.3 + baseOpacity = isDark ? 0.4 : 0.3 + twinkleSpeed = 0.015 + } + return { - x: Math.random() * this.canvas.width, - y: Math.random() * this.canvas.height, - vx: (Math.random() - 0.5) * 0.5, - vy: (Math.random() - 0.5) * 0.5, - radius: Math.random() * 2 + 0.5, + x: x, + y: y, + vx: vx, + vy: vy, + radius: baseRadius, + baseRadius: baseRadius, color: colors[Math.floor(Math.random() * colors.length)], - opacity: isDark ? Math.random() * 0.8 + 0.2 : Math.random() * 0.9 + 0.4, - pulseSpeed: Math.random() * 0.02 + 0.01, - pulsePhase: Math.random() * Math.PI * 2 + opacity: baseOpacity * (0.7 + Math.random() * 0.3), + baseOpacity: baseOpacity * (0.7 + Math.random() * 0.3), + twinkleSpeed: twinkleSpeed + (Math.random() - 0.5) * 0.01, + twinklePhase: Math.random() * Math.PI * 2, + brightness: brightness, + starType: starType } } @@ -93,37 +140,86 @@ export default class extends Controller { } updateParticles() { + this.time += 0.01 + this.particles.forEach((particle, index) => { - // Update position + // Gentle drifting motion particle.x += particle.vx particle.y += particle.vy - - // Update pulse animation - particle.pulsePhase += particle.pulseSpeed - const pulseFactor = Math.sin(particle.pulsePhase) * 0.3 + 0.7 - particle.currentOpacity = particle.opacity * pulseFactor - - // Wrap around screen edges - if (particle.x < 0) particle.x = this.canvas.width - if (particle.x > this.canvas.width) particle.x = 0 - if (particle.y < 0) particle.y = this.canvas.height - if (particle.y > this.canvas.height) particle.y = 0 - - // Remove excess particles (keep performance good) - if (this.particles.length > 200 && Math.random() < 0.001) { - this.particles.splice(index, 1) + + // Subtle random movement for atmospheric effect + particle.x += (Math.random() - 0.5) * 0.05 + particle.y += (Math.random() - 0.5) * 0.05 + + // Twinkling effect + particle.twinklePhase += particle.twinkleSpeed + const twinkleFactor = Math.sin(particle.twinklePhase) * 0.3 + 0.7 + particle.currentOpacity = particle.baseOpacity * twinkleFactor + + // Size twinkling for brighter stars + if (particle.starType < 0.1) { + const sizeTwinkle = Math.sin(particle.twinklePhase * 0.7) * 0.3 + 1 + particle.radius = particle.baseRadius * sizeTwinkle + } else { + const sizeTwinkle = Math.sin(particle.twinklePhase * 0.5) * 0.1 + 1 + particle.radius = particle.baseRadius * sizeTwinkle + } + + // Wrap around screen edges for infinite sky feel + if (particle.x < -10) particle.x = this.canvas.width + 10 + if (particle.x > this.canvas.width + 10) particle.x = -10 + if (particle.y < -10) particle.y = this.canvas.height + 10 + if (particle.y > this.canvas.height + 10) particle.y = -10 + + // Occasionally change drift direction slightly + if (Math.random() < 0.001) { + particle.vx += (Math.random() - 0.5) * 0.02 + particle.vy += (Math.random() - 0.5) * 0.02 + // Keep drift speed reasonable + const speed = Math.sqrt(particle.vx * particle.vx + particle.vy * particle.vy) + if (speed > 0.2) { + particle.vx = (particle.vx / speed) * 0.2 + particle.vy = (particle.vy / speed) * 0.2 + } } }) } drawParticles() { - this.particles.forEach(particle => { + // Sort particles by brightness for proper layering + const sortedParticles = [...this.particles].sort((a, b) => a.brightness - b.brightness) + + sortedParticles.forEach(particle => { this.ctx.save() + + // Create glow effect for bright stars + if (particle.starType < 0.1) { + this.ctx.shadowColor = particle.color + this.ctx.shadowBlur = particle.radius * 4 + this.ctx.shadowOffsetX = 0 + this.ctx.shadowOffsetY = 0 + } else if (particle.starType < 0.3) { + this.ctx.shadowColor = particle.color + this.ctx.shadowBlur = particle.radius * 2 + this.ctx.shadowOffsetX = 0 + this.ctx.shadowOffsetY = 0 + } + this.ctx.globalAlpha = particle.currentOpacity this.ctx.fillStyle = particle.color this.ctx.beginPath() this.ctx.arc(particle.x, particle.y, particle.radius, 0, Math.PI * 2) this.ctx.fill() + + // Add bright center for prominent stars + if (particle.starType < 0.3) { + this.ctx.globalAlpha = particle.currentOpacity * 0.8 + this.ctx.fillStyle = '#ffffff' + this.ctx.beginPath() + this.ctx.arc(particle.x, particle.y, particle.radius * 0.4, 0, Math.PI * 2) + this.ctx.fill() + } + this.ctx.restore() }) } @@ -132,7 +228,7 @@ export default class extends Controller { const isDark = document.documentElement.classList.contains('dark') const connectionColor = isDark ? '#a855f7' : '#7c3aed' const maxDistance = 150 - + this.particles.forEach((particle, i) => { // Connect to nearby particles for (let j = i + 1; j < this.particles.length; j++) { @@ -140,9 +236,9 @@ export default class extends Controller { const dx = particle.x - other.x const dy = particle.y - other.y const distance = Math.sqrt(dx * dx + dy * dy) - + if (distance < maxDistance) { - const opacity = isDark + const opacity = isDark ? (1 - distance / maxDistance) * 0.2 : (1 - distance / maxDistance) * 0.4 this.ctx.save() @@ -156,14 +252,14 @@ export default class extends Controller { this.ctx.restore() } } - + // Connect to mouse const dx = particle.x - this.mouse.x const dy = particle.y - this.mouse.y const distance = Math.sqrt(dx * dx + dy * dy) - + if (distance < 100) { - const opacity = isDark + const opacity = isDark ? (1 - distance / 100) * 0.3 : (1 - distance / 100) * 0.6 this.ctx.save() @@ -181,11 +277,10 @@ export default class extends Controller { animate() { this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height) - + this.updateParticles() - this.drawConnections() this.drawParticles() - + this.animationId = requestAnimationFrame(() => this.animate()) } @@ -193,10 +288,10 @@ export default class extends Controller { // Update existing particles with new theme colors this.particles.forEach(particle => { const isDark = document.documentElement.classList.contains('dark') - const colors = isDark + const colors = isDark ? ['#ffffff', '#a855f7', '#ec4899', '#3b82f6', '#10b981'] : ['#1f2937', '#7c3aed', '#be185d', '#1d4ed8', '#047857'] - + particle.color = colors[Math.floor(Math.random() * colors.length)] particle.opacity = isDark ? Math.random() * 0.8 + 0.2 : Math.random() * 0.9 + 0.4 }) @@ -206,4 +301,9 @@ export default class extends Controller { this.resizeCanvas() this.createParticles() } + + handleThemeChange() { + // Update particle colors when theme changes + this.updateParticleColors() + } } \ No newline at end of file diff --git a/src/layouts/main.astro b/src/layouts/main.astro index 645eeb9..01e1656 100644 --- a/src/layouts/main.astro +++ b/src/layouts/main.astro @@ -14,8 +14,8 @@ export interface Props { const { title, - description = "JostVim", - keywords = "vim, neovim, jostvim, ide", + description = "LuxVim", + keywords = "vim, neovim, Luxvim, ide", githubUrl = "https://github.com/josstei/JoStVIM", showNavbar = true } = Astro.props; diff --git a/src/pages/docs.astro b/src/pages/docs.astro index 46f9479..4ccf216 100644 --- a/src/pages/docs.astro +++ b/src/pages/docs.astro @@ -3,9 +3,9 @@ import '../styles/global.css'; import Main from '../layouts/main.astro'; ---
\ No newline at end of file diff --git a/src/pages/donate.astro b/src/pages/donate.astro index 5e2c0cf..1db359c 100644 --- a/src/pages/donate.astro +++ b/src/pages/donate.astro @@ -3,9 +3,9 @@ import '../styles/global.css'; import Main from '../layouts/main.astro'; ---
\ No newline at end of file diff --git a/src/pages/index.astro b/src/pages/index.astro index 1ba2a98..41dcee2 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,30 +1,658 @@ --- -import '../styles/global.css'; -import Main from '../layouts/main.astro'; +import "../styles/global.css"; +import Main from "../layouts/main.astro"; --- -
-
+ +
-
+
- + -
+
+
- -
-

- JostVim Coming Soon + +
+ +
+ + + In Development + +
+ + +

+ + LuxVim +

-

- A lightweight, powerful Vim IDE for modern developers. + +

+ Fast setup, faster coding +

+ +

+ A tailored Vim/Neovim configuration that boosts productivity for + developers across languages and stacks. Rich plugins, sensible defaults, + and custom productivity tools designed for a seamless development + experience. +

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

+ Lightning Fast +

+

+ Optimized for speed +

+
+
+ +
+
+
+ + + +
+

+ Rich Plugins +

+

+ Curated ecosystem +

+
+
+ +
+
+
+ + + +
+

+ Customizable +

+

+ Tailored for you +

+
+
+
+
+

+ + +
+
+
+

+ Why Choose LuxVim? +

+

+ Built by developers, for developers. Every feature designed to boost + your productivity. +

+
+ +
+ +
+
+ + + +
+

+ Custom Dashboard +

+

+ Interactive start screen with ASCII logo and quick actions for new + files, recent files, and project search. +

+
+ + +
+
+ + + +
+

+ Unified Command Menu +

+

+ Comprehensive operations menu for files, projects, Git, and + development tasks with smart project detection. +

+
+ + +
+
+ + + + +
+

+ Environment Management +

+

+ Easy switching between development environments and configurations + with project-specific settings. +

+
+ + +
+
+ + + +
+

+ Integrated Terminal +

+

+ Lightweight terminal buffer management with quick toggle + functionality for seamless workflow. +

+
+ + +
+
+ + + +
+

+ Smart Commenting +

+

+ Intelligent comment/uncomment functionality that automatically + detects file types and applies appropriate syntax. +

+
+ + +
+
+ + + +
+

+ Beautiful Themes +

+

+ Choose from popular themes like Dracula, Gruvbox, Nord, and our + custom VoidPulse for optimal coding comfort. +

+
+
+
+
+ + +
+
+
+

+ Get Started in Minutes +

+

+ Simple installation process that doesn't interfere with your existing + Vim/Neovim setup. +

+
+ +
+ +
+
+
+ 1 +
+
+

+ Clone the Repository +

+

+ Download LuxVim to your local machine: +

+
+ git clone https://github.com/josstei/JoStVIM.git
+ cd LuxVIM +
+
+
+ +
+
+ 2 +
+
+

+ Run Installation +

+

+ The install script handles everything automatically: +

+
+ ./install.sh +
+
+
+ +
+
+ 3 +
+
+

+ Launch LuxVim +

+

+ Start coding with your new setup: +

+
+ Luxvim + # For Vim
+ Lux + # For Neovim +
+
+
+
+ + +
+

+ Requirements +

+
    +
  • + + + + Bash shell (Linux/macOS/WSL) +
  • +
  • + + + + Vim or Neovim (recent versions) +
  • +
  • + + + + curl for downloading plugins +
  • +
+ +
+

+ What the installer does: +

+
    +
  • • Downloads and installs vim-plug
  • +
  • • Installs all plugins automatically
  • +
  • • Adds convenient shell aliases
  • +
  • • Keeps your existing Vim config safe
  • +
+
+
+
+
+
+ + +
+ +
+ +
+ + +
+
+ +
+

+ Ready to Boost Your Productivity? +

+

+ Join developers who've already enhanced their Vim experience with + LuxVim's powerful, thoughtfully designed configuration.

+
-
-
\ No newline at end of file + + diff --git a/src/pages/markdown-page.md b/src/pages/markdown-page.md index 22b92f9..d699d38 100644 --- a/src/pages/markdown-page.md +++ b/src/pages/markdown-page.md @@ -8,7 +8,7 @@ layout: ../layouts/main.astro Tailwind classes also work in Markdown! Saving this for later!! Go home diff --git a/src/styles/global.css b/src/styles/global.css index 379bf94..41bd76d 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -1,12 +1,15 @@ @import 'tailwindcss'; +@config "../../tailwind.config.js"; + + /* Galaxy background styles */ -#galaxy-background { +#galaxy-background, #galaxy-background-cta { background: linear-gradient(135deg, #e0e7ff 0%, #c7d2fe 25%, #a5b4fc 50%, #8b5cf6 75%, #7c3aed 100%); transition: background 0.3s ease; } -.dark #galaxy-background { +.dark #galaxy-background, .dark #galaxy-background-cta { background: linear-gradient(135deg, #0f0f23 0%, #1a1a2e 50%, #16213e 100%); } @@ -116,4 +119,5 @@ nav { .animate-pulse { animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; -} \ No newline at end of file +} + diff --git a/yarn.lock b/yarn.lock index b6ea755..9e38693 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2654,21 +2654,6 @@ __metadata: languageName: node linkType: hard -"jostvim.org@workspace:.": - version: 0.0.0-use.local - resolution: "jostvim.org@workspace:." - dependencies: - "@astrojs/mdx": "npm:^4.3.0" - "@hotwired/stimulus": "npm:^3.2.2" - "@tailwindcss/vite": "npm:^4.1.3" - "@types/alpinejs": "npm:^3" - alpinejs: "npm:^3.14.9" - astro: "npm:^5.11.0" - particles.js: "npm:^2.0.0" - tailwindcss: "npm:^4.1.3" - languageName: unknown - linkType: soft - "js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" @@ -2825,6 +2810,21 @@ __metadata: languageName: node linkType: hard +"luxvim.org@workspace:.": + version: 0.0.0-use.local + resolution: "luxvim.org@workspace:." + dependencies: + "@astrojs/mdx": "npm:^4.3.0" + "@hotwired/stimulus": "npm:^3.2.2" + "@tailwindcss/vite": "npm:^4.1.3" + "@types/alpinejs": "npm:^3" + alpinejs: "npm:^3.14.9" + astro: "npm:^5.11.0" + particles.js: "npm:^2.0.0" + tailwindcss: "npm:^4.1.3" + languageName: unknown + linkType: soft + "magic-string@npm:^0.30.17": version: 0.30.17 resolution: "magic-string@npm:0.30.17"