@better-auth-ui/heroui 1.6.0 → 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/dist/components/auth/auth-provider.d.ts +1 -1
  2. package/dist/components/auth/auth-provider.js +15 -11
  3. package/dist/components/auth/auth.d.ts +3 -3
  4. package/dist/components/auth/auth.js +36 -41
  5. package/dist/components/auth/field-separator.d.ts +1 -1
  6. package/dist/components/auth/field-separator.js +17 -4
  7. package/dist/components/auth/forgot-password.d.ts +1 -1
  8. package/dist/components/auth/forgot-password.js +69 -27
  9. package/dist/components/auth/magic-link-button.d.ts +1 -1
  10. package/dist/components/auth/magic-link-button.js +15 -18
  11. package/dist/components/auth/magic-link.d.ts +2 -2
  12. package/dist/components/auth/magic-link.js +110 -42
  13. package/dist/components/auth/passkey-button.d.ts +4 -0
  14. package/dist/components/auth/passkey-button.js +24 -0
  15. package/dist/components/auth/provider-buttons.d.ts +1 -1
  16. package/dist/components/auth/provider-buttons.js +26 -33
  17. package/dist/components/auth/reset-password.d.ts +1 -1
  18. package/dist/components/auth/reset-password.js +146 -57
  19. package/dist/components/auth/sign-in.d.ts +2 -2
  20. package/dist/components/auth/sign-in.js +163 -63
  21. package/dist/components/auth/sign-out.js +26 -32
  22. package/dist/components/auth/sign-up.d.ts +2 -2
  23. package/dist/components/auth/sign-up.js +240 -70
  24. package/dist/components/email/email-changed-email.d.ts +2 -2
  25. package/dist/components/email/email-changed-email.js +29 -22
  26. package/dist/components/email/email-verification-email.d.ts +2 -2
  27. package/dist/components/email/email-verification-email.js +29 -22
  28. package/dist/components/email/magic-link-email.d.ts +2 -2
  29. package/dist/components/email/magic-link-email.js +29 -22
  30. package/dist/components/email/new-device-email.d.ts +2 -2
  31. package/dist/components/email/new-device-email.js +29 -22
  32. package/dist/components/email/otp-email.d.ts +2 -2
  33. package/dist/components/email/otp-email.js +28 -21
  34. package/dist/components/email/password-changed-email.d.ts +2 -2
  35. package/dist/components/email/password-changed-email.js +29 -22
  36. package/dist/components/email/reset-password-email.d.ts +2 -2
  37. package/dist/components/email/reset-password-email.js +29 -22
  38. package/dist/components/settings/account/account-settings.d.ts +2 -2
  39. package/dist/components/settings/account/account-settings.js +22 -19
  40. package/dist/components/settings/account/appearance.d.ts +1 -1
  41. package/dist/components/settings/account/appearance.js +70 -27
  42. package/dist/components/settings/account/change-avatar.js +88 -55
  43. package/dist/components/settings/account/change-email.d.ts +1 -1
  44. package/dist/components/settings/account/change-email.js +56 -28
  45. package/dist/components/settings/account/manage-account.d.ts +1 -1
  46. package/dist/components/settings/account/manage-account.js +50 -31
  47. package/dist/components/settings/account/manage-accounts.d.ts +1 -1
  48. package/dist/components/settings/account/manage-accounts.js +32 -36
  49. package/dist/components/settings/account/user-profile.d.ts +3 -3
  50. package/dist/components/settings/account/user-profile.js +105 -22
  51. package/dist/components/settings/security/active-session.d.ts +1 -1
  52. package/dist/components/settings/security/active-session.js +60 -51
  53. package/dist/components/settings/security/active-sessions.d.ts +1 -1
  54. package/dist/components/settings/security/active-sessions.js +32 -26
  55. package/dist/components/settings/security/change-password.d.ts +1 -1
  56. package/dist/components/settings/security/change-password.js +189 -76
  57. package/dist/components/settings/security/danger-zone.d.ts +2 -2
  58. package/dist/components/settings/security/danger-zone.js +17 -11
  59. package/dist/components/settings/security/delete-user.d.ts +1 -1
  60. package/dist/components/settings/security/delete-user.js +96 -46
  61. package/dist/components/settings/security/linked-account.d.ts +1 -1
  62. package/dist/components/settings/security/linked-account.js +61 -47
  63. package/dist/components/settings/security/linked-accounts.d.ts +1 -1
  64. package/dist/components/settings/security/linked-accounts.js +43 -40
  65. package/dist/components/settings/security/passkey.d.ts +8 -0
  66. package/dist/components/settings/security/passkey.js +43 -0
  67. package/dist/components/settings/security/passkeys.d.ts +6 -0
  68. package/dist/components/settings/security/passkeys.js +53 -0
  69. package/dist/components/settings/security/security-settings.d.ts +2 -2
  70. package/dist/components/settings/security/security-settings.js +24 -20
  71. package/dist/components/settings/settings.d.ts +3 -3
  72. package/dist/components/settings/settings.js +44 -27
  73. package/dist/components/user/switch-account-item.d.ts +1 -1
  74. package/dist/components/user/switch-account-item.js +19 -15
  75. package/dist/components/user/switch-account-menu.js +27 -28
  76. package/dist/components/user/user-avatar.d.ts +3 -3
  77. package/dist/components/user/user-avatar.js +28 -30
  78. package/dist/components/user/user-button.d.ts +1 -1
  79. package/dist/components/user/user-button.js +90 -23
  80. package/dist/components/user/user-view.d.ts +3 -3
  81. package/dist/components/user/user-view.js +36 -23
  82. package/dist/core.d.ts +1 -1
  83. package/dist/index.d.ts +35 -33
  84. package/dist/index.js +36 -33
  85. package/dist/react-exports.d.ts +1 -1
  86. package/package.json +17 -10
  87. package/src/components/auth/auth.tsx +1 -1
  88. package/src/components/auth/magic-link.tsx +4 -0
  89. package/src/components/auth/passkey-button.tsx +36 -0
  90. package/src/components/auth/sign-in.tsx +67 -30
  91. package/src/components/auth/sign-up.tsx +97 -3
  92. package/src/components/settings/account/user-profile.tsx +121 -6
  93. package/src/components/settings/security/passkey.tsx +51 -0
  94. package/src/components/settings/security/passkeys.tsx +104 -0
  95. package/src/components/settings/security/security-settings.tsx +3 -1
  96. package/src/components/settings/settings.tsx +1 -1
  97. package/src/index.tsx +2 -0
  98. package/dist/components/account/account.d.ts +0 -18
  99. package/dist/components/account/account.js +0 -24
  100. package/dist/components/account/settings/account-settings.d.ts +0 -5
  101. package/dist/components/account/settings/account-settings.js +0 -6
  102. package/dist/components/account/settings/settings.d.ts +0 -5
  103. package/dist/components/account/settings/settings.js +0 -5
  104. package/dist/components/account/settings/user-profile.d.ts +0 -5
  105. package/dist/components/account/settings/user-profile.js +0 -20
  106. package/dist/components/settings/account/accounts.d.ts +0 -14
  107. package/dist/components/settings/account/accounts.js +0 -26
  108. package/dist/components/settings/account/theme-selector.d.ts +0 -16
  109. package/dist/components/settings/account/theme-selector.js +0 -33
  110. package/dist/components/settings/account/theme-settings.d.ts +0 -16
  111. package/dist/components/settings/account/theme-settings.js +0 -31
  112. package/dist/components/settings/account-settings.d.ts +0 -5
  113. package/dist/components/settings/account-settings.js +0 -6
  114. package/dist/components/settings/account.d.ts +0 -18
  115. package/dist/components/settings/account.js +0 -24
  116. package/dist/components/settings/security/connected-account.d.ts +0 -16
  117. package/dist/components/settings/security/connected-account.js +0 -46
  118. package/dist/components/settings/security/connected-accounts.d.ts +0 -15
  119. package/dist/components/settings/security/connected-accounts.js +0 -31
  120. package/dist/components/settings/security/sessions.d.ts +0 -14
  121. package/dist/components/settings/security/sessions.js +0 -40
  122. package/dist/components/settings/settings/account-settings.d.ts +0 -5
  123. package/dist/components/settings/settings/account-settings.js +0 -6
  124. package/dist/components/settings/settings/user-profile.d.ts +0 -5
  125. package/dist/components/settings/settings/user-profile.js +0 -20
  126. package/dist/components/settings/user-profile.d.ts +0 -5
  127. package/dist/components/settings/user-profile.js +0 -20
  128. package/dist/components/user/switch-account-popover.d.ts +0 -10
  129. package/dist/components/user/switch-account-popover.js +0 -25
  130. package/dist/components/user/switch-account-submenu.d.ts +0 -10
  131. package/dist/components/user/switch-account-submenu.js +0 -25
  132. package/dist/hooks/use-auth.d.ts +0 -2
  133. package/dist/hooks/use-auth.js +0 -8
  134. package/dist/hooks/use-redirect-to.d.ts +0 -8
  135. package/dist/hooks/use-redirect-to.js +0 -19
  136. package/dist/hooks/use-sign-in.d.ts +0 -8
  137. package/dist/hooks/use-sign-in.js +0 -53
  138. package/dist/lib/utils.d.ts +0 -2
  139. package/dist/lib/utils.js +0 -5
  140. package/dist/server.d.ts +0 -1
  141. package/dist/server.js +0 -1
  142. package/dist/src/components/auth/auth-provider.d.ts +0 -8
  143. package/dist/src/components/auth/auth-provider.js +0 -13
  144. package/dist/src/components/auth/auth.d.ts +0 -22
  145. package/dist/src/components/auth/auth.js +0 -42
  146. package/dist/src/components/auth/field-separator.d.ts +0 -4
  147. package/dist/src/components/auth/field-separator.js +0 -5
  148. package/dist/src/components/auth/forgot-password.d.ts +0 -15
  149. package/dist/src/components/auth/forgot-password.js +0 -29
  150. package/dist/src/components/auth/magic-link-button.d.ts +0 -13
  151. package/dist/src/components/auth/magic-link-button.js +0 -20
  152. package/dist/src/components/auth/magic-link.d.ts +0 -17
  153. package/dist/src/components/auth/magic-link.js +0 -37
  154. package/dist/src/components/auth/provider-buttons.d.ts +0 -19
  155. package/dist/src/components/auth/provider-buttons.js +0 -35
  156. package/dist/src/components/auth/reset-password.d.ts +0 -11
  157. package/dist/src/components/auth/reset-password.js +0 -59
  158. package/dist/src/components/auth/sign-in.d.ts +0 -14
  159. package/dist/src/components/auth/sign-in.js +0 -58
  160. package/dist/src/components/auth/sign-out.d.ts +0 -11
  161. package/dist/src/components/auth/sign-out.js +0 -34
  162. package/dist/src/components/auth/sign-up.d.ts +0 -19
  163. package/dist/src/components/auth/sign-up.js +0 -65
  164. package/dist/src/components/email/email-changed-email.d.ts +0 -3
  165. package/dist/src/components/email/email-changed-email.js +0 -23
  166. package/dist/src/components/email/email-verification-email.d.ts +0 -3
  167. package/dist/src/components/email/email-verification-email.js +0 -23
  168. package/dist/src/components/email/magic-link-email.d.ts +0 -3
  169. package/dist/src/components/email/magic-link-email.js +0 -23
  170. package/dist/src/components/email/new-device-email.d.ts +0 -3
  171. package/dist/src/components/email/new-device-email.js +0 -23
  172. package/dist/src/components/email/otp-email.d.ts +0 -3
  173. package/dist/src/components/email/otp-email.js +0 -22
  174. package/dist/src/components/email/password-changed-email.d.ts +0 -3
  175. package/dist/src/components/email/password-changed-email.js +0 -23
  176. package/dist/src/components/email/reset-password-email.d.ts +0 -3
  177. package/dist/src/components/email/reset-password-email.js +0 -23
  178. package/dist/src/components/settings/account/account-settings.d.ts +0 -13
  179. package/dist/src/components/settings/account/account-settings.js +0 -19
  180. package/dist/src/components/settings/account/appearance.d.ts +0 -16
  181. package/dist/src/components/settings/account/appearance.js +0 -28
  182. package/dist/src/components/settings/account/change-email.d.ts +0 -15
  183. package/dist/src/components/settings/account/change-email.js +0 -35
  184. package/dist/src/components/settings/account/manage-account.d.ts +0 -19
  185. package/dist/src/components/settings/account/manage-account.js +0 -27
  186. package/dist/src/components/settings/account/manage-accounts.d.ts +0 -14
  187. package/dist/src/components/settings/account/manage-accounts.js +0 -27
  188. package/dist/src/components/settings/account/user-profile.d.ts +0 -13
  189. package/dist/src/components/settings/account/user-profile.js +0 -29
  190. package/dist/src/components/settings/security/active-session.d.ts +0 -14
  191. package/dist/src/components/settings/security/active-session.js +0 -35
  192. package/dist/src/components/settings/security/active-sessions.d.ts +0 -14
  193. package/dist/src/components/settings/security/active-sessions.js +0 -29
  194. package/dist/src/components/settings/security/change-password.d.ts +0 -15
  195. package/dist/src/components/settings/security/change-password.js +0 -57
  196. package/dist/src/components/settings/security/linked-account.d.ts +0 -16
  197. package/dist/src/components/settings/security/linked-account.js +0 -46
  198. package/dist/src/components/settings/security/linked-accounts.d.ts +0 -15
  199. package/dist/src/components/settings/security/linked-accounts.js +0 -31
  200. package/dist/src/components/settings/security/security-settings.d.ts +0 -15
  201. package/dist/src/components/settings/security/security-settings.js +0 -18
  202. package/dist/src/components/settings/settings.d.ts +0 -29
  203. package/dist/src/components/settings/settings.js +0 -39
  204. package/dist/src/components/user/switch-account-item.d.ts +0 -16
  205. package/dist/src/components/user/switch-account-item.js +0 -14
  206. package/dist/src/components/user/switch-account-menu.d.ts +0 -10
  207. package/dist/src/components/user/switch-account-menu.js +0 -23
  208. package/dist/src/components/user/user-avatar.d.ts +0 -24
  209. package/dist/src/components/user/user-avatar.js +0 -31
  210. package/dist/src/components/user/user-button.d.ts +0 -21
  211. package/dist/src/components/user/user-button.js +0 -24
  212. package/dist/src/components/user/user-view.d.ts +0 -21
  213. package/dist/src/components/user/user-view.js +0 -24
  214. package/dist/src/core.d.ts +0 -1
  215. package/dist/src/core.js +0 -1
  216. package/dist/src/index.d.ts +0 -31
  217. package/dist/src/index.js +0 -32
  218. package/dist/src/lib/utils.d.ts +0 -2
  219. package/dist/src/lib/utils.js +0 -5
  220. package/dist/src/react-exports.d.ts +0 -1
  221. package/dist/src/react-exports.js +0 -1
@@ -1,24 +1,91 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useAuth, useSession } from "@better-auth-ui/react";
3
- import { ArrowRightFromSquare, ArrowRightToSquare, ChevronsExpandVertical, Display, Gear, Moon, PersonPlus, Persons, Sun } from "@gravity-ui/icons";
4
- import { Button, cn, Dropdown, Label, Separator, Tabs } from "@heroui/react";
5
- import { SwitchAccountMenu } from "./switch-account-menu";
6
- import { UserAvatar } from "./user-avatar";
7
- import { UserView } from "./user-view";
8
- /**
9
- * Render a user account dropdown button that shows account actions, session switching, and theme controls.
10
- *
11
- * Renders either an icon-only trigger or a full button showing the current user state; its dropdown contains account settings, multi-session switching (when enabled), theme selection (when enabled), and sign-in/sign-out flows depending on authentication state.
12
- *
13
- * @param className - Additional CSS classes applied to the trigger element
14
- * @param placement - Dropdown popover placement (e.g., "bottom", "top-start", "bottom-end")
15
- * @param size - "icon" renders an avatar-only trigger; "default" renders a button with label and chevron
16
- * @param variant - Button visual variant passed to the underlying Button component
17
- * @param themeToggle - When true and theming is available, show theme selection controls in the menu
18
- * @returns The user button and its dropdown menu as a JSX element
19
- */
20
- export function UserButton({ className, placement = "bottom", size = "default", variant = "ghost", themeToggle = true }) {
21
- const { basePaths, viewPaths, localization, multiSession, appearance: { theme, setTheme, themes } } = useAuth();
22
- const { data: session, isPending: sessionPending } = useSession();
23
- return (_jsxs(Dropdown, { children: [size === "icon" ? (_jsx(Dropdown.Trigger, { className: cn("rounded-full", className), children: _jsx(UserAvatar, {}) })) : (_jsxs(Button, { variant: variant, className: cn("h-auto font-normal justify-start px-3 py-2 text-left", className), children: [session || sessionPending ? (_jsx(UserView, { isPending: sessionPending })) : (_jsxs(_Fragment, { children: [_jsx(UserAvatar, {}), _jsx("p", { className: "text-sm font-medium", children: localization.auth.account })] })), _jsx(ChevronsExpandVertical, { className: "ml-auto size-3.5" })] })), _jsxs(Dropdown.Popover, { placement: placement, className: "min-w-40 md:min-w-56 max-w-[48svw]", children: [session && (_jsx("div", { className: "px-3 pt-3 pb-1", children: _jsx(UserView, {}) })), _jsx(Dropdown.Menu, { children: session ? (_jsxs(_Fragment, { children: [_jsxs(Dropdown.Item, { textValue: localization.settings.settings, href: `${basePaths.settings}/${viewPaths.settings.account}`, children: [_jsx(Gear, { className: "text-muted" }), _jsx(Label, { children: localization.settings.settings })] }), multiSession && (_jsxs(Dropdown.SubmenuTrigger, { children: [_jsxs(Dropdown.Item, { textValue: localization.auth.switchAccount, children: [_jsx(Persons, { className: "text-muted" }), _jsx(Label, { children: localization.auth.switchAccount }), _jsx(Dropdown.SubmenuIndicator, {})] }), _jsx(Dropdown.Popover, { className: "min-w-40 md:min-w-56 max-w-[48svw]", children: _jsx(SwitchAccountMenu, {}) })] })), themeToggle && theme && setTheme && !!themes?.length && (_jsxs(Dropdown.Item, { className: "py-1 pe-2", children: [_jsx(Label, { children: localization.settings.theme }), _jsx(Tabs, { className: "ml-auto", selectedKey: theme, onSelectionChange: (key) => setTheme(key), children: _jsx(Tabs.ListContainer, { children: _jsxs(Tabs.List, { "aria-label": localization.settings.theme, className: "*:h-5 *:w-5 *:p-0", children: [themes.includes("system") && (_jsxs(Tabs.Tab, { id: "system", "aria-label": localization.settings.system, children: [_jsx(Display, { className: "size-3" }), _jsx(Tabs.Indicator, {})] })), themes.includes("light") && (_jsxs(Tabs.Tab, { id: "light", "aria-label": localization.settings.light, children: [_jsx(Sun, { className: "size-3" }), _jsx(Tabs.Indicator, {})] })), themes.includes("dark") && (_jsxs(Tabs.Tab, { id: "dark", "aria-label": localization.settings.dark, children: [_jsx(Moon, { className: "size-3" }), _jsx(Tabs.Indicator, {})] }))] }) }) })] })), _jsx(Separator, {}), _jsxs(Dropdown.Item, { textValue: localization.auth.signOut, href: `${basePaths.auth}/${viewPaths.auth.signOut}`, children: [_jsx(ArrowRightFromSquare, { className: "text-muted" }), _jsx(Label, { children: localization.auth.signOut })] })] })) : (_jsxs(_Fragment, { children: [_jsxs(Dropdown.Item, { textValue: localization.auth.signIn, href: `${basePaths.auth}/${viewPaths.auth.signIn}`, children: [_jsx(ArrowRightToSquare, { className: "text-muted" }), _jsx(Label, { children: localization.auth.signIn })] }), _jsxs(Dropdown.Item, { textValue: localization.auth.signUp, href: `${basePaths.auth}/${viewPaths.auth.signUp}`, children: [_jsx(PersonPlus, { className: "text-muted" }), _jsx(Label, { children: localization.auth.signUp })] })] })) })] })] }));
1
+ import { UserAvatar as e } from "./user-avatar.js";
2
+ import { UserView as t } from "./user-view.js";
3
+ import { SwitchAccountMenu as n } from "./switch-account-menu.js";
4
+ import { useAuth as r, useSession as i } from "@better-auth-ui/react";
5
+ import { Button as a, Dropdown as o, Label as s, Separator as c, Tabs as l, cn as u } from "@heroui/react";
6
+ import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
7
+ import { ArrowRightFromSquare as m, ArrowRightToSquare as h, ChevronsExpandVertical as g, Display as _, Gear as v, Moon as y, PersonPlus as b, Persons as x, Sun as S } from "@gravity-ui/icons";
8
+ //#region src/components/user/user-button.tsx
9
+ function C({ className: C, placement: w = "bottom", size: T = "default", variant: E = "ghost", themeToggle: D = !0 }) {
10
+ let { basePaths: O, viewPaths: k, localization: A, multiSession: j, appearance: { theme: M, setTheme: N, themes: P } } = r(), { data: F, isPending: I } = i();
11
+ return /* @__PURE__ */ p(o, { children: [T === "icon" ? /* @__PURE__ */ f(o.Trigger, {
12
+ className: u("rounded-full", C),
13
+ children: /* @__PURE__ */ f(e, {})
14
+ }) : /* @__PURE__ */ p(a, {
15
+ variant: E,
16
+ className: u("h-auto font-normal justify-start px-3 py-2 text-left", C),
17
+ children: [F || I ? /* @__PURE__ */ f(t, { isPending: I }) : /* @__PURE__ */ p(d, { children: [/* @__PURE__ */ f(e, {}), /* @__PURE__ */ f("p", {
18
+ className: "text-sm font-medium",
19
+ children: A.auth.account
20
+ })] }), /* @__PURE__ */ f(g, { className: "ml-auto size-3.5" })]
21
+ }), /* @__PURE__ */ p(o.Popover, {
22
+ placement: w,
23
+ className: "min-w-40 md:min-w-56 max-w-[48svw]",
24
+ children: [F && /* @__PURE__ */ f("div", {
25
+ className: "px-3 pt-3 pb-1",
26
+ children: /* @__PURE__ */ f(t, {})
27
+ }), /* @__PURE__ */ f(o.Menu, { children: F ? /* @__PURE__ */ p(d, { children: [
28
+ /* @__PURE__ */ p(o.Item, {
29
+ textValue: A.settings.settings,
30
+ href: `${O.settings}/${k.settings.account}`,
31
+ children: [/* @__PURE__ */ f(v, { className: "text-muted" }), /* @__PURE__ */ f(s, { children: A.settings.settings })]
32
+ }),
33
+ j && /* @__PURE__ */ p(o.SubmenuTrigger, { children: [/* @__PURE__ */ p(o.Item, {
34
+ textValue: A.auth.switchAccount,
35
+ children: [
36
+ /* @__PURE__ */ f(x, { className: "text-muted" }),
37
+ /* @__PURE__ */ f(s, { children: A.auth.switchAccount }),
38
+ /* @__PURE__ */ f(o.SubmenuIndicator, {})
39
+ ]
40
+ }), /* @__PURE__ */ f(o.Popover, {
41
+ className: "min-w-40 md:min-w-56 max-w-[48svw]",
42
+ children: /* @__PURE__ */ f(n, {})
43
+ })] }),
44
+ D && M && N && !!P?.length && /* @__PURE__ */ p(o.Item, {
45
+ className: "py-1 pe-2",
46
+ children: [/* @__PURE__ */ f(s, { children: A.settings.theme }), /* @__PURE__ */ f(l, {
47
+ className: "ml-auto",
48
+ selectedKey: M,
49
+ onSelectionChange: (e) => N(e),
50
+ children: /* @__PURE__ */ f(l.ListContainer, { children: /* @__PURE__ */ p(l.List, {
51
+ "aria-label": A.settings.theme,
52
+ className: "*:h-5 *:w-5 *:p-0",
53
+ children: [
54
+ P.includes("system") && /* @__PURE__ */ p(l.Tab, {
55
+ id: "system",
56
+ "aria-label": A.settings.system,
57
+ children: [/* @__PURE__ */ f(_, { className: "size-3" }), /* @__PURE__ */ f(l.Indicator, {})]
58
+ }),
59
+ P.includes("light") && /* @__PURE__ */ p(l.Tab, {
60
+ id: "light",
61
+ "aria-label": A.settings.light,
62
+ children: [/* @__PURE__ */ f(S, { className: "size-3" }), /* @__PURE__ */ f(l.Indicator, {})]
63
+ }),
64
+ P.includes("dark") && /* @__PURE__ */ p(l.Tab, {
65
+ id: "dark",
66
+ "aria-label": A.settings.dark,
67
+ children: [/* @__PURE__ */ f(y, { className: "size-3" }), /* @__PURE__ */ f(l.Indicator, {})]
68
+ })
69
+ ]
70
+ }) })
71
+ })]
72
+ }),
73
+ /* @__PURE__ */ f(c, {}),
74
+ /* @__PURE__ */ p(o.Item, {
75
+ textValue: A.auth.signOut,
76
+ href: `${O.auth}/${k.auth.signOut}`,
77
+ children: [/* @__PURE__ */ f(m, { className: "text-muted" }), /* @__PURE__ */ f(s, { children: A.auth.signOut })]
78
+ })
79
+ ] }) : /* @__PURE__ */ p(d, { children: [/* @__PURE__ */ p(o.Item, {
80
+ textValue: A.auth.signIn,
81
+ href: `${O.auth}/${k.auth.signIn}`,
82
+ children: [/* @__PURE__ */ f(h, { className: "text-muted" }), /* @__PURE__ */ f(s, { children: A.auth.signIn })]
83
+ }), /* @__PURE__ */ p(o.Item, {
84
+ textValue: A.auth.signUp,
85
+ href: `${O.auth}/${k.auth.signUp}`,
86
+ children: [/* @__PURE__ */ f(b, { className: "text-muted" }), /* @__PURE__ */ f(s, { children: A.auth.signUp })]
87
+ })] }) })]
88
+ })] });
24
89
  }
90
+ //#endregion
91
+ export { C as UserButton };
@@ -1,6 +1,6 @@
1
- import { type AvatarProps } from "@heroui/react";
2
- import type { User } from "better-auth";
3
- import type { ComponentProps } from "react";
1
+ import { AvatarProps } from '@heroui/react';
2
+ import { User } from 'better-auth';
3
+ import { ComponentProps } from 'react';
4
4
  export type UserViewProps = {
5
5
  className?: string;
6
6
  isPending?: boolean;
@@ -1,24 +1,37 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useSession } from "@better-auth-ui/react";
3
- import { cn, Skeleton } from "@heroui/react";
4
- import { UserAvatar } from "./user-avatar";
5
- /**
6
- * Render a compact user item with an avatar, a primary label (display username, name, or email), and an optional secondary email line.
7
- *
8
- * @param isPending - If true and no `user` prop is provided, renders a loading skeleton instead of user details
9
- * @param size - Avatar size variant; defaults to `"sm"`
10
- * @param user - Optional user to display; when omitted the current session user is used if available
11
- * @returns A React element containing the user's avatar and text labels
12
- */
13
- export function UserView({ className, isPending, size = "sm", user, ...props }) {
14
- const { data: session, isPending: sessionPending } = useSession({
15
- enabled: !user && !isPending
16
- });
17
- const resolvedUser = user ?? session?.user;
18
- if ((isPending || sessionPending) && !user) {
19
- return (_jsxs("div", { className: cn("flex items-center gap-2 min-w-0", className), ...props, children: [_jsx(UserAvatar, { isPending: true, size: size }), _jsxs("div", { className: "flex flex-col gap-1 min-w-0", children: [_jsx(Skeleton, { className: "h-3.5 w-24 rounded-lg" }), _jsx(Skeleton, { className: "h-3 w-32 rounded-lg" })] })] }));
20
- }
21
- return (_jsxs("div", { className: cn("flex items-center gap-2 min-w-0", className), ...props, children: [_jsx(UserAvatar, { user: resolvedUser, size: size }), _jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "text-sm font-medium truncate leading-tight", children: resolvedUser?.displayUsername ||
22
- resolvedUser?.name ||
23
- resolvedUser?.email }), (resolvedUser?.displayUsername || resolvedUser?.name) && (_jsx("p", { className: "text-muted text-xs mb-0.5 truncate overflow-x-hidden", children: resolvedUser?.email }))] })] }));
1
+ import { UserAvatar as e } from "./user-avatar.js";
2
+ import { useSession as t } from "@better-auth-ui/react";
3
+ import { Skeleton as n, cn as r } from "@heroui/react";
4
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
5
+ //#region src/components/user/user-view.tsx
6
+ function o({ className: o, isPending: s, size: c = "sm", user: l, ...u }) {
7
+ let { data: d, isPending: f } = t({ enabled: !l && !s }), p = l ?? d?.user;
8
+ return (s || f) && !l ? /* @__PURE__ */ a("div", {
9
+ className: r("flex items-center gap-2 min-w-0", o),
10
+ ...u,
11
+ children: [/* @__PURE__ */ i(e, {
12
+ isPending: !0,
13
+ size: c
14
+ }), /* @__PURE__ */ a("div", {
15
+ className: "flex flex-col gap-1 min-w-0",
16
+ children: [/* @__PURE__ */ i(n, { className: "h-3.5 w-24 rounded-lg" }), /* @__PURE__ */ i(n, { className: "h-3 w-32 rounded-lg" })]
17
+ })]
18
+ }) : /* @__PURE__ */ a("div", {
19
+ className: r("flex items-center gap-2 min-w-0", o),
20
+ ...u,
21
+ children: [/* @__PURE__ */ i(e, {
22
+ user: p,
23
+ size: c
24
+ }), /* @__PURE__ */ a("div", {
25
+ className: "min-w-0",
26
+ children: [/* @__PURE__ */ i("p", {
27
+ className: "text-sm font-medium truncate leading-tight",
28
+ children: p?.displayUsername || p?.name || p?.email
29
+ }), (p?.displayUsername || p?.name) && /* @__PURE__ */ i("p", {
30
+ className: "text-muted text-xs mb-0.5 truncate overflow-x-hidden",
31
+ children: p?.email
32
+ })]
33
+ })]
34
+ });
24
35
  }
36
+ //#endregion
37
+ export { o as UserView };
package/dist/core.d.ts CHANGED
@@ -1 +1 @@
1
- export * from "@better-auth-ui/react/core";
1
+ export * from '@better-auth-ui/react/core';
package/dist/index.d.ts CHANGED
@@ -1,33 +1,35 @@
1
- export * from "./components/auth/auth";
2
- export * from "./components/auth/auth-provider";
3
- export * from "./components/auth/forgot-password";
4
- export * from "./components/auth/magic-link";
5
- export * from "./components/auth/magic-link-button";
6
- export * from "./components/auth/provider-buttons";
7
- export * from "./components/auth/reset-password";
8
- export * from "./components/auth/sign-in";
9
- export * from "./components/auth/sign-out";
10
- export * from "./components/auth/sign-up";
11
- export * from "./components/email/email-changed-email";
12
- export * from "./components/email/email-verification-email";
13
- export * from "./components/email/magic-link-email";
14
- export * from "./components/email/new-device-email";
15
- export * from "./components/email/otp-email";
16
- export * from "./components/email/password-changed-email";
17
- export * from "./components/email/reset-password-email";
18
- export * from "./components/settings/account/account-settings";
19
- export * from "./components/settings/account/appearance";
20
- export * from "./components/settings/account/change-email";
21
- export * from "./components/settings/account/manage-account";
22
- export * from "./components/settings/account/manage-accounts";
23
- export * from "./components/settings/account/user-profile";
24
- export * from "./components/settings/security/active-sessions";
25
- export * from "./components/settings/security/change-password";
26
- export * from "./components/settings/security/danger-zone";
27
- export * from "./components/settings/security/delete-user";
28
- export * from "./components/settings/security/linked-accounts";
29
- export * from "./components/settings/security/security-settings";
30
- export * from "./components/settings/settings";
31
- export * from "./components/user/user-avatar";
32
- export * from "./components/user/user-button";
33
- export * from "./components/user/user-view";
1
+ export * from './components/auth/auth';
2
+ export * from './components/auth/auth-provider';
3
+ export * from './components/auth/forgot-password';
4
+ export * from './components/auth/magic-link';
5
+ export * from './components/auth/magic-link-button';
6
+ export * from './components/auth/passkey-button';
7
+ export * from './components/auth/provider-buttons';
8
+ export * from './components/auth/reset-password';
9
+ export * from './components/auth/sign-in';
10
+ export * from './components/auth/sign-out';
11
+ export * from './components/auth/sign-up';
12
+ export * from './components/email/email-changed-email';
13
+ export * from './components/email/email-verification-email';
14
+ export * from './components/email/magic-link-email';
15
+ export * from './components/email/new-device-email';
16
+ export * from './components/email/otp-email';
17
+ export * from './components/email/password-changed-email';
18
+ export * from './components/email/reset-password-email';
19
+ export * from './components/settings/account/account-settings';
20
+ export * from './components/settings/account/appearance';
21
+ export * from './components/settings/account/change-email';
22
+ export * from './components/settings/account/manage-account';
23
+ export * from './components/settings/account/manage-accounts';
24
+ export * from './components/settings/account/user-profile';
25
+ export * from './components/settings/security/active-sessions';
26
+ export * from './components/settings/security/change-password';
27
+ export * from './components/settings/security/danger-zone';
28
+ export * from './components/settings/security/delete-user';
29
+ export * from './components/settings/security/linked-accounts';
30
+ export * from './components/settings/security/passkeys';
31
+ export * from './components/settings/security/security-settings';
32
+ export * from './components/settings/settings';
33
+ export * from './components/user/user-avatar';
34
+ export * from './components/user/user-button';
35
+ export * from './components/user/user-view';
package/dist/index.js CHANGED
@@ -1,34 +1,37 @@
1
1
  "use client";
2
- export * from "./components/auth/auth";
3
- export * from "./components/auth/auth-provider";
4
- export * from "./components/auth/forgot-password";
5
- export * from "./components/auth/magic-link";
6
- export * from "./components/auth/magic-link-button";
7
- export * from "./components/auth/provider-buttons";
8
- export * from "./components/auth/reset-password";
9
- export * from "./components/auth/sign-in";
10
- export * from "./components/auth/sign-out";
11
- export * from "./components/auth/sign-up";
12
- export * from "./components/email/email-changed-email";
13
- export * from "./components/email/email-verification-email";
14
- export * from "./components/email/magic-link-email";
15
- export * from "./components/email/new-device-email";
16
- export * from "./components/email/otp-email";
17
- export * from "./components/email/password-changed-email";
18
- export * from "./components/email/reset-password-email";
19
- export * from "./components/settings/account/account-settings";
20
- export * from "./components/settings/account/appearance";
21
- export * from "./components/settings/account/change-email";
22
- export * from "./components/settings/account/manage-account";
23
- export * from "./components/settings/account/manage-accounts";
24
- export * from "./components/settings/account/user-profile";
25
- export * from "./components/settings/security/active-sessions";
26
- export * from "./components/settings/security/change-password";
27
- export * from "./components/settings/security/danger-zone";
28
- export * from "./components/settings/security/delete-user";
29
- export * from "./components/settings/security/linked-accounts";
30
- export * from "./components/settings/security/security-settings";
31
- export * from "./components/settings/settings";
32
- export * from "./components/user/user-avatar";
33
- export * from "./components/user/user-button";
34
- export * from "./components/user/user-view";
2
+ import { ForgotPassword as e } from "./components/auth/forgot-password.js";
3
+ import { MagicLinkButton as t } from "./components/auth/magic-link-button.js";
4
+ import { PasskeyButton as n } from "./components/auth/passkey-button.js";
5
+ import { ProviderButtons as r } from "./components/auth/provider-buttons.js";
6
+ import { MagicLink as i } from "./components/auth/magic-link.js";
7
+ import { ResetPassword as a } from "./components/auth/reset-password.js";
8
+ import { SignIn as o } from "./components/auth/sign-in.js";
9
+ import { SignOut as s } from "./components/auth/sign-out.js";
10
+ import { SignUp as c } from "./components/auth/sign-up.js";
11
+ import { Auth as l } from "./components/auth/auth.js";
12
+ import { AuthProvider as u } from "./components/auth/auth-provider.js";
13
+ import { EmailChangedEmail as d } from "./components/email/email-changed-email.js";
14
+ import { EmailVerificationEmail as f } from "./components/email/email-verification-email.js";
15
+ import { MagicLinkEmail as p } from "./components/email/magic-link-email.js";
16
+ import { NewDeviceEmail as m } from "./components/email/new-device-email.js";
17
+ import { OtpEmail as h } from "./components/email/otp-email.js";
18
+ import { PasswordChangedEmail as g } from "./components/email/password-changed-email.js";
19
+ import { ResetPasswordEmail as _ } from "./components/email/reset-password-email.js";
20
+ import { Appearance as v } from "./components/settings/account/appearance.js";
21
+ import { ChangeEmail as y } from "./components/settings/account/change-email.js";
22
+ import { UserAvatar as b } from "./components/user/user-avatar.js";
23
+ import { UserView as x } from "./components/user/user-view.js";
24
+ import { ManageAccount as S } from "./components/settings/account/manage-account.js";
25
+ import { ManageAccounts as C } from "./components/settings/account/manage-accounts.js";
26
+ import { UserProfile as w } from "./components/settings/account/user-profile.js";
27
+ import { AccountSettings as T } from "./components/settings/account/account-settings.js";
28
+ import { ActiveSessions as E } from "./components/settings/security/active-sessions.js";
29
+ import { ChangePassword as D } from "./components/settings/security/change-password.js";
30
+ import { DeleteUser as O } from "./components/settings/security/delete-user.js";
31
+ import { DangerZone as k } from "./components/settings/security/danger-zone.js";
32
+ import { LinkedAccounts as A } from "./components/settings/security/linked-accounts.js";
33
+ import { Passkeys as j } from "./components/settings/security/passkeys.js";
34
+ import { SecuritySettings as M } from "./components/settings/security/security-settings.js";
35
+ import { Settings as N } from "./components/settings/settings.js";
36
+ import { UserButton as P } from "./components/user/user-button.js";
37
+ export { T as AccountSettings, E as ActiveSessions, v as Appearance, l as Auth, u as AuthProvider, y as ChangeEmail, D as ChangePassword, k as DangerZone, O as DeleteUser, d as EmailChangedEmail, f as EmailVerificationEmail, e as ForgotPassword, A as LinkedAccounts, i as MagicLink, t as MagicLinkButton, p as MagicLinkEmail, S as ManageAccount, C as ManageAccounts, m as NewDeviceEmail, h as OtpEmail, n as PasskeyButton, j as Passkeys, g as PasswordChangedEmail, r as ProviderButtons, a as ResetPassword, _ as ResetPasswordEmail, M as SecuritySettings, N as Settings, o as SignIn, s as SignOut, c as SignUp, b as UserAvatar, P as UserButton, w as UserProfile, x as UserView };
@@ -1 +1 @@
1
- export * from "@better-auth-ui/react";
1
+ export * from '@better-auth-ui/react';
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@better-auth-ui/heroui",
3
- "version": "1.6.0",
3
+ "version": "1.6.2",
4
4
  "type": "module",
5
5
  "scripts": {
6
- "build": "tsc && bun styles",
6
+ "build": "vite build && bun styles",
7
7
  "dev": "bun styles && tsc --watch",
8
8
  "styles": "cpy src/styles.css dist/ --flat",
9
9
  "test": "vitest"
@@ -14,16 +14,16 @@
14
14
  ],
15
15
  "exports": {
16
16
  ".": {
17
- "import": "./dist/index.js",
18
- "types": "./dist/index.d.ts"
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
19
  },
20
20
  "./core": {
21
- "import": "./dist/core.js",
22
- "types": "./dist/core.d.ts"
21
+ "types": "./dist/core.d.ts",
22
+ "import": "./dist/core.js"
23
23
  },
24
24
  "./react": {
25
- "import": "./dist/react-exports.js",
26
- "types": "./dist/react-exports.d.ts"
25
+ "types": "./dist/react-exports.d.ts",
26
+ "import": "./dist/react-exports.js"
27
27
  },
28
28
  "./styles": "./dist/styles.css"
29
29
  },
@@ -31,12 +31,13 @@
31
31
  "@gravity-ui/icons": "^2.18.0",
32
32
  "@heroui/react": "^3.0.2",
33
33
  "@heroui/styles": "^3.0.2",
34
+ "@tanstack/react-pacer": "^0.21.1",
34
35
  "@testing-library/react": "^16.3.2",
35
36
  "@testing-library/user-event": "^14.5.2",
36
37
  "@types/react": "^19.2.14",
37
38
  "@vitejs/plugin-react": "^6.0.1",
38
39
  "@vitest/browser-playwright": "^4.1.4",
39
- "better-auth": "^1.6.4",
40
+ "better-auth": "^1.6.5",
40
41
  "cpy-cli": "^7.0.0",
41
42
  "playwright": "^1.59.1",
42
43
  "react": "^19.2.5",
@@ -52,11 +53,17 @@
52
53
  "@gravity-ui/icons": ">=2.18.0",
53
54
  "@heroui/react": ">=3.0.2",
54
55
  "@heroui/styles": ">=3.0.2",
55
- "better-auth": ">=1.6.4",
56
+ "@tanstack/react-pacer": ">=0.21.0",
57
+ "better-auth": ">=1.6.5",
56
58
  "react": ">=19.2.5",
57
59
  "react-dom": ">=19.2.5",
58
60
  "bowser": ">=2.11.0"
59
61
  },
62
+ "repository": {
63
+ "type": "git",
64
+ "url": "https://github.com/better-auth-ui/better-auth-ui",
65
+ "directory": "packages/heroui"
66
+ },
60
67
  "publishConfig": {
61
68
  "access": "public"
62
69
  }
@@ -1,5 +1,5 @@
1
+ import type { AuthView } from "@better-auth-ui/core"
1
2
  import { useAuth } from "@better-auth-ui/react"
2
- import type { AuthView } from "@better-auth-ui/react/core"
3
3
  import type { CardProps } from "@heroui/react"
4
4
  import { ForgotPassword } from "./forgot-password"
5
5
  import { MagicLink } from "./magic-link"
@@ -22,6 +22,7 @@ import { type SyntheticEvent, useState } from "react"
22
22
 
23
23
  import { FieldSeparator } from "./field-separator"
24
24
  import { MagicLinkButton } from "./magic-link-button"
25
+ import { PasskeyButton } from "./passkey-button"
25
26
  import { ProviderButtons, type SocialLayout } from "./provider-buttons"
26
27
 
27
28
  export type MagicLinkProps = {
@@ -50,6 +51,7 @@ export function MagicLink({
50
51
  basePaths,
51
52
  baseURL,
52
53
  localization,
54
+ passkey,
53
55
  redirectTo,
54
56
  socialProviders,
55
57
  viewPaths
@@ -145,6 +147,8 @@ export function MagicLink({
145
147
  </Button>
146
148
 
147
149
  <MagicLinkButton view="magicLink" isPending={isPending} />
150
+
151
+ {passkey && <PasskeyButton isPending={isPending} />}
148
152
  </div>
149
153
  </Form>
150
154
 
@@ -0,0 +1,36 @@
1
+ import { useAuth, useSignInPasskey } from "@better-auth-ui/react"
2
+ import { Fingerprint } from "@gravity-ui/icons"
3
+ import { Button, Spinner, toast } from "@heroui/react"
4
+
5
+ export type PasskeyButtonProps = {
6
+ isPending: boolean
7
+ }
8
+
9
+ export function PasskeyButton({ isPending }: PasskeyButtonProps) {
10
+ const { localization, redirectTo, navigate } = useAuth()
11
+
12
+ const { mutate: signInPasskey, isPending: passkeyPending } = useSignInPasskey(
13
+ {
14
+ onError: (error) => toast.danger(error.error?.message || error.message),
15
+ onSuccess: () => navigate({ to: redirectTo })
16
+ }
17
+ )
18
+
19
+ const isDisabled = isPending || passkeyPending
20
+
21
+ return (
22
+ <Button
23
+ className="w-full"
24
+ variant="tertiary"
25
+ isDisabled={isDisabled}
26
+ isPending={passkeyPending}
27
+ onPress={() => signInPasskey()}
28
+ >
29
+ {passkeyPending ? <Spinner color="current" size="sm" /> : <Fingerprint />}
30
+ {localization.auth.continueWith.replace(
31
+ "{{provider}}",
32
+ localization.auth.passkey
33
+ )}
34
+ </Button>
35
+ )
36
+ }