@threatcaptain/tc-reports 0.2.19 → 0.2.20
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/dist/index.cjs +217 -125
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +217 -125
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -28747,24 +28747,24 @@ const Dashboard = ({
|
|
|
28747
28747
|
};
|
|
28748
28748
|
const getExecutiveSummaryTemplate = (industry) => {
|
|
28749
28749
|
switch (industry) {
|
|
28750
|
-
case "
|
|
28750
|
+
case "healthcare":
|
|
28751
28751
|
return "Think of this like a malpractice insurance evaluation for your medical practice. Just as you wouldn't practice without malpractice coverage, you can't afford to practice without understanding your cyber risk exposure. One successful cyberattack could cost your practice more than your highest malpractice settlement.";
|
|
28752
|
-
case "
|
|
28752
|
+
case "legal_services":
|
|
28753
28753
|
return "Think of this like a malpractice insurance evaluation for your law firm. Just as you wouldn't practice without malpractice coverage, you can't afford to practice without understanding your cyber risk exposure. One successful cyberattack could cost your firm more than your highest case settlement.";
|
|
28754
|
-
case "
|
|
28754
|
+
case "financial_services":
|
|
28755
28755
|
return "Think of this like a regulatory compliance audit for your financial institution. Just as you wouldn't operate without proper compliance, you can't afford to operate without understanding your cyber risk exposure. One successful cyberattack could cost your institution more than your largest loan default.";
|
|
28756
|
-
case "
|
|
28756
|
+
case "education":
|
|
28757
28757
|
return "Think of this like an accreditation review for your educational institution. Just as you wouldn't operate without proper accreditation, you can't afford to operate without understanding your cyber risk exposure. One successful cyberattack could cost your institution more than losing a major grant.";
|
|
28758
|
-
case "
|
|
28758
|
+
case "manufacturing":
|
|
28759
28759
|
return "Think of this like a safety inspection for your manufacturing facility. Just as you wouldn't operate without proper safety protocols, you can't afford to operate without understanding your cyber risk exposure. One successful cyberattack could cost your facility more than your largest equipment failure.";
|
|
28760
|
-
case "
|
|
28760
|
+
case "retail_consumer_goods":
|
|
28761
28761
|
return "Think of this like a loss prevention audit for your retail business. Just as you wouldn't operate without proper inventory controls, you can't afford to operate without understanding your cyber risk exposure. One successful cyberattack could cost your business more than your highest shrinkage loss.";
|
|
28762
28762
|
case "technology_software":
|
|
28763
28763
|
return "Think of this like a code review for your software platform. Just as you wouldn't deploy without proper testing, you can't afford to operate without understanding your cyber risk exposure. One successful cyberattack could cost your company more than your largest system outage.";
|
|
28764
|
-
case "
|
|
28764
|
+
case 'government_public_sector"':
|
|
28765
28765
|
return "Think of this like a security clearance review for your agency. Just as you wouldn't operate without proper clearances, you can't afford to operate without understanding your cyber risk exposure. One successful cyberattack could cost your agency more than your largest budget overrun.";
|
|
28766
28766
|
default:
|
|
28767
|
-
return "
|
|
28767
|
+
return "Backed by sources like IBM Security and the Ponemon Institute, this analysis provides a credible view of the risks organizations like yours face in today's threat landscape. Alongside relevant industry insights, this report outlines actionable considerations to support the client's cybersecurity planning, risk management, and executive decision-making—even ahead of a detailed security assessment.";
|
|
28768
28768
|
}
|
|
28769
28769
|
};
|
|
28770
28770
|
const formatCurrency = (value) => {
|
|
@@ -51196,7 +51196,7 @@ const getRadarData = ({ breachData }) => {
|
|
|
51196
51196
|
}).map((phase) => {
|
|
51197
51197
|
const visualCoverage = phase.coverage === 0 ? 2 : phase.coverage;
|
|
51198
51198
|
return {
|
|
51199
|
-
tactic: phase.phase.replace("TA00", "").replace("_", " ")
|
|
51199
|
+
tactic: phase.phase.replace("TA00", "").replace("_", " "),
|
|
51200
51200
|
coverage: visualCoverage,
|
|
51201
51201
|
// Use for chart rendering
|
|
51202
51202
|
actualCoverage: phase.coverage,
|
|
@@ -51239,92 +51239,166 @@ const MitreAttack = ({ breachData, overallLikelihood }) => {
|
|
|
51239
51239
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
51240
51240
|
/* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold text-gray-900", children: "MITRE ATT&CK Coverage" }),
|
|
51241
51241
|
/* @__PURE__ */ jsx("p", { className: "text-sm text-gray-600", children: "14 Tactics Protection Level" }),
|
|
51242
|
-
/* @__PURE__ */ jsx(
|
|
51243
|
-
|
|
51242
|
+
/* @__PURE__ */ jsx(
|
|
51243
|
+
ChartContainer,
|
|
51244
51244
|
{
|
|
51245
|
-
|
|
51246
|
-
|
|
51247
|
-
children:
|
|
51248
|
-
|
|
51249
|
-
|
|
51250
|
-
|
|
51251
|
-
|
|
51252
|
-
|
|
51253
|
-
|
|
51254
|
-
|
|
51255
|
-
|
|
51256
|
-
|
|
51257
|
-
|
|
51258
|
-
|
|
51259
|
-
|
|
51260
|
-
|
|
51261
|
-
|
|
51262
|
-
|
|
51263
|
-
|
|
51264
|
-
|
|
51265
|
-
|
|
51266
|
-
|
|
51267
|
-
|
|
51268
|
-
|
|
51269
|
-
|
|
51270
|
-
|
|
51271
|
-
|
|
51272
|
-
|
|
51273
|
-
|
|
51274
|
-
|
|
51275
|
-
|
|
51276
|
-
|
|
51277
|
-
|
|
51278
|
-
|
|
51279
|
-
|
|
51280
|
-
|
|
51281
|
-
|
|
51282
|
-
|
|
51283
|
-
|
|
51284
|
-
|
|
51285
|
-
|
|
51286
|
-
|
|
51287
|
-
|
|
51288
|
-
|
|
51289
|
-
|
|
51290
|
-
|
|
51291
|
-
|
|
51292
|
-
|
|
51293
|
-
|
|
51294
|
-
|
|
51295
|
-
|
|
51296
|
-
|
|
51297
|
-
|
|
51298
|
-
|
|
51299
|
-
|
|
51300
|
-
|
|
51301
|
-
|
|
51302
|
-
|
|
51303
|
-
|
|
51304
|
-
|
|
51305
|
-
|
|
51306
|
-
|
|
51307
|
-
|
|
51308
|
-
|
|
51245
|
+
config: chartConfig,
|
|
51246
|
+
className: "h-[420px] w-[420px] min-h-[420px] min-w-[420px] mb-0",
|
|
51247
|
+
children: /* @__PURE__ */ jsxs(
|
|
51248
|
+
RadarChart,
|
|
51249
|
+
{
|
|
51250
|
+
data: radarData,
|
|
51251
|
+
margin: { top: 50, right: 80, bottom: 50, left: 80 },
|
|
51252
|
+
children: [
|
|
51253
|
+
/* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs("radialGradient", { id: gradientId, cx: "50%", cy: "50%", r: "50%", children: [
|
|
51254
|
+
/* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: strokeColor, stopOpacity: 0.4 }),
|
|
51255
|
+
/* @__PURE__ */ jsx("stop", { offset: "70%", stopColor: strokeColor, stopOpacity: 0.2 }),
|
|
51256
|
+
/* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: strokeColor, stopOpacity: 0.1 })
|
|
51257
|
+
] }) }),
|
|
51258
|
+
/* @__PURE__ */ jsx(PolarGrid, { stroke: "#e5e5e5", strokeWidth: 1, radialLines: true }),
|
|
51259
|
+
/* @__PURE__ */ jsx(
|
|
51260
|
+
PolarAngleAxis,
|
|
51261
|
+
{
|
|
51262
|
+
dataKey: "tactic",
|
|
51263
|
+
tick: (props) => {
|
|
51264
|
+
const { payload, x: x2, y: y2, textAnchor } = props;
|
|
51265
|
+
const label = payload.value;
|
|
51266
|
+
const centerX = 210;
|
|
51267
|
+
const centerY = 210;
|
|
51268
|
+
const dx = x2 - centerX;
|
|
51269
|
+
const dy = y2 - centerY;
|
|
51270
|
+
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
51271
|
+
const unitX = dx / distance;
|
|
51272
|
+
const unitY = dy / distance;
|
|
51273
|
+
const offset2 = 15;
|
|
51274
|
+
const offsetX = x2 + unitX * offset2;
|
|
51275
|
+
const offsetY = y2 + unitY * offset2;
|
|
51276
|
+
if (label.length >= 12) {
|
|
51277
|
+
const words = label.split(" ");
|
|
51278
|
+
let line1 = "";
|
|
51279
|
+
let line2 = "";
|
|
51280
|
+
let bestSplit = Math.ceil(words.length / 2);
|
|
51281
|
+
for (let i = 0; i < words.length; i++) {
|
|
51282
|
+
if (words[i].toLowerCase() === "and" && i > 0 && i < words.length - 1) {
|
|
51283
|
+
bestSplit = i;
|
|
51284
|
+
break;
|
|
51285
|
+
}
|
|
51286
|
+
}
|
|
51287
|
+
line1 = words.slice(0, bestSplit).join(" ");
|
|
51288
|
+
line2 = words.slice(bestSplit).join(" ");
|
|
51289
|
+
return /* @__PURE__ */ jsxs("g", { transform: `translate(${offsetX},${offsetY})`, children: [
|
|
51290
|
+
/* @__PURE__ */ jsx(
|
|
51291
|
+
"text",
|
|
51292
|
+
{
|
|
51293
|
+
x: 0,
|
|
51294
|
+
y: -4,
|
|
51295
|
+
textAnchor,
|
|
51296
|
+
fontSize: 10,
|
|
51297
|
+
fill: "#6b7280",
|
|
51298
|
+
className: "text-xs",
|
|
51299
|
+
style: { dominantBaseline: "middle" },
|
|
51300
|
+
children: line1
|
|
51301
|
+
}
|
|
51302
|
+
),
|
|
51303
|
+
/* @__PURE__ */ jsx(
|
|
51304
|
+
"text",
|
|
51305
|
+
{
|
|
51306
|
+
x: 0,
|
|
51307
|
+
y: 8,
|
|
51308
|
+
textAnchor,
|
|
51309
|
+
fontSize: 10,
|
|
51310
|
+
fill: "#6b7280",
|
|
51311
|
+
className: "text-xs",
|
|
51312
|
+
style: { dominantBaseline: "middle" },
|
|
51313
|
+
children: line2
|
|
51314
|
+
}
|
|
51315
|
+
)
|
|
51316
|
+
] });
|
|
51317
|
+
}
|
|
51318
|
+
return /* @__PURE__ */ jsx(
|
|
51319
|
+
"text",
|
|
51309
51320
|
{
|
|
51310
|
-
|
|
51311
|
-
|
|
51312
|
-
|
|
51313
|
-
|
|
51314
|
-
|
|
51315
|
-
|
|
51316
|
-
|
|
51321
|
+
x: offsetX,
|
|
51322
|
+
y: offsetY,
|
|
51323
|
+
textAnchor,
|
|
51324
|
+
fontSize: 10,
|
|
51325
|
+
fill: "#6b7280",
|
|
51326
|
+
className: "text-xs",
|
|
51327
|
+
children: label
|
|
51317
51328
|
}
|
|
51318
|
-
)
|
|
51319
|
-
|
|
51329
|
+
);
|
|
51330
|
+
},
|
|
51331
|
+
className: "text-xs"
|
|
51320
51332
|
}
|
|
51321
|
-
|
|
51322
|
-
|
|
51323
|
-
|
|
51324
|
-
|
|
51325
|
-
|
|
51333
|
+
),
|
|
51334
|
+
/* @__PURE__ */ jsx(
|
|
51335
|
+
PolarRadiusAxis,
|
|
51336
|
+
{
|
|
51337
|
+
angle: 90,
|
|
51338
|
+
domain: [0, 100],
|
|
51339
|
+
tick: { fontSize: 8, fill: "#6b7280" },
|
|
51340
|
+
tickCount: 6,
|
|
51341
|
+
axisLine: false
|
|
51342
|
+
}
|
|
51343
|
+
),
|
|
51344
|
+
/* @__PURE__ */ jsx(
|
|
51345
|
+
Radar,
|
|
51346
|
+
{
|
|
51347
|
+
name: "Coverage",
|
|
51348
|
+
dataKey: "coverage",
|
|
51349
|
+
stroke: strokeColor,
|
|
51350
|
+
fill: `url(#${gradientId})`,
|
|
51351
|
+
strokeWidth: 2.5,
|
|
51352
|
+
dot: {
|
|
51353
|
+
r: 4,
|
|
51354
|
+
fill: strokeColor,
|
|
51355
|
+
strokeWidth: 2,
|
|
51356
|
+
stroke: "#ffffff"
|
|
51357
|
+
},
|
|
51358
|
+
activeDot: {
|
|
51359
|
+
r: 6,
|
|
51360
|
+
fill: strokeColor,
|
|
51361
|
+
strokeWidth: 2,
|
|
51362
|
+
stroke: "#ffffff"
|
|
51363
|
+
}
|
|
51364
|
+
}
|
|
51365
|
+
),
|
|
51366
|
+
/* @__PURE__ */ jsx(
|
|
51367
|
+
ChartTooltip,
|
|
51368
|
+
{
|
|
51369
|
+
content: ({ active, payload }) => {
|
|
51370
|
+
if (active && payload && payload.length) {
|
|
51371
|
+
const data = payload[0].payload;
|
|
51372
|
+
return /* @__PURE__ */ jsxs("div", { className: "bg-white p-3 border rounded-lg shadow-lg", children: [
|
|
51373
|
+
/* @__PURE__ */ jsx("p", { className: "font-semibold text-gray-900", children: data.fullName }),
|
|
51374
|
+
/* @__PURE__ */ jsxs("p", { className: "text-sm text-gray-600", children: [
|
|
51375
|
+
"Coverage: ",
|
|
51376
|
+
data.actualCoverage,
|
|
51377
|
+
"%"
|
|
51378
|
+
] }),
|
|
51379
|
+
/* @__PURE__ */ jsxs(
|
|
51380
|
+
"p",
|
|
51381
|
+
{
|
|
51382
|
+
className: "text-sm",
|
|
51383
|
+
style: { color: getRiskLevelColor(data.riskLevel) },
|
|
51384
|
+
children: [
|
|
51385
|
+
"Risk Level:",
|
|
51386
|
+
" ",
|
|
51387
|
+
data.riskLevel.charAt(0).toUpperCase() + data.riskLevel.slice(1)
|
|
51388
|
+
]
|
|
51389
|
+
}
|
|
51390
|
+
)
|
|
51391
|
+
] });
|
|
51392
|
+
}
|
|
51393
|
+
return null;
|
|
51394
|
+
}
|
|
51395
|
+
}
|
|
51396
|
+
)
|
|
51397
|
+
]
|
|
51398
|
+
}
|
|
51399
|
+
)
|
|
51326
51400
|
}
|
|
51327
|
-
)
|
|
51401
|
+
),
|
|
51328
51402
|
/* @__PURE__ */ jsxs("div", { className: "text-center", children: [
|
|
51329
51403
|
/* @__PURE__ */ jsxs(
|
|
51330
51404
|
"div",
|
|
@@ -51882,7 +51956,7 @@ const BreachLikelihood = ({ reportData }) => {
|
|
|
51882
51956
|
overallLikelihood: attackLikelihood
|
|
51883
51957
|
}
|
|
51884
51958
|
) : /* @__PURE__ */ jsx("p", { children: "Getting breach data..." }) }),
|
|
51885
|
-
/* @__PURE__ */ jsxs("div", { className: "
|
|
51959
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col justify-center gap-4", children: [
|
|
51886
51960
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center p-4 rounded-md bg-slate-50", children: [
|
|
51887
51961
|
/* @__PURE__ */ jsx(CheckCircle, { className: "w-6 h-6 mr-4 text-green-600" }),
|
|
51888
51962
|
/* @__PURE__ */ jsxs("span", { children: [
|
|
@@ -52386,8 +52460,8 @@ const FinancialImpact = ({ reportData }) => {
|
|
|
52386
52460
|
/* @__PURE__ */ jsx("h2", { className: "text-2xl font-bold text-slate-900 mb-2", children: "Detailed Financial Breakdown" }),
|
|
52387
52461
|
/* @__PURE__ */ jsx("p", { className: "text-slate-600", children: "Understanding the components of the total potential cost" })
|
|
52388
52462
|
] }),
|
|
52389
|
-
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-6 gap-8", children: [
|
|
52390
|
-
/* @__PURE__ */ jsx("div", { className: "lg:col-span-3 space-y-4", children: /* @__PURE__ */ jsx("div", { id: "impact-chart", className: "chart-container", children: /* @__PURE__ */ jsx(
|
|
52463
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-6 gap-8 print:grid-cols-6", children: [
|
|
52464
|
+
/* @__PURE__ */ jsx("div", { className: "lg:col-span-3 print:col-span-3 space-y-4", children: /* @__PURE__ */ jsx("div", { id: "impact-chart", className: "chart-container", children: /* @__PURE__ */ jsx(
|
|
52391
52465
|
UnifiedCostBreakdownChart,
|
|
52392
52466
|
{
|
|
52393
52467
|
hard_costs: dynamicCostBreakdown.hard_costs,
|
|
@@ -52397,7 +52471,7 @@ const FinancialImpact = ({ reportData }) => {
|
|
|
52397
52471
|
totalCost: calculatedCost
|
|
52398
52472
|
}
|
|
52399
52473
|
) }) }),
|
|
52400
|
-
/* @__PURE__ */ jsxs("div", { className: "lg:col-span-3 space-y-4", children: [
|
|
52474
|
+
/* @__PURE__ */ jsxs("div", { className: "lg:col-span-3 print:col-span-3 space-y-4", children: [
|
|
52401
52475
|
/* @__PURE__ */ jsx("h4", { className: "font-semibold text-slate-900", children: "Cost Categories" }),
|
|
52402
52476
|
/* @__PURE__ */ jsx("div", { className: "space-y-2", children: getIndustrySpecificCosts(
|
|
52403
52477
|
clientData.industry,
|
|
@@ -53038,7 +53112,7 @@ const InsuranceHealthScore = ({ reportData }) => {
|
|
|
53038
53112
|
/* @__PURE__ */ jsxs("div", { className: "bg-slate-50 rounded-lg p-6", children: [
|
|
53039
53113
|
/* @__PURE__ */ jsx("h4", { className: "font-semibold text-slate-900 mb-4", children: "How We Calculate Your Score" }),
|
|
53040
53114
|
/* @__PURE__ */ jsx("p", { className: "text-slate-700 mb-4", children: "Your Insurance Health Score is calculated based on industry-standard cybersecurity frameworks and real insurance company requirements. Each category is weighted according to its importance in determining cyber insurance coverage and pricing." }),
|
|
53041
|
-
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [
|
|
53115
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 print:grid-cols-2 gap-4", children: [
|
|
53042
53116
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
53043
53117
|
/* @__PURE__ */ jsx("h5", { className: "font-medium text-slate-900 mb-2", children: "Score Ranges:" }),
|
|
53044
53118
|
/* @__PURE__ */ jsxs("ul", { className: "text-sm text-slate-700 space-y-1", children: [
|
|
@@ -53091,7 +53165,7 @@ const InsuranceHealthScore = ({ reportData }) => {
|
|
|
53091
53165
|
] })
|
|
53092
53166
|
] })
|
|
53093
53167
|
] }),
|
|
53094
|
-
/* @__PURE__ */ jsx("section", { className: "report-page space-y-6 border-t border-slate-200 pt-8", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [
|
|
53168
|
+
/* @__PURE__ */ jsx("section", { className: "report-page space-y-6 border-t border-slate-200 pt-8", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 print:grid-cols-2 gap-6", children: [
|
|
53095
53169
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
53096
53170
|
/* @__PURE__ */ jsx("h4", { className: "font-semibold text-green-600 mb-3", children: "What This Report IS:" }),
|
|
53097
53171
|
/* @__PURE__ */ jsxs("ul", { className: "text-slate-700 space-y-2 text-sm", children: [
|
|
@@ -53144,6 +53218,7 @@ const ReportBuilder = ({
|
|
|
53144
53218
|
simulationData,
|
|
53145
53219
|
mspInfo
|
|
53146
53220
|
}) => {
|
|
53221
|
+
const [editExecutiveSummary, setEditExecutiveSummary] = useState(false);
|
|
53147
53222
|
const [searchParams] = useSearchParams();
|
|
53148
53223
|
const reportTemplate = searchParams.get("template");
|
|
53149
53224
|
const templateArray = (reportTemplate == null ? void 0 : reportTemplate.split(",").map((item) => item.trim())) || [];
|
|
@@ -53167,43 +53242,60 @@ const ReportBuilder = ({
|
|
|
53167
53242
|
if (items.length === 2) return `${items[0]} and ${items[1]}`;
|
|
53168
53243
|
return `${items.slice(0, -1).join(", ")}, and ${items[items.length - 1]}`;
|
|
53169
53244
|
};
|
|
53245
|
+
const onConfigChange = (key, value) => {
|
|
53246
|
+
console.log(`Config changed: ${key} = ${value}`);
|
|
53247
|
+
};
|
|
53170
53248
|
return /* @__PURE__ */ jsxs(
|
|
53171
53249
|
"article",
|
|
53172
53250
|
{
|
|
53173
53251
|
id: "print-report",
|
|
53174
|
-
className: "report-wrapper max-w-4xl mx-auto bg-white p-8 space-y-8",
|
|
53252
|
+
className: "report-wrapper max-w-4xl mx-auto bg-white p-8 space-y-8 print:font-sans",
|
|
53175
53253
|
children: [
|
|
53176
|
-
/* @__PURE__ */
|
|
53177
|
-
"
|
|
53178
|
-
|
|
53179
|
-
|
|
53180
|
-
|
|
53181
|
-
|
|
53182
|
-
|
|
53183
|
-
|
|
53184
|
-
|
|
53185
|
-
/* @__PURE__ */ jsxs("div", { className: "
|
|
53186
|
-
/* @__PURE__ */
|
|
53187
|
-
|
|
53188
|
-
|
|
53189
|
-
|
|
53190
|
-
/* @__PURE__ */
|
|
53191
|
-
|
|
53192
|
-
|
|
53193
|
-
|
|
53194
|
-
/* @__PURE__ */
|
|
53195
|
-
|
|
53254
|
+
/* @__PURE__ */ jsxs("section", { className: "report-page", children: [
|
|
53255
|
+
/* @__PURE__ */ jsx("figure", { className: "bg-slate-200 max-w-40 print:max-w-40 flex object-contain rounded-lg items-center justify-center mx-auto", children: mspInfo.company_logo ? /* @__PURE__ */ jsx(
|
|
53256
|
+
"img",
|
|
53257
|
+
{
|
|
53258
|
+
src: mspInfo.company_logo,
|
|
53259
|
+
alt: "MSP Logo",
|
|
53260
|
+
className: "w-full h-auto m-auto print:w-40 print:h-auto"
|
|
53261
|
+
}
|
|
53262
|
+
) : /* @__PURE__ */ jsx(Building2, { className: "w-10 h-10 text-slate-500" }) }),
|
|
53263
|
+
/* @__PURE__ */ jsxs("div", { className: "max-w-md mx-auto bg-slate-50 rounded-lg p-6 space-y-3", children: [
|
|
53264
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between", children: [
|
|
53265
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-slate-700", children: "Prepared For:" }),
|
|
53266
|
+
/* @__PURE__ */ jsx("span", { className: "text-slate-900", children: clientData.company_name || "Client Company" })
|
|
53267
|
+
] }),
|
|
53268
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between", children: [
|
|
53269
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-slate-700", children: "Industry Sector:" }),
|
|
53270
|
+
/* @__PURE__ */ jsx("span", { className: "text-slate-900", children: clientData.industry || "Industry" })
|
|
53271
|
+
] }),
|
|
53272
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between", children: [
|
|
53273
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-slate-700", children: "Prepared By:" }),
|
|
53274
|
+
/* @__PURE__ */ jsx("span", { className: "text-slate-900", children: mspInfo.company_name || /* @__PURE__ */ jsx("span", { style: { color: "red", fontWeight: "bold" }, children: "NEEDS ACTUAL MSP NAME" }) })
|
|
53275
|
+
] }),
|
|
53276
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between", children: [
|
|
53277
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-slate-700", children: "Assessment Date:" }),
|
|
53278
|
+
/* @__PURE__ */ jsx("span", { className: "text-slate-900", children: (/* @__PURE__ */ new Date()).toLocaleDateString() })
|
|
53279
|
+
] })
|
|
53196
53280
|
] }),
|
|
53197
|
-
/* @__PURE__ */ jsxs("div", { className: "
|
|
53198
|
-
/* @__PURE__ */ jsx("
|
|
53199
|
-
/* @__PURE__ */ jsx("
|
|
53281
|
+
/* @__PURE__ */ jsxs("div", { className: "p-4 text-left space-y-2", children: [
|
|
53282
|
+
/* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold text-slate-900 text-left", children: "Executive Summary" }),
|
|
53283
|
+
/* @__PURE__ */ jsx("h3", { className: "text-base font-semibold text-slate-900", children: "Why This Assessment Matters" }),
|
|
53284
|
+
editExecutiveSummary ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
53285
|
+
/* @__PURE__ */ jsx(
|
|
53286
|
+
Textarea,
|
|
53287
|
+
{
|
|
53288
|
+
value: displayExecutiveSummary(clientData),
|
|
53289
|
+
onChange: (e) => onConfigChange("executiveSummary", e.target.value),
|
|
53290
|
+
placeholder: "Executive summary content...",
|
|
53291
|
+
rows: 6,
|
|
53292
|
+
className: "resize-none"
|
|
53293
|
+
}
|
|
53294
|
+
),
|
|
53295
|
+
/* @__PURE__ */ jsx(Button$1, { onClick: () => setEditExecutiveSummary(false), children: "Save" })
|
|
53296
|
+
] }) : /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("p", { className: "text-slate-700 leading-relaxed whitespace-pre-line text-sm", children: displayExecutiveSummary(clientData) }) })
|
|
53200
53297
|
] })
|
|
53201
53298
|
] }),
|
|
53202
|
-
/* @__PURE__ */ jsxs("div", { className: "p-4 text-left space-y-2", children: [
|
|
53203
|
-
/* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold text-slate-900 text-left", children: "Executive Summary" }),
|
|
53204
|
-
/* @__PURE__ */ jsx("h3", { className: "text-base font-semibold text-slate-900", children: "Why This Assessment Matters" }),
|
|
53205
|
-
/* @__PURE__ */ jsx("p", { className: "text-slate-700 leading-relaxed whitespace-pre-line text-sm", children: displayExecutiveSummary(clientData) })
|
|
53206
|
-
] }),
|
|
53207
53299
|
showFinancialImpact && /* @__PURE__ */ jsx(Fragment, { children: financialSimulationData && Object.keys(financialSimulationData).length > 0 ? /* @__PURE__ */ jsx(
|
|
53208
53300
|
FinancialImpact,
|
|
53209
53301
|
{
|