@delmaredigital/payload-better-auth 0.3.9 → 0.3.10

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 (165) hide show
  1. package/dist/adapter/collections.d.ts +0 -1
  2. package/dist/adapter/collections.js +0 -2
  3. package/dist/adapter/index.d.ts +0 -1
  4. package/dist/adapter/index.js +0 -2
  5. package/dist/components/BeforeLogin.d.ts +0 -1
  6. package/dist/components/BeforeLogin.js +0 -2
  7. package/dist/components/LoginView.d.ts +0 -1
  8. package/dist/components/LoginView.js +0 -2
  9. package/dist/components/LoginViewWrapper.d.ts +0 -1
  10. package/dist/components/LoginViewWrapper.js +0 -2
  11. package/dist/components/LogoutButton.d.ts +0 -1
  12. package/dist/components/LogoutButton.js +0 -2
  13. package/dist/components/PasskeyRegisterButton.d.ts +0 -1
  14. package/dist/components/PasskeyRegisterButton.js +0 -2
  15. package/dist/components/PasskeySignInButton.d.ts +0 -1
  16. package/dist/components/PasskeySignInButton.js +0 -2
  17. package/dist/components/auth/ForgotPasswordView.d.ts +0 -1
  18. package/dist/components/auth/ForgotPasswordView.js +0 -2
  19. package/dist/components/auth/ResetPasswordView.d.ts +0 -1
  20. package/dist/components/auth/ResetPasswordView.js +0 -2
  21. package/dist/components/auth/index.d.ts +0 -1
  22. package/dist/components/auth/index.js +0 -2
  23. package/dist/components/management/ApiKeysManagementClient.d.ts +0 -1
  24. package/dist/components/management/ApiKeysManagementClient.js +0 -2
  25. package/dist/components/management/PasskeysManagementClient.d.ts +0 -1
  26. package/dist/components/management/PasskeysManagementClient.js +0 -2
  27. package/dist/components/management/SecurityNavLinks.d.ts +0 -1
  28. package/dist/components/management/SecurityNavLinks.js +0 -2
  29. package/dist/components/management/TwoFactorManagementClient.d.ts +0 -1
  30. package/dist/components/management/TwoFactorManagementClient.js +0 -2
  31. package/dist/components/management/index.d.ts +0 -1
  32. package/dist/components/management/index.js +0 -2
  33. package/dist/components/management/views/ApiKeysView.d.ts +0 -1
  34. package/dist/components/management/views/ApiKeysView.js +0 -2
  35. package/dist/components/management/views/PasskeysView.d.ts +0 -1
  36. package/dist/components/management/views/PasskeysView.js +0 -2
  37. package/dist/components/management/views/TwoFactorView.d.ts +0 -1
  38. package/dist/components/management/views/TwoFactorView.js +0 -2
  39. package/dist/components/management/views/index.d.ts +0 -1
  40. package/dist/components/management/views/index.js +0 -2
  41. package/dist/components/twoFactor/TwoFactorSetupView.d.ts +0 -1
  42. package/dist/components/twoFactor/TwoFactorSetupView.js +0 -2
  43. package/dist/components/twoFactor/TwoFactorVerifyView.d.ts +0 -1
  44. package/dist/components/twoFactor/TwoFactorVerifyView.js +0 -2
  45. package/dist/components/twoFactor/index.d.ts +0 -1
  46. package/dist/components/twoFactor/index.js +0 -2
  47. package/dist/exports/client.d.ts +0 -1
  48. package/dist/exports/client.js +0 -2
  49. package/dist/exports/components.d.ts +0 -1
  50. package/dist/exports/components.js +0 -2
  51. package/dist/exports/management.d.ts +0 -1
  52. package/dist/exports/management.js +0 -2
  53. package/dist/exports/rsc.d.ts +0 -1
  54. package/dist/exports/rsc.js +0 -2
  55. package/dist/generated-types.d.ts +0 -1
  56. package/dist/generated-types.js +0 -2
  57. package/dist/index.d.ts +0 -1
  58. package/dist/index.js +0 -2
  59. package/dist/plugin/index.d.ts +0 -1
  60. package/dist/plugin/index.js +0 -2
  61. package/dist/scripts/generate-types.d.ts +0 -1
  62. package/dist/scripts/generate-types.js +0 -2
  63. package/dist/types/apiKey.d.ts +0 -1
  64. package/dist/types/apiKey.js +0 -2
  65. package/dist/types/betterAuth.d.ts +0 -1
  66. package/dist/types/betterAuth.js +0 -2
  67. package/dist/utils/access.d.ts +0 -1
  68. package/dist/utils/access.js +0 -2
  69. package/dist/utils/apiKeyAccess.d.ts +0 -1
  70. package/dist/utils/apiKeyAccess.js +0 -2
  71. package/dist/utils/betterAuthDefaults.d.ts +0 -1
  72. package/dist/utils/betterAuthDefaults.js +0 -2
  73. package/dist/utils/detectAuthConfig.d.ts +0 -1
  74. package/dist/utils/detectAuthConfig.js +0 -2
  75. package/dist/utils/detectEnabledPlugins.d.ts +0 -1
  76. package/dist/utils/detectEnabledPlugins.js +0 -2
  77. package/dist/utils/firstUserAdmin.d.ts +0 -1
  78. package/dist/utils/firstUserAdmin.js +0 -2
  79. package/dist/utils/generateScopes.d.ts +0 -1
  80. package/dist/utils/generateScopes.js +0 -2
  81. package/dist/utils/session.d.ts +0 -1
  82. package/dist/utils/session.js +0 -2
  83. package/package.json +1 -1
  84. package/dist/adapter/collections.d.ts.map +0 -1
  85. package/dist/adapter/collections.js.map +0 -1
  86. package/dist/adapter/index.d.ts.map +0 -1
  87. package/dist/adapter/index.js.map +0 -1
  88. package/dist/components/BeforeLogin.d.ts.map +0 -1
  89. package/dist/components/BeforeLogin.js.map +0 -1
  90. package/dist/components/LoginView.d.ts.map +0 -1
  91. package/dist/components/LoginView.js.map +0 -1
  92. package/dist/components/LoginViewWrapper.d.ts.map +0 -1
  93. package/dist/components/LoginViewWrapper.js.map +0 -1
  94. package/dist/components/LogoutButton.d.ts.map +0 -1
  95. package/dist/components/LogoutButton.js.map +0 -1
  96. package/dist/components/PasskeyRegisterButton.d.ts.map +0 -1
  97. package/dist/components/PasskeyRegisterButton.js.map +0 -1
  98. package/dist/components/PasskeySignInButton.d.ts.map +0 -1
  99. package/dist/components/PasskeySignInButton.js.map +0 -1
  100. package/dist/components/auth/ForgotPasswordView.d.ts.map +0 -1
  101. package/dist/components/auth/ForgotPasswordView.js.map +0 -1
  102. package/dist/components/auth/ResetPasswordView.d.ts.map +0 -1
  103. package/dist/components/auth/ResetPasswordView.js.map +0 -1
  104. package/dist/components/auth/index.d.ts.map +0 -1
  105. package/dist/components/auth/index.js.map +0 -1
  106. package/dist/components/management/ApiKeysManagementClient.d.ts.map +0 -1
  107. package/dist/components/management/ApiKeysManagementClient.js.map +0 -1
  108. package/dist/components/management/PasskeysManagementClient.d.ts.map +0 -1
  109. package/dist/components/management/PasskeysManagementClient.js.map +0 -1
  110. package/dist/components/management/SecurityNavLinks.d.ts.map +0 -1
  111. package/dist/components/management/SecurityNavLinks.js.map +0 -1
  112. package/dist/components/management/TwoFactorManagementClient.d.ts.map +0 -1
  113. package/dist/components/management/TwoFactorManagementClient.js.map +0 -1
  114. package/dist/components/management/index.d.ts.map +0 -1
  115. package/dist/components/management/index.js.map +0 -1
  116. package/dist/components/management/views/ApiKeysView.d.ts.map +0 -1
  117. package/dist/components/management/views/ApiKeysView.js.map +0 -1
  118. package/dist/components/management/views/PasskeysView.d.ts.map +0 -1
  119. package/dist/components/management/views/PasskeysView.js.map +0 -1
  120. package/dist/components/management/views/TwoFactorView.d.ts.map +0 -1
  121. package/dist/components/management/views/TwoFactorView.js.map +0 -1
  122. package/dist/components/management/views/index.d.ts.map +0 -1
  123. package/dist/components/management/views/index.js.map +0 -1
  124. package/dist/components/twoFactor/TwoFactorSetupView.d.ts.map +0 -1
  125. package/dist/components/twoFactor/TwoFactorSetupView.js.map +0 -1
  126. package/dist/components/twoFactor/TwoFactorVerifyView.d.ts.map +0 -1
  127. package/dist/components/twoFactor/TwoFactorVerifyView.js.map +0 -1
  128. package/dist/components/twoFactor/index.d.ts.map +0 -1
  129. package/dist/components/twoFactor/index.js.map +0 -1
  130. package/dist/exports/client.d.ts.map +0 -1
  131. package/dist/exports/client.js.map +0 -1
  132. package/dist/exports/components.d.ts.map +0 -1
  133. package/dist/exports/components.js.map +0 -1
  134. package/dist/exports/management.d.ts.map +0 -1
  135. package/dist/exports/management.js.map +0 -1
  136. package/dist/exports/rsc.d.ts.map +0 -1
  137. package/dist/exports/rsc.js.map +0 -1
  138. package/dist/generated-types.d.ts.map +0 -1
  139. package/dist/generated-types.js.map +0 -1
  140. package/dist/index.d.ts.map +0 -1
  141. package/dist/index.js.map +0 -1
  142. package/dist/plugin/index.d.ts.map +0 -1
  143. package/dist/plugin/index.js.map +0 -1
  144. package/dist/scripts/generate-types.d.ts.map +0 -1
  145. package/dist/scripts/generate-types.js.map +0 -1
  146. package/dist/types/apiKey.d.ts.map +0 -1
  147. package/dist/types/apiKey.js.map +0 -1
  148. package/dist/types/betterAuth.d.ts.map +0 -1
  149. package/dist/types/betterAuth.js.map +0 -1
  150. package/dist/utils/access.d.ts.map +0 -1
  151. package/dist/utils/access.js.map +0 -1
  152. package/dist/utils/apiKeyAccess.d.ts.map +0 -1
  153. package/dist/utils/apiKeyAccess.js.map +0 -1
  154. package/dist/utils/betterAuthDefaults.d.ts.map +0 -1
  155. package/dist/utils/betterAuthDefaults.js.map +0 -1
  156. package/dist/utils/detectAuthConfig.d.ts.map +0 -1
  157. package/dist/utils/detectAuthConfig.js.map +0 -1
  158. package/dist/utils/detectEnabledPlugins.d.ts.map +0 -1
  159. package/dist/utils/detectEnabledPlugins.js.map +0 -1
  160. package/dist/utils/firstUserAdmin.d.ts.map +0 -1
  161. package/dist/utils/firstUserAdmin.js.map +0 -1
  162. package/dist/utils/generateScopes.d.ts.map +0 -1
  163. package/dist/utils/generateScopes.js.map +0 -1
  164. package/dist/utils/session.d.ts.map +0 -1
  165. package/dist/utils/session.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/management/ApiKeysManagementClient.tsx"],"sourcesContent":["'use client'\n\nimport { useState, useEffect, useMemo, useRef, type FormEvent } from 'react'\nimport {\n createPayloadAuthClient,\n type PayloadAuthClient,\n} from '../../exports/client.js'\nimport type { AvailableScope } from '../../types/apiKey.js'\n\ntype ApiKey = {\n id: string\n name: string | null\n start?: string | null\n startsWith?: string\n createdAt: Date\n expiresAt?: Date | null\n lastUsedAt?: Date | null\n /** Stored scope IDs for display */\n metadata?: { scopes?: string[] }\n}\n\n/** A group of scopes for a single collection */\ntype ScopeGroup = {\n collection: string\n label: string\n scopes: {\n type: 'read' | 'write' | 'delete' | 'other'\n scope: AvailableScope\n }[]\n}\n\nexport type ApiKeysManagementClientProps = {\n /** Optional pre-configured auth client */\n authClient?: PayloadAuthClient\n /** Page title. Default: 'API Keys' */\n title?: string\n /** Available scopes for key creation. Auto-generated if not provided. */\n availableScopes?: AvailableScope[]\n /** Default scopes to pre-select when creating a key */\n defaultScopes?: string[]\n}\n\n/**\n * Group scopes by collection for the UI.\n * Scopes like \"posts:read\", \"posts:write\" get grouped under \"Posts\"\n */\nfunction groupScopesByCollection(scopes: AvailableScope[]): ScopeGroup[] {\n const groups = new Map<string, ScopeGroup>()\n\n for (const scope of scopes) {\n // Parse scope ID like \"posts:read\" -> collection=\"posts\", type=\"read\"\n const colonIndex = scope.id.indexOf(':')\n let collection: string\n let type: 'read' | 'write' | 'delete' | 'other'\n\n if (colonIndex > 0) {\n collection = scope.id.substring(0, colonIndex)\n const typeStr = scope.id.substring(colonIndex + 1)\n type = ['read', 'write', 'delete'].includes(typeStr)\n ? (typeStr as 'read' | 'write' | 'delete')\n : 'other'\n } else {\n // No colon - treat as standalone scope\n collection = scope.id\n type = 'other'\n }\n\n if (!groups.has(collection)) {\n // Create label from collection slug (posts -> Posts)\n const label = collection.charAt(0).toUpperCase() + collection.slice(1).replace(/-/g, ' ')\n groups.set(collection, {\n collection,\n label,\n scopes: [],\n })\n }\n\n groups.get(collection)!.scopes.push({ type, scope })\n }\n\n // Sort groups alphabetically, sort scopes within group by type order\n const typeOrder = { read: 0, write: 1, delete: 2, other: 3 }\n return Array.from(groups.values())\n .sort((a, b) => a.label.localeCompare(b.label))\n .map((group) => ({\n ...group,\n scopes: group.scopes.sort((a, b) => typeOrder[a.type] - typeOrder[b.type]),\n }))\n}\n\n/**\n * Client component for API keys management.\n * Lists, creates, and deletes API keys with scope selection.\n */\nexport function ApiKeysManagementClient({\n authClient: providedClient,\n title = 'API Keys',\n availableScopes = [],\n defaultScopes = [],\n}: ApiKeysManagementClientProps = {}) {\n const [apiKeys, setApiKeys] = useState<ApiKey[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [creating, setCreating] = useState(false)\n const [deleting, setDeleting] = useState<string | null>(null)\n const [showCreateForm, setShowCreateForm] = useState(false)\n const [newKeyName, setNewKeyName] = useState('')\n const [newKeyExpiry, setNewKeyExpiry] = useState('')\n const [selectedScopes, setSelectedScopes] = useState<string[]>(defaultScopes)\n const [newlyCreatedKey, setNewlyCreatedKey] = useState<string | null>(null)\n const [expandedGroups, setExpandedGroups] = useState<Set<string>>(new Set())\n\n const hasScopes = availableScopes.length > 0\n\n // Group scopes by collection\n const scopeGroups = useMemo(\n () => groupScopesByCollection(availableScopes),\n [availableScopes]\n )\n\n // Get all scope IDs by type for bulk actions\n const scopesByType = useMemo(() => {\n const result = { read: [] as string[], write: [] as string[], delete: [] as string[] }\n for (const group of scopeGroups) {\n for (const { type, scope } of group.scopes) {\n if (type === 'read' || type === 'write' || type === 'delete') {\n result[type].push(scope.id)\n }\n }\n }\n return result\n }, [scopeGroups])\n\n const getClient = () => providedClient ?? createPayloadAuthClient()\n\n // Toggle a scope selection\n function toggleScope(scopeId: string) {\n setSelectedScopes((prev) =>\n prev.includes(scopeId)\n ? prev.filter((s) => s !== scopeId)\n : [...prev, scopeId]\n )\n }\n\n // Toggle all scopes in a group\n function toggleGroup(group: ScopeGroup) {\n const groupScopeIds = group.scopes.map((s) => s.scope.id)\n const allSelected = groupScopeIds.every((id) => selectedScopes.includes(id))\n\n if (allSelected) {\n // Deselect all in group\n setSelectedScopes((prev) => prev.filter((id) => !groupScopeIds.includes(id)))\n } else {\n // Select all in group\n setSelectedScopes((prev) => [...new Set([...prev, ...groupScopeIds])])\n }\n }\n\n // Toggle expand/collapse for a group\n function toggleExpanded(collection: string) {\n setExpandedGroups((prev) => {\n const next = new Set(prev)\n if (next.has(collection)) {\n next.delete(collection)\n } else {\n next.add(collection)\n }\n return next\n })\n }\n\n // Bulk toggle all scopes of a type\n function toggleAllOfType(type: 'read' | 'write' | 'delete') {\n const typeScopes = scopesByType[type]\n const allSelected = typeScopes.every((id) => selectedScopes.includes(id))\n\n if (allSelected) {\n setSelectedScopes((prev) => prev.filter((id) => !typeScopes.includes(id)))\n } else {\n setSelectedScopes((prev) => [...new Set([...prev, ...typeScopes])])\n }\n }\n\n // Check if all scopes of a type are selected\n function isAllOfTypeSelected(type: 'read' | 'write' | 'delete'): boolean {\n return scopesByType[type].length > 0 && scopesByType[type].every((id) => selectedScopes.includes(id))\n }\n\n // Check if some (but not all) scopes of a type are selected\n function isSomeOfTypeSelected(type: 'read' | 'write' | 'delete'): boolean {\n const typeScopes = scopesByType[type]\n const selectedCount = typeScopes.filter((id) => selectedScopes.includes(id)).length\n return selectedCount > 0 && selectedCount < typeScopes.length\n }\n\n // Clear all selections\n function clearAll() {\n setSelectedScopes([])\n }\n\n // Select all scopes\n function selectAll() {\n setSelectedScopes(availableScopes.map((s) => s.id))\n }\n\n // Get group selection state\n function getGroupState(group: ScopeGroup): 'all' | 'some' | 'none' {\n const groupScopeIds = group.scopes.map((s) => s.scope.id)\n const selectedCount = groupScopeIds.filter((id) => selectedScopes.includes(id)).length\n if (selectedCount === 0) return 'none'\n if (selectedCount === groupScopeIds.length) return 'all'\n return 'some'\n }\n\n // Get scope label by ID\n function getScopeLabel(scopeId: string): string {\n const scope = availableScopes.find((s) => s.id === scopeId)\n return scope?.label ?? scopeId\n }\n\n // Get short label for scope type\n function getTypeLabel(type: 'read' | 'write' | 'delete' | 'other'): string {\n switch (type) {\n case 'read': return 'Read'\n case 'write': return 'Write'\n case 'delete': return 'Delete'\n default: return 'Access'\n }\n }\n\n useEffect(() => {\n fetchApiKeys()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n async function fetchApiKeys() {\n setLoading(true)\n setError(null)\n\n try {\n const client = getClient()\n const result = await client.apiKey.list()\n\n if (result.error) {\n setError(result.error.message ?? 'Failed to load API keys')\n } else {\n setApiKeys((result.data as ApiKey[]) ?? [])\n }\n } catch {\n setError('Failed to load API keys')\n } finally {\n setLoading(false)\n }\n }\n\n async function handleCreate(e: FormEvent) {\n e.preventDefault()\n setCreating(true)\n setError(null)\n setNewlyCreatedKey(null)\n\n try {\n const client = getClient()\n // Send scopes to server - server will convert to permissions\n const createOptions: {\n name: string\n expiresIn?: number\n scopes?: string[]\n } = { name: newKeyName }\n\n if (newKeyExpiry) {\n createOptions.expiresIn = parseInt(newKeyExpiry) * 24 * 60 * 60 // Convert days to seconds\n }\n\n // Add scopes if any are selected - server handles conversion to permissions\n if (hasScopes && selectedScopes.length > 0) {\n createOptions.scopes = selectedScopes\n }\n\n const result = await client.apiKey.create(createOptions)\n\n if (result.error) {\n setError(result.error.message ?? 'Failed to create API key')\n } else if (result.data) {\n setNewlyCreatedKey(result.data.key)\n setShowCreateForm(false)\n setNewKeyName('')\n setNewKeyExpiry('')\n setSelectedScopes(defaultScopes) // Reset to defaults\n fetchApiKeys()\n }\n } catch {\n setError('Failed to create API key')\n } finally {\n setCreating(false)\n }\n }\n\n async function handleDelete(keyId: string) {\n if (!confirm('Are you sure you want to delete this API key?')) {\n return\n }\n\n setDeleting(keyId)\n setError(null)\n\n try {\n const client = getClient()\n const result = await client.apiKey.delete({ keyId })\n\n if (result.error) {\n setError(result.error.message ?? 'Failed to delete API key')\n } else {\n setApiKeys((prev) => prev.filter((k) => k.id !== keyId))\n }\n } catch {\n setError('Failed to delete API key')\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\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 'calc(var(--base) * 2)',\n }}\n >\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\n <button\n onClick={() => setShowCreateForm(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 Create API Key\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 {newlyCreatedKey && (\n <div\n style={{\n marginBottom: 'calc(var(--base) * 1.5)',\n padding: 'calc(var(--base) * 1)',\n background: 'var(--theme-success-50)',\n borderRadius: 'var(--style-radius-m)',\n border: '1px solid var(--theme-success-200)',\n }}\n >\n <div\n style={{\n color: 'var(--theme-success-700)',\n fontWeight: 500,\n marginBottom: 'calc(var(--base) * 0.5)',\n }}\n >\n API Key Created\n </div>\n <p\n style={{\n color: 'var(--theme-text)',\n opacity: 0.8,\n fontSize: 'var(--font-size-small)',\n marginBottom: 'calc(var(--base) * 0.5)',\n }}\n >\n Copy this key now - you won't be able to see it again:\n </p>\n <div\n style={{\n display: 'flex',\n gap: 'calc(var(--base) * 0.5)',\n alignItems: 'center',\n }}\n >\n <code\n style={{\n flex: 1,\n padding: 'calc(var(--base) * 0.5)',\n background: 'var(--theme-elevation-100)',\n borderRadius: 'var(--style-radius-s)',\n fontFamily: 'monospace',\n fontSize: 'var(--font-size-small)',\n color: 'var(--theme-text)',\n wordBreak: 'break-all',\n }}\n >\n {newlyCreatedKey}\n </code>\n <button\n onClick={() => {\n navigator.clipboard.writeText(newlyCreatedKey)\n }}\n style={{\n padding: 'calc(var(--base) * 0.5)',\n background: 'var(--theme-elevation-200)',\n border: 'none',\n borderRadius: 'var(--style-radius-s)',\n cursor: 'pointer',\n }}\n >\n Copy\n </button>\n </div>\n </div>\n )}\n\n {showCreateForm && (\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 Create New API Key\n </h2>\n <form onSubmit={handleCreate}>\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\n </label>\n <input\n type=\"text\"\n value={newKeyName}\n onChange={(e) => setNewKeyName(e.target.value)}\n required\n placeholder=\"My API Key\"\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 </div>\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 Expires in (days, optional)\n </label>\n <input\n type=\"number\"\n value={newKeyExpiry}\n onChange={(e) => setNewKeyExpiry(e.target.value)}\n placeholder=\"30\"\n min=\"1\"\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 </div>\n\n {/* Scope selection - grouped by collection */}\n {hasScopes && (\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.5)',\n }}\n >\n Permissions\n </label>\n\n {/* Bulk action buttons */}\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: 'calc(var(--base) * 0.5)',\n marginBottom: 'calc(var(--base) * 0.75)',\n }}\n >\n <BulkButton\n label=\"All Read\"\n active={isAllOfTypeSelected('read')}\n indeterminate={isSomeOfTypeSelected('read')}\n onClick={() => toggleAllOfType('read')}\n />\n <BulkButton\n label=\"All Write\"\n active={isAllOfTypeSelected('write')}\n indeterminate={isSomeOfTypeSelected('write')}\n onClick={() => toggleAllOfType('write')}\n />\n <BulkButton\n label=\"All Delete\"\n active={isAllOfTypeSelected('delete')}\n indeterminate={isSomeOfTypeSelected('delete')}\n onClick={() => toggleAllOfType('delete')}\n />\n <div style={{ flex: 1 }} />\n <button\n type=\"button\"\n onClick={selectAll}\n style={{\n padding: '4px 8px',\n background: 'transparent',\n border: '1px solid var(--theme-elevation-200)',\n borderRadius: 'var(--style-radius-s)',\n color: 'var(--theme-text)',\n fontSize: '11px',\n cursor: 'pointer',\n opacity: 0.8,\n }}\n >\n Select All\n </button>\n <button\n type=\"button\"\n onClick={clearAll}\n style={{\n padding: '4px 8px',\n background: 'transparent',\n border: '1px solid var(--theme-elevation-200)',\n borderRadius: 'var(--style-radius-s)',\n color: 'var(--theme-text)',\n fontSize: '11px',\n cursor: 'pointer',\n opacity: 0.8,\n }}\n >\n Clear\n </button>\n </div>\n\n {/* Collection groups */}\n <div\n style={{\n background: 'var(--theme-input-bg)',\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: 'var(--style-radius-s)',\n maxHeight: '400px',\n overflowY: 'auto',\n }}\n >\n {scopeGroups.map((group) => {\n const groupState = getGroupState(group)\n const isExpanded = expandedGroups.has(group.collection)\n\n return (\n <div\n key={group.collection}\n style={{\n borderBottom: '1px solid var(--theme-elevation-100)',\n }}\n >\n {/* Group header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'calc(var(--base) * 0.5)',\n padding: 'calc(var(--base) * 0.5) calc(var(--base) * 0.75)',\n cursor: 'pointer',\n background: groupState !== 'none' ? 'var(--theme-elevation-50)' : 'transparent',\n }}\n onClick={() => toggleExpanded(group.collection)}\n >\n {/* Expand/collapse arrow */}\n <span\n style={{\n color: 'var(--theme-elevation-500)',\n fontSize: '10px',\n width: '12px',\n transition: 'transform 0.15s',\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n >\n ▶\n </span>\n\n {/* Group checkbox */}\n <IndeterminateCheckbox\n checked={groupState === 'all'}\n indeterminate={groupState === 'some'}\n onChange={(e) => {\n e.stopPropagation()\n toggleGroup(group)\n }}\n />\n\n {/* Group label */}\n <span\n style={{\n color: 'var(--theme-text)',\n fontSize: 'var(--font-size-small)',\n fontWeight: 500,\n flex: 1,\n }}\n >\n {group.label}\n </span>\n\n {/* Selected count badge */}\n {groupState !== 'none' && (\n <span\n style={{\n padding: '2px 6px',\n background: 'var(--theme-elevation-200)',\n borderRadius: '10px',\n fontSize: '10px',\n color: 'var(--theme-elevation-700)',\n }}\n >\n {group.scopes.filter((s) => selectedScopes.includes(s.scope.id)).length}/{group.scopes.length}\n </span>\n )}\n </div>\n\n {/* Expanded scopes */}\n {isExpanded && (\n <div\n style={{\n padding: '0 calc(var(--base) * 0.75) calc(var(--base) * 0.5)',\n paddingLeft: 'calc(var(--base) * 2.5)',\n display: 'flex',\n flexDirection: 'column',\n gap: 'calc(var(--base) * 0.25)',\n }}\n >\n {group.scopes.map(({ type, scope }) => (\n <label\n key={scope.id}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'calc(var(--base) * 0.5)',\n cursor: 'pointer',\n padding: 'calc(var(--base) * 0.25)',\n borderRadius: 'var(--style-radius-s)',\n background: selectedScopes.includes(scope.id)\n ? 'var(--theme-elevation-100)'\n : 'transparent',\n }}\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope.id)}\n onChange={() => toggleScope(scope.id)}\n />\n <span\n style={{\n color: 'var(--theme-text)',\n fontSize: 'var(--font-size-small)',\n }}\n >\n {getTypeLabel(type)}\n </span>\n </label>\n ))}\n </div>\n )}\n </div>\n )\n })}\n </div>\n\n {/* Selection summary */}\n <div\n style={{\n marginTop: 'calc(var(--base) * 0.5)',\n fontSize: '11px',\n color: selectedScopes.length === 0 ? 'var(--theme-warning-500)' : 'var(--theme-elevation-600)',\n }}\n >\n {selectedScopes.length === 0\n ? 'No permissions selected. Key will have no access.'\n : `${selectedScopes.length} permission${selectedScopes.length === 1 ? '' : 's'} selected`}\n </div>\n </div>\n )}\n\n <div style={{ display: 'flex', gap: 'calc(var(--base) * 0.5)' }}>\n <button\n type=\"submit\"\n disabled={creating}\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: creating ? 'not-allowed' : 'pointer',\n opacity: creating ? 0.7 : 1,\n }}\n >\n {creating ? 'Creating...' : 'Create'}\n </button>\n <button\n type=\"button\"\n onClick={() => setShowCreateForm(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 API keys...\n </div>\n ) : apiKeys.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 API keys found. Create one to get started.\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 {apiKeys.map((key, index) => (\n <div\n key={key.id}\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: 'calc(var(--base) * 1)',\n borderBottom:\n index < apiKeys.length - 1\n ? '1px solid var(--theme-elevation-100)'\n : 'none',\n }}\n >\n <div style={{ flex: 1 }}>\n <div\n style={{\n color: 'var(--theme-text)',\n fontWeight: 500,\n marginBottom: 'calc(var(--base) * 0.25)',\n }}\n >\n {key.name}\n </div>\n <div\n style={{\n color: 'var(--theme-elevation-600)',\n fontSize: 'var(--font-size-small)',\n }}\n >\n {(key.start || key.startsWith) && <code>{key.start || key.startsWith}...</code>}\n <span> • Created: {formatDate(key.createdAt)}</span>\n {key.expiresAt && (\n <span> • Expires: {formatDate(key.expiresAt)}</span>\n )}\n {key.lastUsedAt && (\n <span> • Last used: {formatDate(key.lastUsedAt)}</span>\n )}\n </div>\n {/* Display scopes if available */}\n {key.metadata?.scopes && key.metadata.scopes.length > 0 && (\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: 'calc(var(--base) * 0.25)',\n marginTop: 'calc(var(--base) * 0.5)',\n }}\n >\n {key.metadata.scopes.map((scopeId) => (\n <span\n key={scopeId}\n style={{\n padding: '2px 6px',\n background: 'var(--theme-elevation-100)',\n borderRadius: 'var(--style-radius-s)',\n fontSize: '11px',\n color: 'var(--theme-elevation-700)',\n }}\n >\n {getScopeLabel(scopeId)}\n </span>\n ))}\n </div>\n )}\n </div>\n\n <button\n onClick={() => handleDelete(key.id)}\n disabled={deleting === key.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 === key.id ? 'not-allowed' : 'pointer',\n opacity: deleting === key.id ? 0.7 : 1,\n }}\n >\n {deleting === key.id ? 'Deleting...' : 'Delete'}\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/**\n * Bulk action button with active/indeterminate states\n */\nfunction BulkButton({\n label,\n active,\n indeterminate,\n onClick,\n}: {\n label: string\n active: boolean\n indeterminate: boolean\n onClick: () => void\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n padding: '4px 10px',\n background: active\n ? 'var(--theme-elevation-700)'\n : indeterminate\n ? 'var(--theme-elevation-300)'\n : 'var(--theme-elevation-100)',\n border: 'none',\n borderRadius: 'var(--style-radius-s)',\n color: active ? 'var(--theme-elevation-50)' : 'var(--theme-text)',\n fontSize: '11px',\n fontWeight: 500,\n cursor: 'pointer',\n transition: 'background 0.15s',\n }}\n >\n {label}\n </button>\n )\n}\n\n/**\n * Checkbox that supports indeterminate state\n */\nfunction IndeterminateCheckbox({\n checked,\n indeterminate,\n onChange,\n}: {\n checked: boolean\n indeterminate: boolean\n onChange: (e: React.MouseEvent) => void\n}) {\n const ref = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n if (ref.current) {\n ref.current.indeterminate = indeterminate\n }\n }, [indeterminate])\n\n return (\n <input\n ref={ref}\n type=\"checkbox\"\n checked={checked}\n onChange={() => {}}\n onClick={onChange}\n style={{ cursor: 'pointer' }}\n />\n )\n}\n\nexport default ApiKeysManagementClient\n"],"names":["useState","useEffect","useMemo","useRef","createPayloadAuthClient","groupScopesByCollection","scopes","groups","Map","scope","colonIndex","id","indexOf","collection","type","substring","typeStr","includes","has","label","charAt","toUpperCase","slice","replace","set","get","push","typeOrder","read","write","delete","other","Array","from","values","sort","a","b","localeCompare","map","group","ApiKeysManagementClient","authClient","providedClient","title","availableScopes","defaultScopes","apiKeys","setApiKeys","loading","setLoading","error","setError","creating","setCreating","deleting","setDeleting","showCreateForm","setShowCreateForm","newKeyName","setNewKeyName","newKeyExpiry","setNewKeyExpiry","selectedScopes","setSelectedScopes","newlyCreatedKey","setNewlyCreatedKey","expandedGroups","setExpandedGroups","Set","hasScopes","length","scopeGroups","scopesByType","result","getClient","toggleScope","scopeId","prev","filter","s","toggleGroup","groupScopeIds","allSelected","every","toggleExpanded","next","add","toggleAllOfType","typeScopes","isAllOfTypeSelected","isSomeOfTypeSelected","selectedCount","clearAll","selectAll","getGroupState","getScopeLabel","find","getTypeLabel","fetchApiKeys","client","apiKey","list","message","data","handleCreate","e","preventDefault","createOptions","name","expiresIn","parseInt","create","key","handleDelete","keyId","confirm","k","formatDate","date","d","Date","toLocaleString","div","style","maxWidth","margin","padding","display","justifyContent","alignItems","marginBottom","h1","color","fontSize","fontWeight","button","onClick","background","border","borderRadius","cursor","p","opacity","gap","code","flex","fontFamily","wordBreak","navigator","clipboard","writeText","h2","form","onSubmit","input","value","onChange","target","required","placeholder","width","boxSizing","min","flexWrap","BulkButton","active","indeterminate","maxHeight","overflowY","groupState","isExpanded","borderBottom","span","transition","transform","IndeterminateCheckbox","checked","stopPropagation","paddingLeft","flexDirection","marginTop","disabled","textAlign","overflow","index","start","startsWith","createdAt","expiresAt","lastUsedAt","metadata","ref","current"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PasskeysManagementClient.d.ts","sourceRoot":"","sources":["../../../src/components/management/PasskeysManagementClient.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,yBAAyB,CAAA;AAUhC,MAAM,MAAM,6BAA6B,GAAG;IAC1C,0CAA0C;IAC1C,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,UAAU,EAAE,cAAc,EAC1B,KAAkB,GACnB,GAAE,6BAAkC,+BAwXpC;AAED,eAAe,wBAAwB,CAAA"}
@@ -1 +0,0 @@
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":"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"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/management/SecurityNavLinks.tsx"],"sourcesContent":["'use client'\n\nexport type SecurityNavLinksProps = {\n /** Base path for security views. Default: '/admin/security' */\n basePath?: string\n /** Show Two-Factor Auth link. Default: true */\n showTwoFactor?: boolean\n /** Show API Keys link. Default: true */\n showApiKeys?: boolean\n /** Show Passkeys link. Default: true */\n showPasskeys?: boolean\n}\n\ntype NavLink = {\n href: string\n label: string\n icon: string\n}\n\n/**\n * Navigation links for security management features.\n * Rendered in admin sidebar via afterNavLinks injection.\n * Uses Payload's nav CSS classes for native styling.\n *\n * Links are conditionally shown based on which Better Auth plugins are enabled.\n */\nexport function SecurityNavLinks({\n basePath = '/admin/security',\n showTwoFactor = true,\n showApiKeys = true,\n showPasskeys = true,\n}: SecurityNavLinksProps = {}) {\n // Build links based on enabled plugins\n const links: NavLink[] = []\n\n if (showTwoFactor) {\n links.push({\n href: `${basePath}/two-factor`,\n label: 'Two-Factor Auth',\n icon: '📱',\n })\n }\n\n if (showApiKeys) {\n links.push({\n href: `${basePath}/api-keys`,\n label: 'API Keys',\n icon: '🔑',\n })\n }\n\n if (showPasskeys) {\n links.push({\n href: `${basePath}/passkeys`,\n label: 'Passkeys',\n icon: '🔐',\n })\n }\n\n // Don't render anything if no plugins are enabled\n if (links.length === 0) {\n return null\n }\n\n return (\n <div\n style={{\n borderTop: '1px solid var(--theme-elevation-100)',\n marginTop: 'var(--base)',\n paddingTop: 'var(--base)',\n }}\n >\n <div\n style={{\n fontSize: '11px',\n fontWeight: 600,\n color: 'var(--theme-elevation-500)',\n padding: '0 calc(var(--base) * 0.75)',\n marginBottom: 'calc(var(--base) * 0.5)',\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n }}\n >\n Security\n </div>\n {links.map((link) => (\n <a\n key={link.href}\n href={link.href}\n className=\"nav__link\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'calc(var(--base) * 0.5)',\n padding: 'calc(var(--base) * 0.5) calc(var(--base) * 0.75)',\n color: 'var(--theme-elevation-800)',\n textDecoration: 'none',\n fontSize: 'var(--font-size-small)',\n borderRadius: 'var(--style-radius-s)',\n transition: 'background-color 150ms ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--theme-elevation-50)'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent'\n }}\n >\n <span style={{ fontSize: '14px' }}>{link.icon}</span>\n <span className=\"nav__link-label\">{link.label}</span>\n </a>\n ))}\n </div>\n )\n}\n\nexport default SecurityNavLinks\n"],"names":["SecurityNavLinks","basePath","showTwoFactor","showApiKeys","showPasskeys","links","push","href","label","icon","length","div","style","borderTop","marginTop","paddingTop","fontSize","fontWeight","color","padding","marginBottom","textTransform","letterSpacing","map","link","a","className","display","alignItems","gap","textDecoration","borderRadius","transition","onMouseEnter","e","currentTarget","backgroundColor","onMouseLeave","span"],"mappings":"AAAA;;AAmBA;;;;;;CAMC,GACD,OAAO,SAASA,iBAAiB,EAC/BC,WAAW,iBAAiB,EAC5BC,gBAAgB,IAAI,EACpBC,cAAc,IAAI,EAClBC,eAAe,IAAI,EACG,GAAG,CAAC,CAAC;IAC3B,uCAAuC;IACvC,MAAMC,QAAmB,EAAE;IAE3B,IAAIH,eAAe;QACjBG,MAAMC,IAAI,CAAC;YACTC,MAAM,GAAGN,SAAS,WAAW,CAAC;YAC9BO,OAAO;YACPC,MAAM;QACR;IACF;IAEA,IAAIN,aAAa;QACfE,MAAMC,IAAI,CAAC;YACTC,MAAM,GAAGN,SAAS,SAAS,CAAC;YAC5BO,OAAO;YACPC,MAAM;QACR;IACF;IAEA,IAAIL,cAAc;QAChBC,MAAMC,IAAI,CAAC;YACTC,MAAM,GAAGN,SAAS,SAAS,CAAC;YAC5BO,OAAO;YACPC,MAAM;QACR;IACF;IAEA,kDAAkD;IAClD,IAAIJ,MAAMK,MAAM,KAAK,GAAG;QACtB,OAAO;IACT;IAEA,qBACE,MAACC;QACCC,OAAO;YACLC,WAAW;YACXC,WAAW;YACXC,YAAY;QACd;;0BAEA,KAACJ;gBACCC,OAAO;oBACLI,UAAU;oBACVC,YAAY;oBACZC,OAAO;oBACPC,SAAS;oBACTC,cAAc;oBACdC,eAAe;oBACfC,eAAe;gBACjB;0BACD;;YAGAjB,MAAMkB,GAAG,CAAC,CAACC,qBACV,MAACC;oBAEClB,MAAMiB,KAAKjB,IAAI;oBACfmB,WAAU;oBACVd,OAAO;wBACLe,SAAS;wBACTC,YAAY;wBACZC,KAAK;wBACLV,SAAS;wBACTD,OAAO;wBACPY,gBAAgB;wBAChBd,UAAU;wBACVe,cAAc;wBACdC,YAAY;oBACd;oBACAC,cAAc,CAACC;wBACbA,EAAEC,aAAa,CAACvB,KAAK,CAACwB,eAAe,GAAG;oBAC1C;oBACAC,cAAc,CAACH;wBACbA,EAAEC,aAAa,CAACvB,KAAK,CAACwB,eAAe,GAAG;oBAC1C;;sCAEA,KAACE;4BAAK1B,OAAO;gCAAEI,UAAU;4BAAO;sCAAIQ,KAAKf,IAAI;;sCAC7C,KAAC6B;4BAAKZ,WAAU;sCAAmBF,KAAKhB,KAAK;;;mBAtBxCgB,KAAKjB,IAAI;;;AA2BxB;AAEA,eAAeP,iBAAgB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TwoFactorManagementClient.d.ts","sourceRoot":"","sources":["../../../src/components/management/TwoFactorManagementClient.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,yBAAyB,CAAA;AAEhC,MAAM,MAAM,8BAA8B,GAAG;IAC3C,0CAA0C;IAC1C,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,EACxC,UAAU,EAAE,cAAc,EAC1B,KAAmC,GACpC,GAAE,8BAAmC,+BAuhBrC;AAED,eAAe,yBAAyB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/management/TwoFactorManagementClient.tsx"],"sourcesContent":["'use client'\n\nimport { useState, useEffect, type FormEvent } from 'react'\nimport {\n createPayloadAuthClient,\n type PayloadAuthClient,\n} from '../../exports/client.js'\n\nexport type TwoFactorManagementClientProps = {\n /** Optional pre-configured auth client */\n authClient?: PayloadAuthClient\n /** Page title. Default: 'Two-Factor Authentication' */\n title?: string\n}\n\n/**\n * Client component for two-factor authentication management.\n * Shows 2FA status and allows enabling/disabling.\n */\nexport function TwoFactorManagementClient({\n authClient: providedClient,\n title = 'Two-Factor Authentication',\n}: TwoFactorManagementClientProps = {}) {\n const [isEnabled, setIsEnabled] = useState(false)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [step, setStep] = useState<'status' | 'password' | 'setup' | 'verify' | 'backup'>('status')\n const [totpUri, setTotpUri] = useState<string | null>(null)\n const [secret, setSecret] = useState<string | null>(null)\n const [backupCodes, setBackupCodes] = useState<string[]>([])\n const [verificationCode, setVerificationCode] = useState('')\n const [password, setPassword] = useState('')\n const [actionLoading, setActionLoading] = useState(false)\n\n const getClient = () => providedClient ?? createPayloadAuthClient()\n\n useEffect(() => {\n checkStatus()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n async function checkStatus() {\n setLoading(true)\n try {\n const client = getClient()\n const result = await client.getSession()\n\n if (result.data?.user) {\n setIsEnabled((result.data.user as { twoFactorEnabled?: boolean }).twoFactorEnabled ?? false)\n } else {\n setIsEnabled(false)\n }\n } catch {\n setError('Failed to check 2FA status')\n } finally {\n setLoading(false)\n }\n }\n\n function handleEnableClick() {\n // Show password prompt first\n setStep('password')\n setPassword('')\n setError(null)\n }\n\n async function handleEnableWithPassword(e: FormEvent) {\n e.preventDefault()\n setActionLoading(true)\n setError(null)\n\n try {\n const client = getClient()\n const result = await client.twoFactor.enable({ password })\n\n if (result.error) {\n setError(result.error.message ?? 'Failed to enable 2FA')\n } else if (result.data) {\n setTotpUri(result.data.totpURI)\n // Secret is embedded in the totpURI, extract it for manual entry option\n const secretMatch = result.data.totpURI.match(/secret=([A-Z2-7]+)/i)\n setSecret(secretMatch ? secretMatch[1] : null)\n setBackupCodes(result.data.backupCodes ?? [])\n setPassword('') // Clear password\n setStep('setup')\n }\n } catch {\n setError('Failed to enable 2FA')\n } finally {\n setActionLoading(false)\n }\n }\n\n async function handleVerify(e: FormEvent) {\n e.preventDefault()\n setActionLoading(true)\n setError(null)\n\n try {\n const client = getClient()\n const result = await client.twoFactor.verifyTotp({ code: verificationCode })\n\n if (result.error) {\n setError(result.error.message ?? 'Invalid verification code')\n } else {\n if (backupCodes.length > 0) {\n setStep('backup')\n } else {\n setIsEnabled(true)\n setStep('status')\n }\n }\n } catch {\n setError('Verification failed')\n } finally {\n setActionLoading(false)\n }\n }\n\n async function handleDisable() {\n if (!confirm('Are you sure you want to disable two-factor authentication?')) {\n return\n }\n\n setActionLoading(true)\n setError(null)\n\n try {\n const client = getClient()\n const result = await client.twoFactor.disable({ password: '' })\n\n if (result.error) {\n setError(result.error.message ?? 'Failed to disable 2FA')\n } else {\n setIsEnabled(false)\n }\n } catch {\n setError('Failed to disable 2FA')\n } finally {\n setActionLoading(false)\n }\n }\n\n function handleBackupContinue() {\n setIsEnabled(true)\n setStep('status')\n }\n\n if (loading) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 'calc(var(--base) * 3)',\n }}\n >\n <div style={{ color: 'var(--theme-text)', opacity: 0.7 }}>\n Loading...\n </div>\n </div>\n )\n }\n\n return (\n <div\n style={{\n maxWidth: '600px',\n margin: '0 auto',\n padding: 'calc(var(--base) * 2)',\n }}\n >\n\n <h1\n style={{\n color: 'var(--theme-text)',\n fontSize: 'var(--font-size-h2)',\n fontWeight: 600,\n margin: '0 0 calc(var(--base) * 2) 0',\n }}\n >\n {title}\n </h1>\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 {step === 'status' && (\n <div\n style={{\n background: 'var(--theme-elevation-50)',\n padding: 'calc(var(--base) * 1.5)',\n borderRadius: 'var(--style-radius-m)',\n border: '1px solid var(--theme-elevation-100)',\n }}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\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 Status\n </div>\n <div\n style={{\n color: isEnabled\n ? 'var(--theme-success-500)'\n : 'var(--theme-elevation-600)',\n fontSize: 'var(--font-size-small)',\n }}\n >\n {isEnabled ? '✓ Enabled' : 'Not enabled'}\n </div>\n </div>\n\n <button\n onClick={isEnabled ? handleDisable : handleEnableClick}\n disabled={actionLoading}\n style={{\n padding: 'calc(var(--base) * 0.5) calc(var(--base) * 1)',\n background: isEnabled\n ? 'var(--theme-error-500)'\n : '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: actionLoading ? 'not-allowed' : 'pointer',\n opacity: actionLoading ? 0.7 : 1,\n }}\n >\n {actionLoading\n ? 'Loading...'\n : isEnabled\n ? 'Disable'\n : 'Enable'}\n </button>\n </div>\n </div>\n )}\n\n {step === 'password' && (\n <div\n style={{\n background: 'var(--theme-elevation-50)',\n padding: 'calc(var(--base) * 2)',\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 Confirm Your Password\n </h2>\n <p\n style={{\n color: 'var(--theme-text)',\n opacity: 0.7,\n fontSize: 'var(--font-size-small)',\n marginBottom: 'calc(var(--base) * 1.5)',\n }}\n >\n Enter your password to enable two-factor authentication.\n </p>\n <form onSubmit={handleEnableWithPassword}>\n <input\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Enter your password\"\n required\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-base)',\n marginBottom: 'var(--base)',\n boxSizing: 'border-box',\n }}\n />\n <div style={{ display: 'flex', gap: 'calc(var(--base) * 0.5)' }}>\n <button\n type=\"submit\"\n disabled={actionLoading || !password}\n style={{\n padding: 'calc(var(--base) * 0.75) calc(var(--base) * 1.5)',\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 cursor: actionLoading || !password ? 'not-allowed' : 'pointer',\n opacity: actionLoading || !password ? 0.7 : 1,\n }}\n >\n {actionLoading ? 'Enabling...' : 'Continue'}\n </button>\n <button\n type=\"button\"\n onClick={() => setStep('status')}\n style={{\n padding: 'calc(var(--base) * 0.75) calc(var(--base) * 1.5)',\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-base)',\n cursor: 'pointer',\n }}\n >\n Cancel\n </button>\n </div>\n </form>\n </div>\n )}\n\n {step === 'setup' && totpUri && (\n <div\n style={{\n background: 'var(--theme-elevation-50)',\n padding: 'calc(var(--base) * 2)',\n borderRadius: 'var(--style-radius-m)',\n textAlign: 'center',\n }}\n >\n <p\n style={{\n color: 'var(--theme-text)',\n opacity: 0.7,\n marginBottom: 'calc(var(--base) * 1.5)',\n }}\n >\n Scan this QR code with your authenticator app:\n </p>\n\n <img\n src={`https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=${encodeURIComponent(totpUri)}`}\n alt=\"QR Code\"\n style={{\n width: '200px',\n height: '200px',\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: 'var(--style-radius-s)',\n marginBottom: 'var(--base)',\n }}\n />\n\n {secret && (\n <div style={{ marginBottom: 'calc(var(--base) * 1.5)' }}>\n <p\n style={{\n color: 'var(--theme-text)',\n opacity: 0.7,\n fontSize: 'var(--font-size-small)',\n marginBottom: 'calc(var(--base) * 0.5)',\n }}\n >\n Or enter manually:\n </p>\n <code\n style={{\n display: 'inline-block',\n padding: 'calc(var(--base) * 0.5)',\n background: 'var(--theme-elevation-100)',\n borderRadius: 'var(--style-radius-s)',\n fontFamily: 'monospace',\n fontSize: 'var(--font-size-small)',\n color: 'var(--theme-text)',\n }}\n >\n {secret}\n </code>\n </div>\n )}\n\n <form onSubmit={handleVerify}>\n <input\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n value={verificationCode}\n onChange={(e) =>\n setVerificationCode(e.target.value.replace(/\\D/g, '').slice(0, 6))\n }\n placeholder=\"Enter 6-digit code\"\n style={{\n width: '100%',\n maxWidth: '200px',\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: '0.5em',\n marginBottom: 'var(--base)',\n boxSizing: 'border-box',\n }}\n />\n <br />\n <button\n type=\"submit\"\n disabled={actionLoading || verificationCode.length !== 6}\n style={{\n padding: 'calc(var(--base) * 0.75) calc(var(--base) * 2)',\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 cursor:\n actionLoading || verificationCode.length !== 6\n ? 'not-allowed'\n : 'pointer',\n opacity:\n actionLoading || verificationCode.length !== 6 ? 0.7 : 1,\n }}\n >\n {actionLoading ? 'Verifying...' : 'Verify'}\n </button>\n </form>\n </div>\n )}\n\n {step === 'backup' && (\n <div\n style={{\n background: 'var(--theme-elevation-50)',\n padding: 'calc(var(--base) * 2)',\n borderRadius: 'var(--style-radius-m)',\n }}\n >\n <h2\n style={{\n color: 'var(--theme-text)',\n fontSize: 'var(--font-size-h3)',\n fontWeight: 600,\n margin: '0 0 var(--base) 0',\n textAlign: 'center',\n }}\n >\n Save Your Backup Codes\n </h2>\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 Store these codes safely. Use them if you lose your authenticator.\n </p>\n\n <div\n style={{\n background: 'var(--theme-elevation-100)',\n padding: 'var(--base)',\n borderRadius: 'var(--style-radius-s)',\n marginBottom: 'var(--base)',\n fontFamily: 'monospace',\n }}\n >\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: 'calc(var(--base) * 0.5)',\n }}\n >\n {backupCodes.map((code, index) => (\n <div\n key={index}\n style={{\n color: 'var(--theme-text)',\n padding: 'calc(var(--base) * 0.25)',\n }}\n >\n {code}\n </div>\n ))}\n </div>\n </div>\n\n <button\n onClick={() => navigator.clipboard.writeText(backupCodes.join('\\n'))}\n style={{\n width: '100%',\n padding: 'calc(var(--base) * 0.5)',\n background: 'var(--theme-elevation-150)',\n border: 'none',\n borderRadius: 'var(--style-radius-s)',\n color: 'var(--theme-text)',\n fontSize: 'var(--font-size-small)',\n cursor: 'pointer',\n marginBottom: 'var(--base)',\n }}\n >\n Copy to Clipboard\n </button>\n\n <button\n onClick={handleBackupContinue}\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 cursor: 'pointer',\n }}\n >\n I've Saved My Codes\n </button>\n </div>\n )}\n </div>\n )\n}\n\nexport default TwoFactorManagementClient\n"],"names":["useState","useEffect","createPayloadAuthClient","TwoFactorManagementClient","authClient","providedClient","title","isEnabled","setIsEnabled","loading","setLoading","error","setError","step","setStep","totpUri","setTotpUri","secret","setSecret","backupCodes","setBackupCodes","verificationCode","setVerificationCode","password","setPassword","actionLoading","setActionLoading","getClient","checkStatus","client","result","getSession","data","user","twoFactorEnabled","handleEnableClick","handleEnableWithPassword","e","preventDefault","twoFactor","enable","message","totpURI","secretMatch","match","handleVerify","verifyTotp","code","length","handleDisable","confirm","disable","handleBackupContinue","div","style","display","alignItems","justifyContent","padding","color","opacity","maxWidth","margin","h1","fontSize","fontWeight","marginBottom","background","borderRadius","border","button","onClick","disabled","cursor","h2","p","form","onSubmit","input","type","value","onChange","target","placeholder","required","width","boxSizing","gap","textAlign","img","src","encodeURIComponent","alt","height","fontFamily","inputMode","pattern","replace","slice","letterSpacing","br","gridTemplateColumns","map","index","navigator","clipboard","writeText","join"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/management/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC1E,YAAY,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAA;AAEpF,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AACtE,YAAY,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAA;AAEhF,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AACxE,YAAY,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAA;AAGlF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/management/index.ts"],"sourcesContent":["/**\n * Management UI Components for Better Auth\n *\n * Client components for security feature management.\n * These are used within the server component views.\n */\n\n// Client components\nexport { TwoFactorManagementClient } from './TwoFactorManagementClient.js'\nexport type { TwoFactorManagementClientProps } from './TwoFactorManagementClient.js'\n\nexport { ApiKeysManagementClient } from './ApiKeysManagementClient.js'\nexport type { ApiKeysManagementClientProps } from './ApiKeysManagementClient.js'\n\nexport { PasskeysManagementClient } from './PasskeysManagementClient.js'\nexport type { PasskeysManagementClientProps } from './PasskeysManagementClient.js'\n\n// Nav links (client component)\nexport { SecurityNavLinks } from './SecurityNavLinks.js'\nexport type { SecurityNavLinksProps } from './SecurityNavLinks.js'\n"],"names":["TwoFactorManagementClient","ApiKeysManagementClient","PasskeysManagementClient","SecurityNavLinks"],"mappings":"AAAA;;;;;CAKC,GAED,oBAAoB;AACpB,SAASA,yBAAyB,QAAQ,iCAAgC;AAG1E,SAASC,uBAAuB,QAAQ,+BAA8B;AAGtE,SAASC,wBAAwB,QAAQ,gCAA+B;AAGxE,+BAA+B;AAC/B,SAASC,gBAAgB,QAAQ,wBAAuB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ApiKeysView.d.ts","sourceRoot":"","sources":["../../../../src/components/management/views/ApiKeysView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAU,MAAM,SAAS,CAAA;AAOrD,KAAK,gBAAgB,GAAG,cAAc,CAAA;AAEtC;;;GAGG;AACH,wBAAsB,WAAW,CAAC,EAChC,cAAc,EACd,MAAM,EACN,YAAY,GACb,EAAE,gBAAgB,wCAqClB;AAED,eAAe,WAAW,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/components/management/views/ApiKeysView.tsx"],"sourcesContent":["import type { AdminViewProps, Locale } from 'payload'\nimport { DefaultTemplate } from '@payloadcms/next/templates'\nimport { getVisibleEntities } from '@payloadcms/ui/shared'\nimport { ApiKeysManagementClient } from '../ApiKeysManagementClient.js'\nimport { getApiKeyScopesConfig } from '../../../plugin/index.js'\nimport { buildAvailableScopes } from '../../../utils/generateScopes.js'\n\ntype ApiKeysViewProps = AdminViewProps\n\n/**\n * API Keys management view for Payload admin panel.\n * Server component that provides the admin layout.\n */\nexport async function ApiKeysView({\n initPageResult,\n params,\n searchParams,\n}: ApiKeysViewProps) {\n const { req } = initPageResult\n const { payload } = req\n\n // Await params/searchParams for Next.js 15+ compatibility\n const resolvedParams = params ? await params : undefined\n const resolvedSearchParams = searchParams ? await searchParams : undefined\n\n const visibleEntities = getVisibleEntities({ req })\n\n // Build available scopes from plugin config and collections\n const scopesConfig = getApiKeyScopesConfig()\n const availableScopes = buildAvailableScopes(\n payload.config.collections,\n scopesConfig\n )\n\n // Get default scopes from config\n const defaultScopes = scopesConfig?.defaultScopes ?? []\n\n return (\n <DefaultTemplate\n i18n={req.i18n}\n locale={req.locale as Locale | undefined}\n params={resolvedParams}\n payload={payload}\n permissions={initPageResult.permissions}\n searchParams={resolvedSearchParams}\n user={req.user ?? undefined}\n visibleEntities={visibleEntities}\n >\n <ApiKeysManagementClient\n availableScopes={availableScopes}\n defaultScopes={defaultScopes}\n />\n </DefaultTemplate>\n )\n}\n\nexport default ApiKeysView\n"],"names":["DefaultTemplate","getVisibleEntities","ApiKeysManagementClient","getApiKeyScopesConfig","buildAvailableScopes","ApiKeysView","initPageResult","params","searchParams","req","payload","resolvedParams","undefined","resolvedSearchParams","visibleEntities","scopesConfig","availableScopes","config","collections","defaultScopes","i18n","locale","permissions","user"],"mappings":";AACA,SAASA,eAAe,QAAQ,6BAA4B;AAC5D,SAASC,kBAAkB,QAAQ,wBAAuB;AAC1D,SAASC,uBAAuB,QAAQ,gCAA+B;AACvE,SAASC,qBAAqB,QAAQ,2BAA0B;AAChE,SAASC,oBAAoB,QAAQ,mCAAkC;AAIvE;;;CAGC,GACD,OAAO,eAAeC,YAAY,EAChCC,cAAc,EACdC,MAAM,EACNC,YAAY,EACK;IACjB,MAAM,EAAEC,GAAG,EAAE,GAAGH;IAChB,MAAM,EAAEI,OAAO,EAAE,GAAGD;IAEpB,0DAA0D;IAC1D,MAAME,iBAAiBJ,SAAS,MAAMA,SAASK;IAC/C,MAAMC,uBAAuBL,eAAe,MAAMA,eAAeI;IAEjE,MAAME,kBAAkBb,mBAAmB;QAAEQ;IAAI;IAEjD,4DAA4D;IAC5D,MAAMM,eAAeZ;IACrB,MAAMa,kBAAkBZ,qBACtBM,QAAQO,MAAM,CAACC,WAAW,EAC1BH;IAGF,iCAAiC;IACjC,MAAMI,gBAAgBJ,cAAcI,iBAAiB,EAAE;IAEvD,qBACE,KAACnB;QACCoB,MAAMX,IAAIW,IAAI;QACdC,QAAQZ,IAAIY,MAAM;QAClBd,QAAQI;QACRD,SAASA;QACTY,aAAahB,eAAegB,WAAW;QACvCd,cAAcK;QACdU,MAAMd,IAAIc,IAAI,IAAIX;QAClBE,iBAAiBA;kBAEjB,cAAA,KAACZ;YACCc,iBAAiBA;YACjBG,eAAeA;;;AAIvB;AAEA,eAAed,YAAW"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PasskeysView.d.ts","sourceRoot":"","sources":["../../../../src/components/management/views/PasskeysView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAU,MAAM,SAAS,CAAA;AAKrD,KAAK,iBAAiB,GAAG,cAAc,CAAA;AAEvC;;;GAGG;AACH,wBAAsB,YAAY,CAAC,EACjC,cAAc,EACd,MAAM,EACN,YAAY,GACb,EAAE,iBAAiB,wCAwBnB;AAED,eAAe,YAAY,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/components/management/views/PasskeysView.tsx"],"sourcesContent":["import type { AdminViewProps, Locale } from 'payload'\nimport { DefaultTemplate } from '@payloadcms/next/templates'\nimport { getVisibleEntities } from '@payloadcms/ui/shared'\nimport { PasskeysManagementClient } from '../PasskeysManagementClient.js'\n\ntype PasskeysViewProps = AdminViewProps\n\n/**\n * Passkeys management view for Payload admin panel.\n * Server component that provides the admin layout.\n */\nexport async function PasskeysView({\n initPageResult,\n params,\n searchParams,\n}: PasskeysViewProps) {\n const { req } = initPageResult\n const { payload } = req\n\n // Await params/searchParams for Next.js 15+ compatibility\n const resolvedParams = params ? await params : undefined\n const resolvedSearchParams = searchParams ? await searchParams : undefined\n\n const visibleEntities = getVisibleEntities({ req })\n\n return (\n <DefaultTemplate\n i18n={req.i18n}\n locale={req.locale as Locale | undefined}\n params={resolvedParams}\n payload={payload}\n permissions={initPageResult.permissions}\n searchParams={resolvedSearchParams}\n user={req.user ?? undefined}\n visibleEntities={visibleEntities}\n >\n <PasskeysManagementClient />\n </DefaultTemplate>\n )\n}\n\nexport default PasskeysView\n"],"names":["DefaultTemplate","getVisibleEntities","PasskeysManagementClient","PasskeysView","initPageResult","params","searchParams","req","payload","resolvedParams","undefined","resolvedSearchParams","visibleEntities","i18n","locale","permissions","user"],"mappings":";AACA,SAASA,eAAe,QAAQ,6BAA4B;AAC5D,SAASC,kBAAkB,QAAQ,wBAAuB;AAC1D,SAASC,wBAAwB,QAAQ,iCAAgC;AAIzE;;;CAGC,GACD,OAAO,eAAeC,aAAa,EACjCC,cAAc,EACdC,MAAM,EACNC,YAAY,EACM;IAClB,MAAM,EAAEC,GAAG,EAAE,GAAGH;IAChB,MAAM,EAAEI,OAAO,EAAE,GAAGD;IAEpB,0DAA0D;IAC1D,MAAME,iBAAiBJ,SAAS,MAAMA,SAASK;IAC/C,MAAMC,uBAAuBL,eAAe,MAAMA,eAAeI;IAEjE,MAAME,kBAAkBX,mBAAmB;QAAEM;IAAI;IAEjD,qBACE,KAACP;QACCa,MAAMN,IAAIM,IAAI;QACdC,QAAQP,IAAIO,MAAM;QAClBT,QAAQI;QACRD,SAASA;QACTO,aAAaX,eAAeW,WAAW;QACvCT,cAAcK;QACdK,MAAMT,IAAIS,IAAI,IAAIN;QAClBE,iBAAiBA;kBAEjB,cAAA,KAACV;;AAGP;AAEA,eAAeC,aAAY"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TwoFactorView.d.ts","sourceRoot":"","sources":["../../../../src/components/management/views/TwoFactorView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAU,MAAM,SAAS,CAAA;AAKrD,KAAK,kBAAkB,GAAG,cAAc,CAAA;AAExC;;;GAGG;AACH,wBAAsB,aAAa,CAAC,EAClC,cAAc,EACd,MAAM,EACN,YAAY,GACb,EAAE,kBAAkB,wCAwBpB;AAED,eAAe,aAAa,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/components/management/views/TwoFactorView.tsx"],"sourcesContent":["import type { AdminViewProps, Locale } from 'payload'\nimport { DefaultTemplate } from '@payloadcms/next/templates'\nimport { getVisibleEntities } from '@payloadcms/ui/shared'\nimport { TwoFactorManagementClient } from '../TwoFactorManagementClient.js'\n\ntype TwoFactorViewProps = AdminViewProps\n\n/**\n * Two-factor management view for Payload admin panel.\n * Server component that provides the admin layout.\n */\nexport async function TwoFactorView({\n initPageResult,\n params,\n searchParams,\n}: TwoFactorViewProps) {\n const { req } = initPageResult\n const { payload } = req\n\n // Await params/searchParams for Next.js 15+ compatibility\n const resolvedParams = params ? await params : undefined\n const resolvedSearchParams = searchParams ? await searchParams : undefined\n\n const visibleEntities = getVisibleEntities({ req })\n\n return (\n <DefaultTemplate\n i18n={req.i18n}\n locale={req.locale as Locale | undefined}\n params={resolvedParams}\n payload={payload}\n permissions={initPageResult.permissions}\n searchParams={resolvedSearchParams}\n user={req.user ?? undefined}\n visibleEntities={visibleEntities}\n >\n <TwoFactorManagementClient />\n </DefaultTemplate>\n )\n}\n\nexport default TwoFactorView\n"],"names":["DefaultTemplate","getVisibleEntities","TwoFactorManagementClient","TwoFactorView","initPageResult","params","searchParams","req","payload","resolvedParams","undefined","resolvedSearchParams","visibleEntities","i18n","locale","permissions","user"],"mappings":";AACA,SAASA,eAAe,QAAQ,6BAA4B;AAC5D,SAASC,kBAAkB,QAAQ,wBAAuB;AAC1D,SAASC,yBAAyB,QAAQ,kCAAiC;AAI3E;;;CAGC,GACD,OAAO,eAAeC,cAAc,EAClCC,cAAc,EACdC,MAAM,EACNC,YAAY,EACO;IACnB,MAAM,EAAEC,GAAG,EAAE,GAAGH;IAChB,MAAM,EAAEI,OAAO,EAAE,GAAGD;IAEpB,0DAA0D;IAC1D,MAAME,iBAAiBJ,SAAS,MAAMA,SAASK;IAC/C,MAAMC,uBAAuBL,eAAe,MAAMA,eAAeI;IAEjE,MAAME,kBAAkBX,mBAAmB;QAAEM;IAAI;IAEjD,qBACE,KAACP;QACCa,MAAMN,IAAIM,IAAI;QACdC,QAAQP,IAAIO,MAAM;QAClBT,QAAQI;QACRD,SAASA;QACTO,aAAaX,eAAeW,WAAW;QACvCT,cAAcK;QACdK,MAAMT,IAAIS,IAAI,IAAIN;QAClBE,iBAAiBA;kBAEjB,cAAA,KAACV;;AAGP;AAEA,eAAeC,cAAa"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/management/views/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/components/management/views/index.ts"],"sourcesContent":["/**\n * Server Component Views for Payload Admin Panel\n *\n * These are async server components that use DefaultTemplate\n * for proper integration with Payload's admin layout.\n */\n\nexport { TwoFactorView } from './TwoFactorView.js'\nexport { ApiKeysView } from './ApiKeysView.js'\nexport { PasskeysView } from './PasskeysView.js'\n"],"names":["TwoFactorView","ApiKeysView","PasskeysView"],"mappings":"AAAA;;;;;CAKC,GAED,SAASA,aAAa,QAAQ,qBAAoB;AAClD,SAASC,WAAW,QAAQ,mBAAkB;AAC9C,SAASC,YAAY,QAAQ,oBAAmB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TwoFactorSetupView.d.ts","sourceRoot":"","sources":["../../../src/components/twoFactor/TwoFactorSetupView.tsx"],"names":[],"mappings":"AAIA,MAAM,MAAM,uBAAuB,GAAG;IACpC,0BAA0B;IAC1B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,sCAAsC;IACtC,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;CAC7B,CAAA;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,KAA0C,EAC1C,cAAyB,EACzB,eAAe,GAChB,EAAE,uBAAuB,+BAuezB;AAED,eAAe,kBAAkB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/twoFactor/TwoFactorSetupView.tsx"],"sourcesContent":["'use client'\n\nimport { useState, useEffect, type FormEvent } from 'react'\n\nexport type TwoFactorSetupViewProps = {\n /** Custom logo element */\n logo?: React.ReactNode\n /** Page title. Default: 'Set Up Two-Factor Authentication' */\n title?: string\n /** Path to redirect after successful setup. Default: '/admin' */\n afterSetupPath?: string\n /** Callback after successful setup */\n onSetupComplete?: () => void\n}\n\n/**\n * Two-factor authentication setup component.\n * Displays QR code for TOTP apps and allows verification.\n * Uses Better Auth's twoFactor plugin endpoints.\n */\nexport function TwoFactorSetupView({\n logo,\n title = 'Set Up Two-Factor Authentication',\n afterSetupPath = '/admin',\n onSetupComplete,\n}: TwoFactorSetupViewProps) {\n const [step, setStep] = useState<'loading' | 'qr' | 'verify' | 'backup' | 'complete'>('loading')\n const [totpUri, setTotpUri] = useState<string | null>(null)\n const [secret, setSecret] = useState<string | null>(null)\n const [backupCodes, setBackupCodes] = useState<string[]>([])\n const [verificationCode, setVerificationCode] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [loading, setLoading] = useState(false)\n\n useEffect(() => {\n async function enableTwoFactor() {\n try {\n const response = await fetch('/api/auth/two-factor/enable', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({}),\n })\n\n if (response.ok) {\n const data = await response.json()\n setTotpUri(data.totpURI)\n setSecret(data.secret)\n setBackupCodes(data.backupCodes || [])\n setStep('qr')\n } else {\n const data = await response.json().catch(() => ({}))\n setError(data.message || 'Failed to enable two-factor authentication.')\n setStep('qr')\n }\n } catch {\n setError('An error occurred. Please try again.')\n setStep('qr')\n }\n }\n enableTwoFactor()\n }, [])\n\n async function handleVerify(e: FormEvent) {\n e.preventDefault()\n setLoading(true)\n setError(null)\n\n try {\n const response = await fetch('/api/auth/two-factor/verify-totp', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ code: verificationCode }),\n })\n\n if (response.ok) {\n if (backupCodes.length > 0) {\n setStep('backup')\n } else {\n setStep('complete')\n onSetupComplete?.()\n }\n } else {\n const data = await response.json().catch(() => ({}))\n setError(data.message || 'Invalid verification code. Please try again.')\n }\n } catch {\n setError('An error occurred. Please try again.')\n } finally {\n setLoading(false)\n }\n }\n\n function handleBackupContinue() {\n setStep('complete')\n onSetupComplete?.()\n }\n\n // Loading state\n if (step === 'loading') {\n return (\n <div\n style={{\n minHeight: '100vh',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'var(--theme-bg)',\n }}\n >\n <div style={{ color: 'var(--theme-text)', opacity: 0.7 }}>\n Setting up two-factor authentication...\n </div>\n </div>\n )\n }\n\n // Complete state\n if (step === 'complete') {\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 textAlign: 'center',\n }}\n >\n {logo && (\n <div style={{ marginBottom: 'calc(var(--base) * 1.5)' }}>\n {logo}\n </div>\n )}\n\n <h1\n style={{\n color: 'var(--theme-success-500)',\n fontSize: 'var(--font-size-h3)',\n fontWeight: 600,\n margin: '0 0 var(--base) 0',\n }}\n >\n Two-Factor Enabled!\n </h1>\n\n <p\n style={{\n color: 'var(--theme-text)',\n opacity: 0.8,\n marginBottom: 'calc(var(--base) * 1.5)',\n fontSize: 'var(--font-size-small)',\n }}\n >\n Your account is now protected with two-factor authentication.\n </p>\n\n <a\n href={afterSetupPath}\n style={{\n display: 'inline-block',\n padding: 'calc(var(--base) * 0.75) calc(var(--base) * 1.5)',\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 textDecoration: 'none',\n }}\n >\n Continue\n </a>\n </div>\n </div>\n )\n }\n\n // Backup codes state\n if (step === 'backup') {\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: '450px',\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 Save Your Backup Codes\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 Store these codes safely. You can use them to access your account if you lose your authenticator.\n </p>\n\n <div\n style={{\n background: 'var(--theme-elevation-100)',\n padding: 'var(--base)',\n borderRadius: 'var(--style-radius-s)',\n marginBottom: 'calc(var(--base) * 1.5)',\n fontFamily: 'monospace',\n fontSize: 'var(--font-size-small)',\n }}\n >\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: 'calc(var(--base) * 0.5)',\n }}\n >\n {backupCodes.map((code, index) => (\n <div\n key={index}\n style={{\n color: 'var(--theme-text)',\n padding: 'calc(var(--base) * 0.25)',\n }}\n >\n {code}\n </div>\n ))}\n </div>\n </div>\n\n <button\n onClick={() => {\n navigator.clipboard.writeText(backupCodes.join('\\n'))\n }}\n style={{\n width: '100%',\n padding: 'calc(var(--base) * 0.5)',\n background: 'var(--theme-elevation-150)',\n border: 'none',\n borderRadius: 'var(--style-radius-s)',\n color: 'var(--theme-text)',\n fontSize: 'var(--font-size-small)',\n cursor: 'pointer',\n marginBottom: 'var(--base)',\n }}\n >\n Copy to Clipboard\n </button>\n\n <button\n onClick={handleBackupContinue}\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: 'pointer',\n }}\n >\n I've Saved My Codes\n </button>\n </div>\n </div>\n )\n }\n\n // QR code and verify state\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 Scan the QR code with your authenticator app, then enter the code below.\n </p>\n\n {totpUri && (\n <div\n style={{\n textAlign: 'center',\n marginBottom: 'calc(var(--base) * 1.5)',\n }}\n >\n {/* QR code using QRServer.com API */}\n <img\n src={`https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=${encodeURIComponent(totpUri)}`}\n alt=\"QR Code for authenticator app\"\n style={{\n width: '200px',\n height: '200px',\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: 'var(--style-radius-s)',\n }}\n />\n </div>\n )}\n\n {secret && (\n <div\n style={{\n marginBottom: 'calc(var(--base) * 1.5)',\n textAlign: 'center',\n }}\n >\n <p\n style={{\n color: 'var(--theme-text)',\n opacity: 0.7,\n fontSize: 'var(--font-size-small)',\n marginBottom: 'calc(var(--base) * 0.5)',\n }}\n >\n Or enter this code manually:\n </p>\n <code\n style={{\n display: 'inline-block',\n padding: 'calc(var(--base) * 0.5)',\n background: 'var(--theme-elevation-100)',\n borderRadius: 'var(--style-radius-s)',\n fontFamily: 'monospace',\n fontSize: 'var(--font-size-small)',\n color: 'var(--theme-text)',\n wordBreak: 'break-all',\n }}\n >\n {secret}\n </code>\n </div>\n )}\n\n <form onSubmit={handleVerify}>\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 Verification Code\n </label>\n <input\n id=\"code\"\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n autoComplete=\"one-time-code\"\n value={verificationCode}\n onChange={(e) => setVerificationCode(e.target.value.replace(/\\D/g, '').slice(0, 6))}\n required\n placeholder=\"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: '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 || verificationCode.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 || verificationCode.length !== 6 ? 'not-allowed' : 'pointer',\n opacity: loading || verificationCode.length !== 6 ? 0.7 : 1,\n transition: 'opacity 150ms ease',\n }}\n >\n {loading ? 'Verifying...' : 'Verify and Enable'}\n </button>\n </form>\n </div>\n </div>\n )\n}\n\nexport default TwoFactorSetupView\n"],"names":["useState","useEffect","TwoFactorSetupView","logo","title","afterSetupPath","onSetupComplete","step","setStep","totpUri","setTotpUri","secret","setSecret","backupCodes","setBackupCodes","verificationCode","setVerificationCode","error","setError","loading","setLoading","enableTwoFactor","response","fetch","method","headers","credentials","body","JSON","stringify","ok","data","json","totpURI","catch","message","handleVerify","e","preventDefault","code","length","handleBackupContinue","div","style","minHeight","display","alignItems","justifyContent","background","color","opacity","padding","borderRadius","boxShadow","width","maxWidth","textAlign","marginBottom","h1","fontSize","fontWeight","margin","p","a","href","border","textDecoration","fontFamily","gridTemplateColumns","gap","map","index","button","onClick","navigator","clipboard","writeText","join","cursor","img","src","encodeURIComponent","alt","height","wordBreak","form","onSubmit","label","htmlFor","input","id","type","inputMode","pattern","autoComplete","value","onChange","target","replace","slice","required","placeholder","letterSpacing","outline","boxSizing","disabled","transition"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TwoFactorVerifyView.d.ts","sourceRoot":"","sources":["../../../src/components/twoFactor/TwoFactorVerifyView.tsx"],"names":[],"mappings":"AAKA,MAAM,MAAM,wBAAwB,GAAG;IACrC,0BAA0B;IAC1B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAA;CAC9B,CAAA;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,KAAmC,EACnC,eAA0B,EAC1B,gBAAgB,GACjB,EAAE,wBAAwB,+BAiN1B;AAED,eAAe,mBAAmB,CAAA"}
@@ -1 +0,0 @@
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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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/twoFactor/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AAC1F,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,0BAA0B,CAAA"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/exports/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAE3D;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;qCAkBf,CAAC;qCAAkD,CAAC;;;;;;;;;iCAS3C,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAoBwnC,CAAC;qCAAkD,CAAC;;;;;;;;;iCAA8Q,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAA65I,CAAC;;;;;;;;;;;;;;;;;qCAAmnB,CAAC;qCAAkD,CAAC;;;;;;;;;iCAA8Q,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAAu2J,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAAyuC,CAAC;qCAAkD,CAAC;;;;;;;;;iCAA8Q,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAAsxD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAAhuZ,CAAC;;;;;;;;;;;;;;gCAA4Z,CAAC;uCAAgD,CAAC;;;;+DAA0P,CAAC;;;;gDAA+H,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;iFAAi5C,CAAC;;;;;;;;;;;;;gCAA0d,CAAC;;;;;;;;;;;;;;;;;;;uCAAgzB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAA84Q,CAAC;qCAAkD,CAAC;;;;;;;;;iCAA8Q,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAAkyX,CAAC;qCAAkD,CAAC;;;;;;;;;iCAA8Q,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAAi5D,CAAC;qCAAkD,CAAC;;;;;;;;;iCAA8Q,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAAh93B,CAAC;qCAAkD,CAAC;;;;;;;;;iCAA8Q,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["/**\n * Client-side auth utilities\n * Re-exports createAuthClient from better-auth/react and common plugins\n */\n\nimport { createAuthClient } from 'better-auth/react'\nimport { twoFactorClient, apiKeyClient } from 'better-auth/client/plugins'\nimport { passkeyClient } from '@better-auth/passkey/client'\n\n// Re-export createAuthClient and common plugins\nexport { createAuthClient } from 'better-auth/react'\nexport { twoFactorClient, apiKeyClient } from 'better-auth/client/plugins'\nexport { passkeyClient } from '@better-auth/passkey/client'\n\n/**\n * Default plugins included with Payload Better Auth.\n * Use this with createAuthClient when you need custom plugins with full type safety.\n *\n * @example With custom plugins (full type safety)\n * ```typescript\n * import { createAuthClient, payloadAuthPlugins } from '@delmaredigital/payload-better-auth/client'\n * import { stripeClient } from '@better-auth/stripe/client'\n *\n * export const authClient = createAuthClient({\n * plugins: [...payloadAuthPlugins, stripeClient({ subscription: true })],\n * })\n *\n * // authClient.subscription is fully typed!\n * ```\n */\nexport const payloadAuthPlugins = [\n twoFactorClient(),\n apiKeyClient(),\n passkeyClient(),\n] as const\n\nexport interface PayloadAuthClientOptions {\n /** Base URL for auth endpoints (defaults to window.location.origin) */\n baseURL?: string\n}\n\n/**\n * Create a pre-configured auth client with default plugins (twoFactor, apiKey, passkey).\n *\n * This is a convenience wrapper for simple setups. For custom plugins with full type\n * safety, use `createAuthClient` with `payloadAuthPlugins` instead.\n *\n * @param options - Optional configuration\n * @param options.baseURL - Base URL for auth endpoints (defaults to window.location.origin)\n *\n * @example Basic usage (no custom plugins)\n * ```typescript\n * import { createPayloadAuthClient } from '@delmaredigital/payload-better-auth/client'\n *\n * export const authClient = createPayloadAuthClient()\n * ```\n *\n * @example With custom plugins (use createAuthClient for full type safety)\n * ```typescript\n * import { createAuthClient, payloadAuthPlugins } from '@delmaredigital/payload-better-auth/client'\n * import { stripeClient } from '@better-auth/stripe/client'\n *\n * export const authClient = createAuthClient({\n * plugins: [...payloadAuthPlugins, stripeClient({ subscription: true })],\n * })\n * ```\n */\nexport function createPayloadAuthClient(options?: PayloadAuthClientOptions) {\n return createAuthClient({\n baseURL:\n options?.baseURL ??\n (typeof window !== 'undefined' ? window.location.origin : ''),\n plugins: [...payloadAuthPlugins],\n })\n}\n\nexport type PayloadAuthClient = ReturnType<typeof createPayloadAuthClient>\n"],"names":["createAuthClient","twoFactorClient","apiKeyClient","passkeyClient","payloadAuthPlugins","createPayloadAuthClient","options","baseURL","window","location","origin","plugins"],"mappings":"AAAA;;;CAGC,GAED,SAASA,gBAAgB,QAAQ,oBAAmB;AACpD,SAASC,eAAe,EAAEC,YAAY,QAAQ,6BAA4B;AAC1E,SAASC,aAAa,QAAQ,8BAA6B;AAE3D,gDAAgD;AAChD,SAASH,gBAAgB,QAAQ,oBAAmB;AACpD,SAASC,eAAe,EAAEC,YAAY,QAAQ,6BAA4B;AAC1E,SAASC,aAAa,QAAQ,8BAA6B;AAE3D;;;;;;;;;;;;;;;CAeC,GACD,OAAO,MAAMC,qBAAqB;IAChCH;IACAC;IACAC;CACD,CAAS;AAOV;;;;;;;;;;;;;;;;;;;;;;;;;CAyBC,GACD,OAAO,SAASE,wBAAwBC,OAAkC;IACxE,OAAON,iBAAiB;QACtBO,SACED,SAASC,WACR,CAAA,OAAOC,WAAW,cAAcA,OAAOC,QAAQ,CAACC,MAAM,GAAG,EAAC;QAC7DC,SAAS;eAAIP;SAAmB;IAClC;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/exports/components.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,YAAY,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAGtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAA;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAA;AAC7E,YAAY,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAA;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAA;AAG3E,YAAY,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAA;AAC5F,OAAO,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAA;AAClF,YAAY,EAAE,wBAAwB,EAAE,MAAM,gDAAgD,CAAA;AAC9F,OAAO,EAAE,mBAAmB,EAAE,MAAM,gDAAgD,CAAA;AAGpF,YAAY,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAA;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAA;AAC1E,YAAY,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAA;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/exports/components.ts"],"sourcesContent":["/**\n * Admin Components for Better Auth\n *\n * These components are auto-injected when disableLocalStrategy is detected.\n * They can also be used standalone or customized.\n */\n\nexport { LogoutButton } from '../components/LogoutButton.js'\nexport type { BeforeLoginProps } from '../components/BeforeLogin.js'\nexport { BeforeLogin } from '../components/BeforeLogin.js'\nexport type { LoginViewProps } from '../components/LoginView.js'\nexport { LoginView } from '../components/LoginView.js'\n\n// Password reset components\nexport type { ForgotPasswordViewProps } from '../components/auth/ForgotPasswordView.js'\nexport { ForgotPasswordView } from '../components/auth/ForgotPasswordView.js'\nexport type { ResetPasswordViewProps } from '../components/auth/ResetPasswordView.js'\nexport { ResetPasswordView } from '../components/auth/ResetPasswordView.js'\n\n// Two-factor authentication components\nexport type { TwoFactorSetupViewProps } from '../components/twoFactor/TwoFactorSetupView.js'\nexport { TwoFactorSetupView } from '../components/twoFactor/TwoFactorSetupView.js'\nexport type { TwoFactorVerifyViewProps } from '../components/twoFactor/TwoFactorVerifyView.js'\nexport { TwoFactorVerifyView } from '../components/twoFactor/TwoFactorVerifyView.js'\n\n// Passkey authentication\nexport type { PasskeySignInButtonProps } from '../components/PasskeySignInButton.js'\nexport { PasskeySignInButton } from '../components/PasskeySignInButton.js'\nexport type { PasskeyRegisterButtonProps } from '../components/PasskeyRegisterButton.js'\nexport { PasskeyRegisterButton } from '../components/PasskeyRegisterButton.js'\n"],"names":["LogoutButton","BeforeLogin","LoginView","ForgotPasswordView","ResetPasswordView","TwoFactorSetupView","TwoFactorVerifyView","PasskeySignInButton","PasskeyRegisterButton"],"mappings":"AAAA;;;;;CAKC,GAED,SAASA,YAAY,QAAQ,gCAA+B;AAE5D,SAASC,WAAW,QAAQ,+BAA8B;AAE1D,SAASC,SAAS,QAAQ,6BAA4B;AAItD,SAASC,kBAAkB,QAAQ,2CAA0C;AAE7E,SAASC,iBAAiB,QAAQ,0CAAyC;AAI3E,SAASC,kBAAkB,QAAQ,gDAA+C;AAElF,SAASC,mBAAmB,QAAQ,iDAAgD;AAIpF,SAASC,mBAAmB,QAAQ,uCAAsC;AAE1E,SAASC,qBAAqB,QAAQ,yCAAwC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"management.d.ts","sourceRoot":"","sources":["../../src/exports/management.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,mCAAmC,CAAA;AAE1C,YAAY,EACV,qBAAqB,EACrB,8BAA8B,EAC9B,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,mCAAmC,CAAA;AAG1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AACvE,YAAY,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/exports/management.ts"],"sourcesContent":["/**\n * Management UI Components Export\n *\n * Client components for managing security features in the Payload admin panel.\n * For server component views, use the './rsc' export.\n */\n\n// Client components\nexport {\n SecurityNavLinks,\n TwoFactorManagementClient,\n ApiKeysManagementClient,\n PasskeysManagementClient,\n} from '../components/management/index.js'\n\nexport type {\n SecurityNavLinksProps,\n TwoFactorManagementClientProps,\n ApiKeysManagementClientProps,\n PasskeysManagementClientProps,\n} from '../components/management/index.js'\n\n// Re-export plugin detection utility\nexport { detectEnabledPlugins } from '../utils/detectEnabledPlugins.js'\nexport type { EnabledPluginsResult } from '../utils/detectEnabledPlugins.js'\n"],"names":["SecurityNavLinks","TwoFactorManagementClient","ApiKeysManagementClient","PasskeysManagementClient","detectEnabledPlugins"],"mappings":"AAAA;;;;;CAKC,GAED,oBAAoB;AACpB,SACEA,gBAAgB,EAChBC,yBAAyB,EACzBC,uBAAuB,EACvBC,wBAAwB,QACnB,oCAAmC;AAS1C,qCAAqC;AACrC,SAASC,oBAAoB,QAAQ,mCAAkC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rsc.d.ts","sourceRoot":"","sources":["../../src/exports/rsc.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,iDAAiD,CAAA;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAA;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,gDAAgD,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/exports/rsc.ts"],"sourcesContent":["/**\n * React Server Component Views for Better Auth\n *\n * These async server components use DefaultTemplate for proper\n * integration with Payload's admin panel layout.\n */\n\nexport { LoginViewWrapper } from '../components/LoginViewWrapper.js'\nexport { TwoFactorView } from '../components/management/views/TwoFactorView.js'\nexport { ApiKeysView } from '../components/management/views/ApiKeysView.js'\nexport { PasskeysView } from '../components/management/views/PasskeysView.js'\n"],"names":["LoginViewWrapper","TwoFactorView","ApiKeysView","PasskeysView"],"mappings":"AAAA;;;;;CAKC,GAED,SAASA,gBAAgB,QAAQ,oCAAmC;AACpE,SAASC,aAAa,QAAQ,kDAAiD;AAC/E,SAASC,WAAW,QAAQ,gDAA+C;AAC3E,SAASC,YAAY,QAAQ,iDAAgD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"generated-types.d.ts","sourceRoot":"","sources":["../src/generated-types.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/generated-types.ts"],"sourcesContent":["/**\n * Auto-generated Better Auth types.\n * DO NOT EDIT - Run `pnpm generate:types` to regenerate.\n *\n * Generated from Better Auth schema introspection.\n * Contains types for all supported plugins and their field additions.\n */\n\nexport type BaseUserFields = {\n name: string\n email: string\n emailVerified: boolean\n image?: string\n createdAt: Date\n updatedAt: Date\n role?: string\n}\n\nexport type UserPluginFields = {\n \"username\": {\n username?: string\n displayUsername?: string\n }\n \"admin\": {\n banned?: boolean\n banReason?: string\n banExpires?: Date\n }\n \"phone-number\": {\n phoneNumber?: string\n phoneNumberVerified?: boolean\n }\n \"anonymous\": {\n isAnonymous?: boolean\n }\n \"two-factor\": {\n twoFactorEnabled?: boolean\n }\n}\n\nexport type User = BaseUserFields & UserPluginFields[\"username\"] & UserPluginFields[\"admin\"] & UserPluginFields[\"phone-number\"] & UserPluginFields[\"anonymous\"] & UserPluginFields[\"two-factor\"]\n\nexport type BaseSessionFields = {\n expiresAt: Date\n token: string\n createdAt: Date\n updatedAt: Date\n ipAddress?: string\n userAgent?: string\n userId: string\n}\n\nexport type SessionPluginFields = {\n \"admin\": {\n impersonatedBy?: string\n }\n \"organization\": {\n activeOrganizationId?: string\n activeTeamId?: string\n }\n}\n\nexport type Session = BaseSessionFields & SessionPluginFields[\"admin\"] & SessionPluginFields[\"organization\"]\n\nexport type BaseAccountFields = {\n accountId: string\n providerId: string\n userId: string\n accessToken?: string\n refreshToken?: string\n idToken?: string\n accessTokenExpiresAt?: Date\n refreshTokenExpiresAt?: Date\n scope?: string\n password?: string\n createdAt: Date\n updatedAt: Date\n}\n\nexport type Account = BaseAccountFields\n\nexport type BaseVerificationFields = {\n identifier: string\n value: string\n expiresAt: Date\n createdAt: Date\n updatedAt: Date\n}\n\nexport type Verification = BaseVerificationFields\n\nexport type ApikeyFields = {\n name?: string\n start?: string\n prefix?: string\n key: string\n userId: string\n refillInterval?: number\n refillAmount?: number\n lastRefillAt?: Date\n enabled?: boolean\n rateLimitEnabled?: boolean\n rateLimitTimeWindow?: number\n rateLimitMax?: number\n requestCount?: number\n remaining?: number\n lastRequest?: Date\n expiresAt?: Date\n createdAt: Date\n updatedAt: Date\n permissions?: string\n metadata?: string\n}\n\nexport type Apikey = ApikeyFields\n\nexport type PasskeyFields = {\n name?: string\n publicKey: string\n userId: string\n credentialID: string\n counter: number\n deviceType: string\n backedUp: boolean\n transports?: string\n createdAt?: Date\n aaguid?: string\n}\n\nexport type Passkey = PasskeyFields\n\nexport type OauthApplicationFields = {\n name?: string\n icon?: string\n metadata?: string\n clientId?: string\n clientSecret?: string\n redirectUrls?: string\n type?: string\n disabled?: boolean\n userId?: string\n createdAt?: Date\n updatedAt?: Date\n}\n\nexport type OauthApplication = OauthApplicationFields\n\nexport type OauthAccessTokenFields = {\n accessToken?: string\n refreshToken?: string\n accessTokenExpiresAt?: Date\n refreshTokenExpiresAt?: Date\n clientId?: string\n userId?: string\n scopes?: string\n createdAt?: Date\n updatedAt?: Date\n}\n\nexport type OauthAccessToken = OauthAccessTokenFields\n\nexport type OauthConsentFields = {\n clientId?: string\n userId?: string\n scopes?: string\n createdAt?: Date\n updatedAt?: Date\n consentGiven?: boolean\n}\n\nexport type OauthConsent = OauthConsentFields\n\nexport type OrganizationFields = {\n name: string\n slug: string\n logo?: string\n createdAt: Date\n metadata?: string\n}\n\nexport type Organization = OrganizationFields\n\nexport type TeamFields = {\n name: string\n organizationId: string\n createdAt: Date\n updatedAt?: Date\n}\n\nexport type Team = TeamFields\n\nexport type TeamMemberFields = {\n teamId: string\n userId: string\n createdAt?: Date\n}\n\nexport type TeamMember = TeamMemberFields\n\nexport type MemberFields = {\n organizationId: string\n userId: string\n role: string\n createdAt: Date\n}\n\nexport type Member = MemberFields\n\nexport type InvitationFields = {\n organizationId: string\n email: string\n role?: string\n teamId?: string\n status: string\n expiresAt: Date\n createdAt: Date\n inviterId: string\n}\n\nexport type Invitation = InvitationFields\n\nexport type JwksFields = {\n publicKey: string\n privateKey: string\n createdAt: Date\n expiresAt?: Date\n}\n\nexport type Jwks = JwksFields\n\nexport type TwoFactorFields = {\n secret: string\n backupCodes: string\n userId: string\n}\n\nexport type TwoFactor = TwoFactorFields\n\n/**\n * Union of all supported plugin identifiers.\n */\nexport type PluginId = \"username\" | \"admin\" | \"api-key\" | \"passkey\" | \"bearer\" | \"email-otp\" | \"magic-link\" | \"phone-number\" | \"one-tap\" | \"anonymous\" | \"multi-session\" | \"one-time-token\" | \"oidc\" | \"generic-oauth\" | \"open-api\" | \"organization\" | \"jwt\" | \"two-factor\"\n\n/**\n * Complete schema mapping of all models to their types.\n */\nexport type BetterAuthFullSchema = {\n \"user\": User\n \"session\": Session\n \"account\": Account\n \"verification\": Verification\n \"apikey\": Apikey\n \"passkey\": Passkey\n \"oauthApplication\": OauthApplication\n \"oauthAccessToken\": OauthAccessToken\n \"oauthConsent\": OauthConsent\n \"organization\": Organization\n \"team\": Team\n \"teamMember\": TeamMember\n \"member\": Member\n \"invitation\": Invitation\n \"jwks\": Jwks\n \"twoFactor\": TwoFactor\n}\n\n/**\n * Union of all model names in the schema.\n */\nexport type ModelKey = keyof BetterAuthFullSchema\n"],"names":[],"mappings":"AAAA;;;;;;CAMC,GAmQD;;CAEC,GACD,WAAiD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAG9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAChE,YAAY,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAA;AAG5E,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EACV,IAAI,EACJ,kBAAkB,EAClB,uBAAuB,EACvB,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,mBAAmB,CAAA;AAG1B,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,4BAA4B,EAC5B,4BAA4B,EAC5B,sBAAsB,EACtB,SAAS,GACV,MAAM,uBAAuB,CAAA;AAG9B,YAAY,EACV,IAAI,EACJ,OAAO,IAAI,iBAAiB,EAC5B,OAAO,EACP,YAAY,EACZ,MAAM,EACN,OAAO,EACP,YAAY,EACZ,MAAM,EACN,UAAU,EACV,IAAI,EACJ,UAAU,EACV,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,QAAQ,EACR,QAAQ,GACT,MAAM,sBAAsB,CAAA;AAG7B,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,cAAc,GACf,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EACL,6BAA6B,EAC7B,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,2BAA2B,CAAA;AAGlC,OAAO,EACL,cAAc,EACd,UAAU,EACV,WAAW,EACX,aAAa,EACb,OAAO,EACP,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,OAAO,EACP,YAAY,EACZ,eAAe,GAChB,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EACL,wBAAwB,EACxB,aAAa,EACb,QAAQ,EACR,WAAW,IAAI,cAAc,EAC7B,YAAY,IAAI,eAAe,EAC/B,YAAY,EACZ,eAAe,EACf,gBAAgB,IAAI,mBAAmB,EACvC,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,GACf,MAAM,yBAAyB,CAAA;AAChC,YAAY,EACV,UAAU,EACV,kBAAkB,GACnB,MAAM,yBAAyB,CAAA;AAGhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAC9D,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAGtE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACpE,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAGjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAC/D,YAAY,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAGtE,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA"}