diff options
| author | Maze Winther <mazewinther@gmail.com> | 2026-03-02 10:36:19 +0100 |
|---|---|---|
| committer | Maze Winther <mazewinther@gmail.com> | 2026-03-02 10:36:19 +0100 |
| commit | 82f8f76a844db0b6f10bec9a07ac67a45ad5df5a (patch) | |
| tree | 164c5ab21cce9985e26780f14bb3cfd8cf812304 /apps/web/src/components | |
| parent | 2074dde3e38655fbc9126924685697521fe4b73d (diff) | |
| download | opencut-82f8f76a844db0b6f10bec9a07ac67a45ad5df5a.tar.gz | |
feat: mobile gate
Diffstat (limited to 'apps/web/src/components')
| -rw-r--r-- | apps/web/src/components/editor/mobile-gate.tsx | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/apps/web/src/components/editor/mobile-gate.tsx b/apps/web/src/components/editor/mobile-gate.tsx new file mode 100644 index 00000000..685ce178 --- /dev/null +++ b/apps/web/src/components/editor/mobile-gate.tsx @@ -0,0 +1,74 @@ +"use client"; + +import { useEffect, useState } from "react"; +import Link from "next/link"; +import { Button } from "../ui/button"; +import { HugeiconsIcon } from "@hugeicons/react"; +import { ArrowLeft01Icon, ArrowRight01Icon } from "@hugeicons/core-free-icons"; +import { useRouter } from "next/navigation"; + +const STORAGE_KEY = "mobile-acknowledged"; + +interface MobileGateProps { + children: React.ReactNode; +} + +export function MobileGate({ children }: MobileGateProps) { + const router = useRouter(); + const [show, setShow] = useState<boolean | null>(null); + + useEffect(() => { + const isMobile = window.innerWidth < 1024; + const acknowledged = localStorage.getItem(STORAGE_KEY) === "true"; + setShow(isMobile && !acknowledged); + }, []); + + if (show === null) return null; + if (!show) return <>{children}</>; + + const handleContinue = () => { + localStorage.setItem(STORAGE_KEY, "true"); + setShow(false); + }; + + const handleGoBack = () => { + router.back(); + }; + + return ( + <div className="dark bg-background relative flex h-screen w-screen flex-col overflow-hidden"> + <Button + variant="text" + className="absolute top-6 left-6 flex items-center gap-1 text-muted-foreground" + onClick={handleGoBack} + > + <HugeiconsIcon icon={ArrowLeft01Icon} className="size-4" /> + <span className=" text-sm">Go back</span> + </Button> + + <div className="flex flex-1 flex-col justify-center gap-5 px-7"> + <div className="flex flex-col gap-3"> + <h1 className="text-foreground text-3xl font-bold tracking-tight"> + Desktop only (for now) + </h1> + <p className="text-muted-foreground text-sm leading-relaxed"> + OpenCut isn't optimized for mobile or iPad yet. Things will break + and the layout will be a mess. Come back on a desktop for the real + experience. + </p> + </div> + <div className="flex items-center gap-3"> + <Button variant="foreground" onClick={handleContinue}> + Take a look anyway + </Button> + <Button variant="ghost" asChild> + <Link href="/roadmap" className="flex items-center gap-1"> + Roadmap + <HugeiconsIcon icon={ArrowRight01Icon} size={14} /> + </Link> + </Button> + </div> + </div> + </div> + ); +} |
