@hanzo/ui 5.0.2 → 5.1.0

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 (371) hide show
  1. package/dist/accordion.js +1 -0
  2. package/dist/accordion.mjs +1 -0
  3. package/dist/alert-dialog.js +1 -0
  4. package/dist/alert-dialog.mjs +1 -0
  5. package/dist/alert.js +1 -0
  6. package/dist/alert.mjs +1 -0
  7. package/dist/avatar.js +1 -0
  8. package/dist/avatar.mjs +1 -0
  9. package/dist/badge.js +1 -0
  10. package/dist/badge.mjs +1 -0
  11. package/dist/breadcrumb.js +1 -0
  12. package/dist/breadcrumb.mjs +1 -0
  13. package/dist/calendar.js +1 -0
  14. package/dist/calendar.mjs +1 -0
  15. package/dist/carousel.js +1 -0
  16. package/dist/carousel.mjs +1 -0
  17. package/dist/checkbox.js +1 -0
  18. package/dist/checkbox.mjs +1 -0
  19. package/dist/chunk-3H5S2OQ3.mjs +1 -0
  20. package/dist/chunk-5GRJ7UQX.js +1 -0
  21. package/dist/chunk-63HNMH7C.js +1 -0
  22. package/dist/chunk-72TOQ4DM.mjs +1 -0
  23. package/dist/chunk-7AEFTV5R.mjs +1 -0
  24. package/dist/chunk-7M4AVV2R.js +1 -0
  25. package/dist/chunk-DKPVJSBC.js +1 -0
  26. package/dist/chunk-EI7MMDWY.js +1 -0
  27. package/dist/chunk-GANGDIZG.mjs +1 -0
  28. package/dist/chunk-GRGT2Z4K.js +1 -0
  29. package/dist/chunk-JCUUC6NY.mjs +1 -0
  30. package/dist/chunk-JUQMWLIN.js +1 -0
  31. package/dist/chunk-PRVEIITE.js +1 -0
  32. package/dist/chunk-SH52AKNZ.js +1 -0
  33. package/dist/chunk-TU67EJEW.mjs +1 -0
  34. package/dist/chunk-WN5KN73U.mjs +1 -0
  35. package/dist/chunk-YSXGDEY5.mjs +1 -0
  36. package/dist/chunk-Z76OOVUE.mjs +1 -0
  37. package/dist/collapsible.js +1 -0
  38. package/dist/collapsible.mjs +1 -0
  39. package/dist/command.js +1 -0
  40. package/dist/command.mjs +1 -0
  41. package/dist/context-menu.js +1 -0
  42. package/dist/context-menu.mjs +1 -0
  43. package/dist/dialog.js +1 -0
  44. package/dist/dialog.mjs +1 -0
  45. package/dist/drawer.js +1 -0
  46. package/dist/drawer.mjs +1 -0
  47. package/dist/dropdown-menu.js +1 -0
  48. package/dist/dropdown-menu.mjs +1 -0
  49. package/dist/form.js +1 -0
  50. package/dist/form.mjs +1 -0
  51. package/dist/hover-card.js +1 -0
  52. package/dist/hover-card.mjs +1 -0
  53. package/dist/index.js +1 -9079
  54. package/dist/index.mjs +1 -8700
  55. package/dist/input-otp.js +1 -0
  56. package/dist/input-otp.mjs +1 -0
  57. package/dist/lib/utils.js +1 -0
  58. package/dist/lib/utils.mjs +1 -0
  59. package/dist/navigation-menu.js +1 -0
  60. package/dist/navigation-menu.mjs +1 -0
  61. package/dist/popover.js +1 -0
  62. package/dist/popover.mjs +1 -0
  63. package/dist/progress.js +1 -0
  64. package/dist/progress.mjs +1 -0
  65. package/dist/radio-group.js +1 -0
  66. package/dist/radio-group.mjs +1 -0
  67. package/dist/resizable.js +1 -0
  68. package/dist/resizable.mjs +1 -0
  69. package/dist/scroll-area.js +1 -0
  70. package/dist/scroll-area.mjs +1 -0
  71. package/dist/select.js +1 -0
  72. package/dist/select.mjs +1 -0
  73. package/dist/separator.js +1 -0
  74. package/dist/separator.mjs +1 -0
  75. package/dist/sheet.js +1 -0
  76. package/dist/sheet.mjs +1 -0
  77. package/dist/skeleton.js +1 -0
  78. package/dist/skeleton.mjs +1 -0
  79. package/dist/slider.js +1 -0
  80. package/dist/slider.mjs +1 -0
  81. package/dist/sonner.js +1 -0
  82. package/dist/sonner.mjs +1 -0
  83. package/dist/src/utils.js +1 -0
  84. package/dist/src/utils.mjs +1 -0
  85. package/dist/switch.js +1 -0
  86. package/dist/switch.mjs +1 -0
  87. package/dist/table.js +1 -0
  88. package/dist/table.mjs +1 -0
  89. package/dist/tabs.js +1 -0
  90. package/dist/tabs.mjs +1 -0
  91. package/dist/tailwind/index.js +1 -0
  92. package/dist/tailwind/index.mjs +1 -0
  93. package/dist/textarea.js +1 -0
  94. package/dist/textarea.mjs +1 -0
  95. package/dist/toggle-group.js +1 -0
  96. package/dist/toggle-group.mjs +1 -0
  97. package/dist/toggle.js +1 -0
  98. package/dist/toggle.mjs +1 -0
  99. package/dist/tooltip.js +1 -0
  100. package/dist/tooltip.mjs +1 -0
  101. package/dist/types/index.js +1 -0
  102. package/dist/types/index.mjs +1 -0
  103. package/package.json +110 -81
  104. package/assets/ai-icons.tsx +0 -207
  105. package/assets/crypto.tsx +0 -33
  106. package/assets/file-type-icon.tsx +0 -66
  107. package/assets/file.tsx +0 -45
  108. package/assets/general.tsx +0 -2318
  109. package/assets/hanzo-logo.svg +0 -9
  110. package/assets/hanzo-logo.tsx +0 -17
  111. package/assets/index.ts +0 -122
  112. package/assets/index.tsx +0 -4
  113. package/assets/llm-provider.tsx +0 -1094
  114. package/blocks/auth/index.ts +0 -6
  115. package/blocks/auth/login-2fa.tsx +0 -165
  116. package/blocks/auth/login-basic.tsx +0 -94
  117. package/blocks/auth/login-social.tsx +0 -148
  118. package/blocks/auth/magic-link.tsx +0 -129
  119. package/blocks/auth/password-reset.tsx +0 -97
  120. package/blocks/auth/signup.tsx +0 -157
  121. package/blocks/components/accordian-block.tsx +0 -48
  122. package/blocks/components/block-component-props.ts +0 -11
  123. package/blocks/components/bullet-cards-block.tsx +0 -46
  124. package/blocks/components/card-block/index.tsx +0 -171
  125. package/blocks/components/card-block/link-out-button.tsx +0 -20
  126. package/blocks/components/card-block/util.ts +0 -28
  127. package/blocks/components/carte-blanche-block/index.tsx +0 -127
  128. package/blocks/components/carte-blanche-block/variant-content-left.tsx +0 -49
  129. package/blocks/components/content.tsx +0 -70
  130. package/blocks/components/cta-block.tsx +0 -115
  131. package/blocks/components/enh-heading-block.tsx +0 -204
  132. package/blocks/components/grid-block/grid-block-mutator.ts +0 -12
  133. package/blocks/components/grid-block/index.tsx +0 -83
  134. package/blocks/components/grid-block/mutator-registry.ts +0 -10
  135. package/blocks/components/grid-block/table-borders.mutator.ts +0 -47
  136. package/blocks/components/group-block.tsx +0 -83
  137. package/blocks/components/heading-block.tsx +0 -88
  138. package/blocks/components/image-block.tsx +0 -111
  139. package/blocks/components/index.ts +0 -30
  140. package/blocks/components/screenful-block/content.tsx +0 -123
  141. package/blocks/components/screenful-block/index.tsx +0 -107
  142. package/blocks/components/screenful-block/poster-background.tsx +0 -34
  143. package/blocks/components/screenful-block/video-background.tsx +0 -45
  144. package/blocks/components/space-block.tsx +0 -66
  145. package/blocks/components/video-block.tsx +0 -138
  146. package/blocks/data-display/activity-feed.tsx +0 -242
  147. package/blocks/data-display/data-table.tsx +0 -235
  148. package/blocks/data-display/stats-grid.tsx +0 -194
  149. package/blocks/def/accordian-block.ts +0 -14
  150. package/blocks/def/block.ts +0 -7
  151. package/blocks/def/bullet-cards-block.ts +0 -22
  152. package/blocks/def/card-block.ts +0 -22
  153. package/blocks/def/carte-blanche-block.ts +0 -21
  154. package/blocks/def/cta-block.ts +0 -19
  155. package/blocks/def/element-block.ts +0 -11
  156. package/blocks/def/enh-heading-block.ts +0 -44
  157. package/blocks/def/grid-block.ts +0 -16
  158. package/blocks/def/group-block.ts +0 -11
  159. package/blocks/def/heading-block.ts +0 -15
  160. package/blocks/def/image-block.ts +0 -31
  161. package/blocks/def/index.ts +0 -35
  162. package/blocks/def/screenful-block.ts +0 -54
  163. package/blocks/def/space-block.ts +0 -64
  164. package/blocks/def/video-block.ts +0 -9
  165. package/blocks/ecommerce/checkout.tsx +0 -242
  166. package/blocks/ecommerce/index.ts +0 -7
  167. package/blocks/ecommerce/product-detail.tsx +0 -257
  168. package/blocks/ecommerce/product-grid.tsx +0 -148
  169. package/blocks/ecommerce/shopping-cart.tsx +0 -181
  170. package/blocks/index.ts +0 -2
  171. package/blocks/marketing/cta-section.tsx +0 -207
  172. package/blocks/marketing/faq.tsx +0 -159
  173. package/blocks/marketing/features-grid.tsx +0 -156
  174. package/blocks/marketing/hero-section.tsx +0 -192
  175. package/blocks/marketing/index.ts +0 -6
  176. package/blocks/marketing/pricing-table.tsx +0 -121
  177. package/blocks/marketing/testimonials.tsx +0 -196
  178. package/components/index.ts +0 -9
  179. package/dist/index.js.map +0 -1
  180. package/dist/index.mjs.map +0 -1
  181. package/dist/tailwind.js +0 -2025
  182. package/dist/tailwind.js.map +0 -1
  183. package/dist/tailwind.mjs +0 -2013
  184. package/dist/tailwind.mjs.map +0 -1
  185. package/dist/types.js +0 -59
  186. package/dist/types.js.map +0 -1
  187. package/dist/types.mjs +0 -53
  188. package/dist/types.mjs.map +0 -1
  189. package/dist/utils.js +0 -30
  190. package/dist/utils.js.map +0 -1
  191. package/dist/utils.mjs +0 -26
  192. package/dist/utils.mjs.map +0 -1
  193. package/frameworks/core/index.ts +0 -6
  194. package/frameworks/core/utils/index.ts +0 -64
  195. package/frameworks/react/components/button.tsx +0 -26
  196. package/frameworks/react/components/index.ts +0 -5
  197. package/frameworks/react/hooks/index.ts +0 -5
  198. package/frameworks/react/index.ts +0 -9
  199. package/frameworks/react/package.json +0 -8
  200. package/frameworks/react/utils/index.ts +0 -2
  201. package/frameworks/react-native/index.ts +0 -9
  202. package/frameworks/react-native/package.json +0 -8
  203. package/frameworks/registry.json +0 -371
  204. package/frameworks/setup.sh +0 -69
  205. package/frameworks/svelte/index.ts +0 -9
  206. package/frameworks/svelte/package.json +0 -8
  207. package/frameworks/tracker.json +0 -1854
  208. package/frameworks/vue/index.ts +0 -9
  209. package/frameworks/vue/package.json +0 -8
  210. package/helpers/file.ts +0 -33
  211. package/helpers/memoization.ts +0 -40
  212. package/primitives/accordion.tsx +0 -74
  213. package/primitives/action-button.tsx +0 -42
  214. package/primitives/alert-dialog.tsx +0 -185
  215. package/primitives/alert.tsx +0 -74
  216. package/primitives/apply-typography.tsx +0 -55
  217. package/primitives/aspect-ratio.tsx +0 -5
  218. package/primitives/avatar.tsx +0 -57
  219. package/primitives/background-beams.tsx +0 -142
  220. package/primitives/badge.tsx +0 -45
  221. package/primitives/breadcrumb.tsx +0 -130
  222. package/primitives/breakpoint-indicator.tsx +0 -19
  223. package/primitives/button.tsx +0 -72
  224. package/primitives/calendar.tsx +0 -72
  225. package/primitives/card.tsx +0 -97
  226. package/primitives/carousel.tsx +0 -238
  227. package/primitives/chat/chat-input-area.tsx +0 -88
  228. package/primitives/chat/chat-input.tsx +0 -71
  229. package/primitives/chat/files-preview.tsx +0 -331
  230. package/primitives/chat/index.ts +0 -6
  231. package/primitives/chat/json-form.tsx +0 -8
  232. package/primitives/chat/message-list.tsx +0 -308
  233. package/primitives/chat/message.tsx +0 -569
  234. package/primitives/chat/sqlite-preview.tsx +0 -215
  235. package/primitives/checkbox.tsx +0 -32
  236. package/primitives/collapsible.tsx +0 -9
  237. package/primitives/combobox.tsx +0 -239
  238. package/primitives/command.tsx +0 -151
  239. package/primitives/context-menu.tsx +0 -206
  240. package/primitives/copy-to-clipboard-icon.tsx +0 -60
  241. package/primitives/dialog-video-controller.tsx +0 -38
  242. package/primitives/dialog.tsx +0 -128
  243. package/primitives/dot-pattern.tsx +0 -57
  244. package/primitives/dots-loader.tsx +0 -13
  245. package/primitives/drawer.tsx +0 -113
  246. package/primitives/dropdown-menu.tsx +0 -199
  247. package/primitives/error-message.tsx +0 -19
  248. package/primitives/file-uploader.tsx +0 -203
  249. package/primitives/form.tsx +0 -185
  250. package/primitives/hover-card.tsx +0 -28
  251. package/primitives/icons/github.tsx +0 -14
  252. package/primitives/icons/index.ts +0 -18
  253. package/primitives/icons/youtube-logo.tsx +0 -59
  254. package/primitives/index-client.ts +0 -4
  255. package/primitives/index-common.ts +0 -304
  256. package/primitives/index-next.ts +0 -4
  257. package/primitives/input-otp.tsx +0 -65
  258. package/primitives/input.tsx +0 -128
  259. package/primitives/label.tsx +0 -21
  260. package/primitives/list-adaptor.ts +0 -12
  261. package/primitives/list-box.tsx +0 -74
  262. package/primitives/loading-spinner.tsx +0 -33
  263. package/primitives/markdown-preview.tsx +0 -612
  264. package/primitives/mermaid.tsx +0 -196
  265. package/primitives/navigation-menu.tsx +0 -147
  266. package/primitives/next/image.tsx +0 -91
  267. package/primitives/next/index.ts +0 -7
  268. package/primitives/next/inline-icon.tsx +0 -36
  269. package/primitives/next/link-element.tsx +0 -109
  270. package/primitives/next/mdx-link.tsx +0 -22
  271. package/primitives/next/media-stack.tsx +0 -52
  272. package/primitives/next/nav-items.tsx +0 -45
  273. package/primitives/next/youtube-embed.tsx +0 -83
  274. package/primitives/pagination.tsx +0 -117
  275. package/primitives/popover.tsx +0 -34
  276. package/primitives/pretty-json-print.tsx +0 -28
  277. package/primitives/progress.tsx +0 -27
  278. package/primitives/prompt-textarea.tsx +0 -72
  279. package/primitives/qr-code.tsx +0 -112
  280. package/primitives/radio-group.tsx +0 -42
  281. package/primitives/resizable.tsx +0 -47
  282. package/primitives/scroll-area.tsx +0 -57
  283. package/primitives/search-input.tsx +0 -66
  284. package/primitives/select.tsx +0 -122
  285. package/primitives/separator.tsx +0 -26
  286. package/primitives/sheet.tsx +0 -139
  287. package/primitives/skeleton.tsx +0 -18
  288. package/primitives/slider.tsx +0 -63
  289. package/primitives/sonner.tsx +0 -35
  290. package/primitives/step-indicator.tsx +0 -69
  291. package/primitives/stepper.tsx +0 -272
  292. package/primitives/switch.tsx +0 -27
  293. package/primitives/table.tsx +0 -105
  294. package/primitives/tabs.tsx +0 -50
  295. package/primitives/text-area.tsx +0 -26
  296. package/primitives/text-link.tsx +0 -27
  297. package/primitives/textarea.tsx +0 -64
  298. package/primitives/textfield.tsx +0 -78
  299. package/primitives/toast.tsx +0 -30
  300. package/primitives/toggle-group.tsx +0 -63
  301. package/primitives/toggle.tsx +0 -44
  302. package/primitives/tooltip.tsx +0 -47
  303. package/primitives/video-player.tsx +0 -23
  304. package/src/button.ts +0 -1
  305. package/src/hooks/index.ts +0 -7
  306. package/src/hooks/use-click-away.ts +0 -31
  307. package/src/hooks/use-combined-refs.ts +0 -22
  308. package/src/hooks/use-copy-clipboard.ts +0 -30
  309. package/src/hooks/use-debounce.ts +0 -17
  310. package/src/hooks/use-fill-ids.ts +0 -25
  311. package/src/hooks/use-map.ts +0 -26
  312. package/src/hooks/use-measure.ts +0 -42
  313. package/src/hooks/use-reverse-video-playback.ts +0 -43
  314. package/src/hooks/use-scroll-restoration.ts +0 -50
  315. package/src/index-lean.ts +0 -87
  316. package/src/index.ts +0 -54
  317. package/src/mcp/README.md +0 -141
  318. package/src/mcp/enhanced-server.ts +0 -1208
  319. package/src/mcp/index.ts +0 -518
  320. package/src/mcp/package.json +0 -10
  321. package/src/registry/api.ts +0 -164
  322. package/src/registry/index.ts +0 -60
  323. package/src/registry/package.json +0 -10
  324. package/src/utils.ts +0 -19
  325. package/tailwind/colors.tailwind.js +0 -53
  326. package/tailwind/fontFamily.tailwind.ts +0 -7
  327. package/tailwind/fontSize.tailwind.ts +0 -13
  328. package/tailwind/index.ts +0 -7
  329. package/tailwind/safelist.tailwind.js +0 -26
  330. package/tailwind/screens.tailwind.js +0 -8
  331. package/tailwind/spacing.tailwind.js +0 -65
  332. package/tailwind/tailwind.config.hanzo-preset.d.ts +0 -5
  333. package/tailwind/tailwind.config.hanzo-preset.js +0 -915
  334. package/tailwind/tw-font-desc.ts +0 -15
  335. package/tailwind/typo-plugin/get-plugin-styles.js +0 -679
  336. package/tailwind/typo-plugin/index.d.ts +0 -9
  337. package/tailwind/typo-plugin/index.js +0 -141
  338. package/tailwind/typo-plugin/utils.js +0 -60
  339. package/tailwind/typography-test.mdx +0 -35
  340. package/tailwind/z-index.tailwind.js +0 -71
  341. package/types/animation-def.ts +0 -3
  342. package/types/breakpoints.ts +0 -11
  343. package/types/bullet-item.ts +0 -10
  344. package/types/button-def.ts +0 -39
  345. package/types/dimensions.ts +0 -8
  346. package/types/grid-def.ts +0 -56
  347. package/types/image-def.ts +0 -32
  348. package/types/index.ts +0 -30
  349. package/types/link-def.ts +0 -56
  350. package/types/media-stack-def.ts +0 -31
  351. package/types/t-shirt-size.ts +0 -5
  352. package/types/tshirt-dimensions.ts +0 -20
  353. package/types/video-def.ts +0 -25
  354. package/util/blob.ts +0 -33
  355. package/util/copy-to-clipboard.ts +0 -17
  356. package/util/create-shadow-root.ts +0 -22
  357. package/util/date.ts +0 -84
  358. package/util/debounce.ts +0 -11
  359. package/util/file.ts +0 -15
  360. package/util/format-and-abbreviate-as-currency.ts +0 -125
  361. package/util/format-text.ts +0 -34
  362. package/util/format-to-max-char.ts +0 -68
  363. package/util/index-client.ts +0 -3
  364. package/util/index.ts +0 -112
  365. package/util/number-abbreviate.ts +0 -49
  366. package/util/specifier.ts +0 -43
  367. package/util/spread-to-transform.ts +0 -25
  368. package/util/step-animation.ts +0 -90
  369. package/util/timing.ts +0 -3
  370. package/util/toasts.tsx +0 -17
  371. package/util/two-way-map.ts +0 -19
@@ -1,6 +0,0 @@
1
- export { LoginBasic } from './login-basic'
2
- export { LoginSocial } from './login-social'
3
- export { Login2FA } from './login-2fa'
4
- export { Signup } from './signup'
5
- export { PasswordReset } from './password-reset'
6
- export { MagicLink } from './magic-link'
@@ -1,165 +0,0 @@
1
- 'use client'
2
-
3
- import { useState } from 'react'
4
- import { cn } from '@hanzo/ui/util'
5
- import { Button } from '@hanzo/ui/primitives'
6
- import {
7
- Card,
8
- CardContent,
9
- CardDescription,
10
- CardHeader,
11
- CardTitle,
12
- } from '@hanzo/ui/primitives'
13
- import { Input } from '@hanzo/ui/primitives'
14
- import { Label } from '@hanzo/ui/primitives'
15
- import {
16
- InputOTP,
17
- InputOTPGroup,
18
- InputOTPSeparator,
19
- InputOTPSlot,
20
- } from '@hanzo/ui/primitives'
21
-
22
- interface Login2FAProps extends React.ComponentPropsWithoutRef<'div'> {
23
- onSubmit?: (email: string, password: string, code?: string) => void
24
- onResendCode?: () => void
25
- onForgotPassword?: () => void
26
- onSignUp?: () => void
27
- }
28
-
29
- export function Login2FA({
30
- className,
31
- onSubmit,
32
- onResendCode,
33
- onForgotPassword,
34
- onSignUp,
35
- ...props
36
- }: Login2FAProps) {
37
- const [step, setStep] = useState<'credentials' | '2fa'>('credentials')
38
- const [credentials, setCredentials] = useState({ email: '', password: '' })
39
- const [otpValue, setOtpValue] = useState('')
40
-
41
- const handleCredentialsSubmit = (e: React.FormEvent<HTMLFormElement>) => {
42
- e.preventDefault()
43
- const formData = new FormData(e.currentTarget)
44
- const email = formData.get('email') as string
45
- const password = formData.get('password') as string
46
- setCredentials({ email, password })
47
- setStep('2fa')
48
- }
49
-
50
- const handleOTPSubmit = (e: React.FormEvent<HTMLFormElement>) => {
51
- e.preventDefault()
52
- onSubmit?.(credentials.email, credentials.password, otpValue)
53
- }
54
-
55
- return (
56
- <div className={cn('flex flex-col gap-6', className)} {...props}>
57
- <Card>
58
- <CardHeader>
59
- <CardTitle className="text-2xl">
60
- {step === 'credentials' ? 'Login' : 'Two-factor authentication'}
61
- </CardTitle>
62
- <CardDescription>
63
- {step === 'credentials'
64
- ? 'Enter your email and password to login'
65
- : 'Enter the 6-digit code from your authenticator app'}
66
- </CardDescription>
67
- </CardHeader>
68
- <CardContent>
69
- {step === 'credentials' ? (
70
- <form onSubmit={handleCredentialsSubmit}>
71
- <div className="flex flex-col gap-6">
72
- <div className="grid gap-2">
73
- <Label htmlFor="email">Email</Label>
74
- <Input
75
- id="email"
76
- name="email"
77
- type="email"
78
- placeholder="m@example.com"
79
- required
80
- />
81
- </div>
82
- <div className="grid gap-2">
83
- <div className="flex items-center">
84
- <Label htmlFor="password">Password</Label>
85
- {onForgotPassword && (
86
- <button
87
- type="button"
88
- onClick={onForgotPassword}
89
- className="ml-auto inline-block text-sm underline-offset-4 hover:underline"
90
- >
91
- Forgot your password?
92
- </button>
93
- )}
94
- </div>
95
- <Input id="password" name="password" type="password" required />
96
- </div>
97
- <Button type="submit" className="w-full">
98
- Continue
99
- </Button>
100
- </div>
101
- {onSignUp && (
102
- <div className="mt-4 text-center text-sm">
103
- Don&apos;t have an account?{' '}
104
- <button
105
- type="button"
106
- onClick={onSignUp}
107
- className="underline underline-offset-4"
108
- >
109
- Sign up
110
- </button>
111
- </div>
112
- )}
113
- </form>
114
- ) : (
115
- <form onSubmit={handleOTPSubmit}>
116
- <div className="flex flex-col gap-6">
117
- <div className="flex justify-center">
118
- <InputOTP
119
- maxLength={6}
120
- value={otpValue}
121
- onChange={(value) => setOtpValue(value)}
122
- >
123
- <InputOTPGroup>
124
- <InputOTPSlot index={0} />
125
- <InputOTPSlot index={1} />
126
- <InputOTPSlot index={2} />
127
- </InputOTPGroup>
128
- <InputOTPSeparator />
129
- <InputOTPGroup>
130
- <InputOTPSlot index={3} />
131
- <InputOTPSlot index={4} />
132
- <InputOTPSlot index={5} />
133
- </InputOTPGroup>
134
- </InputOTP>
135
- </div>
136
- <Button type="submit" className="w-full" disabled={otpValue.length !== 6}>
137
- Verify
138
- </Button>
139
- <div className="flex flex-col gap-2">
140
- <Button
141
- type="button"
142
- variant="outline"
143
- className="w-full"
144
- onClick={() => setStep('credentials')}
145
- >
146
- Back to login
147
- </Button>
148
- {onResendCode && (
149
- <button
150
- type="button"
151
- onClick={onResendCode}
152
- className="text-center text-sm underline underline-offset-4"
153
- >
154
- Didn&apos;t receive a code? Resend
155
- </button>
156
- )}
157
- </div>
158
- </div>
159
- </form>
160
- )}
161
- </CardContent>
162
- </Card>
163
- </div>
164
- )
165
- }
@@ -1,94 +0,0 @@
1
- 'use client'
2
-
3
- import { cn } from '@hanzo/ui/util'
4
- import { Button } from '@hanzo/ui/primitives'
5
- import {
6
- Card,
7
- CardContent,
8
- CardDescription,
9
- CardHeader,
10
- CardTitle,
11
- } from '@hanzo/ui/primitives'
12
- import { Input } from '@hanzo/ui/primitives'
13
- import { Label } from '@hanzo/ui/primitives'
14
-
15
- interface LoginBasicProps extends React.ComponentPropsWithoutRef<'div'> {
16
- onSubmit?: (email: string, password: string) => void
17
- onForgotPassword?: () => void
18
- onSignUp?: () => void
19
- }
20
-
21
- export function LoginBasic({
22
- className,
23
- onSubmit,
24
- onForgotPassword,
25
- onSignUp,
26
- ...props
27
- }: LoginBasicProps) {
28
- const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
29
- e.preventDefault()
30
- const formData = new FormData(e.currentTarget)
31
- const email = formData.get('email') as string
32
- const password = formData.get('password') as string
33
- onSubmit?.(email, password)
34
- }
35
-
36
- return (
37
- <div className={cn('flex flex-col gap-6', className)} {...props}>
38
- <Card>
39
- <CardHeader>
40
- <CardTitle className="text-2xl">Login</CardTitle>
41
- <CardDescription>
42
- Enter your email below to login to your account
43
- </CardDescription>
44
- </CardHeader>
45
- <CardContent>
46
- <form onSubmit={handleSubmit}>
47
- <div className="flex flex-col gap-6">
48
- <div className="grid gap-2">
49
- <Label htmlFor="email">Email</Label>
50
- <Input
51
- id="email"
52
- name="email"
53
- type="email"
54
- placeholder="m@example.com"
55
- required
56
- />
57
- </div>
58
- <div className="grid gap-2">
59
- <div className="flex items-center">
60
- <Label htmlFor="password">Password</Label>
61
- {onForgotPassword && (
62
- <button
63
- type="button"
64
- onClick={onForgotPassword}
65
- className="ml-auto inline-block text-sm underline-offset-4 hover:underline"
66
- >
67
- Forgot your password?
68
- </button>
69
- )}
70
- </div>
71
- <Input id="password" name="password" type="password" required />
72
- </div>
73
- <Button type="submit" className="w-full">
74
- Login
75
- </Button>
76
- </div>
77
- {onSignUp && (
78
- <div className="mt-4 text-center text-sm">
79
- Don&apos;t have an account?{' '}
80
- <button
81
- type="button"
82
- onClick={onSignUp}
83
- className="underline underline-offset-4"
84
- >
85
- Sign up
86
- </button>
87
- </div>
88
- )}
89
- </form>
90
- </CardContent>
91
- </Card>
92
- </div>
93
- )
94
- }
@@ -1,148 +0,0 @@
1
- 'use client'
2
-
3
- import { cn } from '@hanzo/ui/util'
4
- import { Button } from '@hanzo/ui/primitives'
5
- import {
6
- Card,
7
- CardContent,
8
- CardDescription,
9
- CardHeader,
10
- CardTitle,
11
- } from '@hanzo/ui/primitives'
12
- import { Input } from '@hanzo/ui/primitives'
13
- import { Label } from '@hanzo/ui/primitives'
14
- import { Icons } from '@hanzo/ui/primitives'
15
-
16
- interface LoginSocialProps extends React.ComponentPropsWithoutRef<'div'> {
17
- onSubmit?: (email: string, password: string) => void
18
- onGoogleLogin?: () => void
19
- onGitHubLogin?: () => void
20
- onTwitterLogin?: () => void
21
- onForgotPassword?: () => void
22
- onSignUp?: () => void
23
- }
24
-
25
- export function LoginSocial({
26
- className,
27
- onSubmit,
28
- onGoogleLogin,
29
- onGitHubLogin,
30
- onTwitterLogin,
31
- onForgotPassword,
32
- onSignUp,
33
- ...props
34
- }: LoginSocialProps) {
35
- const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
36
- e.preventDefault()
37
- const formData = new FormData(e.currentTarget)
38
- const email = formData.get('email') as string
39
- const password = formData.get('password') as string
40
- onSubmit?.(email, password)
41
- }
42
-
43
- return (
44
- <div className={cn('flex flex-col gap-6', className)} {...props}>
45
- <Card>
46
- <CardHeader>
47
- <CardTitle className="text-2xl">Login</CardTitle>
48
- <CardDescription>
49
- Enter your email below to login to your account
50
- </CardDescription>
51
- </CardHeader>
52
- <CardContent>
53
- <form onSubmit={handleSubmit}>
54
- <div className="flex flex-col gap-6">
55
- <div className="grid gap-2">
56
- <Label htmlFor="email">Email</Label>
57
- <Input
58
- id="email"
59
- name="email"
60
- type="email"
61
- placeholder="m@example.com"
62
- required
63
- />
64
- </div>
65
- <div className="grid gap-2">
66
- <div className="flex items-center">
67
- <Label htmlFor="password">Password</Label>
68
- {onForgotPassword && (
69
- <button
70
- type="button"
71
- onClick={onForgotPassword}
72
- className="ml-auto inline-block text-sm underline-offset-4 hover:underline"
73
- >
74
- Forgot your password?
75
- </button>
76
- )}
77
- </div>
78
- <Input id="password" name="password" type="password" required />
79
- </div>
80
- <Button type="submit" className="w-full">
81
- Login
82
- </Button>
83
-
84
- <div className="relative">
85
- <div className="absolute inset-0 flex items-center">
86
- <span className="w-full border-t" />
87
- </div>
88
- <div className="relative flex justify-center text-xs uppercase">
89
- <span className="bg-background px-2 text-muted-foreground">
90
- Or continue with
91
- </span>
92
- </div>
93
- </div>
94
-
95
- <div className="grid gap-2">
96
- {onGoogleLogin && (
97
- <Button
98
- type="button"
99
- variant="outline"
100
- className="w-full"
101
- onClick={onGoogleLogin}
102
- >
103
- <Icons.google className="mr-2 h-4 w-4" />
104
- Google
105
- </Button>
106
- )}
107
- {onGitHubLogin && (
108
- <Button
109
- type="button"
110
- variant="outline"
111
- className="w-full"
112
- onClick={onGitHubLogin}
113
- >
114
- <Icons.gitHub className="mr-2 h-4 w-4" />
115
- GitHub
116
- </Button>
117
- )}
118
- {onTwitterLogin && (
119
- <Button
120
- type="button"
121
- variant="outline"
122
- className="w-full"
123
- onClick={onTwitterLogin}
124
- >
125
- <Icons.twitter className="mr-2 h-4 w-4" />
126
- Twitter
127
- </Button>
128
- )}
129
- </div>
130
- </div>
131
- {onSignUp && (
132
- <div className="mt-4 text-center text-sm">
133
- Don&apos;t have an account?{' '}
134
- <button
135
- type="button"
136
- onClick={onSignUp}
137
- className="underline underline-offset-4"
138
- >
139
- Sign up
140
- </button>
141
- </div>
142
- )}
143
- </form>
144
- </CardContent>
145
- </Card>
146
- </div>
147
- )
148
- }
@@ -1,129 +0,0 @@
1
- 'use client'
2
-
3
- import { useState } from 'react'
4
- import { cn } from '@hanzo/ui/util'
5
- import { Button } from '@hanzo/ui/primitives'
6
- import {
7
- Card,
8
- CardContent,
9
- CardDescription,
10
- CardHeader,
11
- CardTitle,
12
- } from '@hanzo/ui/primitives'
13
- import { Input } from '@hanzo/ui/primitives'
14
- import { Label } from '@hanzo/ui/primitives'
15
- import { Icons } from '@hanzo/ui/primitives'
16
-
17
- interface MagicLinkProps extends React.ComponentPropsWithoutRef<'div'> {
18
- onSubmit?: (email: string) => void
19
- onSignUp?: () => void
20
- onUsePassword?: () => void
21
- }
22
-
23
- export function MagicLink({
24
- className,
25
- onSubmit,
26
- onSignUp,
27
- onUsePassword,
28
- ...props
29
- }: MagicLinkProps) {
30
- const [sent, setSent] = useState(false)
31
- const [email, setEmail] = useState('')
32
-
33
- const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
34
- e.preventDefault()
35
- const formData = new FormData(e.currentTarget)
36
- const emailValue = formData.get('email') as string
37
- setEmail(emailValue)
38
- setSent(true)
39
- onSubmit?.(emailValue)
40
- }
41
-
42
- return (
43
- <div className={cn('flex flex-col gap-6', className)} {...props}>
44
- <Card>
45
- <CardHeader>
46
- <CardTitle className="text-2xl">
47
- {sent ? 'Check your email' : 'Sign in with email'}
48
- </CardTitle>
49
- <CardDescription>
50
- {sent
51
- ? `We've sent a magic link to ${email}`
52
- : 'We'll send you a magic link to sign in instantly'}
53
- </CardDescription>
54
- </CardHeader>
55
- <CardContent>
56
- {sent ? (
57
- <div className="flex flex-col gap-6">
58
- <div className="flex justify-center">
59
- <div className="rounded-full bg-primary/10 p-6">
60
- <Icons.mail className="h-8 w-8 text-primary" />
61
- </div>
62
- </div>
63
- <div className="text-center text-sm text-muted-foreground">
64
- Click the link in your email to sign in. The link will expire in 10 minutes.
65
- </div>
66
- <div className="flex flex-col gap-2">
67
- <Button
68
- type="button"
69
- variant="outline"
70
- className="w-full"
71
- onClick={() => setSent(false)}
72
- >
73
- Try a different email
74
- </Button>
75
- <button
76
- type="button"
77
- onClick={() => onSubmit?.(email)}
78
- className="text-center text-sm underline underline-offset-4"
79
- >
80
- Didn&apos;t receive the email? Resend
81
- </button>
82
- </div>
83
- </div>
84
- ) : (
85
- <form onSubmit={handleSubmit}>
86
- <div className="flex flex-col gap-6">
87
- <div className="grid gap-2">
88
- <Label htmlFor="email">Email</Label>
89
- <Input
90
- id="email"
91
- name="email"
92
- type="email"
93
- placeholder="m@example.com"
94
- required
95
- />
96
- </div>
97
- <Button type="submit" className="w-full">
98
- Send magic link
99
- </Button>
100
- {onUsePassword && (
101
- <Button
102
- type="button"
103
- variant="outline"
104
- className="w-full"
105
- onClick={onUsePassword}
106
- >
107
- Use password instead
108
- </Button>
109
- )}
110
- </div>
111
- {onSignUp && (
112
- <div className="mt-4 text-center text-sm">
113
- Don&apos;t have an account?{' '}
114
- <button
115
- type="button"
116
- onClick={onSignUp}
117
- className="underline underline-offset-4"
118
- >
119
- Sign up
120
- </button>
121
- </div>
122
- )}
123
- </form>
124
- )}
125
- </CardContent>
126
- </Card>
127
- </div>
128
- )
129
- }
@@ -1,97 +0,0 @@
1
- 'use client'
2
-
3
- import { cn } from '@hanzo/ui/util'
4
- import { Button } from '@hanzo/ui/primitives'
5
- import {
6
- Card,
7
- CardContent,
8
- CardDescription,
9
- CardHeader,
10
- CardTitle,
11
- } from '@hanzo/ui/primitives'
12
- import { Input } from '@hanzo/ui/primitives'
13
- import { Label } from '@hanzo/ui/primitives'
14
-
15
- interface PasswordResetProps extends React.ComponentPropsWithoutRef<'div'> {
16
- onSubmit?: (email: string) => void
17
- onBackToLogin?: () => void
18
- sent?: boolean
19
- }
20
-
21
- export function PasswordReset({
22
- className,
23
- onSubmit,
24
- onBackToLogin,
25
- sent = false,
26
- ...props
27
- }: PasswordResetProps) {
28
- const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
29
- e.preventDefault()
30
- const formData = new FormData(e.currentTarget)
31
- const email = formData.get('email') as string
32
- onSubmit?.(email)
33
- }
34
-
35
- return (
36
- <div className={cn('flex flex-col gap-6', className)} {...props}>
37
- <Card>
38
- <CardHeader>
39
- <CardTitle className="text-2xl">Reset password</CardTitle>
40
- <CardDescription>
41
- {sent
42
- ? 'Check your email for a password reset link'
43
- : 'Enter your email address and we will send you a password reset link'}
44
- </CardDescription>
45
- </CardHeader>
46
- <CardContent>
47
- {sent ? (
48
- <div className="flex flex-col gap-6">
49
- <div className="text-center text-sm text-muted-foreground">
50
- We&apos;ve sent a password reset link to your email address.
51
- Please check your inbox and follow the instructions to reset your password.
52
- </div>
53
- {onBackToLogin && (
54
- <Button
55
- type="button"
56
- variant="outline"
57
- className="w-full"
58
- onClick={onBackToLogin}
59
- >
60
- Back to login
61
- </Button>
62
- )}
63
- </div>
64
- ) : (
65
- <form onSubmit={handleSubmit}>
66
- <div className="flex flex-col gap-6">
67
- <div className="grid gap-2">
68
- <Label htmlFor="email">Email</Label>
69
- <Input
70
- id="email"
71
- name="email"
72
- type="email"
73
- placeholder="m@example.com"
74
- required
75
- />
76
- </div>
77
- <Button type="submit" className="w-full">
78
- Send reset link
79
- </Button>
80
- {onBackToLogin && (
81
- <Button
82
- type="button"
83
- variant="outline"
84
- className="w-full"
85
- onClick={onBackToLogin}
86
- >
87
- Back to login
88
- </Button>
89
- )}
90
- </div>
91
- </form>
92
- )}
93
- </CardContent>
94
- </Card>
95
- </div>
96
- )
97
- }