import React, { useState } from "react"; const MultiStepPercentWidget: React.FC = () => { const start = 100; const [change1, setChange1] = useState(40); // +40% const [change2, setChange2] = useState(-25); // -25% const step1Val = start * (1 + change1 / 100); const finalVal = step1Val * (1 + change2 / 100); const overallChange = ((finalVal - start) / start) * 100; const naiveChange = change1 + change2; // Scale for visualization const maxVal = Math.max(start, step1Val, finalVal, 150); const getWidth = (val: number) => (val / maxVal) * 100; return (
setChange1(parseInt(e.target.value))} className="flex-1 accent-indigo-600" /> {change1 > 0 ? "+" : ""} {change1}%
setChange2(parseInt(e.target.value))} className="flex-1 accent-rose-600" /> {change2 > 0 ? "+" : ""} {change2}%
{/* Step 0 */}
Start ${start}
{/* Step 1 */}
After {change1 > 0 ? "+" : ""} {change1}% ${step1Val.toFixed(2)}
{/* Step 2 */}
After {change2 > 0 ? "+" : ""} {change2}% ${finalVal.toFixed(2)}
The Trap (Additive)
{naiveChange > 0 ? "+" : ""} {naiveChange}%
({change1} + {change2})
Actual Change
{overallChange > 0 ? "+" : ""} {overallChange.toFixed(2)}%
1.{change1} × {1 + change2 / 100} ={" "} {(1 + change1 / 100) * (1 + change2 / 100)}
); }; export default MultiStepPercentWidget;