@retiregolden/planner-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +181 -0
  3. package/package.json +77 -0
  4. package/src/App.tsx +246 -0
  5. package/src/RouteErrorBoundary.tsx +45 -0
  6. package/src/assets/hero.png +0 -0
  7. package/src/assets/react.svg +1 -0
  8. package/src/assets/vite.svg +1 -0
  9. package/src/data/fedInvestClient.ts +113 -0
  10. package/src/data/localStore.ts +42 -0
  11. package/src/data/planOrigin.ts +24 -0
  12. package/src/data/planStore.ts +165 -0
  13. package/src/data/v2Backup.ts +101 -0
  14. package/src/import/ImportPage.tsx +347 -0
  15. package/src/import/ReviewChecklistView.tsx +38 -0
  16. package/src/import/brokerCsv.ts +395 -0
  17. package/src/import/csv.ts +133 -0
  18. package/src/import/genericCsv.ts +224 -0
  19. package/src/import/projectionLab.ts +350 -0
  20. package/src/import/reviewChecklist.ts +33 -0
  21. package/src/import/tenForty.ts +275 -0
  22. package/src/index.css +630 -0
  23. package/src/index.ts +16 -0
  24. package/src/learn/ArticleBody.tsx +78 -0
  25. package/src/learn/ArticlePage.tsx +57 -0
  26. package/src/learn/GlossaryPage.tsx +33 -0
  27. package/src/learn/LearnAboutScreen.tsx +41 -0
  28. package/src/learn/LearnCards.tsx +41 -0
  29. package/src/learn/LearnLink.tsx +91 -0
  30. package/src/learn/LearningCenterPage.tsx +114 -0
  31. package/src/learn/SourcesPage.tsx +98 -0
  32. package/src/learn/components/ArticleFigure.tsx +34 -0
  33. package/src/learn/components/ArticleShell.tsx +86 -0
  34. package/src/learn/components/ComparisonTable.tsx +42 -0
  35. package/src/learn/components/FormulaBlock.tsx +34 -0
  36. package/src/learn/components/PurchasingPowerChart.tsx +41 -0
  37. package/src/learn/components/RelatedArticles.tsx +27 -0
  38. package/src/learn/components/ScenarioCard.tsx +24 -0
  39. package/src/learn/components/SourceList.tsx +23 -0
  40. package/src/learn/components/charts.tsx +21 -0
  41. package/src/learn/content/about-retiregolden.ts +100 -0
  42. package/src/learn/content/aca-premium-tax-credits-and-magi.ts +103 -0
  43. package/src/learn/content/account-types-overview.ts +106 -0
  44. package/src/learn/content/after-tax-estate.ts +111 -0
  45. package/src/learn/content/agi-magi-and-taxable-income.ts +112 -0
  46. package/src/learn/content/appealing-irmaa-ssa-44.ts +95 -0
  47. package/src/learn/content/assumption-general-inflation.ts +82 -0
  48. package/src/learn/content/assumption-healthcare-inflation.ts +85 -0
  49. package/src/learn/content/assumption-heir-tax-rate.ts +79 -0
  50. package/src/learn/content/assumption-investment-returns.ts +90 -0
  51. package/src/learn/content/assumption-longevity-planning-age.ts +78 -0
  52. package/src/learn/content/assumption-recent-magi.ts +83 -0
  53. package/src/learn/content/assumption-social-security-cola.ts +89 -0
  54. package/src/learn/content/assumption-social-security-trust-fund.ts +83 -0
  55. package/src/learn/content/assumption-state-tax-override.ts +79 -0
  56. package/src/learn/content/beneficiaries-and-account-titling.ts +99 -0
  57. package/src/learn/content/break-even-useful-lens.ts +94 -0
  58. package/src/learn/content/building-a-retirement-spending-budget.ts +100 -0
  59. package/src/learn/content/cola-and-inflation-protection.ts +102 -0
  60. package/src/learn/content/divorced-spousal-and-survivor-records.ts +104 -0
  61. package/src/learn/content/dynamic-spending-guardrails.ts +90 -0
  62. package/src/learn/content/earnings-test-before-fra.ts +100 -0
  63. package/src/learn/content/employer-match-and-contribution-order.ts +104 -0
  64. package/src/learn/content/examplePlanArticles.ts +525 -0
  65. package/src/learn/content/fees-expense-ratios-and-compounding-drag.ts +98 -0
  66. package/src/learn/content/fi-number-and-four-percent-rule.ts +64 -0
  67. package/src/learn/content/filling-a-tax-bracket-with-roth-conversions.ts +98 -0
  68. package/src/learn/content/funded-ratio.ts +70 -0
  69. package/src/learn/content/healthcare-after-65.ts +103 -0
  70. package/src/learn/content/healthcare-before-65.ts +104 -0
  71. package/src/learn/content/historical-vs-random-return-models.ts +101 -0
  72. package/src/learn/content/how-assumptions-change-the-answer.ts +105 -0
  73. package/src/learn/content/how-much-can-i-spend.ts +105 -0
  74. package/src/learn/content/how-social-security-is-taxed.ts +95 -0
  75. package/src/learn/content/how-the-optimizer-thinks.ts +102 -0
  76. package/src/learn/content/how-the-optimizer-values-after-tax-estate.ts +97 -0
  77. package/src/learn/content/how-to-model-accumulation.ts +67 -0
  78. package/src/learn/content/how-to-read-a-retirement-projection.ts +115 -0
  79. package/src/learn/content/hsas-and-qualified-medical-expenses.ts +108 -0
  80. package/src/learn/content/hsas-as-retirement-accounts.ts +101 -0
  81. package/src/learn/content/inflation-risk.ts +98 -0
  82. package/src/learn/content/inherited-ira-10-year-rule.ts +105 -0
  83. package/src/learn/content/insurance-in-your-retirement-plan.ts +103 -0
  84. package/src/learn/content/irmaa-two-year-lookback.ts +99 -0
  85. package/src/learn/content/long-term-care-costs-and-insurance.ts +103 -0
  86. package/src/learn/content/long-term-care-insurance-as-risk-transfer.ts +98 -0
  87. package/src/learn/content/longevity-risk.ts +99 -0
  88. package/src/learn/content/marginal-vs-effective-tax-rate.ts +98 -0
  89. package/src/learn/content/medicare-part-b-vs-part-d-irmaa.ts +102 -0
  90. package/src/learn/content/mortality-weighted-social-security.ts +113 -0
  91. package/src/learn/content/moving-to-retiregolden.ts +86 -0
  92. package/src/learn/content/niit-high-income-investment-tax.ts +98 -0
  93. package/src/learn/content/ordinary-income-vs-capital-gains.ts +103 -0
  94. package/src/learn/content/paying-conversion-taxes-taxable-vs-ira.ts +102 -0
  95. package/src/learn/content/pensions-and-annuities.ts +101 -0
  96. package/src/learn/content/permanent-life-insurance-in-a-plan.ts +106 -0
  97. package/src/learn/content/pia-aime-and-bend-points.ts +103 -0
  98. package/src/learn/content/planner-overview.ts +106 -0
  99. package/src/learn/content/planning-for-couples-and-survivor-years.ts +108 -0
  100. package/src/learn/content/privacy-what-stays-in-your-browser.ts +99 -0
  101. package/src/learn/content/qcds-qualified-charitable-distributions.ts +101 -0
  102. package/src/learn/content/reading-the-results-page.ts +96 -0
  103. package/src/learn/content/reading-the-social-security-analysis-page.ts +106 -0
  104. package/src/learn/content/real-estate-home-equity-and-debt.ts +100 -0
  105. package/src/learn/content/reports-csv-exports-and-sharing.ts +101 -0
  106. package/src/learn/content/risk-based-guardrails.ts +100 -0
  107. package/src/learn/content/rmds-required-minimum-distributions.ts +100 -0
  108. package/src/learn/content/roth-conversion-basics.ts +104 -0
  109. package/src/learn/content/rsus-and-espp.ts +101 -0
  110. package/src/learn/content/rule-of-55-and-72t.ts +107 -0
  111. package/src/learn/content/savings-rate-biggest-lever.ts +66 -0
  112. package/src/learn/content/seed-your-plan-from-your-tax-return.ts +93 -0
  113. package/src/learn/content/sensitivity-testing-what-changes-the-answer.ts +104 -0
  114. package/src/learn/content/sequence-of-returns-risk.ts +98 -0
  115. package/src/learn/content/social-security-bridge.ts +67 -0
  116. package/src/learn/content/social-security-claiming-age-basics.ts +113 -0
  117. package/src/learn/content/social-security-taxes-vs-benefits.ts +76 -0
  118. package/src/learn/content/spending-profiles-and-the-retirement-smile.ts +92 -0
  119. package/src/learn/content/spousal-and-survivor-benefits.ts +120 -0
  120. package/src/learn/content/ssdi-and-retirement-planning.ts +72 -0
  121. package/src/learn/content/standard-deduction-senior-deduction-and-itemizing.ts +97 -0
  122. package/src/learn/content/state-income-taxes-in-retirement.ts +97 -0
  123. package/src/learn/content/step-up-in-basis.ts +102 -0
  124. package/src/learn/content/survivor-planning-for-couples.ts +110 -0
  125. package/src/learn/content/survivor-spending-in-couple-plans.ts +98 -0
  126. package/src/learn/content/tax-cliffs-and-bracket-edges.ts +105 -0
  127. package/src/learn/content/tax-loss-and-gain-harvesting.ts +99 -0
  128. package/src/learn/content/taxable-brokerage-basis-and-capital-gains.ts +99 -0
  129. package/src/learn/content/three-big-questions-spending-time-risk.ts +103 -0
  130. package/src/learn/content/tips-ladders.ts +92 -0
  131. package/src/learn/content/todays-dollars-vs-future-dollars.ts +107 -0
  132. package/src/learn/content/traditional-vs-roth-contributions.ts +113 -0
  133. package/src/learn/content/troubleshooting-surprising-results.ts +105 -0
  134. package/src/learn/content/trust-fund-haircut-scenarios.ts +101 -0
  135. package/src/learn/content/understanding-monte-carlo-success-rate.ts +118 -0
  136. package/src/learn/content/understanding-your-plan-assumptions.ts +134 -0
  137. package/src/learn/content/using-assumptions-and-provenance.ts +98 -0
  138. package/src/learn/content/using-scenarios-to-compare-choices.ts +99 -0
  139. package/src/learn/content/what-changes-when-you-move-states.ts +141 -0
  140. package/src/learn/content/what-is-fire.ts +65 -0
  141. package/src/learn/content/what-monte-carlo-proves.ts +98 -0
  142. package/src/learn/content/what-retiregolden-models.ts +103 -0
  143. package/src/learn/content/what-retirement-healthcare-really-costs.ts +117 -0
  144. package/src/learn/content/why-95-percent-is-not-a-guarantee.ts +98 -0
  145. package/src/learn/content/why-roth-conversions-raise-other-costs.ts +106 -0
  146. package/src/learn/content/why-small-tax-cliffs-can-matter.ts +109 -0
  147. package/src/learn/content/widows-penalty-and-survivor-brackets.ts +106 -0
  148. package/src/learn/content/withdrawal-order-basics.ts +105 -0
  149. package/src/learn/glossary.ts +191 -0
  150. package/src/learn/inlineMarkdown.tsx +54 -0
  151. package/src/learn/learn.css +537 -0
  152. package/src/learn/learningRegistry.ts +502 -0
  153. package/src/longevity/LongevityResults.tsx +85 -0
  154. package/src/longevity/LongevityWizard.tsx +305 -0
  155. package/src/longevity/constants.ts +15 -0
  156. package/src/longevity/factors.ts +125 -0
  157. package/src/longevity/model.ts +31 -0
  158. package/src/longevity/persistedGuard.ts +129 -0
  159. package/src/longevity/storage.ts +40 -0
  160. package/src/mc/messages.ts +118 -0
  161. package/src/mc/monteCarlo.worker.ts +44 -0
  162. package/src/mc/pool.ts +267 -0
  163. package/src/mc/runRequest.ts +125 -0
  164. package/src/optimize/messages.ts +84 -0
  165. package/src/optimize/optimize.worker.ts +29 -0
  166. package/src/optimize/runOptimize.ts +92 -0
  167. package/src/optimize/runSpendingSolve.ts +47 -0
  168. package/src/optimize/runner.ts +21 -0
  169. package/src/optimize/spendingMessages.ts +44 -0
  170. package/src/optimize/spendingRunner.ts +21 -0
  171. package/src/optimize/spendingSolve.worker.ts +18 -0
  172. package/src/planner/AssumptionsCardPage.tsx +136 -0
  173. package/src/planner/BucketLensCard.tsx +114 -0
  174. package/src/planner/ComparePlansPage.tsx +219 -0
  175. package/src/planner/DisclaimerPage.tsx +88 -0
  176. package/src/planner/HowTestedPage.tsx +159 -0
  177. package/src/planner/LiveStatus.tsx +15 -0
  178. package/src/planner/LongevityModal.tsx +55 -0
  179. package/src/planner/Modal.tsx +97 -0
  180. package/src/planner/MonteCarloPage.tsx +907 -0
  181. package/src/planner/OptimizePage.tsx +611 -0
  182. package/src/planner/PlanContext.tsx +198 -0
  183. package/src/planner/PlanPickerPage.tsx +124 -0
  184. package/src/planner/PlanWorkspace.tsx +290 -0
  185. package/src/planner/ProvenancePanel.tsx +45 -0
  186. package/src/planner/RelocationComparePage.tsx +485 -0
  187. package/src/planner/ReportPage.tsx +375 -0
  188. package/src/planner/ResultsPage.tsx +817 -0
  189. package/src/planner/ScenariosPage.tsx +285 -0
  190. package/src/planner/SocialSecuritySection.tsx +556 -0
  191. package/src/planner/SpendingSolverPage.tsx +512 -0
  192. package/src/planner/SsAnalysisPage.tsx +1134 -0
  193. package/src/planner/SurvivalPercentileModal.tsx +161 -0
  194. package/src/planner/SurvivorTransitionPage.tsx +286 -0
  195. package/src/planner/assumptionsExport.ts +371 -0
  196. package/src/planner/bucketLens.ts +89 -0
  197. package/src/planner/chartFrame.ts +8 -0
  198. package/src/planner/chartStyle.ts +11 -0
  199. package/src/planner/dialogViews.tsx +184 -0
  200. package/src/planner/dialogs.tsx +133 -0
  201. package/src/planner/examples/ExampleLibrary.tsx +189 -0
  202. package/src/planner/examples/ExamplePreviewBanner.tsx +55 -0
  203. package/src/planner/examples/ExamplesPage.tsx +25 -0
  204. package/src/planner/examples/OpenExampleButton.tsx +61 -0
  205. package/src/planner/examples/buildAggressiveSaver.ts +102 -0
  206. package/src/planner/examples/buildAnnuityEstate.ts +137 -0
  207. package/src/planner/examples/buildBaristaFire.ts +115 -0
  208. package/src/planner/examples/buildBracketFillRoth.ts +65 -0
  209. package/src/planner/examples/buildBridgeEarlyRetirement.ts +94 -0
  210. package/src/planner/examples/buildBrokerageNoHsa.ts +109 -0
  211. package/src/planner/examples/buildCoastFire.ts +88 -0
  212. package/src/planner/examples/buildContext.ts +20 -0
  213. package/src/planner/examples/buildEarlyCareerMatch.ts +93 -0
  214. package/src/planner/examples/buildEarlyRetireeAca.ts +61 -0
  215. package/src/planner/examples/buildExampleCouple.ts +103 -0
  216. package/src/planner/examples/buildFixedTargetSpending.ts +74 -0
  217. package/src/planner/examples/buildGlidepathAllocation.ts +131 -0
  218. package/src/planner/examples/buildGuardrailsFlex.ts +120 -0
  219. package/src/planner/examples/buildHsaPropertyDepth.ts +109 -0
  220. package/src/planner/examples/buildHsaStealthRetirement.ts +97 -0
  221. package/src/planner/examples/buildLeanFatFire.ts +109 -0
  222. package/src/planner/examples/buildLtcShock.ts +62 -0
  223. package/src/planner/examples/buildMovingStateTax.ts +53 -0
  224. package/src/planner/examples/buildNoAnnuityBrokerage.ts +92 -0
  225. package/src/planner/examples/buildRmdIrmaa.ts +55 -0
  226. package/src/planner/examples/buildSalaryGrowthEscalation.ts +96 -0
  227. package/src/planner/examples/buildStaticAllocationControl.ts +96 -0
  228. package/src/planner/examples/buildSurvivorYears.ts +62 -0
  229. package/src/planner/examples/buildUnderSavedSingle.ts +51 -0
  230. package/src/planner/examples/exampleCopy.ts +23 -0
  231. package/src/planner/examples/loadExample.ts +90 -0
  232. package/src/planner/examples/registry.ts +313 -0
  233. package/src/planner/explainPanels.tsx +233 -0
  234. package/src/planner/fields.tsx +381 -0
  235. package/src/planner/format.ts +33 -0
  236. package/src/planner/home/DataAndPrivacyCard.tsx +56 -0
  237. package/src/planner/home/GettingStartedPaths.tsx +46 -0
  238. package/src/planner/home/GettingStartedReopener.tsx +32 -0
  239. package/src/planner/home/StartHereLinks.tsx +22 -0
  240. package/src/planner/home/WelcomeHero.tsx +39 -0
  241. package/src/planner/home/YourPlans.tsx +72 -0
  242. package/src/planner/home/importErrorMessage.ts +22 -0
  243. package/src/planner/home/startHereSlugs.ts +7 -0
  244. package/src/planner/home/useHomeData.ts +190 -0
  245. package/src/planner/home/useHomeMode.ts +47 -0
  246. package/src/planner/householdActions.ts +22 -0
  247. package/src/planner/insights/InsightCardView.tsx +340 -0
  248. package/src/planner/insights/InsightsPage.tsx +204 -0
  249. package/src/planner/insights/categoryLabels.ts +11 -0
  250. package/src/planner/learnLinks.ts +85 -0
  251. package/src/planner/marketModelPicker.ts +172 -0
  252. package/src/planner/optimizePageChart.ts +40 -0
  253. package/src/planner/optimizePageClaim.ts +64 -0
  254. package/src/planner/planCompleteness.ts +27 -0
  255. package/src/planner/planContextCore.ts +26 -0
  256. package/src/planner/planner.css +2304 -0
  257. package/src/planner/provenanceLinks.ts +25 -0
  258. package/src/planner/sections/AccountFields.tsx +872 -0
  259. package/src/planner/sections/AccountsSection.tsx +89 -0
  260. package/src/planner/sections/AllocationPanel.tsx +261 -0
  261. package/src/planner/sections/AssumptionsSection.tsx +256 -0
  262. package/src/planner/sections/HouseholdSection.tsx +243 -0
  263. package/src/planner/sections/IncomeFloorSection.tsx +418 -0
  264. package/src/planner/sections/IncomeSection.tsx +170 -0
  265. package/src/planner/sections/InsuranceSection.tsx +362 -0
  266. package/src/planner/sections/SpendingSection.tsx +904 -0
  267. package/src/planner/sections/StrategySection.tsx +349 -0
  268. package/src/planner/sections/UpdateBalancesPanel.tsx +182 -0
  269. package/src/planner/sections/sectionHelpers.ts +48 -0
  270. package/src/planner/sections/shared.tsx +15 -0
  271. package/src/planner/sections.tsx +15 -0
  272. package/src/planner/ssAnalysis.ts +325 -0
  273. package/src/planner/successBand.ts +20 -0
  274. package/src/planner/survivorAnalysis.ts +277 -0
  275. package/src/planner/usStates.ts +19 -0
  276. package/src/planner/useMcSuccessRate.ts +77 -0
  277. package/src/planner/useProjection.ts +63 -0
  278. package/src/relocation/messages.ts +21 -0
  279. package/src/relocation/relocation.worker.ts +18 -0
  280. package/src/relocation/runRelocation.ts +17 -0
  281. package/src/relocation/runner.ts +22 -0
  282. package/src/report/brandingContext.ts +15 -0
  283. package/src/report/downloadReport.ts +34 -0
  284. package/src/report/reportHtml.ts +547 -0
  285. package/src/routes/LearnRoutes.tsx +46 -0
  286. package/src/routes/PlanRoutes.tsx +55 -0
  287. package/src/routes/RouteFallback.tsx +9 -0
  288. package/src/socialSecurity/breakEven.ts +107 -0
  289. package/src/socialSecurity/expectedPv.ts +164 -0
  290. package/src/socialSecurity/explain.ts +92 -0
  291. package/src/socialSecurity/ficaReturn.ts +81 -0
  292. package/src/socialSecurity/persistedSsGuard.ts +138 -0
  293. package/src/socialSecurity/ssFormUtils.ts +48 -0
  294. package/src/socialSecurity/ssaStatementXml.ts +156 -0
  295. package/src/socialSecurity/storage.ts +69 -0
  296. package/src/socialSecurity/survivorSwitching.ts +153 -0
  297. package/src/testSupport/samplePlan.ts +2 -0
  298. package/src/workers/run.ts +45 -0
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Illustrative chart: the buying power of a fixed $50,000 over 30 years at about
3
+ * 3% inflation a year. A teaching aid with simple, round numbers — not a
4
+ * plan-specific result — kept evergreen (no current-year figures).
5
+ */
6
+
7
+ import { CartesianGrid, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts'
8
+ import { fmtMoney, fmtMoneyCompact } from '../../planner/format'
9
+ import { chartTooltipStyle } from '../../planner/chartStyle'
10
+
11
+ export function PurchasingPowerChart() {
12
+ const start = 50_000
13
+ const inflation = 0.03
14
+ const data = Array.from({ length: 31 }, (_, year) => ({
15
+ year,
16
+ value: Math.round(start / (1 + inflation) ** year),
17
+ }))
18
+
19
+ return (
20
+ <div className="learn-chart-wrap">
21
+ <ResponsiveContainer width="100%" height="100%">
22
+ <LineChart data={data} margin={{ left: 8, right: 12, top: 8, bottom: 4 }}>
23
+ <CartesianGrid stroke="var(--border)" strokeDasharray="3 3" />
24
+ <XAxis
25
+ dataKey="year"
26
+ tick={{ fill: 'var(--muted)', fontSize: 12 }}
27
+ label={{ value: 'Years from now', position: 'insideBottom', offset: -2, fill: 'var(--muted)', fontSize: 12 }}
28
+ height={40}
29
+ />
30
+ <YAxis tickFormatter={fmtMoneyCompact} tick={{ fill: 'var(--muted)', fontSize: 12 }} width={56} />
31
+ <Tooltip
32
+ formatter={(v: unknown) => [fmtMoney(Number(v)), 'Buying power']}
33
+ labelFormatter={(l) => `Year ${l}`}
34
+ contentStyle={chartTooltipStyle}
35
+ />
36
+ <Line dataKey="value" stroke="var(--chart-1)" dot={false} strokeWidth={2} />
37
+ </LineChart>
38
+ </ResponsiveContainer>
39
+ </div>
40
+ )
41
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Renders the "Related" strip for an article. Resolves related slugs to
3
+ * articles and shows only readable ones, so there are never dead links.
4
+ * Renders nothing when no related article is readable yet.
5
+ */
6
+
7
+ import { getArticle, isReadable, type LearningArticle } from '../learningRegistry'
8
+ import { ArticleCard } from '../LearnCards'
9
+
10
+ export function RelatedArticles({ slugs }: { slugs: string[] }) {
11
+ const related = slugs
12
+ .map(getArticle)
13
+ .filter((a): a is LearningArticle => a !== undefined && isReadable(a))
14
+
15
+ if (related.length === 0) return null
16
+
17
+ return (
18
+ <section className="learn-section" aria-label="Related articles">
19
+ <h2 className="learn-section-title">Related</h2>
20
+ <div className="learn-card-grid">
21
+ {related.map((a) => (
22
+ <ArticleCard key={a.slug} article={a} />
23
+ ))}
24
+ </div>
25
+ </section>
26
+ )
27
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Renders a `scenario` block: a named example household with its assumptions
3
+ * laid out as label/value rows, plus an optional plain-language takeaway.
4
+ */
5
+
6
+ import { renderInline } from '../inlineMarkdown'
7
+ import type { ScenarioBlockData } from '../learningRegistry'
8
+
9
+ export function ScenarioCard({ block }: { block: ScenarioBlockData }) {
10
+ return (
11
+ <aside className="learn-scenario" aria-label={`Scenario: ${block.name}`}>
12
+ <p className="learn-scenario-name">{block.name}</p>
13
+ <dl className="learn-scenario-grid">
14
+ {block.assumptions.map((a) => (
15
+ <div key={a.label} className="learn-scenario-row">
16
+ <dt>{a.label}</dt>
17
+ <dd>{a.value}</dd>
18
+ </div>
19
+ ))}
20
+ </dl>
21
+ {block.summary && <p className="learn-scenario-summary">{renderInline(block.summary)}</p>}
22
+ </aside>
23
+ )
24
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Renders an article's source URLs as a labelled list of external links.
3
+ * Renders nothing when there are no sources.
4
+ */
5
+
6
+ export function SourceList({ urls }: { urls: string[] }) {
7
+ if (urls.length === 0) return null
8
+
9
+ return (
10
+ <div className="learn-sources">
11
+ <h2 className="learn-section-title">Sources</h2>
12
+ <ul className="learn-list">
13
+ {urls.map((url) => (
14
+ <li key={url}>
15
+ <a href={url} target="_blank" rel="noreferrer">
16
+ {url}
17
+ </a>
18
+ </li>
19
+ ))}
20
+ </ul>
21
+ </div>
22
+ )
23
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Chart registry for `figure` blocks. Articles reference a chart by id; this
3
+ * helper maps the id to the right (internal) chart component. Defining no
4
+ * component of its own keeps this module off the Fast Refresh boundary.
5
+ */
6
+
7
+ import type { ReactNode } from 'react'
8
+ import { PurchasingPowerChart } from './PurchasingPowerChart'
9
+
10
+ /** Chart ids articles may reference; used by the registry-integrity test. */
11
+ export const LEARN_CHART_IDS = ['purchasing-power'] as const
12
+
13
+ /** Render the chart registered under `chartId`, or null if there is no match. */
14
+ export function renderLearnChart(chartId: string): ReactNode {
15
+ switch (chartId) {
16
+ case 'purchasing-power':
17
+ return <PurchasingPowerChart />
18
+ default:
19
+ return null
20
+ }
21
+ }
@@ -0,0 +1,100 @@
1
+ /**
2
+ * The single finished article shipped with the V9 framework (PR1).
3
+ *
4
+ * It is intentionally evergreen — no tax brackets, dollar limits, or other
5
+ * current-year figures — so it can exercise the article renderer end to end
6
+ * without carrying review-cadence or source obligations.
7
+ */
8
+
9
+ import type { LearningArticle } from '../learningRegistry'
10
+
11
+ export const aboutRetireGoldenArticle: LearningArticle = {
12
+ slug: 'about-retiregolden',
13
+ title: 'About RetireGolden',
14
+ description: 'What RetireGolden is, how it keeps your data private, and how to start your first plan.',
15
+ category: 'using-retiregolden',
16
+ tags: ['overview', 'getting started', 'privacy', 'about'],
17
+ audience: 'beginner',
18
+ status: 'ready',
19
+ lastReviewed: '2026-06-19',
20
+ reviewCadence: 'stable',
21
+ sourceUrls: [],
22
+ relatedArticles: ['planner-overview', 'what-retiregolden-models', 'privacy-what-stays-in-your-browser'],
23
+ relatedPlannerRoutes: ['/'],
24
+ currentYearSensitive: false,
25
+ blocks: [
26
+ {
27
+ type: 'prose',
28
+ md: 'RetireGolden helps you see how the choices you make today could shape your retirement — and it does it without sending a single number to anyone.',
29
+ },
30
+ {
31
+ type: 'heading',
32
+ text: 'Quick takeaways',
33
+ },
34
+ {
35
+ type: 'list',
36
+ items: [
37
+ 'RetireGolden is an **educational planner**, not personalized financial, tax, or legal advice.',
38
+ 'Everything you enter stays **in your browser** — there are no accounts and no server.',
39
+ 'You build a plan section by section, then explore results, risk, and trade-offs.',
40
+ ],
41
+ },
42
+ {
43
+ type: 'heading',
44
+ text: 'What RetireGolden is',
45
+ },
46
+ {
47
+ type: 'prose',
48
+ md: "RetireGolden is a retirement-planning calculator that models how your savings, income, spending, and taxes might play out over the years ahead. You give it the pieces of your financial picture, and it projects a possible future so you can ask “what if?” questions.\n\nIt is built to **teach**, not to decide for you. The goal is a clearer mental model of how the parts of a plan fit together, so the choices you face feel less like guesswork.",
49
+ },
50
+ {
51
+ type: 'heading',
52
+ text: 'Everything stays in your browser',
53
+ },
54
+ {
55
+ type: 'prose',
56
+ md: 'RetireGolden has no accounts and no server-side storage. Every plan you create lives only on this device, in your browser.\n\nThat privacy comes with a trade-off: if you clear your browser data or switch devices, your plans are gone. Use the export option on the planner home to keep a backup you control.',
57
+ },
58
+ {
59
+ type: 'callout',
60
+ tone: 'note',
61
+ md: 'Because nothing is uploaded, RetireGolden cannot recover a lost plan for you. A quick plan backup is your safety net.',
62
+ },
63
+ {
64
+ type: 'heading',
65
+ text: 'What it can and cannot do',
66
+ },
67
+ {
68
+ type: 'prose',
69
+ md: 'RetireGolden models common retirement realities: account types, Social Security, taxes at planning precision, withdrawals, Roth conversions, healthcare costs, and the role of luck through Monte Carlo simulation.\n\nIt does not file your taxes, give personal advice, or predict the future. Real markets, laws, and lives are messier than any model. Treat the numbers as a way to compare choices, not as promises.',
70
+ },
71
+ {
72
+ type: 'table',
73
+ caption: 'What RetireGolden is built for — and what it is not.',
74
+ columns: ['Area', 'What it does', 'What it does not do'],
75
+ rows: [
76
+ ['Projections', 'Models savings, income, spending, and taxes over time', 'Predict actual market returns'],
77
+ ['Taxes', 'Estimates federal and state tax at planning precision', 'Replace a tax return or a tax advisor'],
78
+ ['Decisions', 'Helps you compare choices side by side', 'Tell you what you personally should do'],
79
+ ],
80
+ },
81
+ {
82
+ type: 'heading',
83
+ text: 'How to start',
84
+ },
85
+ {
86
+ type: 'list',
87
+ ordered: true,
88
+ items: [
89
+ 'Open the [planner home](/) and create a new plan.',
90
+ 'Work through the sections on the left, from **Household** to **Assumptions**.',
91
+ 'Visit **Results**, **Monte Carlo**, and **Optimize** to explore what your plan implies.',
92
+ 'Come back to the Learning Center whenever a term or screen needs explaining.',
93
+ ],
94
+ },
95
+ {
96
+ type: 'prose',
97
+ md: 'You do not need every detail to get value. A rough plan with sensible defaults already tells you a lot — you can refine it over time.',
98
+ },
99
+ ],
100
+ }
@@ -0,0 +1,103 @@
1
+ /**
2
+ * "ACA premium tax credits and MAGI" - a Healthcare P0 article.
3
+ */
4
+
5
+ import type { LearningArticle } from '../learningRegistry'
6
+
7
+ export const acaPremiumTaxCreditsAndMagiArticle: LearningArticle = {
8
+ slug: 'aca-premium-tax-credits-and-magi',
9
+ title: 'ACA premium tax credits and MAGI',
10
+ description: 'How income controls the subsidy for pre-Medicare health coverage.',
11
+ category: 'healthcare',
12
+ tags: ['aca', 'premium tax credit', 'magi', 'marketplace', 'healthcare before 65', 'tax cliff'],
13
+ audience: 'beginner',
14
+ status: 'ready',
15
+ lastReviewed: '2026-06-19',
16
+ reviewCadence: 'annual',
17
+ sourceUrls: [
18
+ 'https://www.healthcare.gov/lower-costs/',
19
+ 'https://www.healthcare.gov/income-and-household-information/income/',
20
+ 'https://www.irs.gov/forms-pubs/about-publication-974',
21
+ ],
22
+ relatedArticles: [
23
+ 'agi-magi-and-taxable-income',
24
+ 'healthcare-before-65',
25
+ 'why-roth-conversions-raise-other-costs',
26
+ 'filling-a-tax-bracket-with-roth-conversions',
27
+ ],
28
+ relatedPlannerRoutes: ['/plan/:planId/spending', '/plan/:planId/results', '/plan/:planId/strategy'],
29
+ currentYearSensitive: true,
30
+ priority: 'P0',
31
+ blocks: [
32
+ {
33
+ type: 'prose',
34
+ md: 'Before Medicare, many early retirees use an ACA marketplace plan. The premium tax credit can lower the monthly premium, but it depends heavily on household income. In planning, that means MAGI is not just a tax line. It can also be a healthcare-cost line.',
35
+ },
36
+ { type: 'heading', text: 'Quick takeaways' },
37
+ {
38
+ type: 'list',
39
+ items: [
40
+ 'ACA premium tax credits are income-tested.',
41
+ 'Roth conversions, IRA withdrawals, wages, and realized gains can raise MAGI.',
42
+ 'Managing MAGI can matter most in the gap years before Medicare starts.',
43
+ ],
44
+ },
45
+ { type: 'heading', text: 'The basic idea' },
46
+ {
47
+ type: 'prose',
48
+ md: 'The marketplace looks at household income for the coverage year. A lower income can mean a larger credit; a higher income can mean a smaller credit or no credit under the rules being modeled. That is why one extra dollar of income can sometimes cost more than one extra dollar of tax.\n\nThe premium tax credit is not a reason to keep income artificially low at all costs. It is a signal to compare choices carefully: taxable withdrawals, capital gains, part-time wages, and Roth conversions all push on the same income measure.',
49
+ },
50
+ {
51
+ type: 'figure',
52
+ image: { src: '/learn/images/aca-magi-premium-credit.webp' },
53
+ caption:
54
+ 'Marketplace subsidies are driven by household income: income flows into MAGI, and MAGI controls how much premium help remains.',
55
+ alt: 'Income ribbons flow into a MAGI funnel, which controls an amber subsidy ribbon that lowers a healthcare premium bucket near a cliff edge.',
56
+ },
57
+ { type: 'heading', text: 'What raises ACA MAGI in retirement' },
58
+ {
59
+ type: 'table',
60
+ caption: 'Common income sources that can affect the credit.',
61
+ columns: ['Income source', 'Why it matters', 'Planning note'],
62
+ rows: [
63
+ ['Traditional IRA withdrawal', 'Usually raises ordinary income and MAGI', 'Needed spending can reduce subsidy room'],
64
+ ['Roth conversion', 'Raises income even if you do not spend the converted dollars', 'Often worth testing before choosing a target'],
65
+ ['Taxable investment sale', 'Realized gains can raise MAGI', 'Basis and gain size matter'],
66
+ ['Part-time wages', 'Usually raise MAGI', 'May still be worth it for cash flow and benefits'],
67
+ ['Tax-free Roth withdrawal', 'Usually does not raise MAGI', 'Can be useful flexibility when rules are met'],
68
+ ],
69
+ },
70
+ { type: 'heading', text: 'A worked example' },
71
+ {
72
+ type: 'scenario',
73
+ name: 'The Patel household',
74
+ assumptions: [
75
+ { label: 'Ages', value: 'Both spouses are 62, three years before Medicare' },
76
+ { label: 'Marketplace estimate', value: '$1,350 monthly premium before a $650 credit' },
77
+ { label: 'Conversion test', value: 'An extra $20,000 Roth conversion cuts the estimated credit to $350 a month' },
78
+ ],
79
+ summary:
80
+ 'The conversion may cost more than the income tax alone. In this estimate, the Patels pay tax on the $20,000 conversion and about **$3,600** more for the year of coverage because the credit is smaller.',
81
+ },
82
+ { type: 'heading', text: 'Why it matters in RetireGolden' },
83
+ {
84
+ type: 'prose',
85
+ md: 'RetireGolden lets you enter a full pre-65 monthly premium per person and choose whether to apply the ACA credit. The projection estimates the credit using MAGI and the parameter pack. To avoid circular math, the current model estimates the credit from the prior year\'s MAGI.',
86
+ },
87
+ { type: 'heading', text: 'Common mistakes' },
88
+ {
89
+ type: 'list',
90
+ items: [
91
+ 'Thinking taxable income and ACA MAGI are always the same number.',
92
+ 'Testing Roth conversions without checking healthcare costs.',
93
+ 'Ignoring realized gains in taxable accounts.',
94
+ 'Treating a marketplace subsidy estimate as a final insurance quote or tax filing result.',
95
+ ],
96
+ },
97
+ { type: 'heading', text: 'Where to use this in the app' },
98
+ {
99
+ type: 'prose',
100
+ md: 'Use **Spending** to set pre-65 premiums and the ACA credit option. Use **Results** to watch MAGI and healthcare costs by year. Use **Strategy** when conversion targets should avoid a healthcare cliff.',
101
+ },
102
+ ],
103
+ }
@@ -0,0 +1,106 @@
1
+ /**
2
+ * "Account types: taxable, traditional, Roth, HSA, cash" - an Accounts and Saving P0 article.
3
+ */
4
+
5
+ import type { LearningArticle } from '../learningRegistry'
6
+
7
+ export const accountTypesOverviewArticle: LearningArticle = {
8
+ slug: 'account-types-overview',
9
+ title: 'Account types: taxable, traditional, Roth, HSA, cash',
10
+ description: 'How each account is taxed and why the differences matter in retirement.',
11
+ category: 'accounts-saving',
12
+ tags: ['accounts', 'taxable brokerage', 'traditional ira', 'roth ira', 'hsa', 'cash', 'tax treatment'],
13
+ audience: 'beginner',
14
+ status: 'ready',
15
+ lastReviewed: '2026-06-20',
16
+ reviewCadence: 'annual',
17
+ sourceUrls: [
18
+ 'https://www.irs.gov/retirement-plans/roth-iras',
19
+ 'https://www.irs.gov/retirement-plans/retirement-plans-faqs-regarding-iras',
20
+ 'https://www.irs.gov/forms-pubs/about-publication-969',
21
+ 'https://www.irs.gov/taxtopics/tc409',
22
+ 'https://www.irs.gov/forms-pubs/about-publication-550',
23
+ ],
24
+ relatedArticles: [
25
+ 'withdrawal-order-basics',
26
+ 'traditional-vs-roth-contributions',
27
+ 'hsas-as-retirement-accounts',
28
+ 'taxable-brokerage-basis-and-capital-gains',
29
+ 'roth-conversion-basics',
30
+ ],
31
+ relatedPlannerRoutes: ['/plan/:planId/accounts', '/plan/:planId/strategy', '/plan/:planId/results'],
32
+ currentYearSensitive: true,
33
+ priority: 'P0',
34
+ featured: true,
35
+ blocks: [
36
+ {
37
+ type: 'prose',
38
+ md: 'A retirement plan is easier to understand when every dollar lives in the right bucket. Cash, taxable brokerage, traditional retirement, Roth, and HSA accounts can hold similar investments, but they do not create the same tax result when money goes in, grows, or comes out.',
39
+ },
40
+ { type: 'heading', text: 'Quick takeaways' },
41
+ {
42
+ type: 'list',
43
+ items: [
44
+ 'Account type is about tax treatment, not just where the account is held.',
45
+ 'The same investment can behave differently inside a taxable account, traditional account, Roth account, or HSA.',
46
+ 'RetireGolden uses account type to model contributions, withdrawals, gains, RMDs, penalties, and after-tax estate value.',
47
+ ],
48
+ },
49
+ { type: 'heading', text: 'The basic idea' },
50
+ {
51
+ type: 'prose',
52
+ md: 'Think of account type as the rules printed on the side of a bucket. Cash is usually simple. Taxable brokerage can create capital gains when investments are sold. Traditional IRA and 401(k) dollars are usually pre-tax, so later withdrawals often become ordinary income. Roth dollars usually trade a tax cost now for tax-free qualified withdrawals later. HSA dollars can be tax-free for qualified medical expenses when the HSA rules are met.',
53
+ },
54
+ {
55
+ type: 'figure',
56
+ image: { src: '/learn/images/account-types-overview.webp' },
57
+ caption:
58
+ 'Each account bucket can feed the same retirement plan, but the tax gate on each bucket is different.',
59
+ alt: 'Five labeled-style account buckets for cash, taxable, traditional, Roth, and HSA feed a central retirement path through different tax gates.',
60
+ },
61
+ {
62
+ type: 'table',
63
+ caption: 'A plain-language map of the main account buckets.',
64
+ columns: ['Account type', 'Main tax idea', 'What RetireGolden needs from you'],
65
+ rows: [
66
+ ['Cash', 'Usually no taxable gain when spent', 'Balance, owner if applicable, and return assumption'],
67
+ ['Taxable brokerage', 'Sales may realize capital gains based on cost basis', 'Balance, aggregate cost basis, contributions, and return assumption'],
68
+ ['Traditional IRA or 401(k)', 'Contributions may be pre-tax; withdrawals are often ordinary income', 'Balance, owner, account kind, contributions, and inherited/RMD details when relevant'],
69
+ ['Roth IRA or Roth 401(k)', 'Qualified withdrawals may be tax-free', 'Balance, owner, account kind, contributions, and contribution basis when early access matters'],
70
+ ['HSA', 'Tax-free for qualified medical expenses when rules are met', 'Balance, owner, contribution amount, and return assumption'],
71
+ ],
72
+ },
73
+ { type: 'heading', text: 'A worked example' },
74
+ {
75
+ type: 'scenario',
76
+ name: 'The Patel household',
77
+ assumptions: [
78
+ { label: 'Cash', value: '$25,000 emergency reserve and near-term spending buffer' },
79
+ { label: 'Taxable brokerage', value: '$120,000 account with $80,000 of cost basis' },
80
+ { label: 'Traditional and Roth', value: '$500,000 traditional IRA and $90,000 Roth IRA' },
81
+ ],
82
+ summary:
83
+ 'A $20,000 withdrawal from cash is not a tax event. A $20,000 taxable sale realizes about **$6,700** of gain in this simplified basis mix, while a $20,000 traditional IRA withdrawal is ordinary income.',
84
+ },
85
+ { type: 'heading', text: 'Why it matters in RetireGolden' },
86
+ {
87
+ type: 'prose',
88
+ md: 'The Accounts screen stores the type for each balance. The projection engine then uses that type when it applies IRS contribution limits, realizes taxable gains pro-rata from taxable accounts, forces traditional-account RMDs when applicable, tracks Roth basis and conversion layers, and keeps HSA withdrawals last in the default order.',
89
+ },
90
+ { type: 'heading', text: 'Common mistakes' },
91
+ {
92
+ type: 'list',
93
+ items: [
94
+ 'Entering a Roth 401(k) as traditional because it is held at the same employer plan.',
95
+ 'Leaving taxable cost basis at zero when the account has after-tax investment basis.',
96
+ 'Treating cash and taxable brokerage as interchangeable when one may realize gains.',
97
+ 'Forgetting that an inherited traditional account follows different distribution rules than your own traditional IRA.',
98
+ ],
99
+ },
100
+ { type: 'heading', text: 'Where to use this in the app' },
101
+ {
102
+ type: 'prose',
103
+ md: 'Start in **Accounts** and classify each balance before you study **Results**. If the tax picture looks surprising, return to Accounts and check whether the type, cost basis, owner, and annual contribution fields match the real account.',
104
+ },
105
+ ],
106
+ }
@@ -0,0 +1,111 @@
1
+ /**
2
+ * "After-tax estate value" - an Insurance and Estate P1 article.
3
+ */
4
+
5
+ import type { LearningArticle } from '../learningRegistry'
6
+
7
+ export const afterTaxEstateArticle: LearningArticle = {
8
+ slug: 'after-tax-estate',
9
+ title: 'After-tax estate value',
10
+ description: 'Measuring what heirs actually keep once taxes are paid.',
11
+ category: 'insurance-estate',
12
+ tags: ['after-tax estate', 'heirs', 'traditional ira', 'roth', 'estate value', 'optimizer'],
13
+ audience: 'intermediate',
14
+ status: 'ready',
15
+ lastReviewed: '2026-06-20',
16
+ reviewCadence: 'stable',
17
+ sourceUrls: [],
18
+ relatedArticles: [
19
+ 'how-the-optimizer-values-after-tax-estate',
20
+ 'beneficiaries-and-account-titling',
21
+ 'step-up-in-basis',
22
+ 'inherited-ira-10-year-rule',
23
+ 'permanent-life-insurance-in-a-plan',
24
+ ],
25
+ relatedPlannerRoutes: ['/plan/:planId/results', '/plan/:planId/optimize', '/plan/:planId/report'],
26
+ currentYearSensitive: false,
27
+ priority: 'P1',
28
+ blocks: [
29
+ {
30
+ type: 'prose',
31
+ md: 'Net worth is not always the same as what heirs can spend. A dollar left in a traditional IRA may carry future income tax. A dollar left in Roth, cash, or stepped-up taxable property may be more flexible. RetireGolden uses after-tax estate value to compare those buckets more fairly.',
32
+ },
33
+ { type: 'heading', text: 'Quick takeaways' },
34
+ {
35
+ type: 'list',
36
+ items: [
37
+ 'After-tax estate is a planning metric, not a probate or estate-tax calculation.',
38
+ 'RetireGolden subtracts an assumed heir tax on leftover traditional balances.',
39
+ 'The metric helps Roth conversion and claiming strategies compare what heirs may actually keep.',
40
+ ],
41
+ },
42
+ { type: 'heading', text: 'The basic idea' },
43
+ {
44
+ type: 'prose',
45
+ md: 'Imagine two households each end with the same net worth. One has mostly Roth and taxable assets. The other has mostly pre-tax traditional retirement accounts. The second household may leave heirs a larger future tax bill, so the two estates are not equally valuable.\n\nAfter-tax estate value is RetireGolden\'s way to adjust for that difference without pretending to model every estate rule.',
46
+ },
47
+ {
48
+ type: 'figure',
49
+ image: { src: '/learn/images/after-tax-estate-value.webp' },
50
+ caption:
51
+ 'After-tax estate value compares the estate after applying an assumed tax haircut to inherited pre-tax balances.',
52
+ alt: 'An estate stack separates into Roth, taxable, cash, and traditional buckets, with only the traditional bucket passing through a tax gate before reaching heirs.',
53
+ },
54
+ {
55
+ type: 'formula',
56
+ expression: 'after-tax estate = ending net worth - traditional balance * heir tax rate',
57
+ where: [
58
+ { symbol: 'ending net worth', meaning: 'the modeled end-of-plan net worth' },
59
+ { symbol: 'traditional balance', meaning: 'remaining pre-tax retirement balance' },
60
+ { symbol: 'heir tax rate', meaning: 'the assumed income-tax rate heirs pay on inherited pre-tax dollars' },
61
+ ],
62
+ basis: 'nominal',
63
+ note: 'This is a simplified comparison metric. It does not model estate tax, probate costs, state inheritance tax, trust rules, or each heir\'s actual tax return.',
64
+ },
65
+ { type: 'heading', text: 'How RetireGolden treats buckets' },
66
+ {
67
+ type: 'table',
68
+ caption: 'The estate comparison uses intentionally simple assumptions.',
69
+ columns: ['Bucket', 'After-tax estate treatment', 'Why'],
70
+ rows: [
71
+ ['Traditional', 'Reduced by the heir tax rate', 'Inherited pre-tax dollars often create taxable income for heirs'],
72
+ ['Roth', 'Kept whole', 'Qualified Roth dollars are usually more tax-flexible'],
73
+ ['Taxable', 'Kept whole in the comparison', 'The model assumes a basis step-up for estate comparison'],
74
+ ['Cash, HSA, property', 'Kept whole in the comparison', 'Simplifies the metric so the main pre-tax/Roth trade is visible'],
75
+ ['Life insurance death benefit', 'Included once paid into the plan', 'The model treats death benefit as income-tax-free at death'],
76
+ ],
77
+ },
78
+ { type: 'heading', text: 'A worked example' },
79
+ {
80
+ type: 'scenario',
81
+ name: 'The Brooks household',
82
+ assumptions: [
83
+ { label: 'Strategy A', value: '$1,000,000 ending net worth, including $600,000 in traditional accounts' },
84
+ { label: 'Strategy B', value: '$960,000 ending net worth, including more Roth and taxable assets' },
85
+ { label: 'Heir tax haircut', value: 'A 25% assumed tax on inherited traditional dollars reduces Strategy A by $150,000' },
86
+ ],
87
+ summary:
88
+ 'Strategy A looks $40,000 richer before tax, but the $150,000 heir-tax haircut can make Strategy B the larger after-tax estate. The winning column depends on what heirs keep.',
89
+ },
90
+ { type: 'heading', text: 'Why it matters in RetireGolden' },
91
+ {
92
+ type: 'prose',
93
+ md: 'RetireGolden shows after-tax estate in **Results**, **Social Security analysis**, **Optimize**, and **Report**. The projection applies the plan heir-tax rate internally, while **Optimize** exposes a local heir-tax slider so you can test how sensitive a Roth conversion schedule is to that assumption.',
94
+ },
95
+ { type: 'heading', text: 'Common mistakes' },
96
+ {
97
+ type: 'list',
98
+ items: [
99
+ 'Comparing strategies by ending net worth only.',
100
+ 'Assuming the heir tax rate is a fact instead of a sensitivity assumption.',
101
+ 'Reading after-tax estate as a legal estate plan.',
102
+ 'Ignoring beneficiaries, titling, and real-world estate documents because the metric looks tidy.',
103
+ ],
104
+ },
105
+ { type: 'heading', text: 'Where to use this in the app' },
106
+ {
107
+ type: 'prose',
108
+ md: 'Use **Optimize** to compare Roth conversion strategies and test the heir-tax sensitivity used for that optimization run. Use **Results** or **Report** to see ending net worth and after-tax estate side by side.',
109
+ },
110
+ ],
111
+ }