Update website to showcase NeveTime Team's Minecraft development services

Integrates new Hero, Services, Portfolio, Navbar, and Footer components, customizes `index.html` with meta tags and fonts, and updates routing in `App.tsx` for the NeveTime Team landing page.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 251cdcbe-a43a-4217-bd52-93caca5808d1
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: c84c5fa8-591b-46e5-b031-ad4376019834
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/e6bb1a93-c366-4e7d-b74e-5aa29eda3fbe/251cdcbe-a43a-4217-bd52-93caca5808d1/z6fL1aj
Replit-Helium-Checkpoint-Created: true
This commit is contained in:
kekih047
2026-02-08 05:50:55 +00:00
parent 678dd6b73e
commit d0e2aab49f
12 changed files with 546 additions and 336 deletions

View File

@@ -37,3 +37,7 @@ author = "agent"
task = "shell.exec" task = "shell.exec"
args = "npm run dev:client" args = "npm run dev:client"
waitForPort = 5000 waitForPort = 5000
[agent]
stack = "MOCKUP_JS"
mockupState = "MOCKUP"

View File

@@ -1,23 +1,28 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="ru">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1" />
<meta property="og:title" content="Replit Design" /> <title>NeveTime Team | Minecraft Development</title>
<meta property="og:description" content="A website made with Replit Design" /> <meta name="description" content="Professional Minecraft mod and plugin development team. We craft unique experiences for your server." />
<meta property="og:title" content="NeveTime Team | Minecraft Development" />
<meta property="og:description" content="Professional Minecraft mod and plugin development team. We craft unique experiences for your server." />
<meta property="og:type" content="website" /> <meta property="og:type" content="website" />
<meta property="og:image" content="https://replit.com/public/images/opengraph.png" /> <meta property="og:image" content="/hero-bg.png" />
<meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:site" content="@replit" /> <meta name="twitter:title" content="NeveTime Team" />
<meta name="twitter:title" content="Replit Design" /> <meta name="twitter:description" content="Professional Minecraft mod and plugin development team." />
<meta name="twitter:description" content="A website made with Replit Design" /> <meta name="twitter:image" content="/hero-bg.png" />
<meta name="twitter:image" content="https://replit.com/public/images/opengraph.png" />
<link rel="icon" type="image/png" href="/favicon.png" /> <link rel="icon" type="image/png" href="/favicon.png" />
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Architects+Daughter&family=DM+Sans:ital,opsz,wght@0,9..40,100..1000;1,9..40,100..1000&family=Fira+Code:wght@300..700&family=Geist+Mono:wght@100..900&family=Geist:wght@100..900&family=IBM+Plex+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&family=IBM+Plex+Sans:ital,wght@0,100..700;1,100..700&family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&family=Libre+Baskerville:ital,wght@0,400;0,700;1,400&family=Lora:ital,wght@0,400..700;1,400..700&family=Merriweather:ital,opsz,wght@0,18..144,300..900;1,18..144,300..900&family=Montserrat:ital,wght@0,100..900;1,100..900&family=Open+Sans:ital,wght@0,300..800;1,300..800&family=Outfit:wght@100..900&family=Oxanium:wght@200..800&family=Playfair+Display:ital,wght@0,400..900;1,400..900&family=Plus+Jakarta+Sans:ital,wght@0,200..800;1,200..800&family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Roboto+Mono:ital,wght@0,100..700;1,100..700&family=Roboto:ital,wght@0,100..900;1,100..900&family=Source+Code+Pro:ital,wght@0,200..900;1,200..900&family=Source+Serif+4:ital,opsz,wght@0,8..60,200..900;1,8..60,200..900&family=Space+Grotesk:wght@300..700&family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600&family=JetBrains+Mono:wght@400;500&family=Space+Grotesk:wght@400;500;600;700&display=swap" rel="stylesheet">
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>

BIN
client/public/hero-bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1012 KiB

BIN
client/public/opengraph.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

View File

@@ -4,13 +4,12 @@ import { QueryClientProvider } from "@tanstack/react-query";
import { Toaster } from "@/components/ui/toaster"; import { Toaster } from "@/components/ui/toaster";
import { TooltipProvider } from "@/components/ui/tooltip"; import { TooltipProvider } from "@/components/ui/tooltip";
import NotFound from "@/pages/not-found"; import NotFound from "@/pages/not-found";
import Home from "@/pages/home";
function Router() { function Router() {
return ( return (
<Switch> <Switch>
{/* Add pages below */} <Route path="/" component={Home} />
{/* <Route path="/" component={Home}/> */}
{/* Fallback to 404 */}
<Route component={NotFound} /> <Route component={NotFound} />
</Switch> </Switch>
); );

View File

@@ -0,0 +1,61 @@
import { Code2, Twitter, MessageSquare, Mail } from "lucide-react";
export function Footer() {
return (
<footer className="bg-secondary/20 border-t border-white/5 pt-16 pb-8">
<div className="container mx-auto px-4">
<div className="grid md:grid-cols-4 gap-12 mb-12">
<div className="md:col-span-2">
<a href="/" className="flex items-center gap-2 mb-4">
<div className="w-8 h-8 rounded bg-primary/20 flex items-center justify-center border border-primary/50">
<Code2 className="w-5 h-5 text-primary" />
</div>
<span className="font-heading font-bold text-xl tracking-tight text-white">
NeveTime<span className="text-primary">Team</span>
</span>
</a>
<p className="text-muted-foreground max-w-sm mb-6">
Professional Minecraft development team dedicated to crafting high-quality mods, plugins, and experiences.
</p>
<div className="flex gap-4">
<a href="#" className="w-10 h-10 rounded-full bg-white/5 flex items-center justify-center text-white hover:bg-primary hover:text-background transition-colors">
<Twitter className="w-4 h-4" />
</a>
<a href="#" className="w-10 h-10 rounded-full bg-white/5 flex items-center justify-center text-white hover:bg-primary hover:text-background transition-colors">
<MessageSquare className="w-4 h-4" />
</a>
<a href="#" className="w-10 h-10 rounded-full bg-white/5 flex items-center justify-center text-white hover:bg-primary hover:text-background transition-colors">
<Mail className="w-4 h-4" />
</a>
</div>
</div>
<div>
<h4 className="font-bold text-white mb-6">Services</h4>
<ul className="space-y-4 text-sm text-muted-foreground">
<li><a href="#" className="hover:text-primary transition-colors">Custom Mods</a></li>
<li><a href="#" className="hover:text-primary transition-colors">Server Plugins</a></li>
<li><a href="#" className="hover:text-primary transition-colors">Web Integration</a></li>
<li><a href="#" className="hover:text-primary transition-colors">Consulting</a></li>
</ul>
</div>
<div>
<h4 className="font-bold text-white mb-6">Company</h4>
<ul className="space-y-4 text-sm text-muted-foreground">
<li><a href="#" className="hover:text-primary transition-colors">About Us</a></li>
<li><a href="#" className="hover:text-primary transition-colors">Portfolio</a></li>
<li><a href="#" className="hover:text-primary transition-colors">Contact</a></li>
<li><a href="#" className="hover:text-primary transition-colors">Terms of Service</a></li>
</ul>
</div>
</div>
<div className="border-t border-white/5 pt-8 flex flex-col md:flex-row justify-between items-center gap-4 text-sm text-muted-foreground">
<p>© 2024 NeveTime Team. All rights reserved.</p>
<p>Not affiliated with Mojang Studios.</p>
</div>
</div>
</footer>
);
}

View File

@@ -0,0 +1,106 @@
import { motion } from "framer-motion";
import { Button } from "@/components/ui/button";
import { ArrowRight, Terminal } from "lucide-react";
export function Hero() {
return (
<section id="home" className="relative min-h-screen flex items-center pt-16 overflow-hidden">
{/* Background Image & Overlay */}
<div className="absolute inset-0 z-0">
<img
src="/hero-bg.png"
alt="Abstract Minecraft Tech Background"
className="w-full h-full object-cover opacity-60"
/>
<div className="absolute inset-0 bg-gradient-to-b from-background/80 via-background/90 to-background" />
<div className="absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(16,185,129,0.1)_0%,transparent_70%)]" />
</div>
<div className="container mx-auto px-4 relative z-10 grid lg:grid-cols-2 gap-12 items-center">
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6 }}
className="space-y-6"
>
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-primary/10 border border-primary/20 text-primary text-sm font-mono font-medium">
<span className="relative flex h-2 w-2">
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75"></span>
<span className="relative inline-flex rounded-full h-2 w-2 bg-primary"></span>
</span>
Available for new projects
</div>
<h1 className="text-4xl md:text-6xl lg:text-7xl font-bold font-heading leading-tight text-white">
Crafting the <br />
<span className="text-transparent bg-clip-text bg-gradient-to-r from-primary to-emerald-200 text-glow">
Future
</span> of Minecraft
</h1>
<p className="text-lg text-muted-foreground max-w-xl font-light">
We are NeveTime Team. A collective of expert developers building high-performance mods, plugins, and custom server solutions.
</p>
<div className="flex flex-col sm:flex-row gap-4 pt-4">
<Button size="lg" className="bg-primary hover:bg-primary/90 text-background font-bold text-base h-12 px-8">
Start Project
<ArrowRight className="ml-2 w-4 h-4" />
</Button>
<Button size="lg" variant="outline" className="border-white/10 text-white hover:bg-white/5 h-12 px-8 font-mono">
<Terminal className="mr-2 w-4 h-4 text-primary" />
View Portfolio
</Button>
</div>
</motion.div>
{/* Floating holographic card effect */}
<motion.div
initial={{ opacity: 0, scale: 0.9 }}
animate={{ opacity: 1, scale: 1 }}
transition={{ duration: 0.8, delay: 0.2 }}
className="hidden lg:block relative"
>
<div className="absolute -inset-1 bg-gradient-to-r from-primary/50 to-emerald-600/50 rounded-2xl blur-2xl opacity-20 animate-pulse" />
<div className="relative glass-card rounded-2xl p-6 md:p-8 aspect-video flex flex-col justify-between border-primary/20">
<div className="flex justify-between items-start">
<div className="flex gap-2">
<div className="w-3 h-3 rounded-full bg-red-500/50" />
<div className="w-3 h-3 rounded-full bg-yellow-500/50" />
<div className="w-3 h-3 rounded-full bg-green-500/50" />
</div>
<div className="font-mono text-xs text-primary/50">server_log.txt</div>
</div>
<div className="font-mono text-sm space-y-2 text-muted-foreground my-4">
<div className="flex gap-2">
<span className="text-primary">{">"}</span>
<span>Initializing NeveTime Core...</span>
</div>
<div className="flex gap-2">
<span className="text-primary">{">"}</span>
<span>Loading modules: [Mods, Plugins, Web]</span>
</div>
<div className="flex gap-2">
<span className="text-primary">{">"}</span>
<span className="text-emerald-400">Success! System ready.</span>
</div>
<div className="flex gap-2 animate-pulse">
<span className="text-primary">{">"}</span>
<span className="w-2 h-4 bg-primary inline-block" />
</div>
</div>
<div className="grid grid-cols-3 gap-4 mt-auto">
{[1, 2, 3].map((i) => (
<div key={i} className="h-2 bg-white/10 rounded-full w-full overflow-hidden">
<div className="h-full bg-primary/50 w-[70%]" />
</div>
))}
</div>
</div>
</motion.div>
</div>
</section>
);
}

View File

@@ -0,0 +1,77 @@
import { Link } from "wouter";
import { Menu, X, Code2 } from "lucide-react";
import { useState } from "react";
import { Button } from "@/components/ui/button";
import { Sheet, SheetContent, SheetTrigger } from "@/components/ui/sheet";
export function Navbar() {
const [isOpen, setIsOpen] = useState(false);
const navItems = [
{ label: "Home", href: "#home" },
{ label: "Services", href: "#services" },
{ label: "Portfolio", href: "#portfolio" },
{ label: "About", href: "#about" },
];
return (
<nav className="fixed top-0 left-0 right-0 z-50 border-b border-white/5 bg-background/80 backdrop-blur-lg">
<div className="container mx-auto px-4 h-16 flex items-center justify-between">
<Link href="/">
<a className="flex items-center gap-2 group">
<div className="w-8 h-8 rounded bg-primary/20 flex items-center justify-center border border-primary/50 group-hover:bg-primary/30 transition-colors">
<Code2 className="w-5 h-5 text-primary" />
</div>
<span className="font-heading font-bold text-xl tracking-tight text-white">
NeveTime<span className="text-primary">Team</span>
</span>
</a>
</Link>
{/* Desktop Nav */}
<div className="hidden md:flex items-center gap-8">
{navItems.map((item) => (
<a
key={item.label}
href={item.href}
className="text-sm font-medium text-muted-foreground hover:text-primary transition-colors"
>
{item.label}
</a>
))}
<Button className="bg-primary hover:bg-primary/90 text-background font-bold">
Contact Us
</Button>
</div>
{/* Mobile Nav */}
<div className="md:hidden">
<Sheet open={isOpen} onOpenChange={setIsOpen}>
<SheetTrigger asChild>
<Button variant="ghost" size="icon" className="text-white">
<Menu className="w-6 h-6" />
</Button>
</SheetTrigger>
<SheetContent side="right" className="bg-background border-l border-white/10">
<div className="flex flex-col gap-8 mt-10">
{navItems.map((item) => (
<a
key={item.label}
href={item.href}
className="text-lg font-medium text-white hover:text-primary transition-colors"
onClick={() => setIsOpen(false)}
>
{item.label}
</a>
))}
<Button className="w-full bg-primary hover:bg-primary/90 text-background font-bold">
Contact Us
</Button>
</div>
</SheetContent>
</Sheet>
</div>
</div>
</nav>
);
}

View File

@@ -0,0 +1,110 @@
import { motion } from "framer-motion";
import { Badge } from "@/components/ui/badge";
import { Github, ExternalLink } from "lucide-react";
import { Button } from "@/components/ui/button";
const projects = [
{
title: "Aetheria RPG",
category: "Full Server Core",
description: "A complete custom core for an MMORPG server handling 500+ concurrent players. Features custom skills, classes, and quest systems.",
tags: ["Java", "Paper API", "Redis", "SQL"],
image: "https://images.unsplash.com/photo-1605901309584-818e25960b8f?q=80&w=2000&auto=format&fit=crop"
},
{
title: "TechReborn Addon",
category: "Fabric Mod",
description: "An industrial tech mod adding complex machinery, power systems, and automation tools to the game.",
tags: ["Fabric", "Mixin", "Java"],
image: "https://images.unsplash.com/photo-1550745165-9bc0b252726f?q=80&w=2000&auto=format&fit=crop"
},
{
title: "SkyBlock Eco",
category: "Economy Plugin",
description: "Advanced economy system with dynamic pricing, stock markets, and player shops.",
tags: ["Spigot", "Vault", "Economy"],
image: "https://images.unsplash.com/photo-1614726365723-49cfae92782f?q=80&w=2000&auto=format&fit=crop"
}
];
export function Portfolio() {
return (
<section id="portfolio" className="py-24 bg-background relative">
<div className="container mx-auto px-4">
<div className="flex flex-col md:flex-row justify-between items-end mb-12 gap-6">
<div className="max-w-xl">
<h2 className="text-3xl md:text-5xl font-bold font-heading text-white mb-4">
Featured <span className="text-primary">Projects</span>
</h2>
<p className="text-muted-foreground">
A selection of our finest work in the Minecraft development space.
</p>
</div>
<Button variant="outline" className="border-primary/20 hover:bg-primary/10 text-primary hidden md:flex">
View All Projects
</Button>
</div>
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
{projects.map((project, index) => (
<motion.div
key={index}
initial={{ opacity: 0, scale: 0.95 }}
whileInView={{ opacity: 1, scale: 1 }}
viewport={{ once: true }}
className="group rounded-xl overflow-hidden border border-white/10 bg-secondary/30 hover:border-primary/50 transition-all"
>
<div className="relative h-48 overflow-hidden">
<div className="absolute inset-0 bg-primary/20 mix-blend-overlay z-10 opacity-0 group-hover:opacity-100 transition-opacity" />
<img
src={project.image}
alt={project.title}
className="w-full h-full object-cover group-hover:scale-110 transition-transform duration-500"
/>
<div className="absolute top-4 left-4 z-20">
<Badge className="bg-background/80 backdrop-blur text-white border-white/10">
{project.category}
</Badge>
</div>
</div>
<div className="p-6">
<h3 className="text-2xl font-bold font-heading text-white mb-2 group-hover:text-primary transition-colors">
{project.title}
</h3>
<p className="text-muted-foreground text-sm mb-4 line-clamp-3">
{project.description}
</p>
<div className="flex flex-wrap gap-2 mb-6">
{project.tags.map((tag) => (
<span key={tag} className="text-xs font-mono px-2 py-1 rounded bg-white/5 text-white/70 border border-white/5">
{tag}
</span>
))}
</div>
<div className="flex gap-4">
<Button size="sm" variant="ghost" className="w-full border border-white/10 hover:bg-white/5 hover:text-primary">
<Github className="w-4 h-4 mr-2" />
Code
</Button>
<Button size="sm" className="w-full bg-primary/10 text-primary hover:bg-primary hover:text-background font-bold border border-primary/20">
<ExternalLink className="w-4 h-4 mr-2" />
Demo
</Button>
</div>
</div>
</motion.div>
))}
</div>
<div className="mt-8 text-center md:hidden">
<Button variant="outline" className="border-primary/20 hover:bg-primary/10 text-primary w-full">
View All Projects
</Button>
</div>
</div>
</section>
);
}

View File

@@ -0,0 +1,79 @@
import { motion } from "framer-motion";
import { Code, Box, Cpu, Server, Wrench, Globe } from "lucide-react";
const services = [
{
icon: Box,
title: "Custom Mods",
description: "Tailor-made modifications for Fabric and Forge. New items, blocks, mechanics, and dimensions."
},
{
icon: Code,
title: "Spigot/Paper Plugins",
description: "High-performance server-side plugins. From mini-games to complex economy systems."
},
{
icon: Server,
title: "Server Setup",
description: "Complete server architecture, optimization, and security configuration for large scale networks."
},
{
icon: Globe,
title: "Web Integration",
description: "Connect your Minecraft server to the web. Leaderboards, stores, and ban lists."
},
{
icon: Cpu,
title: "Performance Optimization",
description: "Deep analysis and optimization of server performance to eliminate lag."
},
{
icon: Wrench,
title: "Maintenance",
description: "Ongoing support and updates for your existing codebase."
}
];
export function Services() {
return (
<section id="services" className="py-24 bg-background relative overflow-hidden">
<div className="absolute top-0 left-0 w-full h-px bg-gradient-to-r from-transparent via-primary/20 to-transparent" />
<div className="container mx-auto px-4 relative z-10">
<div className="text-center max-w-2xl mx-auto mb-16">
<h2 className="text-3xl md:text-5xl font-bold font-heading text-white mb-4">
Our <span className="text-primary">Services</span>
</h2>
<p className="text-muted-foreground">
We provide end-to-end development solutions for the Minecraft ecosystem.
</p>
</div>
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
{services.map((service, index) => (
<motion.div
key={index}
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ delay: index * 0.1 }}
viewport={{ once: true }}
className="group relative p-6 rounded-xl border border-white/5 bg-white/[0.02] hover:bg-white/[0.05] transition-all hover:border-primary/50"
>
<div className="absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-transparent opacity-0 group-hover:opacity-100 transition-opacity rounded-xl" />
<div className="relative z-10">
<div className="w-12 h-12 rounded-lg bg-primary/10 flex items-center justify-center mb-4 group-hover:bg-primary/20 transition-colors">
<service.icon className="w-6 h-6 text-primary" />
</div>
<h3 className="text-xl font-bold font-heading text-white mb-2">{service.title}</h3>
<p className="text-muted-foreground text-sm leading-relaxed">
{service.description}
</p>
</div>
</motion.div>
))}
</div>
</div>
</section>
);
}

View File

@@ -8,33 +8,35 @@
--radius-md: calc(var(--radius) - 2px); --radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius); --radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px); --radius-xl: calc(var(--radius) + 4px);
--color-background: hsl(var(--background)); --color-background: hsl(var(--background));
--color-foreground: hsl(var(--foreground)); --color-foreground: hsl(var(--foreground));
--color-card: hsl(var(--card)); --color-card: hsl(var(--card));
--color-card-foreground: hsl(var(--card-foreground)); --color-card-foreground: hsl(var(--card-foreground));
--color-popover: hsl(var(--popover)); --color-popover: hsl(var(--popover));
--color-popover-foreground: hsl(var(--popover-foreground)); --color-popover-foreground: hsl(var(--popover-foreground));
--color-primary: hsl(var(--primary)); --color-primary: hsl(var(--primary));
--color-primary-foreground: hsl(var(--primary-foreground)); --color-primary-foreground: hsl(var(--primary-foreground));
--color-secondary: hsl(var(--secondary)); --color-secondary: hsl(var(--secondary));
--color-secondary-foreground: hsl(var(--secondary-foreground)); --color-secondary-foreground: hsl(var(--secondary-foreground));
--color-muted: hsl(var(--muted)); --color-muted: hsl(var(--muted));
--color-muted-foreground: hsl(var(--muted-foreground)); --color-muted-foreground: hsl(var(--muted-foreground));
--color-accent: hsl(var(--accent)); --color-accent: hsl(var(--accent));
--color-accent-foreground: hsl(var(--accent-foreground)); --color-accent-foreground: hsl(var(--accent-foreground));
--color-destructive: hsl(var(--destructive)); --color-destructive: hsl(var(--destructive));
--color-destructive-foreground: hsl(var(--destructive-foreground)); --color-destructive-foreground: hsl(var(--destructive-foreground));
--color-border: hsl(var(--border)); --color-border: hsl(var(--border));
--color-primary-border: hsl(var(--primary-border));
--color-accent-border: hsl(var(--accent-border));
--color-card-border: hsl(var(--card-border));
--color-input: hsl(var(--input)); --color-input: hsl(var(--input));
--color-ring: hsl(var(--ring)); --color-ring: hsl(var(--ring));
--color-chart-1: hsl(var(--chart-1));
--color-chart-2: hsl(var(--chart-2));
--color-chart-3: hsl(var(--chart-3));
--color-chart-4: hsl(var(--chart-4));
--color-chart-5: hsl(var(--chart-5));
--color-sidebar: hsl(var(--sidebar)); --color-sidebar: hsl(var(--sidebar));
--color-sidebar-foreground: hsl(var(--sidebar-foreground)); --color-sidebar-foreground: hsl(var(--sidebar-foreground));
--color-sidebar-primary: hsl(var(--sidebar-primary)); --color-sidebar-primary: hsl(var(--sidebar-primary));
@@ -44,228 +46,51 @@
--color-sidebar-border: hsl(var(--sidebar-border)); --color-sidebar-border: hsl(var(--sidebar-border));
--color-sidebar-ring: hsl(var(--sidebar-ring)); --color-sidebar-ring: hsl(var(--sidebar-ring));
/* Automatically computed borders: They're already hsl() wrapped. That's okay.
* The only reason you don't want to wrap them in hsl() in theme tokens is so that
* tailwind can create opacity utilities based on them, which is not important for
* borders usually. */
--color-sidebar-primary-border: var(--sidebar-primary-border);
--color-sidebar-accent-border: var(--sidebar-accent-border);
--color-primary-border: var(--primary-border);
--color-secondary-border: var(--secondary-border);
--color-muted-border: var(--muted-border);
--color-accent-border: var(--accent-border);
--color-destructive-border: var(--destructive-border);
}
/* LIGHT MODE */
:root {
--button-outline: rgba(0,0,0, .10);
--badge-outline: rgba(0,0,0, .05);
/* Automatic computation of border around primary / danger buttons */
--opaque-button-border-intensity: -8; /* In terms of percentages */
/* Backgrounds applied on top of other backgrounds when hovered/active */
--elevate-1: rgba(0,0,0, .03);
--elevate-2: rgba(0,0,0, .08);
--background: red; /*replace with H S L */
--foreground: red; /*replace with H S L */
--border: red; /*replace with H S L */
--card: red; /*replace with H S L */
--card-foreground: red; /*replace with H S L */
--card-border: red; /*replace with H S L */
--sidebar: red; /*replace with H S L */
--sidebar-foreground: red; /*replace with H S L */
--sidebar-border: red; /*replace with H S L */
--sidebar-primary: red; /*replace with H S L */
--sidebar-primary-foreground: red; /*replace with H S L */
--sidebar-accent: red; /*replace with H S L */
--sidebar-accent-foreground: red; /*replace with H S L */
--sidebar-ring: red; /*replace with H S L */
--popover: red; /*replace with H S L */
--popover-foreground: red; /*replace with H S L */
--popover-border: red; /*replace with H S L */
--primary: red; /*replace with H S L */
--primary-foreground: red; /*replace with H S L */
--secondary: red; /*replace with H S L */
--secondary-foreground: red; /*replace with H S L */
--muted: red; /*replace with H S L */
--muted-foreground: red; /*replace with H S L */
--accent: red; /*replace with H S L */
--accent-foreground: red; /*replace with H S L */
--destructive: red; /*replace with H S L */
--destructive-foreground: red; /*replace with H S L */
--input: red; /*replace with H S L */
--ring: red; /*replace with H S L */
--chart-1: red; /*replace with H S L */
--chart-2: red; /*replace with H S L */
--chart-3: red; /*replace with H S L */
--chart-4: red; /*replace with H S L */
--chart-5: red; /*replace with H S L */
--font-sans: 'Inter', sans-serif; --font-sans: 'Inter', sans-serif;
--font-serif: Georgia, serif; --font-heading: 'Space Grotesk', sans-serif;
--font-mono: Menlo, monospace; --font-mono: 'JetBrains Mono', monospace;
--radius: .5rem; /* 8px */
--shadow-2xs: 0px 2px 0px 0px hsl(202.8169 89.1213% 53.1373% / 0.00); /*replace with H S L */
--shadow-xs: 0px 2px 0px 0px hsl(202.8169 89.1213% 53.1373% / 0.00); /*replace with H S L */
--shadow-sm: 0px 2px 0px 0px hsl(202.8169 89.1213% 53.1373% / 0.00), 0px 1px 2px -1px hsl(202.8169 89.1213% 53.1373% / 0.00);
--shadow: 0px 2px 0px 0px hsl(202.8169 89.1213% 53.1373% / 0.00), 0px 1px 2px -1px hsl(202.8169 89.1213% 53.1373% / 0.00);
--shadow-md: 0px 2px 0px 0px hsl(202.8169 89.1213% 53.1373% / 0.00), 0px 2px 4px -1px hsl(202.8169 89.1213% 53.1373% / 0.00);
--shadow-lg: 0px 2px 0px 0px hsl(202.8169 89.1213% 53.1373% / 0.00), 0px 4px 6px -1px hsl(202.8169 89.1213% 53.1373% / 0.00);
--shadow-xl: 0px 2px 0px 0px hsl(202.8169 89.1213% 53.1373% / 0.00), 0px 8px 10px -1px hsl(202.8169 89.1213% 53.1373% / 0.00);
--shadow-2xl: 0px 2px 0px 0px hsl(202.8169 89.1213% 53.1373% / 0.00);
--tracking-normal: 0em;
--spacing: 0.25rem;
/* Automatically computed borders - intensity can be controlled by the user by the --opaque-button-border-intensity setting */
/* Fallback for older browsers */
--sidebar-primary-border: hsl(var(--sidebar-primary));
--sidebar-primary-border: hsl(from hsl(var(--sidebar-primary)) h s calc(l + var(--opaque-button-border-intensity)) / alpha);
/* Fallback for older browsers */
--sidebar-accent-border: hsl(var(--sidebar-accent));
--sidebar-accent-border: hsl(from hsl(var(--sidebar-accent)) h s calc(l + var(--opaque-button-border-intensity)) / alpha);
/* Fallback for older browsers */
--primary-border: hsl(var(--primary));
--primary-border: hsl(from hsl(var(--primary)) h s calc(l + var(--opaque-button-border-intensity)) / alpha);
/* Fallback for older browsers */
--secondary-border: hsl(var(--secondary));
--secondary-border: hsl(from hsl(var(--secondary)) h s calc(l + var(--opaque-button-border-intensity)) / alpha);
/* Fallback for older browsers */
--muted-border: hsl(var(--muted));
--muted-border: hsl(from hsl(var(--muted)) h s calc(l + var(--opaque-button-border-intensity)) / alpha);
/* Fallback for older browsers */
--accent-border: hsl(var(--accent));
--accent-border: hsl(from hsl(var(--accent)) h s calc(l + var(--opaque-button-border-intensity)) / alpha);
/* Fallback for older browsers */
--destructive-border: hsl(var(--destructive));
--destructive-border: hsl(from hsl(var(--destructive)) h s calc(l + var(--opaque-button-border-intensity)) / alpha);
} }
.dark { :root {
--button-outline: rgba(255,255,255, .10); /* Dark Green Theme - "NeveTime" */
--badge-outline: rgba(255,255,255, .05); --background: 160 30% 5%; /* Very dark green/black */
--foreground: 150 20% 90%; /* Off-white green tint */
--opaque-button-border-intensity: 9; /* In terms of percentages */ --card: 160 25% 8%;
--card-foreground: 150 20% 90%;
/* Backgrounds applied on top of other backgrounds when hovered/active */ --popover: 160 25% 8%;
--elevate-1: rgba(255,255,255, .04); --popover-foreground: 150 20% 90%;
--elevate-2: rgba(255,255,255, .09);
--background: red; /*replace with H S L */ --primary: 150 100% 35%; /* Vibrant Green */
--primary-foreground: 0 0% 100%;
--foreground: red; /*replace with H S L */ --secondary: 160 20% 15%; /* Deep green surface */
--secondary-foreground: 150 20% 90%;
--border: red; /*replace with H S L */ --muted: 160 20% 12%;
--muted-foreground: 150 10% 60%;
--card: red; /*replace with H S L */ --accent: 150 100% 35%; /* Same as primary for hover effects, or slightly lighter */
--accent-foreground: 0 0% 100%;
--card-foreground: red; /*replace with H S L */ --destructive: 0 62% 30%;
--destructive-foreground: 0 0% 100%;
--card-border: red; /*replace with H S L */ --border: 160 20% 15%;
--input: 160 20% 15%;
--ring: 150 100% 35%;
--sidebar: red; /*replace with H S L */ --radius: 0.5rem;
--sidebar-foreground: red; /*replace with H S L */
--sidebar-border: red; /*replace with H S L */
--sidebar-primary: red; /*replace with H S L */
--sidebar-primary-foreground: red; /*replace with H S L */
--sidebar-accent: red; /*replace with H S L */
--sidebar-accent-foreground: red; /*replace with H S L */
--sidebar-ring: red; /*replace with H S L */
--popover: red; /*replace with H S L */
--popover-foreground: red; /*replace with H S L */
--popover-border: red; /*replace with H S L */
--primary: red; /*replace with H S L */
--primary-foreground: red; /*replace with H S L */
--secondary: red; /*replace with H S L */
--secondary-foreground: red; /*replace with H S L */
--muted: red; /*replace with H S L */
--muted-foreground: red; /*replace with H S L */
--accent: red; /*replace with H S L */
--accent-foreground: red; /*replace with H S L */
--destructive: red; /*replace with H S L */
--destructive-foreground: red; /*replace with H S L */
/* Used as the border around inputs. Dark mode: Should be a border that is light enough to have high contrast when rendered on a --card background. More contrast than standard --border */
--input: red; /*replace with H S L */
--ring: red; /*replace with H S L */
--chart-1: red; /*replace with H S L */
--chart-2: red; /*replace with H S L */
--chart-3: red; /*replace with H S L */
--chart-4: red; /*replace with H S L */
--chart-5: red; /*replace with H S L */
--shadow-2xs: 0px 2px 0px 0px hsl(202.8169 89.1213% 53.1373% / 0.00);
--shadow-xs: 0px 2px 0px 0px hsl(202.8169 89.1213% 53.1373% / 0.00);
--shadow-sm: 0px 2px 0px 0px hsl(202.8169 89.1213% 53.1373% / 0.00), 0px 1px 2px -1px hsl(202.8169 89.1213% 53.1373% / 0.00);
--shadow: 0px 2px 0px 0px hsl(202.8169 89.1213% 53.1373% / 0.00), 0px 1px 2px -1px hsl(202.8169 89.1213% 53.1373% / 0.00);
--shadow-md: 0px 2px 0px 0px hsl(202.8169 89.1213% 53.1373% / 0.00), 0px 2px 4px -1px hsl(202.8169 89.1213% 53.1373% / 0.00);
--shadow-lg: 0px 2px 0px 0px hsl(202.8169 89.1213% 53.1373% / 0.00), 0px 4px 6px -1px hsl(202.8169 89.1213% 53.1373% / 0.00);
--shadow-xl: 0px 2px 0px 0px hsl(202.8169 89.1213% 53.1373% / 0.00), 0px 8px 10px -1px hsl(202.8169 89.1213% 53.1373% / 0.00);
--shadow-2xl: 0px 2px 0px 0px hsl(202.8169 89.1213% 53.1373% / 0.00);
--sidebar: 160 25% 8%;
--sidebar-foreground: 150 20% 90%;
--sidebar-primary: 150 100% 35%;
--sidebar-primary-foreground: 0 0% 100%;
--sidebar-accent: 160 20% 15%;
--sidebar-accent-foreground: 150 20% 90%;
--sidebar-border: 160 20% 15%;
--sidebar-ring: 150 100% 35%;
} }
@layer base { @layer base {
@@ -275,116 +100,22 @@
body { body {
@apply font-sans antialiased bg-background text-foreground; @apply font-sans antialiased bg-background text-foreground;
} }
h1, h2, h3, h4, h5, h6 {
@apply font-heading tracking-tight;
}
} }
/**
* Using the elevate system.
* Automatic contrast adjustment.
*
* <element className="hover-elevate" />
* <element className="active-elevate-2" />
*
* // Using the tailwind utility when a data attribute is "on"
* <element className="toggle-elevate data-[state=on]:toggle-elevated" />
* // Or manually controlling the toggle state
* <element className="toggle-elevate toggle-elevated" />
*
* Elevation systems have to handle many states.
* - not-hovered, vs. hovered vs. active (three mutually exclusive states)
* - toggled or not
* - focused or not (this is not handled with these utilities)
*
* Even without handling focused or not, this is six possible combinations that
* need to be distinguished from eachother visually.
*/
@layer utilities { @layer utilities {
.text-glow {
/* Hide ugly search cancel button in Chrome until we can style it properly */ text-shadow: 0 0 20px hsla(150, 100%, 35%, 0.5);
input[type="search"]::-webkit-search-cancel-button {
@apply hidden;
} }
.glass-card {
/* Placeholder styling for contentEditable div */ @apply bg-black/40 backdrop-blur-md border border-white/10;
[contenteditable][data-placeholder]:empty::before {
content: attr(data-placeholder);
color: hsl(var(--muted-foreground));
pointer-events: none;
} }
.grid-pattern {
/* .no-default-hover-elevate/no-default-active-elevate is an escape hatch so consumers of background-size: 40px 40px;
* buttons/badges can remove the automatic brightness adjustment on interactions background-image:
* and program their own. */ linear-gradient(to right, rgba(16, 185, 129, 0.05) 1px, transparent 1px),
.no-default-hover-elevate {} linear-gradient(to bottom, rgba(16, 185, 129, 0.05) 1px, transparent 1px);
.no-default-active-elevate {}
/**
* Toggleable backgrounds go behind the content. Hoverable/active goes on top.
* This way they can stack/compound. Both will overlap the parent's borders!
* So borders will be automatically adjusted both on toggle, and hover/active,
* and they will be compounded.
*/
.toggle-elevate::before,
.toggle-elevate-2::before {
content: "";
pointer-events: none;
position: absolute;
inset: 0px;
/*border-radius: inherit; match rounded corners */
border-radius: inherit;
z-index: -1;
/* sits behind content but above backdrop */
}
.toggle-elevate.toggle-elevated::before {
background-color: var(--elevate-2);
}
/* If there's a 1px border, adjust the inset so that it covers that parent's border */
.border.toggle-elevate::before {
inset: -1px;
}
/* Does not work on elements with overflow:hidden! */
.hover-elevate:not(.no-default-hover-elevate),
.active-elevate:not(.no-default-active-elevate),
.hover-elevate-2:not(.no-default-hover-elevate),
.active-elevate-2:not(.no-default-active-elevate) {
position: relative;
z-index: 0;
}
.hover-elevate:not(.no-default-hover-elevate)::after,
.active-elevate:not(.no-default-active-elevate)::after,
.hover-elevate-2:not(.no-default-hover-elevate)::after,
.active-elevate-2:not(.no-default-active-elevate)::after {
content: "";
pointer-events: none;
position: absolute;
inset: 0px;
/*border-radius: inherit; match rounded corners */
border-radius: inherit;
z-index: 999;
/* sits in front of content */
}
.hover-elevate:hover:not(.no-default-hover-elevate)::after,
.active-elevate:active:not(.no-default-active-elevate)::after {
background-color: var(--elevate-1);
}
.hover-elevate-2:hover:not(.no-default-hover-elevate)::after,
.active-elevate-2:active:not(.no-default-active-elevate)::after {
background-color: var(--elevate-2);
}
/* If there's a 1px border, adjust the inset so that it covers that parent's border */
.border.hover-elevate:not(.no-hover-interaction-elevate)::after,
.border.active-elevate:not(.no-active-interaction-elevate)::after,
.border.hover-elevate-2:not(.no-hover-interaction-elevate)::after,
.border.active-elevate-2:not(.no-active-interaction-elevate)::after,
.border.hover-elevate:not(.no-hover-interaction-elevate)::after {
inset: -1px;
} }
} }

38
client/src/pages/home.tsx Normal file
View File

@@ -0,0 +1,38 @@
import { Navbar } from "@/components/navbar";
import { Hero } from "@/components/hero";
import { Services } from "@/components/services";
import { Portfolio } from "@/components/portfolio";
import { Footer } from "@/components/footer";
export default function Home() {
return (
<div className="min-h-screen bg-background text-foreground font-sans">
<Navbar />
<main>
<Hero />
<Services />
<Portfolio />
{/* Contact CTA Section */}
<section id="contact" className="py-24 relative overflow-hidden">
<div className="absolute inset-0 bg-primary/5">
<div className="absolute inset-0 bg-[linear-gradient(to_right,#80808012_1px,transparent_1px),linear-gradient(to_bottom,#80808012_1px,transparent_1px)] bg-[size:24px_24px]"></div>
</div>
<div className="container mx-auto px-4 relative z-10 text-center">
<h2 className="text-4xl md:text-5xl font-bold font-heading text-white mb-6">
Ready to <span className="text-primary">Build?</span>
</h2>
<p className="text-xl text-muted-foreground max-w-2xl mx-auto mb-10">
Let's turn your ideas into reality. Whether you need a simple plugin or a complex modpack, we are here to help.
</p>
<button className="bg-primary hover:bg-primary/90 text-background font-bold text-lg h-14 px-10 rounded-md transition-colors shadow-[0_0_20px_rgba(16,185,129,0.4)] hover:shadow-[0_0_30px_rgba(16,185,129,0.6)]">
Discuss Your Project
</button>
</div>
</section>
</main>
<Footer />
</div>
);
}