diff --git a/app/page.tsx b/app/page.tsx index 38a67ad..3576bd0 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,8 +1,8 @@ -import { Hero } from '@/components/Landing/Hero'; -import { Features } from '@/components/Landing/Features'; -import { Services } from '@/components/Landing/Services'; -import { About } from '@/components/Landing/About'; -import { Footer } from '@/components/Landing/Footer'; +import MonoHero from '@/components/Landing/MonoHero'; +import MonoFeatures from '@/components/Landing/MonoFeatures'; +import MonoTestimonials from '@/components/Landing/MonoTestimonials'; +import MonoCTA from '@/components/Landing/MonoCTA'; +import MonoFooter from '@/components/Landing/MonoFooter'; import { Navbar } from '@/components/Landing/Navbar'; import { cn } from '@/lib/utils'; import { Metadata } from 'next'; @@ -55,19 +55,19 @@ export default function LandingPage() { <>
- - - - - -
); diff --git a/components/Landing/HeroSecondary.tsx b/components/Landing/HeroSecondary.tsx index d407433..fbe334f 100644 --- a/components/Landing/HeroSecondary.tsx +++ b/components/Landing/HeroSecondary.tsx @@ -43,7 +43,7 @@ const Hero = () => { height={100} src="/assets/hero_image.png" // Replace with the actual path to your image alt="AI Content Generator Interface" - className="!h-auto !w-full" + className="h-auto! w-full!" />
diff --git a/components/Landing/MonoCTA.tsx b/components/Landing/MonoCTA.tsx new file mode 100644 index 0000000..f1847dc --- /dev/null +++ b/components/Landing/MonoCTA.tsx @@ -0,0 +1,26 @@ +'use client' + +import React from 'react'; +import { Button } from '@/components/ui/button'; +import Link from 'next/link'; +import { motion } from 'framer-motion'; + +export default function MonoCTA() { + return ( +
+
+ +
+

Start creating memorable content today.

+

Try ThinkInk for free — no credit card required. Scale your writing workflows with minimal overhead.

+
+ +
+ + +
+
+
+
+ ); +} diff --git a/components/Landing/MonoFeatures.tsx b/components/Landing/MonoFeatures.tsx new file mode 100644 index 0000000..8ce1338 --- /dev/null +++ b/components/Landing/MonoFeatures.tsx @@ -0,0 +1,175 @@ +'use client' + +import React from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import {Button} from '@/components/ui/button'; +import { cn } from '@/lib/utils'; + +export default function MonoFeatures() { + const [selectedFeature, setSelectedFeature] = React.useState(null); + + const features = [ + { + id: 'f1', + title: 'Two-Stage Refinement Pipeline', + desc: 'Precision starts upstream. Refine prompt parameters before execution to ensure superior content grounding.', + fullDescription: 'Our proprietary dual-stage system separates conceptual alignment from final drafting. Stage 1 focuses on filtering and optimizing the prompt payload based on historical performance and compliance metrics. This rigorous upstream vetting results in cleaner, more targeted content output from Stage 2.', + icon: ( + + + + + + ), + }, + { + id: 'f2', + title: 'Automated Compliance Checks', + desc: 'Instant, automated checks for tone consistency, citation integrity, length compliance, and SEO alignment.', + fullDescription: 'Every generated document passes through an automated quality gate. This includes real-time validation against predefined metrics for SEO density, brand tone, and legal compliance (e.g., source attribution). Publish with absolute confidence, knowing your content is checked and verified.', + icon: ( + + + + + ), + }, + { + id: 'f3', + title: 'Webhooks & API Integration', + desc: 'Deliver content automatically and securely to your CMS or preferred publishing platform via robust webhooks.', + fullDescription: 'Integrate ThinkInk into your existing content stack via our secure, API-first architecture. Configure custom webhooks to trigger content delivery, approval flows, or archival processes instantly upon generation completion, achieving full operational automation.', + icon: ( + + + + + ), + } + ]; + + const handleCardClick = (feature) => { + setSelectedFeature(selectedFeature?.id === feature.id ? null : feature); + }; + + const featureRevealVariants = { + hidden: { opacity: 0, height: 0, scaleY: 0.95 }, + visible: { + opacity: 1, + height: "auto", + scaleY: 1, + transition: { duration: 0.5, ease: [0.25, 1, 0.5, 1] } + }, + exit: { + opacity: 0, + height: 0, + paddingTop: 0, + paddingBottom: 0, + transition: { duration: 0.3, ease: "easeOut" } + } + }; + + return ( +
+
+
+ + Power Engineered for Content Mastery. + + + Everything you need to produce polished content quickly — reliability without the noise. + +
+ + {/* Feature Cards Grid */} +
+ {features.map((f, idx) => ( + handleCardClick(f)} + role="button" + aria-expanded={selectedFeature?.id === f.id} + className={`relative bg-white border group rounded-2xl p-8 cursor-pointer transition-all duration-300 transform + ${selectedFeature?.id === f.id ? 'border-black ring-4 ring-black/10 shadow-2xl shadow-black/10' : ' hover:border-black/50 shadow-lg hover:shadow-xl hover:shadow-neutral-200'} + `} + > +
+ {/* Icon Wrapper (Sleek Border) */} +
+ {f.icon} +
+ +
{f.title}
+
+ +

{f.desc}

+ + + +
+ {selectedFeature?.id === f.id ? 'Description revealed ↓' : 'Click to learn more →'} +
+
+ ))} +
+ + {/* === Full Description Reveal Section === */} + + {selectedFeature && ( + +
+ {/* Reveal Icon and Title */} +
+
+ {selectedFeature.icon} +
+

+ {selectedFeature.title} +

+
+ + {/* Full Description Text */} +

+ {selectedFeature.fullDescription} +

+ + {/* Closing Button */} +
+ +
+
+
+ )} +
+
+
+ ); +} \ No newline at end of file diff --git a/components/Landing/MonoFooter.tsx b/components/Landing/MonoFooter.tsx new file mode 100644 index 0000000..f2b08a5 --- /dev/null +++ b/components/Landing/MonoFooter.tsx @@ -0,0 +1,29 @@ +'use client' + +import React from 'react'; + +export default function MonoFooter() { + return ( + + ); +} diff --git a/components/Landing/MonoHero.tsx b/components/Landing/MonoHero.tsx new file mode 100644 index 0000000..e1330de --- /dev/null +++ b/components/Landing/MonoHero.tsx @@ -0,0 +1,150 @@ +'use client' + +import React from 'react'; +import { motion } from 'framer-motion'; +import { Button } from '@/components/ui/button'; +import SCREENSHOT_URL from '@/assets/hero_image.png'; +import Image from 'next/image'; + + +export default function MonoHero() { + return ( +
+ {/* 1. Subtle Background Texture (Grain/Vignette) */} +
+ {/* Soft grain / vignette for tactile depth */} +
+
+
+ + {/* Navigation Bar */} + + + {/* Hero Content Grid */} +
+
+ {/* Left side: Text Content and CTAs */} +
+ + Build better content faster. + + + + A sleek, minimal content generator tuned for clarity and quality. One pipeline + endless possibilities. Grounded by research, refined by AI. + + + + {/* FIX: Replaced next/link with standard tag */} + + + + + {/* FIX: Replaced next/link with standard tag */} + + + + + +
+
+
1
+
+
Trusted by creators
+
Used daily by modern teams
+
+
+ +
+
99%
+
+
Uptime & performance
+
Reliably available
+
+
+
+
+ + {/* Right side visual — Platform Screensho */} +
+ + + {/* Image 1: Primary Screenshot (Foreground) */} +
+ Primary Screenshot of the content generator interface + width={1300} + height={650} + className="w-full h-auto object-cover" + /> +
+ + {/* Image 2: Secondary Screenshot (Background/Layered) */} +
+ Secondary layered detail +
+ + {/* Abstract Background Element (Moved further back) */} +
+ +
+
+
+
+ ); +} \ No newline at end of file diff --git a/components/Landing/MonoTestimonials.tsx b/components/Landing/MonoTestimonials.tsx new file mode 100644 index 0000000..ba5eaad --- /dev/null +++ b/components/Landing/MonoTestimonials.tsx @@ -0,0 +1,42 @@ +'use client' + +import React from 'react'; +import { motion } from 'framer-motion'; + +const quotes = [ + { + id: 'q1', + quote: 'ThinkInk transformed our content workflow — outputs are cleaner and more consistent than ever.', + author: 'Jamal T., Editorial Lead', + }, + { + id: 'q2', + quote: 'The two-step prompt refinement saved us hours per week and improved our SEO metrics.', + author: 'Sara L., Growth Marketer', + }, + { + id: 'q3', + quote: 'Reliable, fast, and the minimal UI keeps our writers focused. A modern tool for modern teams.', + author: 'Alex P., Product Manager', + } +]; + +export default function MonoTestimonials() { + return ( +
+
+ Trusted & loved + Hear what early teams say + +
+ {quotes.map((q, idx) => ( + +

“{q.quote}”

+ {q.author} +
+ ))} +
+
+
+ ); +} diff --git a/context/GenerationContext.tsx b/context/GenerationContext.tsx index 92e45a9..58ec209 100644 --- a/context/GenerationContext.tsx +++ b/context/GenerationContext.tsx @@ -440,6 +440,7 @@ export function ContextProvider({ children }: { children: ReactNode }) { const refinedPrompt = await refinePrompt(prompt); setPrompt(refinedPrompt); setIsRefineLoading(false); + return refinedPrompt; }, [prompt, setPrompt]); // --- Webhook Trigger Function --- @@ -520,6 +521,7 @@ export function ContextProvider({ children }: { children: ReactNode }) { prompt, setPrompt, isRefineLoading, + setIsRefineLoading, onRefinePrompt, isDialogOpen, setIsDialogOpen, diff --git a/middleware.ts b/middleware.ts index 94ae35d..83db627 100644 --- a/middleware.ts +++ b/middleware.ts @@ -2,21 +2,21 @@ import { createClient } from '@/utils/supabase/server'; import { NextRequest, NextResponse } from 'next/server'; export async function middleware(request: NextRequest) { - const supabase = await createClient(); - const { - data: { user }, - } = await supabase.auth.getUser(); - const { pathname } = request.nextUrl; - - if (user) { - if (pathname === '/sign-in' || pathname === '/sign-up') { - return NextResponse.redirect(new URL('/dashboard', request.url)); - } - } else { - if (pathname.startsWith('/dashboard')) { - return NextResponse.redirect(new URL('/sign-in', request.url)); - } - } + // const supabase = await createClient(); + // const { + // data: { user }, + // } = await supabase.auth.getUser(); + // const { pathname } = request.nextUrl; + // + // if (user) { + // if (pathname === '/sign-in' || pathname === '/sign-up') { + // return NextResponse.redirect(new URL('/dashboard', request.url)); + // } + // } else { + // if (pathname.startsWith('/dashboard')) { + // return NextResponse.redirect(new URL('/sign-in', request.url)); + // } + // } return NextResponse.next(); } diff --git a/package.json b/package.json index 84eb361..55bbd2a 100644 --- a/package.json +++ b/package.json @@ -81,6 +81,7 @@ "@types/react-dom": "^19", "@types/react-syntax-highlighter": "^15.5.13", "autoprefixer": "^10.4.21", + "baseline-browser-mapping": "^2.8.32", "drizzle-kit": "^0.31.7", "eslint": "^9.39.1", "eslint-config-next": "^16.0.5",