@paro.io/expert-shared-components 1.14.42 → 1.14.45

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 (243) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +2 -2
  3. package/lib/README.md +2 -0
  4. package/lib/components/ClientReferencesSection/DeleteButton.js +11 -11
  5. package/lib/components/ClientReferencesSection/ParoError.js +10 -10
  6. package/lib/components/ClientReferencesSection/TagsSection.js +2 -2
  7. package/lib/components/ClientReferencesSection/styles/BrandedTypography.js +2 -2
  8. package/lib/components/ClientReferencesSection/styles/Buttons.js +15 -15
  9. package/lib/components/ClientReferencesSection/styles/Name.js +5 -5
  10. package/lib/components/ClientReferencesSection/styles/NullContentConditionalColor.js +4 -4
  11. package/lib/components/ClientReferencesSection/styles/SectionBody.js +11 -11
  12. package/lib/components/ClientReferencesSection/styles/SectionTitle.js +6 -6
  13. package/lib/components/ClientReferencesSection/styles/Tags.js +2 -2
  14. package/lib/components/DiscussionThread/DiscussionThread.d.ts +25 -25
  15. package/lib/components/DiscussionThread/DiscussionThread.js +137 -137
  16. package/lib/components/DiscussionThread/chat.d.ts +22 -22
  17. package/lib/components/DiscussionThread/chat.js +106 -106
  18. package/lib/components/DiscussionThread/index.d.ts +1 -1
  19. package/lib/components/DiscussionThread/index.js +5 -5
  20. package/lib/components/DocumentCenter/DocumentTable.d.ts +15 -15
  21. package/lib/components/DocumentCenter/DocumentTable.js +350 -350
  22. package/lib/components/DocumentCenter/DragDropUpload.js +4 -4
  23. package/lib/components/DocumentCenter/MultiFileUploadSection.js +18 -51
  24. package/lib/components/DocumentCenter/UploadFilesButton.d.ts +6 -6
  25. package/lib/components/DocumentCenter/UploadFilesButton.js +29 -29
  26. package/lib/components/EarningsTracker/ActiveProjectCard.d.ts +52 -52
  27. package/lib/components/EarningsTracker/ActiveProjectCard.js +161 -161
  28. package/lib/components/EarningsTracker/CenterCardUI.d.ts +13 -13
  29. package/lib/components/EarningsTracker/CenterCardUI.js +134 -134
  30. package/lib/components/EarningsTracker/EarningsTracker.d.ts +52 -52
  31. package/lib/components/EarningsTracker/EarningsTracker.js +508 -508
  32. package/lib/components/EarningsTracker/EditDateModal.d.ts +22 -22
  33. package/lib/components/EarningsTracker/EditDateModal.js +149 -149
  34. package/lib/components/EarningsTracker/EmailModal.d.ts +14 -14
  35. package/lib/components/EarningsTracker/EmailModal.js +79 -79
  36. package/lib/components/EarningsTracker/EndProjectModal.d.ts +56 -56
  37. package/lib/components/EarningsTracker/EndProjectModal.js +221 -221
  38. package/lib/components/EarningsTracker/LeftCardUI.d.ts +18 -18
  39. package/lib/components/EarningsTracker/LeftCardUI.js +189 -189
  40. package/lib/components/EarningsTracker/LogTimeModalAuthenticated.d.ts +52 -52
  41. package/lib/components/EarningsTracker/LogTimeModalAuthenticated.js +358 -358
  42. package/lib/components/EarningsTracker/ProgressBar.d.ts +4 -4
  43. package/lib/components/EarningsTracker/ProgressBar.js +66 -66
  44. package/lib/components/EarningsTracker/ReviewRequestModal.d.ts +17 -17
  45. package/lib/components/EarningsTracker/ReviewRequestModal.js +135 -135
  46. package/lib/components/EarningsTracker/RightCardUI.d.ts +46 -46
  47. package/lib/components/EarningsTracker/RightCardUI.js +231 -231
  48. package/lib/components/EarningsTracker/index.d.ts +1 -1
  49. package/lib/components/EarningsTracker/index.js +5 -5
  50. package/lib/components/Escalations/CustomTag.d.ts +3 -3
  51. package/lib/components/Escalations/CustomTag.js +25 -25
  52. package/lib/components/Escalations/ViewReponseModal.d.ts +8 -8
  53. package/lib/components/Escalations/ViewReponseModal.js +27 -27
  54. package/lib/components/ExpertProfileHeader/ActionButtonSection.js +6 -6
  55. package/lib/components/ExpertProfileHeader/ProfileSection.js +7 -7
  56. package/lib/components/Invoices/TestDecisionSection.d.ts +1 -1
  57. package/lib/components/Invoices/TestDecisionSection.js +126 -126
  58. package/lib/components/OrganizationChart/OrganizationChart.d.ts +15 -15
  59. package/lib/components/OrganizationChart/OrganizationChart.js +312 -312
  60. package/lib/components/OrganizationChart/PersonCard.js +5 -5
  61. package/lib/components/OrganizationChart/utils.js +79 -79
  62. package/lib/components/ProjectCard/ProgressBar.js +4 -4
  63. package/lib/components/ProjectCard/ReviewRequestModal.js +5 -5
  64. package/lib/components/ProjectIntelligence/MissingInformation/index.js +1 -1
  65. package/lib/components/Reviews/Pagination.js +6 -6
  66. package/lib/components/ReviewsTab/RatingHeader.js +6 -6
  67. package/lib/components/ReviewsTab/expert-shared-components.code-workspace +20 -20
  68. package/lib/components/ReviewsTab/reviewRequestModal.js +5 -5
  69. package/lib/components/shared/Image.js +13 -13
  70. package/lib/components/shared/ProfileTextField.d.ts +18 -18
  71. package/lib/components/shared/ProfileTextField.js +16 -16
  72. package/lib/components/shared/StyledActionButtons.d.ts +7 -7
  73. package/lib/components/shared/StyledActionButtons.js +15 -15
  74. package/lib/components/shared/ToastNotification.d.ts +10 -10
  75. package/lib/components/shared/ToastNotification.js +63 -63
  76. package/lib/index.d.ts +13 -0
  77. package/lib/index.js +27 -1
  78. package/lib/package.json +68 -0
  79. package/lib/tax-axis/components/clientReport/ClientReportCover.d.ts +9 -0
  80. package/lib/tax-axis/components/clientReport/ClientReportCover.js +39 -0
  81. package/lib/tax-axis/components/clientReport/ClientReportTOC.d.ts +8 -0
  82. package/lib/tax-axis/components/clientReport/ClientReportTOC.js +24 -0
  83. package/lib/tax-axis/components/clientReport/ClientReportToolbar.d.ts +2 -0
  84. package/lib/tax-axis/components/clientReport/ClientReportToolbar.js +6 -0
  85. package/lib/tax-axis/components/clientReport/ETRChart.d.ts +10 -0
  86. package/lib/tax-axis/components/clientReport/ETRChart.js +50 -0
  87. package/lib/tax-axis/components/clientReport/ExecutiveSummary.d.ts +15 -0
  88. package/lib/tax-axis/components/clientReport/ExecutiveSummary.js +73 -0
  89. package/lib/tax-axis/components/clientReport/FootnoteBlock.d.ts +11 -0
  90. package/lib/tax-axis/components/clientReport/FootnoteBlock.js +34 -0
  91. package/lib/tax-axis/components/clientReport/ImplementationRoadmap.d.ts +26 -0
  92. package/lib/tax-axis/components/clientReport/ImplementationRoadmap.js +51 -0
  93. package/lib/tax-axis/components/clientReport/ImplementationTimelineChart.d.ts +10 -0
  94. package/lib/tax-axis/components/clientReport/ImplementationTimelineChart.js +49 -0
  95. package/lib/tax-axis/components/clientReport/Methodology.d.ts +10 -0
  96. package/lib/tax-axis/components/clientReport/Methodology.js +40 -0
  97. package/lib/tax-axis/components/clientReport/QuarterlyCashChart.d.ts +10 -0
  98. package/lib/tax-axis/components/clientReport/QuarterlyCashChart.js +56 -0
  99. package/lib/tax-axis/components/clientReport/RecommendedStrategies.d.ts +13 -0
  100. package/lib/tax-axis/components/clientReport/RecommendedStrategies.js +51 -0
  101. package/lib/tax-axis/components/clientReport/SavingsStackChart.d.ts +10 -0
  102. package/lib/tax-axis/components/clientReport/SavingsStackChart.js +66 -0
  103. package/lib/tax-axis/components/clientReport/SectionOpener.d.ts +11 -0
  104. package/lib/tax-axis/components/clientReport/SectionOpener.js +20 -0
  105. package/lib/tax-axis/components/clientReport/Sidebar.d.ts +8 -0
  106. package/lib/tax-axis/components/clientReport/Sidebar.js +37 -0
  107. package/lib/tax-axis/components/clientReport/StrategyCard.d.ts +16 -0
  108. package/lib/tax-axis/components/clientReport/StrategyCard.js +63 -0
  109. package/lib/tax-axis/components/clientReport/TaxAxisClientReport.d.ts +9 -0
  110. package/lib/tax-axis/components/clientReport/TaxAxisClientReport.js +125 -0
  111. package/lib/tax-axis/components/clientReport/applyFootnotes.d.ts +12 -0
  112. package/lib/tax-axis/components/clientReport/applyFootnotes.js +43 -0
  113. package/lib/tax-axis/components/clientReport/palette.d.ts +28 -0
  114. package/lib/tax-axis/components/clientReport/palette.js +34 -0
  115. package/lib/tax-axis/components/dashboard/ConfidenceArc.d.ts +7 -0
  116. package/lib/tax-axis/components/dashboard/ConfidenceArc.js +20 -0
  117. package/lib/tax-axis/components/dashboard/DashboardActions.d.ts +13 -0
  118. package/lib/tax-axis/components/dashboard/DashboardActions.js +96 -0
  119. package/lib/tax-axis/components/dashboard/DashboardSummary.d.ts +11 -0
  120. package/lib/tax-axis/components/dashboard/DashboardSummary.js +98 -0
  121. package/lib/tax-axis/components/dashboard/DashboardTopBar.d.ts +10 -0
  122. package/lib/tax-axis/components/dashboard/DashboardTopBar.js +48 -0
  123. package/lib/tax-axis/components/dashboard/StrategyDetailPanel.d.ts +10 -0
  124. package/lib/tax-axis/components/dashboard/StrategyDetailPanel.js +139 -0
  125. package/lib/tax-axis/components/dashboard/StrategyTile.d.ts +10 -0
  126. package/lib/tax-axis/components/dashboard/StrategyTile.js +82 -0
  127. package/lib/tax-axis/components/dashboard/TaxAxisDashboard.d.ts +12 -0
  128. package/lib/tax-axis/components/dashboard/TaxAxisDashboard.js +284 -0
  129. package/lib/tax-axis/components/dashboard/useCountUp.d.ts +1 -0
  130. package/lib/tax-axis/components/dashboard/useCountUp.js +25 -0
  131. package/lib/tax-axis/components/documents/DocumentCard.d.ts +18 -0
  132. package/lib/tax-axis/components/documents/DocumentCard.js +61 -0
  133. package/lib/tax-axis/components/documents/DocumentTier.d.ts +21 -0
  134. package/lib/tax-axis/components/documents/DocumentTier.js +23 -0
  135. package/lib/tax-axis/components/documents/TaxAxisDocuments.d.ts +8 -0
  136. package/lib/tax-axis/components/documents/TaxAxisDocuments.js +157 -0
  137. package/lib/tax-axis/components/extractionReview/DocumentCard.d.ts +17 -0
  138. package/lib/tax-axis/components/extractionReview/DocumentCard.js +105 -0
  139. package/lib/tax-axis/components/extractionReview/FieldRow.d.ts +17 -0
  140. package/lib/tax-axis/components/extractionReview/FieldRow.js +137 -0
  141. package/lib/tax-axis/components/extractionReview/PurposeBlock.d.ts +7 -0
  142. package/lib/tax-axis/components/extractionReview/PurposeBlock.js +18 -0
  143. package/lib/tax-axis/components/extractionReview/RerunFooter.d.ts +8 -0
  144. package/lib/tax-axis/components/extractionReview/RerunFooter.js +60 -0
  145. package/lib/tax-axis/components/extractionReview/TaxAxisExtractionReview.d.ts +11 -0
  146. package/lib/tax-axis/components/extractionReview/TaxAxisExtractionReview.js +186 -0
  147. package/lib/tax-axis/components/intake/ClientParametersSection.d.ts +7 -0
  148. package/lib/tax-axis/components/intake/ClientParametersSection.js +146 -0
  149. package/lib/tax-axis/components/intake/CpaIntakeQuestionsSection.d.ts +7 -0
  150. package/lib/tax-axis/components/intake/CpaIntakeQuestionsSection.js +93 -0
  151. package/lib/tax-axis/components/intake/IntakeCtaCards.d.ts +9 -0
  152. package/lib/tax-axis/components/intake/IntakeCtaCards.js +30 -0
  153. package/lib/tax-axis/components/intake/RefineAnalysisSection.d.ts +7 -0
  154. package/lib/tax-axis/components/intake/RefineAnalysisSection.js +151 -0
  155. package/lib/tax-axis/components/intake/StateMultiSelect.d.ts +7 -0
  156. package/lib/tax-axis/components/intake/StateMultiSelect.js +90 -0
  157. package/lib/tax-axis/components/intake/StrategyRadar.d.ts +7 -0
  158. package/lib/tax-axis/components/intake/StrategyRadar.js +240 -0
  159. package/lib/tax-axis/components/intake/TaxAxisIntake.d.ts +8 -0
  160. package/lib/tax-axis/components/intake/TaxAxisIntake.js +38 -0
  161. package/lib/tax-axis/components/intake/intakeSchema.d.ts +97 -0
  162. package/lib/tax-axis/components/intake/intakeSchema.js +91 -0
  163. package/lib/tax-axis/components/preparerWorkpaper/CalculationTraceAccordion.d.ts +9 -0
  164. package/lib/tax-axis/components/preparerWorkpaper/CalculationTraceAccordion.js +19 -0
  165. package/lib/tax-axis/components/preparerWorkpaper/EngagementHeader.d.ts +9 -0
  166. package/lib/tax-axis/components/preparerWorkpaper/EngagementHeader.js +43 -0
  167. package/lib/tax-axis/components/preparerWorkpaper/Position6694Accordion.d.ts +9 -0
  168. package/lib/tax-axis/components/preparerWorkpaper/Position6694Accordion.js +25 -0
  169. package/lib/tax-axis/components/preparerWorkpaper/PriorityGroup.d.ts +14 -0
  170. package/lib/tax-axis/components/preparerWorkpaper/PriorityGroup.js +20 -0
  171. package/lib/tax-axis/components/preparerWorkpaper/Section6694Summary.d.ts +9 -0
  172. package/lib/tax-axis/components/preparerWorkpaper/Section6694Summary.js +36 -0
  173. package/lib/tax-axis/components/preparerWorkpaper/SourceDocumentsAccordion.d.ts +9 -0
  174. package/lib/tax-axis/components/preparerWorkpaper/SourceDocumentsAccordion.js +20 -0
  175. package/lib/tax-axis/components/preparerWorkpaper/StrategyWorkpaperCard.d.ts +14 -0
  176. package/lib/tax-axis/components/preparerWorkpaper/StrategyWorkpaperCard.js +53 -0
  177. package/lib/tax-axis/components/preparerWorkpaper/TaxAxisPreparerWorkpaper.d.ts +9 -0
  178. package/lib/tax-axis/components/preparerWorkpaper/TaxAxisPreparerWorkpaper.js +175 -0
  179. package/lib/tax-axis/components/presentationMode/TaxAxisPresentationMode.d.ts +7 -0
  180. package/lib/tax-axis/components/presentationMode/TaxAxisPresentationMode.js +245 -0
  181. package/lib/tax-axis/components/processing/ProcessingStages.d.ts +7 -0
  182. package/lib/tax-axis/components/processing/ProcessingStages.js +17 -0
  183. package/lib/tax-axis/components/processing/TaxAxisProcessing.d.ts +7 -0
  184. package/lib/tax-axis/components/processing/TaxAxisProcessing.js +105 -0
  185. package/lib/tax-axis/components/prospectReport/ProspectCover.d.ts +10 -0
  186. package/lib/tax-axis/components/prospectReport/ProspectCover.js +47 -0
  187. package/lib/tax-axis/components/prospectReport/ProspectDocuments.d.ts +9 -0
  188. package/lib/tax-axis/components/prospectReport/ProspectDocuments.js +31 -0
  189. package/lib/tax-axis/components/prospectReport/ProspectNextSteps.d.ts +13 -0
  190. package/lib/tax-axis/components/prospectReport/ProspectNextSteps.js +37 -0
  191. package/lib/tax-axis/components/prospectReport/ProspectPrintView.d.ts +26 -0
  192. package/lib/tax-axis/components/prospectReport/ProspectPrintView.js +183 -0
  193. package/lib/tax-axis/components/prospectReport/ProspectStrategyCard.d.ts +10 -0
  194. package/lib/tax-axis/components/prospectReport/ProspectStrategyCard.js +52 -0
  195. package/lib/tax-axis/components/prospectReport/SampleAnalysisPreview.d.ts +7 -0
  196. package/lib/tax-axis/components/prospectReport/SampleAnalysisPreview.js +120 -0
  197. package/lib/tax-axis/components/prospectReport/TaxAxisProspectReport.d.ts +9 -0
  198. package/lib/tax-axis/components/prospectReport/TaxAxisProspectReport.js +173 -0
  199. package/lib/tax-axis/components/prospectReport/TaxPositionGap.d.ts +15 -0
  200. package/lib/tax-axis/components/prospectReport/TaxPositionGap.js +45 -0
  201. package/lib/tax-axis/components/prospectReport/theme.d.ts +26 -0
  202. package/lib/tax-axis/components/prospectReport/theme.js +33 -0
  203. package/lib/tax-axis/components/shared/ReportToolbar.d.ts +12 -0
  204. package/lib/tax-axis/components/shared/ReportToolbar.js +81 -0
  205. package/lib/tax-axis/components/shared/SectionHeader.d.ts +8 -0
  206. package/lib/tax-axis/components/shared/SectionHeader.js +15 -0
  207. package/lib/tax-axis/components/shared/TaxAxisBadge.d.ts +12 -0
  208. package/lib/tax-axis/components/shared/TaxAxisBadge.js +34 -0
  209. package/lib/tax-axis/components/shared/TaxAxisButton.d.ts +12 -0
  210. package/lib/tax-axis/components/shared/TaxAxisButton.js +17 -0
  211. package/lib/tax-axis/components/shared/TaxAxisCard.d.ts +9 -0
  212. package/lib/tax-axis/components/shared/TaxAxisCard.js +13 -0
  213. package/lib/tax-axis/index.d.ts +25 -0
  214. package/lib/tax-axis/index.js +51 -0
  215. package/lib/tax-axis/lib/compute/index.d.ts +8 -0
  216. package/lib/tax-axis/lib/compute/index.js +163 -0
  217. package/lib/tax-axis/lib/data/documents.d.ts +3 -0
  218. package/lib/tax-axis/lib/data/documents.js +33 -0
  219. package/lib/tax-axis/lib/data/extractedData.d.ts +2 -0
  220. package/lib/tax-axis/lib/data/extractedData.js +47 -0
  221. package/lib/tax-axis/lib/data/footnoteData.d.ts +2 -0
  222. package/lib/tax-axis/lib/data/footnoteData.js +48 -0
  223. package/lib/tax-axis/lib/data/index.d.ts +11 -0
  224. package/lib/tax-axis/lib/data/index.js +31 -0
  225. package/lib/tax-axis/lib/data/nextSteps.d.ts +2 -0
  226. package/lib/tax-axis/lib/data/nextSteps.js +35 -0
  227. package/lib/tax-axis/lib/data/sidebarLookup.d.ts +2 -0
  228. package/lib/tax-axis/lib/data/sidebarLookup.js +90 -0
  229. package/lib/tax-axis/lib/data/sourceDescriptions.d.ts +1 -0
  230. package/lib/tax-axis/lib/data/sourceDescriptions.js +32 -0
  231. package/lib/tax-axis/lib/data/states.d.ts +6 -0
  232. package/lib/tax-axis/lib/data/states.js +25 -0
  233. package/lib/tax-axis/lib/data/strategies.d.ts +8 -0
  234. package/lib/tax-axis/lib/data/strategies.js +166 -0
  235. package/lib/tax-axis/lib/data/strategyNarrative.d.ts +3 -0
  236. package/lib/tax-axis/lib/data/strategyNarrative.js +170 -0
  237. package/lib/tax-axis/lib/data/strategyProspect.d.ts +2 -0
  238. package/lib/tax-axis/lib/data/strategyProspect.js +66 -0
  239. package/lib/tax-axis/lib/data/workpaperInteractions.d.ts +1 -0
  240. package/lib/tax-axis/lib/data/workpaperInteractions.js +15 -0
  241. package/lib/tax-axis/lib/types/index.d.ts +183 -0
  242. package/lib/tax-axis/lib/types/index.js +7 -0
  243. package/package.json +68 -67
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.StrategyDetailPanel = StrategyDetailPanel;
7
+ const react_1 = __importDefault(require("react"));
8
+ const data_1 = require("../../lib/data");
9
+ const TaxAxisBadge_1 = require("../shared/TaxAxisBadge");
10
+ function Sec({ title, children }) {
11
+ return (react_1.default.createElement("div", { className: "mb-6" },
12
+ react_1.default.createElement("div", { className: "text-[11px] font-bold text-tax-axis-teal-light uppercase tracking-widest mb-2.5 font-tax-axis-mono" }, title),
13
+ children));
14
+ }
15
+ const fmtK = (n) => `$${(n / 1000).toFixed(n % 1000 ? 1 : 0)}K`;
16
+ function StrategyDetailPanel({ s, profile, computed, onClose }) {
17
+ var _a, _b, _c, _d, _e, _f;
18
+ const narr = data_1.STRATEGY_NARRATIVE[s.rank];
19
+ const c = computed === null || computed === void 0 ? void 0 : computed.get(s.rank);
20
+ const lo = (_a = c === null || c === void 0 ? void 0 : c.lo) !== null && _a !== void 0 ? _a : s.lo;
21
+ const hi = (_b = c === null || c === void 0 ? void 0 : c.hi) !== null && _b !== void 0 ? _b : s.hi;
22
+ const sources = (_d = (_c = c === null || c === void 0 ? void 0 : c.sources) !== null && _c !== void 0 ? _c : s.sources) !== null && _d !== void 0 ? _d : [];
23
+ const trace = (_f = (_e = c === null || c === void 0 ? void 0 : c.trace) !== null && _e !== void 0 ? _e : s.trace) !== null && _f !== void 0 ? _f : [];
24
+ const whyText = narr ? narr.whyMatters(profile) : data_1.NARRATIVE_FALLBACK.whyMatters(s);
25
+ const breakdownText = narr ? narr.breakdown(profile, c) : data_1.NARRATIVE_FALLBACK.breakdown(s, c);
26
+ const specialistText = (narr === null || narr === void 0 ? void 0 : narr.whySpecialist) || data_1.NARRATIVE_FALLBACK.whySpecialist(s);
27
+ const nextText = narr ? narr.nextSteps : data_1.NARRATIVE_FALLBACK.nextSteps(s);
28
+ return (react_1.default.createElement(react_1.default.Fragment, null,
29
+ react_1.default.createElement("div", { onClick: onClose, className: "fixed inset-0 z-[200]", style: { background: "rgba(6,8,33,0.7)", backdropFilter: "blur(4px)" } }),
30
+ react_1.default.createElement("div", { className: "fixed top-0 right-0 bottom-0 z-[201] flex flex-col", style: {
31
+ width: 520,
32
+ maxWidth: "calc(100vw - 24px)",
33
+ background: "#0E1132",
34
+ borderLeft: "1px solid rgba(36,131,132,0.12)",
35
+ boxShadow: "-8px 0 40px rgba(6,8,33,0.6)",
36
+ } },
37
+ react_1.default.createElement("div", { className: "px-6 py-5 flex-shrink-0", style: { borderBottom: "1px solid rgba(36,131,132,0.12)" } },
38
+ react_1.default.createElement("div", { className: "flex justify-between items-start mb-3" },
39
+ react_1.default.createElement("div", null,
40
+ react_1.default.createElement("div", { className: "flex items-center gap-2 mb-1.5" },
41
+ react_1.default.createElement("span", { className: "text-xl font-bold text-tax-axis-text font-tax-axis-head" }, s.name),
42
+ react_1.default.createElement("span", { className: "text-[11px] font-tax-axis-mono text-tax-axis-teal-light bg-tax-axis-teal-bg px-2 py-0.5 rounded" }, s.code)),
43
+ react_1.default.createElement("div", { className: "flex gap-2" },
44
+ react_1.default.createElement(TaxAxisBadge_1.TaxAxisBadge, null, s.priority),
45
+ react_1.default.createElement(TaxAxisBadge_1.TaxAxisBadge, { color: "neutral" }, s.timeline),
46
+ s.cost && s.cost !== "$0" && (react_1.default.createElement(TaxAxisBadge_1.TaxAxisBadge, { color: "orange" }, s.cost)))),
47
+ react_1.default.createElement("button", { onClick: onClose, className: "flex items-center justify-center w-8 h-8 rounded-lg", style: { background: "#1A1D3A", border: "1px solid rgba(36,131,132,0.12)" } },
48
+ react_1.default.createElement("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none" },
49
+ react_1.default.createElement("path", { d: "M2.5 2.5l7 7M9.5 2.5l-7 7", stroke: "#9498B8", strokeWidth: "1.5", strokeLinecap: "round" })))),
50
+ react_1.default.createElement("div", { className: "font-tax-axis-head", style: { fontSize: 34, fontWeight: 900, color: "#A1E5E6", letterSpacing: "-1.5px" } },
51
+ fmtK(lo),
52
+ "\u2013",
53
+ fmtK(hi),
54
+ react_1.default.createElement("span", { className: "text-[13px] text-tax-axis-text-3 font-normal font-tax-axis-body ml-2" }, "est. annual savings"))),
55
+ react_1.default.createElement("div", { className: "flex-1 overflow-y-auto p-6" },
56
+ s.warning && (react_1.default.createElement("div", { className: "p-3 rounded-lg mb-6 text-xs leading-relaxed", style: {
57
+ background: "rgba(251,154,29,0.06)",
58
+ border: "1px solid rgba(251,154,29,0.25)",
59
+ color: "#FB9A1D",
60
+ } },
61
+ react_1.default.createElement("strong", null, "Flag: "),
62
+ s.warning)),
63
+ react_1.default.createElement("div", { className: "mb-6" },
64
+ react_1.default.createElement("div", { className: "text-[11px] font-bold uppercase tracking-widest text-tax-axis-text-4 mb-2 font-tax-axis-mono" }, "WHY THIS MATTERS"),
65
+ react_1.default.createElement("div", { className: "text-[13px] text-tax-axis-text-2 leading-[1.75] font-tax-axis-body" }, whyText)),
66
+ react_1.default.createElement("div", { className: "mb-6" },
67
+ react_1.default.createElement("div", { className: "text-[11px] font-bold uppercase tracking-widest text-tax-axis-text-4 mb-2 font-tax-axis-mono" }, "HOW SAVINGS BREAK DOWN"),
68
+ react_1.default.createElement("div", { className: "text-[13px] text-tax-axis-text-2 leading-[1.75] font-tax-axis-body" }, breakdownText)),
69
+ react_1.default.createElement("div", { className: "mb-6 pl-3.5 py-0.5", style: { borderLeft: "3px solid #FB9A1D" } },
70
+ react_1.default.createElement("div", { className: "text-[11px] font-bold uppercase tracking-widest mb-2 font-tax-axis-mono", style: { color: "#FB9A1D" } }, "WHY YOU NEED A SPECIALIST"),
71
+ react_1.default.createElement("div", { className: "text-[13px] text-tax-axis-text-2 leading-[1.75] font-tax-axis-body" }, specialistText)),
72
+ react_1.default.createElement("div", { className: "rounded-lg p-3 mb-6", style: { background: "rgba(36,131,132,0.06)", border: "1px solid rgba(36,131,132,0.2)" } },
73
+ react_1.default.createElement("div", { className: "text-[11px] font-bold uppercase tracking-widest text-tax-axis-teal-light mb-1.5 font-tax-axis-mono" }, "WHAT WE'D DO NEXT"),
74
+ react_1.default.createElement("div", { className: "text-[13px] text-tax-axis-text leading-[1.7] font-tax-axis-body" }, typeof nextText === "string" ? nextText : "Provide documents so we can calculate exact savings.")),
75
+ react_1.default.createElement(Sec, { title: "Summary" },
76
+ react_1.default.createElement("p", { className: "text-sm text-tax-axis-text leading-[1.8] font-tax-axis-body" }, s.abstract)),
77
+ react_1.default.createElement(Sec, { title: "Plain Language" },
78
+ react_1.default.createElement("div", { className: "p-3.5 rounded-[10px]", style: { background: "rgba(36,131,132,0.06)", border: "1px solid rgba(36,131,132,0.2)" } },
79
+ react_1.default.createElement("p", { className: "text-sm text-tax-axis-teal-light leading-[1.7] font-tax-axis-body italic" },
80
+ "\u201C",
81
+ s.clientBrief,
82
+ "\u201D"))),
83
+ react_1.default.createElement(Sec, { title: "Source Documents" },
84
+ react_1.default.createElement("div", { className: "rounded-[10px] overflow-hidden", style: { border: "1px solid rgba(36,131,132,0.12)" } },
85
+ react_1.default.createElement("div", { className: "grid grid-cols-[1.2fr_1fr_.8fr_.8fr] px-3.5 py-2.5", style: { background: "#161938" } }, ["Field", "Document", "Line", "Value"].map((h) => (react_1.default.createElement("span", { key: h, className: "text-[10px] font-semibold text-tax-axis-text-3 uppercase tracking-wider font-tax-axis-mono" }, h)))),
86
+ sources.map((src, i) => (react_1.default.createElement("div", { key: i, className: "grid grid-cols-[1.2fr_1fr_.8fr_.8fr] px-3.5 py-2.5", style: { borderTop: "1px solid rgba(36,131,132,0.12)" } },
87
+ react_1.default.createElement("span", { className: "text-xs text-tax-axis-text" }, src.field),
88
+ react_1.default.createElement("span", { className: "text-[11px] font-tax-axis-mono text-tax-axis-text-2" }, src.doc),
89
+ react_1.default.createElement("span", { className: "text-[11px] font-tax-axis-mono text-tax-axis-text-2" }, src.line),
90
+ react_1.default.createElement("span", { className: "text-[13px] font-semibold text-tax-axis-teal-light font-tax-axis-mono" }, src.value)))))),
91
+ react_1.default.createElement(Sec, { title: "Calculation Trace" },
92
+ react_1.default.createElement("div", { className: "rounded-[10px] overflow-hidden", style: { border: "1px solid rgba(36,131,132,0.12)" } },
93
+ trace.map((t, i) => (react_1.default.createElement("div", { key: i, className: "p-3 flex gap-3 items-start", style: { borderTop: i ? "1px solid rgba(36,131,132,0.12)" : "none" } },
94
+ react_1.default.createElement("span", { className: "text-[11px] font-bold text-tax-axis-teal font-tax-axis-mono w-5 flex-shrink-0" }, t.n),
95
+ react_1.default.createElement("div", { className: "flex-1" },
96
+ react_1.default.createElement("div", { className: "text-[13px] font-medium text-tax-axis-text font-tax-axis-body mb-0.5" }, t.step),
97
+ react_1.default.createElement("div", { className: "text-[11px] font-tax-axis-mono text-tax-axis-text-2" }, t.formula)),
98
+ react_1.default.createElement("div", { className: "text-right flex-shrink-0" },
99
+ react_1.default.createElement("div", { className: "text-[13px] font-bold text-tax-axis-teal-light font-tax-axis-mono" }, t.result),
100
+ react_1.default.createElement("div", { className: "text-[9px] text-tax-axis-text-3 font-tax-axis-mono mt-0.5" }, t.src))))),
101
+ react_1.default.createElement("div", { className: "p-3.5", style: { borderTop: "1px solid rgba(36,131,132,0.12)", background: "#161938" } },
102
+ react_1.default.createElement("div", { className: "text-[10px] font-bold text-tax-axis-teal-light uppercase tracking-widest mb-2 font-tax-axis-mono" }, "Derivation"),
103
+ react_1.default.createElement("div", { className: "flex items-center gap-2 flex-wrap" }, trace.map((t, i) => (react_1.default.createElement("span", { key: i, className: "flex items-center gap-1.5" },
104
+ react_1.default.createElement("span", { className: "text-xs font-tax-axis-mono text-tax-axis-text px-2 py-0.5 rounded", style: { background: "#1A1D3A", border: "1px solid rgba(36,131,132,0.12)" } }, t.result),
105
+ i < trace.length - 1 && (react_1.default.createElement("span", { className: "text-[11px] text-tax-axis-text-3 font-tax-axis-mono" }, "\u2192")))))),
106
+ trace.length > 1 && (react_1.default.createElement("div", { className: "mt-2 text-xs font-tax-axis-mono p-2 rounded-md leading-relaxed", style: { background: "#1A1D3A", border: "1px solid rgba(36,131,132,0.12)" } },
107
+ react_1.default.createElement("span", { className: "text-tax-axis-text-2" }, "Result: "),
108
+ react_1.default.createElement("span", { className: "font-semibold text-tax-axis-teal-light" }, trace[trace.length - 1].result),
109
+ react_1.default.createElement("span", { className: "text-tax-axis-text-2" }, " via "),
110
+ react_1.default.createElement("span", { className: "text-tax-axis-text" }, trace[trace.length - 1].formula)))))),
111
+ react_1.default.createElement(Sec, { title: "IRS Authority" },
112
+ react_1.default.createElement("div", { className: "p-3.5 rounded-[10px] mb-3", style: { background: "#1A1D3A", border: "1px solid rgba(36,131,132,0.12)" } },
113
+ react_1.default.createElement("div", { className: "text-[13px] font-tax-axis-mono text-tax-axis-text mb-1" }, s.authority),
114
+ react_1.default.createElement("div", { className: "text-[11px] text-tax-axis-text-2" },
115
+ "Forms: ",
116
+ react_1.default.createElement("span", { className: "font-tax-axis-mono text-tax-axis-text" }, s.forms))),
117
+ react_1.default.createElement("div", { className: "rounded-[10px] overflow-hidden", style: { background: "rgba(36,131,132,0.06)", border: "1px solid rgba(36,131,132,0.2)" } },
118
+ react_1.default.createElement("div", { className: "p-3 flex gap-3 items-center", style: { borderBottom: "1px solid rgba(36,131,132,0.15)" } },
119
+ react_1.default.createElement("div", { className: "flex gap-[3px]" }, [1, 2, 3, 4, 5].map((i) => (react_1.default.createElement("div", { key: i, className: "w-2 h-2 rounded-sm", style: { background: i <= 4 ? "#248384" : "rgba(36,131,132,0.2)" } })))),
120
+ react_1.default.createElement("span", { className: "text-[13px] font-semibold text-tax-axis-teal-light font-tax-axis-head" }, "Substantial Authority \u00B7 Low \u00A76694 Risk")),
121
+ react_1.default.createElement("div", { className: "p-3" },
122
+ react_1.default.createElement("p", { className: "text-xs text-tax-axis-text leading-[1.7] font-tax-axis-body mb-2" }, "IRC \u00A76694 imposes penalties on preparers who sign off on positions that lack sufficient legal support. There are two tiers:"),
123
+ react_1.default.createElement("div", { className: "grid gap-1.5 mb-2.5" },
124
+ react_1.default.createElement("div", { className: "p-2 rounded-md", style: { background: "#1A1D3A", border: "1px solid rgba(36,131,132,0.12)" } },
125
+ react_1.default.createElement("div", { className: "text-[11px] font-semibold text-tax-axis-text font-tax-axis-head mb-0.5" }, "Tier 1 \u2014 Unreasonable Position"),
126
+ react_1.default.createElement("div", { className: "text-[11px] text-tax-axis-text-2 leading-relaxed font-tax-axis-body" }, "If a position lacks \u201Csubstantial authority\u201D (~40% chance of being sustained), the preparer faces the greater of $1,000 or 50% of the fee earned from that return.")),
127
+ react_1.default.createElement("div", { className: "p-2 rounded-md", style: { background: "#1A1D3A", border: "1px solid rgba(36,131,132,0.12)" } },
128
+ react_1.default.createElement("div", { className: "text-[11px] font-semibold text-tax-axis-text font-tax-axis-head mb-0.5" }, "Tier 2 \u2014 Willful or Reckless Conduct"),
129
+ react_1.default.createElement("div", { className: "text-[11px] text-tax-axis-text-2 leading-relaxed font-tax-axis-body" }, "If the preparer knowingly disregards rules or regulations, the penalty is the greater of $5,000 or 75% of the fee earned."))),
130
+ react_1.default.createElement("div", { className: "p-2 rounded-md flex gap-2 items-start", style: { background: "rgba(15,110,86,0.06)", border: "1px solid rgba(15,110,86,0.15)" } },
131
+ react_1.default.createElement("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", className: "flex-shrink-0 mt-0.5" },
132
+ react_1.default.createElement("path", { d: "M2.5 7l3.5 3.5 5.5-6", stroke: "#0F6E56", strokeWidth: "1.5", strokeLinecap: "round" })),
133
+ react_1.default.createElement("div", { className: "text-[11px] text-tax-axis-text leading-relaxed font-tax-axis-body" },
134
+ react_1.default.createElement("strong", { style: { color: "#0F6E56" } }, "This strategy holds Substantial Authority"),
135
+ " \u2014 established IRS guidance, published revenue rulings, or settled case law support this position. Signing off on this carries low preparer penalty exposure under \u00A76694(a).")))))),
136
+ react_1.default.createElement("div", { className: "px-6 py-4 flex-shrink-0", style: { borderTop: "1px solid rgba(36,131,132,0.12)", background: "#0E1132" } },
137
+ react_1.default.createElement("div", { className: "text-[11px] text-tax-axis-text-3 mb-2" }, "Recommended action:"),
138
+ react_1.default.createElement("div", { className: "text-sm font-medium text-tax-axis-text" }, s.action)))));
139
+ }
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ import { Strategy } from "../../lib/types";
3
+ interface StrategyTileProps {
4
+ s: Strategy;
5
+ delay: number;
6
+ onClick: () => void;
7
+ maxSavings: number;
8
+ }
9
+ export declare function StrategyTile({ s, delay, onClick, maxSavings }: StrategyTileProps): React.JSX.Element;
10
+ export {};
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.StrategyTile = StrategyTile;
27
+ const react_1 = __importStar(require("react"));
28
+ const TaxAxisBadge_1 = require("../shared/TaxAxisBadge");
29
+ const ConfidenceArc_1 = require("./ConfidenceArc");
30
+ const fmt = (n) => `$${(n / 1000).toFixed(n % 1000 ? 1 : 0)}K`;
31
+ function StrategyTile({ s, delay, onClick, maxSavings }) {
32
+ var _a, _b, _c, _d;
33
+ const [hov, setHov] = (0, react_1.useState)(false);
34
+ const w = (((_a = s.hi) !== null && _a !== void 0 ? _a : 0) / maxSavings) * 100;
35
+ return (react_1.default.createElement("button", { onClick: onClick, onMouseEnter: () => setHov(true), onMouseLeave: () => setHov(false), className: "w-full text-left overflow-hidden p-0", style: {
36
+ background: "#0E1132",
37
+ border: `1px solid ${hov ? "rgba(36,131,132,0.35)" : "rgba(36,131,132,0.12)"}`,
38
+ borderRadius: 14,
39
+ boxShadow: hov
40
+ ? "0 0 30px rgba(36,131,132,0.12), 0 4px 20px rgba(6,8,33,0.3)"
41
+ : "0 2px 8px rgba(6,8,33,0.3)",
42
+ transition: "all .25s",
43
+ transform: hov ? "translateY(-2px)" : "none",
44
+ animationDelay: `${delay}s`,
45
+ } },
46
+ react_1.default.createElement("div", { className: "px-5 pt-[18px] pb-3.5" },
47
+ react_1.default.createElement("div", { className: "flex items-start justify-between gap-3 mb-3" },
48
+ react_1.default.createElement("div", { className: "flex-1" },
49
+ react_1.default.createElement("div", { className: "flex items-center gap-2 mb-1.5 flex-wrap" },
50
+ react_1.default.createElement("span", { className: "text-[15px] font-bold text-tax-axis-text font-tax-axis-head" }, s.name),
51
+ react_1.default.createElement("span", { className: "text-[10px] font-tax-axis-mono text-tax-axis-teal-light bg-tax-axis-teal-bg px-1.5 py-0.5 rounded-sm" }, s.code),
52
+ s.priority === "QUICK WIN" && (react_1.default.createElement(TaxAxisBadge_1.TaxAxisBadge, { color: "orange", size: "xs" }, "Quick Win")),
53
+ s.cat === "obbba_new" && (react_1.default.createElement(TaxAxisBadge_1.TaxAxisBadge, { color: "orange", size: "xs" }, "OBBBA"))),
54
+ react_1.default.createElement("div", { className: "flex items-center gap-2" },
55
+ react_1.default.createElement("span", { className: "inline-block w-1.5 h-1.5 rounded-full", style: {
56
+ background: s.timelineBucket === "now"
57
+ ? "#248384"
58
+ : s.timelineBucket === "30d"
59
+ ? "#FB9A1D"
60
+ : "#8B5CF6",
61
+ } }),
62
+ react_1.default.createElement("span", { className: "text-[11px] text-tax-axis-text-3 font-tax-axis-body" }, s.timeline))),
63
+ react_1.default.createElement(ConfidenceArc_1.ConfidenceArc, { score: s.score, size: 40 })),
64
+ react_1.default.createElement("div", { className: "mb-2.5" },
65
+ react_1.default.createElement("span", { className: "text-[26px] font-bold text-tax-axis-teal-light font-tax-axis-head tracking-tight" },
66
+ fmt(s.lo),
67
+ "\u2013",
68
+ fmt(s.hi)),
69
+ react_1.default.createElement("span", { className: "text-[11px] text-tax-axis-text-3 ml-2" }, "est. savings")),
70
+ react_1.default.createElement("div", { className: "h-1 bg-tax-axis-surface-2 rounded-sm overflow-hidden" },
71
+ react_1.default.createElement("div", { className: "h-full rounded-sm", style: {
72
+ width: `${w}%`,
73
+ background: "linear-gradient(90deg, #248384, #A1E5E6)",
74
+ transition: "width 0.8s cubic-bezier(.16,1,.3,1)",
75
+ } }))),
76
+ react_1.default.createElement("div", { className: "px-5 py-2.5 flex justify-between items-center", style: { borderTop: "1px solid rgba(36,131,132,0.12)" } },
77
+ react_1.default.createElement("span", { className: "text-[11px] text-tax-axis-text-2 font-tax-axis-body truncate max-w-[200px]" }, (_b = s.action) === null || _b === void 0 ? void 0 :
78
+ _b.substring(0, 50),
79
+ ((_d = (_c = s.action) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0) > 50 ? "..." : ""),
80
+ react_1.default.createElement("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", style: { opacity: 0.4 } },
81
+ react_1.default.createElement("path", { d: "M5 3l4 4-4 4", stroke: "#C5C9E0", strokeWidth: "1.5", strokeLinecap: "round" })))));
82
+ }
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ import type { ClientProfile, TaxAxisScreenProps } from "../../lib/types";
3
+ export interface TaxAxisDashboardProps extends TaxAxisScreenProps {
4
+ profile: ClientProfile;
5
+ onDownloadClient: () => void;
6
+ onDownloadPreparer: () => void;
7
+ onPresent: () => void;
8
+ onSend: () => void;
9
+ onReset: () => void;
10
+ onReviewData?: () => void;
11
+ }
12
+ export declare function TaxAxisDashboard({ profile, onDownloadClient, onDownloadPreparer, onPresent, onSend, onReset, onReviewData, userContext: _userContext, }: TaxAxisDashboardProps): React.JSX.Element;
@@ -0,0 +1,284 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.TaxAxisDashboard = TaxAxisDashboard;
27
+ const react_1 = __importStar(require("react"));
28
+ const data_1 = require("../../lib/data");
29
+ const compute_1 = require("../../lib/compute");
30
+ const TaxAxisButton_1 = require("../shared/TaxAxisButton");
31
+ const TaxAxisBadge_1 = require("../shared/TaxAxisBadge");
32
+ const DashboardSummary_1 = require("./DashboardSummary");
33
+ const DashboardTopBar_1 = require("./DashboardTopBar");
34
+ const DashboardActions_1 = require("./DashboardActions");
35
+ const StrategyTile_1 = require("./StrategyTile");
36
+ const StrategyDetailPanel_1 = require("./StrategyDetailPanel");
37
+ // ─── Formatting helper ──────────────────────────────────────────
38
+ const fmtK = (n) => `$${(n / 1000).toFixed(n % 1000 ? 1 : 0)}K`;
39
+ // ─── Timeline buckets for Client Summary ────────────────────────
40
+ const BUCKETS = [
41
+ { key: "now", label: "Act Now", desc: "Claim on your return or adjust this pay period" },
42
+ { key: "30d", label: "Within 30 Days", desc: "Documentation or payroll changes" },
43
+ { key: "90d", label: "Within 90 Days", desc: "Structural changes — new accounts or plan setup" },
44
+ ];
45
+ function TaxAxisDashboard({ profile, onDownloadClient, onDownloadPreparer, onPresent, onSend, onReset, onReviewData, userContext: _userContext = "expert", }) {
46
+ // ─── Derived data ──────────────────────────────────────────────
47
+ const computed = (0, react_1.useMemo)(() => (0, compute_1.computeAllStrategies)(profile), [profile]);
48
+ const dashEligible = (0, react_1.useMemo)(() => (0, compute_1.filterEligibleStrategies)(profile), [profile]);
49
+ const maxSavings = Math.max(...dashEligible.map((s) => { var _a, _b; return (_b = (_a = computed.get(s.rank)) === null || _a === void 0 ? void 0 : _a.hi) !== null && _b !== void 0 ? _b : s.hi; }), 1);
50
+ // ─── State ─────────────────────────────────────────────────────
51
+ const [topTab, setTopTab] = (0, react_1.useState)("extraction");
52
+ const [reportTab, setReportTab] = (0, react_1.useState)("report");
53
+ const [chartExpanded, setChartExpanded] = (0, react_1.useState)(false);
54
+ const [selected, setSelected] = (0, react_1.useState)(null);
55
+ const [dataConfirmed, setDataConfirmed] = (0, react_1.useState)(false);
56
+ const [reviewStatus, setReviewStatus] = (0, react_1.useState)({
57
+ unreviewed: data_1.EXTRACTED_DATA.reduce((a, d) => a + d.flagCount, 0),
58
+ edits: 0,
59
+ });
60
+ // Restore confirmed state on mount — flag persists until session reset
61
+ (0, react_1.useEffect)(() => {
62
+ if (typeof window !== "undefined" && sessionStorage.getItem("taxAxisDataConfirmed") === "true") {
63
+ setDataConfirmed(true);
64
+ setTopTab("report");
65
+ }
66
+ }, []);
67
+ const handleConfirm = () => {
68
+ sessionStorage.setItem("taxAxisDataConfirmed", "true");
69
+ setDataConfirmed(true);
70
+ setTopTab("report");
71
+ };
72
+ // Enrich selected strategy with computed values for the detail panel
73
+ const enrichedSelected = (0, react_1.useMemo)(() => {
74
+ var _a, _b, _c, _d;
75
+ if (!selected)
76
+ return null;
77
+ const c = computed.get(selected.rank);
78
+ return Object.assign(Object.assign({}, selected), { lo: (_a = c === null || c === void 0 ? void 0 : c.lo) !== null && _a !== void 0 ? _a : selected.lo, hi: (_b = c === null || c === void 0 ? void 0 : c.hi) !== null && _b !== void 0 ? _b : selected.hi, sources: (_c = c === null || c === void 0 ? void 0 : c.sources) !== null && _c !== void 0 ? _c : selected.sources, trace: (_d = c === null || c === void 0 ? void 0 : c.trace) !== null && _d !== void 0 ? _d : selected.trace });
79
+ }, [selected, computed]);
80
+ // Sorted strategies for impact distribution
81
+ const sortedByImpact = (0, react_1.useMemo)(() => [...dashEligible].sort((a, b) => { var _a, _b, _c, _d; return ((_b = (_a = computed.get(b.rank)) === null || _a === void 0 ? void 0 : _a.hi) !== null && _b !== void 0 ? _b : b.hi) - ((_d = (_c = computed.get(a.rank)) === null || _c === void 0 ? void 0 : _c.hi) !== null && _d !== void 0 ? _d : a.hi); }), [dashEligible, computed]);
82
+ return (react_1.default.createElement("div", null,
83
+ react_1.default.createElement(DashboardSummary_1.DashboardSummary, { profile: profile, dashEligible: dashEligible, computed: computed, dataConfirmed: dataConfirmed, reviewUnreviewed: reviewStatus.unreviewed }),
84
+ react_1.default.createElement(DashboardTopBar_1.DashboardTopBar, { topTab: topTab, setTopTab: setTopTab, dataConfirmed: dataConfirmed, reviewUnreviewed: reviewStatus.unreviewed }),
85
+ topTab === "extraction" && (react_1.default.createElement("div", null,
86
+ react_1.default.createElement("div", { className: "rounded-[14px] mb-4", style: { background: "#0E1132", border: "1px solid rgba(36,131,132,0.12)", padding: "20px 24px" } },
87
+ react_1.default.createElement("div", { className: "text-[13px] font-bold text-white uppercase tracking-widest font-tax-axis-head mb-3" }, "Document Extraction Summary"),
88
+ data_1.EXTRACTED_DATA.map((doc) => (react_1.default.createElement("div", { key: doc.docId, className: "flex items-center justify-between py-2.5", style: { borderTop: "1px solid rgba(36,131,132,0.08)" } },
89
+ react_1.default.createElement("div", { className: "flex items-center gap-3" },
90
+ react_1.default.createElement("span", { className: "text-[11px] font-tax-axis-mono text-tax-axis-teal-light bg-tax-axis-teal-bg px-2 py-0.5 rounded" }, doc.code),
91
+ react_1.default.createElement("span", { className: "text-[13px] text-tax-axis-text font-tax-axis-body" }, doc.docName)),
92
+ react_1.default.createElement("div", { className: "flex items-center gap-2" },
93
+ react_1.default.createElement("span", { className: "text-[11px] font-tax-axis-mono text-tax-axis-text-3" },
94
+ doc.fields.length,
95
+ " fields"),
96
+ doc.flagCount > 0 && (react_1.default.createElement("span", { className: "text-[10px] font-semibold font-tax-axis-mono rounded-full min-w-[18px] text-center px-1.5 py-0.5", style: { color: "#FB9A1D", background: "rgba(251,154,29,0.06)" } }, doc.flagCount)),
97
+ doc.flagCount === 0 && (react_1.default.createElement("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none" },
98
+ react_1.default.createElement("path", { d: "M2.5 6l3 3 4.5-5", stroke: "#0F6E56", strokeWidth: "1.5", strokeLinecap: "round" })))))))),
99
+ !dataConfirmed ? (react_1.default.createElement("div", { className: "rounded-[14px]", style: {
100
+ background: "linear-gradient(135deg, rgba(36,131,132,0.12), rgba(36,131,132,0.06))",
101
+ border: "1px solid rgba(36,131,132,0.3)",
102
+ padding: 24,
103
+ } },
104
+ react_1.default.createElement("div", { className: "flex items-center gap-4" },
105
+ react_1.default.createElement("div", { className: "flex-1" },
106
+ react_1.default.createElement("div", { className: "text-[15px] font-bold text-white font-tax-axis-head mb-1" }, "Ready to view your report?"),
107
+ react_1.default.createElement("div", { className: "text-[13px] text-tax-axis-text leading-relaxed font-tax-axis-body" }, reviewStatus.unreviewed > 0
108
+ ? `${reviewStatus.unreviewed} value${reviewStatus.unreviewed > 1 ? "s" : ""} still flagged. You can confirm now or correct values first.`
109
+ : "All extracted values look good. Confirm to unlock the Intelligence Report.")),
110
+ react_1.default.createElement("div", { className: "flex gap-2.5" },
111
+ reviewStatus.unreviewed > 0 && onReviewData && (react_1.default.createElement(TaxAxisButton_1.TaxAxisButton, { variant: "secondary", onClick: onReviewData }, "Review & Correct Data")),
112
+ react_1.default.createElement(TaxAxisButton_1.TaxAxisButton, { onClick: handleConfirm }, reviewStatus.unreviewed > 0 ? "Confirm & Unlock" : "Confirm Data"))),
113
+ reviewStatus.unreviewed > 0 && (react_1.default.createElement("div", { className: "mt-3 pt-3 text-[11px] text-tax-axis-text-2 font-tax-axis-body flex items-center gap-1.5", style: { borderTop: "1px solid rgba(36,131,132,0.15)" } },
114
+ react_1.default.createElement("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none" },
115
+ react_1.default.createElement("circle", { cx: "5", cy: "5", r: "4", stroke: "#9498B8", strokeWidth: "1" }),
116
+ react_1.default.createElement("path", { d: "M5 3v2.5M5 7h.003", stroke: "#9498B8", strokeWidth: "1", strokeLinecap: "round" })),
117
+ "You can return to this tab to review and re-run after confirming.")))) : (react_1.default.createElement("div", { className: "rounded-xl flex items-center gap-3", style: {
118
+ background: "rgba(15,110,86,0.06)",
119
+ border: "1px solid rgba(15,110,86,0.25)",
120
+ padding: "14px 20px",
121
+ } },
122
+ react_1.default.createElement("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none" },
123
+ react_1.default.createElement("path", { d: "M3 8l4 4 6-7", stroke: "#0F6E56", strokeWidth: "2", strokeLinecap: "round" })),
124
+ react_1.default.createElement("span", { className: "text-[13px] font-semibold font-tax-axis-head", style: { color: "#0F6E56" } }, "Data confirmed \u2014 Intelligence Report unlocked"),
125
+ react_1.default.createElement("button", { onClick: () => setTopTab("report"), className: "ml-auto px-3.5 py-1.5 rounded-md text-xs font-semibold font-tax-axis-mono", style: {
126
+ background: "rgba(15,110,86,0.12)",
127
+ border: "1px solid rgba(15,110,86,0.25)",
128
+ color: "#0F6E56",
129
+ } }, "View Report"))))),
130
+ topTab === "report" && dataConfirmed && (react_1.default.createElement("div", null,
131
+ react_1.default.createElement("div", { className: "flex gap-0 mb-5", style: { borderBottom: "1px solid rgba(36,131,132,0.12)" } }, [["report", "Preparer Report"], ["client", "Client Summary"]].map(([id, lbl]) => (react_1.default.createElement("button", { key: id, onClick: () => setReportTab(id), className: "bg-transparent border-0 font-tax-axis-body mr-6", style: {
132
+ padding: "10px 0",
133
+ fontSize: 14,
134
+ fontWeight: reportTab === id ? 600 : 400,
135
+ color: reportTab === id ? "#A1E5E6" : "#9498B8",
136
+ borderBottom: reportTab === id
137
+ ? "2px solid #248384"
138
+ : "2px solid transparent",
139
+ marginBottom: "-1px",
140
+ } }, lbl)))),
141
+ reportTab === "report" ? (react_1.default.createElement("div", null,
142
+ react_1.default.createElement("div", { className: "rounded-[14px] mb-4", style: {
143
+ background: "#0E1132",
144
+ border: "1px solid rgba(36,131,132,0.12)",
145
+ padding: chartExpanded ? "24px 28px" : "20px 24px",
146
+ boxShadow: "0 2px 8px rgba(6,8,33,0.3)",
147
+ transition: "all .3s",
148
+ } },
149
+ react_1.default.createElement("div", { className: "flex justify-between items-center mb-3.5" },
150
+ react_1.default.createElement("div", { className: "font-bold text-white uppercase tracking-widest font-tax-axis-head", style: { fontSize: chartExpanded ? 15 : 13 } }, "Impact Distribution"),
151
+ react_1.default.createElement("button", { onClick: () => setChartExpanded((p) => !p), className: "px-3 py-1.5 rounded-md text-[11px] font-semibold font-tax-axis-mono transition-colors", style: {
152
+ background: "#1A1D3A",
153
+ border: "1px solid rgba(36,131,132,0.12)",
154
+ color: "#9498B8",
155
+ } }, chartExpanded ? "Collapse \u2191" : "Expand \u2193")),
156
+ sortedByImpact
157
+ .slice(0, chartExpanded ? dashEligible.length : 12)
158
+ .map((s, i) => {
159
+ var _a, _b, _c, _d;
160
+ const chi = (_b = (_a = computed.get(s.rank)) === null || _a === void 0 ? void 0 : _a.hi) !== null && _b !== void 0 ? _b : s.hi;
161
+ const clo = (_d = (_c = computed.get(s.rank)) === null || _c === void 0 ? void 0 : _c.lo) !== null && _d !== void 0 ? _d : s.lo;
162
+ const w = (chi / maxSavings) * 100;
163
+ return (react_1.default.createElement("div", { key: s.rank, className: "flex items-center gap-3 cursor-pointer", style: { marginBottom: chartExpanded ? 14 : 10 }, onClick: () => setSelected(s) },
164
+ react_1.default.createElement("span", { className: "text-tax-axis-text font-tax-axis-body flex-shrink-0 overflow-hidden text-ellipsis whitespace-nowrap", style: {
165
+ fontSize: chartExpanded ? 13 : 12,
166
+ width: chartExpanded ? 180 : 140,
167
+ } }, s.name),
168
+ react_1.default.createElement("div", { className: "flex-1 bg-tax-axis-surface-2 rounded-sm overflow-hidden", style: { height: chartExpanded ? 10 : 6 } },
169
+ react_1.default.createElement("div", { className: "h-full rounded-sm", style: {
170
+ width: `${w}%`,
171
+ background: "linear-gradient(90deg, #248384, #A1E5E6)",
172
+ transition: "width 0.8s cubic-bezier(.16,1,.3,1)",
173
+ } })),
174
+ react_1.default.createElement("span", { className: "font-semibold text-tax-axis-teal-light font-tax-axis-mono flex-shrink-0 text-right", style: {
175
+ fontSize: chartExpanded ? 13 : 12,
176
+ width: chartExpanded ? 100 : 80,
177
+ } },
178
+ fmtK(clo),
179
+ "\u2013",
180
+ fmtK(chi))));
181
+ }),
182
+ !chartExpanded && dashEligible.length > 12 && (react_1.default.createElement("div", { onClick: () => setChartExpanded(true), className: "text-[11px] text-tax-axis-teal-light font-tax-axis-mono mt-1 cursor-pointer hover:underline" },
183
+ "+ ",
184
+ dashEligible.length - 12,
185
+ " more strategies \u2014 click to view all")),
186
+ chartExpanded && (react_1.default.createElement("div", { onClick: () => setChartExpanded(false), className: "text-[11px] text-tax-axis-text-3 font-tax-axis-mono mt-1 cursor-pointer hover:text-tax-axis-teal" },
187
+ "Showing all ",
188
+ dashEligible.length,
189
+ " strategies \u2014 click to collapse"))),
190
+ react_1.default.createElement("div", { className: "text-[13px] font-bold text-white uppercase tracking-widest mb-2.5 font-tax-axis-head flex justify-between items-center" },
191
+ react_1.default.createElement("span", null,
192
+ dashEligible.length,
193
+ " Strategies"),
194
+ react_1.default.createElement("span", { className: "font-normal normal-case tracking-normal text-tax-axis-text-2 text-xs font-tax-axis-body" }, "Click to explore")),
195
+ react_1.default.createElement("div", { className: "grid grid-cols-2 gap-2.5 mb-4" }, dashEligible.map((s, i) => {
196
+ var _a, _b;
197
+ const c = computed.get(s.rank);
198
+ return (react_1.default.createElement(StrategyTile_1.StrategyTile, { key: s.rank, s: Object.assign(Object.assign({}, s), { lo: (_a = c === null || c === void 0 ? void 0 : c.lo) !== null && _a !== void 0 ? _a : s.lo, hi: (_b = c === null || c === void 0 ? void 0 : c.hi) !== null && _b !== void 0 ? _b : s.hi }), delay: 0.2 + i * 0.06, onClick: () => setSelected(s), maxSavings: maxSavings }));
199
+ })),
200
+ react_1.default.createElement("div", { className: "rounded-[14px] overflow-hidden mb-4", style: {
201
+ background: "#0E1132",
202
+ border: "1px solid rgba(36,131,132,0.12)",
203
+ boxShadow: "0 2px 8px rgba(6,8,33,0.3)",
204
+ } },
205
+ react_1.default.createElement("div", { className: "px-5 py-3.5", style: { borderBottom: "1px solid rgba(36,131,132,0.12)" } },
206
+ react_1.default.createElement("span", { className: "text-[13px] font-bold text-white uppercase tracking-widest font-tax-axis-head" }, "Additional Opportunities")),
207
+ data_1.ADDITIONAL.map((a, i, arr) => (react_1.default.createElement("div", { key: i, className: "px-5 py-3 flex justify-between items-center", style: {
208
+ borderBottom: i < arr.length - 1 ? "1px solid rgba(36,131,132,0.12)" : "none",
209
+ } },
210
+ react_1.default.createElement("span", { className: "text-[13px] text-tax-axis-text" }, a.name),
211
+ react_1.default.createElement("div", { className: "flex items-center gap-2.5" },
212
+ react_1.default.createElement("span", { className: "text-[11px] font-tax-axis-mono text-tax-axis-text-2" }, a.savings),
213
+ react_1.default.createElement(TaxAxisBadge_1.TaxAxisBadge, { color: a.priority === "MEDIUM" ? "orange" : "neutral", size: "xs" }, a.priority)))))),
214
+ react_1.default.createElement("div", { className: "rounded-[10px] mb-4 text-xs text-tax-axis-text leading-[1.7] font-tax-axis-body", style: {
215
+ padding: "14px 18px",
216
+ background: "#0E1132",
217
+ border: "1px solid rgba(36,131,132,0.12)",
218
+ } },
219
+ react_1.default.createElement("strong", null, "\u00A76694 Preparer Compliance \u2014 "),
220
+ "All HIGH priority strategies hold Substantial Authority (established IRS guidance supporting the position). No elevated preparer penalty exposure for positions taken on these strategies. OBBBA strategies default to Reasonable Basis pending IRS guidance \u2014 CPA verification required before filing."),
221
+ react_1.default.createElement(TaxAxisButton_1.TaxAxisButton, { onClick: onDownloadPreparer, className: "w-full" }, "Download Full Preparer Report"))) : (
222
+ /* ═══ CLIENT SUMMARY — Timeline View ═══ */
223
+ react_1.default.createElement("div", null,
224
+ react_1.default.createElement("p", { className: "text-sm text-tax-axis-text leading-[1.7] mb-6 font-tax-axis-body" },
225
+ profile.bizName || "Client",
226
+ ", here's your action plan organized by urgency.",
227
+ " ",
228
+ react_1.default.createElement("strong", { className: "text-tax-axis-teal-light" },
229
+ dashEligible.length,
230
+ " strategies"),
231
+ " ",
232
+ "identified."),
233
+ BUCKETS.map(({ key, label, desc }) => {
234
+ const items = dashEligible.filter((s) => s.timelineBucket === key);
235
+ if (!items.length)
236
+ return null;
237
+ const bucketTotal = items.reduce((a, s) => { var _a, _b; return a + ((_b = (_a = computed.get(s.rank)) === null || _a === void 0 ? void 0 : _a.lo) !== null && _b !== void 0 ? _b : s.lo); }, 0);
238
+ const dotColor = key === "now" ? "#248384" : key === "30d" ? "#FB9A1D" : "#8B5CF6";
239
+ const gradientFrom = key === "now"
240
+ ? "linear-gradient(135deg, #248384, #1A6B6C)"
241
+ : key === "30d"
242
+ ? "linear-gradient(135deg, #FB9A1D, #D07A00)"
243
+ : "linear-gradient(135deg, #8B5CF6, #6D28D9)";
244
+ return (react_1.default.createElement("div", { key: key, className: "mb-5" },
245
+ react_1.default.createElement("div", { className: "flex items-center gap-2.5 mb-2.5" },
246
+ react_1.default.createElement("div", { className: "w-2.5 h-2.5 rounded-full", style: { background: dotColor } }),
247
+ react_1.default.createElement("span", { className: "text-[15px] font-bold text-white font-tax-axis-head" }, label),
248
+ react_1.default.createElement("span", { className: "text-xs text-tax-axis-text-3 font-tax-axis-body" },
249
+ "\u2014 ",
250
+ desc),
251
+ react_1.default.createElement("span", { className: "ml-auto text-[13px] font-semibold text-tax-axis-teal-light font-tax-axis-mono" },
252
+ "$",
253
+ Math.round(bucketTotal / 1000),
254
+ "K+")),
255
+ items.map((s, i) => {
256
+ var _a, _b;
257
+ const c = computed.get(s.rank);
258
+ const clo = (_a = c === null || c === void 0 ? void 0 : c.lo) !== null && _a !== void 0 ? _a : s.lo;
259
+ const chi = (_b = c === null || c === void 0 ? void 0 : c.hi) !== null && _b !== void 0 ? _b : s.hi;
260
+ return (react_1.default.createElement("div", { key: i, onClick: () => setSelected(s), className: "rounded-[14px] overflow-hidden mb-2 cursor-pointer transition-all", style: {
261
+ background: "#0E1132",
262
+ border: "1px solid rgba(36,131,132,0.12)",
263
+ boxShadow: "0 2px 8px rgba(6,8,33,0.3)",
264
+ } },
265
+ react_1.default.createElement("div", { className: "px-5 py-3.5 flex items-center gap-3.5", style: { borderBottom: "1px solid rgba(36,131,132,0.12)" } },
266
+ react_1.default.createElement("div", { className: "w-8 h-8 rounded-lg flex items-center justify-center text-[13px] font-bold text-white flex-shrink-0", style: { background: gradientFrom } },
267
+ "#",
268
+ s.rank),
269
+ react_1.default.createElement("span", { className: "text-[15px] font-bold text-tax-axis-text font-tax-axis-head flex-1" }, s.name),
270
+ react_1.default.createElement("span", { className: "text-xl font-bold text-tax-axis-teal-light font-tax-axis-head" },
271
+ fmtK(clo),
272
+ "\u2013",
273
+ fmtK(chi))),
274
+ react_1.default.createElement("div", { className: "px-5 py-3" },
275
+ react_1.default.createElement("p", { className: "text-[13px] text-tax-axis-text leading-[1.7] font-tax-axis-body" }, s.clientBrief)),
276
+ react_1.default.createElement("div", { className: "px-5 py-2.5 flex justify-between items-center", style: { background: "rgba(36,131,132,0.06)" } },
277
+ react_1.default.createElement("span", { className: "text-xs text-tax-axis-teal-light font-tax-axis-body" }, s.action),
278
+ s.cost && s.cost !== "$0" && (react_1.default.createElement("span", { className: "text-[11px] font-semibold font-tax-axis-mono", style: { color: "#FB9A1D" } }, s.cost)))));
279
+ })));
280
+ }),
281
+ react_1.default.createElement(TaxAxisButton_1.TaxAxisButton, { onClick: onDownloadClient, className: "w-full mt-1.5" }, "Download Client Summary"))),
282
+ react_1.default.createElement(DashboardActions_1.DashboardActions, { profile: profile, dashEligible: dashEligible, computed: computed, onDownloadPreparer: onDownloadPreparer, onPresent: onPresent, onSend: onSend, onReset: onReset }))),
283
+ enrichedSelected && (react_1.default.createElement(StrategyDetailPanel_1.StrategyDetailPanel, { s: enrichedSelected, profile: profile, computed: computed, onClose: () => setSelected(null) }))));
284
+ }
@@ -0,0 +1 @@
1
+ export declare function useCountUp(target: number, dur?: number, del?: number): number;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useCountUp = useCountUp;
4
+ const react_1 = require("react");
5
+ // ═══════════════════════════════════════════════════════════════════
6
+ // useCountUp — animated number counter with easeOutCubic
7
+ // Verbatim from mock (App.jsx:771).
8
+ // ═══════════════════════════════════════════════════════════════════
9
+ function useCountUp(target, dur = 1400, del = 300) {
10
+ const [v, setV] = (0, react_1.useState)(0);
11
+ (0, react_1.useEffect)(() => {
12
+ const t = setTimeout(() => {
13
+ const s = performance.now();
14
+ const tick = (n) => {
15
+ const p = Math.min((n - s) / dur, 1);
16
+ setV(Math.round(target * (1 - Math.pow(1 - p, 3))));
17
+ if (p < 1)
18
+ requestAnimationFrame(tick);
19
+ };
20
+ requestAnimationFrame(tick);
21
+ }, del);
22
+ return () => clearTimeout(t);
23
+ }, [target, dur, del]);
24
+ return v;
25
+ }
@@ -0,0 +1,18 @@
1
+ import React from "react";
2
+ import { DocSpec } from "../../lib/types";
3
+ export type DocStatus = "empty" | "validating" | "valid";
4
+ export interface DocState extends DocSpec {
5
+ status: DocStatus;
6
+ fileName: string | null;
7
+ }
8
+ interface DocumentCardProps {
9
+ doc: DocState;
10
+ tierBorderColor: string;
11
+ tierBadgeColor: "red" | "orange" | "neutral";
12
+ tierBadgeText: string;
13
+ helpOverride?: string;
14
+ onUpload: () => void;
15
+ onClear: () => void;
16
+ }
17
+ export declare function DocumentCard({ doc, tierBorderColor, tierBadgeColor, tierBadgeText, helpOverride, onUpload, onClear, }: DocumentCardProps): React.JSX.Element;
18
+ export {};