import { useState, useEffect } from "react"; const COURT_TYPES = ["Indoor", "Outdoor", "Both indoor & outdoor"]; const SURFACES = ["Artificial turf", "Panoramic glass", "Standard glass", "No preference yet"]; const LIGHTING = ["LED competition", "LED standard", "Natural light only", "Not sure yet"]; const TIMELINES = ["ASAP (< 3 months)", "3–6 months", "6–12 months", "12+ months / exploring"]; const BUDGETS = ["< €100K", "€100K – €250K", "€250K – €500K", "€500K – €1M", "> €1M", "Not sure yet"]; const SERVICES = ["Court construction (turnkey)", "Court surfaces only", "Steel structures / canopy", "Glass walls", "Lighting systems", "Flooring / foundation", "Architecture & planning", "Financing / investment", "Consulting / feasibility"]; const CALC = { courts: 6, type: "Indoor (rented hall)", totalInvestment: "€285,000", monthlyRevenue: "€18,750", monthlyCosts: "€12,400", monthlyCashFlow: "€6,350", paybackYears: "3.7", irr: "22.4%", cashOnCash: "26.8%" }; export default function App() { const [view, setView] = useState("results"); const [bStep, setBStep] = useState(1); const [anim, setAnim] = useState(true); const [brief, setBrief] = useState({ courtType: "", courts: 6, surface: "", lighting: "", location: "", country: "Germany", timeline: "", budget: "", services: [], info: "", name: "", email: "", phone: "", company: "" }); useEffect(() => { setAnim(false); const t = setTimeout(() => setAnim(true), 50); return () => clearTimeout(t); }, [view, bStep]); const $ = { bg: "#FFFFFF", soft: "#F8FAFC", muted: "#F1F5F9", border: "#E2E8F0", borderDark: "#CBD5E1", text: "#0F172A", sub: "#334155", dim: "#64748B", faint: "#94A3B8", blue: "#1D4ED8", blueLight: "#3B82F6", bluePale: "#DBEAFE", blueGhost: "#EFF6FF", blueDark: "#1E40AF", green: "#16A34A", greenPale: "#DCFCE7", gold: "#D97706", goldPale: "#FEF3C7", }; const font = "'Inter', -apple-system, BlinkMacSystemFont, sans-serif"; const mono = "'JetBrains Mono', 'SF Mono', monospace"; const Pill = ({ options, value, onChange, multi }) => (
{options.map(o => { const a = multi ? value.includes(o) : value === o; return ; })}
); const Stat = ({ label, value, highlight, sub }) => (
{label}
{value}
{sub &&
{sub}
}
); return (
{/* Header */}
P
padelnomics
{view !== "results" && }
{/* ─── RESULTS ─── */} {view === "results" && (
Your Projection

{CALC.courts}-Court Indoor Padel Hall

Based on your inputs — {CALC.type}

{/* CTA */}
Next Step

Get quotes from verified court suppliers

Share your project specs and we'll connect you with pre-vetted suppliers who match your requirements. They'll reach out directly with tailored proposals — typically within 48 hours.

{["2–5 matched suppliers", "Direct contact, no middleman", "Free, no commitment", "Your data stays private"].map(t => (
{t}
))}
Takes ~2 minutes
{[["540+", "projects matched"], ["48h", "avg. response"], ["35+", "verified suppliers"]].map(([n, l]) => (
{n}
{l}
))}
)} {/* ─── BRIEF ─── */} {view === "brief" && (
{["Project", "Details", "Contact"].map((l, i) => { const n = i + 1, on = bStep === n, done = bStep > n; return (
{l}
); })}
{/* Brief 1 */} {bStep === 1 && (

Tell us about your project

This helps us match you with the right suppliers. All fields optional.

setBrief(p => ({ ...p, courtType: v }))} />
setBrief(p => ({ ...p, courts: +e.target.value }))} style={{ flex: 1, accentColor: $.blue }} />
{brief.courts}
setBrief(p => ({ ...p, surface: v }))} />
setBrief(p => ({ ...p, lighting: v }))} />
)} {/* Brief 2 */} {bStep === 2 && (

Project details

Help suppliers understand your timeline and scope.

setBrief(p => ({ ...p, location: e.target.value }))} style={{ width: "100%", background: $.bg, border: `1.5px solid ${$.border}`, borderRadius: "10px", padding: "11px 14px", fontSize: "14px", color: $.text, fontFamily: font, outline: "none", boxSizing: "border-box" }} onFocus={e => e.target.style.borderColor = $.blue} onBlur={e => e.target.style.borderColor = $.border} />
setBrief(p => ({ ...p, timeline: v }))} />
setBrief(p => ({ ...p, budget: v }))} />
setBrief(p => ({ ...p, services: p.services.includes(s) ? p.services.filter(x => x !== s) : [...p.services, s] }))} multi />