"use client"; import { useState, useEffect } from "react"; import { createPortal } from "react-dom"; import { Plus_Jakarta_Sans } from "next/font/google"; import { TypeSelector } from "./TypeSelector"; import { FreshIdeaSetup } from "./FreshIdeaSetup"; import { ChatImportSetup } from "./ChatImportSetup"; import { CodeImportSetup } from "./CodeImportSetup"; import { MigrateSetup } from "./MigrateSetup"; import { JM } from "./modal-theme"; const modalFont = Plus_Jakarta_Sans({ subsets: ["latin"], weight: ["400", "500", "600", "700", "800"], variable: "--font-justine-jakarta", display: "swap", }); export type CreationMode = "fresh" | "chat-import" | "code-import" | "migration"; interface CreateProjectFlowProps { open: boolean; onOpenChange: (open: boolean) => void; workspace: string; } type Step = "select-type" | "setup"; export function CreateProjectFlow({ open, onOpenChange, workspace }: CreateProjectFlowProps) { const [step, setStep] = useState("setup"); const [mode, setMode] = useState("fresh"); useEffect(() => { if (open) { setStep("setup"); setMode("fresh"); } }, [open]); useEffect(() => { if (!open) return; const handler = (e: KeyboardEvent) => { if (e.key === "Escape") onOpenChange(false); }; window.addEventListener("keydown", handler); return () => window.removeEventListener("keydown", handler); }, [open, onOpenChange]); if (!open) return null; const handleSelectType = (selected: CreationMode) => { setMode(selected); setStep("setup"); }; const handleBack = () => { setStep("select-type"); setMode(null); }; const setupProps = { workspace, onClose: () => onOpenChange(false), onBack: handleBack }; return createPortal( <> {/* Backdrop */}
onOpenChange(false)} style={{ position: "fixed", inset: 0, zIndex: 200, background: JM.overlay, backdropFilter: "blur(2px)", WebkitBackdropFilter: "blur(2px)", animation: "vibn-fadeIn 0.15s ease", }} /> {/* Modal container — matches justine/03_dashboard.html #modal-new */}
e.stopPropagation()} className={modalFont.variable} style={{ background: "#fff", borderRadius: 16, boxShadow: JM.cardShadow, width: "100%", maxWidth: JM.cardMaxWidth, fontFamily: JM.fontSans, pointerEvents: "all", animation: "vibn-slideUp 0.18s cubic-bezier(0.4,0,0.2,1)", overflow: "hidden", }} > {step === "select-type" && ( onOpenChange(false)} /> )} {step === "setup" && mode === "fresh" && } {step === "setup" && mode === "chat-import" && } {step === "setup" && mode === "code-import" && } {step === "setup" && mode === "migration" && }
, document.body ); }