-
+ return (
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
- 🏗️
-
Zeitlicher Verlauf: Investment vs. Unabhängigkeit
-
-
- Wie Plattform-Abhängigkeit (Lock-in) über die Jahre Ihre Skalierbarkeit zerstört, während ein Headless-System echte Souveränität aufbaut.
-
-
-
-
-
- {/* Control Tabs */}
-
-
setStack('saas')}
- className={`flex-1 p-4 flex flex-col items-center justify-center gap-2 transition-all ${stack === 'saas' ? 'bg-white border-b-2 border-orange-500' : 'bg-slate-50 text-slate-400 hover:bg-slate-100'}`}
- >
-
-
-
-
-
SaaS / Baukasten
-
Gekauft ist schneller
-
-
-
setStack('custom')}
- className={`flex-1 p-4 flex flex-col items-center justify-center gap-2 transition-all ${stack === 'custom' ? 'bg-white border-b-2 border-emerald-500' : 'bg-slate-50 text-slate-400 hover:bg-slate-100'}`}
- >
-
-
-
-
-
Build-First / Headless
-
Architektur als Asset
-
-
-
-
- {/* Chart Area */}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {/* Left Y-Axis: Cost */}
- `€${val}k`}
- axisLine={false}
- tickLine={false}
- tick={{ fill: '#94a3b8', fontSize: 12 }}
- dx={-10}
- />
-
- {/* Right Y-Axis: Independence */}
- `${val}%`}
- axisLine={false}
- tickLine={false}
- tick={{ fill: '#14b8a6', fontSize: 12, fontWeight: 'bold' }}
- dx={10}
- domain={[0, 100]}
- />
-
- {
- if (name === 'saasInvest') return [`€${value}.000`, 'Kumuliertes Investment (Miete + Addons)'];
- if (name === 'customInvest') return [`€${value}.000`, 'Kumuliertes Investment (Bau + Betrieb)'];
- if (name === 'saasIndep') return [`${value}%`, 'Technische Unabhängigkeit (Lock-in sinkt)'];
- if (name === 'customIndep') return [`${value}%`, 'Technische Unabhängigkeit & Datenhoheit'];
- return [value, name];
- }}
- labelStyle={{ fontWeight: 'bold', color: '#0f172a', marginBottom: '8px' }}
- />
-
- {stack === 'saas' ? (
- <>
-
-
- >
- ) : (
- <>
-
-
- >
- )}
-
-
-
-
- {/* Impact Summary */}
-
-
-
- {stack === 'saas' ? : }
-
-
-
- {stack === 'saas' ? 'Massiver Platform Lock-in' : '100% Datenhoheit'}
-
-
- {stack === 'saas'
- ? 'Ihre Daten und Prozesse liegen bei Dritten. Umzüge werden nach Jahr 2 exponentiell teuers und riskant.'
- : 'Sie besitzen die Kern-Datenbanken und APIs. Keine Lizenzschocks, keine Blackbox-Updates.'}
-
-
-
-
-
-
-
+
+
+
+
+ 🏗️
+
+ Zeitlicher Verlauf: Investment vs. Unabhängigkeit
+
+
+
+ Wie Plattform-Abhängigkeit (Lock-in) über die Jahre Ihre
+ Skalierbarkeit zerstört, während ein Headless-System echte
+ Souveränität aufbaut.
+
-
- );
+
+
+
+ {/* Control Tabs */}
+
+
setStack("saas")}
+ className={`flex-1 p-4 flex flex-col items-center justify-center gap-2 transition-all ${stack === "saas" ? "bg-white border-b-2 border-orange-500" : "bg-slate-50 text-slate-400 hover:bg-slate-100"}`}
+ >
+
+
+
+
+
+ SaaS / Baukasten
+
+
+ Gekauft ist schneller
+
+
+
+
setStack("custom")}
+ className={`flex-1 p-4 flex flex-col items-center justify-center gap-2 transition-all ${stack === "custom" ? "bg-white border-b-2 border-emerald-500" : "bg-slate-50 text-slate-400 hover:bg-slate-100"}`}
+ >
+
+
+
+
+
+ Build-First / Headless
+
+
+ Architektur als Asset
+
+
+
+
+
+ {/* Chart Area */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Left Y-Axis: Cost */}
+ `€${val}k`}
+ axisLine={false}
+ tickLine={false}
+ tick={{ fill: "#94a3b8", fontSize: 12 }}
+ dx={-10}
+ />
+
+ {/* Right Y-Axis: Independence */}
+ `${val}%`}
+ axisLine={false}
+ tickLine={false}
+ tick={{
+ fill: "#14b8a6",
+ fontSize: 12,
+ fontWeight: "bold",
+ }}
+ dx={10}
+ domain={[0, 100]}
+ />
+
+ {
+ if (name === "saasInvest")
+ return [
+ `€${value}.000`,
+ "Kumuliertes Investment (Miete + Addons)",
+ ];
+ if (name === "customInvest")
+ return [
+ `€${value}.000`,
+ "Kumuliertes Investment (Bau + Betrieb)",
+ ];
+ if (name === "saasIndep")
+ return [
+ `${value}%`,
+ "Technische Unabhängigkeit (Lock-in sinkt)",
+ ];
+ if (name === "customIndep")
+ return [
+ `${value}%`,
+ "Technische Unabhängigkeit & Datenhoheit",
+ ];
+ return [String(value), String(name)];
+ }}
+ labelStyle={{
+ fontWeight: "bold",
+ color: "#0f172a",
+ marginBottom: "8px",
+ }}
+ />
+
+ {stack === "saas" ? (
+ <>
+
+
+ >
+ ) : (
+ <>
+
+
+ >
+ )}
+
+
+
+
+ {/* Impact Summary */}
+
+
+
+ {stack === "saas" ? (
+
+ ) : (
+
+ )}
+
+
+
+ {stack === "saas"
+ ? "Massiver Platform Lock-in"
+ : "100% Datenhoheit"}
+
+
+ {stack === "saas"
+ ? "Ihre Daten und Prozesse liegen bei Dritten. Umzüge werden nach Jahr 2 exponentiell teuers und riskant."
+ : "Sie besitzen die Kern-Datenbanken und APIs. Keine Lizenzschocks, keine Blackbox-Updates."}
+
+
+
+
+
+
+
+
+
+ );
}
diff --git a/apps/web/src/components/simulations/DigitalAssetVisualizer.tsx b/apps/web/src/components/simulations/DigitalAssetVisualizer.tsx
index a7c2b8b..d2d1a78 100644
--- a/apps/web/src/components/simulations/DigitalAssetVisualizer.tsx
+++ b/apps/web/src/components/simulations/DigitalAssetVisualizer.tsx
@@ -1,201 +1,371 @@
"use client";
-import React, { useState } from 'react';
-import { ComponentShareButton } from '../ComponentShareButton';
-import { Reveal } from '../Reveal';
-import { Area, AreaChart, CartesianGrid, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts';
-import { Briefcase, Coins, PiggyBank, TrendingUp } from 'lucide-react';
+import React, { useState } from "react";
+import { ComponentShareButton } from "../ComponentShareButton";
+import { Reveal } from "../Reveal";
+import {
+ Area,
+ AreaChart,
+ CartesianGrid,
+ ResponsiveContainer,
+ Tooltip,
+ XAxis,
+ YAxis,
+} from "recharts";
+import { Briefcase, Coins, PiggyBank, TrendingUp } from "lucide-react";
const data = [
- { year: 'Jahr 1', saasCost: 40000, saasAsset: 0, customCost: 120000, customAsset: 120000 },
- { year: 'Jahr 2', saasCost: 85000, saasAsset: 0, customCost: 140000, customAsset: 110000 },
- { year: 'Jahr 3', saasCost: 135000, saasAsset: 0, customCost: 160000, customAsset: 100000 },
- { year: 'Jahr 4', saasCost: 190000, saasAsset: 0, customCost: 180000, customAsset: 90000 },
- { year: 'Jahr 5', saasCost: 250000, saasAsset: 0, customCost: 200000, customAsset: 85000 },
+ {
+ year: "Jahr 1",
+ saasCost: 40000,
+ saasAsset: 0,
+ customCost: 120000,
+ customAsset: 120000,
+ },
+ {
+ year: "Jahr 2",
+ saasCost: 85000,
+ saasAsset: 0,
+ customCost: 140000,
+ customAsset: 110000,
+ },
+ {
+ year: "Jahr 3",
+ saasCost: 135000,
+ saasAsset: 0,
+ customCost: 160000,
+ customAsset: 100000,
+ },
+ {
+ year: "Jahr 4",
+ saasCost: 190000,
+ saasAsset: 0,
+ customCost: 180000,
+ customAsset: 90000,
+ },
+ {
+ year: "Jahr 5",
+ saasCost: 250000,
+ saasAsset: 0,
+ customCost: 200000,
+ customAsset: 85000,
+ },
];
-const formatCurrency = (val: number) => new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR', maximumFractionDigits: 0 }).format(val);
+const formatCurrency = (val: number) =>
+ new Intl.NumberFormat("de-DE", {
+ style: "currency",
+ currency: "EUR",
+ maximumFractionDigits: 0,
+ }).format(val);
-export function DigitalAssetVisualizer({ className = '' }: { className?: string }) {
- const [view, setView] = useState<'saas' | 'custom'>('custom');
+export function DigitalAssetVisualizer({
+ className = "",
+}: {
+ className?: string;
+}) {
+ const [view, setView] = useState<"saas" | "custom">("custom");
- return (
-
-
-
+ return (
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
- 💰
-
Software: Ausgabe oder Investment?
-
-
- Kumulierte Kosten im Vergleich zum bilanzierbaren Unternehmenswert über 5 Jahre.
-
-
-
-
-
- {/* Control Tabs */}
-
-
setView('saas')}
- className={`flex-1 p-4 flex flex-col items-center justify-center gap-2 transition-all ${view === 'saas' ? 'bg-white border-b-2 border-red-500' : 'bg-slate-50 text-slate-400 hover:bg-slate-100'}`}
- >
-
-
-
-
-
SaaS-Miete (Verbindlichkeit)
-
100% OpEx
-
-
-
setView('custom')}
- className={`flex-1 p-4 flex flex-col items-center justify-center gap-2 transition-all ${view === 'custom' ? 'bg-white border-b-2 border-indigo-500' : 'bg-slate-50 text-slate-400 hover:bg-slate-100'}`}
- >
-
-
-
-
-
Eigenentwicklung (Asset)
-
CapEx + IP-Aufbau
-
-
-
-
- {/* Chart Area */}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- `€${val / 1000}k`}
- axisLine={false}
- tickLine={false}
- tick={{ fill: '#64748b', fontSize: 12 }}
- dx={-10}
- />
- {
- if (name === 'saasCost') return [formatCurrency(value), 'Kumulierte Kosten (Miete)'];
- if (name === 'customCost') return [formatCurrency(value), 'Kumulierte Kosten (Bau + Wartung)'];
- if (name === 'customAsset') return [formatCurrency(value), 'Firmenwert (Digitales Eigentum)'];
- if (name === 'saasAsset') return [formatCurrency(value), 'Firmenwert (IP)'];
- return [value, name];
- }}
- labelStyle={{ fontWeight: 'bold', color: '#0f172a', marginBottom: '4px', fontSize: '11px' }}
- />
-
- {view === 'saas' ? (
- <>
-
-
- >
- ) : (
- <>
-
-
- >
- )}
-
-
-
-
- {/* Summary Metrics */}
-
-
-
- Total Spend (Jahr 5)
-
-
- {view === 'saas' ? '250.000 €' : '200.000 €'}
- {view === 'saas' && }
-
-
Sunk Costs (Geldabfluss)
-
-
-
- Bilanzierbarer Wert (IP)
-
-
- {view === 'saas' ? '0 €' : '85.000 €'}
- {view === 'custom' &&
}
-
-
Erhöht den Unternehmenswert
-
-
-
-
-
+
+
+
+
+ 💰
+
+ Software: Ausgabe oder Investment?
+
+
+
+ Kumulierte Kosten im Vergleich zum bilanzierbaren
+ Unternehmenswert über 5 Jahre.
+
-
- );
+
+
+
+ {/* Control Tabs */}
+
+
setView("saas")}
+ className={`flex-1 p-4 flex flex-col items-center justify-center gap-2 transition-all ${view === "saas" ? "bg-white border-b-2 border-red-500" : "bg-slate-50 text-slate-400 hover:bg-slate-100"}`}
+ >
+
+
+
+
+
+ SaaS-Miete (Verbindlichkeit)
+
+
+ 100% OpEx
+
+
+
+
setView("custom")}
+ className={`flex-1 p-4 flex flex-col items-center justify-center gap-2 transition-all ${view === "custom" ? "bg-white border-b-2 border-indigo-500" : "bg-slate-50 text-slate-400 hover:bg-slate-100"}`}
+ >
+
+
+
+
+
+ Eigenentwicklung (Asset)
+
+
+ CapEx + IP-Aufbau
+
+
+
+
+
+ {/* Chart Area */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `€${val / 1000}k`}
+ axisLine={false}
+ tickLine={false}
+ tick={{ fill: "#64748b", fontSize: 12 }}
+ dx={-10}
+ />
+ {
+ if (name === "saasCost")
+ return [
+ formatCurrency(Number(value)),
+ "Kumulierte Kosten (Miete)",
+ ];
+ if (name === "customCost")
+ return [
+ formatCurrency(Number(value)),
+ "Kumulierte Kosten (Bau + Wartung)",
+ ];
+ if (name === "customAsset")
+ return [
+ formatCurrency(Number(value)),
+ "Firmenwert (Digitales Eigentum)",
+ ];
+ if (name === "saasAsset")
+ return [
+ formatCurrency(Number(value)),
+ "Firmenwert (IP)",
+ ];
+ return [String(value), String(name)];
+ }}
+ labelStyle={{
+ fontWeight: "bold",
+ color: "#0f172a",
+ marginBottom: "4px",
+ fontSize: "11px",
+ }}
+ />
+
+ {view === "saas" ? (
+ <>
+
+
+ >
+ ) : (
+ <>
+
+
+ >
+ )}
+
+
+
+
+ {/* Summary Metrics */}
+
+
+
+ Total Spend (Jahr 5)
+
+
+ {view === "saas" ? "250.000 €" : "200.000 €"}
+ {view === "saas" && (
+
+ )}
+
+
+ Sunk Costs (Geldabfluss)
+
+
+
+
+ Bilanzierbarer Wert (IP)
+
+
+ {view === "saas" ? "0 €" : "85.000 €"}
+ {view === "custom" && (
+
+ )}
+
+
+ Erhöht den Unternehmenswert
+
+
+
+
+
+
+
+
+ );
}
diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json
index fd778dc..b5a90cb 100644
--- a/apps/web/tsconfig.json
+++ b/apps/web/tsconfig.json
@@ -2,6 +2,7 @@
"extends": "@mintel/tsconfig/nextjs.json",
"compilerOptions": {
"baseUrl": ".",
+ "strict": true,
"paths": {
"@/*": ["./*"],
"@payload-config": ["./payload.config.ts"]
diff --git a/migrate-drafts.js b/migrate-drafts.js
deleted file mode 100644
index 9a0324a..0000000
--- a/migrate-drafts.js
+++ /dev/null
@@ -1,34 +0,0 @@
-import { getPayload } from "payload";
-import configPromise from "./apps/web/payload.config.js";
-
-async function run() {
- const payload = await getPayload({ config: configPromise });
- const { docs } = await payload.find({
- collection: "posts",
- limit: 1000,
- });
-
- console.log(`Found ${docs.length} posts. Checking status...`);
-
- for (const doc of docs) {
- if (doc._status !== "published") {
- try {
- await payload.update({
- collection: "posts",
- id: doc.id,
- data: {
- _status: "published",
- },
- });
- console.log(`Updated "${doc.title}" to published.`);
- } catch (e) {
- console.error(`Failed to update ${doc.title}:`, e.message);
- }
- }
- }
-
- console.log("Migration complete.");
- process.exit(0);
-}
-
-run();