import { useState } from 'react' import { econFormula, econGain, econLoss, econMetrics, econOps } from '../data/content' import { useReveal } from '../hooks/useReveal' import { formatDecimal, formatMoney, formatNumber, parseAmount } from '../lib/format' import { cx } from '../lib/cx' import { Container, Section, headingScale } from './Layout' const panelItem = 'grid grid-cols-[34px_1fr] items-start gap-[11px] rounded-[16px] p-[13px]' const badge = 'grid size-[28px] place-items-center rounded-[10px] text-[11px]' export function EconomicsSection() { const head = useReveal() const metrics = useReveal() const loss = useReveal() const gain = useReveal() const bridge = useReveal() return (
) } function RevenueCalculator() { const { ref, revealClass } = useReveal() const [programs, setPrograms] = useState('') // 2 500 ₽ is the ЭкзоКлиник average quoted in the note under the fields. const [check, setCheck] = useState('2500') const [days, setDays] = useState('30') const [investment, setInvestment] = useState('') const programsValue = parseAmount(programs) const checkValue = parseAmount(check) const daysValue = parseAmount(days) const investmentValue = parseAmount(investment) const ready = programsValue > 0 && checkValue > 0 && daysValue > 0 const volume = programsValue * daysValue const month = volume * checkValue // Payback and ROI need the investment on top of a ready revenue figure. const hasInvestment = investmentValue > 0 && month > 0 const payback = hasInvestment ? `${formatDecimal(Math.round((investmentValue / month) * 10) / 10)} мес.` : 'Укажите инвестиции' const roi = hasInvestment ? `${formatNumber(Math.round(((month * 12 - investmentValue) / investmentValue) * 100))}%` : 'Укажите инвестиции' return (
Простой расчёт

Сколько зона восстановления может приносить клубу

Без процентов и сложных метрик: укажите продажи в день, средний чек и количество рабочих дней.

{econFormula.map((step, index) => ( ))}

Средний чек программы составляет 2 500 ₽, по данным нашей клиники «ЭкзоКлиник» в городе Тольятти за период 2025–2026гг.

Средний чек программы может меняться в зависимости от региона и сезонных предложений.

Расчёт показывает сценарную выручку и ROI, а не финансовую гарантию. ROI рассчитан без учёта ФОТ, налогов, аренды, расходников и прочих операционных расходов. Финальная экономика уточняется после аудита.

) } function FormulaFragment({ step, index, isResult, }: { step: (typeof econFormula)[number] index: number isResult: boolean }) { return ( <> {index > 0 ? ( {isResult ? '=' : '×'} ) : null}
{step.badge} {step.lines[0]}
{step.lines[1]}
) } function CalcField({ id, label, hint, value, onChange, placeholder, min, max, step, }: { id: string label: string hint: string value: string onChange: (value: string) => void placeholder?: string min?: number max?: number step?: number }) { return (
onChange(event.target.value)} className="h-[48px] w-full min-w-0 rounded-[13px] border border-white/[0.17] bg-white/[0.075] px-[13px] text-[15px] font-extrabold text-white tabular-nums outline-none placeholder:text-white/[0.28] focus:border-teal focus:shadow-[0_0_0_3px_rgb(0_196_180/0.13)]" /> {hint}
) } function CalcResult({ label, value, note }: { label: string; value: string; note: string }) { return (
{label} {value} {note}
) }