mirror of
https://github.com/documenso/documenso.git
synced 2025-11-12 15:53:02 +10:00
181 lines
5.3 KiB
TypeScript
181 lines
5.3 KiB
TypeScript
'use client';
|
|
|
|
import Image from 'next/image';
|
|
import Link from 'next/link';
|
|
|
|
import type { Variants } from 'framer-motion';
|
|
import { motion } from 'framer-motion';
|
|
import { usePlausible } from 'next-plausible';
|
|
import { LuGithub } from 'react-icons/lu';
|
|
import { match } from 'ts-pattern';
|
|
|
|
import backgroundPattern from '@documenso/assets/images/background-pattern.png';
|
|
import { useFeatureFlags } from '@documenso/lib/client-only/providers/feature-flag';
|
|
import { cn } from '@documenso/ui/lib/utils';
|
|
import { Button } from '@documenso/ui/primitives/button';
|
|
|
|
import { Carousel } from './carousel';
|
|
|
|
export type HeroProps = {
|
|
className?: string;
|
|
[key: string]: unknown;
|
|
};
|
|
|
|
const BackgroundPatternVariants: Variants = {
|
|
initial: {
|
|
opacity: 0,
|
|
},
|
|
|
|
animate: {
|
|
opacity: 1,
|
|
|
|
transition: {
|
|
delay: 1,
|
|
duration: 1.2,
|
|
},
|
|
},
|
|
};
|
|
|
|
const HeroTitleVariants: Variants = {
|
|
initial: {
|
|
opacity: 0,
|
|
y: 60,
|
|
},
|
|
animate: {
|
|
opacity: 1,
|
|
y: 0,
|
|
transition: {
|
|
duration: 0.5,
|
|
},
|
|
},
|
|
};
|
|
|
|
const HeroCarouselVariants: Variants = {
|
|
initial: {
|
|
opacity: 0,
|
|
y: 60,
|
|
},
|
|
animate: {
|
|
opacity: 1,
|
|
y: 0,
|
|
transition: {
|
|
delay: 0.5,
|
|
duration: 0.8,
|
|
},
|
|
},
|
|
};
|
|
|
|
export const Hero = ({ className, ...props }: HeroProps) => {
|
|
const event = usePlausible();
|
|
|
|
const { getFlag } = useFeatureFlags();
|
|
|
|
const heroMarketingCTA = getFlag('marketing_landing_hero_cta');
|
|
|
|
return (
|
|
<motion.div className={cn('relative', className)} {...props}>
|
|
<div className="absolute -inset-24 -z-10">
|
|
<motion.div
|
|
className="flex h-full w-full origin-top-right items-center justify-center"
|
|
variants={BackgroundPatternVariants}
|
|
initial="initial"
|
|
animate="animate"
|
|
>
|
|
<Image
|
|
src={backgroundPattern}
|
|
alt="background pattern"
|
|
className="-mr-[50vw] -mt-[15vh] h-full scale-125 object-cover dark:contrast-[70%] dark:invert dark:sepia md:scale-150 lg:scale-[175%]"
|
|
/>
|
|
</motion.div>
|
|
</div>
|
|
|
|
<div className="relative">
|
|
<motion.h2
|
|
variants={HeroTitleVariants}
|
|
initial="initial"
|
|
animate="animate"
|
|
className="text-center text-4xl font-bold leading-tight tracking-tight md:text-[48px] lg:text-[64px]"
|
|
>
|
|
Document signing,
|
|
<span className="block" /> finally open source.
|
|
</motion.h2>
|
|
|
|
<motion.div
|
|
variants={HeroTitleVariants}
|
|
initial="initial"
|
|
animate="animate"
|
|
className="mt-8 flex flex-wrap items-center justify-center gap-x-6 gap-y-4"
|
|
>
|
|
<Link href="https://app.documenso.com/signup?utm_source=marketing-hero">
|
|
<Button
|
|
type="button"
|
|
variant="outline"
|
|
className="rounded-full bg-transparent backdrop-blur-sm"
|
|
>
|
|
Try our Free Plan
|
|
<span className="bg-primary dark:text-background -mr-2.5 ml-2.5 rounded-full px-2 py-1.5 text-xs font-medium">
|
|
No Credit Card required
|
|
</span>
|
|
</Button>
|
|
</Link>
|
|
<Link href="https://github.com/documenso/documenso" onClick={() => event('view-github')}>
|
|
<Button variant="outline" className="rounded-full bg-transparent backdrop-blur-sm">
|
|
<LuGithub className="mr-2 h-5 w-5" />
|
|
Star on GitHub
|
|
</Button>
|
|
</Link>
|
|
</motion.div>
|
|
|
|
{match(heroMarketingCTA)
|
|
.with('spm', () => (
|
|
<motion.div
|
|
variants={HeroTitleVariants}
|
|
initial="initial"
|
|
animate="animate"
|
|
className="border-primary bg-background hover:bg-muted mx-auto mt-8 w-60 rounded-xl border transition-colors duration-300"
|
|
>
|
|
<Link href="/singleplayer" className="block px-4 py-2 text-center">
|
|
<h2 className="text-muted-foreground text-xs font-semibold">
|
|
Introducing Single Player Mode
|
|
</h2>
|
|
|
|
<h1 className="text-foreground mt-1.5 font-medium leading-5">
|
|
Self sign for free!
|
|
</h1>
|
|
</Link>
|
|
</motion.div>
|
|
))
|
|
.with('productHunt', () => (
|
|
<motion.div
|
|
variants={HeroTitleVariants}
|
|
initial="initial"
|
|
animate="animate"
|
|
className="mt-8 flex flex-col items-center justify-center gap-x-6 gap-y-4"
|
|
>
|
|
<Link
|
|
href="https://www.producthunt.com/posts/documenso?utm_source=badge-top-post-badge&utm_medium=badge&utm_souce=badge-documenso"
|
|
target="_blank"
|
|
>
|
|
<img
|
|
src="https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=395047&theme=light&period=daily"
|
|
alt="Documenso - The open source DocuSign alternative | Product Hunt"
|
|
style={{ width: '250px', height: '54px' }}
|
|
/>
|
|
</Link>
|
|
</motion.div>
|
|
))
|
|
.otherwise(() => null)}
|
|
|
|
<motion.div
|
|
className="mt-12"
|
|
variants={HeroCarouselVariants}
|
|
initial="initial"
|
|
animate="animate"
|
|
>
|
|
<Carousel />
|
|
</motion.div>
|
|
</div>
|
|
</motion.div>
|
|
);
|
|
};
|