@burdenoff/microfe-auth 2026.511.1 → 2026.514.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 (53) hide show
  1. package/dist/auth/AuthRoutes.d.ts.map +1 -1
  2. package/dist/auth/AuthRoutes.js +94 -58
  3. package/dist/auth/AuthRoutes.js.map +1 -1
  4. package/dist/auth/components/AuthLayout.js +1 -1
  5. package/dist/auth/components/AuthLayout.js.map +1 -1
  6. package/dist/auth/hooks/useApiKeyOperations.d.ts +5 -1
  7. package/dist/auth/hooks/useApiKeyOperations.d.ts.map +1 -1
  8. package/dist/auth/hooks/useAppOperations.d.ts +5 -1
  9. package/dist/auth/hooks/useAppOperations.d.ts.map +1 -1
  10. package/dist/auth/hooks/useDelegationOperations.d.ts +10 -2
  11. package/dist/auth/hooks/useDelegationOperations.d.ts.map +1 -1
  12. package/dist/auth/hooks/useSessionOperations.js +1 -1
  13. package/dist/auth/hooks/useSessionOperations.js.map +1 -1
  14. package/dist/auth/pages/AuditLogPage.d.ts +8 -1
  15. package/dist/auth/pages/AuditLogPage.d.ts.map +1 -1
  16. package/dist/auth/pages/AuditLogPage.js +189 -104
  17. package/dist/auth/pages/AuditLogPage.js.map +1 -1
  18. package/dist/auth/pages/MfaSetupPage.d.ts.map +1 -1
  19. package/dist/auth/pages/MfaSetupPage.js +5 -5
  20. package/dist/auth/pages/MfaSetupPage.js.map +1 -1
  21. package/dist/auth/pages/SecurityPage.d.ts.map +1 -1
  22. package/dist/auth/pages/SecurityPage.js +335 -267
  23. package/dist/auth/pages/SecurityPage.js.map +1 -1
  24. package/dist/auth/pages/SessionsPage.d.ts +6 -0
  25. package/dist/auth/pages/SessionsPage.d.ts.map +1 -1
  26. package/dist/auth/pages/SessionsPage.js +255 -143
  27. package/dist/auth/pages/SessionsPage.js.map +1 -1
  28. package/dist/auth/pages/UserDetailsPage.d.ts.map +1 -1
  29. package/dist/auth/pages/UserDetailsPage.js +1 -1
  30. package/dist/auth/pages/UserDetailsPage.js.map +1 -1
  31. package/dist/auth/pages/UsersPage.d.ts.map +1 -1
  32. package/dist/auth/pages/UsersPage.js +501 -378
  33. package/dist/auth/pages/UsersPage.js.map +1 -1
  34. package/dist/generated/global-operations.d.ts +219 -103
  35. package/dist/generated/global-operations.d.ts.map +1 -1
  36. package/dist/generated/global-operations.js +237 -166
  37. package/dist/generated/global-operations.js.map +1 -1
  38. package/dist/generated/global-types.d.ts +2544 -270
  39. package/dist/generated/global-types.d.ts.map +1 -1
  40. package/dist/generated/wspace-operations.d.ts +41 -1
  41. package/dist/generated/wspace-operations.d.ts.map +1 -1
  42. package/dist/generated/wspace-operations.js +26 -0
  43. package/dist/generated/wspace-operations.js.map +1 -0
  44. package/dist/generated/wspace-types.d.ts +2974 -337
  45. package/dist/generated/wspace-types.d.ts.map +1 -1
  46. package/dist/microfe-auth.css +1 -1
  47. package/dist/translations/en.d.ts +249 -0
  48. package/dist/translations/en.d.ts.map +1 -0
  49. package/package.json +1 -1
  50. package/dist/auth/pages/ApiKeysPage.d.ts +0 -5
  51. package/dist/auth/pages/ApiKeysPage.d.ts.map +0 -1
  52. package/dist/auth/pages/DelegationsPage.d.ts +0 -5
  53. package/dist/auth/pages/DelegationsPage.d.ts.map +0 -1
@@ -3,256 +3,368 @@ import { useSessionOperations as t } from "../hooks/useSessionOperations.js";
3
3
  import "../hooks/index.js";
4
4
  import { AlertIcon as n, SpinnerIcon as r } from "../components/AuthIcons.js";
5
5
  import { formatRelativeTime as i, parseBrowserName as a, parseDeviceName as o } from "../utils/formatters.js";
6
- import { ConfirmActionDialog as s } from "../components/ConfirmActionDialog.js";
7
- import { useState as c } from "react";
8
- import { useI18n as l } from "@burdenoff/fe-libs/shared/providers/shell";
9
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
6
+ import { useCreateAuthExportJobMutation as s } from "../../generated/wspace-operations.js";
7
+ import { ConfirmActionDialog as c } from "../components/ConfirmActionDialog.js";
8
+ import { useState as l } from "react";
9
+ import { useI18n as u } from "@burdenoff/fe-libs/shared/providers/shell";
10
+ import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
10
11
  //#region src/auth/pages/SessionsPage.tsx
11
- function f() {
12
- let { t: f } = l(), p = (e, t) => {
13
- let n = f(e);
12
+ function m() {
13
+ let { t: m } = u(), h = (e, t) => {
14
+ let n = m(e);
14
15
  return n === e ? t : n;
15
- }, m = e((e) => e.isAuthenticated), { activeSessions: h, revokeSession: g, revokeAllSessions: _, isLoading: v } = t({ disableTokenInfoQuery: !0 }), [y, b] = c(null), [x, S] = c(null), [C, w] = c(null), [T, E] = c(!1), D = async (e) => {
16
+ }, g = e((e) => e.isAuthenticated), { activeSessions: _, revokeSession: v, revokeAllSessions: y, isLoading: b } = t({ disableTokenInfoQuery: !0 }), [x, S] = l(null), [C, w] = l(null), [T, E] = l(null), [D, O] = l(!1), [k, { loading: A }] = s(), [j, M] = l(null), N = async () => {
17
+ M(null);
16
18
  try {
17
- await g(e), S("Session revoked successfully"), w(null);
19
+ await k({ variables: { input: {
20
+ name: "Sessions Export",
21
+ entityTypes: ["vibecontrols_sessions"],
22
+ format: "CSV",
23
+ exportScope: "INDIVIDUAL",
24
+ includeMetadata: !0
25
+ } } });
18
26
  } catch (e) {
19
- b(e instanceof Error ? e.message : "Failed to revoke session");
27
+ M(e instanceof Error ? e.message : "Failed to start export");
28
+ }
29
+ }, P = async (e) => {
30
+ try {
31
+ await v(e), w("Session revoked successfully"), E(null);
32
+ } catch (e) {
33
+ S(e instanceof Error ? e.message : "Failed to revoke session");
20
34
  }
21
35
  };
22
- return m ? /* @__PURE__ */ d("div", {
36
+ return g ? /* @__PURE__ */ p("div", {
23
37
  className: "max-w-4xl mx-auto p-6",
24
38
  children: [
25
- /* @__PURE__ */ u(s, {
26
- open: C !== null,
39
+ /* @__PURE__ */ f(c, {
40
+ open: T !== null,
27
41
  onOpenChange: (e) => {
28
- e || w(null);
42
+ e || E(null);
29
43
  },
30
44
  title: "Revoke this session?",
31
45
  description: "The selected device will be signed out immediately and will need to authenticate again.",
32
46
  confirmText: "Revoke session",
33
47
  variant: "danger",
34
- isPending: v,
48
+ isPending: b,
35
49
  onConfirm: async () => {
36
- C && await D(C);
50
+ T && await P(T);
37
51
  }
38
52
  }),
39
- /* @__PURE__ */ u(s, {
40
- open: T,
41
- onOpenChange: E,
53
+ /* @__PURE__ */ f(c, {
54
+ open: D,
55
+ onOpenChange: O,
42
56
  title: "Revoke every other session?",
43
57
  description: "All devices except your current one will be signed out immediately.",
44
58
  confirmText: "Revoke all other sessions",
45
59
  variant: "warning",
46
- isPending: v,
60
+ isPending: b,
47
61
  onConfirm: async () => {
48
62
  try {
49
- await _(), S("All other sessions have been revoked"), E(!1);
63
+ await y(), w("All other sessions have been revoked"), O(!1);
50
64
  } catch (e) {
51
- b(e instanceof Error ? e.message : "Failed to revoke all sessions");
65
+ S(e instanceof Error ? e.message : "Failed to revoke all sessions");
52
66
  }
53
67
  }
54
68
  }),
55
- /* @__PURE__ */ d("div", {
69
+ /* @__PURE__ */ f("div", {
70
+ "aria-live": "polite",
71
+ "aria-atomic": "true",
72
+ className: "sr-only",
73
+ children: C
74
+ }),
75
+ /* @__PURE__ */ f("div", {
76
+ role: "alert",
77
+ "aria-live": "assertive",
78
+ "aria-atomic": "true",
79
+ className: "sr-only",
80
+ children: x
81
+ }),
82
+ /* @__PURE__ */ p("div", {
56
83
  className: "flex items-center justify-between mb-8",
57
- children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("h1", {
58
- className: "text-3xl font-semibold text-[var(--color-text-primary)]",
59
- children: p("auth.sessions.title", "Active Sessions")
60
- }), /* @__PURE__ */ d("p", {
61
- className: "text-[var(--color-text-secondary)] mt-2",
84
+ children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("h1", {
85
+ className: "text-3xl font-semibold text-text-primary",
86
+ children: h("auth.sessions.title", "Active Sessions")
87
+ }), /* @__PURE__ */ p("p", {
88
+ className: "text-text-secondary mt-2",
62
89
  children: [
63
- "You have ",
64
- h.length,
65
- " active session",
66
- h.length === 1 ? "" : "s"
90
+ h("auth.sessions.sessionCount", "You have"),
91
+ " ",
92
+ _.length,
93
+ " ",
94
+ h(_.length === 1 ? "auth.sessions.sessionsSingular" : "auth.sessions.sessionsPlural", _.length === 1 ? "active session" : "active sessions")
67
95
  ]
68
- })] }), h.length > 1 && /* @__PURE__ */ u("button", {
69
- onClick: () => E(!0),
70
- className: "px-4 py-2.5 rounded-xl border border-[var(--color-status-error-border)] text-[var(--color-status-error-text)] font-medium hover:bg-[var(--color-status-error-bg-subtle)] transition-colors duration-200",
71
- children: p("auth.sessions.revokeAll", "Revoke All Sessions")
96
+ })] }), /* @__PURE__ */ p("div", {
97
+ className: "flex items-center gap-3",
98
+ children: [/* @__PURE__ */ f("button", {
99
+ type: "button",
100
+ onClick: () => void N(),
101
+ disabled: A,
102
+ "aria-label": h("auth.sessions.exportAriaLabel", "Export sessions list"),
103
+ 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",
104
+ children: A ? /* @__PURE__ */ p(d, { children: [/* @__PURE__ */ f(r, {
105
+ className: "w-4 h-4 animate-spin",
106
+ "aria-hidden": "true"
107
+ }), h("auth.sessions.exporting", "Exporting...")] }) : /* @__PURE__ */ p(d, { children: [/* @__PURE__ */ f("svg", {
108
+ className: "w-4 h-4",
109
+ fill: "none",
110
+ viewBox: "0 0 24 24",
111
+ stroke: "currentColor",
112
+ "aria-hidden": "true",
113
+ children: /* @__PURE__ */ f("path", {
114
+ strokeLinecap: "round",
115
+ strokeLinejoin: "round",
116
+ strokeWidth: 2,
117
+ d: "M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"
118
+ })
119
+ }), h("auth.sessions.export", "Export")] })
120
+ }), _.length > 1 && /* @__PURE__ */ f("button", {
121
+ type: "button",
122
+ onClick: () => O(!0),
123
+ 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 duration-200",
124
+ children: h("auth.sessions.revokeAll", "Revoke All Sessions")
125
+ })]
126
+ })]
127
+ }),
128
+ j && /* @__PURE__ */ p("div", {
129
+ role: "alert",
130
+ className: "mb-6 flex items-start gap-3 p-4 rounded-xl bg-status-error-bg-subtle border border-status-error-border",
131
+ children: [/* @__PURE__ */ f(n, {
132
+ className: "w-5 h-5 text-status-error-text flex-shrink-0 mt-0.5",
133
+ "aria-hidden": "true"
134
+ }), /* @__PURE__ */ f("p", {
135
+ className: "text-sm text-status-error-text",
136
+ children: j
72
137
  })]
73
138
  }),
74
- x && /* @__PURE__ */ d("div", {
75
- className: "mb-6 p-4 rounded-xl bg-[var(--color-status-success-bg-subtle)] border border-[var(--color-status-success-border)]",
76
- children: [/* @__PURE__ */ u("p", {
77
- className: "text-[var(--color-status-success-text)]",
78
- children: x
79
- }), /* @__PURE__ */ u("button", {
80
- onClick: () => S(null),
81
- className: "mt-2 text-sm text-[var(--color-status-success-text)] hover:underline transition-colors duration-200",
139
+ C && /* @__PURE__ */ p("div", {
140
+ role: "status",
141
+ className: "mb-6 p-4 rounded-xl bg-status-success-bg-subtle border border-status-success-border",
142
+ children: [/* @__PURE__ */ f("p", {
143
+ className: "text-status-success-text",
144
+ children: C
145
+ }), /* @__PURE__ */ f("button", {
146
+ type: "button",
147
+ onClick: () => w(null),
148
+ className: "mt-2 text-sm text-status-success-text hover:underline transition-colors duration-200",
82
149
  children: "Dismiss"
83
150
  })]
84
151
  }),
85
- y && /* @__PURE__ */ d("div", {
86
- className: "mb-6 flex items-start gap-3 p-4 rounded-xl bg-[var(--color-status-error-bg-subtle)] border border-[var(--color-status-error-border)]",
87
- children: [/* @__PURE__ */ u(n, { className: "w-5 h-5 text-[var(--color-status-error-text)] flex-shrink-0 mt-0.5" }), /* @__PURE__ */ d("div", {
152
+ x && /* @__PURE__ */ p("div", {
153
+ role: "alert",
154
+ className: "mb-6 flex items-start gap-3 p-4 rounded-xl bg-status-error-bg-subtle border border-status-error-border",
155
+ children: [/* @__PURE__ */ f(n, {
156
+ className: "w-5 h-5 text-status-error-text flex-shrink-0 mt-0.5",
157
+ "aria-hidden": "true"
158
+ }), /* @__PURE__ */ p("div", {
88
159
  className: "flex-1",
89
- children: [/* @__PURE__ */ u("p", {
90
- className: "text-sm text-[var(--color-status-error-text)]",
91
- children: y
92
- }), /* @__PURE__ */ u("button", {
93
- onClick: () => b(null),
94
- className: "mt-2 text-sm text-[var(--color-status-error-text)] hover:underline transition-colors duration-200",
160
+ children: [/* @__PURE__ */ f("p", {
161
+ className: "text-sm text-status-error-text",
162
+ children: x
163
+ }), /* @__PURE__ */ f("button", {
164
+ type: "button",
165
+ onClick: () => S(null),
166
+ className: "mt-2 text-sm text-status-error-text hover:underline transition-colors duration-200",
95
167
  children: "Dismiss"
96
168
  })]
97
169
  })]
98
170
  }),
99
- v ? /* @__PURE__ */ d("div", {
171
+ b ? /* @__PURE__ */ p("div", {
172
+ "aria-live": "polite",
173
+ "aria-busy": "true",
100
174
  className: "flex items-center justify-center py-12",
101
- children: [/* @__PURE__ */ u(r, { className: "w-8 h-8 text-text-link animate-spin" }), /* @__PURE__ */ u("span", {
102
- className: "ml-3 text-[var(--color-text-secondary)]",
103
- children: p("auth.sessions.loading", "Loading sessions...")
175
+ children: [/* @__PURE__ */ f(r, {
176
+ className: "w-8 h-8 text-text-link animate-spin",
177
+ "aria-hidden": "true"
178
+ }), /* @__PURE__ */ f("span", {
179
+ className: "ml-3 text-text-secondary",
180
+ children: h("auth.sessions.loading", "Loading sessions...")
104
181
  })]
105
- }) : h.length === 0 ? /* @__PURE__ */ d("div", {
106
- className: "text-center py-16 border-2 border-dashed border-[var(--color-border-default)] rounded-xl",
107
- children: [/* @__PURE__ */ u("div", {
108
- className: "w-16 h-16 mx-auto mb-4 rounded-full bg-[var(--color-bg-muted)] flex items-center justify-center",
109
- children: /* @__PURE__ */ u("svg", {
110
- className: "w-8 h-8 text-[var(--color-text-tertiary)]",
182
+ }) : _.length === 0 ? /* @__PURE__ */ p("div", {
183
+ className: "text-center py-16 border-2 border-dashed border-border-subtle rounded-xl",
184
+ role: "status",
185
+ children: [/* @__PURE__ */ f("div", {
186
+ className: "w-16 h-16 mx-auto mb-4 rounded-full bg-bg-muted flex items-center justify-center",
187
+ children: /* @__PURE__ */ f("svg", {
188
+ className: "w-8 h-8 text-text-tertiary",
111
189
  fill: "none",
112
190
  viewBox: "0 0 24 24",
113
191
  stroke: "currentColor",
114
- children: /* @__PURE__ */ u("path", {
192
+ "aria-hidden": "true",
193
+ children: /* @__PURE__ */ f("path", {
115
194
  strokeLinecap: "round",
116
195
  strokeLinejoin: "round",
117
196
  strokeWidth: 1.5,
118
197
  d: "M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"
119
198
  })
120
199
  })
121
- }), /* @__PURE__ */ u("p", {
122
- className: "text-[var(--color-text-secondary)]",
123
- children: p("auth.sessions.noSessions", "No active sessions found")
200
+ }), /* @__PURE__ */ f("p", {
201
+ className: "text-text-secondary",
202
+ children: h("auth.sessions.noSessions", "No active sessions found")
124
203
  })]
125
- }) : /* @__PURE__ */ u("div", {
204
+ }) : /* @__PURE__ */ f("div", {
126
205
  className: "space-y-4",
127
- children: h.map((e) => /* @__PURE__ */ u("div", {
128
- className: "p-6 rounded-xl border border-[var(--color-border-default)] bg-[var(--color-bg-surface)] shadow-sm hover:shadow-md transition-shadow",
129
- children: /* @__PURE__ */ d("div", {
206
+ "aria-live": "polite",
207
+ "aria-busy": b,
208
+ children: _.map((e) => /* @__PURE__ */ f("div", {
209
+ className: "p-6 rounded-xl border border-border-default bg-bg-surface shadow-sm hover:shadow-md transition-shadow",
210
+ children: /* @__PURE__ */ p("div", {
130
211
  className: "flex items-start justify-between",
131
- children: [/* @__PURE__ */ d("div", {
212
+ children: [/* @__PURE__ */ p("div", {
132
213
  className: "flex items-start gap-4",
133
- children: [/* @__PURE__ */ u("div", {
134
- className: "w-12 h-12 rounded-xl bg-[var(--color-bg-accent)] flex items-center justify-center flex-shrink-0",
135
- children: /* @__PURE__ */ u("svg", {
136
- className: "w-6 h-6 text-[var(--color-text-link)]",
214
+ children: [/* @__PURE__ */ f("div", {
215
+ className: "w-12 h-12 rounded-xl bg-bg-accent flex items-center justify-center flex-shrink-0",
216
+ "aria-hidden": "true",
217
+ children: /* @__PURE__ */ f("svg", {
218
+ className: "w-6 h-6 text-text-link",
137
219
  fill: "none",
138
220
  viewBox: "0 0 24 24",
139
221
  stroke: "currentColor",
140
- children: /* @__PURE__ */ u("path", {
222
+ children: /* @__PURE__ */ f("path", {
141
223
  strokeLinecap: "round",
142
224
  strokeLinejoin: "round",
143
225
  strokeWidth: 1.5,
144
226
  d: "M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"
145
227
  })
146
228
  })
147
- }), /* @__PURE__ */ d("div", {
229
+ }), /* @__PURE__ */ p("div", {
148
230
  className: "flex-1",
149
231
  children: [
150
- /* @__PURE__ */ d("div", {
232
+ /* @__PURE__ */ p("div", {
151
233
  className: "flex items-center gap-3 mb-1",
152
- children: [/* @__PURE__ */ u("h3", {
153
- className: "text-lg font-semibold text-[var(--color-text-primary)]",
154
- children: e.isCurrent && o(e.userAgent) === "Unknown Device" ? p("auth.sessions.thisDevice", "This Device") : o(e.userAgent)
155
- }), e.isCurrent && /* @__PURE__ */ u("span", {
156
- className: "px-2.5 py-1 rounded-full bg-[var(--color-status-success-bg-subtle)] text-[var(--color-status-success-text)] text-xs font-medium",
157
- children: p("auth.sessions.currentSession", "Current Session")
234
+ children: [/* @__PURE__ */ f("h3", {
235
+ className: "text-lg font-semibold text-text-primary",
236
+ children: e.isCurrent && o(e.userAgent) === "Unknown Device" ? h("auth.sessions.thisDevice", "This Device") : o(e.userAgent)
237
+ }), e.isCurrent && /* @__PURE__ */ f("span", {
238
+ role: "status",
239
+ className: "px-2.5 py-1 rounded-full bg-status-success-bg-subtle text-status-success-text text-xs font-medium",
240
+ children: h("auth.sessions.currentSession", "Current Session")
158
241
  })]
159
242
  }),
160
- /* @__PURE__ */ u("p", {
161
- className: "text-sm text-[var(--color-text-secondary)] mb-2",
162
- children: a(e.userAgent) === "Unknown Browser" && e.isCurrent ? p("auth.sessions.currentBrowser", "Current Browser") : a(e.userAgent)
243
+ /* @__PURE__ */ f("p", {
244
+ className: "text-sm text-text-secondary mb-2",
245
+ children: a(e.userAgent) === "Unknown Browser" && e.isCurrent ? h("auth.sessions.currentBrowser", "Current Browser") : a(e.userAgent)
163
246
  }),
164
- /* @__PURE__ */ d("div", {
165
- className: "flex flex-wrap gap-4 text-sm text-[var(--color-text-secondary)]",
247
+ /* @__PURE__ */ p("dl", {
248
+ className: "flex flex-wrap gap-4 text-sm text-text-secondary",
166
249
  children: [
167
- e.ipAddress && e.ipAddress !== "unknown" && /* @__PURE__ */ d("span", {
250
+ e.ipAddress && e.ipAddress !== "unknown" && /* @__PURE__ */ p("div", {
168
251
  className: "flex items-center gap-1.5",
169
- children: [/* @__PURE__ */ u("svg", {
170
- className: "w-4 h-4",
171
- fill: "none",
172
- viewBox: "0 0 24 24",
173
- stroke: "currentColor",
174
- children: /* @__PURE__ */ u("path", {
175
- strokeLinecap: "round",
176
- strokeLinejoin: "round",
177
- strokeWidth: 2,
178
- d: "M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"
179
- })
180
- }), e.ipAddress]
252
+ children: [
253
+ /* @__PURE__ */ f("svg", {
254
+ className: "w-4 h-4",
255
+ fill: "none",
256
+ viewBox: "0 0 24 24",
257
+ stroke: "currentColor",
258
+ "aria-hidden": "true",
259
+ children: /* @__PURE__ */ f("path", {
260
+ strokeLinecap: "round",
261
+ strokeLinejoin: "round",
262
+ strokeWidth: 2,
263
+ d: "M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"
264
+ })
265
+ }),
266
+ /* @__PURE__ */ f("dt", {
267
+ className: "sr-only",
268
+ children: "IP address"
269
+ }),
270
+ /* @__PURE__ */ f("dd", { children: e.ipAddress })
271
+ ]
181
272
  }),
182
- e.location && /* @__PURE__ */ d("span", {
273
+ e.location && /* @__PURE__ */ p("div", {
183
274
  className: "flex items-center gap-1.5",
184
- children: [/* @__PURE__ */ d("svg", {
185
- className: "w-4 h-4",
186
- fill: "none",
187
- viewBox: "0 0 24 24",
188
- stroke: "currentColor",
189
- children: [/* @__PURE__ */ u("path", {
190
- strokeLinecap: "round",
191
- strokeLinejoin: "round",
192
- strokeWidth: 2,
193
- d: "M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z"
194
- }), /* @__PURE__ */ u("path", {
195
- strokeLinecap: "round",
196
- strokeLinejoin: "round",
197
- strokeWidth: 2,
198
- d: "M15 11a3 3 0 11-6 0 3 3 0 016 0z"
199
- })]
200
- }), e.location]
275
+ children: [
276
+ /* @__PURE__ */ p("svg", {
277
+ className: "w-4 h-4",
278
+ fill: "none",
279
+ viewBox: "0 0 24 24",
280
+ stroke: "currentColor",
281
+ "aria-hidden": "true",
282
+ children: [/* @__PURE__ */ f("path", {
283
+ strokeLinecap: "round",
284
+ strokeLinejoin: "round",
285
+ strokeWidth: 2,
286
+ d: "M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z"
287
+ }), /* @__PURE__ */ f("path", {
288
+ strokeLinecap: "round",
289
+ strokeLinejoin: "round",
290
+ strokeWidth: 2,
291
+ d: "M15 11a3 3 0 11-6 0 3 3 0 016 0z"
292
+ })]
293
+ }),
294
+ /* @__PURE__ */ f("dt", {
295
+ className: "sr-only",
296
+ children: "Location"
297
+ }),
298
+ /* @__PURE__ */ f("dd", { children: e.location })
299
+ ]
201
300
  }),
202
- /* @__PURE__ */ d("span", {
301
+ /* @__PURE__ */ p("div", {
203
302
  className: "flex items-center gap-1.5",
204
303
  children: [
205
- /* @__PURE__ */ u("svg", {
304
+ /* @__PURE__ */ f("svg", {
206
305
  className: "w-4 h-4",
207
306
  fill: "none",
208
307
  viewBox: "0 0 24 24",
209
308
  stroke: "currentColor",
210
- children: /* @__PURE__ */ u("path", {
309
+ "aria-hidden": "true",
310
+ children: /* @__PURE__ */ f("path", {
211
311
  strokeLinecap: "round",
212
312
  strokeLinejoin: "round",
213
313
  strokeWidth: 2,
214
314
  d: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"
215
315
  })
216
316
  }),
217
- "Last active ",
218
- i(e.lastActivityAt)
317
+ /* @__PURE__ */ f("dt", {
318
+ className: "sr-only",
319
+ children: "Last active"
320
+ }),
321
+ /* @__PURE__ */ p("dd", { children: [
322
+ h("auth.sessions.lastActive", "Last active"),
323
+ " ",
324
+ i(e.lastActivityAt)
325
+ ] })
219
326
  ]
220
327
  })
221
328
  ]
222
329
  })
223
330
  ]
224
331
  })]
225
- }), !e.isCurrent && /* @__PURE__ */ u("button", {
226
- onClick: () => w(e.id),
227
- className: "ml-4 px-4 py-2 rounded-lg text-sm font-medium border border-[var(--color-status-error-border)] text-[var(--color-status-error-text)] bg-[var(--color-bg-surface)] hover:bg-[var(--color-status-error-bg-subtle)] transition-colors duration-200",
228
- children: p("auth.sessions.revoke", "Revoke")
332
+ }), !e.isCurrent && /* @__PURE__ */ f("button", {
333
+ type: "button",
334
+ onClick: () => E(e.id),
335
+ "aria-label": `${h("auth.sessions.revoke", "Revoke")} ${o(e.userAgent)} session`,
336
+ className: "ml-4 px-4 py-2 rounded-lg text-sm font-medium border border-status-error-border text-status-error-text bg-bg-surface hover:bg-status-error-bg-subtle transition-colors duration-200",
337
+ children: h("auth.sessions.revoke", "Revoke")
229
338
  })]
230
339
  })
231
340
  }, e.id))
232
341
  })
233
342
  ]
234
- }) : /* @__PURE__ */ u("div", {
343
+ }) : /* @__PURE__ */ f("div", {
235
344
  className: "max-w-4xl mx-auto p-6",
236
- children: /* @__PURE__ */ d("div", {
237
- className: "text-center py-16 border-2 border-dashed border-[var(--color-border-default)] rounded-xl",
345
+ children: /* @__PURE__ */ p("div", {
346
+ className: "text-center py-16 border-2 border-dashed border-border-subtle rounded-xl",
238
347
  children: [
239
- /* @__PURE__ */ u("div", {
240
- className: "w-16 h-16 mx-auto mb-4 rounded-full bg-[var(--color-status-warning-bg-subtle)] flex items-center justify-center",
241
- children: /* @__PURE__ */ u(n, { className: "w-8 h-8 text-[var(--color-status-warning-text)]" })
348
+ /* @__PURE__ */ f("div", {
349
+ className: "w-16 h-16 mx-auto mb-4 rounded-full bg-status-warning-bg-subtle flex items-center justify-center",
350
+ children: /* @__PURE__ */ f(n, {
351
+ className: "w-8 h-8 text-status-warning-text",
352
+ "aria-hidden": "true"
353
+ })
242
354
  }),
243
- /* @__PURE__ */ u("h2", {
244
- className: "text-xl font-semibold text-[var(--color-text-primary)] mb-2",
245
- children: p("auth.sessions.authRequired", "Authentication Required")
355
+ /* @__PURE__ */ f("h2", {
356
+ className: "text-xl font-semibold text-text-primary mb-2",
357
+ children: h("auth.sessions.authRequired", "Authentication Required")
246
358
  }),
247
- /* @__PURE__ */ u("p", {
248
- className: "text-[var(--color-text-secondary)]",
249
- children: p("auth.sessions.signInToView", "Please sign in to view your active sessions")
359
+ /* @__PURE__ */ f("p", {
360
+ className: "text-text-secondary",
361
+ children: h("auth.sessions.signInToView", "Please sign in to view your active sessions")
250
362
  })
251
363
  ]
252
364
  })
253
365
  });
254
366
  }
255
367
  //#endregion
256
- export { f as SessionsPage };
368
+ export { m as SessionsPage };
257
369
 
258
370
  //# sourceMappingURL=SessionsPage.js.map