mirror of
https://github.com/wasp-lang/open-saas.git
synced 2025-06-05 04:30:44 +02:00
add new landing page
This commit is contained in:
parent
5b27934f66
commit
25e5c2cda9
@ -56,7 +56,7 @@ app SaaSTemplate {
|
||||
("@tailwindcss/forms", "^0.5.3"),
|
||||
("@tailwindcss/typography", "^0.5.7"),
|
||||
("react-hook-form", "7.43.1"),
|
||||
("react-icons", "4.8.0"),
|
||||
("react-icons", "4.11.0"),
|
||||
("request-ip", "3.3.0"),
|
||||
("@types/request-ip", "0.0.37"),
|
||||
("node-fetch", "3.3.0"),
|
||||
@ -117,6 +117,11 @@ page MainPage {
|
||||
component: import Main from "@client/MainPage"
|
||||
}
|
||||
|
||||
route LandingPageRoute { path: "/landing-page", to: LandingPage }
|
||||
page LandingPage {
|
||||
component: import LandingPage from "@client/LandingPage"
|
||||
}
|
||||
|
||||
route LoginRoute { path: "/login", to: LoginPage }
|
||||
page LoginPage {
|
||||
component: import Login from "@client/auth/LoginPage"
|
||||
|
@ -10,7 +10,7 @@ export default function App({ children }: { children: ReactNode }) {
|
||||
*/
|
||||
return (
|
||||
<div>
|
||||
<NavBar />
|
||||
{/* <NavBar /> */}
|
||||
<div className='mx-auto max-w-7xl sm:px-6 lg:px-8 '>{children}</div>
|
||||
</div>
|
||||
);
|
||||
|
626
src/client/LandingPage.tsx
Normal file
626
src/client/LandingPage.tsx
Normal file
@ -0,0 +1,626 @@
|
||||
import { useState } from 'react';
|
||||
import { Dialog } from '@headlessui/react';
|
||||
import { AiFillCheckCircle, AiFillCloseCircle } from 'react-icons/ai';
|
||||
import { FiKey } from 'react-icons/fi';
|
||||
import { MdPayments } from 'react-icons/md';
|
||||
import { HiDocumentText } from 'react-icons/hi';
|
||||
import { PiMagicWandFill } from 'react-icons/pi';
|
||||
import { HiBars3 } from 'react-icons/hi2';
|
||||
import logo from './static/logo.png';
|
||||
|
||||
const navigation = [
|
||||
{ name: 'Product', href: '#' },
|
||||
{ name: 'Features', href: '#' },
|
||||
{ name: 'Marketplace', href: '#' },
|
||||
{ name: 'Company', href: '#' },
|
||||
];
|
||||
const features = [
|
||||
{
|
||||
name: 'Auto-magic Auth',
|
||||
description:
|
||||
'Not only is Auth built-in, you can integrate Google, GitHub, Email Verified Login, and more with just a few lines of code, thanks to the power of Wasp',
|
||||
icon: FiKey,
|
||||
},
|
||||
{
|
||||
name: 'Stripe Integration',
|
||||
description:
|
||||
"No SaaS is complete without payments. That's why subscriptions and there necessary webhooks are built-in!",
|
||||
icon: MdPayments,
|
||||
},
|
||||
{
|
||||
name: 'Complete Documentation & Support',
|
||||
description:
|
||||
"We don't leave you hanging. We have a complete documentation site, and a Discord community to help you get along the way.",
|
||||
icon: HiDocumentText,
|
||||
},
|
||||
{
|
||||
name: 'OpenAI ChatGPT API Integration',
|
||||
description: 'Technology is moving fast, and so are new ideas. Profit from yours quickly.',
|
||||
icon: PiMagicWandFill,
|
||||
},
|
||||
{
|
||||
name: 'No 3rd Party Services',
|
||||
description: 'You own your data, and you own your code. No expensive 3rd party services to worry about.',
|
||||
icon: PiMagicWandFill,
|
||||
},
|
||||
];
|
||||
const tiers = [
|
||||
{
|
||||
name: 'Freelancer',
|
||||
id: 'tier-freelancer',
|
||||
href: '#',
|
||||
priceMonthly: '$24',
|
||||
description: 'The essentials to provide your best work for clients.',
|
||||
features: ['5 products', 'Up to 1,000 subscribers', 'Basic analytics', '48-hour support response time'],
|
||||
mostPopular: false,
|
||||
},
|
||||
{
|
||||
name: 'Startup',
|
||||
id: 'tier-startup',
|
||||
href: '#',
|
||||
priceMonthly: '$32',
|
||||
description: 'A plan that scales with your rapidly growing business.',
|
||||
features: [
|
||||
'25 products',
|
||||
'Up to 10,000 subscribers',
|
||||
'Advanced analytics',
|
||||
'24-hour support response time',
|
||||
'Marketing automations',
|
||||
],
|
||||
mostPopular: true,
|
||||
},
|
||||
{
|
||||
name: 'Enterprise',
|
||||
id: 'tier-enterprise',
|
||||
href: '#',
|
||||
priceMonthly: '$48',
|
||||
description: 'Dedicated support and infrastructure for your company.',
|
||||
features: [
|
||||
'Unlimited products',
|
||||
'Unlimited subscribers',
|
||||
'Advanced analytics',
|
||||
'1-hour, dedicated support response time',
|
||||
'Marketing automations',
|
||||
],
|
||||
mostPopular: false,
|
||||
},
|
||||
];
|
||||
const faqs = [
|
||||
{
|
||||
id: 1,
|
||||
question: "What's the best thing about Switzerland?",
|
||||
answer:
|
||||
"I don't know, but the flag is a big plus. Lorem ipsum dolor sit amet consectetur adipisicing elit. Quas cupiditate laboriosam fugiat.",
|
||||
},
|
||||
// More questions...
|
||||
];
|
||||
const footerNavigation = {
|
||||
solutions: [
|
||||
{ name: 'Hosting', href: '#' },
|
||||
{ name: 'Data Services', href: '#' },
|
||||
{ name: 'Uptime Monitoring', href: '#' },
|
||||
{ name: 'Enterprise Services', href: '#' },
|
||||
],
|
||||
support: [
|
||||
{ name: 'Pricing', href: '#' },
|
||||
{ name: 'Documentation', href: '#' },
|
||||
{ name: 'Guides', href: '#' },
|
||||
{ name: 'API Reference', href: '#' },
|
||||
],
|
||||
company: [
|
||||
{ name: 'About', href: '#' },
|
||||
{ name: 'Blog', href: '#' },
|
||||
{ name: 'Jobs', href: '#' },
|
||||
{ name: 'Press', href: '#' },
|
||||
{ name: 'Partners', href: '#' },
|
||||
],
|
||||
legal: [
|
||||
{ name: 'Claim', href: '#' },
|
||||
{ name: 'Privacy', href: '#' },
|
||||
{ name: 'Terms', href: '#' },
|
||||
],
|
||||
};
|
||||
|
||||
function classNames(...classes: string[]) {
|
||||
return classes.filter(Boolean).join(' ');
|
||||
}
|
||||
|
||||
export default function LandingPage() {
|
||||
const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
|
||||
|
||||
return (
|
||||
<div className='bg-white'>
|
||||
{/* Header */}
|
||||
<header className='absolute inset-x-0 top-0 z-50'>
|
||||
<nav className='flex items-center justify-between p-6 lg:px-8' aria-label='Global'>
|
||||
<div className='flex lg:flex-1'>
|
||||
<a href='/' className='-m-1.5 p-1.5'>
|
||||
<img className='h-8 w-8' src={logo} alt='My SaaS App' />
|
||||
</a>
|
||||
</div>
|
||||
<div className='flex lg:hidden'>
|
||||
<button
|
||||
type='button'
|
||||
className='-m-2.5 inline-flex items-center justify-center rounded-md p-2.5 text-gray-700'
|
||||
onClick={() => setMobileMenuOpen(true)}
|
||||
>
|
||||
<span className='sr-only'>Open main menu</span>
|
||||
<HiBars3 className='h-6 w-6' aria-hidden='true' />
|
||||
</button>
|
||||
</div>
|
||||
<div className='hidden lg:flex lg:gap-x-12'>
|
||||
{navigation.map((item) => (
|
||||
<a key={item.name} href={item.href} className='text-sm font-semibold leading-6 text-gray-900'>
|
||||
{item.name}
|
||||
</a>
|
||||
))}
|
||||
</div>
|
||||
<div className='hidden lg:flex lg:flex-1 lg:justify-end'>
|
||||
<a href='#' className='text-sm font-semibold leading-6 text-gray-900'>
|
||||
Log in <span aria-hidden='true'>→</span>
|
||||
</a>
|
||||
</div>
|
||||
</nav>
|
||||
<Dialog as='div' className='lg:hidden' open={mobileMenuOpen} onClose={setMobileMenuOpen}>
|
||||
<div className='fixed inset-0 z-50' />
|
||||
<Dialog.Panel className='fixed inset-y-0 right-0 z-50 w-full overflow-y-auto bg-white px-6 py-6 sm:max-w-sm sm:ring-1 sm:ring-gray-900/10'>
|
||||
<div className='flex items-center justify-between'>
|
||||
<a href='#' className='-m-1.5 p-1.5'>
|
||||
<span className='sr-only'>Your Company</span>
|
||||
<img
|
||||
className='h-8 w-auto'
|
||||
src='https://tailwindui.com/img/logos/mark.svg?color=indigo&shade=600'
|
||||
alt=''
|
||||
/>
|
||||
</a>
|
||||
<button
|
||||
type='button'
|
||||
className='-m-2.5 rounded-md p-2.5 text-gray-700'
|
||||
onClick={() => setMobileMenuOpen(false)}
|
||||
>
|
||||
<span className='sr-only'>Close menu</span>
|
||||
<AiFillCloseCircle className='h-6 w-6' aria-hidden='true' />
|
||||
</button>
|
||||
</div>
|
||||
<div className='mt-6 flow-root'>
|
||||
<div className='-my-6 divide-y divide-gray-500/10'>
|
||||
<div className='space-y-2 py-6'>
|
||||
{navigation.map((item) => (
|
||||
<a
|
||||
key={item.name}
|
||||
href={item.href}
|
||||
className='-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50'
|
||||
>
|
||||
{item.name}
|
||||
</a>
|
||||
))}
|
||||
</div>
|
||||
<div className='py-6'>
|
||||
<a
|
||||
href='#'
|
||||
className='-mx-3 block rounded-lg px-3 py-2.5 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50'
|
||||
>
|
||||
Log in
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Dialog.Panel>
|
||||
</Dialog>
|
||||
</header>
|
||||
|
||||
<main className='isolate'>
|
||||
{/* Hero section */}
|
||||
<div className='relative pt-14'>
|
||||
<div className='absolute inset-x-0 top-80 -z-10 transform-gpu overflow-hidden blur-3xl' aria-hidden='true'>
|
||||
<div
|
||||
className='relative left-1/2 aspect-[1155/678] w-[36.125rem] -translate-x-3/4 bg-gradient-to-tr from-amber-300 to-yellow-200 opacity-30 sm:left-1/2 sm:w-[72.1875rem]'
|
||||
style={{
|
||||
clipPath: 'ellipse(50% 25% at 25% 50%)',
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<div className='py-24 sm:py-32'>
|
||||
<div className='mx-auto max-w-7xl px-6 lg:px-8'>
|
||||
<div className='mx-auto max-w-2xl text-center'>
|
||||
<h1 className='text-4xl font-bold tracking-tight text-gray-900 sm:text-6xl'>
|
||||
The <span className='italic'>free</span> SaaS template with superpowers
|
||||
</h1>
|
||||
<p className='mt-6 text-lg leading-8 text-gray-600'>
|
||||
Get all the features of a modern SaaS app, in a ready-made teplate. Built on top of Wasp, the only
|
||||
full-stack React + NodeJS framework that builds features for you.
|
||||
</p>
|
||||
<div className='mt-10 flex items-center justify-center gap-x-6'>
|
||||
<a
|
||||
href='#'
|
||||
className='rounded-md bg-indigo-600 px-3.5 py-2.5 text-sm font-semibold text-white hover:text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600'
|
||||
>
|
||||
Get started
|
||||
</a>
|
||||
<a href='#' className='text-sm font-semibold leading-6 text-gray-900'>
|
||||
Learn more <span aria-hidden='true'>→</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div className='mt-16 flow-root sm:mt-24 '>
|
||||
<div className='-m-2 rounded-xl bg-gray-900/5 p-2 ring-1 ring-inset ring-gray-900/10 lg:-m-4 lg:rounded-2xl lg:p-4'>
|
||||
<img
|
||||
src='https://coverlettergpt.xyz/homepage.png'
|
||||
alt='App screenshot'
|
||||
// width={2432}
|
||||
// height={1442}
|
||||
className='rounded-md shadow-2xl ring-1 ring-gray-900/10'
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
className='absolute inset-x-0 top-[calc(100%-13rem)] -z-10 transform-gpu overflow-hidden blur-3xl sm:top-[calc(100%-30rem)]'
|
||||
aria-hidden='true'
|
||||
>
|
||||
<div
|
||||
className='relative left-1/2 aspect-[1155/678] w-[36.125rem] -translate-x-1/4 bg-gradient-to-tr from-amber-300 to-yellow-200 opacity-30 sm:left-1/2 sm:w-[72.1875rem]'
|
||||
style={{
|
||||
clipPath: 'ellipse(50% 25% at 75% 40%)',
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
{/* <div
|
||||
className='absolute inset-x-0 top-[calc(100%-13rem)] -z-10 transform-gpu overflow-hidden blur-3xl sm:top-[calc(100%-30rem)]'
|
||||
aria-hidden='true'
|
||||
>
|
||||
<div
|
||||
className='relative left-[calc(50%+3rem)] aspect-[1155/678] w-[36.125rem] -translate-x-1/2 bg-gradient-to-tr from-[#ff80b5] to-[#9089fc] opacity-30 sm:left-[calc(50%+36rem)] sm:w-[72.1875rem]'
|
||||
style={{
|
||||
clipPath:
|
||||
'polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)',
|
||||
}}
|
||||
/>
|
||||
</div> */}
|
||||
</div>
|
||||
|
||||
{/* Logo cloud */}
|
||||
<div className='mx-auto max-w-7xl px-6 lg:px-8'>
|
||||
<div className='mx-auto grid max-w-lg grid-cols-4 items-center gap-x-8 gap-y-12 sm:max-w-xl sm:grid-cols-6 sm:gap-x-10 sm:gap-y-14 lg:mx-0 lg:max-w-none lg:grid-cols-5'>
|
||||
<img
|
||||
className='col-span-2 max-h-12 w-full object-contain lg:col-span-1'
|
||||
src='https://tailwindui.com/img/logos/158x48/transistor-logo-gray-900.svg'
|
||||
alt='Transistor'
|
||||
width={158}
|
||||
height={48}
|
||||
/>
|
||||
<img
|
||||
className='col-span-2 max-h-12 w-full object-contain lg:col-span-1'
|
||||
src='https://tailwindui.com/img/logos/158x48/reform-logo-gray-900.svg'
|
||||
alt='Reform'
|
||||
width={158}
|
||||
height={48}
|
||||
/>
|
||||
<img
|
||||
className='col-span-2 max-h-12 w-full object-contain lg:col-span-1'
|
||||
src='https://tailwindui.com/img/logos/158x48/tuple-logo-gray-900.svg'
|
||||
alt='Tuple'
|
||||
width={158}
|
||||
height={48}
|
||||
/>
|
||||
<img
|
||||
className='col-span-2 max-h-12 w-full object-contain sm:col-start-2 lg:col-span-1'
|
||||
src='https://tailwindui.com/img/logos/158x48/savvycal-logo-gray-900.svg'
|
||||
alt='SavvyCal'
|
||||
width={158}
|
||||
height={48}
|
||||
/>
|
||||
<img
|
||||
className='col-span-2 col-start-2 max-h-12 w-full object-contain sm:col-start-auto lg:col-span-1'
|
||||
src='https://tailwindui.com/img/logos/158x48/statamic-logo-gray-900.svg'
|
||||
alt='Statamic'
|
||||
width={158}
|
||||
height={48}
|
||||
/>
|
||||
</div>
|
||||
<div className='mt-16 flex justify-center'>
|
||||
<p className='relative rounded-full px-4 py-1.5 text-sm leading-6 text-gray-600 ring-1 ring-inset ring-gray-900/10 hover:ring-gray-900/20'>
|
||||
<span className='hidden md:inline'>
|
||||
Transistor saves up to $40,000 per year, per employee by working with us.
|
||||
</span>
|
||||
<a href='#' className='font-semibold text-indigo-600'>
|
||||
<span className='absolute inset-0' aria-hidden='true' /> Read our case study{' '}
|
||||
<span aria-hidden='true'>→</span>
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Feature section */}
|
||||
<div className='mx-auto mt-32 max-w-7xl px-6 sm:mt-56 lg:px-8'>
|
||||
<div className='mx-auto max-w-2xl lg:text-center'>
|
||||
<h2 className='text-base font-semibold leading-7 text-indigo-600'>Deploy faster</h2>
|
||||
<p className='mt-2 text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl'>
|
||||
Everything you need to deploy your app
|
||||
</p>
|
||||
<p className='mt-6 text-lg leading-8 text-gray-600'>
|
||||
Quis tellus eget adipiscing convallis sit sit eget aliquet quis. Suspendisse eget egestas a elementum
|
||||
pulvinar et feugiat blandit at. In mi viverra elit nunc.
|
||||
</p>
|
||||
</div>
|
||||
<div className='mx-auto mt-16 max-w-2xl sm:mt-20 lg:mt-24 lg:max-w-4xl'>
|
||||
<dl className='grid max-w-xl grid-cols-1 gap-x-8 gap-y-10 lg:max-w-none lg:grid-cols-2 lg:gap-y-16'>
|
||||
{features.map((feature) => (
|
||||
<div key={feature.name} className='relative pl-16'>
|
||||
<dt className='text-base font-semibold leading-7 text-gray-900'>
|
||||
<div className='absolute left-0 top-0 flex h-10 w-10 items-center justify-center rounded-lg bg-indigo-600'>
|
||||
<feature.icon className='h-6 w-6 text-white' aria-hidden='true' />
|
||||
</div>
|
||||
{feature.name}
|
||||
</dt>
|
||||
<dd className='mt-2 text-base leading-7 text-gray-600'>{feature.description}</dd>
|
||||
</div>
|
||||
))}
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Testimonial section */}
|
||||
<div className='mx-auto mt-32 max-w-7xl sm:mt-56 sm:px-6 lg:px-8'>
|
||||
<div className='relative overflow-hidden bg-gray-900 px-6 py-20 shadow-xl sm:rounded-3xl sm:px-10 sm:py-24 md:px-12 lg:px-20'>
|
||||
<img
|
||||
className='absolute inset-0 h-full w-full object-cover brightness-150 saturate-0'
|
||||
src='https://images.unsplash.com/photo-1601381718415-a05fb0a261f3?ixid=MXwxMjA3fDB8MHxwcm9maWxlLXBhZ2V8ODl8fHxlbnwwfHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=1216&q=80'
|
||||
alt=''
|
||||
/>
|
||||
<div className='absolute inset-0 bg-gray-900/90 mix-blend-multiply' />
|
||||
<div className='absolute -left-80 -top-56 transform-gpu blur-3xl' aria-hidden='true'>
|
||||
<div
|
||||
className='aspect-[1097/845] w-[68.5625rem] bg-gradient-to-r from-[#ff4694] to-[#776fff] opacity-[0.45]'
|
||||
style={{
|
||||
clipPath:
|
||||
'polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)',
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
className='hidden md:absolute md:bottom-16 md:left-[50rem] md:block md:transform-gpu md:blur-3xl'
|
||||
aria-hidden='true'
|
||||
>
|
||||
<div
|
||||
className='aspect-[1097/845] w-[68.5625rem] bg-gradient-to-r from-[#ff4694] to-[#776fff] opacity-25'
|
||||
style={{
|
||||
clipPath:
|
||||
'polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)',
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<div className='relative mx-auto max-w-2xl lg:mx-0'>
|
||||
<img className='h-12 w-auto' src='https://tailwindui.com/img/logos/workcation-logo-white.svg' alt='' />
|
||||
<figure>
|
||||
<blockquote className='mt-6 text-lg font-semibold text-white sm:text-xl sm:leading-8'>
|
||||
<p>
|
||||
“Amet amet eget scelerisque tellus sit neque faucibus non eleifend. Integer eu praesent at a. Ornare
|
||||
arcu gravida natoque erat et cursus tortor consequat at. Vulputate gravida sociis enim nullam
|
||||
ultricies habitant malesuada lorem ac.”
|
||||
</p>
|
||||
</blockquote>
|
||||
<figcaption className='mt-6 text-base text-white'>
|
||||
<div className='font-semibold'>Judith Black</div>
|
||||
<div className='mt-1'>CEO of Tuple</div>
|
||||
</figcaption>
|
||||
</figure>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Pricing section */}
|
||||
<div className='py-24 sm:pt-48'>
|
||||
<div className='mx-auto max-w-7xl px-6 lg:px-8'>
|
||||
<div className='mx-auto max-w-4xl text-center'>
|
||||
<h2 className='text-base font-semibold leading-7 text-indigo-600'>Pricing</h2>
|
||||
<p className='mt-2 text-4xl font-bold tracking-tight text-gray-900 sm:text-5xl'>
|
||||
Pricing plans for teams of all sizes
|
||||
</p>
|
||||
</div>
|
||||
<p className='mx-auto mt-6 max-w-2xl text-center text-lg leading-8 text-gray-600'>
|
||||
Distinctio et nulla eum soluta et neque labore quibusdam. Saepe et quasi iusto modi velit ut non voluptas
|
||||
in. Explicabo id ut laborum.
|
||||
</p>
|
||||
<div className='isolate mx-auto mt-16 grid max-w-md grid-cols-1 gap-y-8 sm:mt-20 lg:mx-0 lg:max-w-none lg:grid-cols-3'>
|
||||
{tiers.map((tier, tierIdx) => (
|
||||
<div
|
||||
key={tier.id}
|
||||
className={classNames(
|
||||
tier.mostPopular ? 'lg:z-10 lg:rounded-b-none' : 'lg:mt-8',
|
||||
tierIdx === 0 ? 'lg:rounded-r-none' : '',
|
||||
tierIdx === tiers.length - 1 ? 'lg:rounded-l-none' : '',
|
||||
'flex flex-col justify-between rounded-3xl bg-white p-8 ring-1 ring-gray-200 xl:p-10'
|
||||
)}
|
||||
>
|
||||
<div>
|
||||
<div className='flex items-center justify-between gap-x-4'>
|
||||
<h3
|
||||
id={tier.id}
|
||||
className={classNames(
|
||||
tier.mostPopular ? 'text-indigo-600' : 'text-gray-900',
|
||||
'text-lg font-semibold leading-8'
|
||||
)}
|
||||
>
|
||||
{tier.name}
|
||||
</h3>
|
||||
{tier.mostPopular ? (
|
||||
<p className='rounded-full bg-indigo-600/10 px-2.5 py-1 text-xs font-semibold leading-5 text-indigo-600'>
|
||||
Most popular
|
||||
</p>
|
||||
) : null}
|
||||
</div>
|
||||
<p className='mt-4 text-sm leading-6 text-gray-600'>{tier.description}</p>
|
||||
<p className='mt-6 flex items-baseline gap-x-1'>
|
||||
<span className='text-4xl font-bold tracking-tight text-gray-900'>{tier.priceMonthly}</span>
|
||||
<span className='text-sm font-semibold leading-6 text-gray-600'>/month</span>
|
||||
</p>
|
||||
<ul role='list' className='mt-8 space-y-3 text-sm leading-6 text-gray-600'>
|
||||
{tier.features.map((feature) => (
|
||||
<li key={feature} className='flex gap-x-3'>
|
||||
<AiFillCheckCircle className='h-6 w-5 flex-none text-indigo-600' aria-hidden='true' />
|
||||
{feature}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
<a
|
||||
href={tier.href}
|
||||
aria-describedby={tier.id}
|
||||
className={classNames(
|
||||
tier.mostPopular
|
||||
? 'bg-indigo-600 text-white shadow-sm hover:bg-indigo-500'
|
||||
: 'text-indigo-600 ring-1 ring-inset ring-indigo-200 hover:ring-indigo-300',
|
||||
'mt-8 block rounded-md py-2 px-3 text-center text-sm font-semibold leading-6 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600'
|
||||
)}
|
||||
>
|
||||
Buy plan
|
||||
</a>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* FAQs */}
|
||||
<div className='mx-auto max-w-2xl divide-y divide-gray-900/10 px-6 pb-8 sm:pb-24 sm:pt-12 lg:max-w-7xl lg:px-8 lg:pb-32'>
|
||||
<h2 className='text-2xl font-bold leading-10 tracking-tight text-gray-900'>Frequently asked questions</h2>
|
||||
<dl className='mt-10 space-y-8 divide-y divide-gray-900/10'>
|
||||
{faqs.map((faq) => (
|
||||
<div key={faq.id} className='pt-8 lg:grid lg:grid-cols-12 lg:gap-8'>
|
||||
<dt className='text-base font-semibold leading-7 text-gray-900 lg:col-span-5'>{faq.question}</dt>
|
||||
<dd className='mt-4 lg:col-span-7 lg:mt-0'>
|
||||
<p className='text-base leading-7 text-gray-600'>{faq.answer}</p>
|
||||
</dd>
|
||||
</div>
|
||||
))}
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
{/* CTA section */}
|
||||
<div className='relative -z-10 mt-32 px-6 lg:px-8'>
|
||||
<div
|
||||
className='absolute inset-x-0 top-1/2 -z-10 flex -translate-y-1/2 transform-gpu justify-center overflow-hidden blur-3xl sm:bottom-0 sm:right-[calc(50%-6rem)] sm:top-auto sm:translate-y-0 sm:transform-gpu sm:justify-end'
|
||||
aria-hidden='true'
|
||||
>
|
||||
<div
|
||||
className='aspect-[1108/632] w-[69.25rem] flex-none bg-gradient-to-r from-[#ff80b5] to-[#9089fc] opacity-25'
|
||||
style={{
|
||||
clipPath:
|
||||
'polygon(73.6% 48.6%, 91.7% 88.5%, 100% 53.9%, 97.4% 18.1%, 92.5% 15.4%, 75.7% 36.3%, 55.3% 52.8%, 46.5% 50.9%, 45% 37.4%, 50.3% 13.1%, 21.3% 36.2%, 0.1% 0.1%, 5.4% 49.1%, 21.4% 36.4%, 58.9% 100%, 73.6% 48.6%)',
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<div className='mx-auto max-w-2xl text-center'>
|
||||
<h2 className='text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl'>
|
||||
Boost your productivity.
|
||||
<br />
|
||||
Start using our app today.
|
||||
</h2>
|
||||
<p className='mx-auto mt-6 max-w-xl text-lg leading-8 text-gray-600'>
|
||||
Incididunt sint fugiat pariatur cupidatat consectetur sit cillum anim id veniam aliqua proident excepteur
|
||||
commodo do ea.
|
||||
</p>
|
||||
<div className='mt-10 flex items-center justify-center gap-x-6'>
|
||||
<a
|
||||
href='#'
|
||||
className='rounded-md bg-indigo-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600'
|
||||
>
|
||||
Get started
|
||||
</a>
|
||||
<a href='#' className='text-sm font-semibold leading-6 text-gray-900'>
|
||||
Learn more <span aria-hidden='true'>→</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
className='absolute left-1/2 right-0 top-full -z-10 hidden -translate-y-1/2 transform-gpu overflow-hidden blur-3xl sm:block'
|
||||
aria-hidden='true'
|
||||
>
|
||||
<div
|
||||
className='aspect-[1155/678] w-[72.1875rem] bg-gradient-to-tr from-[#ff80b5] to-[#9089fc] opacity-30'
|
||||
style={{
|
||||
clipPath:
|
||||
'polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)',
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
{/* Footer */}
|
||||
<div className='mx-auto mt-32 max-w-7xl px-6 lg:px-8'>
|
||||
<footer
|
||||
aria-labelledby='footer-heading'
|
||||
className='relative border-t border-gray-900/10 py-24 sm:mt-56 sm:py-32'
|
||||
>
|
||||
<h2 id='footer-heading' className='sr-only'>
|
||||
Footer
|
||||
</h2>
|
||||
<div className='xl:grid xl:grid-cols-3 xl:gap-8'>
|
||||
<img
|
||||
className='h-7'
|
||||
src='https://tailwindui.com/img/logos/mark.svg?color=indigo&shade=600'
|
||||
alt='Company name'
|
||||
/>
|
||||
<div className='mt-16 grid grid-cols-2 gap-8 xl:col-span-2 xl:mt-0'>
|
||||
<div className='md:grid md:grid-cols-2 md:gap-8'>
|
||||
<div>
|
||||
<h3 className='text-sm font-semibold leading-6 text-gray-900'>Solutions</h3>
|
||||
<ul role='list' className='mt-6 space-y-4'>
|
||||
{footerNavigation.solutions.map((item) => (
|
||||
<li key={item.name}>
|
||||
<a href={item.href} className='text-sm leading-6 text-gray-600 hover:text-gray-900'>
|
||||
{item.name}
|
||||
</a>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
<div className='mt-10 md:mt-0'>
|
||||
<h3 className='text-sm font-semibold leading-6 text-gray-900'>Support</h3>
|
||||
<ul role='list' className='mt-6 space-y-4'>
|
||||
{footerNavigation.support.map((item) => (
|
||||
<li key={item.name}>
|
||||
<a href={item.href} className='text-sm leading-6 text-gray-600 hover:text-gray-900'>
|
||||
{item.name}
|
||||
</a>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div className='md:grid md:grid-cols-2 md:gap-8'>
|
||||
<div>
|
||||
<h3 className='text-sm font-semibold leading-6 text-gray-900'>Company</h3>
|
||||
<ul role='list' className='mt-6 space-y-4'>
|
||||
{footerNavigation.company.map((item) => (
|
||||
<li key={item.name}>
|
||||
<a href={item.href} className='text-sm leading-6 text-gray-600 hover:text-gray-900'>
|
||||
{item.name}
|
||||
</a>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
<div className='mt-10 md:mt-0'>
|
||||
<h3 className='text-sm font-semibold leading-6 text-gray-900'>Legal</h3>
|
||||
<ul role='list' className='mt-6 space-y-4'>
|
||||
{footerNavigation.legal.map((item) => (
|
||||
<li key={item.name}>
|
||||
<a href={item.href} className='text-sm leading-6 text-gray-600 hover:text-gray-900'>
|
||||
{item.name}
|
||||
</a>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
|
||||
import logo from './static/logo.png'
|
||||
|
||||
import { Disclosure } from '@headlessui/react';
|
||||
import { AiOutlineBars, AiOutlineClose, AiOutlineUser } from 'react-icons/ai';
|
||||
import useAuth from '@wasp/auth/useAuth';
|
||||
|
Loading…
x
Reference in New Issue
Block a user