@burdenoff/microfe-auth 2026.624.2 → 2026.625.1

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 (41) hide show
  1. package/dist/auth/hooks/index.js +1 -0
  2. package/dist/auth/hooks/useActiveContextBootstrapMirror.js +27 -0
  3. package/dist/auth/hooks/useActiveContextBootstrapMirror.js.map +1 -0
  4. package/dist/auth/index.js +1 -0
  5. package/dist/auth/pages/AuditLogPage.js +73 -72
  6. package/dist/auth/pages/AuditLogPage.js.map +1 -1
  7. package/dist/auth/pages/EmailVerifyPage.js +58 -53
  8. package/dist/auth/pages/EmailVerifyPage.js.map +1 -1
  9. package/dist/auth/pages/LoginPage.js +222 -214
  10. package/dist/auth/pages/LoginPage.js.map +1 -1
  11. package/dist/auth/pages/MagicLinkPage.js +75 -68
  12. package/dist/auth/pages/MagicLinkPage.js.map +1 -1
  13. package/dist/auth/pages/MfaSetupPage.js +176 -138
  14. package/dist/auth/pages/MfaSetupPage.js.map +1 -1
  15. package/dist/auth/pages/MfaVerifyPage.js +60 -52
  16. package/dist/auth/pages/MfaVerifyPage.js.map +1 -1
  17. package/dist/auth/pages/PasswordResetPage.js +277 -262
  18. package/dist/auth/pages/PasswordResetPage.js.map +1 -1
  19. package/dist/auth/pages/ReactivatePage.js +54 -46
  20. package/dist/auth/pages/ReactivatePage.js.map +1 -1
  21. package/dist/auth/pages/RegisterPage.js +223 -213
  22. package/dist/auth/pages/RegisterPage.js.map +1 -1
  23. package/dist/auth/pages/SecurityPage.js +298 -267
  24. package/dist/auth/pages/SecurityPage.js.map +1 -1
  25. package/dist/auth/pages/SessionsPage.js +169 -160
  26. package/dist/auth/pages/SessionsPage.js.map +1 -1
  27. package/dist/auth/pages/SsoCallbackPage.js +53 -50
  28. package/dist/auth/pages/SsoCallbackPage.js.map +1 -1
  29. package/dist/auth/pages/SsoConfigPage.js +466 -444
  30. package/dist/auth/pages/SsoConfigPage.js.map +1 -1
  31. package/dist/auth/pages/SsoLoginPage.js +67 -59
  32. package/dist/auth/pages/SsoLoginPage.js.map +1 -1
  33. package/dist/auth/pages/UserDetailsPage.js +154 -144
  34. package/dist/auth/pages/UserDetailsPage.js.map +1 -1
  35. package/dist/auth/pages/UserProfilePage.js +211 -170
  36. package/dist/auth/pages/UserProfilePage.js.map +1 -1
  37. package/dist/auth/pages/UsersPage.js +572 -576
  38. package/dist/auth/pages/UsersPage.js.map +1 -1
  39. package/dist/index.js +7 -6
  40. package/dist/microfe-auth.css +1 -1
  41. package/package.json +2 -2
@@ -8,8 +8,9 @@ import { useEffect as s, useState as c } from "react";
8
8
  import { useNavigate as l, useParams as u } from "react-router-dom";
9
9
  import { useI18n as d } from "@burdenoff/fe-libs/shared/providers/shell";
10
10
  import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
11
+ import { EmphasisPanel as h, IllustratedEmptyState as g, NextSteps as _, PagePurpose as v } from "@burdenoff/fe-libs/ui";
11
12
  //#region src/auth/pages/UserDetailsPage.tsx
12
- var h = (e) => {
13
+ var y = (e) => {
13
14
  switch (e) {
14
15
  case "SUPER_ADMIN": return "bg-accent-purple-subtle text-accent-purple";
15
16
  case "TENANT_ADMIN": return "bg-status-info-bg-subtle text-status-info-text";
@@ -19,7 +20,7 @@ var h = (e) => {
19
20
  case "GUEST": return "bg-bg-sunken text-text-primary";
20
21
  default: return "bg-bg-sunken text-text-primary";
21
22
  }
22
- }, g = (e) => {
23
+ }, b = (e) => {
23
24
  switch (e) {
24
25
  case "ACTIVE": return "bg-status-success-bg-subtle text-status-success-text";
25
26
  case "INACTIVE": return "bg-status-warning-bg-subtle text-status-warning-text";
@@ -28,59 +29,59 @@ var h = (e) => {
28
29
  default: return "bg-bg-sunken text-text-primary";
29
30
  }
30
31
  };
31
- function _() {
32
- let { id: _ } = u(), v = l(), { t: y } = d(), b = (e, t) => {
33
- let n = y(e);
32
+ function x() {
33
+ let { id: x } = u(), S = l(), { t: C } = d(), w = (e, t) => {
34
+ let n = C(e);
34
35
  return n === e ? t : n;
35
- }, x = e((e) => e.isAuthenticated), S = e((e) => e.user), { canViewUsers: C, canDeleteUsers: w, isLoading: T } = i(), { getUser: E, deleteUser: D, hardDeleteUser: O } = r(), [k, A] = c(null), [j, M] = c(!0), [N, P] = c(null), [F, I] = c(null), [L, R] = c(null), [z, { loading: B }] = a(), [V, H] = c(null);
36
+ }, T = e((e) => e.isAuthenticated), E = e((e) => e.user), { canViewUsers: D, canDeleteUsers: O, isLoading: k } = i(), { getUser: A, deleteUser: j, hardDeleteUser: M } = r(), [N, P] = c(null), [F, I] = c(!0), [L, R] = c(null), [z, B] = c(null), [V, H] = c(null), [U, { loading: W }] = a(), [G, K] = c(null);
36
37
  s(() => {
37
38
  let e = !1;
38
- if (!_) {
39
- P("Missing user id"), M(!1);
39
+ if (!x) {
40
+ R("Missing user id"), I(!1);
40
41
  return;
41
42
  }
42
- if (!x) {
43
- M(!1);
43
+ if (!T) {
44
+ I(!1);
44
45
  return;
45
46
  }
46
- return M(!0), P(null), E(_).then((t) => {
47
- e || (t ? A(t) : P(b("auth.userDetails.userNotFound", "User not found")));
47
+ return I(!0), R(null), A(x).then((t) => {
48
+ e || (t ? P(t) : R(w("auth.userDetails.userNotFound", "User not found")));
48
49
  }).catch((t) => {
49
- e || P(t instanceof Error ? t.message : "Failed to fetch user details");
50
+ e || R(t instanceof Error ? t.message : "Failed to fetch user details");
50
51
  }).finally(() => {
51
- e || M(!1);
52
+ e || I(!1);
52
53
  }), () => {
53
54
  e = !0;
54
55
  };
55
56
  }, [
56
- _,
57
- E,
58
- x
57
+ x,
58
+ A,
59
+ T
59
60
  ]);
60
- let U = async () => {
61
- if (k) try {
62
- let e = await D(k.id);
61
+ let q = async () => {
62
+ if (N) try {
63
+ let e = await j(N.id);
63
64
  if (e.success) {
64
- I(b("auth.userDetails.userDeactivated", "User \"{email}\" has been deactivated.").replace("{email}", k.email)), R(null);
65
- let e = await E(k.id);
66
- e && A(e);
67
- } else P(e.message);
65
+ B(w("auth.userDetails.userDeactivated", "User \"{email}\" has been deactivated.").replace("{email}", N.email)), H(null);
66
+ let e = await A(N.id);
67
+ e && P(e);
68
+ } else R(e.message);
68
69
  } catch (e) {
69
- P(e instanceof Error ? e.message : "Failed to delete user");
70
+ R(e instanceof Error ? e.message : "Failed to delete user");
70
71
  }
71
- }, W = async () => {
72
- if (k) try {
73
- let e = await O(k.id);
74
- e.success ? (R(null), v("/auth/users")) : P(e.message);
72
+ }, J = async () => {
73
+ if (N) try {
74
+ let e = await M(N.id);
75
+ e.success ? (H(null), S("/auth/users")) : R(e.message);
75
76
  } catch (e) {
76
- P(e instanceof Error ? e.message : "Failed to hard delete user");
77
+ R(e instanceof Error ? e.message : "Failed to hard delete user");
77
78
  }
78
- }, G = async () => {
79
- if (k) {
80
- H(null);
79
+ }, Y = async () => {
80
+ if (N) {
81
+ K(null);
81
82
  try {
82
- await z({ variables: { input: {
83
- name: `User Data Export - ${k.email}`,
83
+ await U({ variables: { input: {
84
+ name: `User Data Export - ${N.email}`,
84
85
  entityTypes: [
85
86
  "user_profile",
86
87
  "user_sessions",
@@ -91,11 +92,11 @@ function _() {
91
92
  includeMetadata: !0
92
93
  } } });
93
94
  } catch (e) {
94
- H(e instanceof Error ? e.message : "Failed to start export");
95
+ K(e instanceof Error ? e.message : "Failed to start export");
95
96
  }
96
97
  }
97
98
  };
98
- return x ? T || j ? /* @__PURE__ */ p("div", {
99
+ return T ? k || F ? /* @__PURE__ */ p("div", {
99
100
  className: "max-w-4xl mx-auto p-6",
100
101
  children: /* @__PURE__ */ m("div", {
101
102
  className: "text-center py-16",
@@ -106,14 +107,14 @@ function _() {
106
107
  "aria-hidden": "true"
107
108
  }), /* @__PURE__ */ p("p", {
108
109
  className: "mt-4 text-text-secondary",
109
- children: b("auth.userDetails.loading", "Loading user...")
110
+ children: w("auth.userDetails.loading", "Loading user...")
110
111
  })]
111
112
  })
112
- }) : C ? N || !k ? /* @__PURE__ */ m("div", {
113
+ }) : D ? L || !N ? /* @__PURE__ */ m("div", {
113
114
  className: "max-w-4xl mx-auto p-6",
114
115
  children: [/* @__PURE__ */ m("button", {
115
116
  type: "button",
116
- onClick: () => v("/auth/users"),
117
+ onClick: () => S("/auth/users"),
117
118
  className: "mb-6 flex items-center gap-2 text-text-link hover:underline font-medium",
118
119
  children: [/* @__PURE__ */ p("svg", {
119
120
  className: "size-4",
@@ -127,39 +128,36 @@ function _() {
127
128
  strokeWidth: 2,
128
129
  d: "M10 19l-7-7m0 0l7-7m-7 7h18"
129
130
  })
130
- }), b("auth.userDetails.backToUsers", "Back to Users")]
131
- }), /* @__PURE__ */ m("div", {
131
+ }), w("auth.userDetails.backToUsers", "Back to Users")]
132
+ }), /* @__PURE__ */ p("div", {
132
133
  role: "alert",
133
- className: "flex items-start gap-3 p-4 rounded-xl bg-status-error-bg-subtle border border-status-error-border",
134
- children: [/* @__PURE__ */ p(t, {
135
- className: "size-5 text-status-error-text flex-shrink-0 mt-0.5",
136
- "aria-hidden": "true"
137
- }), /* @__PURE__ */ p("p", {
138
- className: "text-sm text-status-error-text",
139
- children: N ?? b("auth.userDetails.userNotFound", "User not found")
140
- })]
134
+ children: /* @__PURE__ */ p(g, {
135
+ illustration: "empty-search",
136
+ title: w("auth.userDetails.userNotFound", "User not found"),
137
+ description: L ?? w("auth.userDetails.userNotFoundDesc", "We couldn't find this user. They may have been removed, or the link is out of date.")
138
+ })
141
139
  })]
142
140
  }) : /* @__PURE__ */ m("div", {
143
141
  className: "max-w-4xl mx-auto p-6",
144
142
  children: [
145
143
  /* @__PURE__ */ p(o, {
146
- open: L !== null,
144
+ open: V !== null,
147
145
  onOpenChange: (e) => {
148
- e || R(null);
146
+ e || H(null);
149
147
  },
150
- title: L === "hard-delete" ? b("auth.userDetails.hardDeleteTitle", "Permanently delete user?") : b("auth.userDetails.deactivateTitle", "Deactivate user?"),
151
- description: L === "hard-delete" ? b("auth.userDetails.hardDeleteDesc", "This permanently deletes \"{email}\" and cannot be undone.").replace("{email}", k.email) : b("auth.userDetails.deactivateDesc", "\"{email}\" will be prevented from signing in until reactivated.").replace("{email}", k.email),
152
- confirmText: L === "hard-delete" ? b("auth.userDetails.hardDeleteConfirm", "Delete permanently") : b("auth.userDetails.deactivateConfirm", "Deactivate user"),
153
- variant: L === "hard-delete" ? "danger" : "warning",
148
+ title: V === "hard-delete" ? w("auth.userDetails.hardDeleteTitle", "Permanently delete user?") : w("auth.userDetails.deactivateTitle", "Deactivate user?"),
149
+ description: V === "hard-delete" ? w("auth.userDetails.hardDeleteDesc", "This permanently deletes \"{email}\" and cannot be undone.").replace("{email}", N.email) : w("auth.userDetails.deactivateDesc", "\"{email}\" will be prevented from signing in until reactivated.").replace("{email}", N.email),
150
+ confirmText: V === "hard-delete" ? w("auth.userDetails.hardDeleteConfirm", "Delete permanently") : w("auth.userDetails.deactivateConfirm", "Deactivate user"),
151
+ variant: V === "hard-delete" ? "danger" : "warning",
154
152
  onConfirm: async () => {
155
- L === "hard-delete" ? await W() : L === "deactivate" && await U();
153
+ V === "hard-delete" ? await J() : V === "deactivate" && await q();
156
154
  }
157
155
  }),
158
156
  /* @__PURE__ */ m("div", {
159
157
  className: "flex items-center justify-between mb-6",
160
158
  children: [/* @__PURE__ */ m("button", {
161
159
  type: "button",
162
- onClick: () => v("/auth/users"),
160
+ onClick: () => S("/auth/users"),
163
161
  className: "flex items-center gap-2 text-text-link hover:underline font-medium",
164
162
  children: [/* @__PURE__ */ p("svg", {
165
163
  className: "size-4",
@@ -173,17 +171,17 @@ function _() {
173
171
  strokeWidth: 2,
174
172
  d: "M10 19l-7-7m0 0l7-7m-7 7h18"
175
173
  })
176
- }), b("auth.userDetails.backToUsers", "Back to Users")]
174
+ }), w("auth.userDetails.backToUsers", "Back to Users")]
177
175
  }), /* @__PURE__ */ p("button", {
178
176
  type: "button",
179
- onClick: () => void G(),
180
- disabled: B,
181
- "aria-label": b("auth.userDetails.exportAriaLabel", "Export user data"),
177
+ onClick: () => void Y(),
178
+ disabled: W,
179
+ "aria-label": w("auth.userDetails.exportAriaLabel", "Export user data"),
182
180
  className: "flex items-center gap-2 px-4 py-2.5 rounded-xl border border-border-default text-text-primary bg-bg-surface hover:bg-bg-sunken disabled:opacity-50 disabled:cursor-not-allowed transition-colors font-medium",
183
- children: B ? /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p(n, {
181
+ children: W ? /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p(n, {
184
182
  className: "size-4 animate-spin",
185
183
  "aria-hidden": "true"
186
- }), b("auth.userDetails.exporting", "Exporting...")] }) : /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p("svg", {
184
+ }), w("auth.userDetails.exporting", "Exporting...")] }) : /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p("svg", {
187
185
  className: "size-4",
188
186
  fill: "none",
189
187
  viewBox: "0 0 24 24",
@@ -195,10 +193,14 @@ function _() {
195
193
  strokeWidth: 2,
196
194
  d: "M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"
197
195
  })
198
- }), b("auth.userDetails.exportButton", "Export User Data")] })
196
+ }), w("auth.userDetails.exportButton", "Export User Data")] })
199
197
  })]
200
198
  }),
201
- V && /* @__PURE__ */ m("div", {
199
+ /* @__PURE__ */ p(v, {
200
+ className: "mb-6",
201
+ children: w("auth.userDetails.purpose", "The full record for this person — their role, status, verification, and activity. From here you can export their data, deactivate them, or (for super admins) permanently delete a removed account.")
202
+ }),
203
+ G && /* @__PURE__ */ m("div", {
202
204
  role: "alert",
203
205
  className: "mb-6 flex items-start gap-3 p-4 rounded-xl bg-status-error-bg-subtle border border-status-error-border",
204
206
  children: [/* @__PURE__ */ p(t, {
@@ -206,51 +208,54 @@ function _() {
206
208
  "aria-hidden": "true"
207
209
  }), /* @__PURE__ */ p("p", {
208
210
  className: "text-sm text-status-error-text",
209
- children: V
211
+ children: G
210
212
  })]
211
213
  }),
212
- F && /* @__PURE__ */ m("div", {
214
+ z && /* @__PURE__ */ m("div", {
213
215
  className: "mb-6 p-4 rounded-xl bg-status-success-bg-subtle border border-status-success-border",
214
216
  children: [/* @__PURE__ */ p("p", {
215
217
  className: "text-status-success-text",
216
- children: F
218
+ children: z
217
219
  }), /* @__PURE__ */ p("button", {
218
220
  type: "button",
219
- onClick: () => I(null),
221
+ onClick: () => B(null),
220
222
  className: "mt-2 text-sm text-status-success-text hover:underline",
221
- children: b("auth.userDetails.dismiss", "Dismiss")
223
+ children: w("auth.userDetails.dismiss", "Dismiss")
222
224
  })]
223
225
  }),
224
226
  /* @__PURE__ */ m("div", {
225
227
  className: "p-6 rounded-xl border border-border-subtle bg-bg-surface shadow-sm",
226
228
  children: [
227
- /* @__PURE__ */ m("div", {
228
- className: "flex items-center gap-4 mb-8",
229
- children: [/* @__PURE__ */ p("div", {
230
- className: "auth-brand-badge flex size-20 items-center justify-center rounded-full text-3xl font-semibold",
231
- "aria-hidden": "true",
232
- children: (k.name || k.username || k.email).charAt(0).toUpperCase()
233
- }), /* @__PURE__ */ m("div", { children: [
234
- /* @__PURE__ */ p("h1", {
235
- className: "text-2xl font-semibold text-text-primary",
236
- children: k.name || k.username
237
- }),
238
- /* @__PURE__ */ p("p", {
239
- className: "text-text-secondary",
240
- "data-testid": "user-email",
241
- children: k.email
242
- }),
243
- /* @__PURE__ */ m("div", {
244
- className: "flex items-center gap-2 mt-2",
245
- children: [/* @__PURE__ */ p("span", {
246
- className: `px-2.5 py-1 rounded-full text-xs font-medium ${h(k.role)}`,
247
- children: k.role.replace("_", " ")
248
- }), /* @__PURE__ */ p("span", {
249
- className: `px-2.5 py-1 rounded-full text-xs font-medium ${g(k.status)}`,
250
- children: k.status
251
- })]
252
- })
253
- ] })]
229
+ /* @__PURE__ */ p(h, {
230
+ className: "mb-8",
231
+ children: /* @__PURE__ */ m("div", {
232
+ className: "flex items-center gap-4",
233
+ children: [/* @__PURE__ */ p("div", {
234
+ className: "auth-brand-badge flex size-20 items-center justify-center rounded-full text-3xl font-semibold",
235
+ "aria-hidden": "true",
236
+ children: (N.name || N.username || N.email).charAt(0).toUpperCase()
237
+ }), /* @__PURE__ */ m("div", { children: [
238
+ /* @__PURE__ */ p("h1", {
239
+ className: "text-2xl font-semibold text-text-primary",
240
+ children: N.name || N.username
241
+ }),
242
+ /* @__PURE__ */ p("p", {
243
+ className: "text-text-secondary",
244
+ "data-testid": "user-email",
245
+ children: N.email
246
+ }),
247
+ /* @__PURE__ */ m("div", {
248
+ className: "flex items-center gap-2 mt-2",
249
+ children: [/* @__PURE__ */ p("span", {
250
+ className: `px-2.5 py-1 rounded-full text-xs font-medium ${y(N.role)}`,
251
+ children: N.role.replace("_", " ")
252
+ }), /* @__PURE__ */ p("span", {
253
+ className: `px-2.5 py-1 rounded-full text-xs font-medium ${b(N.status)}`,
254
+ children: N.status
255
+ })]
256
+ })
257
+ ] })]
258
+ })
254
259
  }),
255
260
  /* @__PURE__ */ m("dl", {
256
261
  className: "grid grid-cols-2 gap-6",
@@ -259,35 +264,35 @@ function _() {
259
264
  className: "p-4 rounded-lg bg-bg-canvas/50",
260
265
  children: [/* @__PURE__ */ p("dt", {
261
266
  className: "text-sm font-medium text-text-secondary mb-1",
262
- children: b("auth.userDetails.username", "Username")
267
+ children: w("auth.userDetails.username", "Username")
263
268
  }), /* @__PURE__ */ p("dd", {
264
269
  className: "text-text-primary font-medium",
265
- children: k.username
270
+ children: N.username
266
271
  })]
267
272
  }),
268
273
  /* @__PURE__ */ m("div", {
269
274
  className: "p-4 rounded-lg bg-bg-canvas/50",
270
275
  children: [/* @__PURE__ */ p("dt", {
271
276
  className: "text-sm font-medium text-text-secondary mb-1",
272
- children: b("auth.userDetails.email", "Email")
277
+ children: w("auth.userDetails.email", "Email")
273
278
  }), /* @__PURE__ */ p("dd", {
274
279
  className: "text-text-primary font-medium",
275
- children: k.email
280
+ children: N.email
276
281
  })]
277
282
  }),
278
283
  /* @__PURE__ */ m("div", {
279
284
  className: "p-4 rounded-lg bg-bg-canvas/50",
280
285
  children: [/* @__PURE__ */ p("dt", {
281
286
  className: "text-sm font-medium text-text-secondary mb-1",
282
- children: b("auth.userDetails.emailVerified", "Email Verified")
287
+ children: w("auth.userDetails.emailVerified", "Email Verified")
283
288
  }), /* @__PURE__ */ p("dd", {
284
289
  className: "text-text-primary font-medium",
285
- children: k.emailVerified ? /* @__PURE__ */ p("span", {
290
+ children: N.emailVerified ? /* @__PURE__ */ p("span", {
286
291
  className: "text-status-success-text",
287
- children: b("auth.userDetails.yes", "Yes")
292
+ children: w("auth.userDetails.yes", "Yes")
288
293
  }) : /* @__PURE__ */ p("span", {
289
294
  className: "text-status-warning-text",
290
- children: b("auth.userDetails.no", "No")
295
+ children: w("auth.userDetails.no", "No")
291
296
  })
292
297
  })]
293
298
  }),
@@ -295,104 +300,109 @@ function _() {
295
300
  className: "p-4 rounded-lg bg-bg-canvas/50",
296
301
  children: [/* @__PURE__ */ p("dt", {
297
302
  className: "text-sm font-medium text-text-secondary mb-1",
298
- children: b("auth.userDetails.mfaEnabled", "MFA Enabled")
303
+ children: w("auth.userDetails.mfaEnabled", "MFA Enabled")
299
304
  }), /* @__PURE__ */ p("dd", {
300
305
  className: "text-text-primary font-medium",
301
- children: k.mfaEnabled ? /* @__PURE__ */ p("span", {
306
+ children: N.mfaEnabled ? /* @__PURE__ */ p("span", {
302
307
  className: "text-status-success-text",
303
- children: b("auth.userDetails.yes", "Yes")
308
+ children: w("auth.userDetails.yes", "Yes")
304
309
  }) : /* @__PURE__ */ p("span", {
305
310
  className: "text-text-secondary",
306
- children: b("auth.userDetails.no", "No")
311
+ children: w("auth.userDetails.no", "No")
307
312
  })
308
313
  })]
309
314
  }),
310
- k.phoneNumber && /* @__PURE__ */ m("div", {
315
+ N.phoneNumber && /* @__PURE__ */ m("div", {
311
316
  className: "p-4 rounded-lg bg-bg-canvas/50",
312
317
  children: [/* @__PURE__ */ p("dt", {
313
318
  className: "text-sm font-medium text-text-secondary mb-1",
314
- children: b("auth.userDetails.phoneNumber", "Phone Number")
319
+ children: w("auth.userDetails.phoneNumber", "Phone Number")
315
320
  }), /* @__PURE__ */ p("dd", {
316
321
  className: "text-text-primary font-medium",
317
- children: k.phoneNumber
322
+ children: N.phoneNumber
318
323
  })]
319
324
  }),
320
325
  /* @__PURE__ */ m("div", {
321
326
  className: "p-4 rounded-lg bg-bg-canvas/50",
322
327
  children: [/* @__PURE__ */ p("dt", {
323
328
  className: "text-sm font-medium text-text-secondary mb-1",
324
- children: b("auth.userDetails.lastLogin", "Last Login")
329
+ children: w("auth.userDetails.lastLogin", "Last Login")
325
330
  }), /* @__PURE__ */ p("dd", {
326
331
  className: "text-text-primary font-medium",
327
- children: k.lastLoginAt ? new Date(k.lastLoginAt).toLocaleString() : b("auth.userDetails.never", "Never")
332
+ children: N.lastLoginAt ? new Date(N.lastLoginAt).toLocaleString() : w("auth.userDetails.never", "Never")
328
333
  })]
329
334
  }),
330
335
  /* @__PURE__ */ m("div", {
331
336
  className: "p-4 rounded-lg bg-bg-canvas/50",
332
337
  children: [/* @__PURE__ */ p("dt", {
333
338
  className: "text-sm font-medium text-text-secondary mb-1",
334
- children: b("auth.userDetails.created", "Created")
339
+ children: w("auth.userDetails.created", "Created")
335
340
  }), /* @__PURE__ */ p("dd", {
336
341
  className: "text-text-primary font-medium",
337
- children: new Date(k.createdAt).toLocaleString()
342
+ children: new Date(N.createdAt).toLocaleString()
338
343
  })]
339
344
  }),
340
345
  /* @__PURE__ */ m("div", {
341
346
  className: "p-4 rounded-lg bg-bg-canvas/50",
342
347
  children: [/* @__PURE__ */ p("dt", {
343
348
  className: "text-sm font-medium text-text-secondary mb-1",
344
- children: b("auth.userDetails.lastUpdated", "Last Updated")
349
+ children: w("auth.userDetails.lastUpdated", "Last Updated")
345
350
  }), /* @__PURE__ */ p("dd", {
346
351
  className: "text-text-primary font-medium",
347
- children: new Date(k.updatedAt).toLocaleString()
352
+ children: new Date(N.updatedAt).toLocaleString()
348
353
  })]
349
354
  })
350
355
  ]
351
356
  }),
352
357
  /* @__PURE__ */ m("div", {
353
358
  className: "mt-8 pt-6 border-t border-border-subtle flex gap-3",
354
- children: [k.status !== "DELETED" && w && /* @__PURE__ */ p("button", {
359
+ children: [N.status !== "DELETED" && O && /* @__PURE__ */ p("button", {
355
360
  type: "button",
356
- onClick: () => R("deactivate"),
361
+ onClick: () => H("deactivate"),
357
362
  className: "px-4 py-2.5 rounded-xl border border-status-error-border text-status-error-text font-medium hover:bg-status-error-bg-subtle transition-colors",
358
- children: b("auth.userDetails.deactivateUser", "Deactivate User")
359
- }), w && k.status === "DELETED" && S?.role === "SUPER_ADMIN" && /* @__PURE__ */ p("button", {
363
+ children: w("auth.userDetails.deactivateUser", "Deactivate User")
364
+ }), O && N.status === "DELETED" && E?.role === "SUPER_ADMIN" && /* @__PURE__ */ p("button", {
360
365
  type: "button",
361
- onClick: () => R("hard-delete"),
366
+ onClick: () => H("hard-delete"),
362
367
  className: "px-4 py-2.5 rounded-xl bg-status-error-bg text-white font-medium hover:bg-status-error-bg-hover transition-colors",
363
- children: b("auth.userDetails.permanentlyDelete", "Permanently Delete")
368
+ children: w("auth.userDetails.permanentlyDelete", "Permanently Delete")
364
369
  })]
370
+ }),
371
+ /* @__PURE__ */ p(_, {
372
+ className: "mt-8",
373
+ storageKey: "auth-user-details",
374
+ steps: [{
375
+ id: "back-to-users",
376
+ label: w("auth.userDetails.nextBack", "Return to the user list"),
377
+ description: w("auth.userDetails.nextBackDesc", "Browse or search everyone in your organization."),
378
+ onClick: () => S("/auth/users")
379
+ }, {
380
+ id: "export-user",
381
+ label: w("auth.userDetails.nextExport", "Export this user's data"),
382
+ description: w("auth.userDetails.nextExportDesc", "Download their profile, sessions, and audit history as CSV."),
383
+ onClick: () => void Y()
384
+ }]
365
385
  })
366
386
  ]
367
387
  })
368
388
  ]
369
389
  }) : /* @__PURE__ */ p("div", {
370
390
  className: "max-w-4xl mx-auto p-6",
371
- children: /* @__PURE__ */ m("div", {
372
- className: "text-center py-16 border-2 border-dashed border-border-subtle rounded-xl",
373
- children: [/* @__PURE__ */ p("h2", {
374
- className: "text-xl font-semibold text-text-primary mb-2",
375
- children: b("auth.userDetails.adminRequired", "Admin Access Required")
376
- }), /* @__PURE__ */ p("p", {
377
- className: "text-text-secondary",
378
- children: b("auth.userDetails.adminRequiredDesc", "You need administrator privileges to view user details.")
379
- })]
391
+ children: /* @__PURE__ */ p(g, {
392
+ illustration: "empty-generic",
393
+ title: w("auth.userDetails.adminRequired", "Admin Access Required"),
394
+ description: w("auth.userDetails.adminRequiredDesc", "You need administrator privileges to view user details.")
380
395
  })
381
396
  }) : /* @__PURE__ */ p("div", {
382
397
  className: "max-w-4xl mx-auto p-6",
383
- children: /* @__PURE__ */ m("div", {
384
- className: "text-center py-16 border-2 border-dashed border-border-subtle rounded-xl",
385
- children: [/* @__PURE__ */ p("h2", {
386
- className: "text-xl font-semibold text-text-primary mb-2",
387
- children: b("auth.userDetails.authRequired", "Authentication Required")
388
- }), /* @__PURE__ */ p("p", {
389
- className: "text-text-secondary",
390
- children: b("auth.userDetails.signInToView", "Please sign in to view user details")
391
- })]
398
+ children: /* @__PURE__ */ p(g, {
399
+ illustration: "empty-generic",
400
+ title: w("auth.userDetails.authRequired", "Authentication Required"),
401
+ description: w("auth.userDetails.signInToView", "Please sign in to view user details")
392
402
  })
393
403
  });
394
404
  }
395
405
  //#endregion
396
- export { _ as UserDetailsPage };
406
+ export { x as UserDetailsPage };
397
407
 
398
408
  //# sourceMappingURL=UserDetailsPage.js.map