feat: add cta to landing page
This commit is contained in:
91
apps/web/src/views/home/components/Cta.tsx
Normal file
91
apps/web/src/views/home/components/Cta.tsx
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
import { useEffect, useState } from "react";
|
||||||
|
|
||||||
|
import Button from "~/components/Button";
|
||||||
|
|
||||||
|
const Cta = ({ theme }: { theme: string }) => {
|
||||||
|
const [currentWorkspaceSlug, setCurrentWorkspaceSlug] = useState("acme");
|
||||||
|
const [isVisible, setIsVisible] = useState(true);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const workspaceSlugs = [
|
||||||
|
"acme",
|
||||||
|
"henry",
|
||||||
|
"cal",
|
||||||
|
"documenso",
|
||||||
|
"jack",
|
||||||
|
"openstatus",
|
||||||
|
"florrie",
|
||||||
|
"supabase",
|
||||||
|
];
|
||||||
|
|
||||||
|
const interval = setInterval(() => {
|
||||||
|
setIsVisible(false);
|
||||||
|
setTimeout(() => {
|
||||||
|
setCurrentWorkspaceSlug((prev) => {
|
||||||
|
const currentIndex = workspaceSlugs.indexOf(prev);
|
||||||
|
const nextIndex = (currentIndex + 1) % workspaceSlugs.length;
|
||||||
|
const nextSlug = workspaceSlugs[nextIndex];
|
||||||
|
if (!nextSlug) return prev;
|
||||||
|
return nextSlug;
|
||||||
|
});
|
||||||
|
setIsVisible(true);
|
||||||
|
}, 500);
|
||||||
|
}, 3000);
|
||||||
|
|
||||||
|
return () => clearInterval(interval);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="relative isolate overflow-hidden">
|
||||||
|
<div className="px-6 py-24 sm:px-6 sm:py-32 lg:px-8">
|
||||||
|
<div className="mx-auto flex max-w-2xl flex-col items-center text-center">
|
||||||
|
<div
|
||||||
|
className={`mb-8 flex items-center gap-2 rounded-2xl border bg-light-50 px-4 py-2 text-center text-sm font-bold text-light-1000 transition-all duration-500 dark:border-dark-300 dark:bg-dark-50 dark:text-dark-950 lg:text-[16px] ${
|
||||||
|
isVisible
|
||||||
|
? "translate-y-0 opacity-100"
|
||||||
|
: "-translate-y-4 opacity-0"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<p>kan.bn/{currentWorkspaceSlug}</p>
|
||||||
|
</div>
|
||||||
|
<h2 className="text-balance text-4xl font-bold tracking-tight text-light-1000 dark:text-dark-1000 sm:text-4xl">
|
||||||
|
Get started for free today
|
||||||
|
</h2>
|
||||||
|
<p className="text-md/8 mx-auto mt-6 max-w-[375px] text-pretty text-light-900 dark:text-dark-900">
|
||||||
|
Unlimited boards, unlimited lists, unlimited cards. No credit card
|
||||||
|
required.
|
||||||
|
</p>
|
||||||
|
<div className="mt-10 flex items-center justify-center gap-x-6">
|
||||||
|
<Button size="lg">Get started</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<svg
|
||||||
|
viewBox="0 0 1024 1024"
|
||||||
|
aria-hidden="true"
|
||||||
|
className="absolute left-1/2 top-[65%] -z-10 size-[60rem] -translate-x-1/2 [mask-image:radial-gradient(closest-side,white,transparent)] lg:size-[64rem]"
|
||||||
|
>
|
||||||
|
<circle
|
||||||
|
r={512}
|
||||||
|
cx={512}
|
||||||
|
cy={512}
|
||||||
|
fill="url(#8d958450-c69f-4251-94bc-4e091a323369)"
|
||||||
|
fillOpacity="0.7"
|
||||||
|
/>
|
||||||
|
<defs>
|
||||||
|
<radialGradient id="8d958450-c69f-4251-94bc-4e091a323369">
|
||||||
|
<stop
|
||||||
|
stopColor={theme === "light" ? "hsl(0deg 0% 52.2%)" : "#505050"}
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
offset={1}
|
||||||
|
stopColor={theme === "light" ? "hsl(0deg 0% 43.5%)" : "#707070"}
|
||||||
|
/>
|
||||||
|
</radialGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Cta;
|
||||||
@@ -50,7 +50,7 @@ const faqs = [
|
|||||||
|
|
||||||
const Faqs = () => {
|
const Faqs = () => {
|
||||||
return (
|
return (
|
||||||
<div className="mx-auto max-w-[900px] px-4 pb-12">
|
<div className="mx-auto max-w-[900px] px-4">
|
||||||
<div className="flex flex-col items-center justify-center pb-12">
|
<div className="flex flex-col items-center justify-center pb-12">
|
||||||
<div className="flex items-center gap-2 rounded-full border bg-light-50 px-4 py-1 text-center text-xs text-light-1000 dark:border-dark-300 dark:bg-dark-50 dark:text-dark-900 lg:text-sm">
|
<div className="flex items-center gap-2 rounded-full border bg-light-50 px-4 py-1 text-center text-xs text-light-1000 dark:border-dark-300 dark:bg-dark-50 dark:text-dark-900 lg:text-sm">
|
||||||
<p>FAQs</p>
|
<p>FAQs</p>
|
||||||
@@ -59,7 +59,7 @@ const Faqs = () => {
|
|||||||
<p className="mt-2 text-center text-3xl font-bold text-light-1000 dark:text-dark-1000 lg:text-4xl">
|
<p className="mt-2 text-center text-3xl font-bold text-light-1000 dark:text-dark-1000 lg:text-4xl">
|
||||||
Questions?
|
Questions?
|
||||||
</p>
|
</p>
|
||||||
<p className="text:md mt-3 max-w-[600px] text-center text-dark-900 lg:text-lg">
|
<p className="text:md lg:text-md mt-3 max-w-[500px] text-center text-dark-900">
|
||||||
Find answers to common questions about the project. Can't find what
|
Find answers to common questions about the project. Can't find what
|
||||||
you're looking for? Feel free to{" "}
|
you're looking for? Feel free to{" "}
|
||||||
<Link href="mailto:support@kan.bn" className="underline">
|
<Link href="mailto:support@kan.bn" className="underline">
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ const Features = ({ theme }: { theme: "light" | "dark" }) => {
|
|||||||
<p className="mt-2 text-center text-3xl font-bold text-light-1000 dark:text-dark-1000 lg:text-4xl">
|
<p className="mt-2 text-center text-3xl font-bold text-light-1000 dark:text-dark-1000 lg:text-4xl">
|
||||||
Kanban reimagined
|
Kanban reimagined
|
||||||
</p>
|
</p>
|
||||||
<p className="text-md mt-3 max-w-[600px] text-center text-dark-900 lg:text-lg">
|
<p className="text-md lg:text-md mt-3 max-w-[500px] text-center text-dark-900">
|
||||||
Simple, visual task management that just works. Drag and drop cards,
|
Simple, visual task management that just works. Drag and drop cards,
|
||||||
collaborate with your team, and get more done.
|
collaborate with your team, and get more done.
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ const StatusMarker = () => (
|
|||||||
|
|
||||||
const Footer = () => {
|
const Footer = () => {
|
||||||
return (
|
return (
|
||||||
<footer className="z-10 mt-20 w-full border-t border-light-300 bg-light-50 py-8 dark:border-dark-300 dark:bg-dark-50">
|
<footer className="z-10 w-full border-t border-light-300 bg-light-50 py-8 dark:border-dark-300 dark:bg-dark-50">
|
||||||
<div className="mx-auto max-w-7xl px-6 py-16 sm:py-24 lg:px-8 lg:py-24">
|
<div className="mx-auto max-w-7xl px-6 py-16 sm:py-24 lg:px-8 lg:py-24">
|
||||||
<div className="xl:grid xl:grid-cols-3 xl:gap-8">
|
<div className="xl:grid xl:grid-cols-3 xl:gap-8">
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -89,9 +89,9 @@ const Pricing = () => {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p className="mt-2 text-center text-3xl font-bold text-light-1000 dark:text-dark-1000 lg:text-4xl">
|
<p className="mt-2 text-center text-3xl font-bold text-light-1000 dark:text-dark-1000 lg:text-4xl">
|
||||||
Simple pricing to fit your needs
|
Simple pricing
|
||||||
</p>
|
</p>
|
||||||
<p className="text:md mt-3 max-w-[600px] text-center text-dark-900 lg:text-lg">
|
<p className="text:md lg:text-md mt-3 max-w-[500px] text-center text-dark-900">
|
||||||
Get started for free, with no usage limits. For collaboration, upgrade
|
Get started for free, with no usage limits. For collaboration, upgrade
|
||||||
to a plan that fits the size of your team.
|
to a plan that fits the size of your team.
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import PatternedBackground from "~/components/PatternedBackground";
|
|||||||
import { env } from "~/env";
|
import { env } from "~/env";
|
||||||
import { useTheme } from "~/providers/theme";
|
import { useTheme } from "~/providers/theme";
|
||||||
import { api } from "~/utils/api";
|
import { api } from "~/utils/api";
|
||||||
|
import Cta from "./components/Cta";
|
||||||
import FAQs from "./components/Faqs";
|
import FAQs from "./components/Faqs";
|
||||||
import Features from "./components/Features";
|
import Features from "./components/Features";
|
||||||
import Footer from "./components/Footer";
|
import Footer from "./components/Footer";
|
||||||
@@ -109,6 +110,9 @@ export default function HomeView() {
|
|||||||
<div id="faq" className="absolute -top-20" />
|
<div id="faq" className="absolute -top-20" />
|
||||||
<FAQs />
|
<FAQs />
|
||||||
</div>
|
</div>
|
||||||
|
<div className="relative">
|
||||||
|
<Cta theme={theme.activeTheme} />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<Footer />
|
<Footer />
|
||||||
|
|||||||
Reference in New Issue
Block a user