@threatcaptain/tc-reports 0.2.2
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/README.md +11 -0
- package/dist/index.cjs +2246 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2246 -0
- package/dist/index.js.map +1 -0
- package/package.json +113 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,2246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const lucideReact = require("lucide-react");
|
|
5
|
+
const react = require("react");
|
|
6
|
+
const reactRouterDom = require("react-router-dom");
|
|
7
|
+
const tcComponents = require("tc-components");
|
|
8
|
+
const freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
|
|
9
|
+
const reactFontawesome = require("@fortawesome/react-fontawesome");
|
|
10
|
+
const templates = [
|
|
11
|
+
{
|
|
12
|
+
id: "financial-impact",
|
|
13
|
+
name: "Financial Impact Analysis",
|
|
14
|
+
description: "Quantify the financial impact of potential cyber threats and breaches",
|
|
15
|
+
category: "Financial Analysis",
|
|
16
|
+
preview: "bg-gradient-to-br from-red-50 to-orange-50"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
id: "insurance-health-score",
|
|
20
|
+
name: "Cyber Insurance Health Score",
|
|
21
|
+
description: "Assess readiness for cyber insurance coverage and identify gaps",
|
|
22
|
+
category: "Insurance Assessment",
|
|
23
|
+
preview: "bg-gradient-to-br from-green-50 to-emerald-50"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
id: "breach-likelihood",
|
|
27
|
+
name: "Breach Likelihood Assessment",
|
|
28
|
+
description: "Evaluate the probability and impact of security incidents",
|
|
29
|
+
category: "Risk Assessment",
|
|
30
|
+
preview: "bg-gradient-to-br from-orange-50 to-red-50"
|
|
31
|
+
}
|
|
32
|
+
];
|
|
33
|
+
const Dashboard = () => {
|
|
34
|
+
const navigate = reactRouterDom.useNavigate();
|
|
35
|
+
const [templateIds, setTemplateId] = react.useState([]);
|
|
36
|
+
const handleTemplateClick = (templateId) => {
|
|
37
|
+
let updatedTemplateIds = [...templateIds];
|
|
38
|
+
updatedTemplateIds = updatedTemplateIds.includes(templateId) ? updatedTemplateIds.filter((id) => id !== templateId) : [...updatedTemplateIds, templateId];
|
|
39
|
+
setTemplateId(updatedTemplateIds);
|
|
40
|
+
};
|
|
41
|
+
const handleNavigation = () => {
|
|
42
|
+
const templateParam = templateIds.join(",");
|
|
43
|
+
navigate(`./view-report?template=${templateParam}`);
|
|
44
|
+
};
|
|
45
|
+
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-white rounded-xl border border-slate-200 shadow-sm p-6 mb-8", children: [
|
|
46
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-xl font-semibold text-slate-900 mb-6", children: "Choose Your Report Template" }),
|
|
47
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-2 gap-6 ", children: templates.map((template) => {
|
|
48
|
+
const getTemplateIcon = (id) => {
|
|
49
|
+
switch (id) {
|
|
50
|
+
case "financial-impact":
|
|
51
|
+
return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.DollarSign, { className: "w-12 h-12 text-red-500" });
|
|
52
|
+
case "insurance-health-score":
|
|
53
|
+
return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Shield, { className: "w-12 h-12 text-green-500" });
|
|
54
|
+
case "breach-likelihood":
|
|
55
|
+
return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertTriangle, { className: "w-12 h-12 text-orange-500" });
|
|
56
|
+
case "comprehensive":
|
|
57
|
+
return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: "w-12 h-12 text-purple-500" });
|
|
58
|
+
default:
|
|
59
|
+
return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: "w-12 h-12 text-slate-400" });
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
63
|
+
tcComponents.Card,
|
|
64
|
+
{
|
|
65
|
+
className: `transition-all border-2 cursor-pointer hover:shadow-lg ${templateIds.includes(template.id) ? "border-blue-500 bg-blue-50" : "border-slate-200 hover:border-slate-300"}`,
|
|
66
|
+
onClick: () => handleTemplateClick(template.id),
|
|
67
|
+
children: [
|
|
68
|
+
/* @__PURE__ */ jsxRuntime.jsxs(tcComponents.CardHeader, { className: "pb-3", children: [
|
|
69
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
70
|
+
"figure",
|
|
71
|
+
{
|
|
72
|
+
className: `w-full h-32 rounded-lg ${template.preview} border border-slate-200 mb-4 flex items-center justify-center relative`,
|
|
73
|
+
children: getTemplateIcon(template.id)
|
|
74
|
+
}
|
|
75
|
+
),
|
|
76
|
+
/* @__PURE__ */ jsxRuntime.jsx(tcComponents.CardTitle, { className: "text-lg", children: template.name })
|
|
77
|
+
] }),
|
|
78
|
+
/* @__PURE__ */ jsxRuntime.jsxs(tcComponents.CardContent, { className: "pt-0", children: [
|
|
79
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm mb-3 text-slate-600", children: template.description }),
|
|
80
|
+
/* @__PURE__ */ jsxRuntime.jsx(tcComponents.Badge, { variant: "secondary", className: "text-xs", children: template.category })
|
|
81
|
+
] })
|
|
82
|
+
]
|
|
83
|
+
},
|
|
84
|
+
template.id
|
|
85
|
+
);
|
|
86
|
+
}) }),
|
|
87
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
88
|
+
tcComponents.Button,
|
|
89
|
+
{
|
|
90
|
+
size: "lg",
|
|
91
|
+
onClick: () => handleNavigation(),
|
|
92
|
+
disabled: templateIds.length === 0,
|
|
93
|
+
children: "Create Report"
|
|
94
|
+
}
|
|
95
|
+
)
|
|
96
|
+
] }) });
|
|
97
|
+
};
|
|
98
|
+
const transformToUnifiedData = (formData, simulationData, logoBase64) => {
|
|
99
|
+
{
|
|
100
|
+
const sampleTotalCost = 156750;
|
|
101
|
+
const sampleRecordCount = 2500;
|
|
102
|
+
const sampleHoursDown = 18;
|
|
103
|
+
const sampleBusinessDowntime = 89200;
|
|
104
|
+
const sampleHardCosts = sampleTotalCost - sampleBusinessDowntime;
|
|
105
|
+
const sampleRegulatoryFines = sampleTotalCost * 0.15;
|
|
106
|
+
const sampleReputationDamage = sampleTotalCost * 0.1;
|
|
107
|
+
const sampleCostBreakdown = {
|
|
108
|
+
hard_costs: sampleHardCosts,
|
|
109
|
+
business_downtime: sampleBusinessDowntime,
|
|
110
|
+
regulatory_fines: sampleRegulatoryFines,
|
|
111
|
+
reputation_damage: sampleReputationDamage
|
|
112
|
+
};
|
|
113
|
+
return {
|
|
114
|
+
companyName: formData.companyName || "Your MSP Company",
|
|
115
|
+
clientName: formData.clientName || "Client Company",
|
|
116
|
+
reportTitle: formData.reportTitle || "Cyber Financial Impact Analysis",
|
|
117
|
+
reportDate: new Date(formData.generatedDate || Date.now()).toLocaleDateString(),
|
|
118
|
+
executiveSummary: formData.executiveSummary || "This report provides a comprehensive analysis of the potential financial impact of cybersecurity threats on your organization.",
|
|
119
|
+
customNotes: "Please review the recommendations and contact us to discuss implementation strategies.",
|
|
120
|
+
logoUrl: logoBase64,
|
|
121
|
+
primaryColor: "#2563eb",
|
|
122
|
+
secondaryColor: "#1e40af",
|
|
123
|
+
// Sample financial data
|
|
124
|
+
totalCost: sampleTotalCost,
|
|
125
|
+
recordCount: sampleRecordCount,
|
|
126
|
+
businessDowntime: sampleBusinessDowntime,
|
|
127
|
+
hoursDown: sampleHoursDown,
|
|
128
|
+
breachType: "Ransomware Attack",
|
|
129
|
+
industry: "Healthcare",
|
|
130
|
+
// Sample insurance data - pass through from form data
|
|
131
|
+
insuranceScore: formData.insuranceHealthScore || 490,
|
|
132
|
+
insuranceCategory: formData.insuranceScoreCategory || "Poor",
|
|
133
|
+
// Enhanced sample metrics
|
|
134
|
+
percentageBreached: 35,
|
|
135
|
+
costPerRecord: Math.round(sampleTotalCost / sampleRecordCount),
|
|
136
|
+
hourlyDowntimeCost: Math.round(sampleBusinessDowntime / sampleHoursDown),
|
|
137
|
+
// Cost breakdown
|
|
138
|
+
costBreakdown: sampleCostBreakdown,
|
|
139
|
+
// Individual cost components with percentages (formatted for display)
|
|
140
|
+
hardCosts: sampleHardCosts.toLocaleString(),
|
|
141
|
+
hardCostsPercentage: (sampleHardCosts / sampleTotalCost * 100).toFixed(1),
|
|
142
|
+
businessDowntimePercentage: (sampleBusinessDowntime / sampleTotalCost * 100).toFixed(1),
|
|
143
|
+
regulatoryFines: sampleRegulatoryFines.toLocaleString(),
|
|
144
|
+
regulatoryFinesPercentage: (sampleRegulatoryFines / sampleTotalCost * 100).toFixed(1),
|
|
145
|
+
reputationDamage: sampleReputationDamage.toLocaleString(),
|
|
146
|
+
reputationDamagePercentage: (sampleReputationDamage / sampleTotalCost * 100).toFixed(1)
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
const BreachLikelihood = ({ config }) => {
|
|
151
|
+
var _a;
|
|
152
|
+
const calculateBreachLikelihood = (protectionLevel) => {
|
|
153
|
+
var _a2, _b;
|
|
154
|
+
if (((_a2 = config.assessmentData) == null ? void 0 : _a2.overall_breach_likelihood) !== null && ((_b = config.assessmentData) == null ? void 0 : _b.overall_breach_likelihood) !== void 0) {
|
|
155
|
+
return Math.round(config.assessmentData.overall_breach_likelihood);
|
|
156
|
+
}
|
|
157
|
+
return Math.max(5, 100 - protectionLevel);
|
|
158
|
+
};
|
|
159
|
+
const calculateProtectionLevel = () => {
|
|
160
|
+
var _a2;
|
|
161
|
+
if ((_a2 = config.assessmentData) == null ? void 0 : _a2.findings) {
|
|
162
|
+
const findings = config.assessmentData.findings;
|
|
163
|
+
const totalControls = 18;
|
|
164
|
+
let implementedControls = 0;
|
|
165
|
+
for (let i = 1; i <= totalControls; i++) {
|
|
166
|
+
const control = findings[`control_${i}`];
|
|
167
|
+
if (control === "implemented" || control === "partial") {
|
|
168
|
+
implementedControls += control === "implemented" ? 1 : 0.5;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return Math.round(implementedControls / totalControls * 100);
|
|
172
|
+
}
|
|
173
|
+
return 19;
|
|
174
|
+
};
|
|
175
|
+
const calculateRiskExposure = (baseCost2, likelihood) => {
|
|
176
|
+
return Math.round(baseCost2 * (likelihood / 100));
|
|
177
|
+
};
|
|
178
|
+
const currentProtection = calculateProtectionLevel();
|
|
179
|
+
const attackLikelihood = calculateBreachLikelihood(currentProtection);
|
|
180
|
+
const baseCost = parseInt(
|
|
181
|
+
((_a = config.totalEstimatedCost) == null ? void 0 : _a.replace(/,/g, "")) || "510000"
|
|
182
|
+
);
|
|
183
|
+
const realRiskExposure = calculateRiskExposure(baseCost, attackLikelihood);
|
|
184
|
+
const riskReduction = Math.max(0, 100 - attackLikelihood);
|
|
185
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
186
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { id: "breach-likelihood", className: "report-page space-y-3", children: [
|
|
187
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center space-y-2", children: [
|
|
188
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-3xl font-bold text-slate-900", children: "Breach Likelihood Assessment" }),
|
|
189
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-600 text-base", children: "Analyzing probability and impact of security incidents" })
|
|
190
|
+
] }),
|
|
191
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-bold text-slate-900 text-left", children: "Executive Summary" }),
|
|
192
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-slate-50 rounded-lg p-4 text-left space-y-2", children: [
|
|
193
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-semibold text-slate-900", children: "Why This Breach Likelihood Assessment Matters" }),
|
|
194
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-slate-700 leading-relaxed whitespace-pre-line text-sm", children: config.executiveSummary })
|
|
195
|
+
] }),
|
|
196
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4 mb-4", children: [
|
|
197
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-red-600 text-white p-6 rounded-lg text-center", children: [
|
|
198
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertTriangle, { className: "w-8 h-8 mx-auto mb-3" }),
|
|
199
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-3xl font-bold mb-2", children: [
|
|
200
|
+
"$",
|
|
201
|
+
baseCost.toLocaleString()
|
|
202
|
+
] }),
|
|
203
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs opacity-90", children: "What an attack could cost your business" })
|
|
204
|
+
] }),
|
|
205
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-orange-600 text-white p-6 rounded-lg text-center", children: [
|
|
206
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Target, { className: "w-8 h-8 mx-auto mb-3" }),
|
|
207
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-3xl font-bold mb-2", children: [
|
|
208
|
+
attackLikelihood,
|
|
209
|
+
"%"
|
|
210
|
+
] }),
|
|
211
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs opacity-90", children: "Chance criminals would succeed today" })
|
|
212
|
+
] })
|
|
213
|
+
] }),
|
|
214
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "bg-slate-50 rounded-lg p-4 space-y-3", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-3 gap-2 text-xs text-center", children: [
|
|
215
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center space-x-1", children: [
|
|
216
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckCircle, { className: "w-4 h-4 text-green-600" }),
|
|
217
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
218
|
+
"You've reduced your risk by ",
|
|
219
|
+
riskReduction,
|
|
220
|
+
"%"
|
|
221
|
+
] })
|
|
222
|
+
] }),
|
|
223
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center space-x-1", children: [
|
|
224
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertTriangle, { className: "w-4 h-4 text-orange-600" }),
|
|
225
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
226
|
+
attackLikelihood,
|
|
227
|
+
"% chance criminals would succeed if they targeted you"
|
|
228
|
+
] })
|
|
229
|
+
] }),
|
|
230
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center space-x-1", children: [
|
|
231
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Target, { className: "w-4 h-4 text-blue-600" }),
|
|
232
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Smart investments could reduce your risk to under $100,000" })
|
|
233
|
+
] })
|
|
234
|
+
] }) }),
|
|
235
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-slate-50 rounded-lg p-3", children: [
|
|
236
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center mb-2", children: [
|
|
237
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: "w-4 h-4 text-slate-600 mr-1" }),
|
|
238
|
+
/* @__PURE__ */ jsxRuntime.jsxs("h4", { className: "text-sm font-semibold text-slate-700 italic", children: [
|
|
239
|
+
"Your Current Estimated Risk = $",
|
|
240
|
+
realRiskExposure.toLocaleString()
|
|
241
|
+
] })
|
|
242
|
+
] }),
|
|
243
|
+
/* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "text-xs text-slate-600 space-y-1", children: [
|
|
244
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• Cyber attacks increased 38% globally in 2023 compared to 2022" }),
|
|
245
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• Small businesses experience a cyberattack every 39 seconds on average" }),
|
|
246
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• 60% of small companies go out of business within 6 months of a cyber attack" }),
|
|
247
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• The average cost of cybercrime for businesses globally rose to $4.88 million in 2024" })
|
|
248
|
+
] })
|
|
249
|
+
] })
|
|
250
|
+
] }),
|
|
251
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "report-page space-y-6 border-t border-slate-200 pt-8", children: [
|
|
252
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
|
|
253
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold text-slate-900 mb-2", children: "Protection Analysis" }),
|
|
254
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-600", children: "Understanding Your Business Protection Shield" })
|
|
255
|
+
] }),
|
|
256
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-slate-50 rounded-lg p-8 text-center", children: [
|
|
257
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Shield, { className: "w-20 h-20 mx-auto mb-4 text-slate-600" }),
|
|
258
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-2xl font-bold mb-4", children: "Your Business Protection Shield" }),
|
|
259
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-xl font-bold text-red-600 mb-4", children: [
|
|
260
|
+
"Shield Strength: ",
|
|
261
|
+
100 - attackLikelihood,
|
|
262
|
+
"%"
|
|
263
|
+
] }),
|
|
264
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center items-center space-x-1 mb-4", children: Array.from(
|
|
265
|
+
{
|
|
266
|
+
length: 10
|
|
267
|
+
},
|
|
268
|
+
(_, index) => {
|
|
269
|
+
const shieldPercentage = 100 - attackLikelihood;
|
|
270
|
+
const threshold = (index + 1) * 10;
|
|
271
|
+
const isProtected = shieldPercentage >= threshold;
|
|
272
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
273
|
+
"span",
|
|
274
|
+
{
|
|
275
|
+
className: `text-2xl font-bold ${isProtected ? "text-blue-600" : "text-slate-300"}`,
|
|
276
|
+
style: {
|
|
277
|
+
fontFamily: "Arial, sans-serif"
|
|
278
|
+
},
|
|
279
|
+
children: "●"
|
|
280
|
+
},
|
|
281
|
+
index
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
) }),
|
|
285
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center mb-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex items-center space-x-1 bg-slate-100 rounded-lg px-4 py-2", children: [
|
|
286
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium text-slate-600", children: "Protection Level:" }),
|
|
287
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-lg font-bold text-blue-600", children: [
|
|
288
|
+
100 - attackLikelihood,
|
|
289
|
+
"%"
|
|
290
|
+
] }),
|
|
291
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm text-slate-500", children: [
|
|
292
|
+
"(",
|
|
293
|
+
attackLikelihood,
|
|
294
|
+
"% vulnerable)"
|
|
295
|
+
] })
|
|
296
|
+
] }) }),
|
|
297
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-lg font-bold", children: [
|
|
298
|
+
100 - attackLikelihood,
|
|
299
|
+
"% Protected | ",
|
|
300
|
+
attackLikelihood,
|
|
301
|
+
"% Vulnerable"
|
|
302
|
+
] }),
|
|
303
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-600 mt-4", children: "Your business has basic protection in a few areas, but most of your shield has serious gaps that criminals could easily exploit." })
|
|
304
|
+
] }),
|
|
305
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-6", children: [
|
|
306
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-xl font-bold text-center", children: "How Criminals Attack Your Business" }),
|
|
307
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-4 gap-4", children: [
|
|
308
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center border-2 border-slate-200 rounded-lg p-4", children: [
|
|
309
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
310
|
+
reactFontawesome.FontAwesomeIcon,
|
|
311
|
+
{
|
|
312
|
+
icon: freeSolidSvgIcons.faDoorOpen,
|
|
313
|
+
className: "text-2xl mb-2 text-slate-600"
|
|
314
|
+
}
|
|
315
|
+
),
|
|
316
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-bold mb-2", children: "Step 1: Get In" }),
|
|
317
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-slate-600 mb-2", children: "Find any weakness like emails, websites, or mistakes" }),
|
|
318
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs font-bold text-red-600", children: "Protection: Minimal" })
|
|
319
|
+
] }),
|
|
320
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center border-2 border-slate-200 rounded-lg p-4", children: [
|
|
321
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Eye, { className: "w-8 h-8 mx-auto mb-2 text-slate-600" }),
|
|
322
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-bold mb-2", children: "Step 2: Sneak Around" }),
|
|
323
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-slate-600 mb-2", children: "Move through systems quietly and find valuable information" }),
|
|
324
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs font-bold text-red-600", children: "Protection: None" })
|
|
325
|
+
] }),
|
|
326
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center border-2 border-slate-200 rounded-lg p-4", children: [
|
|
327
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
328
|
+
reactFontawesome.FontAwesomeIcon,
|
|
329
|
+
{
|
|
330
|
+
icon: freeSolidSvgIcons.faCrown,
|
|
331
|
+
className: "text-2xl mb-2 text-slate-600"
|
|
332
|
+
}
|
|
333
|
+
),
|
|
334
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-bold mb-2", children: "Step 3: Take Control" }),
|
|
335
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-slate-600 mb-2", children: "Steal data, encrypt files, or take over your systems" }),
|
|
336
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs font-bold text-red-600", children: "Protection: None" })
|
|
337
|
+
] }),
|
|
338
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center border-2 border-slate-200 rounded-lg p-4", children: [
|
|
339
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
340
|
+
reactFontawesome.FontAwesomeIcon,
|
|
341
|
+
{
|
|
342
|
+
icon: freeSolidSvgIcons.faEyeSlash,
|
|
343
|
+
className: "text-2xl mb-2 text-slate-600"
|
|
344
|
+
}
|
|
345
|
+
),
|
|
346
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-bold mb-2", children: "Step 4: Stay Hidden" }),
|
|
347
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-slate-600 mb-2", children: "Cover tracks so you don't notice for weeks/months" }),
|
|
348
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs font-bold text-red-600", children: "Protection: None" })
|
|
349
|
+
] })
|
|
350
|
+
] }),
|
|
351
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-lg font-bold text-red-600", children: "Result: Criminals have a clear path to hurt your business with very little stopping them." }) })
|
|
352
|
+
] })
|
|
353
|
+
] }),
|
|
354
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "report-page space-y-6 border-t border-slate-200 pt-8", children: [
|
|
355
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
356
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold text-slate-900 mb-2", children: "Control-Specific Financial Impact" }),
|
|
357
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-600", children: "Multiple value streams for each control" })
|
|
358
|
+
] }),
|
|
359
|
+
(() => {
|
|
360
|
+
var _a2;
|
|
361
|
+
const controlMappings = ((_a2 = config.assessmentData) == null ? void 0 : _a2.control_mappings) || [];
|
|
362
|
+
const implementedControls = Array.isArray(controlMappings) ? controlMappings.filter((c) => c.implemented === true) : [];
|
|
363
|
+
const potentialControls = Array.isArray(controlMappings) ? controlMappings.filter((c) => c.implemented !== true) : [];
|
|
364
|
+
const renderControlRow = (control) => {
|
|
365
|
+
var _a3, _b, _c, _d;
|
|
366
|
+
const mitrePhases = Array.isArray(control.mitrePhases) ? control.mitrePhases.join(", ") : control.mitrePhases || "";
|
|
367
|
+
const breachValue = ((_a3 = control.financialValues) == null ? void 0 : _a3.proportionalBreachValue) || control.breach_protection || 0;
|
|
368
|
+
const complianceValue = ((_b = control.financialValues) == null ? void 0 : _b.complianceValue) || control.compliance_value || 0;
|
|
369
|
+
const operationalValue = ((_c = control.financialValues) == null ? void 0 : _c.operationalSavings) || control.operational_savings || 0;
|
|
370
|
+
const totalValue = ((_d = control.financialValues) == null ? void 0 : _d.totalValue) || breachValue + complianceValue + operationalValue || 0;
|
|
371
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
372
|
+
"tr",
|
|
373
|
+
{
|
|
374
|
+
className: "border-b transition-colors hover:bg-slate-50",
|
|
375
|
+
children: [
|
|
376
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "p-4 align-top border border-slate-300", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
|
|
377
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "font-semibold text-slate-900", children: [
|
|
378
|
+
"CIS ",
|
|
379
|
+
control.controlNumber || control.cis_control_number
|
|
380
|
+
] }),
|
|
381
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-medium text-slate-700", children: control.controlName || control.cis_control_name || control.name }),
|
|
382
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-xs text-slate-600 leading-tight", children: [
|
|
383
|
+
"MITRE: ",
|
|
384
|
+
mitrePhases
|
|
385
|
+
] })
|
|
386
|
+
] }) }),
|
|
387
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "p-4 align-middle border border-slate-300 text-center", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-blue-600 font-semibold", children: [
|
|
388
|
+
"$",
|
|
389
|
+
breachValue.toLocaleString()
|
|
390
|
+
] }) }),
|
|
391
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "p-4 align-middle border border-slate-300 text-center", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-green-600 font-semibold", children: [
|
|
392
|
+
"$",
|
|
393
|
+
complianceValue.toLocaleString()
|
|
394
|
+
] }) }),
|
|
395
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "p-4 align-middle border border-slate-300 text-center", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-purple-600 font-semibold", children: [
|
|
396
|
+
"$",
|
|
397
|
+
operationalValue.toLocaleString()
|
|
398
|
+
] }) }),
|
|
399
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "p-4 align-middle border border-slate-300 text-center", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-slate-900 font-bold", children: [
|
|
400
|
+
"$",
|
|
401
|
+
totalValue.toLocaleString()
|
|
402
|
+
] }) })
|
|
403
|
+
]
|
|
404
|
+
},
|
|
405
|
+
control.controlNumber
|
|
406
|
+
);
|
|
407
|
+
};
|
|
408
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-6", children: (() => {
|
|
409
|
+
const renderControlTable = (controls, title, color, isPotential = false) => {
|
|
410
|
+
if (isPotential) {
|
|
411
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
412
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 mb-3", children: [
|
|
413
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
414
|
+
"div",
|
|
415
|
+
{
|
|
416
|
+
className: `w-5 h-5 ${color === "green" ? "bg-green-600" : "bg-red-600"} rounded-full flex items-center justify-center`,
|
|
417
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
418
|
+
"svg",
|
|
419
|
+
{
|
|
420
|
+
className: "w-3 h-3 text-white",
|
|
421
|
+
fill: "currentColor",
|
|
422
|
+
viewBox: "0 0 20 20",
|
|
423
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
424
|
+
"path",
|
|
425
|
+
{
|
|
426
|
+
fillRule: "evenodd",
|
|
427
|
+
d: color === "green" ? "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" : "M10 3a1 1 0 011 1v5h5a1 1 0 110 2h-5v5a1 1 0 11-2 0v-5H4a1 1 0 110-2h5V4a1 1 0 011-1z",
|
|
428
|
+
clipRule: "evenodd"
|
|
429
|
+
}
|
|
430
|
+
)
|
|
431
|
+
}
|
|
432
|
+
)
|
|
433
|
+
}
|
|
434
|
+
),
|
|
435
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
436
|
+
"h3",
|
|
437
|
+
{
|
|
438
|
+
className: `text-lg font-semibold ${color === "green" ? "text-green-600" : "text-red-600"}`,
|
|
439
|
+
children: title
|
|
440
|
+
}
|
|
441
|
+
)
|
|
442
|
+
] }),
|
|
443
|
+
/* @__PURE__ */ jsxRuntime.jsxs("table", { className: "w-full caption-bottom text-sm border-collapse border border-slate-300", children: [
|
|
444
|
+
/* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
445
|
+
"tr",
|
|
446
|
+
{
|
|
447
|
+
className: color === "green" ? "bg-green-50" : "bg-red-50",
|
|
448
|
+
children: [
|
|
449
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "h-12 px-4 text-left align-middle font-medium text-slate-900 border border-slate-300", children: "Control" }),
|
|
450
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "h-12 px-4 text-left align-middle font-medium text-slate-900 border border-slate-300", children: "Breach Protection" }),
|
|
451
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "h-12 px-4 text-left align-middle font-medium text-slate-900 border border-slate-300", children: "Compliance Value" }),
|
|
452
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "h-12 px-4 text-left align-middle font-medium text-slate-900 border border-slate-300", children: "Operational Savings" }),
|
|
453
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "h-12 px-4 text-left align-middle font-medium text-slate-900 border border-slate-300", children: "Total Value" })
|
|
454
|
+
]
|
|
455
|
+
}
|
|
456
|
+
) }),
|
|
457
|
+
/* @__PURE__ */ jsxRuntime.jsx("tbody", { children: controls.length > 0 ? controls.map(
|
|
458
|
+
(control) => renderControlRow(control)
|
|
459
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
460
|
+
"td",
|
|
461
|
+
{
|
|
462
|
+
colSpan: 5,
|
|
463
|
+
className: "p-8 text-center text-slate-500 border border-slate-300",
|
|
464
|
+
children: isPotential ? "No additional controls recommended" : "No controls currently implemented"
|
|
465
|
+
}
|
|
466
|
+
) }) })
|
|
467
|
+
] })
|
|
468
|
+
] });
|
|
469
|
+
}
|
|
470
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
471
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 mb-3", children: [
|
|
472
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
473
|
+
"div",
|
|
474
|
+
{
|
|
475
|
+
className: `w-5 h-5 ${color === "green" ? "bg-green-600" : "bg-red-600"} rounded-full flex items-center justify-center`,
|
|
476
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
477
|
+
"svg",
|
|
478
|
+
{
|
|
479
|
+
className: "w-3 h-3 text-white",
|
|
480
|
+
fill: "currentColor",
|
|
481
|
+
viewBox: "0 0 20 20",
|
|
482
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
483
|
+
"path",
|
|
484
|
+
{
|
|
485
|
+
fillRule: "evenodd",
|
|
486
|
+
d: color === "green" ? "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" : "M10 3a1 1 0 011 1v5h5a1 1 0 110 2h-5v5a1 1 0 11-2 0v-5H4a1 1 0 110-2h5V4a1 1 0 011-1z",
|
|
487
|
+
clipRule: "evenodd"
|
|
488
|
+
}
|
|
489
|
+
)
|
|
490
|
+
}
|
|
491
|
+
)
|
|
492
|
+
}
|
|
493
|
+
),
|
|
494
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
495
|
+
"h3",
|
|
496
|
+
{
|
|
497
|
+
className: `text-lg font-semibold ${color === "green" ? "text-green-600" : "text-red-600"}`,
|
|
498
|
+
children: title
|
|
499
|
+
}
|
|
500
|
+
)
|
|
501
|
+
] }),
|
|
502
|
+
/* @__PURE__ */ jsxRuntime.jsxs("table", { className: "w-full caption-bottom text-sm border-collapse border border-slate-300", children: [
|
|
503
|
+
/* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
504
|
+
"tr",
|
|
505
|
+
{
|
|
506
|
+
className: color === "green" ? "bg-green-50" : "bg-red-50",
|
|
507
|
+
children: [
|
|
508
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "h-12 px-4 text-left align-middle font-medium text-slate-900 border border-slate-300", children: "Control" }),
|
|
509
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "h-12 px-4 text-left align-middle font-medium text-slate-900 border border-slate-300", children: "Breach Protection" }),
|
|
510
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "h-12 px-4 text-left align-middle font-medium text-slate-900 border border-slate-300", children: "Compliance Value" }),
|
|
511
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "h-12 px-4 text-left align-middle font-medium text-slate-900 border border-slate-300", children: "Operational Savings" }),
|
|
512
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "h-12 px-4 text-left align-middle font-medium text-slate-900 border border-slate-300", children: "Total Value" })
|
|
513
|
+
]
|
|
514
|
+
}
|
|
515
|
+
) }),
|
|
516
|
+
/* @__PURE__ */ jsxRuntime.jsx("tbody", { children: controls.length > 0 ? controls.map(
|
|
517
|
+
(control) => renderControlRow(control)
|
|
518
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
519
|
+
"td",
|
|
520
|
+
{
|
|
521
|
+
colSpan: 5,
|
|
522
|
+
className: "p-8 text-center text-slate-500 border border-slate-300",
|
|
523
|
+
children: isPotential ? "No additional controls recommended" : "No controls currently implemented"
|
|
524
|
+
}
|
|
525
|
+
) }) })
|
|
526
|
+
] })
|
|
527
|
+
] });
|
|
528
|
+
};
|
|
529
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-6", children: [
|
|
530
|
+
renderControlTable(
|
|
531
|
+
implementedControls,
|
|
532
|
+
"Controls Currently in Place",
|
|
533
|
+
"green"
|
|
534
|
+
),
|
|
535
|
+
renderControlTable(
|
|
536
|
+
potentialControls,
|
|
537
|
+
"Recommended Additional Controls",
|
|
538
|
+
"red",
|
|
539
|
+
true
|
|
540
|
+
)
|
|
541
|
+
] });
|
|
542
|
+
})() });
|
|
543
|
+
})(),
|
|
544
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-slate-50 rounded-lg p-6", children: [
|
|
545
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg font-semibold text-slate-900 mb-4", children: "Control Implementation Impact" }),
|
|
546
|
+
(() => {
|
|
547
|
+
var _a2;
|
|
548
|
+
const controlMappings = ((_a2 = config.assessmentData) == null ? void 0 : _a2.control_mappings) || [];
|
|
549
|
+
const implementedControls = Array.isArray(controlMappings) ? controlMappings.filter(
|
|
550
|
+
(control) => control.implemented === true
|
|
551
|
+
) : [];
|
|
552
|
+
const potentialControls = Array.isArray(controlMappings) ? controlMappings.filter(
|
|
553
|
+
(control) => control.implemented === false
|
|
554
|
+
) : [];
|
|
555
|
+
const implementedTotals = implementedControls.reduce(
|
|
556
|
+
(acc, control) => {
|
|
557
|
+
var _a3, _b, _c;
|
|
558
|
+
acc.breachProtection += ((_a3 = control.financialValues) == null ? void 0 : _a3.proportionalBreachValue) || control.breach_protection || 0;
|
|
559
|
+
acc.complianceValue += ((_b = control.financialValues) == null ? void 0 : _b.complianceValue) || control.compliance_value || 0;
|
|
560
|
+
acc.operationalSavings += ((_c = control.financialValues) == null ? void 0 : _c.operationalSavings) || control.operational_savings || 0;
|
|
561
|
+
return acc;
|
|
562
|
+
},
|
|
563
|
+
{
|
|
564
|
+
breachProtection: 0,
|
|
565
|
+
complianceValue: 0,
|
|
566
|
+
operationalSavings: 0
|
|
567
|
+
}
|
|
568
|
+
);
|
|
569
|
+
const potentialTotals = potentialControls.reduce(
|
|
570
|
+
(acc, control) => {
|
|
571
|
+
var _a3, _b, _c;
|
|
572
|
+
acc.breachProtection += ((_a3 = control.financialValues) == null ? void 0 : _a3.proportionalBreachValue) || control.breach_protection || 0;
|
|
573
|
+
acc.complianceValue += ((_b = control.financialValues) == null ? void 0 : _b.complianceValue) || control.compliance_value || 0;
|
|
574
|
+
acc.operationalSavings += ((_c = control.financialValues) == null ? void 0 : _c.operationalSavings) || control.operational_savings || 0;
|
|
575
|
+
acc.implementationCost += control.implementationCost || control.implementation_cost || 0;
|
|
576
|
+
return acc;
|
|
577
|
+
},
|
|
578
|
+
{
|
|
579
|
+
breachProtection: 0,
|
|
580
|
+
complianceValue: 0,
|
|
581
|
+
operationalSavings: 0,
|
|
582
|
+
implementationCost: 0
|
|
583
|
+
}
|
|
584
|
+
);
|
|
585
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6 text-sm", children: [
|
|
586
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
|
|
587
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-3xl font-bold text-green-600", children: [
|
|
588
|
+
"$",
|
|
589
|
+
implementedTotals.breachProtection.toLocaleString()
|
|
590
|
+
] }),
|
|
591
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-slate-600 mt-2", children: "Current Breach Protection" })
|
|
592
|
+
] }),
|
|
593
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
|
|
594
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-3xl font-bold text-red-600", children: [
|
|
595
|
+
"$",
|
|
596
|
+
potentialTotals.breachProtection.toLocaleString()
|
|
597
|
+
] }),
|
|
598
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-slate-600 mt-2", children: "Additional Protection Available" })
|
|
599
|
+
] })
|
|
600
|
+
] });
|
|
601
|
+
})()
|
|
602
|
+
] })
|
|
603
|
+
] }),
|
|
604
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "report-page space-y-6 border-t border-slate-200 pt-8", children: [
|
|
605
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
|
|
606
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold text-slate-900 mb-2", children: "Next Steps & Action Options" }),
|
|
607
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-600", children: "Choose Your Path Forward" })
|
|
608
|
+
] }),
|
|
609
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-slate-50 rounded-lg p-6 space-y-4", children: [
|
|
610
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-xl font-bold text-center", children: "Your Complete Business Risk Assessment" }),
|
|
611
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-3 gap-4 text-sm text-center", children: [
|
|
612
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
613
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-green-600", children: "✓" }),
|
|
614
|
+
" ",
|
|
615
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Financial Impact:" }),
|
|
616
|
+
" $",
|
|
617
|
+
baseCost.toLocaleString(),
|
|
618
|
+
" ",
|
|
619
|
+
"potential cost"
|
|
620
|
+
] }),
|
|
621
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
622
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-green-600", children: "✓" }),
|
|
623
|
+
" ",
|
|
624
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Insurance Readiness:" }),
|
|
625
|
+
" ",
|
|
626
|
+
config.insuranceHealthScore || 490,
|
|
627
|
+
"/850 (",
|
|
628
|
+
config.insuranceScoreCategory || "Poor",
|
|
629
|
+
")"
|
|
630
|
+
] }),
|
|
631
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
632
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-green-600", children: "✓" }),
|
|
633
|
+
" ",
|
|
634
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Attack Likelihood:" }),
|
|
635
|
+
" ",
|
|
636
|
+
attackLikelihood,
|
|
637
|
+
"% chance of success"
|
|
638
|
+
] })
|
|
639
|
+
] }),
|
|
640
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center text-lg font-bold text-red-600", children: [
|
|
641
|
+
"Your Bottom Line: $",
|
|
642
|
+
realRiskExposure.toLocaleString(),
|
|
643
|
+
" at risk"
|
|
644
|
+
] })
|
|
645
|
+
] }),
|
|
646
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-3 gap-6", children: [
|
|
647
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-2 border-green-500 bg-green-50 rounded-lg p-6 text-center", children: [
|
|
648
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg font-bold mb-2", children: "Option 1: Start With Essentials" }),
|
|
649
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "bg-green-600 text-white px-3 py-1 rounded-full text-sm font-bold mb-4 inline-block", children: "Recommended" }),
|
|
650
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-sm mb-4", children: [
|
|
651
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Benefit:" }),
|
|
652
|
+
" Reduces risk by 73%"
|
|
653
|
+
] }),
|
|
654
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-slate-600", children: "Get the most critical protections in place first. Covers the most common attack methods." })
|
|
655
|
+
] }),
|
|
656
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-2 border-blue-500 rounded-lg p-6 text-center", children: [
|
|
657
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg font-bold mb-4", children: "Option 2: Complete Protection Plan" }),
|
|
658
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-sm mb-4", children: [
|
|
659
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Benefit:" }),
|
|
660
|
+
" Reduces risk by 87%"
|
|
661
|
+
] }),
|
|
662
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-slate-600", children: "Full comprehensive security. Positions you well for insurance discounts and client requirements." })
|
|
663
|
+
] }),
|
|
664
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-2 border-red-500 bg-red-50 rounded-lg p-6 text-center", children: [
|
|
665
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg font-bold mb-4", children: "Option 3: Do Nothing" }),
|
|
666
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-sm mb-2", children: [
|
|
667
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Investment:" }),
|
|
668
|
+
" $0"
|
|
669
|
+
] }),
|
|
670
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-sm mb-4 text-red-600", children: [
|
|
671
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Risk:" }),
|
|
672
|
+
" 97% chance of losing $",
|
|
673
|
+
realRiskExposure.toLocaleString()
|
|
674
|
+
] }),
|
|
675
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-slate-600", children: "Keep current protection and hope criminals don't target you." })
|
|
676
|
+
] })
|
|
677
|
+
] }),
|
|
678
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-gradient-to-r from-blue-600 to-blue-800 text-white rounded-lg p-8 text-center", children: [
|
|
679
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-2xl font-bold mb-4", children: "Ready to Protect Your Business?" }),
|
|
680
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-lg mb-6 opacity-90", children: "You know what you're facing and what it costs to fix. The question isn't whether you can afford protection - it's whether you can afford to go without it." }),
|
|
681
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-lg mb-4" }),
|
|
682
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm opacity-80", children: "Every day you wait is another day criminals could strike. Every protection you add makes your business safer." })
|
|
683
|
+
] })
|
|
684
|
+
] }),
|
|
685
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "report-page space-y-6 border-t border-slate-200 pt-8", children: [
|
|
686
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
|
|
687
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold text-slate-900 mb-2", children: "Understanding Your Numbers" }),
|
|
688
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-600", children: "How We Calculate Your Risk" })
|
|
689
|
+
] }),
|
|
690
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-3 gap-6 mb-8", children: [
|
|
691
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-2 border-slate-200 rounded-lg p-6", children: [
|
|
692
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Target, { className: "w-8 h-8 text-orange-600 mb-4" }),
|
|
693
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg font-bold mb-3", children: "Attack Likelihood" }),
|
|
694
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-sm text-slate-600 space-y-2", children: [
|
|
695
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
|
|
696
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Based on:" }),
|
|
697
|
+
" Industry attack statistics + your current protection level"
|
|
698
|
+
] }),
|
|
699
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
|
|
700
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Source:" }),
|
|
701
|
+
" FBI Internet Crime Reports and cybersecurity research"
|
|
702
|
+
] }),
|
|
703
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
|
|
704
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Your result:" }),
|
|
705
|
+
" ",
|
|
706
|
+
attackLikelihood,
|
|
707
|
+
"% chance based on ",
|
|
708
|
+
currentProtection,
|
|
709
|
+
"% protection implementation"
|
|
710
|
+
] })
|
|
711
|
+
] })
|
|
712
|
+
] }),
|
|
713
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-2 border-slate-200 rounded-lg p-6", children: [
|
|
714
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.DollarSign, { className: "w-8 h-8 text-red-600 mb-4" }),
|
|
715
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg font-bold mb-3", children: "Financial Impact" }),
|
|
716
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-sm text-slate-600 space-y-2", children: [
|
|
717
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
|
|
718
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Based on:" }),
|
|
719
|
+
" Average costs for businesses your size in your industry"
|
|
720
|
+
] }),
|
|
721
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
|
|
722
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Source:" }),
|
|
723
|
+
" IBM Cost of Data Breach Report 2024"
|
|
724
|
+
] }),
|
|
725
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
|
|
726
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Your result:" }),
|
|
727
|
+
" $",
|
|
728
|
+
baseCost.toLocaleString(),
|
|
729
|
+
" ",
|
|
730
|
+
"potential cost for small ",
|
|
731
|
+
config.clientIndustry,
|
|
732
|
+
" business"
|
|
733
|
+
] })
|
|
734
|
+
] })
|
|
735
|
+
] }),
|
|
736
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-2 border-slate-200 rounded-lg p-6", children: [
|
|
737
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Shield, { className: "w-8 h-8 text-blue-600 mb-4" }),
|
|
738
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg font-bold mb-3", children: "Protection Value" }),
|
|
739
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-sm text-slate-600 space-y-2", children: [
|
|
740
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
|
|
741
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Based on:" }),
|
|
742
|
+
" How much each security control reduces attack success"
|
|
743
|
+
] }),
|
|
744
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
|
|
745
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Source:" }),
|
|
746
|
+
" NIST Cybersecurity Framework effectiveness data"
|
|
747
|
+
] }),
|
|
748
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
|
|
749
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Your result:" }),
|
|
750
|
+
" Each control's value calculated from proven risk reduction"
|
|
751
|
+
] })
|
|
752
|
+
] })
|
|
753
|
+
] })
|
|
754
|
+
] }),
|
|
755
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-slate-50 rounded-lg p-6 mb-6", children: [
|
|
756
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-xl font-bold mb-4", children: "Our Approach" }),
|
|
757
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-slate-700", children: "We use the same data sources that insurance companies and security professionals rely on. Our calculations are conservative - real attack costs are often higher than our estimates." })
|
|
758
|
+
] }),
|
|
759
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-3 gap-6", children: [
|
|
760
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border border-slate-200 rounded-lg p-5", children: [
|
|
761
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Target, { className: "w-6 h-6 text-orange-600 mb-3" }),
|
|
762
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-bold mb-3", children: "About Risk Predictions" }),
|
|
763
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-slate-600", children: "These numbers show likely scenarios based on current data. Every business is different, and actual results may vary." })
|
|
764
|
+
] }),
|
|
765
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border border-slate-200 rounded-lg p-5", children: [
|
|
766
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.DollarSign, { className: "w-6 h-6 text-green-600 mb-3" }),
|
|
767
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-bold mb-3", children: "About Cost Estimates" }),
|
|
768
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-slate-600", children: "Implementation costs are estimates based on typical market rates. Actual costs depend on your specific needs and solutions." })
|
|
769
|
+
] }),
|
|
770
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border border-slate-200 rounded-lg p-5", children: [
|
|
771
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.BarChart3, { className: "w-6 h-6 text-blue-600 mb-3" }),
|
|
772
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-bold mb-3", children: "About Our Data" }),
|
|
773
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-slate-600", children: "We use industry-standard sources and proven methodologies. This assessment is for planning purposes and should be combined with professional security advice." })
|
|
774
|
+
] })
|
|
775
|
+
] })
|
|
776
|
+
] })
|
|
777
|
+
] });
|
|
778
|
+
};
|
|
779
|
+
const getExecutiveSummaryTemplate = (industry) => {
|
|
780
|
+
const industryTemplates = {
|
|
781
|
+
"Healthcare": "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.",
|
|
782
|
+
"Legal": "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.",
|
|
783
|
+
"Financial Services": "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.",
|
|
784
|
+
"Education": "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.",
|
|
785
|
+
"Manufacturing": "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.",
|
|
786
|
+
"Retail": "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.",
|
|
787
|
+
"Technology": "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.",
|
|
788
|
+
"Government": "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."
|
|
789
|
+
};
|
|
790
|
+
return industryTemplates[industry] || "This cybersecurity financial impact analysis estimates the potential cost of a data breach for the client, using trusted, industry-standard data. Backed by sources like IBM Security and the Ponemon Institute, it provides a credible view of the financial 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.";
|
|
791
|
+
};
|
|
792
|
+
const formatCurrency = (value) => {
|
|
793
|
+
return `$${value.toLocaleString()}`;
|
|
794
|
+
};
|
|
795
|
+
const getIndustrySpecificCosts = (industry, costBreakdown) => {
|
|
796
|
+
const industryExamples = {
|
|
797
|
+
"Healthcare": {
|
|
798
|
+
"Post-Breach Response": "Forensic analysis, legal counsel, incident response team",
|
|
799
|
+
"Business Downtime": "EMR systems offline, surgery delays, patient care disruption",
|
|
800
|
+
"Notification": "Patient notification letters, credit monitoring, regulatory reporting",
|
|
801
|
+
"Investigation": "Brand reputation management, PR costs, patient trust recovery"
|
|
802
|
+
},
|
|
803
|
+
"Financial Services": {
|
|
804
|
+
"Post-Breach Response": "Third-party investigation, compliance audit, cybersecurity consultants",
|
|
805
|
+
"Business Downtime": "Trading systems offline, transaction losses, service interruption",
|
|
806
|
+
"Notification": "GDPR, PCI DSS violations, customer notifications",
|
|
807
|
+
"Investigation": "Account monitoring, customer retention, brand recovery"
|
|
808
|
+
},
|
|
809
|
+
"Manufacturing": {
|
|
810
|
+
"Post-Breach Response": "OT forensics, security assessment, incident containment",
|
|
811
|
+
"Business Downtime": "Assembly line shutdown, supply chain disruption, production halt",
|
|
812
|
+
"Notification": "Industry regulations, safety standards, compliance reporting",
|
|
813
|
+
"Investigation": "Competitive disadvantage, customer confidence, market position recovery"
|
|
814
|
+
}
|
|
815
|
+
};
|
|
816
|
+
const genericExamples = {
|
|
817
|
+
"Post-Breach Response": "Incident response, forensic investigation, legal and regulatory costs",
|
|
818
|
+
"Business Downtime": "Lost revenue, operational disruption, productivity loss",
|
|
819
|
+
"Notification": "Customer notifications, regulatory fines, compliance costs",
|
|
820
|
+
"Investigation": "Reputation management, customer retention, brand recovery efforts"
|
|
821
|
+
};
|
|
822
|
+
const examples = industryExamples[industry] || genericExamples;
|
|
823
|
+
return [
|
|
824
|
+
{
|
|
825
|
+
category: "Post-Breach Response",
|
|
826
|
+
example: examples["Post-Breach Response"],
|
|
827
|
+
cost: costBreakdown.hard_costs,
|
|
828
|
+
color: "#dc2626"
|
|
829
|
+
},
|
|
830
|
+
{
|
|
831
|
+
category: "Business Downtime",
|
|
832
|
+
example: examples["Business Downtime"],
|
|
833
|
+
cost: costBreakdown.business_downtime,
|
|
834
|
+
color: "#3b82f6"
|
|
835
|
+
},
|
|
836
|
+
{
|
|
837
|
+
category: "Notification",
|
|
838
|
+
example: examples["Notification"],
|
|
839
|
+
cost: costBreakdown.regulatory_fines,
|
|
840
|
+
color: "#ca8a04"
|
|
841
|
+
},
|
|
842
|
+
{
|
|
843
|
+
category: "Investigation",
|
|
844
|
+
example: examples["Investigation"],
|
|
845
|
+
cost: costBreakdown.reputation_damage,
|
|
846
|
+
color: "#16a34a"
|
|
847
|
+
}
|
|
848
|
+
];
|
|
849
|
+
};
|
|
850
|
+
const createCostBreakdownFromSimulation = ({ costBreakdown }) => {
|
|
851
|
+
var _a, _b, _c, _d;
|
|
852
|
+
if (typeof costBreakdown === "object" && !Array.isArray(costBreakdown)) {
|
|
853
|
+
return {
|
|
854
|
+
hard_costs: (costBreakdown.forensic_costs || 0) + (costBreakdown.legal_costs || 0) + (costBreakdown.system_restoration || 0),
|
|
855
|
+
business_downtime: costBreakdown.business_interruption || 0,
|
|
856
|
+
regulatory_fines: costBreakdown.regulatory_fines || 0,
|
|
857
|
+
reputation_damage: costBreakdown.pr_costs || 0
|
|
858
|
+
};
|
|
859
|
+
} else if (Array.isArray(costBreakdown)) {
|
|
860
|
+
return {
|
|
861
|
+
hard_costs: ((_a = costBreakdown.find((item) => item.category === "Ex-Post Response")) == null ? void 0 : _a.amount) || 0,
|
|
862
|
+
business_downtime: ((_b = costBreakdown.find((item) => item.category === "Business Downtime")) == null ? void 0 : _b.amount) || 0,
|
|
863
|
+
regulatory_fines: ((_c = costBreakdown.find((item) => item.category === "Notification")) == null ? void 0 : _c.amount) || 0,
|
|
864
|
+
reputation_damage: ((_d = costBreakdown.find((item) => item.category === "Investigation")) == null ? void 0 : _d.amount) || 0
|
|
865
|
+
};
|
|
866
|
+
}
|
|
867
|
+
};
|
|
868
|
+
const UnifiedCostBreakdownChart = ({
|
|
869
|
+
costBreakdown,
|
|
870
|
+
totalCost,
|
|
871
|
+
showTotal = true
|
|
872
|
+
}) => {
|
|
873
|
+
const data = [
|
|
874
|
+
{
|
|
875
|
+
name: "Post-Breach Response",
|
|
876
|
+
value: costBreakdown.hard_costs || 0,
|
|
877
|
+
color: "#dc2626",
|
|
878
|
+
label: "Post-Breach Response"
|
|
879
|
+
},
|
|
880
|
+
{
|
|
881
|
+
name: "Business Downtime",
|
|
882
|
+
value: costBreakdown.business_downtime || 0,
|
|
883
|
+
color: "#3b82f6",
|
|
884
|
+
label: "Business Downtime"
|
|
885
|
+
},
|
|
886
|
+
{
|
|
887
|
+
name: "Notification",
|
|
888
|
+
value: costBreakdown.regulatory_fines || 0,
|
|
889
|
+
color: "#ca8a04",
|
|
890
|
+
label: "Notification"
|
|
891
|
+
},
|
|
892
|
+
{
|
|
893
|
+
name: "Investigation",
|
|
894
|
+
value: costBreakdown.reputation_damage || 0,
|
|
895
|
+
color: "#16a34a",
|
|
896
|
+
label: "Investigation"
|
|
897
|
+
}
|
|
898
|
+
];
|
|
899
|
+
const validData = data.filter((item) => item.value > 0);
|
|
900
|
+
const dataTotal = validData.reduce((sum, item) => sum + item.value, 0);
|
|
901
|
+
const chartTotal = dataTotal > 0 ? dataTotal : totalCost;
|
|
902
|
+
const centerX = 350;
|
|
903
|
+
const centerY = 350;
|
|
904
|
+
const radius = 220;
|
|
905
|
+
const innerRadius = showTotal ? 120 : 0;
|
|
906
|
+
let currentAngle = -90;
|
|
907
|
+
const pathElements = [];
|
|
908
|
+
validData.forEach((item, index) => {
|
|
909
|
+
const percentage = item.value / chartTotal * 100;
|
|
910
|
+
const angle = percentage / 100 * 360;
|
|
911
|
+
const startAngleRad = currentAngle * Math.PI / 180;
|
|
912
|
+
const endAngleRad = (currentAngle + angle) * Math.PI / 180;
|
|
913
|
+
const x1 = centerX + radius * Math.cos(startAngleRad);
|
|
914
|
+
const y1 = centerY + radius * Math.sin(startAngleRad);
|
|
915
|
+
const x2 = centerX + radius * Math.cos(endAngleRad);
|
|
916
|
+
const y2 = centerY + radius * Math.sin(endAngleRad);
|
|
917
|
+
const innerX1 = centerX + innerRadius * Math.cos(startAngleRad);
|
|
918
|
+
const innerY1 = centerY + innerRadius * Math.sin(startAngleRad);
|
|
919
|
+
const innerX2 = centerX + innerRadius * Math.cos(endAngleRad);
|
|
920
|
+
const innerY2 = centerY + innerRadius * Math.sin(endAngleRad);
|
|
921
|
+
const largeArcFlag = angle > 180 ? 1 : 0;
|
|
922
|
+
let pathData;
|
|
923
|
+
if (innerRadius > 0) {
|
|
924
|
+
pathData = [
|
|
925
|
+
`M ${innerX1} ${innerY1}`,
|
|
926
|
+
`L ${x1} ${y1}`,
|
|
927
|
+
`A ${radius} ${radius} 0 ${largeArcFlag} 1 ${x2} ${y2}`,
|
|
928
|
+
`L ${innerX2} ${innerY2}`,
|
|
929
|
+
`A ${innerRadius} ${innerRadius} 0 ${largeArcFlag} 0 ${innerX1} ${innerY1}`,
|
|
930
|
+
"Z"
|
|
931
|
+
].join(" ");
|
|
932
|
+
} else {
|
|
933
|
+
pathData = [
|
|
934
|
+
`M ${centerX} ${centerY}`,
|
|
935
|
+
`L ${x1} ${y1}`,
|
|
936
|
+
`A ${radius} ${radius} 0 ${largeArcFlag} 1 ${x2} ${y2}`,
|
|
937
|
+
"Z"
|
|
938
|
+
].join(" ");
|
|
939
|
+
}
|
|
940
|
+
pathElements.push(
|
|
941
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
942
|
+
"path",
|
|
943
|
+
{
|
|
944
|
+
d: pathData,
|
|
945
|
+
fill: item.color,
|
|
946
|
+
stroke: "white",
|
|
947
|
+
strokeWidth: "3",
|
|
948
|
+
opacity: "0.9",
|
|
949
|
+
className: "hover:opacity-100 cursor-pointer transition-all duration-200 hover:stroke-gray-300",
|
|
950
|
+
style: { filter: "drop-shadow(0 4px 8px rgba(0,0,0,0.15))" }
|
|
951
|
+
},
|
|
952
|
+
`segment-${index}`
|
|
953
|
+
)
|
|
954
|
+
);
|
|
955
|
+
currentAngle += angle;
|
|
956
|
+
});
|
|
957
|
+
const formatCurrency2 = (value) => {
|
|
958
|
+
return `$${value.toLocaleString()}`;
|
|
959
|
+
};
|
|
960
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
961
|
+
"svg",
|
|
962
|
+
{
|
|
963
|
+
width: "700",
|
|
964
|
+
height: "700",
|
|
965
|
+
viewBox: "0 0 700 700",
|
|
966
|
+
className: "w-full h-auto",
|
|
967
|
+
style: { maxWidth: "700px", height: "auto" },
|
|
968
|
+
children: [
|
|
969
|
+
/* @__PURE__ */ jsxRuntime.jsx("title", { children: "Cost Breakdown Chart" }),
|
|
970
|
+
/* @__PURE__ */ jsxRuntime.jsx("g", { children: pathElements }),
|
|
971
|
+
showTotal && /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
|
|
972
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
973
|
+
"text",
|
|
974
|
+
{
|
|
975
|
+
x: 350,
|
|
976
|
+
y: 320,
|
|
977
|
+
textAnchor: "middle",
|
|
978
|
+
dominantBaseline: "central",
|
|
979
|
+
fontSize: "18",
|
|
980
|
+
fontWeight: "600",
|
|
981
|
+
fill: "#64748b",
|
|
982
|
+
fontFamily: "Arial, sans-serif",
|
|
983
|
+
children: "Estimated Impact"
|
|
984
|
+
}
|
|
985
|
+
),
|
|
986
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
987
|
+
"text",
|
|
988
|
+
{
|
|
989
|
+
x: 350,
|
|
990
|
+
y: 380,
|
|
991
|
+
textAnchor: "middle",
|
|
992
|
+
dominantBaseline: "central",
|
|
993
|
+
fontSize: "28",
|
|
994
|
+
fontWeight: "bold",
|
|
995
|
+
fill: "#1e293b",
|
|
996
|
+
fontFamily: "Arial, sans-serif",
|
|
997
|
+
children: formatCurrency2(chartTotal)
|
|
998
|
+
}
|
|
999
|
+
)
|
|
1000
|
+
] })
|
|
1001
|
+
]
|
|
1002
|
+
}
|
|
1003
|
+
) }) });
|
|
1004
|
+
};
|
|
1005
|
+
const FinancialImpact = ({ config, unifiedData }) => {
|
|
1006
|
+
var _a, _b, _c;
|
|
1007
|
+
const getDisplayExecutiveSummary = () => {
|
|
1008
|
+
if (config.executiveSummary) return config.executiveSummary;
|
|
1009
|
+
return getExecutiveSummaryTemplate(config.clientIndustry);
|
|
1010
|
+
};
|
|
1011
|
+
const getIndustryRiskLevel = (industry) => {
|
|
1012
|
+
const highRiskIndustries = [
|
|
1013
|
+
"Healthcare",
|
|
1014
|
+
"Financial Services",
|
|
1015
|
+
"Government"
|
|
1016
|
+
];
|
|
1017
|
+
const mediumRiskIndustries = ["Retail", "Education", "Legal"];
|
|
1018
|
+
if (highRiskIndustries.includes(industry))
|
|
1019
|
+
return {
|
|
1020
|
+
level: "High",
|
|
1021
|
+
color: "text-red-600 bg-red-50"
|
|
1022
|
+
};
|
|
1023
|
+
if (mediumRiskIndustries.includes(industry))
|
|
1024
|
+
return {
|
|
1025
|
+
level: "Medium",
|
|
1026
|
+
color: "text-yellow-600 bg-yellow-50"
|
|
1027
|
+
};
|
|
1028
|
+
return {
|
|
1029
|
+
level: "Moderate",
|
|
1030
|
+
color: "text-green-600 bg-green-50"
|
|
1031
|
+
};
|
|
1032
|
+
};
|
|
1033
|
+
const getIndustryThreats = (industry) => {
|
|
1034
|
+
const industryThreats = {
|
|
1035
|
+
// Snake case mappings (database format)
|
|
1036
|
+
"healthcare": ["Phishing", "Ransomware", "Third Party Breach"],
|
|
1037
|
+
"financial_services": [
|
|
1038
|
+
"Business Email Compromise",
|
|
1039
|
+
"Malware",
|
|
1040
|
+
"Stolen Credentials"
|
|
1041
|
+
],
|
|
1042
|
+
"pharmaceuticals_biotechnology": [
|
|
1043
|
+
"Malicious Insider",
|
|
1044
|
+
"Software Vulnerability",
|
|
1045
|
+
"Third Party Breach"
|
|
1046
|
+
],
|
|
1047
|
+
"technology_software": [
|
|
1048
|
+
"Cloud Misconfiguration",
|
|
1049
|
+
"Software Vulnerability",
|
|
1050
|
+
"Malware"
|
|
1051
|
+
],
|
|
1052
|
+
"education": ["Phishing", "Ransomware", "Social Engineering"],
|
|
1053
|
+
"energy_utilities": [
|
|
1054
|
+
"Malicious Insider",
|
|
1055
|
+
"Ransomware",
|
|
1056
|
+
"Software Vulnerability"
|
|
1057
|
+
],
|
|
1058
|
+
"retail_consumer_goods": ["Stolen Credentials", "Phishing", "Malware"],
|
|
1059
|
+
"manufacturing_industrial": [
|
|
1060
|
+
"Ransomware",
|
|
1061
|
+
"Business Email Compromise",
|
|
1062
|
+
"Software Vulnerability"
|
|
1063
|
+
],
|
|
1064
|
+
"transportation_logistics": [
|
|
1065
|
+
"Ransomware",
|
|
1066
|
+
"Phishing",
|
|
1067
|
+
"Malicious Insider"
|
|
1068
|
+
],
|
|
1069
|
+
"telecommunications": [
|
|
1070
|
+
"Malware",
|
|
1071
|
+
"Software Vulnerability",
|
|
1072
|
+
"Social Engineering"
|
|
1073
|
+
],
|
|
1074
|
+
"media_entertainment": [
|
|
1075
|
+
"Phishing",
|
|
1076
|
+
"Stolen Credentials",
|
|
1077
|
+
"Cloud Misconfiguration"
|
|
1078
|
+
],
|
|
1079
|
+
"hospitality_travel": [
|
|
1080
|
+
"Business Email Compromise",
|
|
1081
|
+
"Phishing",
|
|
1082
|
+
"Ransomware"
|
|
1083
|
+
],
|
|
1084
|
+
"real_estate": [
|
|
1085
|
+
"Business Email Compromise",
|
|
1086
|
+
"Phishing",
|
|
1087
|
+
"Cloud Misconfiguration"
|
|
1088
|
+
],
|
|
1089
|
+
"construction": ["Malware", "Phishing", "Software Vulnerability"],
|
|
1090
|
+
"agriculture_food": ["Ransomware", "Phishing", "Malicious Insider"],
|
|
1091
|
+
"government_public_sector": [
|
|
1092
|
+
"Software Vulnerability",
|
|
1093
|
+
"Phishing",
|
|
1094
|
+
"Third Party Breach"
|
|
1095
|
+
],
|
|
1096
|
+
"legal_services": [
|
|
1097
|
+
"Business Email Compromise",
|
|
1098
|
+
"Stolen Credentials",
|
|
1099
|
+
"Phishing"
|
|
1100
|
+
],
|
|
1101
|
+
"professional_services_consulting": [
|
|
1102
|
+
"Phishing",
|
|
1103
|
+
"Cloud Misconfiguration",
|
|
1104
|
+
"Social Engineering"
|
|
1105
|
+
],
|
|
1106
|
+
"insurance": [
|
|
1107
|
+
"Stolen Credentials",
|
|
1108
|
+
"Business Email Compromise",
|
|
1109
|
+
"Phishing"
|
|
1110
|
+
],
|
|
1111
|
+
"aerospace_defense": [
|
|
1112
|
+
"Malicious Insider",
|
|
1113
|
+
"Third Party Breach",
|
|
1114
|
+
"Software Vulnerability"
|
|
1115
|
+
],
|
|
1116
|
+
// Title case mappings (legacy format)
|
|
1117
|
+
"Healthcare": ["Phishing", "Ransomware", "Third Party Breach"],
|
|
1118
|
+
"Financial Services": [
|
|
1119
|
+
"Business Email Compromise",
|
|
1120
|
+
"Malware",
|
|
1121
|
+
"Stolen Credentials"
|
|
1122
|
+
],
|
|
1123
|
+
"Pharmaceuticals & Biotechnology": [
|
|
1124
|
+
"Malicious Insider",
|
|
1125
|
+
"Software Vulnerability",
|
|
1126
|
+
"Third Party Breach"
|
|
1127
|
+
],
|
|
1128
|
+
"Technology & Software": [
|
|
1129
|
+
"Cloud Misconfiguration",
|
|
1130
|
+
"Software Vulnerability",
|
|
1131
|
+
"Malware"
|
|
1132
|
+
],
|
|
1133
|
+
"Education": ["Phishing", "Ransomware", "Social Engineering"],
|
|
1134
|
+
"Energy & Utilities": [
|
|
1135
|
+
"Malicious Insider",
|
|
1136
|
+
"Ransomware",
|
|
1137
|
+
"Software Vulnerability"
|
|
1138
|
+
],
|
|
1139
|
+
"Retail & Consumer Goods": ["Stolen Credentials", "Phishing", "Malware"],
|
|
1140
|
+
"Manufacturing & Industrial": [
|
|
1141
|
+
"Ransomware",
|
|
1142
|
+
"Business Email Compromise",
|
|
1143
|
+
"Software Vulnerability"
|
|
1144
|
+
],
|
|
1145
|
+
"Transportation & Logistics": [
|
|
1146
|
+
"Ransomware",
|
|
1147
|
+
"Phishing",
|
|
1148
|
+
"Malicious Insider"
|
|
1149
|
+
],
|
|
1150
|
+
"Telecommunications": [
|
|
1151
|
+
"Malware",
|
|
1152
|
+
"Software Vulnerability",
|
|
1153
|
+
"Social Engineering"
|
|
1154
|
+
],
|
|
1155
|
+
"Media & Entertainment": [
|
|
1156
|
+
"Phishing",
|
|
1157
|
+
"Stolen Credentials",
|
|
1158
|
+
"Cloud Misconfiguration"
|
|
1159
|
+
],
|
|
1160
|
+
"Hospitality & Travel": [
|
|
1161
|
+
"Business Email Compromise",
|
|
1162
|
+
"Phishing",
|
|
1163
|
+
"Ransomware"
|
|
1164
|
+
],
|
|
1165
|
+
"Real Estate": [
|
|
1166
|
+
"Business Email Compromise",
|
|
1167
|
+
"Phishing",
|
|
1168
|
+
"Cloud Misconfiguration"
|
|
1169
|
+
],
|
|
1170
|
+
"Construction": ["Malware", "Phishing", "Software Vulnerability"],
|
|
1171
|
+
"Agriculture & Food": ["Ransomware", "Phishing", "Malicious Insider"],
|
|
1172
|
+
"Government & Public Sector": [
|
|
1173
|
+
"Software Vulnerability",
|
|
1174
|
+
"Phishing",
|
|
1175
|
+
"Third Party Breach"
|
|
1176
|
+
],
|
|
1177
|
+
"Legal Services": [
|
|
1178
|
+
"Business Email Compromise",
|
|
1179
|
+
"Stolen Credentials",
|
|
1180
|
+
"Phishing"
|
|
1181
|
+
],
|
|
1182
|
+
"Professional Services & Consulting": [
|
|
1183
|
+
"Phishing",
|
|
1184
|
+
"Cloud Misconfiguration",
|
|
1185
|
+
"Social Engineering"
|
|
1186
|
+
],
|
|
1187
|
+
"Insurance": [
|
|
1188
|
+
"Stolen Credentials",
|
|
1189
|
+
"Business Email Compromise",
|
|
1190
|
+
"Phishing"
|
|
1191
|
+
],
|
|
1192
|
+
"Aerospace & Defense": [
|
|
1193
|
+
"Malicious Insider",
|
|
1194
|
+
"Third Party Breach",
|
|
1195
|
+
"Software Vulnerability"
|
|
1196
|
+
],
|
|
1197
|
+
// Additional legacy mappings
|
|
1198
|
+
"Manufacturing": [
|
|
1199
|
+
"Ransomware",
|
|
1200
|
+
"Business Email Compromise",
|
|
1201
|
+
"Software Vulnerability"
|
|
1202
|
+
],
|
|
1203
|
+
"Legal": ["Business Email Compromise", "Stolen Credentials", "Phishing"],
|
|
1204
|
+
"Retail": ["Stolen Credentials", "Phishing", "Malware"],
|
|
1205
|
+
"Government": [
|
|
1206
|
+
"Software Vulnerability",
|
|
1207
|
+
"Phishing",
|
|
1208
|
+
"Third Party Breach"
|
|
1209
|
+
]
|
|
1210
|
+
};
|
|
1211
|
+
return industryThreats[industry] || [
|
|
1212
|
+
"Phishing Attacks",
|
|
1213
|
+
"Business Email Compromise",
|
|
1214
|
+
"Data Exfiltration"
|
|
1215
|
+
];
|
|
1216
|
+
};
|
|
1217
|
+
const riskLevel = getIndustryRiskLevel(config.clientIndustry);
|
|
1218
|
+
const dynamicCostBreakdown = createCostBreakdownFromSimulation(
|
|
1219
|
+
config.simulationData || {}
|
|
1220
|
+
);
|
|
1221
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
1222
|
+
/* @__PURE__ */ jsxRuntime.jsx("section", { id: "financial-impact", className: "report-page text-center space-y-6 pb-8 border-b border-slate-200", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
|
|
1223
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-4xl font-bold text-slate-900", children: "Cyber Financial Impact Analysis" }),
|
|
1224
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xl text-slate-600", children: "Quantifying Your Organization's Cyber Risk Exposure" })
|
|
1225
|
+
] }) }),
|
|
1226
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "report-page space-y-6", children: [
|
|
1227
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center space-x-3", children: [
|
|
1228
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: "w-6 h-6 text-blue-600" }),
|
|
1229
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1230
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold text-slate-900", children: "Why This Report Matters to You?" }),
|
|
1231
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-600", children: "An overview of your organization's financial cyber risk" })
|
|
1232
|
+
] })
|
|
1233
|
+
] }),
|
|
1234
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "bg-slate-50 rounded-lg p-6", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-700 leading-relaxed", children: getDisplayExecutiveSummary() }) }),
|
|
1235
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-red-600 rounded-lg p-6 text-white text-center", children: [
|
|
1236
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center space-x-2 mb-2", children: [
|
|
1237
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.DollarSign, { className: "w-8 h-8" }),
|
|
1238
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-2xl font-bold", children: "TOTAL POTENTIAL IMPACT" })
|
|
1239
|
+
] }),
|
|
1240
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-4xl font-bold", children: config.totalEstimatedCost ? `${config.totalEstimatedCost}` : formatCurrency(unifiedData.totalCost) }),
|
|
1241
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm opacity-75 mt-2", children: [
|
|
1242
|
+
"Cost Range:",
|
|
1243
|
+
config.costRange || `$${Math.round((parseInt(((_a = config.totalEstimatedCost) == null ? void 0 : _a.replace(/[^0-9]/g, "")) || "0") || unifiedData.totalCost) * 0.75).toLocaleString()} - $${Math.round((parseInt(((_b = config.totalEstimatedCost) == null ? void 0 : _b.replace(/[^0-9]/g, "")) || "0") || unifiedData.totalCost) * 1.5).toLocaleString()}`
|
|
1244
|
+
] })
|
|
1245
|
+
] }),
|
|
1246
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
|
|
1247
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-lg font-semibold text-slate-900", children: "Top Industry Threats" }),
|
|
1248
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4", children: getIndustryThreats(config.clientIndustry).map((threat, index) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1249
|
+
"div",
|
|
1250
|
+
{
|
|
1251
|
+
className: "bg-red-50 border border-red-200 rounded-lg p-4 flex items-center space-x-3",
|
|
1252
|
+
children: [
|
|
1253
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertTriangle, { className: "w-5 h-5 text-red-500" }) }),
|
|
1254
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium text-red-900", children: threat })
|
|
1255
|
+
]
|
|
1256
|
+
},
|
|
1257
|
+
index
|
|
1258
|
+
)) })
|
|
1259
|
+
] }),
|
|
1260
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [
|
|
1261
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
|
|
1262
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-lg font-semibold text-slate-900", children: "Industry Risk Profile" }),
|
|
1263
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
1264
|
+
"div",
|
|
1265
|
+
{
|
|
1266
|
+
className: `inline-flex px-3 py-1 rounded-full text-sm font-medium ${riskLevel.color}`,
|
|
1267
|
+
children: [
|
|
1268
|
+
riskLevel.level,
|
|
1269
|
+
" Risk"
|
|
1270
|
+
]
|
|
1271
|
+
}
|
|
1272
|
+
),
|
|
1273
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-slate-600", children: [
|
|
1274
|
+
config.clientIndustry === "Healthcare" && "Healthcare organizations face elevated cyber risks due to valuable PHI data that commands high prices on dark web markets.",
|
|
1275
|
+
config.clientIndustry === "Financial Services" && "Financial institutions are prime targets due to direct access to funds and sensitive financial data.",
|
|
1276
|
+
config.clientIndustry === "Manufacturing" && "Manufacturing companies face operational technology risks that can halt production and supply chains.",
|
|
1277
|
+
!["Healthcare", "Financial Services", "Manufacturing"].includes(
|
|
1278
|
+
config.clientIndustry
|
|
1279
|
+
) && "Your industry faces specific cyber risks that require tailored protection strategies."
|
|
1280
|
+
] })
|
|
1281
|
+
] }),
|
|
1282
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
|
|
1283
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-lg font-semibold text-slate-900", children: "Key Risk Factors" }),
|
|
1284
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-1", children: getIndustryThreats(config.clientIndustry).map(
|
|
1285
|
+
(threat, index) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center space-x-2", children: [
|
|
1286
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertTriangle, { className: "w-4 h-4 text-red-500" }),
|
|
1287
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: threat })
|
|
1288
|
+
] }, index)
|
|
1289
|
+
) })
|
|
1290
|
+
] })
|
|
1291
|
+
] })
|
|
1292
|
+
] }),
|
|
1293
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "report-page space-y-6 border-t border-slate-200 pt-8", children: [
|
|
1294
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1295
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold text-slate-900 mb-2", children: "Detailed Financial Breakdown" }),
|
|
1296
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-600", children: "Understanding the components of the total potential cost" })
|
|
1297
|
+
] }),
|
|
1298
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-5 gap-8", children: [
|
|
1299
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "lg:col-span-2 space-y-4", children: /* @__PURE__ */ jsxRuntime.jsx("div", { id: "impact-chart", className: "chart-container", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1300
|
+
UnifiedCostBreakdownChart,
|
|
1301
|
+
{
|
|
1302
|
+
costBreakdown: dynamicCostBreakdown,
|
|
1303
|
+
totalCost: parseInt(
|
|
1304
|
+
((_c = config.totalEstimatedCost) == null ? void 0 : _c.replace(/,/g, "")) || "0"
|
|
1305
|
+
) || unifiedData.totalCost
|
|
1306
|
+
}
|
|
1307
|
+
) }) }),
|
|
1308
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-3 space-y-4", children: [
|
|
1309
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-slate-900", children: "Cost Categories" }),
|
|
1310
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-2", children: getIndustrySpecificCosts(
|
|
1311
|
+
config.clientIndustry,
|
|
1312
|
+
dynamicCostBreakdown
|
|
1313
|
+
).map((item, index) => {
|
|
1314
|
+
const costValues = [
|
|
1315
|
+
dynamicCostBreakdown.hard_costs,
|
|
1316
|
+
dynamicCostBreakdown.business_downtime,
|
|
1317
|
+
dynamicCostBreakdown.regulatory_fines,
|
|
1318
|
+
dynamicCostBreakdown.reputation_damage
|
|
1319
|
+
];
|
|
1320
|
+
const dynamicCost = costValues[index] || item.cost;
|
|
1321
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1322
|
+
"div",
|
|
1323
|
+
{
|
|
1324
|
+
className: "bg-white border border-slate-200 rounded-lg p-3",
|
|
1325
|
+
children: [
|
|
1326
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between items-center mb-1", children: [
|
|
1327
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center space-x-2", children: [
|
|
1328
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1329
|
+
"div",
|
|
1330
|
+
{
|
|
1331
|
+
className: "w-3 h-3 rounded-full flex-shrink-0",
|
|
1332
|
+
style: {
|
|
1333
|
+
backgroundColor: item.color
|
|
1334
|
+
}
|
|
1335
|
+
}
|
|
1336
|
+
),
|
|
1337
|
+
/* @__PURE__ */ jsxRuntime.jsx("h5", { className: "font-semibold text-slate-900 text-sm", children: item.category })
|
|
1338
|
+
] }),
|
|
1339
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-right", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-lg font-bold text-slate-900", children: formatCurrency(dynamicCost) }) })
|
|
1340
|
+
] }),
|
|
1341
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-slate-600 leading-tight", children: item.example })
|
|
1342
|
+
]
|
|
1343
|
+
},
|
|
1344
|
+
index
|
|
1345
|
+
);
|
|
1346
|
+
}) })
|
|
1347
|
+
] })
|
|
1348
|
+
] }),
|
|
1349
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [
|
|
1350
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-white border border-slate-200 rounded-lg p-6", children: [
|
|
1351
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-slate-900 mb-4", children: "Attack Scenario" }),
|
|
1352
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3 text-sm", children: [
|
|
1353
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between", children: [
|
|
1354
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-600", children: "Breach Type:" }),
|
|
1355
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-right", children: config.breachType })
|
|
1356
|
+
] }),
|
|
1357
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between", children: [
|
|
1358
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-600", children: "Industry:" }),
|
|
1359
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-right", children: config.clientIndustry })
|
|
1360
|
+
] }),
|
|
1361
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between", children: [
|
|
1362
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-600", children: "Records at Risk:" }),
|
|
1363
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-right", children: config.recordsAtRisk ? parseInt(config.recordsAtRisk).toLocaleString() : unifiedData.recordCount.toLocaleString() })
|
|
1364
|
+
] }),
|
|
1365
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between", children: [
|
|
1366
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-600", children: "% Breached:" }),
|
|
1367
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-medium text-right", children: [
|
|
1368
|
+
config.percentageBreached,
|
|
1369
|
+
"%"
|
|
1370
|
+
] })
|
|
1371
|
+
] })
|
|
1372
|
+
] })
|
|
1373
|
+
] }),
|
|
1374
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-white border border-slate-200 rounded-lg p-6", children: [
|
|
1375
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-slate-900 mb-4", children: "Business Impact" }),
|
|
1376
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3 text-sm", children: [
|
|
1377
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between", children: [
|
|
1378
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-600", children: "Records Affected:" }),
|
|
1379
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-right", children: config.recordsAffected ? parseInt(config.recordsAffected).toLocaleString() : Math.round(
|
|
1380
|
+
unifiedData.recordCount * (parseInt(config.percentageBreached) / 100)
|
|
1381
|
+
).toLocaleString() })
|
|
1382
|
+
] }),
|
|
1383
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between", children: [
|
|
1384
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-600", children: "Downtime Duration:" }),
|
|
1385
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-medium text-right", children: [
|
|
1386
|
+
config.downtimeHours || unifiedData.hoursDown,
|
|
1387
|
+
"h"
|
|
1388
|
+
] })
|
|
1389
|
+
] }),
|
|
1390
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between", children: [
|
|
1391
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-600", children: "Cost per Hour:" }),
|
|
1392
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-right", children: formatCurrency(
|
|
1393
|
+
parseInt(config.downtimeCostPerHour) || unifiedData.hourlyDowntimeCost
|
|
1394
|
+
) })
|
|
1395
|
+
] }),
|
|
1396
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between", children: [
|
|
1397
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-600", children: "Total Downtime Cost:" }),
|
|
1398
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-right", children: config.totalDowntimeCost ? `$${config.totalDowntimeCost}` : formatCurrency(unifiedData.businessDowntime) })
|
|
1399
|
+
] })
|
|
1400
|
+
] })
|
|
1401
|
+
] })
|
|
1402
|
+
] })
|
|
1403
|
+
] }),
|
|
1404
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "report-page space-y-4 border-t border-slate-200 pt-8", children: [
|
|
1405
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold text-slate-900", children: "Recommendations to Reduce Risk" }),
|
|
1406
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "w-full caption-bottom text-sm", children: [
|
|
1407
|
+
/* @__PURE__ */ jsxRuntime.jsx("thead", { className: "border-b", children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "border-b transition-colors hover:bg-muted/50", children: [
|
|
1408
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "h-10 px-2 text-left align-middle font-medium text-muted-foreground w-12", children: "#" }),
|
|
1409
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "h-10 px-2 text-left align-middle font-medium text-muted-foreground w-1/4", children: "Title" }),
|
|
1410
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "h-10 px-2 text-left align-middle font-medium text-muted-foreground w-1/3", children: "Problem" }),
|
|
1411
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { className: "h-10 px-2 text-left align-middle font-medium text-muted-foreground w-1/3", children: "Solution" })
|
|
1412
|
+
] }) }),
|
|
1413
|
+
/* @__PURE__ */ jsxRuntime.jsx("tbody", { children: config.recommendations.map((rec, index) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1414
|
+
"tr",
|
|
1415
|
+
{
|
|
1416
|
+
className: "border-b transition-colors hover:bg-muted/50",
|
|
1417
|
+
children: [
|
|
1418
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "p-2 align-top", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-6 h-6 bg-blue-600 text-white rounded-full flex items-center justify-center text-xs font-bold", children: index + 1 }) }),
|
|
1419
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "p-2 align-top", children: /* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-sm font-semibold text-slate-900 leading-tight", children: rec.title }) }),
|
|
1420
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "p-2 align-top", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-slate-700 leading-tight", children: rec.problem }) }),
|
|
1421
|
+
/* @__PURE__ */ jsxRuntime.jsxs("td", { className: "p-2 align-top", children: [
|
|
1422
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-slate-700 leading-tight", children: rec.solution }),
|
|
1423
|
+
rec.analogy && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs text-slate-600 italic mt-1 leading-tight", children: [
|
|
1424
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: "Think of it this way:" }),
|
|
1425
|
+
" ",
|
|
1426
|
+
rec.analogy
|
|
1427
|
+
] })
|
|
1428
|
+
] })
|
|
1429
|
+
]
|
|
1430
|
+
},
|
|
1431
|
+
rec.id
|
|
1432
|
+
)) })
|
|
1433
|
+
] }) })
|
|
1434
|
+
] }),
|
|
1435
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "report-page space-y-6 border-t border-slate-200 pt-8", children: [
|
|
1436
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1437
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold text-slate-900 mb-2", children: "Proposed Next Steps" }),
|
|
1438
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-600", children: "Taking action on these findings is critical to reducing your organization's cyber risk exposure and potential financial impact." })
|
|
1439
|
+
] }),
|
|
1440
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [
|
|
1441
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border border-slate-200 rounded-lg p-6 space-y-3", children: [
|
|
1442
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-slate-900", children: "Breach Likelihood Assessment" }),
|
|
1443
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-slate-600", children: "Evaluate your current security posture and identify the most probable attack vectors targeting your organization." })
|
|
1444
|
+
] }),
|
|
1445
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border border-slate-200 rounded-lg p-6 space-y-3", children: [
|
|
1446
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-slate-900", children: "Cyber Insurance Health Score" }),
|
|
1447
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-slate-600", children: "Assess your readiness for cyber insurance coverage and identify gaps that could affect your policy." })
|
|
1448
|
+
] })
|
|
1449
|
+
] }),
|
|
1450
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-blue-50 border border-blue-200 rounded-lg p-6 text-center", children: [
|
|
1451
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-slate-900 mb-2", children: "Schedule Your Strategy Session" }),
|
|
1452
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-600 mb-4", children: "Let's discuss these findings and develop a customized cybersecurity roadmap for your organization." }),
|
|
1453
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-slate-600", children: [
|
|
1454
|
+
"Contact us at:",
|
|
1455
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-slate-900" })
|
|
1456
|
+
] })
|
|
1457
|
+
] })
|
|
1458
|
+
] }),
|
|
1459
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "report-page space-y-6 border-t border-slate-200 pt-8", children: [
|
|
1460
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center space-x-3", children: [
|
|
1461
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-8 h-8 bg-blue-600 rounded-lg flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-white text-lg", children: "?" }) }),
|
|
1462
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1463
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold text-slate-900", children: "Understanding Your Risk Analysis" }),
|
|
1464
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-600", children: "Methodology and important information about this assessment" })
|
|
1465
|
+
] })
|
|
1466
|
+
] }),
|
|
1467
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-6", children: [
|
|
1468
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-slate-50 rounded-lg p-6", children: [
|
|
1469
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-slate-900 mb-4", children: "How We Calculate Risk Impact" }),
|
|
1470
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-700 mb-4", children: "This Financial Impact Analysis is built on industry-standard breach cost modeling frameworks, taking into account factors like:" }),
|
|
1471
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [
|
|
1472
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "text-sm text-slate-700 space-y-1", children: [
|
|
1473
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• Industry sector" }),
|
|
1474
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• Company size" }),
|
|
1475
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• Type of data compromised" }),
|
|
1476
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• Threat vector (e.g., phishing, ransomware)" }),
|
|
1477
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• Regional regulatory requirements" })
|
|
1478
|
+
] }) }),
|
|
1479
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1480
|
+
/* @__PURE__ */ jsxRuntime.jsx("h5", { className: "font-medium text-slate-900 mb-2", children: "Cost estimates include both direct and indirect expenses, such as:" }),
|
|
1481
|
+
/* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "text-sm text-slate-700 space-y-1", children: [
|
|
1482
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• Business interruption" }),
|
|
1483
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• Investigation and legal expenses" }),
|
|
1484
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• Customer notification and credit monitoring" }),
|
|
1485
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• Regulatory fines and penalties" }),
|
|
1486
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• Reputational damage and PR costs" })
|
|
1487
|
+
] })
|
|
1488
|
+
] })
|
|
1489
|
+
] })
|
|
1490
|
+
] }),
|
|
1491
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-slate-50 rounded-lg p-6", children: [
|
|
1492
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-slate-900 mb-4", children: "Threat Mapping by Industry" }),
|
|
1493
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-700 mb-4", children: "Threat types are matched to each industry using trend data from leading global reports and government advisories, including:" }),
|
|
1494
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [
|
|
1495
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "text-sm text-slate-700 space-y-1", children: [
|
|
1496
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• Verizon Data Breach Investigations Report (DBIR)" }),
|
|
1497
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• IBM X-Force Threat Intelligence Index" }),
|
|
1498
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• ENISA Threat Landscape Report" })
|
|
1499
|
+
] }) }),
|
|
1500
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "text-sm text-slate-700 space-y-1", children: [
|
|
1501
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• CISA Sector-Specific Threat Alerts" }),
|
|
1502
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• ThreatCaptain internal incident modeling" })
|
|
1503
|
+
] }) })
|
|
1504
|
+
] }),
|
|
1505
|
+
/* @__PURE__ */ jsxRuntime.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." })
|
|
1506
|
+
] }),
|
|
1507
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-yellow-50 border border-yellow-200 rounded-lg p-6", children: [
|
|
1508
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-slate-900 mb-2", children: "Important Notes" }),
|
|
1509
|
+
/* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "text-slate-700 space-y-2", children: [
|
|
1510
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-2", children: [
|
|
1511
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-yellow-600 mt-1", children: "•" }),
|
|
1512
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "This analysis is based on industry norms and common threat patterns." })
|
|
1513
|
+
] }),
|
|
1514
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-2", children: [
|
|
1515
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-yellow-600 mt-1", children: "•" }),
|
|
1516
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Actual breach outcomes and costs may vary based on the event's scope and response quality." })
|
|
1517
|
+
] }),
|
|
1518
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-2", children: [
|
|
1519
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-yellow-600 mt-1", children: "•" }),
|
|
1520
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "This report is intended to guide investment and preparedness—not to predict specific future events." })
|
|
1521
|
+
] })
|
|
1522
|
+
] })
|
|
1523
|
+
] })
|
|
1524
|
+
] })
|
|
1525
|
+
] }),
|
|
1526
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "report-page space-y-6 border-t border-slate-200 pt-8", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center space-x-3", children: [
|
|
1527
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-8 h-8 bg-gray-600 rounded-lg flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: "w-5 h-5 text-white" }) }),
|
|
1528
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1529
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold text-slate-900", children: "Important Disclaimer" }),
|
|
1530
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-600", children: "Legal limitations and professional guidance" })
|
|
1531
|
+
] })
|
|
1532
|
+
] }) }),
|
|
1533
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-t border-slate-200 pt-4 text-center text-xs text-slate-500", children: /* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
|
|
1534
|
+
"Powered by ThreatCaptain • Generated on",
|
|
1535
|
+
" ",
|
|
1536
|
+
(/* @__PURE__ */ new Date()).toLocaleDateString()
|
|
1537
|
+
] }) })
|
|
1538
|
+
] });
|
|
1539
|
+
};
|
|
1540
|
+
const ASSESSMENT_CATEGORIES = {
|
|
1541
|
+
"Access Control": {
|
|
1542
|
+
totalWeight: 45,
|
|
1543
|
+
questions: [
|
|
1544
|
+
{ id: "mfa_enabled", weight: 20, question: "MFA enabled" },
|
|
1545
|
+
{ id: "admin_accounts", weight: 15, question: "Admin account management" },
|
|
1546
|
+
{ id: "password_policy", weight: 10, question: "Password policy" }
|
|
1547
|
+
]
|
|
1548
|
+
},
|
|
1549
|
+
"Data Protection": {
|
|
1550
|
+
totalWeight: 55,
|
|
1551
|
+
questions: [
|
|
1552
|
+
{ id: "data_backup", weight: 25, question: "Data backup" },
|
|
1553
|
+
{ id: "data_encryption", weight: 20, question: "Data encryption" },
|
|
1554
|
+
{ id: "data_classification", weight: 10, question: "Data classification" }
|
|
1555
|
+
]
|
|
1556
|
+
},
|
|
1557
|
+
"System Security": {
|
|
1558
|
+
totalWeight: 55,
|
|
1559
|
+
questions: [
|
|
1560
|
+
{ id: "patch_mgmt", weight: 25, question: "Patch management" },
|
|
1561
|
+
{ id: "antivirus", weight: 15, question: "Antivirus protection" },
|
|
1562
|
+
{ id: "network_security", weight: 15, question: "Network security" }
|
|
1563
|
+
]
|
|
1564
|
+
},
|
|
1565
|
+
"Incident Response": {
|
|
1566
|
+
totalWeight: 55,
|
|
1567
|
+
questions: [
|
|
1568
|
+
{ id: "incident_plan", weight: 20, question: "Incident response plan" },
|
|
1569
|
+
{ id: "security_monitoring", weight: 25, question: "Security monitoring" },
|
|
1570
|
+
{ id: "vendor_mgmt", weight: 10, question: "Vendor management" }
|
|
1571
|
+
]
|
|
1572
|
+
},
|
|
1573
|
+
"Training & Governance": {
|
|
1574
|
+
totalWeight: 25,
|
|
1575
|
+
questions: [
|
|
1576
|
+
{ id: "employee_training", weight: 15, question: "Employee training" },
|
|
1577
|
+
{ id: "security_policies", weight: 10, question: "Security policies" }
|
|
1578
|
+
]
|
|
1579
|
+
},
|
|
1580
|
+
"Insurance Readiness": {
|
|
1581
|
+
totalWeight: 15,
|
|
1582
|
+
questions: [
|
|
1583
|
+
{ id: "cyber_insurance", weight: 15, question: "Cyber insurance coverage" }
|
|
1584
|
+
]
|
|
1585
|
+
}
|
|
1586
|
+
};
|
|
1587
|
+
const getScoreCategory = (score) => {
|
|
1588
|
+
if (score >= 750) return "excellent";
|
|
1589
|
+
if (score >= 650) return "good";
|
|
1590
|
+
if (score >= 550) return "fair";
|
|
1591
|
+
return "poor";
|
|
1592
|
+
};
|
|
1593
|
+
const getSecurityDomains = (responses) => {
|
|
1594
|
+
const domains = [];
|
|
1595
|
+
Object.entries(ASSESSMENT_CATEGORIES).forEach(([categoryName, categoryConfig]) => {
|
|
1596
|
+
let categoryActualPoints = 0;
|
|
1597
|
+
const categoryTotalWeight = categoryConfig.totalWeight;
|
|
1598
|
+
categoryConfig.questions.forEach((question) => {
|
|
1599
|
+
const response = responses[question.id];
|
|
1600
|
+
let points = 0;
|
|
1601
|
+
if (response === "yes") {
|
|
1602
|
+
points = question.weight;
|
|
1603
|
+
} else if (response === "partial") {
|
|
1604
|
+
points = question.weight * 0.5;
|
|
1605
|
+
}
|
|
1606
|
+
categoryActualPoints += points;
|
|
1607
|
+
});
|
|
1608
|
+
const percentage = categoryActualPoints / categoryTotalWeight * 100;
|
|
1609
|
+
domains.push({
|
|
1610
|
+
name: categoryName,
|
|
1611
|
+
score: categoryActualPoints,
|
|
1612
|
+
maxScore: categoryTotalWeight,
|
|
1613
|
+
percentage,
|
|
1614
|
+
progressColor: getProgressBarColor(percentage),
|
|
1615
|
+
displayScore: `${categoryActualPoints}/${categoryTotalWeight}`
|
|
1616
|
+
});
|
|
1617
|
+
});
|
|
1618
|
+
return domains;
|
|
1619
|
+
};
|
|
1620
|
+
const getProgressBarColor = (percentage) => {
|
|
1621
|
+
if (percentage >= 80) return "bg-green-500";
|
|
1622
|
+
if (percentage >= 60) return "bg-yellow-500";
|
|
1623
|
+
return "bg-red-500";
|
|
1624
|
+
};
|
|
1625
|
+
const InsuranceHealthGauge = ({
|
|
1626
|
+
score,
|
|
1627
|
+
maxScore = 850,
|
|
1628
|
+
size = 300
|
|
1629
|
+
}) => {
|
|
1630
|
+
const minScore = 350;
|
|
1631
|
+
const normalizedScore = Math.max(minScore, Math.min(maxScore, score));
|
|
1632
|
+
const percentage = (normalizedScore - minScore) / (maxScore - minScore);
|
|
1633
|
+
const getScoreCategory2 = (score2) => {
|
|
1634
|
+
if (score2 >= 750) return { category: "Excellent", color: "#059669", bgColor: "#dcfce7" };
|
|
1635
|
+
if (score2 >= 650) return { category: "Good", color: "#10b981", bgColor: "#ecfdf5" };
|
|
1636
|
+
if (score2 >= 550) return { category: "Fair", color: "#f59e0b", bgColor: "#fefbeb" };
|
|
1637
|
+
return { category: "Poor", color: "#ef4444", bgColor: "#fef2f2" };
|
|
1638
|
+
};
|
|
1639
|
+
const scoreInfo = getScoreCategory2(normalizedScore);
|
|
1640
|
+
const startAngle = -210;
|
|
1641
|
+
const endAngle = 30;
|
|
1642
|
+
const totalArc = 240;
|
|
1643
|
+
const needleAngle = startAngle + percentage * totalArc;
|
|
1644
|
+
const radius = size / 2 - 55;
|
|
1645
|
+
const centerX = size / 2;
|
|
1646
|
+
const centerY = size / 2 + 8;
|
|
1647
|
+
const strokeWidth = 14;
|
|
1648
|
+
const degToRad = (deg) => deg * Math.PI / 180;
|
|
1649
|
+
const createArcPath = (startAngle2, endAngle2, radius2) => {
|
|
1650
|
+
const startX = centerX + radius2 * Math.cos(degToRad(startAngle2));
|
|
1651
|
+
const startY = centerY + radius2 * Math.sin(degToRad(startAngle2));
|
|
1652
|
+
const endX = centerX + radius2 * Math.cos(degToRad(endAngle2));
|
|
1653
|
+
const endY = centerY + radius2 * Math.sin(degToRad(endAngle2));
|
|
1654
|
+
const largeArcFlag = endAngle2 - startAngle2 > 180 ? 1 : 0;
|
|
1655
|
+
return `M ${startX} ${startY} A ${radius2} ${radius2} 0 ${largeArcFlag} 1 ${endX} ${endY}`;
|
|
1656
|
+
};
|
|
1657
|
+
const segments = [
|
|
1658
|
+
{ start: 350, end: 450, color: "#ef4444", label: "Poor" },
|
|
1659
|
+
// Red
|
|
1660
|
+
{ start: 450, end: 550, color: "#f97316", label: "Below Average" },
|
|
1661
|
+
// Orange
|
|
1662
|
+
{ start: 550, end: 625, color: "#f59e0b", label: "Fair" },
|
|
1663
|
+
// Yellow
|
|
1664
|
+
{ start: 625, end: 700, color: "#3b82f6", label: "Good" },
|
|
1665
|
+
// Blue
|
|
1666
|
+
{ start: 700, end: 775, color: "#10b981", label: "Very Good" },
|
|
1667
|
+
// Light Green
|
|
1668
|
+
{ start: 775, end: 850, color: "#059669", label: "Excellent" }
|
|
1669
|
+
// Dark Green
|
|
1670
|
+
];
|
|
1671
|
+
const tickMarks = [350, 450, 550, 625, 700, 775, 850];
|
|
1672
|
+
const needleLength = radius - 10;
|
|
1673
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center space-y-6", children: [
|
|
1674
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
|
|
1675
|
+
/* @__PURE__ */ jsxRuntime.jsxs("svg", { width: size, height: size * 0.8, className: "overflow-visible", children: [
|
|
1676
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1677
|
+
"path",
|
|
1678
|
+
{
|
|
1679
|
+
d: createArcPath(startAngle, endAngle, radius),
|
|
1680
|
+
stroke: "#e5e7eb",
|
|
1681
|
+
strokeWidth,
|
|
1682
|
+
fill: "none",
|
|
1683
|
+
strokeLinecap: "round"
|
|
1684
|
+
}
|
|
1685
|
+
),
|
|
1686
|
+
segments.map((segment, index) => {
|
|
1687
|
+
const segmentStartAngle = startAngle + (segment.start - minScore) / (maxScore - minScore) * totalArc;
|
|
1688
|
+
const segmentEndAngle = startAngle + (segment.end - minScore) / (maxScore - minScore) * totalArc;
|
|
1689
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1690
|
+
"path",
|
|
1691
|
+
{
|
|
1692
|
+
d: createArcPath(segmentStartAngle, segmentEndAngle, radius),
|
|
1693
|
+
stroke: segment.color,
|
|
1694
|
+
strokeWidth,
|
|
1695
|
+
fill: "none",
|
|
1696
|
+
strokeLinecap: "round",
|
|
1697
|
+
opacity: "0.8"
|
|
1698
|
+
},
|
|
1699
|
+
`segment-${index}`
|
|
1700
|
+
);
|
|
1701
|
+
}),
|
|
1702
|
+
tickMarks.map((tickValue, index) => {
|
|
1703
|
+
const tickAngle = startAngle + (tickValue - minScore) / (maxScore - minScore) * totalArc;
|
|
1704
|
+
const tickInnerRadius = radius - strokeWidth / 2 - 5;
|
|
1705
|
+
const tickOuterRadius = radius + strokeWidth / 2 + 5;
|
|
1706
|
+
const labelRadius = radius + strokeWidth / 2 + 22;
|
|
1707
|
+
const tickInnerX = centerX + tickInnerRadius * Math.cos(degToRad(tickAngle));
|
|
1708
|
+
const tickInnerY = centerY + tickInnerRadius * Math.sin(degToRad(tickAngle));
|
|
1709
|
+
const tickOuterX = centerX + tickOuterRadius * Math.cos(degToRad(tickAngle));
|
|
1710
|
+
const tickOuterY = centerY + tickOuterRadius * Math.sin(degToRad(tickAngle));
|
|
1711
|
+
const labelX = centerX + labelRadius * Math.cos(degToRad(tickAngle));
|
|
1712
|
+
const labelY = centerY + labelRadius * Math.sin(degToRad(tickAngle));
|
|
1713
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
|
|
1714
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1715
|
+
"line",
|
|
1716
|
+
{
|
|
1717
|
+
x1: tickInnerX,
|
|
1718
|
+
y1: tickInnerY,
|
|
1719
|
+
x2: tickOuterX,
|
|
1720
|
+
y2: tickOuterY,
|
|
1721
|
+
stroke: "#6b7280",
|
|
1722
|
+
strokeWidth: "2"
|
|
1723
|
+
}
|
|
1724
|
+
),
|
|
1725
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1726
|
+
"text",
|
|
1727
|
+
{
|
|
1728
|
+
x: labelX,
|
|
1729
|
+
y: labelY + 4,
|
|
1730
|
+
textAnchor: "middle",
|
|
1731
|
+
className: "text-xs font-medium fill-slate-600",
|
|
1732
|
+
children: tickValue
|
|
1733
|
+
}
|
|
1734
|
+
)
|
|
1735
|
+
] }, `tick-${index}`);
|
|
1736
|
+
}),
|
|
1737
|
+
/* @__PURE__ */ jsxRuntime.jsx("g", { className: "transition-all duration-1000 ease-out", style: { transformOrigin: `${centerX}px ${centerY}px` }, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1738
|
+
"polygon",
|
|
1739
|
+
{
|
|
1740
|
+
points: `${centerX},${centerY - 6} ${centerX + needleLength - 15},${centerY} ${centerX},${centerY + 6} ${centerX - 15},${centerY}`,
|
|
1741
|
+
fill: "#1f2937",
|
|
1742
|
+
transform: `rotate(${needleAngle} ${centerX} ${centerY})`,
|
|
1743
|
+
className: "transition-transform duration-1000 ease-out"
|
|
1744
|
+
}
|
|
1745
|
+
) }),
|
|
1746
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1747
|
+
"circle",
|
|
1748
|
+
{
|
|
1749
|
+
cx: centerX,
|
|
1750
|
+
cy: centerY,
|
|
1751
|
+
r: "10",
|
|
1752
|
+
fill: "#1f2937"
|
|
1753
|
+
}
|
|
1754
|
+
),
|
|
1755
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1756
|
+
"circle",
|
|
1757
|
+
{
|
|
1758
|
+
cx: centerX,
|
|
1759
|
+
cy: centerY,
|
|
1760
|
+
r: "6",
|
|
1761
|
+
fill: "#374151"
|
|
1762
|
+
}
|
|
1763
|
+
)
|
|
1764
|
+
] }),
|
|
1765
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0 flex flex-col items-center justify-center mt-44", children: [
|
|
1766
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1767
|
+
"div",
|
|
1768
|
+
{
|
|
1769
|
+
className: "text-3xl font-bold mb-1",
|
|
1770
|
+
style: { color: scoreInfo.color },
|
|
1771
|
+
children: normalizedScore
|
|
1772
|
+
}
|
|
1773
|
+
),
|
|
1774
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs text-slate-600 font-medium", children: "Insurance Health Score" })
|
|
1775
|
+
] })
|
|
1776
|
+
] }),
|
|
1777
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1778
|
+
"div",
|
|
1779
|
+
{
|
|
1780
|
+
className: "inline-flex items-center px-6 py-2 rounded-full text-sm font-semibold",
|
|
1781
|
+
style: {
|
|
1782
|
+
backgroundColor: scoreInfo.bgColor,
|
|
1783
|
+
color: scoreInfo.color,
|
|
1784
|
+
border: `1px solid ${scoreInfo.color}40`
|
|
1785
|
+
},
|
|
1786
|
+
children: scoreInfo.category
|
|
1787
|
+
}
|
|
1788
|
+
) })
|
|
1789
|
+
] });
|
|
1790
|
+
};
|
|
1791
|
+
const InsuranceHealthScore = ({ config }) => {
|
|
1792
|
+
var _a;
|
|
1793
|
+
const hasAssessmentData = config.assessmentData && config.assessmentData.responses && Object.keys(config.assessmentData.responses).length > 0;
|
|
1794
|
+
const score = hasAssessmentData ? config.insuranceHealthScore || 650 : null;
|
|
1795
|
+
const scoreCategory = score ? getScoreCategory(score) : null;
|
|
1796
|
+
const scoreCategoryData = typeof scoreCategory === "string" ? {
|
|
1797
|
+
category: scoreCategory,
|
|
1798
|
+
description: "Insurance readiness assessment",
|
|
1799
|
+
bgColor: "bg-blue-600"
|
|
1800
|
+
} : scoreCategory;
|
|
1801
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
1802
|
+
/* @__PURE__ */ jsxRuntime.jsx("section", { id: "insurance-health-score", className: "report-page text-center space-y-6 pb-8 border-b border-slate-200", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
|
|
1803
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-4xl font-bold text-slate-900", children: "Cyber Insurance Health Score Report" }),
|
|
1804
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xl text-slate-600", children: "Understanding How Insurance Companies View Your Organization" })
|
|
1805
|
+
] }) }),
|
|
1806
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "report-page space-y-6", children: [
|
|
1807
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center space-x-3", children: [
|
|
1808
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: "w-6 h-6 text-blue-600" }),
|
|
1809
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1810
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold text-slate-900", children: "Why Cyber Insurance Health Matters" }),
|
|
1811
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-600", children: "Understanding your organization's insurance readiness" })
|
|
1812
|
+
] })
|
|
1813
|
+
] }),
|
|
1814
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "bg-slate-50 rounded-lg p-6 space-y-4", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-700 leading-relaxed", children: config.executiveSummary || `Think of this like checking your credit score before applying for a business loan. Just as your credit score determines whether banks will lend to you and at what rates, your cybersecurity "credit score" determines whether insurance companies will protect you when cybercriminals attack your business. Here's what most business owners don't realize: cyber insurance is rapidly becoming a business necessity. One ransomware attack can shut down your business for weeks and cost hundreds of thousands in recovery. Many of your clients and partners may soon require you to carry cyber insurance, and insurance companies are getting pickier about who they'll cover and how much they'll charge. This assessment shows you exactly where you stand in the insurance companies' eyes, so you can either improve your "cybersecurity credit score" to get better rates, or at least know what to expect when shopping for coverage.` }) }),
|
|
1815
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
1816
|
+
"div",
|
|
1817
|
+
{
|
|
1818
|
+
className: `rounded-lg p-6 text-white text-center ${hasAssessmentData ? scoreCategoryData.bgColor : "bg-slate-500"}`,
|
|
1819
|
+
children: [
|
|
1820
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center space-x-2 mb-2", children: [
|
|
1821
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-8 h-8 rounded-full bg-white/20 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-lg font-bold", children: hasAssessmentData ? score : "N/A" }) }),
|
|
1822
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-2xl font-bold", children: "INSURANCE HEALTH SCORE" })
|
|
1823
|
+
] }),
|
|
1824
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-4xl font-bold", children: hasAssessmentData ? `${score}/850` : "Not Available" }),
|
|
1825
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-lg font-semibold mt-2", children: hasAssessmentData ? scoreCategoryData.category : "Assessment Required" }),
|
|
1826
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm opacity-75 mt-1", children: hasAssessmentData ? scoreCategoryData.description : "Complete the insurance health assessment to view your score" })
|
|
1827
|
+
]
|
|
1828
|
+
}
|
|
1829
|
+
),
|
|
1830
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [
|
|
1831
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
|
|
1832
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-lg font-semibold text-slate-900", children: "Coverage Impact" }),
|
|
1833
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
|
|
1834
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start space-x-2", children: [
|
|
1835
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertTriangle, { className: "w-4 h-4 text-blue-500 mt-1" }),
|
|
1836
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-medium text-sm", children: "Premium Rates" }) })
|
|
1837
|
+
] }),
|
|
1838
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start space-x-2", children: [
|
|
1839
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertTriangle, { className: "w-4 h-4 text-blue-500 mt-1" }),
|
|
1840
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-medium text-sm", children: "Coverage Availability" }) })
|
|
1841
|
+
] }),
|
|
1842
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start space-x-2", children: [
|
|
1843
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertTriangle, { className: "w-4 h-4 text-blue-500 mt-1" }),
|
|
1844
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-medium text-sm", children: "Risk Evaluation" }) })
|
|
1845
|
+
] })
|
|
1846
|
+
] })
|
|
1847
|
+
] }),
|
|
1848
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
|
|
1849
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-lg font-semibold text-slate-900", children: "Things to Consider" }),
|
|
1850
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
|
|
1851
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center space-x-2", children: [
|
|
1852
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertTriangle, { className: "w-4 h-4 text-amber-500" }),
|
|
1853
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: "Cyber insurance rates are directly tied to your security posture" })
|
|
1854
|
+
] }),
|
|
1855
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center space-x-2", children: [
|
|
1856
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertTriangle, { className: "w-4 h-4 text-amber-500" }),
|
|
1857
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: "Insurers are increasingly requiring security controls" })
|
|
1858
|
+
] }),
|
|
1859
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center space-x-2", children: [
|
|
1860
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertTriangle, { className: "w-4 h-4 text-amber-500" }),
|
|
1861
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: "Claims approval depends on documented security measures" })
|
|
1862
|
+
] })
|
|
1863
|
+
] })
|
|
1864
|
+
] })
|
|
1865
|
+
] })
|
|
1866
|
+
] }),
|
|
1867
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "report-page space-y-6 border-t border-slate-200 pt-8", children: [
|
|
1868
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1869
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold text-slate-900 mb-2", children: "Your Insurance Health Score Results" }),
|
|
1870
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-600", children: "Assessment results and category breakdown" })
|
|
1871
|
+
] }),
|
|
1872
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-5 gap-8", children: [
|
|
1873
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-3 flex flex-col items-center space-y-4", children: [
|
|
1874
|
+
hasAssessmentData ? /* @__PURE__ */ jsxRuntime.jsx(InsuranceHealthGauge, { score, size: 320 }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
1875
|
+
"div",
|
|
1876
|
+
{
|
|
1877
|
+
className: "flex flex-col items-center justify-center space-y-4",
|
|
1878
|
+
style: { height: "320px" },
|
|
1879
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center space-y-2", children: [
|
|
1880
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-6xl font-bold text-slate-400", children: "N/A" }),
|
|
1881
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-lg font-semibold text-slate-600", children: "Not Available" }),
|
|
1882
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-slate-500 max-w-xs", children: "Complete the insurance health assessment to view your score gauge" })
|
|
1883
|
+
] })
|
|
1884
|
+
}
|
|
1885
|
+
),
|
|
1886
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center" })
|
|
1887
|
+
] }),
|
|
1888
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-2 space-y-4", children: [
|
|
1889
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-slate-900", children: "Security Category Scores" }),
|
|
1890
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: (() => {
|
|
1891
|
+
if (config.assessmentData && config.assessmentData.responses) {
|
|
1892
|
+
const domains = getSecurityDomains(
|
|
1893
|
+
config.assessmentData.responses
|
|
1894
|
+
);
|
|
1895
|
+
return domains.map((domain, index) => {
|
|
1896
|
+
let statusPill = "";
|
|
1897
|
+
let statusClass = "";
|
|
1898
|
+
const percentage = domain.percentage || 0;
|
|
1899
|
+
if (percentage === 0) {
|
|
1900
|
+
statusPill = "FAIL";
|
|
1901
|
+
statusClass = "bg-red-500 text-white";
|
|
1902
|
+
} else if (percentage === 100) {
|
|
1903
|
+
statusPill = "PASS";
|
|
1904
|
+
statusClass = "bg-green-500 text-white";
|
|
1905
|
+
} else {
|
|
1906
|
+
statusPill = "NEEDS IMPROVEMENT";
|
|
1907
|
+
statusClass = "bg-yellow-600 text-white";
|
|
1908
|
+
}
|
|
1909
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1910
|
+
"div",
|
|
1911
|
+
{
|
|
1912
|
+
className: "bg-white border border-slate-200 rounded-lg p-4",
|
|
1913
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between items-center", children: [
|
|
1914
|
+
/* @__PURE__ */ jsxRuntime.jsx("h5", { className: "font-medium text-slate-900 text-sm", children: domain.name }),
|
|
1915
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-right", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1916
|
+
"span",
|
|
1917
|
+
{
|
|
1918
|
+
className: `inline-block px-3 py-1 rounded-full text-xs font-semibold uppercase tracking-wider ${statusClass}`,
|
|
1919
|
+
children: statusPill
|
|
1920
|
+
}
|
|
1921
|
+
) })
|
|
1922
|
+
] })
|
|
1923
|
+
},
|
|
1924
|
+
index
|
|
1925
|
+
);
|
|
1926
|
+
});
|
|
1927
|
+
} else {
|
|
1928
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "bg-slate-50 border border-slate-200 rounded-lg p-6 text-center", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-600 text-sm", children: "No assessment data available for this client. Please complete a security assessment to see category scores." }) });
|
|
1929
|
+
}
|
|
1930
|
+
})() })
|
|
1931
|
+
] })
|
|
1932
|
+
] })
|
|
1933
|
+
] }),
|
|
1934
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "report-page space-y-6 border-t border-slate-200 pt-8", children: [
|
|
1935
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1936
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold text-slate-900 mb-2", children: "Recommendations for Improvement" }),
|
|
1937
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-600", children: "Priority actions to enhance your insurance health score" })
|
|
1938
|
+
] }),
|
|
1939
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-6", children: ((_a = config.recommendations) == null ? void 0 : _a.map((rec, index) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
1940
|
+
"div",
|
|
1941
|
+
{
|
|
1942
|
+
className: "bg-white border border-slate-200 rounded-lg p-6",
|
|
1943
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start space-x-4", children: [
|
|
1944
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "bg-blue-100 rounded-full p-2 flex-shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-blue-600 font-bold text-sm", children: index + 1 }) }),
|
|
1945
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-grow", children: [
|
|
1946
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-slate-900 mb-2", children: rec.title }),
|
|
1947
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [
|
|
1948
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1949
|
+
/* @__PURE__ */ jsxRuntime.jsx("h5", { className: "font-medium text-red-600 mb-1", children: "Current Risk:" }),
|
|
1950
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-slate-600", children: rec.problem })
|
|
1951
|
+
] }),
|
|
1952
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1953
|
+
/* @__PURE__ */ jsxRuntime.jsx("h5", { className: "font-medium text-green-600 mb-1", children: "Recommended Action:" }),
|
|
1954
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-slate-600", children: rec.solution })
|
|
1955
|
+
] })
|
|
1956
|
+
] }),
|
|
1957
|
+
rec.analogy && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 p-3 bg-blue-50 rounded border-l-4 border-blue-400", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-blue-800 italic", children: rec.analogy }) })
|
|
1958
|
+
] })
|
|
1959
|
+
] })
|
|
1960
|
+
},
|
|
1961
|
+
rec.id
|
|
1962
|
+
))) || /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-8", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-500", children: "No specific recommendations available. Your current security posture shows good practices." }) }) })
|
|
1963
|
+
] }),
|
|
1964
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "report-page space-y-6 border-t border-slate-200 pt-8", children: [
|
|
1965
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center space-x-3", children: [
|
|
1966
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-8 h-8 bg-green-600 rounded-lg flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-white text-lg", children: "✓" }) }),
|
|
1967
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1968
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold text-slate-900", children: "Proposed Next Steps" }),
|
|
1969
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-600", children: "How to leverage these insights for your organization" })
|
|
1970
|
+
] })
|
|
1971
|
+
] }),
|
|
1972
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-6", children: [
|
|
1973
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-blue-50 border border-blue-200 rounded-lg p-6", children: [
|
|
1974
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-slate-900 mb-4", children: "Immediate Actions" }),
|
|
1975
|
+
/* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "space-y-3 text-slate-700", children: [
|
|
1976
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-3", children: [
|
|
1977
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-blue-600 mt-1.5 w-1.5 h-1.5 rounded-full bg-blue-600 flex-shrink-0" }),
|
|
1978
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Implement the highest priority recommendations identified in this assessment" })
|
|
1979
|
+
] }),
|
|
1980
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-3", children: [
|
|
1981
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-blue-600 mt-1.5 w-1.5 h-1.5 rounded-full bg-blue-600 flex-shrink-0" }),
|
|
1982
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Schedule a cybersecurity strategy session to discuss these findings in detail" })
|
|
1983
|
+
] }),
|
|
1984
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-3", children: [
|
|
1985
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-blue-600 mt-1.5 w-1.5 h-1.5 rounded-full bg-blue-600 flex-shrink-0" }),
|
|
1986
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Begin conversations with insurance providers about current coverage needs" })
|
|
1987
|
+
] })
|
|
1988
|
+
] })
|
|
1989
|
+
] }),
|
|
1990
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [
|
|
1991
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-slate-50 border border-slate-200 rounded-lg p-6", children: [
|
|
1992
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-slate-900 mb-4", children: "Insurance Planning" }),
|
|
1993
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-700 mb-4", children: "Use this score to have informed conversations with insurance providers and understand your options in the marketplace." }),
|
|
1994
|
+
/* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "space-y-2 text-slate-700", children: [
|
|
1995
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-3", children: [
|
|
1996
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-500 mt-1.5 w-1.5 h-1.5 rounded-full bg-slate-500 flex-shrink-0" }),
|
|
1997
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Shop for competitive quotes" })
|
|
1998
|
+
] }),
|
|
1999
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-3", children: [
|
|
2000
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-500 mt-1.5 w-1.5 h-1.5 rounded-full bg-slate-500 flex-shrink-0" }),
|
|
2001
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Understand coverage requirements" })
|
|
2002
|
+
] }),
|
|
2003
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-3", children: [
|
|
2004
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-500 mt-1.5 w-1.5 h-1.5 rounded-full bg-slate-500 flex-shrink-0" }),
|
|
2005
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Review existing policy terms" })
|
|
2006
|
+
] })
|
|
2007
|
+
] })
|
|
2008
|
+
] }),
|
|
2009
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-slate-50 border border-slate-200 rounded-lg p-6", children: [
|
|
2010
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-slate-900 mb-4", children: "Security Improvement" }),
|
|
2011
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-700 mb-4", children: "Focus on the security areas that will have the most positive impact on your insurance posture and overall risk." }),
|
|
2012
|
+
/* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "space-y-2 text-slate-700", children: [
|
|
2013
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-3", children: [
|
|
2014
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-500 mt-1.5 w-1.5 h-1.5 rounded-full bg-slate-500 flex-shrink-0" }),
|
|
2015
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Prioritize high-impact improvements" })
|
|
2016
|
+
] }),
|
|
2017
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-3", children: [
|
|
2018
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-500 mt-1.5 w-1.5 h-1.5 rounded-full bg-slate-500 flex-shrink-0" }),
|
|
2019
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Document security controls" })
|
|
2020
|
+
] }),
|
|
2021
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-3", children: [
|
|
2022
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-500 mt-1.5 w-1.5 h-1.5 rounded-full bg-slate-500 flex-shrink-0" }),
|
|
2023
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Monitor progress regularly" })
|
|
2024
|
+
] })
|
|
2025
|
+
] })
|
|
2026
|
+
] })
|
|
2027
|
+
] })
|
|
2028
|
+
] })
|
|
2029
|
+
] }),
|
|
2030
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "report-page space-y-6 border-t border-slate-200 pt-8", children: [
|
|
2031
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center space-x-3", children: [
|
|
2032
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-8 h-8 bg-blue-600 rounded-lg flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-white text-lg", children: "?" }) }),
|
|
2033
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2034
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold text-slate-900", children: "Understanding Your Score" }),
|
|
2035
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-600", children: "Methodology and important information about this assessment" })
|
|
2036
|
+
] })
|
|
2037
|
+
] }),
|
|
2038
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-6", children: [
|
|
2039
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-slate-50 rounded-lg p-6", children: [
|
|
2040
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-slate-900 mb-4", children: "How We Calculate Your Score" }),
|
|
2041
|
+
/* @__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." }),
|
|
2042
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [
|
|
2043
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2044
|
+
/* @__PURE__ */ jsxRuntime.jsx("h5", { className: "font-medium text-slate-900 mb-2", children: "Score Ranges:" }),
|
|
2045
|
+
/* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "text-sm text-slate-700 space-y-1", children: [
|
|
2046
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { children: [
|
|
2047
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-green-600", children: "750-850:" }),
|
|
2048
|
+
" ",
|
|
2049
|
+
"Excellent - Premium discounts available"
|
|
2050
|
+
] }),
|
|
2051
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { children: [
|
|
2052
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-blue-600", children: "650-749:" }),
|
|
2053
|
+
" ",
|
|
2054
|
+
"Good - Standard coverage available"
|
|
2055
|
+
] }),
|
|
2056
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { children: [
|
|
2057
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-yellow-600", children: "550-649:" }),
|
|
2058
|
+
" ",
|
|
2059
|
+
"Fair - Limited coverage options"
|
|
2060
|
+
] }),
|
|
2061
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { children: [
|
|
2062
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-red-600", children: "Below 550:" }),
|
|
2063
|
+
" ",
|
|
2064
|
+
"Poor - Coverage may be denied"
|
|
2065
|
+
] })
|
|
2066
|
+
] })
|
|
2067
|
+
] }),
|
|
2068
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2069
|
+
/* @__PURE__ */ jsxRuntime.jsx("h5", { className: "font-medium text-slate-900 mb-2", children: "What Insurance Companies Look For:" }),
|
|
2070
|
+
/* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "text-sm text-slate-700 space-y-1", children: [
|
|
2071
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• Multi-factor authentication implementation" }),
|
|
2072
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• Regular security training programs" }),
|
|
2073
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• Incident response procedures" }),
|
|
2074
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• Data backup and recovery plans" }),
|
|
2075
|
+
/* @__PURE__ */ jsxRuntime.jsx("li", { children: "• Network security controls" })
|
|
2076
|
+
] })
|
|
2077
|
+
] })
|
|
2078
|
+
] })
|
|
2079
|
+
] }),
|
|
2080
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-yellow-50 border border-yellow-200 rounded-lg p-6", children: [
|
|
2081
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-slate-900 mb-2", children: "Important Notes" }),
|
|
2082
|
+
/* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "text-slate-700 space-y-2", children: [
|
|
2083
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-2", children: [
|
|
2084
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-yellow-600 mt-1", children: "•" }),
|
|
2085
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "This assessment is based on industry standards and general insurance requirements" })
|
|
2086
|
+
] }),
|
|
2087
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-2", children: [
|
|
2088
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-yellow-600 mt-1", children: "•" }),
|
|
2089
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Actual insurance coverage and pricing may vary by provider and specific circumstances" })
|
|
2090
|
+
] }),
|
|
2091
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-2", children: [
|
|
2092
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-yellow-600 mt-1", children: "•" }),
|
|
2093
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "This report should be used as guidance alongside professional cybersecurity consultation" })
|
|
2094
|
+
] })
|
|
2095
|
+
] })
|
|
2096
|
+
] })
|
|
2097
|
+
] })
|
|
2098
|
+
] }),
|
|
2099
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "report-page space-y-6 border-t border-slate-200 pt-8", children: [
|
|
2100
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center space-x-3", children: [
|
|
2101
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-8 h-8 bg-gray-600 rounded-lg flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: "w-5 h-5 text-white" }) }),
|
|
2102
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2103
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold text-slate-900", children: "Important Disclaimer" }),
|
|
2104
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-600", children: "Legal limitations and professional guidance" })
|
|
2105
|
+
] })
|
|
2106
|
+
] }),
|
|
2107
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [
|
|
2108
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2109
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-green-600 mb-3", children: "What This Report IS:" }),
|
|
2110
|
+
/* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "text-slate-700 space-y-2 text-sm", children: [
|
|
2111
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-2", children: [
|
|
2112
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-green-600 mt-1", children: "✓" }),
|
|
2113
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "A cybersecurity assessment tool based on industry standards" })
|
|
2114
|
+
] }),
|
|
2115
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-2", children: [
|
|
2116
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-green-600 mt-1", children: "✓" }),
|
|
2117
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Educational guidance on insurance readiness factors" })
|
|
2118
|
+
] }),
|
|
2119
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-2", children: [
|
|
2120
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-green-600 mt-1", children: "✓" }),
|
|
2121
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "A starting point for security improvement discussions" })
|
|
2122
|
+
] }),
|
|
2123
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-2", children: [
|
|
2124
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-green-600 mt-1", children: "✓" }),
|
|
2125
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Based on current cybersecurity best practices" })
|
|
2126
|
+
] })
|
|
2127
|
+
] })
|
|
2128
|
+
] }),
|
|
2129
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2130
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "font-semibold text-red-600 mb-3", children: "What This Report IS NOT:" }),
|
|
2131
|
+
/* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "text-slate-700 space-y-2 text-sm", children: [
|
|
2132
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-2", children: [
|
|
2133
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-red-600 mt-1", children: "✗" }),
|
|
2134
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "A guarantee of insurance coverage or pricing" })
|
|
2135
|
+
] }),
|
|
2136
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-2", children: [
|
|
2137
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-red-600 mt-1", children: "✗" }),
|
|
2138
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "A comprehensive security audit or penetration test" })
|
|
2139
|
+
] }),
|
|
2140
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-2", children: [
|
|
2141
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-red-600 mt-1", children: "✗" }),
|
|
2142
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Legal or financial advice" })
|
|
2143
|
+
] }),
|
|
2144
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start space-x-2", children: [
|
|
2145
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-red-600 mt-1", children: "✗" }),
|
|
2146
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "A replacement for professional cybersecurity consultation" })
|
|
2147
|
+
] })
|
|
2148
|
+
] })
|
|
2149
|
+
] })
|
|
2150
|
+
] })
|
|
2151
|
+
] })
|
|
2152
|
+
] });
|
|
2153
|
+
};
|
|
2154
|
+
const ReportMatrix = {
|
|
2155
|
+
"financial-impact": FinancialImpact,
|
|
2156
|
+
"breach-likelihood": BreachLikelihood,
|
|
2157
|
+
"insurance-health-score": InsuranceHealthScore
|
|
2158
|
+
};
|
|
2159
|
+
const ReportBuilder = ({ clientId, config }) => {
|
|
2160
|
+
const [searchParams] = reactRouterDom.useSearchParams();
|
|
2161
|
+
const reportTemplate = searchParams.get("template");
|
|
2162
|
+
const templateArray = (reportTemplate == null ? void 0 : reportTemplate.split(",").map((item) => item.trim())) || [];
|
|
2163
|
+
const unifiedData = transformToUnifiedData(
|
|
2164
|
+
{
|
|
2165
|
+
companyName: config.mspCompanyName || "Your MSP Company",
|
|
2166
|
+
clientName: config.clientCompanyName || "Client Company",
|
|
2167
|
+
reportTitle: "Cyber Financial Impact Analysis",
|
|
2168
|
+
executiveSummary: config.executiveSummary || "This report provides a comprehensive analysis of the potential financial impact of cybersecurity threats on your organization.",
|
|
2169
|
+
generatedDate: (/* @__PURE__ */ new Date()).toLocaleDateString()
|
|
2170
|
+
},
|
|
2171
|
+
null,
|
|
2172
|
+
""
|
|
2173
|
+
);
|
|
2174
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
2175
|
+
!clientId && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-w-4xl mx-auto bg-white p-8 flex items-center justify-center min-h-[600px]", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center space-y-4", children: [
|
|
2176
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-16 h-16 bg-slate-100 rounded-full flex items-center justify-center mx-auto", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: "w-8 h-8 text-slate-400" }) }),
|
|
2177
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-xl font-semibold text-slate-700", children: "Please Select a Client" }),
|
|
2178
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-slate-500 max-w-md", children: "Choose a client from the dropdown above to generate and preview their cyber financial impact analysis report." })
|
|
2179
|
+
] }) }),
|
|
2180
|
+
/* @__PURE__ */ jsxRuntime.jsx("nav", { children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "report-toc max-w-4xl mx-auto bg-white p-4 flex space-x-4 overflow-x-auto", children: !!(templateArray.length > 1) && templateArray.map((item) => {
|
|
2181
|
+
const Component = ReportMatrix[item];
|
|
2182
|
+
return Component ? /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
2183
|
+
"a",
|
|
2184
|
+
{
|
|
2185
|
+
href: `#${item}`,
|
|
2186
|
+
className: "text-blue-600 hover:underline",
|
|
2187
|
+
children: item.split("-").map(
|
|
2188
|
+
(word) => word.charAt(0).toUpperCase() + word.slice(1)
|
|
2189
|
+
).join(" ")
|
|
2190
|
+
}
|
|
2191
|
+
) }, item) : null;
|
|
2192
|
+
}) }) }),
|
|
2193
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
2194
|
+
"article",
|
|
2195
|
+
{
|
|
2196
|
+
id: "print-report",
|
|
2197
|
+
className: "report-wrapper max-w-4xl mx-auto bg-white p-8 space-y-8",
|
|
2198
|
+
children: [
|
|
2199
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-20 h-20 bg-slate-200 rounded-lg flex items-center justify-center", children: config.mspLogoBase64 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
2200
|
+
"img",
|
|
2201
|
+
{
|
|
2202
|
+
src: config.mspLogoBase64,
|
|
2203
|
+
alt: "MSP Logo",
|
|
2204
|
+
className: "w-full h-full object-contain rounded-lg"
|
|
2205
|
+
}
|
|
2206
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Building2, { className: "w-10 h-10 text-slate-500" }) }),
|
|
2207
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-md mx-auto bg-slate-50 rounded-lg p-6 space-y-3", children: [
|
|
2208
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between", children: [
|
|
2209
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-slate-700", children: "Prepared For:" }),
|
|
2210
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-900", children: config.clientCompanyName || "Client Company" })
|
|
2211
|
+
] }),
|
|
2212
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between", children: [
|
|
2213
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-slate-700", children: "Industry Sector:" }),
|
|
2214
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-900", children: config.clientIndustry || "Industry" })
|
|
2215
|
+
] }),
|
|
2216
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between", children: [
|
|
2217
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-slate-700", children: "Prepared By:" }),
|
|
2218
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-900", children: config.mspCompanyName || "MSP Company" })
|
|
2219
|
+
] }),
|
|
2220
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between", children: [
|
|
2221
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-slate-700", children: "Assessment Date:" }),
|
|
2222
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-slate-900", children: (/* @__PURE__ */ new Date()).toLocaleDateString() })
|
|
2223
|
+
] })
|
|
2224
|
+
] }),
|
|
2225
|
+
templateArray.map((item) => {
|
|
2226
|
+
const Component = ReportMatrix[item];
|
|
2227
|
+
return Component ? /* @__PURE__ */ jsxRuntime.jsx(Component, { unifiedData, config }, item) : null;
|
|
2228
|
+
}),
|
|
2229
|
+
/* @__PURE__ */ jsxRuntime.jsxs("footer", { className: "report-page text-center pt-8 border-t border-slate-200", children: [
|
|
2230
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { children: "Professional Recommendation" }),
|
|
2231
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-slate-500", children: "This assessment combines financial impact modeling, insurance readiness evaluation, and breach likelihood analysis to provide a complete view of your organization's cybersecurity risk profile." }),
|
|
2232
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs text-slate-400 mt-2", children: [
|
|
2233
|
+
"Generated by ",
|
|
2234
|
+
config.mspCompanyName,
|
|
2235
|
+
" on ",
|
|
2236
|
+
(/* @__PURE__ */ new Date()).toLocaleDateString()
|
|
2237
|
+
] })
|
|
2238
|
+
] })
|
|
2239
|
+
]
|
|
2240
|
+
}
|
|
2241
|
+
)
|
|
2242
|
+
] });
|
|
2243
|
+
};
|
|
2244
|
+
exports.Dashboard = Dashboard;
|
|
2245
|
+
exports.ReportBuilder = ReportBuilder;
|
|
2246
|
+
//# sourceMappingURL=index.cjs.map
|