nicholais-website/app/sections/ContactSection.tsx

83 lines
3.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use client";
import React from "react";
import { motion } from "motion/react";
import { Parallax } from "@/components/parallax/Parallax";
import { ContactModal } from "@/app/components/contact-modal";
import { TRANSITIONS } from "@/lib/animation";
/**
* Sticky CTA band that invites contact and opens the ContactModal.
*/
export function ContactSection() {
return (
<section id="contact" aria-label="Contact" className="relative w-full">
{/* Ambient depth gradients */}
<Parallax speed={0.04} className="pointer-events-none absolute inset-0 -z-10">
<div className="absolute inset-0 bg-[radial-gradient(1200px_520px_at_50%_0%,rgba(255,255,255,0.08),transparent_70%)]" />
</Parallax>
<div className="sticky top-0 z-10 w-full">
<div className="mx-auto w-full max-w-5xl px-6 py-16">
<motion.div
className="relative overflow-hidden rounded-3xl glass-strong glass-refract p-8 text-center"
initial={{ opacity: 0, y: 16 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, amount: 0.4 }}
transition={TRANSITIONS.base}
>
{/* Light sheen */}
<motion.h2
className="text-2xl font-bold tracking-tight text-neutral-100 sm:text-3xl"
initial={{ opacity: 0, y: 8 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={TRANSITIONS.base}
>
Lets build something cinematic.
</motion.h2>
<motion.p
className="mx-auto mt-2 max-w-2xl text-sm text-neutral-300 sm:text-base"
initial={{ opacity: 0, y: 6 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ ...TRANSITIONS.base, delay: 0.05 }}
>
I combine VFX sensibilities with engineering rigor to craft polished, highperformance experiences.
</motion.p>
<motion.div
className="mt-6 flex items-center justify-center gap-3"
initial={{ opacity: 0, y: 6 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ ...TRANSITIONS.base, delay: 0.1 }}
>
{/* Reuse the existing modal trigger */}
<ContactModal />
<a
href="mailto:hello@nicholai.work"
className="rounded-full glass px-4 py-2 text-sm font-medium text-neutral-200 transition-colors hover:opacity-95"
>
Email link
</a>
</motion.div>
</motion.div>
<motion.footer
className="mt-8 text-center text-xs text-neutral-400"
initial={{ opacity: 0 }}
whileInView={{ opacity: 1 }}
viewport={{ once: true }}
transition={TRANSITIONS.base}
>
© {new Date().getFullYear()} Nicholai Designed with motion and care.
</motion.footer>
</div>
</div>
</section>
);
}