"use client"; import React from 'react'; import { ComponentShareButton } from './ComponentShareButton'; import { Reveal } from './Reveal'; interface WebVitalsScoreProps { values: { lcp: number; inp: number; /** Cumulative Layout Shift (e.g. 0.1) */ cls: number; }; description?: string; showShare?: boolean; } export const WebVitalsScore: React.FC = ({ values, description }) => { const getStatus = (metric: 'lcp' | 'inp' | 'cls', value: number): 'good' | 'needs-improvement' | 'poor' => { if (metric === 'lcp') return value <= 2.5 ? 'good' : value <= 4.0 ? 'needs-improvement' : 'poor'; if (metric === 'inp') return value <= 200 ? 'good' : value <= 500 ? 'needs-improvement' : 'poor'; if (metric === 'cls') return value <= 0.1 ? 'good' : value <= 0.25 ? 'needs-improvement' : 'poor'; return 'poor'; }; const metrics = [ { id: 'lcp', label: 'Largest Contentful Paint', value: values.lcp, unit: 's', stat: getStatus('lcp', values.lcp), desc: 'Wann der Hauptinhalt geladen ist' }, { id: 'inp', label: 'Interaction to Next Paint', value: values.inp, unit: 'ms', stat: getStatus('inp', values.inp), desc: 'Reaktionszeit auf Klicks' }, { id: 'cls', label: 'Cumulative Layout Shift', value: values.cls, unit: '', stat: getStatus('cls', values.cls), desc: 'Visuelle Stabilität beim Laden' } ]; const getColors = (status: string) => { if (status === 'good') return { text: 'text-slate-900', bg: 'bg-emerald-50/50', border: 'border-emerald-200/50', glow: '' }; if (status === 'needs-improvement') return { text: 'text-slate-900', bg: 'bg-amber-50/50', border: 'border-amber-200/50', glow: '' }; return { text: 'text-slate-900', bg: 'bg-red-50/50', border: 'border-red-200/50', glow: '' }; }; // Generate stable hash for share button const shareId = `vitals-${React.useId().replace(/:/g, "")}`; return (
{/* Ambient Background Glow matching the homepage feel */}
{/* Subtle top shine */}
{/* Share Button top right */}

Core Web Vitals

{description &&

{description}

}
{metrics.map((metric, i) => { const colors = getColors(metric.stat); return (
{metric.label}
{metric.value} {metric.unit && {metric.unit}}
{metric.desc}
); })}
); };