129 lines
4.2 KiB
TypeScript
129 lines
4.2 KiB
TypeScript
import { Kanit } from 'next/font/google';
|
|
import Image from 'next/image';
|
|
import Link from 'next/link';
|
|
|
|
import { Button } from '@gib/ui/button';
|
|
|
|
const kanitSans = Kanit({
|
|
subsets: ['latin'],
|
|
weight: ['400', '500', '600', '700'],
|
|
});
|
|
|
|
export function Hero() {
|
|
return (
|
|
<section className='container mx-auto px-4 py-24 md:py-32 lg:py-40'>
|
|
<div className='mx-auto flex max-w-5xl flex-col items-center gap-8 text-center'>
|
|
{/* Badge */}
|
|
<div className='border-border/40 bg-muted/50 inline-flex items-center rounded-full border px-3 py-1 text-sm font-medium'>
|
|
<span className='mr-2'>🚀</span>
|
|
<span>Production-ready monorepo template</span>
|
|
</div>
|
|
|
|
{/* Heading */}
|
|
<h1 className='from-foreground to-foreground/70 bg-linear-to-br bg-clip-text text-4xl font-bold tracking-tight text-transparent sm:text-5xl md:text-6xl lg:text-7xl'>
|
|
Build Full-Stack Apps with{' '}
|
|
<span
|
|
className={`${kanitSans.className} to-accent-foreground bg-linear-to-r from-[#281A65] via-[#363354] bg-clip-text text-transparent sm:text-6xl lg:text-7xl xl:text-8xl dark:from-[#bec8e6] dark:via-[#F0EEE4] dark:to-[#FFF8E7]`}
|
|
>
|
|
convex monorepo
|
|
</span>
|
|
</h1>
|
|
|
|
{/* Description */}
|
|
<p className='text-muted-foreground max-w-2xl text-lg md:text-xl'>
|
|
A Turborepo starter with Next.js, Expo, and self-hosted Convex. Ship
|
|
web and mobile apps faster with shared code, type-safe backend, and
|
|
complete control over your infrastructure.
|
|
</p>
|
|
|
|
{/* CTA Buttons */}
|
|
<div className='flex flex-col gap-3 sm:flex-row'>
|
|
<Button size='lg' variant='outline' asChild>
|
|
<Link
|
|
href='https://git.gbrown.org/gib/convex-monorepo'
|
|
target='_blank'
|
|
rel='noopener noreferrer'
|
|
>
|
|
<Image
|
|
src='/misc/gitea/gitea.svg'
|
|
alt='Gitea'
|
|
width={20}
|
|
height={20}
|
|
/>
|
|
View Source Code
|
|
</Link>
|
|
</Button>
|
|
</div>
|
|
|
|
{/* Features Quick List */}
|
|
<div className='text-muted-foreground mt-8 flex flex-wrap items-center justify-center gap-6 text-sm'>
|
|
<div className='flex items-center gap-2'>
|
|
<svg
|
|
className='h-5 w-5 text-green-500'
|
|
fill='none'
|
|
viewBox='0 0 24 24'
|
|
stroke='currentColor'
|
|
>
|
|
<path
|
|
strokeLinecap='round'
|
|
strokeLinejoin='round'
|
|
strokeWidth={2}
|
|
d='M5 13l4 4L19 7'
|
|
/>
|
|
</svg>
|
|
<span>TypeScript</span>
|
|
</div>
|
|
<div className='flex items-center gap-2'>
|
|
<svg
|
|
className='h-5 w-5 text-green-500'
|
|
fill='none'
|
|
viewBox='0 0 24 24'
|
|
stroke='currentColor'
|
|
>
|
|
<path
|
|
strokeLinecap='round'
|
|
strokeLinejoin='round'
|
|
strokeWidth={2}
|
|
d='M5 13l4 4L19 7'
|
|
/>
|
|
</svg>
|
|
<span>Self-Hosted</span>
|
|
</div>
|
|
<div className='flex items-center gap-2'>
|
|
<svg
|
|
className='h-5 w-5 text-green-500'
|
|
fill='none'
|
|
viewBox='0 0 24 24'
|
|
stroke='currentColor'
|
|
>
|
|
<path
|
|
strokeLinecap='round'
|
|
strokeLinejoin='round'
|
|
strokeWidth={2}
|
|
d='M5 13l4 4L19 7'
|
|
/>
|
|
</svg>
|
|
<span>Real-time</span>
|
|
</div>
|
|
<div className='flex items-center gap-2'>
|
|
<svg
|
|
className='h-5 w-5 text-green-500'
|
|
fill='none'
|
|
viewBox='0 0 24 24'
|
|
stroke='currentColor'
|
|
>
|
|
<path
|
|
strokeLinecap='round'
|
|
strokeLinejoin='round'
|
|
strokeWidth={2}
|
|
d='M5 13l4 4L19 7'
|
|
/>
|
|
</svg>
|
|
<span>Auth Included</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
);
|
|
}
|