Compare commits
1 Commits
main
...
2025-10-12
| Author | SHA1 | Date | |
|---|---|---|---|
| 9543cca413 |
@ -1,53 +1,53 @@
|
|||||||
@import "tailwindcss";
|
@import "tailwindcss";
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--background: 0 0% 100%;
|
--background: 0 0% 0%;
|
||||||
--foreground: 0 0% 3.9%;
|
|
||||||
--card: 0 0% 100%;
|
|
||||||
--card-foreground: 0 0% 3.9%;
|
|
||||||
--popover: 0 0% 100%;
|
|
||||||
--popover-foreground: 0 0% 3.9%;
|
|
||||||
--primary: 0 0% 9%;
|
|
||||||
--primary-foreground: 0 0% 98%;
|
|
||||||
--secondary: 0 0% 96.1%;
|
|
||||||
--secondary-foreground: 0 0% 9%;
|
|
||||||
--muted: 0 0% 96.1%;
|
|
||||||
--muted-foreground: 0 0% 45.1%;
|
|
||||||
--accent: 0 0% 96.1%;
|
|
||||||
--accent-foreground: 0 0% 9%;
|
|
||||||
--destructive: 0 84.2% 60.2%;
|
|
||||||
--destructive-foreground: 0 0% 98%;
|
|
||||||
--border: 0 0% 89.8%;
|
|
||||||
--input: 0 0% 89.8%;
|
|
||||||
--ring: 0 0% 3.9%;
|
|
||||||
--chart-1: 12 76% 61%;
|
|
||||||
--chart-2: 173 58% 39%;
|
|
||||||
--chart-3: 197 37% 24%;
|
|
||||||
--chart-4: 43 74% 66%;
|
|
||||||
--chart-5: 27 87% 67%;
|
|
||||||
--radius: 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dark {
|
|
||||||
--background: 0 0% 3.9%;
|
|
||||||
--foreground: 0 0% 98%;
|
--foreground: 0 0% 98%;
|
||||||
--card: 0 0% 3.9%;
|
--card: 0 0% 3.9%;
|
||||||
--card-foreground: 0 0% 98%;
|
--card-foreground: 0 0% 98%;
|
||||||
--popover: 0 0% 3.9%;
|
--popover: 0 0% 3.9%;
|
||||||
--popover-foreground: 0 0% 98%;
|
--popover-foreground: 0 0% 98%;
|
||||||
--primary: 0 0% 98%;
|
--primary: 188 100% 50%;
|
||||||
--primary-foreground: 0 0% 9%;
|
--primary-foreground: 0 0% 9%;
|
||||||
--secondary: 0 0% 14.9%;
|
--secondary: 0 0% 14.9%;
|
||||||
--secondary-foreground: 0 0% 98%;
|
--secondary-foreground: 0 0% 98%;
|
||||||
--muted: 0 0% 14.9%;
|
--muted: 0 0% 14.9%;
|
||||||
--muted-foreground: 0 0% 63.9%;
|
--muted-foreground: 0 0% 63.9%;
|
||||||
--accent: 0 0% 14.9%;
|
--accent: 188 100% 50%;
|
||||||
--accent-foreground: 0 0% 98%;
|
--accent-foreground: 0 0% 9%;
|
||||||
--destructive: 0 62.8% 30.6%;
|
--destructive: 0 62.8% 30.6%;
|
||||||
--destructive-foreground: 0 0% 98%;
|
--destructive-foreground: 0 0% 98%;
|
||||||
--border: 0 0% 14.9%;
|
--border: 0 0% 14.9%;
|
||||||
--input: 0 0% 14.9%;
|
--input: 0 0% 14.9%;
|
||||||
--ring: 0 0% 83.1%;
|
--ring: 188 100% 50%;
|
||||||
|
--chart-1: 220 70% 50%;
|
||||||
|
--chart-2: 160 60% 45%;
|
||||||
|
--chart-3: 30 80% 55%;
|
||||||
|
--chart-4: 280 65% 60%;
|
||||||
|
--chart-5: 340 75% 55%;
|
||||||
|
--radius: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark {
|
||||||
|
--background: 0 0% 0%;
|
||||||
|
--foreground: 0 0% 98%;
|
||||||
|
--card: 0 0% 3.9%;
|
||||||
|
--card-foreground: 0 0% 98%;
|
||||||
|
--popover: 0 0% 3.9%;
|
||||||
|
--popover-foreground: 0 0% 98%;
|
||||||
|
--primary: 188 100% 50%;
|
||||||
|
--primary-foreground: 0 0% 9%;
|
||||||
|
--secondary: 0 0% 14.9%;
|
||||||
|
--secondary-foreground: 0 0% 98%;
|
||||||
|
--muted: 0 0% 14.9%;
|
||||||
|
--muted-foreground: 0 0% 63.9%;
|
||||||
|
--accent: 188 100% 50%;
|
||||||
|
--accent-foreground: 0 0% 9%;
|
||||||
|
--destructive: 0 62.8% 30.6%;
|
||||||
|
--destructive-foreground: 0 0% 98%;
|
||||||
|
--border: 0 0% 14.9%;
|
||||||
|
--input: 0 0% 14.9%;
|
||||||
|
--ring: 188 100% 50%;
|
||||||
--chart-1: 220 70% 50%;
|
--chart-1: 220 70% 50%;
|
||||||
--chart-2: 160 60% 45%;
|
--chart-2: 160 60% 45%;
|
||||||
--chart-3: 30 80% 55%;
|
--chart-3: 30 80% 55%;
|
||||||
@ -58,6 +58,7 @@
|
|||||||
@theme inline {
|
@theme inline {
|
||||||
--font-sans: var(--font-geist-sans);
|
--font-sans: var(--font-geist-sans);
|
||||||
--font-mono: var(--font-geist-mono);
|
--font-mono: var(--font-geist-mono);
|
||||||
|
--font-brand: var(--font-bebas);
|
||||||
--color-background: hsl(var(--background));
|
--color-background: hsl(var(--background));
|
||||||
--color-foreground: hsl(var(--foreground));
|
--color-foreground: hsl(var(--foreground));
|
||||||
--color-border: hsl(var(--border));
|
--color-border: hsl(var(--border));
|
||||||
@ -68,3 +69,10 @@ body {
|
|||||||
color: hsl(var(--foreground));
|
color: hsl(var(--foreground));
|
||||||
font-family: var(--font-sans), Arial, Helvetica, sans-serif;
|
font-family: var(--font-sans), Arial, Helvetica, sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.font-brand {
|
||||||
|
font-family: var(--font-brand), var(--font-sans), Arial, Helvetica, sans-serif;
|
||||||
|
font-weight: 900;
|
||||||
|
letter-spacing: 0.02em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import type { Metadata } from "next";
|
import type { Metadata } from "next";
|
||||||
import { Geist, Geist_Mono } from "next/font/google";
|
import { Geist, Geist_Mono, Bebas_Neue } from "next/font/google";
|
||||||
import "./globals.css";
|
import "./globals.css";
|
||||||
import { Navigation } from "@/components/Navigation";
|
import { Navigation } from "@/components/Navigation";
|
||||||
import { Footer } from "@/components/Footer";
|
import { Footer } from "@/components/Footer";
|
||||||
@ -18,6 +18,14 @@ const geistMono = Geist_Mono({
|
|||||||
preload: true,
|
preload: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const bebasNeue = Bebas_Neue({
|
||||||
|
variable: "--font-bebas",
|
||||||
|
subsets: ["latin"],
|
||||||
|
weight: "400",
|
||||||
|
display: "swap",
|
||||||
|
preload: true,
|
||||||
|
});
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: "Biohazard VFX - Professional Visual Effects Studio",
|
title: "Biohazard VFX - Professional Visual Effects Studio",
|
||||||
description: "Creating stunning visual effects for film, television, and digital media. Expert VFX, motion graphics, compositing, and 3D animation services.",
|
description: "Creating stunning visual effects for film, television, and digital media. Expert VFX, motion graphics, compositing, and 3D animation services.",
|
||||||
@ -55,7 +63,7 @@ export default function RootLayout({
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<html lang="en">
|
<html lang="en" className="dark">
|
||||||
<head>
|
<head>
|
||||||
<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="anonymous" />
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="anonymous" />
|
||||||
@ -65,7 +73,7 @@ export default function RootLayout({
|
|||||||
/>
|
/>
|
||||||
</head>
|
</head>
|
||||||
<body
|
<body
|
||||||
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
|
className={`${geistSans.variable} ${geistMono.variable} ${bebasNeue.variable} antialiased bg-black text-white`}
|
||||||
>
|
>
|
||||||
<Navigation />
|
<Navigation />
|
||||||
<main className="min-h-screen">
|
<main className="min-h-screen">
|
||||||
|
|||||||
133
src/app/page.tsx
133
src/app/page.tsx
@ -1,131 +1,22 @@
|
|||||||
import Link from "next/link";
|
|
||||||
import { Hero } from "@/components/Hero";
|
import { Hero } from "@/components/Hero";
|
||||||
import { VideoPlayer } from "@/components/VideoPlayer";
|
import { ClientLogoGrid } from "@/components/ClientLogoGrid";
|
||||||
import { ProjectCard } from "@/components/ProjectCard";
|
import { ProjectShowcase } from "@/components/ProjectShowcase";
|
||||||
import { Button } from "@/components/ui/button";
|
import { MissionSection } from "@/components/MissionSection";
|
||||||
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
|
import { ContactSection } from "@/components/ContactSection";
|
||||||
import { Separator } from "@/components/ui/separator";
|
import { BrandingSection } from "@/components/BrandingSection";
|
||||||
import { projects, studioReel } from "@/data/projects";
|
import { projects } from "@/data/projects";
|
||||||
import { Sparkles, Zap, Award } from "lucide-react";
|
|
||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
const featuredProjects = projects.filter((p) => p.featured);
|
const featuredProjects = projects.filter((p) => p.featured);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Hero
|
<Hero />
|
||||||
title="Crafting Extraordinary Visual Experiences"
|
<ClientLogoGrid />
|
||||||
subtitle="Award-winning visual effects studio delivering stunning VFX, motion graphics, and 3D animation for film, television, and digital media."
|
<ProjectShowcase projects={featuredProjects} />
|
||||||
/>
|
<MissionSection />
|
||||||
|
<ContactSection />
|
||||||
{/* Studio Reel Section */}
|
<BrandingSection />
|
||||||
<section className="container py-16">
|
|
||||||
<div className="space-y-4 text-center">
|
|
||||||
<h2 className="text-3xl font-bold tracking-tighter sm:text-4xl md:text-5xl">
|
|
||||||
Our Studio Reel
|
|
||||||
</h2>
|
|
||||||
<p className="mx-auto max-w-2xl text-muted-foreground">
|
|
||||||
A showcase of our best work from the past year
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div className="mt-8">
|
|
||||||
<VideoPlayer
|
|
||||||
videoUrl={studioReel.videoUrl}
|
|
||||||
thumbnailUrl={studioReel.thumbnailUrl}
|
|
||||||
title={studioReel.title}
|
|
||||||
className="aspect-video w-full"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<Separator className="container" />
|
|
||||||
|
|
||||||
{/* Featured Projects Section */}
|
|
||||||
<section className="container py-16">
|
|
||||||
<div className="space-y-4 text-center">
|
|
||||||
<h2 className="text-3xl font-bold tracking-tighter sm:text-4xl md:text-5xl">
|
|
||||||
Featured Projects
|
|
||||||
</h2>
|
|
||||||
<p className="mx-auto max-w-2xl text-muted-foreground">
|
|
||||||
A selection of our recent work across film, commercial, and digital media
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div className="mt-12 grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
|
|
||||||
{featuredProjects.map((project) => (
|
|
||||||
<ProjectCard key={project.id} project={project} />
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
<div className="mt-12 text-center">
|
|
||||||
<Button asChild size="lg">
|
|
||||||
<Link href="/portfolio">View Full Portfolio</Link>
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<Separator className="container" />
|
|
||||||
|
|
||||||
{/* Capabilities Section */}
|
|
||||||
<section className="container py-16">
|
|
||||||
<div className="space-y-4 text-center">
|
|
||||||
<h2 className="text-3xl font-bold tracking-tighter sm:text-4xl md:text-5xl">
|
|
||||||
Our Capabilities
|
|
||||||
</h2>
|
|
||||||
<p className="mx-auto max-w-2xl text-muted-foreground">
|
|
||||||
Comprehensive visual effects services backed by years of industry experience
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div className="mt-12 grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
|
|
||||||
<Card>
|
|
||||||
<CardHeader>
|
|
||||||
<Sparkles className="h-8 w-8 text-primary" />
|
|
||||||
<CardTitle>Industry-Leading Technology</CardTitle>
|
|
||||||
<CardDescription>
|
|
||||||
Utilizing the latest tools and techniques to deliver photorealistic VFX that seamlessly integrate with your footage.
|
|
||||||
</CardDescription>
|
|
||||||
</CardHeader>
|
|
||||||
</Card>
|
|
||||||
<Card>
|
|
||||||
<CardHeader>
|
|
||||||
<Zap className="h-8 w-8 text-primary" />
|
|
||||||
<CardTitle>Fast Turnaround</CardTitle>
|
|
||||||
<CardDescription>
|
|
||||||
Efficient pipeline and experienced team ensure your project stays on schedule without compromising quality.
|
|
||||||
</CardDescription>
|
|
||||||
</CardHeader>
|
|
||||||
</Card>
|
|
||||||
<Card>
|
|
||||||
<CardHeader>
|
|
||||||
<Award className="h-8 w-8 text-primary" />
|
|
||||||
<CardTitle>Award-Winning Team</CardTitle>
|
|
||||||
<CardDescription>
|
|
||||||
Our artists have contributed to numerous award-winning productions across film and television.
|
|
||||||
</CardDescription>
|
|
||||||
</CardHeader>
|
|
||||||
</Card>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* CTA Section */}
|
|
||||||
<section className="container py-16">
|
|
||||||
<Card className="border-2">
|
|
||||||
<CardContent className="flex flex-col items-center gap-6 p-12 text-center">
|
|
||||||
<h2 className="text-3xl font-bold tracking-tighter sm:text-4xl">
|
|
||||||
Ready to Bring Your Vision to Life?
|
|
||||||
</h2>
|
|
||||||
<p className="max-w-2xl text-muted-foreground">
|
|
||||||
Let's discuss your project and how we can help you create something extraordinary.
|
|
||||||
</p>
|
|
||||||
<div className="flex flex-col gap-4 sm:flex-row">
|
|
||||||
<Button asChild size="lg">
|
|
||||||
<Link href="/contact">Start a Project</Link>
|
|
||||||
</Button>
|
|
||||||
<Button asChild size="lg" variant="outline">
|
|
||||||
<Link href="/services">Explore Services</Link>
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</CardContent>
|
|
||||||
</Card>
|
|
||||||
</section>
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
13
src/components/BrandingSection.tsx
Normal file
13
src/components/BrandingSection.tsx
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
export function BrandingSection() {
|
||||||
|
return (
|
||||||
|
<section className="py-24 bg-black">
|
||||||
|
<div className="container">
|
||||||
|
<div className="text-center">
|
||||||
|
<h1 className="font-brand text-6xl sm:text-7xl md:text-8xl lg:text-9xl text-white leading-none">
|
||||||
|
BIOHAZARD.
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
29
src/components/ClientLogoGrid.tsx
Normal file
29
src/components/ClientLogoGrid.tsx
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
export function ClientLogoGrid() {
|
||||||
|
const clientLogos = [
|
||||||
|
"Vercel", "NEXT", "scale", "APOLLO", "Calcom", "Linear",
|
||||||
|
"knock", "FLOX", "trunk", "Replay", "Graphite", "spiral",
|
||||||
|
"haastes", "CURSOR", "KREA", "Harvey", "ElevenLabs", "Black Forest Labs",
|
||||||
|
"Superplastic", "Triplicate", "SOLANA", "Basement", "MY BEAST", "EDGELORD",
|
||||||
|
"VIRTUAL REALITY", "VIVID", "SHADCN", "KARMA", "G"
|
||||||
|
];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section className="py-8 bg-black">
|
||||||
|
<div className="mx-auto max-w-[980px] px-4">
|
||||||
|
<p className="mb-6 text-[10px] uppercase tracking-[0.2em] text-gray-400/80 text-center">
|
||||||
|
Trusted by basement.
|
||||||
|
</p>
|
||||||
|
<div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-5 gap-x-10 gap-y-5">
|
||||||
|
{clientLogos.map((logo, index) => (
|
||||||
|
<div
|
||||||
|
key={index}
|
||||||
|
className="w-full text-left text-slate-300/70 text-[11px] sm:text-xs md:text-sm hover:text-slate-200 transition-colors border border-gray-600/30 p-3 rounded-sm"
|
||||||
|
>
|
||||||
|
{logo}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
20
src/components/ContactSection.tsx
Normal file
20
src/components/ContactSection.tsx
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
export function ContactSection() {
|
||||||
|
return (
|
||||||
|
<section className="py-10 bg-black">
|
||||||
|
<div className="mx-auto max-w-5xl px-4">
|
||||||
|
{/* Hatched bar */}
|
||||||
|
<div className="h-8 w-full bg-[repeating-linear-gradient(45deg,rgba(255,255,255,0.08)_0,rgba(255,255,255,0.08)_8px,transparent_8px,transparent_16px)] mb-6" />
|
||||||
|
<div className="text-left space-y-3">
|
||||||
|
<div className="text-xs text-gray-400">contact</div>
|
||||||
|
<h2 className="text-white text-2xl font-bold">Let's make an impact together.</h2>
|
||||||
|
<a
|
||||||
|
href="mailto:hello@basement.studio"
|
||||||
|
className="text-white text-lg underline hover:text-gray-300"
|
||||||
|
>
|
||||||
|
hello@basement.studio
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -4,81 +4,31 @@ import { Separator } from "@/components/ui/separator";
|
|||||||
export function Footer() {
|
export function Footer() {
|
||||||
const currentYear = new Date().getFullYear();
|
const currentYear = new Date().getFullYear();
|
||||||
|
|
||||||
|
const footerLinks = [
|
||||||
|
{ href: "/", label: "Home" },
|
||||||
|
{ href: "/services", label: "Services" },
|
||||||
|
{ href: "/portfolio", label: "Showcase" },
|
||||||
|
{ href: "/about", label: "People" },
|
||||||
|
{ href: "#", label: "Blog" },
|
||||||
|
{ href: "#", label: "Lab" },
|
||||||
|
{ href: "/contact", label: "Contact Us" },
|
||||||
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<footer className="border-t bg-background">
|
<footer className="border-t border-gray-800 bg-black">
|
||||||
<div className="container py-12">
|
<div className="mx-auto max-w-5xl px-4 py-12">
|
||||||
<div className="grid grid-cols-1 gap-8 md:grid-cols-4">
|
<div className="grid grid-cols-1 gap-2 text-center">
|
||||||
<div className="space-y-4">
|
{footerLinks.map((link) => (
|
||||||
<h3 className="text-lg font-semibold">Biohazard VFX</h3>
|
<Link
|
||||||
<p className="text-sm text-muted-foreground">
|
key={link.href}
|
||||||
Creating stunning visual effects for film, television, and digital media.
|
href={link.href}
|
||||||
</p>
|
className="text-xs text-gray-400 hover:text-white transition-colors"
|
||||||
</div>
|
>
|
||||||
|
{link.label}
|
||||||
<div className="space-y-4">
|
|
||||||
<h4 className="text-sm font-semibold">Navigation</h4>
|
|
||||||
<ul className="space-y-2 text-sm">
|
|
||||||
<li>
|
|
||||||
<Link href="/" className="text-muted-foreground hover:text-foreground transition-colors">
|
|
||||||
Home
|
|
||||||
</Link>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<Link href="/about" className="text-muted-foreground hover:text-foreground transition-colors">
|
|
||||||
About
|
|
||||||
</Link>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<Link href="/services" className="text-muted-foreground hover:text-foreground transition-colors">
|
|
||||||
Services
|
|
||||||
</Link>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<Link href="/portfolio" className="text-muted-foreground hover:text-foreground transition-colors">
|
|
||||||
Portfolio
|
|
||||||
</Link>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="space-y-4">
|
|
||||||
<h4 className="text-sm font-semibold">Services</h4>
|
|
||||||
<ul className="space-y-2 text-sm">
|
|
||||||
<li className="text-muted-foreground">Visual Effects</li>
|
|
||||||
<li className="text-muted-foreground">Motion Graphics</li>
|
|
||||||
<li className="text-muted-foreground">Compositing</li>
|
|
||||||
<li className="text-muted-foreground">3D Animation</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="space-y-4">
|
|
||||||
<h4 className="text-sm font-semibold">Contact</h4>
|
|
||||||
<ul className="space-y-2 text-sm">
|
|
||||||
<li>
|
|
||||||
<Link href="/contact" className="text-muted-foreground hover:text-foreground transition-colors">
|
|
||||||
Get in Touch
|
|
||||||
</Link>
|
|
||||||
</li>
|
|
||||||
<li className="text-muted-foreground">info@biohazardvfx.com</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<Separator className="my-8" />
|
|
||||||
|
|
||||||
<div className="flex flex-col items-center justify-between gap-4 md:flex-row">
|
|
||||||
<p className="text-sm text-muted-foreground">
|
|
||||||
© {currentYear} Biohazard VFX. All rights reserved.
|
|
||||||
</p>
|
|
||||||
<div className="flex gap-4 text-sm text-muted-foreground">
|
|
||||||
<Link href="#" className="hover:text-foreground transition-colors">
|
|
||||||
Privacy Policy
|
|
||||||
</Link>
|
</Link>
|
||||||
<Link href="#" className="hover:text-foreground transition-colors">
|
))}
|
||||||
Terms of Service
|
|
||||||
</Link>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
<p className="mt-6 text-center text-[10px] text-gray-500">© {currentYear} Basement</p>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -1,40 +1,39 @@
|
|||||||
import Link from "next/link";
|
|
||||||
import { Button } from "@/components/ui/button";
|
|
||||||
|
|
||||||
interface HeroProps {
|
interface HeroProps {
|
||||||
title: string;
|
videoSrc?: string;
|
||||||
subtitle: string;
|
|
||||||
ctaText?: string;
|
|
||||||
ctaLink?: string;
|
|
||||||
secondaryCtaText?: string;
|
|
||||||
secondaryCtaLink?: string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function Hero({
|
export function Hero({ videoSrc = "/hero-video.mp4" }: HeroProps) {
|
||||||
title,
|
|
||||||
subtitle,
|
|
||||||
ctaText = "View Portfolio",
|
|
||||||
ctaLink = "/portfolio",
|
|
||||||
secondaryCtaText = "Get in Touch",
|
|
||||||
secondaryCtaLink = "/contact",
|
|
||||||
}: HeroProps) {
|
|
||||||
return (
|
return (
|
||||||
<section className="container flex flex-col items-center justify-center space-y-8 py-24 text-center md:py-32">
|
<section className="relative h-[85vh] w-full overflow-hidden">
|
||||||
<div className="space-y-4 max-w-4xl">
|
{/* Video Background */}
|
||||||
<h1 className="text-4xl font-bold tracking-tighter sm:text-5xl md:text-6xl lg:text-7xl">
|
<video
|
||||||
{title}
|
className="absolute inset-0 h-full w-full object-cover"
|
||||||
</h1>
|
autoPlay
|
||||||
<p className="mx-auto max-w-2xl text-lg text-muted-foreground sm:text-xl">
|
muted
|
||||||
{subtitle}
|
loop
|
||||||
</p>
|
playsInline
|
||||||
</div>
|
>
|
||||||
<div className="flex flex-col gap-4 sm:flex-row">
|
<source src={videoSrc} type="video/mp4" />
|
||||||
<Button asChild size="lg">
|
Your browser does not support the video tag.
|
||||||
<Link href={ctaLink}>{ctaText}</Link>
|
</video>
|
||||||
</Button>
|
|
||||||
<Button asChild size="lg" variant="outline">
|
{/* Gradient + dark overlay to match mockup */}
|
||||||
<Link href={secondaryCtaLink}>{secondaryCtaText}</Link>
|
<div className="absolute inset-0 bg-gradient-to-t from-black via-black/40 to-transparent" />
|
||||||
</Button>
|
|
||||||
|
{/* Content bottom-aligned */}
|
||||||
|
<div className="relative z-10 flex h-full items-end">
|
||||||
|
<div className="container pb-10 text-white">
|
||||||
|
<div className="max-w-5xl space-y-3">
|
||||||
|
<h1 className="text-[28px] sm:text-[36px] md:text-[44px] lg:text-[48px] leading-tight font-bold tracking-tight">
|
||||||
|
A digital studio & branding powerhouse
|
||||||
|
<br />
|
||||||
|
making cool shit that performs.
|
||||||
|
</h1>
|
||||||
|
<p className="max-w-xl text-[10px] sm:text-xs text-gray-300">
|
||||||
|
We partner with the world's most ambitious brands to create powerful brands to unlock their full potential. We go beyond design to create compelling, strategic brand image.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
);
|
);
|
||||||
|
|||||||
43
src/components/MissionSection.tsx
Normal file
43
src/components/MissionSection.tsx
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
export function MissionSection() {
|
||||||
|
return (
|
||||||
|
<section className="py-24 bg-black">
|
||||||
|
<div className="container">
|
||||||
|
<div className="max-w-4xl mx-auto text-center mb-16">
|
||||||
|
<h2 className="text-3xl font-bold tracking-tighter sm:text-4xl md:text-5xl text-white leading-tight">
|
||||||
|
We're here to create the extraordinary. No shortcuts, just bold, precision-engineered work that elevates the game & leaves a mark.
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
|
||||||
|
<div className="space-y-4">
|
||||||
|
<h3 className="text-xl font-bold text-white">Website & Features</h3>
|
||||||
|
<p className="text-gray-300 leading-relaxed">
|
||||||
|
From sleek landing pages to complex web applications, we create responsive, user-friendly websites that look great and function flawlessly on any device.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="space-y-4">
|
||||||
|
<h3 className="text-xl font-bold text-white">Visual Branding</h3>
|
||||||
|
<p className="text-gray-300 leading-relaxed">
|
||||||
|
From logo identities to comprehensive brand guidelines, we build brands that tell a story, resonate with audiences, and stand out in the market.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="space-y-4">
|
||||||
|
<h3 className="text-xl font-bold text-white">UI/UX Design</h3>
|
||||||
|
<p className="text-gray-300 leading-relaxed">
|
||||||
|
We craft intuitive and engaging user interfaces that prioritize usability and accessibility, ensuring a seamless and enjoyable experience for every user.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="space-y-4">
|
||||||
|
<h3 className="text-xl font-bold text-white">Marketing & Growth</h3>
|
||||||
|
<p className="text-gray-300 leading-relaxed">
|
||||||
|
From social media campaigns to SEO optimization, we develop strategies that drive traffic, generate leads, and boost conversions for your business.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -22,10 +22,10 @@ export function Navigation() {
|
|||||||
];
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<header className="sticky top-0 z-50 w-full border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60">
|
<header className="sticky top-0 z-50 w-full border-b border-gray-800 bg-black/95 backdrop-blur supports-[backdrop-filter]:bg-black/60">
|
||||||
<div className="container flex h-16 items-center justify-between">
|
<div className="container flex h-16 items-center justify-between">
|
||||||
<Link href="/" className="flex items-center space-x-2">
|
<Link href="/" className="flex items-center space-x-2">
|
||||||
<span className="text-2xl font-bold">Biohazard VFX</span>
|
<span className="text-2xl font-bold text-white">basement.</span>
|
||||||
</Link>
|
</Link>
|
||||||
|
|
||||||
<NavigationMenu>
|
<NavigationMenu>
|
||||||
@ -33,7 +33,7 @@ export function Navigation() {
|
|||||||
{navItems.map((item) => (
|
{navItems.map((item) => (
|
||||||
<NavigationMenuItem key={item.href}>
|
<NavigationMenuItem key={item.href}>
|
||||||
<NavigationMenuLink asChild active={pathname === item.href}>
|
<NavigationMenuLink asChild active={pathname === item.href}>
|
||||||
<Link href={item.href} className={navigationMenuTriggerStyle()}>
|
<Link href={item.href} className={`${navigationMenuTriggerStyle()} text-white hover:text-gray-300`}>
|
||||||
{item.label}
|
{item.label}
|
||||||
</Link>
|
</Link>
|
||||||
</NavigationMenuLink>
|
</NavigationMenuLink>
|
||||||
|
|||||||
41
src/components/ProjectShowcase.tsx
Normal file
41
src/components/ProjectShowcase.tsx
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
import { Project } from "@/data/projects";
|
||||||
|
|
||||||
|
interface ProjectShowcaseProps {
|
||||||
|
projects: Project[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export function ProjectShowcase({ projects }: ProjectShowcaseProps) {
|
||||||
|
return (
|
||||||
|
<section className="py-16 bg-black">
|
||||||
|
<div className="mx-auto max-w-5xl px-4">
|
||||||
|
<h2 className="text-white text-xl font-bold mb-8">Featured Projects</h2>
|
||||||
|
|
||||||
|
<div className="space-y-16">
|
||||||
|
{projects.map((project) => (
|
||||||
|
<div key={project.id} className="grid grid-cols-12 gap-6 items-start">
|
||||||
|
{/* Image left */}
|
||||||
|
<div className="col-span-12 md:col-span-8">
|
||||||
|
<div className="relative overflow-hidden">
|
||||||
|
<img
|
||||||
|
src={project.thumbnailUrl}
|
||||||
|
alt={project.title}
|
||||||
|
className="w-full h-auto object-cover"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/* Right-side label and description */}
|
||||||
|
<div className="col-span-12 md:col-span-4 text-gray-300 text-xs space-y-2">
|
||||||
|
<div className="text-right">
|
||||||
|
<div className="text-white">{project.title}</div>
|
||||||
|
</div>
|
||||||
|
<p className="leading-relaxed">
|
||||||
|
{project.description}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -13,47 +13,47 @@ export interface Project {
|
|||||||
export const projects: Project[] = [
|
export const projects: Project[] = [
|
||||||
{
|
{
|
||||||
id: "1",
|
id: "1",
|
||||||
title: "Cinematic VFX Breakdown",
|
title: "Wound Shop",
|
||||||
description: "High-end visual effects for feature film production",
|
description: "Partnering with Wound Shop means building the fastest, most performant websites. We craft beautiful, responsive designs that make for an enjoyable user experience.",
|
||||||
category: "Film",
|
category: "Web Development",
|
||||||
thumbnailUrl: "https://images.unsplash.com/photo-1536440136628-849c177e76a1?w=800&q=80",
|
thumbnailUrl: "https://images.unsplash.com/photo-1536440136628-849c177e76a1?w=800&q=80",
|
||||||
videoUrl: "https://www.youtube.com/embed/dQw4w9WgXcQ",
|
videoUrl: "https://www.youtube.com/embed/dQw4w9WgXcQ",
|
||||||
aspectRatio: 16 / 9,
|
aspectRatio: 16 / 9,
|
||||||
featured: true,
|
featured: true,
|
||||||
tags: ["VFX", "Film", "CGI"],
|
tags: ["Web", "Development", "Design"],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "2",
|
id: "2",
|
||||||
title: "Commercial Product Spot",
|
title: "Daylight",
|
||||||
description: "Stunning product visualization and motion graphics",
|
description: "A bold vision needs a strong launch. We crafted a dynamic brand identity for Daylight, ensuring it captured their innovative spirit and stood out in a crowded market, establishing a fresh, modern, and trustworthy presence.",
|
||||||
category: "Commercial",
|
category: "Branding",
|
||||||
thumbnailUrl: "https://images.unsplash.com/photo-1492691527719-9d1e07e534b4?w=800&q=80",
|
thumbnailUrl: "https://images.unsplash.com/photo-1492691527719-9d1e07e534b4?w=800&q=80",
|
||||||
videoUrl: "https://www.youtube.com/embed/dQw4w9WgXcQ",
|
videoUrl: "https://www.youtube.com/embed/dQw4w9WgXcQ",
|
||||||
aspectRatio: 1,
|
aspectRatio: 1,
|
||||||
featured: true,
|
featured: true,
|
||||||
tags: ["Commercial", "Motion Graphics"],
|
tags: ["Branding", "Identity", "Launch"],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "3",
|
id: "3",
|
||||||
title: "Music Video Effects",
|
title: "KidSuper",
|
||||||
description: "Creative visual effects for music production",
|
description: "Working with KidSuper, we developed a vibrant and playful brand identity that reflects their unique approach to fashion. Our designs brought their creative vision to life, ensuring a cohesive and memorable brand experience.",
|
||||||
category: "Music Video",
|
category: "Fashion",
|
||||||
thumbnailUrl: "https://images.unsplash.com/photo-1511379938547-c1f69419868d?w=800&q=80",
|
thumbnailUrl: "https://images.unsplash.com/photo-1511379938547-c1f69419868d?w=800&q=80",
|
||||||
videoUrl: "https://www.youtube.com/embed/dQw4w9WgXcQ",
|
videoUrl: "https://www.youtube.com/embed/dQw4w9WgXcQ",
|
||||||
aspectRatio: 9 / 16,
|
aspectRatio: 9 / 16,
|
||||||
featured: true,
|
featured: true,
|
||||||
tags: ["Music Video", "Creative"],
|
tags: ["Fashion", "Creative", "Brand"],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "4",
|
id: "4",
|
||||||
title: "Sci-Fi Environment Design",
|
title: "Shop MrBeast",
|
||||||
description: "Futuristic world building and environment creation",
|
description: "The world's biggest YouTuber needed a storefront that could keep up. We built a robust e-commerce platform for MrBeast, handling massive traffic and ensuring a seamless shopping experience for his millions of fans.",
|
||||||
category: "Film",
|
category: "E-commerce",
|
||||||
thumbnailUrl: "https://images.unsplash.com/photo-1451187580459-43490279c0fa?w=800&q=80",
|
thumbnailUrl: "https://images.unsplash.com/photo-1451187580459-43490279c0fa?w=800&q=80",
|
||||||
videoUrl: "https://www.youtube.com/embed/dQw4w9WgXcQ",
|
videoUrl: "https://www.youtube.com/embed/dQw4w9WgXcQ",
|
||||||
aspectRatio: 21 / 9,
|
aspectRatio: 21 / 9,
|
||||||
featured: false,
|
featured: true,
|
||||||
tags: ["VFX", "Environment", "3D"],
|
tags: ["E-commerce", "Platform", "Scale"],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "5",
|
id: "5",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user