From d13f4511cb3280898ee968221771d612d8065148 Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Sun, 10 May 2026 22:41:00 +0200 Subject: [PATCH] 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) --- .claude/rules/loc-exceptions.txt | 3 + docker-compose.yml | 17 + marketing-website/.eslintrc.json | 3 + marketing-website/.gitignore | 4 + marketing-website/Dockerfile | 27 + marketing-website/app/api/chat/route.ts | 61 + marketing-website/app/api/consent/route.ts | 30 + marketing-website/app/architektur/page.tsx | 18 + marketing-website/app/ce-prozess/page.tsx | 26 + marketing-website/app/datenschutz/page.tsx | 67 + marketing-website/app/globals.css | 280 + marketing-website/app/icon.svg | 10 + marketing-website/app/impressum/page.tsx | 41 + marketing-website/app/layout.tsx | 34 + marketing-website/app/page.tsx | 23 + marketing-website/app/plattform/page.tsx | 20 + marketing-website/app/preise/page.tsx | 15 + .../app/product-compliance/page.tsx | 34 + marketing-website/app/team/page.tsx | 15 + .../components/layout/ChatFAB.tsx | 295 + .../components/layout/ConsentBanner.tsx | 214 + .../components/layout/Footer.tsx | 69 + .../components/layout/MobileMenu.tsx | 63 + .../components/layout/Navbar.tsx | 111 + .../sections/AIGovernanceSection.tsx | 65 + .../sections/ArchitectureSection.tsx | 73 + .../components/sections/CEFlowSection.tsx | 171 + .../sections/CRAFahrplanSection.tsx | 84 + .../components/sections/ComparisonSection.tsx | 72 + .../components/sections/ContinuousSection.tsx | 62 + .../sections/DeltaImpactSection.tsx | 129 + .../sections/DeterministicSection.tsx | 79 + .../components/sections/HeroSection.tsx | 91 + .../components/sections/ImpactSection.tsx | 82 + .../components/sections/LegalSection.tsx | 46 + .../sections/PlatformBridgeSection.tsx | 816 +++ .../components/sections/PricingSection.tsx | 104 + .../sections/ProblemFlowSection.tsx | 81 + .../components/sections/ProblemSection.tsx | 57 + .../components/sections/SafetySection.tsx | 42 + .../components/sections/SecuritySection.tsx | 64 + .../sections/SecurityToolchainSection.tsx | 112 + .../components/sections/SovereignSection.tsx | 66 + .../components/sections/TargetSection.tsx | 48 + .../components/sections/TeamSection.tsx | 191 + .../components/sections/TrustBar.tsx | 71 + .../components/sections/UseCaseCards.tsx | 93 + .../components/ui/AnimatedCounter.tsx | 53 + marketing-website/components/ui/CTAButton.tsx | 33 + .../components/ui/ComparisonCell.tsx | 15 + .../components/ui/FadeInView.tsx | 41 + marketing-website/components/ui/GlassCard.tsx | 32 + .../components/ui/GradientText.tsx | 18 + .../components/ui/PageHeader.tsx | 34 + .../components/ui/SectionHeading.tsx | 33 + .../components/ui/StatusIndicator.tsx | 23 + marketing-website/components/ui/TechBadge.tsx | 18 + marketing-website/lib/constants.ts | 14 + marketing-website/lib/content.ts | 456 ++ marketing-website/lib/context.tsx | 51 + marketing-website/lib/sections.ts | 9 + marketing-website/next-env.d.ts | 6 + marketing-website/next.config.js | 20 + marketing-website/package-lock.json | 6344 +++++++++++++++++ marketing-website/package.json | 29 + marketing-website/postcss.config.mjs | 9 + marketing-website/tailwind.config.ts | 36 + marketing-website/tsconfig.json | 40 + 68 files changed, 11493 insertions(+) create mode 100644 marketing-website/.eslintrc.json create mode 100644 marketing-website/.gitignore create mode 100644 marketing-website/Dockerfile create mode 100644 marketing-website/app/api/chat/route.ts create mode 100644 marketing-website/app/api/consent/route.ts create mode 100644 marketing-website/app/architektur/page.tsx create mode 100644 marketing-website/app/ce-prozess/page.tsx create mode 100644 marketing-website/app/datenschutz/page.tsx create mode 100644 marketing-website/app/globals.css create mode 100644 marketing-website/app/icon.svg create mode 100644 marketing-website/app/impressum/page.tsx create mode 100644 marketing-website/app/layout.tsx create mode 100644 marketing-website/app/page.tsx create mode 100644 marketing-website/app/plattform/page.tsx create mode 100644 marketing-website/app/preise/page.tsx create mode 100644 marketing-website/app/product-compliance/page.tsx create mode 100644 marketing-website/app/team/page.tsx create mode 100644 marketing-website/components/layout/ChatFAB.tsx create mode 100644 marketing-website/components/layout/ConsentBanner.tsx create mode 100644 marketing-website/components/layout/Footer.tsx create mode 100644 marketing-website/components/layout/MobileMenu.tsx create mode 100644 marketing-website/components/layout/Navbar.tsx create mode 100644 marketing-website/components/sections/AIGovernanceSection.tsx create mode 100644 marketing-website/components/sections/ArchitectureSection.tsx create mode 100644 marketing-website/components/sections/CEFlowSection.tsx create mode 100644 marketing-website/components/sections/CRAFahrplanSection.tsx create mode 100644 marketing-website/components/sections/ComparisonSection.tsx create mode 100644 marketing-website/components/sections/ContinuousSection.tsx create mode 100644 marketing-website/components/sections/DeltaImpactSection.tsx create mode 100644 marketing-website/components/sections/DeterministicSection.tsx create mode 100644 marketing-website/components/sections/HeroSection.tsx create mode 100644 marketing-website/components/sections/ImpactSection.tsx create mode 100644 marketing-website/components/sections/LegalSection.tsx create mode 100644 marketing-website/components/sections/PlatformBridgeSection.tsx create mode 100644 marketing-website/components/sections/PricingSection.tsx create mode 100644 marketing-website/components/sections/ProblemFlowSection.tsx create mode 100644 marketing-website/components/sections/ProblemSection.tsx create mode 100644 marketing-website/components/sections/SafetySection.tsx create mode 100644 marketing-website/components/sections/SecuritySection.tsx create mode 100644 marketing-website/components/sections/SecurityToolchainSection.tsx create mode 100644 marketing-website/components/sections/SovereignSection.tsx create mode 100644 marketing-website/components/sections/TargetSection.tsx create mode 100644 marketing-website/components/sections/TeamSection.tsx create mode 100644 marketing-website/components/sections/TrustBar.tsx create mode 100644 marketing-website/components/sections/UseCaseCards.tsx create mode 100644 marketing-website/components/ui/AnimatedCounter.tsx create mode 100644 marketing-website/components/ui/CTAButton.tsx create mode 100644 marketing-website/components/ui/ComparisonCell.tsx create mode 100644 marketing-website/components/ui/FadeInView.tsx create mode 100644 marketing-website/components/ui/GlassCard.tsx create mode 100644 marketing-website/components/ui/GradientText.tsx create mode 100644 marketing-website/components/ui/PageHeader.tsx create mode 100644 marketing-website/components/ui/SectionHeading.tsx create mode 100644 marketing-website/components/ui/StatusIndicator.tsx create mode 100644 marketing-website/components/ui/TechBadge.tsx create mode 100644 marketing-website/lib/constants.ts create mode 100644 marketing-website/lib/content.ts create mode 100644 marketing-website/lib/context.tsx create mode 100644 marketing-website/lib/sections.ts create mode 100644 marketing-website/next-env.d.ts create mode 100644 marketing-website/next.config.js create mode 100644 marketing-website/package-lock.json create mode 100644 marketing-website/package.json create mode 100644 marketing-website/postcss.config.mjs create mode 100644 marketing-website/tailwind.config.ts create mode 100644 marketing-website/tsconfig.json diff --git a/.claude/rules/loc-exceptions.txt b/.claude/rules/loc-exceptions.txt index 9e4bb87..fa60866 100644 --- a/.claude/rules/loc-exceptions.txt +++ b/.claude/rules/loc-exceptions.txt @@ -33,3 +33,6 @@ backend-core/services/pdf_templates.py | owner=all | reason=519 LOC, rein statis pitch-deck/lib/presenter/presenter-faq.ts | owner=pitch-deck | reason=973 LOC, pure static FAQ array (questions/answers/keywords), no logic | review=2027-01 pitch-deck/lib/presenter/presenter-script.ts | owner=pitch-deck | reason=608 LOC, pure static presenter script data + 3 trivial lookup functions | review=2027-01 pitch-deck/lib/i18n.ts | owner=pitch-deck | reason=620 LOC, pure DE/EN translation dictionaries + 3 small format helpers | review=2027-01 + +# Marketing Website — adapted from pitch-deck USP slide (complex SVG animation, inline styles, no logic to split) +marketing-website/components/sections/PlatformBridgeSection.tsx | owner=marketing | reason=816 LOC, adapted 1:1 from pitch-deck USPSlide with SVG animations, CSS keyframes, inline styles — splitting would break animation coherence | review=2027-01 diff --git a/docker-compose.yml b/docker-compose.yml index 0842da3..7e8a887 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -909,3 +909,20 @@ services: restart: unless-stopped networks: - breakpilot-network + + # ========================================================= + # MARKETING WEBSITE - BreakPilot Produktwebsite + # ========================================================= + marketing-website: + build: + context: ./marketing-website + dockerfile: Dockerfile + container_name: bp-core-marketing-website + platform: linux/arm64 + ports: + - "3014:3000" + environment: + NODE_ENV: production + restart: unless-stopped + networks: + - breakpilot-network diff --git a/marketing-website/.eslintrc.json b/marketing-website/.eslintrc.json new file mode 100644 index 0000000..bffb357 --- /dev/null +++ b/marketing-website/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/marketing-website/.gitignore b/marketing-website/.gitignore new file mode 100644 index 0000000..38138c6 --- /dev/null +++ b/marketing-website/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +.next/ +.env.local +*.tsbuildinfo diff --git a/marketing-website/Dockerfile b/marketing-website/Dockerfile new file mode 100644 index 0000000..6ffb4b2 --- /dev/null +++ b/marketing-website/Dockerfile @@ -0,0 +1,27 @@ +FROM node:20-alpine AS base + +FROM base AS deps +WORKDIR /app +COPY package.json package-lock.json* ./ +RUN npm ci + +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . +RUN mkdir -p public +RUN npm run build + +FROM base AS runner +WORKDIR /app +ENV NODE_ENV=production +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs +COPY --from=builder /app/public ./public +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static +USER nextjs +EXPOSE 3000 +ENV PORT=3000 +ENV HOSTNAME="0.0.0.0" +CMD ["node", "server.js"] diff --git a/marketing-website/app/api/chat/route.ts b/marketing-website/app/api/chat/route.ts new file mode 100644 index 0000000..2d0302e --- /dev/null +++ b/marketing-website/app/api/chat/route.ts @@ -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 = { + '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', + }, + }) +} diff --git a/marketing-website/app/api/consent/route.ts b/marketing-website/app/api/consent/route.ts new file mode 100644 index 0000000..b2d9f67 --- /dev/null +++ b/marketing-website/app/api/consent/route.ts @@ -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 }) + } +} diff --git a/marketing-website/app/architektur/page.tsx b/marketing-website/app/architektur/page.tsx new file mode 100644 index 0000000..a20b449 --- /dev/null +++ b/marketing-website/app/architektur/page.tsx @@ -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 ( + <> + +
+ + +