@delmaredigital/payload-better-auth 0.3.7 → 0.3.9

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 (119) hide show
  1. package/README.md +12 -1
  2. package/dist/adapter/collections.d.ts.map +1 -1
  3. package/dist/adapter/collections.js +126 -88
  4. package/dist/adapter/collections.js.map +1 -1
  5. package/dist/adapter/index.js +197 -150
  6. package/dist/adapter/index.js.map +1 -1
  7. package/dist/components/BeforeLogin.d.ts +1 -1
  8. package/dist/components/BeforeLogin.d.ts.map +1 -1
  9. package/dist/components/BeforeLogin.js +15 -7
  10. package/dist/components/BeforeLogin.js.map +1 -1
  11. package/dist/components/LoginView.d.ts +2 -2
  12. package/dist/components/LoginView.d.ts.map +1 -1
  13. package/dist/components/LoginView.js +660 -218
  14. package/dist/components/LoginView.js.map +1 -1
  15. package/dist/components/LoginViewWrapper.d.ts +1 -1
  16. package/dist/components/LoginViewWrapper.d.ts.map +1 -1
  17. package/dist/components/LoginViewWrapper.js +14 -4
  18. package/dist/components/LoginViewWrapper.js.map +1 -1
  19. package/dist/components/LogoutButton.d.ts +1 -1
  20. package/dist/components/LogoutButton.d.ts.map +1 -1
  21. package/dist/components/LogoutButton.js +19 -11
  22. package/dist/components/LogoutButton.js.map +1 -1
  23. package/dist/components/PasskeyRegisterButton.d.ts +2 -2
  24. package/dist/components/PasskeyRegisterButton.d.ts.map +1 -1
  25. package/dist/components/PasskeyRegisterButton.js +20 -16
  26. package/dist/components/PasskeyRegisterButton.js.map +1 -1
  27. package/dist/components/PasskeySignInButton.d.ts +2 -2
  28. package/dist/components/PasskeySignInButton.d.ts.map +1 -1
  29. package/dist/components/PasskeySignInButton.js +14 -12
  30. package/dist/components/PasskeySignInButton.js.map +1 -1
  31. package/dist/components/auth/ForgotPasswordView.d.ts +1 -1
  32. package/dist/components/auth/ForgotPasswordView.d.ts.map +1 -1
  33. package/dist/components/auth/ForgotPasswordView.js +133 -43
  34. package/dist/components/auth/ForgotPasswordView.js.map +1 -1
  35. package/dist/components/auth/ResetPasswordView.d.ts +1 -1
  36. package/dist/components/auth/ResetPasswordView.d.ts.map +1 -1
  37. package/dist/components/auth/ResetPasswordView.js +154 -50
  38. package/dist/components/auth/ResetPasswordView.js.map +1 -1
  39. package/dist/components/auth/index.js +2 -2
  40. package/dist/components/auth/index.js.map +1 -1
  41. package/dist/components/management/ApiKeysManagementClient.d.ts +2 -2
  42. package/dist/components/management/ApiKeysManagementClient.d.ts.map +1 -1
  43. package/dist/components/management/ApiKeysManagementClient.js +539 -222
  44. package/dist/components/management/ApiKeysManagementClient.js.map +1 -1
  45. package/dist/components/management/PasskeysManagementClient.d.ts +2 -2
  46. package/dist/components/management/PasskeysManagementClient.d.ts.map +1 -1
  47. package/dist/components/management/PasskeysManagementClient.js +215 -92
  48. package/dist/components/management/PasskeysManagementClient.js.map +1 -1
  49. package/dist/components/management/SecurityNavLinks.d.ts +1 -1
  50. package/dist/components/management/SecurityNavLinks.d.ts.map +1 -1
  51. package/dist/components/management/SecurityNavLinks.js +51 -24
  52. package/dist/components/management/SecurityNavLinks.js.map +1 -1
  53. package/dist/components/management/TwoFactorManagementClient.d.ts +2 -2
  54. package/dist/components/management/TwoFactorManagementClient.d.ts.map +1 -1
  55. package/dist/components/management/TwoFactorManagementClient.js +270 -111
  56. package/dist/components/management/TwoFactorManagementClient.js.map +1 -1
  57. package/dist/components/management/index.js +2 -2
  58. package/dist/components/management/index.js.map +1 -1
  59. package/dist/components/management/views/ApiKeysView.d.ts +1 -1
  60. package/dist/components/management/views/ApiKeysView.d.ts.map +1 -1
  61. package/dist/components/management/views/ApiKeysView.js +19 -4
  62. package/dist/components/management/views/ApiKeysView.js.map +1 -1
  63. package/dist/components/management/views/PasskeysView.d.ts +1 -1
  64. package/dist/components/management/views/PasskeysView.d.ts.map +1 -1
  65. package/dist/components/management/views/PasskeysView.js +16 -4
  66. package/dist/components/management/views/PasskeysView.js.map +1 -1
  67. package/dist/components/management/views/TwoFactorView.d.ts +1 -1
  68. package/dist/components/management/views/TwoFactorView.d.ts.map +1 -1
  69. package/dist/components/management/views/TwoFactorView.js +16 -4
  70. package/dist/components/management/views/TwoFactorView.js.map +1 -1
  71. package/dist/components/management/views/index.js +2 -2
  72. package/dist/components/management/views/index.js.map +1 -1
  73. package/dist/components/twoFactor/TwoFactorSetupView.d.ts +1 -1
  74. package/dist/components/twoFactor/TwoFactorSetupView.d.ts.map +1 -1
  75. package/dist/components/twoFactor/TwoFactorSetupView.js +240 -87
  76. package/dist/components/twoFactor/TwoFactorSetupView.js.map +1 -1
  77. package/dist/components/twoFactor/TwoFactorVerifyView.d.ts +1 -1
  78. package/dist/components/twoFactor/TwoFactorVerifyView.d.ts.map +1 -1
  79. package/dist/components/twoFactor/TwoFactorVerifyView.js +108 -45
  80. package/dist/components/twoFactor/TwoFactorVerifyView.js.map +1 -1
  81. package/dist/components/twoFactor/index.js +2 -2
  82. package/dist/components/twoFactor/index.js.map +1 -1
  83. package/dist/exports/client.js +9 -10
  84. package/dist/exports/client.js.map +1 -1
  85. package/dist/exports/components.js +2 -2
  86. package/dist/exports/components.js.map +1 -1
  87. package/dist/exports/management.js +3 -3
  88. package/dist/exports/management.js.map +1 -1
  89. package/dist/exports/rsc.js +2 -2
  90. package/dist/exports/rsc.js.map +1 -1
  91. package/dist/generated-types.js +4 -2
  92. package/dist/generated-types.js.map +1 -1
  93. package/dist/index.js +6 -6
  94. package/dist/index.js.map +1 -1
  95. package/dist/plugin/index.js +198 -162
  96. package/dist/plugin/index.js.map +1 -1
  97. package/dist/scripts/generate-types.js +66 -50
  98. package/dist/scripts/generate-types.js.map +1 -1
  99. package/dist/types/apiKey.js +7 -2
  100. package/dist/types/apiKey.js.map +1 -1
  101. package/dist/types/betterAuth.js +23 -2
  102. package/dist/types/betterAuth.js.map +1 -1
  103. package/dist/utils/access.js +78 -81
  104. package/dist/utils/access.js.map +1 -1
  105. package/dist/utils/apiKeyAccess.js +65 -72
  106. package/dist/utils/apiKeyAccess.js.map +1 -1
  107. package/dist/utils/betterAuthDefaults.js +8 -8
  108. package/dist/utils/betterAuthDefaults.js.map +1 -1
  109. package/dist/utils/detectAuthConfig.js +8 -11
  110. package/dist/utils/detectAuthConfig.js.map +1 -1
  111. package/dist/utils/detectEnabledPlugins.js +6 -7
  112. package/dist/utils/detectEnabledPlugins.js.map +1 -1
  113. package/dist/utils/firstUserAdmin.js +18 -20
  114. package/dist/utils/firstUserAdmin.js.map +1 -1
  115. package/dist/utils/generateScopes.js +40 -41
  116. package/dist/utils/generateScopes.js.map +1 -1
  117. package/dist/utils/session.js +8 -9
  118. package/dist/utils/session.js.map +1 -1
  119. package/package.json +27 -13
@@ -1,12 +1,11 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useState, useEffect } from 'react';
4
- import { createPayloadAuthClient, } from '../../exports/client';
4
+ import { createPayloadAuthClient } from '../../exports/client.js';
5
5
  /**
6
6
  * Client component for passkey management.
7
7
  * Lists, registers, and deletes passkeys.
8
- */
9
- export function PasskeysManagementClient({ authClient: providedClient, title = 'Passkeys', } = {}) {
8
+ */ export function PasskeysManagementClient({ authClient: providedClient, title = 'Passkeys' } = {}) {
10
9
  const [passkeys, setPasskeys] = useState([]);
11
10
  const [loading, setLoading] = useState(true);
12
11
  const [error, setError] = useState(null);
@@ -15,10 +14,10 @@ export function PasskeysManagementClient({ authClient: providedClient, title = '
15
14
  const [deleting, setDeleting] = useState(null);
16
15
  const [showRegisterForm, setShowRegisterForm] = useState(false);
17
16
  const [passkeyName, setPasskeyName] = useState('');
18
- const getClient = () => providedClient ?? createPayloadAuthClient();
19
- useEffect(() => {
17
+ const getClient = ()=>providedClient ?? createPayloadAuthClient();
18
+ useEffect(()=>{
20
19
  fetchPasskeys();
21
- // eslint-disable-next-line react-hooks/exhaustive-deps
20
+ // eslint-disable-next-line react-hooks/exhaustive-deps
22
21
  }, []);
23
22
  async function fetchPasskeys() {
24
23
  setLoading(true);
@@ -28,15 +27,12 @@ export function PasskeysManagementClient({ authClient: providedClient, title = '
28
27
  const result = await client.passkey.listUserPasskeys();
29
28
  if (result.error) {
30
29
  setError(result.error.message ?? 'Failed to load passkeys');
31
- }
32
- else {
30
+ } else {
33
31
  setPasskeys(result.data ?? []);
34
32
  }
35
- }
36
- catch {
33
+ } catch {
37
34
  setError('Failed to load passkeys');
38
- }
39
- finally {
35
+ } finally{
40
36
  setLoading(false);
41
37
  }
42
38
  }
@@ -48,30 +44,25 @@ export function PasskeysManagementClient({ authClient: providedClient, title = '
48
44
  try {
49
45
  const client = getClient();
50
46
  const result = await client.passkey.addPasskey({
51
- name: passkeyName || undefined,
47
+ name: passkeyName || undefined
52
48
  });
53
49
  if (result.error) {
54
50
  setError(result.error.message ?? 'Failed to register passkey');
55
- }
56
- else {
51
+ } else {
57
52
  setSuccess('Passkey registered successfully!');
58
53
  setShowRegisterForm(false);
59
54
  setPasskeyName('');
60
55
  fetchPasskeys();
61
56
  }
62
- }
63
- catch (err) {
57
+ } catch (err) {
64
58
  if (err instanceof Error && err.name === 'NotAllowedError') {
65
59
  setError('Passkey registration was cancelled or not allowed');
66
- }
67
- else if (err instanceof Error && err.name === 'InvalidStateError') {
60
+ } else if (err instanceof Error && err.name === 'InvalidStateError') {
68
61
  setError('This passkey is already registered');
69
- }
70
- else {
62
+ } else {
71
63
  setError(err instanceof Error ? err.message : 'Failed to register passkey');
72
64
  }
73
- }
74
- finally {
65
+ } finally{
75
66
  setRegistering(false);
76
67
  }
77
68
  }
@@ -84,101 +75,173 @@ export function PasskeysManagementClient({ authClient: providedClient, title = '
84
75
  setSuccess(null);
85
76
  try {
86
77
  const client = getClient();
87
- const result = await client.passkey.deletePasskey({ id: passkeyId });
78
+ const result = await client.passkey.deletePasskey({
79
+ id: passkeyId
80
+ });
88
81
  if (result.error) {
89
82
  setError(result.error.message ?? 'Failed to delete passkey');
90
- }
91
- else {
92
- setPasskeys((prev) => prev.filter((p) => p.id !== passkeyId));
83
+ } else {
84
+ setPasskeys((prev)=>prev.filter((p)=>p.id !== passkeyId));
93
85
  setSuccess('Passkey deleted successfully');
94
86
  }
95
- }
96
- catch {
87
+ } catch {
97
88
  setError('Failed to delete passkey');
98
- }
99
- finally {
89
+ } finally{
100
90
  setDeleting(null);
101
91
  }
102
92
  }
103
93
  function formatDate(date) {
104
- if (!date)
105
- return 'Never';
94
+ if (!date) return 'Never';
106
95
  const d = date instanceof Date ? date : new Date(date);
107
96
  return d.toLocaleString();
108
97
  }
109
- return (_jsxs("div", { style: {
98
+ return /*#__PURE__*/ _jsxs("div", {
99
+ style: {
110
100
  maxWidth: '900px',
111
101
  margin: '0 auto',
112
- padding: 'calc(var(--base) * 2)',
113
- }, children: [_jsxs("div", { style: {
102
+ padding: 'calc(var(--base) * 2)'
103
+ },
104
+ children: [
105
+ /*#__PURE__*/ _jsxs("div", {
106
+ style: {
114
107
  display: 'flex',
115
108
  justifyContent: 'space-between',
116
109
  alignItems: 'center',
117
- marginBottom: 'calc(var(--base) * 2)',
118
- }, children: [_jsxs("div", { children: [_jsx("h1", { style: {
110
+ marginBottom: 'calc(var(--base) * 2)'
111
+ },
112
+ children: [
113
+ /*#__PURE__*/ _jsxs("div", {
114
+ children: [
115
+ /*#__PURE__*/ _jsx("h1", {
116
+ style: {
119
117
  color: 'var(--theme-text)',
120
118
  fontSize: 'var(--font-size-h2)',
121
119
  fontWeight: 600,
122
- margin: 0,
123
- }, children: title }), _jsx("p", { style: {
120
+ margin: 0
121
+ },
122
+ children: title
123
+ }),
124
+ /*#__PURE__*/ _jsx("p", {
125
+ style: {
124
126
  color: 'var(--theme-text)',
125
127
  opacity: 0.7,
126
128
  fontSize: 'var(--font-size-small)',
127
- margin: 'calc(var(--base) * 0.5) 0 0 0',
128
- }, children: "Passkeys provide secure, passwordless sign-in using your device's biometrics or security keys." })] }), _jsx("button", { onClick: () => setShowRegisterForm(true), style: {
129
+ margin: 'calc(var(--base) * 0.5) 0 0 0'
130
+ },
131
+ children: "Passkeys provide secure, passwordless sign-in using your device's biometrics or security keys."
132
+ })
133
+ ]
134
+ }),
135
+ /*#__PURE__*/ _jsx("button", {
136
+ onClick: ()=>setShowRegisterForm(true),
137
+ style: {
129
138
  padding: 'calc(var(--base) * 0.5) calc(var(--base) * 1)',
130
139
  background: 'var(--theme-elevation-800)',
131
140
  border: 'none',
132
141
  borderRadius: 'var(--style-radius-s)',
133
142
  color: 'var(--theme-elevation-50)',
134
143
  fontSize: 'var(--font-size-small)',
135
- cursor: 'pointer',
136
- }, children: "Add Passkey" })] }), error && (_jsx("div", { style: {
144
+ cursor: 'pointer'
145
+ },
146
+ children: "Add Passkey"
147
+ })
148
+ ]
149
+ }),
150
+ error && /*#__PURE__*/ _jsx("div", {
151
+ style: {
137
152
  color: 'var(--theme-error-500)',
138
153
  marginBottom: 'var(--base)',
139
154
  fontSize: 'var(--font-size-small)',
140
155
  padding: 'calc(var(--base) * 0.75)',
141
156
  background: 'var(--theme-error-50)',
142
157
  borderRadius: 'var(--style-radius-s)',
143
- border: '1px solid var(--theme-error-200)',
144
- }, children: error })), success && (_jsx("div", { style: {
158
+ border: '1px solid var(--theme-error-200)'
159
+ },
160
+ children: error
161
+ }),
162
+ success && /*#__PURE__*/ _jsx("div", {
163
+ style: {
145
164
  color: 'var(--theme-success-700)',
146
165
  marginBottom: 'var(--base)',
147
166
  fontSize: 'var(--font-size-small)',
148
167
  padding: 'calc(var(--base) * 0.75)',
149
168
  background: 'var(--theme-success-50)',
150
169
  borderRadius: 'var(--style-radius-s)',
151
- border: '1px solid var(--theme-success-200)',
152
- }, children: success })), showRegisterForm && (_jsxs("div", { style: {
170
+ border: '1px solid var(--theme-success-200)'
171
+ },
172
+ children: success
173
+ }),
174
+ showRegisterForm && /*#__PURE__*/ _jsxs("div", {
175
+ style: {
153
176
  marginBottom: 'calc(var(--base) * 1.5)',
154
177
  padding: 'calc(var(--base) * 1.5)',
155
178
  background: 'var(--theme-elevation-50)',
156
179
  borderRadius: 'var(--style-radius-m)',
157
- border: '1px solid var(--theme-elevation-100)',
158
- }, children: [_jsx("h2", { style: {
180
+ border: '1px solid var(--theme-elevation-100)'
181
+ },
182
+ children: [
183
+ /*#__PURE__*/ _jsx("h2", {
184
+ style: {
159
185
  color: 'var(--theme-text)',
160
186
  fontSize: 'var(--font-size-h4)',
161
187
  fontWeight: 500,
162
- margin: '0 0 var(--base) 0',
163
- }, children: "Register New Passkey" }), _jsxs("form", { onSubmit: handleRegister, children: [_jsxs("div", { style: { marginBottom: 'var(--base)' }, children: [_jsx("label", { style: {
188
+ margin: '0 0 var(--base) 0'
189
+ },
190
+ children: "Register New Passkey"
191
+ }),
192
+ /*#__PURE__*/ _jsxs("form", {
193
+ onSubmit: handleRegister,
194
+ children: [
195
+ /*#__PURE__*/ _jsxs("div", {
196
+ style: {
197
+ marginBottom: 'var(--base)'
198
+ },
199
+ children: [
200
+ /*#__PURE__*/ _jsx("label", {
201
+ style: {
164
202
  display: 'block',
165
203
  color: 'var(--theme-text)',
166
204
  fontSize: 'var(--font-size-small)',
167
- marginBottom: 'calc(var(--base) * 0.25)',
168
- }, children: "Name (optional)" }), _jsx("input", { type: "text", value: passkeyName, onChange: (e) => setPasskeyName(e.target.value), placeholder: "e.g., MacBook Pro, iPhone", style: {
205
+ marginBottom: 'calc(var(--base) * 0.25)'
206
+ },
207
+ children: "Name (optional)"
208
+ }),
209
+ /*#__PURE__*/ _jsx("input", {
210
+ type: "text",
211
+ value: passkeyName,
212
+ onChange: (e)=>setPasskeyName(e.target.value),
213
+ placeholder: "e.g., MacBook Pro, iPhone",
214
+ style: {
169
215
  width: '100%',
170
216
  padding: 'calc(var(--base) * 0.5)',
171
217
  background: 'var(--theme-input-bg)',
172
218
  border: '1px solid var(--theme-elevation-150)',
173
219
  borderRadius: 'var(--style-radius-s)',
174
220
  color: 'var(--theme-text)',
175
- boxSizing: 'border-box',
176
- } }), _jsx("p", { style: {
221
+ boxSizing: 'border-box'
222
+ }
223
+ }),
224
+ /*#__PURE__*/ _jsx("p", {
225
+ style: {
177
226
  color: 'var(--theme-text)',
178
227
  opacity: 0.6,
179
228
  fontSize: 'var(--font-size-small)',
180
- margin: 'calc(var(--base) * 0.25) 0 0 0',
181
- }, children: "Your browser will prompt you to use your device's biometrics or security key." })] }), _jsxs("div", { style: { display: 'flex', gap: 'calc(var(--base) * 0.5)' }, children: [_jsx("button", { type: "submit", disabled: registering, style: {
229
+ margin: 'calc(var(--base) * 0.25) 0 0 0'
230
+ },
231
+ children: "Your browser will prompt you to use your device's biometrics or security key."
232
+ })
233
+ ]
234
+ }),
235
+ /*#__PURE__*/ _jsxs("div", {
236
+ style: {
237
+ display: 'flex',
238
+ gap: 'calc(var(--base) * 0.5)'
239
+ },
240
+ children: [
241
+ /*#__PURE__*/ _jsx("button", {
242
+ type: "submit",
243
+ disabled: registering,
244
+ style: {
182
245
  padding: 'calc(var(--base) * 0.5) calc(var(--base) * 1)',
183
246
  background: 'var(--theme-elevation-800)',
184
247
  border: 'none',
@@ -186,55 +249,115 @@ export function PasskeysManagementClient({ authClient: providedClient, title = '
186
249
  color: 'var(--theme-elevation-50)',
187
250
  fontSize: 'var(--font-size-small)',
188
251
  cursor: registering ? 'not-allowed' : 'pointer',
189
- opacity: registering ? 0.7 : 1,
190
- }, children: registering ? 'Registering...' : 'Register Passkey' }), _jsx("button", { type: "button", onClick: () => setShowRegisterForm(false), style: {
252
+ opacity: registering ? 0.7 : 1
253
+ },
254
+ children: registering ? 'Registering...' : 'Register Passkey'
255
+ }),
256
+ /*#__PURE__*/ _jsx("button", {
257
+ type: "button",
258
+ onClick: ()=>setShowRegisterForm(false),
259
+ style: {
191
260
  padding: 'calc(var(--base) * 0.5) calc(var(--base) * 1)',
192
261
  background: 'transparent',
193
262
  border: '1px solid var(--theme-elevation-200)',
194
263
  borderRadius: 'var(--style-radius-s)',
195
264
  color: 'var(--theme-text)',
196
265
  fontSize: 'var(--font-size-small)',
197
- cursor: 'pointer',
198
- }, children: "Cancel" })] })] })] })), loading ? (_jsx("div", { style: {
266
+ cursor: 'pointer'
267
+ },
268
+ children: "Cancel"
269
+ })
270
+ ]
271
+ })
272
+ ]
273
+ })
274
+ ]
275
+ }),
276
+ loading ? /*#__PURE__*/ _jsx("div", {
277
+ style: {
199
278
  color: 'var(--theme-text)',
200
279
  opacity: 0.7,
201
280
  textAlign: 'center',
202
- padding: 'calc(var(--base) * 3)',
203
- }, children: "Loading passkeys..." })) : passkeys.length === 0 ? (_jsx("div", { style: {
281
+ padding: 'calc(var(--base) * 3)'
282
+ },
283
+ children: "Loading passkeys..."
284
+ }) : passkeys.length === 0 ? /*#__PURE__*/ _jsx("div", {
285
+ style: {
204
286
  color: 'var(--theme-text)',
205
287
  opacity: 0.7,
206
288
  textAlign: 'center',
207
- padding: 'calc(var(--base) * 3)',
208
- }, children: "No passkeys registered. Add one to enable passwordless sign-in." })) : (_jsx("div", { style: {
289
+ padding: 'calc(var(--base) * 3)'
290
+ },
291
+ children: "No passkeys registered. Add one to enable passwordless sign-in."
292
+ }) : /*#__PURE__*/ _jsx("div", {
293
+ style: {
209
294
  background: 'var(--theme-elevation-50)',
210
295
  borderRadius: 'var(--style-radius-m)',
211
296
  overflow: 'hidden',
212
- border: '1px solid var(--theme-elevation-100)',
213
- }, children: passkeys.map((pk, index) => (_jsxs("div", { style: {
214
- display: 'flex',
215
- justifyContent: 'space-between',
216
- alignItems: 'center',
217
- padding: 'calc(var(--base) * 1)',
218
- borderBottom: index < passkeys.length - 1
219
- ? '1px solid var(--theme-elevation-100)'
220
- : 'none',
221
- }, children: [_jsxs("div", { children: [_jsx("div", { style: {
222
- color: 'var(--theme-text)',
223
- fontWeight: 500,
224
- marginBottom: 'calc(var(--base) * 0.25)',
225
- }, children: pk.name || 'Passkey' }), _jsxs("div", { style: {
226
- color: 'var(--theme-elevation-600)',
227
- fontSize: 'var(--font-size-small)',
228
- }, children: [_jsxs("span", { children: ["Created: ", formatDate(pk.createdAt)] }), pk.lastUsedAt && (_jsxs("span", { children: [" | Last used: ", formatDate(pk.lastUsedAt)] }))] })] }), _jsx("button", { onClick: () => handleDelete(pk.id), disabled: deleting === pk.id, style: {
229
- padding: 'calc(var(--base) * 0.5) calc(var(--base) * 0.75)',
230
- background: 'transparent',
231
- border: '1px solid var(--theme-error-300)',
232
- borderRadius: 'var(--style-radius-s)',
233
- color: 'var(--theme-error-500)',
234
- fontSize: 'var(--font-size-small)',
235
- cursor: deleting === pk.id ? 'not-allowed' : 'pointer',
236
- opacity: deleting === pk.id ? 0.7 : 1,
237
- }, children: deleting === pk.id ? 'Deleting...' : 'Delete' })] }, pk.id))) }))] }));
297
+ border: '1px solid var(--theme-elevation-100)'
298
+ },
299
+ children: passkeys.map((pk, index)=>/*#__PURE__*/ _jsxs("div", {
300
+ style: {
301
+ display: 'flex',
302
+ justifyContent: 'space-between',
303
+ alignItems: 'center',
304
+ padding: 'calc(var(--base) * 1)',
305
+ borderBottom: index < passkeys.length - 1 ? '1px solid var(--theme-elevation-100)' : 'none'
306
+ },
307
+ children: [
308
+ /*#__PURE__*/ _jsxs("div", {
309
+ children: [
310
+ /*#__PURE__*/ _jsx("div", {
311
+ style: {
312
+ color: 'var(--theme-text)',
313
+ fontWeight: 500,
314
+ marginBottom: 'calc(var(--base) * 0.25)'
315
+ },
316
+ children: pk.name || 'Passkey'
317
+ }),
318
+ /*#__PURE__*/ _jsxs("div", {
319
+ style: {
320
+ color: 'var(--theme-elevation-600)',
321
+ fontSize: 'var(--font-size-small)'
322
+ },
323
+ children: [
324
+ /*#__PURE__*/ _jsxs("span", {
325
+ children: [
326
+ "Created: ",
327
+ formatDate(pk.createdAt)
328
+ ]
329
+ }),
330
+ pk.lastUsedAt && /*#__PURE__*/ _jsxs("span", {
331
+ children: [
332
+ " | Last used: ",
333
+ formatDate(pk.lastUsedAt)
334
+ ]
335
+ })
336
+ ]
337
+ })
338
+ ]
339
+ }),
340
+ /*#__PURE__*/ _jsx("button", {
341
+ onClick: ()=>handleDelete(pk.id),
342
+ disabled: deleting === pk.id,
343
+ style: {
344
+ padding: 'calc(var(--base) * 0.5) calc(var(--base) * 0.75)',
345
+ background: 'transparent',
346
+ border: '1px solid var(--theme-error-300)',
347
+ borderRadius: 'var(--style-radius-s)',
348
+ color: 'var(--theme-error-500)',
349
+ fontSize: 'var(--font-size-small)',
350
+ cursor: deleting === pk.id ? 'not-allowed' : 'pointer',
351
+ opacity: deleting === pk.id ? 0.7 : 1
352
+ },
353
+ children: deleting === pk.id ? 'Deleting...' : 'Delete'
354
+ })
355
+ ]
356
+ }, pk.id))
357
+ })
358
+ ]
359
+ });
238
360
  }
239
361
  export default PasskeysManagementClient;
362
+
240
363
  //# sourceMappingURL=PasskeysManagementClient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PasskeysManagementClient.js","sourceRoot":"","sources":["../../../src/components/management/PasskeysManagementClient.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/management/PasskeysManagementClient.tsx"],"sourcesContent":["'use client'\n\nimport { useState, useEffect, type FormEvent } from 'react'\nimport {\n createPayloadAuthClient,\n type PayloadAuthClient,\n} from '../../exports/client.js'\n\ntype PasskeyItem = {\n id: string\n name?: string | null\n credentialID?: string\n createdAt: Date\n lastUsedAt?: Date | null\n}\n\nexport type PasskeysManagementClientProps = {\n /** Optional pre-configured auth client */\n authClient?: PayloadAuthClient\n /** Page title. Default: 'Passkeys' */\n title?: string\n}\n\n/**\n * Client component for passkey management.\n * Lists, registers, and deletes passkeys.\n */\nexport function PasskeysManagementClient({\n authClient: providedClient,\n title = 'Passkeys',\n}: PasskeysManagementClientProps = {}) {\n const [passkeys, setPasskeys] = useState<PasskeyItem[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [success, setSuccess] = useState<string | null>(null)\n const [registering, setRegistering] = useState(false)\n const [deleting, setDeleting] = useState<string | null>(null)\n const [showRegisterForm, setShowRegisterForm] = useState(false)\n const [passkeyName, setPasskeyName] = useState('')\n\n const getClient = () => providedClient ?? createPayloadAuthClient()\n\n useEffect(() => {\n fetchPasskeys()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n async function fetchPasskeys() {\n setLoading(true)\n setError(null)\n\n try {\n const client = getClient()\n const result = await client.passkey.listUserPasskeys()\n\n if (result.error) {\n setError(result.error.message ?? 'Failed to load passkeys')\n } else {\n setPasskeys((result.data as PasskeyItem[]) ?? [])\n }\n } catch {\n setError('Failed to load passkeys')\n } finally {\n setLoading(false)\n }\n }\n\n async function handleRegister(e: FormEvent) {\n e.preventDefault()\n setRegistering(true)\n setError(null)\n setSuccess(null)\n\n try {\n const client = getClient()\n const result = await client.passkey.addPasskey({\n name: passkeyName || undefined,\n })\n\n if (result.error) {\n setError(result.error.message ?? 'Failed to register passkey')\n } else {\n setSuccess('Passkey registered successfully!')\n setShowRegisterForm(false)\n setPasskeyName('')\n fetchPasskeys()\n }\n } catch (err) {\n if (err instanceof Error && err.name === 'NotAllowedError') {\n setError('Passkey registration was cancelled or not allowed')\n } else if (err instanceof Error && err.name === 'InvalidStateError') {\n setError('This passkey is already registered')\n } else {\n setError(err instanceof Error ? err.message : 'Failed to register passkey')\n }\n } finally {\n setRegistering(false)\n }\n }\n\n async function handleDelete(passkeyId: string) {\n if (!confirm('Are you sure you want to delete this passkey?')) {\n return\n }\n\n setDeleting(passkeyId)\n setError(null)\n setSuccess(null)\n\n try {\n const client = getClient()\n const result = await client.passkey.deletePasskey({ id: passkeyId })\n\n if (result.error) {\n setError(result.error.message ?? 'Failed to delete passkey')\n } else {\n setPasskeys((prev) => prev.filter((p) => p.id !== passkeyId))\n setSuccess('Passkey deleted successfully')\n }\n } catch {\n setError('Failed to delete passkey')\n } finally {\n setDeleting(null)\n }\n }\n\n function formatDate(date?: Date | string | null) {\n if (!date) return 'Never'\n const d = date instanceof Date ? date : new Date(date)\n return d.toLocaleString()\n }\n\n return (\n <div\n style={{\n maxWidth: '900px',\n margin: '0 auto',\n padding: 'calc(var(--base) * 2)',\n }}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 'calc(var(--base) * 2)',\n }}\n >\n <div>\n <h1\n style={{\n color: 'var(--theme-text)',\n fontSize: 'var(--font-size-h2)',\n fontWeight: 600,\n margin: 0,\n }}\n >\n {title}\n </h1>\n <p\n style={{\n color: 'var(--theme-text)',\n opacity: 0.7,\n fontSize: 'var(--font-size-small)',\n margin: 'calc(var(--base) * 0.5) 0 0 0',\n }}\n >\n Passkeys provide secure, passwordless sign-in using your device's\n biometrics or security keys.\n </p>\n </div>\n\n <button\n onClick={() => setShowRegisterForm(true)}\n style={{\n padding: 'calc(var(--base) * 0.5) calc(var(--base) * 1)',\n background: 'var(--theme-elevation-800)',\n border: 'none',\n borderRadius: 'var(--style-radius-s)',\n color: 'var(--theme-elevation-50)',\n fontSize: 'var(--font-size-small)',\n cursor: 'pointer',\n }}\n >\n Add Passkey\n </button>\n </div>\n\n {error && (\n <div\n style={{\n color: 'var(--theme-error-500)',\n marginBottom: 'var(--base)',\n fontSize: 'var(--font-size-small)',\n padding: 'calc(var(--base) * 0.75)',\n background: 'var(--theme-error-50)',\n borderRadius: 'var(--style-radius-s)',\n border: '1px solid var(--theme-error-200)',\n }}\n >\n {error}\n </div>\n )}\n\n {success && (\n <div\n style={{\n color: 'var(--theme-success-700)',\n marginBottom: 'var(--base)',\n fontSize: 'var(--font-size-small)',\n padding: 'calc(var(--base) * 0.75)',\n background: 'var(--theme-success-50)',\n borderRadius: 'var(--style-radius-s)',\n border: '1px solid var(--theme-success-200)',\n }}\n >\n {success}\n </div>\n )}\n\n {showRegisterForm && (\n <div\n style={{\n marginBottom: 'calc(var(--base) * 1.5)',\n padding: 'calc(var(--base) * 1.5)',\n background: 'var(--theme-elevation-50)',\n borderRadius: 'var(--style-radius-m)',\n border: '1px solid var(--theme-elevation-100)',\n }}\n >\n <h2\n style={{\n color: 'var(--theme-text)',\n fontSize: 'var(--font-size-h4)',\n fontWeight: 500,\n margin: '0 0 var(--base) 0',\n }}\n >\n Register New Passkey\n </h2>\n <form onSubmit={handleRegister}>\n <div style={{ marginBottom: 'var(--base)' }}>\n <label\n style={{\n display: 'block',\n color: 'var(--theme-text)',\n fontSize: 'var(--font-size-small)',\n marginBottom: 'calc(var(--base) * 0.25)',\n }}\n >\n Name (optional)\n </label>\n <input\n type=\"text\"\n value={passkeyName}\n onChange={(e) => setPasskeyName(e.target.value)}\n placeholder=\"e.g., MacBook Pro, iPhone\"\n style={{\n width: '100%',\n padding: 'calc(var(--base) * 0.5)',\n background: 'var(--theme-input-bg)',\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: 'var(--style-radius-s)',\n color: 'var(--theme-text)',\n boxSizing: 'border-box',\n }}\n />\n <p\n style={{\n color: 'var(--theme-text)',\n opacity: 0.6,\n fontSize: 'var(--font-size-small)',\n margin: 'calc(var(--base) * 0.25) 0 0 0',\n }}\n >\n Your browser will prompt you to use your device's biometrics or\n security key.\n </p>\n </div>\n <div style={{ display: 'flex', gap: 'calc(var(--base) * 0.5)' }}>\n <button\n type=\"submit\"\n disabled={registering}\n style={{\n padding: 'calc(var(--base) * 0.5) calc(var(--base) * 1)',\n background: 'var(--theme-elevation-800)',\n border: 'none',\n borderRadius: 'var(--style-radius-s)',\n color: 'var(--theme-elevation-50)',\n fontSize: 'var(--font-size-small)',\n cursor: registering ? 'not-allowed' : 'pointer',\n opacity: registering ? 0.7 : 1,\n }}\n >\n {registering ? 'Registering...' : 'Register Passkey'}\n </button>\n <button\n type=\"button\"\n onClick={() => setShowRegisterForm(false)}\n style={{\n padding: 'calc(var(--base) * 0.5) calc(var(--base) * 1)',\n background: 'transparent',\n border: '1px solid var(--theme-elevation-200)',\n borderRadius: 'var(--style-radius-s)',\n color: 'var(--theme-text)',\n fontSize: 'var(--font-size-small)',\n cursor: 'pointer',\n }}\n >\n Cancel\n </button>\n </div>\n </form>\n </div>\n )}\n\n {loading ? (\n <div\n style={{\n color: 'var(--theme-text)',\n opacity: 0.7,\n textAlign: 'center',\n padding: 'calc(var(--base) * 3)',\n }}\n >\n Loading passkeys...\n </div>\n ) : passkeys.length === 0 ? (\n <div\n style={{\n color: 'var(--theme-text)',\n opacity: 0.7,\n textAlign: 'center',\n padding: 'calc(var(--base) * 3)',\n }}\n >\n No passkeys registered. Add one to enable passwordless sign-in.\n </div>\n ) : (\n <div\n style={{\n background: 'var(--theme-elevation-50)',\n borderRadius: 'var(--style-radius-m)',\n overflow: 'hidden',\n border: '1px solid var(--theme-elevation-100)',\n }}\n >\n {passkeys.map((pk, index) => (\n <div\n key={pk.id}\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: 'calc(var(--base) * 1)',\n borderBottom:\n index < passkeys.length - 1\n ? '1px solid var(--theme-elevation-100)'\n : 'none',\n }}\n >\n <div>\n <div\n style={{\n color: 'var(--theme-text)',\n fontWeight: 500,\n marginBottom: 'calc(var(--base) * 0.25)',\n }}\n >\n {pk.name || 'Passkey'}\n </div>\n <div\n style={{\n color: 'var(--theme-elevation-600)',\n fontSize: 'var(--font-size-small)',\n }}\n >\n <span>Created: {formatDate(pk.createdAt)}</span>\n {pk.lastUsedAt && (\n <span> | Last used: {formatDate(pk.lastUsedAt)}</span>\n )}\n </div>\n </div>\n\n <button\n onClick={() => handleDelete(pk.id)}\n disabled={deleting === pk.id}\n style={{\n padding: 'calc(var(--base) * 0.5) calc(var(--base) * 0.75)',\n background: 'transparent',\n border: '1px solid var(--theme-error-300)',\n borderRadius: 'var(--style-radius-s)',\n color: 'var(--theme-error-500)',\n fontSize: 'var(--font-size-small)',\n cursor: deleting === pk.id ? 'not-allowed' : 'pointer',\n opacity: deleting === pk.id ? 0.7 : 1,\n }}\n >\n {deleting === pk.id ? 'Deleting...' : 'Delete'}\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport default PasskeysManagementClient\n"],"names":["useState","useEffect","createPayloadAuthClient","PasskeysManagementClient","authClient","providedClient","title","passkeys","setPasskeys","loading","setLoading","error","setError","success","setSuccess","registering","setRegistering","deleting","setDeleting","showRegisterForm","setShowRegisterForm","passkeyName","setPasskeyName","getClient","fetchPasskeys","client","result","passkey","listUserPasskeys","message","data","handleRegister","e","preventDefault","addPasskey","name","undefined","err","Error","handleDelete","passkeyId","confirm","deletePasskey","id","prev","filter","p","formatDate","date","d","Date","toLocaleString","div","style","maxWidth","margin","padding","display","justifyContent","alignItems","marginBottom","h1","color","fontSize","fontWeight","opacity","button","onClick","background","border","borderRadius","cursor","h2","form","onSubmit","label","input","type","value","onChange","target","placeholder","width","boxSizing","gap","disabled","textAlign","length","overflow","map","pk","index","borderBottom","span","createdAt","lastUsedAt"],"mappings":"AAAA;;AAEA,SAASA,QAAQ,EAAEC,SAAS,QAAwB,QAAO;AAC3D,SACEC,uBAAuB,QAElB,0BAAyB;AAiBhC;;;CAGC,GACD,OAAO,SAASC,yBAAyB,EACvCC,YAAYC,cAAc,EAC1BC,QAAQ,UAAU,EACY,GAAG,CAAC,CAAC;IACnC,MAAM,CAACC,UAAUC,YAAY,GAAGR,SAAwB,EAAE;IAC1D,MAAM,CAACS,SAASC,WAAW,GAAGV,SAAS;IACvC,MAAM,CAACW,OAAOC,SAAS,GAAGZ,SAAwB;IAClD,MAAM,CAACa,SAASC,WAAW,GAAGd,SAAwB;IACtD,MAAM,CAACe,aAAaC,eAAe,GAAGhB,SAAS;IAC/C,MAAM,CAACiB,UAAUC,YAAY,GAAGlB,SAAwB;IACxD,MAAM,CAACmB,kBAAkBC,oBAAoB,GAAGpB,SAAS;IACzD,MAAM,CAACqB,aAAaC,eAAe,GAAGtB,SAAS;IAE/C,MAAMuB,YAAY,IAAMlB,kBAAkBH;IAE1CD,UAAU;QACRuB;IACA,uDAAuD;IACzD,GAAG,EAAE;IAEL,eAAeA;QACbd,WAAW;QACXE,SAAS;QAET,IAAI;YACF,MAAMa,SAASF;YACf,MAAMG,SAAS,MAAMD,OAAOE,OAAO,CAACC,gBAAgB;YAEpD,IAAIF,OAAOf,KAAK,EAAE;gBAChBC,SAASc,OAAOf,KAAK,CAACkB,OAAO,IAAI;YACnC,OAAO;gBACLrB,YAAY,AAACkB,OAAOI,IAAI,IAAsB,EAAE;YAClD;QACF,EAAE,OAAM;YACNlB,SAAS;QACX,SAAU;YACRF,WAAW;QACb;IACF;IAEA,eAAeqB,eAAeC,CAAY;QACxCA,EAAEC,cAAc;QAChBjB,eAAe;QACfJ,SAAS;QACTE,WAAW;QAEX,IAAI;YACF,MAAMW,SAASF;YACf,MAAMG,SAAS,MAAMD,OAAOE,OAAO,CAACO,UAAU,CAAC;gBAC7CC,MAAMd,eAAee;YACvB;YAEA,IAAIV,OAAOf,KAAK,EAAE;gBAChBC,SAASc,OAAOf,KAAK,CAACkB,OAAO,IAAI;YACnC,OAAO;gBACLf,WAAW;gBACXM,oBAAoB;gBACpBE,eAAe;gBACfE;YACF;QACF,EAAE,OAAOa,KAAK;YACZ,IAAIA,eAAeC,SAASD,IAAIF,IAAI,KAAK,mBAAmB;gBAC1DvB,SAAS;YACX,OAAO,IAAIyB,eAAeC,SAASD,IAAIF,IAAI,KAAK,qBAAqB;gBACnEvB,SAAS;YACX,OAAO;gBACLA,SAASyB,eAAeC,QAAQD,IAAIR,OAAO,GAAG;YAChD;QACF,SAAU;YACRb,eAAe;QACjB;IACF;IAEA,eAAeuB,aAAaC,SAAiB;QAC3C,IAAI,CAACC,QAAQ,kDAAkD;YAC7D;QACF;QAEAvB,YAAYsB;QACZ5B,SAAS;QACTE,WAAW;QAEX,IAAI;YACF,MAAMW,SAASF;YACf,MAAMG,SAAS,MAAMD,OAAOE,OAAO,CAACe,aAAa,CAAC;gBAAEC,IAAIH;YAAU;YAElE,IAAId,OAAOf,KAAK,EAAE;gBAChBC,SAASc,OAAOf,KAAK,CAACkB,OAAO,IAAI;YACnC,OAAO;gBACLrB,YAAY,CAACoC,OAASA,KAAKC,MAAM,CAAC,CAACC,IAAMA,EAAEH,EAAE,KAAKH;gBAClD1B,WAAW;YACb;QACF,EAAE,OAAM;YACNF,SAAS;QACX,SAAU;YACRM,YAAY;QACd;IACF;IAEA,SAAS6B,WAAWC,IAA2B;QAC7C,IAAI,CAACA,MAAM,OAAO;QAClB,MAAMC,IAAID,gBAAgBE,OAAOF,OAAO,IAAIE,KAAKF;QACjD,OAAOC,EAAEE,cAAc;IACzB;IAEA,qBACE,MAACC;QACCC,OAAO;YACLC,UAAU;YACVC,QAAQ;YACRC,SAAS;QACX;;0BAEA,MAACJ;gBACCC,OAAO;oBACLI,SAAS;oBACTC,gBAAgB;oBAChBC,YAAY;oBACZC,cAAc;gBAChB;;kCAEA,MAACR;;0CACC,KAACS;gCACCR,OAAO;oCACLS,OAAO;oCACPC,UAAU;oCACVC,YAAY;oCACZT,QAAQ;gCACV;0CAECjD;;0CAEH,KAACwC;gCACCO,OAAO;oCACLS,OAAO;oCACPG,SAAS;oCACTF,UAAU;oCACVR,QAAQ;gCACV;0CACD;;;;kCAMH,KAACW;wBACCC,SAAS,IAAM/C,oBAAoB;wBACnCiC,OAAO;4BACLG,SAAS;4BACTY,YAAY;4BACZC,QAAQ;4BACRC,cAAc;4BACdR,OAAO;4BACPC,UAAU;4BACVQ,QAAQ;wBACV;kCACD;;;;YAKF5D,uBACC,KAACyC;gBACCC,OAAO;oBACLS,OAAO;oBACPF,cAAc;oBACdG,UAAU;oBACVP,SAAS;oBACTY,YAAY;oBACZE,cAAc;oBACdD,QAAQ;gBACV;0BAEC1D;;YAIJE,yBACC,KAACuC;gBACCC,OAAO;oBACLS,OAAO;oBACPF,cAAc;oBACdG,UAAU;oBACVP,SAAS;oBACTY,YAAY;oBACZE,cAAc;oBACdD,QAAQ;gBACV;0BAECxD;;YAIJM,kCACC,MAACiC;gBACCC,OAAO;oBACLO,cAAc;oBACdJ,SAAS;oBACTY,YAAY;oBACZE,cAAc;oBACdD,QAAQ;gBACV;;kCAEA,KAACG;wBACCnB,OAAO;4BACLS,OAAO;4BACPC,UAAU;4BACVC,YAAY;4BACZT,QAAQ;wBACV;kCACD;;kCAGD,MAACkB;wBAAKC,UAAU3C;;0CACd,MAACqB;gCAAIC,OAAO;oCAAEO,cAAc;gCAAc;;kDACxC,KAACe;wCACCtB,OAAO;4CACLI,SAAS;4CACTK,OAAO;4CACPC,UAAU;4CACVH,cAAc;wCAChB;kDACD;;kDAGD,KAACgB;wCACCC,MAAK;wCACLC,OAAOzD;wCACP0D,UAAU,CAAC/C,IAAMV,eAAeU,EAAEgD,MAAM,CAACF,KAAK;wCAC9CG,aAAY;wCACZ5B,OAAO;4CACL6B,OAAO;4CACP1B,SAAS;4CACTY,YAAY;4CACZC,QAAQ;4CACRC,cAAc;4CACdR,OAAO;4CACPqB,WAAW;wCACb;;kDAEF,KAACrC;wCACCO,OAAO;4CACLS,OAAO;4CACPG,SAAS;4CACTF,UAAU;4CACVR,QAAQ;wCACV;kDACD;;;;0CAKH,MAACH;gCAAIC,OAAO;oCAAEI,SAAS;oCAAQ2B,KAAK;gCAA0B;;kDAC5D,KAAClB;wCACCW,MAAK;wCACLQ,UAAUtE;wCACVsC,OAAO;4CACLG,SAAS;4CACTY,YAAY;4CACZC,QAAQ;4CACRC,cAAc;4CACdR,OAAO;4CACPC,UAAU;4CACVQ,QAAQxD,cAAc,gBAAgB;4CACtCkD,SAASlD,cAAc,MAAM;wCAC/B;kDAECA,cAAc,mBAAmB;;kDAEpC,KAACmD;wCACCW,MAAK;wCACLV,SAAS,IAAM/C,oBAAoB;wCACnCiC,OAAO;4CACLG,SAAS;4CACTY,YAAY;4CACZC,QAAQ;4CACRC,cAAc;4CACdR,OAAO;4CACPC,UAAU;4CACVQ,QAAQ;wCACV;kDACD;;;;;;;;YAQR9D,wBACC,KAAC2C;gBACCC,OAAO;oBACLS,OAAO;oBACPG,SAAS;oBACTqB,WAAW;oBACX9B,SAAS;gBACX;0BACD;iBAGCjD,SAASgF,MAAM,KAAK,kBACtB,KAACnC;gBACCC,OAAO;oBACLS,OAAO;oBACPG,SAAS;oBACTqB,WAAW;oBACX9B,SAAS;gBACX;0BACD;+BAID,KAACJ;gBACCC,OAAO;oBACLe,YAAY;oBACZE,cAAc;oBACdkB,UAAU;oBACVnB,QAAQ;gBACV;0BAEC9D,SAASkF,GAAG,CAAC,CAACC,IAAIC,sBACjB,MAACvC;wBAECC,OAAO;4BACLI,SAAS;4BACTC,gBAAgB;4BAChBC,YAAY;4BACZH,SAAS;4BACToC,cACED,QAAQpF,SAASgF,MAAM,GAAG,IACtB,yCACA;wBACR;;0CAEA,MAACnC;;kDACC,KAACA;wCACCC,OAAO;4CACLS,OAAO;4CACPE,YAAY;4CACZJ,cAAc;wCAChB;kDAEC8B,GAAGvD,IAAI,IAAI;;kDAEd,MAACiB;wCACCC,OAAO;4CACLS,OAAO;4CACPC,UAAU;wCACZ;;0DAEA,MAAC8B;;oDAAK;oDAAU9C,WAAW2C,GAAGI,SAAS;;;4CACtCJ,GAAGK,UAAU,kBACZ,MAACF;;oDAAK;oDAAe9C,WAAW2C,GAAGK,UAAU;;;;;;;0CAKnD,KAAC7B;gCACCC,SAAS,IAAM5B,aAAamD,GAAG/C,EAAE;gCACjC0C,UAAUpE,aAAayE,GAAG/C,EAAE;gCAC5BU,OAAO;oCACLG,SAAS;oCACTY,YAAY;oCACZC,QAAQ;oCACRC,cAAc;oCACdR,OAAO;oCACPC,UAAU;oCACVQ,QAAQtD,aAAayE,GAAG/C,EAAE,GAAG,gBAAgB;oCAC7CsB,SAAShD,aAAayE,GAAG/C,EAAE,GAAG,MAAM;gCACtC;0CAEC1B,aAAayE,GAAG/C,EAAE,GAAG,gBAAgB;;;uBAjDnC+C,GAAG/C,EAAE;;;;AAyDxB;AAEA,eAAexC,yBAAwB"}
@@ -15,6 +15,6 @@ export type SecurityNavLinksProps = {
15
15
  *
16
16
  * Links are conditionally shown based on which Better Auth plugins are enabled.
17
17
  */
18
- export declare function SecurityNavLinks({ basePath, showTwoFactor, showApiKeys, showPasskeys, }?: SecurityNavLinksProps): import("react/jsx-runtime").JSX.Element | null;
18
+ export declare function SecurityNavLinks({ basePath, showTwoFactor, showApiKeys, showPasskeys, }?: SecurityNavLinksProps): import("react").JSX.Element | null;
19
19
  export default SecurityNavLinks;
20
20
  //# sourceMappingURL=SecurityNavLinks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SecurityNavLinks.d.ts","sourceRoot":"","sources":["../../../src/components/management/SecurityNavLinks.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,qBAAqB,GAAG;IAClC,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,+CAA+C;IAC/C,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,wCAAwC;IACxC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,wCAAwC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AAQD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,QAA4B,EAC5B,aAAoB,EACpB,WAAkB,EAClB,YAAmB,GACpB,GAAE,qBAA0B,kDAmF5B;AAED,eAAe,gBAAgB,CAAA"}
1
+ {"version":3,"file":"SecurityNavLinks.d.ts","sourceRoot":"","sources":["../../../src/components/management/SecurityNavLinks.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,qBAAqB,GAAG;IAClC,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,+CAA+C;IAC/C,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,wCAAwC;IACxC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,wCAAwC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AAQD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,QAA4B,EAC5B,aAAoB,EACpB,WAAkB,EAClB,YAAmB,GACpB,GAAE,qBAA0B,sCAmF5B;AAED,eAAe,gBAAgB,CAAA"}