diff --git a/app/(app)/onboarding/page.tsx b/app/(app)/onboarding/page.tsx
deleted file mode 100644
index 92a053c..0000000
--- a/app/(app)/onboarding/page.tsx
+++ /dev/null
@@ -1,365 +0,0 @@
-'use client'
-
-import { useState } from 'react'
-import { useRouter } from 'next/navigation'
-import { Button } from '@/components/ui/button'
-import { Input } from '@/components/ui/input'
-import { Textarea } from '@/components/ui/textarea'
-import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
-import { Label } from '@/components/ui/label'
-import { Skeleton } from '@/components/ui/skeleton'
-import { Alert, AlertDescription } from '@/components/ui/alert'
-import { ArrowRight, Globe, Loader2, Sparkles, AlertCircle, ArrowLeft } from 'lucide-react'
-import type { ProductAnalysis } from '@/lib/types'
-
-const examples = [
- { name: 'Notion', url: 'https://notion.so' },
- { name: 'Stripe', url: 'https://stripe.com' },
- { name: 'Figma', url: 'https://figma.com' },
- { name: 'Linear', url: 'https://linear.app' },
-]
-
-export default function OnboardingPage() {
- const router = useRouter()
- const [url, setUrl] = useState('')
- const [loading, setLoading] = useState(false)
- const [progress, setProgress] = useState('')
- const [error, setError] = useState('')
- const [showManualInput, setShowManualInput] = useState(false)
-
- // Manual input fields
- const [manualProductName, setManualProductName] = useState('')
- const [manualDescription, setManualDescription] = useState('')
- const [manualFeatures, setManualFeatures] = useState('')
-
- async function analyzeWebsite() {
- if (!url) return
-
- setLoading(true)
- setError('')
- setProgress('Scraping website...')
-
- try {
- const response = await fetch('/api/analyze', {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({ url }),
- })
-
- const data = await response.json()
-
- if (!response.ok) {
- if (data.needsManualInput) {
- setShowManualInput(true)
- setManualProductName(url.replace(/^https?:\/\//, '').replace(/\/$/, ''))
- throw new Error(data.error)
- }
- throw new Error(data.error || 'Failed to analyze')
- }
-
- setProgress('Analyzing with AI...')
-
- // Store in localStorage for dashboard
- localStorage.setItem('productAnalysis', JSON.stringify(data.data))
- localStorage.setItem('analysisStats', JSON.stringify(data.stats))
-
- setProgress('Redirecting to dashboard...')
-
- // Redirect to dashboard with product name in query
- const params = new URLSearchParams({ product: data.data.productName })
- router.push(`/dashboard?${params.toString()}`)
- } catch (err: any) {
- console.error('Analysis error:', err)
- setError(err.message || 'Failed to analyze website')
- } finally {
- setLoading(false)
- }
- }
-
- async function analyzeManually() {
- if (!manualProductName || !manualDescription) return
-
- setLoading(true)
- setError('')
- setProgress('Analyzing with AI...')
-
- try {
- // Create a mock analysis from manual input
- const manualAnalysis: ProductAnalysis = {
- productName: manualProductName,
- tagline: manualDescription.split('.')[0],
- description: manualDescription,
- features: manualFeatures.split('\n').filter(f => f.trim()),
- problemsSolved: [],
- targetAudience: [],
- valuePropositions: [],
- keywords: manualProductName.toLowerCase().split(' '),
- scrapedAt: new Date().toISOString()
- }
-
- // Send to API to enhance with AI
- const response = await fetch('/api/analyze-manual', {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({
- productName: manualProductName,
- description: manualDescription,
- features: manualFeatures
- }),
- })
-
- let finalAnalysis = manualAnalysis
-
- if (response.ok) {
- const data = await response.json()
- finalAnalysis = data.data
- }
-
- // Store in localStorage for dashboard
- localStorage.setItem('productAnalysis', JSON.stringify(finalAnalysis))
- localStorage.setItem('analysisStats', JSON.stringify({
- features: finalAnalysis.features.length,
- keywords: finalAnalysis.keywords.length,
- personas: finalAnalysis.personas.length,
- useCases: finalAnalysis.useCases.length,
- competitors: finalAnalysis.competitors.length,
- dorkQueries: finalAnalysis.dorkQueries.length
- }))
-
- // Redirect to dashboard
- const params = new URLSearchParams({ product: finalAnalysis.productName })
- router.push(`/dashboard?${params.toString()}`)
- } catch (err: any) {
- console.error('Manual analysis error:', err)
- setError(err.message || 'Failed to analyze')
- } finally {
- setLoading(false)
- }
- }
-
- if (showManualInput) {
- return (
-
-
-
-
-
Couldn't Reach Website
-
- No problem! Tell us about your product and we'll analyze it manually.
-
-
-
- {error && (
-
-
- {error}
-
- )}
-
-
-
- Describe Your Product
-
- Enter your product details and we'll extract the key information.
-
-
-
-
-
- setManualProductName(e.target.value)}
- />
-
-
-
-
-
-
-
-
-
-
- {loading && (
-
-
-
- {progress}
-
-
-
-
-
-
- )}
-
-
-
-
-
-
-
-
-
- )
- }
-
- return (
-
-
- {/* Header */}
-
-
-
Welcome to Sanati
-
- Enter your website URL and we'll analyze your product to find opportunities.
-
-
-
- {error && (
-
-
- {error}
-
- )}
-
- {/* Input Card */}
-
-
- Analyze Your Product
-
- We'll scrape your site and use AI to extract key information.
-
-
-
-
-
-
-
- setUrl(e.target.value)}
- onKeyDown={(e) => e.key === 'Enter' && !loading && analyzeWebsite()}
- className="pl-10"
- disabled={loading}
- />
-
-
-
- {loading && (
-
-
-
- {progress}
-
-
-
-
-
-
-
- )}
-
-
-
-
-
-
-
- {/* Examples */}
-
-
Or try with an example:
-
- {examples.map((example) => (
-
- ))}
-
-
-
-
- )
-}
diff --git a/app/onboarding/page.tsx b/app/onboarding/page.tsx
new file mode 100644
index 0000000..0b7acb3
--- /dev/null
+++ b/app/onboarding/page.tsx
@@ -0,0 +1,398 @@
+'use client'
+
+import { useState } from 'react'
+import { useRouter } from 'next/navigation'
+import { Button } from '@/components/ui/button'
+import { Input } from '@/components/ui/input'
+import { Textarea } from '@/components/ui/textarea'
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
+import { Label } from '@/components/ui/label'
+import { Skeleton } from '@/components/ui/skeleton'
+import { Alert, AlertDescription } from '@/components/ui/alert'
+import { ArrowRight, Globe, Loader2, Sparkles, AlertCircle, ArrowLeft } from 'lucide-react'
+import type { ProductAnalysis } from '@/lib/types'
+
+const examples = [
+ { name: 'Notion', url: 'https://notion.so' },
+ { name: 'Stripe', url: 'https://stripe.com' },
+ { name: 'Figma', url: 'https://figma.com' },
+ { name: 'Linear', url: 'https://linear.app' },
+]
+
+export default function OnboardingPage() {
+ const router = useRouter()
+ const [url, setUrl] = useState('')
+ const [loading, setLoading] = useState(false)
+ const [progress, setProgress] = useState('')
+ const [error, setError] = useState('')
+ const [showManualInput, setShowManualInput] = useState(false)
+
+ // Manual input fields
+ const [manualProductName, setManualProductName] = useState('')
+ const [manualDescription, setManualDescription] = useState('')
+ const [manualFeatures, setManualFeatures] = useState('')
+
+ async function analyzeWebsite() {
+ if (!url) return
+
+ setLoading(true)
+ setError('')
+ setProgress('Scraping website...')
+
+ try {
+ const response = await fetch('/api/analyze', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ url }),
+ })
+
+ const data = await response.json()
+
+ if (!response.ok) {
+ if (data.needsManualInput) {
+ setShowManualInput(true)
+ setManualProductName(url.replace(/^https?:\/\//, '').replace(/\/$/, ''))
+ throw new Error(data.error)
+ }
+ throw new Error(data.error || 'Failed to analyze')
+ }
+
+ setProgress('Analyzing with AI...')
+
+ // Store in localStorage for dashboard
+ localStorage.setItem('productAnalysis', JSON.stringify(data.data))
+ localStorage.setItem('analysisStats', JSON.stringify(data.stats))
+
+ setProgress('Redirecting to dashboard...')
+
+ // Redirect to dashboard with product name in query
+ const params = new URLSearchParams({ product: data.data.productName })
+ router.push(`/dashboard?${params.toString()}`)
+ } catch (err: any) {
+ console.error('Analysis error:', err)
+ setError(err.message || 'Failed to analyze website')
+ } finally {
+ setLoading(false)
+ }
+ }
+
+ async function analyzeManually() {
+ if (!manualProductName || !manualDescription) return
+
+ setLoading(true)
+ setError('')
+ setProgress('Analyzing with AI...')
+
+ try {
+ // Create a mock analysis from manual input
+ const manualAnalysis: ProductAnalysis = {
+ productName: manualProductName,
+ tagline: manualDescription.split('.')[0],
+ description: manualDescription,
+ features: manualFeatures.split('\n').filter(f => f.trim()),
+ problemsSolved: [],
+ targetAudience: [],
+ valuePropositions: [],
+ keywords: manualProductName.toLowerCase().split(' '),
+ scrapedAt: new Date().toISOString()
+ }
+
+ // Send to API to enhance with AI
+ const response = await fetch('/api/analyze-manual', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ productName: manualProductName,
+ description: manualDescription,
+ features: manualFeatures
+ }),
+ })
+
+ let finalAnalysis = manualAnalysis
+
+ if (response.ok) {
+ const data = await response.json()
+ finalAnalysis = data.data
+ }
+
+ // Store in localStorage for dashboard
+ localStorage.setItem('productAnalysis', JSON.stringify(finalAnalysis))
+ localStorage.setItem('analysisStats', JSON.stringify({
+ features: finalAnalysis.features.length,
+ keywords: finalAnalysis.keywords.length,
+ personas: finalAnalysis.personas.length,
+ useCases: finalAnalysis.useCases.length,
+ competitors: finalAnalysis.competitors.length,
+ dorkQueries: finalAnalysis.dorkQueries.length
+ }))
+
+ // Redirect to dashboard
+ const params = new URLSearchParams({ product: finalAnalysis.productName })
+ router.push(`/dashboard?${params.toString()}`)
+ } catch (err: any) {
+ console.error('Manual analysis error:', err)
+ setError(err.message || 'Failed to analyze')
+ } finally {
+ setLoading(false)
+ }
+ }
+
+ if (showManualInput) {
+ return (
+
+ {/* Left Side - Content */}
+
+
+
+
+
Couldn't Reach Website
+
+ No problem! Tell us about your product and we'll analyze it manually.
+
+
+
+ {error && (
+
+
+ {error}
+
+ )}
+
+
+
+ Describe Your Product
+
+ Enter your product details and we'll extract the key information.
+
+
+
+
+
+ setManualProductName(e.target.value)}
+ />
+
+
+
+
+
+
+
+
+
+
+ {loading && (
+
+
+
+ {progress}
+
+
+
+
+
+
+ )}
+
+
+
+
+
+
+
+
+
+
+ {/* Right Side - Image */}
+
+

+
{/* Optional overlay for contrast if needed */}
+
+
+ )
+ }
+
+ return (
+
+ {/* Left Side - Content */}
+
+
+ {/* Header */}
+
+
+
Welcome to Sanati
+
+ Enter your website URL and we'll analyze your product to find opportunities.
+
+
+
+ {error && (
+
+
+ {error}
+
+ )}
+
+ {/* Input Card */}
+
+
+
+
+
+
+ setUrl(e.target.value)}
+ onKeyDown={(e) => e.key === 'Enter' && !loading && analyzeWebsite()}
+ className="pl-10 h-11"
+ disabled={loading}
+ />
+
+
+
+ {loading && (
+
+
+
+ {progress}
+
+
+
+
+
+
+
+ )}
+
+
+
+
+
+
+
+
+ {/* Examples */}
+
+
Try with an example:
+
+ {examples.map((example) => (
+
+ ))}
+
+
+
+
+
+
+ {/* Right Side - Image */}
+
+

+
+
+
+ )
+}
diff --git a/app/page.tsx b/app/page.tsx
index ab48bc1..48e9487 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -3,6 +3,8 @@ import { ArrowRight, Search, Zap, Target, Sparkles } from 'lucide-react'
import { Button } from '@/components/ui/button'
import { DotPattern } from '@/components/magicui/dot-pattern'
import { HeroShader } from '@/components/hero-shader'
+import { FeaturesSection } from '@/components/features-section'
+import { HeroSection } from '@/components/hero-section'
import { cn } from '@/lib/utils'
export default function LandingPage() {
@@ -15,28 +17,6 @@ export default function LandingPage() {
)}
/>
-
-
- {/* Header */}
-
-
-
-
-
-
-
{/* Header */}