@burdenoff/microfe-assethandler 2026.625.1 → 2026.625.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.
Files changed (113) hide show
  1. package/dist/assethandler/pages/AiPredictionsPage.js +42 -41
  2. package/dist/assethandler/pages/AiPredictionsPage.js.map +1 -1
  3. package/dist/assethandler/pages/AnalyticsPage.js +538 -534
  4. package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
  5. package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +135 -125
  6. package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
  7. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +90 -92
  8. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
  9. package/dist/assethandler/pages/AssetsAssetCreatePage.js +131 -124
  10. package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
  11. package/dist/assethandler/pages/AssetsAssetDetailPage.js +214 -185
  12. package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
  13. package/dist/assethandler/pages/AssetsAssetEditPage.js +168 -156
  14. package/dist/assethandler/pages/AssetsAssetEditPage.js.map +1 -1
  15. package/dist/assethandler/pages/AssetsAssetListPage.js +207 -187
  16. package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
  17. package/dist/assethandler/pages/AssetsAssetTrackingPage.js +82 -71
  18. package/dist/assethandler/pages/AssetsAssetTrackingPage.js.map +1 -1
  19. package/dist/assethandler/pages/AuditTrailPage.js +93 -91
  20. package/dist/assethandler/pages/AuditTrailPage.js.map +1 -1
  21. package/dist/assethandler/pages/CmdbBrowserPage.js +32 -33
  22. package/dist/assethandler/pages/CmdbBrowserPage.js.map +1 -1
  23. package/dist/assethandler/pages/DashboardPage.js +157 -126
  24. package/dist/assethandler/pages/DashboardPage.js.map +1 -1
  25. package/dist/assethandler/pages/DigitalTwinPage.js +25 -26
  26. package/dist/assethandler/pages/DigitalTwinPage.js.map +1 -1
  27. package/dist/assethandler/pages/DiscoveryJobsPage.js +50 -50
  28. package/dist/assethandler/pages/DiscoveryJobsPage.js.map +1 -1
  29. package/dist/assethandler/pages/EsgDashboardPage.js +43 -42
  30. package/dist/assethandler/pages/EsgDashboardPage.js.map +1 -1
  31. package/dist/assethandler/pages/FinanceBudgetDetailPage.js +96 -82
  32. package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
  33. package/dist/assethandler/pages/FinanceFinanceHubPage.js +137 -103
  34. package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
  35. package/dist/assethandler/pages/FinanceInvoiceDetailPage.js +77 -66
  36. package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
  37. package/dist/assethandler/pages/IotDevicesPage.js +34 -35
  38. package/dist/assethandler/pages/IotDevicesPage.js.map +1 -1
  39. package/dist/assethandler/pages/ItilChangeDetailPage.js +236 -199
  40. package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
  41. package/dist/assethandler/pages/ItilChangeManagementPage.js +66 -64
  42. package/dist/assethandler/pages/ItilChangeManagementPage.js.map +1 -1
  43. package/dist/assethandler/pages/ItilIncidentDetailPage.js +237 -200
  44. package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
  45. package/dist/assethandler/pages/ItilIncidentManagementPage.js +99 -97
  46. package/dist/assethandler/pages/ItilIncidentManagementPage.js.map +1 -1
  47. package/dist/assethandler/pages/ItilItilhubPage.js +166 -122
  48. package/dist/assethandler/pages/ItilItilhubPage.js.map +1 -1
  49. package/dist/assethandler/pages/ItilProblemDetailPage.js +193 -156
  50. package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
  51. package/dist/assethandler/pages/ItilProblemManagementPage.js +63 -61
  52. package/dist/assethandler/pages/ItilProblemManagementPage.js.map +1 -1
  53. package/dist/assethandler/pages/KnowledgeBasePage.js +45 -43
  54. package/dist/assethandler/pages/KnowledgeBasePage.js.map +1 -1
  55. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +70 -68
  56. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js.map +1 -1
  57. package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +77 -62
  58. package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js.map +1 -1
  59. package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js +162 -151
  60. package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js.map +1 -1
  61. package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js +64 -57
  62. package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js.map +1 -1
  63. package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js +125 -108
  64. package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js.map +1 -1
  65. package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js +67 -61
  66. package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js.map +1 -1
  67. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +203 -166
  68. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
  69. package/dist/assethandler/pages/OperationsOperationsHubPage.js +125 -95
  70. package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
  71. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +165 -151
  72. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
  73. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +83 -81
  74. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js.map +1 -1
  75. package/dist/assethandler/pages/ProvenancePage.js +56 -53
  76. package/dist/assethandler/pages/ProvenancePage.js.map +1 -1
  77. package/dist/assethandler/pages/ReportsReportBuilderPage.js +80 -73
  78. package/dist/assethandler/pages/ReportsReportBuilderPage.js.map +1 -1
  79. package/dist/assethandler/pages/ReportsReportsDashboardPage.js +112 -77
  80. package/dist/assethandler/pages/ReportsReportsDashboardPage.js.map +1 -1
  81. package/dist/assethandler/pages/ReportsReportsListPage.js +119 -103
  82. package/dist/assethandler/pages/ReportsReportsListPage.js.map +1 -1
  83. package/dist/assethandler/pages/SamLicensesPage.js +32 -33
  84. package/dist/assethandler/pages/SamLicensesPage.js.map +1 -1
  85. package/dist/assethandler/pages/SecurityComplianceDetailPage.js +60 -52
  86. package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
  87. package/dist/assethandler/pages/SecurityPolicyDetailPage.js +134 -117
  88. package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
  89. package/dist/assethandler/pages/SecurityScheduleBackupPage.js +63 -57
  90. package/dist/assethandler/pages/SecurityScheduleBackupPage.js.map +1 -1
  91. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js +131 -117
  92. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
  93. package/dist/assethandler/pages/SecuritySecurityHubPage.js +147 -113
  94. package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
  95. package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +235 -218
  96. package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
  97. package/dist/assethandler/pages/TransactionsTransactionListPage.js +118 -116
  98. package/dist/assethandler/pages/TransactionsTransactionListPage.js.map +1 -1
  99. package/dist/assethandler/pages/UsersPage.js +108 -99
  100. package/dist/assethandler/pages/UsersPage.js.map +1 -1
  101. package/dist/assethandler/pages/UsersUserCreatePage.js +74 -67
  102. package/dist/assethandler/pages/UsersUserCreatePage.js.map +1 -1
  103. package/dist/assethandler/pages/UsersUserManagementHubPage.js +128 -93
  104. package/dist/assethandler/pages/UsersUserManagementHubPage.js.map +1 -1
  105. package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js +211 -193
  106. package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js.map +1 -1
  107. package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js +88 -86
  108. package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js.map +1 -1
  109. package/dist/assethandler/pages/WorkflowsWorkflowListPage.js +68 -60
  110. package/dist/assethandler/pages/WorkflowsWorkflowListPage.js.map +1 -1
  111. package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js +71 -68
  112. package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js.map +1 -1
  113. package/package.json +2 -2
@@ -1,180 +1,206 @@
1
1
  import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
2
2
  import { AlertTriangle as t, Eye as n, FileText as r, Shield as i } from "lucide-react";
3
- import { Badge as a, Button as o, Card as s, CardContent as c, CardHeader as l, CardTitle as u, GradientText as d, Tabs as f, TabsContent as p, TabsList as m, TabsTrigger as h } from "@burdenoff/fe-libs/ui";
4
- import { jsx as g, jsxs as _ } from "react/jsx-runtime";
3
+ import { useNavigate as a } from "react-router-dom";
4
+ import { Badge as o, Button as s, Card as c, CardContent as l, CardHeader as u, CardTitle as d, EmphasisPanel as f, GradientText as p, IllustratedEmptyState as m, NextSteps as h, PagePurpose as g, Tabs as _, TabsContent as v, TabsList as y, TabsTrigger as b } from "@burdenoff/fe-libs/ui";
5
+ import { jsx as x, jsxs as S } from "react/jsx-runtime";
5
6
  //#region src/assethandler/pages/SecuritySecurityHubPage.tsx
6
- var v = {
7
+ var C = {
7
8
  critical: "destructive",
8
9
  high: "destructive",
9
10
  medium: "default",
10
11
  low: "secondary",
11
12
  info: "outline"
12
13
  };
13
- function y() {
14
- let { securityEvents: y, complianceFrameworks: b, securityPolicies: x } = e(), S = y.filter((e) => !e.resolved);
15
- y.filter((e) => e.severity === "critical" || e.severity === "high");
16
- let C = x.filter((e) => e.status === "active"), w = b.length > 0 ? Math.round(b.reduce((e, t) => e + t.score, 0) / b.length) : 0;
17
- return /* @__PURE__ */ _("div", {
14
+ function w() {
15
+ let w = a(), { securityEvents: T, complianceFrameworks: E, securityPolicies: D } = e(), O = T.filter((e) => !e.resolved);
16
+ T.filter((e) => e.severity === "critical" || e.severity === "high");
17
+ let k = D.filter((e) => e.status === "active"), A = E.length > 0 ? Math.round(E.reduce((e, t) => e + t.score, 0) / E.length) : 0;
18
+ return /* @__PURE__ */ S("div", {
18
19
  className: "space-y-6 p-6",
19
20
  children: [
20
- /* @__PURE__ */ _("div", {
21
+ /* @__PURE__ */ S("div", {
21
22
  className: "flex items-center justify-between",
22
- children: [/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("h1", {
23
+ children: [/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("h1", {
23
24
  className: "text-2xl font-bold",
24
- children: /* @__PURE__ */ g(d, { children: "Security Hub" })
25
- }), /* @__PURE__ */ g("p", {
25
+ children: /* @__PURE__ */ x(p, { children: "Security Hub" })
26
+ }), /* @__PURE__ */ x("p", {
26
27
  className: "text-sm text-text-secondary",
27
28
  children: "Security monitoring, compliance, and policy management"
28
- })] }), /* @__PURE__ */ _(o, {
29
+ })] }), /* @__PURE__ */ S(s, {
29
30
  size: "sm",
30
- children: [/* @__PURE__ */ g(i, { className: "mr-2 h-4 w-4" }), "Security Report"]
31
+ children: [/* @__PURE__ */ x(i, { className: "mr-2 h-4 w-4" }), "Security Report"]
31
32
  })]
32
33
  }),
33
- /* @__PURE__ */ _("div", {
34
+ /* @__PURE__ */ x(g, { children: "Your asset-security control room: watch security events as they happen, track how you score against compliance frameworks, and manage the policies that govern your estate. Use it to close out the highest-severity, unresolved events first and prove you are audit-ready." }),
35
+ /* @__PURE__ */ x(h, {
36
+ storageKey: "assethandler-security-hub",
37
+ steps: [
38
+ {
39
+ id: "events",
40
+ label: "Generate a security report",
41
+ description: "Summarise events, compliance and policy posture.",
42
+ onClick: () => w("/reports/report-builder")
43
+ },
44
+ {
45
+ id: "audit",
46
+ label: "Review the audit trail",
47
+ description: "See who changed what across your assets.",
48
+ onClick: () => w("/audit-trail")
49
+ },
50
+ {
51
+ id: "backup",
52
+ label: "Schedule a backup",
53
+ description: "Protect critical asset data on a recurring schedule.",
54
+ onClick: () => w("/security/schedule-backup")
55
+ }
56
+ ]
57
+ }),
58
+ /* @__PURE__ */ S("div", {
34
59
  className: "grid gap-4 md:grid-cols-4",
35
60
  children: [
36
- /* @__PURE__ */ g(s, { children: /* @__PURE__ */ _(c, {
37
- className: "pt-4",
38
- children: [/* @__PURE__ */ _("div", {
39
- className: "flex items-center gap-2 text-sm text-text-secondary",
40
- children: [/* @__PURE__ */ g(t, { className: "h-4 w-4" }), "Unresolved Events"]
41
- }), /* @__PURE__ */ g("p", {
42
- className: "text-2xl font-bold mt-1 text-status-error-text",
43
- children: S.length
44
- })]
45
- }) }),
46
- /* @__PURE__ */ g(s, { children: /* @__PURE__ */ _(c, {
61
+ /* @__PURE__ */ S(f, { children: [/* @__PURE__ */ S("div", {
62
+ className: "flex items-center gap-2 text-sm text-text-secondary",
63
+ children: [/* @__PURE__ */ x(t, { className: "h-4 w-4" }), "Unresolved Events"]
64
+ }), /* @__PURE__ */ x("p", {
65
+ className: "text-2xl font-bold mt-1 tabular-nums text-status-error-text",
66
+ children: O.length
67
+ })] }),
68
+ /* @__PURE__ */ x(c, { children: /* @__PURE__ */ S(l, {
47
69
  className: "pt-4",
48
- children: [/* @__PURE__ */ _("div", {
70
+ children: [/* @__PURE__ */ S("div", {
49
71
  className: "flex items-center gap-2 text-sm text-text-secondary",
50
- children: [/* @__PURE__ */ g(i, { className: "h-4 w-4" }), "Compliance Score"]
51
- }), /* @__PURE__ */ _("p", {
72
+ children: [/* @__PURE__ */ x(i, { className: "h-4 w-4" }), "Compliance Score"]
73
+ }), /* @__PURE__ */ S("p", {
52
74
  className: "text-2xl font-bold mt-1",
53
- children: [w, "%"]
75
+ children: [A, "%"]
54
76
  })]
55
77
  }) }),
56
- /* @__PURE__ */ g(s, { children: /* @__PURE__ */ _(c, {
78
+ /* @__PURE__ */ x(c, { children: /* @__PURE__ */ S(l, {
57
79
  className: "pt-4",
58
- children: [/* @__PURE__ */ _("div", {
80
+ children: [/* @__PURE__ */ S("div", {
59
81
  className: "flex items-center gap-2 text-sm text-text-secondary",
60
- children: [/* @__PURE__ */ g(r, { className: "h-4 w-4" }), "Active Policies"]
61
- }), /* @__PURE__ */ g("p", {
82
+ children: [/* @__PURE__ */ x(r, { className: "h-4 w-4" }), "Active Policies"]
83
+ }), /* @__PURE__ */ x("p", {
62
84
  className: "text-2xl font-bold mt-1",
63
- children: C.length
85
+ children: k.length
64
86
  })]
65
87
  }) }),
66
- /* @__PURE__ */ g(s, { children: /* @__PURE__ */ _(c, {
88
+ /* @__PURE__ */ x(c, { children: /* @__PURE__ */ S(l, {
67
89
  className: "pt-4",
68
- children: [/* @__PURE__ */ _("div", {
90
+ children: [/* @__PURE__ */ S("div", {
69
91
  className: "flex items-center gap-2 text-sm text-text-secondary",
70
- children: [/* @__PURE__ */ g(n, { className: "h-4 w-4" }), "Total Events"]
71
- }), /* @__PURE__ */ g("p", {
92
+ children: [/* @__PURE__ */ x(n, { className: "h-4 w-4" }), "Total Events"]
93
+ }), /* @__PURE__ */ x("p", {
72
94
  className: "text-2xl font-bold mt-1",
73
- children: y.length
95
+ children: T.length
74
96
  })]
75
97
  }) })
76
98
  ]
77
99
  }),
78
- /* @__PURE__ */ _(f, {
100
+ /* @__PURE__ */ S(_, {
79
101
  defaultValue: "events",
80
102
  children: [
81
- /* @__PURE__ */ _(m, { children: [
82
- /* @__PURE__ */ g(h, {
103
+ /* @__PURE__ */ S(y, { children: [
104
+ /* @__PURE__ */ x(b, {
83
105
  value: "events",
84
106
  children: "Security Events"
85
107
  }),
86
- /* @__PURE__ */ g(h, {
108
+ /* @__PURE__ */ x(b, {
87
109
  value: "compliance",
88
110
  children: "Compliance"
89
111
  }),
90
- /* @__PURE__ */ g(h, {
112
+ /* @__PURE__ */ x(b, {
91
113
  value: "policies",
92
114
  children: "Policies"
93
115
  })
94
116
  ] }),
95
- /* @__PURE__ */ g(p, {
117
+ /* @__PURE__ */ x(v, {
96
118
  value: "events",
97
119
  className: "mt-4",
98
- children: /* @__PURE__ */ g(s, { children: /* @__PURE__ */ g(c, {
120
+ children: T.length === 0 ? /* @__PURE__ */ x(m, {
121
+ illustration: "empty-notifications",
122
+ title: "No security events",
123
+ description: "Security alerts detected across your assets will appear here for triage."
124
+ }) : /* @__PURE__ */ x(c, { children: /* @__PURE__ */ x(l, {
99
125
  className: "p-0",
100
- children: /* @__PURE__ */ g("div", {
126
+ children: /* @__PURE__ */ x("div", {
101
127
  className: "overflow-x-auto",
102
- children: /* @__PURE__ */ _("table", {
128
+ children: /* @__PURE__ */ S("table", {
103
129
  className: "w-full text-sm",
104
- children: [/* @__PURE__ */ g("thead", { children: /* @__PURE__ */ _("tr", {
130
+ children: [/* @__PURE__ */ x("thead", { children: /* @__PURE__ */ S("tr", {
105
131
  className: "border-b bg-bg-sunken/50",
106
132
  children: [
107
- /* @__PURE__ */ g("th", {
133
+ /* @__PURE__ */ x("th", {
108
134
  className: "text-left p-3 font-medium",
109
135
  children: "ID"
110
136
  }),
111
- /* @__PURE__ */ g("th", {
137
+ /* @__PURE__ */ x("th", {
112
138
  className: "text-left p-3 font-medium",
113
139
  children: "Type"
114
140
  }),
115
- /* @__PURE__ */ g("th", {
141
+ /* @__PURE__ */ x("th", {
116
142
  className: "text-left p-3 font-medium",
117
143
  children: "Title"
118
144
  }),
119
- /* @__PURE__ */ g("th", {
145
+ /* @__PURE__ */ x("th", {
120
146
  className: "text-left p-3 font-medium",
121
147
  children: "Severity"
122
148
  }),
123
- /* @__PURE__ */ g("th", {
149
+ /* @__PURE__ */ x("th", {
124
150
  className: "text-left p-3 font-medium",
125
151
  children: "Source"
126
152
  }),
127
- /* @__PURE__ */ g("th", {
153
+ /* @__PURE__ */ x("th", {
128
154
  className: "text-left p-3 font-medium",
129
155
  children: "Time"
130
156
  }),
131
- /* @__PURE__ */ g("th", {
157
+ /* @__PURE__ */ x("th", {
132
158
  className: "text-left p-3 font-medium",
133
159
  children: "Status"
134
160
  })
135
161
  ]
136
- }) }), /* @__PURE__ */ g("tbody", { children: y.map((e) => /* @__PURE__ */ _("tr", {
162
+ }) }), /* @__PURE__ */ x("tbody", { children: T.map((e) => /* @__PURE__ */ S("tr", {
137
163
  className: "border-b hover:bg-bg-sunken/50 cursor-pointer",
138
164
  children: [
139
- /* @__PURE__ */ g("td", {
165
+ /* @__PURE__ */ x("td", {
140
166
  className: "p-3 font-mono text-xs",
141
167
  children: e.id
142
168
  }),
143
- /* @__PURE__ */ g("td", {
169
+ /* @__PURE__ */ x("td", {
144
170
  className: "p-3 capitalize text-xs",
145
171
  children: e.type.replace("_", " ")
146
172
  }),
147
- /* @__PURE__ */ _("td", {
173
+ /* @__PURE__ */ S("td", {
148
174
  className: "p-3",
149
- children: [/* @__PURE__ */ g("p", {
175
+ children: [/* @__PURE__ */ x("p", {
150
176
  className: "font-medium",
151
177
  children: e.title
152
- }), /* @__PURE__ */ g("p", {
178
+ }), /* @__PURE__ */ x("p", {
153
179
  className: "text-xs text-text-secondary truncate max-w-xs",
154
180
  children: e.description
155
181
  })]
156
182
  }),
157
- /* @__PURE__ */ g("td", {
183
+ /* @__PURE__ */ x("td", {
158
184
  className: "p-3",
159
- children: /* @__PURE__ */ g(a, {
160
- variant: v[e.severity],
185
+ children: /* @__PURE__ */ x(o, {
186
+ variant: C[e.severity],
161
187
  children: e.severity
162
188
  })
163
189
  }),
164
- /* @__PURE__ */ g("td", {
190
+ /* @__PURE__ */ x("td", {
165
191
  className: "p-3 text-xs",
166
192
  children: e.source
167
193
  }),
168
- /* @__PURE__ */ g("td", {
194
+ /* @__PURE__ */ x("td", {
169
195
  className: "p-3 text-xs",
170
196
  children: new Date(e.timestamp).toLocaleString()
171
197
  }),
172
- /* @__PURE__ */ g("td", {
198
+ /* @__PURE__ */ x("td", {
173
199
  className: "p-3",
174
- children: e.resolved ? /* @__PURE__ */ g(a, {
200
+ children: e.resolved ? /* @__PURE__ */ x(o, {
175
201
  variant: "default",
176
202
  children: "Resolved"
177
- }) : /* @__PURE__ */ g(a, {
203
+ }) : /* @__PURE__ */ x(o, {
178
204
  variant: "destructive",
179
205
  children: "Open"
180
206
  })
@@ -185,74 +211,78 @@ function y() {
185
211
  })
186
212
  }) })
187
213
  }),
188
- /* @__PURE__ */ g(p, {
214
+ /* @__PURE__ */ x(v, {
189
215
  value: "compliance",
190
216
  className: "mt-4",
191
- children: /* @__PURE__ */ g("div", {
217
+ children: E.length === 0 ? /* @__PURE__ */ x(m, {
218
+ illustration: "empty-generic",
219
+ title: "No compliance frameworks",
220
+ description: "Add frameworks (e.g. ISO 27001, SOC 2) to track your control coverage and score."
221
+ }) : /* @__PURE__ */ x("div", {
192
222
  className: "grid gap-4 md:grid-cols-2",
193
- children: b.map((e) => /* @__PURE__ */ _(s, { children: [/* @__PURE__ */ g(l, {
223
+ children: E.map((e) => /* @__PURE__ */ S(c, { children: [/* @__PURE__ */ x(u, {
194
224
  className: "pb-2",
195
- children: /* @__PURE__ */ _("div", {
225
+ children: /* @__PURE__ */ S("div", {
196
226
  className: "flex items-center justify-between",
197
- children: [/* @__PURE__ */ _(u, {
227
+ children: [/* @__PURE__ */ S(d, {
198
228
  className: "text-base",
199
229
  children: [
200
230
  e.name,
201
231
  " ",
202
232
  e.version
203
233
  ]
204
- }), /* @__PURE__ */ g(a, {
234
+ }), /* @__PURE__ */ x(o, {
205
235
  variant: e.status === "compliant" ? "default" : e.status === "non_compliant" ? "destructive" : "secondary",
206
236
  children: e.status.replace("_", " ")
207
237
  })]
208
238
  })
209
- }), /* @__PURE__ */ g(c, { children: /* @__PURE__ */ _("div", {
239
+ }), /* @__PURE__ */ x(l, { children: /* @__PURE__ */ S("div", {
210
240
  className: "space-y-3",
211
241
  children: [
212
- /* @__PURE__ */ _("div", {
242
+ /* @__PURE__ */ S("div", {
213
243
  className: "text-center",
214
- children: [/* @__PURE__ */ _("p", {
244
+ children: [/* @__PURE__ */ S("p", {
215
245
  className: "text-3xl font-bold tabular-nums",
216
246
  children: [e.score, "%"]
217
- }), /* @__PURE__ */ g("p", {
247
+ }), /* @__PURE__ */ x("p", {
218
248
  className: "text-xs text-text-secondary",
219
249
  children: "Compliance Score"
220
250
  })]
221
251
  }),
222
- /* @__PURE__ */ g("div", {
252
+ /* @__PURE__ */ x("div", {
223
253
  className: "h-2 rounded-full bg-bg-sunken overflow-hidden",
224
- children: /* @__PURE__ */ g("div", {
254
+ children: /* @__PURE__ */ x("div", {
225
255
  className: `h-full rounded-full ${e.score >= 90 ? "bg-status-success-bg" : e.score >= 70 ? "bg-status-warning-bg" : "bg-status-error-bg"}`,
226
256
  style: { width: `${e.score}%` }
227
257
  })
228
258
  }),
229
- /* @__PURE__ */ _("div", {
259
+ /* @__PURE__ */ S("div", {
230
260
  className: "grid grid-cols-3 gap-2 text-center text-xs",
231
261
  children: [
232
- /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
262
+ /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
233
263
  className: "font-bold text-status-success-text",
234
264
  children: e.passedControls
235
- }), /* @__PURE__ */ g("p", {
265
+ }), /* @__PURE__ */ x("p", {
236
266
  className: "text-text-secondary",
237
267
  children: "Passed"
238
268
  })] }),
239
- /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
269
+ /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
240
270
  className: "font-bold text-status-error-text",
241
271
  children: e.failedControls
242
- }), /* @__PURE__ */ g("p", {
272
+ }), /* @__PURE__ */ x("p", {
243
273
  className: "text-text-secondary",
244
274
  children: "Failed"
245
275
  })] }),
246
- /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
276
+ /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
247
277
  className: "font-bold",
248
278
  children: e.totalControls
249
- }), /* @__PURE__ */ g("p", {
279
+ }), /* @__PURE__ */ x("p", {
250
280
  className: "text-text-secondary",
251
281
  children: "Total"
252
282
  })] })
253
283
  ]
254
284
  }),
255
- /* @__PURE__ */ _("div", {
285
+ /* @__PURE__ */ S("div", {
256
286
  className: "text-xs text-text-secondary",
257
287
  children: [
258
288
  "Last: ",
@@ -265,76 +295,80 @@ function y() {
265
295
  }) })] }, e.id))
266
296
  })
267
297
  }),
268
- /* @__PURE__ */ g(p, {
298
+ /* @__PURE__ */ x(v, {
269
299
  value: "policies",
270
300
  className: "mt-4",
271
- children: /* @__PURE__ */ g(s, { children: /* @__PURE__ */ g(c, {
301
+ children: D.length === 0 ? /* @__PURE__ */ x(m, {
302
+ illustration: "empty-files",
303
+ title: "No security policies",
304
+ description: "Define the policies that govern how your assets are secured and managed."
305
+ }) : /* @__PURE__ */ x(c, { children: /* @__PURE__ */ x(l, {
272
306
  className: "p-0",
273
- children: /* @__PURE__ */ g("div", {
307
+ children: /* @__PURE__ */ x("div", {
274
308
  className: "overflow-x-auto",
275
- children: /* @__PURE__ */ _("table", {
309
+ children: /* @__PURE__ */ S("table", {
276
310
  className: "w-full text-sm",
277
- children: [/* @__PURE__ */ g("thead", { children: /* @__PURE__ */ _("tr", {
311
+ children: [/* @__PURE__ */ x("thead", { children: /* @__PURE__ */ S("tr", {
278
312
  className: "border-b bg-bg-sunken/50",
279
313
  children: [
280
- /* @__PURE__ */ g("th", {
314
+ /* @__PURE__ */ x("th", {
281
315
  className: "text-left p-3 font-medium",
282
316
  children: "Name"
283
317
  }),
284
- /* @__PURE__ */ g("th", {
318
+ /* @__PURE__ */ x("th", {
285
319
  className: "text-left p-3 font-medium",
286
320
  children: "Category"
287
321
  }),
288
- /* @__PURE__ */ g("th", {
322
+ /* @__PURE__ */ x("th", {
289
323
  className: "text-left p-3 font-medium",
290
324
  children: "Version"
291
325
  }),
292
- /* @__PURE__ */ g("th", {
326
+ /* @__PURE__ */ x("th", {
293
327
  className: "text-left p-3 font-medium",
294
328
  children: "Status"
295
329
  }),
296
- /* @__PURE__ */ g("th", {
330
+ /* @__PURE__ */ x("th", {
297
331
  className: "text-left p-3 font-medium",
298
332
  children: "Owner"
299
333
  }),
300
- /* @__PURE__ */ g("th", {
334
+ /* @__PURE__ */ x("th", {
301
335
  className: "text-left p-3 font-medium",
302
336
  children: "Review Date"
303
337
  })
304
338
  ]
305
- }) }), /* @__PURE__ */ g("tbody", { children: x.map((e) => /* @__PURE__ */ _("tr", {
339
+ }) }), /* @__PURE__ */ x("tbody", { children: D.map((e) => /* @__PURE__ */ S("tr", {
306
340
  className: "border-b hover:bg-bg-sunken/50 cursor-pointer",
307
341
  children: [
308
- /* @__PURE__ */ _("td", {
342
+ /* @__PURE__ */ S("td", {
309
343
  className: "p-3",
310
- children: [/* @__PURE__ */ g("p", {
344
+ children: [/* @__PURE__ */ x("p", {
311
345
  className: "font-medium",
312
346
  children: e.name
313
- }), /* @__PURE__ */ g("p", {
347
+ }), /* @__PURE__ */ x("p", {
314
348
  className: "text-xs text-text-secondary truncate max-w-xs",
315
349
  children: e.description
316
350
  })]
317
351
  }),
318
- /* @__PURE__ */ g("td", {
352
+ /* @__PURE__ */ x("td", {
319
353
  className: "p-3 text-xs",
320
354
  children: e.category
321
355
  }),
322
- /* @__PURE__ */ _("td", {
356
+ /* @__PURE__ */ S("td", {
323
357
  className: "p-3 text-xs",
324
358
  children: ["v", e.version]
325
359
  }),
326
- /* @__PURE__ */ g("td", {
360
+ /* @__PURE__ */ x("td", {
327
361
  className: "p-3",
328
- children: /* @__PURE__ */ g(a, {
362
+ children: /* @__PURE__ */ x(o, {
329
363
  variant: e.status === "active" ? "default" : e.status === "deprecated" ? "destructive" : "outline",
330
364
  children: e.status.replace("_", " ")
331
365
  })
332
366
  }),
333
- /* @__PURE__ */ g("td", {
367
+ /* @__PURE__ */ x("td", {
334
368
  className: "p-3 text-xs",
335
369
  children: e.owner
336
370
  }),
337
- /* @__PURE__ */ g("td", {
371
+ /* @__PURE__ */ x("td", {
338
372
  className: "p-3 text-xs",
339
373
  children: e.reviewDate
340
374
  })
@@ -350,6 +384,6 @@ function y() {
350
384
  });
351
385
  }
352
386
  //#endregion
353
- export { y as SecuritySecurityHubPage };
387
+ export { w as SecuritySecurityHubPage };
354
388
 
355
389
  //# sourceMappingURL=SecuritySecurityHubPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SecuritySecurityHubPage.js","names":[],"sources":["../../../src/assethandler/pages/SecuritySecurityHubPage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n} from '@burdenoff/fe-libs/ui';\nimport { Shield, AlertTriangle, CheckCircle, FileText, Lock, Eye } from 'lucide-react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nconst severityColors: Record<string, 'destructive' | 'default' | 'secondary' | 'outline'> = {\n critical: 'destructive',\n high: 'destructive',\n medium: 'default',\n low: 'secondary',\n info: 'outline',\n};\n\nexport function SecuritySecurityHubPage() {\n const { securityEvents, complianceFrameworks, securityPolicies } = useAssetHandlerStore();\n\n const unresolvedEvents = securityEvents.filter((e) => !e.resolved);\n const criticalEvents = securityEvents.filter(\n (e) => e.severity === 'critical' || e.severity === 'high'\n );\n const activePolicies = securityPolicies.filter((p) => p.status === 'active');\n const avgCompliance =\n complianceFrameworks.length > 0\n ? Math.round(\n complianceFrameworks.reduce((s, f) => s + f.score, 0) / complianceFrameworks.length\n )\n : 0;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>Security Hub</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Security monitoring, compliance, and policy management\n </p>\n </div>\n <Button size=\"sm\">\n <Shield className=\"mr-2 h-4 w-4\" />\n Security Report\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <AlertTriangle className=\"h-4 w-4\" />\n Unresolved Events\n </div>\n <p className=\"text-2xl font-bold mt-1 text-status-error-text\">\n {unresolvedEvents.length}\n </p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Shield className=\"h-4 w-4\" />\n Compliance Score\n </div>\n <p className=\"text-2xl font-bold mt-1\">{avgCompliance}%</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <FileText className=\"h-4 w-4\" />\n Active Policies\n </div>\n <p className=\"text-2xl font-bold mt-1\">{activePolicies.length}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Eye className=\"h-4 w-4\" />\n Total Events\n </div>\n <p className=\"text-2xl font-bold mt-1\">{securityEvents.length}</p>\n </CardContent>\n </Card>\n </div>\n\n <Tabs defaultValue=\"events\">\n <TabsList>\n <TabsTrigger value=\"events\">Security Events</TabsTrigger>\n <TabsTrigger value=\"compliance\">Compliance</TabsTrigger>\n <TabsTrigger value=\"policies\">Policies</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"events\" className=\"mt-4\">\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">ID</th>\n <th className=\"text-left p-3 font-medium\">Type</th>\n <th className=\"text-left p-3 font-medium\">Title</th>\n <th className=\"text-left p-3 font-medium\">Severity</th>\n <th className=\"text-left p-3 font-medium\">Source</th>\n <th className=\"text-left p-3 font-medium\">Time</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n </tr>\n </thead>\n <tbody>\n {securityEvents.map((evt) => (\n <tr key={evt.id} className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\">\n <td className=\"p-3 font-mono text-xs\">{evt.id}</td>\n <td className=\"p-3 capitalize text-xs\">{evt.type.replace('_', ' ')}</td>\n <td className=\"p-3\">\n <p className=\"font-medium\">{evt.title}</p>\n <p className=\"text-xs text-text-secondary truncate max-w-xs\">\n {evt.description}\n </p>\n </td>\n <td className=\"p-3\">\n <Badge variant={severityColors[evt.severity]}>{evt.severity}</Badge>\n </td>\n <td className=\"p-3 text-xs\">{evt.source}</td>\n <td className=\"p-3 text-xs\">{new Date(evt.timestamp).toLocaleString()}</td>\n <td className=\"p-3\">\n {evt.resolved ? (\n <Badge variant=\"default\">Resolved</Badge>\n ) : (\n <Badge variant=\"destructive\">Open</Badge>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"compliance\" className=\"mt-4\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n {complianceFrameworks.map((fw) => (\n <Card key={fw.id}>\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">\n {fw.name} {fw.version}\n </CardTitle>\n <Badge\n variant={\n fw.status === 'compliant'\n ? 'default'\n : fw.status === 'non_compliant'\n ? 'destructive'\n : 'secondary'\n }\n >\n {fw.status.replace('_', ' ')}\n </Badge>\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n <div className=\"text-center\">\n <p className=\"text-3xl font-bold tabular-nums\">{fw.score}%</p>\n <p className=\"text-xs text-text-secondary\">Compliance Score</p>\n </div>\n <div className=\"h-2 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className={`h-full rounded-full ${fw.score >= 90 ? 'bg-status-success-bg' : fw.score >= 70 ? 'bg-status-warning-bg' : 'bg-status-error-bg'}`}\n style={{ width: `${fw.score}%` }}\n />\n </div>\n <div className=\"grid grid-cols-3 gap-2 text-center text-xs\">\n <div>\n <p className=\"font-bold text-status-success-text\">{fw.passedControls}</p>\n <p className=\"text-text-secondary\">Passed</p>\n </div>\n <div>\n <p className=\"font-bold text-status-error-text\">{fw.failedControls}</p>\n <p className=\"text-text-secondary\">Failed</p>\n </div>\n <div>\n <p className=\"font-bold\">{fw.totalControls}</p>\n <p className=\"text-text-secondary\">Total</p>\n </div>\n </div>\n <div className=\"text-xs text-text-secondary\">\n Last: {fw.lastAssessment} &middot; Next: {fw.nextAssessment}\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </TabsContent>\n\n <TabsContent value=\"policies\" className=\"mt-4\">\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">Name</th>\n <th className=\"text-left p-3 font-medium\">Category</th>\n <th className=\"text-left p-3 font-medium\">Version</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n <th className=\"text-left p-3 font-medium\">Owner</th>\n <th className=\"text-left p-3 font-medium\">Review Date</th>\n </tr>\n </thead>\n <tbody>\n {securityPolicies.map((pol) => (\n <tr key={pol.id} className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\">\n <td className=\"p-3\">\n <p className=\"font-medium\">{pol.name}</p>\n <p className=\"text-xs text-text-secondary truncate max-w-xs\">\n {pol.description}\n </p>\n </td>\n <td className=\"p-3 text-xs\">{pol.category}</td>\n <td className=\"p-3 text-xs\">v{pol.version}</td>\n <td className=\"p-3\">\n <Badge\n variant={\n pol.status === 'active'\n ? 'default'\n : pol.status === 'deprecated'\n ? 'destructive'\n : 'outline'\n }\n >\n {pol.status.replace('_', ' ')}\n </Badge>\n </td>\n <td className=\"p-3 text-xs\">{pol.owner}</td>\n <td className=\"p-3 text-xs\">{pol.reviewDate}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SecuritySecurityHubPage.js","names":[],"sources":["../../../src/assethandler/pages/SecuritySecurityHubPage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n NextSteps,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { Shield, AlertTriangle, FileText, Eye } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nconst severityColors: Record<string, 'destructive' | 'default' | 'secondary' | 'outline'> = {\n critical: 'destructive',\n high: 'destructive',\n medium: 'default',\n low: 'secondary',\n info: 'outline',\n};\n\nexport function SecuritySecurityHubPage() {\n const navigate = useNavigate();\n const { securityEvents, complianceFrameworks, securityPolicies } = useAssetHandlerStore();\n\n const unresolvedEvents = securityEvents.filter((e) => !e.resolved);\n const criticalEvents = securityEvents.filter(\n (e) => e.severity === 'critical' || e.severity === 'high'\n );\n const activePolicies = securityPolicies.filter((p) => p.status === 'active');\n const avgCompliance =\n complianceFrameworks.length > 0\n ? Math.round(\n complianceFrameworks.reduce((s, f) => s + f.score, 0) / complianceFrameworks.length\n )\n : 0;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>Security Hub</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Security monitoring, compliance, and policy management\n </p>\n </div>\n <Button size=\"sm\">\n <Shield className=\"mr-2 h-4 w-4\" />\n Security Report\n </Button>\n </div>\n\n <PagePurpose>\n Your asset-security control room: watch security events as they happen, track how you score\n against compliance frameworks, and manage the policies that govern your estate. Use it to\n close out the highest-severity, unresolved events first and prove you are audit-ready.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"assethandler-security-hub\"\n steps={[\n {\n id: 'events',\n label: 'Generate a security report',\n description: 'Summarise events, compliance and policy posture.',\n onClick: () => navigate('/reports/report-builder'),\n },\n {\n id: 'audit',\n label: 'Review the audit trail',\n description: 'See who changed what across your assets.',\n onClick: () => navigate('/audit-trail'),\n },\n {\n id: 'backup',\n label: 'Schedule a backup',\n description: 'Protect critical asset data on a recurring schedule.',\n onClick: () => navigate('/security/schedule-backup'),\n },\n ]}\n />\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <EmphasisPanel>\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <AlertTriangle className=\"h-4 w-4\" />\n Unresolved Events\n </div>\n <p className=\"text-2xl font-bold mt-1 tabular-nums text-status-error-text\">\n {unresolvedEvents.length}\n </p>\n </EmphasisPanel>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Shield className=\"h-4 w-4\" />\n Compliance Score\n </div>\n <p className=\"text-2xl font-bold mt-1\">{avgCompliance}%</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <FileText className=\"h-4 w-4\" />\n Active Policies\n </div>\n <p className=\"text-2xl font-bold mt-1\">{activePolicies.length}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Eye className=\"h-4 w-4\" />\n Total Events\n </div>\n <p className=\"text-2xl font-bold mt-1\">{securityEvents.length}</p>\n </CardContent>\n </Card>\n </div>\n\n <Tabs defaultValue=\"events\">\n <TabsList>\n <TabsTrigger value=\"events\">Security Events</TabsTrigger>\n <TabsTrigger value=\"compliance\">Compliance</TabsTrigger>\n <TabsTrigger value=\"policies\">Policies</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"events\" className=\"mt-4\">\n {securityEvents.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-notifications\"\n title=\"No security events\"\n description=\"Security alerts detected across your assets will appear here for triage.\"\n />\n ) : (\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">ID</th>\n <th className=\"text-left p-3 font-medium\">Type</th>\n <th className=\"text-left p-3 font-medium\">Title</th>\n <th className=\"text-left p-3 font-medium\">Severity</th>\n <th className=\"text-left p-3 font-medium\">Source</th>\n <th className=\"text-left p-3 font-medium\">Time</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n </tr>\n </thead>\n <tbody>\n {securityEvents.map((evt) => (\n <tr key={evt.id} className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\">\n <td className=\"p-3 font-mono text-xs\">{evt.id}</td>\n <td className=\"p-3 capitalize text-xs\">{evt.type.replace('_', ' ')}</td>\n <td className=\"p-3\">\n <p className=\"font-medium\">{evt.title}</p>\n <p className=\"text-xs text-text-secondary truncate max-w-xs\">\n {evt.description}\n </p>\n </td>\n <td className=\"p-3\">\n <Badge variant={severityColors[evt.severity]}>{evt.severity}</Badge>\n </td>\n <td className=\"p-3 text-xs\">{evt.source}</td>\n <td className=\"p-3 text-xs\">{new Date(evt.timestamp).toLocaleString()}</td>\n <td className=\"p-3\">\n {evt.resolved ? (\n <Badge variant=\"default\">Resolved</Badge>\n ) : (\n <Badge variant=\"destructive\">Open</Badge>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n )}\n </TabsContent>\n\n <TabsContent value=\"compliance\" className=\"mt-4\">\n {complianceFrameworks.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"No compliance frameworks\"\n description=\"Add frameworks (e.g. ISO 27001, SOC 2) to track your control coverage and score.\"\n />\n ) : (\n <div className=\"grid gap-4 md:grid-cols-2\">\n {complianceFrameworks.map((fw) => (\n <Card key={fw.id}>\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">\n {fw.name} {fw.version}\n </CardTitle>\n <Badge\n variant={\n fw.status === 'compliant'\n ? 'default'\n : fw.status === 'non_compliant'\n ? 'destructive'\n : 'secondary'\n }\n >\n {fw.status.replace('_', ' ')}\n </Badge>\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n <div className=\"text-center\">\n <p className=\"text-3xl font-bold tabular-nums\">{fw.score}%</p>\n <p className=\"text-xs text-text-secondary\">Compliance Score</p>\n </div>\n <div className=\"h-2 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className={`h-full rounded-full ${fw.score >= 90 ? 'bg-status-success-bg' : fw.score >= 70 ? 'bg-status-warning-bg' : 'bg-status-error-bg'}`}\n style={{ width: `${fw.score}%` }}\n />\n </div>\n <div className=\"grid grid-cols-3 gap-2 text-center text-xs\">\n <div>\n <p className=\"font-bold text-status-success-text\">{fw.passedControls}</p>\n <p className=\"text-text-secondary\">Passed</p>\n </div>\n <div>\n <p className=\"font-bold text-status-error-text\">{fw.failedControls}</p>\n <p className=\"text-text-secondary\">Failed</p>\n </div>\n <div>\n <p className=\"font-bold\">{fw.totalControls}</p>\n <p className=\"text-text-secondary\">Total</p>\n </div>\n </div>\n <div className=\"text-xs text-text-secondary\">\n Last: {fw.lastAssessment} &middot; Next: {fw.nextAssessment}\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n </TabsContent>\n\n <TabsContent value=\"policies\" className=\"mt-4\">\n {securityPolicies.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"No security policies\"\n description=\"Define the policies that govern how your assets are secured and managed.\"\n />\n ) : (\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">Name</th>\n <th className=\"text-left p-3 font-medium\">Category</th>\n <th className=\"text-left p-3 font-medium\">Version</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n <th className=\"text-left p-3 font-medium\">Owner</th>\n <th className=\"text-left p-3 font-medium\">Review Date</th>\n </tr>\n </thead>\n <tbody>\n {securityPolicies.map((pol) => (\n <tr key={pol.id} className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\">\n <td className=\"p-3\">\n <p className=\"font-medium\">{pol.name}</p>\n <p className=\"text-xs text-text-secondary truncate max-w-xs\">\n {pol.description}\n </p>\n </td>\n <td className=\"p-3 text-xs\">{pol.category}</td>\n <td className=\"p-3 text-xs\">v{pol.version}</td>\n <td className=\"p-3\">\n <Badge\n variant={\n pol.status === 'active'\n ? 'default'\n : pol.status === 'deprecated'\n ? 'destructive'\n : 'outline'\n }\n >\n {pol.status.replace('_', ' ')}\n </Badge>\n </td>\n <td className=\"p-3 text-xs\">{pol.owner}</td>\n <td className=\"p-3 text-xs\">{pol.reviewDate}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n )}\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n"],"mappings":"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"}