@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.cjs
CHANGED
|
@@ -28765,24 +28765,24 @@ const Dashboard = ({
|
|
|
28765
28765
|
};
|
|
28766
28766
|
const getExecutiveSummaryTemplate = (industry) => {
|
|
28767
28767
|
switch (industry) {
|
|
28768
|
-
case "
|
|
28768
|
+
case "healthcare":
|
|
28769
28769
|
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.";
|
|
28770
|
-
case "
|
|
28770
|
+
case "legal_services":
|
|
28771
28771
|
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.";
|
|
28772
|
-
case "
|
|
28772
|
+
case "financial_services":
|
|
28773
28773
|
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.";
|
|
28774
|
-
case "
|
|
28774
|
+
case "education":
|
|
28775
28775
|
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.";
|
|
28776
|
-
case "
|
|
28776
|
+
case "manufacturing":
|
|
28777
28777
|
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.";
|
|
28778
|
-
case "
|
|
28778
|
+
case "retail_consumer_goods":
|
|
28779
28779
|
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.";
|
|
28780
28780
|
case "technology_software":
|
|
28781
28781
|
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.";
|
|
28782
|
-
case "
|
|
28782
|
+
case 'government_public_sector"':
|
|
28783
28783
|
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.";
|
|
28784
28784
|
default:
|
|
28785
|
-
return "
|
|
28785
|
+
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.";
|
|
28786
28786
|
}
|
|
28787
28787
|
};
|
|
28788
28788
|
const formatCurrency = (value) => {
|
|
@@ -51214,7 +51214,7 @@ const getRadarData = ({ breachData }) => {
|
|
|
51214
51214
|
}).map((phase) => {
|
|
51215
51215
|
const visualCoverage = phase.coverage === 0 ? 2 : phase.coverage;
|
|
51216
51216
|
return {
|
|
51217
|
-
tactic: phase.phase.replace("TA00", "").replace("_", " ")
|
|
51217
|
+
tactic: phase.phase.replace("TA00", "").replace("_", " "),
|
|
51218
51218
|
coverage: visualCoverage,
|
|
51219
51219
|
// Use for chart rendering
|
|
51220
51220
|
actualCoverage: phase.coverage,
|
|
@@ -51257,92 +51257,166 @@ const MitreAttack = ({ breachData, overallLikelihood }) => {
|
|
|
51257
51257
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
51258
51258
|
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg font-semibold text-gray-900", children: "MITRE ATT&CK Coverage" }),
|
|
51259
51259
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-gray-600", children: "14 Tactics Protection Level" }),
|
|
51260
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
51261
|
-
|
|
51260
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
51261
|
+
ChartContainer,
|
|
51262
51262
|
{
|
|
51263
|
-
|
|
51264
|
-
|
|
51265
|
-
children:
|
|
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
|
-
|
|
51309
|
-
|
|
51310
|
-
|
|
51311
|
-
|
|
51312
|
-
|
|
51313
|
-
|
|
51314
|
-
|
|
51315
|
-
|
|
51316
|
-
|
|
51317
|
-
|
|
51318
|
-
|
|
51319
|
-
|
|
51320
|
-
|
|
51321
|
-
|
|
51322
|
-
|
|
51323
|
-
|
|
51324
|
-
|
|
51325
|
-
|
|
51326
|
-
|
|
51263
|
+
config: chartConfig,
|
|
51264
|
+
className: "h-[420px] w-[420px] min-h-[420px] min-w-[420px] mb-0",
|
|
51265
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
51266
|
+
RadarChart,
|
|
51267
|
+
{
|
|
51268
|
+
data: radarData,
|
|
51269
|
+
margin: { top: 50, right: 80, bottom: 50, left: 80 },
|
|
51270
|
+
children: [
|
|
51271
|
+
/* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsxs("radialGradient", { id: gradientId, cx: "50%", cy: "50%", r: "50%", children: [
|
|
51272
|
+
/* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "0%", stopColor: strokeColor, stopOpacity: 0.4 }),
|
|
51273
|
+
/* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "70%", stopColor: strokeColor, stopOpacity: 0.2 }),
|
|
51274
|
+
/* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "100%", stopColor: strokeColor, stopOpacity: 0.1 })
|
|
51275
|
+
] }) }),
|
|
51276
|
+
/* @__PURE__ */ jsxRuntime.jsx(PolarGrid, { stroke: "#e5e5e5", strokeWidth: 1, radialLines: true }),
|
|
51277
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
51278
|
+
PolarAngleAxis,
|
|
51279
|
+
{
|
|
51280
|
+
dataKey: "tactic",
|
|
51281
|
+
tick: (props) => {
|
|
51282
|
+
const { payload, x: x2, y: y2, textAnchor } = props;
|
|
51283
|
+
const label = payload.value;
|
|
51284
|
+
const centerX = 210;
|
|
51285
|
+
const centerY = 210;
|
|
51286
|
+
const dx = x2 - centerX;
|
|
51287
|
+
const dy = y2 - centerY;
|
|
51288
|
+
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
51289
|
+
const unitX = dx / distance;
|
|
51290
|
+
const unitY = dy / distance;
|
|
51291
|
+
const offset2 = 15;
|
|
51292
|
+
const offsetX = x2 + unitX * offset2;
|
|
51293
|
+
const offsetY = y2 + unitY * offset2;
|
|
51294
|
+
if (label.length >= 12) {
|
|
51295
|
+
const words = label.split(" ");
|
|
51296
|
+
let line1 = "";
|
|
51297
|
+
let line2 = "";
|
|
51298
|
+
let bestSplit = Math.ceil(words.length / 2);
|
|
51299
|
+
for (let i = 0; i < words.length; i++) {
|
|
51300
|
+
if (words[i].toLowerCase() === "and" && i > 0 && i < words.length - 1) {
|
|
51301
|
+
bestSplit = i;
|
|
51302
|
+
break;
|
|
51303
|
+
}
|
|
51304
|
+
}
|
|
51305
|
+
line1 = words.slice(0, bestSplit).join(" ");
|
|
51306
|
+
line2 = words.slice(bestSplit).join(" ");
|
|
51307
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${offsetX},${offsetY})`, children: [
|
|
51308
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
51309
|
+
"text",
|
|
51310
|
+
{
|
|
51311
|
+
x: 0,
|
|
51312
|
+
y: -4,
|
|
51313
|
+
textAnchor,
|
|
51314
|
+
fontSize: 10,
|
|
51315
|
+
fill: "#6b7280",
|
|
51316
|
+
className: "text-xs",
|
|
51317
|
+
style: { dominantBaseline: "middle" },
|
|
51318
|
+
children: line1
|
|
51319
|
+
}
|
|
51320
|
+
),
|
|
51321
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
51322
|
+
"text",
|
|
51323
|
+
{
|
|
51324
|
+
x: 0,
|
|
51325
|
+
y: 8,
|
|
51326
|
+
textAnchor,
|
|
51327
|
+
fontSize: 10,
|
|
51328
|
+
fill: "#6b7280",
|
|
51329
|
+
className: "text-xs",
|
|
51330
|
+
style: { dominantBaseline: "middle" },
|
|
51331
|
+
children: line2
|
|
51332
|
+
}
|
|
51333
|
+
)
|
|
51334
|
+
] });
|
|
51335
|
+
}
|
|
51336
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
51337
|
+
"text",
|
|
51327
51338
|
{
|
|
51328
|
-
|
|
51329
|
-
|
|
51330
|
-
|
|
51331
|
-
|
|
51332
|
-
|
|
51333
|
-
|
|
51334
|
-
|
|
51339
|
+
x: offsetX,
|
|
51340
|
+
y: offsetY,
|
|
51341
|
+
textAnchor,
|
|
51342
|
+
fontSize: 10,
|
|
51343
|
+
fill: "#6b7280",
|
|
51344
|
+
className: "text-xs",
|
|
51345
|
+
children: label
|
|
51335
51346
|
}
|
|
51336
|
-
)
|
|
51337
|
-
|
|
51347
|
+
);
|
|
51348
|
+
},
|
|
51349
|
+
className: "text-xs"
|
|
51338
51350
|
}
|
|
51339
|
-
|
|
51340
|
-
|
|
51341
|
-
|
|
51342
|
-
|
|
51343
|
-
|
|
51351
|
+
),
|
|
51352
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
51353
|
+
PolarRadiusAxis,
|
|
51354
|
+
{
|
|
51355
|
+
angle: 90,
|
|
51356
|
+
domain: [0, 100],
|
|
51357
|
+
tick: { fontSize: 8, fill: "#6b7280" },
|
|
51358
|
+
tickCount: 6,
|
|
51359
|
+
axisLine: false
|
|
51360
|
+
}
|
|
51361
|
+
),
|
|
51362
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
51363
|
+
Radar,
|
|
51364
|
+
{
|
|
51365
|
+
name: "Coverage",
|
|
51366
|
+
dataKey: "coverage",
|
|
51367
|
+
stroke: strokeColor,
|
|
51368
|
+
fill: `url(#${gradientId})`,
|
|
51369
|
+
strokeWidth: 2.5,
|
|
51370
|
+
dot: {
|
|
51371
|
+
r: 4,
|
|
51372
|
+
fill: strokeColor,
|
|
51373
|
+
strokeWidth: 2,
|
|
51374
|
+
stroke: "#ffffff"
|
|
51375
|
+
},
|
|
51376
|
+
activeDot: {
|
|
51377
|
+
r: 6,
|
|
51378
|
+
fill: strokeColor,
|
|
51379
|
+
strokeWidth: 2,
|
|
51380
|
+
stroke: "#ffffff"
|
|
51381
|
+
}
|
|
51382
|
+
}
|
|
51383
|
+
),
|
|
51384
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
51385
|
+
ChartTooltip,
|
|
51386
|
+
{
|
|
51387
|
+
content: ({ active, payload }) => {
|
|
51388
|
+
if (active && payload && payload.length) {
|
|
51389
|
+
const data = payload[0].payload;
|
|
51390
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-white p-3 border rounded-lg shadow-lg", children: [
|
|
51391
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-semibold text-gray-900", children: data.fullName }),
|
|
51392
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm text-gray-600", children: [
|
|
51393
|
+
"Coverage: ",
|
|
51394
|
+
data.actualCoverage,
|
|
51395
|
+
"%"
|
|
51396
|
+
] }),
|
|
51397
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
51398
|
+
"p",
|
|
51399
|
+
{
|
|
51400
|
+
className: "text-sm",
|
|
51401
|
+
style: { color: getRiskLevelColor(data.riskLevel) },
|
|
51402
|
+
children: [
|
|
51403
|
+
"Risk Level:",
|
|
51404
|
+
" ",
|
|
51405
|
+
data.riskLevel.charAt(0).toUpperCase() + data.riskLevel.slice(1)
|
|
51406
|
+
]
|
|
51407
|
+
}
|
|
51408
|
+
)
|
|
51409
|
+
] });
|
|
51410
|
+
}
|
|
51411
|
+
return null;
|
|
51412
|
+
}
|
|
51413
|
+
}
|
|
51414
|
+
)
|
|
51415
|
+
]
|
|
51416
|
+
}
|
|
51417
|
+
)
|
|
51344
51418
|
}
|
|
51345
|
-
)
|
|
51419
|
+
),
|
|
51346
51420
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
|
|
51347
51421
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
51348
51422
|
"div",
|
|
@@ -51900,7 +51974,7 @@ const BreachLikelihood = ({ reportData }) => {
|
|
|
51900
51974
|
overallLikelihood: attackLikelihood
|
|
51901
51975
|
}
|
|
51902
51976
|
) : /* @__PURE__ */ jsxRuntime.jsx("p", { children: "Getting breach data..." }) }),
|
|
51903
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "
|
|
51977
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col justify-center gap-4", children: [
|
|
51904
51978
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center p-4 rounded-md bg-slate-50", children: [
|
|
51905
51979
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckCircle, { className: "w-6 h-6 mr-4 text-green-600" }),
|
|
51906
51980
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
@@ -52404,8 +52478,8 @@ const FinancialImpact = ({ reportData }) => {
|
|
|
52404
52478
|
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold text-slate-900 mb-2", children: "Detailed Financial Breakdown" }),
|
|
52405
52479
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-600", children: "Understanding the components of the total potential cost" })
|
|
52406
52480
|
] }),
|
|
52407
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-6 gap-8", children: [
|
|
52408
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "lg:col-span-3 space-y-4", children: /* @__PURE__ */ jsxRuntime.jsx("div", { id: "impact-chart", className: "chart-container", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
52481
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-6 gap-8 print:grid-cols-6", children: [
|
|
52482
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "lg:col-span-3 print:col-span-3 space-y-4", children: /* @__PURE__ */ jsxRuntime.jsx("div", { id: "impact-chart", className: "chart-container", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
52409
52483
|
UnifiedCostBreakdownChart,
|
|
52410
52484
|
{
|
|
52411
52485
|
hard_costs: dynamicCostBreakdown.hard_costs,
|
|
@@ -52415,7 +52489,7 @@ const FinancialImpact = ({ reportData }) => {
|
|
|
52415
52489
|
totalCost: calculatedCost
|
|
52416
52490
|
}
|
|
52417
52491
|
) }) }),
|
|
52418
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-3 space-y-4", children: [
|
|
52492
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-3 print:col-span-3 space-y-4", children: [
|
|
52419
52493
|
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-slate-900", children: "Cost Categories" }),
|
|
52420
52494
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-2", children: getIndustrySpecificCosts(
|
|
52421
52495
|
clientData.industry,
|
|
@@ -53056,7 +53130,7 @@ const InsuranceHealthScore = ({ reportData }) => {
|
|
|
53056
53130
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-slate-50 rounded-lg p-6", children: [
|
|
53057
53131
|
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-slate-900 mb-4", children: "How We Calculate Your Score" }),
|
|
53058
53132
|
/* @__PURE__ */ jsxRuntime.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." }),
|
|
53059
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [
|
|
53133
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 print:grid-cols-2 gap-4", children: [
|
|
53060
53134
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
53061
53135
|
/* @__PURE__ */ jsxRuntime.jsx("h5", { className: "font-medium text-slate-900 mb-2", children: "Score Ranges:" }),
|
|
53062
53136
|
/* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "text-sm text-slate-700 space-y-1", children: [
|
|
@@ -53109,7 +53183,7 @@ const InsuranceHealthScore = ({ reportData }) => {
|
|
|
53109
53183
|
] })
|
|
53110
53184
|
] })
|
|
53111
53185
|
] }),
|
|
53112
|
-
/* @__PURE__ */ jsxRuntime.jsx("section", { className: "report-page space-y-6 border-t border-slate-200 pt-8", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [
|
|
53186
|
+
/* @__PURE__ */ jsxRuntime.jsx("section", { className: "report-page space-y-6 border-t border-slate-200 pt-8", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 print:grid-cols-2 gap-6", children: [
|
|
53113
53187
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
53114
53188
|
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-green-600 mb-3", children: "What This Report IS:" }),
|
|
53115
53189
|
/* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "text-slate-700 space-y-2 text-sm", children: [
|
|
@@ -53162,6 +53236,7 @@ const ReportBuilder = ({
|
|
|
53162
53236
|
simulationData,
|
|
53163
53237
|
mspInfo
|
|
53164
53238
|
}) => {
|
|
53239
|
+
const [editExecutiveSummary, setEditExecutiveSummary] = React.useState(false);
|
|
53165
53240
|
const [searchParams] = reactRouterDom.useSearchParams();
|
|
53166
53241
|
const reportTemplate = searchParams.get("template");
|
|
53167
53242
|
const templateArray = (reportTemplate == null ? void 0 : reportTemplate.split(",").map((item) => item.trim())) || [];
|
|
@@ -53185,43 +53260,60 @@ const ReportBuilder = ({
|
|
|
53185
53260
|
if (items.length === 2) return `${items[0]} and ${items[1]}`;
|
|
53186
53261
|
return `${items.slice(0, -1).join(", ")}, and ${items[items.length - 1]}`;
|
|
53187
53262
|
};
|
|
53263
|
+
const onConfigChange = (key, value) => {
|
|
53264
|
+
console.log(`Config changed: ${key} = ${value}`);
|
|
53265
|
+
};
|
|
53188
53266
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
53189
53267
|
"article",
|
|
53190
53268
|
{
|
|
53191
53269
|
id: "print-report",
|
|
53192
|
-
className: "report-wrapper max-w-4xl mx-auto bg-white p-8 space-y-8",
|
|
53270
|
+
className: "report-wrapper max-w-4xl mx-auto bg-white p-8 space-y-8 print:font-sans",
|
|
53193
53271
|
children: [
|
|
53194
|
-
/* @__PURE__ */ jsxRuntime.
|
|
53195
|
-
"
|
|
53196
|
-
|
|
53197
|
-
|
|
53198
|
-
|
|
53199
|
-
|
|
53200
|
-
|
|
53201
|
-
|
|
53202
|
-
|
|
53203
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "
|
|
53204
|
-
/* @__PURE__ */ jsxRuntime.
|
|
53205
|
-
|
|
53206
|
-
|
|
53207
|
-
|
|
53208
|
-
/* @__PURE__ */ jsxRuntime.
|
|
53209
|
-
|
|
53210
|
-
|
|
53211
|
-
|
|
53212
|
-
/* @__PURE__ */ jsxRuntime.
|
|
53213
|
-
|
|
53272
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "report-page", children: [
|
|
53273
|
+
/* @__PURE__ */ jsxRuntime.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__ */ jsxRuntime.jsx(
|
|
53274
|
+
"img",
|
|
53275
|
+
{
|
|
53276
|
+
src: mspInfo.company_logo,
|
|
53277
|
+
alt: "MSP Logo",
|
|
53278
|
+
className: "w-full h-auto m-auto print:w-40 print:h-auto"
|
|
53279
|
+
}
|
|
53280
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Building2, { className: "w-10 h-10 text-slate-500" }) }),
|
|
53281
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-md mx-auto bg-slate-50 rounded-lg p-6 space-y-3", children: [
|
|
53282
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between", children: [
|
|
53283
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-slate-700", children: "Prepared For:" }),
|
|
53284
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-900", children: clientData.company_name || "Client Company" })
|
|
53285
|
+
] }),
|
|
53286
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between", children: [
|
|
53287
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-slate-700", children: "Industry Sector:" }),
|
|
53288
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-900", children: clientData.industry || "Industry" })
|
|
53289
|
+
] }),
|
|
53290
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between", children: [
|
|
53291
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-slate-700", children: "Prepared By:" }),
|
|
53292
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-900", children: mspInfo.company_name || /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "red", fontWeight: "bold" }, children: "NEEDS ACTUAL MSP NAME" }) })
|
|
53293
|
+
] }),
|
|
53294
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between", children: [
|
|
53295
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-slate-700", children: "Assessment Date:" }),
|
|
53296
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-900", children: (/* @__PURE__ */ new Date()).toLocaleDateString() })
|
|
53297
|
+
] })
|
|
53214
53298
|
] }),
|
|
53215
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "
|
|
53216
|
-
/* @__PURE__ */ jsxRuntime.jsx("
|
|
53217
|
-
/* @__PURE__ */ jsxRuntime.jsx("
|
|
53299
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-4 text-left space-y-2", children: [
|
|
53300
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-bold text-slate-900 text-left", children: "Executive Summary" }),
|
|
53301
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-semibold text-slate-900", children: "Why This Assessment Matters" }),
|
|
53302
|
+
editExecutiveSummary ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
53303
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
53304
|
+
Textarea,
|
|
53305
|
+
{
|
|
53306
|
+
value: displayExecutiveSummary(clientData),
|
|
53307
|
+
onChange: (e) => onConfigChange("executiveSummary", e.target.value),
|
|
53308
|
+
placeholder: "Executive summary content...",
|
|
53309
|
+
rows: 6,
|
|
53310
|
+
className: "resize-none"
|
|
53311
|
+
}
|
|
53312
|
+
),
|
|
53313
|
+
/* @__PURE__ */ jsxRuntime.jsx(Button$1, { onClick: () => setEditExecutiveSummary(false), children: "Save" })
|
|
53314
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-700 leading-relaxed whitespace-pre-line text-sm", children: displayExecutiveSummary(clientData) }) })
|
|
53218
53315
|
] })
|
|
53219
53316
|
] }),
|
|
53220
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-4 text-left space-y-2", children: [
|
|
53221
|
-
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-bold text-slate-900 text-left", children: "Executive Summary" }),
|
|
53222
|
-
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-semibold text-slate-900", children: "Why This Assessment Matters" }),
|
|
53223
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-700 leading-relaxed whitespace-pre-line text-sm", children: displayExecutiveSummary(clientData) })
|
|
53224
|
-
] }),
|
|
53225
53317
|
showFinancialImpact && /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: financialSimulationData && Object.keys(financialSimulationData).length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
53226
53318
|
FinancialImpact,
|
|
53227
53319
|
{
|