diff --git a/app/(landing)/_components/hero-section.tsx b/app/(landing)/_components/hero-section.tsx deleted file mode 100644 index d736bad..0000000 --- a/app/(landing)/_components/hero-section.tsx +++ /dev/null @@ -1,115 +0,0 @@ -'use client'; - -import { MdCheckCircle, MdOpenInNew, MdRocketLaunch } from 'react-icons/md'; - -import { Button } from '@/components/ui/button'; - -interface HeroSectionProps { - onGetStarted: () => void; - isLoading: boolean; - authError: string | null; - buttonText: string; // Dynamic button text based on auth/environment -} - -export function HeroSection({ - onGetStarted, - isLoading, - authError, - buttonText, -}: HeroSectionProps) { - return ( -
- {/* Background glow effect */} -
-
-
- -
- {/* Version Badge */} -
- - - - - New in Fulling v2 -
- - {/* Main Heading */} -

- Describe the app.
- - Fulling handles the rest. - -

- - {/* Subtitle */} -

- Import an existing repo or start from scratch. Agents set up the workspace, runtime, - optional database, and project automation in the background. -

- - {/* Error message */} - {authError && ( -
- {authError} -
- )} - - {/* CTA Buttons */} -
- - - -
- - {/* Features */} - {FEATURES_JSX} -
-
- ); -} - -// Static JSX hoisted outside component to avoid recreation on every render -const FEATURES_JSX = ( -
-
- - Start from a prompt or import from GitHub -
-
- - Add PostgreSQL only when you need it -
-
- - Agents handle runtime and project setup automatically -
-
-); diff --git a/app/(landing)/_components/landing-client.tsx b/app/(landing)/_components/landing-client.tsx index 9a16e83..00a0e79 100644 --- a/app/(landing)/_components/landing-client.tsx +++ b/app/(landing)/_components/landing-client.tsx @@ -1,65 +1,154 @@ -'use client'; +import { + MdCheckCircleOutline, + MdLockOutline, + MdOutlineShield, +} from 'react-icons/md'; +import Image from 'next/image'; +import Link from 'next/link'; -import { useCallback, useState } from 'react'; -import { useRouter } from 'next/navigation'; +const navItems = ['Product', 'Templates', 'Solutions', 'Resources', 'Pricing']; -import { HeroSection } from './hero-section'; -import { LandingHeader } from './landing-header'; -import { TerminalDemo } from './terminal-demo'; - -interface LandingClientProps { - starCount: number | null; -} +const proofItems = [ + { + icon: MdOutlineShield, + title: 'Enterprise ready', + detail: 'SSO, RBAC, audit logs', + }, + { + icon: MdLockOutline, + title: 'Your data, your control', + detail: 'Private by default', + }, + { + icon: MdCheckCircleOutline, + title: 'Built for reliability', + detail: 'Observability & retries', + }, +]; /** - * Client-side landing page shell. - * - * Handles all interactive logic (auth, navigation) while receiving - * server-fetched data (starCount) as props. - * - * Authentication Flow (v2.0.0): - * - Sealos environment: Auto-trigger auth on page load if unauthenticated - * - Non-Sealos + Authenticated: Show "Go to Projects" button - * - Non-Sealos + Unauthenticated: Show "Start Building Now" → /login - * - Authentication success: Update button text, user clicks to navigate + * Landing page shell. */ -export function LandingClient({ starCount }: LandingClientProps) { - const router = useRouter(); +export function LandingClient() { + return ( +
+
+ - const [authError, setAuthError] = useState(null); +
+
+
+
+ + + + Workspace OS for teams +
- // Handle Get Started button click - const handleGetStarted = useCallback(() => { - setAuthError(null); - router.push('/login'); - }, [router]); +

+ Ship AI +
+ workspaces, +
+ not prompts +

- // Handle Sign In button click - const handleSignIn = useCallback(() => { - router.push('/login'); - }, [router]); +

+ Build, run, and share AI workspaces as products. +
+ Versioned. Reliable. Governed. +

- const isButtonLoading = false; - const shouldShowGoToProjects = false; +
+ + Create workspace + + + View templates + +
- return ( -
- -
- - -
+
+ {proofItems.map((item) => ( +
+ +
+

+ {item.title} +

+

+ {item.detail} +

+
+
+ ))} +
+
+ +
+
+ A conceptual AI workspace assembled from mission, knowledge, skills, runtime, scripts, memory, and sharing pieces. +
+
+ +
+
+
+
); } + +function LandingHeader() { + return ( +
+
+ + Fulling + + + + +
+ + Sign in + + + Create workspace + +
+
+
+ ); +} diff --git a/app/(landing)/_components/landing-header.tsx b/app/(landing)/_components/landing-header.tsx deleted file mode 100644 index 3773c47..0000000 --- a/app/(landing)/_components/landing-header.tsx +++ /dev/null @@ -1,75 +0,0 @@ -'use client'; - -import Image from 'next/image'; -import Link from 'next/link'; - -import { Button } from '@/components/ui/button'; - -interface LandingHeaderProps { - isAuthenticated: boolean; - isSealos: boolean; // Environment detection - onSignIn?: () => void; - starCount: number | null; - isLoading: boolean; // Loading state for button -} - -function formatStarCount(count: number): string { - if (count >= 1000) { - return new Intl.NumberFormat('en', { - notation: 'compact', - maximumFractionDigits: 1, - }).format(count); - } - return count.toString(); -} - -export function LandingHeader({ isAuthenticated, isSealos, onSignIn, starCount, isLoading }: LandingHeaderProps) { - return ( -
-
- {/* Logo */} - - Fulling Logo - - Fulling - - - - {/* Navigation */} - -
-
- ); -} diff --git a/app/(landing)/_components/terminal-demo.tsx b/app/(landing)/_components/terminal-demo.tsx deleted file mode 100644 index fb1a4db..0000000 --- a/app/(landing)/_components/terminal-demo.tsx +++ /dev/null @@ -1,128 +0,0 @@ -import { MdArrowOutward, MdAutoAwesome,MdCheck, MdTerminal } from 'react-icons/md'; - -export function TerminalDemo() { - return ( -
- {/* Background gradient */} -
-
- - {/* Terminal Window */} -
- {/* Title Bar */} -
-
-
-
-
-
-
- - Fulling — zsh -
-
-
- - {/* Terminal Content */} -
- {/* Command Input */} -
-
- -
-
- ~/projects - fulling "Import this repo and add - a PostgreSQL database" -
-
- - {/* Progress Steps */} -
-
-
- Cloning repository into sandbox... -
-
- Provisioning PostgreSQL cluster... -
-
- Wiring runtime and project config... -
-
-
- - {/* File Tree */} -
-
-
# Workspace updates
-
- - - - - - -
-
- Reconciliation continues in the background. -
-
- - {/* Check Items */} -
- - - -
- - {/* Success Card */} -
-
-
-
-
- Success! Project is running -
- - Live at repo-preview-on.sealos.app - - -
-
-
-
- - {/* Waiting Input */} -
-
- -
-
- Now add an admin dashboard and seed the database - -
-
-
-
-
- ); -} - -function FileEntry({ name }: { name: string }) { - return ( -
- + - {name} -
- ); -} - -function CheckItem({ text }: { text: string }) { - return ( -
- - {text} -
- ); -} diff --git a/app/(landing)/page.tsx b/app/(landing)/page.tsx index fb1e3e5..c5b9e15 100644 --- a/app/(landing)/page.tsx +++ b/app/(landing)/page.tsx @@ -2,24 +2,7 @@ import { LandingClient } from './_components/landing-client'; /** * Landing page — Server Component. - * - * Fetches the GitHub star count on the server with ISR caching (1 hour), - * then passes it down to the client-side shell. */ export default async function LandingPage() { - const starCount = await getStarCount(); - return ; -} - -async function getStarCount(): Promise { - try { - const res = await fetch('https://api.github.com/repos/FullAgent/fulling', { - next: { revalidate: 3600 }, // ISR: revalidate every hour - }); - if (!res.ok) return null; - const data = await res.json(); - return data.stargazers_count; - } catch { - return null; - } + return ; } diff --git a/app/globals.css b/app/globals.css index 4a22e0a..a014b60 100644 --- a/app/globals.css +++ b/app/globals.css @@ -364,6 +364,11 @@ --shadow-2xl: var(--shadow-2xl); } +#devtools-indicator, +[data-nextjs-dev-tools-button] { + display: none !important; +} + @layer base { * { @apply border-border; @@ -447,4 +452,4 @@ transition-duration: 0.01ms !important; scroll-behavior: auto !important; } -} \ No newline at end of file +} diff --git a/app/layout.tsx b/app/layout.tsx index f6f678b..9e33e0b 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -18,9 +18,9 @@ const notoSans = Noto_Sans({ }); export const metadata: Metadata = { - title: 'Fulling - AI-Powered Full-Stack Development', + title: 'Fulling - Dedicated AI Workspaces', description: - 'Create or import full-stack projects in isolated browser sandboxes powered by Claude Code.', + 'Build, run, and share dedicated AI workspaces as versioned, reliable products.', }; export default function RootLayout({ diff --git a/landing-candidate-2.png b/landing-candidate-2.png new file mode 100644 index 0000000..794caa7 Binary files /dev/null and b/landing-candidate-2.png differ diff --git a/public/images/landing-workspace-concept.png b/public/images/landing-workspace-concept.png new file mode 100644 index 0000000..47cafbb Binary files /dev/null and b/public/images/landing-workspace-concept.png differ