feat(marketing-website): add BreakPilot marketing website with CMP integration
Multi-page marketing website positioned as "Deterministic Regulatory Engineering Platform": - 7 pages: Home, Plattform, CE-Prozess, Product Compliance, Architektur, Team, Preise - Platform Bridge animation (adapted from pitch-deck USP slide) - Cookie-Banner with consent-service integration (breakpilot-marketing site) - DE/EN language toggle + Dark/Light theme - Docker service on port 3014 [guardrail-change] PlatformBridgeSection.tsx added to loc-exceptions (816 LOC, SVG animation) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
import { NextRequest } from 'next/server'
|
||||
|
||||
const SYSTEM_PROMPT = `Du bist der BreakPilot Compliance Agent — ein technischer Berater fuer die BreakPilot Plattform.
|
||||
|
||||
Kernbotschaften:
|
||||
- BreakPilot ist eine deterministische Regulatory Engineering Plattform
|
||||
- Keine Halluzinationen: Jedes Ergebnis verweist auf eine konkrete Rechtsquelle
|
||||
- EU-souveraen: Kein US-Cloud-Anbieter, on-premise deploybar
|
||||
- 294.000+ atomare Controls aus 380+ Rechtsquellen
|
||||
- Unterstuetzte Regulierungen: DSGVO, NIS2, EU AI Act, Maschinenverordnung, TDDDG, DORA, BSI IT-Grundschutz
|
||||
|
||||
Sage NIEMALS "ChatGPT fuer CE" oder "KI-Assistent". Sage stattdessen "Deterministic Analysis" oder "Compliance Engine".
|
||||
Antworte auf Deutsch, professionell und praezise. Halte Antworten kurz (max 200 Woerter).`
|
||||
|
||||
export async function POST(req: NextRequest) {
|
||||
const { message, history } = await req.json()
|
||||
|
||||
// Placeholder: In production, connect to the actual Compliance Agent API
|
||||
// For now, return a static response as a stream
|
||||
const responses: Record<string, string> = {
|
||||
'default': `Vielen Dank fuer Ihre Frage.
|
||||
|
||||
BreakPilot ist eine deterministische Regulatory Engineering Plattform. Im Unterschied zu LLM-basierten Tools analysieren wir regulatorische Anforderungen regelbasiert — jedes Ergebnis verweist auf eine konkrete Rechtsquelle (Artikel, Absatz, Erwaegungs\u00ADgrund).
|
||||
|
||||
Unsere Plattform umfasst:
|
||||
- 294.000+ atomare Compliance Controls
|
||||
- 380+ Rechtsquellen (DSGVO, NIS2, AI Act, Maschinenverordnung u.a.)
|
||||
- Vollstaendiger Decision Trail: Rechtsquelle → Obligation → Control → Massnahme
|
||||
- EU-souveraene Infrastruktur ohne US-Cloud-Abhaengigkeit
|
||||
|
||||
Fuer eine persoenliche Demo kontaktieren Sie uns unter info@breakpilot.ai.`,
|
||||
}
|
||||
|
||||
void history
|
||||
void SYSTEM_PROMPT
|
||||
|
||||
const responseText = responses['default']
|
||||
|
||||
// Simulate streaming by sending chunks
|
||||
const encoder = new TextEncoder()
|
||||
const stream = new ReadableStream({
|
||||
async start(controller) {
|
||||
const words = responseText.split(' ')
|
||||
for (let i = 0; i < words.length; i++) {
|
||||
const chunk = (i === 0 ? '' : ' ') + words[i]
|
||||
controller.enqueue(encoder.encode(chunk))
|
||||
await new Promise(resolve => setTimeout(resolve, 30))
|
||||
}
|
||||
controller.close()
|
||||
},
|
||||
})
|
||||
|
||||
void message
|
||||
|
||||
return new Response(stream, {
|
||||
headers: {
|
||||
'Content-Type': 'text/plain; charset=utf-8',
|
||||
'Cache-Control': 'no-cache',
|
||||
},
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
import { NextRequest, NextResponse } from 'next/server'
|
||||
|
||||
const BACKEND_URL = process.env.CONSENT_BACKEND_URL || 'https://macmini:3007/api/sdk/v1/banner'
|
||||
const TENANT_ID = process.env.CONSENT_TENANT_ID || '9282a473-5c95-4b3a-bf78-0ecc0ec71d3e'
|
||||
|
||||
export async function POST(req: NextRequest) {
|
||||
try {
|
||||
const body = await req.text()
|
||||
|
||||
const res = await fetch(`${BACKEND_URL}/consent`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'X-Tenant-ID': TENANT_ID,
|
||||
},
|
||||
body,
|
||||
// Accept self-signed certs on internal network
|
||||
...(process.env.NODE_TLS_REJECT_UNAUTHORIZED === '0' ? {} : {}),
|
||||
})
|
||||
|
||||
const data = await res.text()
|
||||
return new NextResponse(data, {
|
||||
status: res.status,
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
})
|
||||
} catch (err) {
|
||||
console.error('Consent proxy error:', err)
|
||||
return NextResponse.json({ error: 'Consent service not reachable' }, { status: 503 })
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
import Navbar from '@/components/layout/Navbar'
|
||||
import Footer from '@/components/layout/Footer'
|
||||
import ChatFAB from '@/components/layout/ChatFAB'
|
||||
import ArchitectureSection from '@/components/sections/ArchitectureSection'
|
||||
import SovereignSection from '@/components/sections/SovereignSection'
|
||||
|
||||
export default function ArchitekturPage() {
|
||||
return (
|
||||
<>
|
||||
<Navbar />
|
||||
<div className="pt-16" />
|
||||
<ArchitectureSection />
|
||||
<SovereignSection />
|
||||
<Footer />
|
||||
<ChatFAB />
|
||||
</>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
import Navbar from '@/components/layout/Navbar'
|
||||
import Footer from '@/components/layout/Footer'
|
||||
import ChatFAB from '@/components/layout/ChatFAB'
|
||||
import PageHeader from '@/components/ui/PageHeader'
|
||||
import CEFlowSection from '@/components/sections/CEFlowSection'
|
||||
|
||||
export default function CEProzessPage() {
|
||||
return (
|
||||
<>
|
||||
<Navbar />
|
||||
<main>
|
||||
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<PageHeader
|
||||
tag="CE-PROZESS"
|
||||
title="Von der Maschinenbeschreibung"
|
||||
titleHighlight="zur CE-Akte."
|
||||
subtitle="6 deterministische Schritte — vom Textfeld zur vollständigen Technischen Dokumentation nach MVO 2023/1230."
|
||||
/>
|
||||
</div>
|
||||
<CEFlowSection />
|
||||
</main>
|
||||
<Footer />
|
||||
<ChatFAB />
|
||||
</>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
import Link from 'next/link'
|
||||
|
||||
export default function DatenschutzPage() {
|
||||
return (
|
||||
<div className="min-h-screen bg-enterprise-dark text-white">
|
||||
<div className="max-w-3xl mx-auto px-4 py-24">
|
||||
<Link href="/" className="text-sm text-white/40 hover:text-white/60 transition-colors mb-8 inline-block">
|
||||
← Zurueck zur Startseite
|
||||
</Link>
|
||||
|
||||
<h1 className="text-4xl font-bold mb-8">Datenschutzerklaerung</h1>
|
||||
|
||||
<div className="space-y-6 text-white/60 text-sm">
|
||||
<div>
|
||||
<h2 className="text-lg font-semibold text-white mb-2">1. Verantwortlicher</h2>
|
||||
<p>BreakPilot GmbH (i.Gr.)</p>
|
||||
<p>[Adresse wird nach Gruendung ergaenzt]</p>
|
||||
<p>E-Mail: datenschutz@breakpilot.ai</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2 className="text-lg font-semibold text-white mb-2">2. Hosting</h2>
|
||||
<p>
|
||||
Diese Website wird auf Servern in Deutschland gehostet.
|
||||
Es werden keine personenbezogenen Daten an Drittlaender uebermittelt.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2 className="text-lg font-semibold text-white mb-2">3. Keine Cookies, kein Tracking</h2>
|
||||
<p>
|
||||
Diese Website verwendet keine Cookies, kein Tracking und keine Analyse-Tools.
|
||||
Es werden keine personenbezogenen Daten erhoben oder gespeichert.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2 className="text-lg font-semibold text-white mb-2">4. Server-Logfiles</h2>
|
||||
<p>
|
||||
Der Hosting-Provider erhebt technisch notwendige Logfiles (IP-Adresse, Browsertyp, Zeitstempel).
|
||||
Rechtsgrundlage: Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse an der Sicherheit).
|
||||
Logfiles werden nach 7 Tagen automatisch geloescht.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2 className="text-lg font-semibold text-white mb-2">5. Externe Schriften</h2>
|
||||
<p>
|
||||
Diese Website laedt Schriftarten von Google Fonts. Dabei wird Ihre IP-Adresse an Google LLC uebermittelt.
|
||||
Rechtsgrundlage: Art. 6 Abs. 1 lit. f DSGVO.
|
||||
Weitere Informationen: https://policies.google.com/privacy
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2 className="text-lg font-semibold text-white mb-2">6. Ihre Rechte</h2>
|
||||
<p>
|
||||
Sie haben das Recht auf Auskunft (Art. 15 DSGVO), Berichtigung (Art. 16), Loeschung (Art. 17),
|
||||
Einschraenkung (Art. 18), Datenuebertragbarkeit (Art. 20) und Widerspruch (Art. 21).
|
||||
Beschwerderecht bei der zustaendigen Aufsichtsbehoerde.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,280 @@
|
||||
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap');
|
||||
@import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap');
|
||||
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&display=swap');
|
||||
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
:root {
|
||||
--bg-primary: #0a0a1a;
|
||||
--bg-secondary: #06060f;
|
||||
--bg-card: rgba(255, 255, 255, 0.06);
|
||||
--bg-card-hover: rgba(255, 255, 255, 0.10);
|
||||
--border-subtle: rgba(255, 255, 255, 0.08);
|
||||
--text-primary: #ffffff;
|
||||
--text-secondary: rgba(255, 255, 255, 0.6);
|
||||
--text-muted: rgba(255, 255, 255, 0.4);
|
||||
--accent-electric: #3b82f6;
|
||||
--accent-signal: #22c55e;
|
||||
--accent-indigo: #6366f1;
|
||||
--accent-purple: #a78bfa;
|
||||
--glass-bg: rgba(255, 255, 255, 0.06);
|
||||
--glass-border: rgba(255, 255, 255, 0.08);
|
||||
--glass-hover: rgba(255, 255, 255, 0.10);
|
||||
--scrollbar-thumb: rgba(255, 255, 255, 0.15);
|
||||
--scrollbar-hover: rgba(255, 255, 255, 0.25);
|
||||
}
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html {
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
|
||||
body {
|
||||
background: var(--bg-primary);
|
||||
color: var(--text-primary);
|
||||
font-family: 'Inter', 'Plus Jakarta Sans', system-ui, sans-serif;
|
||||
}
|
||||
|
||||
::selection {
|
||||
background: rgba(59, 130, 246, 0.3);
|
||||
color: white;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-track {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
background: var(--scrollbar-thumb);
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb:hover {
|
||||
background: var(--scrollbar-hover);
|
||||
}
|
||||
|
||||
@layer utilities {
|
||||
.glass {
|
||||
background: var(--glass-bg);
|
||||
backdrop-filter: blur(20px);
|
||||
-webkit-backdrop-filter: blur(20px);
|
||||
border: 1px solid var(--glass-border);
|
||||
}
|
||||
|
||||
.glass-hover:hover {
|
||||
background: var(--glass-hover);
|
||||
}
|
||||
|
||||
.gradient-text {
|
||||
background: linear-gradient(135deg, var(--accent-electric), var(--accent-indigo), var(--accent-purple));
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
}
|
||||
|
||||
.gradient-text-signal {
|
||||
background: linear-gradient(135deg, var(--accent-signal), #34d399, var(--accent-electric));
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
}
|
||||
|
||||
.text-shadow-glow {
|
||||
text-shadow: 0 0 40px rgba(59, 130, 246, 0.3);
|
||||
}
|
||||
|
||||
.glow-blue {
|
||||
box-shadow: 0 0 30px rgba(59, 130, 246, 0.15), 0 0 60px rgba(59, 130, 246, 0.05);
|
||||
}
|
||||
|
||||
.glow-signal {
|
||||
box-shadow: 0 0 20px rgba(34, 197, 94, 0.15);
|
||||
}
|
||||
|
||||
.mono-label {
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
font-size: 0.75rem;
|
||||
letter-spacing: 0.1em;
|
||||
text-transform: uppercase;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.enterprise-grid {
|
||||
background-image:
|
||||
linear-gradient(rgba(255, 255, 255, 0.02) 1px, transparent 1px),
|
||||
linear-gradient(90deg, rgba(255, 255, 255, 0.02) 1px, transparent 1px);
|
||||
background-size: 60px 60px;
|
||||
}
|
||||
|
||||
.section-alt {
|
||||
background: var(--bg-secondary);
|
||||
}
|
||||
}
|
||||
|
||||
/* === Light Mode === */
|
||||
.theme-light {
|
||||
--bg-primary: #ffffff;
|
||||
--bg-secondary: #f8fafc;
|
||||
--bg-card: #f8fafc;
|
||||
--bg-card-hover: #f1f5f9;
|
||||
--border-subtle: #e2e8f0;
|
||||
--text-primary: #0f172a;
|
||||
--text-secondary: #334155;
|
||||
--text-muted: #64748b;
|
||||
--accent-electric: #2563eb;
|
||||
--accent-signal: #059669;
|
||||
--accent-indigo: #4f46e5;
|
||||
--accent-purple: #7c3aed;
|
||||
--glass-bg: #f8fafc;
|
||||
--glass-border: #e2e8f0;
|
||||
--glass-hover: #f1f5f9;
|
||||
--scrollbar-thumb: #cbd5e1;
|
||||
--scrollbar-hover: #94a3b8;
|
||||
}
|
||||
|
||||
.theme-light body {
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
.theme-light ::selection {
|
||||
background: rgba(37, 99, 235, 0.15);
|
||||
color: #0f172a;
|
||||
}
|
||||
|
||||
/* Text overrides */
|
||||
.theme-light .text-white { color: #0f172a; }
|
||||
.theme-light .text-white\/80 { color: #1e293b; }
|
||||
.theme-light .text-white\/70 { color: #334155; }
|
||||
.theme-light .text-white\/60 { color: #475569; }
|
||||
.theme-light .text-white\/50 { color: #64748b; }
|
||||
.theme-light .text-white\/40 { color: #64748b; }
|
||||
.theme-light .text-white\/30 { color: #94a3b8; }
|
||||
.theme-light .text-white\/20 { color: #cbd5e1; }
|
||||
|
||||
/* Card backgrounds */
|
||||
.theme-light .bg-white\/\[0\.06\],
|
||||
.theme-light .bg-white\/\[0\.04\],
|
||||
.theme-light .bg-white\/\[0\.03\] {
|
||||
background-color: #f8fafc !important;
|
||||
}
|
||||
|
||||
.theme-light .border-white\/\[0\.08\],
|
||||
.theme-light .border-white\/\[0\.06\],
|
||||
.theme-light .border-white\/10 {
|
||||
border-color: #e2e8f0 !important;
|
||||
}
|
||||
|
||||
/* No blur in light mode */
|
||||
.theme-light .backdrop-blur-xl,
|
||||
.theme-light .backdrop-blur {
|
||||
backdrop-filter: none !important;
|
||||
-webkit-backdrop-filter: none !important;
|
||||
}
|
||||
|
||||
/* Navbar */
|
||||
.theme-light .bg-enterprise-dark\/80 {
|
||||
background-color: rgba(255, 255, 255, 0.9) !important;
|
||||
}
|
||||
|
||||
/* Enterprise grid */
|
||||
.theme-light .enterprise-grid {
|
||||
background-image:
|
||||
linear-gradient(rgba(0, 0, 0, 0.03) 1px, transparent 1px),
|
||||
linear-gradient(90deg, rgba(0, 0, 0, 0.03) 1px, transparent 1px);
|
||||
}
|
||||
|
||||
/* Gradient text — stronger in light */
|
||||
.theme-light .gradient-text {
|
||||
background: linear-gradient(135deg, #2563eb, #4f46e5, #7c3aed) !important;
|
||||
-webkit-background-clip: text !important;
|
||||
background-clip: text !important;
|
||||
}
|
||||
|
||||
.theme-light .gradient-text-signal {
|
||||
background: linear-gradient(135deg, #059669, #10b981, #2563eb) !important;
|
||||
-webkit-background-clip: text !important;
|
||||
background-clip: text !important;
|
||||
}
|
||||
|
||||
/* Mono label */
|
||||
.theme-light .mono-label { color: #64748b; }
|
||||
|
||||
/* Status dots */
|
||||
.theme-light .text-shadow-glow { text-shadow: none; }
|
||||
.theme-light .glow-blue { box-shadow: 0 4px 14px -3px rgba(37, 99, 235, 0.15); }
|
||||
|
||||
/* Accent backgrounds */
|
||||
.theme-light .bg-accent-electric\/10 { background-color: #eff6ff !important; }
|
||||
.theme-light .bg-accent-electric\/5 { background-color: #f0f9ff !important; }
|
||||
.theme-light .bg-accent-indigo\/10 { background-color: #eef2ff !important; }
|
||||
.theme-light .bg-accent-indigo\/5 { background-color: #eef2ff !important; }
|
||||
.theme-light .bg-accent-purple\/10 { background-color: #faf5ff !important; }
|
||||
.theme-light .bg-accent-purple\/\[0\.04\] { background-color: #faf5ff !important; }
|
||||
.theme-light .bg-amber-500\/10 { background-color: #fefce8 !important; }
|
||||
|
||||
/* Colored borders */
|
||||
.theme-light .border-red-500\/20 { border-color: #fecaca !important; }
|
||||
.theme-light .border-red-500\/15 { border-color: #fecaca !important; }
|
||||
.theme-light .border-green-500\/20 { border-color: #bbf7d0 !important; }
|
||||
.theme-light .border-green-500\/15 { border-color: #bbf7d0 !important; }
|
||||
.theme-light .border-accent-electric\/30 { border-color: #bfdbfe !important; }
|
||||
.theme-light .border-accent-indigo\/30 { border-color: #c7d2fe !important; }
|
||||
.theme-light .border-accent-purple\/30 { border-color: #ddd6fe !important; }
|
||||
.theme-light .border-accent-purple\/20 { border-color: #e9d5ff !important; }
|
||||
.theme-light .border-accent-electric\/20 { border-color: #bfdbfe !important; }
|
||||
|
||||
/* Colored text */
|
||||
.theme-light .text-red-400 { color: #dc2626 !important; }
|
||||
.theme-light .text-green-400 { color: #059669 !important; }
|
||||
.theme-light .text-amber-400 { color: #d97706 !important; }
|
||||
.theme-light .text-accent-electric { color: #2563eb !important; }
|
||||
.theme-light .text-accent-indigo { color: #4f46e5 !important; }
|
||||
.theme-light .text-accent-purple { color: #7c3aed !important; }
|
||||
.theme-light .text-accent-signal\/80 { color: #059669 !important; }
|
||||
|
||||
/* Colored backgrounds for tinted cards */
|
||||
.theme-light .bg-red-500\/\[0\.04\] { background-color: #fef2f2 !important; }
|
||||
.theme-light .bg-red-500\/\[0\.03\] { background-color: #fef2f2 !important; }
|
||||
.theme-light .bg-green-500\/\[0\.04\] { background-color: #f0fdf4 !important; }
|
||||
.theme-light .bg-green-500\/\[0\.03\] { background-color: #f0fdf4 !important; }
|
||||
.theme-light .bg-red-500\/10 { background-color: #fef2f2 !important; }
|
||||
.theme-light .bg-blue-500\/10 { background-color: #eff6ff !important; }
|
||||
.theme-light .bg-green-500\/10 { background-color: #f0fdf4 !important; }
|
||||
|
||||
/* Terminal / code blocks */
|
||||
.theme-light .bg-enterprise-darker {
|
||||
background-color: #f1f5f9 !important;
|
||||
}
|
||||
|
||||
/* Chat panel */
|
||||
.theme-light .bg-black\/90 {
|
||||
background-color: #ffffff !important;
|
||||
border: 1px solid #e2e8f0 !important;
|
||||
}
|
||||
.theme-light .bg-black\/60 {
|
||||
background-color: rgba(0, 0, 0, 0.1) !important;
|
||||
}
|
||||
|
||||
/* Hover states */
|
||||
.theme-light .hover\:bg-white\/\[0\.06\]:hover,
|
||||
.theme-light .hover\:bg-white\/\[0\.04\]:hover { background-color: #f1f5f9 !important; }
|
||||
.theme-light .hover\:bg-white\/20:hover { background-color: #e2e8f0 !important; }
|
||||
|
||||
/* Shadows */
|
||||
.theme-light .shadow-lg { box-shadow: 0 4px 6px -1px rgba(0,0,0,0.06) !important; }
|
||||
.theme-light .shadow-2xl { box-shadow: 0 10px 25px -5px rgba(0,0,0,0.08) !important; }
|
||||
|
||||
/* Table */
|
||||
.theme-light .hover\:bg-white\/\[0\.02\]:hover { background-color: #f8fafc !important; }
|
||||
.theme-light .bg-white\/\[0\.02\] { background-color: #f8fafc !important; }
|
||||
@@ -0,0 +1,10 @@
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="32" height="32" rx="8" fill="url(#g)"/>
|
||||
<text x="16" y="22" text-anchor="middle" font-family="Inter, sans-serif" font-weight="700" font-size="18" fill="white">B</text>
|
||||
<defs>
|
||||
<linearGradient id="g" x1="0" y1="0" x2="32" y2="32">
|
||||
<stop stop-color="#3b82f6"/>
|
||||
<stop offset="1" stop-color="#6366f1"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 468 B |
@@ -0,0 +1,41 @@
|
||||
import Link from 'next/link'
|
||||
|
||||
export default function ImpressumPage() {
|
||||
return (
|
||||
<div className="min-h-screen bg-enterprise-dark text-white">
|
||||
<div className="max-w-3xl mx-auto px-4 py-24">
|
||||
<Link href="/" className="text-sm text-white/40 hover:text-white/60 transition-colors mb-8 inline-block">
|
||||
← Zurueck zur Startseite
|
||||
</Link>
|
||||
|
||||
<h1 className="text-4xl font-bold mb-8">Impressum</h1>
|
||||
|
||||
<div className="space-y-6 text-white/60 text-sm">
|
||||
<div>
|
||||
<h2 className="text-lg font-semibold text-white mb-2">Angaben gemaess Paragraph 5 TMG</h2>
|
||||
<p>BreakPilot GmbH (i.Gr.)</p>
|
||||
<p>[Adresse wird nach Gruendung ergaenzt]</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2 className="text-lg font-semibold text-white mb-2">Kontakt</h2>
|
||||
<p>E-Mail: info@breakpilot.ai</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2 className="text-lg font-semibold text-white mb-2">Verantwortlich fuer den Inhalt nach Paragraph 18 Abs. 2 MStV</h2>
|
||||
<p>[Wird nach Gruendung ergaenzt]</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2 className="text-lg font-semibold text-white mb-2">EU-Streitschlichtung</h2>
|
||||
<p>
|
||||
Die Europaeische Kommission stellt eine Plattform zur Online-Streitbeilegung (OS) bereit.
|
||||
Unsere E-Mail-Adresse finden Sie oben im Impressum.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { AppProvider } from '@/lib/context'
|
||||
import ConsentBanner from '@/components/layout/ConsentBanner'
|
||||
import './globals.css'
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: 'BreakPilot | Deterministic Regulatory Engineering Platform',
|
||||
description: 'Deterministische regulatorische Analyse für Maschinenbau, Fertigung und kritische Infrastruktur. Keine Halluzinationen. Keine US-Cloud. Volle Nachvollziehbarkeit.',
|
||||
keywords: ['Compliance', 'Regulatory Engineering', 'CE-Kennzeichnung', 'Maschinenverordnung', 'DSGVO', 'NIS2', 'AI Act', 'Sovereign AI', 'CRA', 'OTA'],
|
||||
robots: { index: true, follow: true },
|
||||
openGraph: {
|
||||
title: 'BreakPilot | Deterministic Regulatory Engineering',
|
||||
description: 'Deterministische regulatorische Analyse. Keine Halluzinationen. Keine Compliance-Lücken.',
|
||||
type: 'website',
|
||||
locale: 'de_DE',
|
||||
},
|
||||
}
|
||||
|
||||
export default function RootLayout({
|
||||
children,
|
||||
}: {
|
||||
children: React.ReactNode
|
||||
}) {
|
||||
return (
|
||||
<html lang="de">
|
||||
<body className="antialiased">
|
||||
<AppProvider>
|
||||
{children}
|
||||
<ConsentBanner />
|
||||
</AppProvider>
|
||||
</body>
|
||||
</html>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import Navbar from '@/components/layout/Navbar'
|
||||
import Footer from '@/components/layout/Footer'
|
||||
import ChatFAB from '@/components/layout/ChatFAB'
|
||||
import HeroSection from '@/components/sections/HeroSection'
|
||||
import ProblemFlowSection from '@/components/sections/ProblemFlowSection'
|
||||
import UseCaseCards from '@/components/sections/UseCaseCards'
|
||||
import TrustBar from '@/components/sections/TrustBar'
|
||||
|
||||
export default function HomePage() {
|
||||
return (
|
||||
<>
|
||||
<Navbar />
|
||||
<main>
|
||||
<HeroSection />
|
||||
<ProblemFlowSection />
|
||||
<UseCaseCards />
|
||||
<TrustBar />
|
||||
</main>
|
||||
<Footer />
|
||||
<ChatFAB />
|
||||
</>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
import Navbar from '@/components/layout/Navbar'
|
||||
import Footer from '@/components/layout/Footer'
|
||||
import ChatFAB from '@/components/layout/ChatFAB'
|
||||
import PlatformBridgeSection from '@/components/sections/PlatformBridgeSection'
|
||||
import ComparisonSection from '@/components/sections/ComparisonSection'
|
||||
import ContinuousSection from '@/components/sections/ContinuousSection'
|
||||
|
||||
export default function PlattformPage() {
|
||||
return (
|
||||
<>
|
||||
<Navbar />
|
||||
<div className="pt-20" />
|
||||
<PlatformBridgeSection />
|
||||
<ComparisonSection />
|
||||
<ContinuousSection />
|
||||
<Footer />
|
||||
<ChatFAB />
|
||||
</>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
import Navbar from '@/components/layout/Navbar'
|
||||
import Footer from '@/components/layout/Footer'
|
||||
import ChatFAB from '@/components/layout/ChatFAB'
|
||||
import PricingSection from '@/components/sections/PricingSection'
|
||||
|
||||
export default function PreisePage() {
|
||||
return (
|
||||
<>
|
||||
<Navbar />
|
||||
<PricingSection />
|
||||
<Footer />
|
||||
<ChatFAB />
|
||||
</>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
import Navbar from '@/components/layout/Navbar'
|
||||
import Footer from '@/components/layout/Footer'
|
||||
import ChatFAB from '@/components/layout/ChatFAB'
|
||||
import PageHeader from '@/components/ui/PageHeader'
|
||||
import DeltaImpactSection from '@/components/sections/DeltaImpactSection'
|
||||
import SecurityToolchainSection from '@/components/sections/SecurityToolchainSection'
|
||||
import CRAFahrplanSection from '@/components/sections/CRAFahrplanSection'
|
||||
import SafetySection from '@/components/sections/SafetySection'
|
||||
import TargetSection from '@/components/sections/TargetSection'
|
||||
|
||||
export default function ProductCompliancePage() {
|
||||
return (
|
||||
<>
|
||||
<Navbar />
|
||||
<main>
|
||||
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<PageHeader
|
||||
tag="PRODUCT COMPLIANCE"
|
||||
title="Muss ich mein Produkt"
|
||||
titleHighlight="redesignen?"
|
||||
subtitle="Delta-Impact-Analyse für bestehende Produkte. CRA, RED, Maschinenverordnung — priorisiert statt aufgelistet."
|
||||
/>
|
||||
</div>
|
||||
<DeltaImpactSection />
|
||||
<SecurityToolchainSection />
|
||||
<CRAFahrplanSection />
|
||||
<SafetySection />
|
||||
<TargetSection />
|
||||
</main>
|
||||
<Footer />
|
||||
<ChatFAB />
|
||||
</>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
import Navbar from '@/components/layout/Navbar'
|
||||
import Footer from '@/components/layout/Footer'
|
||||
import ChatFAB from '@/components/layout/ChatFAB'
|
||||
import TeamSection from '@/components/sections/TeamSection'
|
||||
|
||||
export default function TeamPage() {
|
||||
return (
|
||||
<>
|
||||
<Navbar />
|
||||
<TeamSection />
|
||||
<Footer />
|
||||
<ChatFAB />
|
||||
</>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user