@paro.io/expert-shared-components 1.14.57 → 1.14.60
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/lib/README.md +2 -0
- package/lib/components/DocumentCenter/MultiFileUploadSection.js +121 -220
- package/lib/components/TaxAxis/TaxAxisApi.d.ts +2 -0
- package/lib/components/TaxAxis/TaxAxisShell.d.ts +1 -1
- package/lib/components/TaxAxis/TaxAxisShell.js +104 -5
- package/lib/components/TaxAxis/types.d.ts +5 -0
- package/lib/components/shared/UploadClient.d.ts +1 -2
- package/lib/components/shared/UploadClient.js +2 -6
- package/lib/index.d.ts +13 -2
- package/lib/index.js +27 -3
- package/lib/package.json +68 -0
- package/lib/tax-axis/components/clientReport/ExecutiveSummary.d.ts +1 -4
- package/lib/tax-axis/components/clientReport/ExecutiveSummary.js +6 -10
- package/lib/tax-axis/components/clientReport/Methodology.js +2 -2
- package/lib/tax-axis/components/clientReport/RecommendedStrategies.d.ts +1 -6
- package/lib/tax-axis/components/clientReport/RecommendedStrategies.js +24 -26
- package/lib/tax-axis/components/clientReport/StrategyCard.d.ts +1 -1
- package/lib/tax-axis/components/clientReport/StrategyCard.js +23 -39
- package/lib/tax-axis/components/clientReport/TaxAxisClientReport.d.ts +2 -8
- package/lib/tax-axis/components/clientReport/TaxAxisClientReport.js +7 -9
- package/lib/tax-axis/components/dashboard/DashboardActions.js +4 -5
- package/lib/tax-axis/components/dashboard/DashboardSummary.d.ts +1 -6
- package/lib/tax-axis/components/dashboard/DashboardSummary.js +4 -14
- package/lib/tax-axis/components/dashboard/StrategyDetailPanel.d.ts +1 -1
- package/lib/tax-axis/components/dashboard/StrategyDetailPanel.js +91 -120
- package/lib/tax-axis/components/dashboard/TaxAxisDashboard.d.ts +2 -59
- package/lib/tax-axis/components/dashboard/TaxAxisDashboard.js +36 -412
- package/lib/tax-axis/components/documents/DocumentCard.d.ts +3 -7
- package/lib/tax-axis/components/documents/DocumentCard.js +12 -65
- package/lib/tax-axis/components/documents/DocumentTier.d.ts +2 -5
- package/lib/tax-axis/components/documents/DocumentTier.js +2 -2
- package/lib/tax-axis/components/documents/TaxAxisDocuments.d.ts +1 -25
- package/lib/tax-axis/components/documents/TaxAxisDocuments.js +52 -267
- package/lib/tax-axis/components/documents/qbo/QboAvailableReportsModal.d.ts +13 -0
- package/lib/tax-axis/components/documents/qbo/QboAvailableReportsModal.js +180 -0
- package/lib/tax-axis/components/documents/qbo/QboClientSelectorModal.d.ts +10 -0
- package/lib/tax-axis/components/documents/qbo/QboClientSelectorModal.js +155 -0
- package/lib/tax-axis/components/documents/qbo/QboConnectBanner.d.ts +9 -0
- package/lib/tax-axis/components/documents/qbo/QboConnectBanner.js +55 -0
- package/lib/tax-axis/components/documents/qbo/QboDocumentMappingModal.d.ts +10 -0
- package/lib/tax-axis/components/documents/qbo/QboDocumentMappingModal.js +202 -0
- package/lib/tax-axis/components/documents/qbo/QboImportingModal.d.ts +8 -0
- package/lib/tax-axis/components/documents/qbo/QboImportingModal.js +75 -0
- package/lib/tax-axis/components/documents/qbo/QboPermissionsModal.d.ts +8 -0
- package/lib/tax-axis/components/documents/qbo/QboPermissionsModal.js +126 -0
- package/lib/tax-axis/components/documents/qbo/index.d.ts +8 -0
- package/lib/tax-axis/components/documents/qbo/index.js +17 -0
- package/lib/tax-axis/components/documents/qbo/qboConstants.d.ts +24 -0
- package/lib/tax-axis/components/documents/qbo/qboConstants.js +71 -0
- package/lib/tax-axis/components/documents/qbo/types.d.ts +43 -0
- package/lib/tax-axis/components/documents/qbo/types.js +3 -0
- package/lib/tax-axis/components/documents/qbo/useQboFlow.d.ts +19 -0
- package/lib/tax-axis/components/documents/qbo/useQboFlow.js +207 -0
- package/lib/tax-axis/components/extractionReview/TaxAxisExtractionReview.js +17 -17
- package/lib/tax-axis/components/intake/ClientParametersSection.js +29 -13
- package/lib/tax-axis/components/intake/IntakeCtaCards.d.ts +2 -1
- package/lib/tax-axis/components/intake/IntakeCtaCards.js +13 -6
- package/lib/tax-axis/components/intake/TaxAxisIntake.js +44 -5
- package/lib/tax-axis/components/intake/intakeSchema.d.ts +3 -0
- package/lib/tax-axis/components/intake/intakeSchema.js +4 -2
- package/lib/tax-axis/components/preparerWorkpaper/TaxAxisPreparerWorkpaper.d.ts +2 -26
- package/lib/tax-axis/components/preparerWorkpaper/TaxAxisPreparerWorkpaper.js +4 -15
- package/lib/tax-axis/components/processing/TaxAxisProcessing.d.ts +1 -3
- package/lib/tax-axis/components/processing/TaxAxisProcessing.js +31 -102
- package/lib/tax-axis/components/prospectReport/ProspectPrintView.js +2 -0
- package/lib/tax-axis/components/prospectReport/ProspectStrategyCard.d.ts +8 -1
- package/lib/tax-axis/components/prospectReport/ProspectStrategyCard.js +5 -5
- package/lib/tax-axis/components/prospectReport/TaxAxisProspectReport.d.ts +27 -1
- package/lib/tax-axis/components/prospectReport/TaxAxisProspectReport.js +43 -25
- package/lib/tax-axis/index.d.ts +0 -4
- package/lib/tax-axis/index.js +1 -6
- package/lib/tax-axis/lib/adapters/useEngineOutput.d.ts +13 -138
- package/lib/tax-axis/lib/adapters/useEngineOutput.js +7 -156
- package/lib/tax-axis/lib/data/documents.d.ts +2 -3
- package/lib/tax-axis/lib/data/documents.js +25 -225
- package/lib/tax-axis/lib/data/strategies.js +9 -9
- package/lib/tax-axis/lib/documentFieldCatalog.d.ts +12 -7
- package/lib/tax-axis/lib/documentFieldCatalog.js +8 -805
- package/lib/tax-axis/lib/types/index.d.ts +1 -13
- package/package.json +1 -1
|
@@ -5,8 +5,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.StrategyCard = StrategyCard;
|
|
7
7
|
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const data_1 = require("../../lib/data");
|
|
8
9
|
const Sidebar_1 = require("./Sidebar");
|
|
9
|
-
|
|
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, }) {
|
|
10
13
|
const card = {
|
|
11
14
|
background: palette.white,
|
|
12
15
|
border: "1px solid " + palette.gray200,
|
|
@@ -16,13 +19,14 @@ function StrategyCard({ strategy: s, rank, profile: _profile, computed, palette,
|
|
|
16
19
|
boxShadow: "0 1px 3px rgba(0,0,0,0.04)",
|
|
17
20
|
};
|
|
18
21
|
const pct = s.score;
|
|
22
|
+
const narr = data_1.STRATEGY_NARRATIVE[s.rank];
|
|
19
23
|
const c = computed.get(s.rank);
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
const
|
|
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 };
|
|
26
30
|
return (react_1.default.createElement("div", { className: "strategy-card", style: Object.assign(Object.assign({}, card), { padding: 0, overflow: "hidden", marginBottom: 20 }) },
|
|
27
31
|
react_1.default.createElement("div", { style: { padding: "24px 28px 20px" } },
|
|
28
32
|
react_1.default.createElement("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "flex-start", marginBottom: 16 } },
|
|
@@ -30,9 +34,7 @@ function StrategyCard({ strategy: s, rank, profile: _profile, computed, palette,
|
|
|
30
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),
|
|
31
35
|
react_1.default.createElement("div", null,
|
|
32
36
|
react_1.default.createElement("div", { style: { fontSize: 18, fontWeight: 700, color: palette.gray900, fontFamily: palette.head } }, s.name),
|
|
33
|
-
react_1.default.createElement("div", { style: { fontSize: 12, color: palette.gray500, fontFamily: palette.mono, marginTop: 3 } },
|
|
34
|
-
s.code + " · " + s.timeline,
|
|
35
|
-
s.quickWin && (react_1.default.createElement("span", { style: { marginLeft: 8, background: palette.tealPale, color: palette.teal, padding: "1px 6px", borderRadius: 4, fontSize: 10, fontWeight: 700 } }, "\u26A1 Quick Win"))))),
|
|
37
|
+
react_1.default.createElement("div", { style: { fontSize: 12, color: palette.gray500, fontFamily: palette.mono, marginTop: 3 } }, s.code + " \u00B7 " + s.timeline))),
|
|
36
38
|
react_1.default.createElement("div", { style: { textAlign: "right", flexShrink: 0 } },
|
|
37
39
|
react_1.default.createElement("div", { style: { fontSize: 20, fontWeight: 800, color: palette.teal, fontFamily: palette.head } }, stSavings),
|
|
38
40
|
react_1.default.createElement("div", { style: { fontSize: 10, color: palette.gray400, fontFamily: palette.body } }, "est. annual savings"))),
|
|
@@ -43,37 +45,19 @@ function StrategyCard({ strategy: s, rank, profile: _profile, computed, palette,
|
|
|
43
45
|
pct,
|
|
44
46
|
"/100")),
|
|
45
47
|
react_1.default.createElement(Sidebar_1.Sidebar, { ircCode: s.code, palette: palette }),
|
|
46
|
-
|
|
47
|
-
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
|
|
48
|
-
react_1.default.createElement("p", { style: { fontSize: 13, color: palette.gray700, lineHeight: 1.75, fontFamily: palette.body } },
|
|
49
|
-
|
|
50
|
-
react_1.default.createElement("div", { style: { fontSize: 11, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.1em", color: palette.gray400, marginBottom: 8, fontFamily: palette.mono } }, "
|
|
51
|
-
react_1.default.createElement("
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
padding: "8px 14px",
|
|
56
|
-
background: i % 2 === 0 ? palette.gray50 : palette.white,
|
|
57
|
-
borderTop: i > 0 ? "1px solid " + palette.gray100 : "none",
|
|
58
|
-
gap: 12,
|
|
59
|
-
} },
|
|
60
|
-
react_1.default.createElement("div", { style: { flex: 1 } },
|
|
61
|
-
react_1.default.createElement("div", { style: { fontSize: 12, fontWeight: 600, color: palette.gray800, fontFamily: palette.body } }, ref.field_label),
|
|
62
|
-
react_1.default.createElement("div", { style: { fontSize: 10, color: palette.gray400, fontFamily: palette.mono, marginTop: 1 } }, ref.source_hint)),
|
|
63
|
-
react_1.default.createElement("div", { style: { fontSize: 13, fontWeight: 700, color: palette.teal, fontFamily: palette.mono, flexShrink: 0 } }, ref.value_display))))))),
|
|
64
|
-
cpaEngagement && (react_1.default.createElement("div", { style: { marginBottom: 12 } },
|
|
65
|
-
react_1.default.createElement("div", { style: { fontSize: 11, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.1em", color: palette.gray400, marginBottom: 8, fontFamily: palette.mono } }, "CPA ANALYSIS"),
|
|
66
|
-
react_1.default.createElement("p", { style: { fontSize: 13, color: palette.gray700, lineHeight: 1.75, fontFamily: palette.body, whiteSpace: "pre-line" } }, cpaEngagement))),
|
|
67
|
-
s.specialistNote && (react_1.default.createElement("div", { style: { marginBottom: 14, borderLeft: "3px solid " + palette.orange, paddingLeft: 16 } },
|
|
68
|
-
react_1.default.createElement("div", { style: { fontSize: 11, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.1em", color: palette.orange, marginBottom: 6, fontFamily: palette.mono } }, "WHY YOU NEED A SPECIALIST"),
|
|
69
|
-
react_1.default.createElement("p", { style: { fontSize: 13, color: palette.gray700, lineHeight: 1.75, fontFamily: palette.body } }, s.specialistNote))),
|
|
70
|
-
s.authority && (react_1.default.createElement("div", { style: { marginBottom: 14, padding: "6px 10px", background: palette.gray50, borderRadius: 6, fontSize: 11, fontFamily: palette.mono, color: palette.gray500 } },
|
|
71
|
-
"Authority: ",
|
|
72
|
-
s.authority,
|
|
73
|
-
s.forms ? " · Forms: " + s.forms : "")),
|
|
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))),
|
|
74
57
|
react_1.default.createElement("div", { className: "card-footer" },
|
|
75
58
|
react_1.default.createElement("div", { style: { background: palette.tealPale, borderRadius: 8, padding: "12px 16px" } },
|
|
76
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"),
|
|
77
|
-
react_1.default.createElement("p", { style: { fontSize: 13, color: palette.gray700, lineHeight: 1.7, fontFamily: palette.body } }, nextText)))
|
|
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 }))),
|
|
78
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."))));
|
|
79
63
|
}
|
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import type { ClientProfile
|
|
2
|
+
import type { ClientProfile } from "../../lib/types";
|
|
3
3
|
import type { TaxAxisScreenProps } from "../../lib/types";
|
|
4
4
|
export interface TaxAxisClientReportProps extends TaxAxisScreenProps {
|
|
5
5
|
profile: ClientProfile;
|
|
6
6
|
onBack: () => void;
|
|
7
7
|
onNavigatePreparer?: () => void;
|
|
8
|
-
/** When provided, bypasses local filterEligibleStrategies + computeAllStrategies. */
|
|
9
|
-
liveStrategies?: Strategy[];
|
|
10
|
-
/** When provided, bypasses local computeAllStrategies. Must accompany liveStrategies. */
|
|
11
|
-
liveComputedMap?: ComputedMap;
|
|
12
|
-
/** Live engine output fields — passed through to sub-components */
|
|
13
|
-
engineRawOutput?: Record<string, any>;
|
|
14
8
|
}
|
|
15
|
-
export declare function TaxAxisClientReport({ profile, onBack, onNavigatePreparer
|
|
9
|
+
export declare function TaxAxisClientReport({ profile, onBack, onNavigatePreparer }: TaxAxisClientReportProps): React.JSX.Element;
|
|
@@ -34,13 +34,11 @@ const ExecutiveSummary_1 = require("./ExecutiveSummary");
|
|
|
34
34
|
const RecommendedStrategies_1 = require("./RecommendedStrategies");
|
|
35
35
|
const ImplementationRoadmap_1 = require("./ImplementationRoadmap");
|
|
36
36
|
const Methodology_1 = require("./Methodology");
|
|
37
|
-
function TaxAxisClientReport({ profile, onBack, onNavigatePreparer
|
|
38
|
-
var _a, _b, _c
|
|
37
|
+
function TaxAxisClientReport({ profile, onBack, onNavigatePreparer }) {
|
|
38
|
+
var _a, _b, _c;
|
|
39
39
|
const [view, setView] = (0, react_1.useState)("client");
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
const eligible = liveStrategies !== null && liveStrategies !== void 0 ? liveStrategies : staticEligible;
|
|
43
|
-
const computed = liveComputedMap !== null && liveComputedMap !== void 0 ? liveComputedMap : staticComputed;
|
|
40
|
+
const eligible = (0, react_1.useMemo)(() => (0, compute_1.filterEligibleStrategies)(profile), [profile]);
|
|
41
|
+
const computed = (0, react_1.useMemo)(() => (0, compute_1.computeAllStrategies)(profile), [profile]);
|
|
44
42
|
const totalLo = Math.round(eligible.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) / 1000);
|
|
45
43
|
const totalHi = Math.round(eligible.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) / 1000);
|
|
46
44
|
const top3 = [...eligible].sort((a, b) => b.score - a.score).slice(0, 3);
|
|
@@ -102,7 +100,7 @@ function TaxAxisClientReport({ profile, onBack, onNavigatePreparer, liveStrategi
|
|
|
102
100
|
.report-meta { break-inside: avoid; page-break-inside: avoid; }
|
|
103
101
|
.toc-page { break-after: page; page-break-after: always; }
|
|
104
102
|
* { color-adjust: exact; -webkit-print-color-adjust: exact; }
|
|
105
|
-
p, span, div, td, th, li { color: #212529 !important; }
|
|
103
|
+
body, p, span, div, td, th, li { color: #212529 !important; }
|
|
106
104
|
h1, h2, h3, h4, h5, h6, strong, b { color: #060821 !important; }
|
|
107
105
|
}
|
|
108
106
|
`),
|
|
@@ -110,11 +108,11 @@ function TaxAxisClientReport({ profile, onBack, onNavigatePreparer, liveStrategi
|
|
|
110
108
|
react_1.default.createElement("div", { style: { maxWidth: 680, margin: "0 auto", padding: "32px 20px 60px" } },
|
|
111
109
|
react_1.default.createElement(ClientReportCover_1.ClientReportCover, { profile: profile, palette: palette_1.P }),
|
|
112
110
|
react_1.default.createElement(ClientReportTOC_1.ClientReportTOC, { bizName: bizName, palette: palette_1.P }),
|
|
113
|
-
react_1.default.createElement(ExecutiveSummary_1.ExecutiveSummary, { profile: profile, eligible: eligible, computed: computed, totalLo: totalLo, totalHi: totalHi, nowCount: nowCount, top3: top3, palette: palette_1.P
|
|
111
|
+
react_1.default.createElement(ExecutiveSummary_1.ExecutiveSummary, { profile: profile, eligible: eligible, computed: computed, totalLo: totalLo, totalHi: totalHi, nowCount: nowCount, top3: top3, palette: palette_1.P }),
|
|
114
112
|
react_1.default.createElement("div", { style: { background: palette_1.P.gray50, borderLeft: "3px solid " + palette_1.P.gray300, borderRadius: "0 8px 8px 0", padding: "14px 20px", marginBottom: 20, fontSize: 11, color: palette_1.P.gray500, lineHeight: 1.7, fontFamily: palette_1.P.body } },
|
|
115
113
|
"This summary was prepared using TaxAxis, Paro's AI-powered tax analysis engine. Savings estimates are based on financial data provided for tax year " + profile.year + " (" + (profile.taxDataYears || "1 year") + " of data). All figures are estimates. Your tax preparer has reviewed these recommendations.",
|
|
116
114
|
hasOBBBA && " Some strategies reference provisions from the One Big Beautiful Bill Act (OBBBA), signed July 4, 2025, with limited IRS guidance."),
|
|
117
|
-
react_1.default.createElement(RecommendedStrategies_1.RecommendedStrategies, { profile: profile, eligible: eligible, computed: computed, top3: top3, hasOBBBA: hasOBBBA, palette: palette_1.P
|
|
115
|
+
react_1.default.createElement(RecommendedStrategies_1.RecommendedStrategies, { profile: profile, eligible: eligible, computed: computed, top3: top3, hasOBBBA: hasOBBBA, palette: palette_1.P }),
|
|
118
116
|
react_1.default.createElement(ImplementationRoadmap_1.ImplementationRoadmap, { eligible: eligible, computed: computed, top3: top3, nowCount: nowCount, nowMidK: nowMidK, bucketDefs: bucketDefs, bucketTotals: bucketTotals, activeBuckets: activeBuckets, palette: palette_1.P }),
|
|
119
117
|
react_1.default.createElement(Methodology_1.Methodology, { profile: profile, eligible: eligible, palette: palette_1.P }),
|
|
120
118
|
react_1.default.createElement("div", { style: { padding: "16px 20px", marginBottom: 16, fontSize: 10, color: palette_1.P.gray400, lineHeight: 1.7, fontFamily: palette_1.P.body } }, "This summary was generated by TaxAxis, an AI-powered analysis tool by Paro. Recommendations are based on financial data provided and current tax law as of April 2026, including OBBBA provisions. These are estimates, not guarantees. Consult your tax preparer before implementing any strategy. This is not legal or financial advice."),
|
|
@@ -25,6 +25,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.DashboardActions = DashboardActions;
|
|
27
27
|
const react_1 = __importStar(require("react"));
|
|
28
|
+
const data_1 = require("../../lib/data");
|
|
28
29
|
const compute_1 = require("../../lib/compute");
|
|
29
30
|
const TaxAxisButton_1 = require("../shared/TaxAxisButton");
|
|
30
31
|
function DashboardActions({ profile, dashEligible, computed, onDownloadPreparer, onPresent, onSend, onReset, }) {
|
|
@@ -68,15 +69,13 @@ function DashboardActions({ profile, dashEligible, computed, onDownloadPreparer,
|
|
|
68
69
|
"\u2013",
|
|
69
70
|
(0, compute_1.fmtK)(totalHi),
|
|
70
71
|
"across ",
|
|
71
|
-
|
|
72
|
+
data_1.STRATEGIES.length,
|
|
72
73
|
" strategies \u2014 use this to close the engagement or expand scope."),
|
|
73
74
|
react_1.default.createElement("div", { className: "flex gap-2.5 flex-wrap" },
|
|
74
|
-
react_1.default.createElement(TaxAxisButton_1.TaxAxisButton, {
|
|
75
|
-
react_1.default.createElement(TaxAxisButton_1.TaxAxisButton, { onClick: onPresent }, "Present to Client"),
|
|
76
|
-
react_1.default.createElement(TaxAxisButton_1.TaxAxisButton, { variant: "secondary" }, "Generate Engagement Letter")))),
|
|
75
|
+
react_1.default.createElement(TaxAxisButton_1.TaxAxisButton, { onClick: onPresent }, "Present to Client")))),
|
|
77
76
|
react_1.default.createElement("div", { className: "flex gap-4 mt-4 pt-3.5", style: { borderTop: "1px solid rgba(36,131,132,0.15)" } }, [
|
|
78
77
|
{ v: "3x", l: "Faster than Manual" },
|
|
79
|
-
{ v:
|
|
78
|
+
{ v: "25", l: "Strategies Scanned" },
|
|
80
79
|
{ v: "100%", l: "IRS-Cited" },
|
|
81
80
|
{ v: String(stateCount), l: `State${stateCount > 1 ? "s" : ""}` },
|
|
82
81
|
].map(({ v, l }) => (react_1.default.createElement("div", { key: l },
|
|
@@ -6,11 +6,6 @@ interface DashboardSummaryProps {
|
|
|
6
6
|
computed: ComputedMap;
|
|
7
7
|
dataConfirmed: boolean;
|
|
8
8
|
reviewUnreviewed: number;
|
|
9
|
-
liveSavingsMin?: number;
|
|
10
|
-
liveSavingsMax?: number;
|
|
11
|
-
liveStrategyCount?: number;
|
|
12
|
-
confidenceTier?: string;
|
|
13
|
-
dataYears?: number;
|
|
14
9
|
}
|
|
15
|
-
export declare function DashboardSummary({ profile, dashEligible, computed, dataConfirmed, reviewUnreviewed,
|
|
10
|
+
export declare function DashboardSummary({ profile, dashEligible, computed, dataConfirmed, reviewUnreviewed, }: DashboardSummaryProps): React.JSX.Element;
|
|
16
11
|
export {};
|
|
@@ -6,13 +6,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.DashboardSummary = DashboardSummary;
|
|
7
7
|
const react_1 = __importDefault(require("react"));
|
|
8
8
|
const useCountUp_1 = require("./useCountUp");
|
|
9
|
-
function DashboardSummary({ profile, dashEligible, computed, dataConfirmed, reviewUnreviewed,
|
|
9
|
+
function DashboardSummary({ profile, dashEligible, computed, dataConfirmed, reviewUnreviewed, }) {
|
|
10
10
|
var _a;
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const totalLo = liveSavingsMin !== null && liveSavingsMin !== void 0 ? liveSavingsMin : computedLo;
|
|
14
|
-
const totalHi = liveSavingsMax !== null && liveSavingsMax !== void 0 ? liveSavingsMax : computedHi;
|
|
15
|
-
const strategyCount = liveStrategyCount !== null && liveStrategyCount !== void 0 ? liveStrategyCount : dashEligible.length;
|
|
11
|
+
const totalLo = dashEligible.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);
|
|
12
|
+
const totalHi = dashEligible.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);
|
|
16
13
|
const bizName = profile.bizName || "Client";
|
|
17
14
|
const stateCount = ((_a = profile.states) === null || _a === void 0 ? void 0 : _a.length) || 1;
|
|
18
15
|
const scoreAvg = Math.round(dashEligible.reduce((a, s) => a + s.score, 0) / (dashEligible.length || 1));
|
|
@@ -81,7 +78,7 @@ function DashboardSummary({ profile, dashEligible, computed, dataConfirmed, revi
|
|
|
81
78
|
profile.cpaName)),
|
|
82
79
|
react_1.default.createElement("div", { className: "flex gap-6 mt-[22px] pt-[18px]", style: { borderTop: "1px solid rgba(36,131,132,0.12)" } }, [
|
|
83
80
|
{ v: String(scoreUp), u: "/100", l: "Avg. Confidence", warn: false, ok: false },
|
|
84
|
-
{ v:
|
|
81
|
+
{ v: "25", u: "", l: "Strategies Scanned", warn: false, ok: false },
|
|
85
82
|
{
|
|
86
83
|
v: dataConfirmed ? "Done" : String(reviewUnreviewed),
|
|
87
84
|
u: "",
|
|
@@ -89,13 +86,6 @@ function DashboardSummary({ profile, dashEligible, computed, dataConfirmed, revi
|
|
|
89
86
|
warn: !dataConfirmed && reviewUnreviewed > 0,
|
|
90
87
|
ok: dataConfirmed,
|
|
91
88
|
},
|
|
92
|
-
...(confidenceTier ? [{
|
|
93
|
-
v: dataYears ? String(dataYears) : "1",
|
|
94
|
-
u: "yr",
|
|
95
|
-
l: confidenceTier.replace(/-DATA$/, "").replace(/-/g, " ").replace(/YR/, "yr"),
|
|
96
|
-
warn: (dataYears !== null && dataYears !== void 0 ? dataYears : 1) < 2,
|
|
97
|
-
ok: (dataYears !== null && dataYears !== void 0 ? dataYears : 1) >= 3,
|
|
98
|
-
}] : []),
|
|
99
89
|
].map(({ v, u, l, warn, ok }) => (react_1.default.createElement("div", { key: l },
|
|
100
90
|
react_1.default.createElement("div", { className: "font-tax-axis-mono font-bold leading-none", style: {
|
|
101
91
|
fontSize: 24,
|
|
@@ -6,5 +6,5 @@ interface StrategyDetailPanelProps {
|
|
|
6
6
|
computed: ComputedMap;
|
|
7
7
|
onClose: () => void;
|
|
8
8
|
}
|
|
9
|
-
export declare function StrategyDetailPanel({ s, profile
|
|
9
|
+
export declare function StrategyDetailPanel({ s, profile, computed, onClose }: StrategyDetailPanelProps): React.JSX.Element;
|
|
10
10
|
export {};
|
|
@@ -5,102 +5,26 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.StrategyDetailPanel = StrategyDetailPanel;
|
|
7
7
|
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const data_1 = require("../../lib/data");
|
|
8
9
|
const TaxAxisBadge_1 = require("../shared/TaxAxisBadge");
|
|
9
|
-
function Sec({ title, children
|
|
10
|
+
function Sec({ title, children }) {
|
|
10
11
|
return (react_1.default.createElement("div", { className: "mb-6" },
|
|
11
|
-
react_1.default.createElement("div", { className: "text-[11px] font-bold uppercase tracking-widest mb-2.5 font-tax-axis-mono"
|
|
12
|
+
react_1.default.createElement("div", { className: "text-[11px] font-bold text-tax-axis-teal-light uppercase tracking-widest mb-2.5 font-tax-axis-mono" }, title),
|
|
12
13
|
children));
|
|
13
14
|
}
|
|
14
15
|
const fmtK = (n) => `$${(n / 1000).toFixed(n % 1000 ? 1 : 0)}K`;
|
|
15
|
-
function
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const p = positionStrength.toUpperCase();
|
|
19
|
-
if (p.includes("SUBSTANTIAL"))
|
|
20
|
-
return { label: "Substantial Authority · Low §6694 Risk", color: "#0F6E56", dots: 4 };
|
|
21
|
-
if (p.includes("REASONABLE"))
|
|
22
|
-
return { label: "Reasonable Basis · Elevated §6694 Risk", color: "#FB9A1D", dots: 3 };
|
|
23
|
-
if (p.includes("DISCLOSURE") || p.includes("NEEDS_DISCLOSURE"))
|
|
24
|
-
return { label: "Needs Disclosure · High §6694 Risk", color: "#EF4444", dots: 2 };
|
|
25
|
-
return { label: positionStrength, color: "#9498B8", dots: 2 };
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Split engagement_recommendation at the implementation/action boundary.
|
|
29
|
-
*
|
|
30
|
-
* The LLM writes engagement_recommendation as a single paragraph covering both
|
|
31
|
-
* the savings math AND the CPA implementation steps. We split at the first
|
|
32
|
-
* implementation keyword so the savings math shows under "HOW SAVINGS BREAK DOWN"
|
|
33
|
-
* and the CPA action steps show under "CPA ENGAGEMENT NOTES".
|
|
34
|
-
*
|
|
35
|
-
* Heuristic: split at "Implementation:", "CPA should", "CPA must", or numbered
|
|
36
|
-
* action lists "(1)". If no split point found, entire text goes to savings section.
|
|
37
|
-
*/
|
|
38
|
-
function splitEngagementText(text) {
|
|
39
|
-
if (!text)
|
|
40
|
-
return { savingsSection: "", cpaSection: "" };
|
|
41
|
-
// Try splitting on double-newline first (well-structured LLM output)
|
|
42
|
-
const paraBreak = text.indexOf("\n\n");
|
|
43
|
-
if (paraBreak !== -1) {
|
|
44
|
-
return {
|
|
45
|
-
savingsSection: text.slice(0, paraBreak).trim(),
|
|
46
|
-
cpaSection: text.slice(paraBreak).trim(),
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
// Single-paragraph: find the first implementation boundary
|
|
50
|
-
const splitPatterns = [
|
|
51
|
-
/\s+Implementation:\s+/i,
|
|
52
|
-
/\s+CPA should\s+/i,
|
|
53
|
-
/\s+CPA must\s+/i,
|
|
54
|
-
/\s+To implement:\s+/i,
|
|
55
|
-
/\s+\(1\)\s+/, // numbered list start
|
|
56
|
-
];
|
|
57
|
-
for (const pattern of splitPatterns) {
|
|
58
|
-
const match = text.search(pattern);
|
|
59
|
-
if (match > 80) { // only split if there's meaningful content before it
|
|
60
|
-
return {
|
|
61
|
-
savingsSection: text.slice(0, match).trim(),
|
|
62
|
-
cpaSection: text.slice(match).trim(),
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
// No clean split point — show everything as savings breakdown, nothing as CPA notes
|
|
67
|
-
return { savingsSection: text, cpaSection: "" };
|
|
68
|
-
}
|
|
69
|
-
function SourceDocRows({ docs, trace }) {
|
|
70
|
-
if (docs && docs.length > 0) {
|
|
71
|
-
return (react_1.default.createElement("div", { className: "rounded-[10px] overflow-hidden", style: { border: "1px solid rgba(36,131,132,0.12)" } },
|
|
72
|
-
react_1.default.createElement("div", { className: "grid px-3.5 py-2", style: { background: "#161938", gridTemplateColumns: "1fr auto" } },
|
|
73
|
-
react_1.default.createElement("span", { className: "text-[10px] font-semibold text-tax-axis-text-3 uppercase tracking-wider font-tax-axis-mono" }, "Field \u00B7 Source"),
|
|
74
|
-
react_1.default.createElement("span", { className: "text-[10px] font-semibold text-tax-axis-text-3 uppercase tracking-wider font-tax-axis-mono text-right" }, "Value")),
|
|
75
|
-
docs.map((ref, i) => (react_1.default.createElement("div", { key: i, className: "grid px-3.5 py-2.5 items-center gap-3", style: { gridTemplateColumns: "1fr auto", borderTop: "1px solid rgba(36,131,132,0.08)" } },
|
|
76
|
-
react_1.default.createElement("div", null,
|
|
77
|
-
react_1.default.createElement("div", { className: "text-xs text-tax-axis-text font-tax-axis-body" }, ref.field_label),
|
|
78
|
-
react_1.default.createElement("div", { className: "text-[10px] text-tax-axis-text-3 font-tax-axis-mono mt-0.5" }, ref.source_hint)),
|
|
79
|
-
react_1.default.createElement("div", { className: "text-[13px] font-semibold text-tax-axis-teal-light font-tax-axis-mono text-right whitespace-nowrap" }, ref.value_display))))));
|
|
80
|
-
}
|
|
81
|
-
const traceSteps = trace !== null && trace !== void 0 ? trace : [];
|
|
82
|
-
if (!traceSteps.length) {
|
|
83
|
-
return react_1.default.createElement("p", { className: "text-xs text-tax-axis-text-2 italic" }, "Detailed source mapping not available for this strategy.");
|
|
84
|
-
}
|
|
85
|
-
return (react_1.default.createElement("div", { className: "rounded-[10px] overflow-hidden", style: { border: "1px solid rgba(36,131,132,0.12)" } },
|
|
86
|
-
react_1.default.createElement("div", { className: "grid grid-cols-2 px-3.5 py-2", style: { background: "#161938" } },
|
|
87
|
-
react_1.default.createElement("span", { className: "text-[10px] font-semibold text-tax-axis-text-3 uppercase tracking-wider font-tax-axis-mono" }, "Step"),
|
|
88
|
-
react_1.default.createElement("span", { className: "text-[10px] font-semibold text-tax-axis-text-3 uppercase tracking-wider font-tax-axis-mono text-right" }, "Result")),
|
|
89
|
-
traceSteps.map((t, i) => (react_1.default.createElement("div", { key: i, className: "grid grid-cols-2 px-3.5 py-2.5", style: { borderTop: "1px solid rgba(36,131,132,0.08)" } },
|
|
90
|
-
react_1.default.createElement("div", null,
|
|
91
|
-
react_1.default.createElement("div", { className: "text-xs text-tax-axis-text font-tax-axis-body" }, t.step),
|
|
92
|
-
react_1.default.createElement("div", { className: "text-[10px] text-tax-axis-text-3 font-tax-axis-mono mt-0.5 break-all" }, t.formula)),
|
|
93
|
-
react_1.default.createElement("div", { className: "text-right" },
|
|
94
|
-
react_1.default.createElement("div", { className: "text-[13px] font-semibold text-tax-axis-teal-light font-tax-axis-mono" }, t.result),
|
|
95
|
-
t.src && react_1.default.createElement("div", { className: "text-[9px] text-tax-axis-text-3 font-tax-axis-mono mt-0.5" }, t.src)))))));
|
|
96
|
-
}
|
|
97
|
-
function StrategyDetailPanel({ s, profile: _profile, computed, onClose }) {
|
|
98
|
-
var _a, _b;
|
|
16
|
+
function StrategyDetailPanel({ s, profile, computed, onClose }) {
|
|
17
|
+
var _a, _b, _c, _d, _e, _f;
|
|
18
|
+
const narr = data_1.STRATEGY_NARRATIVE[s.rank];
|
|
99
19
|
const c = computed === null || computed === void 0 ? void 0 : computed.get(s.rank);
|
|
100
20
|
const lo = (_a = c === null || c === void 0 ? void 0 : c.lo) !== null && _a !== void 0 ? _a : s.lo;
|
|
101
21
|
const hi = (_b = c === null || c === void 0 ? void 0 : c.hi) !== null && _b !== void 0 ? _b : s.hi;
|
|
102
|
-
const
|
|
103
|
-
const
|
|
22
|
+
const sources = (_d = (_c = c === null || c === void 0 ? void 0 : c.sources) !== null && _c !== void 0 ? _c : s.sources) !== null && _d !== void 0 ? _d : [];
|
|
23
|
+
const trace = (_f = (_e = c === null || c === void 0 ? void 0 : c.trace) !== null && _e !== void 0 ? _e : s.trace) !== null && _f !== void 0 ? _f : [];
|
|
24
|
+
const whyText = narr ? narr.whyMatters(profile) : data_1.NARRATIVE_FALLBACK.whyMatters(s);
|
|
25
|
+
const breakdownText = narr ? narr.breakdown(profile, c) : data_1.NARRATIVE_FALLBACK.breakdown(s, c);
|
|
26
|
+
const specialistText = (narr === null || narr === void 0 ? void 0 : narr.whySpecialist) || data_1.NARRATIVE_FALLBACK.whySpecialist(s);
|
|
27
|
+
const nextText = narr ? narr.nextSteps : data_1.NARRATIVE_FALLBACK.nextSteps(s);
|
|
104
28
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
105
29
|
react_1.default.createElement("div", { onClick: onClose, className: "fixed inset-0 z-[200]", style: { background: "rgba(6,8,33,0.7)", backdropFilter: "blur(4px)" } }),
|
|
106
30
|
react_1.default.createElement("div", { className: "fixed top-0 right-0 bottom-0 z-[201] flex flex-col", style: {
|
|
@@ -113,14 +37,14 @@ function StrategyDetailPanel({ s, profile: _profile, computed, onClose }) {
|
|
|
113
37
|
react_1.default.createElement("div", { className: "px-6 py-5 flex-shrink-0", style: { borderBottom: "1px solid rgba(36,131,132,0.12)" } },
|
|
114
38
|
react_1.default.createElement("div", { className: "flex justify-between items-start mb-3" },
|
|
115
39
|
react_1.default.createElement("div", null,
|
|
116
|
-
react_1.default.createElement("div", { className: "flex items-center gap-2 mb-1.5
|
|
40
|
+
react_1.default.createElement("div", { className: "flex items-center gap-2 mb-1.5" },
|
|
117
41
|
react_1.default.createElement("span", { className: "text-xl font-bold text-tax-axis-text font-tax-axis-head" }, s.name),
|
|
118
42
|
react_1.default.createElement("span", { className: "text-[11px] font-tax-axis-mono text-tax-axis-teal-light bg-tax-axis-teal-bg px-2 py-0.5 rounded" }, s.code)),
|
|
119
|
-
react_1.default.createElement("div", { className: "flex gap-2
|
|
43
|
+
react_1.default.createElement("div", { className: "flex gap-2" },
|
|
120
44
|
react_1.default.createElement(TaxAxisBadge_1.TaxAxisBadge, null, s.priority),
|
|
121
45
|
react_1.default.createElement(TaxAxisBadge_1.TaxAxisBadge, { color: "neutral" }, s.timeline),
|
|
122
|
-
s.
|
|
123
|
-
react_1.default.createElement("button", { onClick: onClose, className: "flex items-center justify-center w-8 h-8 rounded-lg
|
|
46
|
+
s.cost && s.cost !== "$0" && (react_1.default.createElement(TaxAxisBadge_1.TaxAxisBadge, { color: "orange" }, s.cost)))),
|
|
47
|
+
react_1.default.createElement("button", { onClick: onClose, className: "flex items-center justify-center w-8 h-8 rounded-lg", style: { background: "#1A1D3A", border: "1px solid rgba(36,131,132,0.12)" } },
|
|
124
48
|
react_1.default.createElement("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none" },
|
|
125
49
|
react_1.default.createElement("path", { d: "M2.5 2.5l7 7M9.5 2.5l-7 7", stroke: "#9498B8", strokeWidth: "1.5", strokeLinecap: "round" })))),
|
|
126
50
|
react_1.default.createElement("div", { className: "font-tax-axis-head", style: { fontSize: 34, fontWeight: 900, color: "#A1E5E6", letterSpacing: "-1.5px" } },
|
|
@@ -129,40 +53,87 @@ function StrategyDetailPanel({ s, profile: _profile, computed, onClose }) {
|
|
|
129
53
|
fmtK(hi),
|
|
130
54
|
react_1.default.createElement("span", { className: "text-[13px] text-tax-axis-text-3 font-normal font-tax-axis-body ml-2" }, "est. annual savings"))),
|
|
131
55
|
react_1.default.createElement("div", { className: "flex-1 overflow-y-auto p-6" },
|
|
132
|
-
s.warning && (react_1.default.createElement("div", { className: "p-3 rounded-lg mb-6 text-xs leading-relaxed", style: {
|
|
56
|
+
s.warning && (react_1.default.createElement("div", { className: "p-3 rounded-lg mb-6 text-xs leading-relaxed", style: {
|
|
57
|
+
background: "rgba(251,154,29,0.06)",
|
|
58
|
+
border: "1px solid rgba(251,154,29,0.25)",
|
|
59
|
+
color: "#FB9A1D",
|
|
60
|
+
} },
|
|
133
61
|
react_1.default.createElement("strong", null, "Flag: "),
|
|
134
62
|
s.warning)),
|
|
135
|
-
|
|
136
|
-
react_1.default.createElement("
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
react_1.default.createElement("div", { className: "text-[
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
react_1.default.createElement(
|
|
144
|
-
|
|
145
|
-
react_1.default.createElement("div", { className: "
|
|
146
|
-
|
|
147
|
-
react_1.default.createElement(Sec, { title: "
|
|
63
|
+
react_1.default.createElement("div", { className: "mb-6" },
|
|
64
|
+
react_1.default.createElement("div", { className: "text-[11px] font-bold uppercase tracking-widest text-tax-axis-text-4 mb-2 font-tax-axis-mono" }, "WHY THIS MATTERS"),
|
|
65
|
+
react_1.default.createElement("div", { className: "text-[13px] text-tax-axis-text-2 leading-[1.75] font-tax-axis-body" }, whyText)),
|
|
66
|
+
react_1.default.createElement("div", { className: "mb-6" },
|
|
67
|
+
react_1.default.createElement("div", { className: "text-[11px] font-bold uppercase tracking-widest text-tax-axis-text-4 mb-2 font-tax-axis-mono" }, "HOW SAVINGS BREAK DOWN"),
|
|
68
|
+
react_1.default.createElement("div", { className: "text-[13px] text-tax-axis-text-2 leading-[1.75] font-tax-axis-body" }, breakdownText)),
|
|
69
|
+
react_1.default.createElement("div", { className: "mb-6 pl-3.5 py-0.5", style: { borderLeft: "3px solid #FB9A1D" } },
|
|
70
|
+
react_1.default.createElement("div", { className: "text-[11px] font-bold uppercase tracking-widest mb-2 font-tax-axis-mono", style: { color: "#FB9A1D" } }, "WHY YOU NEED A SPECIALIST"),
|
|
71
|
+
react_1.default.createElement("div", { className: "text-[13px] text-tax-axis-text-2 leading-[1.75] font-tax-axis-body" }, specialistText)),
|
|
72
|
+
react_1.default.createElement("div", { className: "rounded-lg p-3 mb-6", style: { background: "rgba(36,131,132,0.06)", border: "1px solid rgba(36,131,132,0.2)" } },
|
|
73
|
+
react_1.default.createElement("div", { className: "text-[11px] font-bold uppercase tracking-widest text-tax-axis-teal-light mb-1.5 font-tax-axis-mono" }, "WHAT WE'D DO NEXT"),
|
|
74
|
+
react_1.default.createElement("div", { className: "text-[13px] text-tax-axis-text leading-[1.7] font-tax-axis-body" }, typeof nextText === "string" ? nextText : "Provide documents so we can calculate exact savings.")),
|
|
75
|
+
react_1.default.createElement(Sec, { title: "Summary" },
|
|
76
|
+
react_1.default.createElement("p", { className: "text-sm text-tax-axis-text leading-[1.8] font-tax-axis-body" }, s.abstract)),
|
|
77
|
+
react_1.default.createElement(Sec, { title: "Plain Language" },
|
|
78
|
+
react_1.default.createElement("div", { className: "p-3.5 rounded-[10px]", style: { background: "rgba(36,131,132,0.06)", border: "1px solid rgba(36,131,132,0.2)" } },
|
|
79
|
+
react_1.default.createElement("p", { className: "text-sm text-tax-axis-teal-light leading-[1.7] font-tax-axis-body italic" },
|
|
80
|
+
"\u201C",
|
|
81
|
+
s.clientBrief,
|
|
82
|
+
"\u201D"))),
|
|
83
|
+
react_1.default.createElement(Sec, { title: "Source Documents" },
|
|
84
|
+
react_1.default.createElement("div", { className: "rounded-[10px] overflow-hidden", style: { border: "1px solid rgba(36,131,132,0.12)" } },
|
|
85
|
+
react_1.default.createElement("div", { className: "grid grid-cols-[1.2fr_1fr_.8fr_.8fr] px-3.5 py-2.5", style: { background: "#161938" } }, ["Field", "Document", "Line", "Value"].map((h) => (react_1.default.createElement("span", { key: h, className: "text-[10px] font-semibold text-tax-axis-text-3 uppercase tracking-wider font-tax-axis-mono" }, h)))),
|
|
86
|
+
sources.map((src, i) => (react_1.default.createElement("div", { key: i, className: "grid grid-cols-[1.2fr_1fr_.8fr_.8fr] px-3.5 py-2.5", style: { borderTop: "1px solid rgba(36,131,132,0.12)" } },
|
|
87
|
+
react_1.default.createElement("span", { className: "text-xs text-tax-axis-text" }, src.field),
|
|
88
|
+
react_1.default.createElement("span", { className: "text-[11px] font-tax-axis-mono text-tax-axis-text-2" }, src.doc),
|
|
89
|
+
react_1.default.createElement("span", { className: "text-[11px] font-tax-axis-mono text-tax-axis-text-2" }, src.line),
|
|
90
|
+
react_1.default.createElement("span", { className: "text-[13px] font-semibold text-tax-axis-teal-light font-tax-axis-mono" }, src.value)))))),
|
|
91
|
+
react_1.default.createElement(Sec, { title: "Calculation Trace" },
|
|
92
|
+
react_1.default.createElement("div", { className: "rounded-[10px] overflow-hidden", style: { border: "1px solid rgba(36,131,132,0.12)" } },
|
|
93
|
+
trace.map((t, i) => (react_1.default.createElement("div", { key: i, className: "p-3 flex gap-3 items-start", style: { borderTop: i ? "1px solid rgba(36,131,132,0.12)" : "none" } },
|
|
94
|
+
react_1.default.createElement("span", { className: "text-[11px] font-bold text-tax-axis-teal font-tax-axis-mono w-5 flex-shrink-0" }, t.n),
|
|
95
|
+
react_1.default.createElement("div", { className: "flex-1" },
|
|
96
|
+
react_1.default.createElement("div", { className: "text-[13px] font-medium text-tax-axis-text font-tax-axis-body mb-0.5" }, t.step),
|
|
97
|
+
react_1.default.createElement("div", { className: "text-[11px] font-tax-axis-mono text-tax-axis-text-2" }, t.formula)),
|
|
98
|
+
react_1.default.createElement("div", { className: "text-right flex-shrink-0" },
|
|
99
|
+
react_1.default.createElement("div", { className: "text-[13px] font-bold text-tax-axis-teal-light font-tax-axis-mono" }, t.result),
|
|
100
|
+
react_1.default.createElement("div", { className: "text-[9px] text-tax-axis-text-3 font-tax-axis-mono mt-0.5" }, t.src))))),
|
|
101
|
+
react_1.default.createElement("div", { className: "p-3.5", style: { borderTop: "1px solid rgba(36,131,132,0.12)", background: "#161938" } },
|
|
102
|
+
react_1.default.createElement("div", { className: "text-[10px] font-bold text-tax-axis-teal-light uppercase tracking-widest mb-2 font-tax-axis-mono" }, "Derivation"),
|
|
103
|
+
react_1.default.createElement("div", { className: "flex items-center gap-2 flex-wrap" }, trace.map((t, i) => (react_1.default.createElement("span", { key: i, className: "flex items-center gap-1.5" },
|
|
104
|
+
react_1.default.createElement("span", { className: "text-xs font-tax-axis-mono text-tax-axis-text px-2 py-0.5 rounded", style: { background: "#1A1D3A", border: "1px solid rgba(36,131,132,0.12)" } }, t.result),
|
|
105
|
+
i < trace.length - 1 && (react_1.default.createElement("span", { className: "text-[11px] text-tax-axis-text-3 font-tax-axis-mono" }, "\u2192")))))),
|
|
106
|
+
trace.length > 1 && (react_1.default.createElement("div", { className: "mt-2 text-xs font-tax-axis-mono p-2 rounded-md leading-relaxed", style: { background: "#1A1D3A", border: "1px solid rgba(36,131,132,0.12)" } },
|
|
107
|
+
react_1.default.createElement("span", { className: "text-tax-axis-text-2" }, "Result: "),
|
|
108
|
+
react_1.default.createElement("span", { className: "font-semibold text-tax-axis-teal-light" }, trace[trace.length - 1].result),
|
|
109
|
+
react_1.default.createElement("span", { className: "text-tax-axis-text-2" }, " via "),
|
|
110
|
+
react_1.default.createElement("span", { className: "text-tax-axis-text" }, trace[trace.length - 1].formula)))))),
|
|
111
|
+
react_1.default.createElement(Sec, { title: "IRS Authority" },
|
|
148
112
|
react_1.default.createElement("div", { className: "p-3.5 rounded-[10px] mb-3", style: { background: "#1A1D3A", border: "1px solid rgba(36,131,132,0.12)" } },
|
|
149
|
-
react_1.default.createElement("div", { className: "text-[13px] font-tax-axis-mono text-tax-axis-text mb-1" }, s.authority
|
|
150
|
-
|
|
113
|
+
react_1.default.createElement("div", { className: "text-[13px] font-tax-axis-mono text-tax-axis-text mb-1" }, s.authority),
|
|
114
|
+
react_1.default.createElement("div", { className: "text-[11px] text-tax-axis-text-2" },
|
|
151
115
|
"Forms: ",
|
|
152
|
-
react_1.default.createElement("span", { className: "font-tax-axis-mono text-tax-axis-text" }, s.forms)))
|
|
116
|
+
react_1.default.createElement("span", { className: "font-tax-axis-mono text-tax-axis-text" }, s.forms))),
|
|
153
117
|
react_1.default.createElement("div", { className: "rounded-[10px] overflow-hidden", style: { background: "rgba(36,131,132,0.06)", border: "1px solid rgba(36,131,132,0.2)" } },
|
|
154
118
|
react_1.default.createElement("div", { className: "p-3 flex gap-3 items-center", style: { borderBottom: "1px solid rgba(36,131,132,0.15)" } },
|
|
155
|
-
react_1.default.createElement("div", { className: "flex gap-[3px]" }, [1, 2, 3, 4, 5].map((i) => (react_1.default.createElement("div", { key: i, className: "w-2 h-2 rounded-sm", style: { background: i <=
|
|
156
|
-
react_1.default.createElement("span", { className: "text-[13px] font-semibold font-tax-axis-head",
|
|
119
|
+
react_1.default.createElement("div", { className: "flex gap-[3px]" }, [1, 2, 3, 4, 5].map((i) => (react_1.default.createElement("div", { key: i, className: "w-2 h-2 rounded-sm", style: { background: i <= 4 ? "#248384" : "rgba(36,131,132,0.2)" } })))),
|
|
120
|
+
react_1.default.createElement("span", { className: "text-[13px] font-semibold text-tax-axis-teal-light font-tax-axis-head" }, "Substantial Authority \u00B7 Low \u00A76694 Risk")),
|
|
157
121
|
react_1.default.createElement("div", { className: "p-3" },
|
|
158
|
-
react_1.default.createElement("p", { className: "text-xs text-tax-axis-text leading-[1.7] font-tax-axis-body" },
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
:
|
|
163
|
-
|
|
164
|
-
|
|
122
|
+
react_1.default.createElement("p", { className: "text-xs text-tax-axis-text leading-[1.7] font-tax-axis-body mb-2" }, "IRC \u00A76694 imposes penalties on preparers who sign off on positions that lack sufficient legal support. There are two tiers:"),
|
|
123
|
+
react_1.default.createElement("div", { className: "grid gap-1.5 mb-2.5" },
|
|
124
|
+
react_1.default.createElement("div", { className: "p-2 rounded-md", style: { background: "#1A1D3A", border: "1px solid rgba(36,131,132,0.12)" } },
|
|
125
|
+
react_1.default.createElement("div", { className: "text-[11px] font-semibold text-tax-axis-text font-tax-axis-head mb-0.5" }, "Tier 1 \u2014 Unreasonable Position"),
|
|
126
|
+
react_1.default.createElement("div", { className: "text-[11px] text-tax-axis-text-2 leading-relaxed font-tax-axis-body" }, "If a position lacks \u201Csubstantial authority\u201D (~40% chance of being sustained), the preparer faces the greater of $1,000 or 50% of the fee earned from that return.")),
|
|
127
|
+
react_1.default.createElement("div", { className: "p-2 rounded-md", style: { background: "#1A1D3A", border: "1px solid rgba(36,131,132,0.12)" } },
|
|
128
|
+
react_1.default.createElement("div", { className: "text-[11px] font-semibold text-tax-axis-text font-tax-axis-head mb-0.5" }, "Tier 2 \u2014 Willful or Reckless Conduct"),
|
|
129
|
+
react_1.default.createElement("div", { className: "text-[11px] text-tax-axis-text-2 leading-relaxed font-tax-axis-body" }, "If the preparer knowingly disregards rules or regulations, the penalty is the greater of $5,000 or 75% of the fee earned."))),
|
|
130
|
+
react_1.default.createElement("div", { className: "p-2 rounded-md flex gap-2 items-start", style: { background: "rgba(15,110,86,0.06)", border: "1px solid rgba(15,110,86,0.15)" } },
|
|
131
|
+
react_1.default.createElement("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", className: "flex-shrink-0 mt-0.5" },
|
|
132
|
+
react_1.default.createElement("path", { d: "M2.5 7l3.5 3.5 5.5-6", stroke: "#0F6E56", strokeWidth: "1.5", strokeLinecap: "round" })),
|
|
133
|
+
react_1.default.createElement("div", { className: "text-[11px] text-tax-axis-text leading-relaxed font-tax-axis-body" },
|
|
134
|
+
react_1.default.createElement("strong", { style: { color: "#0F6E56" } }, "This strategy holds Substantial Authority"),
|
|
135
|
+
" \u2014 established IRS guidance, published revenue rulings, or settled case law support this position. Signing off on this carries low preparer penalty exposure under \u00A76694(a).")))))),
|
|
165
136
|
react_1.default.createElement("div", { className: "px-6 py-4 flex-shrink-0", style: { borderTop: "1px solid rgba(36,131,132,0.12)", background: "#0E1132" } },
|
|
166
|
-
react_1.default.createElement("div", { className: "text-[11px] text-tax-axis-text-3
|
|
167
|
-
react_1.default.createElement("div", { className: "text-sm font-medium text-tax-axis-text
|
|
137
|
+
react_1.default.createElement("div", { className: "text-[11px] text-tax-axis-text-3 mb-2" }, "Recommended action:"),
|
|
138
|
+
react_1.default.createElement("div", { className: "text-sm font-medium text-tax-axis-text" }, s.action)))));
|
|
168
139
|
}
|