@paro.io/expert-shared-components 1.14.43 → 1.14.46
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.
- package/LICENSE +21 -21
- package/README.md +2 -2
- package/lib/README.md +2 -0
- package/lib/components/ClientReferencesSection/DeleteButton.js +11 -11
- package/lib/components/ClientReferencesSection/ParoError.js +10 -10
- package/lib/components/ClientReferencesSection/TagsSection.js +2 -2
- package/lib/components/ClientReferencesSection/styles/BrandedTypography.js +2 -2
- package/lib/components/ClientReferencesSection/styles/Buttons.js +15 -15
- package/lib/components/ClientReferencesSection/styles/Name.js +5 -5
- package/lib/components/ClientReferencesSection/styles/NullContentConditionalColor.js +4 -4
- package/lib/components/ClientReferencesSection/styles/SectionBody.js +11 -11
- package/lib/components/ClientReferencesSection/styles/SectionTitle.js +6 -6
- package/lib/components/ClientReferencesSection/styles/Tags.js +2 -2
- package/lib/components/DiscussionThread/DiscussionThread.d.ts +25 -25
- package/lib/components/DiscussionThread/DiscussionThread.js +137 -137
- package/lib/components/DiscussionThread/chat.d.ts +22 -22
- package/lib/components/DiscussionThread/chat.js +106 -106
- package/lib/components/DiscussionThread/index.d.ts +1 -1
- package/lib/components/DiscussionThread/index.js +5 -5
- package/lib/components/DocumentCenter/DocumentTable.d.ts +15 -15
- package/lib/components/DocumentCenter/DocumentTable.js +350 -350
- package/lib/components/DocumentCenter/DragDropUpload.js +4 -4
- package/lib/components/DocumentCenter/UploadFilesButton.d.ts +6 -6
- package/lib/components/DocumentCenter/UploadFilesButton.js +29 -29
- package/lib/components/EarningsTracker/ActiveProjectCard.d.ts +52 -52
- package/lib/components/EarningsTracker/ActiveProjectCard.js +161 -161
- package/lib/components/EarningsTracker/CenterCardUI.d.ts +13 -13
- package/lib/components/EarningsTracker/CenterCardUI.js +134 -134
- package/lib/components/EarningsTracker/EarningsTracker.d.ts +52 -52
- package/lib/components/EarningsTracker/EarningsTracker.js +508 -508
- package/lib/components/EarningsTracker/EditDateModal.d.ts +22 -22
- package/lib/components/EarningsTracker/EditDateModal.js +149 -149
- package/lib/components/EarningsTracker/EmailModal.d.ts +14 -14
- package/lib/components/EarningsTracker/EmailModal.js +79 -79
- package/lib/components/EarningsTracker/EndProjectModal.d.ts +56 -56
- package/lib/components/EarningsTracker/EndProjectModal.js +221 -221
- package/lib/components/EarningsTracker/LeftCardUI.d.ts +18 -18
- package/lib/components/EarningsTracker/LeftCardUI.js +189 -189
- package/lib/components/EarningsTracker/LogTimeModalAuthenticated.d.ts +52 -52
- package/lib/components/EarningsTracker/LogTimeModalAuthenticated.js +358 -358
- package/lib/components/EarningsTracker/ProgressBar.d.ts +4 -4
- package/lib/components/EarningsTracker/ProgressBar.js +66 -66
- package/lib/components/EarningsTracker/ReviewRequestModal.d.ts +17 -17
- package/lib/components/EarningsTracker/ReviewRequestModal.js +135 -135
- package/lib/components/EarningsTracker/RightCardUI.d.ts +46 -46
- package/lib/components/EarningsTracker/RightCardUI.js +231 -231
- package/lib/components/EarningsTracker/index.d.ts +1 -1
- package/lib/components/EarningsTracker/index.js +5 -5
- package/lib/components/Escalations/CustomTag.d.ts +3 -3
- package/lib/components/Escalations/CustomTag.js +25 -25
- package/lib/components/Escalations/ViewReponseModal.d.ts +8 -8
- package/lib/components/Escalations/ViewReponseModal.js +27 -27
- package/lib/components/ExpertProfileHeader/ActionButtonSection.js +6 -6
- package/lib/components/ExpertProfileHeader/ProfileSection.js +7 -7
- package/lib/components/Invoices/TestDecisionSection.d.ts +1 -1
- package/lib/components/Invoices/TestDecisionSection.js +126 -126
- package/lib/components/OrganizationChart/OrganizationChart.d.ts +15 -15
- package/lib/components/OrganizationChart/OrganizationChart.js +312 -312
- package/lib/components/OrganizationChart/PersonCard.js +5 -5
- package/lib/components/OrganizationChart/utils.js +79 -79
- package/lib/components/ProjectCard/ProgressBar.js +4 -4
- package/lib/components/ProjectCard/ReviewRequestModal.js +5 -5
- package/lib/components/ProjectIntelligence/MissingInformation/index.js +1 -1
- package/lib/components/Reviews/Pagination.js +6 -6
- package/lib/components/ReviewsTab/RatingHeader.js +6 -6
- package/lib/components/ReviewsTab/expert-shared-components.code-workspace +20 -20
- package/lib/components/ReviewsTab/reviewRequestModal.js +5 -5
- package/lib/components/shared/Image.js +13 -13
- package/lib/components/shared/ProfileTextField.d.ts +18 -18
- package/lib/components/shared/ProfileTextField.js +16 -16
- package/lib/components/shared/StyledActionButtons.d.ts +7 -7
- package/lib/components/shared/StyledActionButtons.js +15 -15
- package/lib/components/shared/ToastNotification.d.ts +10 -10
- package/lib/components/shared/ToastNotification.js +63 -63
- package/lib/index.d.ts +13 -0
- package/lib/index.js +27 -1
- package/lib/package.json +68 -0
- package/lib/tax-axis/components/clientReport/ClientReportCover.d.ts +9 -0
- package/lib/tax-axis/components/clientReport/ClientReportCover.js +39 -0
- package/lib/tax-axis/components/clientReport/ClientReportTOC.d.ts +8 -0
- package/lib/tax-axis/components/clientReport/ClientReportTOC.js +24 -0
- package/lib/tax-axis/components/clientReport/ClientReportToolbar.d.ts +2 -0
- package/lib/tax-axis/components/clientReport/ClientReportToolbar.js +6 -0
- package/lib/tax-axis/components/clientReport/ETRChart.d.ts +10 -0
- package/lib/tax-axis/components/clientReport/ETRChart.js +50 -0
- package/lib/tax-axis/components/clientReport/ExecutiveSummary.d.ts +15 -0
- package/lib/tax-axis/components/clientReport/ExecutiveSummary.js +73 -0
- package/lib/tax-axis/components/clientReport/FootnoteBlock.d.ts +11 -0
- package/lib/tax-axis/components/clientReport/FootnoteBlock.js +34 -0
- package/lib/tax-axis/components/clientReport/ImplementationRoadmap.d.ts +26 -0
- package/lib/tax-axis/components/clientReport/ImplementationRoadmap.js +51 -0
- package/lib/tax-axis/components/clientReport/ImplementationTimelineChart.d.ts +10 -0
- package/lib/tax-axis/components/clientReport/ImplementationTimelineChart.js +49 -0
- package/lib/tax-axis/components/clientReport/Methodology.d.ts +10 -0
- package/lib/tax-axis/components/clientReport/Methodology.js +40 -0
- package/lib/tax-axis/components/clientReport/QuarterlyCashChart.d.ts +10 -0
- package/lib/tax-axis/components/clientReport/QuarterlyCashChart.js +56 -0
- package/lib/tax-axis/components/clientReport/RecommendedStrategies.d.ts +13 -0
- package/lib/tax-axis/components/clientReport/RecommendedStrategies.js +51 -0
- package/lib/tax-axis/components/clientReport/SavingsStackChart.d.ts +10 -0
- package/lib/tax-axis/components/clientReport/SavingsStackChart.js +66 -0
- package/lib/tax-axis/components/clientReport/SectionOpener.d.ts +11 -0
- package/lib/tax-axis/components/clientReport/SectionOpener.js +20 -0
- package/lib/tax-axis/components/clientReport/Sidebar.d.ts +8 -0
- package/lib/tax-axis/components/clientReport/Sidebar.js +37 -0
- package/lib/tax-axis/components/clientReport/StrategyCard.d.ts +16 -0
- package/lib/tax-axis/components/clientReport/StrategyCard.js +63 -0
- package/lib/tax-axis/components/clientReport/TaxAxisClientReport.d.ts +9 -0
- package/lib/tax-axis/components/clientReport/TaxAxisClientReport.js +125 -0
- package/lib/tax-axis/components/clientReport/applyFootnotes.d.ts +12 -0
- package/lib/tax-axis/components/clientReport/applyFootnotes.js +43 -0
- package/lib/tax-axis/components/clientReport/palette.d.ts +28 -0
- package/lib/tax-axis/components/clientReport/palette.js +34 -0
- package/lib/tax-axis/components/dashboard/ConfidenceArc.d.ts +7 -0
- package/lib/tax-axis/components/dashboard/ConfidenceArc.js +20 -0
- package/lib/tax-axis/components/dashboard/DashboardActions.d.ts +13 -0
- package/lib/tax-axis/components/dashboard/DashboardActions.js +94 -0
- package/lib/tax-axis/components/dashboard/DashboardSummary.d.ts +11 -0
- package/lib/tax-axis/components/dashboard/DashboardSummary.js +98 -0
- package/lib/tax-axis/components/dashboard/DashboardTopBar.d.ts +10 -0
- package/lib/tax-axis/components/dashboard/DashboardTopBar.js +48 -0
- package/lib/tax-axis/components/dashboard/StrategyDetailPanel.d.ts +10 -0
- package/lib/tax-axis/components/dashboard/StrategyDetailPanel.js +139 -0
- package/lib/tax-axis/components/dashboard/StrategyTile.d.ts +10 -0
- package/lib/tax-axis/components/dashboard/StrategyTile.js +82 -0
- package/lib/tax-axis/components/dashboard/TaxAxisDashboard.d.ts +12 -0
- package/lib/tax-axis/components/dashboard/TaxAxisDashboard.js +285 -0
- package/lib/tax-axis/components/dashboard/useCountUp.d.ts +1 -0
- package/lib/tax-axis/components/dashboard/useCountUp.js +25 -0
- package/lib/tax-axis/components/documents/DocumentCard.d.ts +18 -0
- package/lib/tax-axis/components/documents/DocumentCard.js +61 -0
- package/lib/tax-axis/components/documents/DocumentTier.d.ts +21 -0
- package/lib/tax-axis/components/documents/DocumentTier.js +23 -0
- package/lib/tax-axis/components/documents/TaxAxisDocuments.d.ts +8 -0
- package/lib/tax-axis/components/documents/TaxAxisDocuments.js +157 -0
- package/lib/tax-axis/components/extractionReview/DocumentCard.d.ts +17 -0
- package/lib/tax-axis/components/extractionReview/DocumentCard.js +105 -0
- package/lib/tax-axis/components/extractionReview/FieldRow.d.ts +17 -0
- package/lib/tax-axis/components/extractionReview/FieldRow.js +137 -0
- package/lib/tax-axis/components/extractionReview/PurposeBlock.d.ts +7 -0
- package/lib/tax-axis/components/extractionReview/PurposeBlock.js +18 -0
- package/lib/tax-axis/components/extractionReview/RerunFooter.d.ts +8 -0
- package/lib/tax-axis/components/extractionReview/RerunFooter.js +60 -0
- package/lib/tax-axis/components/extractionReview/TaxAxisExtractionReview.d.ts +11 -0
- package/lib/tax-axis/components/extractionReview/TaxAxisExtractionReview.js +186 -0
- package/lib/tax-axis/components/intake/ClientParametersSection.d.ts +7 -0
- package/lib/tax-axis/components/intake/ClientParametersSection.js +146 -0
- package/lib/tax-axis/components/intake/CpaIntakeQuestionsSection.d.ts +7 -0
- package/lib/tax-axis/components/intake/CpaIntakeQuestionsSection.js +93 -0
- package/lib/tax-axis/components/intake/IntakeCtaCards.d.ts +9 -0
- package/lib/tax-axis/components/intake/IntakeCtaCards.js +30 -0
- package/lib/tax-axis/components/intake/RefineAnalysisSection.d.ts +7 -0
- package/lib/tax-axis/components/intake/RefineAnalysisSection.js +151 -0
- package/lib/tax-axis/components/intake/StateMultiSelect.d.ts +7 -0
- package/lib/tax-axis/components/intake/StateMultiSelect.js +90 -0
- package/lib/tax-axis/components/intake/StrategyRadar.d.ts +7 -0
- package/lib/tax-axis/components/intake/StrategyRadar.js +240 -0
- package/lib/tax-axis/components/intake/TaxAxisIntake.d.ts +8 -0
- package/lib/tax-axis/components/intake/TaxAxisIntake.js +38 -0
- package/lib/tax-axis/components/intake/intakeSchema.d.ts +97 -0
- package/lib/tax-axis/components/intake/intakeSchema.js +91 -0
- package/lib/tax-axis/components/preparerWorkpaper/CalculationTraceAccordion.d.ts +9 -0
- package/lib/tax-axis/components/preparerWorkpaper/CalculationTraceAccordion.js +19 -0
- package/lib/tax-axis/components/preparerWorkpaper/EngagementHeader.d.ts +9 -0
- package/lib/tax-axis/components/preparerWorkpaper/EngagementHeader.js +43 -0
- package/lib/tax-axis/components/preparerWorkpaper/Position6694Accordion.d.ts +9 -0
- package/lib/tax-axis/components/preparerWorkpaper/Position6694Accordion.js +25 -0
- package/lib/tax-axis/components/preparerWorkpaper/PriorityGroup.d.ts +14 -0
- package/lib/tax-axis/components/preparerWorkpaper/PriorityGroup.js +20 -0
- package/lib/tax-axis/components/preparerWorkpaper/Section6694Summary.d.ts +9 -0
- package/lib/tax-axis/components/preparerWorkpaper/Section6694Summary.js +36 -0
- package/lib/tax-axis/components/preparerWorkpaper/SourceDocumentsAccordion.d.ts +9 -0
- package/lib/tax-axis/components/preparerWorkpaper/SourceDocumentsAccordion.js +20 -0
- package/lib/tax-axis/components/preparerWorkpaper/StrategyWorkpaperCard.d.ts +14 -0
- package/lib/tax-axis/components/preparerWorkpaper/StrategyWorkpaperCard.js +53 -0
- package/lib/tax-axis/components/preparerWorkpaper/TaxAxisPreparerWorkpaper.d.ts +9 -0
- package/lib/tax-axis/components/preparerWorkpaper/TaxAxisPreparerWorkpaper.js +175 -0
- package/lib/tax-axis/components/presentationMode/TaxAxisPresentationMode.d.ts +7 -0
- package/lib/tax-axis/components/presentationMode/TaxAxisPresentationMode.js +245 -0
- package/lib/tax-axis/components/processing/ProcessingStages.d.ts +7 -0
- package/lib/tax-axis/components/processing/ProcessingStages.js +17 -0
- package/lib/tax-axis/components/processing/TaxAxisProcessing.d.ts +7 -0
- package/lib/tax-axis/components/processing/TaxAxisProcessing.js +105 -0
- package/lib/tax-axis/components/prospectReport/ProspectCover.d.ts +10 -0
- package/lib/tax-axis/components/prospectReport/ProspectCover.js +47 -0
- package/lib/tax-axis/components/prospectReport/ProspectDocuments.d.ts +9 -0
- package/lib/tax-axis/components/prospectReport/ProspectDocuments.js +31 -0
- package/lib/tax-axis/components/prospectReport/ProspectNextSteps.d.ts +13 -0
- package/lib/tax-axis/components/prospectReport/ProspectNextSteps.js +37 -0
- package/lib/tax-axis/components/prospectReport/ProspectPrintView.d.ts +26 -0
- package/lib/tax-axis/components/prospectReport/ProspectPrintView.js +185 -0
- package/lib/tax-axis/components/prospectReport/ProspectStrategyCard.d.ts +10 -0
- package/lib/tax-axis/components/prospectReport/ProspectStrategyCard.js +52 -0
- package/lib/tax-axis/components/prospectReport/SampleAnalysisPreview.d.ts +7 -0
- package/lib/tax-axis/components/prospectReport/SampleAnalysisPreview.js +120 -0
- package/lib/tax-axis/components/prospectReport/TaxAxisProspectReport.d.ts +9 -0
- package/lib/tax-axis/components/prospectReport/TaxAxisProspectReport.js +173 -0
- package/lib/tax-axis/components/prospectReport/TaxPositionGap.d.ts +15 -0
- package/lib/tax-axis/components/prospectReport/TaxPositionGap.js +45 -0
- package/lib/tax-axis/components/prospectReport/theme.d.ts +26 -0
- package/lib/tax-axis/components/prospectReport/theme.js +33 -0
- package/lib/tax-axis/components/shared/ReportToolbar.d.ts +12 -0
- package/lib/tax-axis/components/shared/ReportToolbar.js +81 -0
- package/lib/tax-axis/components/shared/SectionHeader.d.ts +8 -0
- package/lib/tax-axis/components/shared/SectionHeader.js +15 -0
- package/lib/tax-axis/components/shared/TaxAxisBadge.d.ts +12 -0
- package/lib/tax-axis/components/shared/TaxAxisBadge.js +34 -0
- package/lib/tax-axis/components/shared/TaxAxisButton.d.ts +12 -0
- package/lib/tax-axis/components/shared/TaxAxisButton.js +17 -0
- package/lib/tax-axis/components/shared/TaxAxisCard.d.ts +9 -0
- package/lib/tax-axis/components/shared/TaxAxisCard.js +13 -0
- package/lib/tax-axis/index.d.ts +25 -0
- package/lib/tax-axis/index.js +51 -0
- package/lib/tax-axis/lib/compute/index.d.ts +8 -0
- package/lib/tax-axis/lib/compute/index.js +163 -0
- package/lib/tax-axis/lib/data/documents.d.ts +3 -0
- package/lib/tax-axis/lib/data/documents.js +33 -0
- package/lib/tax-axis/lib/data/extractedData.d.ts +2 -0
- package/lib/tax-axis/lib/data/extractedData.js +47 -0
- package/lib/tax-axis/lib/data/footnoteData.d.ts +2 -0
- package/lib/tax-axis/lib/data/footnoteData.js +48 -0
- package/lib/tax-axis/lib/data/index.d.ts +11 -0
- package/lib/tax-axis/lib/data/index.js +31 -0
- package/lib/tax-axis/lib/data/nextSteps.d.ts +2 -0
- package/lib/tax-axis/lib/data/nextSteps.js +35 -0
- package/lib/tax-axis/lib/data/sidebarLookup.d.ts +2 -0
- package/lib/tax-axis/lib/data/sidebarLookup.js +90 -0
- package/lib/tax-axis/lib/data/sourceDescriptions.d.ts +1 -0
- package/lib/tax-axis/lib/data/sourceDescriptions.js +32 -0
- package/lib/tax-axis/lib/data/states.d.ts +6 -0
- package/lib/tax-axis/lib/data/states.js +25 -0
- package/lib/tax-axis/lib/data/strategies.d.ts +8 -0
- package/lib/tax-axis/lib/data/strategies.js +166 -0
- package/lib/tax-axis/lib/data/strategyNarrative.d.ts +3 -0
- package/lib/tax-axis/lib/data/strategyNarrative.js +170 -0
- package/lib/tax-axis/lib/data/strategyProspect.d.ts +2 -0
- package/lib/tax-axis/lib/data/strategyProspect.js +66 -0
- package/lib/tax-axis/lib/data/workpaperInteractions.d.ts +1 -0
- package/lib/tax-axis/lib/data/workpaperInteractions.js +15 -0
- package/lib/tax-axis/lib/types/index.d.ts +183 -0
- package/lib/tax-axis/lib/types/index.js +7 -0
- package/package.json +68 -67
|
@@ -0,0 +1,51 @@
|
|
|
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.ImplementationRoadmap = ImplementationRoadmap;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const data_1 = require("../../lib/data");
|
|
9
|
+
const SectionOpener_1 = require("./SectionOpener");
|
|
10
|
+
const QuarterlyCashChart_1 = require("./QuarterlyCashChart");
|
|
11
|
+
const ImplementationTimelineChart_1 = require("./ImplementationTimelineChart");
|
|
12
|
+
function ImplementationRoadmap({ eligible, computed, top3, nowCount, nowMidK, bucketDefs, bucketTotals, activeBuckets, palette, }) {
|
|
13
|
+
const card = {
|
|
14
|
+
background: palette.white,
|
|
15
|
+
border: "1px solid " + palette.gray200,
|
|
16
|
+
borderRadius: 12,
|
|
17
|
+
padding: "24px 28px",
|
|
18
|
+
marginBottom: 16,
|
|
19
|
+
boxShadow: "0 1px 3px rgba(0,0,0,0.04)",
|
|
20
|
+
};
|
|
21
|
+
const stSavings = (s) => {
|
|
22
|
+
var _a, _b;
|
|
23
|
+
const c = computed.get(s.rank);
|
|
24
|
+
const lo = Math.round(((_a = c === null || c === void 0 ? void 0 : c.lo) !== null && _a !== void 0 ? _a : s.lo) / 100) * 100;
|
|
25
|
+
const hi = Math.round(((_b = c === null || c === void 0 ? void 0 : c.hi) !== null && _b !== void 0 ? _b : s.hi) / 100) * 100;
|
|
26
|
+
return "$" + (lo / 1000).toFixed(1) + "K\u2013$" + (hi / 1000).toFixed(1) + "K";
|
|
27
|
+
};
|
|
28
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
29
|
+
react_1.default.createElement(SectionOpener_1.SectionOpener, { number: "03", eyebrow: "IMPLEMENTATION ROADMAP", headline: "Most savings can be locked in within the current quarter.", bullets: [
|
|
30
|
+
nowCount + " eligible strategies can be initiated this week, representing roughly $" + nowMidK + "K of the midpoint savings estimate.",
|
|
31
|
+
"Time-sensitive elections and filings have firm deadlines noted in each strategy detail above.",
|
|
32
|
+
"Year-end planning items will be reviewed in a coordinated session before December 31.",
|
|
33
|
+
], palette: palette }),
|
|
34
|
+
react_1.default.createElement(QuarterlyCashChart_1.QuarterlyCashChart, { eligible: eligible, computed: computed, palette: palette }),
|
|
35
|
+
react_1.default.createElement(ImplementationTimelineChart_1.ImplementationTimelineChart, { top3: top3, computed: computed, palette: palette }),
|
|
36
|
+
react_1.default.createElement("div", { style: { marginBottom: 28 } }, activeBuckets.map(b => {
|
|
37
|
+
const bt = bucketTotals[b.key];
|
|
38
|
+
const midK = Math.round((bt.lo + bt.hi) / 2 / 1000);
|
|
39
|
+
return (react_1.default.createElement("div", { key: b.key, className: "bucket-card", style: Object.assign(Object.assign({}, card), { marginBottom: 16 }) },
|
|
40
|
+
react_1.default.createElement("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "baseline", marginBottom: 14, paddingBottom: 10, borderBottom: "1px solid " + palette.gray100 } },
|
|
41
|
+
react_1.default.createElement("div", { style: { display: "flex", alignItems: "baseline", gap: 12 } },
|
|
42
|
+
react_1.default.createElement("div", { style: { fontSize: 11, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.1em", color: b.color, fontFamily: palette.mono } }, b.label),
|
|
43
|
+
react_1.default.createElement("div", { style: { fontSize: 11, color: palette.gray400, fontFamily: palette.mono } }, bt.strategies.length + " " + (bt.strategies.length === 1 ? "strategy" : "strategies"))),
|
|
44
|
+
react_1.default.createElement("div", { style: { fontSize: 13, fontWeight: 700, color: palette.teal, fontFamily: palette.mono } }, "~$" + midK + "K midpoint")),
|
|
45
|
+
bt.strategies.map(s => (react_1.default.createElement("div", { key: s.rank, style: { display: "flex", justifyContent: "space-between", alignItems: "flex-start", padding: "10px 0", borderBottom: "1px solid " + palette.gray100 } },
|
|
46
|
+
react_1.default.createElement("div", { style: { flex: 1 } },
|
|
47
|
+
react_1.default.createElement("div", { style: { fontSize: 14, fontWeight: 600, color: palette.gray800, fontFamily: palette.head } }, s.name),
|
|
48
|
+
react_1.default.createElement("div", { style: { fontSize: 12, color: palette.gray500, marginTop: 2, fontFamily: palette.body } }, data_1.NEXT_STEPS[s.rank] || "Discuss with your preparer.")),
|
|
49
|
+
react_1.default.createElement("div", { style: { fontSize: 13, fontWeight: 700, color: palette.teal, fontFamily: palette.mono, flexShrink: 0, marginLeft: 12 } }, stSavings(s)))))));
|
|
50
|
+
}))));
|
|
51
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { Strategy, ComputedMap } from "../../lib/types";
|
|
3
|
+
import type { Palette } from "./palette";
|
|
4
|
+
interface ImplementationTimelineChartProps {
|
|
5
|
+
top3: Strategy[];
|
|
6
|
+
computed: ComputedMap;
|
|
7
|
+
palette: Palette;
|
|
8
|
+
}
|
|
9
|
+
export declare function ImplementationTimelineChart({ top3, computed, palette }: ImplementationTimelineChartProps): React.JSX.Element;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
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.ImplementationTimelineChart = ImplementationTimelineChart;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
function ImplementationTimelineChart({ top3, computed, palette }) {
|
|
9
|
+
const W = 640, H = Math.max(180, 60 + top3.length * 44);
|
|
10
|
+
const padL = 180, padR = 80, padT = 44, padB = 24;
|
|
11
|
+
const plotW = W - padL - padR, plotH = H - padT - padB;
|
|
12
|
+
const BUCKET_RANGE = { now: [0, 2], "30d": [0, 4], "90d": [2, 12], filing: [36, 52] };
|
|
13
|
+
const weekScale = (w) => padL + (w / 52) * plotW;
|
|
14
|
+
const qDividers = [13, 26, 39];
|
|
15
|
+
const qLabels = ["Q1", "Q2", "Q3", "Q4"];
|
|
16
|
+
return (react_1.default.createElement("div", { className: "chart-block", style: { background: palette.white, border: "1px solid " + palette.gray200, borderRadius: 10, padding: "24px 28px", marginBottom: 24 } },
|
|
17
|
+
react_1.default.createElement("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "baseline", marginBottom: 18 } },
|
|
18
|
+
react_1.default.createElement("div", { style: { fontSize: 10, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.15em", color: palette.gray400, fontFamily: palette.mono } }, "IMPLEMENTATION TIMELINE"),
|
|
19
|
+
react_1.default.createElement("div", { style: { fontSize: 11, fontWeight: 700, color: palette.teal, fontFamily: palette.mono } }, "top " + top3.length + " priorities")),
|
|
20
|
+
react_1.default.createElement("svg", { viewBox: "0 0 " + W + " " + H, style: { width: "100%", height: "auto", display: "block" } },
|
|
21
|
+
[0, 1, 2, 3].map(qi => {
|
|
22
|
+
const x1 = weekScale(qi * 13);
|
|
23
|
+
const x2 = weekScale((qi + 1) * 13);
|
|
24
|
+
return react_1.default.createElement("rect", { key: qi, x: x1, y: padT - 12, width: x2 - x1, height: plotH + 16, fill: qi % 2 === 0 ? palette.gray50 : palette.white });
|
|
25
|
+
}),
|
|
26
|
+
qLabels.map((q, qi) => {
|
|
27
|
+
const cx = weekScale(qi * 13 + 6.5);
|
|
28
|
+
return react_1.default.createElement("text", { key: q, x: cx, y: padT - 18, fontSize: "10", fontWeight: "700", fill: palette.gray400, fontFamily: palette.mono, textAnchor: "middle" },
|
|
29
|
+
q,
|
|
30
|
+
" 2026");
|
|
31
|
+
}),
|
|
32
|
+
qDividers.map(w => (react_1.default.createElement("line", { key: w, x1: weekScale(w), y1: padT - 12, x2: weekScale(w), y2: padT + plotH + 4, stroke: palette.gray200, strokeWidth: "1", strokeDasharray: "2,3" }))),
|
|
33
|
+
top3.map((s, i) => {
|
|
34
|
+
var _a, _b;
|
|
35
|
+
const c = computed.get(s.rank);
|
|
36
|
+
const mid = Math.round((((_a = c === null || c === void 0 ? void 0 : c.lo) !== null && _a !== void 0 ? _a : s.lo) + ((_b = c === null || c === void 0 ? void 0 : c.hi) !== null && _b !== void 0 ? _b : s.hi)) / 2 / 1000);
|
|
37
|
+
const range = BUCKET_RANGE[s.timelineBucket || "30d"] || [0, 4];
|
|
38
|
+
const x1 = weekScale(range[0]);
|
|
39
|
+
const x2 = weekScale(range[1]);
|
|
40
|
+
const y = padT + i * 44 + 12;
|
|
41
|
+
const barH = 20;
|
|
42
|
+
const truncatedName = s.name.length > 22 ? s.name.slice(0, 21) + "\u2026" : s.name;
|
|
43
|
+
return (react_1.default.createElement("g", { key: s.rank },
|
|
44
|
+
react_1.default.createElement("text", { x: padL - 12, y: y + barH / 2 + 4, fontSize: "12", fill: palette.gray700, fontFamily: palette.body, fontWeight: "600", textAnchor: "end" }, truncatedName),
|
|
45
|
+
react_1.default.createElement("rect", { x: x1, y: y, width: Math.max(x2 - x1, 16), height: barH, fill: palette.teal, rx: "3" }),
|
|
46
|
+
react_1.default.createElement("text", { x: Math.max(x2, x1 + 24) + 8, y: y + barH / 2 + 4, fontSize: "11", fill: palette.gray600, fontFamily: palette.mono }, "$" + mid + "K")));
|
|
47
|
+
})),
|
|
48
|
+
react_1.default.createElement("div", { style: { fontSize: 10, color: palette.gray500, fontFamily: palette.body, lineHeight: 1.6, marginTop: 14, paddingTop: 12, borderTop: "1px solid " + palette.gray100 } }, "Bar position reflects the strategy's earliest implementation window. Each bar's dollar value is the mid-point estimate for that strategy alone, before interaction adjustment.")));
|
|
49
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { ClientProfile, Strategy } from "../../lib/types";
|
|
3
|
+
import type { Palette } from "./palette";
|
|
4
|
+
interface MethodologyProps {
|
|
5
|
+
profile: ClientProfile;
|
|
6
|
+
eligible: Strategy[];
|
|
7
|
+
palette: Palette;
|
|
8
|
+
}
|
|
9
|
+
export declare function Methodology({ profile, eligible, palette }: MethodologyProps): React.JSX.Element;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
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.Methodology = Methodology;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const data_1 = require("../../lib/data");
|
|
9
|
+
const SectionOpener_1 = require("./SectionOpener");
|
|
10
|
+
function Methodology({ profile, eligible, palette }) {
|
|
11
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
12
|
+
react_1.default.createElement(SectionOpener_1.SectionOpener, { number: "04", eyebrow: "METHODOLOGY", headline: "How TaxAxis arrives at these numbers.", bullets: [
|
|
13
|
+
"25 federal strategies evaluated against your profile via deterministic, rule-based computation at temperature zero \u2014 every recommendation traces to a specific IRC section, revenue ruling, or OBBBA provision.",
|
|
14
|
+
"Confidence bands reflect data quality: \u00B130% on single-year data, narrowing to \u00B115% with multi-year history.",
|
|
15
|
+
"Aggregate savings on the cover chart are adjusted by an interaction-discount factor reflecting strategy stacking, marginal-rate exhaustion, and \u00A76694 reasonableness.",
|
|
16
|
+
], palette: palette }),
|
|
17
|
+
react_1.default.createElement("div", { style: { marginBottom: 28 } },
|
|
18
|
+
react_1.default.createElement("div", { style: { fontSize: 10, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.12em", color: palette.gray400, fontFamily: palette.mono, marginBottom: 8 } }, "EVAL PIPELINE"),
|
|
19
|
+
react_1.default.createElement("div", { style: { fontSize: 13, color: palette.gray700, lineHeight: 1.8, fontFamily: palette.body } }, "TaxAxis evaluates 25 federal tax strategies against each client profile. The computation is entirely deterministic and rule-based, operating at temperature zero \u2014 no generative model is involved at any stage. Each strategy passes through a three-phase pipeline: an eligibility filter removes strategies that do not apply to the entity type, industry, or fact pattern, then the computation engine calculates savings ranges against IRC-cited rules using the client's actual financial data. Every recommendation is reviewed by a qualified tax professional before the report is issued.")),
|
|
20
|
+
react_1.default.createElement("div", { style: { marginBottom: 28 } },
|
|
21
|
+
react_1.default.createElement("div", { style: { fontSize: 10, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.12em", color: palette.gray400, fontFamily: palette.mono, marginBottom: 8 } }, "CONFIDENCE BANDS"),
|
|
22
|
+
react_1.default.createElement("div", { style: { fontSize: 13, color: palette.gray700, lineHeight: 1.8, fontFamily: palette.body, marginBottom: 12 } }, "Savings ranges reflect data quality. Clients who provide multiple years of financial history receive tighter bands of \u00B115%, because multi-year data reveals trends and reduces estimation variance. Single-year data widens the bands to \u00B130%. Within each band, the low estimate uses conservative inputs at the minimum applicable rate, while the high estimate uses full applicable inputs at the client's marginal rate."),
|
|
23
|
+
react_1.default.createElement("div", { style: { fontSize: 13, color: palette.gray700, lineHeight: 1.8, fontFamily: palette.body } }, "Aggregate savings on the cover and in the quarterly cash-flow chart are further adjusted by a 25% interaction-discount factor. This factor accounts for four compounding effects: strategy stacking, where multiple deductions compete for the same dollar of income; marginal-rate exhaustion, where successive deductions push taxable income into lower brackets; ordering effects, where the sequence in which strategies are applied changes their individual value; and \u00A76694 reasonableness, which constrains aggressive combinations to positions that meet the substantial-authority standard. The same factor and rationale apply to both the cover ETR chart and the QuarterlyCashChart.")),
|
|
24
|
+
react_1.default.createElement("div", { style: { marginBottom: 28 } },
|
|
25
|
+
react_1.default.createElement("div", { style: { fontSize: 10, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.12em", color: palette.gray400, fontFamily: palette.mono, marginBottom: 8 } }, "SOURCES"),
|
|
26
|
+
react_1.default.createElement("ol", { style: { paddingLeft: 24, fontSize: 12, color: palette.gray700, lineHeight: 1.7, fontFamily: palette.body, margin: 0 } }, [...new Set(eligible.map(s => s.code))].sort((a, b) => a.localeCompare(b)).map(code => (react_1.default.createElement("li", { key: code, className: "source-entry", style: { marginBottom: 6 } },
|
|
27
|
+
react_1.default.createElement("span", { style: { fontFamily: palette.mono, fontWeight: 700 } }, code),
|
|
28
|
+
" \u2014 ",
|
|
29
|
+
data_1.SOURCE_DESC[code] || "See IRC reference for details"))))),
|
|
30
|
+
react_1.default.createElement("div", { className: "report-meta", style: { marginBottom: 28 } },
|
|
31
|
+
react_1.default.createElement("div", { style: { fontSize: 10, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.12em", color: palette.gray400, fontFamily: palette.mono, marginBottom: 8 } }, "REPORT METADATA"),
|
|
32
|
+
react_1.default.createElement("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr 1fr 1fr", gap: 12 } }, [
|
|
33
|
+
{ k: "Framework", v: "25 federal strategies, 50 states + DC" },
|
|
34
|
+
{ k: "Data Source", v: (profile.taxDataYears || "1 year") + " of financial data" },
|
|
35
|
+
{ k: "Authority", v: "IRC, Rev. Proc. 2025-32, OBBBA" },
|
|
36
|
+
{ k: "Confidence", v: profile.taxDataYears === "1 year" ? "\u00B130% (single-year data)" : "\u00B115% (multi-year data)" },
|
|
37
|
+
].map(({ k, v }) => (react_1.default.createElement("div", { key: k, style: { padding: "8px 12px", background: palette.gray50, borderRadius: 6 } },
|
|
38
|
+
react_1.default.createElement("div", { style: { fontSize: 10, fontWeight: 600, textTransform: "uppercase", letterSpacing: ".5px", color: palette.gray400, marginBottom: 2, fontFamily: palette.mono } }, k),
|
|
39
|
+
react_1.default.createElement("div", { style: { fontSize: 11, color: palette.gray700, fontFamily: palette.body } }, v))))))));
|
|
40
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { Strategy, ComputedMap } from "../../lib/types";
|
|
3
|
+
import type { Palette } from "./palette";
|
|
4
|
+
interface QuarterlyCashChartProps {
|
|
5
|
+
eligible: Strategy[];
|
|
6
|
+
computed: ComputedMap;
|
|
7
|
+
palette: Palette;
|
|
8
|
+
}
|
|
9
|
+
export declare function QuarterlyCashChart({ eligible, computed, palette }: QuarterlyCashChartProps): React.JSX.Element;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,56 @@
|
|
|
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.QuarterlyCashChart = QuarterlyCashChart;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
function QuarterlyCashChart({ eligible, computed, palette }) {
|
|
9
|
+
const W = 600, H = 240;
|
|
10
|
+
const padL = 56, padR = 24, padT = 32, padB = 52;
|
|
11
|
+
const plotW = W - padL - padR, plotH = H - padT - padB;
|
|
12
|
+
const BUCKET_TO_Q = { now: 0, "30d": 0, "90d": 1, filing: 3 };
|
|
13
|
+
const quarters = [0, 0, 0, 0];
|
|
14
|
+
eligible.forEach(s => {
|
|
15
|
+
var _a, _b;
|
|
16
|
+
const c = computed.get(s.rank);
|
|
17
|
+
const mid = (((_a = c === null || c === void 0 ? void 0 : c.lo) !== null && _a !== void 0 ? _a : s.lo) + ((_b = c === null || c === void 0 ? void 0 : c.hi) !== null && _b !== void 0 ? _b : s.hi)) / 2;
|
|
18
|
+
const qi = BUCKET_TO_Q[s.timelineBucket || ""];
|
|
19
|
+
if (qi !== undefined)
|
|
20
|
+
quarters[qi] += mid;
|
|
21
|
+
});
|
|
22
|
+
const INTERACTION_DISCOUNT = 0.25;
|
|
23
|
+
const quartersDiscounted = quarters.map(v => v * INTERACTION_DISCOUNT);
|
|
24
|
+
const maxVal = Math.max(...quartersDiscounted, 1);
|
|
25
|
+
const yScale = (v) => padT + plotH - (v / maxVal) * plotH;
|
|
26
|
+
const barW = Math.min(72, (plotW - 60) / 4);
|
|
27
|
+
const slot = plotW / 4;
|
|
28
|
+
const labels = ["Q1 2026", "Q2 2026", "Q3 2026", "Q4 2026"];
|
|
29
|
+
const sublabels = ["Now / 30 days", "Within 90 days", "Mid-year", "At filing"];
|
|
30
|
+
const tickStep = maxVal > 200000 ? 100000 : maxVal > 100000 ? 50000 : 25000;
|
|
31
|
+
const yTicks = [];
|
|
32
|
+
for (let v = 0; v <= maxVal * 1.05; v += tickStep)
|
|
33
|
+
yTicks.push(v);
|
|
34
|
+
return (react_1.default.createElement("div", { className: "chart-block", style: { background: palette.white, border: "1px solid " + palette.gray200, borderRadius: 10, padding: "24px 28px", marginBottom: 24 } },
|
|
35
|
+
react_1.default.createElement("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "baseline", marginBottom: 18 } },
|
|
36
|
+
react_1.default.createElement("div", { style: { fontSize: 10, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.15em", color: palette.gray400, fontFamily: palette.mono } }, "QUARTERLY CASH IMPACT"),
|
|
37
|
+
react_1.default.createElement("div", { style: { fontSize: 11, fontWeight: 700, color: palette.teal, fontFamily: palette.mono } }, "realized savings, by quarter")),
|
|
38
|
+
react_1.default.createElement("svg", { viewBox: "0 0 " + W + " " + H, style: { width: "100%", height: "auto", display: "block" } },
|
|
39
|
+
yTicks.map(t => (react_1.default.createElement("g", { key: t },
|
|
40
|
+
react_1.default.createElement("line", { x1: padL, y1: yScale(t), x2: W - padR, y2: yScale(t), stroke: palette.gray100, strokeWidth: "1" }),
|
|
41
|
+
react_1.default.createElement("text", { x: padL - 10, y: yScale(t) + 4, fontSize: "10", fill: palette.gray400, fontFamily: palette.mono, textAnchor: "end" }, "$" + Math.round(t / 1000) + "K")))),
|
|
42
|
+
react_1.default.createElement("line", { x1: padL, y1: padT + plotH, x2: W - padR, y2: padT + plotH, stroke: palette.gray300, strokeWidth: "1" }),
|
|
43
|
+
quartersDiscounted.map((v, i) => {
|
|
44
|
+
const cx = padL + slot * i + slot / 2;
|
|
45
|
+
const x = cx - barW / 2;
|
|
46
|
+
const y = v > 0 ? yScale(v) : padT + plotH;
|
|
47
|
+
const h = v > 0 ? padT + plotH - y : 0;
|
|
48
|
+
const color = i === 3 ? palette.gray400 : palette.teal;
|
|
49
|
+
return (react_1.default.createElement("g", { key: i },
|
|
50
|
+
react_1.default.createElement("rect", { x: x, y: y, width: barW, height: h, fill: color, rx: "2" }),
|
|
51
|
+
v > 0 && react_1.default.createElement("text", { x: cx, y: y - 8, fontSize: "12", fontWeight: "700", fill: i === 3 ? palette.gray700 : palette.teal, fontFamily: palette.mono, textAnchor: "middle" }, "$" + Math.round(v / 1000) + "K"),
|
|
52
|
+
react_1.default.createElement("text", { x: cx, y: padT + plotH + 22, fontSize: "11", fill: palette.gray600, fontFamily: palette.body, textAnchor: "middle", fontWeight: "600" }, labels[i]),
|
|
53
|
+
react_1.default.createElement("text", { x: cx, y: padT + plotH + 38, fontSize: "9", fill: palette.gray400, fontFamily: palette.body, textAnchor: "middle" }, sublabels[i])));
|
|
54
|
+
})),
|
|
55
|
+
react_1.default.createElement("div", { style: { fontSize: 10, color: palette.gray500, fontFamily: palette.body, lineHeight: 1.6, marginTop: 14, paddingTop: 12, borderTop: "1px solid " + palette.gray100 } }, "Cash impact reflects realized savings after the same 25\u201340% interaction adjustment applied on the cover. Q1 includes immediate-action and 30-day items; Q4 captures year-end planning and filing-time elections.")));
|
|
56
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { ClientProfile, Strategy, ComputedMap } from "../../lib/types";
|
|
3
|
+
import type { Palette } from "./palette";
|
|
4
|
+
interface RecommendedStrategiesProps {
|
|
5
|
+
profile: ClientProfile;
|
|
6
|
+
eligible: Strategy[];
|
|
7
|
+
computed: ComputedMap;
|
|
8
|
+
top3: Strategy[];
|
|
9
|
+
hasOBBBA: boolean;
|
|
10
|
+
palette: Palette;
|
|
11
|
+
}
|
|
12
|
+
export declare function RecommendedStrategies({ profile, eligible, computed, top3, hasOBBBA, palette }: RecommendedStrategiesProps): React.JSX.Element;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
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.RecommendedStrategies = RecommendedStrategies;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const data_1 = require("../../lib/data");
|
|
9
|
+
const SectionOpener_1 = require("./SectionOpener");
|
|
10
|
+
const SavingsStackChart_1 = require("./SavingsStackChart");
|
|
11
|
+
const StrategyCard_1 = require("./StrategyCard");
|
|
12
|
+
function RecommendedStrategies({ profile, eligible, computed, top3, hasOBBBA, palette }) {
|
|
13
|
+
const top3Ranks = new Set(top3.map(s => s.rank));
|
|
14
|
+
const interactingPairs = data_1.INTERACTION_PAIRS.filter(([a, b]) => top3Ranks.has(a) && top3Ranks.has(b));
|
|
15
|
+
const hasInteractions = interactingPairs.length > 0;
|
|
16
|
+
const interactionMap = {};
|
|
17
|
+
interactingPairs.forEach(([a, b]) => { interactionMap[a] = b; interactionMap[b] = a; });
|
|
18
|
+
const stSavings = (s) => {
|
|
19
|
+
var _a, _b;
|
|
20
|
+
const c = computed.get(s.rank);
|
|
21
|
+
const lo = Math.round(((_a = c === null || c === void 0 ? void 0 : c.lo) !== null && _a !== void 0 ? _a : s.lo) / 100) * 100;
|
|
22
|
+
const hi = Math.round(((_b = c === null || c === void 0 ? void 0 : c.hi) !== null && _b !== void 0 ? _b : s.hi) / 100) * 100;
|
|
23
|
+
return "$" + (lo / 1000).toFixed(1) + "K\u2013$" + (hi / 1000).toFixed(1) + "K";
|
|
24
|
+
};
|
|
25
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
26
|
+
react_1.default.createElement(SectionOpener_1.SectionOpener, { number: "02", eyebrow: "RECOMMENDED STRATEGIES", headline: "Three priorities to discuss first.", bullets: [
|
|
27
|
+
"The " + top3.length + " strategies highlighted below are ranked by combined impact score \u2014 weighting dollar value, audit posture, and implementation effort.",
|
|
28
|
+
"Each strategy below is anchored to a specific IRC section and explains the math, the audit posture, and the implementation path.",
|
|
29
|
+
hasOBBBA
|
|
30
|
+
? "One or more recommendations rely on OBBBA provisions enacted July 2025 with limited IRS guidance \u2014 flagged where applicable."
|
|
31
|
+
: "All recommendations rely on settled IRS guidance, published rulings, or controlling case law.",
|
|
32
|
+
], palette: palette }),
|
|
33
|
+
react_1.default.createElement(SavingsStackChart_1.SavingsStackChart, { eligible: eligible, computed: computed, palette: palette }),
|
|
34
|
+
react_1.default.createElement("div", { style: { marginBottom: 28 } }, top3.map((s, i) => {
|
|
35
|
+
const rank = i + 1;
|
|
36
|
+
const interactsWith = interactionMap[s.rank];
|
|
37
|
+
const interactsIdx = interactsWith ? top3.findIndex(t => t.rank === interactsWith) + 1 : 0;
|
|
38
|
+
return (react_1.default.createElement(StrategyCard_1.StrategyCard, { key: s.rank, strategy: s, rank: rank, profile: profile, computed: computed, palette: palette, nextStepText: data_1.NEXT_STEPS[s.rank] || NARRATIVE_FALLBACK_NEXT(s), interactsWith: interactsWith, interactsIdx: interactsIdx, stSavings: stSavings(s) }));
|
|
39
|
+
})),
|
|
40
|
+
hasInteractions && (react_1.default.createElement("div", { style: { background: palette.orangePale, borderLeft: "3px solid " + palette.orange, borderRadius: "0 8px 8px 0", padding: "16px 20px", marginBottom: 24 } },
|
|
41
|
+
react_1.default.createElement("div", { style: { fontSize: 13, fontWeight: 700, color: palette.gray800, fontFamily: palette.head, marginBottom: 6 } }, "Strategy Interactions"),
|
|
42
|
+
interactingPairs.map(([a, b], pi) => {
|
|
43
|
+
const idxA = top3.findIndex(t => t.rank === a) + 1;
|
|
44
|
+
const idxB = top3.findIndex(t => t.rank === b) + 1;
|
|
45
|
+
return (react_1.default.createElement("p", { key: pi, style: { fontSize: 12, color: palette.gray700, lineHeight: 1.7, fontFamily: palette.body, marginBottom: 4 } }, "Strategies #" + idxA + " and #" + idxB + " affect each other. Your preparer has accounted for this \u2014 the combined savings may be less than the sum of individual estimates."));
|
|
46
|
+
})))));
|
|
47
|
+
}
|
|
48
|
+
// Inline fallback for next-steps text when NARRATIVE_FALLBACK is needed
|
|
49
|
+
function NARRATIVE_FALLBACK_NEXT(s) {
|
|
50
|
+
return "Discuss with your preparer to implement " + s.name + ".";
|
|
51
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { Strategy, ComputedMap } from "../../lib/types";
|
|
3
|
+
import type { Palette } from "./palette";
|
|
4
|
+
interface SavingsStackChartProps {
|
|
5
|
+
eligible: Strategy[];
|
|
6
|
+
computed: ComputedMap;
|
|
7
|
+
palette: Palette;
|
|
8
|
+
}
|
|
9
|
+
export declare function SavingsStackChart({ eligible, computed, palette }: SavingsStackChartProps): React.JSX.Element | null;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
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.SavingsStackChart = SavingsStackChart;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const CAT_LABELS = {
|
|
9
|
+
depreciation: "Depreciation & Cost Recovery",
|
|
10
|
+
retirement: "Retirement & Benefits",
|
|
11
|
+
credits: "Tax Credits",
|
|
12
|
+
obbba_new: "OBBBA Provisions",
|
|
13
|
+
entity: "Entity & Compensation",
|
|
14
|
+
deductions: "Deductions & Timing",
|
|
15
|
+
state: "State & Local",
|
|
16
|
+
income: "Income Timing",
|
|
17
|
+
benefits: "Employee Benefits",
|
|
18
|
+
accounting: "Accounting Methods",
|
|
19
|
+
investment: "Investment Strategies",
|
|
20
|
+
};
|
|
21
|
+
function SavingsStackChart({ eligible, computed, palette }) {
|
|
22
|
+
const CAT_COLORS = {
|
|
23
|
+
depreciation: palette.teal,
|
|
24
|
+
retirement: "#1A6B6C",
|
|
25
|
+
credits: palette.orange,
|
|
26
|
+
obbba_new: "#A1E5E6",
|
|
27
|
+
entity: palette.green,
|
|
28
|
+
deductions: "#5A8F90",
|
|
29
|
+
state: "#C97515",
|
|
30
|
+
income: "#3D7374",
|
|
31
|
+
benefits: "#0F6E56",
|
|
32
|
+
accounting: "#8FA8A9",
|
|
33
|
+
investment: "#D4922F",
|
|
34
|
+
};
|
|
35
|
+
const byCat = {};
|
|
36
|
+
eligible.forEach(s => {
|
|
37
|
+
var _a, _b;
|
|
38
|
+
const c = computed.get(s.rank);
|
|
39
|
+
const mid = (((_a = c === null || c === void 0 ? void 0 : c.lo) !== null && _a !== void 0 ? _a : s.lo) + ((_b = c === null || c === void 0 ? void 0 : c.hi) !== null && _b !== void 0 ? _b : s.hi)) / 2;
|
|
40
|
+
const cat = s.cat || "deductions";
|
|
41
|
+
byCat[cat] = (byCat[cat] || 0) + mid;
|
|
42
|
+
});
|
|
43
|
+
const total = Object.values(byCat).reduce((a, b) => a + b, 0);
|
|
44
|
+
const sorted = Object.entries(byCat).sort((a, b) => b[1] - a[1]);
|
|
45
|
+
if (total <= 0)
|
|
46
|
+
return null;
|
|
47
|
+
return (react_1.default.createElement("div", { className: "chart-block", style: { background: palette.white, border: "1px solid " + palette.gray200, borderRadius: 10, padding: "24px 28px", marginBottom: 24 } },
|
|
48
|
+
react_1.default.createElement("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "baseline", marginBottom: 18 } },
|
|
49
|
+
react_1.default.createElement("div", { style: { fontSize: 10, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.15em", color: palette.gray400, fontFamily: palette.mono } }, "SAVINGS BY CATEGORY"),
|
|
50
|
+
react_1.default.createElement("div", { style: { fontSize: 11, fontWeight: 700, color: palette.teal, fontFamily: palette.mono } }, "$" + Math.round(total / 1000) + "K aggregate midpoint")),
|
|
51
|
+
react_1.default.createElement("div", { style: { display: "flex", height: 32, borderRadius: 6, overflow: "hidden", border: "1px solid " + palette.gray200, marginBottom: 18 } }, sorted.map(([cat, val]) => {
|
|
52
|
+
const pct = val / total * 100;
|
|
53
|
+
const color = CAT_COLORS[cat] || palette.gray500;
|
|
54
|
+
return (react_1.default.createElement("div", { key: cat, style: { width: pct + "%", background: color, display: "flex", alignItems: "center", justifyContent: "center", minWidth: 0 }, title: (CAT_LABELS[cat] || cat) + ": " + Math.round(val / 1000) + "K" }, pct >= 8 && react_1.default.createElement("span", { style: { fontSize: 10, fontWeight: 700, color: palette.white, fontFamily: palette.mono } },
|
|
55
|
+
Math.round(pct),
|
|
56
|
+
"%")));
|
|
57
|
+
})),
|
|
58
|
+
react_1.default.createElement("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: "8px 24px" } }, sorted.map(([cat, val]) => {
|
|
59
|
+
const color = CAT_COLORS[cat] || palette.gray500;
|
|
60
|
+
const label = CAT_LABELS[cat] || cat;
|
|
61
|
+
return (react_1.default.createElement("div", { key: cat, style: { display: "flex", alignItems: "center", gap: 10, fontSize: 12, fontFamily: palette.body } },
|
|
62
|
+
react_1.default.createElement("div", { style: { width: 10, height: 10, borderRadius: 2, background: color, flexShrink: 0 } }),
|
|
63
|
+
react_1.default.createElement("div", { style: { flex: 1, color: palette.gray700, whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" } }, label),
|
|
64
|
+
react_1.default.createElement("div", { style: { color: palette.gray500, fontFamily: palette.mono, fontSize: 11 } }, "$" + Math.round(val / 1000) + "K")));
|
|
65
|
+
}))));
|
|
66
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { Palette } from "./palette";
|
|
3
|
+
interface SectionOpenerProps {
|
|
4
|
+
number: string;
|
|
5
|
+
eyebrow: string;
|
|
6
|
+
headline: string;
|
|
7
|
+
bullets?: string[];
|
|
8
|
+
palette: Palette;
|
|
9
|
+
}
|
|
10
|
+
export declare function SectionOpener({ number, eyebrow, headline, bullets, palette }: SectionOpenerProps): React.JSX.Element;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
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.SectionOpener = SectionOpener;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
function SectionOpener({ number, eyebrow, headline, bullets, palette }) {
|
|
9
|
+
return (react_1.default.createElement("div", { className: "section-opener", style: { pageBreakBefore: "always", breakBefore: "page", marginBottom: 32, paddingTop: 8 } },
|
|
10
|
+
react_1.default.createElement("div", { style: { display: "flex", alignItems: "baseline", gap: 12, marginBottom: 18 } },
|
|
11
|
+
react_1.default.createElement("span", { style: { fontSize: 13, fontWeight: 700, color: palette.teal, fontFamily: palette.mono, letterSpacing: "0.05em" } }, number),
|
|
12
|
+
react_1.default.createElement("span", { style: { fontSize: 11, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.16em", color: palette.gray500, fontFamily: palette.body } }, eyebrow)),
|
|
13
|
+
react_1.default.createElement("h2", { style: { fontSize: 38, fontWeight: 700, color: palette.gray900, fontFamily: palette.head, lineHeight: 1.15, letterSpacing: "-0.01em", marginBottom: 24, maxWidth: "92%" } }, headline),
|
|
14
|
+
react_1.default.createElement("div", { style: { height: 3, background: palette.teal, width: 64, marginBottom: 24 } }),
|
|
15
|
+
bullets && bullets.length > 0 && (react_1.default.createElement("div", { style: { borderLeft: "2px solid " + palette.gray200, paddingLeft: 20, marginBottom: 8 } },
|
|
16
|
+
react_1.default.createElement("div", { style: { fontSize: 10, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.15em", color: palette.gray400, marginBottom: 12, fontFamily: palette.mono } }, "AT A GLANCE"),
|
|
17
|
+
bullets.map((b, i) => (react_1.default.createElement("div", { key: i, style: { display: "flex", gap: 10, marginBottom: i < bullets.length - 1 ? 10 : 0, alignItems: "flex-start" } },
|
|
18
|
+
react_1.default.createElement("div", { style: { width: 5, height: 5, borderRadius: "50%", background: palette.teal, marginTop: 8, flexShrink: 0 } }),
|
|
19
|
+
react_1.default.createElement("div", { style: { fontSize: 14, color: palette.gray700, lineHeight: 1.6, fontFamily: palette.body } }, b))))))));
|
|
20
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
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.Sidebar = Sidebar;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const data_1 = require("../../lib/data");
|
|
9
|
+
function Sidebar({ ircCode, palette }) {
|
|
10
|
+
const entry = data_1.SIDEBAR_LOOKUP[ircCode];
|
|
11
|
+
if (!entry)
|
|
12
|
+
return null;
|
|
13
|
+
return (react_1.default.createElement("aside", { style: {
|
|
14
|
+
float: "right",
|
|
15
|
+
width: 180,
|
|
16
|
+
margin: "4px 0 12px 20px",
|
|
17
|
+
padding: "14px 16px",
|
|
18
|
+
background: "#f7f5ee",
|
|
19
|
+
borderLeft: "2px solid " + palette.teal,
|
|
20
|
+
borderRadius: 0,
|
|
21
|
+
fontFamily: palette.body,
|
|
22
|
+
} },
|
|
23
|
+
react_1.default.createElement("div", { style: {
|
|
24
|
+
fontFamily: palette.mono,
|
|
25
|
+
fontSize: 10,
|
|
26
|
+
fontWeight: 500,
|
|
27
|
+
letterSpacing: "0.08em",
|
|
28
|
+
textTransform: "uppercase",
|
|
29
|
+
color: palette.teal,
|
|
30
|
+
marginBottom: 6,
|
|
31
|
+
} }, entry.title),
|
|
32
|
+
react_1.default.createElement("div", { style: {
|
|
33
|
+
fontSize: 11,
|
|
34
|
+
lineHeight: 1.55,
|
|
35
|
+
color: palette.gray800,
|
|
36
|
+
} }, entry.body)));
|
|
37
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { ClientProfile, Strategy, ComputedMap } from "../../lib/types";
|
|
3
|
+
import type { Palette } from "./palette";
|
|
4
|
+
interface StrategyCardProps {
|
|
5
|
+
strategy: Strategy;
|
|
6
|
+
rank: number;
|
|
7
|
+
profile: ClientProfile;
|
|
8
|
+
computed: ComputedMap;
|
|
9
|
+
palette: Palette;
|
|
10
|
+
nextStepText: string;
|
|
11
|
+
interactsWith?: number;
|
|
12
|
+
interactsIdx: number;
|
|
13
|
+
stSavings: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function StrategyCard({ strategy: s, rank, profile, computed, palette, nextStepText, interactsWith, interactsIdx, stSavings, }: StrategyCardProps): React.JSX.Element;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,63 @@
|
|
|
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.StrategyCard = StrategyCard;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const data_1 = require("../../lib/data");
|
|
9
|
+
const Sidebar_1 = require("./Sidebar");
|
|
10
|
+
const applyFootnotes_1 = require("./applyFootnotes");
|
|
11
|
+
const FootnoteBlock_1 = require("./FootnoteBlock");
|
|
12
|
+
function StrategyCard({ strategy: s, rank, profile, computed, palette, nextStepText, interactsWith, interactsIdx, stSavings, }) {
|
|
13
|
+
const card = {
|
|
14
|
+
background: palette.white,
|
|
15
|
+
border: "1px solid " + palette.gray200,
|
|
16
|
+
borderRadius: 12,
|
|
17
|
+
padding: "24px 28px",
|
|
18
|
+
marginBottom: 16,
|
|
19
|
+
boxShadow: "0 1px 3px rgba(0,0,0,0.04)",
|
|
20
|
+
};
|
|
21
|
+
const pct = s.score;
|
|
22
|
+
const narr = data_1.STRATEGY_NARRATIVE[s.rank];
|
|
23
|
+
const c = computed.get(s.rank);
|
|
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 : nextStepText;
|
|
28
|
+
const footnotes = data_1.FOOTNOTE_DATA[s.rank] || [];
|
|
29
|
+
const fnCounter = { next: 0, assigned: [], cardKey: s.rank };
|
|
30
|
+
return (react_1.default.createElement("div", { className: "strategy-card", style: Object.assign(Object.assign({}, card), { padding: 0, overflow: "hidden", marginBottom: 20 }) },
|
|
31
|
+
react_1.default.createElement("div", { style: { padding: "24px 28px 20px" } },
|
|
32
|
+
react_1.default.createElement("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "flex-start", marginBottom: 16 } },
|
|
33
|
+
react_1.default.createElement("div", { style: { display: "flex", alignItems: "center", gap: 14 } },
|
|
34
|
+
react_1.default.createElement("div", { style: { width: 36, height: 36, borderRadius: "50%", background: "linear-gradient(135deg," + palette.teal + ",#1A6B6C)", display: "flex", alignItems: "center", justifyContent: "center", fontSize: 15, fontWeight: 700, color: palette.white, fontFamily: palette.body, flexShrink: 0 } }, rank),
|
|
35
|
+
react_1.default.createElement("div", null,
|
|
36
|
+
react_1.default.createElement("div", { style: { fontSize: 18, fontWeight: 700, color: palette.gray900, fontFamily: palette.head } }, s.name),
|
|
37
|
+
react_1.default.createElement("div", { style: { fontSize: 12, color: palette.gray500, fontFamily: palette.mono, marginTop: 3 } }, s.code + " \u00B7 " + s.timeline))),
|
|
38
|
+
react_1.default.createElement("div", { style: { textAlign: "right", flexShrink: 0 } },
|
|
39
|
+
react_1.default.createElement("div", { style: { fontSize: 20, fontWeight: 800, color: palette.teal, fontFamily: palette.head } }, stSavings),
|
|
40
|
+
react_1.default.createElement("div", { style: { fontSize: 10, color: palette.gray400, fontFamily: palette.body } }, "est. annual savings"))),
|
|
41
|
+
react_1.default.createElement("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 20 } },
|
|
42
|
+
react_1.default.createElement("div", { style: { flex: 1, height: 4, background: palette.gray100, borderRadius: 2, overflow: "hidden" } },
|
|
43
|
+
react_1.default.createElement("div", { style: { width: pct + "%", height: "100%", borderRadius: 2, background: "linear-gradient(90deg," + palette.teal + "," + palette.tealLt + ")" } })),
|
|
44
|
+
react_1.default.createElement("span", { style: { fontSize: 10, fontWeight: 600, color: palette.teal, fontFamily: palette.mono } },
|
|
45
|
+
pct,
|
|
46
|
+
"/100")),
|
|
47
|
+
react_1.default.createElement(Sidebar_1.Sidebar, { ircCode: s.code, palette: palette }),
|
|
48
|
+
react_1.default.createElement("div", { style: { marginBottom: 12 } },
|
|
49
|
+
react_1.default.createElement("div", { style: { fontSize: 11, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.1em", color: palette.gray400, marginBottom: 8, fontFamily: palette.mono } }, "WHY THIS MATTERS"),
|
|
50
|
+
react_1.default.createElement("p", { style: { fontSize: 13, color: palette.gray700, lineHeight: 1.75, fontFamily: palette.body } }, (0, applyFootnotes_1.applyFootnotes)(whyText, footnotes, fnCounter, palette))),
|
|
51
|
+
react_1.default.createElement("div", { style: { marginBottom: 12 } },
|
|
52
|
+
react_1.default.createElement("div", { style: { fontSize: 11, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.1em", color: palette.gray400, marginBottom: 8, fontFamily: palette.mono } }, "HOW SAVINGS BREAK DOWN"),
|
|
53
|
+
react_1.default.createElement("p", { style: { fontSize: 13, color: palette.gray700, lineHeight: 1.75, fontFamily: palette.body } }, (0, applyFootnotes_1.applyFootnotes)(breakdownText, footnotes, fnCounter, palette))),
|
|
54
|
+
react_1.default.createElement("div", { style: { marginBottom: 12, borderLeft: "3px solid " + palette.orange, padding: "0 0 0 16px" } },
|
|
55
|
+
react_1.default.createElement("div", { style: { fontSize: 11, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.1em", color: palette.orange, marginBottom: 8, fontFamily: palette.mono } }, "WHY YOU NEED A SPECIALIST"),
|
|
56
|
+
react_1.default.createElement("p", { style: { fontSize: 13, color: palette.gray700, lineHeight: 1.75, fontFamily: palette.body } }, (0, applyFootnotes_1.applyFootnotes)(specialistText, footnotes, fnCounter, palette))),
|
|
57
|
+
react_1.default.createElement("div", { className: "card-footer" },
|
|
58
|
+
react_1.default.createElement("div", { style: { background: palette.tealPale, borderRadius: 8, padding: "12px 16px" } },
|
|
59
|
+
react_1.default.createElement("div", { style: { fontSize: 11, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.1em", color: palette.green, marginBottom: 6, fontFamily: palette.mono } }, "WHAT WE'D DO NEXT"),
|
|
60
|
+
react_1.default.createElement("p", { style: { fontSize: 13, color: palette.gray700, lineHeight: 1.7, fontFamily: palette.body } }, (0, applyFootnotes_1.applyFootnotes)(nextText, footnotes, fnCounter, palette))),
|
|
61
|
+
react_1.default.createElement(FootnoteBlock_1.FootnoteBlock, { assigned: fnCounter.assigned, palette: palette }))),
|
|
62
|
+
interactsWith !== undefined && interactsIdx > 0 && (react_1.default.createElement("div", { style: { padding: "10px 28px", background: palette.orangePale, borderTop: "1px solid rgba(251,154,29,0.2)", fontSize: 12, color: palette.gray700, fontFamily: palette.body } }, "Note: This strategy interacts with Strategy #" + interactsIdx + ". Combined savings may differ from the sum of individual estimates."))));
|
|
63
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { ClientProfile } from "../../lib/types";
|
|
3
|
+
import type { TaxAxisScreenProps } from "../../lib/types";
|
|
4
|
+
export interface TaxAxisClientReportProps extends TaxAxisScreenProps {
|
|
5
|
+
profile: ClientProfile;
|
|
6
|
+
onBack: () => void;
|
|
7
|
+
onNavigatePreparer?: () => void;
|
|
8
|
+
}
|
|
9
|
+
export declare function TaxAxisClientReport({ profile, onBack, onNavigatePreparer }: TaxAxisClientReportProps): React.JSX.Element;
|