@burdenoff/microfe-assethandler 2026.703.2 → 2026.703.4
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/assethandler/AssetHandlerRoot.js +18 -18
- package/dist/assethandler/hooks/useAssetHandlerNavigate.js +19 -0
- package/dist/assethandler/hooks/useAssetHandlerNavigate.js.map +1 -0
- package/dist/assethandler/pages/AiPredictionsPage.js +29 -29
- package/dist/assethandler/pages/AnalyticsPage.js +154 -154
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +48 -48
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +84 -84
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCreatePage.js +82 -82
- package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetDetailPage.js +104 -103
- package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetListPage.js +132 -132
- package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js +52 -52
- package/dist/assethandler/pages/CmdbBrowserPage.js +27 -27
- package/dist/assethandler/pages/DashboardPage.js +119 -119
- package/dist/assethandler/pages/DashboardPage.js.map +1 -1
- package/dist/assethandler/pages/DigitalTwinPage.js +22 -22
- package/dist/assethandler/pages/DiscoveryJobsPage.js +35 -35
- package/dist/assethandler/pages/EsgDashboardPage.js +32 -32
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js +57 -56
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceFinanceHubPage.js +98 -98
- package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js +58 -57
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/IotDevicesPage.js +29 -29
- package/dist/assethandler/pages/ItilChangeDetailPage.js +76 -75
- package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilChangeManagementPage.js +49 -49
- package/dist/assethandler/pages/ItilIncidentDetailPage.js +63 -62
- package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilIncidentManagementPage.js +72 -72
- package/dist/assethandler/pages/ItilItilhubPage.js +112 -112
- package/dist/assethandler/pages/ItilItilhubPage.js.map +1 -1
- package/dist/assethandler/pages/ItilProblemDetailPage.js +61 -60
- package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilProblemManagementPage.js +46 -46
- package/dist/assethandler/pages/KnowledgeBasePage.js +28 -28
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +52 -52
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +29 -29
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +58 -57
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsOperationsHubPage.js +80 -80
- package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +49 -48
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +52 -52
- package/dist/assethandler/pages/ProvenancePage.js +36 -36
- package/dist/assethandler/pages/SamLicensesPage.js +27 -27
- package/dist/assethandler/pages/SecurityComplianceDetailPage.js +39 -38
- package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecurityPolicyDetailPage.js +50 -49
- package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js +47 -46
- package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityHubPage.js +104 -104
- package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +74 -73
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionListPage.js +77 -77
- package/dist/assethandler/providers/AssetHandlerProvider.js +12 -12
- package/package.json +1 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
2
|
+
import { useAssetHandlerNavigate as t } from "../hooks/useAssetHandlerNavigate.js";
|
|
3
|
+
import { AlertTriangle as n, Eye as r, FileText as i, Shield as a } from "lucide-react";
|
|
4
|
+
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
5
|
+
import { Badge as c, Button as l, Card as u, CardContent as d, CardHeader as f, CardTitle as p, EmphasisPanel as m, GradientText as h, IllustratedEmptyState as g, NextSteps as _, PagePurpose as v, Tabs as y, TabsContent as b, TabsList as x, TabsTrigger as S } from "@burdenoff/fe-libs/ui";
|
|
6
6
|
//#region src/assethandler/pages/SecuritySecurityHubPage.tsx
|
|
7
7
|
var C = {
|
|
8
8
|
critical: "destructive",
|
|
@@ -12,27 +12,27 @@ var C = {
|
|
|
12
12
|
info: "outline"
|
|
13
13
|
};
|
|
14
14
|
function w() {
|
|
15
|
-
let w =
|
|
15
|
+
let w = t(), { securityEvents: T, complianceFrameworks: E, securityPolicies: D } = e(), O = T.filter((e) => !e.resolved);
|
|
16
16
|
T.filter((e) => e.severity === "critical" || e.severity === "high");
|
|
17
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__ */
|
|
18
|
+
return /* @__PURE__ */ s("div", {
|
|
19
19
|
className: "space-y-6 p-6",
|
|
20
20
|
children: [
|
|
21
|
-
/* @__PURE__ */
|
|
21
|
+
/* @__PURE__ */ s("div", {
|
|
22
22
|
className: "flex items-center justify-between",
|
|
23
|
-
children: [/* @__PURE__ */
|
|
23
|
+
children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h1", {
|
|
24
24
|
className: "text-2xl font-bold",
|
|
25
|
-
children: /* @__PURE__ */
|
|
26
|
-
}), /* @__PURE__ */
|
|
25
|
+
children: /* @__PURE__ */ o(h, { children: "Security Hub" })
|
|
26
|
+
}), /* @__PURE__ */ o("p", {
|
|
27
27
|
className: "text-sm text-text-secondary",
|
|
28
28
|
children: "Security monitoring, compliance, and policy management"
|
|
29
|
-
})] }), /* @__PURE__ */
|
|
29
|
+
})] }), /* @__PURE__ */ s(l, {
|
|
30
30
|
size: "sm",
|
|
31
|
-
children: [/* @__PURE__ */
|
|
31
|
+
children: [/* @__PURE__ */ o(a, { className: "mr-2 h-4 w-4" }), "Security Report"]
|
|
32
32
|
})]
|
|
33
33
|
}),
|
|
34
|
-
/* @__PURE__ */
|
|
35
|
-
/* @__PURE__ */
|
|
34
|
+
/* @__PURE__ */ o(v, { 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__ */ o(_, {
|
|
36
36
|
storageKey: "assethandler-security-hub",
|
|
37
37
|
steps: [
|
|
38
38
|
{
|
|
@@ -55,152 +55,152 @@ function w() {
|
|
|
55
55
|
}
|
|
56
56
|
]
|
|
57
57
|
}),
|
|
58
|
-
/* @__PURE__ */
|
|
58
|
+
/* @__PURE__ */ s("div", {
|
|
59
59
|
className: "grid gap-4 md:grid-cols-4",
|
|
60
60
|
children: [
|
|
61
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ s(m, { children: [/* @__PURE__ */ s("div", {
|
|
62
62
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
63
|
-
children: [/* @__PURE__ */
|
|
64
|
-
}), /* @__PURE__ */
|
|
63
|
+
children: [/* @__PURE__ */ o(n, { className: "h-4 w-4" }), "Unresolved Events"]
|
|
64
|
+
}), /* @__PURE__ */ o("p", {
|
|
65
65
|
className: "text-2xl font-bold mt-1 tabular-nums text-status-error-text",
|
|
66
66
|
children: O.length
|
|
67
67
|
})] }),
|
|
68
|
-
/* @__PURE__ */
|
|
68
|
+
/* @__PURE__ */ o(u, { children: /* @__PURE__ */ s(d, {
|
|
69
69
|
className: "pt-4",
|
|
70
|
-
children: [/* @__PURE__ */
|
|
70
|
+
children: [/* @__PURE__ */ s("div", {
|
|
71
71
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
72
|
-
children: [/* @__PURE__ */
|
|
73
|
-
}), /* @__PURE__ */
|
|
72
|
+
children: [/* @__PURE__ */ o(a, { className: "h-4 w-4" }), "Compliance Score"]
|
|
73
|
+
}), /* @__PURE__ */ s("p", {
|
|
74
74
|
className: "text-2xl font-bold mt-1",
|
|
75
75
|
children: [A, "%"]
|
|
76
76
|
})]
|
|
77
77
|
}) }),
|
|
78
|
-
/* @__PURE__ */
|
|
78
|
+
/* @__PURE__ */ o(u, { children: /* @__PURE__ */ s(d, {
|
|
79
79
|
className: "pt-4",
|
|
80
|
-
children: [/* @__PURE__ */
|
|
80
|
+
children: [/* @__PURE__ */ s("div", {
|
|
81
81
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
82
|
-
children: [/* @__PURE__ */
|
|
83
|
-
}), /* @__PURE__ */
|
|
82
|
+
children: [/* @__PURE__ */ o(i, { className: "h-4 w-4" }), "Active Policies"]
|
|
83
|
+
}), /* @__PURE__ */ o("p", {
|
|
84
84
|
className: "text-2xl font-bold mt-1",
|
|
85
85
|
children: k.length
|
|
86
86
|
})]
|
|
87
87
|
}) }),
|
|
88
|
-
/* @__PURE__ */
|
|
88
|
+
/* @__PURE__ */ o(u, { children: /* @__PURE__ */ s(d, {
|
|
89
89
|
className: "pt-4",
|
|
90
|
-
children: [/* @__PURE__ */
|
|
90
|
+
children: [/* @__PURE__ */ s("div", {
|
|
91
91
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
92
|
-
children: [/* @__PURE__ */
|
|
93
|
-
}), /* @__PURE__ */
|
|
92
|
+
children: [/* @__PURE__ */ o(r, { className: "h-4 w-4" }), "Total Events"]
|
|
93
|
+
}), /* @__PURE__ */ o("p", {
|
|
94
94
|
className: "text-2xl font-bold mt-1",
|
|
95
95
|
children: T.length
|
|
96
96
|
})]
|
|
97
97
|
}) })
|
|
98
98
|
]
|
|
99
99
|
}),
|
|
100
|
-
/* @__PURE__ */
|
|
100
|
+
/* @__PURE__ */ s(y, {
|
|
101
101
|
defaultValue: "events",
|
|
102
102
|
children: [
|
|
103
|
-
/* @__PURE__ */
|
|
104
|
-
/* @__PURE__ */
|
|
103
|
+
/* @__PURE__ */ s(x, { children: [
|
|
104
|
+
/* @__PURE__ */ o(S, {
|
|
105
105
|
value: "events",
|
|
106
106
|
children: "Security Events"
|
|
107
107
|
}),
|
|
108
|
-
/* @__PURE__ */
|
|
108
|
+
/* @__PURE__ */ o(S, {
|
|
109
109
|
value: "compliance",
|
|
110
110
|
children: "Compliance"
|
|
111
111
|
}),
|
|
112
|
-
/* @__PURE__ */
|
|
112
|
+
/* @__PURE__ */ o(S, {
|
|
113
113
|
value: "policies",
|
|
114
114
|
children: "Policies"
|
|
115
115
|
})
|
|
116
116
|
] }),
|
|
117
|
-
/* @__PURE__ */
|
|
117
|
+
/* @__PURE__ */ o(b, {
|
|
118
118
|
value: "events",
|
|
119
119
|
className: "mt-4",
|
|
120
|
-
children: T.length === 0 ? /* @__PURE__ */
|
|
120
|
+
children: T.length === 0 ? /* @__PURE__ */ o(g, {
|
|
121
121
|
illustration: "empty-notifications",
|
|
122
122
|
title: "No security events",
|
|
123
123
|
description: "Security alerts detected across your assets will appear here for triage."
|
|
124
|
-
}) : /* @__PURE__ */
|
|
124
|
+
}) : /* @__PURE__ */ o(u, { children: /* @__PURE__ */ o(d, {
|
|
125
125
|
className: "p-0",
|
|
126
|
-
children: /* @__PURE__ */
|
|
126
|
+
children: /* @__PURE__ */ o("div", {
|
|
127
127
|
className: "overflow-x-auto",
|
|
128
|
-
children: /* @__PURE__ */
|
|
128
|
+
children: /* @__PURE__ */ s("table", {
|
|
129
129
|
className: "w-full text-sm",
|
|
130
|
-
children: [/* @__PURE__ */
|
|
130
|
+
children: [/* @__PURE__ */ o("thead", { children: /* @__PURE__ */ s("tr", {
|
|
131
131
|
className: "border-b bg-bg-sunken/50",
|
|
132
132
|
children: [
|
|
133
|
-
/* @__PURE__ */
|
|
133
|
+
/* @__PURE__ */ o("th", {
|
|
134
134
|
className: "text-left p-3 font-medium",
|
|
135
135
|
children: "ID"
|
|
136
136
|
}),
|
|
137
|
-
/* @__PURE__ */
|
|
137
|
+
/* @__PURE__ */ o("th", {
|
|
138
138
|
className: "text-left p-3 font-medium",
|
|
139
139
|
children: "Type"
|
|
140
140
|
}),
|
|
141
|
-
/* @__PURE__ */
|
|
141
|
+
/* @__PURE__ */ o("th", {
|
|
142
142
|
className: "text-left p-3 font-medium",
|
|
143
143
|
children: "Title"
|
|
144
144
|
}),
|
|
145
|
-
/* @__PURE__ */
|
|
145
|
+
/* @__PURE__ */ o("th", {
|
|
146
146
|
className: "text-left p-3 font-medium",
|
|
147
147
|
children: "Severity"
|
|
148
148
|
}),
|
|
149
|
-
/* @__PURE__ */
|
|
149
|
+
/* @__PURE__ */ o("th", {
|
|
150
150
|
className: "text-left p-3 font-medium",
|
|
151
151
|
children: "Source"
|
|
152
152
|
}),
|
|
153
|
-
/* @__PURE__ */
|
|
153
|
+
/* @__PURE__ */ o("th", {
|
|
154
154
|
className: "text-left p-3 font-medium",
|
|
155
155
|
children: "Time"
|
|
156
156
|
}),
|
|
157
|
-
/* @__PURE__ */
|
|
157
|
+
/* @__PURE__ */ o("th", {
|
|
158
158
|
className: "text-left p-3 font-medium",
|
|
159
159
|
children: "Status"
|
|
160
160
|
})
|
|
161
161
|
]
|
|
162
|
-
}) }), /* @__PURE__ */
|
|
162
|
+
}) }), /* @__PURE__ */ o("tbody", { children: T.map((e) => /* @__PURE__ */ s("tr", {
|
|
163
163
|
className: "border-b hover:bg-bg-sunken/50 cursor-pointer",
|
|
164
164
|
children: [
|
|
165
|
-
/* @__PURE__ */
|
|
165
|
+
/* @__PURE__ */ o("td", {
|
|
166
166
|
className: "p-3 font-mono text-xs",
|
|
167
167
|
children: e.id
|
|
168
168
|
}),
|
|
169
|
-
/* @__PURE__ */
|
|
169
|
+
/* @__PURE__ */ o("td", {
|
|
170
170
|
className: "p-3 capitalize text-xs",
|
|
171
171
|
children: e.type.replace("_", " ")
|
|
172
172
|
}),
|
|
173
|
-
/* @__PURE__ */
|
|
173
|
+
/* @__PURE__ */ s("td", {
|
|
174
174
|
className: "p-3",
|
|
175
|
-
children: [/* @__PURE__ */
|
|
175
|
+
children: [/* @__PURE__ */ o("p", {
|
|
176
176
|
className: "font-medium",
|
|
177
177
|
children: e.title
|
|
178
|
-
}), /* @__PURE__ */
|
|
178
|
+
}), /* @__PURE__ */ o("p", {
|
|
179
179
|
className: "text-xs text-text-secondary truncate max-w-xs",
|
|
180
180
|
children: e.description
|
|
181
181
|
})]
|
|
182
182
|
}),
|
|
183
|
-
/* @__PURE__ */
|
|
183
|
+
/* @__PURE__ */ o("td", {
|
|
184
184
|
className: "p-3",
|
|
185
|
-
children: /* @__PURE__ */
|
|
185
|
+
children: /* @__PURE__ */ o(c, {
|
|
186
186
|
variant: C[e.severity],
|
|
187
187
|
children: e.severity
|
|
188
188
|
})
|
|
189
189
|
}),
|
|
190
|
-
/* @__PURE__ */
|
|
190
|
+
/* @__PURE__ */ o("td", {
|
|
191
191
|
className: "p-3 text-xs",
|
|
192
192
|
children: e.source
|
|
193
193
|
}),
|
|
194
|
-
/* @__PURE__ */
|
|
194
|
+
/* @__PURE__ */ o("td", {
|
|
195
195
|
className: "p-3 text-xs",
|
|
196
196
|
children: new Date(e.timestamp).toLocaleString()
|
|
197
197
|
}),
|
|
198
|
-
/* @__PURE__ */
|
|
198
|
+
/* @__PURE__ */ o("td", {
|
|
199
199
|
className: "p-3",
|
|
200
|
-
children: e.resolved ? /* @__PURE__ */
|
|
200
|
+
children: e.resolved ? /* @__PURE__ */ o(c, {
|
|
201
201
|
variant: "default",
|
|
202
202
|
children: "Resolved"
|
|
203
|
-
}) : /* @__PURE__ */
|
|
203
|
+
}) : /* @__PURE__ */ o(c, {
|
|
204
204
|
variant: "destructive",
|
|
205
205
|
children: "Open"
|
|
206
206
|
})
|
|
@@ -211,78 +211,78 @@ function w() {
|
|
|
211
211
|
})
|
|
212
212
|
}) })
|
|
213
213
|
}),
|
|
214
|
-
/* @__PURE__ */
|
|
214
|
+
/* @__PURE__ */ o(b, {
|
|
215
215
|
value: "compliance",
|
|
216
216
|
className: "mt-4",
|
|
217
|
-
children: E.length === 0 ? /* @__PURE__ */
|
|
217
|
+
children: E.length === 0 ? /* @__PURE__ */ o(g, {
|
|
218
218
|
illustration: "empty-generic",
|
|
219
219
|
title: "No compliance frameworks",
|
|
220
220
|
description: "Add frameworks (e.g. ISO 27001, SOC 2) to track your control coverage and score."
|
|
221
|
-
}) : /* @__PURE__ */
|
|
221
|
+
}) : /* @__PURE__ */ o("div", {
|
|
222
222
|
className: "grid gap-4 md:grid-cols-2",
|
|
223
|
-
children: E.map((e) => /* @__PURE__ */
|
|
223
|
+
children: E.map((e) => /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ o(f, {
|
|
224
224
|
className: "pb-2",
|
|
225
|
-
children: /* @__PURE__ */
|
|
225
|
+
children: /* @__PURE__ */ s("div", {
|
|
226
226
|
className: "flex items-center justify-between",
|
|
227
|
-
children: [/* @__PURE__ */
|
|
227
|
+
children: [/* @__PURE__ */ s(p, {
|
|
228
228
|
className: "text-base",
|
|
229
229
|
children: [
|
|
230
230
|
e.name,
|
|
231
231
|
" ",
|
|
232
232
|
e.version
|
|
233
233
|
]
|
|
234
|
-
}), /* @__PURE__ */
|
|
234
|
+
}), /* @__PURE__ */ o(c, {
|
|
235
235
|
variant: e.status === "compliant" ? "default" : e.status === "non_compliant" ? "destructive" : "secondary",
|
|
236
236
|
children: e.status.replace("_", " ")
|
|
237
237
|
})]
|
|
238
238
|
})
|
|
239
|
-
}), /* @__PURE__ */
|
|
239
|
+
}), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ s("div", {
|
|
240
240
|
className: "space-y-3",
|
|
241
241
|
children: [
|
|
242
|
-
/* @__PURE__ */
|
|
242
|
+
/* @__PURE__ */ s("div", {
|
|
243
243
|
className: "text-center",
|
|
244
|
-
children: [/* @__PURE__ */
|
|
244
|
+
children: [/* @__PURE__ */ s("p", {
|
|
245
245
|
className: "text-3xl font-bold tabular-nums",
|
|
246
246
|
children: [e.score, "%"]
|
|
247
|
-
}), /* @__PURE__ */
|
|
247
|
+
}), /* @__PURE__ */ o("p", {
|
|
248
248
|
className: "text-xs text-text-secondary",
|
|
249
249
|
children: "Compliance Score"
|
|
250
250
|
})]
|
|
251
251
|
}),
|
|
252
|
-
/* @__PURE__ */
|
|
252
|
+
/* @__PURE__ */ o("div", {
|
|
253
253
|
className: "h-2 rounded-full bg-bg-sunken overflow-hidden",
|
|
254
|
-
children: /* @__PURE__ */
|
|
254
|
+
children: /* @__PURE__ */ o("div", {
|
|
255
255
|
className: `h-full rounded-full ${e.score >= 90 ? "bg-status-success-bg" : e.score >= 70 ? "bg-status-warning-bg" : "bg-status-error-bg"}`,
|
|
256
256
|
style: { width: `${e.score}%` }
|
|
257
257
|
})
|
|
258
258
|
}),
|
|
259
|
-
/* @__PURE__ */
|
|
259
|
+
/* @__PURE__ */ s("div", {
|
|
260
260
|
className: "grid grid-cols-3 gap-2 text-center text-xs",
|
|
261
261
|
children: [
|
|
262
|
-
/* @__PURE__ */
|
|
262
|
+
/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("p", {
|
|
263
263
|
className: "font-bold text-status-success-text",
|
|
264
264
|
children: e.passedControls
|
|
265
|
-
}), /* @__PURE__ */
|
|
265
|
+
}), /* @__PURE__ */ o("p", {
|
|
266
266
|
className: "text-text-secondary",
|
|
267
267
|
children: "Passed"
|
|
268
268
|
})] }),
|
|
269
|
-
/* @__PURE__ */
|
|
269
|
+
/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("p", {
|
|
270
270
|
className: "font-bold text-status-error-text",
|
|
271
271
|
children: e.failedControls
|
|
272
|
-
}), /* @__PURE__ */
|
|
272
|
+
}), /* @__PURE__ */ o("p", {
|
|
273
273
|
className: "text-text-secondary",
|
|
274
274
|
children: "Failed"
|
|
275
275
|
})] }),
|
|
276
|
-
/* @__PURE__ */
|
|
276
|
+
/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("p", {
|
|
277
277
|
className: "font-bold",
|
|
278
278
|
children: e.totalControls
|
|
279
|
-
}), /* @__PURE__ */
|
|
279
|
+
}), /* @__PURE__ */ o("p", {
|
|
280
280
|
className: "text-text-secondary",
|
|
281
281
|
children: "Total"
|
|
282
282
|
})] })
|
|
283
283
|
]
|
|
284
284
|
}),
|
|
285
|
-
/* @__PURE__ */
|
|
285
|
+
/* @__PURE__ */ s("div", {
|
|
286
286
|
className: "text-xs text-text-secondary",
|
|
287
287
|
children: [
|
|
288
288
|
"Last: ",
|
|
@@ -295,80 +295,80 @@ function w() {
|
|
|
295
295
|
}) })] }, e.id))
|
|
296
296
|
})
|
|
297
297
|
}),
|
|
298
|
-
/* @__PURE__ */
|
|
298
|
+
/* @__PURE__ */ o(b, {
|
|
299
299
|
value: "policies",
|
|
300
300
|
className: "mt-4",
|
|
301
|
-
children: D.length === 0 ? /* @__PURE__ */
|
|
301
|
+
children: D.length === 0 ? /* @__PURE__ */ o(g, {
|
|
302
302
|
illustration: "empty-files",
|
|
303
303
|
title: "No security policies",
|
|
304
304
|
description: "Define the policies that govern how your assets are secured and managed."
|
|
305
|
-
}) : /* @__PURE__ */
|
|
305
|
+
}) : /* @__PURE__ */ o(u, { children: /* @__PURE__ */ o(d, {
|
|
306
306
|
className: "p-0",
|
|
307
|
-
children: /* @__PURE__ */
|
|
307
|
+
children: /* @__PURE__ */ o("div", {
|
|
308
308
|
className: "overflow-x-auto",
|
|
309
|
-
children: /* @__PURE__ */
|
|
309
|
+
children: /* @__PURE__ */ s("table", {
|
|
310
310
|
className: "w-full text-sm",
|
|
311
|
-
children: [/* @__PURE__ */
|
|
311
|
+
children: [/* @__PURE__ */ o("thead", { children: /* @__PURE__ */ s("tr", {
|
|
312
312
|
className: "border-b bg-bg-sunken/50",
|
|
313
313
|
children: [
|
|
314
|
-
/* @__PURE__ */
|
|
314
|
+
/* @__PURE__ */ o("th", {
|
|
315
315
|
className: "text-left p-3 font-medium",
|
|
316
316
|
children: "Name"
|
|
317
317
|
}),
|
|
318
|
-
/* @__PURE__ */
|
|
318
|
+
/* @__PURE__ */ o("th", {
|
|
319
319
|
className: "text-left p-3 font-medium",
|
|
320
320
|
children: "Category"
|
|
321
321
|
}),
|
|
322
|
-
/* @__PURE__ */
|
|
322
|
+
/* @__PURE__ */ o("th", {
|
|
323
323
|
className: "text-left p-3 font-medium",
|
|
324
324
|
children: "Version"
|
|
325
325
|
}),
|
|
326
|
-
/* @__PURE__ */
|
|
326
|
+
/* @__PURE__ */ o("th", {
|
|
327
327
|
className: "text-left p-3 font-medium",
|
|
328
328
|
children: "Status"
|
|
329
329
|
}),
|
|
330
|
-
/* @__PURE__ */
|
|
330
|
+
/* @__PURE__ */ o("th", {
|
|
331
331
|
className: "text-left p-3 font-medium",
|
|
332
332
|
children: "Owner"
|
|
333
333
|
}),
|
|
334
|
-
/* @__PURE__ */
|
|
334
|
+
/* @__PURE__ */ o("th", {
|
|
335
335
|
className: "text-left p-3 font-medium",
|
|
336
336
|
children: "Review Date"
|
|
337
337
|
})
|
|
338
338
|
]
|
|
339
|
-
}) }), /* @__PURE__ */
|
|
339
|
+
}) }), /* @__PURE__ */ o("tbody", { children: D.map((e) => /* @__PURE__ */ s("tr", {
|
|
340
340
|
className: "border-b hover:bg-bg-sunken/50 cursor-pointer",
|
|
341
341
|
children: [
|
|
342
|
-
/* @__PURE__ */
|
|
342
|
+
/* @__PURE__ */ s("td", {
|
|
343
343
|
className: "p-3",
|
|
344
|
-
children: [/* @__PURE__ */
|
|
344
|
+
children: [/* @__PURE__ */ o("p", {
|
|
345
345
|
className: "font-medium",
|
|
346
346
|
children: e.name
|
|
347
|
-
}), /* @__PURE__ */
|
|
347
|
+
}), /* @__PURE__ */ o("p", {
|
|
348
348
|
className: "text-xs text-text-secondary truncate max-w-xs",
|
|
349
349
|
children: e.description
|
|
350
350
|
})]
|
|
351
351
|
}),
|
|
352
|
-
/* @__PURE__ */
|
|
352
|
+
/* @__PURE__ */ o("td", {
|
|
353
353
|
className: "p-3 text-xs",
|
|
354
354
|
children: e.category
|
|
355
355
|
}),
|
|
356
|
-
/* @__PURE__ */
|
|
356
|
+
/* @__PURE__ */ s("td", {
|
|
357
357
|
className: "p-3 text-xs",
|
|
358
358
|
children: ["v", e.version]
|
|
359
359
|
}),
|
|
360
|
-
/* @__PURE__ */
|
|
360
|
+
/* @__PURE__ */ o("td", {
|
|
361
361
|
className: "p-3",
|
|
362
|
-
children: /* @__PURE__ */
|
|
362
|
+
children: /* @__PURE__ */ o(c, {
|
|
363
363
|
variant: e.status === "active" ? "default" : e.status === "deprecated" ? "destructive" : "outline",
|
|
364
364
|
children: e.status.replace("_", " ")
|
|
365
365
|
})
|
|
366
366
|
}),
|
|
367
|
-
/* @__PURE__ */
|
|
367
|
+
/* @__PURE__ */ o("td", {
|
|
368
368
|
className: "p-3 text-xs",
|
|
369
369
|
children: e.owner
|
|
370
370
|
}),
|
|
371
|
-
/* @__PURE__ */
|
|
371
|
+
/* @__PURE__ */ o("td", {
|
|
372
372
|
className: "p-3 text-xs",
|
|
373
373
|
children: e.reviewDate
|
|
374
374
|
})
|
|
@@ -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 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\">\n {new Date(evt.timestamp).toLocaleString()}\n </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} · 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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"}
|
|
1
|
+
{"version":3,"file":"SecuritySecurityHubPage.js","names":[],"sources":["../../../src/assethandler/pages/SecuritySecurityHubPage.tsx"],"sourcesContent":["import { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport {\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 { 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 = useAssetHandlerNavigate();\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\">\n {new Date(evt.timestamp).toLocaleString()}\n </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} · 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":";;;;;;AAqBA,IAAM,IAAsF;CAC1F,UAAU;CACV,MAAM;CACN,QAAQ;CACR,KAAK;CACL,MAAM;CACP;AAED,SAAgB,IAA0B;CACxC,IAAM,IAAW,GAAyB,EACpC,EAAE,mBAAgB,yBAAsB,wBAAqB,GAAsB,EAEnF,IAAmB,EAAe,QAAQ,MAAM,CAAC,EAAE,SAAS;AAC3C,GAAe,QACnC,MAAM,EAAE,aAAa,cAAc,EAAE,aAAa,OACpD;CACD,IAAM,IAAiB,EAAiB,QAAQ,MAAM,EAAE,WAAW,SAAS,EACtE,IACJ,EAAqB,SAAS,IAC1B,KAAK,MACH,EAAqB,QAAQ,GAAG,MAAM,IAAI,EAAE,OAAO,EAAE,GAAG,EAAqB,OAC9E,GACD;AAEN,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eACZ,kBAAC,GAAD,EAAA,UAAc,gBAA2B,CAAA;KACtC,CAAA,EACL,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAEvC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,GAAD;KAAQ,MAAK;eAAb,CACE,kBAAC,GAAD,EAAQ,WAAU,gBAAiB,CAAA,EAAA,kBAE5B;OACL;;GAEN,kBAAC,GAAD,EAAA,UAAa,gRAIC,CAAA;GAEd,kBAAC,GAAD;IACE,YAAW;IACX,OAAO;KACL;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,eAAe,EAAS,0BAA0B;MACnD;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,eAAe,EAAS,eAAe;MACxC;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,eAAe,EAAS,4BAA4B;MACrD;KACF;IACD,CAAA;GAEF,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAe,WAAU,WAAY,CAAA,EAAA,oBAEjC;SACN,kBAAC,KAAD;MAAG,WAAU;gBACV,EAAiB;MAChB,CAAA,CACU,EAAA,CAAA;KAChB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EAAA,mBAE1B;UACN,kBAAC,KAAD;OAAG,WAAU;iBAAb,CAAwC,GAAc,IAAK;SAC/C;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAAA,kBAE5B;UACN,kBAAC,KAAD;OAAG,WAAU;iBAA2B,EAAe;OAAW,CAAA,CACtD;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAK,WAAU,WAAY,CAAA,EAAA,eAEvB;UACN,kBAAC,KAAD;OAAG,WAAU;iBAA2B,EAAe;OAAW,CAAA,CACtD;SACT,CAAA;KACH;;GAEN,kBAAC,GAAD;IAAM,cAAa;cAAnB;KACE,kBAAC,GAAD,EAAA,UAAA;MACE,kBAAC,GAAD;OAAa,OAAM;iBAAS;OAA6B,CAAA;MACzD,kBAAC,GAAD;OAAa,OAAM;iBAAa;OAAwB,CAAA;MACxD,kBAAC,GAAD;OAAa,OAAM;iBAAW;OAAsB,CAAA;MAC3C,EAAA,CAAA;KAEX,kBAAC,GAAD;MAAa,OAAM;MAAS,WAAU;gBACnC,EAAe,WAAW,IACzB,kBAAC,GAAD;OACE,cAAa;OACb,OAAM;OACN,aAAY;OACZ,CAAA,GAEF,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;OAAa,WAAU;iBACrB,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,SAAD;SAAO,WAAU;mBAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;UAAI,WAAU;oBAAd;WACE,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAO,CAAA;WACjD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAS,CAAA;WACnD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAU,CAAA;WACpD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAa,CAAA;WACvD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAW,CAAA;WACrD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAS,CAAA;WACnD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAW,CAAA;WAClD;aACC,CAAA,EACR,kBAAC,SAAD,EAAA,UACG,EAAe,KAAK,MACnB,kBAAC,MAAD;UAAiB,WAAU;oBAA3B;WACE,kBAAC,MAAD;YAAI,WAAU;sBAAyB,EAAI;YAAQ,CAAA;WACnD,kBAAC,MAAD;YAAI,WAAU;sBAA0B,EAAI,KAAK,QAAQ,KAAK,IAAI;YAAM,CAAA;WACxE,kBAAC,MAAD;YAAI,WAAU;sBAAd,CACE,kBAAC,KAAD;aAAG,WAAU;uBAAe,EAAI;aAAU,CAAA,EAC1C,kBAAC,KAAD;aAAG,WAAU;uBACV,EAAI;aACH,CAAA,CACD;;WACL,kBAAC,MAAD;YAAI,WAAU;sBACZ,kBAAC,GAAD;aAAO,SAAS,EAAe,EAAI;uBAAY,EAAI;aAAiB,CAAA;YACjE,CAAA;WACL,kBAAC,MAAD;YAAI,WAAU;sBAAe,EAAI;YAAY,CAAA;WAC7C,kBAAC,MAAD;YAAI,WAAU;sBACX,IAAI,KAAK,EAAI,UAAU,CAAC,gBAAgB;YACtC,CAAA;WACL,kBAAC,MAAD;YAAI,WAAU;sBACX,EAAI,WACH,kBAAC,GAAD;aAAO,SAAQ;uBAAU;aAAgB,CAAA,GAEzC,kBAAC,GAAD;aAAO,SAAQ;uBAAc;aAAY,CAAA;YAExC,CAAA;WACF;YAvBI,EAAI,GAuBR,CACL,EACI,CAAA,CACF;;QACJ,CAAA;OACM,CAAA,EACT,CAAA;MAEG,CAAA;KAEd,kBAAC,GAAD;MAAa,OAAM;MAAa,WAAU;gBACvC,EAAqB,WAAW,IAC/B,kBAAC,GAAD;OACE,cAAa;OACb,OAAM;OACN,aAAY;OACZ,CAAA,GAEF,kBAAC,OAAD;OAAK,WAAU;iBACZ,EAAqB,KAAK,MACzB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;QAAY,WAAU;kBACpB,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD;UAAW,WAAU;oBAArB;WACG,EAAG;WAAK;WAAE,EAAG;WACJ;aACZ,kBAAC,GAAD;UACE,SACE,EAAG,WAAW,cACV,YACA,EAAG,WAAW,kBACZ,gBACA;oBAGP,EAAG,OAAO,QAAQ,KAAK,IAAI;UACtB,CAAA,CACJ;;QACK,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAb,CAAgD,EAAG,OAAM,IAAK;cAC9D,kBAAC,KAAD;WAAG,WAAU;qBAA8B;WAAoB,CAAA,CAC3D;;SACN,kBAAC,OAAD;UAAK,WAAU;oBACb,kBAAC,OAAD;WACE,WAAW,uBAAuB,EAAG,SAAS,KAAK,yBAAyB,EAAG,SAAS,KAAK,yBAAyB;WACtH,OAAO,EAAE,OAAO,GAAG,EAAG,MAAM,IAAI;WAChC,CAAA;UACE,CAAA;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;YAAG,WAAU;sBAAsC,EAAG;YAAmB,CAAA,EACzE,kBAAC,KAAD;YAAG,WAAU;sBAAsB;YAAU,CAAA,CACzC,EAAA,CAAA;WACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;YAAG,WAAU;sBAAoC,EAAG;YAAmB,CAAA,EACvE,kBAAC,KAAD;YAAG,WAAU;sBAAsB;YAAU,CAAA,CACzC,EAAA,CAAA;WACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;YAAG,WAAU;sBAAa,EAAG;YAAkB,CAAA,EAC/C,kBAAC,KAAD;YAAG,WAAU;sBAAsB;YAAS,CAAA,CACxC,EAAA,CAAA;WACF;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf;WAA6C;WACpC,EAAG;WAAe;WAAiB,EAAG;WACzC;;SACF;WACM,CAAA,CACT,EAAA,EAlDI,EAAG,GAkDP,CACP;OACE,CAAA;MAEI,CAAA;KAEd,kBAAC,GAAD;MAAa,OAAM;MAAW,WAAU;gBACrC,EAAiB,WAAW,IAC3B,kBAAC,GAAD;OACE,cAAa;OACb,OAAM;OACN,aAAY;OACZ,CAAA,GAEF,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;OAAa,WAAU;iBACrB,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,SAAD;SAAO,WAAU;mBAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;UAAI,WAAU;oBAAd;WACE,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAS,CAAA;WACnD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAa,CAAA;WACvD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAY,CAAA;WACtD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAW,CAAA;WACrD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAU,CAAA;WACpD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAgB,CAAA;WACvD;aACC,CAAA,EACR,kBAAC,SAAD,EAAA,UACG,EAAiB,KAAK,MACrB,kBAAC,MAAD;UAAiB,WAAU;oBAA3B;WACE,kBAAC,MAAD;YAAI,WAAU;sBAAd,CACE,kBAAC,KAAD;aAAG,WAAU;uBAAe,EAAI;aAAS,CAAA,EACzC,kBAAC,KAAD;aAAG,WAAU;uBACV,EAAI;aACH,CAAA,CACD;;WACL,kBAAC,MAAD;YAAI,WAAU;sBAAe,EAAI;YAAc,CAAA;WAC/C,kBAAC,MAAD;YAAI,WAAU;sBAAd,CAA4B,KAAE,EAAI,QAAa;;WAC/C,kBAAC,MAAD;YAAI,WAAU;sBACZ,kBAAC,GAAD;aACE,SACE,EAAI,WAAW,WACX,YACA,EAAI,WAAW,eACb,gBACA;uBAGP,EAAI,OAAO,QAAQ,KAAK,IAAI;aACvB,CAAA;YACL,CAAA;WACL,kBAAC,MAAD;YAAI,WAAU;sBAAe,EAAI;YAAW,CAAA;WAC5C,kBAAC,MAAD;YAAI,WAAU;sBAAe,EAAI;YAAgB,CAAA;WAC9C;YAxBI,EAAI,GAwBR,CACL,EACI,CAAA,CACF;;QACJ,CAAA;OACM,CAAA,EACT,CAAA;MAEG,CAAA;KACT;;GACH"}
|