SDK customers can now access the documentation publicly without login. The portal runs independently from admin-v2 on https://macmini:3006/. - New developer-portal/ app with 26 pages, 2 components - Docker service + nginx SSL reverse proxy on port 3006 - All /developers/* routes remapped to /* in the new app - admin-v2 developer pages remain unchanged Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
263 lines
9.3 KiB
TypeScript
263 lines
9.3 KiB
TypeScript
'use client'
|
|
|
|
import React, { useState } from 'react'
|
|
import Link from 'next/link'
|
|
import {
|
|
Shield, Code, Download, Smartphone, FileCode, Lock,
|
|
ChevronRight, Copy, Check, Zap, Globe, Layers,
|
|
BookOpen, Terminal
|
|
} from 'lucide-react'
|
|
import { SDKDocsSidebar } from '@/components/SDKDocsSidebar'
|
|
|
|
type Framework = 'npm' | 'yarn' | 'pnpm'
|
|
|
|
const installCommands: Record<Framework, string> = {
|
|
npm: 'npm install @breakpilot/consent-sdk',
|
|
yarn: 'yarn add @breakpilot/consent-sdk',
|
|
pnpm: 'pnpm add @breakpilot/consent-sdk',
|
|
}
|
|
|
|
function CopyButton({ text }: { text: string }) {
|
|
const [copied, setCopied] = useState(false)
|
|
|
|
const handleCopy = async () => {
|
|
await navigator.clipboard.writeText(text)
|
|
setCopied(true)
|
|
setTimeout(() => setCopied(false), 2000)
|
|
}
|
|
|
|
return (
|
|
<button
|
|
onClick={handleCopy}
|
|
className="p-2 hover:bg-gray-700 rounded transition-colors"
|
|
title="Kopieren"
|
|
>
|
|
{copied ? (
|
|
<Check className="w-4 h-4 text-green-400" />
|
|
) : (
|
|
<Copy className="w-4 h-4 text-gray-400" />
|
|
)}
|
|
</button>
|
|
)
|
|
}
|
|
|
|
export default function ConsentSDKHubPage() {
|
|
const [selectedPM, setSelectedPM] = useState<Framework>('npm')
|
|
|
|
const quickLinks = [
|
|
{
|
|
title: 'Installation',
|
|
description: 'SDK in wenigen Minuten einrichten',
|
|
href: '/sdk/consent/installation',
|
|
icon: Download,
|
|
color: 'bg-blue-500',
|
|
},
|
|
{
|
|
title: 'API Referenz',
|
|
description: 'Vollstaendige API-Dokumentation',
|
|
href: '/sdk/consent/api-reference',
|
|
icon: FileCode,
|
|
color: 'bg-purple-500',
|
|
},
|
|
{
|
|
title: 'Frameworks',
|
|
description: 'React, Vue, Angular Integration',
|
|
href: '/sdk/consent/frameworks',
|
|
icon: Layers,
|
|
color: 'bg-green-500',
|
|
},
|
|
{
|
|
title: 'Mobile SDKs',
|
|
description: 'iOS, Android, Flutter',
|
|
href: '/sdk/consent/mobile',
|
|
icon: Smartphone,
|
|
color: 'bg-orange-500',
|
|
},
|
|
{
|
|
title: 'Sicherheit',
|
|
description: 'Best Practices & Compliance',
|
|
href: '/sdk/consent/security',
|
|
icon: Lock,
|
|
color: 'bg-red-500',
|
|
},
|
|
]
|
|
|
|
const features = [
|
|
{
|
|
title: 'DSGVO & TTDSG Konform',
|
|
description: 'Vollstaendige Unterstuetzung fuer EU-Datenschutzverordnungen mit revisionssicherer Consent-Speicherung.',
|
|
icon: Shield,
|
|
},
|
|
{
|
|
title: 'Google Consent Mode v2',
|
|
description: 'Native Integration mit automatischer Synchronisation zu Google Analytics und Ads.',
|
|
icon: Globe,
|
|
},
|
|
{
|
|
title: 'Script Blocking',
|
|
description: 'Automatisches Blockieren von Third-Party Scripts bis zur Einwilligung.',
|
|
icon: Code,
|
|
},
|
|
{
|
|
title: 'Multi-Platform',
|
|
description: 'Unterstuetzung fuer Web, PWA, iOS, Android und Flutter aus einer Codebasis.',
|
|
icon: Smartphone,
|
|
},
|
|
]
|
|
|
|
return (
|
|
<div className="min-h-screen bg-gray-50 flex">
|
|
<SDKDocsSidebar />
|
|
|
|
<main className="flex-1 ml-64">
|
|
<div className="max-w-5xl mx-auto px-8 py-12">
|
|
{/* Header */}
|
|
<div className="mb-12">
|
|
<div className="flex items-center gap-3 mb-4">
|
|
<div className="w-12 h-12 rounded-xl bg-gradient-to-br from-violet-600 to-purple-600 flex items-center justify-center">
|
|
<Shield className="w-7 h-7 text-white" />
|
|
</div>
|
|
<div>
|
|
<h1 className="text-3xl font-bold text-gray-900">Consent SDK</h1>
|
|
<div className="flex items-center gap-2 mt-1">
|
|
<span className="px-2 py-0.5 bg-green-100 text-green-800 text-xs font-medium rounded-full">
|
|
v1.0.0
|
|
</span>
|
|
<span className="text-sm text-gray-500">DSGVO/TTDSG Compliant</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<p className="text-lg text-gray-600 max-w-3xl">
|
|
Das Consent SDK ermoeglicht DSGVO-konforme Einwilligungsverwaltung fuer Web, PWA und Mobile Apps.
|
|
Mit nativer Unterstuetzung fuer React, Vue, Angular und Mobile Platforms.
|
|
</p>
|
|
</div>
|
|
|
|
{/* Quick Install */}
|
|
<div className="mb-12 bg-white rounded-xl border border-gray-200 overflow-hidden">
|
|
<div className="px-6 py-4 border-b border-gray-200 flex items-center justify-between">
|
|
<h2 className="font-semibold text-gray-900">Schnellinstallation</h2>
|
|
<div className="flex gap-1 bg-gray-100 rounded-lg p-1">
|
|
{(['npm', 'yarn', 'pnpm'] as const).map((pm) => (
|
|
<button
|
|
key={pm}
|
|
onClick={() => setSelectedPM(pm)}
|
|
className={`px-3 py-1 text-sm rounded-md transition-colors ${
|
|
selectedPM === pm
|
|
? 'bg-white text-gray-900 shadow-sm'
|
|
: 'text-gray-600 hover:text-gray-900'
|
|
}`}
|
|
>
|
|
{pm}
|
|
</button>
|
|
))}
|
|
</div>
|
|
</div>
|
|
<div className="bg-gray-900 px-6 py-4 flex items-center justify-between">
|
|
<code className="text-green-400 font-mono text-sm">
|
|
$ {installCommands[selectedPM]}
|
|
</code>
|
|
<CopyButton text={installCommands[selectedPM]} />
|
|
</div>
|
|
</div>
|
|
|
|
{/* Quick Links */}
|
|
<div className="mb-12">
|
|
<h2 className="text-xl font-semibold text-gray-900 mb-4">Dokumentation</h2>
|
|
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
{quickLinks.map((link) => (
|
|
<Link
|
|
key={link.href}
|
|
href={link.href}
|
|
className="group p-4 bg-white rounded-xl border border-gray-200 hover:border-violet-300 hover:shadow-md transition-all"
|
|
>
|
|
<div className="flex items-start gap-3">
|
|
<div className={`w-10 h-10 rounded-lg ${link.color} flex items-center justify-center shrink-0`}>
|
|
<link.icon className="w-5 h-5 text-white" />
|
|
</div>
|
|
<div className="flex-1 min-w-0">
|
|
<h3 className="font-medium text-gray-900 group-hover:text-violet-600 transition-colors flex items-center gap-1">
|
|
{link.title}
|
|
<ChevronRight className="w-4 h-4 opacity-0 group-hover:opacity-100 transition-opacity" />
|
|
</h3>
|
|
<p className="text-sm text-gray-500 mt-1">{link.description}</p>
|
|
</div>
|
|
</div>
|
|
</Link>
|
|
))}
|
|
</div>
|
|
</div>
|
|
|
|
{/* Quick Start Code */}
|
|
<div className="mb-12 bg-white rounded-xl border border-gray-200 overflow-hidden">
|
|
<div className="px-6 py-4 border-b border-gray-200">
|
|
<h2 className="font-semibold text-gray-900">Schnellstart</h2>
|
|
</div>
|
|
<div className="bg-gray-900 p-6">
|
|
<pre className="text-sm text-gray-300 font-mono overflow-x-auto">
|
|
{`import { ConsentManager } from '@breakpilot/consent-sdk';
|
|
|
|
// Manager initialisieren
|
|
const consent = new ConsentManager({
|
|
apiEndpoint: 'https://api.example.com/consent',
|
|
siteId: 'your-site-id',
|
|
});
|
|
|
|
// SDK starten
|
|
await consent.init();
|
|
|
|
// Consent pruefen
|
|
if (consent.hasConsent('analytics')) {
|
|
// Analytics laden
|
|
}
|
|
|
|
// Events abonnieren
|
|
consent.on('change', (state) => {
|
|
console.log('Consent geaendert:', state);
|
|
});`}
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Features */}
|
|
<div className="mb-12">
|
|
<h2 className="text-xl font-semibold text-gray-900 mb-4">Features</h2>
|
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
{features.map((feature) => (
|
|
<div
|
|
key={feature.title}
|
|
className="p-4 bg-white rounded-xl border border-gray-200"
|
|
>
|
|
<div className="flex items-start gap-3">
|
|
<div className="w-10 h-10 rounded-lg bg-violet-100 flex items-center justify-center shrink-0">
|
|
<feature.icon className="w-5 h-5 text-violet-600" />
|
|
</div>
|
|
<div>
|
|
<h3 className="font-medium text-gray-900">{feature.title}</h3>
|
|
<p className="text-sm text-gray-500 mt-1">{feature.description}</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
|
|
{/* Compliance Notice */}
|
|
<div className="p-4 bg-blue-50 border border-blue-200 rounded-xl">
|
|
<div className="flex items-start gap-3">
|
|
<Shield className="w-5 h-5 text-blue-600 mt-0.5" />
|
|
<div>
|
|
<h3 className="font-medium text-blue-900">DSGVO & TTDSG Compliance</h3>
|
|
<p className="text-sm text-blue-700 mt-1">
|
|
Das Consent SDK erfuellt alle Anforderungen der DSGVO (Art. 6, 7, 13, 14, 17, 20) und des TTDSG (§ 25).
|
|
Alle Einwilligungen werden revisionssicher gespeichert und koennen jederzeit exportiert werden.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</main>
|
|
</div>
|
|
)
|
|
}
|