@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.
- package/dist/accordion.js +1 -0
- package/dist/accordion.mjs +1 -0
- package/dist/alert-dialog.js +1 -0
- package/dist/alert-dialog.mjs +1 -0
- package/dist/alert.js +1 -0
- package/dist/alert.mjs +1 -0
- package/dist/avatar.js +1 -0
- package/dist/avatar.mjs +1 -0
- package/dist/badge.js +1 -0
- package/dist/badge.mjs +1 -0
- package/dist/breadcrumb.js +1 -0
- package/dist/breadcrumb.mjs +1 -0
- package/dist/calendar.js +1 -0
- package/dist/calendar.mjs +1 -0
- package/dist/carousel.js +1 -0
- package/dist/carousel.mjs +1 -0
- package/dist/checkbox.js +1 -0
- package/dist/checkbox.mjs +1 -0
- package/dist/chunk-3H5S2OQ3.mjs +1 -0
- package/dist/chunk-5GRJ7UQX.js +1 -0
- package/dist/chunk-63HNMH7C.js +1 -0
- package/dist/chunk-72TOQ4DM.mjs +1 -0
- package/dist/chunk-7AEFTV5R.mjs +1 -0
- package/dist/chunk-7M4AVV2R.js +1 -0
- package/dist/chunk-DKPVJSBC.js +1 -0
- package/dist/chunk-EI7MMDWY.js +1 -0
- package/dist/chunk-GANGDIZG.mjs +1 -0
- package/dist/chunk-GRGT2Z4K.js +1 -0
- package/dist/chunk-JCUUC6NY.mjs +1 -0
- package/dist/chunk-JUQMWLIN.js +1 -0
- package/dist/chunk-PRVEIITE.js +1 -0
- package/dist/chunk-SH52AKNZ.js +1 -0
- package/dist/chunk-TU67EJEW.mjs +1 -0
- package/dist/chunk-WN5KN73U.mjs +1 -0
- package/dist/chunk-YSXGDEY5.mjs +1 -0
- package/dist/chunk-Z76OOVUE.mjs +1 -0
- package/dist/collapsible.js +1 -0
- package/dist/collapsible.mjs +1 -0
- package/dist/command.js +1 -0
- package/dist/command.mjs +1 -0
- package/dist/context-menu.js +1 -0
- package/dist/context-menu.mjs +1 -0
- package/dist/dialog.js +1 -0
- package/dist/dialog.mjs +1 -0
- package/dist/drawer.js +1 -0
- package/dist/drawer.mjs +1 -0
- package/dist/dropdown-menu.js +1 -0
- package/dist/dropdown-menu.mjs +1 -0
- package/dist/form.js +1 -0
- package/dist/form.mjs +1 -0
- package/dist/hover-card.js +1 -0
- package/dist/hover-card.mjs +1 -0
- package/dist/index.js +1 -9079
- package/dist/index.mjs +1 -8700
- package/dist/input-otp.js +1 -0
- package/dist/input-otp.mjs +1 -0
- package/dist/lib/utils.js +1 -0
- package/dist/lib/utils.mjs +1 -0
- package/dist/navigation-menu.js +1 -0
- package/dist/navigation-menu.mjs +1 -0
- package/dist/popover.js +1 -0
- package/dist/popover.mjs +1 -0
- package/dist/progress.js +1 -0
- package/dist/progress.mjs +1 -0
- package/dist/radio-group.js +1 -0
- package/dist/radio-group.mjs +1 -0
- package/dist/resizable.js +1 -0
- package/dist/resizable.mjs +1 -0
- package/dist/scroll-area.js +1 -0
- package/dist/scroll-area.mjs +1 -0
- package/dist/select.js +1 -0
- package/dist/select.mjs +1 -0
- package/dist/separator.js +1 -0
- package/dist/separator.mjs +1 -0
- package/dist/sheet.js +1 -0
- package/dist/sheet.mjs +1 -0
- package/dist/skeleton.js +1 -0
- package/dist/skeleton.mjs +1 -0
- package/dist/slider.js +1 -0
- package/dist/slider.mjs +1 -0
- package/dist/sonner.js +1 -0
- package/dist/sonner.mjs +1 -0
- package/dist/src/utils.js +1 -0
- package/dist/src/utils.mjs +1 -0
- package/dist/switch.js +1 -0
- package/dist/switch.mjs +1 -0
- package/dist/table.js +1 -0
- package/dist/table.mjs +1 -0
- package/dist/tabs.js +1 -0
- package/dist/tabs.mjs +1 -0
- package/dist/tailwind/index.js +1 -0
- package/dist/tailwind/index.mjs +1 -0
- package/dist/textarea.js +1 -0
- package/dist/textarea.mjs +1 -0
- package/dist/toggle-group.js +1 -0
- package/dist/toggle-group.mjs +1 -0
- package/dist/toggle.js +1 -0
- package/dist/toggle.mjs +1 -0
- package/dist/tooltip.js +1 -0
- package/dist/tooltip.mjs +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/index.mjs +1 -0
- package/package.json +110 -81
- package/assets/ai-icons.tsx +0 -207
- package/assets/crypto.tsx +0 -33
- package/assets/file-type-icon.tsx +0 -66
- package/assets/file.tsx +0 -45
- package/assets/general.tsx +0 -2318
- package/assets/hanzo-logo.svg +0 -9
- package/assets/hanzo-logo.tsx +0 -17
- package/assets/index.ts +0 -122
- package/assets/index.tsx +0 -4
- package/assets/llm-provider.tsx +0 -1094
- package/blocks/auth/index.ts +0 -6
- package/blocks/auth/login-2fa.tsx +0 -165
- package/blocks/auth/login-basic.tsx +0 -94
- package/blocks/auth/login-social.tsx +0 -148
- package/blocks/auth/magic-link.tsx +0 -129
- package/blocks/auth/password-reset.tsx +0 -97
- package/blocks/auth/signup.tsx +0 -157
- package/blocks/components/accordian-block.tsx +0 -48
- package/blocks/components/block-component-props.ts +0 -11
- package/blocks/components/bullet-cards-block.tsx +0 -46
- package/blocks/components/card-block/index.tsx +0 -171
- package/blocks/components/card-block/link-out-button.tsx +0 -20
- package/blocks/components/card-block/util.ts +0 -28
- package/blocks/components/carte-blanche-block/index.tsx +0 -127
- package/blocks/components/carte-blanche-block/variant-content-left.tsx +0 -49
- package/blocks/components/content.tsx +0 -70
- package/blocks/components/cta-block.tsx +0 -115
- package/blocks/components/enh-heading-block.tsx +0 -204
- package/blocks/components/grid-block/grid-block-mutator.ts +0 -12
- package/blocks/components/grid-block/index.tsx +0 -83
- package/blocks/components/grid-block/mutator-registry.ts +0 -10
- package/blocks/components/grid-block/table-borders.mutator.ts +0 -47
- package/blocks/components/group-block.tsx +0 -83
- package/blocks/components/heading-block.tsx +0 -88
- package/blocks/components/image-block.tsx +0 -111
- package/blocks/components/index.ts +0 -30
- package/blocks/components/screenful-block/content.tsx +0 -123
- package/blocks/components/screenful-block/index.tsx +0 -107
- package/blocks/components/screenful-block/poster-background.tsx +0 -34
- package/blocks/components/screenful-block/video-background.tsx +0 -45
- package/blocks/components/space-block.tsx +0 -66
- package/blocks/components/video-block.tsx +0 -138
- package/blocks/data-display/activity-feed.tsx +0 -242
- package/blocks/data-display/data-table.tsx +0 -235
- package/blocks/data-display/stats-grid.tsx +0 -194
- package/blocks/def/accordian-block.ts +0 -14
- package/blocks/def/block.ts +0 -7
- package/blocks/def/bullet-cards-block.ts +0 -22
- package/blocks/def/card-block.ts +0 -22
- package/blocks/def/carte-blanche-block.ts +0 -21
- package/blocks/def/cta-block.ts +0 -19
- package/blocks/def/element-block.ts +0 -11
- package/blocks/def/enh-heading-block.ts +0 -44
- package/blocks/def/grid-block.ts +0 -16
- package/blocks/def/group-block.ts +0 -11
- package/blocks/def/heading-block.ts +0 -15
- package/blocks/def/image-block.ts +0 -31
- package/blocks/def/index.ts +0 -35
- package/blocks/def/screenful-block.ts +0 -54
- package/blocks/def/space-block.ts +0 -64
- package/blocks/def/video-block.ts +0 -9
- package/blocks/ecommerce/checkout.tsx +0 -242
- package/blocks/ecommerce/index.ts +0 -7
- package/blocks/ecommerce/product-detail.tsx +0 -257
- package/blocks/ecommerce/product-grid.tsx +0 -148
- package/blocks/ecommerce/shopping-cart.tsx +0 -181
- package/blocks/index.ts +0 -2
- package/blocks/marketing/cta-section.tsx +0 -207
- package/blocks/marketing/faq.tsx +0 -159
- package/blocks/marketing/features-grid.tsx +0 -156
- package/blocks/marketing/hero-section.tsx +0 -192
- package/blocks/marketing/index.ts +0 -6
- package/blocks/marketing/pricing-table.tsx +0 -121
- package/blocks/marketing/testimonials.tsx +0 -196
- package/components/index.ts +0 -9
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/tailwind.js +0 -2025
- package/dist/tailwind.js.map +0 -1
- package/dist/tailwind.mjs +0 -2013
- package/dist/tailwind.mjs.map +0 -1
- package/dist/types.js +0 -59
- package/dist/types.js.map +0 -1
- package/dist/types.mjs +0 -53
- package/dist/types.mjs.map +0 -1
- package/dist/utils.js +0 -30
- package/dist/utils.js.map +0 -1
- package/dist/utils.mjs +0 -26
- package/dist/utils.mjs.map +0 -1
- package/frameworks/core/index.ts +0 -6
- package/frameworks/core/utils/index.ts +0 -64
- package/frameworks/react/components/button.tsx +0 -26
- package/frameworks/react/components/index.ts +0 -5
- package/frameworks/react/hooks/index.ts +0 -5
- package/frameworks/react/index.ts +0 -9
- package/frameworks/react/package.json +0 -8
- package/frameworks/react/utils/index.ts +0 -2
- package/frameworks/react-native/index.ts +0 -9
- package/frameworks/react-native/package.json +0 -8
- package/frameworks/registry.json +0 -371
- package/frameworks/setup.sh +0 -69
- package/frameworks/svelte/index.ts +0 -9
- package/frameworks/svelte/package.json +0 -8
- package/frameworks/tracker.json +0 -1854
- package/frameworks/vue/index.ts +0 -9
- package/frameworks/vue/package.json +0 -8
- package/helpers/file.ts +0 -33
- package/helpers/memoization.ts +0 -40
- package/primitives/accordion.tsx +0 -74
- package/primitives/action-button.tsx +0 -42
- package/primitives/alert-dialog.tsx +0 -185
- package/primitives/alert.tsx +0 -74
- package/primitives/apply-typography.tsx +0 -55
- package/primitives/aspect-ratio.tsx +0 -5
- package/primitives/avatar.tsx +0 -57
- package/primitives/background-beams.tsx +0 -142
- package/primitives/badge.tsx +0 -45
- package/primitives/breadcrumb.tsx +0 -130
- package/primitives/breakpoint-indicator.tsx +0 -19
- package/primitives/button.tsx +0 -72
- package/primitives/calendar.tsx +0 -72
- package/primitives/card.tsx +0 -97
- package/primitives/carousel.tsx +0 -238
- package/primitives/chat/chat-input-area.tsx +0 -88
- package/primitives/chat/chat-input.tsx +0 -71
- package/primitives/chat/files-preview.tsx +0 -331
- package/primitives/chat/index.ts +0 -6
- package/primitives/chat/json-form.tsx +0 -8
- package/primitives/chat/message-list.tsx +0 -308
- package/primitives/chat/message.tsx +0 -569
- package/primitives/chat/sqlite-preview.tsx +0 -215
- package/primitives/checkbox.tsx +0 -32
- package/primitives/collapsible.tsx +0 -9
- package/primitives/combobox.tsx +0 -239
- package/primitives/command.tsx +0 -151
- package/primitives/context-menu.tsx +0 -206
- package/primitives/copy-to-clipboard-icon.tsx +0 -60
- package/primitives/dialog-video-controller.tsx +0 -38
- package/primitives/dialog.tsx +0 -128
- package/primitives/dot-pattern.tsx +0 -57
- package/primitives/dots-loader.tsx +0 -13
- package/primitives/drawer.tsx +0 -113
- package/primitives/dropdown-menu.tsx +0 -199
- package/primitives/error-message.tsx +0 -19
- package/primitives/file-uploader.tsx +0 -203
- package/primitives/form.tsx +0 -185
- package/primitives/hover-card.tsx +0 -28
- package/primitives/icons/github.tsx +0 -14
- package/primitives/icons/index.ts +0 -18
- package/primitives/icons/youtube-logo.tsx +0 -59
- package/primitives/index-client.ts +0 -4
- package/primitives/index-common.ts +0 -304
- package/primitives/index-next.ts +0 -4
- package/primitives/input-otp.tsx +0 -65
- package/primitives/input.tsx +0 -128
- package/primitives/label.tsx +0 -21
- package/primitives/list-adaptor.ts +0 -12
- package/primitives/list-box.tsx +0 -74
- package/primitives/loading-spinner.tsx +0 -33
- package/primitives/markdown-preview.tsx +0 -612
- package/primitives/mermaid.tsx +0 -196
- package/primitives/navigation-menu.tsx +0 -147
- package/primitives/next/image.tsx +0 -91
- package/primitives/next/index.ts +0 -7
- package/primitives/next/inline-icon.tsx +0 -36
- package/primitives/next/link-element.tsx +0 -109
- package/primitives/next/mdx-link.tsx +0 -22
- package/primitives/next/media-stack.tsx +0 -52
- package/primitives/next/nav-items.tsx +0 -45
- package/primitives/next/youtube-embed.tsx +0 -83
- package/primitives/pagination.tsx +0 -117
- package/primitives/popover.tsx +0 -34
- package/primitives/pretty-json-print.tsx +0 -28
- package/primitives/progress.tsx +0 -27
- package/primitives/prompt-textarea.tsx +0 -72
- package/primitives/qr-code.tsx +0 -112
- package/primitives/radio-group.tsx +0 -42
- package/primitives/resizable.tsx +0 -47
- package/primitives/scroll-area.tsx +0 -57
- package/primitives/search-input.tsx +0 -66
- package/primitives/select.tsx +0 -122
- package/primitives/separator.tsx +0 -26
- package/primitives/sheet.tsx +0 -139
- package/primitives/skeleton.tsx +0 -18
- package/primitives/slider.tsx +0 -63
- package/primitives/sonner.tsx +0 -35
- package/primitives/step-indicator.tsx +0 -69
- package/primitives/stepper.tsx +0 -272
- package/primitives/switch.tsx +0 -27
- package/primitives/table.tsx +0 -105
- package/primitives/tabs.tsx +0 -50
- package/primitives/text-area.tsx +0 -26
- package/primitives/text-link.tsx +0 -27
- package/primitives/textarea.tsx +0 -64
- package/primitives/textfield.tsx +0 -78
- package/primitives/toast.tsx +0 -30
- package/primitives/toggle-group.tsx +0 -63
- package/primitives/toggle.tsx +0 -44
- package/primitives/tooltip.tsx +0 -47
- package/primitives/video-player.tsx +0 -23
- package/src/button.ts +0 -1
- package/src/hooks/index.ts +0 -7
- package/src/hooks/use-click-away.ts +0 -31
- package/src/hooks/use-combined-refs.ts +0 -22
- package/src/hooks/use-copy-clipboard.ts +0 -30
- package/src/hooks/use-debounce.ts +0 -17
- package/src/hooks/use-fill-ids.ts +0 -25
- package/src/hooks/use-map.ts +0 -26
- package/src/hooks/use-measure.ts +0 -42
- package/src/hooks/use-reverse-video-playback.ts +0 -43
- package/src/hooks/use-scroll-restoration.ts +0 -50
- package/src/index-lean.ts +0 -87
- package/src/index.ts +0 -54
- package/src/mcp/README.md +0 -141
- package/src/mcp/enhanced-server.ts +0 -1208
- package/src/mcp/index.ts +0 -518
- package/src/mcp/package.json +0 -10
- package/src/registry/api.ts +0 -164
- package/src/registry/index.ts +0 -60
- package/src/registry/package.json +0 -10
- package/src/utils.ts +0 -19
- package/tailwind/colors.tailwind.js +0 -53
- package/tailwind/fontFamily.tailwind.ts +0 -7
- package/tailwind/fontSize.tailwind.ts +0 -13
- package/tailwind/index.ts +0 -7
- package/tailwind/safelist.tailwind.js +0 -26
- package/tailwind/screens.tailwind.js +0 -8
- package/tailwind/spacing.tailwind.js +0 -65
- package/tailwind/tailwind.config.hanzo-preset.d.ts +0 -5
- package/tailwind/tailwind.config.hanzo-preset.js +0 -915
- package/tailwind/tw-font-desc.ts +0 -15
- package/tailwind/typo-plugin/get-plugin-styles.js +0 -679
- package/tailwind/typo-plugin/index.d.ts +0 -9
- package/tailwind/typo-plugin/index.js +0 -141
- package/tailwind/typo-plugin/utils.js +0 -60
- package/tailwind/typography-test.mdx +0 -35
- package/tailwind/z-index.tailwind.js +0 -71
- package/types/animation-def.ts +0 -3
- package/types/breakpoints.ts +0 -11
- package/types/bullet-item.ts +0 -10
- package/types/button-def.ts +0 -39
- package/types/dimensions.ts +0 -8
- package/types/grid-def.ts +0 -56
- package/types/image-def.ts +0 -32
- package/types/index.ts +0 -30
- package/types/link-def.ts +0 -56
- package/types/media-stack-def.ts +0 -31
- package/types/t-shirt-size.ts +0 -5
- package/types/tshirt-dimensions.ts +0 -20
- package/types/video-def.ts +0 -25
- package/util/blob.ts +0 -33
- package/util/copy-to-clipboard.ts +0 -17
- package/util/create-shadow-root.ts +0 -22
- package/util/date.ts +0 -84
- package/util/debounce.ts +0 -11
- package/util/file.ts +0 -15
- package/util/format-and-abbreviate-as-currency.ts +0 -125
- package/util/format-text.ts +0 -34
- package/util/format-to-max-char.ts +0 -68
- package/util/index-client.ts +0 -3
- package/util/index.ts +0 -112
- package/util/number-abbreviate.ts +0 -49
- package/util/specifier.ts +0 -43
- package/util/spread-to-transform.ts +0 -25
- package/util/step-animation.ts +0 -90
- package/util/timing.ts +0 -3
- package/util/toasts.tsx +0 -17
- package/util/two-way-map.ts +0 -19
package/blocks/auth/index.ts
DELETED
|
@@ -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'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'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'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'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'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'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'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
|
-
}
|