@paro.io/expert-shared-components 1.14.43 → 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 (242) 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/UploadFilesButton.d.ts +6 -6
  24. package/lib/components/DocumentCenter/UploadFilesButton.js +29 -29
  25. package/lib/components/EarningsTracker/ActiveProjectCard.d.ts +52 -52
  26. package/lib/components/EarningsTracker/ActiveProjectCard.js +161 -161
  27. package/lib/components/EarningsTracker/CenterCardUI.d.ts +13 -13
  28. package/lib/components/EarningsTracker/CenterCardUI.js +134 -134
  29. package/lib/components/EarningsTracker/EarningsTracker.d.ts +52 -52
  30. package/lib/components/EarningsTracker/EarningsTracker.js +508 -508
  31. package/lib/components/EarningsTracker/EditDateModal.d.ts +22 -22
  32. package/lib/components/EarningsTracker/EditDateModal.js +149 -149
  33. package/lib/components/EarningsTracker/EmailModal.d.ts +14 -14
  34. package/lib/components/EarningsTracker/EmailModal.js +79 -79
  35. package/lib/components/EarningsTracker/EndProjectModal.d.ts +56 -56
  36. package/lib/components/EarningsTracker/EndProjectModal.js +221 -221
  37. package/lib/components/EarningsTracker/LeftCardUI.d.ts +18 -18
  38. package/lib/components/EarningsTracker/LeftCardUI.js +189 -189
  39. package/lib/components/EarningsTracker/LogTimeModalAuthenticated.d.ts +52 -52
  40. package/lib/components/EarningsTracker/LogTimeModalAuthenticated.js +358 -358
  41. package/lib/components/EarningsTracker/ProgressBar.d.ts +4 -4
  42. package/lib/components/EarningsTracker/ProgressBar.js +66 -66
  43. package/lib/components/EarningsTracker/ReviewRequestModal.d.ts +17 -17
  44. package/lib/components/EarningsTracker/ReviewRequestModal.js +135 -135
  45. package/lib/components/EarningsTracker/RightCardUI.d.ts +46 -46
  46. package/lib/components/EarningsTracker/RightCardUI.js +231 -231
  47. package/lib/components/EarningsTracker/index.d.ts +1 -1
  48. package/lib/components/EarningsTracker/index.js +5 -5
  49. package/lib/components/Escalations/CustomTag.d.ts +3 -3
  50. package/lib/components/Escalations/CustomTag.js +25 -25
  51. package/lib/components/Escalations/ViewReponseModal.d.ts +8 -8
  52. package/lib/components/Escalations/ViewReponseModal.js +27 -27
  53. package/lib/components/ExpertProfileHeader/ActionButtonSection.js +6 -6
  54. package/lib/components/ExpertProfileHeader/ProfileSection.js +7 -7
  55. package/lib/components/Invoices/TestDecisionSection.d.ts +1 -1
  56. package/lib/components/Invoices/TestDecisionSection.js +126 -126
  57. package/lib/components/OrganizationChart/OrganizationChart.d.ts +15 -15
  58. package/lib/components/OrganizationChart/OrganizationChart.js +312 -312
  59. package/lib/components/OrganizationChart/PersonCard.js +5 -5
  60. package/lib/components/OrganizationChart/utils.js +79 -79
  61. package/lib/components/ProjectCard/ProgressBar.js +4 -4
  62. package/lib/components/ProjectCard/ReviewRequestModal.js +5 -5
  63. package/lib/components/ProjectIntelligence/MissingInformation/index.js +1 -1
  64. package/lib/components/Reviews/Pagination.js +6 -6
  65. package/lib/components/ReviewsTab/RatingHeader.js +6 -6
  66. package/lib/components/ReviewsTab/expert-shared-components.code-workspace +20 -20
  67. package/lib/components/ReviewsTab/reviewRequestModal.js +5 -5
  68. package/lib/components/shared/Image.js +13 -13
  69. package/lib/components/shared/ProfileTextField.d.ts +18 -18
  70. package/lib/components/shared/ProfileTextField.js +16 -16
  71. package/lib/components/shared/StyledActionButtons.d.ts +7 -7
  72. package/lib/components/shared/StyledActionButtons.js +15 -15
  73. package/lib/components/shared/ToastNotification.d.ts +10 -10
  74. package/lib/components/shared/ToastNotification.js +63 -63
  75. package/lib/index.d.ts +13 -0
  76. package/lib/index.js +27 -1
  77. package/lib/package.json +68 -0
  78. package/lib/tax-axis/components/clientReport/ClientReportCover.d.ts +9 -0
  79. package/lib/tax-axis/components/clientReport/ClientReportCover.js +39 -0
  80. package/lib/tax-axis/components/clientReport/ClientReportTOC.d.ts +8 -0
  81. package/lib/tax-axis/components/clientReport/ClientReportTOC.js +24 -0
  82. package/lib/tax-axis/components/clientReport/ClientReportToolbar.d.ts +2 -0
  83. package/lib/tax-axis/components/clientReport/ClientReportToolbar.js +6 -0
  84. package/lib/tax-axis/components/clientReport/ETRChart.d.ts +10 -0
  85. package/lib/tax-axis/components/clientReport/ETRChart.js +50 -0
  86. package/lib/tax-axis/components/clientReport/ExecutiveSummary.d.ts +15 -0
  87. package/lib/tax-axis/components/clientReport/ExecutiveSummary.js +73 -0
  88. package/lib/tax-axis/components/clientReport/FootnoteBlock.d.ts +11 -0
  89. package/lib/tax-axis/components/clientReport/FootnoteBlock.js +34 -0
  90. package/lib/tax-axis/components/clientReport/ImplementationRoadmap.d.ts +26 -0
  91. package/lib/tax-axis/components/clientReport/ImplementationRoadmap.js +51 -0
  92. package/lib/tax-axis/components/clientReport/ImplementationTimelineChart.d.ts +10 -0
  93. package/lib/tax-axis/components/clientReport/ImplementationTimelineChart.js +49 -0
  94. package/lib/tax-axis/components/clientReport/Methodology.d.ts +10 -0
  95. package/lib/tax-axis/components/clientReport/Methodology.js +40 -0
  96. package/lib/tax-axis/components/clientReport/QuarterlyCashChart.d.ts +10 -0
  97. package/lib/tax-axis/components/clientReport/QuarterlyCashChart.js +56 -0
  98. package/lib/tax-axis/components/clientReport/RecommendedStrategies.d.ts +13 -0
  99. package/lib/tax-axis/components/clientReport/RecommendedStrategies.js +51 -0
  100. package/lib/tax-axis/components/clientReport/SavingsStackChart.d.ts +10 -0
  101. package/lib/tax-axis/components/clientReport/SavingsStackChart.js +66 -0
  102. package/lib/tax-axis/components/clientReport/SectionOpener.d.ts +11 -0
  103. package/lib/tax-axis/components/clientReport/SectionOpener.js +20 -0
  104. package/lib/tax-axis/components/clientReport/Sidebar.d.ts +8 -0
  105. package/lib/tax-axis/components/clientReport/Sidebar.js +37 -0
  106. package/lib/tax-axis/components/clientReport/StrategyCard.d.ts +16 -0
  107. package/lib/tax-axis/components/clientReport/StrategyCard.js +63 -0
  108. package/lib/tax-axis/components/clientReport/TaxAxisClientReport.d.ts +9 -0
  109. package/lib/tax-axis/components/clientReport/TaxAxisClientReport.js +125 -0
  110. package/lib/tax-axis/components/clientReport/applyFootnotes.d.ts +12 -0
  111. package/lib/tax-axis/components/clientReport/applyFootnotes.js +43 -0
  112. package/lib/tax-axis/components/clientReport/palette.d.ts +28 -0
  113. package/lib/tax-axis/components/clientReport/palette.js +34 -0
  114. package/lib/tax-axis/components/dashboard/ConfidenceArc.d.ts +7 -0
  115. package/lib/tax-axis/components/dashboard/ConfidenceArc.js +20 -0
  116. package/lib/tax-axis/components/dashboard/DashboardActions.d.ts +13 -0
  117. package/lib/tax-axis/components/dashboard/DashboardActions.js +96 -0
  118. package/lib/tax-axis/components/dashboard/DashboardSummary.d.ts +11 -0
  119. package/lib/tax-axis/components/dashboard/DashboardSummary.js +98 -0
  120. package/lib/tax-axis/components/dashboard/DashboardTopBar.d.ts +10 -0
  121. package/lib/tax-axis/components/dashboard/DashboardTopBar.js +48 -0
  122. package/lib/tax-axis/components/dashboard/StrategyDetailPanel.d.ts +10 -0
  123. package/lib/tax-axis/components/dashboard/StrategyDetailPanel.js +139 -0
  124. package/lib/tax-axis/components/dashboard/StrategyTile.d.ts +10 -0
  125. package/lib/tax-axis/components/dashboard/StrategyTile.js +82 -0
  126. package/lib/tax-axis/components/dashboard/TaxAxisDashboard.d.ts +12 -0
  127. package/lib/tax-axis/components/dashboard/TaxAxisDashboard.js +284 -0
  128. package/lib/tax-axis/components/dashboard/useCountUp.d.ts +1 -0
  129. package/lib/tax-axis/components/dashboard/useCountUp.js +25 -0
  130. package/lib/tax-axis/components/documents/DocumentCard.d.ts +18 -0
  131. package/lib/tax-axis/components/documents/DocumentCard.js +61 -0
  132. package/lib/tax-axis/components/documents/DocumentTier.d.ts +21 -0
  133. package/lib/tax-axis/components/documents/DocumentTier.js +23 -0
  134. package/lib/tax-axis/components/documents/TaxAxisDocuments.d.ts +8 -0
  135. package/lib/tax-axis/components/documents/TaxAxisDocuments.js +157 -0
  136. package/lib/tax-axis/components/extractionReview/DocumentCard.d.ts +17 -0
  137. package/lib/tax-axis/components/extractionReview/DocumentCard.js +105 -0
  138. package/lib/tax-axis/components/extractionReview/FieldRow.d.ts +17 -0
  139. package/lib/tax-axis/components/extractionReview/FieldRow.js +137 -0
  140. package/lib/tax-axis/components/extractionReview/PurposeBlock.d.ts +7 -0
  141. package/lib/tax-axis/components/extractionReview/PurposeBlock.js +18 -0
  142. package/lib/tax-axis/components/extractionReview/RerunFooter.d.ts +8 -0
  143. package/lib/tax-axis/components/extractionReview/RerunFooter.js +60 -0
  144. package/lib/tax-axis/components/extractionReview/TaxAxisExtractionReview.d.ts +11 -0
  145. package/lib/tax-axis/components/extractionReview/TaxAxisExtractionReview.js +186 -0
  146. package/lib/tax-axis/components/intake/ClientParametersSection.d.ts +7 -0
  147. package/lib/tax-axis/components/intake/ClientParametersSection.js +146 -0
  148. package/lib/tax-axis/components/intake/CpaIntakeQuestionsSection.d.ts +7 -0
  149. package/lib/tax-axis/components/intake/CpaIntakeQuestionsSection.js +93 -0
  150. package/lib/tax-axis/components/intake/IntakeCtaCards.d.ts +9 -0
  151. package/lib/tax-axis/components/intake/IntakeCtaCards.js +30 -0
  152. package/lib/tax-axis/components/intake/RefineAnalysisSection.d.ts +7 -0
  153. package/lib/tax-axis/components/intake/RefineAnalysisSection.js +151 -0
  154. package/lib/tax-axis/components/intake/StateMultiSelect.d.ts +7 -0
  155. package/lib/tax-axis/components/intake/StateMultiSelect.js +90 -0
  156. package/lib/tax-axis/components/intake/StrategyRadar.d.ts +7 -0
  157. package/lib/tax-axis/components/intake/StrategyRadar.js +240 -0
  158. package/lib/tax-axis/components/intake/TaxAxisIntake.d.ts +8 -0
  159. package/lib/tax-axis/components/intake/TaxAxisIntake.js +38 -0
  160. package/lib/tax-axis/components/intake/intakeSchema.d.ts +97 -0
  161. package/lib/tax-axis/components/intake/intakeSchema.js +91 -0
  162. package/lib/tax-axis/components/preparerWorkpaper/CalculationTraceAccordion.d.ts +9 -0
  163. package/lib/tax-axis/components/preparerWorkpaper/CalculationTraceAccordion.js +19 -0
  164. package/lib/tax-axis/components/preparerWorkpaper/EngagementHeader.d.ts +9 -0
  165. package/lib/tax-axis/components/preparerWorkpaper/EngagementHeader.js +43 -0
  166. package/lib/tax-axis/components/preparerWorkpaper/Position6694Accordion.d.ts +9 -0
  167. package/lib/tax-axis/components/preparerWorkpaper/Position6694Accordion.js +25 -0
  168. package/lib/tax-axis/components/preparerWorkpaper/PriorityGroup.d.ts +14 -0
  169. package/lib/tax-axis/components/preparerWorkpaper/PriorityGroup.js +20 -0
  170. package/lib/tax-axis/components/preparerWorkpaper/Section6694Summary.d.ts +9 -0
  171. package/lib/tax-axis/components/preparerWorkpaper/Section6694Summary.js +36 -0
  172. package/lib/tax-axis/components/preparerWorkpaper/SourceDocumentsAccordion.d.ts +9 -0
  173. package/lib/tax-axis/components/preparerWorkpaper/SourceDocumentsAccordion.js +20 -0
  174. package/lib/tax-axis/components/preparerWorkpaper/StrategyWorkpaperCard.d.ts +14 -0
  175. package/lib/tax-axis/components/preparerWorkpaper/StrategyWorkpaperCard.js +53 -0
  176. package/lib/tax-axis/components/preparerWorkpaper/TaxAxisPreparerWorkpaper.d.ts +9 -0
  177. package/lib/tax-axis/components/preparerWorkpaper/TaxAxisPreparerWorkpaper.js +175 -0
  178. package/lib/tax-axis/components/presentationMode/TaxAxisPresentationMode.d.ts +7 -0
  179. package/lib/tax-axis/components/presentationMode/TaxAxisPresentationMode.js +245 -0
  180. package/lib/tax-axis/components/processing/ProcessingStages.d.ts +7 -0
  181. package/lib/tax-axis/components/processing/ProcessingStages.js +17 -0
  182. package/lib/tax-axis/components/processing/TaxAxisProcessing.d.ts +7 -0
  183. package/lib/tax-axis/components/processing/TaxAxisProcessing.js +105 -0
  184. package/lib/tax-axis/components/prospectReport/ProspectCover.d.ts +10 -0
  185. package/lib/tax-axis/components/prospectReport/ProspectCover.js +47 -0
  186. package/lib/tax-axis/components/prospectReport/ProspectDocuments.d.ts +9 -0
  187. package/lib/tax-axis/components/prospectReport/ProspectDocuments.js +31 -0
  188. package/lib/tax-axis/components/prospectReport/ProspectNextSteps.d.ts +13 -0
  189. package/lib/tax-axis/components/prospectReport/ProspectNextSteps.js +37 -0
  190. package/lib/tax-axis/components/prospectReport/ProspectPrintView.d.ts +26 -0
  191. package/lib/tax-axis/components/prospectReport/ProspectPrintView.js +183 -0
  192. package/lib/tax-axis/components/prospectReport/ProspectStrategyCard.d.ts +10 -0
  193. package/lib/tax-axis/components/prospectReport/ProspectStrategyCard.js +52 -0
  194. package/lib/tax-axis/components/prospectReport/SampleAnalysisPreview.d.ts +7 -0
  195. package/lib/tax-axis/components/prospectReport/SampleAnalysisPreview.js +120 -0
  196. package/lib/tax-axis/components/prospectReport/TaxAxisProspectReport.d.ts +9 -0
  197. package/lib/tax-axis/components/prospectReport/TaxAxisProspectReport.js +173 -0
  198. package/lib/tax-axis/components/prospectReport/TaxPositionGap.d.ts +15 -0
  199. package/lib/tax-axis/components/prospectReport/TaxPositionGap.js +45 -0
  200. package/lib/tax-axis/components/prospectReport/theme.d.ts +26 -0
  201. package/lib/tax-axis/components/prospectReport/theme.js +33 -0
  202. package/lib/tax-axis/components/shared/ReportToolbar.d.ts +12 -0
  203. package/lib/tax-axis/components/shared/ReportToolbar.js +81 -0
  204. package/lib/tax-axis/components/shared/SectionHeader.d.ts +8 -0
  205. package/lib/tax-axis/components/shared/SectionHeader.js +15 -0
  206. package/lib/tax-axis/components/shared/TaxAxisBadge.d.ts +12 -0
  207. package/lib/tax-axis/components/shared/TaxAxisBadge.js +34 -0
  208. package/lib/tax-axis/components/shared/TaxAxisButton.d.ts +12 -0
  209. package/lib/tax-axis/components/shared/TaxAxisButton.js +17 -0
  210. package/lib/tax-axis/components/shared/TaxAxisCard.d.ts +9 -0
  211. package/lib/tax-axis/components/shared/TaxAxisCard.js +13 -0
  212. package/lib/tax-axis/index.d.ts +25 -0
  213. package/lib/tax-axis/index.js +51 -0
  214. package/lib/tax-axis/lib/compute/index.d.ts +8 -0
  215. package/lib/tax-axis/lib/compute/index.js +163 -0
  216. package/lib/tax-axis/lib/data/documents.d.ts +3 -0
  217. package/lib/tax-axis/lib/data/documents.js +33 -0
  218. package/lib/tax-axis/lib/data/extractedData.d.ts +2 -0
  219. package/lib/tax-axis/lib/data/extractedData.js +47 -0
  220. package/lib/tax-axis/lib/data/footnoteData.d.ts +2 -0
  221. package/lib/tax-axis/lib/data/footnoteData.js +48 -0
  222. package/lib/tax-axis/lib/data/index.d.ts +11 -0
  223. package/lib/tax-axis/lib/data/index.js +31 -0
  224. package/lib/tax-axis/lib/data/nextSteps.d.ts +2 -0
  225. package/lib/tax-axis/lib/data/nextSteps.js +35 -0
  226. package/lib/tax-axis/lib/data/sidebarLookup.d.ts +2 -0
  227. package/lib/tax-axis/lib/data/sidebarLookup.js +90 -0
  228. package/lib/tax-axis/lib/data/sourceDescriptions.d.ts +1 -0
  229. package/lib/tax-axis/lib/data/sourceDescriptions.js +32 -0
  230. package/lib/tax-axis/lib/data/states.d.ts +6 -0
  231. package/lib/tax-axis/lib/data/states.js +25 -0
  232. package/lib/tax-axis/lib/data/strategies.d.ts +8 -0
  233. package/lib/tax-axis/lib/data/strategies.js +166 -0
  234. package/lib/tax-axis/lib/data/strategyNarrative.d.ts +3 -0
  235. package/lib/tax-axis/lib/data/strategyNarrative.js +170 -0
  236. package/lib/tax-axis/lib/data/strategyProspect.d.ts +2 -0
  237. package/lib/tax-axis/lib/data/strategyProspect.js +66 -0
  238. package/lib/tax-axis/lib/data/workpaperInteractions.d.ts +1 -0
  239. package/lib/tax-axis/lib/data/workpaperInteractions.js +15 -0
  240. package/lib/tax-axis/lib/types/index.d.ts +183 -0
  241. package/lib/tax-axis/lib/types/index.js +7 -0
  242. package/package.json +68 -67
@@ -0,0 +1,151 @@
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.RefineAnalysisSection = RefineAnalysisSection;
27
+ const react_1 = __importStar(require("react"));
28
+ const react_hook_form_1 = require("react-hook-form");
29
+ const TaxAxisCard_1 = require("../shared/TaxAxisCard");
30
+ /* ═══ Shared class constants ═══ */
31
+ const inputCls = "w-full bg-tax-axis-surface border border-tax-axis-border text-white text-sm rounded-lg p-2.5 focus:border-tax-axis-teal-light focus:outline-none font-tax-axis-body transition-colors";
32
+ const selectCls = "w-full bg-tax-axis-surface border border-tax-axis-border text-white text-sm rounded-lg p-2.5 focus:border-tax-axis-teal-light focus:outline-none font-tax-axis-body transition-colors appearance-none cursor-pointer";
33
+ const labelCls = "block text-[11px] font-semibold text-tax-axis-text-2 mb-1 font-tax-axis-body tracking-wide";
34
+ const errCls = "text-tax-axis-red text-xs mt-1";
35
+ const subHeaderCls = "text-[11px] font-semibold uppercase tracking-wider text-tax-axis-text-3 mt-5 mb-2";
36
+ const helperCls = "text-[11px] text-tax-axis-text-4 mt-0.5 leading-tight";
37
+ const Chevron = () => (react_1.default.createElement("svg", { className: "absolute right-2.5 top-1/2 -translate-y-1/2 pointer-events-none", width: "10", height: "10", viewBox: "0 0 12 12", fill: "none" },
38
+ react_1.default.createElement("path", { d: "M3 4.5l3 3 3-3", stroke: "#E6E8F5", strokeWidth: "1.5", strokeLinecap: "round" })));
39
+ /* ═══ Option lists ═══ */
40
+ const FILING_STATUS_OPTIONS = ["Single", "MFJ", "MFS", "Head of Household", "QSS"];
41
+ const SSTB_OPTIONS = ["Yes", "No", "Unsure"];
42
+ const REAL_ESTATE_OPTIONS = ["No", "Yes — Commercial", "Yes — Residential", "Yes — Both"];
43
+ const ITEMIZES_OPTIONS = ["Yes", "No", "Unsure"];
44
+ const SINGLE_OWNER_OPTIONS = ["Yes", "No"];
45
+ const FEDERAL_RATE_OPTIONS = ["10%", "12%", "22%", "24%", "32%", "35%", "37%"];
46
+ const TAX_DATA_YEARS_OPTIONS = ["1 year", "2 years", "3 years", "4 years", "5 years"];
47
+ // Risk Tolerance: mock stores first char ("1"-"5") as value.
48
+ // NOTE: intakeDefaultValues sets riskTolerance to "M" (spec) but the mock
49
+ // stores "3" for Moderate. This is a spec-vs-mock discrepancy — flagged for
50
+ // reconciliation. Using mock option values (numeric) since downstream screens
51
+ // call parseInt(riskTolerance).
52
+ const RISK_OPTIONS = [
53
+ { label: "1 — Very Conservative", value: "1" },
54
+ { label: "2 — Conservative", value: "2" },
55
+ { label: "3 — Moderate", value: "3" },
56
+ { label: "4 — Aggressive", value: "4" },
57
+ { label: "5 — Very Aggressive", value: "5" },
58
+ ];
59
+ function RefineAnalysisSection({ userContext: _userContext, }) {
60
+ const [expanded, setExpanded] = (0, react_1.useState)(false);
61
+ const { control, watch, formState: { errors }, } = (0, react_hook_form_1.useFormContext)();
62
+ const ownsRealEstate = watch("ownsRealEstate");
63
+ return (react_1.default.createElement(TaxAxisCard_1.TaxAxisCard, null,
64
+ react_1.default.createElement("div", { onClick: () => setExpanded(prev => !prev), className: "flex items-center justify-between cursor-pointer", style: { marginBottom: expanded ? 10 : 0 } },
65
+ react_1.default.createElement("span", { className: "text-[11px] font-semibold uppercase tracking-wider text-tax-axis-text-3" }, "Refine Analysis"),
66
+ react_1.default.createElement("div", { className: "flex items-center gap-1.5" },
67
+ react_1.default.createElement("span", { className: "text-[10px] text-tax-axis-text-4 bg-tax-axis-surface-2 rounded-xl px-2 py-0.5" }, "15 fields using smart defaults"),
68
+ react_1.default.createElement("svg", { className: `transition-transform ${expanded ? "rotate-180" : "rotate-0"}`, width: "10", height: "10", viewBox: "0 0 12 12", fill: "none" },
69
+ react_1.default.createElement("path", { d: "M3 4.5l3 3 3-3", stroke: "#9498B8", strokeWidth: "1.5", strokeLinecap: "round" })))),
70
+ expanded && (react_1.default.createElement("div", null,
71
+ react_1.default.createElement("div", { className: "text-[11px] text-tax-axis-text-4 italic mb-3" }, "These fields improve accuracy. Many will be auto-populated when documents are uploaded."),
72
+ react_1.default.createElement("div", { className: subHeaderCls, style: { marginTop: 0 } }, "Client Profile"),
73
+ react_1.default.createElement("div", { className: "grid grid-cols-2 gap-3 mb-2.5" },
74
+ react_1.default.createElement("div", null,
75
+ react_1.default.createElement("label", { className: labelCls }, "Filing Status"),
76
+ react_1.default.createElement(react_hook_form_1.Controller, { name: "filingStatus", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
77
+ react_1.default.createElement("select", Object.assign({}, field, { className: selectCls }), FILING_STATUS_OPTIONS.map(o => (react_1.default.createElement("option", { key: o, value: o, className: "bg-tax-axis-surface-2" }, o)))),
78
+ react_1.default.createElement(Chevron, null))) })),
79
+ react_1.default.createElement("div", null,
80
+ react_1.default.createElement("label", { className: labelCls }, "Age"),
81
+ react_1.default.createElement(react_hook_form_1.Controller, { name: "age", control: control, render: ({ field }) => (react_1.default.createElement("input", Object.assign({}, field, { type: "number", placeholder: "45", className: inputCls }))) }))),
82
+ react_1.default.createElement("div", { className: "grid grid-cols-2 gap-3 mb-2.5" },
83
+ react_1.default.createElement("div", null,
84
+ react_1.default.createElement("label", { className: labelCls }, "SSTB"),
85
+ react_1.default.createElement(react_hook_form_1.Controller, { name: "sstb", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
86
+ react_1.default.createElement("select", Object.assign({}, field, { className: selectCls }), SSTB_OPTIONS.map(o => (react_1.default.createElement("option", { key: o, value: o, className: "bg-tax-axis-surface-2" }, o)))),
87
+ react_1.default.createElement(Chevron, null))) }),
88
+ react_1.default.createElement("div", { className: helperCls }, "SSTB: law, health, consulting, financial services, performing arts, athletics")),
89
+ react_1.default.createElement("div", null,
90
+ react_1.default.createElement("label", { className: labelCls }, "Owns Real Estate"),
91
+ react_1.default.createElement(react_hook_form_1.Controller, { name: "ownsRealEstate", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
92
+ react_1.default.createElement("select", Object.assign({}, field, { className: selectCls }), REAL_ESTATE_OPTIONS.map(o => (react_1.default.createElement("option", { key: o, value: o, className: "bg-tax-axis-surface-2" }, o)))),
93
+ react_1.default.createElement(Chevron, null))) }))),
94
+ react_1.default.createElement("div", { className: "grid grid-cols-2 gap-3 mb-2.5" },
95
+ react_1.default.createElement("div", null,
96
+ react_1.default.createElement("label", { className: labelCls }, "Itemizes Deductions"),
97
+ react_1.default.createElement(react_hook_form_1.Controller, { name: "itemizesDeductions", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
98
+ react_1.default.createElement("select", Object.assign({}, field, { className: selectCls }), ITEMIZES_OPTIONS.map(o => (react_1.default.createElement("option", { key: o, value: o, className: "bg-tax-axis-surface-2" }, o)))),
99
+ react_1.default.createElement(Chevron, null))) })),
100
+ react_1.default.createElement("div", null,
101
+ react_1.default.createElement("label", { className: labelCls }, "Single Owner"),
102
+ react_1.default.createElement(react_hook_form_1.Controller, { name: "singleOwner", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
103
+ react_1.default.createElement("select", Object.assign({}, field, { className: selectCls }), SINGLE_OWNER_OPTIONS.map(o => (react_1.default.createElement("option", { key: o, value: o, className: "bg-tax-axis-surface-2" }, o)))),
104
+ react_1.default.createElement(Chevron, null))) }))),
105
+ react_1.default.createElement("div", { className: subHeaderCls }, "Financial Data"),
106
+ react_1.default.createElement("div", { className: "grid grid-cols-2 gap-3 mb-2.5" },
107
+ react_1.default.createElement("div", null,
108
+ react_1.default.createElement("label", { className: labelCls }, "Net Income"),
109
+ react_1.default.createElement(react_hook_form_1.Controller, { name: "netIncome", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
110
+ react_1.default.createElement("span", { className: "absolute left-2.5 top-1/2 -translate-y-1/2 text-tax-axis-text-3 text-[13px]" }, "$"),
111
+ react_1.default.createElement("input", Object.assign({}, field, { placeholder: "142,000", className: `${inputCls} pl-6` })))) })),
112
+ react_1.default.createElement("div", null,
113
+ react_1.default.createElement("label", { className: labelCls }, "Equipment Purchased (This Year)"),
114
+ react_1.default.createElement(react_hook_form_1.Controller, { name: "equipmentPurchased", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
115
+ react_1.default.createElement("span", { className: "absolute left-2.5 top-1/2 -translate-y-1/2 text-tax-axis-text-3 text-[13px]" }, "$"),
116
+ react_1.default.createElement("input", Object.assign({}, field, { placeholder: "0", className: `${inputCls} pl-6` })))) }))),
117
+ react_1.default.createElement("div", { className: "grid grid-cols-2 gap-3 mb-2.5" },
118
+ ownsRealEstate !== "No" ? (react_1.default.createElement("div", { className: "transition-opacity" },
119
+ react_1.default.createElement("label", { className: labelCls }, "Real Estate Value"),
120
+ react_1.default.createElement(react_hook_form_1.Controller, { name: "realEstateValue", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
121
+ react_1.default.createElement("span", { className: "absolute left-2.5 top-1/2 -translate-y-1/2 text-tax-axis-text-3 text-[13px]" }, "$"),
122
+ react_1.default.createElement("input", Object.assign({}, field, { placeholder: "0", className: `${inputCls} pl-6` })))) }))) : (react_1.default.createElement("div", null)),
123
+ react_1.default.createElement("div", null,
124
+ react_1.default.createElement("label", { className: labelCls }, "Capital Gains"),
125
+ react_1.default.createElement(react_hook_form_1.Controller, { name: "capitalGains", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
126
+ react_1.default.createElement("span", { className: "absolute left-2.5 top-1/2 -translate-y-1/2 text-tax-axis-text-3 text-[13px]" }, "$"),
127
+ react_1.default.createElement("input", Object.assign({}, field, { placeholder: "0", className: `${inputCls} pl-6` })))) }))),
128
+ react_1.default.createElement("div", { className: subHeaderCls }, "Tax Profile"),
129
+ react_1.default.createElement("div", { className: "grid grid-cols-2 gap-3 mb-2.5" },
130
+ react_1.default.createElement("div", null,
131
+ react_1.default.createElement("label", { className: labelCls }, "Federal Marginal Rate"),
132
+ react_1.default.createElement(react_hook_form_1.Controller, { name: "federalRate", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
133
+ react_1.default.createElement("select", Object.assign({}, field, { className: selectCls }), FEDERAL_RATE_OPTIONS.map(o => (react_1.default.createElement("option", { key: o, value: o, className: "bg-tax-axis-surface-2" }, o)))),
134
+ react_1.default.createElement(Chevron, null))) })),
135
+ react_1.default.createElement("div", null,
136
+ react_1.default.createElement("label", { className: labelCls }, "State Marginal Rate"),
137
+ react_1.default.createElement(react_hook_form_1.Controller, { name: "stateRate", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
138
+ react_1.default.createElement("input", Object.assign({}, field, { placeholder: "4.95", className: `${inputCls} pr-6` })),
139
+ react_1.default.createElement("span", { className: "absolute right-2.5 top-1/2 -translate-y-1/2 text-tax-axis-text-3 text-[13px]" }, "%"))) }))),
140
+ react_1.default.createElement("div", { className: "grid grid-cols-2 gap-3 mb-2.5" },
141
+ react_1.default.createElement("div", null,
142
+ react_1.default.createElement("label", { className: labelCls }, "Tax Data Years Available"),
143
+ react_1.default.createElement(react_hook_form_1.Controller, { name: "taxDataYears", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
144
+ react_1.default.createElement("select", Object.assign({}, field, { className: selectCls }), TAX_DATA_YEARS_OPTIONS.map(o => (react_1.default.createElement("option", { key: o, value: o, className: "bg-tax-axis-surface-2" }, o)))),
145
+ react_1.default.createElement(Chevron, null))) })),
146
+ react_1.default.createElement("div", null,
147
+ react_1.default.createElement("label", { className: labelCls }, "Client Risk Tolerance"),
148
+ react_1.default.createElement(react_hook_form_1.Controller, { name: "riskTolerance", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
149
+ react_1.default.createElement("select", Object.assign({}, field, { className: selectCls }), RISK_OPTIONS.map(o => (react_1.default.createElement("option", { key: o.value, value: o.value, className: "bg-tax-axis-surface-2" }, o.label)))),
150
+ react_1.default.createElement(Chevron, null))) })))))));
151
+ }
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+ interface StateMultiSelectProps {
3
+ selected: string[];
4
+ onChange: (value: string[]) => void;
5
+ }
6
+ export declare function StateMultiSelect({ selected, onChange }: StateMultiSelectProps): React.JSX.Element;
7
+ export {};
@@ -0,0 +1,90 @@
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.StateMultiSelect = StateMultiSelect;
27
+ const react_1 = __importStar(require("react"));
28
+ const data_1 = require("../../lib/data");
29
+ function StateMultiSelect({ selected, onChange }) {
30
+ const [open, setOpen] = (0, react_1.useState)(false);
31
+ const [search, setSearch] = (0, react_1.useState)("");
32
+ const ref = (0, react_1.useRef)(null);
33
+ (0, react_1.useEffect)(() => {
34
+ const h = (e) => {
35
+ if (ref.current && !ref.current.contains(e.target))
36
+ setOpen(false);
37
+ };
38
+ document.addEventListener("mousedown", h);
39
+ return () => document.removeEventListener("mousedown", h);
40
+ }, []);
41
+ const filtered = data_1.US_STATES.filter(s => s.name.toLowerCase().includes(search.toLowerCase()) ||
42
+ s.code.toLowerCase().includes(search.toLowerCase()));
43
+ const toggle = (code) => {
44
+ if (selected.includes(code))
45
+ onChange(selected.filter(c => c !== code));
46
+ else
47
+ onChange([...selected, code]);
48
+ };
49
+ return (react_1.default.createElement("div", { ref: ref, className: "relative" },
50
+ react_1.default.createElement("div", { onClick: () => setOpen(!open), className: `w-full px-3.5 py-2.5 rounded-lg border ${open ? "border-tax-axis-teal-light" : "border-tax-axis-border"} text-sm bg-tax-axis-surface-2 cursor-pointer min-h-[44px] flex items-center flex-wrap gap-1 transition-colors` },
51
+ selected.length === 0 && (react_1.default.createElement("span", { className: "text-tax-axis-text-3" }, "Select states of operation\u2026")),
52
+ selected.length > 0 &&
53
+ selected.length <= 6 &&
54
+ selected.map(c => (react_1.default.createElement("span", { key: c, className: "text-[11px] font-semibold text-tax-axis-teal-light bg-tax-axis-teal-bg px-2 py-0.5 rounded font-tax-axis-mono" }, c))),
55
+ selected.length > 6 && (react_1.default.createElement(react_1.default.Fragment, null,
56
+ selected.slice(0, 5).map(c => (react_1.default.createElement("span", { key: c, className: "text-[11px] font-semibold text-tax-axis-teal-light bg-tax-axis-teal-bg px-2 py-0.5 rounded font-tax-axis-mono" }, c))),
57
+ react_1.default.createElement("span", { className: "text-[11px] font-semibold text-tax-axis-orange bg-tax-axis-orange-bg px-2 py-0.5 rounded font-tax-axis-mono" },
58
+ "+",
59
+ selected.length - 5,
60
+ " more"))),
61
+ react_1.default.createElement("svg", { className: `ml-auto flex-shrink-0 transition-transform ${open ? "rotate-180" : ""}`, width: "12", height: "12", viewBox: "0 0 12 12", fill: "none" },
62
+ react_1.default.createElement("path", { d: "M3 4.5l3 3 3-3", stroke: "#E6E8F5", strokeWidth: "1.5", strokeLinecap: "round" }))),
63
+ open && (react_1.default.createElement("div", { className: "absolute top-full mt-1 left-0 right-0 bg-tax-axis-surface border border-tax-axis-border rounded-xl z-50 max-h-[280px] flex flex-col overflow-hidden", style: { boxShadow: "0 8px 40px rgba(6,8,33,0.6)" } },
64
+ react_1.default.createElement("div", { className: "px-2.5 py-2 border-b border-tax-axis-border" },
65
+ react_1.default.createElement("input", { value: search, onChange: e => setSearch(e.target.value), placeholder: "Search states\u2026", autoFocus: true, className: "w-full px-2.5 py-2 rounded-md border border-tax-axis-border text-[13px] text-white bg-tax-axis-surface-2 outline-none font-tax-axis-body focus:border-tax-axis-teal-light transition-colors" })),
66
+ react_1.default.createElement("div", { className: "px-2.5 pt-1.5 flex gap-1.5" },
67
+ react_1.default.createElement("button", { onClick: () => onChange(data_1.US_STATES.map(s => s.code)), className: "text-[10px] font-semibold text-tax-axis-teal-light bg-tax-axis-teal-bg border-none px-2 py-0.5 rounded font-tax-axis-mono", type: "button" }, "Select All"),
68
+ react_1.default.createElement("button", { onClick: () => onChange([]), className: "text-[10px] font-semibold text-tax-axis-text-3 bg-tax-axis-surface-2 border border-tax-axis-border px-2 py-0.5 rounded font-tax-axis-mono", type: "button" }, "Clear"),
69
+ react_1.default.createElement("span", { className: "text-[10px] text-tax-axis-text-4 font-tax-axis-mono ml-auto self-center" },
70
+ selected.length,
71
+ " selected")),
72
+ react_1.default.createElement("div", { className: "overflow-y-auto flex-1 px-1.5 py-1" }, filtered.map(s => {
73
+ const on = selected.includes(s.code);
74
+ return (react_1.default.createElement("div", { key: s.code, onClick: () => toggle(s.code), className: `flex items-center gap-2.5 px-2.5 py-[7px] rounded-md cursor-pointer ${on ? "bg-tax-axis-teal-bg" : ""}`, onMouseOver: e => {
75
+ if (!on)
76
+ e.currentTarget.style.background = "rgba(255,255,255,0.03)";
77
+ }, onMouseOut: e => {
78
+ if (!on)
79
+ e.currentTarget.style.background = "transparent";
80
+ } },
81
+ react_1.default.createElement("div", { className: `w-4 h-4 rounded flex items-center justify-center flex-shrink-0 border-[1.5px] ${on
82
+ ? "border-tax-axis-teal-light bg-tax-axis-teal"
83
+ : "border-tax-axis-text-4 bg-transparent"}` }, on && (react_1.default.createElement("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none" },
84
+ react_1.default.createElement("path", { d: "M2 5l2.5 2.5L8 3", stroke: "white", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" })))),
85
+ react_1.default.createElement("span", { className: `text-[13px] font-tax-axis-body flex-1 ${on ? "text-white" : "text-tax-axis-text-2"}` }, s.name),
86
+ react_1.default.createElement("span", { className: "text-[10px] font-semibold text-tax-axis-text-4 font-tax-axis-mono w-6" }, s.code),
87
+ data_1.NO_INCOME_TAX.has(s.code) && (react_1.default.createElement("span", { className: "text-[8px] font-bold text-tax-axis-green bg-tax-axis-green-bg px-1.5 py-px rounded font-tax-axis-mono" }, "NO TAX")),
88
+ data_1.PTE_STATES.has(s.code) && !data_1.NO_INCOME_TAX.has(s.code) && (react_1.default.createElement("span", { className: "text-[8px] font-bold text-tax-axis-teal-light bg-tax-axis-teal-bg px-1.5 py-px rounded font-tax-axis-mono" }, "PTE"))));
89
+ }))))));
90
+ }
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+ import { ClientProfile } from "../../lib/types";
3
+ interface StrategyRadarProps {
4
+ profile: Partial<ClientProfile>;
5
+ }
6
+ export declare function StrategyRadar({ profile }: StrategyRadarProps): React.JSX.Element;
7
+ export {};
@@ -0,0 +1,240 @@
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.StrategyRadar = StrategyRadar;
27
+ const react_1 = __importStar(require("react"));
28
+ const strategies_1 = require("../../lib/data/strategies");
29
+ const states_1 = require("../../lib/data/states");
30
+ const compute_1 = require("../../lib/compute");
31
+ // ═══════════════════════════════════════════════════════════════════
32
+ // SVG fill/stroke hex values and CSS font-family strings from the
33
+ // tax-axis Tailwind token config (S0.7). Replaces the mock's T
34
+ // theme object for SVG attributes and inline styles where Tailwind
35
+ // classes don't apply.
36
+ // ═══════════════════════════════════════════════════════════════════
37
+ const T = {
38
+ accent: "#248384",
39
+ accentLt: "#A1E5E6",
40
+ accentBg: "rgba(36,131,132,0.10)",
41
+ white: "#FFFFFF",
42
+ text2: "#E6E8F5",
43
+ text3: "#C8CCE5",
44
+ text4: "#9498B8",
45
+ surface2: "#151B3D",
46
+ border: "rgba(255,255,255,0.08)",
47
+ green: "#0F6E56",
48
+ orange: "#FB9A1D",
49
+ shadow: "0 2px 12px rgba(6,8,33,0.5)",
50
+ // G3/G5 — font conversions
51
+ body: "'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif",
52
+ head: "'Playfair Display','Georgia','Times New Roman',serif",
53
+ mono: "'JetBrains Mono','Fira Code',monospace",
54
+ };
55
+ // ═══════════════════════════════════════════════════════════════════
56
+ // RADAR_NODES — shortened labels for each of the 25 strategy nodes.
57
+ // Ported verbatim from mock (App.jsx:849-852).
58
+ // G5 patch: "Sec. 179" (not "§179"), "Bus. Interest" (not "§163(j)").
59
+ // ═══════════════════════════════════════════════════════════════════
60
+ const SHORTS = {
61
+ "Business Entity Structure": "Entity Struct.",
62
+ "Section 179 Expensing": "Sec. 179",
63
+ "Bonus Depreciation §168(k)": "Bonus Dep.",
64
+ "QBI Deduction §199A": "QBI §199A",
65
+ "R&D Credit §41": "R&D Credit",
66
+ "WOTC": "WOTC",
67
+ "Retirement Plan Upgrade": "Retirement",
68
+ "Cost Segregation": "Cost Seg.",
69
+ "HSA Maximization": "HSA Max",
70
+ "Business Meal Deductions": "Meals",
71
+ "Professional Services Deductions": "Prof. Svc",
72
+ "Home Office Deduction": "Home Office",
73
+ "Employee Benefit Credits": "Emp. Ben.",
74
+ "Charitable Contribution Strategies": "Charit.",
75
+ "SALT / PTE Optimization": "SALT/PTE",
76
+ "Business Interest §163(j)": "Bus. Interest",
77
+ "Income Deferral & Timing": "Deferral",
78
+ "Opportunity Zone §1400Z": "Opp. Zone",
79
+ "Energy Credits §179D": "Energy §179D",
80
+ "Tax Method Elections": "Methods",
81
+ "Qualified Tips Deduction": "Qual. Tips",
82
+ "Overtime Pay Deduction": "Overtime",
83
+ "R&E Catch-Up §174A": "R&E Catch-Up",
84
+ "Employer Childcare Credit": "Childcare",
85
+ "Trump Accounts": "Trump Acct.",
86
+ };
87
+ const RADAR_NODES = strategies_1.STRATEGIES.map(s => ({
88
+ id: String(s.rank),
89
+ label: SHORTS[s.name] || s.name,
90
+ short: s.code,
91
+ }));
92
+ function StrategyRadar({ profile }) {
93
+ var _a, _b, _c;
94
+ const [expanded, setExpanded] = (0, react_1.useState)(false);
95
+ // Defensive ?? defaults for Partial<ClientProfile>:
96
+ // - entity: required by ENTITY_TO_BUCKETS in filterEligibleStrategies (undefined crashes)
97
+ // - states: used for PTE/NoTax/Nexus calculations (undefined crashes .some())
98
+ // - revenue: used for savings display gating
99
+ // - ownsRealEstate / equipmentPurchased: used for dimHint / warnHint on specific nodes
100
+ const entity = (_a = profile.entity) !== null && _a !== void 0 ? _a : "S-Corporation";
101
+ const states = (_b = profile.states) !== null && _b !== void 0 ? _b : [];
102
+ const rev = parseInt((profile.revenue || "0").replace(/,/g, "")) || 0;
103
+ const noRealEstate = ((_c = profile.ownsRealEstate) !== null && _c !== void 0 ? _c : "No") === "No";
104
+ const noEquipment = !profile.equipmentPurchased || profile.equipmentPurchased === "0";
105
+ const safeProfile = Object.assign(Object.assign({}, profile), { entity });
106
+ const eligibleStrategies = (0, compute_1.filterEligibleStrategies)(safeProfile);
107
+ const eligibleIds = new Set(eligibleStrategies.map(s => String(s.rank)));
108
+ const stratCount = eligibleStrategies.length;
109
+ const computed = (0, react_1.useMemo)(() => (0, compute_1.computeAllStrategies)(safeProfile), [profile]);
110
+ const loSum = eligibleStrategies.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);
111
+ const hiSum = eligibleStrategies.reduce((a, s) => { var _a, _b; return a + ((_b = (_a = computed.get(s.rank)) === null || _a === void 0 ? void 0 : _a.hi) !== null && _b !== void 0 ? _b : s.hi); }, 0);
112
+ const highImpact = eligibleStrategies.filter(s => s.priority === "HIGH").length;
113
+ const quickWins = eligibleStrategies.filter(s => s.priority === "QUICK WIN").length;
114
+ const obbbaNew = eligibleStrategies.filter(s => s.cat === "obbba_new").length;
115
+ const hasPTE = states.some(s => states_1.PTE_STATES.has(s));
116
+ const hasNoTax = states.some(s => states_1.NO_INCOME_TAX.has(s));
117
+ const total = RADAR_NODES.length;
118
+ // G4 — Sizing: compact vs expanded
119
+ const sz = expanded ? 580 : 320;
120
+ const cx = sz / 2, cy = sz / 2, r = expanded ? 210 : 120;
121
+ const labelR = expanded ? r + 30 : r + 16;
122
+ const dotSz = expanded ? 8 : 5;
123
+ const dotOff = expanded ? 5 : 3;
124
+ // G4 — Node label sizing
125
+ const nameSz = expanded ? 13 : 9;
126
+ const codeSz = expanded ? 9 : 0;
127
+ // ── SVG Radar ──
128
+ const renderRadar = (
129
+ // G5 — Canvas padding: width={sz+160}, height={sz+48}, viewBox -80 -24
130
+ react_1.default.createElement("svg", { width: sz + 160, height: sz + 48, viewBox: `-80 -24 ${sz + 160} ${sz + 48}`, style: { transition: "width .3s, height .3s", overflow: "visible" } },
131
+ [r, Math.round(r * 0.7), Math.round(r * 0.4)].map(rd => (react_1.default.createElement("circle", { key: rd, cx: cx, cy: cy, r: rd, fill: "none", stroke: T.border, strokeWidth: 1, strokeDasharray: "4 4", opacity: 0.25 }))),
132
+ react_1.default.createElement("line", { x1: cx - r - 8, y1: cy, x2: cx + r + 8, y2: cy, stroke: T.border, strokeWidth: 1, opacity: 0.1 }),
133
+ react_1.default.createElement("line", { x1: cx, y1: cy - r - 8, x2: cx, y2: cy + r + 8, stroke: T.border, strokeWidth: 1, opacity: 0.1 }),
134
+ react_1.default.createElement("circle", { cx: cx, cy: cy, r: r, fill: "none", stroke: T.accent, strokeWidth: 1.5, opacity: 0.15 },
135
+ react_1.default.createElement("animate", { attributeName: "r", values: `${r - 2};${r + 2};${r - 2}`, dur: "3s", repeatCount: "indefinite" })),
136
+ react_1.default.createElement("circle", { cx: cx, cy: cy, r: expanded ? 28 : 20, fill: "url(#cg)" }),
137
+ react_1.default.createElement("defs", null,
138
+ react_1.default.createElement("radialGradient", { id: "cg" },
139
+ react_1.default.createElement("stop", { offset: "0%", stopColor: T.accent, stopOpacity: stratCount > 15 ? 0.3 : 0.1 }),
140
+ react_1.default.createElement("stop", { offset: "100%", stopColor: T.accent, stopOpacity: 0 }))),
141
+ react_1.default.createElement("text", { x: cx, y: cy - (expanded ? 4 : 2), textAnchor: "middle", fill: T.accentLt, fontSize: expanded ? 30 : 22, fontWeight: 900, fontFamily: T.head }, stratCount),
142
+ react_1.default.createElement("text", { x: cx, y: cy + (expanded ? 14 : 12), textAnchor: "middle", fill: T.text2, fontSize: expanded ? 10 : 8, fontWeight: 600, fontFamily: T.body, letterSpacing: 1 }, "OF 25"),
143
+ RADAR_NODES.map((s, i) => {
144
+ const a = (i / total) * Math.PI * 2 - Math.PI / 2;
145
+ const nx = cx + Math.cos(a) * r;
146
+ const ny = cy + Math.sin(a) * r;
147
+ const on = eligibleIds.has(s.id);
148
+ const dimHint = on && s.id === "8" && noRealEstate;
149
+ const warnHint = on && (s.id === "2" || s.id === "3") && noEquipment;
150
+ const nodeOpacity = dimHint ? 0.4 : 1;
151
+ const lx = cx + Math.cos(a) * labelR;
152
+ const ly = cy + Math.sin(a) * labelR;
153
+ const deg = ((a * 180 / Math.PI) + 360) % 360;
154
+ const anchor = deg > 100 && deg < 260 ? "end" : deg < 80 || deg > 280 ? "start" : "middle";
155
+ return (react_1.default.createElement("g", { key: s.id, opacity: nodeOpacity },
156
+ react_1.default.createElement("line", { x1: cx, y1: cy, x2: nx, y2: ny, stroke: on ? T.accent : T.text4, strokeWidth: on ? 1 : 0.3, opacity: on ? 0.25 : 0.05 }),
157
+ on && react_1.default.createElement("circle", { cx: nx, cy: ny, r: dotSz * 2, fill: T.accent, opacity: 0.06 }),
158
+ react_1.default.createElement("circle", { cx: nx, cy: ny, r: on ? dotSz : dotOff, fill: on ? T.accent : T.surface2, stroke: on ? T.accentLt : T.text4, strokeWidth: on ? 1.5 : 0.7 }, on && react_1.default.createElement("animate", { attributeName: "r", values: `${dotSz - 1};${dotSz + 1};${dotSz - 1}`, dur: "3s", begin: `${i * 0.12}s`, repeatCount: "indefinite" })),
159
+ react_1.default.createElement("text", { x: lx, y: ly + (expanded ? -1 : 2), textAnchor: anchor, fill: on ? T.white : T.text4, fontSize: nameSz, fontWeight: on ? 700 : 500, fontFamily: T.body }, s.label),
160
+ expanded && (react_1.default.createElement("text", { x: lx, y: ly + 12, textAnchor: anchor, fill: on ? T.text2 : T.text4, fontSize: codeSz, fontWeight: 500, fontFamily: T.mono, opacity: on ? 0.85 : 0.4 }, s.short)),
161
+ expanded && warnHint && (react_1.default.createElement("text", { x: lx, y: ly + 22, textAnchor: anchor, fill: T.orange, fontSize: 8, fontFamily: T.body, fontWeight: 500 }, "No equipment data"))));
162
+ })));
163
+ // ── HTML wrapper ──
164
+ return (react_1.default.createElement("div", { style: {
165
+ background: "#0F1330",
166
+ border: `1px solid ${T.border}`,
167
+ borderRadius: 14,
168
+ padding: "20px 16px",
169
+ boxShadow: T.shadow,
170
+ position: "relative",
171
+ overflow: "visible",
172
+ } },
173
+ react_1.default.createElement("div", { style: {
174
+ position: "absolute",
175
+ top: "-40%",
176
+ left: "-20%",
177
+ width: "140%",
178
+ height: "140%",
179
+ background: "radial-gradient(circle at 50% 50%,rgba(36,131,132,0.06) 0%,transparent 60%)",
180
+ pointerEvents: "none",
181
+ } }),
182
+ react_1.default.createElement("div", { style: { position: "relative" } },
183
+ react_1.default.createElement("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: 10 } },
184
+ react_1.default.createElement("span", { style: { fontSize: 11, fontWeight: 700, color: T.accentLt, textTransform: "uppercase", letterSpacing: 1.5, fontFamily: T.body } }, "Strategy Radar"),
185
+ react_1.default.createElement("button", { onClick: () => setExpanded(!expanded), style: {
186
+ display: "flex",
187
+ alignItems: "center",
188
+ gap: 5,
189
+ padding: "4px 10px",
190
+ background: expanded ? T.accentBg : "transparent",
191
+ border: `1px solid ${expanded ? T.accent : T.border}`,
192
+ borderRadius: 6,
193
+ fontSize: 10,
194
+ fontWeight: 600,
195
+ color: expanded ? T.accentLt : T.text3,
196
+ fontFamily: T.body,
197
+ letterSpacing: 0.3,
198
+ transition: "all .2s",
199
+ cursor: "pointer",
200
+ }, type: "button" },
201
+ react_1.default.createElement("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none" },
202
+ react_1.default.createElement("path", { d: expanded
203
+ ? "M8 3v3a2 2 0 01-2 2H3m18 0h-3a2 2 0 01-2-2V3m0 18v-3a2 2 0 012-2h3M3 16h3a2 2 0 012 2v3"
204
+ : "M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" })),
205
+ expanded ? "Compact" : "Expand")),
206
+ react_1.default.createElement("div", { style: { display: "flex", justifyContent: "center", marginBottom: 10, overflow: "visible" } }, renderRadar),
207
+ react_1.default.createElement("div", { style: { textAlign: "center", marginBottom: 14 } },
208
+ react_1.default.createElement("div", { style: { fontSize: 11, fontWeight: 600, color: T.text2, textTransform: "uppercase", letterSpacing: 1.2, marginBottom: 4, fontFamily: T.body } }, "Estimated Savings Range"),
209
+ react_1.default.createElement("div", { style: {
210
+ fontSize: expanded ? 36 : 30,
211
+ fontWeight: 900,
212
+ color: rev > 0 ? T.accentLt : T.text4,
213
+ fontFamily: T.head,
214
+ letterSpacing: "-1.5px",
215
+ transition: "all .3s",
216
+ } }, rev > 0 ? (0, compute_1.fmtK)(loSum) + "\u2013" + (0, compute_1.fmtK)(hiSum) : "\u2014"),
217
+ rev > 0 && (react_1.default.createElement("div", { style: { fontSize: 12, color: T.text2, marginTop: 2, fontFamily: T.body } }, "Pending document analysis"))),
218
+ react_1.default.createElement("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr 1fr", gap: 8, marginBottom: 14 } }, [
219
+ { v: highImpact, l: "High Priority", c: T.accentLt },
220
+ { v: quickWins, l: "Quick Wins", c: T.green },
221
+ { v: 25 - stratCount, l: "Not Eligible", c: T.text4 },
222
+ ].map(({ v, l, c }) => (react_1.default.createElement("div", { key: l, style: {
223
+ textAlign: "center",
224
+ padding: "10px 8px",
225
+ background: T.surface2,
226
+ borderRadius: 8,
227
+ border: `1px solid ${T.border}`,
228
+ } },
229
+ react_1.default.createElement("div", { style: { fontSize: 20, fontWeight: 700, color: c, fontFamily: T.head, letterSpacing: "-.5px" } }, v),
230
+ react_1.default.createElement("div", { style: { fontSize: 10, fontWeight: 600, color: T.text2, textTransform: "uppercase", letterSpacing: 1, marginTop: 2, fontFamily: T.body } }, l))))),
231
+ react_1.default.createElement("div", { style: { borderTop: `1px solid ${T.border}`, paddingTop: 12, display: "grid", gap: 8 } }, [
232
+ { l: "PTE Election Eligible", v: hasPTE ? "YES" : "NO", c: hasPTE ? T.green : T.text4 },
233
+ { l: "No-Income-Tax States", v: String(states.filter(s => states_1.NO_INCOME_TAX.has(s)).length), c: hasNoTax ? T.green : T.text4 },
234
+ { l: "Multi-State Nexus Risk", v: states.length > 1 ? "FLAGGED" : "NONE", c: states.length > 1 ? T.orange : T.text4 },
235
+ { l: "OBBBA New Provisions", v: obbbaNew + " eligible", c: T.orange },
236
+ ].map(({ l, v, c }) => (react_1.default.createElement("div", { key: l, style: { display: "flex", justifyContent: "space-between", alignItems: "center" } },
237
+ react_1.default.createElement("span", { style: { fontSize: 12, color: T.text2, fontFamily: T.body } }, l),
238
+ react_1.default.createElement("span", { style: { fontSize: 12, fontWeight: 700, color: c, fontFamily: T.body, letterSpacing: 0.3 } }, v))))),
239
+ react_1.default.createElement("p", { style: { fontSize: 11, color: T.text3, fontFamily: T.body, lineHeight: 1.5, marginTop: 12, textAlign: "center" } }, "Updates live as you change entity, revenue, and states."))));
240
+ }
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import { ClientProfile, TaxAxisScreenProps } from "../../lib/types";
3
+ export interface TaxAxisIntakeProps extends TaxAxisScreenProps {
4
+ onProspect: (profile: ClientProfile) => void;
5
+ onFullAnalysis: (profile: ClientProfile) => void;
6
+ initialProfile?: Partial<ClientProfile>;
7
+ }
8
+ export declare function TaxAxisIntake({ userContext, onProspect, onFullAnalysis, initialProfile, }: TaxAxisIntakeProps): React.JSX.Element;
@@ -0,0 +1,38 @@
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.TaxAxisIntake = TaxAxisIntake;
7
+ const react_1 = __importDefault(require("react"));
8
+ const react_hook_form_1 = require("react-hook-form");
9
+ const yup_1 = require("@hookform/resolvers/yup");
10
+ const intakeSchema_1 = require("./intakeSchema");
11
+ const ClientParametersSection_1 = require("./ClientParametersSection");
12
+ const RefineAnalysisSection_1 = require("./RefineAnalysisSection");
13
+ const CpaIntakeQuestionsSection_1 = require("./CpaIntakeQuestionsSection");
14
+ const StrategyRadar_1 = require("./StrategyRadar");
15
+ const IntakeCtaCards_1 = require("./IntakeCtaCards");
16
+ function TaxAxisIntake({ userContext = "expert", onProspect, onFullAnalysis, initialProfile, }) {
17
+ const methods = (0, react_hook_form_1.useForm)({
18
+ resolver: (0, yup_1.yupResolver)(intakeSchema_1.intakeSchema), // yupResolver generic incompatibility with RHF v7 — cast is intentional
19
+ defaultValues: Object.assign(Object.assign({}, intakeSchema_1.intakeDefaultValues), initialProfile),
20
+ mode: "onChange",
21
+ });
22
+ const profile = methods.watch();
23
+ const handleProspect = () => {
24
+ methods.handleSubmit((valid) => onProspect(valid), () => { })();
25
+ };
26
+ const handleFull = () => {
27
+ methods.handleSubmit((valid) => onFullAnalysis(valid), () => { })();
28
+ };
29
+ return (react_1.default.createElement(react_hook_form_1.FormProvider, Object.assign({}, methods),
30
+ react_1.default.createElement("div", { className: "grid grid-cols-[1fr_1fr] gap-5" },
31
+ react_1.default.createElement("div", { className: "flex flex-col gap-4" },
32
+ react_1.default.createElement(ClientParametersSection_1.ClientParametersSection, { userContext: userContext }),
33
+ react_1.default.createElement(RefineAnalysisSection_1.RefineAnalysisSection, { userContext: userContext }),
34
+ react_1.default.createElement(CpaIntakeQuestionsSection_1.CpaIntakeQuestionsSection, { userContext: userContext }),
35
+ react_1.default.createElement(IntakeCtaCards_1.IntakeCtaCards, { onProspect: handleProspect, onFullAnalysis: handleFull, userContext: userContext })),
36
+ react_1.default.createElement("div", { className: "sticky top-5 self-start" },
37
+ react_1.default.createElement(StrategyRadar_1.StrategyRadar, { profile: profile })))));
38
+ }