@zerodev/wallet-react-ui 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_types/auth/index.d.ts +2 -1
- package/dist/_types/auth/index.d.ts.map +1 -1
- package/dist/_types/shared/components/PoweredBy/index.d.ts.map +1 -1
- package/dist/_types/shared/components/Screen/index.d.ts +2 -1
- package/dist/_types/shared/components/Screen/index.d.ts.map +1 -1
- package/dist/_types/shared/components/TopNav/index.d.ts.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +353 -334
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +3 -3
- package/src/auth/index.tsx +3 -0
- package/src/shared/components/PoweredBy/index.tsx +5 -4
- package/src/shared/components/Screen/index.tsx +24 -4
- package/src/shared/components/TopNav/index.tsx +4 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/shared/components/TopNav/index.tsx","../src/shared/components/Screen/EllipticalRadial.tsx","../src/shared/components/Screen/MultiRadialBackground.tsx","../src/shared/components/Screen/index.tsx","../assets/states/error.webp?no-inline","../assets/states/loading.webp?no-inline","../assets/states/send.webp?no-inline","../assets/states/success.webp?no-inline","../src/shared/components/StatusScreen/index.tsx","../src/shared/hooks/useKitStore.ts","../src/auth/hooks/useAuth.ts","../src/shared/components/PoweredBy/index.tsx","../src/auth/pages/EmailVerification.tsx","../src/auth/utils/url.ts","../src/auth/pages/ErrorScreen.tsx","../src/auth/components/CodeInput/index.tsx","../src/auth/pages/OtpInput.tsx","../src/shared/components/SignUpFooter/index.tsx","../src/shared/utils/common.ts","../src/auth/assets/blob.webm?no-inline","../src/auth/components/BlobAnimation/index.tsx","../src/auth/pages/SignUp.tsx","../src/auth/pages/Verifying.tsx","../src/auth/pages/WalletSelection.tsx","../src/auth/index.tsx","../src/auth/authStoreSlice.ts","../src/store.ts","../src/connector.ts"],"sourcesContent":["import { cn, IconButton, Text } from '@zerodev/react-ui'\nimport type { ReactNode } from 'react'\n\nexport const TOP_NAV_HEIGHT = 52\n\nexport function TopNav({\n onBack,\n onClose,\n title,\n logo,\n className,\n}: {\n onBack?: () => void\n onClose: () => void\n title?: string\n logo?: ReactNode\n className?: string\n}) {\n return (\n <div\n className={cn(\n 'zd:absolute zd:top-4 zd:left-0 zd:right-0 zd:flex zd:flex-row zd:items-center zd:justify-between',\n className,\n )}\n style={{ height: TOP_NAV_HEIGHT }}\n >\n {onBack ? (\n <IconButton iconName=\"chevronLeft\" onClick={onBack} />\n ) : (\n <div className=\"zd:h-13 zd:w-13\" />\n )}\n {logo && (\n <div className=\"zd:absolute zd:left-0 zd:right-0 zd:flex zd:items-center zd:justify-center zd:pointer-events-none\">\n {logo}\n </div>\n )}\n {title && (\n <div className=\"zd:absolute zd:left-0 zd:right-0 zd:flex zd:items-center zd:justify-center zd:pointer-events-none\">\n <Text className=\"zd:text-body1\">{title}</Text>\n </div>\n )}\n <IconButton iconName=\"x\" onClick={onClose} />\n </div>\n )\n}\n","interface RadialStop {\n offset: number\n color: string\n opacity: number\n}\n\nexport interface RadialLayer {\n id: string\n // Figma-exported gradientTransform matrix: the unit circle\n // (center 0,0 radius 1) mapped to a rotated/scaled/translated ellipse.\n matrix: [number, number, number, number, number, number]\n // Opacity of the rect the gradient fills (Figma exports this on the <rect>).\n fillOpacity: number\n stops: RadialStop[]\n}\n\n// The rect each gradient fills, in the parent SVG's viewBox coordinates.\ninterface RadialRect {\n x: number\n y: number\n width: number\n height: number\n}\n\nexport function EllipticalRadial({\n layer,\n rect,\n}: {\n layer: RadialLayer\n rect: RadialRect\n}) {\n const { id, matrix, fillOpacity, stops } = layer\n\n return (\n <>\n <defs>\n <radialGradient\n id={id}\n cx=\"0\"\n cy=\"0\"\n r=\"1\"\n gradientUnits=\"userSpaceOnUse\"\n gradientTransform={`matrix(${matrix.join(' ')})`}\n >\n {stops.map((s, i) => (\n <stop\n key={s.color + i.toString()}\n offset={s.offset}\n stopColor={s.color}\n stopOpacity={s.opacity}\n />\n ))}\n </radialGradient>\n </defs>\n <rect\n x={rect.x}\n y={rect.y}\n width={rect.width}\n height={rect.height}\n fill={`url(#${id})`}\n fillOpacity={fillOpacity}\n />\n </>\n )\n}\n","import { useId } from 'react'\n\nimport { EllipticalRadial, type RadialLayer } from './EllipticalRadial'\n\n// The design frame: the gradient layers live on a 412×812 rect offset to\n// (-6,-6) so they bleed 6px past the 400×800 card on every side — that 6px\n// reveal is the wrapper's gradient border. The matrices below are the\n// Figma-exported gradientTransform values verbatim, so rendering the SVG with\n// a matching viewBox + preserveAspectRatio=\"none\" reproduces the design 1:1\n// while still scaling to any container size.\nconst FRAME_VIEWBOX = '-6 -6 412 812'\n\nexport function MultiRadialBackground() {\n // The colorful gradient now lives entirely in CardGlow. This base layer is\n // just a flat, soft warm-white fill behind it so CardGlow's colors read\n // bright and clean, with no gray muddiers underneath.\n return (\n <div className=\"zd:absolute zd:inset-0 zd:z-0 zd:rounded-4xl zd:pointer-events-none\">\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox={FRAME_VIEWBOX}\n preserveAspectRatio=\"none\"\n role=\"img\"\n aria-label=\"Decorative gradient background\"\n >\n <rect x=\"-6\" y=\"-6\" width=\"412\" height=\"812\" fill=\"#FBF7F2\" />\n </svg>\n </div>\n )\n}\n\n// On-card overlay (400×800), sitting ON TOP of the translucent card body so its\n// color reads at full strength (the card at 0.8 opacity would otherwise wash a\n// behind-card gradient to ~20%). This reproduces the vivid orange + blue that in\n// the source design came from the decorative \"Amorphic\" blob raster overlaid on\n// the lower card, plus the design's own white card glow (Figma paint6).\n//\n// The orange + blue lobes are NOT verbatim Figma layers — they reconstruct the\n// blob's measured color footprint (orange across the lower card; blue lobe\n// bottom-left ~x 0-150 / y 600-800) as gradients, per the decision to treat the\n// blob as a background effect rather than ship the raster.\nexport function CardGlow() {\n const baseId = useId()\n // VERBATIM from the Figma `--Background-Brand-Gradient` token (6 stacked\n // radial-gradients). CSS lists topmost-first; SVG paints last-on-top, so the\n // array is the CSS list REVERSED. Each matrix is the CSS `rx% ry% at cx% cy%`\n // converted over the 400×800 frame. An upward linear fade is applied on top\n // (see the <rect> below) to soften the gradient toward the top.\n const layers: RadialLayer[] = [\n {\n // (CSS #6) blue → top-right. x-radius widened so the lobe reaches further\n // left; y-radius kept short so it stays up top and doesn't bleed into the\n // orange band.\n id: `${baseId}-blue`,\n matrix: [1850, 0, 0, 645, 381.44, 0],\n fillOpacity: 1,\n stops: [\n { offset: 0, color: '#45ABFB', opacity: 0.66 },\n { offset: 0.4615, color: '#1E9AFB', opacity: 0.35 },\n { offset: 1, color: '#45ABFB', opacity: 0 },\n ],\n },\n {\n // (CSS #5) offWhite → blue, very faint\n id: `${baseId}-offwhite-tr`,\n matrix: [55.28, 0, 0, 773.36, 386.68, 13.28],\n fillOpacity: 1,\n stops: [\n { offset: 0, color: '#F7F5F0', opacity: 0.1 },\n { offset: 1, color: '#45ABFB', opacity: 0 },\n ],\n },\n {\n // (CSS #4) warmGrey\n id: `${baseId}-warmgrey`,\n matrix: [326.72, 0, 0, 855.52, 0, 50.32],\n fillOpacity: 1,\n stops: [\n { offset: 0, color: '#E3CFC3', opacity: 1 },\n { offset: 1, color: '#E3CFC3', opacity: 0 },\n ],\n },\n {\n // (CSS #3) orange — spans the full width across the bottom ~30%, uniform.\n id: `${baseId}-orange`,\n matrix: [580, 0, 0, 380, 200, 835],\n fillOpacity: 1,\n stops: [\n { offset: 0, color: '#EE6C2E', opacity: 0.8 },\n { offset: 0.55, color: '#EE6C2E', opacity: 0.6 },\n { offset: 1, color: '#EE6C2E', opacity: 0.15 },\n ],\n },\n {\n // (CSS #2) peach — spread further up (~30% of the bottom), a bit more vivid\n id: `${baseId}-peach`,\n matrix: [520, 0, 0, 560, 180, 830],\n fillOpacity: 1,\n stops: [\n { offset: 0, color: '#FAC8AC', opacity: 1 },\n { offset: 1, color: '#F27B3E', opacity: 0 },\n ],\n },\n {\n // (CSS #1) white glow (topmost of the colour stack)\n id: `${baseId}-white-bl`,\n matrix: [90.72, 0, 0, 550.48, 38.04, 702.64],\n fillOpacity: 1,\n stops: [\n { offset: 0, color: 'white', opacity: 0.58 },\n { offset: 1, color: 'white', opacity: 0 },\n ],\n },\n ]\n\n return (\n <div className=\"zd:absolute zd:inset-0 zd:z-0 zd:rounded-4xl zd:pointer-events-none zd:overflow-hidden\">\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 400 800\"\n preserveAspectRatio=\"none\"\n role=\"presentation\"\n >\n {layers.map((layer) => (\n <EllipticalRadial\n key={layer.id}\n layer={layer}\n rect={{ x: 0, y: 0, width: 400, height: 800 }}\n />\n ))}\n {/* Vertical white fade — strongest at the bottom, easing linearly to\n nothing at the top. Softens the lower (most vivid) part of the\n gradient. A gradient layer (not an opaque card) so the frosted\n buttons composite over it cleanly. */}\n <defs>\n <linearGradient\n id={`${baseId}-vfade`}\n x1=\"0\"\n y1=\"0\"\n x2=\"0\"\n y2=\"800\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0\" stopColor=\"white\" stopOpacity=\"0.55\" />\n <stop offset=\"0.45\" stopColor=\"white\" stopOpacity=\"0.52\" />\n <stop offset=\"0.65\" stopColor=\"white\" stopOpacity=\"0.5\" />\n <stop offset=\"0.85\" stopColor=\"white\" stopOpacity=\"0.5\" />\n <stop offset=\"1\" stopColor=\"white\" stopOpacity=\"0.5\" />\n </linearGradient>\n </defs>\n <rect\n x=\"0\"\n y=\"0\"\n width=\"400\"\n height=\"800\"\n fill={`url(#${baseId}-vfade)`}\n />\n {/* Blue — a diagonal linear gradient from the bottom-left corner fading\n to transparent toward the top-right, so it blends smoothly into the\n orange with no hard edge. On top of the fade so #A7B8E2 reads true. */}\n <defs>\n <linearGradient\n id={`${baseId}-bluefade`}\n x1=\"0\"\n y1=\"800\"\n x2=\"120\"\n y2=\"640\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0\" stopColor=\"#A7B8E2\" stopOpacity=\"1\" />\n <stop offset=\"0.33\" stopColor=\"#A7B8E2\" stopOpacity=\"0.7\" />\n <stop offset=\"0.66\" stopColor=\"#A7B8E2\" stopOpacity=\"0.35\" />\n <stop offset=\"1\" stopColor=\"#A7B8E2\" stopOpacity=\"0\" />\n </linearGradient>\n </defs>\n <rect\n x=\"0\"\n y=\"0\"\n width=\"400\"\n height=\"800\"\n fill={`url(#${baseId}-bluefade)`}\n />\n </svg>\n </div>\n )\n}\n\n// The wrapper's gradient BORDER. Renders full-frame behind the inner card; the\n// card sits on top with a 6px margin so this gradient shows as the border ring.\n// Uses normalized cx/cy/rx/ry radial gradients (scale-transform) over a #130E0B\n// base — the original border look.\ntype BorderLayer = {\n id: string\n cx: number\n cy: number\n rx: number\n ry: number\n stops: { offset: number; color: string; opacity: number }[]\n}\n\nexport function WrapperBorder() {\n const baseId = useId()\n // VERBATIM from the Figma `--Background-Brand-Gradient` token (6 stacked\n // radial-gradients). CSS lists topmost-first, SVG paints last-on-top, so the\n // array is the CSS list REVERSED. Each CSS `rx% ry% at cx% cy%` maps to\n // normalized cx/cy/rx/ry (÷100); the inline <radialGradient> below applies\n // the cx=(cx/rx)*100% + scale(rx,ry) convention.\n const layers: BorderLayer[] = [\n {\n id: `${baseId}-g6`, // (CSS #6) blue, top-right\n cx: 0.9536,\n cy: 0.0,\n rx: 0.9385,\n ry: 1.2256,\n stops: [\n { offset: 0, color: '#45ABFB', opacity: 0.6 },\n { offset: 0.4615, color: '#1E9AFB', opacity: 0.32 },\n { offset: 1, color: '#45ABFB', opacity: 0 },\n ],\n },\n {\n id: `${baseId}-g5`, // (CSS #5) faint light, top-right\n cx: 0.9667,\n cy: 0.0166,\n rx: 0.1382,\n ry: 0.9667,\n stops: [\n { offset: 0, color: '#F7F5F0', opacity: 0.1 },\n { offset: 1, color: '#45ABFB', opacity: 0 },\n ],\n },\n {\n id: `${baseId}-g4`, // (CSS #4) warm grey, top-left\n cx: 0.0,\n cy: 0.0629,\n rx: 0.8168,\n ry: 1.0694,\n stops: [\n { offset: 0, color: '#E3CFC3', opacity: 1 },\n { offset: 1, color: '#E3CFC3', opacity: 0 },\n ],\n },\n {\n id: `${baseId}-g3`, // (CSS #3) orange, bottom-left\n cx: 0.0393,\n cy: 1.0,\n rx: 1.0628,\n ry: 1.0303,\n stops: [\n { offset: 0, color: '#FF6B1F', opacity: 1 },\n { offset: 0.476, color: '#E76000', opacity: 0.72 },\n { offset: 1, color: '#E76000', opacity: 0 },\n ],\n },\n {\n id: `${baseId}-g2`, // (CSS #2) peach, bottom-center\n cx: 0.3476,\n cy: 1.0,\n rx: 0.9614,\n ry: 0.338,\n stops: [\n { offset: 0, color: '#FAC8AC', opacity: 0.7 },\n { offset: 1, color: '#F27B3E', opacity: 0 },\n ],\n },\n {\n id: `${baseId}-g1`, // (CSS #1) white glow, bottom-left\n cx: 0.0951,\n cy: 0.8783,\n rx: 0.2268,\n ry: 0.6881,\n stops: [\n { offset: 0, color: '#FFFFFF', opacity: 0.58 },\n { offset: 1, color: '#FFFFFF', opacity: 0 },\n ],\n },\n ]\n\n return (\n <div className=\"zd:absolute zd:inset-0 zd:z-0 zd:rounded-4xl zd:pointer-events-none zd:overflow-hidden\">\n <svg\n width=\"100%\"\n height=\"100%\"\n preserveAspectRatio=\"none\"\n role=\"presentation\"\n >\n <rect width=\"100%\" height=\"100%\" fill=\"#130E0B\" />\n <defs>\n {layers.map((layer) => (\n <radialGradient\n key={layer.id}\n id={layer.id}\n cx={`${(layer.cx / layer.rx) * 100}%`}\n cy={`${(layer.cy / layer.ry) * 100}%`}\n r=\"100%\"\n gradientUnits=\"objectBoundingBox\"\n gradientTransform={`scale(${layer.rx}, ${layer.ry})`}\n >\n {layer.stops.map((s, i) => (\n <stop\n key={s.color + i.toString()}\n offset={s.offset}\n stopColor={s.color}\n stopOpacity={s.opacity}\n />\n ))}\n </radialGradient>\n ))}\n </defs>\n {layers.map((layer) => (\n <rect\n key={`${layer.id}-rect`}\n width=\"100%\"\n height=\"100%\"\n fill={`url(#${layer.id})`}\n />\n ))}\n </svg>\n </div>\n )\n}\n","import { cn } from '@zerodev/react-ui'\nimport type { CSSProperties, ReactNode } from 'react'\nimport { TOP_NAV_HEIGHT } from '../TopNav'\nimport {\n CardGlow,\n MultiRadialBackground,\n WrapperBorder,\n} from './MultiRadialBackground'\n\nconst CONTENT_PADDING_TOP = TOP_NAV_HEIGHT + 16\n\nexport function Screen({\n children,\n className,\n contentClassName,\n style,\n topNav,\n}: {\n children: ReactNode\n className?: string | undefined\n contentClassName?: string | undefined\n style?: CSSProperties | undefined\n topNav?: ReactNode\n}) {\n return (\n <div\n className={cn(\n 'zd:flex zd:flex-col zd:overflow-hidden zd:text-left',\n 'zd:fixed zd:inset-0 zd:z-50 zd:w-screen zd:h-[100dvh] zd:rounded-[36px]',\n 'zd:sm:relative zd:sm:z-auto zd:sm:w-100 zd:sm:max-w-full zd:sm:h-[810px] zd:sm:max-h-[100dvh]',\n className,\n )}\n style={style}\n >\n {/* Gradient border layer — fills the frame; the card on top has a 6px\n margin so this shows as the border ring. */}\n <WrapperBorder />\n {/* Inner card sits on top with a 6px margin, exposing the border ring.\n Its own gradient (base + CardGlow) fills the card so the colour stays\n vivid and distinct from the border. */}\n <div\n className={cn(\n 'zd:flex zd:flex-1 zd:flex-col zd:m-1.5 zd:px-4 zd:overflow-hidden zd:rounded-4xl zd:relative',\n contentClassName,\n )}\n // clip-path clips backdrop-filter to the rounded corners; plain\n // overflow-hidden does not (WebKit/Chromium leaves scrolled blurred\n // children bleeding past the radius). Must match rounded-4xl (32px).\n style={{ clipPath: 'inset(0 round 32px)' }}\n >\n <MultiRadialBackground />\n <CardGlow />\n <div className=\"zd:relative zd:z-10 zd:flex zd:flex-1 zd:flex-col zd:min-h-0\">\n {topNav}\n <div\n className=\"zd:flex zd:flex-1 zd:flex-col zd:min-h-0 zd:overflow-y-auto zd:overflow-x-hidden\"\n style={{ paddingTop: `${CONTENT_PADDING_TOP}px` }}\n >\n {children}\n </div>\n </div>\n </div>\n </div>\n )\n}\n","export default \"__VITE_ASSET__J56$5yRt__\"","export default \"__VITE_ASSET__DC8GJ24R__\"","export default \"__VITE_ASSET__DrgAA58A__\"","export default \"__VITE_ASSET___eUV$EDU__\"","import { cn, Text } from '@zerodev/react-ui'\nimport type { ReactNode } from 'react'\nimport errorImg from '../../../../assets/states/error.webp?no-inline'\nimport loadingImg from '../../../../assets/states/loading.webp?no-inline'\nimport sendImg from '../../../../assets/states/send.webp?no-inline'\nimport successImg from '../../../../assets/states/success.webp?no-inline'\n\nexport type StateImageName = 'error' | 'loading' | 'send' | 'success'\n\nconst STATE_IMAGES: Record<StateImageName, string> = {\n error: errorImg,\n loading: loadingImg,\n send: sendImg,\n success: successImg,\n}\n\nexport interface StatusScreenProps {\n imageName: StateImageName\n title: string\n children: ReactNode\n className?: string\n}\n\nexport function StatusScreen({\n imageName,\n title,\n children,\n className,\n}: StatusScreenProps) {\n return (\n <div\n className={cn('zd:flex zd:flex-col zd:gap-8 zd:items-center', className)}\n >\n <img\n src={STATE_IMAGES[imageName]}\n alt={imageName}\n className=\"zd:w-[118px] zd:h-[118px] zd:bg-transparent\"\n />\n <div className=\"zd:flex zd:flex-col zd:gap-4 zd:items-center\">\n <Text className=\"zd:text-h2 zd:text-center zd:whitespace-pre-wrap\">\n {title}\n </Text>\n <Text className=\"zd:text-center zd:whitespace-pre-wrap\">\n {children}\n </Text>\n </div>\n </div>\n )\n}\n","import { useConfig } from 'wagmi'\nimport type { createStore } from '../../store'\n\ntype KitStore = ReturnType<typeof createStore>\n\n/**\n * Returns the zustand store attached to the `zeroDevWallet` connector.\n * Throws when the kit connector isn't present on the wagmi config.\n *\n * Read individual fields with `useStore(useKitStore(), (s) => s.field)`.\n */\nexport function useKitStore(): KitStore {\n const config = useConfig()\n const connector = config.connectors.find((c) => c.id === 'zerodev-wallet')\n if (!connector || !('getKitStore' in connector)) {\n throw new Error('useKitStore must be used with the zeroDevWallet connector')\n }\n // @ts-expect-error - getKitStore is a custom method on the kit connector\n return connector.getKitStore()\n}\n","import { useStore } from 'zustand'\nimport { useKitStore } from '../../shared/hooks/useKitStore'\n\nexport function useAuth() {\n const store = useKitStore()\n\n const step = useStore(store, (state) => state.auth.step)\n const stepHistory = useStore(store, (state) => state.auth.stepHistory)\n const email = useStore(store, (state) => state.auth.email)\n const otpId = useStore(store, (state) => state.auth.otpId)\n const otpEncryptionTargetBundle = useStore(\n store,\n (state) => state.auth.otpEncryptionTargetBundle,\n )\n const enabledMethods = useStore(store, (state) => state.auth.enabledMethods)\n const authConfig = useStore(store, (state) => state.auth.config)\n\n return {\n step,\n email,\n otpId,\n otpEncryptionTargetBundle,\n enabledMethods,\n config: authConfig,\n goToStep: store.getState().auth.goToStep,\n goBack: stepHistory.length > 0 ? store.getState().auth.goBack : null,\n reset: store.getState().auth.reset,\n setEmail: store.getState().auth.setEmail,\n setOtpSession: store.getState().auth.setOtpSession,\n clearOtpSession: store.getState().auth.clearOtpSession,\n }\n}\n","import { cn, Icon, Text } from '@zerodev/react-ui'\nimport type { CSSProperties } from 'react'\n\nexport function PoweredBy({\n className,\n style,\n}: {\n className?: string\n style?: CSSProperties\n}) {\n return (\n <div\n className={cn(\n 'zd:gap-1.5 zd:flex zd:flex-row zd:items-center',\n className,\n )}\n >\n <Text>Powered by</Text>\n <Icon\n name=\"zerodevLogo\"\n className=\"zd:h-[18px] zd:w-auto\"\n style={style}\n />\n </div>\n )\n}\n","import { Text } from '@zerodev/react-ui'\nimport { useSendMagicLink } from '@zerodev/wallet-react'\nimport { useEffect, useState } from 'react'\nimport { PoweredBy } from '../../shared/components/PoweredBy'\nimport { StatusScreen } from '../../shared/components/StatusScreen'\nimport { useAuth } from '../hooks/useAuth'\n\nexport function EmailVerification() {\n const { email, setOtpSession } = useAuth()\n const { mutateAsync: sendMagicLink, isPending: isSendPending } =\n useSendMagicLink()\n\n const [secondsLeftUntilResend, setSecondsLeftUntilResend] = useState(60)\n const canResend = secondsLeftUntilResend <= 0 && !isSendPending\n\n useEffect(() => {\n if (secondsLeftUntilResend <= 0) return\n\n const timer = setInterval(() => {\n setSecondsLeftUntilResend((prev) => Math.max(0, prev - 1))\n }, 1000)\n\n return () => {\n clearInterval(timer)\n }\n }, [secondsLeftUntilResend])\n\n const handleResend = async () => {\n if (!email || !canResend) return\n\n try {\n const { otpId, otpEncryptionTargetBundle } = await sendMagicLink({\n email,\n })\n setOtpSession({ otpId, otpEncryptionTargetBundle })\n setSecondsLeftUntilResend(60)\n } catch {\n // Error resending magic link\n }\n }\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:justify-center\">\n <StatusScreen\n imageName=\"send\"\n title={'Check your email!\\n An Email is On Its Way'}\n >\n We've sent a magic link to{' '}\n <Text as=\"span\" className=\"zd:text-solarOrange\">\n {email}\n </Text>\n {'\\n'}Please open the email and click the link to log in.\n </StatusScreen>\n\n <div className=\"zd:flex zd:flex-col zd:gap-1\">\n <Text className=\"zd:text-center\">\n Did not get an email?{' '}\n <button\n type=\"button\"\n disabled={!canResend}\n onClick={handleResend}\n className=\"zd:cursor-pointer zd:underline zd:disabled:opacity-50 zd:disabled:cursor-not-allowed\"\n >\n {canResend\n ? 'Resend'\n : `Resend in ${secondsLeftUntilResend} ${secondsLeftUntilResend === 1 ? 'second' : 'seconds'}`}\n </button>\n </Text>\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","export function hasMagicLinkCodeInUrl(): boolean {\n if (typeof window === 'undefined') return false\n return new URLSearchParams(window.location.search).has('code')\n}\n\nexport function stripMagicLinkCodeFromUrl(): void {\n if (typeof window === 'undefined') return\n const url = new URL(window.location.href)\n if (!url.searchParams.has('code')) return\n url.searchParams.delete('code')\n window.history.replaceState(null, '', url.toString())\n}\n","import { Button } from '@zerodev/react-ui'\nimport { PoweredBy } from '../../shared/components/PoweredBy'\nimport { StatusScreen } from '../../shared/components/StatusScreen'\nimport { useAuth } from '../hooks/useAuth'\nimport { stripMagicLinkCodeFromUrl } from '../utils/url'\n\ninterface ErrorScreenProps {\n title?: string\n message?: string\n showRetry?: boolean\n showChooseAnother?: boolean\n}\n\nexport function ErrorScreen({\n title = 'Oops, something went wrong',\n message = \"We couldn't complete the sign-in process. This could be due to timeout, an expired link, or a cancelled request.\",\n showRetry = false,\n showChooseAnother = true,\n}: ErrorScreenProps) {\n const { goToStep, goBack, reset } = useAuth()\n const handleRetry = goBack ?? (() => goToStep('sign-up'))\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:items-center zd:justify-center\">\n <StatusScreen imageName=\"error\" title={title}>\n {message}\n </StatusScreen>\n\n <div className=\"zd:flex zd:flex-col zd:gap-1\">\n {showRetry && (\n <Button action=\"primary\" text=\"Try again\" onClick={handleRetry} />\n )}\n {showChooseAnother && (\n <Button\n action={showRetry ? 'secondary' : 'primary'}\n onClick={() => {\n stripMagicLinkCodeFromUrl()\n goToStep('sign-up')\n }}\n text=\"Choose another sign-in method\"\n />\n )}\n {!showRetry && !showChooseAnother && (\n <Button action=\"primary\" text=\"Start over\" onClick={reset} />\n )}\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { cn, Text, Wrapper } from '@zerodev/react-ui'\nimport { useEffect, useMemo, useRef, useState } from 'react'\n\nconst MIN_LENGTH = 4\nconst MAX_LENGTH = 8\nconst DEFAULT_LENGTH = 6\n\nfunction clampLength(length: number): number {\n return Math.max(MIN_LENGTH, Math.min(MAX_LENGTH, length))\n}\n\ninterface CharBoxProps {\n char: string\n isFocused: boolean\n}\n\nfunction CharBox({ char, isFocused }: CharBoxProps) {\n return (\n <Wrapper\n data-testid=\"code-input-box\"\n data-active={isFocused || undefined}\n className={cn(\n 'zd:h-16 zd:w-14 zd:rounded-lg zd:flex zd:items-center zd:justify-center',\n isFocused && 'zd:border-[1.5px] zd:border-greyScale',\n )}\n >\n <Text className=\"zd:text-h2\">{char}</Text>\n </Wrapper>\n )\n}\n\nexport interface CodeInputProps {\n onChange?: (code: string) => void\n onComplete?: (code: string) => void\n disabled?: boolean\n error?: boolean\n autoFocus?: boolean\n length?: number\n 'data-testid'?: string\n}\n\nexport function CodeInput({\n onChange,\n onComplete,\n disabled = false,\n error = false,\n autoFocus = false,\n length = DEFAULT_LENGTH,\n 'data-testid': testId,\n}: CodeInputProps) {\n const codeLength = clampLength(length)\n const charBoxes = useMemo(\n () =>\n Array.from({ length: codeLength }, (_, i) => ({\n id: `char-${i}`,\n index: i,\n })),\n [codeLength],\n )\n\n const [code, setCode] = useState('')\n const [isFocused, setIsFocused] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n if (autoFocus && !disabled) {\n inputRef.current?.focus()\n }\n }, [autoFocus, disabled])\n\n useEffect(() => {\n setCode((prev) => prev.slice(0, codeLength))\n }, [codeLength])\n\n const handleChange = (text: string) => {\n const sanitized = text.slice(0, codeLength).toUpperCase()\n setCode(sanitized)\n onChange?.(sanitized)\n\n if (sanitized.length === codeLength) {\n // Makes sure onComplete is run on the next render cycle after the last char is rendered\n setTimeout(() => {\n onComplete?.(sanitized)\n inputRef.current?.blur()\n }, 0)\n }\n }\n\n return (\n <button\n type=\"button\"\n className=\"zd:flex zd:flex-row zd:items-center zd:justify-between zd:gap-2 zd:w-full zd:cursor-text\"\n onClick={() => inputRef.current?.focus()}\n disabled={disabled}\n data-testid={testId}\n >\n <input\n ref={inputRef}\n value={code}\n onChange={(e) => handleChange(e.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n maxLength={codeLength}\n disabled={disabled}\n className=\"zd:absolute zd:opacity-0 zd:pointer-events-none\"\n style={{ position: 'absolute', opacity: 0 }}\n aria-label=\"Verification code\"\n />\n {charBoxes.map((box) => (\n <CharBox\n key={box.id}\n char={code[box.index] ?? ''}\n isFocused={!error && isFocused && box.index === code.length}\n />\n ))}\n </button>\n )\n}\n","import { Button, Text } from '@zerodev/react-ui'\nimport { useSendOTP, useVerifyOTP } from '@zerodev/wallet-react'\nimport { useEffect, useState } from 'react'\nimport { PoweredBy } from '../../shared/components/PoweredBy'\nimport { CodeInput } from '../components/CodeInput'\nimport { useAuth } from '../hooks/useAuth'\n\nexport function OtpInput() {\n const {\n email,\n otpId,\n otpEncryptionTargetBundle,\n setOtpSession,\n clearOtpSession,\n goToStep,\n config,\n } = useAuth()\n const { mutateAsync: sendOtp, isPending: isSendOtpPending } = useSendOTP()\n const { mutateAsync: verifyOtp, isPending } = useVerifyOTP()\n\n const [otp, setOtp] = useState('')\n const [error, setError] = useState(false)\n const [secondsUntilResend, setSecondsUntilResend] = useState(60)\n\n // Countdown timer for resend\n useEffect(() => {\n if (secondsUntilResend <= 0) return\n\n const interval = setInterval(() => {\n setSecondsUntilResend((prev) => Math.max(0, prev - 1))\n }, 1000)\n return () => clearInterval(interval)\n }, [secondsUntilResend])\n\n const handleVerify = async () => {\n if (!otp.trim() || !otpId || !otpEncryptionTargetBundle) return\n\n setError(false)\n try {\n await verifyOtp({\n otpId,\n code: otp.trim(),\n otpEncryptionTargetBundle,\n })\n clearOtpSession()\n goToStep('authenticated')\n config?.onSuccess?.()\n } catch (err) {\n setError(true)\n config?.onError?.(err)\n }\n }\n\n const handleComplete = (code: string) => {\n setOtp(code)\n }\n\n const handleResend = async () => {\n if (!email || secondsUntilResend > 0 || isSendOtpPending) return\n\n try {\n const { otpId: newOtpId, otpEncryptionTargetBundle: newBundle } =\n await sendOtp({ email })\n setOtpSession({\n otpId: newOtpId,\n otpEncryptionTargetBundle: newBundle,\n })\n setSecondsUntilResend(60)\n setError(false)\n } catch {\n setError(true)\n }\n }\n\n const canResend = secondsUntilResend <= 0 && !isSendOtpPending\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:justify-center zd:items-center\">\n <div className=\"zd:flex zd:flex-col zd:gap-4\">\n <Text className=\"zd:text-h2 zd:text-center\">\n Enter verification code\n </Text>\n <Text className=\"zd:text-center\">\n Enter the code from the email we sent to{' '}\n <Text className=\"zd:text-solarOrange\">{email}</Text>\n </Text>\n </div>\n\n <CodeInput\n onComplete={handleComplete}\n onChange={() => setError(false)}\n disabled={isPending}\n error={error}\n autoFocus\n />\n\n <Button\n text=\"Confirm code\"\n onClick={handleVerify}\n disabled={!otp.trim() || isPending}\n />\n\n <div className=\"zd:flex zd:flex-col zd:gap-1\">\n <Text className=\"zd:text-center\">\n Did not get an email?{' '}\n <button\n type=\"button\"\n disabled={!canResend}\n onClick={handleResend}\n className=\"zd:cursor-pointer zd:underline zd:disabled:opacity-50 zd:disabled:cursor-not-allowed\"\n >\n {canResend\n ? 'Resend'\n : `Resend in ${secondsUntilResend} ${secondsUntilResend === 1 ? 'second' : 'seconds'}`}\n </button>\n </Text>\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { Text } from '@zerodev/react-ui'\nimport { PoweredBy } from '../PoweredBy'\n\nexport function SignUpFooter({\n termsAndConditionsUrl,\n privacyPolicyUrl,\n agreedToTerms,\n setAgreedToTerms,\n highlight = false,\n}: {\n termsAndConditionsUrl?: string | undefined\n privacyPolicyUrl?: string | undefined\n agreedToTerms: boolean\n setAgreedToTerms: (agreed: boolean) => void\n highlight?: boolean\n}) {\n const showAgreement = !!(termsAndConditionsUrl || privacyPolicyUrl)\n\n return (\n <div className=\"zd:flex zd:flex-col zd:items-center zd:gap-5\">\n {showAgreement && (\n <div\n className={`zd:flex zd:flex-row zd:items-center zd:gap-2 zd:rounded-md zd:p-2 zd:transition-colors ${\n highlight\n ? 'zd:border zd:border-negative'\n : 'zd:border zd:border-transparent'\n }`}\n >\n <input\n type=\"checkbox\"\n checked={agreedToTerms}\n onChange={(e) => setAgreedToTerms(e.target.checked)}\n className=\"zd:cursor-pointer zd:[color-scheme:light]\"\n />\n <Text className=\"zd:flex-1\">\n I agree to the{' '}\n {termsAndConditionsUrl && (\n <Text\n as=\"a\"\n href={termsAndConditionsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"zd:underline\"\n >\n Terms & Conditions\n </Text>\n )}\n {termsAndConditionsUrl && privacyPolicyUrl && ' and '}\n {privacyPolicyUrl && (\n <Text\n as=\"a\"\n href={privacyPolicyUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"zd:underline\"\n >\n Privacy Policy\n </Text>\n )}\n </Text>\n </div>\n )}\n <PoweredBy />\n </div>\n )\n}\n","export function capitalizeFirst(str?: string | null): string {\n if (!str) return ''\n const first = str.at(0) ?? ''\n return first.toUpperCase() + str.slice(1)\n}\n\nexport function shortenHex(hex: string, length = 4) {\n return `${hex.slice(0, length + 2)}...${hex.slice(-length)}`\n}\n\nexport function camelCaseToTitle(str: string): string {\n if (str.length === 0 || str.at(0) === str.at(0)?.toUpperCase()) {\n return str\n }\n\n const words = str.replace(/([a-z])([A-Z])/g, '$1 $2').trim()\n return words\n .split(' ')\n .map((word) => capitalizeFirst(word))\n .join(' ')\n}\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\nexport function isValidEmailAddress(email: string): boolean {\n return EMAIL_REGEX.test(email.trim())\n}\n","export default \"__VITE_ASSET__DthArV0k__\"","// ?no-inline forces Vite to emit blob.webm as a separate file (dist/blob.webm)\n// instead of base64-inlining ~700KB into the JS bundle. Requires base:'./' in\n// vite.config.ts so the emitted URL is package-relative, not root-absolute.\nimport blobWebm from '../../assets/blob.webm?no-inline'\n\n// VP9-alpha WebM. Renders the animated blob on browsers that support WebM with\n// an alpha channel (Chrome, Firefox, Edge). Safari plays the WebM container but\n// not VP9 alpha, so the blob is simply not shown there — an acceptable\n// degradation for a decorative element.\nexport function BlobAnimation({ className }: { className?: string }) {\n return (\n <video\n className={className}\n style={{ aspectRatio: '1 / 1' }}\n src={blobWebm}\n autoPlay\n loop\n muted\n playsInline\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n )\n}\n","import { Button, Icon, Input, ListItem, Text } from '@zerodev/react-ui'\nimport {\n useAuthenticateOAuth,\n useLoginPasskey,\n useRegisterPasskey,\n useSendMagicLink,\n useSendOTP,\n} from '@zerodev/wallet-react'\nimport { useState } from 'react'\nimport { SignUpFooter } from '../../shared/components/SignUpFooter'\nimport { isValidEmailAddress } from '../../shared/utils/common'\nimport { BlobAnimation } from '../components/BlobAnimation'\nimport { useAuth } from '../hooks/useAuth'\n\nfunction isCancellationError(err: unknown): boolean {\n if (!(err instanceof Error)) return false\n // WebAuthn / passkey\n if (err.name === 'AbortError' || err.name === 'NotAllowedError') return true\n // OAuth (existing logic, message-based)\n const msg = err.message.toLowerCase()\n return msg.includes('oauth popup was closed')\n}\n\nexport function SignUp() {\n const { goToStep, setEmail, setOtpSession, config, enabledMethods } =\n useAuth()\n const [agreedToTerms, setAgreedToTerms] = useState(false)\n const [highlightAgreement, setHighlightAgreement] = useState(false)\n const [emailInput, setEmailInput] = useState('')\n const shouldUseOtp = config?.emailAuthMethod === 'otp'\n const { mutateAsync: sendOtp, isPending: isSendOtpPending } = useSendOTP()\n const { mutateAsync: sendMagicLink, isPending: isSendMagicLinkPending } =\n useSendMagicLink()\n const isEmailLoading = isSendOtpPending || isSendMagicLinkPending\n\n const [error, setError] = useState<string | null>(null)\n\n const { mutateAsync: authenticateOAuth, isPending: isGoogleLoading } =\n useAuthenticateOAuth({\n mutation: {\n onSuccess: async () => {\n goToStep('authenticated')\n config?.onSuccess?.()\n },\n onError: (err) => {\n config?.onError?.(err)\n },\n },\n })\n\n const { mutate: registerPasskey, isPending: isRegisterPasskeyPending } =\n useRegisterPasskey({\n mutation: {\n onSuccess: () => {\n goToStep('authenticated')\n config?.onSuccess?.()\n },\n onError: (err) => {\n if (!isCancellationError(err)) {\n setError(err instanceof Error ? err.message : String(err))\n }\n config?.onError?.(err)\n },\n },\n })\n\n const { mutate: loginPasskey, isPending: isLoginPasskeyPending } =\n useLoginPasskey({\n mutation: {\n onSuccess: () => {\n goToStep('authenticated')\n config?.onSuccess?.()\n },\n onError: (err) => {\n if (!isCancellationError(err)) {\n setError(err instanceof Error ? err.message : String(err))\n }\n config?.onError?.(err)\n },\n },\n })\n\n const anyPending =\n isGoogleLoading ||\n isEmailLoading ||\n isRegisterPasskeyPending ||\n isLoginPasskeyPending\n const requiresAgreement = !!(\n config?.termsAndConditionsUrl || config?.privacyPolicyUrl\n )\n const needsToAcceptAgreement = requiresAgreement && !agreedToTerms\n\n const handleRegisterPasskey = () => {\n if (anyPending) return\n if (needsToAcceptAgreement) {\n setHighlightAgreement(true)\n return\n }\n setError(null)\n registerPasskey()\n }\n\n const handleLoginPasskey = () => {\n if (anyPending) return\n if (needsToAcceptAgreement) {\n setHighlightAgreement(true)\n return\n }\n setError(null)\n loginPasskey()\n }\n\n const handleGoogleAuth = async () => {\n if (needsToAcceptAgreement) {\n setHighlightAgreement(true)\n return\n }\n setError(null)\n try {\n await authenticateOAuth({ provider: 'google' })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n if (!isCancellationError(err)) {\n setError(message)\n }\n }\n }\n\n const handleEmailOtp = async () => {\n if (!emailInput || anyPending) return\n if (!isValidEmailAddress(emailInput)) return\n if (needsToAcceptAgreement) {\n setHighlightAgreement(true)\n return\n }\n\n setError(null)\n try {\n const { otpId, otpEncryptionTargetBundle } = await sendOtp({\n email: emailInput,\n })\n setEmail(emailInput)\n setOtpSession({ otpId, otpEncryptionTargetBundle })\n goToStep('otp-input')\n } catch (err) {\n setError(\n err instanceof Error ? err.message : 'Failed to send verification code',\n )\n }\n }\n\n const handleEmailMagicLink = async () => {\n if (!emailInput || anyPending) return\n if (!isValidEmailAddress(emailInput)) return\n if (needsToAcceptAgreement) {\n setHighlightAgreement(true)\n return\n }\n\n setError(null)\n try {\n const { otpId, otpEncryptionTargetBundle } = await sendMagicLink({\n email: emailInput,\n })\n setEmail(emailInput)\n setOtpSession({ otpId, otpEncryptionTargetBundle })\n goToStep('email-verification')\n } catch (err) {\n setError(\n err instanceof Error ? err.message : 'Failed to send verification code',\n )\n }\n }\n\n const handleEmailSubmit = shouldUseOtp ? handleEmailOtp : handleEmailMagicLink\n\n if (error) {\n return (\n <div className=\"zd:flex zd:items-center zd:justify-center zd:h-full\">\n <div className=\"zd:flex zd:flex-col zd:gap-4 zd:max-w-md\">\n <Text className=\"zd:text-h2 zd:text-center\">Error occurred</Text>\n <Text className=\"zd:text-center zd:text-red-500\">{error}</Text>\n <Button\n action=\"primary\"\n text=\"Try again\"\n onClick={() => setError(null)}\n />\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:justify-between zd:pb-4 zd:overflow-y-auto zd:overflow-x-hidden\">\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:justify-center\">\n <div className=\"zd:px-4 zd:flex zd:flex-col zd:items-center\">\n <div className=\"zd:w-full zd:px-16 zd:py-4\">\n <BlobAnimation className=\"zd:w-full zd:pointer-events-none zd:select-none\" />\n </div>\n <Text className=\"zd:text-h2 zd:text-center\">\n Continue to your wallet\n </Text>\n <Text className=\"zd:mt-2 zd:text-center zd:text-greyScale/50\">\n Choose a sign-in method to proceed\n </Text>\n </div>\n <div className=\"zd:mt-6 zd:flex zd:flex-col zd:gap-4 zd:mb-4\">\n {enabledMethods.includes('passkey') && (\n <>\n <div className=\"zd:px-4 zd:flex zd:flex-col zd:gap-2\">\n <Button\n action=\"secondary\"\n text=\"Create a passkey\"\n iconName=\"key\"\n trailIcon\n disabled={anyPending}\n onClick={handleRegisterPasskey}\n />\n <Button\n action=\"secondary\"\n text=\"Log in with passkey\"\n iconName=\"key\"\n trailIcon\n disabled={anyPending}\n onClick={handleLoginPasskey}\n />\n </div>\n <div className=\"zd:flex zd:items-center zd:gap-3\">\n <div className=\"zd:h-px zd:flex-1 zd:bg-greyScale/30\" />\n <Text className=\"zd:text-body3\">or</Text>\n <div className=\"zd:h-px zd:flex-1 zd:bg-greyScale/30\" />\n </div>\n </>\n )}\n <div className=\"zd:px-4 zd:flex zd:flex-col zd:gap-2\">\n {enabledMethods.includes('google') && (\n <ListItem\n iconName=\"google\"\n title=\"Google\"\n chevron\n className=\"zd:rounded-3xl\"\n disabled={anyPending}\n onClick={handleGoogleAuth}\n />\n )}\n {enabledMethods.includes('email') && (\n <Input\n iconName=\"email\"\n placeholder=\"Enter your email\"\n value={emailInput}\n onChange={(e) => setEmailInput(e.target.value)}\n type=\"email\"\n autoCapitalize=\"none\"\n autoComplete=\"email\"\n disabled={anyPending}\n variant=\"listItemStyle\"\n containerClassName=\"zd:rounded-3xl\"\n onKeyDown={(e) => {\n if (e.key === 'Enter' && emailInput && !anyPending) {\n void handleEmailSubmit()\n }\n }}\n >\n {isEmailLoading ? (\n <div className=\"zd:w-13 zd:h-13 zd:flex zd:items-center zd:justify-center\">\n <div className=\"zd:w-5 zd:h-5 zd:border-2 zd:border-solarOrange zd:border-t-transparent zd:rounded-full zd:animate-spin\" />\n </div>\n ) : (\n <button\n type=\"button\"\n disabled={\n !isValidEmailAddress(emailInput) || needsToAcceptAgreement\n }\n className={`zd:w-13 zd:h-13 zd:rounded-2xl zd:flex zd:items-center zd:justify-center zd:transition-colors ${\n isValidEmailAddress(emailInput) && !needsToAcceptAgreement\n ? 'zd:cursor-pointer'\n : 'zd:cursor-not-allowed zd:opacity-50'\n }`}\n onClick={() => handleEmailSubmit()}\n >\n <Icon name=\"chevronRight\" className=\"zd:text-greyScale\" />\n </button>\n )}\n </Input>\n )}\n </div>\n </div>\n </div>\n <div className=\"zd:px-4\">\n <SignUpFooter\n termsAndConditionsUrl={config?.termsAndConditionsUrl}\n privacyPolicyUrl={config?.privacyPolicyUrl}\n agreedToTerms={agreedToTerms}\n setAgreedToTerms={(agreed) => {\n setAgreedToTerms(agreed)\n if (agreed) setHighlightAgreement(false)\n }}\n highlight={highlightAgreement}\n />\n </div>\n </div>\n )\n}\n","import { Button } from '@zerodev/react-ui'\nimport { useVerifyMagicLink } from '@zerodev/wallet-react'\nimport { useEffect, useRef, useState } from 'react'\nimport { PoweredBy } from '../../shared/components/PoweredBy'\nimport { StatusScreen } from '../../shared/components/StatusScreen'\nimport { useAuth } from '../hooks/useAuth'\nimport { stripMagicLinkCodeFromUrl } from '../utils/url'\n\nfunction getCodeFromUrl(): string | null {\n if (typeof window === 'undefined') return null\n return new URLSearchParams(window.location.search).get('code')\n}\n\nexport function Verifying() {\n const {\n otpId,\n otpEncryptionTargetBundle,\n goToStep,\n clearOtpSession,\n config,\n } = useAuth()\n const [code] = useState<string | null>(getCodeFromUrl)\n const [error, setError] = useState<Error | null>(null)\n\n // ref to prevent useEffect firing twice in dev's StrictMode\n const hasVerifiedRef = useRef(false)\n const { mutate: verifyMagicLink, isPending: isVerificationLoading } =\n useVerifyMagicLink({\n mutation: {\n onSuccess: async () => {\n clearOtpSession()\n goToStep('authenticated')\n config?.onSuccess?.()\n },\n onError: (err) => {\n setError(err)\n config?.onError?.(err)\n },\n },\n })\n\n useEffect(() => {\n if (hasVerifiedRef.current || !code) return\n hasVerifiedRef.current = true\n\n // No active OTP session — most commonly the user tapped the same\n // magic link again after a successful verify, which cleared the\n // session. Skip the (doomed) mutation, clean the URL, and drop\n // back to step=null so the host app's own routing handles the\n // already-authenticated user without flashing an error.\n if (!otpId || !otpEncryptionTargetBundle) {\n stripMagicLinkCodeFromUrl()\n goToStep(null)\n return\n }\n\n verifyMagicLink({ otpId, code, otpEncryptionTargetBundle })\n }, [otpId, otpEncryptionTargetBundle, code, verifyMagicLink, goToStep])\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:items-center zd:justify-center\">\n {!error && isVerificationLoading && (\n <StatusScreen imageName=\"loading\" title=\"Verifying Your Email\">\n Please wait while we securely connect your wallet.\n </StatusScreen>\n )}\n\n {!error && !code && !isVerificationLoading && (\n <>\n <StatusScreen imageName=\"error\" title=\"Invalid Link\">\n This verification link is invalid or incomplete.\n <br />\n Please check your email and try again with the correct link.\n </StatusScreen>\n <Button\n action=\"primary\"\n onClick={() => {\n stripMagicLinkCodeFromUrl()\n goToStep('sign-up')\n }}\n text=\"Choose another sign-in method\"\n />\n </>\n )}\n\n {error != null && (\n <>\n <StatusScreen imageName=\"error\" title=\"Oops, something went wrong\">\n We couldn't complete the sign-in process. This could be due to\n timeout, an expired link, or a cancelled request.\n </StatusScreen>\n <Button\n action=\"primary\"\n onClick={() => {\n stripMagicLinkCodeFromUrl()\n goToStep('sign-up')\n }}\n text=\"Choose another sign-in method\"\n />\n </>\n )}\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { ListItem, Text } from '@zerodev/react-ui'\nimport { useConnect } from 'wagmi'\nimport { PoweredBy } from '../../shared/components/PoweredBy'\nimport { useAuth } from '../hooks/useAuth'\n\nexport function WalletSelection() {\n const { goToStep } = useAuth()\n const { connect, connectors, isPending } = useConnect()\n\n const externalConnectors = connectors.filter((c) => c.id !== 'zerodev-wallet')\n\n const handleSelect = (connector: (typeof connectors)[number]) => {\n connect(\n { connector },\n {\n onSuccess: () => {\n goToStep(null)\n },\n },\n )\n }\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:justify-center\">\n <Text className=\"zd:text-h2 zd:text-center\">Select your wallet</Text>\n\n <div className=\"zd:flex zd:flex-col zd:gap-2\">\n {externalConnectors.length === 0 ? (\n <Text className=\"zd:text-center\">\n No wallets detected. Install a browser wallet extension to\n continue.\n </Text>\n ) : (\n externalConnectors.map((connector) => (\n <ListItem\n key={connector.uid}\n title={connector.name}\n iconName=\"walletOutline\"\n {...(connector.icon ? { imageUri: connector.icon } : {})}\n disabled={isPending}\n onClick={() => handleSelect(connector)}\n className=\"zd:rounded-3xl\"\n />\n ))\n )}\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { type ReactNode, useEffect } from 'react'\nimport { useStore } from 'zustand'\nimport { Screen } from '../shared/components/Screen'\nimport { StatusScreen } from '../shared/components/StatusScreen'\nimport { TopNav } from '../shared/components/TopNav'\nimport { useKitStore } from '../shared/hooks/useKitStore'\nimport { useAuth } from './hooks/useAuth'\nimport { EmailVerification } from './pages/EmailVerification'\nimport { ErrorScreen } from './pages/ErrorScreen'\nimport { OtpInput } from './pages/OtpInput'\nimport { SignUp } from './pages/SignUp'\nimport { Verifying } from './pages/Verifying'\nimport { WalletSelection } from './pages/WalletSelection'\nimport type { AuthStep } from './types'\nimport { hasMagicLinkCodeInUrl, stripMagicLinkCodeFromUrl } from './utils/url'\n\nconst TITLE_BY_STEP: Partial<Record<AuthStep, string>> = {\n 'wallet-selection': 'Choose your wallet',\n}\n\nfunction OAuthCallback() {\n return (\n <div className=\"zd:flex zd:flex-1 zd:items-center zd:justify-center\">\n <StatusScreen imageName=\"loading\" title=\"Authenticating...\">\n Please wait while we complete the OAuth authentication.\n </StatusScreen>\n </div>\n )\n}\n\nfunction PasskeyPrompt() {\n return (\n <div className=\"zd:flex zd:flex-1 zd:items-center zd:justify-center\">\n <StatusScreen imageName=\"loading\" title=\"Passkey authentication\">\n Please authenticate with your passkey.\n </StatusScreen>\n </div>\n )\n}\n\nfunction renderStep(step: AuthStep | null): ReactNode {\n switch (step) {\n case 'sign-up':\n return <SignUp />\n case 'email-verification':\n return <EmailVerification />\n case 'otp-input':\n return <OtpInput />\n case 'verifying-otp':\n return <Verifying />\n case 'oauth-in-progress':\n return <OAuthCallback />\n case 'passkey-prompt':\n return <PasskeyPrompt />\n case 'wallet-selection':\n return <WalletSelection />\n case 'error':\n return <ErrorScreen />\n default:\n return null\n }\n}\n\nexport function AuthFlow({\n onClose: userOnClose,\n}: {\n onClose?: (() => void) | undefined\n} = {}) {\n const { step, goToStep, goBack, reset } = useAuth()\n const logo = useStore(useKitStore(), (s) => s.logo)\n\n useEffect(() => {\n if (step === null && hasMagicLinkCodeInUrl()) {\n goToStep('verifying-otp')\n }\n }, [step, goToStep])\n\n const content = renderStep(step)\n if (!content) return null\n\n const handleClose = () => {\n stripMagicLinkCodeFromUrl()\n reset()\n userOnClose?.()\n }\n const title = step ? TITLE_BY_STEP[step] : undefined\n\n return (\n <Screen\n // Some elements in SignUp need to go from edge to edge.\n // No vertical padding; we set px-0 so we can fully control this padding.\n contentClassName={step === 'sign-up' ? 'zd:px-0' : undefined}\n topNav={\n <TopNav\n {...(goBack !== null && { onBack: goBack })}\n onClose={handleClose}\n {...(title && { title })}\n {...(step === 'sign-up' && {\n ...(logo && { logo }),\n className: 'zd:px-4',\n })}\n />\n }\n >\n {content}\n </Screen>\n )\n}\n","import type { StateCreator } from 'zustand'\nimport type { AuthConfig, AuthMethod, AuthStep } from './types'\n\nconst OTP_SESSION_STORAGE_KEY = 'zerodev:auth:otpSession'\n\ntype StoredOtpSession = {\n otpId: string\n otpEncryptionTargetBundle: string\n}\n\nfunction readStoredOtpSession(): StoredOtpSession | null {\n if (typeof window === 'undefined') return null\n try {\n const raw = window.localStorage.getItem(OTP_SESSION_STORAGE_KEY)\n if (!raw) return null\n const parsed = JSON.parse(raw) as StoredOtpSession\n if (!parsed?.otpId || !parsed?.otpEncryptionTargetBundle) return null\n return parsed\n } catch {\n return null\n }\n}\n\nfunction writeStoredOtpSession(session: StoredOtpSession): void {\n if (typeof window === 'undefined') return\n try {\n window.localStorage.setItem(\n OTP_SESSION_STORAGE_KEY,\n JSON.stringify(session),\n )\n } catch {\n // ignore\n }\n}\n\nfunction clearStoredOtpSession(): void {\n if (typeof window === 'undefined') return\n try {\n window.localStorage.removeItem(OTP_SESSION_STORAGE_KEY)\n } catch {\n // ignore\n }\n}\n\nexport interface AuthStoreSlice {\n auth: {\n // State\n step: AuthStep | null\n stepHistory: AuthStep[]\n enabledMethods: AuthMethod[]\n email: string | null\n setEmail: (email: string) => void\n otpId: string | null\n /**\n * HPKE encryption target bundle returned by the latest `sendOTP` call.\n * Required by `verifyOTP` so the OTP attempt can be sealed to the enclave.\n */\n otpEncryptionTargetBundle: string | null\n /** Set both fields produced by `sendOTP` together. */\n setOtpSession: (input: {\n otpId: string\n otpEncryptionTargetBundle: string\n }) => void\n /** Clear the persisted OTP session after a successful verify. */\n clearOtpSession: () => void\n config: AuthConfig | null\n\n // Actions\n initialize: (config: AuthConfig) => void\n goToStep: (step: AuthStep | null) => void\n goBack: () => void\n reset: () => void\n }\n}\n\nexport const createAuthStoreSlice: StateCreator<\n AuthStoreSlice,\n [],\n [],\n AuthStoreSlice\n> = (set, get, _store) => ({\n auth: {\n // Initial state\n step: null,\n stepHistory: [],\n enabledMethods: [],\n email: null,\n otpId: null,\n otpEncryptionTargetBundle: null,\n config: null,\n\n // Actions\n initialize: (config: AuthConfig) => {\n const stored = readStoredOtpSession()\n set((state) => ({\n auth: {\n ...state.auth,\n config,\n enabledMethods: config.enabledMethods,\n ...(stored && {\n otpId: stored.otpId,\n otpEncryptionTargetBundle: stored.otpEncryptionTargetBundle,\n }),\n },\n }))\n },\n\n goToStep: (step: AuthStep | null) => {\n set((state) => ({\n auth: {\n ...state.auth,\n step,\n stepHistory:\n state.auth.step === null\n ? state.auth.stepHistory\n : [...state.auth.stepHistory, state.auth.step],\n },\n }))\n },\n\n goBack: () => {\n const { auth } = get()\n if (auth.stepHistory.length === 0) return\n const newHistory = [...auth.stepHistory]\n const previousStep = newHistory.pop()!\n set((state) => ({\n auth: {\n ...state.auth,\n step: previousStep,\n stepHistory: newHistory,\n },\n }))\n },\n\n reset: () => {\n clearStoredOtpSession()\n set((state) => ({\n auth: {\n ...state.auth,\n step: null,\n stepHistory: [],\n email: null,\n otpId: null,\n otpEncryptionTargetBundle: null,\n },\n }))\n },\n\n setEmail: (email) => {\n set((state) => ({\n auth: {\n ...state.auth,\n email,\n },\n }))\n },\n\n setOtpSession: ({ otpId, otpEncryptionTargetBundle }) => {\n writeStoredOtpSession({ otpId, otpEncryptionTargetBundle })\n set((state) => ({\n auth: {\n ...state.auth,\n otpId,\n otpEncryptionTargetBundle,\n },\n }))\n },\n\n clearOtpSession: () => {\n clearStoredOtpSession()\n set((state) => ({\n auth: {\n ...state.auth,\n otpId: null,\n otpEncryptionTargetBundle: null,\n },\n }))\n },\n },\n})\n","import type { ReactNode } from 'react'\nimport { create } from 'zustand'\nimport { subscribeWithSelector } from 'zustand/middleware'\nimport {\n type AuthStoreSlice,\n createAuthStoreSlice,\n} from './auth/authStoreSlice'\nimport type { PendingRequest } from './types.js'\n\nexport type State = {\n pendingRequests: PendingRequest[]\n userConfirmationListenerActive: boolean\n logo: ReactNode | null\n addPendingRequest: (request: PendingRequest) => void\n removePendingRequest: (id: string) => void\n clearPendingRequests: () => void\n setUserConfirmationListenerActive: (active: boolean) => void\n} & AuthStoreSlice\n\nexport type CreateStoreOptions = {\n logo?: ReactNode\n}\n\nexport const createStore = (options: CreateStoreOptions = {}) =>\n create<State>()(\n subscribeWithSelector((set, get, store) => ({\n pendingRequests: [],\n userConfirmationListenerActive: false,\n logo: options.logo ?? null,\n addPendingRequest: (request) =>\n set((state) => ({\n pendingRequests: [...state.pendingRequests, request],\n })),\n removePendingRequest: (id) =>\n set((state) => ({\n pendingRequests: state.pendingRequests.filter((r) => r.id !== id),\n })),\n clearPendingRequests: () => set({ pendingRequests: [] }),\n setUserConfirmationListenerActive: (active) =>\n set({ userConfirmationListenerActive: active }),\n\n ...createAuthStoreSlice(set, get, store),\n })),\n )\n","import type { CreateConnectorFn } from '@wagmi/core'\nimport type {\n ZeroDevProvider,\n ZeroDevWalletConnectorParams,\n} from '@zerodev/wallet-react'\nimport {\n zeroDevWallet as baseZeroDevWallet,\n NotAuthenticatedError,\n} from '@zerodev/wallet-react'\nimport type { ReactNode } from 'react'\nimport type { AuthConfig } from './auth/types'\nimport { createStore } from './store.js'\nimport type { Request, RequestMethod } from './types.js'\n\nconst DEFAULT_SIGNING_PROMPT_METHODS: RequestMethod[] = [\n 'eth_sendTransaction',\n 'wallet_sendTransaction',\n 'wallet_sendCalls',\n 'personal_sign',\n 'eth_signTypedData_v4',\n]\n\nexport type ZeroDevKitConfig = {\n auth?: AuthConfig\n /**\n * Optional brand logo rendered in the auth flow's top nav. When omitted,\n * no logo is shown. `PoweredBy` always shows the ZeroDev mark independently.\n */\n logo?: ReactNode\n}\n\nexport type ZeroDevKitConnectorParams = ZeroDevWalletConnectorParams & {\n config?: ZeroDevKitConfig\n}\n\nfunction requireUserConfirmation(\n store: ReturnType<typeof createStore>,\n request: Request,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n store.getState().addPendingRequest({\n id: crypto.randomUUID(),\n ...request,\n resolve,\n reject,\n })\n })\n}\n\n/**\n * Resolves when the user completes the auth flow (`step === 'authenticated'`),\n * rejects when they dismiss it (`step === null`).\n */\nfunction waitForAuthFlow(store: ReturnType<typeof createStore>): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const unsub = store.subscribe(\n (state) => state.auth.step,\n (step) => {\n if (step === 'authenticated') {\n unsub()\n resolve()\n } else if (step === null) {\n // User dismissed the auth flow (e.g. clicked the TopNav close\n // button) — abort the pending wagmi connect.\n unsub()\n reject(new Error('Auth flow dismissed'))\n }\n },\n )\n })\n}\n\nexport function zeroDevWallet(\n params: ZeroDevKitConnectorParams,\n): CreateConnectorFn {\n const baseFactory = baseZeroDevWallet(params)\n const store = createStore({ logo: params.config?.logo })\n\n // Initialize auth config if provided\n if (params.config?.auth) {\n store.getState().auth.initialize(params.config.auth)\n }\n\n return (wagmiConfig) => {\n const connector = baseFactory(wagmiConfig)\n\n return {\n ...connector,\n\n async connect(connectParams) {\n // Try to connect first. If a session is persisted, base will load it\n // and resolve — no auth UI needed. If not, it throws\n // `NotAuthenticatedError` and we surface SignUp.\n //\n // This avoids forcing every connect to await the base store's init\n // (which `isAuthorized()` deliberately skips for perf — see\n // packages/react/src/core/connector.ts), and avoids flashing the auth\n // UI on first paint when the session hasn't loaded yet.\n try {\n return await connector.connect(connectParams)\n } catch (error) {\n if (\n connectParams?.isReconnecting ||\n !params.config?.auth ||\n !(error instanceof NotAuthenticatedError)\n ) {\n throw error\n }\n\n if (store.getState().auth.step !== null) {\n throw new Error('Auth flow already in progress')\n }\n\n store.getState().auth.goToStep('sign-up')\n await waitForAuthFlow(store)\n return connector.connect(connectParams)\n }\n },\n\n async disconnect() {\n await connector.disconnect?.()\n if (params.config?.auth) {\n store.getState().auth.reset()\n }\n },\n\n async setup() {\n await connector.setup?.()\n\n // Request-wrapping is only meaningful in the browser (it gates calls\n // on UI confirmation). Skip during SSR — getProvider() touches\n // `window` for EIP-6963 discovery and would crash on the server.\n if (typeof window === 'undefined') return\n\n // Signing is pinned to background mode: the prompt-mode confirmation UI\n // is not part of this package's public surface, so requests always pass\n // through without gating. The wrapping logic below is retained but\n // unreachable.\n // const signing = params.config?.signing\n const signing = { mode: 'background' } as const\n if (signing.mode === 'background') return\n\n const methods =\n // (signing?.mode === 'prompt' && signing.methods) ||\n DEFAULT_SIGNING_PROMPT_METHODS\n\n const provider = (await connector.getProvider()) as ZeroDevProvider\n const baseRequest = provider.request.bind(provider)\n\n // todo: move Request type to core package and use as the method and params type here\n // then we can remove as RequestMethod and spread in return baseRequest\n provider.request = async ({\n method,\n params: reqParams,\n }: {\n method: string\n params?: unknown[]\n }) => {\n const { userConfirmationListenerActive } = store.getState()\n if (\n userConfirmationListenerActive &&\n methods.includes(method as RequestMethod)\n ) {\n await requireUserConfirmation(store, {\n method: method as RequestMethod,\n params: reqParams,\n } as Request)\n }\n\n return baseRequest({\n method,\n ...(reqParams && { params: reqParams }),\n })\n }\n },\n\n getKitStore() {\n return store\n },\n }\n }\n}\n"],"names":["TOP_NAV_HEIGHT","TopNav","onBack","onClose","title","logo","className","jsxs","cn","jsx","IconButton","Text","EllipticalRadial","layer","rect","id","matrix","fillOpacity","stops","Fragment","s","i","FRAME_VIEWBOX","MultiRadialBackground","CardGlow","baseId","useId","layers","WrapperBorder","CONTENT_PADDING_TOP","Screen","children","contentClassName","style","topNav","errorImg","loadingImg","sendImg","successImg","STATE_IMAGES","StatusScreen","imageName","useKitStore","connector","useConfig","c","useAuth","store","step","useStore","state","stepHistory","email","otpId","otpEncryptionTargetBundle","enabledMethods","authConfig","PoweredBy","Icon","EmailVerification","setOtpSession","sendMagicLink","isSendPending","useSendMagicLink","secondsLeftUntilResend","setSecondsLeftUntilResend","useState","canResend","useEffect","timer","prev","handleResend","hasMagicLinkCodeInUrl","stripMagicLinkCodeFromUrl","url","ErrorScreen","message","showRetry","showChooseAnother","goToStep","goBack","reset","handleRetry","Button","MIN_LENGTH","MAX_LENGTH","DEFAULT_LENGTH","clampLength","length","CharBox","char","isFocused","Wrapper","CodeInput","onChange","onComplete","disabled","error","autoFocus","testId","codeLength","charBoxes","useMemo","_","code","setCode","setIsFocused","inputRef","useRef","_a","handleChange","text","sanitized","e","box","OtpInput","clearOtpSession","config","sendOtp","isSendOtpPending","useSendOTP","verifyOtp","isPending","useVerifyOTP","otp","setOtp","setError","secondsUntilResend","setSecondsUntilResend","interval","handleVerify","err","_b","handleComplete","newOtpId","newBundle","SignUpFooter","termsAndConditionsUrl","privacyPolicyUrl","agreedToTerms","setAgreedToTerms","highlight","showAgreement","EMAIL_REGEX","isValidEmailAddress","blobWebm","BlobAnimation","isCancellationError","SignUp","setEmail","highlightAgreement","setHighlightAgreement","emailInput","setEmailInput","shouldUseOtp","isSendMagicLinkPending","isEmailLoading","authenticateOAuth","isGoogleLoading","useAuthenticateOAuth","registerPasskey","isRegisterPasskeyPending","useRegisterPasskey","loginPasskey","isLoginPasskeyPending","useLoginPasskey","anyPending","needsToAcceptAgreement","handleRegisterPasskey","handleLoginPasskey","handleGoogleAuth","handleEmailSubmit","ListItem","Input","agreed","getCodeFromUrl","Verifying","hasVerifiedRef","verifyMagicLink","isVerificationLoading","useVerifyMagicLink","WalletSelection","connect","connectors","useConnect","externalConnectors","handleSelect","TITLE_BY_STEP","OAuthCallback","PasskeyPrompt","renderStep","AuthFlow","userOnClose","content","handleClose","OTP_SESSION_STORAGE_KEY","readStoredOtpSession","raw","parsed","writeStoredOtpSession","session","clearStoredOtpSession","createAuthStoreSlice","set","get","_store","stored","auth","newHistory","previousStep","createStore","options","create","subscribeWithSelector","request","r","active","waitForAuthFlow","resolve","reject","unsub","zeroDevWallet","params","baseFactory","baseZeroDevWallet","wagmiConfig","connectParams","NotAuthenticatedError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/shared/components/TopNav/index.tsx","../src/shared/components/Screen/EllipticalRadial.tsx","../src/shared/components/Screen/MultiRadialBackground.tsx","../src/shared/components/Screen/index.tsx","../assets/states/error.webp?no-inline","../assets/states/loading.webp?no-inline","../assets/states/send.webp?no-inline","../assets/states/success.webp?no-inline","../src/shared/components/StatusScreen/index.tsx","../src/shared/hooks/useKitStore.ts","../src/auth/hooks/useAuth.ts","../src/shared/components/PoweredBy/index.tsx","../src/auth/pages/EmailVerification.tsx","../src/auth/utils/url.ts","../src/auth/pages/ErrorScreen.tsx","../src/auth/components/CodeInput/index.tsx","../src/auth/pages/OtpInput.tsx","../src/shared/components/SignUpFooter/index.tsx","../src/shared/utils/common.ts","../src/auth/assets/blob.webm?no-inline","../src/auth/components/BlobAnimation/index.tsx","../src/auth/pages/SignUp.tsx","../src/auth/pages/Verifying.tsx","../src/auth/pages/WalletSelection.tsx","../src/auth/index.tsx","../src/auth/authStoreSlice.ts","../src/store.ts","../src/connector.ts"],"sourcesContent":["import { cn, IconButton, Text } from '@zerodev/react-ui'\nimport type { ReactNode } from 'react'\n\nexport const TOP_NAV_HEIGHT = 52\n\nexport function TopNav({\n onBack,\n onClose,\n title,\n logo,\n className,\n}: {\n onBack?: () => void\n onClose: () => void\n title?: string\n logo?: ReactNode\n className?: string\n}) {\n return (\n <div\n className={cn(\n 'zd:absolute zd:top-4 zd:left-0 zd:right-0 zd:flex zd:flex-row zd:items-center zd:justify-between',\n className,\n )}\n // Scale via --zd-spacing (the 4px base) like every spacing utility, so\n // the nav height tracks the density variants and doesn't eat a\n // disproportionate share of the shrunken frame at smaller sizes.\n style={{ height: `calc(${TOP_NAV_HEIGHT / 4} * var(--zd-spacing))` }}\n >\n {onBack ? (\n <IconButton iconName=\"chevronLeft\" onClick={onBack} />\n ) : (\n <div className=\"zd:h-13 zd:w-13\" />\n )}\n {logo && (\n <div className=\"zd:absolute zd:left-0 zd:right-0 zd:flex zd:items-center zd:justify-center zd:pointer-events-none\">\n {logo}\n </div>\n )}\n {title && (\n <div className=\"zd:absolute zd:left-0 zd:right-0 zd:flex zd:items-center zd:justify-center zd:pointer-events-none\">\n <Text className=\"zd:text-body1\">{title}</Text>\n </div>\n )}\n <IconButton iconName=\"x\" onClick={onClose} />\n </div>\n )\n}\n","interface RadialStop {\n offset: number\n color: string\n opacity: number\n}\n\nexport interface RadialLayer {\n id: string\n // Figma-exported gradientTransform matrix: the unit circle\n // (center 0,0 radius 1) mapped to a rotated/scaled/translated ellipse.\n matrix: [number, number, number, number, number, number]\n // Opacity of the rect the gradient fills (Figma exports this on the <rect>).\n fillOpacity: number\n stops: RadialStop[]\n}\n\n// The rect each gradient fills, in the parent SVG's viewBox coordinates.\ninterface RadialRect {\n x: number\n y: number\n width: number\n height: number\n}\n\nexport function EllipticalRadial({\n layer,\n rect,\n}: {\n layer: RadialLayer\n rect: RadialRect\n}) {\n const { id, matrix, fillOpacity, stops } = layer\n\n return (\n <>\n <defs>\n <radialGradient\n id={id}\n cx=\"0\"\n cy=\"0\"\n r=\"1\"\n gradientUnits=\"userSpaceOnUse\"\n gradientTransform={`matrix(${matrix.join(' ')})`}\n >\n {stops.map((s, i) => (\n <stop\n key={s.color + i.toString()}\n offset={s.offset}\n stopColor={s.color}\n stopOpacity={s.opacity}\n />\n ))}\n </radialGradient>\n </defs>\n <rect\n x={rect.x}\n y={rect.y}\n width={rect.width}\n height={rect.height}\n fill={`url(#${id})`}\n fillOpacity={fillOpacity}\n />\n </>\n )\n}\n","import { useId } from 'react'\n\nimport { EllipticalRadial, type RadialLayer } from './EllipticalRadial'\n\n// The design frame: the gradient layers live on a 412×812 rect offset to\n// (-6,-6) so they bleed 6px past the 400×800 card on every side — that 6px\n// reveal is the wrapper's gradient border. The matrices below are the\n// Figma-exported gradientTransform values verbatim, so rendering the SVG with\n// a matching viewBox + preserveAspectRatio=\"none\" reproduces the design 1:1\n// while still scaling to any container size.\nconst FRAME_VIEWBOX = '-6 -6 412 812'\n\nexport function MultiRadialBackground() {\n // The colorful gradient now lives entirely in CardGlow. This base layer is\n // just a flat, soft warm-white fill behind it so CardGlow's colors read\n // bright and clean, with no gray muddiers underneath.\n return (\n <div className=\"zd:absolute zd:inset-0 zd:z-0 zd:rounded-4xl zd:pointer-events-none\">\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox={FRAME_VIEWBOX}\n preserveAspectRatio=\"none\"\n role=\"img\"\n aria-label=\"Decorative gradient background\"\n >\n <rect x=\"-6\" y=\"-6\" width=\"412\" height=\"812\" fill=\"#FBF7F2\" />\n </svg>\n </div>\n )\n}\n\n// On-card overlay (400×800), sitting ON TOP of the translucent card body so its\n// color reads at full strength (the card at 0.8 opacity would otherwise wash a\n// behind-card gradient to ~20%). This reproduces the vivid orange + blue that in\n// the source design came from the decorative \"Amorphic\" blob raster overlaid on\n// the lower card, plus the design's own white card glow (Figma paint6).\n//\n// The orange + blue lobes are NOT verbatim Figma layers — they reconstruct the\n// blob's measured color footprint (orange across the lower card; blue lobe\n// bottom-left ~x 0-150 / y 600-800) as gradients, per the decision to treat the\n// blob as a background effect rather than ship the raster.\nexport function CardGlow() {\n const baseId = useId()\n // VERBATIM from the Figma `--Background-Brand-Gradient` token (6 stacked\n // radial-gradients). CSS lists topmost-first; SVG paints last-on-top, so the\n // array is the CSS list REVERSED. Each matrix is the CSS `rx% ry% at cx% cy%`\n // converted over the 400×800 frame. An upward linear fade is applied on top\n // (see the <rect> below) to soften the gradient toward the top.\n const layers: RadialLayer[] = [\n {\n // (CSS #6) blue → top-right. x-radius widened so the lobe reaches further\n // left; y-radius kept short so it stays up top and doesn't bleed into the\n // orange band.\n id: `${baseId}-blue`,\n matrix: [1850, 0, 0, 645, 381.44, 0],\n fillOpacity: 1,\n stops: [\n { offset: 0, color: '#45ABFB', opacity: 0.66 },\n { offset: 0.4615, color: '#1E9AFB', opacity: 0.35 },\n { offset: 1, color: '#45ABFB', opacity: 0 },\n ],\n },\n {\n // (CSS #5) offWhite → blue, very faint\n id: `${baseId}-offwhite-tr`,\n matrix: [55.28, 0, 0, 773.36, 386.68, 13.28],\n fillOpacity: 1,\n stops: [\n { offset: 0, color: '#F7F5F0', opacity: 0.1 },\n { offset: 1, color: '#45ABFB', opacity: 0 },\n ],\n },\n {\n // (CSS #4) warmGrey\n id: `${baseId}-warmgrey`,\n matrix: [326.72, 0, 0, 855.52, 0, 50.32],\n fillOpacity: 1,\n stops: [\n { offset: 0, color: '#E3CFC3', opacity: 1 },\n { offset: 1, color: '#E3CFC3', opacity: 0 },\n ],\n },\n {\n // (CSS #3) orange — spans the full width across the bottom ~30%, uniform.\n id: `${baseId}-orange`,\n matrix: [580, 0, 0, 380, 200, 835],\n fillOpacity: 1,\n stops: [\n { offset: 0, color: '#EE6C2E', opacity: 0.8 },\n { offset: 0.55, color: '#EE6C2E', opacity: 0.6 },\n { offset: 1, color: '#EE6C2E', opacity: 0.15 },\n ],\n },\n {\n // (CSS #2) peach — spread further up (~30% of the bottom), a bit more vivid\n id: `${baseId}-peach`,\n matrix: [520, 0, 0, 560, 180, 830],\n fillOpacity: 1,\n stops: [\n { offset: 0, color: '#FAC8AC', opacity: 1 },\n { offset: 1, color: '#F27B3E', opacity: 0 },\n ],\n },\n {\n // (CSS #1) white glow (topmost of the colour stack)\n id: `${baseId}-white-bl`,\n matrix: [90.72, 0, 0, 550.48, 38.04, 702.64],\n fillOpacity: 1,\n stops: [\n { offset: 0, color: 'white', opacity: 0.58 },\n { offset: 1, color: 'white', opacity: 0 },\n ],\n },\n ]\n\n return (\n <div className=\"zd:absolute zd:inset-0 zd:z-0 zd:rounded-4xl zd:pointer-events-none zd:overflow-hidden\">\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 400 800\"\n preserveAspectRatio=\"none\"\n role=\"presentation\"\n >\n {layers.map((layer) => (\n <EllipticalRadial\n key={layer.id}\n layer={layer}\n rect={{ x: 0, y: 0, width: 400, height: 800 }}\n />\n ))}\n {/* Vertical white fade — strongest at the bottom, easing linearly to\n nothing at the top. Softens the lower (most vivid) part of the\n gradient. A gradient layer (not an opaque card) so the frosted\n buttons composite over it cleanly. */}\n <defs>\n <linearGradient\n id={`${baseId}-vfade`}\n x1=\"0\"\n y1=\"0\"\n x2=\"0\"\n y2=\"800\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0\" stopColor=\"white\" stopOpacity=\"0.55\" />\n <stop offset=\"0.45\" stopColor=\"white\" stopOpacity=\"0.52\" />\n <stop offset=\"0.65\" stopColor=\"white\" stopOpacity=\"0.5\" />\n <stop offset=\"0.85\" stopColor=\"white\" stopOpacity=\"0.5\" />\n <stop offset=\"1\" stopColor=\"white\" stopOpacity=\"0.5\" />\n </linearGradient>\n </defs>\n <rect\n x=\"0\"\n y=\"0\"\n width=\"400\"\n height=\"800\"\n fill={`url(#${baseId}-vfade)`}\n />\n {/* Blue — a diagonal linear gradient from the bottom-left corner fading\n to transparent toward the top-right, so it blends smoothly into the\n orange with no hard edge. On top of the fade so #A7B8E2 reads true. */}\n <defs>\n <linearGradient\n id={`${baseId}-bluefade`}\n x1=\"0\"\n y1=\"800\"\n x2=\"120\"\n y2=\"640\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0\" stopColor=\"#A7B8E2\" stopOpacity=\"1\" />\n <stop offset=\"0.33\" stopColor=\"#A7B8E2\" stopOpacity=\"0.7\" />\n <stop offset=\"0.66\" stopColor=\"#A7B8E2\" stopOpacity=\"0.35\" />\n <stop offset=\"1\" stopColor=\"#A7B8E2\" stopOpacity=\"0\" />\n </linearGradient>\n </defs>\n <rect\n x=\"0\"\n y=\"0\"\n width=\"400\"\n height=\"800\"\n fill={`url(#${baseId}-bluefade)`}\n />\n </svg>\n </div>\n )\n}\n\n// The wrapper's gradient BORDER. Renders full-frame behind the inner card; the\n// card sits on top with a 6px margin so this gradient shows as the border ring.\n// Uses normalized cx/cy/rx/ry radial gradients (scale-transform) over a #130E0B\n// base — the original border look.\ntype BorderLayer = {\n id: string\n cx: number\n cy: number\n rx: number\n ry: number\n stops: { offset: number; color: string; opacity: number }[]\n}\n\nexport function WrapperBorder() {\n const baseId = useId()\n // VERBATIM from the Figma `--Background-Brand-Gradient` token (6 stacked\n // radial-gradients). CSS lists topmost-first, SVG paints last-on-top, so the\n // array is the CSS list REVERSED. Each CSS `rx% ry% at cx% cy%` maps to\n // normalized cx/cy/rx/ry (÷100); the inline <radialGradient> below applies\n // the cx=(cx/rx)*100% + scale(rx,ry) convention.\n const layers: BorderLayer[] = [\n {\n id: `${baseId}-g6`, // (CSS #6) blue, top-right\n cx: 0.9536,\n cy: 0.0,\n rx: 0.9385,\n ry: 1.2256,\n stops: [\n { offset: 0, color: '#45ABFB', opacity: 0.6 },\n { offset: 0.4615, color: '#1E9AFB', opacity: 0.32 },\n { offset: 1, color: '#45ABFB', opacity: 0 },\n ],\n },\n {\n id: `${baseId}-g5`, // (CSS #5) faint light, top-right\n cx: 0.9667,\n cy: 0.0166,\n rx: 0.1382,\n ry: 0.9667,\n stops: [\n { offset: 0, color: '#F7F5F0', opacity: 0.1 },\n { offset: 1, color: '#45ABFB', opacity: 0 },\n ],\n },\n {\n id: `${baseId}-g4`, // (CSS #4) warm grey, top-left\n cx: 0.0,\n cy: 0.0629,\n rx: 0.8168,\n ry: 1.0694,\n stops: [\n { offset: 0, color: '#E3CFC3', opacity: 1 },\n { offset: 1, color: '#E3CFC3', opacity: 0 },\n ],\n },\n {\n id: `${baseId}-g3`, // (CSS #3) orange, bottom-left\n cx: 0.0393,\n cy: 1.0,\n rx: 1.0628,\n ry: 1.0303,\n stops: [\n { offset: 0, color: '#FF6B1F', opacity: 1 },\n { offset: 0.476, color: '#E76000', opacity: 0.72 },\n { offset: 1, color: '#E76000', opacity: 0 },\n ],\n },\n {\n id: `${baseId}-g2`, // (CSS #2) peach, bottom-center\n cx: 0.3476,\n cy: 1.0,\n rx: 0.9614,\n ry: 0.338,\n stops: [\n { offset: 0, color: '#FAC8AC', opacity: 0.7 },\n { offset: 1, color: '#F27B3E', opacity: 0 },\n ],\n },\n {\n id: `${baseId}-g1`, // (CSS #1) white glow, bottom-left\n cx: 0.0951,\n cy: 0.8783,\n rx: 0.2268,\n ry: 0.6881,\n stops: [\n { offset: 0, color: '#FFFFFF', opacity: 0.58 },\n { offset: 1, color: '#FFFFFF', opacity: 0 },\n ],\n },\n ]\n\n return (\n <div className=\"zd:absolute zd:inset-0 zd:z-0 zd:rounded-4xl zd:pointer-events-none zd:overflow-hidden\">\n <svg\n width=\"100%\"\n height=\"100%\"\n preserveAspectRatio=\"none\"\n role=\"presentation\"\n >\n <rect width=\"100%\" height=\"100%\" fill=\"#130E0B\" />\n <defs>\n {layers.map((layer) => (\n <radialGradient\n key={layer.id}\n id={layer.id}\n cx={`${(layer.cx / layer.rx) * 100}%`}\n cy={`${(layer.cy / layer.ry) * 100}%`}\n r=\"100%\"\n gradientUnits=\"objectBoundingBox\"\n gradientTransform={`scale(${layer.rx}, ${layer.ry})`}\n >\n {layer.stops.map((s, i) => (\n <stop\n key={s.color + i.toString()}\n offset={s.offset}\n stopColor={s.color}\n stopOpacity={s.opacity}\n />\n ))}\n </radialGradient>\n ))}\n </defs>\n {layers.map((layer) => (\n <rect\n key={`${layer.id}-rect`}\n width=\"100%\"\n height=\"100%\"\n fill={`url(#${layer.id})`}\n />\n ))}\n </svg>\n </div>\n )\n}\n","import { cn } from '@zerodev/react-ui'\nimport type { CSSProperties, ReactNode } from 'react'\nimport { TOP_NAV_HEIGHT } from '../TopNav'\nimport {\n CardGlow,\n MultiRadialBackground,\n WrapperBorder,\n} from './MultiRadialBackground'\n\nconst CONTENT_PADDING_TOP = TOP_NAV_HEIGHT + 16\n\nexport function Screen({\n children,\n className,\n contentClassName,\n size = 'lg',\n style,\n topNav,\n}: {\n children: ReactNode\n className?: string | undefined\n contentClassName?: string | undefined\n size?: 'sm' | 'md' | 'lg' | undefined\n style?: CSSProperties | undefined\n topNav?: ReactNode\n}) {\n return (\n <div\n data-zd-size={size}\n className={cn(\n // 400×810 by default, but never taller/wider than the parent — a\n // consumer wrapper with its own size caps the Screen (max-w/h-full =\n // 100% of the parent). overflow-hidden clips the frame to its rounded\n // border ring; content scrolls in the inner div below.\n 'zd:relative zd:flex zd:flex-col zd:text-left',\n // w-100 = 400px, h-202.5 = 810px at density 1; both compile to\n // calc(var(--zd-spacing) * N), so they scale with the size variants.\n // rounded-[38px] = inner card radius (32px) + the 6px border-ring gap,\n // so the ring has a uniform width — equal inner/outer radii would make\n // the corners read thicker than the sides.\n 'zd:w-100 zd:h-202.5 zd:max-w-full zd:max-h-full zd:overflow-hidden zd:rounded-[38px]',\n className,\n )}\n style={style}\n >\n {/* Gradient border layer — fills the frame; the card on top has a 6px\n margin so this shows as the border ring. */}\n <WrapperBorder />\n {/* Inner card sits on top with a 6px margin, exposing the border ring.\n Its own gradient (base + CardGlow) fills the card so the colour stays\n vivid and distinct from the border. */}\n <div\n className={cn(\n // m-1.5 = calc(var(--zd-spacing) * 1.5) = 6px at density 1, so the\n // gradient border ring thins with the size variants. (Corner radii\n // stay fixed, so at smaller sizes the ring is marginally non-uniform\n // at the corners — a minor cosmetic trade-off.)\n 'zd:flex zd:flex-1 zd:flex-col zd:m-1.5 zd:px-4 zd:overflow-hidden zd:rounded-4xl zd:relative',\n contentClassName,\n )}\n // clip-path clips backdrop-filter to the rounded corners; plain\n // overflow-hidden does not (WebKit/Chromium leaves scrolled blurred\n // children bleeding past the radius). Must match rounded-4xl (32px).\n style={{ clipPath: 'inset(0 round 32px)' }}\n >\n <MultiRadialBackground />\n <CardGlow />\n <div className=\"zd:relative zd:z-10 zd:flex zd:flex-1 zd:flex-col zd:min-h-0\">\n {topNav}\n <div\n className=\"zd:flex zd:flex-1 zd:flex-col zd:min-h-0 zd:overflow-y-auto zd:overflow-x-hidden\"\n // Scale via --zd-spacing (matches TopNav's scaled height) so the\n // top padding shrinks with the frame — otherwise the fixed 68px\n // eats a disproportionate share at smaller sizes and overflows.\n style={{\n paddingTop: `calc(${CONTENT_PADDING_TOP / 4} * var(--zd-spacing))`,\n }}\n >\n {children}\n </div>\n </div>\n </div>\n </div>\n )\n}\n","export default \"__VITE_ASSET__J56$5yRt__\"","export default \"__VITE_ASSET__DC8GJ24R__\"","export default \"__VITE_ASSET__DrgAA58A__\"","export default \"__VITE_ASSET___eUV$EDU__\"","import { cn, Text } from '@zerodev/react-ui'\nimport type { ReactNode } from 'react'\nimport errorImg from '../../../../assets/states/error.webp?no-inline'\nimport loadingImg from '../../../../assets/states/loading.webp?no-inline'\nimport sendImg from '../../../../assets/states/send.webp?no-inline'\nimport successImg from '../../../../assets/states/success.webp?no-inline'\n\nexport type StateImageName = 'error' | 'loading' | 'send' | 'success'\n\nconst STATE_IMAGES: Record<StateImageName, string> = {\n error: errorImg,\n loading: loadingImg,\n send: sendImg,\n success: successImg,\n}\n\nexport interface StatusScreenProps {\n imageName: StateImageName\n title: string\n children: ReactNode\n className?: string\n}\n\nexport function StatusScreen({\n imageName,\n title,\n children,\n className,\n}: StatusScreenProps) {\n return (\n <div\n className={cn('zd:flex zd:flex-col zd:gap-8 zd:items-center', className)}\n >\n <img\n src={STATE_IMAGES[imageName]}\n alt={imageName}\n className=\"zd:w-[118px] zd:h-[118px] zd:bg-transparent\"\n />\n <div className=\"zd:flex zd:flex-col zd:gap-4 zd:items-center\">\n <Text className=\"zd:text-h2 zd:text-center zd:whitespace-pre-wrap\">\n {title}\n </Text>\n <Text className=\"zd:text-center zd:whitespace-pre-wrap\">\n {children}\n </Text>\n </div>\n </div>\n )\n}\n","import { useConfig } from 'wagmi'\nimport type { createStore } from '../../store'\n\ntype KitStore = ReturnType<typeof createStore>\n\n/**\n * Returns the zustand store attached to the `zeroDevWallet` connector.\n * Throws when the kit connector isn't present on the wagmi config.\n *\n * Read individual fields with `useStore(useKitStore(), (s) => s.field)`.\n */\nexport function useKitStore(): KitStore {\n const config = useConfig()\n const connector = config.connectors.find((c) => c.id === 'zerodev-wallet')\n if (!connector || !('getKitStore' in connector)) {\n throw new Error('useKitStore must be used with the zeroDevWallet connector')\n }\n // @ts-expect-error - getKitStore is a custom method on the kit connector\n return connector.getKitStore()\n}\n","import { useStore } from 'zustand'\nimport { useKitStore } from '../../shared/hooks/useKitStore'\n\nexport function useAuth() {\n const store = useKitStore()\n\n const step = useStore(store, (state) => state.auth.step)\n const stepHistory = useStore(store, (state) => state.auth.stepHistory)\n const email = useStore(store, (state) => state.auth.email)\n const otpId = useStore(store, (state) => state.auth.otpId)\n const otpEncryptionTargetBundle = useStore(\n store,\n (state) => state.auth.otpEncryptionTargetBundle,\n )\n const enabledMethods = useStore(store, (state) => state.auth.enabledMethods)\n const authConfig = useStore(store, (state) => state.auth.config)\n\n return {\n step,\n email,\n otpId,\n otpEncryptionTargetBundle,\n enabledMethods,\n config: authConfig,\n goToStep: store.getState().auth.goToStep,\n goBack: stepHistory.length > 0 ? store.getState().auth.goBack : null,\n reset: store.getState().auth.reset,\n setEmail: store.getState().auth.setEmail,\n setOtpSession: store.getState().auth.setOtpSession,\n clearOtpSession: store.getState().auth.clearOtpSession,\n }\n}\n","import { cn, Text, ZeroDevLogo } from '@zerodev/react-ui'\nimport type { CSSProperties } from 'react'\n\nexport function PoweredBy({\n className,\n style,\n}: {\n className?: string\n style?: CSSProperties\n}) {\n return (\n <div\n className={cn(\n 'zd:gap-1.5 zd:flex zd:flex-row zd:items-center',\n className,\n )}\n >\n <Text>Powered by</Text>\n <ZeroDevLogo\n variant=\"lockup\"\n tone=\"black\"\n className=\"zd:h-4.5 zd:w-auto\"\n style={style}\n />\n </div>\n )\n}\n","import { Text } from '@zerodev/react-ui'\nimport { useSendMagicLink } from '@zerodev/wallet-react'\nimport { useEffect, useState } from 'react'\nimport { PoweredBy } from '../../shared/components/PoweredBy'\nimport { StatusScreen } from '../../shared/components/StatusScreen'\nimport { useAuth } from '../hooks/useAuth'\n\nexport function EmailVerification() {\n const { email, setOtpSession } = useAuth()\n const { mutateAsync: sendMagicLink, isPending: isSendPending } =\n useSendMagicLink()\n\n const [secondsLeftUntilResend, setSecondsLeftUntilResend] = useState(60)\n const canResend = secondsLeftUntilResend <= 0 && !isSendPending\n\n useEffect(() => {\n if (secondsLeftUntilResend <= 0) return\n\n const timer = setInterval(() => {\n setSecondsLeftUntilResend((prev) => Math.max(0, prev - 1))\n }, 1000)\n\n return () => {\n clearInterval(timer)\n }\n }, [secondsLeftUntilResend])\n\n const handleResend = async () => {\n if (!email || !canResend) return\n\n try {\n const { otpId, otpEncryptionTargetBundle } = await sendMagicLink({\n email,\n })\n setOtpSession({ otpId, otpEncryptionTargetBundle })\n setSecondsLeftUntilResend(60)\n } catch {\n // Error resending magic link\n }\n }\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:justify-center\">\n <StatusScreen\n imageName=\"send\"\n title={'Check your email!\\n An Email is On Its Way'}\n >\n We've sent a magic link to{' '}\n <Text as=\"span\" className=\"zd:text-solarOrange\">\n {email}\n </Text>\n {'\\n'}Please open the email and click the link to log in.\n </StatusScreen>\n\n <div className=\"zd:flex zd:flex-col zd:gap-1\">\n <Text className=\"zd:text-center\">\n Did not get an email?{' '}\n <button\n type=\"button\"\n disabled={!canResend}\n onClick={handleResend}\n className=\"zd:cursor-pointer zd:underline zd:disabled:opacity-50 zd:disabled:cursor-not-allowed\"\n >\n {canResend\n ? 'Resend'\n : `Resend in ${secondsLeftUntilResend} ${secondsLeftUntilResend === 1 ? 'second' : 'seconds'}`}\n </button>\n </Text>\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","export function hasMagicLinkCodeInUrl(): boolean {\n if (typeof window === 'undefined') return false\n return new URLSearchParams(window.location.search).has('code')\n}\n\nexport function stripMagicLinkCodeFromUrl(): void {\n if (typeof window === 'undefined') return\n const url = new URL(window.location.href)\n if (!url.searchParams.has('code')) return\n url.searchParams.delete('code')\n window.history.replaceState(null, '', url.toString())\n}\n","import { Button } from '@zerodev/react-ui'\nimport { PoweredBy } from '../../shared/components/PoweredBy'\nimport { StatusScreen } from '../../shared/components/StatusScreen'\nimport { useAuth } from '../hooks/useAuth'\nimport { stripMagicLinkCodeFromUrl } from '../utils/url'\n\ninterface ErrorScreenProps {\n title?: string\n message?: string\n showRetry?: boolean\n showChooseAnother?: boolean\n}\n\nexport function ErrorScreen({\n title = 'Oops, something went wrong',\n message = \"We couldn't complete the sign-in process. This could be due to timeout, an expired link, or a cancelled request.\",\n showRetry = false,\n showChooseAnother = true,\n}: ErrorScreenProps) {\n const { goToStep, goBack, reset } = useAuth()\n const handleRetry = goBack ?? (() => goToStep('sign-up'))\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:items-center zd:justify-center\">\n <StatusScreen imageName=\"error\" title={title}>\n {message}\n </StatusScreen>\n\n <div className=\"zd:flex zd:flex-col zd:gap-1\">\n {showRetry && (\n <Button action=\"primary\" text=\"Try again\" onClick={handleRetry} />\n )}\n {showChooseAnother && (\n <Button\n action={showRetry ? 'secondary' : 'primary'}\n onClick={() => {\n stripMagicLinkCodeFromUrl()\n goToStep('sign-up')\n }}\n text=\"Choose another sign-in method\"\n />\n )}\n {!showRetry && !showChooseAnother && (\n <Button action=\"primary\" text=\"Start over\" onClick={reset} />\n )}\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { cn, Text, Wrapper } from '@zerodev/react-ui'\nimport { useEffect, useMemo, useRef, useState } from 'react'\n\nconst MIN_LENGTH = 4\nconst MAX_LENGTH = 8\nconst DEFAULT_LENGTH = 6\n\nfunction clampLength(length: number): number {\n return Math.max(MIN_LENGTH, Math.min(MAX_LENGTH, length))\n}\n\ninterface CharBoxProps {\n char: string\n isFocused: boolean\n}\n\nfunction CharBox({ char, isFocused }: CharBoxProps) {\n return (\n <Wrapper\n data-testid=\"code-input-box\"\n data-active={isFocused || undefined}\n className={cn(\n 'zd:h-16 zd:w-14 zd:rounded-lg zd:flex zd:items-center zd:justify-center',\n isFocused && 'zd:border-[1.5px] zd:border-greyScale',\n )}\n >\n <Text className=\"zd:text-h2\">{char}</Text>\n </Wrapper>\n )\n}\n\nexport interface CodeInputProps {\n onChange?: (code: string) => void\n onComplete?: (code: string) => void\n disabled?: boolean\n error?: boolean\n autoFocus?: boolean\n length?: number\n 'data-testid'?: string\n}\n\nexport function CodeInput({\n onChange,\n onComplete,\n disabled = false,\n error = false,\n autoFocus = false,\n length = DEFAULT_LENGTH,\n 'data-testid': testId,\n}: CodeInputProps) {\n const codeLength = clampLength(length)\n const charBoxes = useMemo(\n () =>\n Array.from({ length: codeLength }, (_, i) => ({\n id: `char-${i}`,\n index: i,\n })),\n [codeLength],\n )\n\n const [code, setCode] = useState('')\n const [isFocused, setIsFocused] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n if (autoFocus && !disabled) {\n inputRef.current?.focus()\n }\n }, [autoFocus, disabled])\n\n useEffect(() => {\n setCode((prev) => prev.slice(0, codeLength))\n }, [codeLength])\n\n const handleChange = (text: string) => {\n const sanitized = text.slice(0, codeLength).toUpperCase()\n setCode(sanitized)\n onChange?.(sanitized)\n\n if (sanitized.length === codeLength) {\n // Makes sure onComplete is run on the next render cycle after the last char is rendered\n setTimeout(() => {\n onComplete?.(sanitized)\n inputRef.current?.blur()\n }, 0)\n }\n }\n\n return (\n <button\n type=\"button\"\n className=\"zd:flex zd:flex-row zd:items-center zd:justify-between zd:gap-2 zd:w-full zd:cursor-text\"\n onClick={() => inputRef.current?.focus()}\n disabled={disabled}\n data-testid={testId}\n >\n <input\n ref={inputRef}\n value={code}\n onChange={(e) => handleChange(e.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n maxLength={codeLength}\n disabled={disabled}\n className=\"zd:absolute zd:opacity-0 zd:pointer-events-none\"\n style={{ position: 'absolute', opacity: 0 }}\n aria-label=\"Verification code\"\n />\n {charBoxes.map((box) => (\n <CharBox\n key={box.id}\n char={code[box.index] ?? ''}\n isFocused={!error && isFocused && box.index === code.length}\n />\n ))}\n </button>\n )\n}\n","import { Button, Text } from '@zerodev/react-ui'\nimport { useSendOTP, useVerifyOTP } from '@zerodev/wallet-react'\nimport { useEffect, useState } from 'react'\nimport { PoweredBy } from '../../shared/components/PoweredBy'\nimport { CodeInput } from '../components/CodeInput'\nimport { useAuth } from '../hooks/useAuth'\n\nexport function OtpInput() {\n const {\n email,\n otpId,\n otpEncryptionTargetBundle,\n setOtpSession,\n clearOtpSession,\n goToStep,\n config,\n } = useAuth()\n const { mutateAsync: sendOtp, isPending: isSendOtpPending } = useSendOTP()\n const { mutateAsync: verifyOtp, isPending } = useVerifyOTP()\n\n const [otp, setOtp] = useState('')\n const [error, setError] = useState(false)\n const [secondsUntilResend, setSecondsUntilResend] = useState(60)\n\n // Countdown timer for resend\n useEffect(() => {\n if (secondsUntilResend <= 0) return\n\n const interval = setInterval(() => {\n setSecondsUntilResend((prev) => Math.max(0, prev - 1))\n }, 1000)\n return () => clearInterval(interval)\n }, [secondsUntilResend])\n\n const handleVerify = async () => {\n if (!otp.trim() || !otpId || !otpEncryptionTargetBundle) return\n\n setError(false)\n try {\n await verifyOtp({\n otpId,\n code: otp.trim(),\n otpEncryptionTargetBundle,\n })\n clearOtpSession()\n goToStep('authenticated')\n config?.onSuccess?.()\n } catch (err) {\n setError(true)\n config?.onError?.(err)\n }\n }\n\n const handleComplete = (code: string) => {\n setOtp(code)\n }\n\n const handleResend = async () => {\n if (!email || secondsUntilResend > 0 || isSendOtpPending) return\n\n try {\n const { otpId: newOtpId, otpEncryptionTargetBundle: newBundle } =\n await sendOtp({ email })\n setOtpSession({\n otpId: newOtpId,\n otpEncryptionTargetBundle: newBundle,\n })\n setSecondsUntilResend(60)\n setError(false)\n } catch {\n setError(true)\n }\n }\n\n const canResend = secondsUntilResend <= 0 && !isSendOtpPending\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:justify-center zd:items-center\">\n <div className=\"zd:flex zd:flex-col zd:gap-4\">\n <Text className=\"zd:text-h2 zd:text-center\">\n Enter verification code\n </Text>\n <Text className=\"zd:text-center\">\n Enter the code from the email we sent to{' '}\n <Text className=\"zd:text-solarOrange\">{email}</Text>\n </Text>\n </div>\n\n <CodeInput\n onComplete={handleComplete}\n onChange={() => setError(false)}\n disabled={isPending}\n error={error}\n autoFocus\n />\n\n <Button\n text=\"Confirm code\"\n onClick={handleVerify}\n disabled={!otp.trim() || isPending}\n />\n\n <div className=\"zd:flex zd:flex-col zd:gap-1\">\n <Text className=\"zd:text-center\">\n Did not get an email?{' '}\n <button\n type=\"button\"\n disabled={!canResend}\n onClick={handleResend}\n className=\"zd:cursor-pointer zd:underline zd:disabled:opacity-50 zd:disabled:cursor-not-allowed\"\n >\n {canResend\n ? 'Resend'\n : `Resend in ${secondsUntilResend} ${secondsUntilResend === 1 ? 'second' : 'seconds'}`}\n </button>\n </Text>\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { Text } from '@zerodev/react-ui'\nimport { PoweredBy } from '../PoweredBy'\n\nexport function SignUpFooter({\n termsAndConditionsUrl,\n privacyPolicyUrl,\n agreedToTerms,\n setAgreedToTerms,\n highlight = false,\n}: {\n termsAndConditionsUrl?: string | undefined\n privacyPolicyUrl?: string | undefined\n agreedToTerms: boolean\n setAgreedToTerms: (agreed: boolean) => void\n highlight?: boolean\n}) {\n const showAgreement = !!(termsAndConditionsUrl || privacyPolicyUrl)\n\n return (\n <div className=\"zd:flex zd:flex-col zd:items-center zd:gap-5\">\n {showAgreement && (\n <div\n className={`zd:flex zd:flex-row zd:items-center zd:gap-2 zd:rounded-md zd:p-2 zd:transition-colors ${\n highlight\n ? 'zd:border zd:border-negative'\n : 'zd:border zd:border-transparent'\n }`}\n >\n <input\n type=\"checkbox\"\n checked={agreedToTerms}\n onChange={(e) => setAgreedToTerms(e.target.checked)}\n className=\"zd:cursor-pointer zd:[color-scheme:light]\"\n />\n <Text className=\"zd:flex-1\">\n I agree to the{' '}\n {termsAndConditionsUrl && (\n <Text\n as=\"a\"\n href={termsAndConditionsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"zd:underline\"\n >\n Terms & Conditions\n </Text>\n )}\n {termsAndConditionsUrl && privacyPolicyUrl && ' and '}\n {privacyPolicyUrl && (\n <Text\n as=\"a\"\n href={privacyPolicyUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"zd:underline\"\n >\n Privacy Policy\n </Text>\n )}\n </Text>\n </div>\n )}\n <PoweredBy />\n </div>\n )\n}\n","export function capitalizeFirst(str?: string | null): string {\n if (!str) return ''\n const first = str.at(0) ?? ''\n return first.toUpperCase() + str.slice(1)\n}\n\nexport function shortenHex(hex: string, length = 4) {\n return `${hex.slice(0, length + 2)}...${hex.slice(-length)}`\n}\n\nexport function camelCaseToTitle(str: string): string {\n if (str.length === 0 || str.at(0) === str.at(0)?.toUpperCase()) {\n return str\n }\n\n const words = str.replace(/([a-z])([A-Z])/g, '$1 $2').trim()\n return words\n .split(' ')\n .map((word) => capitalizeFirst(word))\n .join(' ')\n}\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\nexport function isValidEmailAddress(email: string): boolean {\n return EMAIL_REGEX.test(email.trim())\n}\n","export default \"__VITE_ASSET__DthArV0k__\"","// ?no-inline forces Vite to emit blob.webm as a separate file (dist/blob.webm)\n// instead of base64-inlining ~700KB into the JS bundle. Requires base:'./' in\n// vite.config.ts so the emitted URL is package-relative, not root-absolute.\nimport blobWebm from '../../assets/blob.webm?no-inline'\n\n// VP9-alpha WebM. Renders the animated blob on browsers that support WebM with\n// an alpha channel (Chrome, Firefox, Edge). Safari plays the WebM container but\n// not VP9 alpha, so the blob is simply not shown there — an acceptable\n// degradation for a decorative element.\nexport function BlobAnimation({ className }: { className?: string }) {\n return (\n <video\n className={className}\n style={{ aspectRatio: '1 / 1' }}\n src={blobWebm}\n autoPlay\n loop\n muted\n playsInline\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n )\n}\n","import { Button, Icon, Input, ListItem, Text } from '@zerodev/react-ui'\nimport {\n useAuthenticateOAuth,\n useLoginPasskey,\n useRegisterPasskey,\n useSendMagicLink,\n useSendOTP,\n} from '@zerodev/wallet-react'\nimport { useState } from 'react'\nimport { SignUpFooter } from '../../shared/components/SignUpFooter'\nimport { isValidEmailAddress } from '../../shared/utils/common'\nimport { BlobAnimation } from '../components/BlobAnimation'\nimport { useAuth } from '../hooks/useAuth'\n\nfunction isCancellationError(err: unknown): boolean {\n if (!(err instanceof Error)) return false\n // WebAuthn / passkey\n if (err.name === 'AbortError' || err.name === 'NotAllowedError') return true\n // OAuth (existing logic, message-based)\n const msg = err.message.toLowerCase()\n return msg.includes('oauth popup was closed')\n}\n\nexport function SignUp() {\n const { goToStep, setEmail, setOtpSession, config, enabledMethods } =\n useAuth()\n const [agreedToTerms, setAgreedToTerms] = useState(false)\n const [highlightAgreement, setHighlightAgreement] = useState(false)\n const [emailInput, setEmailInput] = useState('')\n const shouldUseOtp = config?.emailAuthMethod === 'otp'\n const { mutateAsync: sendOtp, isPending: isSendOtpPending } = useSendOTP()\n const { mutateAsync: sendMagicLink, isPending: isSendMagicLinkPending } =\n useSendMagicLink()\n const isEmailLoading = isSendOtpPending || isSendMagicLinkPending\n\n const [error, setError] = useState<string | null>(null)\n\n const { mutateAsync: authenticateOAuth, isPending: isGoogleLoading } =\n useAuthenticateOAuth({\n mutation: {\n onSuccess: async () => {\n goToStep('authenticated')\n config?.onSuccess?.()\n },\n onError: (err) => {\n config?.onError?.(err)\n },\n },\n })\n\n const { mutate: registerPasskey, isPending: isRegisterPasskeyPending } =\n useRegisterPasskey({\n mutation: {\n onSuccess: () => {\n goToStep('authenticated')\n config?.onSuccess?.()\n },\n onError: (err) => {\n if (!isCancellationError(err)) {\n setError(err instanceof Error ? err.message : String(err))\n }\n config?.onError?.(err)\n },\n },\n })\n\n const { mutate: loginPasskey, isPending: isLoginPasskeyPending } =\n useLoginPasskey({\n mutation: {\n onSuccess: () => {\n goToStep('authenticated')\n config?.onSuccess?.()\n },\n onError: (err) => {\n if (!isCancellationError(err)) {\n setError(err instanceof Error ? err.message : String(err))\n }\n config?.onError?.(err)\n },\n },\n })\n\n const anyPending =\n isGoogleLoading ||\n isEmailLoading ||\n isRegisterPasskeyPending ||\n isLoginPasskeyPending\n const requiresAgreement = !!(\n config?.termsAndConditionsUrl || config?.privacyPolicyUrl\n )\n const needsToAcceptAgreement = requiresAgreement && !agreedToTerms\n\n const handleRegisterPasskey = () => {\n if (anyPending) return\n if (needsToAcceptAgreement) {\n setHighlightAgreement(true)\n return\n }\n setError(null)\n registerPasskey()\n }\n\n const handleLoginPasskey = () => {\n if (anyPending) return\n if (needsToAcceptAgreement) {\n setHighlightAgreement(true)\n return\n }\n setError(null)\n loginPasskey()\n }\n\n const handleGoogleAuth = async () => {\n if (needsToAcceptAgreement) {\n setHighlightAgreement(true)\n return\n }\n setError(null)\n try {\n await authenticateOAuth({ provider: 'google' })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n if (!isCancellationError(err)) {\n setError(message)\n }\n }\n }\n\n const handleEmailOtp = async () => {\n if (!emailInput || anyPending) return\n if (!isValidEmailAddress(emailInput)) return\n if (needsToAcceptAgreement) {\n setHighlightAgreement(true)\n return\n }\n\n setError(null)\n try {\n const { otpId, otpEncryptionTargetBundle } = await sendOtp({\n email: emailInput,\n })\n setEmail(emailInput)\n setOtpSession({ otpId, otpEncryptionTargetBundle })\n goToStep('otp-input')\n } catch (err) {\n setError(\n err instanceof Error ? err.message : 'Failed to send verification code',\n )\n }\n }\n\n const handleEmailMagicLink = async () => {\n if (!emailInput || anyPending) return\n if (!isValidEmailAddress(emailInput)) return\n if (needsToAcceptAgreement) {\n setHighlightAgreement(true)\n return\n }\n\n setError(null)\n try {\n const { otpId, otpEncryptionTargetBundle } = await sendMagicLink({\n email: emailInput,\n })\n setEmail(emailInput)\n setOtpSession({ otpId, otpEncryptionTargetBundle })\n goToStep('email-verification')\n } catch (err) {\n setError(\n err instanceof Error ? err.message : 'Failed to send verification code',\n )\n }\n }\n\n const handleEmailSubmit = shouldUseOtp ? handleEmailOtp : handleEmailMagicLink\n\n if (error) {\n return (\n <div className=\"zd:flex zd:items-center zd:justify-center zd:h-full\">\n <div className=\"zd:flex zd:flex-col zd:gap-4 zd:max-w-md\">\n <Text className=\"zd:text-h2 zd:text-center\">Error occurred</Text>\n <Text className=\"zd:text-center zd:text-red-500\">{error}</Text>\n <Button\n action=\"primary\"\n text=\"Try again\"\n onClick={() => setError(null)}\n />\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:justify-between zd:pb-4 zd:overflow-y-auto zd:overflow-x-hidden\">\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:justify-center\">\n <div className=\"zd:px-4 zd:flex zd:flex-col zd:items-center\">\n <div className=\"zd:w-full zd:px-16 zd:py-4\">\n <BlobAnimation className=\"zd:w-full zd:pointer-events-none zd:select-none\" />\n </div>\n <Text className=\"zd:text-h2 zd:text-center\">\n Continue to your wallet\n </Text>\n <Text className=\"zd:mt-2 zd:text-center zd:text-greyScale/50\">\n Choose a sign-in method to proceed\n </Text>\n </div>\n <div className=\"zd:mt-6 zd:flex zd:flex-col zd:gap-4 zd:mb-4\">\n {enabledMethods.includes('passkey') && (\n <>\n <div className=\"zd:px-4 zd:flex zd:flex-col zd:gap-2\">\n <Button\n action=\"secondary\"\n text=\"Create a passkey\"\n iconName=\"key\"\n trailIcon\n disabled={anyPending}\n onClick={handleRegisterPasskey}\n />\n <Button\n action=\"secondary\"\n text=\"Log in with passkey\"\n iconName=\"key\"\n trailIcon\n disabled={anyPending}\n onClick={handleLoginPasskey}\n />\n </div>\n <div className=\"zd:flex zd:items-center zd:gap-3\">\n <div className=\"zd:h-px zd:flex-1 zd:bg-greyScale/30\" />\n <Text className=\"zd:text-body3\">or</Text>\n <div className=\"zd:h-px zd:flex-1 zd:bg-greyScale/30\" />\n </div>\n </>\n )}\n <div className=\"zd:px-4 zd:flex zd:flex-col zd:gap-2\">\n {enabledMethods.includes('google') && (\n <ListItem\n iconName=\"google\"\n title=\"Google\"\n chevron\n className=\"zd:rounded-3xl\"\n disabled={anyPending}\n onClick={handleGoogleAuth}\n />\n )}\n {enabledMethods.includes('email') && (\n <Input\n iconName=\"email\"\n placeholder=\"Enter your email\"\n value={emailInput}\n onChange={(e) => setEmailInput(e.target.value)}\n type=\"email\"\n autoCapitalize=\"none\"\n autoComplete=\"email\"\n disabled={anyPending}\n variant=\"listItemStyle\"\n containerClassName=\"zd:rounded-3xl\"\n onKeyDown={(e) => {\n if (e.key === 'Enter' && emailInput && !anyPending) {\n void handleEmailSubmit()\n }\n }}\n >\n {isEmailLoading ? (\n <div className=\"zd:w-13 zd:h-13 zd:flex zd:items-center zd:justify-center\">\n <div className=\"zd:w-5 zd:h-5 zd:border-2 zd:border-solarOrange zd:border-t-transparent zd:rounded-full zd:animate-spin\" />\n </div>\n ) : (\n <button\n type=\"button\"\n disabled={\n !isValidEmailAddress(emailInput) || needsToAcceptAgreement\n }\n className={`zd:w-13 zd:h-13 zd:rounded-2xl zd:flex zd:items-center zd:justify-center zd:transition-colors ${\n isValidEmailAddress(emailInput) && !needsToAcceptAgreement\n ? 'zd:cursor-pointer'\n : 'zd:cursor-not-allowed zd:opacity-50'\n }`}\n onClick={() => handleEmailSubmit()}\n >\n <Icon name=\"chevronRight\" className=\"zd:text-greyScale\" />\n </button>\n )}\n </Input>\n )}\n </div>\n </div>\n </div>\n <div className=\"zd:px-4\">\n <SignUpFooter\n termsAndConditionsUrl={config?.termsAndConditionsUrl}\n privacyPolicyUrl={config?.privacyPolicyUrl}\n agreedToTerms={agreedToTerms}\n setAgreedToTerms={(agreed) => {\n setAgreedToTerms(agreed)\n if (agreed) setHighlightAgreement(false)\n }}\n highlight={highlightAgreement}\n />\n </div>\n </div>\n )\n}\n","import { Button } from '@zerodev/react-ui'\nimport { useVerifyMagicLink } from '@zerodev/wallet-react'\nimport { useEffect, useRef, useState } from 'react'\nimport { PoweredBy } from '../../shared/components/PoweredBy'\nimport { StatusScreen } from '../../shared/components/StatusScreen'\nimport { useAuth } from '../hooks/useAuth'\nimport { stripMagicLinkCodeFromUrl } from '../utils/url'\n\nfunction getCodeFromUrl(): string | null {\n if (typeof window === 'undefined') return null\n return new URLSearchParams(window.location.search).get('code')\n}\n\nexport function Verifying() {\n const {\n otpId,\n otpEncryptionTargetBundle,\n goToStep,\n clearOtpSession,\n config,\n } = useAuth()\n const [code] = useState<string | null>(getCodeFromUrl)\n const [error, setError] = useState<Error | null>(null)\n\n // ref to prevent useEffect firing twice in dev's StrictMode\n const hasVerifiedRef = useRef(false)\n const { mutate: verifyMagicLink, isPending: isVerificationLoading } =\n useVerifyMagicLink({\n mutation: {\n onSuccess: async () => {\n clearOtpSession()\n goToStep('authenticated')\n config?.onSuccess?.()\n },\n onError: (err) => {\n setError(err)\n config?.onError?.(err)\n },\n },\n })\n\n useEffect(() => {\n if (hasVerifiedRef.current || !code) return\n hasVerifiedRef.current = true\n\n // No active OTP session — most commonly the user tapped the same\n // magic link again after a successful verify, which cleared the\n // session. Skip the (doomed) mutation, clean the URL, and drop\n // back to step=null so the host app's own routing handles the\n // already-authenticated user without flashing an error.\n if (!otpId || !otpEncryptionTargetBundle) {\n stripMagicLinkCodeFromUrl()\n goToStep(null)\n return\n }\n\n verifyMagicLink({ otpId, code, otpEncryptionTargetBundle })\n }, [otpId, otpEncryptionTargetBundle, code, verifyMagicLink, goToStep])\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:items-center zd:justify-center\">\n {!error && isVerificationLoading && (\n <StatusScreen imageName=\"loading\" title=\"Verifying Your Email\">\n Please wait while we securely connect your wallet.\n </StatusScreen>\n )}\n\n {!error && !code && !isVerificationLoading && (\n <>\n <StatusScreen imageName=\"error\" title=\"Invalid Link\">\n This verification link is invalid or incomplete.\n <br />\n Please check your email and try again with the correct link.\n </StatusScreen>\n <Button\n action=\"primary\"\n onClick={() => {\n stripMagicLinkCodeFromUrl()\n goToStep('sign-up')\n }}\n text=\"Choose another sign-in method\"\n />\n </>\n )}\n\n {error != null && (\n <>\n <StatusScreen imageName=\"error\" title=\"Oops, something went wrong\">\n We couldn't complete the sign-in process. This could be due to\n timeout, an expired link, or a cancelled request.\n </StatusScreen>\n <Button\n action=\"primary\"\n onClick={() => {\n stripMagicLinkCodeFromUrl()\n goToStep('sign-up')\n }}\n text=\"Choose another sign-in method\"\n />\n </>\n )}\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { ListItem, Text } from '@zerodev/react-ui'\nimport { useConnect } from 'wagmi'\nimport { PoweredBy } from '../../shared/components/PoweredBy'\nimport { useAuth } from '../hooks/useAuth'\n\nexport function WalletSelection() {\n const { goToStep } = useAuth()\n const { connect, connectors, isPending } = useConnect()\n\n const externalConnectors = connectors.filter((c) => c.id !== 'zerodev-wallet')\n\n const handleSelect = (connector: (typeof connectors)[number]) => {\n connect(\n { connector },\n {\n onSuccess: () => {\n goToStep(null)\n },\n },\n )\n }\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:justify-center\">\n <Text className=\"zd:text-h2 zd:text-center\">Select your wallet</Text>\n\n <div className=\"zd:flex zd:flex-col zd:gap-2\">\n {externalConnectors.length === 0 ? (\n <Text className=\"zd:text-center\">\n No wallets detected. Install a browser wallet extension to\n continue.\n </Text>\n ) : (\n externalConnectors.map((connector) => (\n <ListItem\n key={connector.uid}\n title={connector.name}\n iconName=\"walletOutline\"\n {...(connector.icon ? { imageUri: connector.icon } : {})}\n disabled={isPending}\n onClick={() => handleSelect(connector)}\n className=\"zd:rounded-3xl\"\n />\n ))\n )}\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { type ReactNode, useEffect } from 'react'\nimport { useStore } from 'zustand'\nimport { Screen } from '../shared/components/Screen'\nimport { StatusScreen } from '../shared/components/StatusScreen'\nimport { TopNav } from '../shared/components/TopNav'\nimport { useKitStore } from '../shared/hooks/useKitStore'\nimport { useAuth } from './hooks/useAuth'\nimport { EmailVerification } from './pages/EmailVerification'\nimport { ErrorScreen } from './pages/ErrorScreen'\nimport { OtpInput } from './pages/OtpInput'\nimport { SignUp } from './pages/SignUp'\nimport { Verifying } from './pages/Verifying'\nimport { WalletSelection } from './pages/WalletSelection'\nimport type { AuthStep } from './types'\nimport { hasMagicLinkCodeInUrl, stripMagicLinkCodeFromUrl } from './utils/url'\n\nconst TITLE_BY_STEP: Partial<Record<AuthStep, string>> = {\n 'wallet-selection': 'Choose your wallet',\n}\n\nfunction OAuthCallback() {\n return (\n <div className=\"zd:flex zd:flex-1 zd:items-center zd:justify-center\">\n <StatusScreen imageName=\"loading\" title=\"Authenticating...\">\n Please wait while we complete the OAuth authentication.\n </StatusScreen>\n </div>\n )\n}\n\nfunction PasskeyPrompt() {\n return (\n <div className=\"zd:flex zd:flex-1 zd:items-center zd:justify-center\">\n <StatusScreen imageName=\"loading\" title=\"Passkey authentication\">\n Please authenticate with your passkey.\n </StatusScreen>\n </div>\n )\n}\n\nfunction renderStep(step: AuthStep | null): ReactNode {\n switch (step) {\n case 'sign-up':\n return <SignUp />\n case 'email-verification':\n return <EmailVerification />\n case 'otp-input':\n return <OtpInput />\n case 'verifying-otp':\n return <Verifying />\n case 'oauth-in-progress':\n return <OAuthCallback />\n case 'passkey-prompt':\n return <PasskeyPrompt />\n case 'wallet-selection':\n return <WalletSelection />\n case 'error':\n return <ErrorScreen />\n default:\n return null\n }\n}\n\nexport function AuthFlow({\n onClose: userOnClose,\n size,\n}: {\n onClose?: (() => void) | undefined\n size?: 'sm' | 'md' | 'lg' | undefined\n} = {}) {\n const { step, goToStep, goBack, reset } = useAuth()\n const logo = useStore(useKitStore(), (s) => s.logo)\n\n useEffect(() => {\n if (step === null && hasMagicLinkCodeInUrl()) {\n goToStep('verifying-otp')\n }\n }, [step, goToStep])\n\n const content = renderStep(step)\n if (!content) return null\n\n const handleClose = () => {\n stripMagicLinkCodeFromUrl()\n reset()\n userOnClose?.()\n }\n const title = step ? TITLE_BY_STEP[step] : undefined\n\n return (\n <Screen\n {...(size && { size })}\n // Some elements in SignUp need to go from edge to edge.\n // No vertical padding; we set px-0 so we can fully control this padding.\n contentClassName={step === 'sign-up' ? 'zd:px-0' : undefined}\n topNav={\n <TopNav\n {...(goBack !== null && { onBack: goBack })}\n onClose={handleClose}\n {...(title && { title })}\n {...(step === 'sign-up' && {\n ...(logo && { logo }),\n className: 'zd:px-4',\n })}\n />\n }\n >\n {content}\n </Screen>\n )\n}\n","import type { StateCreator } from 'zustand'\nimport type { AuthConfig, AuthMethod, AuthStep } from './types'\n\nconst OTP_SESSION_STORAGE_KEY = 'zerodev:auth:otpSession'\n\ntype StoredOtpSession = {\n otpId: string\n otpEncryptionTargetBundle: string\n}\n\nfunction readStoredOtpSession(): StoredOtpSession | null {\n if (typeof window === 'undefined') return null\n try {\n const raw = window.localStorage.getItem(OTP_SESSION_STORAGE_KEY)\n if (!raw) return null\n const parsed = JSON.parse(raw) as StoredOtpSession\n if (!parsed?.otpId || !parsed?.otpEncryptionTargetBundle) return null\n return parsed\n } catch {\n return null\n }\n}\n\nfunction writeStoredOtpSession(session: StoredOtpSession): void {\n if (typeof window === 'undefined') return\n try {\n window.localStorage.setItem(\n OTP_SESSION_STORAGE_KEY,\n JSON.stringify(session),\n )\n } catch {\n // ignore\n }\n}\n\nfunction clearStoredOtpSession(): void {\n if (typeof window === 'undefined') return\n try {\n window.localStorage.removeItem(OTP_SESSION_STORAGE_KEY)\n } catch {\n // ignore\n }\n}\n\nexport interface AuthStoreSlice {\n auth: {\n // State\n step: AuthStep | null\n stepHistory: AuthStep[]\n enabledMethods: AuthMethod[]\n email: string | null\n setEmail: (email: string) => void\n otpId: string | null\n /**\n * HPKE encryption target bundle returned by the latest `sendOTP` call.\n * Required by `verifyOTP` so the OTP attempt can be sealed to the enclave.\n */\n otpEncryptionTargetBundle: string | null\n /** Set both fields produced by `sendOTP` together. */\n setOtpSession: (input: {\n otpId: string\n otpEncryptionTargetBundle: string\n }) => void\n /** Clear the persisted OTP session after a successful verify. */\n clearOtpSession: () => void\n config: AuthConfig | null\n\n // Actions\n initialize: (config: AuthConfig) => void\n goToStep: (step: AuthStep | null) => void\n goBack: () => void\n reset: () => void\n }\n}\n\nexport const createAuthStoreSlice: StateCreator<\n AuthStoreSlice,\n [],\n [],\n AuthStoreSlice\n> = (set, get, _store) => ({\n auth: {\n // Initial state\n step: null,\n stepHistory: [],\n enabledMethods: [],\n email: null,\n otpId: null,\n otpEncryptionTargetBundle: null,\n config: null,\n\n // Actions\n initialize: (config: AuthConfig) => {\n const stored = readStoredOtpSession()\n set((state) => ({\n auth: {\n ...state.auth,\n config,\n enabledMethods: config.enabledMethods,\n ...(stored && {\n otpId: stored.otpId,\n otpEncryptionTargetBundle: stored.otpEncryptionTargetBundle,\n }),\n },\n }))\n },\n\n goToStep: (step: AuthStep | null) => {\n set((state) => ({\n auth: {\n ...state.auth,\n step,\n stepHistory:\n state.auth.step === null\n ? state.auth.stepHistory\n : [...state.auth.stepHistory, state.auth.step],\n },\n }))\n },\n\n goBack: () => {\n const { auth } = get()\n if (auth.stepHistory.length === 0) return\n const newHistory = [...auth.stepHistory]\n const previousStep = newHistory.pop()!\n set((state) => ({\n auth: {\n ...state.auth,\n step: previousStep,\n stepHistory: newHistory,\n },\n }))\n },\n\n reset: () => {\n clearStoredOtpSession()\n set((state) => ({\n auth: {\n ...state.auth,\n step: null,\n stepHistory: [],\n email: null,\n otpId: null,\n otpEncryptionTargetBundle: null,\n },\n }))\n },\n\n setEmail: (email) => {\n set((state) => ({\n auth: {\n ...state.auth,\n email,\n },\n }))\n },\n\n setOtpSession: ({ otpId, otpEncryptionTargetBundle }) => {\n writeStoredOtpSession({ otpId, otpEncryptionTargetBundle })\n set((state) => ({\n auth: {\n ...state.auth,\n otpId,\n otpEncryptionTargetBundle,\n },\n }))\n },\n\n clearOtpSession: () => {\n clearStoredOtpSession()\n set((state) => ({\n auth: {\n ...state.auth,\n otpId: null,\n otpEncryptionTargetBundle: null,\n },\n }))\n },\n },\n})\n","import type { ReactNode } from 'react'\nimport { create } from 'zustand'\nimport { subscribeWithSelector } from 'zustand/middleware'\nimport {\n type AuthStoreSlice,\n createAuthStoreSlice,\n} from './auth/authStoreSlice'\nimport type { PendingRequest } from './types.js'\n\nexport type State = {\n pendingRequests: PendingRequest[]\n userConfirmationListenerActive: boolean\n logo: ReactNode | null\n addPendingRequest: (request: PendingRequest) => void\n removePendingRequest: (id: string) => void\n clearPendingRequests: () => void\n setUserConfirmationListenerActive: (active: boolean) => void\n} & AuthStoreSlice\n\nexport type CreateStoreOptions = {\n logo?: ReactNode\n}\n\nexport const createStore = (options: CreateStoreOptions = {}) =>\n create<State>()(\n subscribeWithSelector((set, get, store) => ({\n pendingRequests: [],\n userConfirmationListenerActive: false,\n logo: options.logo ?? null,\n addPendingRequest: (request) =>\n set((state) => ({\n pendingRequests: [...state.pendingRequests, request],\n })),\n removePendingRequest: (id) =>\n set((state) => ({\n pendingRequests: state.pendingRequests.filter((r) => r.id !== id),\n })),\n clearPendingRequests: () => set({ pendingRequests: [] }),\n setUserConfirmationListenerActive: (active) =>\n set({ userConfirmationListenerActive: active }),\n\n ...createAuthStoreSlice(set, get, store),\n })),\n )\n","import type { CreateConnectorFn } from '@wagmi/core'\nimport type {\n ZeroDevProvider,\n ZeroDevWalletConnectorParams,\n} from '@zerodev/wallet-react'\nimport {\n zeroDevWallet as baseZeroDevWallet,\n NotAuthenticatedError,\n} from '@zerodev/wallet-react'\nimport type { ReactNode } from 'react'\nimport type { AuthConfig } from './auth/types'\nimport { createStore } from './store.js'\nimport type { Request, RequestMethod } from './types.js'\n\nconst DEFAULT_SIGNING_PROMPT_METHODS: RequestMethod[] = [\n 'eth_sendTransaction',\n 'wallet_sendTransaction',\n 'wallet_sendCalls',\n 'personal_sign',\n 'eth_signTypedData_v4',\n]\n\nexport type ZeroDevKitConfig = {\n auth?: AuthConfig\n /**\n * Optional brand logo rendered in the auth flow's top nav. When omitted,\n * no logo is shown. `PoweredBy` always shows the ZeroDev mark independently.\n */\n logo?: ReactNode\n}\n\nexport type ZeroDevKitConnectorParams = ZeroDevWalletConnectorParams & {\n config?: ZeroDevKitConfig\n}\n\nfunction requireUserConfirmation(\n store: ReturnType<typeof createStore>,\n request: Request,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n store.getState().addPendingRequest({\n id: crypto.randomUUID(),\n ...request,\n resolve,\n reject,\n })\n })\n}\n\n/**\n * Resolves when the user completes the auth flow (`step === 'authenticated'`),\n * rejects when they dismiss it (`step === null`).\n */\nfunction waitForAuthFlow(store: ReturnType<typeof createStore>): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const unsub = store.subscribe(\n (state) => state.auth.step,\n (step) => {\n if (step === 'authenticated') {\n unsub()\n resolve()\n } else if (step === null) {\n // User dismissed the auth flow (e.g. clicked the TopNav close\n // button) — abort the pending wagmi connect.\n unsub()\n reject(new Error('Auth flow dismissed'))\n }\n },\n )\n })\n}\n\nexport function zeroDevWallet(\n params: ZeroDevKitConnectorParams,\n): CreateConnectorFn {\n const baseFactory = baseZeroDevWallet(params)\n const store = createStore({ logo: params.config?.logo })\n\n // Initialize auth config if provided\n if (params.config?.auth) {\n store.getState().auth.initialize(params.config.auth)\n }\n\n return (wagmiConfig) => {\n const connector = baseFactory(wagmiConfig)\n\n return {\n ...connector,\n\n async connect(connectParams) {\n // Try to connect first. If a session is persisted, base will load it\n // and resolve — no auth UI needed. If not, it throws\n // `NotAuthenticatedError` and we surface SignUp.\n //\n // This avoids forcing every connect to await the base store's init\n // (which `isAuthorized()` deliberately skips for perf — see\n // packages/react/src/core/connector.ts), and avoids flashing the auth\n // UI on first paint when the session hasn't loaded yet.\n try {\n return await connector.connect(connectParams)\n } catch (error) {\n if (\n connectParams?.isReconnecting ||\n !params.config?.auth ||\n !(error instanceof NotAuthenticatedError)\n ) {\n throw error\n }\n\n if (store.getState().auth.step !== null) {\n throw new Error('Auth flow already in progress')\n }\n\n store.getState().auth.goToStep('sign-up')\n await waitForAuthFlow(store)\n return connector.connect(connectParams)\n }\n },\n\n async disconnect() {\n await connector.disconnect?.()\n if (params.config?.auth) {\n store.getState().auth.reset()\n }\n },\n\n async setup() {\n await connector.setup?.()\n\n // Request-wrapping is only meaningful in the browser (it gates calls\n // on UI confirmation). Skip during SSR — getProvider() touches\n // `window` for EIP-6963 discovery and would crash on the server.\n if (typeof window === 'undefined') return\n\n // Signing is pinned to background mode: the prompt-mode confirmation UI\n // is not part of this package's public surface, so requests always pass\n // through without gating. The wrapping logic below is retained but\n // unreachable.\n // const signing = params.config?.signing\n const signing = { mode: 'background' } as const\n if (signing.mode === 'background') return\n\n const methods =\n // (signing?.mode === 'prompt' && signing.methods) ||\n DEFAULT_SIGNING_PROMPT_METHODS\n\n const provider = (await connector.getProvider()) as ZeroDevProvider\n const baseRequest = provider.request.bind(provider)\n\n // todo: move Request type to core package and use as the method and params type here\n // then we can remove as RequestMethod and spread in return baseRequest\n provider.request = async ({\n method,\n params: reqParams,\n }: {\n method: string\n params?: unknown[]\n }) => {\n const { userConfirmationListenerActive } = store.getState()\n if (\n userConfirmationListenerActive &&\n methods.includes(method as RequestMethod)\n ) {\n await requireUserConfirmation(store, {\n method: method as RequestMethod,\n params: reqParams,\n } as Request)\n }\n\n return baseRequest({\n method,\n ...(reqParams && { params: reqParams }),\n })\n }\n },\n\n getKitStore() {\n return store\n },\n }\n }\n}\n"],"names":["TOP_NAV_HEIGHT","TopNav","onBack","onClose","title","logo","className","jsxs","cn","jsx","IconButton","Text","EllipticalRadial","layer","rect","id","matrix","fillOpacity","stops","Fragment","s","i","FRAME_VIEWBOX","MultiRadialBackground","CardGlow","baseId","useId","layers","WrapperBorder","CONTENT_PADDING_TOP","Screen","children","contentClassName","size","style","topNav","errorImg","loadingImg","sendImg","successImg","STATE_IMAGES","StatusScreen","imageName","useKitStore","connector","useConfig","c","useAuth","store","step","useStore","state","stepHistory","email","otpId","otpEncryptionTargetBundle","enabledMethods","authConfig","PoweredBy","ZeroDevLogo","EmailVerification","setOtpSession","sendMagicLink","isSendPending","useSendMagicLink","secondsLeftUntilResend","setSecondsLeftUntilResend","useState","canResend","useEffect","timer","prev","handleResend","hasMagicLinkCodeInUrl","stripMagicLinkCodeFromUrl","url","ErrorScreen","message","showRetry","showChooseAnother","goToStep","goBack","reset","handleRetry","Button","MIN_LENGTH","MAX_LENGTH","DEFAULT_LENGTH","clampLength","length","CharBox","char","isFocused","Wrapper","CodeInput","onChange","onComplete","disabled","error","autoFocus","testId","codeLength","charBoxes","useMemo","_","code","setCode","setIsFocused","inputRef","useRef","_a","handleChange","text","sanitized","e","box","OtpInput","clearOtpSession","config","sendOtp","isSendOtpPending","useSendOTP","verifyOtp","isPending","useVerifyOTP","otp","setOtp","setError","secondsUntilResend","setSecondsUntilResend","interval","handleVerify","err","_b","handleComplete","newOtpId","newBundle","SignUpFooter","termsAndConditionsUrl","privacyPolicyUrl","agreedToTerms","setAgreedToTerms","highlight","showAgreement","EMAIL_REGEX","isValidEmailAddress","blobWebm","BlobAnimation","isCancellationError","SignUp","setEmail","highlightAgreement","setHighlightAgreement","emailInput","setEmailInput","shouldUseOtp","isSendMagicLinkPending","isEmailLoading","authenticateOAuth","isGoogleLoading","useAuthenticateOAuth","registerPasskey","isRegisterPasskeyPending","useRegisterPasskey","loginPasskey","isLoginPasskeyPending","useLoginPasskey","anyPending","needsToAcceptAgreement","handleRegisterPasskey","handleLoginPasskey","handleGoogleAuth","handleEmailSubmit","ListItem","Input","Icon","agreed","getCodeFromUrl","Verifying","hasVerifiedRef","verifyMagicLink","isVerificationLoading","useVerifyMagicLink","WalletSelection","connect","connectors","useConnect","externalConnectors","handleSelect","TITLE_BY_STEP","OAuthCallback","PasskeyPrompt","renderStep","AuthFlow","userOnClose","content","handleClose","OTP_SESSION_STORAGE_KEY","readStoredOtpSession","raw","parsed","writeStoredOtpSession","session","clearStoredOtpSession","createAuthStoreSlice","set","get","_store","stored","auth","newHistory","previousStep","createStore","options","create","subscribeWithSelector","request","r","active","waitForAuthFlow","resolve","reject","unsub","zeroDevWallet","params","baseFactory","baseZeroDevWallet","wagmiConfig","connectParams","NotAuthenticatedError"],"mappings":"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"}
|