@threatcaptain/tc-reports 0.2.19 → 0.2.21
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 +300 -210
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +300 -210
- 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: [
|
|
@@ -52311,83 +52385,83 @@ const FinancialImpact = ({ reportData }) => {
|
|
|
52311
52385
|
const dynamicCostBreakdown = createCostBreakdownFromSimulation(simulationData);
|
|
52312
52386
|
const calculatedCost = simulationData.use_calculated_downtime === false ? simulationData.total_cost : simulationData.adjusted_total_cost;
|
|
52313
52387
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
52314
|
-
/* @__PURE__ */
|
|
52388
|
+
/* @__PURE__ */ jsxs(
|
|
52315
52389
|
"section",
|
|
52316
52390
|
{
|
|
52317
52391
|
id: "financial-impact",
|
|
52318
52392
|
className: "report-page text-center space-y-6 pb-8 border-b border-slate-200",
|
|
52319
|
-
children:
|
|
52320
|
-
/* @__PURE__ */
|
|
52321
|
-
|
|
52322
|
-
|
|
52393
|
+
children: [
|
|
52394
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
52395
|
+
/* @__PURE__ */ jsx("h1", { className: "text-4xl font-bold text-slate-900", children: "Cyber Financial Impact Analysis" }),
|
|
52396
|
+
/* @__PURE__ */ jsx("p", { className: "text-xl text-slate-600", children: "Quantifying Your Organization's Cyber Risk Exposure" })
|
|
52397
|
+
] }),
|
|
52398
|
+
/* @__PURE__ */ jsxs("div", { className: "bg-red-600 rounded-lg p-6 text-white text-center", children: [
|
|
52399
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center space-x-2 mb-2", children: [
|
|
52400
|
+
/* @__PURE__ */ jsx(DollarSign, { className: "w-8 h-8" }),
|
|
52401
|
+
/* @__PURE__ */ jsx("h3", { className: "text-2xl font-bold", children: "TOTAL POTENTIAL IMPACT" })
|
|
52402
|
+
] }),
|
|
52403
|
+
/* @__PURE__ */ jsx("p", { className: "text-4xl font-bold", children: formatCurrency(calculatedCost) }),
|
|
52404
|
+
/* @__PURE__ */ jsxs("p", { className: "text-sm opacity-75 mt-2", children: [
|
|
52405
|
+
"Cost Range: ",
|
|
52406
|
+
formatCurrency(calculatedCost * 0.8),
|
|
52407
|
+
" - ",
|
|
52408
|
+
formatCurrency(calculatedCost * 1.2)
|
|
52409
|
+
] })
|
|
52410
|
+
] }),
|
|
52411
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
52412
|
+
/* @__PURE__ */ jsx("h4", { className: "text-lg font-semibold text-slate-900", children: "Top Industry Threats" }),
|
|
52413
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 print:grid-cols-3 gap-4", children: getIndustryThreats(clientData.industry).map((threat, index2) => /* @__PURE__ */ jsxs(
|
|
52414
|
+
"div",
|
|
52415
|
+
{
|
|
52416
|
+
className: "bg-red-50 border border-red-200 rounded-lg p-4 flex items-center space-x-3",
|
|
52417
|
+
children: [
|
|
52418
|
+
/* @__PURE__ */ jsx("div", { className: "flex-shrink-0", children: /* @__PURE__ */ jsx(AlertTriangle, { className: "w-5 h-5 text-red-500" }) }),
|
|
52419
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-red-900", children: threat })
|
|
52420
|
+
]
|
|
52421
|
+
},
|
|
52422
|
+
index2
|
|
52423
|
+
)) })
|
|
52424
|
+
] }),
|
|
52425
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 print:grid-cols-2 gap-6", children: [
|
|
52426
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
52427
|
+
/* @__PURE__ */ jsx("h4", { className: "text-lg font-semibold text-slate-900", children: "Industry Risk Profile" }),
|
|
52428
|
+
/* @__PURE__ */ jsxs(
|
|
52429
|
+
"div",
|
|
52430
|
+
{
|
|
52431
|
+
className: `inline-flex px-3 py-1 rounded-full text-sm font-medium ${riskLevel.color}`,
|
|
52432
|
+
children: [
|
|
52433
|
+
riskLevel.level,
|
|
52434
|
+
" Risk"
|
|
52435
|
+
]
|
|
52436
|
+
}
|
|
52437
|
+
),
|
|
52438
|
+
/* @__PURE__ */ jsxs("p", { className: "text-slate-600", children: [
|
|
52439
|
+
clientData.industry === "Healthcare" && "Healthcare organizations face elevated cyber risks due to valuable PHI data that commands high prices on dark web markets.",
|
|
52440
|
+
clientData.industry === "Financial Services" && "Financial institutions are prime targets due to direct access to funds and sensitive financial data.",
|
|
52441
|
+
clientData.industry === "Manufacturing" && "Manufacturing companies face operational technology risks that can halt production and supply chains.",
|
|
52442
|
+
!["Healthcare", "Financial Services", "Manufacturing"].includes(
|
|
52443
|
+
clientData.industry
|
|
52444
|
+
) && "Your industry faces specific cyber risks that require tailored protection strategies."
|
|
52445
|
+
] })
|
|
52446
|
+
] }),
|
|
52447
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
52448
|
+
/* @__PURE__ */ jsx("h4", { className: "text-lg font-semibold text-slate-900", children: "Key Risk Factors" }),
|
|
52449
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-1", children: getIndustryThreats(clientData.industry).map((threat, index2) => /* @__PURE__ */ jsxs("div", { className: "flex items-center space-x-2", children: [
|
|
52450
|
+
/* @__PURE__ */ jsx(AlertTriangle, { className: "w-4 h-4 text-red-500" }),
|
|
52451
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm", children: threat })
|
|
52452
|
+
] }, index2)) })
|
|
52453
|
+
] })
|
|
52454
|
+
] })
|
|
52455
|
+
]
|
|
52323
52456
|
}
|
|
52324
52457
|
),
|
|
52325
|
-
/* @__PURE__ */ jsxs("section", { className: "report-page space-y-6", children: [
|
|
52326
|
-
/* @__PURE__ */ jsxs("div", { className: "bg-red-600 rounded-lg p-6 text-white text-center", children: [
|
|
52327
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center space-x-2 mb-2", children: [
|
|
52328
|
-
/* @__PURE__ */ jsx(DollarSign, { className: "w-8 h-8" }),
|
|
52329
|
-
/* @__PURE__ */ jsx("h3", { className: "text-2xl font-bold", children: "TOTAL POTENTIAL IMPACT" })
|
|
52330
|
-
] }),
|
|
52331
|
-
/* @__PURE__ */ jsx("p", { className: "text-4xl font-bold", children: formatCurrency(calculatedCost) }),
|
|
52332
|
-
/* @__PURE__ */ jsxs("p", { className: "text-sm opacity-75 mt-2", children: [
|
|
52333
|
-
"Cost Range: ",
|
|
52334
|
-
formatCurrency(calculatedCost * 0.8),
|
|
52335
|
-
" - ",
|
|
52336
|
-
formatCurrency(calculatedCost * 1.2)
|
|
52337
|
-
] })
|
|
52338
|
-
] }),
|
|
52339
|
-
/* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
52340
|
-
/* @__PURE__ */ jsx("h4", { className: "text-lg font-semibold text-slate-900", children: "Top Industry Threats" }),
|
|
52341
|
-
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4", children: getIndustryThreats(clientData.industry).map((threat, index2) => /* @__PURE__ */ jsxs(
|
|
52342
|
-
"div",
|
|
52343
|
-
{
|
|
52344
|
-
className: "bg-red-50 border border-red-200 rounded-lg p-4 flex items-center space-x-3",
|
|
52345
|
-
children: [
|
|
52346
|
-
/* @__PURE__ */ jsx("div", { className: "flex-shrink-0", children: /* @__PURE__ */ jsx(AlertTriangle, { className: "w-5 h-5 text-red-500" }) }),
|
|
52347
|
-
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-red-900", children: threat })
|
|
52348
|
-
]
|
|
52349
|
-
},
|
|
52350
|
-
index2
|
|
52351
|
-
)) })
|
|
52352
|
-
] }),
|
|
52353
|
-
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [
|
|
52354
|
-
/* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
52355
|
-
/* @__PURE__ */ jsx("h4", { className: "text-lg font-semibold text-slate-900", children: "Industry Risk Profile" }),
|
|
52356
|
-
/* @__PURE__ */ jsxs(
|
|
52357
|
-
"div",
|
|
52358
|
-
{
|
|
52359
|
-
className: `inline-flex px-3 py-1 rounded-full text-sm font-medium ${riskLevel.color}`,
|
|
52360
|
-
children: [
|
|
52361
|
-
riskLevel.level,
|
|
52362
|
-
" Risk"
|
|
52363
|
-
]
|
|
52364
|
-
}
|
|
52365
|
-
),
|
|
52366
|
-
/* @__PURE__ */ jsxs("p", { className: "text-slate-600", children: [
|
|
52367
|
-
clientData.industry === "Healthcare" && "Healthcare organizations face elevated cyber risks due to valuable PHI data that commands high prices on dark web markets.",
|
|
52368
|
-
clientData.industry === "Financial Services" && "Financial institutions are prime targets due to direct access to funds and sensitive financial data.",
|
|
52369
|
-
clientData.industry === "Manufacturing" && "Manufacturing companies face operational technology risks that can halt production and supply chains.",
|
|
52370
|
-
!["Healthcare", "Financial Services", "Manufacturing"].includes(
|
|
52371
|
-
clientData.industry
|
|
52372
|
-
) && "Your industry faces specific cyber risks that require tailored protection strategies."
|
|
52373
|
-
] })
|
|
52374
|
-
] }),
|
|
52375
|
-
/* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
52376
|
-
/* @__PURE__ */ jsx("h4", { className: "text-lg font-semibold text-slate-900", children: "Key Risk Factors" }),
|
|
52377
|
-
/* @__PURE__ */ jsx("div", { className: "space-y-1", children: getIndustryThreats(clientData.industry).map((threat, index2) => /* @__PURE__ */ jsxs("div", { className: "flex items-center space-x-2", children: [
|
|
52378
|
-
/* @__PURE__ */ jsx(AlertTriangle, { className: "w-4 h-4 text-red-500" }),
|
|
52379
|
-
/* @__PURE__ */ jsx("span", { className: "text-sm", children: threat })
|
|
52380
|
-
] }, index2)) })
|
|
52381
|
-
] })
|
|
52382
|
-
] })
|
|
52383
|
-
] }),
|
|
52384
|
-
/* @__PURE__ */ jsxs("section", { className: "report-page space-y-6 border-t border-slate-200 pt-8", children: [
|
|
52458
|
+
/* @__PURE__ */ jsxs("section", { className: "report-page space-y-6 border-b border-slate-200 pt-8", children: [
|
|
52385
52459
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
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,
|
|
@@ -52438,7 +52512,7 @@ const FinancialImpact = ({ reportData }) => {
|
|
|
52438
52512
|
}) })
|
|
52439
52513
|
] })
|
|
52440
52514
|
] }),
|
|
52441
|
-
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [
|
|
52515
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 print:grid-cols-2 gap-6", children: [
|
|
52442
52516
|
/* @__PURE__ */ jsxs("div", { className: "bg-white border border-slate-200 rounded-lg p-6", children: [
|
|
52443
52517
|
/* @__PURE__ */ jsx("h4", { className: "font-semibold text-slate-900 mb-4", children: "Attack Scenario" }),
|
|
52444
52518
|
/* @__PURE__ */ jsxs("div", { className: "space-y-3 text-sm", children: [
|
|
@@ -52487,7 +52561,7 @@ const FinancialImpact = ({ reportData }) => {
|
|
|
52487
52561
|
] })
|
|
52488
52562
|
] })
|
|
52489
52563
|
] }),
|
|
52490
|
-
/* @__PURE__ */ jsxs("section", { className: "report-page space-y-6 border-
|
|
52564
|
+
/* @__PURE__ */ jsxs("section", { className: "report-page space-y-6 border-b border-slate-200 pt-8", children: [
|
|
52491
52565
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center space-x-3", children: [
|
|
52492
52566
|
/* @__PURE__ */ jsx("div", { className: "w-8 h-8 bg-blue-600 rounded-lg flex items-center justify-center", children: /* @__PURE__ */ jsx("span", { className: "text-white text-lg", children: "?" }) }),
|
|
52493
52567
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
@@ -52534,26 +52608,26 @@ const FinancialImpact = ({ reportData }) => {
|
|
|
52534
52608
|
] }) })
|
|
52535
52609
|
] }),
|
|
52536
52610
|
/* @__PURE__ */ jsx("p", { className: "text-slate-700 mt-4", children: "This ensures the analysis reflects both likelihood and financial impact, helping you prioritize the risks most relevant to your clients." })
|
|
52611
|
+
] })
|
|
52612
|
+
] })
|
|
52613
|
+
] }),
|
|
52614
|
+
/* @__PURE__ */ jsx("section", { className: "report-page space-y-6 pt-8", children: /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsxs("div", { className: "bg-yellow-50 border border-yellow-200 rounded-lg p-6", children: [
|
|
52615
|
+
/* @__PURE__ */ jsx("h4", { className: "font-semibold text-slate-900 mb-2", children: "Important Notes" }),
|
|
52616
|
+
/* @__PURE__ */ jsxs("ul", { className: "text-slate-700 space-y-2", children: [
|
|
52617
|
+
/* @__PURE__ */ jsxs("li", { className: "flex items-start space-x-2", children: [
|
|
52618
|
+
/* @__PURE__ */ jsx("span", { className: "text-yellow-600 mt-1", children: "•" }),
|
|
52619
|
+
/* @__PURE__ */ jsx("span", { children: "This analysis is based on industry norms and common threat patterns." })
|
|
52537
52620
|
] }),
|
|
52538
|
-
/* @__PURE__ */ jsxs("
|
|
52539
|
-
/* @__PURE__ */ jsx("
|
|
52540
|
-
/* @__PURE__ */
|
|
52541
|
-
|
|
52542
|
-
|
|
52543
|
-
|
|
52544
|
-
|
|
52545
|
-
/* @__PURE__ */ jsxs("li", { className: "flex items-start space-x-2", children: [
|
|
52546
|
-
/* @__PURE__ */ jsx("span", { className: "text-yellow-600 mt-1", children: "•" }),
|
|
52547
|
-
/* @__PURE__ */ jsx("span", { children: "Actual breach outcomes and costs may vary based on the event's scope and response quality." })
|
|
52548
|
-
] }),
|
|
52549
|
-
/* @__PURE__ */ jsxs("li", { className: "flex items-start space-x-2", children: [
|
|
52550
|
-
/* @__PURE__ */ jsx("span", { className: "text-yellow-600 mt-1", children: "•" }),
|
|
52551
|
-
/* @__PURE__ */ jsx("span", { children: "This report is intended to guide investment and preparedness—not to predict specific future events." })
|
|
52552
|
-
] })
|
|
52553
|
-
] })
|
|
52621
|
+
/* @__PURE__ */ jsxs("li", { className: "flex items-start space-x-2", children: [
|
|
52622
|
+
/* @__PURE__ */ jsx("span", { className: "text-yellow-600 mt-1", children: "•" }),
|
|
52623
|
+
/* @__PURE__ */ jsx("span", { children: "Actual breach outcomes and costs may vary based on the event's scope and response quality." })
|
|
52624
|
+
] }),
|
|
52625
|
+
/* @__PURE__ */ jsxs("li", { className: "flex items-start space-x-2", children: [
|
|
52626
|
+
/* @__PURE__ */ jsx("span", { className: "text-yellow-600 mt-1", children: "•" }),
|
|
52627
|
+
/* @__PURE__ */ jsx("span", { children: "This report is intended to guide investment and preparedness—not to predict specific future events." })
|
|
52554
52628
|
] })
|
|
52555
52629
|
] })
|
|
52556
|
-
] })
|
|
52630
|
+
] }) }) })
|
|
52557
52631
|
] });
|
|
52558
52632
|
};
|
|
52559
52633
|
const ASSESSMENT_CATEGORIES = {
|
|
@@ -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,42 +53242,57 @@ 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__ */
|
|
53198
|
-
/* @__PURE__ */ jsx("span", { className: "font-medium text-slate-700", children: "Assessment Date:" }),
|
|
53199
|
-
/* @__PURE__ */ jsx("span", { className: "text-slate-900", children: (/* @__PURE__ */ new Date()).toLocaleDateString() })
|
|
53200
|
-
] })
|
|
53201
|
-
] }),
|
|
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" }),
|
|
53281
|
+
/* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold text-slate-900 text-left mb-2", children: "Executive Summary" }),
|
|
53204
53282
|
/* @__PURE__ */ jsx("h3", { className: "text-base font-semibold text-slate-900", children: "Why This Assessment Matters" }),
|
|
53205
|
-
/* @__PURE__ */
|
|
53283
|
+
editExecutiveSummary ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
53284
|
+
/* @__PURE__ */ jsx(
|
|
53285
|
+
Textarea,
|
|
53286
|
+
{
|
|
53287
|
+
value: displayExecutiveSummary(clientData),
|
|
53288
|
+
onChange: (e) => onConfigChange("executiveSummary", e.target.value),
|
|
53289
|
+
placeholder: "Executive summary content...",
|
|
53290
|
+
rows: 6,
|
|
53291
|
+
className: "resize-none"
|
|
53292
|
+
}
|
|
53293
|
+
),
|
|
53294
|
+
/* @__PURE__ */ jsx(Button$1, { onClick: () => setEditExecutiveSummary(false), children: "Save" })
|
|
53295
|
+
] }) : /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("p", { className: "text-slate-700 leading-relaxed whitespace-pre-line text-sm", children: displayExecutiveSummary(clientData) }) })
|
|
53206
53296
|
] }),
|
|
53207
53297
|
showFinancialImpact && /* @__PURE__ */ jsx(Fragment, { children: financialSimulationData && Object.keys(financialSimulationData).length > 0 ? /* @__PURE__ */ jsx(
|
|
53208
53298
|
FinancialImpact,
|
|
@@ -53226,7 +53316,7 @@ const ReportBuilder = ({
|
|
|
53226
53316
|
reportData: { clientData, insuranceHealthData, mspInfo }
|
|
53227
53317
|
}
|
|
53228
53318
|
) : /* @__PURE__ */ jsx(Warning, { children: "We can't find an insurance assessment. Are you sure you ran this assessment?" }) }),
|
|
53229
|
-
/* @__PURE__ */ jsxs("footer", { className: "
|
|
53319
|
+
/* @__PURE__ */ jsxs("footer", { className: "text-center pt-8 border-t border-slate-200", children: [
|
|
53230
53320
|
/* @__PURE__ */ jsx("h4", { children: "Professional Recommendation" }),
|
|
53231
53321
|
/* @__PURE__ */ jsxs("p", { className: "text-sm text-slate-500", children: [
|
|
53232
53322
|
"This assessment uses ",
|