Files
triqura-ecd/app/(marketing)/page.tsx
colinislit 273c00f9e8 Epic 2: Design System Migration - Teal-first implementatie
 E2.S1: Tailwind config update
- Teal-700 (#0F766E) als PRIMARY brand color (5.47:1 contrast)
- Amber-600→700 gradient voor AI features
- Updated ring color naar teal-700 voor WCAG AA

 E2.S2: Global CSS variables
- --color-brand → teal-700 (was blue-600)
- --color-info → teal-700 (was blue-500)
- --color-input-focus → teal-700 (was blue-500)
- --color-ai toegevoegd → amber-600

 E2.S3: Component color updates
- components/ui/sign-in.tsx: Alle blue → teal
- components/ui/timeline.tsx: Gradient blue → teal
- components/ui/reading-progress.tsx: Progress bar blue → teal
- components/ui/modern-side-bar.tsx: Logo, active states blue → teal

 E2.S4: AIButton component
- Nieuw component: components/ui/ai-button.tsx
- Amber-600→700 gradient voor WCAG compliance
- 3 variants: default, outline, ghost
- Loading state + Sparkles icon
- Fully accessible (WCAG AA focus states)

 E2.S5: Contrast testing
- scripts/test-contrast.ts: Automated WCAG testing
- docs/design/wcag-compliance.md: Compliance documentatie
- Resultaten: 7/11 AA Normal (4.5:1), 11/11 AA Large (3:1) 

WCAG AA Compliance:  PASS
- Teal-700 op wit: 5.47:1 (AA Normal)
- White op teal-700: 5.47:1 (AA Normal)
- White op amber-600: 3.19:1 (AA Large - OK voor buttons)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 17:38:22 +01:00

168 lines
5.6 KiB
TypeScript

/**
* Homepage - AI Speedrun v2.1
*
* Vereenvoudigde landing page met:
* - Hero quote (Jensen Huang)
* - Statement section (Software on Demand concept)
* - Timeline (coming in E1.S3)
* - CTA naar /login
*
* Performance optimizations:
* - Critical content (Hero, Statement) loads immediately
* - Timeline will be lazy loaded when added
*/
import type { Metadata } from 'next'
import { getContent } from '@/lib/content/loader'
import type { MetadataContent } from '@/content/schemas/manifesto'
import { HeroQuote } from './components/hero-quote'
// Generate metadata for SEO
export async function generateMetadata(): Promise<Metadata> {
const metadataContent = await getContent<MetadataContent>('nl', 'metadata')
const meta = metadataContent.manifesto
const siteUrl = process.env.NEXT_PUBLIC_APP_URL || 'https://aispeedrun.vercel.app'
const ogImageUrl = `${siteUrl}${meta.ogImage}`
return {
title: meta.title,
description: meta.description,
keywords: meta.keywords,
authors: [{ name: 'Colin van der Heijden' }],
openGraph: {
type: 'article',
title: meta.ogTitle,
description: meta.ogDescription,
images: [
{
url: ogImageUrl,
width: 1200,
height: 630,
alt: meta.ogTitle,
},
],
siteName: 'AI Speedrun',
locale: 'nl_NL',
},
twitter: {
card: 'summary_large_image',
title: meta.ogTitle,
description: meta.ogDescription,
images: [ogImageUrl],
},
alternates: {
canonical: siteUrl,
},
robots: {
index: true,
follow: true,
googleBot: {
index: true,
follow: true,
'max-video-preview': -1,
'max-image-preview': 'large',
'max-snippet': -1,
},
},
}
}
// Statement content interface
interface StatementContent {
hero: {
quote: string
attribution: string
attributionContext: string
subtitle: string
}
}
export default async function HomePage() {
// Load hero content from existing manifesto
const content = await getContent<StatementContent>('nl', 'manifesto')
return (
<>
{/* Hero Quote Section */}
<HeroQuote content={content.hero} />
{/* Statement Section - Software on Demand */}
<section className="w-full md:max-w-[750px] mx-auto px-4 md:px-16 py-16 md:py-24">
<div className="prose prose-slate max-w-none">
<h2 className="font-serif text-3xl md:text-4xl font-bold text-slate-900 mb-8">
Software on Demand: Van 100k naar 200
</h2>
<div className="space-y-6 text-lg leading-relaxed text-slate-700">
<p>
<strong className="text-slate-900">Het probleem:</strong> Enterprise software kost 100.000+ per jaar
en implementaties duren 12-24 maanden. Je betaalt voor potentieel, niet voor werkelijke waarde.
Vendors optimaliseren voor meer seats, meer modules, meer lock-in.
</p>
<p>
<strong className="text-slate-900">De oplossing:</strong> AI-powered development verkort dit naar
4 weken en 200 totale kosten. Niet omdat AI magisch is, maar omdat je 80% van de standaard-code
niet meer hoeft te schrijven. De kostenbasis verschuift compleet - geen armies van consultants,
geen jarenlange developmenttrajecten.
</p>
<p>
<strong className="text-slate-900">Het bewijs:</strong> Dit EPD prototype is het levende bewijs.
Gebouwd in 4 weken, volledig transparant, build in public. Infrastructuur die schaalt met gebruik,
AI die de heavy lifting doet. En het belangrijkste: je bezit de code, je controleert de roadmap.
</p>
<p className="text-teal-700 font-medium text-xl pt-4">
Volg de voortgang hieronder en zie hoe elk onderdeel tot leven komt
</p>
</div>
</div>
</section>
{/* Timeline Section - Coming in E1.S3 */}
<section id="timeline" className="w-full bg-slate-50 py-16 md:py-24">
<div className="max-w-6xl mx-auto px-4">
<div className="text-center">
<h2 className="font-serif text-3xl md:text-4xl font-bold text-slate-900 mb-4">
Build in Public: 4 Weken
</h2>
<p className="text-slate-600 text-lg max-w-2xl mx-auto">
Timeline komt hier in E1.S3 - volledige transparantie over voortgang, features en metrics
</p>
</div>
</div>
</section>
{/* CTA Section */}
<section className="py-24 px-4 text-center bg-gradient-to-br from-teal-50 to-white">
<div className="max-w-3xl mx-auto">
<h2 className="text-3xl md:text-4xl font-bold text-slate-900 mb-4">
Klaar om het prototype te proberen?
</h2>
<p className="text-lg text-slate-600 mb-8 max-w-2xl mx-auto">
Login om toegang te krijgen tot de EPD applicatie en zie AI-gestuurde workflows in actie
</p>
<div className="flex flex-col sm:flex-row gap-4 justify-center">
<a
href="/login"
className="inline-block px-8 py-3 bg-teal-600 hover:bg-teal-700 text-white font-medium rounded-lg transition-colors"
>
Probeer het prototype
</a>
<a
href="#timeline"
className="inline-block px-8 py-3 bg-white hover:bg-slate-50 text-slate-700 font-medium rounded-lg border-2 border-slate-300 transition-colors"
>
Bekijk voortgang
</a>
</div>
</div>
</section>
</>
)
}