@zerodev/wallet-react-ui 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +124 -0
  2. package/dist/_types/auth/authStoreSlice.d.ts +33 -0
  3. package/dist/_types/auth/authStoreSlice.d.ts.map +1 -0
  4. package/dist/_types/auth/components/BlobAnimation/index.d.ts +4 -0
  5. package/dist/_types/auth/components/BlobAnimation/index.d.ts.map +1 -0
  6. package/dist/_types/auth/components/CodeInput/index.d.ts +11 -0
  7. package/dist/_types/auth/components/CodeInput/index.d.ts.map +1 -0
  8. package/dist/_types/auth/hooks/useAuth.d.ts +18 -0
  9. package/dist/_types/auth/hooks/useAuth.d.ts.map +1 -0
  10. package/dist/_types/auth/index.d.ts +4 -0
  11. package/dist/_types/auth/index.d.ts.map +1 -0
  12. package/dist/_types/auth/pages/EmailVerification.d.ts +2 -0
  13. package/dist/_types/auth/pages/EmailVerification.d.ts.map +1 -0
  14. package/dist/_types/auth/pages/ErrorScreen.d.ts +9 -0
  15. package/dist/_types/auth/pages/ErrorScreen.d.ts.map +1 -0
  16. package/dist/_types/auth/pages/OtpInput.d.ts +2 -0
  17. package/dist/_types/auth/pages/OtpInput.d.ts.map +1 -0
  18. package/dist/_types/auth/pages/SignUp.d.ts +2 -0
  19. package/dist/_types/auth/pages/SignUp.d.ts.map +1 -0
  20. package/dist/_types/auth/pages/Verifying.d.ts +2 -0
  21. package/dist/_types/auth/pages/Verifying.d.ts.map +1 -0
  22. package/dist/_types/auth/pages/WalletSelection.d.ts +2 -0
  23. package/dist/_types/auth/pages/WalletSelection.d.ts.map +1 -0
  24. package/dist/_types/auth/types.d.ts +12 -0
  25. package/dist/_types/auth/types.d.ts.map +1 -0
  26. package/dist/_types/auth/utils/url.d.ts +3 -0
  27. package/dist/_types/auth/utils/url.d.ts.map +1 -0
  28. package/dist/_types/connector.d.ts +17 -0
  29. package/dist/_types/connector.d.ts.map +1 -0
  30. package/dist/_types/index.d.ts +10 -0
  31. package/dist/_types/index.d.ts.map +1 -0
  32. package/dist/_types/shared/components/PoweredBy/index.d.ts +6 -0
  33. package/dist/_types/shared/components/PoweredBy/index.d.ts.map +1 -0
  34. package/dist/_types/shared/components/Screen/EllipticalRadial.d.ts +23 -0
  35. package/dist/_types/shared/components/Screen/EllipticalRadial.d.ts.map +1 -0
  36. package/dist/_types/shared/components/Screen/MultiRadialBackground.d.ts +4 -0
  37. package/dist/_types/shared/components/Screen/MultiRadialBackground.d.ts.map +1 -0
  38. package/dist/_types/shared/components/Screen/index.d.ts +9 -0
  39. package/dist/_types/shared/components/Screen/index.d.ts.map +1 -0
  40. package/dist/_types/shared/components/SignUpFooter/index.d.ts +8 -0
  41. package/dist/_types/shared/components/SignUpFooter/index.d.ts.map +1 -0
  42. package/dist/_types/shared/components/StatusScreen/index.d.ts +10 -0
  43. package/dist/_types/shared/components/StatusScreen/index.d.ts.map +1 -0
  44. package/dist/_types/shared/components/TopNav/index.d.ts +10 -0
  45. package/dist/_types/shared/components/TopNav/index.d.ts.map +1 -0
  46. package/dist/_types/shared/hooks/useKitStore.d.ts +11 -0
  47. package/dist/_types/shared/hooks/useKitStore.d.ts.map +1 -0
  48. package/dist/_types/shared/utils/common.d.ts +5 -0
  49. package/dist/_types/shared/utils/common.d.ts.map +1 -0
  50. package/dist/_types/shared/utils/store.d.ts +4 -0
  51. package/dist/_types/shared/utils/store.d.ts.map +1 -0
  52. package/dist/_types/store.d.ts +25 -0
  53. package/dist/_types/store.d.ts.map +1 -0
  54. package/dist/_types/types.d.ts +38 -0
  55. package/dist/_types/types.d.ts.map +1 -0
  56. package/dist/blob.webm +0 -0
  57. package/dist/error.webp +0 -0
  58. package/dist/index.cjs +4 -0
  59. package/dist/index.cjs.map +1 -0
  60. package/dist/index.mjs +1374 -0
  61. package/dist/index.mjs.map +1 -0
  62. package/dist/loading.webp +0 -0
  63. package/dist/send.webp +0 -0
  64. package/dist/styles.css +2 -0
  65. package/dist/success.webp +0 -0
  66. package/package.json +96 -0
  67. package/src/assets.d.ts +14 -0
  68. package/src/auth/authStoreSlice.ts +180 -0
  69. package/src/auth/components/BlobAnimation/index.tsx +24 -0
  70. package/src/auth/components/CodeInput/index.tsx +118 -0
  71. package/src/auth/hooks/useAuth.ts +32 -0
  72. package/src/auth/index.tsx +108 -0
  73. package/src/auth/pages/EmailVerification.tsx +76 -0
  74. package/src/auth/pages/ErrorScreen.tsx +53 -0
  75. package/src/auth/pages/OtpInput.tsx +124 -0
  76. package/src/auth/pages/SignUp.tsx +303 -0
  77. package/src/auth/pages/Verifying.tsx +108 -0
  78. package/src/auth/pages/WalletSelection.tsx +53 -0
  79. package/src/auth/types.ts +23 -0
  80. package/src/auth/utils/url.ts +12 -0
  81. package/src/connector.ts +182 -0
  82. package/src/index.ts +25 -0
  83. package/src/shared/components/PoweredBy/index.tsx +26 -0
  84. package/src/shared/components/Screen/EllipticalRadial.tsx +65 -0
  85. package/src/shared/components/Screen/MultiRadialBackground.tsx +323 -0
  86. package/src/shared/components/Screen/index.tsx +65 -0
  87. package/src/shared/components/SignUpFooter/index.tsx +66 -0
  88. package/src/shared/components/StatusScreen/index.tsx +49 -0
  89. package/src/shared/components/TopNav/index.tsx +45 -0
  90. package/src/shared/hooks/useKitStore.ts +20 -0
  91. package/src/shared/utils/common.ts +26 -0
  92. package/src/shared/utils/store.ts +9 -0
  93. package/src/store.ts +44 -0
  94. package/src/types.ts +48 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","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","i","FRAME_VIEWBOX","MultiRadialBackground","CardGlow","baseId","useId","layers","WrapperBorder","s","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","hasMagicLinkCodeInUrl","stripMagicLinkCodeFromUrl","url","ErrorScreen","message","showRetry","showChooseAnother","goToStep","goBack","reset","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","handleResend","newOtpId","newBundle","SignUpFooter","termsAndConditionsUrl","privacyPolicyUrl","agreedToTerms","setAgreedToTerms","highlight","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":";;;;;;;AAGO,MAAMA,IAAiB;AAEvB,SAASC,GAAO;AAAA,EACrB,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,WAAAC;AACF,GAMG;AACD,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACAF;AAAA,MAAA;AAAA,MAEF,OAAO,EAAE,QAAQN,EAAA;AAAA,MAEhB,UAAA;AAAA,QAAAE,IACC,gBAAAO,EAACC,GAAA,EAAW,UAAS,eAAc,SAASR,GAAQ,IAEpD,gBAAAO,EAAC,OAAA,EAAI,WAAU,kBAAA,CAAkB;AAAA,QAElCJ,KACC,gBAAAI,EAAC,OAAA,EAAI,WAAU,qGACZ,UAAAJ,GACH;AAAA,QAEDD,KACC,gBAAAK,EAAC,OAAA,EAAI,WAAU,qGACb,4BAACE,GAAA,EAAK,WAAU,iBAAiB,UAAAP,EAAA,CAAM,EAAA,CACzC;AAAA,QAEF,gBAAAK,EAACC,GAAA,EAAW,UAAS,KAAI,SAASP,EAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGjD;ACpBO,SAASS,GAAiB;AAAA,EAC/B,OAAAC;AAAA,EACA,MAAAC;AACF,GAGG;AACD,QAAM,EAAE,IAAAC,GAAI,QAAAC,GAAQ,aAAAC,GAAa,OAAAC,MAAUL;AAE3C,SACE,gBAAAN,EAAAY,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAV,EAAC,QAAA,EACC,UAAA,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,IAAAM;AAAA,QACA,IAAG;AAAA,QACH,IAAG;AAAA,QACH,GAAE;AAAA,QACF,eAAc;AAAA,QACd,mBAAmB,UAAUC,EAAO,KAAK,GAAG,CAAC;AAAA,QAE5C,UAAAE,EAAM,IAAI,CAAC,GAAGE,MACb,gBAAAX;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,QAAQ,EAAE;AAAA,YACV,WAAW,EAAE;AAAA,YACb,aAAa,EAAE;AAAA,UAAA;AAAA,UAHV,EAAE,QAAQW,EAAE,SAAA;AAAA,QAAS,CAK7B;AAAA,MAAA;AAAA,IAAA,GAEL;AAAA,IACA,gBAAAX;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAGK,EAAK;AAAA,QACR,GAAGA,EAAK;AAAA,QACR,OAAOA,EAAK;AAAA,QACZ,QAAQA,EAAK;AAAA,QACb,MAAM,QAAQC,CAAE;AAAA,QAChB,aAAAE;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;ACtDA,MAAMI,KAAgB;AAEf,SAASC,KAAwB;AAItC,SACE,gBAAAb,EAAC,OAAA,EAAI,WAAU,uEACb,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAASY;AAAA,MACT,qBAAoB;AAAA,MACpB,MAAK;AAAA,MACL,cAAW;AAAA,MAEX,UAAA,gBAAAZ,EAAC,QAAA,EAAK,GAAE,MAAK,GAAE,MAAK,OAAM,OAAM,QAAO,OAAM,MAAK,UAAA,CAAU;AAAA,IAAA;AAAA,EAAA,GAEhE;AAEJ;AAYO,SAASc,KAAW;AACzB,QAAMC,IAASC,EAAA,GAMTC,IAAwB;AAAA,IAC5B;AAAA;AAAA;AAAA;AAAA,MAIE,IAAI,GAAGF,CAAM;AAAA,MACb,QAAQ,CAAC,MAAM,GAAG,GAAG,KAAK,QAAQ,CAAC;AAAA,MACnC,aAAa;AAAA,MACb,OAAO;AAAA,QACL,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,KAAA;AAAA,QACxC,EAAE,QAAQ,QAAQ,OAAO,WAAW,SAAS,KAAA;AAAA,QAC7C,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,EAAA;AAAA,MAAE;AAAA,IAC5C;AAAA,IAEF;AAAA;AAAA,MAEE,IAAI,GAAGA,CAAM;AAAA,MACb,QAAQ,CAAC,OAAO,GAAG,GAAG,QAAQ,QAAQ,KAAK;AAAA,MAC3C,aAAa;AAAA,MACb,OAAO;AAAA,QACL,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,IAAA;AAAA,QACxC,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,EAAA;AAAA,MAAE;AAAA,IAC5C;AAAA,IAEF;AAAA;AAAA,MAEE,IAAI,GAAGA,CAAM;AAAA,MACb,QAAQ,CAAC,QAAQ,GAAG,GAAG,QAAQ,GAAG,KAAK;AAAA,MACvC,aAAa;AAAA,MACb,OAAO;AAAA,QACL,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,EAAA;AAAA,QACxC,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,EAAA;AAAA,MAAE;AAAA,IAC5C;AAAA,IAEF;AAAA;AAAA,MAEE,IAAI,GAAGA,CAAM;AAAA,MACb,QAAQ,CAAC,KAAK,GAAG,GAAG,KAAK,KAAK,GAAG;AAAA,MACjC,aAAa;AAAA,MACb,OAAO;AAAA,QACL,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,IAAA;AAAA,QACxC,EAAE,QAAQ,MAAM,OAAO,WAAW,SAAS,IAAA;AAAA,QAC3C,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,KAAA;AAAA,MAAK;AAAA,IAC/C;AAAA,IAEF;AAAA;AAAA,MAEE,IAAI,GAAGA,CAAM;AAAA,MACb,QAAQ,CAAC,KAAK,GAAG,GAAG,KAAK,KAAK,GAAG;AAAA,MACjC,aAAa;AAAA,MACb,OAAO;AAAA,QACL,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,EAAA;AAAA,QACxC,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,EAAA;AAAA,MAAE;AAAA,IAC5C;AAAA,IAEF;AAAA;AAAA,MAEE,IAAI,GAAGA,CAAM;AAAA,MACb,QAAQ,CAAC,OAAO,GAAG,GAAG,QAAQ,OAAO,MAAM;AAAA,MAC3C,aAAa;AAAA,MACb,OAAO;AAAA,QACL,EAAE,QAAQ,GAAG,OAAO,SAAS,SAAS,KAAA;AAAA,QACtC,EAAE,QAAQ,GAAG,OAAO,SAAS,SAAS,EAAA;AAAA,MAAE;AAAA,IAC1C;AAAA,EACF;AAGF,SACE,gBAAAf,EAAC,OAAA,EAAI,WAAU,0FACb,UAAA,gBAAAF;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,qBAAoB;AAAA,MACpB,MAAK;AAAA,MAEJ,UAAA;AAAA,QAAAmB,EAAO,IAAI,CAACb,MACX,gBAAAJ;AAAA,UAACG;AAAA,UAAA;AAAA,YAEC,OAAAC;AAAA,YACA,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK,QAAQ,IAAA;AAAA,UAAI;AAAA,UAFvCA,EAAM;AAAA,QAAA,CAId;AAAA,0BAKA,QAAA,EACC,UAAA,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAI,GAAGiB,CAAM;AAAA,YACb,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,eAAc;AAAA,YAEd,UAAA;AAAA,cAAA,gBAAAf,EAAC,UAAK,QAAO,KAAI,WAAU,SAAQ,aAAY,QAAO;AAAA,gCACrD,QAAA,EAAK,QAAO,QAAO,WAAU,SAAQ,aAAY,QAAO;AAAA,gCACxD,QAAA,EAAK,QAAO,QAAO,WAAU,SAAQ,aAAY,OAAM;AAAA,gCACvD,QAAA,EAAK,QAAO,QAAO,WAAU,SAAQ,aAAY,OAAM;AAAA,gCACvD,QAAA,EAAK,QAAO,KAAI,WAAU,SAAQ,aAAY,MAAA,CAAM;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,GAEzD;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,GAAE;AAAA,YACF,GAAE;AAAA,YACF,OAAM;AAAA,YACN,QAAO;AAAA,YACP,MAAM,QAAQe,CAAM;AAAA,UAAA;AAAA,QAAA;AAAA,0BAKrB,QAAA,EACC,UAAA,gBAAAjB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAI,GAAGiB,CAAM;AAAA,YACb,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,eAAc;AAAA,YAEd,UAAA;AAAA,cAAA,gBAAAf,EAAC,UAAK,QAAO,KAAI,WAAU,WAAU,aAAY,KAAI;AAAA,gCACpD,QAAA,EAAK,QAAO,QAAO,WAAU,WAAU,aAAY,OAAM;AAAA,gCACzD,QAAA,EAAK,QAAO,QAAO,WAAU,WAAU,aAAY,QAAO;AAAA,gCAC1D,QAAA,EAAK,QAAO,KAAI,WAAU,WAAU,aAAY,IAAA,CAAI;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,GAEzD;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,GAAE;AAAA,YACF,GAAE;AAAA,YACF,OAAM;AAAA,YACN,QAAO;AAAA,YACP,MAAM,QAAQe,CAAM;AAAA,UAAA;AAAA,QAAA;AAAA,MACtB;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;AAeO,SAASG,KAAgB;AAC9B,QAAMH,IAASC,EAAA,GAMTC,IAAwB;AAAA,IAC5B;AAAA,MACE,IAAI,GAAGF,CAAM;AAAA;AAAA,MACb,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,IAAA;AAAA,QACxC,EAAE,QAAQ,QAAQ,OAAO,WAAW,SAAS,KAAA;AAAA,QAC7C,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,EAAA;AAAA,MAAE;AAAA,IAC5C;AAAA,IAEF;AAAA,MACE,IAAI,GAAGA,CAAM;AAAA;AAAA,MACb,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,IAAA;AAAA,QACxC,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,EAAA;AAAA,MAAE;AAAA,IAC5C;AAAA,IAEF;AAAA,MACE,IAAI,GAAGA,CAAM;AAAA;AAAA,MACb,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,EAAA;AAAA,QACxC,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,EAAA;AAAA,MAAE;AAAA,IAC5C;AAAA,IAEF;AAAA,MACE,IAAI,GAAGA,CAAM;AAAA;AAAA,MACb,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,EAAA;AAAA,QACxC,EAAE,QAAQ,OAAO,OAAO,WAAW,SAAS,KAAA;AAAA,QAC5C,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,EAAA;AAAA,MAAE;AAAA,IAC5C;AAAA,IAEF;AAAA,MACE,IAAI,GAAGA,CAAM;AAAA;AAAA,MACb,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,IAAA;AAAA,QACxC,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,EAAA;AAAA,MAAE;AAAA,IAC5C;AAAA,IAEF;AAAA,MACE,IAAI,GAAGA,CAAM;AAAA;AAAA,MACb,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,KAAA;AAAA,QACxC,EAAE,QAAQ,GAAG,OAAO,WAAW,SAAS,EAAA;AAAA,MAAE;AAAA,IAC5C;AAAA,EACF;AAGF,SACE,gBAAAf,EAAC,OAAA,EAAI,WAAU,0FACb,UAAA,gBAAAF;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,qBAAoB;AAAA,MACpB,MAAK;AAAA,MAEL,UAAA;AAAA,QAAA,gBAAAE,EAAC,UAAK,OAAM,QAAO,QAAO,QAAO,MAAK,WAAU;AAAA,QAChD,gBAAAA,EAAC,QAAA,EACE,UAAAiB,EAAO,IAAI,CAACb,MACX,gBAAAJ;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,IAAII,EAAM;AAAA,YACV,IAAI,GAAIA,EAAM,KAAKA,EAAM,KAAM,GAAG;AAAA,YAClC,IAAI,GAAIA,EAAM,KAAKA,EAAM,KAAM,GAAG;AAAA,YAClC,GAAE;AAAA,YACF,eAAc;AAAA,YACd,mBAAmB,SAASA,EAAM,EAAE,KAAKA,EAAM,EAAE;AAAA,YAEhD,UAAAA,EAAM,MAAM,IAAI,CAACe,GAAGR,MACnB,gBAAAX;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,QAAQmB,EAAE;AAAA,gBACV,WAAWA,EAAE;AAAA,gBACb,aAAaA,EAAE;AAAA,cAAA;AAAA,cAHVA,EAAE,QAAQR,EAAE,SAAA;AAAA,YAAS,CAK7B;AAAA,UAAA;AAAA,UAfIP,EAAM;AAAA,QAAA,CAiBd,GACH;AAAA,QACCa,EAAO,IAAI,CAACb,MACX,gBAAAJ;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,OAAM;AAAA,YACN,QAAO;AAAA,YACP,MAAM,QAAQI,EAAM,EAAE;AAAA,UAAA;AAAA,UAHjB,GAAGA,EAAM,EAAE;AAAA,QAAA,CAKnB;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAEL;AAEJ;ACzTA,MAAMgB,KAAsB7B,IAAiB;AAEtC,SAAS8B,GAAO;AAAA,EACrB,UAAAC;AAAA,EACA,WAAAzB;AAAA,EACA,kBAAA0B;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AACF,GAMG;AACD,SACE,gBAAA3B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACAF;AAAA,MAAA;AAAA,MAEF,OAAA2B;AAAA,MAIA,UAAA;AAAA,QAAA,gBAAAxB,EAACkB,IAAA,EAAc;AAAA,QAIf,gBAAApB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWC;AAAA,cACT;AAAA,cACAwB;AAAA,YAAA;AAAA,YAKF,OAAO,EAAE,UAAU,sBAAA;AAAA,YAEnB,UAAA;AAAA,cAAA,gBAAAvB,EAACa,IAAA,EAAsB;AAAA,gCACtBC,IAAA,EAAS;AAAA,cACV,gBAAAhB,EAAC,OAAA,EAAI,WAAU,gEACZ,UAAA;AAAA,gBAAA2B;AAAA,gBACD,gBAAAzB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,OAAO,EAAE,YAAY,GAAGoB,EAAmB,KAAA;AAAA,oBAE1C,UAAAE;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACH,EAAA,CACF;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAGN;AChEA,MAAAI,KAAe,kDCAfC,KAAe,oDCAfC,KAAe,iDCAfC,KAAe,oDCSTC,KAA+C;AAAA,EACnD,OAAOJ;AAAA,EACP,SAASC;AAAA,EACT,MAAMC;AAAA,EACN,SAASC;AACX;AASO,SAASE,EAAa;AAAA,EAC3B,WAAAC;AAAA,EACA,OAAArC;AAAA,EACA,UAAA2B;AAAA,EACA,WAAAzB;AACF,GAAsB;AACpB,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAG,gDAAgDF,CAAS;AAAA,MAEvE,UAAA;AAAA,QAAA,gBAAAG;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAK8B,GAAaE,CAAS;AAAA,YAC3B,KAAKA;AAAA,YACL,WAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAEZ,gBAAAlC,EAAC,OAAA,EAAI,WAAU,gDACb,UAAA;AAAA,UAAA,gBAAAE,EAACE,GAAA,EAAK,WAAU,oDACb,UAAAP,GACH;AAAA,UACA,gBAAAK,EAACE,GAAA,EAAK,WAAU,yCACb,UAAAoB,EAAA,CACH;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;ACrCO,SAASW,KAAwB;AAEtC,QAAMC,IADSC,GAAA,EACU,WAAW,KAAK,CAACC,MAAMA,EAAE,OAAO,gBAAgB;AACzE,MAAI,CAACF,KAAa,EAAE,iBAAiBA;AACnC,UAAM,IAAI,MAAM,2DAA2D;AAG7E,SAAOA,EAAU,YAAA;AACnB;AChBO,SAASG,IAAU;AACxB,QAAMC,IAAQL,GAAA,GAERM,IAAOC,EAASF,GAAO,CAACG,MAAUA,EAAM,KAAK,IAAI,GACjDC,IAAcF,EAASF,GAAO,CAACG,MAAUA,EAAM,KAAK,WAAW,GAC/DE,IAAQH,EAASF,GAAO,CAACG,MAAUA,EAAM,KAAK,KAAK,GACnDG,IAAQJ,EAASF,GAAO,CAACG,MAAUA,EAAM,KAAK,KAAK,GACnDI,IAA4BL;AAAA,IAChCF;AAAA,IACA,CAACG,MAAUA,EAAM,KAAK;AAAA,EAAA,GAElBK,IAAiBN,EAASF,GAAO,CAACG,MAAUA,EAAM,KAAK,cAAc,GACrEM,IAAaP,EAASF,GAAO,CAACG,MAAUA,EAAM,KAAK,MAAM;AAE/D,SAAO;AAAA,IACL,MAAAF;AAAA,IACA,OAAAI;AAAA,IACA,OAAAC;AAAA,IACA,2BAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,QAAQC;AAAA,IACR,UAAUT,EAAM,SAAA,EAAW,KAAK;AAAA,IAChC,QAAQI,EAAY,SAAS,IAAIJ,EAAM,SAAA,EAAW,KAAK,SAAS;AAAA,IAChE,OAAOA,EAAM,SAAA,EAAW,KAAK;AAAA,IAC7B,UAAUA,EAAM,SAAA,EAAW,KAAK;AAAA,IAChC,eAAeA,EAAM,SAAA,EAAW,KAAK;AAAA,IACrC,iBAAiBA,EAAM,SAAA,EAAW,KAAK;AAAA,EAAA;AAE3C;AC5BO,SAASU,EAAU;AAAA,EACxB,WAAAnD;AAAA,EACA,OAAA2B;AACF,GAGG;AACD,SACE,gBAAA1B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACAF;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAA,gBAAAG,EAACE,KAAK,UAAA,aAAA,CAAU;AAAA,QAChB,gBAAAF;AAAA,UAACiD;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAAzB;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAGN;AClBO,SAAS0B,KAAoB;AAClC,QAAM,EAAE,OAAAP,GAAO,eAAAQ,EAAA,IAAkBd,EAAA,GAC3B,EAAE,aAAae,GAAe,WAAWC,EAAA,IAC7CC,EAAA,GAEI,CAACC,GAAwBC,CAAyB,IAAIC,EAAS,EAAE,GACjEC,IAAYH,KAA0B,KAAK,CAACF;AAElD,SAAAM,EAAU,MAAM;AACd,QAAIJ,KAA0B,EAAG;AAEjC,UAAMK,IAAQ,YAAY,MAAM;AAC9B,MAAAJ,EAA0B,CAACK,MAAS,KAAK,IAAI,GAAGA,IAAO,CAAC,CAAC;AAAA,IAC3D,GAAG,GAAI;AAEP,WAAO,MAAM;AACX,oBAAcD,CAAK;AAAA,IACrB;AAAA,EACF,GAAG,CAACL,CAAsB,CAAC,GAiBzB,gBAAAzD,EAAAY,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAZ,EAAC,OAAA,EAAI,WAAU,4DACb,UAAA;AAAA,MAAA,gBAAAA;AAAA,QAACiC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO;AAAA;AAAA,UACR,UAAA;AAAA,YAAA;AAAA,YAC4B;AAAA,8BAC1B7B,GAAA,EAAK,IAAG,QAAO,WAAU,uBACvB,UAAAyC,GACH;AAAA,YACC;AAAA;AAAA,YAAK;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,wBAGP,OAAA,EAAI,WAAU,gCACb,UAAA,gBAAA7C,EAACI,GAAA,EAAK,WAAU,kBAAiB,UAAA;AAAA,QAAA;AAAA,QACT;AAAA,QACtB,gBAAAF;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU,CAAC0D;AAAA,YACX,SAlCS,YAAY;AAC/B,kBAAI,GAACf,KAAS,CAACe;AAEf,oBAAI;AACF,wBAAM,EAAE,OAAAd,GAAO,2BAAAC,EAAA,IAA8B,MAAMO,EAAc;AAAA,oBAC/D,OAAAT;AAAA,kBAAA,CACD;AACD,kBAAAQ,EAAc,EAAE,OAAAP,GAAO,2BAAAC,GAA2B,GAClDW,EAA0B,EAAE;AAAA,gBAC9B,QAAQ;AAAA,gBAER;AAAA,YACF;AAAA,YAuBY,WAAU;AAAA,YAET,UAAAE,IACG,WACA,aAAaH,CAAsB,IAAIA,MAA2B,IAAI,WAAW,SAAS;AAAA,UAAA;AAAA,QAAA;AAAA,MAChG,EAAA,CACF,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAEA,gBAAAvD,EAACgD,GAAA,EAAU,WAAU,iCAAA,CAAiC;AAAA,EAAA,GACxD;AAEJ;AC3EO,SAASc,KAAiC;AAC/C,SAAI,OAAO,SAAW,MAAoB,KACnC,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,MAAM;AAC/D;AAEO,SAASC,IAAkC;AAChD,MAAI,OAAO,SAAW,IAAa;AACnC,QAAMC,IAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,EAAKA,EAAI,aAAa,IAAI,MAAM,MAChCA,EAAI,aAAa,OAAO,MAAM,GAC9B,OAAO,QAAQ,aAAa,MAAM,IAAIA,EAAI,UAAU;AACtD;ACEO,SAASC,GAAY;AAAA,EAC1B,OAAAtE,IAAQ;AAAA,EACR,SAAAuE,IAAU;AAAA,EACV,WAAAC,IAAY;AAAA,EACZ,mBAAAC,IAAoB;AACtB,GAAqB;AACnB,QAAM,EAAE,UAAAC,GAAU,QAAAC,GAAQ,OAAAC,EAAA,IAAUlC,EAAA;AAGpC,SACE,gBAAAvC,EAAAY,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAZ,EAAC,OAAA,EAAI,WAAU,4EACb,UAAA;AAAA,MAAA,gBAAAE,EAAC+B,GAAA,EAAa,WAAU,SAAQ,OAAApC,GAC7B,UAAAuE,GACH;AAAA,MAEA,gBAAApE,EAAC,OAAA,EAAI,WAAU,gCACZ,UAAA;AAAA,QAAAqE,uBACEK,GAAA,EAAO,QAAO,WAAU,MAAK,aAAY,SAXhCF,MAAW,MAAMD,EAAS,SAAS,IAWmB;AAAA,QAEjED,KACC,gBAAApE;AAAA,UAACwE;AAAA,UAAA;AAAA,YACC,QAAQL,IAAY,cAAc;AAAA,YAClC,SAAS,MAAM;AACb,cAAAJ,EAAA,GACAM,EAAS,SAAS;AAAA,YACpB;AAAA,YACA,MAAK;AAAA,UAAA;AAAA,QAAA;AAAA,QAGR,CAACF,KAAa,CAACC,KACd,gBAAApE,EAACwE,GAAA,EAAO,QAAO,WAAU,MAAK,cAAa,SAASD,EAAA,CAAO;AAAA,MAAA,EAAA,CAE/D;AAAA,IAAA,GACF;AAAA,IAEA,gBAAAvE,EAACgD,GAAA,EAAU,WAAU,iCAAA,CAAiC;AAAA,EAAA,GACxD;AAEJ;ACjDA,MAAMyB,KAAa,GACbC,KAAa,GACbC,KAAiB;AAEvB,SAASC,GAAYC,GAAwB;AAC3C,SAAO,KAAK,IAAIJ,IAAY,KAAK,IAAIC,IAAYG,CAAM,CAAC;AAC1D;AAOA,SAASC,GAAQ,EAAE,MAAAC,GAAM,WAAAC,KAA2B;AAClD,SACE,gBAAAhF;AAAA,IAACiF;AAAA,IAAA;AAAA,MACC,eAAY;AAAA,MACZ,eAAaD,KAAa;AAAA,MAC1B,WAAWjF;AAAA,QACT;AAAA,QACAiF,KAAa;AAAA,MAAA;AAAA,MAGf,UAAA,gBAAAhF,EAACE,GAAA,EAAK,WAAU,cAAc,UAAA6E,EAAA,CAAK;AAAA,IAAA;AAAA,EAAA;AAGzC;AAYO,SAASG,GAAU;AAAA,EACxB,UAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,OAAAC,IAAQ;AAAA,EACR,WAAAC,IAAY;AAAA,EACZ,QAAAV,IAASF;AAAA,EACT,eAAea;AACjB,GAAmB;AACjB,QAAMC,IAAab,GAAYC,CAAM,GAC/Ba,IAAYC;AAAA,IAChB,MACE,MAAM,KAAK,EAAE,QAAQF,KAAc,CAACG,GAAGjF,OAAO;AAAA,MAC5C,IAAI,QAAQA,CAAC;AAAA,MACb,OAAOA;AAAA,IAAA,EACP;AAAA,IACJ,CAAC8E,CAAU;AAAA,EAAA,GAGP,CAACI,GAAMC,CAAO,IAAIrC,EAAS,EAAE,GAC7B,CAACuB,GAAWe,CAAY,IAAItC,EAAS,EAAK,GAC1CuC,IAAWC,EAAyB,IAAI;AAE9C,EAAAtC,EAAU,MAAM;;AACd,IAAI4B,KAAa,CAACF,OAChBa,IAAAF,EAAS,YAAT,QAAAE,EAAkB;AAAA,EAEtB,GAAG,CAACX,GAAWF,CAAQ,CAAC,GAExB1B,EAAU,MAAM;AACd,IAAAmC,EAAQ,CAACjC,MAASA,EAAK,MAAM,GAAG4B,CAAU,CAAC;AAAA,EAC7C,GAAG,CAACA,CAAU,CAAC;AAEf,QAAMU,IAAe,CAACC,MAAiB;AACrC,UAAMC,IAAYD,EAAK,MAAM,GAAGX,CAAU,EAAE,YAAA;AAC5C,IAAAK,EAAQO,CAAS,GACjBlB,KAAA,QAAAA,EAAWkB,IAEPA,EAAU,WAAWZ,KAEvB,WAAW,MAAM;;AACf,MAAAL,KAAA,QAAAA,EAAaiB,KACbH,IAAAF,EAAS,YAAT,QAAAE,EAAkB;AAAA,IACpB,GAAG,CAAC;AAAA,EAER;AAEA,SACE,gBAAApG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAU;AAAA,MACV,SAAS,MAAA;;AAAM,gBAAAoG,IAAAF,EAAS,YAAT,gBAAAE,EAAkB;AAAA;AAAA,MACjC,UAAAb;AAAA,MACA,eAAaG;AAAA,MAEb,UAAA;AAAA,QAAA,gBAAAxF;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAKgG;AAAA,YACL,OAAOH;AAAA,YACP,UAAU,CAACS,MAAMH,EAAaG,EAAE,OAAO,KAAK;AAAA,YAC5C,SAAS,MAAMP,EAAa,EAAI;AAAA,YAChC,QAAQ,MAAMA,EAAa,EAAK;AAAA,YAChC,WAAWN;AAAA,YACX,UAAAJ;AAAA,YACA,WAAU;AAAA,YACV,OAAO,EAAE,UAAU,YAAY,SAAS,EAAA;AAAA,YACxC,cAAW;AAAA,UAAA;AAAA,QAAA;AAAA,QAEZK,EAAU,IAAI,CAACa,MACd,gBAAAvG;AAAA,UAAC8E;AAAA,UAAA;AAAA,YAEC,MAAMe,EAAKU,EAAI,KAAK,KAAK;AAAA,YACzB,WAAW,CAACjB,KAASN,KAAauB,EAAI,UAAUV,EAAK;AAAA,UAAA;AAAA,UAFhDU,EAAI;AAAA,QAAA,CAIZ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP;AC9GO,SAASC,KAAW;AACzB,QAAM;AAAA,IACJ,OAAA7D;AAAA,IACA,OAAAC;AAAA,IACA,2BAAAC;AAAA,IACA,eAAAM;AAAA,IACA,iBAAAsD;AAAA,IACA,UAAApC;AAAA,IACA,QAAAqC;AAAA,EAAA,IACErE,EAAA,GACE,EAAE,aAAasE,GAAS,WAAWC,EAAA,IAAqBC,EAAA,GACxD,EAAE,aAAaC,GAAW,WAAAC,EAAA,IAAcC,GAAA,GAExC,CAACC,GAAKC,CAAM,IAAIzD,EAAS,EAAE,GAC3B,CAAC6B,GAAO6B,CAAQ,IAAI1D,EAAS,EAAK,GAClC,CAAC2D,GAAoBC,CAAqB,IAAI5D,EAAS,EAAE;AAG/D,EAAAE,EAAU,MAAM;AACd,QAAIyD,KAAsB,EAAG;AAE7B,UAAME,IAAW,YAAY,MAAM;AACjC,MAAAD,EAAsB,CAACxD,MAAS,KAAK,IAAI,GAAGA,IAAO,CAAC,CAAC;AAAA,IACvD,GAAG,GAAI;AACP,WAAO,MAAM,cAAcyD,CAAQ;AAAA,EACrC,GAAG,CAACF,CAAkB,CAAC;AAEvB,QAAMG,IAAe,YAAY;;AAC/B,QAAI,GAACN,EAAI,KAAA,KAAU,CAACrE,KAAS,CAACC,IAE9B;AAAA,MAAAsE,EAAS,EAAK;AACd,UAAI;AACF,cAAML,EAAU;AAAA,UACd,OAAAlE;AAAA,UACA,MAAMqE,EAAI,KAAA;AAAA,UACV,2BAAApE;AAAA,QAAA,CACD,GACD4D,EAAA,GACApC,EAAS,eAAe,IACxB6B,IAAAQ,KAAA,gBAAAA,EAAQ,cAAR,QAAAR,EAAA,KAAAQ;AAAA,MACF,SAASc,GAAK;AACZ,QAAAL,EAAS,EAAI,IACbM,IAAAf,KAAA,gBAAAA,EAAQ,YAAR,QAAAe,EAAA,KAAAf,GAAkBc;AAAA,MACpB;AAAA;AAAA,EACF,GAEME,IAAiB,CAAC7B,MAAiB;AACvC,IAAAqB,EAAOrB,CAAI;AAAA,EACb,GAEM8B,IAAe,YAAY;AAC/B,QAAI,GAAChF,KAASyE,IAAqB,KAAKR;AAExC,UAAI;AACF,cAAM,EAAE,OAAOgB,GAAU,2BAA2BC,EAAA,IAClD,MAAMlB,EAAQ,EAAE,OAAAhE,GAAO;AACzB,QAAAQ,EAAc;AAAA,UACZ,OAAOyE;AAAA,UACP,2BAA2BC;AAAA,QAAA,CAC5B,GACDR,EAAsB,EAAE,GACxBF,EAAS,EAAK;AAAA,MAChB,QAAQ;AACN,QAAAA,EAAS,EAAI;AAAA,MACf;AAAA,EACF,GAEMzD,IAAY0D,KAAsB,KAAK,CAACR;AAE9C,SACE,gBAAA9G,EAAAY,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAZ,EAAC,OAAA,EAAI,WAAU,4EACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,QAAA,gBAAAE,EAACE,GAAA,EAAK,WAAU,6BAA4B,UAAA,2BAE5C;AAAA,QACA,gBAAAJ,EAACI,GAAA,EAAK,WAAU,kBAAiB,UAAA;AAAA,UAAA;AAAA,UACU;AAAA,UACzC,gBAAAF,EAACE,GAAA,EAAK,WAAU,uBAAuB,UAAAyC,EAAA,CAAM;AAAA,QAAA,EAAA,CAC/C;AAAA,MAAA,GACF;AAAA,MAEA,gBAAA3C;AAAA,QAACkF;AAAA,QAAA;AAAA,UACC,YAAYwC;AAAA,UACZ,UAAU,MAAMP,EAAS,EAAK;AAAA,UAC9B,UAAUJ;AAAA,UACV,OAAAzB;AAAA,UACA,WAAS;AAAA,QAAA;AAAA,MAAA;AAAA,MAGX,gBAAAtF;AAAA,QAACwE;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS+C;AAAA,UACT,UAAU,CAACN,EAAI,UAAUF;AAAA,QAAA;AAAA,MAAA;AAAA,wBAG1B,OAAA,EAAI,WAAU,gCACb,UAAA,gBAAAjH,EAACI,GAAA,EAAK,WAAU,kBAAiB,UAAA;AAAA,QAAA;AAAA,QACT;AAAA,QACtB,gBAAAF;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU,CAAC0D;AAAA,YACX,SAASiE;AAAA,YACT,WAAU;AAAA,YAET,UAAAjE,IACG,WACA,aAAa0D,CAAkB,IAAIA,MAAuB,IAAI,WAAW,SAAS;AAAA,UAAA;AAAA,QAAA;AAAA,MACxF,EAAA,CACF,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAEA,gBAAApH,EAACgD,GAAA,EAAU,WAAU,iCAAA,CAAiC;AAAA,EAAA,GACxD;AAEJ;ACxHO,SAAS8E,GAAa;AAAA,EAC3B,uBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,WAAAC,IAAY;AACd,GAMG;AAGD,SACE,gBAAArI,EAAC,OAAA,EAAI,WAAU,gDACZ,UAAA;AAAA,IAJiB,CAAC,EAAEiI,KAAyBC,MAK5C,gBAAAlI;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,0FACTqI,IACI,iCACA,iCACN;AAAA,QAEA,UAAA;AAAA,UAAA,gBAAAnI;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAASiI;AAAA,cACT,UAAU,CAAC3B,MAAM4B,EAAiB5B,EAAE,OAAO,OAAO;AAAA,cAClD,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,UAEZ,gBAAAxG,EAACI,GAAA,EAAK,WAAU,aAAY,UAAA;AAAA,YAAA;AAAA,YACX;AAAA,YACd6H,KACC,gBAAA/H;AAAA,cAACE;AAAA,cAAA;AAAA,gBACC,IAAG;AAAA,gBACH,MAAM6H;AAAA,gBACN,QAAO;AAAA,gBACP,KAAI;AAAA,gBACJ,WAAU;AAAA,gBACX,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAIFA,KAAyBC,KAAoB;AAAA,YAC7CA,KACC,gBAAAhI;AAAA,cAACE;AAAA,cAAA;AAAA,gBACC,IAAG;AAAA,gBACH,MAAM8H;AAAA,gBACN,QAAO;AAAA,gBACP,KAAI;AAAA,gBACJ,WAAU;AAAA,gBACX,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAED,EAAA,CAEJ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,sBAGHhF,GAAA,CAAA,CAAU;AAAA,EAAA,GACb;AAEJ;AC3CA,MAAMoF,KAAc;AACb,SAASC,EAAoB1F,GAAwB;AAC1D,SAAOyF,GAAY,KAAKzF,EAAM,KAAA,CAAM;AACtC;ACzBA,MAAA2F,KAAe;ACSR,SAASC,GAAc,EAAE,WAAA1I,KAAqC;AACnE,SACE,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAAH;AAAA,MACA,OAAO,EAAE,aAAa,QAAA;AAAA,MACtB,KAAKyI;AAAA,MACL,UAAQ;AAAA,MACR,MAAI;AAAA,MACJ,OAAK;AAAA,MACL,aAAW;AAAA,MACX,eAAY;AAAA,MACZ,UAAU;AAAA,IAAA;AAAA,EAAA;AAGhB;ACTA,SAASE,EAAoBhB,GAAuB;AAClD,SAAMA,aAAe,QAEjBA,EAAI,SAAS,gBAAgBA,EAAI,SAAS,oBAA0B,KAE5DA,EAAI,QAAQ,YAAA,EACb,SAAS,wBAAwB,IALR;AAMtC;AAEO,SAASiB,KAAS;AACvB,QAAM,EAAE,UAAApE,GAAU,UAAAqE,GAAU,eAAAvF,GAAe,QAAAuD,GAAQ,gBAAA5D,EAAA,IACjDT,EAAA,GACI,CAAC4F,GAAeC,CAAgB,IAAIzE,EAAS,EAAK,GAClD,CAACkF,GAAoBC,CAAqB,IAAInF,EAAS,EAAK,GAC5D,CAACoF,GAAYC,CAAa,IAAIrF,EAAS,EAAE,GACzCsF,KAAerC,KAAA,gBAAAA,EAAQ,qBAAoB,OAC3C,EAAE,aAAaC,GAAS,WAAWC,EAAA,IAAqBC,EAAA,GACxD,EAAE,aAAazD,GAAe,WAAW4F,EAAA,IAC7C1F,EAAA,GACI2F,IAAiBrC,KAAoBoC,GAErC,CAAC1D,GAAO6B,CAAQ,IAAI1D,EAAwB,IAAI,GAEhD,EAAE,aAAayF,GAAmB,WAAWC,EAAA,IACjDC,GAAqB;AAAA,IACnB,UAAU;AAAA,MACR,WAAW,YAAY;;AACrB,QAAA/E,EAAS,eAAe,IACxB6B,IAAAQ,KAAA,gBAAAA,EAAQ,cAAR,QAAAR,EAAA,KAAAQ;AAAA,MACF;AAAA,MACA,SAAS,CAACc,MAAQ;;AAChB,SAAAtB,IAAAQ,KAAA,gBAAAA,EAAQ,YAAR,QAAAR,EAAA,KAAAQ,GAAkBc;AAAA,MACpB;AAAA,IAAA;AAAA,EACF,CACD,GAEG,EAAE,QAAQ6B,GAAiB,WAAWC,EAAA,IAC1CC,GAAmB;AAAA,IACjB,UAAU;AAAA,MACR,WAAW,MAAM;;AACf,QAAAlF,EAAS,eAAe,IACxB6B,IAAAQ,KAAA,gBAAAA,EAAQ,cAAR,QAAAR,EAAA,KAAAQ;AAAA,MACF;AAAA,MACA,SAAS,CAACc,MAAQ;;AAChB,QAAKgB,EAAoBhB,CAAG,KAC1BL,EAASK,aAAe,QAAQA,EAAI,UAAU,OAAOA,CAAG,CAAC,IAE3DtB,IAAAQ,KAAA,gBAAAA,EAAQ,YAAR,QAAAR,EAAA,KAAAQ,GAAkBc;AAAA,MACpB;AAAA,IAAA;AAAA,EACF,CACD,GAEG,EAAE,QAAQgC,GAAc,WAAWC,GAAA,IACvCC,GAAgB;AAAA,IACd,UAAU;AAAA,MACR,WAAW,MAAM;;AACf,QAAArF,EAAS,eAAe,IACxB6B,IAAAQ,KAAA,gBAAAA,EAAQ,cAAR,QAAAR,EAAA,KAAAQ;AAAA,MACF;AAAA,MACA,SAAS,CAACc,MAAQ;;AAChB,QAAKgB,EAAoBhB,CAAG,KAC1BL,EAASK,aAAe,QAAQA,EAAI,UAAU,OAAOA,CAAG,CAAC,IAE3DtB,IAAAQ,KAAA,gBAAAA,EAAQ,YAAR,QAAAR,EAAA,KAAAQ,GAAkBc;AAAA,MACpB;AAAA,IAAA;AAAA,EACF,CACD,GAEGmC,IACJR,KACAF,KACAK,KACAG,IAIIG,IAHoB,CAAC,EACzBlD,KAAA,QAAAA,EAAQ,yBAAyBA,KAAA,QAAAA,EAAQ,qBAES,CAACuB,GAE/C4B,KAAwB,MAAM;AAClC,QAAI,CAAAF,GACJ;AAAA,UAAIC,GAAwB;AAC1B,QAAAhB,EAAsB,EAAI;AAC1B;AAAA,MACF;AACA,MAAAzB,EAAS,IAAI,GACbkC,EAAA;AAAA;AAAA,EACF,GAEMS,KAAqB,MAAM;AAC/B,QAAI,CAAAH,GACJ;AAAA,UAAIC,GAAwB;AAC1B,QAAAhB,EAAsB,EAAI;AAC1B;AAAA,MACF;AACA,MAAAzB,EAAS,IAAI,GACbqC,EAAA;AAAA;AAAA,EACF,GAEMO,KAAmB,YAAY;AACnC,QAAIH,GAAwB;AAC1B,MAAAhB,EAAsB,EAAI;AAC1B;AAAA,IACF;AACA,IAAAzB,EAAS,IAAI;AACb,QAAI;AACF,YAAM+B,EAAkB,EAAE,UAAU,UAAU;AAAA,IAChD,SAAS1B,GAAK;AACZ,YAAMtD,IAAUsD,aAAe,QAAQA,EAAI,UAAU,OAAOA,CAAG;AAC/D,MAAKgB,EAAoBhB,CAAG,KAC1BL,EAASjD,CAAO;AAAA,IAEpB;AAAA,EACF,GAgDM8F,IAAoBjB,IA9CH,YAAY;AACjC,QAAI,GAACF,KAAcc,MACdtB,EAAoBQ,CAAU,GACnC;AAAA,UAAIe,GAAwB;AAC1B,QAAAhB,EAAsB,EAAI;AAC1B;AAAA,MACF;AAEA,MAAAzB,EAAS,IAAI;AACb,UAAI;AACF,cAAM,EAAE,OAAAvE,GAAO,2BAAAC,EAAA,IAA8B,MAAM8D,EAAQ;AAAA,UACzD,OAAOkC;AAAA,QAAA,CACR;AACD,QAAAH,EAASG,CAAU,GACnB1F,EAAc,EAAE,OAAAP,GAAO,2BAAAC,GAA2B,GAClDwB,EAAS,WAAW;AAAA,MACtB,SAASmD,GAAK;AACZ,QAAAL;AAAA,UACEK,aAAe,QAAQA,EAAI,UAAU;AAAA,QAAA;AAAA,MAEzC;AAAA;AAAA,EACF,IAE6B,YAAY;AACvC,QAAI,GAACqB,KAAcc,MACdtB,EAAoBQ,CAAU,GACnC;AAAA,UAAIe,GAAwB;AAC1B,QAAAhB,EAAsB,EAAI;AAC1B;AAAA,MACF;AAEA,MAAAzB,EAAS,IAAI;AACb,UAAI;AACF,cAAM,EAAE,OAAAvE,GAAO,2BAAAC,EAAA,IAA8B,MAAMO,EAAc;AAAA,UAC/D,OAAOyF;AAAA,QAAA,CACR;AACD,QAAAH,EAASG,CAAU,GACnB1F,EAAc,EAAE,OAAAP,GAAO,2BAAAC,GAA2B,GAClDwB,EAAS,oBAAoB;AAAA,MAC/B,SAASmD,GAAK;AACZ,QAAAL;AAAA,UACEK,aAAe,QAAQA,EAAI,UAAU;AAAA,QAAA;AAAA,MAEzC;AAAA;AAAA,EACF;AAIA,SAAIlC,sBAEC,OAAA,EAAI,WAAU,uDACb,UAAA,gBAAAxF,EAAC,OAAA,EAAI,WAAU,4CACb,UAAA;AAAA,IAAA,gBAAAE,EAACE,GAAA,EAAK,WAAU,6BAA4B,UAAA,kBAAc;AAAA,IAC1D,gBAAAF,EAACE,GAAA,EAAK,WAAU,kCAAkC,UAAAoF,GAAM;AAAA,IACxD,gBAAAtF;AAAA,MAACwE;AAAA,MAAA;AAAA,QACC,QAAO;AAAA,QACP,MAAK;AAAA,QACL,SAAS,MAAM2C,EAAS,IAAI;AAAA,MAAA;AAAA,IAAA;AAAA,EAC9B,EAAA,CACF,EAAA,CACF,IAKF,gBAAArH,EAAC,OAAA,EAAI,WAAU,oGACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,mDACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,+CACb,UAAA;AAAA,QAAA,gBAAAE,EAAC,SAAI,WAAU,8BACb,4BAACuI,IAAA,EAAc,WAAU,mDAAkD,EAAA,CAC7E;AAAA,QACA,gBAAAvI,EAACE,GAAA,EAAK,WAAU,6BAA4B,UAAA,2BAE5C;AAAA,QACA,gBAAAF,EAACE,GAAA,EAAK,WAAU,+CAA8C,UAAA,qCAAA,CAE9D;AAAA,MAAA,GACF;AAAA,MACA,gBAAAJ,EAAC,OAAA,EAAI,WAAU,gDACZ,UAAA;AAAA,QAAAgD,EAAe,SAAS,SAAS,KAChC,gBAAAhD,EAAAY,GAAA,EACE,UAAA;AAAA,UAAA,gBAAAZ,EAAC,OAAA,EAAI,WAAU,wCACb,UAAA;AAAA,YAAA,gBAAAE;AAAA,cAACwE;AAAA,cAAA;AAAA,gBACC,QAAO;AAAA,gBACP,MAAK;AAAA,gBACL,UAAS;AAAA,gBACT,WAAS;AAAA,gBACT,UAAUmF;AAAA,gBACV,SAASE;AAAA,cAAA;AAAA,YAAA;AAAA,YAEX,gBAAA7J;AAAA,cAACwE;AAAA,cAAA;AAAA,gBACC,QAAO;AAAA,gBACP,MAAK;AAAA,gBACL,UAAS;AAAA,gBACT,WAAS;AAAA,gBACT,UAAUmF;AAAA,gBACV,SAASG;AAAA,cAAA;AAAA,YAAA;AAAA,UACX,GACF;AAAA,UACA,gBAAAhK,EAAC,OAAA,EAAI,WAAU,oCACb,UAAA;AAAA,YAAA,gBAAAE,EAAC,OAAA,EAAI,WAAU,uCAAA,CAAuC;AAAA,YACtD,gBAAAA,EAACE,GAAA,EAAK,WAAU,iBAAgB,UAAA,MAAE;AAAA,YAClC,gBAAAF,EAAC,OAAA,EAAI,WAAU,uCAAA,CAAuC;AAAA,UAAA,EAAA,CACxD;AAAA,QAAA,GACF;AAAA,QAEF,gBAAAF,EAAC,OAAA,EAAI,WAAU,wCACZ,UAAA;AAAA,UAAAgD,EAAe,SAAS,QAAQ,KAC/B,gBAAA9C;AAAA,YAACiK;AAAA,YAAA;AAAA,cACC,UAAS;AAAA,cACT,OAAM;AAAA,cACN,SAAO;AAAA,cACP,WAAU;AAAA,cACV,UAAUN;AAAA,cACV,SAASI;AAAA,YAAA;AAAA,UAAA;AAAA,UAGZjH,EAAe,SAAS,OAAO,KAC9B,gBAAA9C;AAAA,YAACkK;AAAA,YAAA;AAAA,cACC,UAAS;AAAA,cACT,aAAY;AAAA,cACZ,OAAOrB;AAAA,cACP,UAAU,CAACvC,MAAMwC,EAAcxC,EAAE,OAAO,KAAK;AAAA,cAC7C,MAAK;AAAA,cACL,gBAAe;AAAA,cACf,cAAa;AAAA,cACb,UAAUqD;AAAA,cACV,SAAQ;AAAA,cACR,oBAAmB;AAAA,cACnB,WAAW,CAACrD,MAAM;AAChB,gBAAIA,EAAE,QAAQ,WAAWuC,KAAc,CAACc,KACjCK,EAAA;AAAA,cAET;AAAA,cAEC,UAAAf,IACC,gBAAAjJ,EAAC,OAAA,EAAI,WAAU,6DACb,4BAAC,OAAA,EAAI,WAAU,0GAAA,CAA0G,EAAA,CAC3H,IAEA,gBAAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,UACE,CAACqI,EAAoBQ,CAAU,KAAKe;AAAA,kBAEtC,WAAW,iGACTvB,EAAoBQ,CAAU,KAAK,CAACe,IAChC,sBACA,qCACN;AAAA,kBACA,SAAS,MAAMI,EAAA;AAAA,kBAEf,UAAA,gBAAAhK,EAACiD,GAAA,EAAK,MAAK,gBAAe,WAAU,oBAAA,CAAoB;AAAA,gBAAA;AAAA,cAAA;AAAA,YAC1D;AAAA,UAAA;AAAA,QAEJ,EAAA,CAEJ;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IACA,gBAAAjD,EAAC,OAAA,EAAI,WAAU,WACb,UAAA,gBAAAA;AAAA,MAAC8H;AAAA,MAAA;AAAA,QACC,uBAAuBpB,KAAA,gBAAAA,EAAQ;AAAA,QAC/B,kBAAkBA,KAAA,gBAAAA,EAAQ;AAAA,QAC1B,eAAAuB;AAAA,QACA,kBAAkB,CAACkC,MAAW;AAC5B,UAAAjC,EAAiBiC,CAAM,GACnBA,OAA8B,EAAK;AAAA,QACzC;AAAA,QACA,WAAWxB;AAAA,MAAA;AAAA,IAAA,EACb,CACF;AAAA,EAAA,GACF;AAEJ;ACtSA,SAASyB,KAAgC;AACvC,SAAI,OAAO,SAAW,MAAoB,OACnC,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,MAAM;AAC/D;AAEO,SAASC,KAAY;AAC1B,QAAM;AAAA,IACJ,OAAAzH;AAAA,IACA,2BAAAC;AAAA,IACA,UAAAwB;AAAA,IACA,iBAAAoC;AAAA,IACA,QAAAC;AAAA,EAAA,IACErE,EAAA,GACE,CAACwD,CAAI,IAAIpC,EAAwB2G,EAAc,GAC/C,CAAC9E,GAAO6B,CAAQ,IAAI1D,EAAuB,IAAI,GAG/C6G,IAAiBrE,EAAO,EAAK,GAC7B,EAAE,QAAQsE,GAAiB,WAAWC,EAAA,IAC1CC,GAAmB;AAAA,IACjB,UAAU;AAAA,MACR,WAAW,YAAY;;AACrB,QAAAhE,EAAA,GACApC,EAAS,eAAe,IACxB6B,IAAAQ,KAAA,gBAAAA,EAAQ,cAAR,QAAAR,EAAA,KAAAQ;AAAA,MACF;AAAA,MACA,SAAS,CAACc,MAAQ;;AAChB,QAAAL,EAASK,CAAG,IACZtB,IAAAQ,KAAA,gBAAAA,EAAQ,YAAR,QAAAR,EAAA,KAAAQ,GAAkBc;AAAA,MACpB;AAAA,IAAA;AAAA,EACF,CACD;AAEH,SAAA7D,EAAU,MAAM;AACd,QAAI,EAAA2G,EAAe,WAAW,CAACzE,IAQ/B;AAAA,UAPAyE,EAAe,UAAU,IAOrB,CAAC1H,KAAS,CAACC,GAA2B;AACxC,QAAAkB,EAAA,GACAM,EAAS,IAAI;AACb;AAAA,MACF;AAEA,MAAAkG,EAAgB,EAAE,OAAA3H,GAAO,MAAAiD,GAAM,2BAAAhD,EAAA,CAA2B;AAAA;AAAA,EAC5D,GAAG,CAACD,GAAOC,GAA2BgD,GAAM0E,GAAiBlG,CAAQ,CAAC,GAGpE,gBAAAvE,EAAAY,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAZ,EAAC,OAAA,EAAI,WAAU,4EACZ,UAAA;AAAA,MAAA,CAACwF,KAASkF,KACT,gBAAAxK,EAAC+B,GAAA,EAAa,WAAU,WAAU,OAAM,wBAAuB,UAAA,qDAAA,CAE/D;AAAA,MAGD,CAACuD,KAAS,CAACO,KAAQ,CAAC2E,KACnB,gBAAA1K,EAAAY,GAAA,EACE,UAAA;AAAA,QAAA,gBAAAZ,EAACiC,GAAA,EAAa,WAAU,SAAQ,OAAM,gBAAe,UAAA;AAAA,UAAA;AAAA,4BAElD,MAAA,EAAG;AAAA,UAAE;AAAA,QAAA,GAER;AAAA,QACA,gBAAA/B;AAAA,UAACwE;AAAA,UAAA;AAAA,YACC,QAAO;AAAA,YACP,SAAS,MAAM;AACb,cAAAT,EAAA,GACAM,EAAS,SAAS;AAAA,YACpB;AAAA,YACA,MAAK;AAAA,UAAA;AAAA,QAAA;AAAA,MACP,GACF;AAAA,MAGDiB,KAAS,QACR,gBAAAxF,EAAAY,GAAA,EACE,UAAA;AAAA,QAAA,gBAAAV,EAAC+B,GAAA,EAAa,WAAU,SAAQ,OAAM,8BAA6B,UAAA,oHAGnE;AAAA,QACA,gBAAA/B;AAAA,UAACwE;AAAA,UAAA;AAAA,YACC,QAAO;AAAA,YACP,SAAS,MAAM;AACb,cAAAT,EAAA,GACAM,EAAS,SAAS;AAAA,YACpB;AAAA,YACA,MAAK;AAAA,UAAA;AAAA,QAAA;AAAA,MACP,EAAA,CACF;AAAA,IAAA,GAEJ;AAAA,IAEA,gBAAArE,EAACgD,GAAA,EAAU,WAAU,iCAAA,CAAiC;AAAA,EAAA,GACxD;AAEJ;ACtGO,SAAS0H,KAAkB;AAChC,QAAM,EAAE,UAAArG,EAAA,IAAahC,EAAA,GACf,EAAE,SAAAsI,GAAS,YAAAC,GAAY,WAAA7D,EAAA,IAAc8D,GAAA,GAErCC,IAAqBF,EAAW,OAAO,CAACxI,MAAMA,EAAE,OAAO,gBAAgB,GAEvE2I,IAAe,CAAC7I,MAA2C;AAC/D,IAAAyI;AAAA,MACE,EAAE,WAAAzI,EAAA;AAAA,MACF;AAAA,QACE,WAAW,MAAM;AACf,UAAAmC,EAAS,IAAI;AAAA,QACf;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SACE,gBAAAvE,EAAAY,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAZ,EAAC,OAAA,EAAI,WAAU,4DACb,UAAA;AAAA,MAAA,gBAAAE,EAACE,GAAA,EAAK,WAAU,6BAA4B,UAAA,sBAAkB;AAAA,wBAE7D,OAAA,EAAI,WAAU,gCACZ,UAAA4K,EAAmB,WAAW,IAC7B,gBAAA9K,EAACE,GAAA,EAAK,WAAU,kBAAiB,UAAA,uEAAA,CAGjC,IAEA4K,EAAmB,IAAI,CAAC5I,MACtB,gBAAAlC;AAAA,QAACiK;AAAA,QAAA;AAAA,UAEC,OAAO/H,EAAU;AAAA,UACjB,UAAS;AAAA,UACR,GAAIA,EAAU,OAAO,EAAE,UAAUA,EAAU,KAAA,IAAS,CAAA;AAAA,UACrD,UAAU6E;AAAA,UACV,SAAS,MAAMgE,EAAa7I,CAAS;AAAA,UACrC,WAAU;AAAA,QAAA;AAAA,QANLA,EAAU;AAAA,MAAA,CAQlB,EAAA,CAEL;AAAA,IAAA,GACF;AAAA,IAEA,gBAAAlC,EAACgD,GAAA,EAAU,WAAU,iCAAA,CAAiC;AAAA,EAAA,GACxD;AAEJ;ACpCA,MAAMgI,KAAmD;AAAA,EACvD,oBAAoB;AACtB;AAEA,SAASC,KAAgB;AACvB,SACE,gBAAAjL,EAAC,OAAA,EAAI,WAAU,uDACb,UAAA,gBAAAA,EAAC+B,GAAA,EAAa,WAAU,WAAU,OAAM,qBAAoB,UAAA,0DAAA,CAE5D,GACF;AAEJ;AAEA,SAASmJ,KAAgB;AACvB,SACE,gBAAAlL,EAAC,OAAA,EAAI,WAAU,uDACb,UAAA,gBAAAA,EAAC+B,GAAA,EAAa,WAAU,WAAU,OAAM,0BAAyB,UAAA,yCAAA,CAEjE,GACF;AAEJ;AAEA,SAASoJ,GAAW5I,GAAkC;AACpD,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,+BAAQkG,IAAA,EAAO;AAAA,IACjB,KAAK;AACH,+BAAQvF,IAAA,EAAkB;AAAA,IAC5B,KAAK;AACH,+BAAQsD,IAAA,EAAS;AAAA,IACnB,KAAK;AACH,+BAAQ6D,IAAA,EAAU;AAAA,IACpB,KAAK;AACH,+BAAQY,IAAA,EAAc;AAAA,IACxB,KAAK;AACH,+BAAQC,IAAA,EAAc;AAAA,IACxB,KAAK;AACH,+BAAQR,IAAA,EAAgB;AAAA,IAC1B,KAAK;AACH,+BAAQzG,IAAA,EAAY;AAAA,IACtB;AACE,aAAO;AAAA,EAAA;AAEb;AAEO,SAASmH,GAAS;AAAA,EACvB,SAASC;AACX,IAEI,IAAI;AACN,QAAM,EAAE,MAAA9I,GAAM,UAAA8B,GAAU,QAAAC,GAAQ,OAAAC,EAAA,IAAUlC,EAAA,GACpCzC,IAAO4C,EAASP,GAAA,GAAe,CAACd,MAAMA,EAAE,IAAI;AAElD,EAAAwC,EAAU,MAAM;AACd,IAAIpB,MAAS,QAAQuB,QACnBO,EAAS,eAAe;AAAA,EAE5B,GAAG,CAAC9B,GAAM8B,CAAQ,CAAC;AAEnB,QAAMiH,IAAUH,GAAW5I,CAAI;AAC/B,MAAI,CAAC+I,EAAS,QAAO;AAErB,QAAMC,IAAc,MAAM;AACxB,IAAAxH,EAAA,GACAQ,EAAA,GACA8G,KAAA,QAAAA;AAAA,EACF,GACM1L,IAAQ4C,IAAOyI,GAAczI,CAAI,IAAI;AAE3C,SACE,gBAAAvC;AAAA,IAACqB;AAAA,IAAA;AAAA,MAGC,kBAAkBkB,MAAS,YAAY,YAAY;AAAA,MACnD,QACE,gBAAAvC;AAAA,QAACR;AAAA,QAAA;AAAA,UACE,GAAI8E,MAAW,QAAQ,EAAE,QAAQA,EAAA;AAAA,UAClC,SAASiH;AAAA,UACR,GAAI5L,KAAS,EAAE,OAAAA,EAAA;AAAA,UACf,GAAI4C,MAAS,aAAa;AAAA,YACzB,GAAI3C,KAAQ,EAAE,MAAAA,EAAA;AAAA,YACd,WAAW;AAAA,UAAA;AAAA,QACb;AAAA,MAAA;AAAA,MAIH,UAAA0L;AAAA,IAAA;AAAA,EAAA;AAGP;ACxGA,MAAME,IAA0B;AAOhC,SAASC,KAAgD;AACvD,MAAI,OAAO,SAAW,IAAa,QAAO;AAC1C,MAAI;AACF,UAAMC,IAAM,OAAO,aAAa,QAAQF,CAAuB;AAC/D,QAAI,CAACE,EAAK,QAAO;AACjB,UAAMC,IAAS,KAAK,MAAMD,CAAG;AAC7B,WAAI,EAACC,KAAA,QAAAA,EAAQ,UAAS,EAACA,KAAA,QAAAA,EAAQ,6BAAkC,OAC1DA;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASC,GAAsBC,GAAiC;AAC9D,MAAI,SAAO,SAAW;AACtB,QAAI;AACF,aAAO,aAAa;AAAA,QAClBL;AAAA,QACA,KAAK,UAAUK,CAAO;AAAA,MAAA;AAAA,IAE1B,QAAQ;AAAA,IAER;AACF;AAEA,SAASC,IAA8B;AACrC,MAAI,SAAO,SAAW;AACtB,QAAI;AACF,aAAO,aAAa,WAAWN,CAAuB;AAAA,IACxD,QAAQ;AAAA,IAER;AACF;AAiCO,MAAMO,KAKT,CAACC,GAAKC,GAAKC,OAAY;AAAA,EACzB,MAAM;AAAA;AAAA,IAEJ,MAAM;AAAA,IACN,aAAa,CAAA;AAAA,IACb,gBAAgB,CAAA;AAAA,IAChB,OAAO;AAAA,IACP,OAAO;AAAA,IACP,2BAA2B;AAAA,IAC3B,QAAQ;AAAA;AAAA,IAGR,YAAY,CAACxF,MAAuB;AAClC,YAAMyF,IAASV,GAAA;AACf,MAAAO,EAAI,CAACvJ,OAAW;AAAA,QACd,MAAM;AAAA,UACJ,GAAGA,EAAM;AAAA,UACT,QAAAiE;AAAA,UACA,gBAAgBA,EAAO;AAAA,UACvB,GAAIyF,KAAU;AAAA,YACZ,OAAOA,EAAO;AAAA,YACd,2BAA2BA,EAAO;AAAA,UAAA;AAAA,QACpC;AAAA,MACF,EACA;AAAA,IACJ;AAAA,IAEA,UAAU,CAAC5J,MAA0B;AACnC,MAAAyJ,EAAI,CAACvJ,OAAW;AAAA,QACd,MAAM;AAAA,UACJ,GAAGA,EAAM;AAAA,UACT,MAAAF;AAAA,UACA,aACEE,EAAM,KAAK,SAAS,OAChBA,EAAM,KAAK,cACX,CAAC,GAAGA,EAAM,KAAK,aAAaA,EAAM,KAAK,IAAI;AAAA,QAAA;AAAA,MACnD,EACA;AAAA,IACJ;AAAA,IAEA,QAAQ,MAAM;AACZ,YAAM,EAAE,MAAA2J,EAAA,IAASH,EAAA;AACjB,UAAIG,EAAK,YAAY,WAAW,EAAG;AACnC,YAAMC,IAAa,CAAC,GAAGD,EAAK,WAAW,GACjCE,IAAeD,EAAW,IAAA;AAChC,MAAAL,EAAI,CAACvJ,OAAW;AAAA,QACd,MAAM;AAAA,UACJ,GAAGA,EAAM;AAAA,UACT,MAAM6J;AAAA,UACN,aAAaD;AAAA,QAAA;AAAA,MACf,EACA;AAAA,IACJ;AAAA,IAEA,OAAO,MAAM;AACX,MAAAP,EAAA,GACAE,EAAI,CAACvJ,OAAW;AAAA,QACd,MAAM;AAAA,UACJ,GAAGA,EAAM;AAAA,UACT,MAAM;AAAA,UACN,aAAa,CAAA;AAAA,UACb,OAAO;AAAA,UACP,OAAO;AAAA,UACP,2BAA2B;AAAA,QAAA;AAAA,MAC7B,EACA;AAAA,IACJ;AAAA,IAEA,UAAU,CAACE,MAAU;AACnB,MAAAqJ,EAAI,CAACvJ,OAAW;AAAA,QACd,MAAM;AAAA,UACJ,GAAGA,EAAM;AAAA,UACT,OAAAE;AAAA,QAAA;AAAA,MACF,EACA;AAAA,IACJ;AAAA,IAEA,eAAe,CAAC,EAAE,OAAAC,GAAO,2BAAAC,QAAgC;AACvD,MAAA+I,GAAsB,EAAE,OAAAhJ,GAAO,2BAAAC,GAA2B,GAC1DmJ,EAAI,CAACvJ,OAAW;AAAA,QACd,MAAM;AAAA,UACJ,GAAGA,EAAM;AAAA,UACT,OAAAG;AAAA,UACA,2BAAAC;AAAA,QAAA;AAAA,MACF,EACA;AAAA,IACJ;AAAA,IAEA,iBAAiB,MAAM;AACrB,MAAAiJ,EAAA,GACAE,EAAI,CAACvJ,OAAW;AAAA,QACd,MAAM;AAAA,UACJ,GAAGA,EAAM;AAAA,UACT,OAAO;AAAA,UACP,2BAA2B;AAAA,QAAA;AAAA,MAC7B,EACA;AAAA,IACJ;AAAA,EAAA;AAEJ,IC5Ja8J,KAAc,CAACC,IAA8B,CAAA,MACxDC,GAAA;AAAA,EACEC,GAAsB,CAACV,GAAKC,GAAK3J,OAAW;AAAA,IAC1C,iBAAiB,CAAA;AAAA,IACjB,gCAAgC;AAAA,IAChC,MAAMkK,EAAQ,QAAQ;AAAA,IACtB,mBAAmB,CAACG,MAClBX,EAAI,CAACvJ,OAAW;AAAA,MACd,iBAAiB,CAAC,GAAGA,EAAM,iBAAiBkK,CAAO;AAAA,IAAA,EACnD;AAAA,IACJ,sBAAsB,CAACrM,MACrB0L,EAAI,CAACvJ,OAAW;AAAA,MACd,iBAAiBA,EAAM,gBAAgB,OAAO,CAACmK,MAAMA,EAAE,OAAOtM,CAAE;AAAA,IAAA,EAChE;AAAA,IACJ,sBAAsB,MAAM0L,EAAI,EAAE,iBAAiB,CAAA,GAAI;AAAA,IACvD,mCAAmC,CAACa,MAClCb,EAAI,EAAE,gCAAgCa,GAAQ;AAAA,IAEhD,GAAGd,GAAqBC,GAAKC,CAAU;AAAA,EAAA,EACvC;AACJ;ACUF,SAASa,GAAgBxK,GAAsD;AAC7E,SAAO,IAAI,QAAc,CAACyK,GAASC,MAAW;AAC5C,UAAMC,IAAQ3K,EAAM;AAAA,MAClB,CAACG,MAAUA,EAAM,KAAK;AAAA,MACtB,CAACF,MAAS;AACR,QAAIA,MAAS,mBACX0K,EAAA,GACAF,EAAA,KACSxK,MAAS,SAGlB0K,EAAA,GACAD,EAAO,IAAI,MAAM,qBAAqB,CAAC;AAAA,MAE3C;AAAA,IAAA;AAAA,EAEJ,CAAC;AACH;AAEO,SAASE,GACdC,GACmB;;AACnB,QAAMC,IAAcC,GAAkBF,CAAM,GACtC7K,IAAQiK,GAAY,EAAE,OAAMrG,IAAAiH,EAAO,WAAP,gBAAAjH,EAAe,MAAM;AAGvD,UAAIuB,IAAA0F,EAAO,WAAP,QAAA1F,EAAe,QACjBnF,EAAM,WAAW,KAAK,WAAW6K,EAAO,OAAO,IAAI,GAG9C,CAACG,MAAgB;AACtB,UAAMpL,IAAYkL,EAAYE,CAAW;AAEzC,WAAO;AAAA,MACL,GAAGpL;AAAA,MAEH,MAAM,QAAQqL,GAAe;;AAS3B,YAAI;AACF,iBAAO,MAAMrL,EAAU,QAAQqL,CAAa;AAAA,QAC9C,SAASjI,GAAO;AACd,cACEiI,KAAA,QAAAA,EAAe,kBACf,GAACrH,IAAAiH,EAAO,WAAP,QAAAjH,EAAe,SAChB,EAAEZ,aAAiBkI;AAEnB,kBAAMlI;AAGR,cAAIhD,EAAM,SAAA,EAAW,KAAK,SAAS;AACjC,kBAAM,IAAI,MAAM,+BAA+B;AAGjD,iBAAAA,EAAM,SAAA,EAAW,KAAK,SAAS,SAAS,GACxC,MAAMwK,GAAgBxK,CAAK,GACpBJ,EAAU,QAAQqL,CAAa;AAAA,QACxC;AAAA,MACF;AAAA,MAEA,MAAM,aAAa;;AACjB,gBAAMrH,IAAAhE,EAAU,eAAV,gBAAAgE,EAAA,KAAAhE,MACFuF,IAAA0F,EAAO,WAAP,QAAA1F,EAAe,QACjBnF,EAAM,SAAA,EAAW,KAAK,MAAA;AAAA,MAE1B;AAAA,MAEA,MAAM,QAAQ;;AAMZ,QALA,QAAM4D,IAAAhE,EAAU,UAAV,gBAAAgE,EAAA,KAAAhE,KAKF,OAAO,SAAW;AAAA,MA0CxB;AAAA,MAEA,cAAc;AACZ,eAAOI;AAAA,MACT;AAAA,IAAA;AAAA,EAEJ;AACF;"}
Binary file
package/dist/send.webp ADDED
Binary file
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--zd-font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--zd-color-red-500:oklch(63.7% .237 25.331);--zd-color-gray-50:oklch(98.5% .002 247.839);--zd-color-gray-100:oklch(96.7% .003 264.542);--zd-color-gray-400:oklch(70.7% .022 261.325);--zd-color-gray-500:oklch(55.1% .027 264.364);--zd-color-gray-700:oklch(37.3% .034 259.733);--zd-color-gray-900:oklch(21% .034 264.665);--zd-color-white:#fff;--zd-spacing:.25rem;--zd-container-md:28rem;--zd-text-xs--line-height:calc(1 / .75);--zd-text-sm--line-height:calc(1.25 / .875);--zd-text-base--line-height:calc(1.5 / 1);--zd-text-lg--line-height:calc(1.75 / 1.125);--zd-text-xl--line-height:calc(1.75 / 1.25);--zd-text-2xl--line-height:calc(2 / 1.5);--zd-font-weight-medium:500;--zd-font-weight-semibold:600;--zd-font-weight-bold:700;--zd-radius-md:.375rem;--zd-radius-lg:.5rem;--zd-radius-xl:.75rem;--zd-radius-2xl:1rem;--zd-radius-3xl:1.5rem;--zd-radius-4xl:2rem;--zd-animate-spin:spin 1s linear infinite;--zd-animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--zd-default-transition-duration:.15s;--zd-default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--zd-default-font-family:sans-serif;--zd-default-mono-font-family:var(--zd-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--zd-default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--zd-default-font-feature-settings,normal);font-variation-settings:var(--zd-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--zd-default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--zd-default-mono-font-feature-settings,normal);font-variation-settings:var(--zd-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.zd\:pointer-events-none{pointer-events:none}.zd\:absolute{position:absolute}.zd\:fixed{position:fixed}.zd\:relative{position:relative}.zd\:inset-0{inset:calc(var(--zd-spacing) * 0)}.zd\:top-4{top:calc(var(--zd-spacing) * 4)}.zd\:right-0{right:calc(var(--zd-spacing) * 0)}.zd\:left-0{left:calc(var(--zd-spacing) * 0)}.zd\:z-0{z-index:0}.zd\:z-10{z-index:10}.zd\:z-50{z-index:50}.zd\:m-1\.5{margin:calc(var(--zd-spacing) * 1.5)}.zd\:my-\[1\.5px\]{margin-block:1.5px}.zd\:mt-2{margin-top:calc(var(--zd-spacing) * 2)}.zd\:mt-3{margin-top:calc(var(--zd-spacing) * 3)}.zd\:mt-6{margin-top:calc(var(--zd-spacing) * 6)}.zd\:mb-1{margin-bottom:calc(var(--zd-spacing) * 1)}.zd\:mb-1\.5{margin-bottom:calc(var(--zd-spacing) * 1.5)}.zd\:mb-2{margin-bottom:calc(var(--zd-spacing) * 2)}.zd\:mb-4{margin-bottom:calc(var(--zd-spacing) * 4)}.zd\:flex{display:flex}.zd\:grid{display:grid}.zd\:h-2\.5{height:calc(var(--zd-spacing) * 2.5)}.zd\:h-3{height:calc(var(--zd-spacing) * 3)}.zd\:h-3\.5{height:calc(var(--zd-spacing) * 3.5)}.zd\:h-4{height:calc(var(--zd-spacing) * 4)}.zd\:h-5{height:calc(var(--zd-spacing) * 5)}.zd\:h-6{height:calc(var(--zd-spacing) * 6)}.zd\:h-7{height:calc(var(--zd-spacing) * 7)}.zd\:h-8{height:calc(var(--zd-spacing) * 8)}.zd\:h-11{height:calc(var(--zd-spacing) * 11)}.zd\:h-12{height:calc(var(--zd-spacing) * 12)}.zd\:h-13{height:52px}.zd\:h-16{height:calc(var(--zd-spacing) * 16)}.zd\:h-32{height:calc(var(--zd-spacing) * 32)}.zd\:h-\[18px\]{height:18px}.zd\:h-\[52px\]{height:52px}.zd\:h-\[68px\]{height:68px}.zd\:h-\[84px\]{height:84px}.zd\:h-\[100dvh\]{height:100dvh}.zd\:h-\[118px\]{height:118px}.zd\:h-full{height:100%}.zd\:h-px{height:1px}.zd\:max-h-48{max-height:calc(var(--zd-spacing) * 48)}.zd\:min-h-0{min-height:calc(var(--zd-spacing) * 0)}.zd\:min-h-11{min-height:calc(var(--zd-spacing) * 11)}.zd\:min-h-75{min-height:calc(var(--zd-spacing) * 75)}.zd\:w-1\/2{width:50%}.zd\:w-1\/3{width:33.3333%}.zd\:w-2\.5{width:calc(var(--zd-spacing) * 2.5)}.zd\:w-3{width:calc(var(--zd-spacing) * 3)}.zd\:w-3\.5{width:calc(var(--zd-spacing) * 3.5)}.zd\:w-4{width:calc(var(--zd-spacing) * 4)}.zd\:w-5{width:calc(var(--zd-spacing) * 5)}.zd\:w-6{width:calc(var(--zd-spacing) * 6)}.zd\:w-7{width:calc(var(--zd-spacing) * 7)}.zd\:w-8{width:calc(var(--zd-spacing) * 8)}.zd\:w-11{width:calc(var(--zd-spacing) * 11)}.zd\:w-12{width:calc(var(--zd-spacing) * 12)}.zd\:w-13{width:52px}.zd\:w-14{width:calc(var(--zd-spacing) * 14)}.zd\:w-24{width:calc(var(--zd-spacing) * 24)}.zd\:w-72{width:calc(var(--zd-spacing) * 72)}.zd\:w-80{width:calc(var(--zd-spacing) * 80)}.zd\:w-125{width:calc(var(--zd-spacing) * 125)}.zd\:w-\[18px\]{width:18px}.zd\:w-\[52px\]{width:52px}.zd\:w-\[105px\]{width:105px}.zd\:w-\[118px\]{width:118px}.zd\:w-auto{width:auto}.zd\:w-full{width:100%}.zd\:w-screen{width:100vw}.zd\:max-w-md{max-width:var(--zd-container-md)}.zd\:min-w-0{min-width:calc(var(--zd-spacing) * 0)}.zd\:flex-1{flex:1}.zd\:shrink-0{flex-shrink:0}.zd\:animate-pulse{animation:var(--zd-animate-pulse)}.zd\:animate-spin{animation:var(--zd-animate-spin)}.zd\:cursor-not-allowed{cursor:not-allowed}.zd\:cursor-pointer{cursor:pointer}.zd\:cursor-text{cursor:text}.zd\:resize-none{resize:none}.zd\:flex-col{flex-direction:column}.zd\:flex-row{flex-direction:row}.zd\:flex-wrap{flex-wrap:wrap}.zd\:place-items-center{place-items:center}.zd\:items-center{align-items:center}.zd\:justify-between{justify-content:space-between}.zd\:justify-center{justify-content:center}.zd\:gap-1{gap:calc(var(--zd-spacing) * 1)}.zd\:gap-1\.5{gap:calc(var(--zd-spacing) * 1.5)}.zd\:gap-2{gap:calc(var(--zd-spacing) * 2)}.zd\:gap-3{gap:calc(var(--zd-spacing) * 3)}.zd\:gap-4{gap:calc(var(--zd-spacing) * 4)}.zd\:gap-5{gap:calc(var(--zd-spacing) * 5)}.zd\:gap-6{gap:calc(var(--zd-spacing) * 6)}.zd\:gap-8{gap:calc(var(--zd-spacing) * 8)}.zd\:self-center{align-self:center}.zd\:self-end{align-self:flex-end}.zd\:self-start{align-self:flex-start}.zd\:overflow-auto{overflow:auto}.zd\:overflow-hidden{overflow:hidden}.zd\:overflow-x-hidden{overflow-x:hidden}.zd\:overflow-y-auto{overflow-y:auto}.zd\:rounded-2xl{border-radius:var(--zd-radius-2xl)}.zd\:rounded-3xl{border-radius:var(--zd-radius-3xl)}.zd\:rounded-4xl{border-radius:var(--zd-radius-4xl)}.zd\:rounded-\[30px\]{border-radius:30px}.zd\:rounded-\[34px\]{border-radius:34px}.zd\:rounded-\[36px\]{border-radius:36px}.zd\:rounded-full{border-radius:3.40282e38px}.zd\:rounded-lg{border-radius:var(--zd-radius-lg)}.zd\:rounded-md{border-radius:var(--zd-radius-md)}.zd\:rounded-xl{border-radius:var(--zd-radius-xl)}.zd\:border{border-style:var(--tw-border-style);border-width:1px}.zd\:border-0{border-style:var(--tw-border-style);border-width:0}.zd\:border-2{border-style:var(--tw-border-style);border-width:2px}.zd\:border-\[0\.3px\]{border-style:var(--tw-border-style);border-width:.3px}.zd\:border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.zd\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.zd\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.zd\:border-gray-100{border-color:var(--zd-color-gray-100)}.zd\:border-greyScale{border-color:#130e0b}.zd\:border-negative{border-color:#ff4221}.zd\:border-offWhite{border-color:#f7f5f0}.zd\:border-offWhite\/50{border-color:oklab(97.0302% .000165075 .00696582/.5)}.zd\:border-solarOrange{border-color:#e76000}.zd\:border-transparent{border-color:#0000}.zd\:border-white\/0{border-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:border-white\/0{border-color:color-mix(in oklab, var(--zd-color-white) 0%, transparent)}}.zd\:border-t-transparent{border-top-color:#0000}.zd\:bg-gray-50{background-color:var(--zd-color-gray-50)}.zd\:bg-greyScale\/30{background-color:oklab(16.9052% .00636494 .00836386/.3)}.zd\:bg-offWhite{background-color:#f7f5f0}.zd\:bg-offWhite\/50{background-color:oklab(97.0302% .000165075 .00696582/.5)}.zd\:bg-offWhite\/85{background-color:oklab(97.0302% .000165075 .00696582/.85)}.zd\:bg-orange\/10{background-color:oklab(70.9342% .114827 .116983/.1)}.zd\:bg-solarOrange{background-color:#e76000}.zd\:bg-solarOrange\/15{background-color:oklab(65.138% .131584 .131685/.15)}.zd\:bg-transparent{background-color:#0000}.zd\:bg-white,.zd\:bg-white\/20{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:bg-white\/20{background-color:color-mix(in oklab, var(--zd-color-white) 20%, transparent)}}.zd\:bg-white\/40{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:bg-white\/40{background-color:color-mix(in oklab, var(--zd-color-white) 40%, transparent)}}.zd\:bg-white\/70{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:bg-white\/70{background-color:color-mix(in oklab, var(--zd-color-white) 70%, transparent)}}.zd\:p-1{padding:calc(var(--zd-spacing) * 1)}.zd\:p-2{padding:calc(var(--zd-spacing) * 2)}.zd\:p-3{padding:calc(var(--zd-spacing) * 3)}.zd\:p-4{padding:calc(var(--zd-spacing) * 4)}.zd\:p-6{padding:calc(var(--zd-spacing) * 6)}.zd\:px-0{padding-inline:calc(var(--zd-spacing) * 0)}.zd\:px-2{padding-inline:calc(var(--zd-spacing) * 2)}.zd\:px-3{padding-inline:calc(var(--zd-spacing) * 3)}.zd\:px-4{padding-inline:calc(var(--zd-spacing) * 4)}.zd\:px-5{padding-inline:calc(var(--zd-spacing) * 5)}.zd\:px-6{padding-inline:calc(var(--zd-spacing) * 6)}.zd\:px-16{padding-inline:calc(var(--zd-spacing) * 16)}.zd\:py-1{padding-block:calc(var(--zd-spacing) * 1)}.zd\:py-3{padding-block:calc(var(--zd-spacing) * 3)}.zd\:py-3\.5{padding-block:calc(var(--zd-spacing) * 3.5)}.zd\:py-4{padding-block:calc(var(--zd-spacing) * 4)}.zd\:py-5{padding-block:calc(var(--zd-spacing) * 5)}.zd\:py-6{padding-block:calc(var(--zd-spacing) * 6)}.zd\:pt-2{padding-top:calc(var(--zd-spacing) * 2)}.zd\:pt-4{padding-top:calc(var(--zd-spacing) * 4)}.zd\:pr-1{padding-right:calc(var(--zd-spacing) * 1)}.zd\:pr-2{padding-right:calc(var(--zd-spacing) * 2)}.zd\:pb-2{padding-bottom:calc(var(--zd-spacing) * 2)}.zd\:pb-3{padding-bottom:calc(var(--zd-spacing) * 3)}.zd\:pb-4{padding-bottom:calc(var(--zd-spacing) * 4)}.zd\:pb-6{padding-bottom:calc(var(--zd-spacing) * 6)}.zd\:pl-2{padding-left:calc(var(--zd-spacing) * 2)}.zd\:pl-3{padding-left:calc(var(--zd-spacing) * 3)}.zd\:pl-4{padding-left:calc(var(--zd-spacing) * 4)}.zd\:pl-6{padding-left:calc(var(--zd-spacing) * 6)}.zd\:pl-8{padding-left:calc(var(--zd-spacing) * 8)}.zd\:text-center{text-align:center}.zd\:text-left{text-align:left}.zd\:font-roboto{font-family:Roboto,sans-serif}.zd\:font-sans{font-family:sans-serif}.zd\:text-2xl{font-size:20px;line-height:var(--tw-leading,var(--zd-text-2xl--line-height))}.zd\:text-base{font-size:14px;line-height:var(--tw-leading,var(--zd-text-base--line-height))}.zd\:text-body1{font-size:16px;line-height:var(--tw-leading,130%)}.zd\:text-body2{font-size:14px;line-height:var(--tw-leading,130%)}.zd\:text-body3{font-size:12px;line-height:var(--tw-leading,130%)}.zd\:text-body4{font-size:10px;line-height:var(--tw-leading,130%)}.zd\:text-h1{font-size:42px;line-height:var(--tw-leading,110%)}.zd\:text-h2{font-size:28px;line-height:var(--tw-leading,110%)}.zd\:text-h3{font-size:18px;line-height:var(--tw-leading,130%)}.zd\:text-lg{font-size:16px;line-height:var(--tw-leading,var(--zd-text-lg--line-height))}.zd\:text-sm{font-size:12px;line-height:var(--tw-leading,var(--zd-text-sm--line-height))}.zd\:text-xl{font-size:18px;line-height:var(--tw-leading,var(--zd-text-xl--line-height))}.zd\:text-xs{font-size:10px;line-height:var(--tw-leading,var(--zd-text-xs--line-height))}.zd\:font-bold{--tw-font-weight:var(--zd-font-weight-bold);font-weight:var(--zd-font-weight-bold)}.zd\:font-medium{--tw-font-weight:var(--zd-font-weight-medium);font-weight:var(--zd-font-weight-medium)}.zd\:font-semibold{--tw-font-weight:var(--zd-font-weight-semibold);font-weight:var(--zd-font-weight-semibold)}.zd\:break-all{word-break:break-all}.zd\:whitespace-pre-wrap{white-space:pre-wrap}.zd\:text-gray-400{color:var(--zd-color-gray-400)}.zd\:text-gray-500{color:var(--zd-color-gray-500)}.zd\:text-gray-700{color:var(--zd-color-gray-700)}.zd\:text-gray-900{color:var(--zd-color-gray-900)}.zd\:text-greyScale{color:#130e0b}.zd\:text-greyScale\/50{color:oklab(16.9052% .00636494 .00836386/.5)}.zd\:text-greyScale\/90{color:oklab(16.9052% .00636494 .00836386/.9)}.zd\:text-orange{color:#f27b3e}.zd\:text-red-500{color:var(--zd-color-red-500)}.zd\:text-solarOrange{color:#e76000}.zd\:text-white{color:var(--zd-color-white)}.zd\:underline{text-decoration-line:underline}.zd\:caret-gray-900{caret-color:var(--zd-color-gray-900)}.zd\:accent-solarOrange{accent-color:#e76000}.zd\:\[color-scheme\:light\]{color-scheme:light}.zd\:opacity-0{opacity:0}.zd\:opacity-50{opacity:.5}.zd\:shadow-\[inset_0_-4px_4px_0_rgba\(255\,255\,255\,0\.10\)\,inset_0_3px_4px_0_rgba\(0\,0\,0\,0\.02\)\]{--tw-shadow:inset 0 -4px 4px 0 var(--tw-shadow-color,#ffffff1a), inset 0 3px 4px 0 var(--tw-shadow-color,#00000005);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.zd\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.zd\:backdrop-blur-\[15px\]{--tw-backdrop-blur:blur(15px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.zd\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--zd-default-transition-timing-function));transition-duration:var(--tw-duration,var(--zd-default-transition-duration))}.zd\:outline-none{--tw-outline-style:none;outline-style:none}.zd\:select-none{-webkit-user-select:none;user-select:none}.zd\:placeholder\:text-gray-900\/50::placeholder{color:var(--zd-color-gray-900)}@supports (color:color-mix(in lab, red, red)){.zd\:placeholder\:text-gray-900\/50::placeholder{color:color-mix(in oklab, var(--zd-color-gray-900) 50%, transparent)}}@media (hover:hover){.zd\:hover\:bg-white\/5:hover{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:hover\:bg-white\/5:hover{background-color:color-mix(in oklab, var(--zd-color-white) 5%, transparent)}}.zd\:hover\:bg-white\/20:hover{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:hover\:bg-white\/20:hover{background-color:color-mix(in oklab, var(--zd-color-white) 20%, transparent)}}}.zd\:active\:bg-white\/10:active{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:active\:bg-white\/10:active{background-color:color-mix(in oklab, var(--zd-color-white) 10%, transparent)}}.zd\:active\:bg-white\/30:active{background-color:var(--zd-color-white)}@supports (color:color-mix(in lab, red, red)){.zd\:active\:bg-white\/30:active{background-color:color-mix(in oklab, var(--zd-color-white) 30%, transparent)}}.zd\:disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.zd\:disabled\:opacity-50:disabled{opacity:.5}@media (min-width:40rem){.zd\:sm\:relative{position:relative}.zd\:sm\:z-auto{z-index:auto}.zd\:sm\:h-\[810px\]{height:810px}.zd\:sm\:max-h-\[100dvh\]{max-height:100dvh}.zd\:sm\:w-100{width:calc(var(--zd-spacing) * 100)}.zd\:sm\:max-w-full{max-width:100%}}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
Binary file
package/package.json ADDED
@@ -0,0 +1,96 @@
1
+ {
2
+ "name": "@zerodev/wallet-react-ui",
3
+ "version": "0.0.1",
4
+ "description": "React wallet UI kit for ZeroDev (auth + signing flows)",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/zerodevapp/zerodev-wallet-sdk.git",
8
+ "directory": "packages/wallet-react-ui"
9
+ },
10
+ "sideEffects": [
11
+ "**/*.css"
12
+ ],
13
+ "main": "./dist/index.cjs",
14
+ "module": "./dist/index.mjs",
15
+ "types": "./dist/_types/index.d.ts",
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/_types/index.d.ts",
19
+ "import": "./dist/index.mjs",
20
+ "require": "./dist/index.cjs"
21
+ },
22
+ "./styles.css": "./dist/styles.css"
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "src/**/*.ts",
27
+ "src/**/*.tsx",
28
+ "!dist/**/*.tsbuildinfo",
29
+ "!.env",
30
+ "!src/signing/**",
31
+ "!src/**/*.test.ts",
32
+ "!src/**/*.test.tsx",
33
+ "!src/**/*.stories.ts",
34
+ "!src/**/*.stories.tsx",
35
+ "!.changeset"
36
+ ],
37
+ "keywords": [
38
+ "react",
39
+ "components",
40
+ "ui",
41
+ "wallet",
42
+ "zerodev",
43
+ "web3"
44
+ ],
45
+ "dependencies": {
46
+ "@zerodev/react-ui": "0.0.1"
47
+ },
48
+ "peerDependencies": {
49
+ "@tanstack/react-query": "^5.0.0",
50
+ "@wagmi/core": "^2.22.0",
51
+ "react": "^18.0.0 || ^19.0.0",
52
+ "react-dom": "^18.0.0 || ^19.0.0",
53
+ "viem": "^2.38.0",
54
+ "wagmi": "^2.19.0",
55
+ "zustand": "^5.0.3",
56
+ "@zerodev/wallet-core": "0.0.1",
57
+ "@zerodev/wallet-react": "0.0.1"
58
+ },
59
+ "devDependencies": {
60
+ "@storybook/addon-a11y": "^10.3.3",
61
+ "@storybook/addon-docs": "^10.3.3",
62
+ "@storybook/react-vite": "^10.3.3",
63
+ "@tailwindcss/cli": "^4.2.2",
64
+ "@tailwindcss/postcss": "^4.2.2",
65
+ "@tanstack/react-query": "^5.90.21",
66
+ "@testing-library/react": "^16.3.0",
67
+ "@types/react": "^19",
68
+ "@types/react-dom": "^19",
69
+ "@vitejs/plugin-react": "^4.7.0",
70
+ "postcss": "^8.5.8",
71
+ "react": "19.2.0",
72
+ "react-dom": "19.2.0",
73
+ "storybook": "^10.3.3",
74
+ "tailwindcss": "^4.2.2",
75
+ "typescript": "5.9.3",
76
+ "vite": "^6.4.1",
77
+ "vite-plugin-node-polyfills": "^0.25.0",
78
+ "vocs": "^1.4.1"
79
+ },
80
+ "scripts": {
81
+ "build": "pnpm run clean && pnpm run build:css && pnpm run build:js && pnpm run build:types",
82
+ "build:css": "npx @tailwindcss/cli -i ./src/styles.css -o ./dist/styles.css --minify",
83
+ "build:js": "vite build",
84
+ "build:types": "tsc --project ./tsconfig.build.json --outDir ./dist/_types --emitDeclarationOnly --declaration --declarationMap",
85
+ "dev": "tsc --watch",
86
+ "dev:css": "npx @tailwindcss/cli -i ./src/styles.css -o ./dist/styles.css --watch",
87
+ "typecheck": "tsc --noEmit --project ./tsconfig.build.json",
88
+ "clean": "rm -rf dist",
89
+ "storybook": "storybook dev -p 6007",
90
+ "build-storybook": "storybook build",
91
+ "test": "vitest run",
92
+ "test:watch": "vitest",
93
+ "docs:dev": "cd docs && vocs dev",
94
+ "docs:preview": "cd docs && vocs preview"
95
+ }
96
+ }
@@ -0,0 +1,14 @@
1
+ declare module '*.png' {
2
+ const src: string
3
+ export default src
4
+ }
5
+
6
+ declare module '*.webp' {
7
+ const src: string
8
+ export default src
9
+ }
10
+
11
+ declare module '*.webm' {
12
+ const src: string
13
+ export default src
14
+ }
@@ -0,0 +1,180 @@
1
+ import type { StateCreator } from 'zustand'
2
+ import type { AuthConfig, AuthMethod, AuthStep } from './types'
3
+
4
+ const OTP_SESSION_STORAGE_KEY = 'zerodev:auth:otpSession'
5
+
6
+ type StoredOtpSession = {
7
+ otpId: string
8
+ otpEncryptionTargetBundle: string
9
+ }
10
+
11
+ function readStoredOtpSession(): StoredOtpSession | null {
12
+ if (typeof window === 'undefined') return null
13
+ try {
14
+ const raw = window.localStorage.getItem(OTP_SESSION_STORAGE_KEY)
15
+ if (!raw) return null
16
+ const parsed = JSON.parse(raw) as StoredOtpSession
17
+ if (!parsed?.otpId || !parsed?.otpEncryptionTargetBundle) return null
18
+ return parsed
19
+ } catch {
20
+ return null
21
+ }
22
+ }
23
+
24
+ function writeStoredOtpSession(session: StoredOtpSession): void {
25
+ if (typeof window === 'undefined') return
26
+ try {
27
+ window.localStorage.setItem(
28
+ OTP_SESSION_STORAGE_KEY,
29
+ JSON.stringify(session),
30
+ )
31
+ } catch {
32
+ // ignore
33
+ }
34
+ }
35
+
36
+ function clearStoredOtpSession(): void {
37
+ if (typeof window === 'undefined') return
38
+ try {
39
+ window.localStorage.removeItem(OTP_SESSION_STORAGE_KEY)
40
+ } catch {
41
+ // ignore
42
+ }
43
+ }
44
+
45
+ export interface AuthStoreSlice {
46
+ auth: {
47
+ // State
48
+ step: AuthStep | null
49
+ stepHistory: AuthStep[]
50
+ enabledMethods: AuthMethod[]
51
+ email: string | null
52
+ setEmail: (email: string) => void
53
+ otpId: string | null
54
+ /**
55
+ * HPKE encryption target bundle returned by the latest `sendOTP` call.
56
+ * Required by `verifyOTP` so the OTP attempt can be sealed to the enclave.
57
+ */
58
+ otpEncryptionTargetBundle: string | null
59
+ /** Set both fields produced by `sendOTP` together. */
60
+ setOtpSession: (input: {
61
+ otpId: string
62
+ otpEncryptionTargetBundle: string
63
+ }) => void
64
+ /** Clear the persisted OTP session after a successful verify. */
65
+ clearOtpSession: () => void
66
+ config: AuthConfig | null
67
+
68
+ // Actions
69
+ initialize: (config: AuthConfig) => void
70
+ goToStep: (step: AuthStep | null) => void
71
+ goBack: () => void
72
+ reset: () => void
73
+ }
74
+ }
75
+
76
+ export const createAuthStoreSlice: StateCreator<
77
+ AuthStoreSlice,
78
+ [],
79
+ [],
80
+ AuthStoreSlice
81
+ > = (set, get, _store) => ({
82
+ auth: {
83
+ // Initial state
84
+ step: null,
85
+ stepHistory: [],
86
+ enabledMethods: [],
87
+ email: null,
88
+ otpId: null,
89
+ otpEncryptionTargetBundle: null,
90
+ config: null,
91
+
92
+ // Actions
93
+ initialize: (config: AuthConfig) => {
94
+ const stored = readStoredOtpSession()
95
+ set((state) => ({
96
+ auth: {
97
+ ...state.auth,
98
+ config,
99
+ enabledMethods: config.enabledMethods,
100
+ ...(stored && {
101
+ otpId: stored.otpId,
102
+ otpEncryptionTargetBundle: stored.otpEncryptionTargetBundle,
103
+ }),
104
+ },
105
+ }))
106
+ },
107
+
108
+ goToStep: (step: AuthStep | null) => {
109
+ set((state) => ({
110
+ auth: {
111
+ ...state.auth,
112
+ step,
113
+ stepHistory:
114
+ state.auth.step === null
115
+ ? state.auth.stepHistory
116
+ : [...state.auth.stepHistory, state.auth.step],
117
+ },
118
+ }))
119
+ },
120
+
121
+ goBack: () => {
122
+ const { auth } = get()
123
+ if (auth.stepHistory.length === 0) return
124
+ const newHistory = [...auth.stepHistory]
125
+ const previousStep = newHistory.pop()!
126
+ set((state) => ({
127
+ auth: {
128
+ ...state.auth,
129
+ step: previousStep,
130
+ stepHistory: newHistory,
131
+ },
132
+ }))
133
+ },
134
+
135
+ reset: () => {
136
+ clearStoredOtpSession()
137
+ set((state) => ({
138
+ auth: {
139
+ ...state.auth,
140
+ step: null,
141
+ stepHistory: [],
142
+ email: null,
143
+ otpId: null,
144
+ otpEncryptionTargetBundle: null,
145
+ },
146
+ }))
147
+ },
148
+
149
+ setEmail: (email) => {
150
+ set((state) => ({
151
+ auth: {
152
+ ...state.auth,
153
+ email,
154
+ },
155
+ }))
156
+ },
157
+
158
+ setOtpSession: ({ otpId, otpEncryptionTargetBundle }) => {
159
+ writeStoredOtpSession({ otpId, otpEncryptionTargetBundle })
160
+ set((state) => ({
161
+ auth: {
162
+ ...state.auth,
163
+ otpId,
164
+ otpEncryptionTargetBundle,
165
+ },
166
+ }))
167
+ },
168
+
169
+ clearOtpSession: () => {
170
+ clearStoredOtpSession()
171
+ set((state) => ({
172
+ auth: {
173
+ ...state.auth,
174
+ otpId: null,
175
+ otpEncryptionTargetBundle: null,
176
+ },
177
+ }))
178
+ },
179
+ },
180
+ })