From 9333b7a9c3c5fd34ec68688ccf2a41abc5c56fb1 Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Mon, 20 Apr 2026 18:19:23 +0200 Subject: [PATCH] feat(pitch-deck): Unit Economics chart in Finanzplan + larger sub-text + remove Container metric MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Finanzplan Charts tab: new Unit Economics chart showing ACV, Gross Margin, NRR, EBIT Margin as mini bar charts per year (2026-2030). BusinessModelSlide: sub-text under Unit Economics increased from 10px → xs (12px). DB: Removed "Container in Produktion" metric from pitch_metrics + all versions. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../components/slides/BusinessModelSlide.tsx | 2 +- .../components/slides/FinanzplanSlide.tsx | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/pitch-deck/components/slides/BusinessModelSlide.tsx b/pitch-deck/components/slides/BusinessModelSlide.tsx index 3e2620c..fde5e0c 100644 --- a/pitch-deck/components/slides/BusinessModelSlide.tsx +++ b/pitch-deck/components/slides/BusinessModelSlide.tsx @@ -144,7 +144,7 @@ export default function BusinessModelSlide({ lang, isWandeldarlehen }: BusinessM {m.label} {m.value} -

{m.sub}

+

{m.sub}

) diff --git a/pitch-deck/components/slides/FinanzplanSlide.tsx b/pitch-deck/components/slides/FinanzplanSlide.tsx index 6c58158..f96675c 100644 --- a/pitch-deck/components/slides/FinanzplanSlide.tsx +++ b/pitch-deck/components/slides/FinanzplanSlide.tsx @@ -462,6 +462,43 @@ export default function FinanzplanSlide({ lang, investorId, preferredScenarioId, {de ? 'Kosten' : 'Costs'} + + {/* Unit Economics Chart */} + +

Unit Economics (2026–2030)

+
+ {[ + { label: 'ACV', key: 'arpu', unit: '€', color: 'text-indigo-300', bg: 'bg-indigo-500/60' }, + { label: 'Gross Margin', key: 'grossMargin', unit: '%', color: 'text-emerald-300', bg: 'bg-emerald-500/60' }, + { label: 'NRR', key: 'nrr', unit: '%', color: 'text-purple-300', bg: 'bg-purple-500/60' }, + { label: 'EBIT Margin', key: 'ebitMargin', unit: '%', color: 'text-amber-300', bg: 'bg-amber-500/60' }, + ].map((metric, mIdx) => ( +
+

{metric.label}

+
+ {[2026,2027,2028,2029,2030].map((y, idx) => { + const val = fpKPIs[`y${y}`]?.[metric.key as keyof typeof fpKPIs['y2026']] as number || 0 + const maxVal = Math.max(...[2026,2027,2028,2029,2030].map(yr => Math.abs(fpKPIs[`y${yr}`]?.[metric.key as keyof typeof fpKPIs['y2026']] as number || 0)), 1) + const h = Math.abs(val) / maxVal * 60 + return ( +
+
= 0 ? metric.bg + ' rounded-t' : 'bg-red-500/60 rounded-b'}`} style={{ height: `${Math.max(h, 2)}px` }} /> + {String(y).slice(2)} +
+ ) + })} +
+

+ {(() => { + const v = fpKPIs.y2030?.[metric.key as keyof typeof fpKPIs['y2026']] as number || 0 + return metric.unit === '€' ? `${v.toLocaleString('de-DE')}${metric.unit}` : `${v}${metric.unit}` + })()} +

+

2030

+
+ ))} +
+
)}