@threatcaptain/tc-reports 0.2.19 → 0.2.20

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