feat: RAG-Zahlen korrigiert + Branchen-Regulierungs-Matrix
- Alle Zahlen aktualisiert: 170+ Originaldokumente, 40.000+ Controls, 84 Regularien, 9 Branchen (statt 57 Module / 19 Regularien / 2.274 Texte) - Neue Folie: Regulatorische Landschaft mit Branchen-Regulierungs-Matrix - Konsistent in: Solution, Executive Summary (Slide+PDF), Competition, AI Pipeline, SDK Demo, Presenter Script, FAQ Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -23,6 +23,7 @@ import ExecutiveSummarySlide from './slides/ExecutiveSummarySlide'
|
||||
import CoverSlide from './slides/CoverSlide'
|
||||
import ProblemSlide from './slides/ProblemSlide'
|
||||
import SolutionSlide from './slides/SolutionSlide'
|
||||
import RegulatoryLandscapeSlide from './slides/RegulatoryLandscapeSlide'
|
||||
import ProductSlide from './slides/ProductSlide'
|
||||
import HowItWorksSlide from './slides/HowItWorksSlide'
|
||||
import MarketSlide from './slides/MarketSlide'
|
||||
@@ -126,6 +127,8 @@ export default function PitchDeck({ lang, onToggleLanguage }: PitchDeckProps) {
|
||||
return <ProblemSlide lang={lang} />
|
||||
case 'solution':
|
||||
return <SolutionSlide lang={lang} />
|
||||
case 'regulatory-landscape':
|
||||
return <RegulatoryLandscapeSlide lang={lang} />
|
||||
case 'product':
|
||||
return <ProductSlide lang={lang} products={data.products} />
|
||||
case 'how-it-works':
|
||||
|
||||
@@ -75,8 +75,8 @@ export default function AIPipelineSlide({ lang }: AIPipelineSlideProps) {
|
||||
bg: 'bg-emerald-500/10 border-emerald-500/20',
|
||||
title: de ? '3. Vektorspeicher' : '3. Vector Store',
|
||||
items: de
|
||||
? ['Qdrant Vector DB (Hetzner, API-Key gesichert)', '6 Collections: CE, Recht, Gesetze, Datenschutz, DSFA, Templates', 'MinIO Object Storage (Hetzner, S3-kompatibel, TLS)', '2.274+ Chunks indexiert · HNSW-Index']
|
||||
: ['Qdrant Vector DB (Hetzner, API-key secured)', '6 Collections: CE, Law, Statutes, Privacy, DSFA, Templates', 'MinIO object storage (Hetzner, S3-compatible, TLS)', '2,274+ chunks indexed · HNSW index'],
|
||||
? ['Qdrant Vector DB (Hetzner, API-Key gesichert)', '6 Collections: CE, Recht, Gesetze, Datenschutz, DSFA, Templates', 'MinIO Object Storage (Hetzner, S3-kompatibel, TLS)', '170+ Dokumente · 40.000+ Controls · HNSW-Index']
|
||||
: ['Qdrant Vector DB (Hetzner, API-key secured)', '6 Collections: CE, Law, Statutes, Privacy, DSFA, Templates', 'MinIO object storage (Hetzner, S3-compatible, TLS)', '170+ documents · 40,000+ controls · HNSW index'],
|
||||
},
|
||||
{
|
||||
icon: Search,
|
||||
|
||||
@@ -193,14 +193,14 @@ const ALL_FEATURES: ComparisonFeature[] = [
|
||||
// Top 5 Differentiators (isDiff=true) — no other vendor has ANY of these
|
||||
{ de: 'Self-Hosted / On-Premise', en: 'Self-Hosted / On-Premise', bp: true, vanta: false, drata: false, sprinto: false, proliance: false, dataguard: false, heydata: false, isDiff: true, isUSP: true },
|
||||
{ de: 'Code-Security & DevSecOps (6 Tools)', en: 'Code Security & DevSecOps (6 Tools)', bp: true, vanta: false, drata: false, sprinto: false, proliance: false, dataguard: false, heydata: false, isDiff: true, isUSP: true },
|
||||
{ de: '57 SDK-Compliance-Module', en: '57 SDK Compliance Modules', bp: true, vanta: false, drata: false, sprinto: false, proliance: false, dataguard: false, heydata: false, isDiff: true, isUSP: true },
|
||||
{ de: '84 Regularien, 170+ Originaldokumente im RAG', en: '84 Regulations, 170+ Original Documents in RAG', bp: true, vanta: false, drata: false, sprinto: false, proliance: false, dataguard: false, heydata: false, isDiff: true, isUSP: true },
|
||||
{ de: 'Hardware-Moat (Mac Mini/Studio)', en: 'Hardware Moat (Mac Mini/Studio)', bp: true, vanta: false, drata: false, sprinto: false, proliance: false, dataguard: false, heydata: false, isDiff: true, isUSP: true },
|
||||
{ de: 'PII-Redaction LLM Gateway', en: 'PII Redaction LLM Gateway', bp: true, vanta: false, drata: false, sprinto: false, proliance: false, dataguard: false, heydata: false, isDiff: true, isUSP: true },
|
||||
// More USPs
|
||||
{ de: 'IPFS Dokumenten-Archivierung', en: 'IPFS Document Archiving', bp: true, vanta: false, drata: false, sprinto: false, proliance: false, dataguard: false, heydata: false, isDiff: false, isUSP: true },
|
||||
{ de: 'SBOM-Generator (CycloneDX/SPDX)', en: 'SBOM Generator (CycloneDX/SPDX)', bp: true, vanta: false, drata: false, sprinto: false, proliance: false, dataguard: false, heydata: false, isDiff: false, isUSP: true },
|
||||
{ de: 'Multi-Framework Consent SDK', en: 'Multi-Framework Consent SDK', bp: true, vanta: false, drata: false, sprinto: false, proliance: false, dataguard: false, heydata: false, isDiff: false, isUSP: true },
|
||||
{ de: 'RAG mit 2.274 Rechtstexten', en: 'RAG with 2,274 Legal Texts', bp: true, vanta: false, drata: false, sprinto: false, proliance: false, dataguard: false, heydata: false, isDiff: false, isUSP: true },
|
||||
{ de: 'RAG mit 40.000+ Controls', en: 'RAG with 40,000+ Controls', bp: true, vanta: false, drata: false, sprinto: false, proliance: false, dataguard: false, heydata: false, isDiff: false, isUSP: true },
|
||||
// Pentesting & Code-Security (kein Compliance-Wettbewerber hat dies)
|
||||
{ de: 'SAST (Static Application Security Testing)', en: 'SAST (Static Application Security Testing)', bp: true, vanta: false, drata: false, sprinto: false, proliance: false, dataguard: false, heydata: false, isDiff: false, isUSP: true },
|
||||
{ de: 'DAST (Dynamic Application Security Testing)', en: 'DAST (Dynamic Application Security Testing)', bp: true, vanta: false, drata: false, sprinto: false, proliance: false, dataguard: false, heydata: false, isDiff: false, isUSP: true },
|
||||
@@ -280,7 +280,7 @@ const PRICING_COMPARISON: CompetitorPricing[] = [
|
||||
model: 'Self-Hosted',
|
||||
publicPricing: true,
|
||||
tiers: [
|
||||
{ name: { de: 'Starter', en: 'Starter' }, price: '€990/mo', annual: '€11.880/yr', notes: { de: 'Mac Mini, 30B LLM, 57 Module', en: 'Mac Mini, 30B LLM, 57 modules' } },
|
||||
{ name: { de: 'Starter', en: 'Starter' }, price: '€990/mo', annual: '€11.880/yr', notes: { de: 'Mac Mini, 30B LLM, 84 Regularien', en: 'Mac Mini, 30B LLM, 84 regulations' } },
|
||||
{ name: { de: 'Professional', en: 'Professional' }, price: '€1.490/mo', annual: '€17.880/yr', notes: { de: 'Mac Studio, 70B LLM, Priority', en: 'Mac Studio, 70B LLM, priority' } },
|
||||
{ name: { de: 'Enterprise', en: 'Enterprise' }, price: '€2.990/mo', annual: '€35.880/yr', notes: { de: '2x Mac Studio, 1000B Cloud-LLM', en: '2x Mac Studio, 1000B cloud LLM' } },
|
||||
],
|
||||
|
||||
@@ -135,20 +135,20 @@ export default function ExecutiveSummarySlide({ lang, data }: ExecutiveSummarySl
|
||||
<div class="section-title">${es.keyMetrics}</div>
|
||||
<div class="grid3">
|
||||
<div class="card kpi">
|
||||
<div class="value">57</div>
|
||||
<div class="label">${es.modules}</div>
|
||||
<div class="value">170+</div>
|
||||
<div class="label">${es.documents}</div>
|
||||
</div>
|
||||
<div class="card kpi">
|
||||
<div class="value">19</div>
|
||||
<div class="value">40.000+</div>
|
||||
<div class="label">${es.controls}</div>
|
||||
</div>
|
||||
<div class="card kpi">
|
||||
<div class="value">84</div>
|
||||
<div class="label">${es.regulations}</div>
|
||||
</div>
|
||||
<div class="card kpi">
|
||||
<div class="value">2.274</div>
|
||||
<div class="label">${es.legalTexts}</div>
|
||||
</div>
|
||||
<div class="card kpi">
|
||||
<div class="value">45</div>
|
||||
<div class="label">${es.containers}</div>
|
||||
<div class="value">9</div>
|
||||
<div class="label">${es.industries}</div>
|
||||
</div>
|
||||
<div class="card kpi">
|
||||
<div class="value">761K</div>
|
||||
@@ -243,10 +243,10 @@ export default function ExecutiveSummarySlide({ lang, data }: ExecutiveSummarySl
|
||||
<FadeInView delay={0.4} className="mb-5">
|
||||
<div className="grid grid-cols-3 md:grid-cols-6 gap-3">
|
||||
{[
|
||||
{ value: '57', label: es.modules, icon: Brain, color: '#6366f1' },
|
||||
{ value: '19', label: es.regulations, icon: FileText, color: '#a78bfa' },
|
||||
{ value: '2.274', label: es.legalTexts, icon: Shield, color: '#60a5fa' },
|
||||
{ value: '45', label: es.containers, icon: Server, color: '#34d399' },
|
||||
{ value: '170+', label: es.documents, icon: FileText, color: '#6366f1' },
|
||||
{ value: '40.000+', label: es.controls, icon: Shield, color: '#a78bfa' },
|
||||
{ value: '84', label: es.regulations, icon: Brain, color: '#60a5fa' },
|
||||
{ value: '9', label: es.industries, icon: Server, color: '#34d399' },
|
||||
{ value: '761K', label: es.linesOfCode, icon: Target, color: '#fbbf24' },
|
||||
{ value: amountLabel, label: es.theAsk, icon: TrendingUp, color: '#f472b6' },
|
||||
].map((kpi, idx) => (
|
||||
|
||||
163
pitch-deck/components/slides/RegulatoryLandscapeSlide.tsx
Normal file
163
pitch-deck/components/slides/RegulatoryLandscapeSlide.tsx
Normal file
@@ -0,0 +1,163 @@
|
||||
'use client'
|
||||
|
||||
import { Language } from '@/lib/types'
|
||||
import { t } from '@/lib/i18n'
|
||||
import GradientText from '../ui/GradientText'
|
||||
import FadeInView from '../ui/FadeInView'
|
||||
import GlassCard from '../ui/GlassCard'
|
||||
import KPICard from '../ui/KPICard'
|
||||
import {
|
||||
Shield, Lock, Brain, Globe, Package, Landmark, Heart, ShoppingCart,
|
||||
Activity, Cpu, Bot, Radio, Monitor, Building2
|
||||
} from 'lucide-react'
|
||||
|
||||
interface RegulatoryLandscapeSlideProps {
|
||||
lang: Language
|
||||
}
|
||||
|
||||
// Regulation categories with their color
|
||||
const CATEGORIES = [
|
||||
{ id: 'privacy', color: '#6366f1', icon: Shield },
|
||||
{ id: 'cyber', color: '#ef4444', icon: Lock },
|
||||
{ id: 'ai', color: '#a855f7', icon: Brain },
|
||||
{ id: 'markets', color: '#22c55e', icon: Globe },
|
||||
{ id: 'product', color: '#f97316', icon: Package },
|
||||
{ id: 'finance', color: '#10b981', icon: Landmark },
|
||||
{ id: 'health', color: '#ec4899', icon: Heart },
|
||||
{ id: 'consumer', color: '#f59e0b', icon: ShoppingCart },
|
||||
]
|
||||
|
||||
// Industry → which categories apply (derived from INDUSTRY_REGULATION_MAP)
|
||||
const INDUSTRY_MATRIX: { id: string; icon: typeof Shield; categories: string[]; regCount: number }[] = [
|
||||
{ id: 'allIndustries', icon: Building2, categories: ['privacy'], regCount: 3 },
|
||||
{ id: 'health', icon: Heart, categories: ['privacy', 'cyber', 'ai', 'product', 'health'], regCount: 9 },
|
||||
{ id: 'finance', icon: Landmark, categories: ['privacy', 'cyber', 'ai', 'markets', 'finance'], regCount: 11 },
|
||||
{ id: 'ecommerce', icon: ShoppingCart, categories: ['privacy', 'markets', 'product', 'finance', 'consumer'], regCount: 23 },
|
||||
{ id: 'tech', icon: Cpu, categories: ['privacy', 'cyber', 'ai', 'markets'], regCount: 9 },
|
||||
{ id: 'iot', icon: Activity, categories: ['privacy', 'cyber', 'ai', 'product'], regCount: 6 },
|
||||
{ id: 'ai', icon: Bot, categories: ['privacy', 'ai', 'product', 'markets'], regCount: 5 },
|
||||
{ id: 'kritis', icon: Lock, categories: ['privacy', 'cyber', 'ai', 'finance'], regCount: 6 },
|
||||
{ id: 'media', icon: Monitor, categories: ['privacy', 'markets', 'ai'], regCount: 6 },
|
||||
{ id: 'public', icon: Radio, categories: ['privacy', 'cyber', 'ai', 'markets', 'health'], regCount: 7 },
|
||||
]
|
||||
|
||||
export default function RegulatoryLandscapeSlide({ lang }: RegulatoryLandscapeSlideProps) {
|
||||
const i = t(lang)
|
||||
const rl = i.regulatoryLandscape
|
||||
|
||||
const categoryLabels: Record<string, string> = {
|
||||
privacy: rl.categoryPrivacy,
|
||||
cyber: rl.categoryCyber,
|
||||
ai: rl.categoryAI,
|
||||
markets: rl.categoryMarkets,
|
||||
product: rl.categoryProduct,
|
||||
finance: rl.categoryFinance,
|
||||
health: rl.categoryHealth,
|
||||
consumer: rl.categoryConsumer,
|
||||
}
|
||||
|
||||
const industryLabels: Record<string, string> = {
|
||||
allIndustries: rl.allIndustries,
|
||||
health: rl.health,
|
||||
finance: rl.finance,
|
||||
ecommerce: rl.ecommerce,
|
||||
tech: rl.tech,
|
||||
iot: rl.iot,
|
||||
ai: rl.ai,
|
||||
kritis: rl.kritis,
|
||||
media: rl.media,
|
||||
public: rl.public,
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="max-w-6xl mx-auto">
|
||||
<FadeInView className="text-center mb-6">
|
||||
<h2 className="text-3xl md:text-5xl font-bold mb-2">
|
||||
<GradientText>{rl.title}</GradientText>
|
||||
</h2>
|
||||
<p className="text-base text-white/50 max-w-2xl mx-auto">{rl.subtitle}</p>
|
||||
</FadeInView>
|
||||
|
||||
{/* KPI Row */}
|
||||
<div className="grid grid-cols-4 gap-3 mb-6">
|
||||
<KPICard label={rl.documents} value={170} suffix="+" color="#6366f1" delay={0.1} />
|
||||
<KPICard label={rl.controls} value={40000} suffix="+" color="#a78bfa" delay={0.2} />
|
||||
<KPICard label={rl.regulations} value={84} color="#60a5fa" delay={0.3} />
|
||||
<KPICard label={rl.industries} value={9} color="#34d399" delay={0.4} />
|
||||
</div>
|
||||
|
||||
{/* Matrix */}
|
||||
<FadeInView delay={0.5}>
|
||||
<GlassCard hover={false} className="p-4 overflow-x-auto">
|
||||
{/* Category Legend */}
|
||||
<div className="flex flex-wrap gap-3 mb-4 justify-center">
|
||||
{CATEGORIES.map((cat) => (
|
||||
<div key={cat.id} className="flex items-center gap-1.5">
|
||||
<div className="w-2.5 h-2.5 rounded-full" style={{ backgroundColor: cat.color }} />
|
||||
<span className="text-[10px] text-white/50">{categoryLabels[cat.id]}</span>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
{/* Matrix Grid */}
|
||||
<div className="space-y-1.5">
|
||||
{/* Header row */}
|
||||
<div className="grid items-center gap-1" style={{ gridTemplateColumns: '140px repeat(8, 1fr) 50px' }}>
|
||||
<div className="text-[9px] text-white/30 uppercase tracking-wider pl-1">
|
||||
{lang === 'de' ? 'Branche' : 'Industry'}
|
||||
</div>
|
||||
{CATEGORIES.map((cat) => {
|
||||
const CatIcon = cat.icon
|
||||
return (
|
||||
<div key={cat.id} className="flex justify-center">
|
||||
<CatIcon className="w-3.5 h-3.5 opacity-50" style={{ color: cat.color }} />
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
<div className="text-[9px] text-white/30 text-center">#</div>
|
||||
</div>
|
||||
|
||||
{/* Industry rows */}
|
||||
{INDUSTRY_MATRIX.map((industry, idx) => {
|
||||
const Icon = industry.icon
|
||||
return (
|
||||
<div
|
||||
key={industry.id}
|
||||
className="grid items-center gap-1 py-1.5 rounded-lg hover:bg-white/[0.04] transition-colors"
|
||||
style={{ gridTemplateColumns: '140px repeat(8, 1fr) 50px' }}
|
||||
>
|
||||
<div className="flex items-center gap-2 pl-1">
|
||||
<Icon className="w-3.5 h-3.5 text-white/40" />
|
||||
<span className="text-[11px] text-white/70 font-medium truncate">
|
||||
{industryLabels[industry.id]}
|
||||
</span>
|
||||
</div>
|
||||
{CATEGORIES.map((cat) => {
|
||||
const applies = industry.categories.includes(cat.id)
|
||||
return (
|
||||
<div key={cat.id} className="flex justify-center">
|
||||
{applies ? (
|
||||
<div
|
||||
className="w-4 h-4 rounded-full flex items-center justify-center"
|
||||
style={{ backgroundColor: `${cat.color}20` }}
|
||||
>
|
||||
<div className="w-2 h-2 rounded-full" style={{ backgroundColor: cat.color }} />
|
||||
</div>
|
||||
) : (
|
||||
<div className="w-4 h-4 rounded-full bg-white/[0.03]" />
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
<div className="text-center">
|
||||
<span className="text-xs font-bold text-white/80">{industry.regCount}</span>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</GlassCard>
|
||||
</FadeInView>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -31,7 +31,7 @@ const SCREENSHOTS = [
|
||||
{ file: '15-document-generator.png', de: 'Dokumenten-Generator', en: 'Document Generator', category: 'docs' },
|
||||
{ file: '16-einwilligungen.png', de: 'Einwilligungsmanagement', en: 'Consent Management', category: 'legal' },
|
||||
{ file: '22-iace.png', de: 'CE-Compliance (IACE)', en: 'CE Compliance (IACE)', category: 'analysis' },
|
||||
{ file: '20-rag.png', de: 'Legal RAG — 2.274 Rechtstexte', en: 'Legal RAG — 2,274 Legal Texts', category: 'ai' },
|
||||
{ file: '20-rag.png', de: 'Legal RAG — 170+ Dokumente, 40.000+ Controls', en: 'Legal RAG — 170+ Documents, 40,000+ Controls', category: 'ai' },
|
||||
{ file: '19-training.png', de: 'Compliance-Schulungen', en: 'Compliance Training', category: 'ops' },
|
||||
{ file: '23-incidents.png', de: 'Incident Response', en: 'Incident Response', category: 'ops' },
|
||||
{ file: '24-reporting.png', de: 'Reporting', en: 'Reporting', category: 'ops' },
|
||||
|
||||
Reference in New Issue
Block a user