@burdenoff/microfe-auth 2026.1031.1 → 2026.1101.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/dist/auth/AuthRoot.js +14 -11
  2. package/dist/auth/AuthRoot.js.map +1 -1
  3. package/dist/auth/AuthRoutes.js +1 -2
  4. package/dist/auth/AuthRoutes.js.map +1 -1
  5. package/dist/auth/components/AuthIcons.js +1 -2
  6. package/dist/auth/components/AuthIcons.js.map +1 -1
  7. package/dist/auth/components/AuthLayout.js +1 -2
  8. package/dist/auth/components/AuthLayout.js.map +1 -1
  9. package/dist/auth/components/CaptchaV2.js +9 -10
  10. package/dist/auth/components/CaptchaV2.js.map +1 -1
  11. package/dist/auth/components/ConfirmActionDialog.js +1 -2
  12. package/dist/auth/components/ConfirmActionDialog.js.map +1 -1
  13. package/dist/auth/components/profile/UserProfileMenu.js +7 -6
  14. package/dist/auth/components/profile/UserProfileMenu.js.map +1 -1
  15. package/dist/auth/components/workspace/WorkspaceSelector.js +1 -2
  16. package/dist/auth/components/workspace/WorkspaceSelector.js.map +1 -1
  17. package/dist/auth/constants/permissions.js +1 -2
  18. package/dist/auth/constants/permissions.js.map +1 -1
  19. package/dist/auth/constants/sessionKeys.js +1 -2
  20. package/dist/auth/constants/sessionKeys.js.map +1 -1
  21. package/dist/auth/hooks/contextDeepLink.js +1 -2
  22. package/dist/auth/hooks/contextDeepLink.js.map +1 -1
  23. package/dist/auth/hooks/index.js +12 -11
  24. package/dist/auth/hooks/useAccountOperations.js +1 -2
  25. package/dist/auth/hooks/useAccountOperations.js.map +1 -1
  26. package/dist/auth/hooks/useActiveContextBootstrapMirror.js +1 -2
  27. package/dist/auth/hooks/useActiveContextBootstrapMirror.js.map +1 -1
  28. package/dist/auth/hooks/useAuthOperations.js +37 -37
  29. package/dist/auth/hooks/useAuthOperations.js.map +1 -1
  30. package/dist/auth/hooks/useAuthPermissions.js +1 -2
  31. package/dist/auth/hooks/useAuthPermissions.js.map +1 -1
  32. package/dist/auth/hooks/useCaptchaV3.js +1 -2
  33. package/dist/auth/hooks/useCaptchaV3.js.map +1 -1
  34. package/dist/auth/hooks/useContextSwitcherData.js +86 -79
  35. package/dist/auth/hooks/useContextSwitcherData.js.map +1 -1
  36. package/dist/auth/hooks/useMfaOperations.js +4 -5
  37. package/dist/auth/hooks/useMfaOperations.js.map +1 -1
  38. package/dist/auth/hooks/useMyWorkspaces.js +4 -5
  39. package/dist/auth/hooks/useMyWorkspaces.js.map +1 -1
  40. package/dist/auth/hooks/useOAuthOperations.js +11 -12
  41. package/dist/auth/hooks/useOAuthOperations.js.map +1 -1
  42. package/dist/auth/hooks/usePasswordOperations.js +1 -2
  43. package/dist/auth/hooks/usePasswordOperations.js.map +1 -1
  44. package/dist/auth/hooks/useSessionOperations.js +3 -4
  45. package/dist/auth/hooks/useSessionOperations.js.map +1 -1
  46. package/dist/auth/hooks/useSignupCaptcha.js +1 -2
  47. package/dist/auth/hooks/useSignupCaptcha.js.map +1 -1
  48. package/dist/auth/hooks/useSsoOperations.js +80 -81
  49. package/dist/auth/hooks/useSsoOperations.js.map +1 -1
  50. package/dist/auth/hooks/useTokenRefresh.js +8 -12
  51. package/dist/auth/hooks/useTokenRefresh.js.map +1 -1
  52. package/dist/auth/hooks/useUserOperations.js +1 -2
  53. package/dist/auth/hooks/useUserOperations.js.map +1 -1
  54. package/dist/auth/hooks/useWorkspaceOperations.js +1 -2
  55. package/dist/auth/hooks/useWorkspaceOperations.js.map +1 -1
  56. package/dist/auth/hooks/useWorkspaceToken.js +1 -2
  57. package/dist/auth/hooks/useWorkspaceToken.js.map +1 -1
  58. package/dist/auth/index.js +19 -18
  59. package/dist/auth/pages/AuditLogPage.js +21 -22
  60. package/dist/auth/pages/AuditLogPage.js.map +1 -1
  61. package/dist/auth/pages/EmailVerifyPage.js +15 -17
  62. package/dist/auth/pages/EmailVerifyPage.js.map +1 -1
  63. package/dist/auth/pages/LoginPage.js +89 -105
  64. package/dist/auth/pages/LoginPage.js.map +1 -1
  65. package/dist/auth/pages/MagicLinkPage.js +30 -31
  66. package/dist/auth/pages/MagicLinkPage.js.map +1 -1
  67. package/dist/auth/pages/MfaSetupPage.js +18 -20
  68. package/dist/auth/pages/MfaSetupPage.js.map +1 -1
  69. package/dist/auth/pages/MfaVerifyPage.js +31 -35
  70. package/dist/auth/pages/MfaVerifyPage.js.map +1 -1
  71. package/dist/auth/pages/OAuthCallbackPage.js +4 -11
  72. package/dist/auth/pages/OAuthCallbackPage.js.map +1 -1
  73. package/dist/auth/pages/PasswordResetPage.js +20 -23
  74. package/dist/auth/pages/PasswordResetPage.js.map +1 -1
  75. package/dist/auth/pages/ReactivatePage.js +14 -18
  76. package/dist/auth/pages/ReactivatePage.js.map +1 -1
  77. package/dist/auth/pages/RegisterPage.js +180 -181
  78. package/dist/auth/pages/RegisterPage.js.map +1 -1
  79. package/dist/auth/pages/SSOClearPage.js +9 -10
  80. package/dist/auth/pages/SSOClearPage.js.map +1 -1
  81. package/dist/auth/pages/SSODepositPage.js +9 -13
  82. package/dist/auth/pages/SSODepositPage.js.map +1 -1
  83. package/dist/auth/pages/SSORelayCallbackPage.js +3 -7
  84. package/dist/auth/pages/SSORelayCallbackPage.js.map +1 -1
  85. package/dist/auth/pages/SSORelayPage.js +11 -10
  86. package/dist/auth/pages/SSORelayPage.js.map +1 -1
  87. package/dist/auth/pages/SecurityPage.js +19 -21
  88. package/dist/auth/pages/SecurityPage.js.map +1 -1
  89. package/dist/auth/pages/SessionBridgePage.js +9 -16
  90. package/dist/auth/pages/SessionBridgePage.js.map +1 -1
  91. package/dist/auth/pages/SessionsPage.js +17 -18
  92. package/dist/auth/pages/SessionsPage.js.map +1 -1
  93. package/dist/auth/pages/SsoCallbackPage.js +17 -22
  94. package/dist/auth/pages/SsoCallbackPage.js.map +1 -1
  95. package/dist/auth/pages/SsoConfigPage.js +69 -69
  96. package/dist/auth/pages/SsoConfigPage.js.map +1 -1
  97. package/dist/auth/pages/SsoLoginPage.js +9 -10
  98. package/dist/auth/pages/SsoLoginPage.js.map +1 -1
  99. package/dist/auth/pages/UserDetailsPage.js +16 -23
  100. package/dist/auth/pages/UserDetailsPage.js.map +1 -1
  101. package/dist/auth/pages/UserProfilePage.js +140 -141
  102. package/dist/auth/pages/UserProfilePage.js.map +1 -1
  103. package/dist/auth/pages/UsersPage.js +446 -453
  104. package/dist/auth/pages/UsersPage.js.map +1 -1
  105. package/dist/auth/providers/AuthProvider.js +1 -2
  106. package/dist/auth/providers/AuthProvider.js.map +1 -1
  107. package/dist/auth/providers/CaptchaProvider.js +1 -2
  108. package/dist/auth/providers/CaptchaProvider.js.map +1 -1
  109. package/dist/auth/store/authStore.js +5 -12
  110. package/dist/auth/store/authStore.js.map +1 -1
  111. package/dist/auth/utils/captchaConfig.js +5 -8
  112. package/dist/auth/utils/captchaConfig.js.map +1 -1
  113. package/dist/auth/utils/formatters.js +1 -2
  114. package/dist/auth/utils/formatters.js.map +1 -1
  115. package/dist/auth/utils/gatewayBaseUrls.js +1 -2
  116. package/dist/auth/utils/gatewayBaseUrls.js.map +1 -1
  117. package/dist/auth/utils/legalUrls.js +2 -3
  118. package/dist/auth/utils/legalUrls.js.map +1 -1
  119. package/dist/auth/utils/redirect.js +1 -2
  120. package/dist/auth/utils/redirect.js.map +1 -1
  121. package/dist/auth/utils/ssoOrigins.js +2 -3
  122. package/dist/auth/utils/ssoOrigins.js.map +1 -1
  123. package/dist/auth/utils/validation.js +34 -36
  124. package/dist/auth/utils/validation.js.map +1 -1
  125. package/dist/generated/global-operations.js +2 -3
  126. package/dist/generated/global-operations.js.map +1 -1
  127. package/dist/generated/wspace-operations.js +2 -3
  128. package/dist/generated/wspace-operations.js.map +1 -1
  129. package/dist/microfe-auth.css +1 -1
  130. package/dist/shared/hooks/useTr.js +1 -2
  131. package/dist/shared/hooks/useTr.js.map +1 -1
  132. package/dist/translations/en.js +1 -2
  133. package/dist/translations/en.js.map +1 -1
  134. package/dist/utils/nativeBridge.js +1 -2
  135. package/package.json +7 -3
@@ -1,20 +1,20 @@
1
- import { useAuthStore as e } from "../store/authStore.js";
2
- import { useTr as t } from "../../shared/hooks/useTr.js";
3
- import { AuthLayout as n } from "../components/AuthLayout.js";
4
- import { AlertIcon as r, CheckIcon as i, EmailIcon as a, SpinnerIcon as o, UserIcon as s } from "../components/AuthIcons.js";
5
- import { useUserOperations as c } from "../hooks/useUserOperations.js";
6
- import { useCompleteAvatarUploadMutation as ee, useInitiateAvatarUploadMutation as l } from "../../generated/wspace-operations.js";
7
- import { validatePhoneNumber as u, validateUserFields as d } from "../utils/validation.js";
8
- import { useEffect as f, useId as p, useRef as m, useState as h } from "react";
9
- import { useNavigate as g } from "react-router";
10
- import { Fragment as _, jsx as v, jsxs as y } from "react/jsx-runtime";
11
- import { Button as b } from "@burdenoff/fe-libs/button";
12
- import { NextSteps as x, PagePurpose as S } from "@burdenoff/fe-libs/ui";
13
- import { useGatewayClient as te } from "@burdenoff/fe-libs/shared/graphql";
1
+ import { useTr as e } from "../../shared/hooks/useTr.js";
2
+ import { useUserOperations as t } from "../hooks/useUserOperations.js";
3
+ import { validatePhoneNumber as n, validateUserFields as r } from "../utils/validation.js";
4
+ import { useAuthStore as i } from "../store/authStore.js";
5
+ import { AuthLayout as a } from "../components/AuthLayout.js";
6
+ import { AlertIcon as o, CheckIcon as s, EmailIcon as c, SpinnerIcon as l, UserIcon as ee } from "../components/AuthIcons.js";
7
+ import { useCompleteAvatarUploadMutation as te, useInitiateAvatarUploadMutation as u } from "../../generated/wspace-operations.js";
8
+ import { useEffect as d, useId as f, useRef as p, useState as m } from "react";
9
+ import { useNavigate as h } from "react-router";
10
+ import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
11
+ import { Button as y } from "@burdenoff/fe-libs/button";
12
+ import { NextSteps as b, PagePurpose as x } from "@burdenoff/fe-libs/ui";
13
+ import { useGatewayClient as S } from "@burdenoff/fe-libs/shared/graphql";
14
14
  import { useAuth as ne } from "@burdenoff/fe-libs/shared/providers/shell/AuthProvider";
15
- //#region src/auth/pages/UserProfilePage.tsx
15
+ // src/auth/pages/UserProfilePage.tsx
16
16
  function C() {
17
- let C = t(), w = g(), T = ne(), E = e((e) => e.isAuthenticated), D = e((e) => e.user), O = e((e) => e.setUser), { updateCurrentUserProfile: k, isLoading: A } = c(), j = p(), M = p(), N = p(), P = p(), F = p(), I = e((e) => e.currentWorkspaceId), L = te("workspace"), [R] = l({ client: L }), [z] = ee({ client: L }), B = m(null), [V, H] = h(!1), U = async (e) => {
17
+ let C = e(), w = h(), T = ne(), E = i((e) => e.isAuthenticated), D = i((e) => e.user), O = i((e) => e.setUser), { updateCurrentUserProfile: k, isLoading: A } = t(), j = f(), M = f(), N = f(), P = f(), F = f(), I = i((e) => e.currentWorkspaceId), L = S("workspace"), [R] = u({ client: L }), [z] = te({ client: L }), B = p(null), [V, H] = m(!1), U = async (e) => {
18
18
  let t = e.target.files?.[0];
19
19
  if (!t) return;
20
20
  if (!t.type.startsWith("image/")) {
@@ -57,14 +57,14 @@ function C() {
57
57
  } finally {
58
58
  H(!1), B.current && (B.current.value = "");
59
59
  }
60
- }, [W, G] = h(!1), [K, q] = h({
60
+ }, [W, G] = m(!1), [K, q] = m({
61
61
  username: "",
62
62
  firstName: "",
63
63
  lastName: "",
64
64
  name: "",
65
65
  phoneNumber: ""
66
- }), [J, Y] = h(null), [X, Z] = h(null), [Q, $] = h(null);
67
- return f(() => {
66
+ }), [J, Y] = m(null), [X, Z] = m(null), [Q, $] = m(null);
67
+ return d(() => {
68
68
  D && q({
69
69
  username: D.username || "",
70
70
  firstName: D.firstName || "",
@@ -72,25 +72,25 @@ function C() {
72
72
  name: D.name || "",
73
73
  phoneNumber: D.phoneNumber || ""
74
74
  });
75
- }, [D]), !E || !D ? /* @__PURE__ */ v(n, {
75
+ }, [D]), !E || !D ? /* @__PURE__ */ _(a, {
76
76
  title: C("auth.profile.title", "Profile"),
77
77
  subtitle: C("auth.profile.subtitle", "View and manage your profile"),
78
- children: /* @__PURE__ */ y("div", {
78
+ children: /* @__PURE__ */ v("div", {
79
79
  className: "text-center py-12",
80
80
  children: [
81
- /* @__PURE__ */ v("div", {
81
+ /* @__PURE__ */ _("div", {
82
82
  className: "size-16 mx-auto mb-4 rounded-full bg-[var(--color-status-warning-bg-subtle)] flex items-center justify-center",
83
- children: /* @__PURE__ */ v(r, { className: "size-8 text-[var(--color-status-warning-text)]" })
83
+ children: /* @__PURE__ */ _(o, { className: "size-8 text-[var(--color-status-warning-text)]" })
84
84
  }),
85
- /* @__PURE__ */ v("h2", {
85
+ /* @__PURE__ */ _("h2", {
86
86
  className: "text-xl font-semibold text-[var(--color-text-primary)] mb-2",
87
87
  children: C("auth.profile.authRequired", "Authentication Required")
88
88
  }),
89
- /* @__PURE__ */ v("p", {
89
+ /* @__PURE__ */ _("p", {
90
90
  className: "text-[var(--color-text-secondary)] mb-6",
91
91
  children: C("auth.profile.signInToView", "Please sign in to view your profile")
92
92
  }),
93
- /* @__PURE__ */ v(b, {
93
+ /* @__PURE__ */ _(y, {
94
94
  type: "button",
95
95
  onClick: () => w("/auth/login"),
96
96
  variant: "default",
@@ -100,35 +100,35 @@ function C() {
100
100
  })
101
101
  ]
102
102
  })
103
- }) : /* @__PURE__ */ y("div", {
103
+ }) : /* @__PURE__ */ v("div", {
104
104
  className: "max-w-4xl mx-auto p-6",
105
105
  children: [
106
- /* @__PURE__ */ y("div", {
106
+ /* @__PURE__ */ v("div", {
107
107
  className: "mb-8",
108
108
  children: [
109
- /* @__PURE__ */ v("h1", {
109
+ /* @__PURE__ */ _("h1", {
110
110
  className: "text-3xl font-semibold text-[var(--color-text-primary)]",
111
111
  children: C("auth.profile.myProfile", "My Profile")
112
112
  }),
113
- /* @__PURE__ */ v("p", {
113
+ /* @__PURE__ */ _("p", {
114
114
  className: "text-[var(--color-text-secondary)] mt-2",
115
115
  children: C("auth.profile.viewAndManage", "View and manage your account information")
116
116
  }),
117
- /* @__PURE__ */ v(S, {
117
+ /* @__PURE__ */ _(x, {
118
118
  className: "mt-3",
119
119
  children: C("auth.profile.purpose", "This is how you appear across the platform. Update your name, photo, and contact details here — teammates see this information, and we use your email for sign-in and important notices.")
120
120
  })
121
121
  ]
122
122
  }),
123
- Q && /* @__PURE__ */ y("div", {
123
+ Q && /* @__PURE__ */ v("div", {
124
124
  className: "mb-6 flex items-center gap-3 p-4 rounded-xl bg-[var(--color-status-success-bg-subtle)] border border-[var(--color-status-success-border)]",
125
125
  children: [
126
- /* @__PURE__ */ v(i, { className: "size-5 text-[var(--color-status-success-text)] flex-shrink-0" }),
127
- /* @__PURE__ */ v("p", {
126
+ /* @__PURE__ */ _(s, { className: "size-5 text-[var(--color-status-success-text)] flex-shrink-0" }),
127
+ /* @__PURE__ */ _("p", {
128
128
  className: "text-[var(--color-status-success-text)]",
129
129
  children: Q
130
130
  }),
131
- /* @__PURE__ */ v("button", {
131
+ /* @__PURE__ */ _("button", {
132
132
  type: "button",
133
133
  onClick: () => $(null),
134
134
  className: "ml-auto text-sm text-[var(--color-status-success-text)] hover:underline transition-colors duration-200",
@@ -136,18 +136,18 @@ function C() {
136
136
  })
137
137
  ]
138
138
  }),
139
- J && /* @__PURE__ */ y("div", {
139
+ J && /* @__PURE__ */ v("div", {
140
140
  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)]",
141
141
  children: [
142
- /* @__PURE__ */ v(r, { className: "size-5 text-[var(--color-status-error-text)] flex-shrink-0 mt-0.5" }),
143
- /* @__PURE__ */ v("div", {
142
+ /* @__PURE__ */ _(o, { className: "size-5 text-[var(--color-status-error-text)] flex-shrink-0 mt-0.5" }),
143
+ /* @__PURE__ */ _("div", {
144
144
  className: "flex-1",
145
- children: /* @__PURE__ */ v("p", {
145
+ children: /* @__PURE__ */ _("p", {
146
146
  className: "text-sm text-[var(--color-status-error-text)]",
147
147
  children: J
148
148
  })
149
149
  }),
150
- /* @__PURE__ */ v("button", {
150
+ /* @__PURE__ */ _("button", {
151
151
  type: "button",
152
152
  onClick: () => Y(null),
153
153
  className: "text-sm text-[var(--color-status-error-text)] hover:underline transition-colors duration-200",
@@ -155,40 +155,40 @@ function C() {
155
155
  })
156
156
  ]
157
157
  }),
158
- /* @__PURE__ */ y("div", {
158
+ /* @__PURE__ */ v("div", {
159
159
  className: "rounded-xl border border-[var(--color-border-default)] bg-[var(--color-bg-surface)] shadow-sm overflow-hidden",
160
- children: [/* @__PURE__ */ v("div", {
160
+ children: [/* @__PURE__ */ _("div", {
161
161
  className: "bg-accent-wash border-b border-border-seam p-6 text-text-primary",
162
- children: /* @__PURE__ */ y("div", {
162
+ children: /* @__PURE__ */ v("div", {
163
163
  className: "flex items-center gap-4",
164
- children: [/* @__PURE__ */ y("div", {
164
+ children: [/* @__PURE__ */ v("div", {
165
165
  className: "relative group",
166
166
  children: [
167
- D.avatar ? /* @__PURE__ */ v("img", {
167
+ D.avatar ? /* @__PURE__ */ _("img", {
168
168
  src: D.avatar,
169
169
  alt: C("auth.profile.avatarAlt", "Profile picture"),
170
170
  className: "size-20 rounded-full object-cover shadow-lg"
171
- }) : /* @__PURE__ */ v("div", {
171
+ }) : /* @__PURE__ */ _("div", {
172
172
  className: "size-20 rounded-full bg-accent-soft backdrop-blur-sm flex items-center justify-center text-[var(--color-action-primary-bg)] text-3xl font-semibold shadow-lg",
173
173
  children: (D.name || D.username || D.email).charAt(0).toUpperCase()
174
174
  }),
175
- /* @__PURE__ */ v("button", {
175
+ /* @__PURE__ */ _("button", {
176
176
  type: "button",
177
177
  onClick: () => B.current?.click(),
178
178
  disabled: V,
179
179
  "aria-label": C("auth.profile.changeAvatar", "Change profile picture"),
180
180
  className: "absolute inset-0 rounded-full flex items-center justify-center bg-black/40 opacity-0 group-hover:opacity-100 transition-opacity duration-200 cursor-pointer",
181
- children: V ? /* @__PURE__ */ v(o, { className: "size-6 text-white animate-spin" }) : /* @__PURE__ */ y("svg", {
181
+ children: V ? /* @__PURE__ */ _(l, { className: "size-6 text-white animate-spin" }) : /* @__PURE__ */ v("svg", {
182
182
  className: "size-6 text-white",
183
183
  fill: "none",
184
184
  viewBox: "0 0 24 24",
185
185
  stroke: "currentColor",
186
- children: [/* @__PURE__ */ v("path", {
186
+ children: [/* @__PURE__ */ _("path", {
187
187
  strokeLinecap: "round",
188
188
  strokeLinejoin: "round",
189
189
  strokeWidth: 2,
190
190
  d: "M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z"
191
- }), /* @__PURE__ */ v("path", {
191
+ }), /* @__PURE__ */ _("path", {
192
192
  strokeLinecap: "round",
193
193
  strokeLinejoin: "round",
194
194
  strokeWidth: 2,
@@ -196,7 +196,7 @@ function C() {
196
196
  })]
197
197
  })
198
198
  }),
199
- /* @__PURE__ */ v("input", {
199
+ /* @__PURE__ */ _("input", {
200
200
  ref: B,
201
201
  type: "file",
202
202
  accept: "image/*",
@@ -206,45 +206,45 @@ function C() {
206
206
  "aria-label": C("auth.profile.avatarUpload", "Upload avatar image")
207
207
  })
208
208
  ]
209
- }), /* @__PURE__ */ y("div", {
209
+ }), /* @__PURE__ */ v("div", {
210
210
  className: "text-text-primary",
211
211
  children: [
212
- /* @__PURE__ */ v("h2", {
212
+ /* @__PURE__ */ _("h2", {
213
213
  className: "text-2xl font-semibold",
214
214
  children: D.name || `${D.firstName || ""} ${D.lastName || ""}`.trim() || D.username
215
215
  }),
216
- /* @__PURE__ */ y("p", {
216
+ /* @__PURE__ */ v("p", {
217
217
  className: "text-text-secondary flex items-center gap-2",
218
- children: [/* @__PURE__ */ v(a, { className: "size-4" }), D.email]
218
+ children: [/* @__PURE__ */ _(c, { className: "size-4" }), D.email]
219
219
  }),
220
- /* @__PURE__ */ y("div", {
220
+ /* @__PURE__ */ v("div", {
221
221
  className: "flex items-center gap-2 mt-2",
222
- children: [/* @__PURE__ */ v("span", {
222
+ children: [/* @__PURE__ */ _("span", {
223
223
  className: "px-2.5 py-1 rounded-full text-xs font-medium bg-bg-surface/60 text-text-secondary backdrop-blur-sm",
224
224
  children: D.role?.replace("_", " ") || C("auth.profile.member", "Member")
225
- }), D.emailVerified && /* @__PURE__ */ y("span", {
225
+ }), D.emailVerified && /* @__PURE__ */ v("span", {
226
226
  className: "px-2.5 py-1 rounded-full text-xs font-medium bg-status-success-bg-subtle text-status-success-text flex items-center gap-1",
227
- children: [/* @__PURE__ */ v(i, { className: "size-3" }), C("auth.profile.verified", "Verified")]
227
+ children: [/* @__PURE__ */ _(s, { className: "size-3" }), C("auth.profile.verified", "Verified")]
228
228
  })]
229
229
  })
230
230
  ]
231
231
  })]
232
232
  })
233
- }), /* @__PURE__ */ v("div", {
233
+ }), /* @__PURE__ */ _("div", {
234
234
  className: "p-6",
235
- children: W ? /* @__PURE__ */ y("form", {
235
+ children: W ? /* @__PURE__ */ v("form", {
236
236
  onSubmit: async (e) => {
237
- if (e.preventDefault(), Y(null), Z(null), $(null), !u(K.phoneNumber).valid) {
237
+ if (e.preventDefault(), Y(null), Z(null), $(null), !n(K.phoneNumber).valid) {
238
238
  let e = C("auth.profile.phoneNumber_invalid", "Invalid phone number");
239
239
  Z(e), Y(e);
240
240
  return;
241
241
  }
242
- let t = d(K, { requireAll: !1 });
243
- if (!t.valid) {
244
- Y(t.errors.map((e) => C(`auth.profile.${e.field}_${e.code}`, e.message)).join(" · "));
245
- return;
246
- }
247
- try {
242
+ let t = r(K, { requireAll: !1 });
243
+ if (!t.valid) Y(t.errors.map((e) => {
244
+ let t = `auth.profile.${e.field}_${e.code}`;
245
+ return C(t, e.message);
246
+ }).join(" · "));
247
+ else try {
248
248
  await k({
249
249
  username: t.values.username || void 0,
250
250
  firstName: t.values.firstName || void 0,
@@ -257,22 +257,22 @@ function C() {
257
257
  }
258
258
  },
259
259
  className: "space-y-6",
260
- children: [/* @__PURE__ */ y("div", {
260
+ children: [/* @__PURE__ */ v("div", {
261
261
  className: "grid grid-cols-1 md:grid-cols-2 gap-6",
262
262
  children: [
263
- /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("label", {
263
+ /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("label", {
264
264
  htmlFor: j,
265
265
  className: "block text-sm font-medium text-[var(--color-text-primary)] mb-2",
266
266
  children: C("auth.profile.username", "Username")
267
- }), /* @__PURE__ */ y("div", {
267
+ }), /* @__PURE__ */ v("div", {
268
268
  className: "relative",
269
- children: [/* @__PURE__ */ v("div", {
269
+ children: [/* @__PURE__ */ _("div", {
270
270
  className: "absolute inset-y-0 left-0 pl-3.5 flex items-center pointer-events-none",
271
- children: /* @__PURE__ */ v(s, {
271
+ children: /* @__PURE__ */ _(ee, {
272
272
  className: "size-5 text-[var(--color-text-tertiary)]",
273
273
  "aria-hidden": "true"
274
274
  })
275
- }), /* @__PURE__ */ v("input", {
275
+ }), /* @__PURE__ */ _("input", {
276
276
  id: j,
277
277
  type: "text",
278
278
  "aria-label": C("auth.profile.username", "Username"),
@@ -285,11 +285,11 @@ function C() {
285
285
  placeholder: C("auth.profile.usernamePlaceholder", "Enter username")
286
286
  })]
287
287
  })] }),
288
- /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("label", {
288
+ /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("label", {
289
289
  htmlFor: M,
290
290
  className: "block text-sm font-medium text-[var(--color-text-primary)] mb-2",
291
291
  children: C("auth.profile.displayName", "Display Name")
292
- }), /* @__PURE__ */ v("input", {
292
+ }), /* @__PURE__ */ _("input", {
293
293
  id: M,
294
294
  type: "text",
295
295
  "aria-label": C("auth.profile.displayName", "Display Name"),
@@ -301,11 +301,11 @@ function C() {
301
301
  className: "block w-full px-4 py-3 border border-[var(--color-border-default)] rounded-xl bg-[var(--color-bg-surface)] text-[var(--color-text-primary)] focus:outline-none focus:ring-2 focus:ring-action-primary-bg/20 focus:border-action-primary-bg transition-all duration-300",
302
302
  placeholder: C("auth.profile.displayNamePlaceholder", "Enter display name")
303
303
  })] }),
304
- /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("label", {
304
+ /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("label", {
305
305
  htmlFor: N,
306
306
  className: "block text-sm font-medium text-[var(--color-text-primary)] mb-2",
307
307
  children: C("auth.profile.firstName", "First Name")
308
- }), /* @__PURE__ */ v("input", {
308
+ }), /* @__PURE__ */ _("input", {
309
309
  id: N,
310
310
  type: "text",
311
311
  "aria-label": C("auth.profile.firstName", "First Name"),
@@ -317,11 +317,11 @@ function C() {
317
317
  className: "block w-full px-4 py-3 border border-[var(--color-border-default)] rounded-xl bg-[var(--color-bg-surface)] text-[var(--color-text-primary)] focus:outline-none focus:ring-2 focus:ring-action-primary-bg/20 focus:border-action-primary-bg transition-all duration-300",
318
318
  placeholder: C("auth.profile.firstNamePlaceholder", "Enter first name")
319
319
  })] }),
320
- /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("label", {
320
+ /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("label", {
321
321
  htmlFor: P,
322
322
  className: "block text-sm font-medium text-[var(--color-text-primary)] mb-2",
323
323
  children: C("auth.profile.lastName", "Last Name")
324
- }), /* @__PURE__ */ v("input", {
324
+ }), /* @__PURE__ */ _("input", {
325
325
  id: P,
326
326
  type: "text",
327
327
  "aria-label": C("auth.profile.lastName", "Last Name"),
@@ -333,15 +333,15 @@ function C() {
333
333
  className: "block w-full px-4 py-3 border border-[var(--color-border-default)] rounded-xl bg-[var(--color-bg-surface)] text-[var(--color-text-primary)] focus:outline-none focus:ring-2 focus:ring-action-primary-bg/20 focus:border-action-primary-bg transition-all duration-300",
334
334
  placeholder: C("auth.profile.lastNamePlaceholder", "Enter last name")
335
335
  })] }),
336
- /* @__PURE__ */ y("div", {
336
+ /* @__PURE__ */ v("div", {
337
337
  className: "md:col-span-2",
338
338
  children: [
339
- /* @__PURE__ */ v("label", {
339
+ /* @__PURE__ */ _("label", {
340
340
  htmlFor: F,
341
341
  className: "block text-sm font-medium text-[var(--color-text-primary)] mb-2",
342
342
  children: C("auth.profile.phoneNumber", "Phone Number")
343
343
  }),
344
- /* @__PURE__ */ v("input", {
344
+ /* @__PURE__ */ _("input", {
345
345
  id: F,
346
346
  type: "tel",
347
347
  "aria-label": C("auth.profile.phoneNumber", "Phone Number"),
@@ -357,7 +357,7 @@ function C() {
357
357
  className: "block w-full px-4 py-3 border border-[var(--color-border-default)] rounded-xl bg-[var(--color-bg-surface)] text-[var(--color-text-primary)] focus:outline-none focus:ring-2 focus:ring-action-primary-bg/20 focus:border-action-primary-bg transition-all duration-300",
358
358
  placeholder: C("auth.profile.phonePlaceholder", "Enter phone number")
359
359
  }),
360
- X && /* @__PURE__ */ v("p", {
360
+ X && /* @__PURE__ */ _("p", {
361
361
  id: `${F}-error`,
362
362
  role: "alert",
363
363
  className: "mt-2 text-sm text-[var(--color-status-error-text)]",
@@ -366,16 +366,16 @@ function C() {
366
366
  ]
367
367
  })
368
368
  ]
369
- }), /* @__PURE__ */ y("div", {
369
+ }), /* @__PURE__ */ v("div", {
370
370
  className: "flex gap-3 pt-6 mt-6 border-t border-[var(--color-border-default)]",
371
- children: [/* @__PURE__ */ v(b, {
371
+ children: [/* @__PURE__ */ _(y, {
372
372
  type: "submit",
373
373
  disabled: A,
374
374
  variant: "default",
375
375
  size: "lg",
376
376
  className: "font-semibold",
377
- children: A ? /* @__PURE__ */ y(_, { children: [/* @__PURE__ */ v(o, { className: "size-4 animate-spin" }), C("auth.profile.saving", "Saving...")] }) : C("auth.profile.saveChanges", "Save Changes")
378
- }), /* @__PURE__ */ v("button", {
377
+ children: A ? /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _(l, { className: "size-4 animate-spin" }), C("auth.profile.saving", "Saving...")] }) : C("auth.profile.saveChanges", "Save Changes")
378
+ }), /* @__PURE__ */ _("button", {
379
379
  type: "button",
380
380
  onClick: () => {
381
381
  D && q({
@@ -390,129 +390,129 @@ function C() {
390
390
  children: C("auth.profile.cancel", "Cancel")
391
391
  })]
392
392
  })]
393
- }) : /* @__PURE__ */ y(_, { children: [/* @__PURE__ */ y("div", {
393
+ }) : /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ v("div", {
394
394
  className: "grid grid-cols-1 md:grid-cols-2 gap-6",
395
395
  children: [
396
- /* @__PURE__ */ y("div", {
396
+ /* @__PURE__ */ v("div", {
397
397
  className: "p-4 rounded-xl bg-[var(--color-bg-muted)]",
398
- children: [/* @__PURE__ */ v("label", {
398
+ children: [/* @__PURE__ */ _("label", {
399
399
  className: "block text-sm font-medium text-[var(--color-text-tertiary)] mb-1",
400
400
  children: C("auth.profile.username", "Username")
401
- }), /* @__PURE__ */ v("p", {
401
+ }), /* @__PURE__ */ _("p", {
402
402
  className: "text-[var(--color-text-primary)] font-medium",
403
403
  children: D.username || "-"
404
404
  })]
405
405
  }),
406
- /* @__PURE__ */ y("div", {
406
+ /* @__PURE__ */ v("div", {
407
407
  className: "p-4 rounded-xl bg-[var(--color-bg-muted)]",
408
- children: [/* @__PURE__ */ v("label", {
408
+ children: [/* @__PURE__ */ _("label", {
409
409
  className: "block text-sm font-medium text-[var(--color-text-tertiary)] mb-1",
410
410
  children: C("auth.profile.displayName", "Display Name")
411
- }), /* @__PURE__ */ v("p", {
411
+ }), /* @__PURE__ */ _("p", {
412
412
  className: "text-[var(--color-text-primary)] font-medium",
413
413
  children: D.name || "-"
414
414
  })]
415
415
  }),
416
- /* @__PURE__ */ y("div", {
416
+ /* @__PURE__ */ v("div", {
417
417
  className: "p-4 rounded-xl bg-[var(--color-bg-muted)]",
418
- children: [/* @__PURE__ */ v("label", {
418
+ children: [/* @__PURE__ */ _("label", {
419
419
  className: "block text-sm font-medium text-[var(--color-text-tertiary)] mb-1",
420
420
  children: C("auth.profile.firstName", "First Name")
421
- }), /* @__PURE__ */ v("p", {
421
+ }), /* @__PURE__ */ _("p", {
422
422
  className: "text-[var(--color-text-primary)] font-medium",
423
423
  children: D.firstName || "-"
424
424
  })]
425
425
  }),
426
- /* @__PURE__ */ y("div", {
426
+ /* @__PURE__ */ v("div", {
427
427
  className: "p-4 rounded-xl bg-[var(--color-bg-muted)]",
428
- children: [/* @__PURE__ */ v("label", {
428
+ children: [/* @__PURE__ */ _("label", {
429
429
  className: "block text-sm font-medium text-[var(--color-text-tertiary)] mb-1",
430
430
  children: C("auth.profile.lastName", "Last Name")
431
- }), /* @__PURE__ */ v("p", {
431
+ }), /* @__PURE__ */ _("p", {
432
432
  className: "text-[var(--color-text-primary)] font-medium",
433
433
  children: D.lastName || "-"
434
434
  })]
435
435
  }),
436
- /* @__PURE__ */ y("div", {
436
+ /* @__PURE__ */ v("div", {
437
437
  className: "p-4 rounded-xl bg-[var(--color-bg-muted)]",
438
- children: [/* @__PURE__ */ v("label", {
438
+ children: [/* @__PURE__ */ _("label", {
439
439
  className: "block text-sm font-medium text-[var(--color-text-tertiary)] mb-1",
440
440
  children: C("auth.profile.email", "Email")
441
- }), /* @__PURE__ */ y("p", {
441
+ }), /* @__PURE__ */ v("p", {
442
442
  className: "text-[var(--color-text-primary)] font-medium flex items-center gap-2",
443
- children: [D.email, D.emailVerified && /* @__PURE__ */ y("span", {
443
+ children: [D.email, D.emailVerified && /* @__PURE__ */ v("span", {
444
444
  className: "inline-flex items-center gap-1 text-[var(--color-status-success-text)] text-xs",
445
- children: [/* @__PURE__ */ v(i, { className: "size-3" }), C("auth.profile.verified", "Verified")]
445
+ children: [/* @__PURE__ */ _(s, { className: "size-3" }), C("auth.profile.verified", "Verified")]
446
446
  })]
447
447
  })]
448
448
  }),
449
- /* @__PURE__ */ y("div", {
449
+ /* @__PURE__ */ v("div", {
450
450
  className: "p-4 rounded-xl bg-[var(--color-bg-muted)]",
451
- children: [/* @__PURE__ */ v("label", {
451
+ children: [/* @__PURE__ */ _("label", {
452
452
  className: "block text-sm font-medium text-[var(--color-text-tertiary)] mb-1",
453
453
  children: C("auth.profile.phoneNumber", "Phone Number")
454
- }), /* @__PURE__ */ v("p", {
454
+ }), /* @__PURE__ */ _("p", {
455
455
  className: "text-[var(--color-text-primary)] font-medium",
456
456
  children: D.phoneNumber || "-"
457
457
  })]
458
458
  }),
459
- /* @__PURE__ */ y("div", {
459
+ /* @__PURE__ */ v("div", {
460
460
  className: "p-4 rounded-xl bg-[var(--color-bg-muted)]",
461
- children: [/* @__PURE__ */ v("label", {
461
+ children: [/* @__PURE__ */ _("label", {
462
462
  className: "block text-sm font-medium text-[var(--color-text-tertiary)] mb-1",
463
463
  children: C("auth.profile.role", "Role")
464
- }), /* @__PURE__ */ v("p", {
464
+ }), /* @__PURE__ */ _("p", {
465
465
  className: "text-[var(--color-text-primary)] font-medium",
466
466
  children: D.role?.replace("_", " ") || C("auth.profile.member", "Member")
467
467
  })]
468
468
  }),
469
- /* @__PURE__ */ y("div", {
469
+ /* @__PURE__ */ v("div", {
470
470
  className: "p-4 rounded-xl bg-[var(--color-bg-muted)]",
471
- children: [/* @__PURE__ */ v("label", {
471
+ children: [/* @__PURE__ */ _("label", {
472
472
  className: "block text-sm font-medium text-[var(--color-text-tertiary)] mb-1",
473
473
  children: C("auth.profile.mfaStatus", "MFA Status")
474
- }), /* @__PURE__ */ v("p", {
474
+ }), /* @__PURE__ */ _("p", {
475
475
  className: "text-[var(--color-text-primary)] font-medium",
476
- children: D.mfaEnabled ? /* @__PURE__ */ y("span", {
476
+ children: D.mfaEnabled ? /* @__PURE__ */ v("span", {
477
477
  className: "text-[var(--color-status-success-text)] flex items-center gap-1",
478
- children: [/* @__PURE__ */ v(i, { className: "size-4" }), C("auth.profile.enabled", "Enabled")]
479
- }) : /* @__PURE__ */ v("span", {
478
+ children: [/* @__PURE__ */ _(s, { className: "size-4" }), C("auth.profile.enabled", "Enabled")]
479
+ }) : /* @__PURE__ */ _("span", {
480
480
  className: "text-[var(--color-status-warning-text)]",
481
481
  children: C("auth.profile.notEnabled", "Not Enabled")
482
482
  })
483
483
  })]
484
484
  }),
485
- /* @__PURE__ */ y("div", {
485
+ /* @__PURE__ */ v("div", {
486
486
  className: "p-4 rounded-xl bg-[var(--color-bg-muted)]",
487
- children: [/* @__PURE__ */ v("label", {
487
+ children: [/* @__PURE__ */ _("label", {
488
488
  className: "block text-sm font-medium text-[var(--color-text-tertiary)] mb-1",
489
489
  children: C("auth.profile.lastLogin", "Last Login")
490
- }), /* @__PURE__ */ v("p", {
490
+ }), /* @__PURE__ */ _("p", {
491
491
  className: "text-[var(--color-text-primary)] font-medium",
492
492
  children: D.lastLoginAt ? new Date(D.lastLoginAt).toLocaleString() : C("auth.profile.never", "Never")
493
493
  })]
494
494
  }),
495
- /* @__PURE__ */ y("div", {
495
+ /* @__PURE__ */ v("div", {
496
496
  className: "p-4 rounded-xl bg-[var(--color-bg-muted)]",
497
- children: [/* @__PURE__ */ v("label", {
497
+ children: [/* @__PURE__ */ _("label", {
498
498
  className: "block text-sm font-medium text-[var(--color-text-tertiary)] mb-1",
499
499
  children: C("auth.profile.accountCreated", "Account Created")
500
- }), /* @__PURE__ */ v("p", {
500
+ }), /* @__PURE__ */ _("p", {
501
501
  className: "text-[var(--color-text-primary)] font-medium",
502
502
  children: D.createdAt ? new Date(D.createdAt).toLocaleString() : "-"
503
503
  })]
504
504
  })
505
505
  ]
506
- }), /* @__PURE__ */ y("div", {
506
+ }), /* @__PURE__ */ v("div", {
507
507
  className: "flex gap-3 pt-6 mt-6 border-t border-[var(--color-border-default)]",
508
- children: [/* @__PURE__ */ v(b, {
508
+ children: [/* @__PURE__ */ _(y, {
509
509
  type: "button",
510
510
  onClick: () => G(!0),
511
511
  variant: "default",
512
512
  size: "lg",
513
513
  className: "font-semibold",
514
514
  children: C("auth.profile.editProfile", "Edit Profile")
515
- }), /* @__PURE__ */ v("button", {
515
+ }), /* @__PURE__ */ _("button", {
516
516
  type: "button",
517
517
  onClick: () => w("/auth/security"),
518
518
  className: "inline-flex items-center h-10 px-8 rounded-xl border border-[var(--color-border-default)] text-[var(--color-text-secondary)] font-medium hover:bg-[var(--color-bg-muted)] transition-colors duration-200",
@@ -521,7 +521,7 @@ function C() {
521
521
  })] })
522
522
  })]
523
523
  }),
524
- /* @__PURE__ */ v(x, {
524
+ /* @__PURE__ */ _(b, {
525
525
  className: "mt-8",
526
526
  storageKey: "auth-profile",
527
527
  steps: [
@@ -547,21 +547,21 @@ function C() {
547
547
  }
548
548
  ]
549
549
  }),
550
- /* @__PURE__ */ y("div", {
550
+ /* @__PURE__ */ v("div", {
551
551
  className: "mt-8 grid grid-cols-1 md:grid-cols-3 gap-4",
552
- children: [/* @__PURE__ */ y("button", {
552
+ children: [/* @__PURE__ */ v("button", {
553
553
  type: "button",
554
554
  onClick: () => w("/auth/mfa"),
555
555
  className: "p-4 rounded-xl border border-[var(--color-border-default)] bg-[var(--color-bg-surface)] hover:border-[var(--color-action-primary-border)] transition-colors duration-200 text-left group",
556
556
  children: [
557
- /* @__PURE__ */ v("div", {
557
+ /* @__PURE__ */ _("div", {
558
558
  className: "size-10 rounded-lg bg-[var(--color-bg-accent)] flex items-center justify-center mb-3 group-hover:bg-[var(--color-action-primary-bg-subtle)] transition-colors duration-200",
559
- children: /* @__PURE__ */ v("svg", {
559
+ children: /* @__PURE__ */ _("svg", {
560
560
  className: "size-5 text-[var(--color-text-link)]",
561
561
  fill: "none",
562
562
  viewBox: "0 0 24 24",
563
563
  stroke: "currentColor",
564
- children: /* @__PURE__ */ v("path", {
564
+ children: /* @__PURE__ */ _("path", {
565
565
  strokeLinecap: "round",
566
566
  strokeLinejoin: "round",
567
567
  strokeWidth: 2,
@@ -569,28 +569,28 @@ function C() {
569
569
  })
570
570
  })
571
571
  }),
572
- /* @__PURE__ */ v("h3", {
572
+ /* @__PURE__ */ _("h3", {
573
573
  className: "font-medium text-[var(--color-text-primary)]",
574
574
  children: C("auth.profile.twoFactorAuth", "Two-Factor Auth")
575
575
  }),
576
- /* @__PURE__ */ v("p", {
576
+ /* @__PURE__ */ _("p", {
577
577
  className: "text-sm text-[var(--color-text-tertiary)] mt-1",
578
578
  children: D.mfaEnabled ? C("auth.profile.manageMfa", "Manage MFA settings") : C("auth.profile.enableMfa", "Enable MFA for extra security")
579
579
  })
580
580
  ]
581
- }), /* @__PURE__ */ y("button", {
581
+ }), /* @__PURE__ */ v("button", {
582
582
  type: "button",
583
583
  onClick: () => w("/devportal/api-keys"),
584
584
  className: "p-4 rounded-xl border border-[var(--color-border-default)] bg-[var(--color-bg-surface)] hover:border-[var(--color-action-secondary-border)] transition-colors duration-200 text-left group",
585
585
  children: [
586
- /* @__PURE__ */ v("div", {
586
+ /* @__PURE__ */ _("div", {
587
587
  className: "size-10 rounded-lg bg-[var(--color-action-secondary-bg-subtle)] flex items-center justify-center mb-3 group-hover:bg-[var(--color-action-secondary-bg-subtle)] transition-colors duration-200",
588
- children: /* @__PURE__ */ v("svg", {
588
+ children: /* @__PURE__ */ _("svg", {
589
589
  className: "size-5 text-[var(--color-action-secondary-text)]",
590
590
  fill: "none",
591
591
  viewBox: "0 0 24 24",
592
592
  stroke: "currentColor",
593
- children: /* @__PURE__ */ v("path", {
593
+ children: /* @__PURE__ */ _("path", {
594
594
  strokeLinecap: "round",
595
595
  strokeLinejoin: "round",
596
596
  strokeWidth: 2,
@@ -598,11 +598,11 @@ function C() {
598
598
  })
599
599
  })
600
600
  }),
601
- /* @__PURE__ */ v("h3", {
601
+ /* @__PURE__ */ _("h3", {
602
602
  className: "font-medium text-[var(--color-text-primary)]",
603
603
  children: C("auth.profile.apiKeys", "API Keys")
604
604
  }),
605
- /* @__PURE__ */ v("p", {
605
+ /* @__PURE__ */ _("p", {
606
606
  className: "text-sm text-[var(--color-text-tertiary)] mt-1",
607
607
  children: C("auth.profile.manageApiKeys", "Manage your API access credentials")
608
608
  })
@@ -612,7 +612,6 @@ function C() {
612
612
  ]
613
613
  });
614
614
  }
615
- //#endregion
616
615
  export { C as UserProfilePage };
617
616
 
618
617
  //# sourceMappingURL=UserProfilePage.js.map