+ {/* ─── Year / filing status / projection toggle ───────────────── */}
+
+
+
+ Tax Year
+
+
+
+ Filing Status
+
+
+ {isCurrentYear && (
+
Projected full-year values shown alongside actuals
+ )}
+
+
+
+ {/* ─── Highlighted prompts for missing data ───────────────────── */}
+ {result.prompts.length > 0 && (
+
+ {result.prompts.map((p) => {
+ const autoValue = effectiveInputs[p.field];
+ const isAutoFilled = autoValue != null && inputs[p.field] == null;
+ return (
+
+
+
+
+ updateInput({ [p.field]: e.target.value ? Number(e.target.value) : undefined })
+ }
+ />
+
+
{p.reason}
+
+ );
+ })}
+
+ )}
+
+ {/* ─── Configurable summary tiles ──────────────────────────────── */}
+
+
+
+
+
+ {taxTiles.map((t) => {
+ const value: number = (result as unknown as Record
)[t] ?? 0;
+ const projValue: number | undefined = projResult
+ ? (projResult as unknown as Record)[t]
+ : undefined;
+ const className = TAX_TILE_NEGATIVE.has(t) ? 'negative' : TAX_TILE_POSITIVE.has(t) ? 'positive' : '';
+ const sub = t === 'remainingDue'
+ ? (result.safeHarborMet === true ? '✓ Safe harbor met'
+ : result.safeHarborMet === false ? '⚠ Safe harbor NOT met'
+ : 'Safe harbor: need prior year data')
+ : t === 'alreadyPaid' ? 'Withholding + estimates'
+ : undefined;
+ return (
+
+
{TAX_TILE_LABELS[t]}
+
{fmtMoneyShort(value)}
+ {projValue !== undefined && (
+
projected: {fmtMoneyShort(projValue)}
+ )}
+ {sub && !projValue &&
{sub}
}
+
+ );
+ })}
+
+
+
+
setTilesConfigOpen(false)}
+ footer={}
+ >
+
+
Choose which values to display as tiles:
+ {ALL_TAX_TILES.map((t) => (
+
+ ))}
+
+
+
+ {/* ─── Quarterly schedule ─────────────────────────────────────── */}
+
+
+ Quarterly Estimated Payments
+ {result.safeHarborAmount != null && (
+
+ Safe harbor: {fmtMoney(result.safeHarborAmount)}/yr
+
+ )}
+
+
+
+
+ | Q |
+ Due |
+ Per-quarter (actual) |
+ {projResult && Per-quarter (proj) | }
+ Remaining / Q |
+ Safe Harbor Min |
+ |
+
+
+
+ {result.quarterlySchedule.map((q, i) => (
+
+ | Q{q.quarter} |
+ {q.dueDate} |
+ {fmtMoney(q.projectedAmount)} |
+ {projResult && (
+
+ {fmtMoney(projResult.quarterlySchedule[i]?.projectedAmount)}
+ |
+ )}
+ {fmtMoney(q.remainingAmount)} |
+ {q.safeHarborAmount != null ? fmtMoney(q.safeHarborAmount) : '—'} |
+ {q.isPastDue && past due} |
+
+ ))}
+
+
+ {prevYearResult && !inputs.priorYearTax && (
+
+ ✓ Prior year data auto-loaded from {year - 1} records (tax: {fmtMoney(prevYearResult.totalFederalTax)}, AGI: {fmtMoney(prevYearResult.agi)})
+
+ )}
+
+
+ {/* ─── Tax payment log ─────────────────────────────────────────── */}
+
+
Estimated Tax Payments Made
+ {(inputs.taxPayments ?? []).length > 0 && (
+
+
+
+ | Date |
+ Q |
+ Amount |
+ Note |
+ |
+
+
+
+ {(inputs.taxPayments ?? []).map((p) => (
+
+ | {p.date} |
+ {p.quarter ? `Q${p.quarter}` : '—'} |
+ {fmtMoney(p.amount)} |
+ {p.note ?? ''} |
+
+
+ |
+
+ ))}
+
+ | Total logged |
+ {fmtMoney((inputs.taxPayments ?? []).reduce((s, p) => s + p.amount, 0))} |
+ |
+
+
+
+ )}
+
+
+
+ {/* ─── Full breakdown ──────────────────────────────────────────── */}
+
+
Calculation Breakdown
+
+
+
+ |
+ Actual YTD |
+ {projResult && Projected | }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {(result.notes.length > 0 || (projResult?.notes.length ?? 0) > 0) && (
+
+ {result.notes.map((n, i) =>
• {n}
)}
+
+ )}
+
+
+ ⚠ This is a planning estimator, not tax advice. Consult a tax professional.
+
+
+
+ {/* ─── Additional inputs ───────────────────────────────────────── */}
+
+
Additional Inputs
+
+
+
+