@better-auth-ui/heroui 1.6.1 → 1.6.3

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 (117) hide show
  1. package/dist/components/auth/auth-provider.d.ts +1 -1
  2. package/dist/components/auth/auth-provider.js +16 -11
  3. package/dist/components/auth/auth.d.ts +4 -4
  4. package/dist/components/auth/auth.js +36 -41
  5. package/dist/components/auth/error-toaster.d.ts +1 -0
  6. package/dist/components/auth/error-toaster.js +17 -0
  7. package/dist/components/auth/field-separator.d.ts +1 -1
  8. package/dist/components/auth/field-separator.js +17 -4
  9. package/dist/components/auth/forgot-password.d.ts +2 -2
  10. package/dist/components/auth/forgot-password.js +66 -27
  11. package/dist/components/auth/magic-link-button.d.ts +1 -1
  12. package/dist/components/auth/magic-link-button.js +15 -18
  13. package/dist/components/auth/magic-link.d.ts +3 -3
  14. package/dist/components/auth/magic-link.js +98 -43
  15. package/dist/components/auth/passkey-button.js +20 -12
  16. package/dist/components/auth/provider-button.d.ts +15 -0
  17. package/dist/components/auth/provider-button.js +29 -0
  18. package/dist/components/auth/provider-buttons.d.ts +4 -10
  19. package/dist/components/auth/provider-buttons.js +19 -33
  20. package/dist/components/auth/reset-password.d.ts +2 -2
  21. package/dist/components/auth/reset-password.js +143 -57
  22. package/dist/components/auth/sign-in.d.ts +3 -3
  23. package/dist/components/auth/sign-in.js +151 -64
  24. package/dist/components/auth/sign-out.js +26 -32
  25. package/dist/components/auth/sign-up.d.ts +3 -3
  26. package/dist/components/auth/sign-up.js +231 -70
  27. package/dist/components/email/email-changed-email.d.ts +2 -2
  28. package/dist/components/email/email-changed-email.js +29 -22
  29. package/dist/components/email/email-verification-email.d.ts +2 -2
  30. package/dist/components/email/email-verification-email.js +29 -22
  31. package/dist/components/email/magic-link-email.d.ts +2 -2
  32. package/dist/components/email/magic-link-email.js +29 -22
  33. package/dist/components/email/new-device-email.d.ts +2 -2
  34. package/dist/components/email/new-device-email.js +29 -22
  35. package/dist/components/email/otp-email.d.ts +2 -2
  36. package/dist/components/email/otp-email.js +28 -21
  37. package/dist/components/email/password-changed-email.d.ts +2 -2
  38. package/dist/components/email/password-changed-email.js +29 -22
  39. package/dist/components/email/reset-password-email.d.ts +2 -2
  40. package/dist/components/email/reset-password-email.js +29 -22
  41. package/dist/components/settings/account/account-settings.d.ts +2 -2
  42. package/dist/components/settings/account/account-settings.js +22 -19
  43. package/dist/components/settings/account/appearance.d.ts +2 -2
  44. package/dist/components/settings/account/appearance.js +70 -27
  45. package/dist/components/settings/account/change-avatar.js +88 -55
  46. package/dist/components/settings/account/change-email.d.ts +2 -2
  47. package/dist/components/settings/account/change-email.js +53 -28
  48. package/dist/components/settings/account/manage-account.d.ts +1 -1
  49. package/dist/components/settings/account/manage-account.js +47 -31
  50. package/dist/components/settings/account/manage-accounts.d.ts +2 -2
  51. package/dist/components/settings/account/manage-accounts.js +32 -36
  52. package/dist/components/settings/account/user-profile.d.ts +4 -4
  53. package/dist/components/settings/account/user-profile.js +102 -22
  54. package/dist/components/settings/security/active-session.d.ts +1 -1
  55. package/dist/components/settings/security/active-session.js +57 -51
  56. package/dist/components/settings/security/active-sessions.d.ts +2 -2
  57. package/dist/components/settings/security/active-sessions.js +32 -26
  58. package/dist/components/settings/security/change-password.d.ts +2 -2
  59. package/dist/components/settings/security/change-password.js +186 -76
  60. package/dist/components/settings/security/danger-zone.d.ts +2 -2
  61. package/dist/components/settings/security/danger-zone.js +17 -11
  62. package/dist/components/settings/security/delete-user.d.ts +2 -2
  63. package/dist/components/settings/security/delete-user.js +91 -46
  64. package/dist/components/settings/security/linked-account.d.ts +1 -1
  65. package/dist/components/settings/security/linked-account.js +55 -47
  66. package/dist/components/settings/security/linked-accounts.d.ts +2 -2
  67. package/dist/components/settings/security/linked-accounts.js +43 -40
  68. package/dist/components/settings/security/passkey.js +42 -13
  69. package/dist/components/settings/security/passkeys.d.ts +2 -2
  70. package/dist/components/settings/security/passkeys.js +51 -19
  71. package/dist/components/settings/security/security-settings.d.ts +2 -2
  72. package/dist/components/settings/security/security-settings.js +24 -21
  73. package/dist/components/settings/settings.d.ts +3 -3
  74. package/dist/components/settings/settings.js +44 -27
  75. package/dist/components/user/switch-account-item.d.ts +1 -1
  76. package/dist/components/user/switch-account-item.js +19 -15
  77. package/dist/components/user/switch-account-menu.js +27 -28
  78. package/dist/components/user/user-avatar.d.ts +3 -3
  79. package/dist/components/user/user-avatar.js +28 -30
  80. package/dist/components/user/user-button.d.ts +1 -1
  81. package/dist/components/user/user-button.js +90 -23
  82. package/dist/components/user/user-view.d.ts +3 -3
  83. package/dist/components/user/user-view.js +36 -23
  84. package/dist/core.d.ts +1 -1
  85. package/dist/index.d.ts +36 -35
  86. package/dist/index.js +37 -35
  87. package/dist/react-exports.d.ts +1 -1
  88. package/package.json +15 -11
  89. package/src/components/auth/auth-provider.tsx +4 -0
  90. package/src/components/auth/auth.tsx +2 -2
  91. package/src/components/auth/error-toaster.tsx +25 -0
  92. package/src/components/auth/forgot-password.tsx +1 -2
  93. package/src/components/auth/magic-link.tsx +3 -23
  94. package/src/components/auth/passkey-button.tsx +1 -2
  95. package/src/components/auth/provider-button.tsx +67 -0
  96. package/src/components/auth/provider-buttons.tsx +26 -43
  97. package/src/components/auth/reset-password.tsx +1 -2
  98. package/src/components/auth/sign-in.tsx +63 -48
  99. package/src/components/auth/sign-up.tsx +99 -20
  100. package/src/components/settings/account/appearance.tsx +1 -1
  101. package/src/components/settings/account/change-avatar.tsx +1 -3
  102. package/src/components/settings/account/change-email.tsx +2 -3
  103. package/src/components/settings/account/manage-account.tsx +1 -4
  104. package/src/components/settings/account/manage-accounts.tsx +3 -8
  105. package/src/components/settings/account/user-profile.tsx +122 -8
  106. package/src/components/settings/security/active-session.tsx +0 -1
  107. package/src/components/settings/security/active-sessions.tsx +3 -8
  108. package/src/components/settings/security/change-password.tsx +7 -4
  109. package/src/components/settings/security/delete-user.tsx +1 -4
  110. package/src/components/settings/security/linked-account.tsx +4 -14
  111. package/src/components/settings/security/linked-accounts.tsx +3 -8
  112. package/src/components/settings/security/passkey.tsx +2 -4
  113. package/src/components/settings/security/passkeys.tsx +4 -12
  114. package/src/components/settings/settings.tsx +1 -1
  115. package/src/components/user/switch-account-item.tsx +2 -4
  116. package/src/components/user/switch-account-menu.tsx +2 -7
  117. package/src/index.tsx +1 -0
@@ -1,4 +1,10 @@
1
- import { useAuth, useSession, useUpdateUser } from "@better-auth-ui/react"
1
+ import {
2
+ useAuth,
3
+ useIsUsernameAvailable,
4
+ useSession,
5
+ useUpdateUser
6
+ } from "@better-auth-ui/react"
7
+ import { Check, Xmark } from "@gravity-ui/icons"
2
8
  import {
3
9
  Button,
4
10
  Card,
@@ -8,13 +14,16 @@ import {
8
14
  Fieldset,
9
15
  Form,
10
16
  Input,
17
+ InputGroup,
11
18
  Label,
12
19
  Skeleton,
13
20
  Spinner,
14
21
  TextField,
15
22
  toast
16
23
  } from "@heroui/react"
17
- import type { SyntheticEvent } from "react"
24
+ import { useDebouncer } from "@tanstack/react-pacer"
25
+ import { type SyntheticEvent, useEffect, useState } from "react"
26
+
18
27
  import { ChangeAvatar } from "./change-avatar"
19
28
 
20
29
  export type UserProfileProps = {
@@ -23,27 +32,77 @@ export type UserProfileProps = {
23
32
  }
24
33
 
25
34
  /**
26
- * Render a profile card that lets the authenticated user view and update their display name and avatar.
35
+ * Render a profile card that lets the authenticated user view and update their display name, username, and avatar.
27
36
  *
28
- * @returns A JSX element containing the user profile card with avatar upload and an editable name form
37
+ * @returns A JSX element containing the user profile card with avatar upload and editable form fields
29
38
  */
30
39
  export function UserProfile({
31
40
  className,
32
41
  variant,
33
42
  ...props
34
- }: UserProfileProps & CardProps) {
35
- const { localization } = useAuth()
43
+ }: UserProfileProps & Omit<CardProps, "children">) {
44
+ const { localization, username: usernameConfig } = useAuth()
36
45
  const { data: session } = useSession()
37
46
 
47
+ const currentUsername =
48
+ (usernameConfig?.displayUsername
49
+ ? session?.user?.displayUsername
50
+ : session?.user?.username) || ""
51
+
52
+ const [username, setUsername] = useState(currentUsername)
53
+
54
+ useEffect(() => {
55
+ setUsername(currentUsername)
56
+ }, [currentUsername])
57
+
58
+ const {
59
+ mutate: isUsernameAvailable,
60
+ data: usernameData,
61
+ error: usernameError,
62
+ reset: resetUsername
63
+ } = useIsUsernameAvailable()
64
+
65
+ const usernameDebouncer = useDebouncer(
66
+ (value: string) => {
67
+ if (!value.trim() || value.trim() === currentUsername) {
68
+ resetUsername()
69
+ return
70
+ }
71
+
72
+ isUsernameAvailable({ username: value.trim() })
73
+ },
74
+ { wait: 500 }
75
+ )
76
+
77
+ function handleUsernameChange(value: string) {
78
+ setUsername(value)
79
+ resetUsername()
80
+
81
+ if (usernameConfig?.isUsernameAvailable) {
82
+ usernameDebouncer.maybeExecute(value)
83
+ }
84
+ }
85
+
38
86
  const { mutate: updateUser, isPending } = useUpdateUser({
39
- onError: (error) => toast.danger(error.error?.message || error.message),
40
87
  onSuccess: () => toast.success(localization.settings.profileUpdatedSuccess)
41
88
  })
42
89
 
43
90
  function handleSubmit(e: SyntheticEvent<HTMLFormElement>) {
44
91
  e.preventDefault()
45
92
  const formData = new FormData(e.currentTarget)
46
- updateUser({ name: formData.get("name") as string })
93
+ const name = formData.get("name") as string
94
+
95
+ updateUser({
96
+ name,
97
+ ...(usernameConfig?.enabled
98
+ ? {
99
+ username: username.trim(),
100
+ ...(usernameConfig.displayUsername
101
+ ? { displayUsername: username.trim() }
102
+ : {})
103
+ }
104
+ : {})
105
+ })
47
106
  }
48
107
 
49
108
  return (
@@ -59,6 +118,61 @@ export function UserProfile({
59
118
  <ChangeAvatar />
60
119
 
61
120
  <Fieldset.Group>
121
+ {usernameConfig?.enabled && (
122
+ <TextField
123
+ type="text"
124
+ autoComplete="username"
125
+ minLength={usernameConfig.minUsernameLength}
126
+ maxLength={usernameConfig.maxUsernameLength}
127
+ isDisabled={isPending || !session}
128
+ value={username}
129
+ onChange={handleUsernameChange}
130
+ isInvalid={
131
+ !!usernameError ||
132
+ (usernameData && !usernameData.available)
133
+ }
134
+ >
135
+ <Label>{localization.auth.username}</Label>
136
+
137
+ {session ? (
138
+ <InputGroup
139
+ variant={
140
+ variant === "transparent" ? "primary" : "secondary"
141
+ }
142
+ >
143
+ <InputGroup.Input
144
+ placeholder={localization.auth.usernamePlaceholder}
145
+ name="username"
146
+ />
147
+
148
+ {usernameConfig.isUsernameAvailable &&
149
+ username.trim() &&
150
+ username.trim() !== currentUsername && (
151
+ <InputGroup.Suffix className="px-2">
152
+ {usernameData?.available ? (
153
+ <Check className="text-success" />
154
+ ) : usernameError ||
155
+ usernameData?.available === false ? (
156
+ <Xmark className="text-danger" />
157
+ ) : (
158
+ <Spinner size="sm" color="current" />
159
+ )}
160
+ </InputGroup.Suffix>
161
+ )}
162
+ </InputGroup>
163
+ ) : (
164
+ <Skeleton className="h-10 md:h-9 w-full rounded-xl" />
165
+ )}
166
+
167
+ <FieldError>
168
+ {usernameError?.error?.message ||
169
+ usernameError?.message ||
170
+ (usernameData?.available === false &&
171
+ localization.auth.usernameTaken)}
172
+ </FieldError>
173
+ </TextField>
174
+ )}
175
+
62
176
  <TextField
63
177
  key={session?.user?.name}
64
178
  name="name"
@@ -50,7 +50,6 @@ export function ActiveSession({ activeSession }: ActiveSessionProps) {
50
50
  const { data: session } = useSession({ refetchOnMount: false })
51
51
 
52
52
  const { mutate: revokeSession, isPending: isRevoking } = useRevokeSession({
53
- onError: (error) => toast.danger(error.error?.message || error.message),
54
53
  onSuccess: () => toast.success(localization.settings.revokeSessionSuccess)
55
54
  })
56
55
 
@@ -1,5 +1,5 @@
1
1
  import { useAuth, useListSessions, useSession } from "@better-auth-ui/react"
2
- import { Card, type CardProps, cn, Skeleton, toast } from "@heroui/react"
2
+ import { Card, type CardProps, cn, Skeleton } from "@heroui/react"
3
3
  import { ActiveSession } from "./active-session"
4
4
 
5
5
  export type ActiveSessionsProps = {
@@ -19,16 +19,11 @@ export function ActiveSessions({
19
19
  className,
20
20
  variant,
21
21
  ...props
22
- }: ActiveSessionsProps & CardProps) {
22
+ }: ActiveSessionsProps & Omit<CardProps, "children">) {
23
23
  const { localization } = useAuth()
24
24
  const { data: session } = useSession()
25
25
 
26
- const { data: sessions, isPending } = useListSessions({
27
- throwOnError: (error) => {
28
- if (error.error) toast.danger(error.error.message)
29
- return false
30
- }
31
- })
26
+ const { data: sessions, isPending } = useListSessions()
32
27
 
33
28
  const activeSessions = sessions?.toSorted((activeSession) =>
34
29
  activeSession.id === session?.session.id ? -1 : 1
@@ -42,7 +42,7 @@ export function ChangePassword({
42
42
  className,
43
43
  variant,
44
44
  ...props
45
- }: ChangePasswordProps & CardProps) {
45
+ }: ChangePasswordProps & Omit<CardProps, "children">) {
46
46
  const { emailAndPassword, localization } = useAuth()
47
47
  const { data: session } = useSession()
48
48
  const { data: accounts, isPending: isAccountsPending } = useListAccounts()
@@ -67,12 +67,15 @@ export function ChangePassword({
67
67
  )
68
68
  }
69
69
 
70
- function SetPassword({ className, variant, ...props }: CardProps) {
70
+ function SetPassword({
71
+ className,
72
+ variant,
73
+ ...props
74
+ }: Omit<CardProps, "children">) {
71
75
  const { localization } = useAuth()
72
76
  const { data: session } = useSession()
73
77
 
74
78
  const { mutate: requestPasswordReset, isPending } = useRequestPasswordReset({
75
- onError: (error) => toast.danger(error.error?.message || error.message),
76
79
  onSuccess: () => toast.success(localization.auth.passwordResetEmailSent)
77
80
  })
78
81
 
@@ -125,7 +128,7 @@ function ChangePasswordForm({
125
128
  emailAndPassword: ReturnType<typeof useAuth>["emailAndPassword"]
126
129
  localization: ReturnType<typeof useAuth>["localization"]
127
130
  session: ReturnType<typeof useSession>["data"]
128
- } & CardProps) {
131
+ } & Omit<CardProps, "children">) {
129
132
  const [currentPassword, setCurrentPassword] = useState("")
130
133
  const [newPassword, setNewPassword] = useState("")
131
134
  const [confirmPassword, setConfirmPassword] = useState("")
@@ -28,7 +28,7 @@ export function DeleteUser({
28
28
  className,
29
29
  variant,
30
30
  ...props
31
- }: DeleteUserProps & CardProps) {
31
+ }: DeleteUserProps & Omit<CardProps, "children">) {
32
32
  const {
33
33
  basePaths,
34
34
  deleteUser: deleteUserConfig,
@@ -76,9 +76,6 @@ export function DeleteUser({
76
76
  replace: true
77
77
  })
78
78
  }
79
- },
80
- onError: (error) => {
81
- toast.danger(error.error?.message || error.message)
82
79
  }
83
80
  })
84
81
  }
@@ -28,23 +28,13 @@ export type LinkedAccountProps = {
28
28
  export function LinkedAccount({ account, provider }: LinkedAccountProps) {
29
29
  const { baseURL, localization } = useAuth()
30
30
 
31
- const { data: accountInfo, isPending: isLoadingInfo } = useAccountInfo(
32
- account?.accountId,
33
- {
34
- enabled: !!account,
35
- throwOnError: (error) => {
36
- if (error.error) toast.danger(error.error.message)
37
- return false
38
- }
39
- }
40
- )
41
-
42
- const { mutate: linkSocial, isPending: isLinking } = useLinkSocial({
43
- onError: (error) => toast.danger(error.error?.message || error.message)
31
+ const { data: accountInfo, isPending: isLoadingInfo } = useAccountInfo({
32
+ query: { accountId: account?.accountId }
44
33
  })
45
34
 
35
+ const { mutate: linkSocial, isPending: isLinking } = useLinkSocial()
36
+
46
37
  const { mutate: unlinkAccount, isPending: isUnlinking } = useUnlinkAccount({
47
- onError: (error) => toast.danger(error.error?.message || error.message),
48
38
  onSuccess: () => toast.success(localization.settings.accountUnlinked)
49
39
  })
50
40
 
@@ -1,5 +1,5 @@
1
1
  import { useAuth, useListAccounts } from "@better-auth-ui/react"
2
- import { Card, type CardProps, cn, Skeleton, toast } from "@heroui/react"
2
+ import { Card, type CardProps, cn, Skeleton } from "@heroui/react"
3
3
  import { LinkedAccount } from "./linked-account"
4
4
 
5
5
  export type LinkedAccountsProps = {
@@ -20,15 +20,10 @@ export function LinkedAccounts({
20
20
  className,
21
21
  variant,
22
22
  ...props
23
- }: LinkedAccountsProps & CardProps) {
23
+ }: LinkedAccountsProps & Omit<CardProps, "children">) {
24
24
  const { localization, socialProviders } = useAuth()
25
25
 
26
- const { data: accounts, isPending } = useListAccounts({
27
- throwOnError: (error) => {
28
- if (error.error) toast.danger(error.error.message)
29
- return false
30
- }
31
- })
26
+ const { data: accounts, isPending } = useListAccounts()
32
27
 
33
28
  const linkedAccounts = accounts?.filter(
34
29
  (account) => account.providerId !== "credential"
@@ -1,6 +1,6 @@
1
1
  import { useAuth, useDeletePasskey } from "@better-auth-ui/react"
2
2
  import { Fingerprint, Xmark } from "@gravity-ui/icons"
3
- import { Button, Spinner, toast } from "@heroui/react"
3
+ import { Button, Spinner } from "@heroui/react"
4
4
 
5
5
  export type PasskeyProps = {
6
6
  passkey: {
@@ -13,9 +13,7 @@ export type PasskeyProps = {
13
13
  export function Passkey({ passkey }: PasskeyProps) {
14
14
  const { localization } = useAuth()
15
15
 
16
- const { mutate: deletePasskey, isPending } = useDeletePasskey({
17
- onError: (error) => toast.danger(error.error?.message || error.message)
18
- })
16
+ const { mutate: deletePasskey, isPending } = useDeletePasskey()
19
17
 
20
18
  return (
21
19
  <div className="flex items-center gap-3">
@@ -9,8 +9,7 @@ import {
9
9
  type CardProps,
10
10
  cn,
11
11
  Skeleton,
12
- Spinner,
13
- toast
12
+ Spinner
14
13
  } from "@heroui/react"
15
14
 
16
15
  import { Passkey } from "./passkey"
@@ -24,19 +23,12 @@ export function Passkeys({
24
23
  className,
25
24
  variant,
26
25
  ...props
27
- }: PasskeysProps & CardProps) {
26
+ }: PasskeysProps & Omit<CardProps, "children">) {
28
27
  const { localization } = useAuth()
29
28
 
30
- const { data: passkeys, isPending } = useListUserPasskeys({
31
- throwOnError: (error) => {
32
- if (error.error) toast.danger(error.error.message)
33
- return false
34
- }
35
- })
29
+ const { data: passkeys, isPending } = useListUserPasskeys()
36
30
 
37
- const { mutate: addPasskey, isPending: isAdding } = useAddPasskey({
38
- onError: (error) => toast.danger(error.error?.message || error.message)
39
- })
31
+ const { mutate: addPasskey, isPending: isAdding } = useAddPasskey()
40
32
 
41
33
  return (
42
34
  <div>
@@ -1,5 +1,5 @@
1
+ import type { SettingsView } from "@better-auth-ui/core"
1
2
  import { useAuth, useAuthenticate } from "@better-auth-ui/react"
2
- import type { SettingsView } from "@better-auth-ui/react/core"
3
3
  import { type CardProps, cn, Tabs } from "@heroui/react"
4
4
  import { type ComponentProps, useMemo } from "react"
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { useSetActiveSession } from "@better-auth-ui/react"
2
- import { Dropdown, Spinner, toast } from "@heroui/react"
2
+ import { Dropdown, Spinner } from "@heroui/react"
3
3
  import type { Session, User } from "better-auth"
4
4
  import { UserView } from "./user-view"
5
5
 
@@ -19,9 +19,7 @@ export type SwitchAccountItemProps = {
19
19
  * @returns The switch account dropdown item as a JSX element
20
20
  */
21
21
  export function SwitchAccountItem({ deviceSession }: SwitchAccountItemProps) {
22
- const { mutate: setActiveSession, isPending } = useSetActiveSession({
23
- onError: (error) => toast.danger(error.error?.message || error.message)
24
- })
22
+ const { mutate: setActiveSession, isPending } = useSetActiveSession()
25
23
 
26
24
  return (
27
25
  <Dropdown.Item
@@ -4,7 +4,7 @@ import {
4
4
  useSession
5
5
  } from "@better-auth-ui/react"
6
6
  import { Check, CirclePlus } from "@gravity-ui/icons"
7
- import { Dropdown, Label, Separator, toast } from "@heroui/react"
7
+ import { Dropdown, Label, Separator } from "@heroui/react"
8
8
 
9
9
  import { SwitchAccountItem } from "./switch-account-item"
10
10
  import { UserView } from "./user-view"
@@ -21,12 +21,7 @@ import { UserView } from "./user-view"
21
21
  export function SwitchAccountMenu() {
22
22
  const { basePaths, viewPaths, localization } = useAuth()
23
23
  const { data: session } = useSession()
24
- const { data: deviceSessions, isPending } = useListDeviceSessions({
25
- throwOnError: (error) => {
26
- if (error.error) toast.danger(error.error.message)
27
- return false
28
- }
29
- })
24
+ const { data: deviceSessions, isPending } = useListDeviceSessions()
30
25
 
31
26
  return (
32
27
  <Dropdown.Popover className="min-w-40 md:min-w-56 max-w-[48svw]">
package/src/index.tsx CHANGED
@@ -6,6 +6,7 @@ export * from "./components/auth/forgot-password"
6
6
  export * from "./components/auth/magic-link"
7
7
  export * from "./components/auth/magic-link-button"
8
8
  export * from "./components/auth/passkey-button"
9
+ export * from "./components/auth/provider-button"
9
10
  export * from "./components/auth/provider-buttons"
10
11
  export * from "./components/auth/reset-password"
11
12
  export * from "./components/auth/sign-in"