@burdenoff/microfe-assethandler 2026.703.2 → 2026.703.3

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 (64) hide show
  1. package/dist/assethandler/AssetHandlerRoot.js +18 -18
  2. package/dist/assethandler/hooks/useAssetHandlerNavigate.js +19 -0
  3. package/dist/assethandler/hooks/useAssetHandlerNavigate.js.map +1 -0
  4. package/dist/assethandler/pages/AiPredictionsPage.js +29 -29
  5. package/dist/assethandler/pages/AnalyticsPage.js +154 -154
  6. package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +48 -48
  7. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +84 -84
  8. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
  9. package/dist/assethandler/pages/AssetsAssetCreatePage.js +82 -82
  10. package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
  11. package/dist/assethandler/pages/AssetsAssetDetailPage.js +104 -103
  12. package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
  13. package/dist/assethandler/pages/AssetsAssetListPage.js +132 -132
  14. package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
  15. package/dist/assethandler/pages/AssetsAssetTrackingPage.js +52 -52
  16. package/dist/assethandler/pages/CmdbBrowserPage.js +27 -27
  17. package/dist/assethandler/pages/DashboardPage.js +119 -119
  18. package/dist/assethandler/pages/DashboardPage.js.map +1 -1
  19. package/dist/assethandler/pages/DigitalTwinPage.js +22 -22
  20. package/dist/assethandler/pages/DiscoveryJobsPage.js +35 -35
  21. package/dist/assethandler/pages/EsgDashboardPage.js +32 -32
  22. package/dist/assethandler/pages/FinanceBudgetDetailPage.js +57 -56
  23. package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
  24. package/dist/assethandler/pages/FinanceFinanceHubPage.js +98 -98
  25. package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
  26. package/dist/assethandler/pages/FinanceInvoiceDetailPage.js +58 -57
  27. package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
  28. package/dist/assethandler/pages/IotDevicesPage.js +29 -29
  29. package/dist/assethandler/pages/ItilChangeDetailPage.js +76 -75
  30. package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
  31. package/dist/assethandler/pages/ItilChangeManagementPage.js +49 -49
  32. package/dist/assethandler/pages/ItilIncidentDetailPage.js +63 -62
  33. package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
  34. package/dist/assethandler/pages/ItilIncidentManagementPage.js +72 -72
  35. package/dist/assethandler/pages/ItilItilhubPage.js +112 -112
  36. package/dist/assethandler/pages/ItilItilhubPage.js.map +1 -1
  37. package/dist/assethandler/pages/ItilProblemDetailPage.js +61 -60
  38. package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
  39. package/dist/assethandler/pages/ItilProblemManagementPage.js +46 -46
  40. package/dist/assethandler/pages/KnowledgeBasePage.js +28 -28
  41. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +52 -52
  42. package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +29 -29
  43. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +58 -57
  44. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
  45. package/dist/assethandler/pages/OperationsOperationsHubPage.js +80 -80
  46. package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
  47. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +49 -48
  48. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
  49. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +52 -52
  50. package/dist/assethandler/pages/ProvenancePage.js +36 -36
  51. package/dist/assethandler/pages/SamLicensesPage.js +27 -27
  52. package/dist/assethandler/pages/SecurityComplianceDetailPage.js +39 -38
  53. package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
  54. package/dist/assethandler/pages/SecurityPolicyDetailPage.js +50 -49
  55. package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
  56. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js +47 -46
  57. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
  58. package/dist/assethandler/pages/SecuritySecurityHubPage.js +104 -104
  59. package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
  60. package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +74 -73
  61. package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
  62. package/dist/assethandler/pages/TransactionsTransactionListPage.js +77 -77
  63. package/dist/assethandler/providers/AssetHandlerProvider.js +12 -12
  64. package/package.json +1 -1
@@ -1,8 +1,8 @@
1
1
  import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
2
- import { AlertTriangle as t, Eye as n, FileText as r, Shield as i } from "lucide-react";
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";
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 = a(), { securityEvents: T, complianceFrameworks: E, securityPolicies: D } = e(), O = T.filter((e) => !e.resolved);
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__ */ S("div", {
18
+ return /* @__PURE__ */ s("div", {
19
19
  className: "space-y-6 p-6",
20
20
  children: [
21
- /* @__PURE__ */ S("div", {
21
+ /* @__PURE__ */ s("div", {
22
22
  className: "flex items-center justify-between",
23
- children: [/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("h1", {
23
+ children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h1", {
24
24
  className: "text-2xl font-bold",
25
- children: /* @__PURE__ */ x(p, { children: "Security Hub" })
26
- }), /* @__PURE__ */ x("p", {
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__ */ S(s, {
29
+ })] }), /* @__PURE__ */ s(l, {
30
30
  size: "sm",
31
- children: [/* @__PURE__ */ x(i, { className: "mr-2 h-4 w-4" }), "Security Report"]
31
+ children: [/* @__PURE__ */ o(a, { className: "mr-2 h-4 w-4" }), "Security Report"]
32
32
  })]
33
33
  }),
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, {
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__ */ S("div", {
58
+ /* @__PURE__ */ s("div", {
59
59
  className: "grid gap-4 md:grid-cols-4",
60
60
  children: [
61
- /* @__PURE__ */ S(f, { children: [/* @__PURE__ */ S("div", {
61
+ /* @__PURE__ */ s(m, { children: [/* @__PURE__ */ s("div", {
62
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", {
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__ */ x(c, { children: /* @__PURE__ */ S(l, {
68
+ /* @__PURE__ */ o(u, { children: /* @__PURE__ */ s(d, {
69
69
  className: "pt-4",
70
- children: [/* @__PURE__ */ S("div", {
70
+ children: [/* @__PURE__ */ s("div", {
71
71
  className: "flex items-center gap-2 text-sm text-text-secondary",
72
- children: [/* @__PURE__ */ x(i, { className: "h-4 w-4" }), "Compliance Score"]
73
- }), /* @__PURE__ */ S("p", {
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__ */ x(c, { children: /* @__PURE__ */ S(l, {
78
+ /* @__PURE__ */ o(u, { children: /* @__PURE__ */ s(d, {
79
79
  className: "pt-4",
80
- children: [/* @__PURE__ */ S("div", {
80
+ children: [/* @__PURE__ */ s("div", {
81
81
  className: "flex items-center gap-2 text-sm text-text-secondary",
82
- children: [/* @__PURE__ */ x(r, { className: "h-4 w-4" }), "Active Policies"]
83
- }), /* @__PURE__ */ x("p", {
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__ */ x(c, { children: /* @__PURE__ */ S(l, {
88
+ /* @__PURE__ */ o(u, { children: /* @__PURE__ */ s(d, {
89
89
  className: "pt-4",
90
- children: [/* @__PURE__ */ S("div", {
90
+ children: [/* @__PURE__ */ s("div", {
91
91
  className: "flex items-center gap-2 text-sm text-text-secondary",
92
- children: [/* @__PURE__ */ x(n, { className: "h-4 w-4" }), "Total Events"]
93
- }), /* @__PURE__ */ x("p", {
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__ */ S(_, {
100
+ /* @__PURE__ */ s(y, {
101
101
  defaultValue: "events",
102
102
  children: [
103
- /* @__PURE__ */ S(y, { children: [
104
- /* @__PURE__ */ x(b, {
103
+ /* @__PURE__ */ s(x, { children: [
104
+ /* @__PURE__ */ o(S, {
105
105
  value: "events",
106
106
  children: "Security Events"
107
107
  }),
108
- /* @__PURE__ */ x(b, {
108
+ /* @__PURE__ */ o(S, {
109
109
  value: "compliance",
110
110
  children: "Compliance"
111
111
  }),
112
- /* @__PURE__ */ x(b, {
112
+ /* @__PURE__ */ o(S, {
113
113
  value: "policies",
114
114
  children: "Policies"
115
115
  })
116
116
  ] }),
117
- /* @__PURE__ */ x(v, {
117
+ /* @__PURE__ */ o(b, {
118
118
  value: "events",
119
119
  className: "mt-4",
120
- children: T.length === 0 ? /* @__PURE__ */ x(m, {
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__ */ x(c, { children: /* @__PURE__ */ x(l, {
124
+ }) : /* @__PURE__ */ o(u, { children: /* @__PURE__ */ o(d, {
125
125
  className: "p-0",
126
- children: /* @__PURE__ */ x("div", {
126
+ children: /* @__PURE__ */ o("div", {
127
127
  className: "overflow-x-auto",
128
- children: /* @__PURE__ */ S("table", {
128
+ children: /* @__PURE__ */ s("table", {
129
129
  className: "w-full text-sm",
130
- children: [/* @__PURE__ */ x("thead", { children: /* @__PURE__ */ S("tr", {
130
+ children: [/* @__PURE__ */ o("thead", { children: /* @__PURE__ */ s("tr", {
131
131
  className: "border-b bg-bg-sunken/50",
132
132
  children: [
133
- /* @__PURE__ */ x("th", {
133
+ /* @__PURE__ */ o("th", {
134
134
  className: "text-left p-3 font-medium",
135
135
  children: "ID"
136
136
  }),
137
- /* @__PURE__ */ x("th", {
137
+ /* @__PURE__ */ o("th", {
138
138
  className: "text-left p-3 font-medium",
139
139
  children: "Type"
140
140
  }),
141
- /* @__PURE__ */ x("th", {
141
+ /* @__PURE__ */ o("th", {
142
142
  className: "text-left p-3 font-medium",
143
143
  children: "Title"
144
144
  }),
145
- /* @__PURE__ */ x("th", {
145
+ /* @__PURE__ */ o("th", {
146
146
  className: "text-left p-3 font-medium",
147
147
  children: "Severity"
148
148
  }),
149
- /* @__PURE__ */ x("th", {
149
+ /* @__PURE__ */ o("th", {
150
150
  className: "text-left p-3 font-medium",
151
151
  children: "Source"
152
152
  }),
153
- /* @__PURE__ */ x("th", {
153
+ /* @__PURE__ */ o("th", {
154
154
  className: "text-left p-3 font-medium",
155
155
  children: "Time"
156
156
  }),
157
- /* @__PURE__ */ x("th", {
157
+ /* @__PURE__ */ o("th", {
158
158
  className: "text-left p-3 font-medium",
159
159
  children: "Status"
160
160
  })
161
161
  ]
162
- }) }), /* @__PURE__ */ x("tbody", { children: T.map((e) => /* @__PURE__ */ S("tr", {
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__ */ x("td", {
165
+ /* @__PURE__ */ o("td", {
166
166
  className: "p-3 font-mono text-xs",
167
167
  children: e.id
168
168
  }),
169
- /* @__PURE__ */ x("td", {
169
+ /* @__PURE__ */ o("td", {
170
170
  className: "p-3 capitalize text-xs",
171
171
  children: e.type.replace("_", " ")
172
172
  }),
173
- /* @__PURE__ */ S("td", {
173
+ /* @__PURE__ */ s("td", {
174
174
  className: "p-3",
175
- children: [/* @__PURE__ */ x("p", {
175
+ children: [/* @__PURE__ */ o("p", {
176
176
  className: "font-medium",
177
177
  children: e.title
178
- }), /* @__PURE__ */ x("p", {
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__ */ x("td", {
183
+ /* @__PURE__ */ o("td", {
184
184
  className: "p-3",
185
- children: /* @__PURE__ */ x(o, {
185
+ children: /* @__PURE__ */ o(c, {
186
186
  variant: C[e.severity],
187
187
  children: e.severity
188
188
  })
189
189
  }),
190
- /* @__PURE__ */ x("td", {
190
+ /* @__PURE__ */ o("td", {
191
191
  className: "p-3 text-xs",
192
192
  children: e.source
193
193
  }),
194
- /* @__PURE__ */ x("td", {
194
+ /* @__PURE__ */ o("td", {
195
195
  className: "p-3 text-xs",
196
196
  children: new Date(e.timestamp).toLocaleString()
197
197
  }),
198
- /* @__PURE__ */ x("td", {
198
+ /* @__PURE__ */ o("td", {
199
199
  className: "p-3",
200
- children: e.resolved ? /* @__PURE__ */ x(o, {
200
+ children: e.resolved ? /* @__PURE__ */ o(c, {
201
201
  variant: "default",
202
202
  children: "Resolved"
203
- }) : /* @__PURE__ */ x(o, {
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__ */ x(v, {
214
+ /* @__PURE__ */ o(b, {
215
215
  value: "compliance",
216
216
  className: "mt-4",
217
- children: E.length === 0 ? /* @__PURE__ */ x(m, {
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__ */ x("div", {
221
+ }) : /* @__PURE__ */ o("div", {
222
222
  className: "grid gap-4 md:grid-cols-2",
223
- children: E.map((e) => /* @__PURE__ */ S(c, { children: [/* @__PURE__ */ x(u, {
223
+ children: E.map((e) => /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ o(f, {
224
224
  className: "pb-2",
225
- children: /* @__PURE__ */ S("div", {
225
+ children: /* @__PURE__ */ s("div", {
226
226
  className: "flex items-center justify-between",
227
- children: [/* @__PURE__ */ S(d, {
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__ */ x(o, {
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__ */ x(l, { children: /* @__PURE__ */ S("div", {
239
+ }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ s("div", {
240
240
  className: "space-y-3",
241
241
  children: [
242
- /* @__PURE__ */ S("div", {
242
+ /* @__PURE__ */ s("div", {
243
243
  className: "text-center",
244
- children: [/* @__PURE__ */ S("p", {
244
+ children: [/* @__PURE__ */ s("p", {
245
245
  className: "text-3xl font-bold tabular-nums",
246
246
  children: [e.score, "%"]
247
- }), /* @__PURE__ */ x("p", {
247
+ }), /* @__PURE__ */ o("p", {
248
248
  className: "text-xs text-text-secondary",
249
249
  children: "Compliance Score"
250
250
  })]
251
251
  }),
252
- /* @__PURE__ */ x("div", {
252
+ /* @__PURE__ */ o("div", {
253
253
  className: "h-2 rounded-full bg-bg-sunken overflow-hidden",
254
- children: /* @__PURE__ */ x("div", {
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__ */ S("div", {
259
+ /* @__PURE__ */ s("div", {
260
260
  className: "grid grid-cols-3 gap-2 text-center text-xs",
261
261
  children: [
262
- /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
262
+ /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("p", {
263
263
  className: "font-bold text-status-success-text",
264
264
  children: e.passedControls
265
- }), /* @__PURE__ */ x("p", {
265
+ }), /* @__PURE__ */ o("p", {
266
266
  className: "text-text-secondary",
267
267
  children: "Passed"
268
268
  })] }),
269
- /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
269
+ /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("p", {
270
270
  className: "font-bold text-status-error-text",
271
271
  children: e.failedControls
272
- }), /* @__PURE__ */ x("p", {
272
+ }), /* @__PURE__ */ o("p", {
273
273
  className: "text-text-secondary",
274
274
  children: "Failed"
275
275
  })] }),
276
- /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
276
+ /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("p", {
277
277
  className: "font-bold",
278
278
  children: e.totalControls
279
- }), /* @__PURE__ */ x("p", {
279
+ }), /* @__PURE__ */ o("p", {
280
280
  className: "text-text-secondary",
281
281
  children: "Total"
282
282
  })] })
283
283
  ]
284
284
  }),
285
- /* @__PURE__ */ S("div", {
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__ */ x(v, {
298
+ /* @__PURE__ */ o(b, {
299
299
  value: "policies",
300
300
  className: "mt-4",
301
- children: D.length === 0 ? /* @__PURE__ */ x(m, {
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__ */ x(c, { children: /* @__PURE__ */ x(l, {
305
+ }) : /* @__PURE__ */ o(u, { children: /* @__PURE__ */ o(d, {
306
306
  className: "p-0",
307
- children: /* @__PURE__ */ x("div", {
307
+ children: /* @__PURE__ */ o("div", {
308
308
  className: "overflow-x-auto",
309
- children: /* @__PURE__ */ S("table", {
309
+ children: /* @__PURE__ */ s("table", {
310
310
  className: "w-full text-sm",
311
- children: [/* @__PURE__ */ x("thead", { children: /* @__PURE__ */ S("tr", {
311
+ children: [/* @__PURE__ */ o("thead", { children: /* @__PURE__ */ s("tr", {
312
312
  className: "border-b bg-bg-sunken/50",
313
313
  children: [
314
- /* @__PURE__ */ x("th", {
314
+ /* @__PURE__ */ o("th", {
315
315
  className: "text-left p-3 font-medium",
316
316
  children: "Name"
317
317
  }),
318
- /* @__PURE__ */ x("th", {
318
+ /* @__PURE__ */ o("th", {
319
319
  className: "text-left p-3 font-medium",
320
320
  children: "Category"
321
321
  }),
322
- /* @__PURE__ */ x("th", {
322
+ /* @__PURE__ */ o("th", {
323
323
  className: "text-left p-3 font-medium",
324
324
  children: "Version"
325
325
  }),
326
- /* @__PURE__ */ x("th", {
326
+ /* @__PURE__ */ o("th", {
327
327
  className: "text-left p-3 font-medium",
328
328
  children: "Status"
329
329
  }),
330
- /* @__PURE__ */ x("th", {
330
+ /* @__PURE__ */ o("th", {
331
331
  className: "text-left p-3 font-medium",
332
332
  children: "Owner"
333
333
  }),
334
- /* @__PURE__ */ x("th", {
334
+ /* @__PURE__ */ o("th", {
335
335
  className: "text-left p-3 font-medium",
336
336
  children: "Review Date"
337
337
  })
338
338
  ]
339
- }) }), /* @__PURE__ */ x("tbody", { children: D.map((e) => /* @__PURE__ */ S("tr", {
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__ */ S("td", {
342
+ /* @__PURE__ */ s("td", {
343
343
  className: "p-3",
344
- children: [/* @__PURE__ */ x("p", {
344
+ children: [/* @__PURE__ */ o("p", {
345
345
  className: "font-medium",
346
346
  children: e.name
347
- }), /* @__PURE__ */ x("p", {
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__ */ x("td", {
352
+ /* @__PURE__ */ o("td", {
353
353
  className: "p-3 text-xs",
354
354
  children: e.category
355
355
  }),
356
- /* @__PURE__ */ S("td", {
356
+ /* @__PURE__ */ s("td", {
357
357
  className: "p-3 text-xs",
358
358
  children: ["v", e.version]
359
359
  }),
360
- /* @__PURE__ */ x("td", {
360
+ /* @__PURE__ */ o("td", {
361
361
  className: "p-3",
362
- children: /* @__PURE__ */ x(o, {
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__ */ x("td", {
367
+ /* @__PURE__ */ o("td", {
368
368
  className: "p-3 text-xs",
369
369
  children: e.owner
370
370
  }),
371
- /* @__PURE__ */ x("td", {
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} &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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"}
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} &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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"}