Compare commits
29 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d87ad0467b | |||
| 60e5eaee78 | |||
| f7a8a7d76a | |||
| f40adddf1b | |||
| 2a8ba69422 | |||
| 4f2137d411 | |||
| f145cfbe21 | |||
| d2f6a92f5d | |||
| 88bc009d32 | |||
| 699db63ab6 | |||
| b7bc3df039 | |||
| 6310a94da7 | |||
| 30c8fdc98a | |||
| 0095283904 | |||
| bff7bdf9d1 | |||
| 782a109478 | |||
| 83b6477b36 | |||
| 2bceabe6f7 | |||
| 34997d92d7 | |||
| 847735c810 | |||
| 070d6bcb5a | |||
| 418b4aa2a0 | |||
| 71d831ffb3 | |||
| 37cdb52956 | |||
| a9d5195393 | |||
| 8c938f8448 | |||
| ace130b885 | |||
| c1b3997b9f | |||
| 6a0aefc3fe |
@@ -1,5 +1,145 @@
|
||||
@import "tailwindcss";
|
||||
@import "./styles/variables.css";
|
||||
@import "./styles/theme.css";
|
||||
@import "./styles/utilities.css";
|
||||
@import "./styles/base.css";
|
||||
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap');
|
||||
|
||||
@layer base {
|
||||
* {
|
||||
@apply m-0 p-0 box-border;
|
||||
}
|
||||
|
||||
html {
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
body {
|
||||
@apply bg-background text-foreground overflow-x-hidden;
|
||||
font-family: var(--font-inter), sans-serif;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
font-weight: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
@layer utilities {
|
||||
.rounded-theme {
|
||||
@apply rounded-md;
|
||||
}
|
||||
|
||||
.rounded-theme-capped {
|
||||
@apply rounded-2xl;
|
||||
}
|
||||
|
||||
.rounded-theme-sharp {
|
||||
@apply rounded-none;
|
||||
}
|
||||
|
||||
.rounded-theme-pill {
|
||||
@apply rounded-full;
|
||||
}
|
||||
|
||||
.p-content {
|
||||
@apply px-6 sm:px-8 lg:px-10 py-8 sm:py-12 lg:py-16;
|
||||
}
|
||||
|
||||
.w-content-width {
|
||||
width: var(--width-content-width);
|
||||
}
|
||||
|
||||
.max-w-content-width {
|
||||
max-width: var(--width-content-width);
|
||||
}
|
||||
|
||||
.animate-in {
|
||||
animation: fadeInUp 0.6s ease-out forwards;
|
||||
}
|
||||
|
||||
@keyframes fadeInUp {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(20px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
.fade-in {
|
||||
animation: fadeIn 0.5s ease-out;
|
||||
}
|
||||
|
||||
@keyframes fadeIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.slide-in-from-bottom-2 {
|
||||
animation: slideInFromBottom2 0.4s ease-out;
|
||||
}
|
||||
|
||||
@keyframes slideInFromBottom2 {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(8px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
.slide-in-from-bottom-4 {
|
||||
animation: slideInFromBottom4 0.5s ease-out;
|
||||
}
|
||||
|
||||
@keyframes slideInFromBottom4 {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(16px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
.slide-in-from-left-4 {
|
||||
animation: slideInFromLeft4 0.6s ease-out;
|
||||
}
|
||||
|
||||
@keyframes slideInFromLeft4 {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateX(-16px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateX(0);
|
||||
}
|
||||
}
|
||||
|
||||
.slide-in-from-right-4 {
|
||||
animation: slideInFromRight4 0.6s ease-out;
|
||||
}
|
||||
|
||||
@keyframes slideInFromRight4 {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateX(16px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateX(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,53 +1,25 @@
|
||||
import type { Metadata } from "next";
|
||||
import { Inter } from "next/font/google";
|
||||
import { Open_Sans } from "next/font/google";
|
||||
import "./styles/variables.css";
|
||||
import "./globals.css";
|
||||
import { ServiceWrapper } from "@/components/ServiceWrapper";
|
||||
import Tag from "@/tag/Tag";
|
||||
|
||||
const inter = Inter({
|
||||
variable: "--font-inter", subsets: ["latin"],
|
||||
});
|
||||
|
||||
const openSans = Open_Sans({
|
||||
variable: "--font-open-sans", subsets: ["latin"],
|
||||
});
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Native Line - Build Native Apps Just Talk", description: "Create production-ready iOS, iPad, and Mac apps with conversational AI. No code, no compromise. Native Line turns your ideas into native Swift apps instantly.", keywords: "native app builder, iOS development, app generator, no-code, Swift, indie developers, app creation, AI, macOS", metadataBase: new URL("https://nativeline.app"),
|
||||
alternates: {
|
||||
canonical: "https://nativeline.app"
|
||||
},
|
||||
openGraph: {
|
||||
title: "Native Line - Build Native Apps Just Talk", description: "Create production-ready iOS, iPad, and Mac apps with conversational AI. Native Line turns your ideas into native Swift apps instantly.", url: "https://nativeline.app", siteName: "Native Line", type: "website", images: [
|
||||
{
|
||||
url: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-sleek-macos-application-window-showing-1772522998510-05a82eb5.png", alt: "Native Line App Builder Interface"
|
||||
}
|
||||
]
|
||||
},
|
||||
twitter: {
|
||||
card: "summary_large_image", title: "Native Line - Build Native Apps Just Talk", description: "Create production-ready iOS, iPad, and Mac apps with conversational AI. No code, no compromise.", images: ["https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-sleek-macos-application-window-showing-1772522998510-05a82eb5.png"]
|
||||
},
|
||||
robots: {
|
||||
index: true,
|
||||
follow: true
|
||||
}
|
||||
};
|
||||
title: "Native Line - Build Native Apps Just Talk", description: "Turn your ideas into production-ready iOS, iPad, and Mac apps instantly. Pure native Swift, beautifully designed, completely yours."};
|
||||
|
||||
export default function RootLayout({
|
||||
children,
|
||||
}: Readonly<{
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
}>) {
|
||||
}) {
|
||||
return (
|
||||
<html lang="en" suppressHydrationWarning>
|
||||
<ServiceWrapper>
|
||||
<body
|
||||
className={`${inter.variable} ${openSans.variable} antialiased`}
|
||||
>
|
||||
<Tag />
|
||||
{children}
|
||||
|
||||
<html lang="en">
|
||||
<body className={inter.variable}>
|
||||
{children}
|
||||
|
||||
<script
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: `
|
||||
@@ -1415,7 +1387,6 @@ export default function RootLayout({
|
||||
}}
|
||||
/>
|
||||
</body>
|
||||
</ServiceWrapper>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
|
||||
141
src/app/page.tsx
141
src/app/page.tsx
@@ -1,6 +1,7 @@
|
||||
"use client";
|
||||
|
||||
import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
|
||||
import { useState } from "react";
|
||||
import NavbarStyleCentered from '@/components/navbar/NavbarStyleCentered/NavbarStyleCentered';
|
||||
import HeroSplitDoubleCarousel from '@/components/sections/hero/HeroSplitDoubleCarousel';
|
||||
import FeatureCardNineteen from '@/components/sections/feature/FeatureCardNineteen';
|
||||
@@ -11,19 +12,10 @@ import FaqDouble from '@/components/sections/faq/FaqDouble';
|
||||
import ContactFaq from '@/components/sections/contact/ContactFaq';
|
||||
import FooterBaseReveal from '@/components/sections/footer/FooterBaseReveal';
|
||||
import { Sparkles, Zap, Lightbulb, Rocket, Users, Star, HelpCircle, Download, Moon, Sun } from 'lucide-react';
|
||||
import { useState, useCallback } from 'react';
|
||||
import AnimatedChatDemo from '@/components/sections/demo/AnimatedChatDemo';
|
||||
|
||||
export default function LandingPage() {
|
||||
const [isDarkMode, setIsDarkMode] = useState(false);
|
||||
const [mounted, setMounted] = useState(true);
|
||||
|
||||
const toggleDarkMode = useCallback(() => {
|
||||
setIsDarkMode((prevMode) => {
|
||||
const newMode = !prevMode;
|
||||
localStorage.setItem('native-line-dark-mode', JSON.stringify(newMode));
|
||||
return newMode;
|
||||
});
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<ThemeProvider
|
||||
@@ -36,37 +28,28 @@ export default function LandingPage() {
|
||||
cardStyle="soft-shadow"
|
||||
primaryButtonStyle="flat"
|
||||
secondaryButtonStyle="layered"
|
||||
headingFontWeight="semibold"
|
||||
headingFontWeight="extrabold"
|
||||
>
|
||||
<div id="nav" data-section="nav">
|
||||
<div className="relative">
|
||||
<NavbarStyleCentered
|
||||
brandName="Native Line"
|
||||
navItems={[
|
||||
{ name: "Features", id: "features" },
|
||||
{ name: "How It Works", id: "process" },
|
||||
{ name: "Testimonials", id: "testimonials" },
|
||||
{ name: "FAQ", id: "faq" },
|
||||
{ name: "Contact", id: "contact" }
|
||||
]}
|
||||
button={{
|
||||
text: "Download for macOS", href: "https://example.com/download"
|
||||
}}
|
||||
/>
|
||||
<button
|
||||
onClick={toggleDarkMode}
|
||||
className="fixed top-6 right-6 z-50 p-2 rounded-full bg-secondary-cta text-foreground hover:opacity-80 transition-opacity"
|
||||
aria-label="Toggle dark mode"
|
||||
>
|
||||
{isDarkMode ? <Sun size={20} /> : <Moon size={20} />}
|
||||
</button>
|
||||
</div>
|
||||
<NavbarStyleCentered
|
||||
brandName="Native Line"
|
||||
navItems={[
|
||||
{ name: "Features", id: "features" },
|
||||
{ name: "How It Works", id: "process" },
|
||||
{ name: "Testimonials", id: "testimonials" },
|
||||
{ name: "FAQ", id: "faq" },
|
||||
{ name: "Contact", id: "contact" }
|
||||
]}
|
||||
button={{
|
||||
text: "Download", href: "https://example.com/download"
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div id="hero" data-section="hero">
|
||||
<HeroSplitDoubleCarousel
|
||||
title="Build Native Apps. Just Talk."
|
||||
description="Turn ideas into production-ready iOS, iPad, and Mac apps. Native Swift code, zero friction."
|
||||
title="Build Native Apps Just Talk"
|
||||
description="Turn your ideas into production-ready iOS, iPad, and Mac apps instantly. Pure native Swift, beautifully designed, completely yours."
|
||||
tag="macOS App"
|
||||
tagIcon={Sparkles}
|
||||
tagAnimation="slide-up"
|
||||
@@ -101,17 +84,21 @@ export default function LandingPage() {
|
||||
]}
|
||||
carouselPosition="right"
|
||||
buttons={[
|
||||
{ text: "Download for macOS", href: "https://example.com/download" },
|
||||
{ text: "Download", href: "https://example.com/download" },
|
||||
{ text: "Watch Demo", href: "https://example.com/demo" }
|
||||
]}
|
||||
buttonAnimation="slide-up"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div id="chatDemo" data-section="chatDemo">
|
||||
<AnimatedChatDemo />
|
||||
</div>
|
||||
|
||||
<div id="features" data-section="features">
|
||||
<FeatureCardNineteen
|
||||
title="Why Developers Choose Native Line"
|
||||
description="The power of native development, without the complexity."
|
||||
title="Why Choose Native Line"
|
||||
description="Experience the future of app development—where conversational AI meets native power."
|
||||
tag="Key Benefits"
|
||||
tagIcon={Zap}
|
||||
tagAnimation="slide-up"
|
||||
@@ -120,19 +107,19 @@ export default function LandingPage() {
|
||||
features={[
|
||||
{
|
||||
id: 1,
|
||||
tag: "Speed", title: "Minutes, Not Months", subtitle: "Ship faster than ever before", description: "Describe your app idea. Native Line generates production-ready Swift code instantly. Deploy your first app today.", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-screenshot-showing-the-first-step-of-n-1772522998713-3d093734.png?_wi=2", imageAlt: "Fast app generation"
|
||||
tag: "Speed", title: "From Idea to App in Minutes", subtitle: "Ship faster than ever", description: "Describe your app idea and get production-ready Swift code instantly. Minutes from concept to deployment.", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-screenshot-showing-the-first-step-of-n-1772522998713-3d093734.png?_wi=2", imageAlt: "Fast app generation"
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
tag: "Quality", title: "100% Native Swift", subtitle: "Production-ready from day one", description: "Genuine iOS, iPad, and Mac code. No wrappers, no compromises. Your users get the premium Apple experience.", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-finished-ios-app-screenshot-showing-a--1772522998285-77be74a6.png?_wi=2", imageAlt: "Native iOS quality"
|
||||
tag: "Quality", title: "Pure Native Swift Code", subtitle: "Production-ready quality", description: "Genuine native iOS, iPad, and Mac code. No wrappers, no JavaScript. Premium experience from day one.", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-finished-ios-app-screenshot-showing-a--1772522998285-77be74a6.png?_wi=2", imageAlt: "Native iOS quality"
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
tag: "Control", title: "You Own Everything", subtitle: "Your code, your rules, forever", description: "Get complete Swift source code. Modify, extend, maintain it however you want. No lock-in, no surprises.", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-mac-app-screenshot-displaying-a-native-1772523000039-25334e88.png?_wi=2", imageAlt: "Source code control"
|
||||
tag: "Control", title: "Full Source Code Ownership", subtitle: "Your code, your rules", description: "Get complete Swift source code. No vendor lock-in, no subscription dependency. Modify and maintain freely.", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-mac-app-screenshot-displaying-a-native-1772523000039-25334e88.png?_wi=2", imageAlt: "Source code control"
|
||||
},
|
||||
{
|
||||
id: 4,
|
||||
tag: "Simple", title: "No Technical Skills Needed", subtitle: "Built for creators, not coders", description: "Just describe what you want to build. Native Line handles all the complexity. Anyone can build native apps now.", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-sleek-macos-application-window-showing-1772522998510-05a82eb5.png?_wi=2", imageAlt: "Conversational interface"
|
||||
tag: "Accessible", title: "Conversational Interface", subtitle: "No coding experience needed", description: "Just describe what you want. No Swift, no Xcode knowledge required. Conversational AI handles the complexity.", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-sleek-macos-application-window-showing-1772522998510-05a82eb5.png?_wi=2", imageAlt: "Conversational interface"
|
||||
}
|
||||
]}
|
||||
/>
|
||||
@@ -144,8 +131,8 @@ export default function LandingPage() {
|
||||
tagIcon={Lightbulb}
|
||||
tagAnimation="slide-up"
|
||||
title="Democratizing App Development"
|
||||
description="Native Line empowers indie developers, entrepreneurs, and creators to build production-quality native apps without weeks of development or expensive engineer teams."
|
||||
subdescription="We believe anyone with an idea deserves the ability to ship—fast, beautifully, and natively."
|
||||
description="Native Line enables indie developers, entrepreneurs, and creators to ship production-quality native apps."
|
||||
subdescription="We believe anyone with an idea deserves the ability to create native apps without hiring a team of engineers."
|
||||
icon={Rocket}
|
||||
imageSrc="https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-lifestyle-photo-showing-an-indie-devel-1772522999346-c2d8c8e5.png"
|
||||
imageAlt="Developer using Native Line"
|
||||
@@ -156,8 +143,8 @@ export default function LandingPage() {
|
||||
|
||||
<div id="process" data-section="process">
|
||||
<FeatureCardNineteen
|
||||
title="Three Steps to Shipped"
|
||||
description="From idea to App Store in minutes."
|
||||
title="How It Works"
|
||||
description="Three simple steps from idea to production."
|
||||
tag="Process"
|
||||
tagIcon={Users}
|
||||
tagAnimation="slide-up"
|
||||
@@ -166,15 +153,15 @@ export default function LandingPage() {
|
||||
features={[
|
||||
{
|
||||
id: 1,
|
||||
tag: "Step 1", title: "Describe", subtitle: "Tell us what you want", description: "Open Native Line and describe your app idea conversationally. Share features, design preferences, user flows. Iterate until your vision is clear.", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-screenshot-showing-the-first-step-of-n-1772522998713-3d093734.png?_wi=3", imageAlt: "Conversational input step"
|
||||
tag: "Step 1", title: "Describe Your Idea", subtitle: "Tell Native Line what to build", description: "Open the app and describe your idea conversationally. Share features, design preferences, and user flows. Refine your vision through chat.", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-screenshot-showing-the-first-step-of-n-1772522998713-3d093734.png?_wi=3", imageAlt: "Conversational input step"
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
tag: "Step 2", title: "Generate", subtitle: "AI creates your code", description: "Native Line generates complete Swift code for iOS, iPad, and Mac. Watch real-time previews as your app takes shape. Refine until perfect.", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-screenshot-showing-native-line-process-1772522998677-8404a04b.png?_wi=2", imageAlt: "AI processing and generation"
|
||||
tag: "Step 2", title: "AI Generates Your App", subtitle: "See it come to life", description: "Our AI generates complete Swift code with real-time previews. Iterate and refine until it's perfect. See exactly what you're building.", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-screenshot-showing-native-line-process-1772522998677-8404a04b.png?_wi=2", imageAlt: "AI processing and generation"
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
tag: "Step 3", title: "Deploy", subtitle: "Ship to the App Store", description: "Export complete, signed code ready for App Store. Deploy immediately. Your app is fully yours to maintain and monetize.", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-screenshot-showing-the-final-output-a--1772522999316-ac7823d9.png?_wi=2", imageAlt: "Ready-to-deploy app"
|
||||
tag: "Step 3", title: "Deploy to App Store", subtitle: "Ship in minutes", description: "Export complete, signed app code ready for submission. Native Line handles all the complexity. Your app is ready to monetize.", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-screenshot-showing-the-final-output-a--1772522999316-ac7823d9.png?_wi=2", imageAlt: "Ready-to-deploy app"
|
||||
}
|
||||
]}
|
||||
/>
|
||||
@@ -182,8 +169,8 @@ export default function LandingPage() {
|
||||
|
||||
<div id="socialProof" data-section="socialProof">
|
||||
<SocialProofOne
|
||||
title="Trusted by the Indie Dev Community"
|
||||
description="Thousands of indie developers, entrepreneurs, and agencies are already building production apps with Native Line."
|
||||
title="Trusted by Indie Creators"
|
||||
description="Used by thousands of developers and agencies building production apps."
|
||||
tag="Partners"
|
||||
tagIcon={Users}
|
||||
tagAnimation="slide-up"
|
||||
@@ -198,7 +185,7 @@ export default function LandingPage() {
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<TestimonialCardFive
|
||||
title="What Developers Say"
|
||||
description="Real results from creators shipping with Native Line."
|
||||
description="Hear from creators shipping with Native Line."
|
||||
tag="Testimonials"
|
||||
tagIcon={Star}
|
||||
tagAnimation="slide-up"
|
||||
@@ -206,22 +193,22 @@ export default function LandingPage() {
|
||||
useInvertedBackground={false}
|
||||
testimonials={[
|
||||
{
|
||||
id: "1", name: "Sarah Chen, Indie Developer", date: "Date: 15 January 2025", title: "Shipped my first app in 48 hours", quote: "I always wanted to build an app but Swift intimidated me. Native Line made it effortless. I described my idea and had a production-ready app within two days. The quality rivals anything I'd hire developers for.", tag: "Early Access", avatarSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-photo-of-a-confi-1772522998773-448b63b6.png", avatarAlt: "Sarah Chen", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-photo-of-a-confi-1772522998773-448b63b6.png?_wi=1", imageAlt: "Sarah Chen testimonial"
|
||||
id: "1", name: "Sarah Chen, Indie Developer", date: "15 January 2025", title: "Shipped my first app in 48 hours", quote: "I wanted to build an app but was intimidated by Swift. Native Line made it effortless. I described my idea and had a production-ready app within two days.", tag: "Early Access", avatarSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-photo-of-a-confi-1772522998773-448b63b6.png", avatarAlt: "Sarah Chen", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-photo-of-a-confi-1772522998773-448b63b6.png?_wi=1", imageAlt: "Sarah Chen testimonial"
|
||||
},
|
||||
{
|
||||
id: "2", name: "Marcus Johnson, Founder of StartupLabs", date: "Date: 12 January 2025", title: "Game-changer for prototyping", quote: "As a design agency, Native Line lets us deliver functional native prototypes immediately. No more timelines or external dev teams. We control the process and maintain full code ownership. This is our competitive advantage.", tag: "Agency", avatarSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-photo-of-a-diffe-1772522999720-62e43383.png", avatarAlt: "Marcus Johnson", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-photo-of-a-diffe-1772522999720-62e43383.png?_wi=1", imageAlt: "Marcus Johnson testimonial"
|
||||
id: "2", name: "Marcus Johnson, Founder", date: "12 January 2025", title: "Game-changer for prototyping", quote: "As a design agency, Native Line lets us deliver functional native prototypes to clients immediately. No more timelines or external dev teams. We control the process and maintain full code ownership.", tag: "Agency", avatarSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-photo-of-a-diffe-1772522999720-62e43383.png", avatarAlt: "Marcus Johnson", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-photo-of-a-diffe-1772522999720-62e43383.png?_wi=1", imageAlt: "Marcus Johnson testimonial"
|
||||
},
|
||||
{
|
||||
id: "3", name: "Elena Rodriguez, Product Designer", date: "Date: 8 January 2025", title: "Finally, I can build without developers", quote: "I've always needed engineers to bring my ideas to life. Native Line changes everything. I can prototype real native apps now. The conversational interface feels natural—I'm describing my vision, not fighting a tool.", tag: "Design", avatarSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-of-a-designer-or-1772522998331-d9e779d1.png", avatarAlt: "Elena Rodriguez", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-of-a-designer-or-1772522998331-d9e779d1.png", imageAlt: "Elena Rodriguez testimonial"
|
||||
id: "3", name: "Elena Rodriguez, Designer", date: "8 January 2025", title: "I can build without developers", quote: "I always needed engineers to bring ideas to life. Native Line changes everything. I can prototype real native apps now. The conversational interface feels natural.", tag: "Design", avatarSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-of-a-designer-or-1772522998331-d9e779d1.png", avatarAlt: "Elena Rodriguez", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-of-a-designer-or-1772522998331-d9e779d1.png", imageAlt: "Elena Rodriguez testimonial"
|
||||
},
|
||||
{
|
||||
id: "4", name: "David Park, Solopreneur", date: "Date: 5 January 2025", title: "No more excuses—I'm shipping", quote: "I had five ideas sitting in my notes because I didn't want to hire a developer or learn Swift. With Native Line, there's no excuse. Time to market is so fast I can validate ideas instead of overthinking them. I've shipped three apps in three weeks.", tag: "Solopreneur", avatarSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-of-another-start-1772522998549-425ed9d6.png", avatarAlt: "David Park", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-of-another-start-1772522998549-425ed9d6.png", imageAlt: "David Park testimonial"
|
||||
id: "4", name: "David Park, Solopreneur", date: "5 January 2025", title: "No more excuses—shipping apps", quote: "I had ideas sitting in my notes for months. With Native Line, there's no excuse anymore. I can validate ideas fast instead of overthinking them. I've shipped three apps in three weeks.", tag: "Solopreneur", avatarSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-of-another-start-1772522998549-425ed9d6.png", avatarAlt: "David Park", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-of-another-start-1772522998549-425ed9d6.png", imageAlt: "David Park testimonial"
|
||||
},
|
||||
{
|
||||
id: "5", name: "Lisa Wong, Mobile App Consultant", date: "Date: 2 January 2025", title: "The future of app development", quote: "I consult with startups on app strategies. Native Line is instantly my top recommendation. It's not replacing developers—it's enabling creators. The native quality is exceptional and code is production-ready from day one.", tag: "Consultant", avatarSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-photo-of-a-confi-1772522998773-448b63b6.png", avatarAlt: "Lisa Wong", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-photo-of-a-confi-1772522998773-448b63b6.png?_wi=2", imageAlt: "Lisa Wong testimonial"
|
||||
id: "5", name: "Lisa Wong, Consultant", date: "2 January 2025", title: "The future of app development", quote: "I consult with startups on app strategy. Native Line is instantly becoming my first recommendation. It's not replacing developers—it's enabling creators. The native quality is exceptional.", tag: "Consultant", avatarSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-photo-of-a-confi-1772522998773-448b63b6.png", avatarAlt: "Lisa Wong", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-photo-of-a-confi-1772522998773-448b63b6.png?_wi=2", imageAlt: "Lisa Wong testimonial"
|
||||
},
|
||||
{
|
||||
id: "6", name: "James Mitchell, Tech Entrepreneur", date: "Date: 30 December 2024", title: "80% faster time to market", quote: "Building my SaaS app used to take months. With Native Line, I have a native companion app shipped in weeks. The speed advantage let us get customer feedback months earlier than competitors. That feedback shaped our product in ways we wouldn't have discovered otherwise.", tag: "Founder", avatarSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-photo-of-a-diffe-1772522999720-62e43383.png", avatarAlt: "James Mitchell", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-photo-of-a-diffe-1772522999720-62e43383.png?_wi=2", imageAlt: "James Mitchell testimonial"
|
||||
id: "6", name: "James Mitchell, Founder", date: "30 December 2024", title: "80% faster time to market", quote: "Building my SaaS app used to take months. With Native Line, I have a native companion app shipped in weeks. The speed advantage let us get feedback months earlier than competitors.", tag: "Founder", avatarSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-photo-of-a-diffe-1772522999720-62e43383.png", avatarAlt: "James Mitchell", imageSrc: "https://webuild-dev.s3.eu-north-1.amazonaws.com/users/user_3AQRMtx5ZUGLrwvjDcVIYHeaKiH/a-professional-headshot-photo-of-a-diffe-1772522999720-62e43383.png?_wi=2", imageAlt: "James Mitchell testimonial"
|
||||
}
|
||||
]}
|
||||
/>
|
||||
@@ -239,34 +226,34 @@ export default function LandingPage() {
|
||||
faqsAnimation="slide-up"
|
||||
faqs={[
|
||||
{
|
||||
id: "1", title: "What does Native Line generate?", content: "Complete, production-ready Swift source code for iOS, iPad, and macOS. Genuine native code—not wrappers or hybrid apps. You own 100% of the code and can modify, extend, or maintain it however you want. Apps are ready for App Store submission immediately."
|
||||
id: "1", title: "What does Native Line generate?", content: "Complete, production-ready Swift source code for iOS, iPad, and macOS. Genuine native code—not wrappers. You get full control and can modify, extend, or maintain it yourself. Ready for App Store submission."
|
||||
},
|
||||
{
|
||||
id: "2", title: "Do I need to know Swift?", content: "No. Native Line is designed for non-technical creators. Describe your app conversationally and Native Line handles the complexity. You never need to write Swift if you don't want to. Developers who do know Swift can always review and modify the generated code."
|
||||
id: "2", title: "Do I need to know Swift?", content: "No. Describe your app conversationally and Native Line handles the complexity. You never need to write Swift if you don't want to. However, developers can always review and modify the generated code."
|
||||
},
|
||||
{
|
||||
id: "3", title: "Do I own the code?", content: "Yes, 100%. You own all generated code with no vendor lock-in. Modify, extend, and maintain your apps however you want. You can hire developers to continue working on your code if needed. It's truly yours."
|
||||
id: "3", title: "Do I own the code?", content: "Yes, 100%. No vendor lock-in. You can modify, extend, and maintain your apps however you want. Hire developers to continue working on it if needed. It's completely yours."
|
||||
},
|
||||
{
|
||||
id: "4", title: "What's the pricing model?", content: "Native Line is a desktop macOS application with flexible licensing. We're currently in early access with fair pricing for indie creators. You own all apps you generate regardless of subscription status."
|
||||
id: "4", title: "What's the pricing model?", content: "Native Line is a desktop macOS application with flexible licensing. We're in early access with fair pricing for indie creators. You own the apps you generate regardless of subscription status."
|
||||
},
|
||||
{
|
||||
id: "5", title: "Is there a backend service?", content: "Native Line Cloud is coming soon with optional backend infrastructure (authentication, database, APIs). It's completely optional—use any backend you prefer or build your own."
|
||||
id: "5", title: "Is Native Line Cloud available?", content: "Coming soon. Optional backend infrastructure services (auth, database, APIs) for your generated apps. Completely optional—use any backend you prefer or build your own."
|
||||
},
|
||||
{
|
||||
id: "6", title: "Can I build for all Apple platforms?", content: "Yes. Generate true native apps for iOS, iPad, and macOS. Each app is genuinely native for its platform, so you get the best experience on each device. Generate separate apps or unified apps that work across all three."
|
||||
id: "6", title: "Can I build for multiple platforms?", content: "Yes. Native Line generates for iOS, iPad, and macOS. Each app is true native code for its platform. Build separate apps for each or unified apps working across all three."
|
||||
},
|
||||
{
|
||||
id: "7", title: "How fast is generation?", content: "Simple apps generate in minutes. Complex apps with multiple features typically take 15-45 minutes. You can watch real-time previews as your app builds and iterate if needed."
|
||||
id: "7", title: "How long does generation take?", content: "Simple apps generate in minutes. Complex apps with multiple features take longer (typically 15-45 minutes). Watch real-time previews and iterate until perfect."
|
||||
},
|
||||
{
|
||||
id: "8", title: "Can I use this for client work?", content: "Yes. Perfect for agencies and studios. Generate apps for clients, deliver source code to them, or maintain the apps yourself. Our licensing supports professional and commercial use. Whitelabel options available."
|
||||
id: "8", title: "Can I use it for client projects?", content: "Yes. Perfect for agencies and studios. Generate apps for clients, deliver source code, or maintain yourself. Licensing supports commercial use. Whitelabel options available."
|
||||
},
|
||||
{
|
||||
id: "9", title: "How do I monetize?", content: "Your apps are fully yours to monetize however you want. Submit to the Apple App Store, set pricing, use in-app purchases, or offer for free. Native Line takes no revenue share and provides App Store submission guidance."
|
||||
id: "9", title: "Can I monetize my apps?", content: "Your apps are fully yours to monetize. Submit to the App Store, set pricing, use in-app purchases, or offer free. We don't take any revenue share."
|
||||
},
|
||||
{
|
||||
id: "10", title: "What if I need developer help?", content: "You own the source code, so modify it yourself, hire developers, or share with your team. The code is standard Swift using familiar iOS patterns, so any Swift developer can work with it. We provide documentation and community support."
|
||||
id: "10", title: "What if I need developer support later?", content: "You own the source code, so modify it yourself or hire developers. The code is standard Swift using familiar iOS patterns. We provide documentation and community support."
|
||||
}
|
||||
]}
|
||||
/>
|
||||
@@ -275,25 +262,25 @@ export default function LandingPage() {
|
||||
<div id="contact" data-section="contact">
|
||||
<ContactFaq
|
||||
ctaTitle="Ready to Build?"
|
||||
ctaDescription="Download Native Line for macOS and ship your first app in hours."
|
||||
ctaDescription="Download Native Line for macOS today and ship your first app in hours."
|
||||
ctaButton={{
|
||||
text: "Download for macOS", href: "https://example.com/download"
|
||||
text: "Download", href: "https://example.com/download"
|
||||
}}
|
||||
ctaIcon={Download}
|
||||
useInvertedBackground={false}
|
||||
animationType="slide-up"
|
||||
faqs={[
|
||||
{
|
||||
id: "1", title: "macOS only?", content: "Native Line is currently macOS only. Our focus is providing the best native experience on Apple's ecosystem. We're exploring other platforms for future releases."
|
||||
id: "1", title: "Available on Windows or Linux?", content: "Native Line is currently macOS only. We're focused on providing the best native experience on Apple's ecosystem. Other platforms coming soon."
|
||||
},
|
||||
{
|
||||
id: "2", title: "How do I get early access?", content: "Download Native Line today to get started immediately. Our early access program gives you special pricing and direct access to our team for feedback."
|
||||
id: "2", title: "Early access or beta?", content: "Yes. Download Native Line today for immediate access. Beta testers get special pricing and direct team access for feedback."
|
||||
},
|
||||
{
|
||||
id: "3", title: "Is there a free trial?", content: "Yes. Download and try free for 7 days. Generate a complete app and see the power for yourself. No credit card required."
|
||||
id: "3", title: "Free trial available?", content: "Yes. Try free for 7 days. Generate a complete app and see the power firsthand. No credit card required."
|
||||
},
|
||||
{
|
||||
id: "4", title: "How do I get support?", content: "We have a community Discord, email support, and comprehensive documentation. Enterprise customers get direct support and consultation services."
|
||||
id: "4", title: "Need help?", content: "We have community Discord, email support, and comprehensive docs. Enterprise customers get direct support and consultation."
|
||||
}
|
||||
]}
|
||||
/>
|
||||
@@ -304,7 +291,7 @@ export default function LandingPage() {
|
||||
columns={[
|
||||
{
|
||||
title: "Product", items: [
|
||||
{ label: "Download for macOS", href: "https://example.com/download" },
|
||||
{ label: "Download", href: "https://example.com/download" },
|
||||
{ label: "Features", href: "#features" },
|
||||
{ label: "How It Works", href: "#process" },
|
||||
{ label: "Native Line Cloud", href: "#" }
|
||||
@@ -322,8 +309,8 @@ export default function LandingPage() {
|
||||
title: "Company", items: [
|
||||
{ label: "About Us", href: "#about" },
|
||||
{ label: "Contact", href: "#contact" },
|
||||
{ label: "Privacy Policy", href: "#" },
|
||||
{ label: "Terms of Service", href: "#" }
|
||||
{ label: "Privacy", href: "#" },
|
||||
{ label: "Terms", href: "#" }
|
||||
]
|
||||
}
|
||||
]}
|
||||
|
||||
@@ -1,28 +1,7 @@
|
||||
* {
|
||||
scrollbar-width: thin;
|
||||
scrollbar-color: rgba(255, 255, 255, 1) rgba(255, 255, 255, 0);
|
||||
}
|
||||
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap');
|
||||
|
||||
html {
|
||||
overscroll-behavior: none;
|
||||
overscroll-behavior-y: none;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: var(--background);
|
||||
color: var(--foreground);
|
||||
font-family: var(--font-inter-tight), sans-serif;
|
||||
position: relative;
|
||||
min-height: 100vh;
|
||||
overscroll-behavior: none;
|
||||
overscroll-behavior-y: none;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
font-family: var(--font-inter-tight), sans-serif;
|
||||
@layer base {
|
||||
body {
|
||||
font-family: var(--font-inter), sans-serif;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,21 +3,21 @@
|
||||
/* --vw is set by ThemeProvider */
|
||||
|
||||
/* --background: #f5f3f0;;;
|
||||
--card: #fffbf8;;;
|
||||
--foreground: #2a2520;;;
|
||||
--primary-cta: #c97d5c;;;
|
||||
--secondary-cta: #f5f3f0;;;
|
||||
--accent: #e8ddd3;;;
|
||||
--card: #fdfcfb;;;
|
||||
--foreground: #2a2520e6;;;
|
||||
--primary-cta: #c69c7b;;;
|
||||
--secondary-cta: #fdfcfb;;;
|
||||
--accent: #e8dfd5;;;
|
||||
--background-accent: #d4c4b0;;; */
|
||||
|
||||
--background: #f5f3f0;;;
|
||||
--card: #fffbf8;;;
|
||||
--foreground: #2a2520;;;
|
||||
--primary-cta: #c97d5c;;;
|
||||
--card: #fdfcfb;;;
|
||||
--foreground: #2a2520e6;;;
|
||||
--primary-cta: #c69c7b;;;
|
||||
--primary-cta-text: #ffffff;;;
|
||||
--secondary-cta: #f5f3f0;;;
|
||||
--secondary-cta-text: #2a2520;;;
|
||||
--accent: #e8ddd3;;;
|
||||
--secondary-cta: #fdfcfb;;;
|
||||
--secondary-cta-text: #120a00e6;;;
|
||||
--accent: #e8dfd5;;;
|
||||
--background-accent: #d4c4b0;;;
|
||||
|
||||
/* text sizing - set by ThemeProvider */
|
||||
|
||||
282
src/components/sections/animated-chat-demo/AnimatedChatDemo.tsx
Normal file
282
src/components/sections/animated-chat-demo/AnimatedChatDemo.tsx
Normal file
@@ -0,0 +1,282 @@
|
||||
"use client";
|
||||
|
||||
import React, { useState, useEffect } from "react";
|
||||
import { Send } from "lucide-react";
|
||||
|
||||
interface ChatMessage {
|
||||
id: string;
|
||||
text: string;
|
||||
isUser: boolean;
|
||||
isComplete?: boolean;
|
||||
}
|
||||
|
||||
interface AppIdea {
|
||||
id: string;
|
||||
title: string;
|
||||
description: string;
|
||||
}
|
||||
|
||||
const appIdeas: AppIdea[] = [
|
||||
{
|
||||
id: "1", title: "Weather Dashboard", description: "A beautiful real-time weather app with hourly forecasts and weather alerts"
|
||||
},
|
||||
{
|
||||
id: "2", title: "Todo Manager", description: "A productivity app with task organization, categories, and smart reminders"
|
||||
},
|
||||
{
|
||||
id: "3", title: "Budget Tracker", description: "Personal finance app with spending analytics and budget goals tracking"
|
||||
}
|
||||
];
|
||||
|
||||
export default function AnimatedChatDemo() {
|
||||
const [stage, setStage] = useState<"chat" | "process" | "finished">("chat");
|
||||
const [currentIdeaIndex, setCurrentIdeaIndex] = useState(0);
|
||||
const [messages, setMessages] = useState<ChatMessage[]>([]);
|
||||
const [processSteps, setProcessSteps] = useState<Array<{ name: string; active: boolean }>>([]);
|
||||
const [finishedApp, setFinishedApp] = useState<AppIdea | null>(null);
|
||||
const [isAutoPlaying, setIsAutoPlaying] = useState(true);
|
||||
|
||||
// Stage 1: Chat simulation with auto-filling and sending
|
||||
useEffect(() => {
|
||||
if (stage !== "chat" || !isAutoPlaying) return;
|
||||
|
||||
let timeoutId: NodeJS.Timeout;
|
||||
const currentIdea = appIdeas[currentIdeaIndex];
|
||||
|
||||
// Clear messages and start fresh
|
||||
if (messages.length === 0) {
|
||||
timeoutId = setTimeout(() => {
|
||||
// Add user message character by character
|
||||
const userMessage = currentIdea.description;
|
||||
let charIndex = 0;
|
||||
const typeInterval = setInterval(() => {
|
||||
if (charIndex <= userMessage.length) {
|
||||
setMessages((prev) => {
|
||||
if (prev.length === 0 || !prev[prev.length - 1].isUser) {
|
||||
return [
|
||||
...prev,
|
||||
{
|
||||
id: `user-${Date.now()}`,
|
||||
text: userMessage.substring(0, charIndex),
|
||||
isUser: true,
|
||||
isComplete: false
|
||||
}
|
||||
];
|
||||
} else {
|
||||
const updated = [...prev];
|
||||
updated[updated.length - 1].text = userMessage.substring(0, charIndex);
|
||||
return updated;
|
||||
}
|
||||
});
|
||||
charIndex++;
|
||||
} else {
|
||||
clearInterval(typeInterval);
|
||||
// Mark message as complete and move to next stage
|
||||
setTimeout(() => {
|
||||
setMessages((prev) => {
|
||||
const updated = [...prev];
|
||||
if (updated.length > 0) {
|
||||
updated[updated.length - 1].isComplete = true;
|
||||
}
|
||||
return updated;
|
||||
});
|
||||
// Auto-send and transition to process
|
||||
setTimeout(() => {
|
||||
setStage("process");
|
||||
}, 800);
|
||||
}, 500);
|
||||
}
|
||||
}, 30);
|
||||
}, 500);
|
||||
}
|
||||
|
||||
return () => clearTimeout(timeoutId);
|
||||
}, [stage, currentIdeaIndex, messages.length, isAutoPlaying]);
|
||||
|
||||
// Stage 2: Process flow animation
|
||||
useEffect(() => {
|
||||
if (stage !== "process" || !isAutoPlaying) return;
|
||||
|
||||
const steps = [
|
||||
{ name: "Design", active: false },
|
||||
{ name: "Planning", active: false },
|
||||
{ name: "Coding", active: false }
|
||||
];
|
||||
setProcessSteps(steps);
|
||||
|
||||
let stepIndex = 0;
|
||||
const stepInterval = setInterval(() => {
|
||||
if (stepIndex < steps.length) {
|
||||
setProcessSteps((prev) =>
|
||||
prev.map((step, idx) => ({
|
||||
...step,
|
||||
active: idx === stepIndex
|
||||
}))
|
||||
);
|
||||
stepIndex++;
|
||||
} else {
|
||||
clearInterval(stepInterval);
|
||||
// Transition to finished
|
||||
setTimeout(() => {
|
||||
setStage("finished");
|
||||
setFinishedApp(appIdeas[currentIdeaIndex]);
|
||||
}, 1000);
|
||||
}
|
||||
}, 1200);
|
||||
|
||||
return () => clearInterval(stepInterval);
|
||||
}, [stage, currentIdeaIndex, isAutoPlaying]);
|
||||
|
||||
// Stage 3: Finished app display and loop
|
||||
useEffect(() => {
|
||||
if (stage !== "finished" || !isAutoPlaying) return;
|
||||
|
||||
const loopTimeout = setTimeout(() => {
|
||||
const nextIndex = (currentIdeaIndex + 1) % appIdeas.length;
|
||||
setCurrentIdeaIndex(nextIndex);
|
||||
setStage("chat");
|
||||
setMessages([]);
|
||||
setProcessSteps([]);
|
||||
setFinishedApp(null);
|
||||
}, 4000);
|
||||
|
||||
return () => clearTimeout(loopTimeout);
|
||||
}, [stage, currentIdeaIndex, isAutoPlaying]);
|
||||
|
||||
return (
|
||||
<div className="w-full py-20 px-4 sm:px-6 lg:px-8 bg-gradient-to-b from-background via-background to-background-accent/10">
|
||||
<div className="max-w-4xl mx-auto">
|
||||
{/* Section Header */}
|
||||
<div className="text-center mb-16 opacity-0 animate-in fade-in slide-in-from-bottom-4 duration-700">
|
||||
<p className="text-sm font-semibold text-primary-cta mb-2">INTERACTIVE DEMO</p>
|
||||
<h2 className="text-3xl sm:text-4xl md:text-5xl font-bold mb-4">See It In Action</h2>
|
||||
<p className="text-base sm:text-lg text-foreground/70 max-w-2xl mx-auto">
|
||||
Watch how Native Line transforms your ideas into complete apps in real-time
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Main Demo Container */}
|
||||
<div className="relative">
|
||||
{/* Chat Stage */}
|
||||
{stage === "chat" && (
|
||||
<div className="animate-in fade-in duration-500">
|
||||
<div className="bg-card border border-accent/20 rounded-lg p-6 sm:p-8 shadow-lg">
|
||||
<div className="space-y-4 mb-6 h-40 flex flex-col justify-center">
|
||||
{messages.map((msg) => (
|
||||
<div
|
||||
key={msg.id}
|
||||
className={`flex ${msg.isUser ? "justify-end" : "justify-start"} animate-in fade-in slide-in-from-bottom-2 duration-300`}
|
||||
>
|
||||
<div
|
||||
className={`px-4 py-2 rounded-lg max-w-xs ${
|
||||
msg.isUser
|
||||
? "bg-primary-cta text-white"
|
||||
: "bg-background text-foreground border border-accent/30"
|
||||
}`}
|
||||
>
|
||||
<p className="text-sm">{msg.text}</p>
|
||||
{msg.isComplete && msg.isUser && (
|
||||
<div className="mt-2 flex justify-end">
|
||||
<Send className="w-4 h-4" />
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Process Flow Stage */}
|
||||
{stage === "process" && (
|
||||
<div className="animate-in fade-in duration-500">
|
||||
<div className="flex justify-center items-center gap-2 sm:gap-4 h-40 flex-wrap">
|
||||
{processSteps.map((step, idx) => (
|
||||
<div key={idx} className="flex items-center">
|
||||
<div
|
||||
className={`w-16 sm:w-20 h-16 sm:h-20 rounded-full flex items-center justify-center text-sm font-semibold transition-all duration-500 ${
|
||||
step.active
|
||||
? "bg-primary-cta text-white scale-110 shadow-lg animate-pulse"
|
||||
: "bg-background border-2 border-accent/30 text-foreground"
|
||||
}`}
|
||||
>
|
||||
{step.name}
|
||||
</div>
|
||||
{idx < processSteps.length - 1 && (
|
||||
<div
|
||||
className={`w-8 sm:w-12 h-1 mx-1 sm:mx-2 transition-all duration-500 ${
|
||||
processSteps[idx + 1].active ? "bg-primary-cta" : "bg-accent/20"
|
||||
}`}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Finished App Stage */}
|
||||
{stage === "finished" && finishedApp && (
|
||||
<div className="animate-in fade-in duration-700">
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 items-center">
|
||||
{/* App Image - Right */}
|
||||
<div className="order-2 md:order-2 h-64 sm:h-80 bg-gradient-to-br from-primary-cta/10 to-accent/10 rounded-lg border border-accent/30 flex items-center justify-center animate-in fade-in slide-in-from-right-4 duration-700">
|
||||
<div className="text-center">
|
||||
<div className="w-20 h-20 sm:w-24 sm:h-24 bg-primary-cta/20 rounded-full mx-auto mb-4 flex items-center justify-center">
|
||||
<div className="w-16 h-16 sm:w-20 sm:h-20 bg-primary-cta rounded-full" />
|
||||
</div>
|
||||
<p className="text-sm text-foreground/50">App Preview</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* App Details - Left */}
|
||||
<div className="order-1 md:order-1 animate-in fade-in slide-in-from-left-4 duration-700 space-y-4">
|
||||
<div>
|
||||
<h3 className="text-2xl sm:text-3xl font-bold mb-2">{finishedApp.title}</h3>
|
||||
<p className="text-foreground/70 text-sm sm:text-base">{finishedApp.description}</p>
|
||||
</div>
|
||||
<div className="space-y-2 pt-4">
|
||||
<p className="text-xs sm:text-sm font-semibold text-primary-cta">✓ Production-Ready Code</p>
|
||||
<p className="text-xs sm:text-sm font-semibold text-primary-cta">✓ Ready to Deploy</p>
|
||||
<p className="text-xs sm:text-sm font-semibold text-primary-cta">✓ Fully Yours to Modify</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Loop Indicator */}
|
||||
<div className="mt-12 flex justify-center gap-2">
|
||||
{appIdeas.map((idea, idx) => (
|
||||
<button
|
||||
key={idea.id}
|
||||
onClick={() => {
|
||||
setCurrentIdeaIndex(idx);
|
||||
setStage("chat");
|
||||
setMessages([]);
|
||||
setProcessSteps([]);
|
||||
setFinishedApp(null);
|
||||
}}
|
||||
className={`w-2 h-2 rounded-full transition-all duration-300 ${
|
||||
idx === currentIdeaIndex ? "bg-primary-cta w-8" : "bg-accent/30"
|
||||
}`}
|
||||
aria-label={`Show ${idea.title}`}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
|
||||
{/* Auto-play Toggle */}
|
||||
<div className="mt-8 flex justify-center">
|
||||
<button
|
||||
onClick={() => setIsAutoPlaying(!isAutoPlaying)}
|
||||
className="px-4 py-2 text-sm rounded-full border border-accent/30 hover:bg-card transition-colors"
|
||||
>
|
||||
{isAutoPlaying ? "Pause" : "Play"}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
284
src/components/sections/demo/AnimatedChatDemo.tsx
Normal file
284
src/components/sections/demo/AnimatedChatDemo.tsx
Normal file
@@ -0,0 +1,284 @@
|
||||
"use client";
|
||||
|
||||
import React, { useState, useEffect, useRef } from "react";
|
||||
import { Send } from "lucide-react";
|
||||
import gsap from "gsap";
|
||||
|
||||
interface ChatMessage {
|
||||
id: string;
|
||||
text: string;
|
||||
isUser: boolean;
|
||||
isComplete?: boolean;
|
||||
}
|
||||
|
||||
interface AppIdea {
|
||||
id: string;
|
||||
title: string;
|
||||
description: string;
|
||||
}
|
||||
|
||||
const appIdeas: AppIdea[] = [
|
||||
{
|
||||
id: "1", title: "Weather Dashboard", description: "A beautiful real-time weather app with hourly forecasts and weather alerts"
|
||||
},
|
||||
{
|
||||
id: "2", title: "Todo Manager", description: "A productivity app with task organization, categories, and smart reminders"
|
||||
},
|
||||
{
|
||||
id: "3", title: "Budget Tracker", description: "Personal finance app with spending analytics and budget goals tracking"
|
||||
}
|
||||
];
|
||||
|
||||
export default function AnimatedChatDemo() {
|
||||
const [stage, setStage] = useState<"chat" | "process" | "finished">("chat");
|
||||
const [currentIdeaIndex, setCurrentIdeaIndex] = useState(0);
|
||||
const [messages, setMessages] = useState<ChatMessage[]>([]);
|
||||
const [processSteps, setProcessSteps] = useState<Array<{ name: string; active: boolean }>>([]);
|
||||
const [finishedApp, setFinishedApp] = useState<AppIdea | null>(null);
|
||||
const [isAutoPlaying, setIsAutoPlaying] = useState(true);
|
||||
const timelineRef = useRef<gsap.core.Timeline | null>(null);
|
||||
|
||||
// Stage 1: Chat simulation with auto-filling and sending
|
||||
useEffect(() => {
|
||||
if (stage !== "chat" || !isAutoPlaying) return;
|
||||
|
||||
let timeoutId: NodeJS.Timeout;
|
||||
const currentIdea = appIdeas[currentIdeaIndex];
|
||||
|
||||
// Clear messages and start fresh
|
||||
if (messages.length === 0) {
|
||||
timeoutId = setTimeout(() => {
|
||||
// Add user message character by character
|
||||
const userMessage = currentIdea.description;
|
||||
let charIndex = 0;
|
||||
const typeInterval = setInterval(() => {
|
||||
if (charIndex <= userMessage.length) {
|
||||
setMessages((prev) => {
|
||||
if (prev.length === 0 || !prev[prev.length - 1].isUser) {
|
||||
return [
|
||||
...prev,
|
||||
{
|
||||
id: `user-${Date.now()}`,
|
||||
text: userMessage.substring(0, charIndex),
|
||||
isUser: true,
|
||||
isComplete: false
|
||||
}
|
||||
];
|
||||
} else {
|
||||
const updated = [...prev];
|
||||
updated[updated.length - 1].text = userMessage.substring(0, charIndex);
|
||||
return updated;
|
||||
}
|
||||
});
|
||||
charIndex++;
|
||||
} else {
|
||||
clearInterval(typeInterval);
|
||||
// Mark message as complete and move to next stage
|
||||
setTimeout(() => {
|
||||
setMessages((prev) => {
|
||||
const updated = [...prev];
|
||||
if (updated.length > 0) {
|
||||
updated[updated.length - 1].isComplete = true;
|
||||
}
|
||||
return updated;
|
||||
});
|
||||
// Auto-send and transition to process
|
||||
setTimeout(() => {
|
||||
setStage("process");
|
||||
}, 800);
|
||||
}, 500);
|
||||
}
|
||||
}, 30);
|
||||
}, 500);
|
||||
}
|
||||
|
||||
return () => clearTimeout(timeoutId);
|
||||
}, [stage, currentIdeaIndex, messages.length, isAutoPlaying]);
|
||||
|
||||
// Stage 2: Process flow animation
|
||||
useEffect(() => {
|
||||
if (stage !== "process" || !isAutoPlaying) return;
|
||||
|
||||
const steps = [
|
||||
{ name: "Design", active: false },
|
||||
{ name: "Planning", active: false },
|
||||
{ name: "Coding", active: false }
|
||||
];
|
||||
setProcessSteps(steps);
|
||||
|
||||
let stepIndex = 0;
|
||||
const stepInterval = setInterval(() => {
|
||||
if (stepIndex < steps.length) {
|
||||
setProcessSteps((prev) =>
|
||||
prev.map((step, idx) => ({
|
||||
...step,
|
||||
active: idx === stepIndex
|
||||
}))
|
||||
);
|
||||
stepIndex++;
|
||||
} else {
|
||||
clearInterval(stepInterval);
|
||||
// Transition to finished
|
||||
setTimeout(() => {
|
||||
setStage("finished");
|
||||
setFinishedApp(appIdeas[currentIdeaIndex]);
|
||||
}, 1000);
|
||||
}
|
||||
}, 1200);
|
||||
|
||||
return () => clearInterval(stepInterval);
|
||||
}, [stage, currentIdeaIndex, isAutoPlaying]);
|
||||
|
||||
// Stage 3: Finished app display and loop
|
||||
useEffect(() => {
|
||||
if (stage !== "finished" || !isAutoPlaying) return;
|
||||
|
||||
const loopTimeout = setTimeout(() => {
|
||||
const nextIndex = (currentIdeaIndex + 1) % appIdeas.length;
|
||||
setCurrentIdeaIndex(nextIndex);
|
||||
setStage("chat");
|
||||
setMessages([]);
|
||||
setProcessSteps([]);
|
||||
setFinishedApp(null);
|
||||
}, 4000);
|
||||
|
||||
return () => clearTimeout(loopTimeout);
|
||||
}, [stage, currentIdeaIndex, isAutoPlaying]);
|
||||
|
||||
return (
|
||||
<div className="w-full py-20 px-4 sm:px-6 lg:px-8 bg-gradient-to-b from-background via-background to-background-accent/10">
|
||||
<div className="max-w-4xl mx-auto">
|
||||
{/* Section Header */}
|
||||
<div className="text-center mb-16 opacity-0 animate-in fade-in slide-in-from-bottom-4 duration-700">
|
||||
<p className="text-sm font-semibold text-primary-cta mb-2">INTERACTIVE DEMO</p>
|
||||
<h2 className="text-3xl sm:text-4xl md:text-5xl font-bold mb-4">See It In Action</h2>
|
||||
<p className="text-base sm:text-lg text-foreground/70 max-w-2xl mx-auto">
|
||||
Watch how Native Line transforms your ideas into complete apps in real-time
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Main Demo Container */}
|
||||
<div className="relative">
|
||||
{/* Chat Stage */}
|
||||
{stage === "chat" && (
|
||||
<div className="animate-in fade-in duration-500">
|
||||
<div className="bg-card border border-accent/20 rounded-lg p-6 sm:p-8 shadow-lg">
|
||||
<div className="space-y-4 mb-6 h-40 flex flex-col justify-center">
|
||||
{messages.map((msg) => (
|
||||
<div
|
||||
key={msg.id}
|
||||
className={`flex ${msg.isUser ? "justify-end" : "justify-start"} animate-in fade-in slide-in-from-bottom-2 duration-300`}
|
||||
>
|
||||
<div
|
||||
className={`px-4 py-2 rounded-lg max-w-xs ${
|
||||
msg.isUser
|
||||
? "bg-primary-cta text-white"
|
||||
: "bg-background text-foreground border border-accent/30"
|
||||
}`}
|
||||
>
|
||||
<p className="text-sm">{msg.text}</p>
|
||||
{msg.isComplete && msg.isUser && (
|
||||
<div className="mt-2 flex justify-end">
|
||||
<Send className="w-4 h-4" />
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Process Flow Stage */}
|
||||
{stage === "process" && (
|
||||
<div className="animate-in fade-in duration-500">
|
||||
<div className="flex justify-center items-center gap-2 sm:gap-4 h-40 flex-wrap">
|
||||
{processSteps.map((step, idx) => (
|
||||
<div key={idx} className="flex items-center">
|
||||
<div
|
||||
className={`w-16 sm:w-20 h-16 sm:h-20 rounded-full flex items-center justify-center text-sm font-semibold transition-all duration-500 ${
|
||||
step.active
|
||||
? "bg-primary-cta text-white scale-110 shadow-lg animate-pulse"
|
||||
: "bg-background border-2 border-accent/30 text-foreground"
|
||||
}`}
|
||||
>
|
||||
{step.name}
|
||||
</div>
|
||||
{idx < processSteps.length - 1 && (
|
||||
<div
|
||||
className={`w-8 sm:w-12 h-1 mx-1 sm:mx-2 transition-all duration-500 ${
|
||||
processSteps[idx + 1].active ? "bg-primary-cta" : "bg-accent/20"
|
||||
}`}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Finished App Stage */}
|
||||
{stage === "finished" && finishedApp && (
|
||||
<div className="animate-in fade-in duration-700">
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 items-center">
|
||||
{/* App Image - Right */}
|
||||
<div className="order-2 md:order-2 h-64 sm:h-80 bg-gradient-to-br from-primary-cta/10 to-accent/10 rounded-lg border border-accent/30 flex items-center justify-center animate-in fade-in slide-in-from-right-4 duration-700">
|
||||
<div className="text-center">
|
||||
<div className="w-20 h-20 sm:w-24 sm:h-24 bg-primary-cta/20 rounded-full mx-auto mb-4 flex items-center justify-center">
|
||||
<div className="w-16 h-16 sm:w-20 sm:h-20 bg-primary-cta rounded-full" />
|
||||
</div>
|
||||
<p className="text-sm text-foreground/50">App Preview</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* App Details - Left */}
|
||||
<div className="order-1 md:order-1 animate-in fade-in slide-in-from-left-4 duration-700 space-y-4">
|
||||
<div>
|
||||
<h3 className="text-2xl sm:text-3xl font-bold mb-2">{finishedApp.title}</h3>
|
||||
<p className="text-foreground/70 text-sm sm:text-base">{finishedApp.description}</p>
|
||||
</div>
|
||||
<div className="space-y-2 pt-4">
|
||||
<p className="text-xs sm:text-sm font-semibold text-primary-cta">✓ Production-Ready Code</p>
|
||||
<p className="text-xs sm:text-sm font-semibold text-primary-cta">✓ Ready to Deploy</p>
|
||||
<p className="text-xs sm:text-sm font-semibold text-primary-cta">✓ Fully Yours to Modify</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Loop Indicator */}
|
||||
<div className="mt-12 flex justify-center gap-2">
|
||||
{appIdeas.map((idea, idx) => (
|
||||
<button
|
||||
key={idea.id}
|
||||
onClick={() => {
|
||||
setCurrentIdeaIndex(idx);
|
||||
setStage("chat");
|
||||
setMessages([]);
|
||||
setProcessSteps([]);
|
||||
setFinishedApp(null);
|
||||
}}
|
||||
className={`w-2 h-2 rounded-full transition-all duration-300 ${
|
||||
idx === currentIdeaIndex ? "bg-primary-cta w-8" : "bg-accent/30"
|
||||
}`}
|
||||
aria-label={`Show ${idea.title}`}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
|
||||
{/* Auto-play Toggle */}
|
||||
<div className="mt-8 flex justify-center">
|
||||
<button
|
||||
onClick={() => setIsAutoPlaying(!isAutoPlaying)}
|
||||
className="px-4 py-2 text-sm rounded-full border border-accent/30 hover:bg-card transition-colors"
|
||||
>
|
||||
{isAutoPlaying ? "Pause" : "Play"}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user