const ROUTES = [ { id: 'ath-thes', el: 'Αθήνα → Θεσσαλονίκη', en: 'Athens → Thessaloniki', km: 503, solo: 92, ktel: 40.50, seat: 22.00, from: 'ATH', to: 'THE', fuel: 68, tolls: 24 } ]; function useTween(value, dur = 700) { const [d, setD] = React.useState(value); const from = React.useRef(value); React.useEffect(() => { const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; if (reduce) { setD(value); from.current = value; return; } const start = from.current, t0 = performance.now(); let raf; const tick = (now) => { const p = Math.min(1, (now - t0) / dur); const e = 1 - Math.pow(1 - p, 3); setD(start + (value - start) * e); if (p < 1) raf = requestAnimationFrame(tick); else from.current = value; }; raf = requestAnimationFrame(tick); return () => cancelAnimationFrame(raf); }, [value, dur]); return d; } function LeafMeter({ trees }) { const pct = Math.min(1, trees / 60); const LEAF = "M32 4 C20 16 12 27 12 38 C12 50 21 60 32 60 C43 60 52 50 52 38 C52 27 44 16 32 4 Z"; return ( ); } function Calculator() { const { Select } = window.ellarideDesignSystem_c64d4a || {}; const { RealMap } = window; const t = window.t; const lang = window.__LANG__ || 'el'; const [routeId, setRouteId] = React.useState('ath-thes'); const [seats, setSeats] = React.useState(3); const r = ROUTES.find(x => x.id === routeId) || ROUTES[0]; const options = ROUTES.map(x => ({ value: x.id, label: x[lang] || x.el })); const recovery = Math.min(r.solo, r.seat * seats); const recoveryPct = Math.round((recovery / r.solo) * 100); const passSaving = r.ktel - r.seat; const savingPct = Math.round((passSaving / r.ktel) * 100); const co2Per500 = seats === 1 ? 30.6 : (seats === 2 ? 40.8 : 45.9); const co2Kg = +((r.km / 500) * co2Per500).toFixed(1); const trees = Math.max(1, Math.round(co2Kg / 0.06)); const tRecovery = useTween(recovery); const tSaving = useTween(passSaving); const tCo2 = useTween(co2Kg); return (
{/* Section Header */}
{t('calc.eyebrow')}

{t('calc.title')}

{t('calc.sub')}

{/* Calculator Controls + Outputs Grid */}
{/* Left Column (Inputs & Map) */}
{/* Route Select */}
{/* Seats Slider */}
{t('calc.seatsLabel')} {seats}
setSeats(+e.target.value)} className="w-full accent-[#0096F7]" />
123
{/* Map */} {RealMap && }
{/* Right Column (Outputs Cards - Clean Light Theme) */}
{/* Driver Recovery Output */}
{t('calc.driverRecovers')}
€{tRecovery.toFixed(2)} ≈ {recoveryPct}% {t('calc.ofFuelToll')}
{/* Passenger Savings Output */}
{t('calc.passengerSavings')}
€{tSaving.toFixed(2)} {t('calc.vsBusTrain')} −{savingPct}%
€{r.seat.toFixed(2)} {t('calc.perSeatWith')} · €{r.ktel.toFixed(2)} {t('calc.avgBusFare')}
{/* CO2 Savings Meter */}
{t('calc.co2Title')}
{tCo2.toFixed(1)} kg CO₂
≈ {trees} {t('calc.co2Eq')}
{/* CO2 Metric Breakdown Table (Οδηγείς, εξοικονομείς CO₂) */}
{lang === 'el' ? 'Οδηγείς, εξοικονομείς CO₂ (500 km)' : 'Driving saves CO₂ (500 km)'}
1 {lang === 'el' ? 'επιβάτης' : 'passenger'}
30.6 kg
2 {lang === 'el' ? 'επιβάτες' : 'passengers'}
40.8 kg
3 {lang === 'el' ? 'επιβάτες' : 'passengers'}
45.9 kg
); } window.Calculator = Calculator;