diff --git a/apps/web/app/(landing)/layout.tsx b/apps/web/app/(landing)/layout.tsx new file mode 100644 index 00000000..b5119cad --- /dev/null +++ b/apps/web/app/(landing)/layout.tsx @@ -0,0 +1,19 @@ +import { Instrument_Serif } from "next/font/google"; + +const instrumentSerif = Instrument_Serif({ + subsets: ["latin"], + weight: "400", + variable: "--font-serif", +}); + +export default function LandingLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( +
+ {children} +
+ ); +} diff --git a/apps/web/app/(landing)/page.tsx b/apps/web/app/(landing)/page.tsx new file mode 100644 index 00000000..3394d534 --- /dev/null +++ b/apps/web/app/(landing)/page.tsx @@ -0,0 +1,31 @@ +"use client"; + +import { useEffect } from "react"; +import { useRouter } from "next/navigation"; +import { useAuthStore } from "@/features/auth"; +import { useNavigationStore } from "@/features/navigation"; +import { MulticaLanding } from "@/features/landing/components/multica-landing"; +import { MulticaIcon } from "@/components/multica-icon"; + +export default function LandingPage() { + const router = useRouter(); + const user = useAuthStore((s) => s.user); + const isLoading = useAuthStore((s) => s.isLoading); + + useEffect(() => { + if (!isLoading && user) { + const lastPath = useNavigationStore.getState().lastPath; + router.replace(lastPath); + } + }, [isLoading, user, router]); + + if (isLoading || user) { + return ( +
+ +
+ ); + } + + return ; +} diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx deleted file mode 100644 index 179831dd..00000000 --- a/apps/web/app/page.tsx +++ /dev/null @@ -1,21 +0,0 @@ -"use client"; - -import { useEffect } from "react"; -import { useRouter } from "next/navigation"; -import { useNavigationStore } from "@/features/navigation"; -import { MulticaIcon } from "@/components/multica-icon"; - -export default function Home() { - const router = useRouter(); - - useEffect(() => { - const lastPath = useNavigationStore.getState().lastPath; - router.replace(lastPath); - }, [router]); - - return ( -
- -
- ); -} diff --git a/apps/web/features/landing/components/multica-landing.tsx b/apps/web/features/landing/components/multica-landing.tsx new file mode 100644 index 00000000..59d249c0 --- /dev/null +++ b/apps/web/features/landing/components/multica-landing.tsx @@ -0,0 +1,167 @@ +import Image from "next/image"; +import Link from "next/link"; +import { MulticaIcon } from "@/components/multica-icon"; +import { cn } from "@/lib/utils"; + +const githubUrl = "https://github.com/multica-ai/multica"; + +export function MulticaLanding() { + return ( +
+ + +
+
+ + + + multica + + + +
+ + + GitHub + + + Log in + +
+
+
+ +
+
+
+

+ Your next 10 hires +
+ won't be human. +

+ +

+ Multica is project management for human + agent teams. Assign + tasks, manage runtimes, compound skills, all in one place. +

+ +
+ + Start free trial + + + + GitHub + +
+ +
+ +
+
+
+
+
+ ); +} + +function LandingBackdrop() { + return ( +
+ +
+
+ ); +} + +function GitHubMark({ className }: { className?: string }) { + return ( + + ); +} + +function ProductImagePlaceholder() { + return ( +
+
+
+ +
+
+ +
+
+ +
+ +

+ Real product screenshot goes here +

+ +

+ Keeping the space and visual weight of the hero preview, while + leaving the center as a clean image placeholder for now. +

+
+
+
+ ); +} + +function headerButtonClassName(tone: "ghost" | "solid") { + return cn( + "inline-flex items-center justify-center gap-2 rounded-[11px] px-4 py-2.5 text-[13px] font-semibold transition-colors", + tone === "solid" + ? "bg-white text-[#0a0d12] hover:bg-white/92" + : "border border-white/18 bg-black/16 text-white backdrop-blur-sm hover:bg-black/24", + ); +} + +function heroButtonClassName(tone: "ghost" | "solid") { + return cn( + "inline-flex items-center justify-center gap-2 rounded-[12px] px-5 py-3 text-[14px] font-semibold transition-colors", + tone === "solid" + ? "bg-white text-[#0a0d12] hover:bg-white/92" + : "border border-white/18 bg-black/16 text-white backdrop-blur-sm hover:bg-black/24", + ); +} diff --git a/apps/web/public/images/landing-bg.jpg b/apps/web/public/images/landing-bg.jpg new file mode 100644 index 00000000..eda4a4d8 Binary files /dev/null and b/apps/web/public/images/landing-bg.jpg differ