@delmaredigital/payload-better-auth 0.3.6 → 0.3.8

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 (164) hide show
  1. package/README.md +60 -12
  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.d.ts +2356 -2
  84. package/dist/exports/client.d.ts.map +1 -1
  85. package/dist/exports/client.js +48 -8
  86. package/dist/exports/client.js.map +1 -1
  87. package/dist/exports/components.js +2 -2
  88. package/dist/exports/components.js.map +1 -1
  89. package/dist/exports/management.js +3 -3
  90. package/dist/exports/management.js.map +1 -1
  91. package/dist/exports/rsc.js +2 -2
  92. package/dist/exports/rsc.js.map +1 -1
  93. package/dist/generated-types.js +4 -2
  94. package/dist/generated-types.js.map +1 -1
  95. package/dist/index.js +6 -6
  96. package/dist/index.js.map +1 -1
  97. package/dist/plugin/index.d.ts +35 -2
  98. package/dist/plugin/index.d.ts.map +1 -1
  99. package/dist/plugin/index.js +198 -162
  100. package/dist/plugin/index.js.map +1 -1
  101. package/dist/scripts/generate-types.js +66 -50
  102. package/dist/scripts/generate-types.js.map +1 -1
  103. package/dist/types/apiKey.js +7 -2
  104. package/dist/types/apiKey.js.map +1 -1
  105. package/dist/types/betterAuth.js +23 -2
  106. package/dist/types/betterAuth.js.map +1 -1
  107. package/dist/utils/access.js +78 -81
  108. package/dist/utils/access.js.map +1 -1
  109. package/dist/utils/apiKeyAccess.js +65 -72
  110. package/dist/utils/apiKeyAccess.js.map +1 -1
  111. package/dist/utils/betterAuthDefaults.js +8 -8
  112. package/dist/utils/betterAuthDefaults.js.map +1 -1
  113. package/dist/utils/detectAuthConfig.js +8 -11
  114. package/dist/utils/detectAuthConfig.js.map +1 -1
  115. package/dist/utils/detectEnabledPlugins.js +6 -7
  116. package/dist/utils/detectEnabledPlugins.js.map +1 -1
  117. package/dist/utils/firstUserAdmin.js +18 -20
  118. package/dist/utils/firstUserAdmin.js.map +1 -1
  119. package/dist/utils/generateScopes.js +40 -41
  120. package/dist/utils/generateScopes.js.map +1 -1
  121. package/dist/utils/session.js +8 -9
  122. package/dist/utils/session.js.map +1 -1
  123. package/package.json +97 -26
  124. package/src/adapter/collections.ts +621 -0
  125. package/src/adapter/index.ts +712 -0
  126. package/src/components/BeforeLogin.tsx +39 -0
  127. package/src/components/LoginView.tsx +1516 -0
  128. package/src/components/LoginViewWrapper.tsx +35 -0
  129. package/src/components/LogoutButton.tsx +58 -0
  130. package/src/components/PasskeyRegisterButton.tsx +105 -0
  131. package/src/components/PasskeySignInButton.tsx +96 -0
  132. package/src/components/auth/ForgotPasswordView.tsx +274 -0
  133. package/src/components/auth/ResetPasswordView.tsx +331 -0
  134. package/src/components/auth/index.ts +8 -0
  135. package/src/components/management/ApiKeysManagementClient.tsx +988 -0
  136. package/src/components/management/PasskeysManagementClient.tsx +409 -0
  137. package/src/components/management/SecurityNavLinks.tsx +117 -0
  138. package/src/components/management/TwoFactorManagementClient.tsx +560 -0
  139. package/src/components/management/index.ts +20 -0
  140. package/src/components/management/views/ApiKeysView.tsx +57 -0
  141. package/src/components/management/views/PasskeysView.tsx +42 -0
  142. package/src/components/management/views/TwoFactorView.tsx +42 -0
  143. package/src/components/management/views/index.ts +10 -0
  144. package/src/components/twoFactor/TwoFactorSetupView.tsx +515 -0
  145. package/src/components/twoFactor/TwoFactorVerifyView.tsx +238 -0
  146. package/src/components/twoFactor/index.ts +8 -0
  147. package/src/exports/client.ts +77 -0
  148. package/src/exports/components.ts +30 -0
  149. package/src/exports/management.ts +25 -0
  150. package/src/exports/rsc.ts +11 -0
  151. package/src/generated-types.ts +269 -0
  152. package/src/index.ts +135 -0
  153. package/src/plugin/index.ts +834 -0
  154. package/src/scripts/generate-types.ts +269 -0
  155. package/src/types/apiKey.ts +63 -0
  156. package/src/types/betterAuth.ts +253 -0
  157. package/src/utils/access.ts +410 -0
  158. package/src/utils/apiKeyAccess.ts +443 -0
  159. package/src/utils/betterAuthDefaults.ts +102 -0
  160. package/src/utils/detectAuthConfig.ts +47 -0
  161. package/src/utils/detectEnabledPlugins.ts +69 -0
  162. package/src/utils/firstUserAdmin.ts +164 -0
  163. package/src/utils/generateScopes.ts +150 -0
  164. package/src/utils/session.ts +91 -0
@@ -6,8 +6,7 @@ import { useRouter } from 'next/navigation.js';
6
6
  * Two-factor authentication verification component.
7
7
  * Used during login flow when 2FA is enabled on the account.
8
8
  * Uses Better Auth's twoFactor plugin endpoints.
9
- */
10
- export function TwoFactorVerifyView({ logo, title = 'Two-Factor Authentication', afterVerifyPath = '/admin', onVerifyComplete, }) {
9
+ */ export function TwoFactorVerifyView({ logo, title = 'Two-Factor Authentication', afterVerifyPath = '/admin', onVerifyComplete }) {
11
10
  const router = useRouter();
12
11
  const [code, setCode] = useState('');
13
12
  const [error, setError] = useState(null);
@@ -18,77 +17,113 @@ export function TwoFactorVerifyView({ logo, title = 'Two-Factor Authentication',
18
17
  setLoading(true);
19
18
  setError(null);
20
19
  try {
21
- const endpoint = useBackupCode
22
- ? '/api/auth/two-factor/verify-backup-code'
23
- : '/api/auth/two-factor/verify-totp';
20
+ const endpoint = useBackupCode ? '/api/auth/two-factor/verify-backup-code' : '/api/auth/two-factor/verify-totp';
24
21
  const response = await fetch(endpoint, {
25
22
  method: 'POST',
26
- headers: { 'Content-Type': 'application/json' },
23
+ headers: {
24
+ 'Content-Type': 'application/json'
25
+ },
27
26
  credentials: 'include',
28
- body: JSON.stringify({ code }),
27
+ body: JSON.stringify({
28
+ code
29
+ })
29
30
  });
30
31
  if (response.ok) {
31
32
  onVerifyComplete?.();
32
33
  router.push(afterVerifyPath);
33
34
  router.refresh();
34
- }
35
- else {
36
- const data = await response.json().catch(() => ({}));
35
+ } else {
36
+ const data = await response.json().catch(()=>({}));
37
37
  setError(data.message || 'Invalid code. Please try again.');
38
38
  }
39
- }
40
- catch {
39
+ } catch {
41
40
  setError('An error occurred. Please try again.');
42
- }
43
- finally {
41
+ } finally{
44
42
  setLoading(false);
45
43
  }
46
44
  }
47
- return (_jsx("div", { style: {
45
+ return /*#__PURE__*/ _jsx("div", {
46
+ style: {
48
47
  minHeight: '100vh',
49
48
  display: 'flex',
50
49
  alignItems: 'center',
51
50
  justifyContent: 'center',
52
51
  background: 'var(--theme-bg)',
53
- padding: 'var(--base)',
54
- }, children: _jsxs("div", { style: {
52
+ padding: 'var(--base)'
53
+ },
54
+ children: /*#__PURE__*/ _jsxs("div", {
55
+ style: {
55
56
  background: 'var(--theme-elevation-50)',
56
57
  padding: 'calc(var(--base) * 2)',
57
58
  borderRadius: 'var(--style-radius-m)',
58
59
  boxShadow: '0 2px 20px rgba(0, 0, 0, 0.1)',
59
60
  width: '100%',
60
- maxWidth: '400px',
61
- }, children: [logo && (_jsx("div", { style: {
61
+ maxWidth: '400px'
62
+ },
63
+ children: [
64
+ logo && /*#__PURE__*/ _jsx("div", {
65
+ style: {
62
66
  textAlign: 'center',
63
- marginBottom: 'calc(var(--base) * 1.5)',
64
- }, children: logo })), _jsx("h1", { style: {
67
+ marginBottom: 'calc(var(--base) * 1.5)'
68
+ },
69
+ children: logo
70
+ }),
71
+ /*#__PURE__*/ _jsx("h1", {
72
+ style: {
65
73
  color: 'var(--theme-text)',
66
74
  fontSize: 'var(--font-size-h3)',
67
75
  fontWeight: 600,
68
76
  margin: '0 0 calc(var(--base) * 0.5) 0',
69
- textAlign: 'center',
70
- }, children: title }), _jsx("p", { style: {
77
+ textAlign: 'center'
78
+ },
79
+ children: title
80
+ }),
81
+ /*#__PURE__*/ _jsx("p", {
82
+ style: {
71
83
  color: 'var(--theme-text)',
72
84
  opacity: 0.7,
73
85
  fontSize: 'var(--font-size-small)',
74
86
  textAlign: 'center',
75
- marginBottom: 'calc(var(--base) * 1.5)',
76
- }, children: useBackupCode
77
- ? 'Enter one of your backup codes.'
78
- : 'Enter the code from your authenticator app.' }), _jsxs("form", { onSubmit: handleSubmit, children: [_jsxs("div", { style: { marginBottom: 'calc(var(--base) * 1.5)' }, children: [_jsx("label", { htmlFor: "code", style: {
87
+ marginBottom: 'calc(var(--base) * 1.5)'
88
+ },
89
+ children: useBackupCode ? 'Enter one of your backup codes.' : 'Enter the code from your authenticator app.'
90
+ }),
91
+ /*#__PURE__*/ _jsxs("form", {
92
+ onSubmit: handleSubmit,
93
+ children: [
94
+ /*#__PURE__*/ _jsxs("div", {
95
+ style: {
96
+ marginBottom: 'calc(var(--base) * 1.5)'
97
+ },
98
+ children: [
99
+ /*#__PURE__*/ _jsx("label", {
100
+ htmlFor: "code",
101
+ style: {
79
102
  display: 'block',
80
103
  color: 'var(--theme-text)',
81
104
  marginBottom: 'calc(var(--base) * 0.5)',
82
105
  fontSize: 'var(--font-size-small)',
83
- fontWeight: 500,
84
- }, children: useBackupCode ? 'Backup Code' : 'Verification Code' }), _jsx("input", { id: "code", type: "text", inputMode: useBackupCode ? 'text' : 'numeric', pattern: useBackupCode ? undefined : '[0-9]*', autoComplete: "one-time-code", value: code, onChange: (e) => {
106
+ fontWeight: 500
107
+ },
108
+ children: useBackupCode ? 'Backup Code' : 'Verification Code'
109
+ }),
110
+ /*#__PURE__*/ _jsx("input", {
111
+ id: "code",
112
+ type: "text",
113
+ inputMode: useBackupCode ? 'text' : 'numeric',
114
+ pattern: useBackupCode ? undefined : '[0-9]*',
115
+ autoComplete: "one-time-code",
116
+ value: code,
117
+ onChange: (e)=>{
85
118
  if (useBackupCode) {
86
119
  setCode(e.target.value);
87
- }
88
- else {
120
+ } else {
89
121
  setCode(e.target.value.replace(/\D/g, '').slice(0, 6));
90
122
  }
91
- }, required: true, placeholder: useBackupCode ? 'xxxxxxxx' : '000000', style: {
123
+ },
124
+ required: true,
125
+ placeholder: useBackupCode ? 'xxxxxxxx' : '000000',
126
+ style: {
92
127
  width: '100%',
93
128
  padding: 'calc(var(--base) * 0.75)',
94
129
  background: 'var(--theme-input-bg)',
@@ -100,16 +135,27 @@ export function TwoFactorVerifyView({ logo, title = 'Two-Factor Authentication',
100
135
  textAlign: 'center',
101
136
  letterSpacing: useBackupCode ? '0.2em' : '0.5em',
102
137
  outline: 'none',
103
- boxSizing: 'border-box',
104
- } })] }), error && (_jsx("div", { style: {
138
+ boxSizing: 'border-box'
139
+ }
140
+ })
141
+ ]
142
+ }),
143
+ error && /*#__PURE__*/ _jsx("div", {
144
+ style: {
105
145
  color: 'var(--theme-error-500)',
106
146
  marginBottom: 'var(--base)',
107
147
  fontSize: 'var(--font-size-small)',
108
148
  padding: 'calc(var(--base) * 0.5)',
109
149
  background: 'var(--theme-error-50)',
110
150
  borderRadius: 'var(--style-radius-s)',
111
- border: '1px solid var(--theme-error-200)',
112
- }, children: error })), _jsx("button", { type: "submit", disabled: loading || (!useBackupCode && code.length !== 6), style: {
151
+ border: '1px solid var(--theme-error-200)'
152
+ },
153
+ children: error
154
+ }),
155
+ /*#__PURE__*/ _jsx("button", {
156
+ type: "submit",
157
+ disabled: loading || !useBackupCode && code.length !== 6,
158
+ style: {
113
159
  width: '100%',
114
160
  padding: 'calc(var(--base) * 0.75)',
115
161
  background: 'var(--theme-elevation-800)',
@@ -118,15 +164,25 @@ export function TwoFactorVerifyView({ logo, title = 'Two-Factor Authentication',
118
164
  color: 'var(--theme-elevation-50)',
119
165
  fontSize: 'var(--font-size-base)',
120
166
  fontWeight: 500,
121
- cursor: loading || (!useBackupCode && code.length !== 6) ? 'not-allowed' : 'pointer',
122
- opacity: loading || (!useBackupCode && code.length !== 6) ? 0.7 : 1,
167
+ cursor: loading || !useBackupCode && code.length !== 6 ? 'not-allowed' : 'pointer',
168
+ opacity: loading || !useBackupCode && code.length !== 6 ? 0.7 : 1,
123
169
  transition: 'opacity 150ms ease',
124
- marginBottom: 'var(--base)',
125
- }, children: loading ? 'Verifying...' : 'Verify' }), _jsx("div", { style: { textAlign: 'center' }, children: _jsx("button", { type: "button", onClick: () => {
170
+ marginBottom: 'var(--base)'
171
+ },
172
+ children: loading ? 'Verifying...' : 'Verify'
173
+ }),
174
+ /*#__PURE__*/ _jsx("div", {
175
+ style: {
176
+ textAlign: 'center'
177
+ },
178
+ children: /*#__PURE__*/ _jsx("button", {
179
+ type: "button",
180
+ onClick: ()=>{
126
181
  setUseBackupCode(!useBackupCode);
127
182
  setCode('');
128
183
  setError(null);
129
- }, style: {
184
+ },
185
+ style: {
130
186
  background: 'none',
131
187
  border: 'none',
132
188
  color: 'var(--theme-text)',
@@ -134,10 +190,17 @@ export function TwoFactorVerifyView({ logo, title = 'Two-Factor Authentication',
134
190
  fontSize: 'var(--font-size-small)',
135
191
  textDecoration: 'underline',
136
192
  cursor: 'pointer',
137
- padding: 0,
138
- }, children: useBackupCode
139
- ? 'Use authenticator app instead'
140
- : 'Use a backup code instead' }) })] })] }) }));
193
+ padding: 0
194
+ },
195
+ children: useBackupCode ? 'Use authenticator app instead' : 'Use a backup code instead'
196
+ })
197
+ })
198
+ ]
199
+ })
200
+ ]
201
+ })
202
+ });
141
203
  }
142
204
  export default TwoFactorVerifyView;
205
+
143
206
  //# sourceMappingURL=TwoFactorVerifyView.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TwoFactorVerifyView.js","sourceRoot":"","sources":["../../../src/components/twoFactor/TwoFactorVerifyView.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/twoFactor/TwoFactorVerifyView.tsx"],"sourcesContent":["'use client'\n\nimport { useState, type FormEvent } from 'react'\nimport { useRouter } from 'next/navigation.js'\n\nexport type TwoFactorVerifyViewProps = {\n /** Custom logo element */\n logo?: React.ReactNode\n /** Page title. Default: 'Two-Factor Authentication' */\n title?: string\n /** Path to redirect after successful verification. Default: '/admin' */\n afterVerifyPath?: string\n /** Callback after successful verification */\n onVerifyComplete?: () => void\n}\n\n/**\n * Two-factor authentication verification component.\n * Used during login flow when 2FA is enabled on the account.\n * Uses Better Auth's twoFactor plugin endpoints.\n */\nexport function TwoFactorVerifyView({\n logo,\n title = 'Two-Factor Authentication',\n afterVerifyPath = '/admin',\n onVerifyComplete,\n}: TwoFactorVerifyViewProps) {\n const router = useRouter()\n const [code, setCode] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [loading, setLoading] = useState(false)\n const [useBackupCode, setUseBackupCode] = useState(false)\n\n async function handleSubmit(e: FormEvent) {\n e.preventDefault()\n setLoading(true)\n setError(null)\n\n try {\n const endpoint = useBackupCode\n ? '/api/auth/two-factor/verify-backup-code'\n : '/api/auth/two-factor/verify-totp'\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ code }),\n })\n\n if (response.ok) {\n onVerifyComplete?.()\n router.push(afterVerifyPath)\n router.refresh()\n } else {\n const data = await response.json().catch(() => ({}))\n setError(data.message || 'Invalid code. Please try again.')\n }\n } catch {\n setError('An error occurred. Please try again.')\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <div\n style={{\n minHeight: '100vh',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'var(--theme-bg)',\n padding: 'var(--base)',\n }}\n >\n <div\n style={{\n background: 'var(--theme-elevation-50)',\n padding: 'calc(var(--base) * 2)',\n borderRadius: 'var(--style-radius-m)',\n boxShadow: '0 2px 20px rgba(0, 0, 0, 0.1)',\n width: '100%',\n maxWidth: '400px',\n }}\n >\n {logo && (\n <div\n style={{\n textAlign: 'center',\n marginBottom: 'calc(var(--base) * 1.5)',\n }}\n >\n {logo}\n </div>\n )}\n\n <h1\n style={{\n color: 'var(--theme-text)',\n fontSize: 'var(--font-size-h3)',\n fontWeight: 600,\n margin: '0 0 calc(var(--base) * 0.5) 0',\n textAlign: 'center',\n }}\n >\n {title}\n </h1>\n\n <p\n style={{\n color: 'var(--theme-text)',\n opacity: 0.7,\n fontSize: 'var(--font-size-small)',\n textAlign: 'center',\n marginBottom: 'calc(var(--base) * 1.5)',\n }}\n >\n {useBackupCode\n ? 'Enter one of your backup codes.'\n : 'Enter the code from your authenticator app.'}\n </p>\n\n <form onSubmit={handleSubmit}>\n <div style={{ marginBottom: 'calc(var(--base) * 1.5)' }}>\n <label\n htmlFor=\"code\"\n style={{\n display: 'block',\n color: 'var(--theme-text)',\n marginBottom: 'calc(var(--base) * 0.5)',\n fontSize: 'var(--font-size-small)',\n fontWeight: 500,\n }}\n >\n {useBackupCode ? 'Backup Code' : 'Verification Code'}\n </label>\n <input\n id=\"code\"\n type=\"text\"\n inputMode={useBackupCode ? 'text' : 'numeric'}\n pattern={useBackupCode ? undefined : '[0-9]*'}\n autoComplete=\"one-time-code\"\n value={code}\n onChange={(e) => {\n if (useBackupCode) {\n setCode(e.target.value)\n } else {\n setCode(e.target.value.replace(/\\D/g, '').slice(0, 6))\n }\n }}\n required\n placeholder={useBackupCode ? 'xxxxxxxx' : '000000'}\n style={{\n width: '100%',\n padding: 'calc(var(--base) * 0.75)',\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 fontSize: 'var(--font-size-h4)',\n fontFamily: 'monospace',\n textAlign: 'center',\n letterSpacing: useBackupCode ? '0.2em' : '0.5em',\n outline: 'none',\n boxSizing: 'border-box',\n }}\n />\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.5)',\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 <button\n type=\"submit\"\n disabled={loading || (!useBackupCode && code.length !== 6)}\n style={{\n width: '100%',\n padding: 'calc(var(--base) * 0.75)',\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-base)',\n fontWeight: 500,\n cursor: loading || (!useBackupCode && code.length !== 6) ? 'not-allowed' : 'pointer',\n opacity: loading || (!useBackupCode && code.length !== 6) ? 0.7 : 1,\n transition: 'opacity 150ms ease',\n marginBottom: 'var(--base)',\n }}\n >\n {loading ? 'Verifying...' : 'Verify'}\n </button>\n\n <div style={{ textAlign: 'center' }}>\n <button\n type=\"button\"\n onClick={() => {\n setUseBackupCode(!useBackupCode)\n setCode('')\n setError(null)\n }}\n style={{\n background: 'none',\n border: 'none',\n color: 'var(--theme-text)',\n opacity: 0.7,\n fontSize: 'var(--font-size-small)',\n textDecoration: 'underline',\n cursor: 'pointer',\n padding: 0,\n }}\n >\n {useBackupCode\n ? 'Use authenticator app instead'\n : 'Use a backup code instead'}\n </button>\n </div>\n </form>\n </div>\n </div>\n )\n}\n\nexport default TwoFactorVerifyView\n"],"names":["useState","useRouter","TwoFactorVerifyView","logo","title","afterVerifyPath","onVerifyComplete","router","code","setCode","error","setError","loading","setLoading","useBackupCode","setUseBackupCode","handleSubmit","e","preventDefault","endpoint","response","fetch","method","headers","credentials","body","JSON","stringify","ok","push","refresh","data","json","catch","message","div","style","minHeight","display","alignItems","justifyContent","background","padding","borderRadius","boxShadow","width","maxWidth","textAlign","marginBottom","h1","color","fontSize","fontWeight","margin","p","opacity","form","onSubmit","label","htmlFor","input","id","type","inputMode","pattern","undefined","autoComplete","value","onChange","target","replace","slice","required","placeholder","border","fontFamily","letterSpacing","outline","boxSizing","button","disabled","length","cursor","transition","onClick","textDecoration"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * Two-factor authentication UI components
3
3
  *
4
4
  * @packageDocumentation
5
- */
6
- export { TwoFactorSetupView } from './TwoFactorSetupView.js';
5
+ */ export { TwoFactorSetupView } from './TwoFactorSetupView.js';
7
6
  export { TwoFactorVerifyView } from './TwoFactorVerifyView.js';
7
+
8
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/twoFactor/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAgC,MAAM,yBAAyB,CAAA;AAC1F,OAAO,EAAE,mBAAmB,EAAiC,MAAM,0BAA0B,CAAA"}
1
+ {"version":3,"sources":["../../../src/components/twoFactor/index.ts"],"sourcesContent":["/**\n * Two-factor authentication UI components\n *\n * @packageDocumentation\n */\n\nexport { TwoFactorSetupView, type TwoFactorSetupViewProps } from './TwoFactorSetupView.js'\nexport { TwoFactorVerifyView, type TwoFactorVerifyViewProps } from './TwoFactorVerifyView.js'\n"],"names":["TwoFactorSetupView","TwoFactorVerifyView"],"mappings":"AAAA;;;;CAIC,GAED,SAASA,kBAAkB,QAAsC,0BAAyB;AAC1F,SAASC,mBAAmB,QAAuC,2BAA0B"}