lens-convex-auth 0.2.0 → 0.2.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.
- package/README.md +1 -0
- package/dist/react/index.d.ts +7 -2
- package/dist/react/index.js +5 -3
- package/dist/react/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -294,6 +294,7 @@ Returns `auth` with `thirdwebClient`, `chain`, `lensClient`, `tokens`, `getSessi
|
|
|
294
294
|
| `convex` | Your `ConvexReactClient` (optional) |
|
|
295
295
|
| `onSignIn(account)` | Called after a sign-in from the dialog, once Convex accepts it |
|
|
296
296
|
| `accountDialog` | Render the account dialog (default `true`) |
|
|
297
|
+
| `wallets` | Wallets to reconnect after a reload while a Lens session is stored (default: thirdweb's). Pass the same list as `SignInButton`'s `connectButtonProps.wallets` if you customize it |
|
|
297
298
|
|
|
298
299
|
### `useLensAuth()`
|
|
299
300
|
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { Account } from 'thirdweb/wallets';
|
|
2
|
+
import { Account, Wallet } from 'thirdweb/wallets';
|
|
3
3
|
import { ConvexReactClient } from 'convex/react';
|
|
4
4
|
import { a as LensAuth } from '../auth-vTn7nb6F.js';
|
|
5
5
|
import { ConnectButtonProps } from 'thirdweb/react';
|
|
@@ -50,9 +50,14 @@ type LensAuthProviderProps = {
|
|
|
50
50
|
onSignIn?: (account: SignedInAccount) => void | Promise<void>;
|
|
51
51
|
/** Render the account dialog. Set to false to render <AccountDialog /> yourself. Defaults to true. */
|
|
52
52
|
accountDialog?: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Wallets to reconnect after a reload while a Lens session is stored. Pass the same list as
|
|
55
|
+
* SignInButton's `connectButtonProps.wallets`, if you customize it. Defaults to thirdweb's wallets.
|
|
56
|
+
*/
|
|
57
|
+
wallets?: Wallet[];
|
|
53
58
|
children: React.ReactNode;
|
|
54
59
|
};
|
|
55
|
-
declare function LensAuthProvider({ auth, convex, onSignIn, accountDialog, children }: LensAuthProviderProps): React.JSX.Element;
|
|
60
|
+
declare function LensAuthProvider({ auth, convex, onSignIn, accountDialog, wallets, children }: LensAuthProviderProps): React.JSX.Element;
|
|
56
61
|
|
|
57
62
|
type SignInButtonProps = {
|
|
58
63
|
/** Defaults to "Sign in" */
|
package/dist/react/index.js
CHANGED
|
@@ -1154,9 +1154,10 @@ function createUseConvexAuth(auth) {
|
|
|
1154
1154
|
return { isLoading: sessionKey === void 0, isAuthenticated: !!sessionKey, fetchAccessToken };
|
|
1155
1155
|
};
|
|
1156
1156
|
}
|
|
1157
|
-
|
|
1157
|
+
var AutoConnect = React4.lazy(() => import("thirdweb/react").then((m) => ({ default: m.AutoConnect })));
|
|
1158
|
+
function LensAuthProvider({ auth, convex, onSignIn, accountDialog = true, wallets, children }) {
|
|
1158
1159
|
const [useConvexAuthHook] = React4.useState(() => createUseConvexAuth(auth));
|
|
1159
|
-
const content = /* @__PURE__ */ jsxs6(LensAuthState, { auth, onSignIn, withConvex: !!convex, children: [
|
|
1160
|
+
const content = /* @__PURE__ */ jsxs6(LensAuthState, { auth, onSignIn, withConvex: !!convex, wallets, children: [
|
|
1160
1161
|
children,
|
|
1161
1162
|
accountDialog && /* @__PURE__ */ jsx12(AccountDialog, {})
|
|
1162
1163
|
] });
|
|
@@ -1178,7 +1179,7 @@ function writeSelectedAccount(auth, account) {
|
|
|
1178
1179
|
} catch {
|
|
1179
1180
|
}
|
|
1180
1181
|
}
|
|
1181
|
-
function LensAuthState({ auth, onSignIn, withConvex, children }) {
|
|
1182
|
+
function LensAuthState({ auth, onSignIn, withConvex, wallets, children }) {
|
|
1182
1183
|
const wallet = useActiveAccount2();
|
|
1183
1184
|
const activeWallet = useActiveWallet2();
|
|
1184
1185
|
const { disconnect } = useDisconnect();
|
|
@@ -1231,6 +1232,7 @@ function LensAuthState({ auth, onSignIn, withConvex, children }) {
|
|
|
1231
1232
|
}), [auth, required, manualOpen, wallet, onSignIn]);
|
|
1232
1233
|
return /* @__PURE__ */ jsx12(LensAuthContext.Provider, { value, children: /* @__PURE__ */ jsxs6(AccountDialogContext.Provider, { value: dialog, children: [
|
|
1233
1234
|
children,
|
|
1235
|
+
sessionKey && !wallet && /* @__PURE__ */ jsx12(React4.Suspense, { fallback: null, children: /* @__PURE__ */ jsx12(AutoConnect, { client: auth.thirdwebClient, chain: auth.chain, wallets }) }),
|
|
1234
1236
|
pendingSignIn && onSignIn && (withConvex ? /* @__PURE__ */ jsx12(ConvexSignInCallback, { account: pendingSignIn, onSignIn, done: () => setPendingSignIn(null) }) : /* @__PURE__ */ jsx12(SignInCallback, { account: pendingSignIn, onSignIn, done: () => setPendingSignIn(null) }))
|
|
1235
1237
|
] }) });
|
|
1236
1238
|
}
|
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/provider.tsx","../../src/react/AccountDialog.tsx","../../src/react/CreateAccountForm.tsx","../../src/react/utils.ts","../../src/react/ui/button.tsx","../../src/react/ui/input.tsx","../../src/react/ui/textarea.tsx","../../src/react/ui/avatar.tsx","../../src/react/ui/field.tsx","../../src/react/ui/label.tsx","../../src/react/ui/input-group.tsx","../../src/react/dom.ts","../../src/react/ui/dialog.tsx","../../src/react/ui/drawer.tsx","../../src/react/SignInButton.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { LensProvider } from \"@lens-protocol/react\"\nimport { ThirdwebProvider, useActiveAccount, useActiveWallet, useDisconnect } from \"thirdweb/react\"\nimport type { Account as ThirdwebAccount } from \"thirdweb/wallets\"\nimport { ConvexProviderWithAuth, useConvexAuth, type ConvexReactClient } from \"convex/react\"\nimport type { LensAuth } from \"../core/auth\"\nimport { TOKENS_CHANGED_EVENT } from \"../core/tokens\"\nimport { AccountDialog } from \"./AccountDialog\"\n\nexport type SignedInAccount = {\n /** Lens account address, lowercased */\n address: string\n /** Lens username (local name), when known */\n username: string | null\n}\n\nexport type LensAuthStatus =\n /** Reading the stored session (first render, and during SSR) */\n | \"loading\"\n /** No wallet and no Lens session */\n | \"signed-out\"\n /** Wallet connected, no Lens account signed in yet: the account dialog is open */\n | \"choosing-account\"\n /** Signed in to a Lens account (Convex is authenticated as it too) */\n | \"signed-in\"\n\nexport type LensAuthContextValue = {\n auth: LensAuth\n status: LensAuthStatus\n isLoading: boolean\n isSignedIn: boolean\n /** The connected thirdweb wallet account */\n wallet: ThirdwebAccount | undefined\n /** The signed-in Lens account */\n account: SignedInAccount | null\n /** Ends the Lens session and disconnects the wallet */\n signOut: () => Promise<void>\n /** Opens the account dialog, e.g. to switch to another account */\n openAccountDialog: () => void\n}\n\ntype AccountDialogState = {\n open: boolean\n // True while a wallet is connected without a Lens session: the dialog can't be dismissed\n required: boolean\n setOpen: (open: boolean) => void\n completeSignIn: (account: SignedInAccount) => void\n}\n\nconst LensAuthContext = React.createContext<LensAuthContextValue | null>(null)\nconst AccountDialogContext = React.createContext<AccountDialogState | null>(null)\n\nexport function useLensAuth(): LensAuthContextValue {\n const ctx = React.useContext(LensAuthContext)\n if (!ctx) throw new Error(\"useLensAuth must be used within <LensAuthProvider>\")\n return ctx\n}\n\nexport function useAccountDialogState(): AccountDialogState {\n const ctx = React.useContext(AccountDialogContext)\n if (!ctx) throw new Error(\"<AccountDialog> must be used within <LensAuthProvider>\")\n return ctx\n}\n\nfunction subscribeToTokens(onChange: () => void) {\n window.addEventListener(TOKENS_CHANGED_EVENT, onChange)\n // Signing in or out in another tab\n window.addEventListener(\"storage\", onChange)\n return () => {\n window.removeEventListener(TOKENS_CHANGED_EVENT, onChange)\n window.removeEventListener(\"storage\", onChange)\n }\n}\n\n// Identifies the stored Lens session: its id plus the account it acts for. Token refreshes keep it the\n// same; signing in again, or as another account, changes it. Undefined until read on the client.\nfunction useSessionKey(auth: LensAuth): string | null | undefined {\n return React.useSyncExternalStore(\n subscribeToTokens,\n () => {\n const session = auth.getSession()\n return session ? `${session.sessionId}:${session.account}` : null\n },\n () => undefined,\n )\n}\n\n// Signs Convex in as the Lens account the user signed in with. A new session gets a new\n// fetchAccessToken, which makes Convex fetch its token again.\nfunction createUseConvexAuth(auth: LensAuth) {\n return function useLensConvexAuth() {\n const sessionKey = useSessionKey(auth)\n const fetchAccessToken = React.useCallback(\n async ({ forceRefreshToken }: { forceRefreshToken: boolean }) =>\n sessionKey ? auth.fetchConvexToken(forceRefreshToken) : null,\n [sessionKey],\n )\n return { isLoading: sessionKey === undefined, isAuthenticated: !!sessionKey, fetchAccessToken }\n }\n}\n\nexport type LensAuthProviderProps = {\n /** From createLensAuth(), created once at module level */\n auth: LensAuth\n /** Your ConvexReactClient. Omit to use the package without Convex. */\n convex?: ConvexReactClient\n /**\n * Called after the user signs in from the account dialog (picking an account or creating one), once\n * Convex accepts the session. A good place to create the user's row: `convex.mutation(api.users.ensure)`\n */\n onSignIn?: (account: SignedInAccount) => void | Promise<void>\n /** Render the account dialog. Set to false to render <AccountDialog /> yourself. Defaults to true. */\n accountDialog?: boolean\n children: React.ReactNode\n}\n\n// Wraps the app in thirdweb, Lens and (optionally) Convex providers wired to one session.\nexport function LensAuthProvider({ auth, convex, onSignIn, accountDialog = true, children }: LensAuthProviderProps) {\n const [useConvexAuthHook] = React.useState(() => createUseConvexAuth(auth))\n const content = (\n <LensAuthState auth={auth} onSignIn={onSignIn} withConvex={!!convex}>\n {children}\n {accountDialog && <AccountDialog />}\n </LensAuthState>\n )\n return (\n <ThirdwebProvider>\n <LensProvider client={auth.lensClient}>\n {convex ? (\n <ConvexProviderWithAuth client={convex} useAuth={useConvexAuthHook}>\n {content}\n </ConvexProviderWithAuth>\n ) : content}\n </LensProvider>\n </ThirdwebProvider>\n )\n}\n\nfunction readSelectedAccount(auth: LensAuth, address: string): string | null {\n try {\n const stored = JSON.parse(localStorage.getItem(`${auth.storagePrefix}account`) ?? \"null\")\n return stored?.address === address && typeof stored.username === \"string\" ? stored.username : null\n } catch {\n return null\n }\n}\n\nfunction writeSelectedAccount(auth: LensAuth, account: SignedInAccount | null) {\n try {\n const key = `${auth.storagePrefix}account`\n if (account) localStorage.setItem(key, JSON.stringify(account))\n else localStorage.removeItem(key)\n } catch {}\n}\n\nfunction LensAuthState({ auth, onSignIn, withConvex, children }: {\n auth: LensAuth\n onSignIn?: LensAuthProviderProps[\"onSignIn\"]\n withConvex: boolean\n children: React.ReactNode\n}) {\n const wallet = useActiveAccount()\n const activeWallet = useActiveWallet()\n const { disconnect } = useDisconnect()\n const sessionKey = useSessionKey(auth)\n const [manualOpen, setManualOpen] = React.useState(false)\n const [pendingSignIn, setPendingSignIn] = React.useState<SignedInAccount | null>(null)\n\n const account = React.useMemo<SignedInAccount | null>(() => {\n if (!sessionKey) return null\n const address = sessionKey.slice(sessionKey.lastIndexOf(\":\") + 1)\n return { address, username: readSelectedAccount(auth, address) }\n }, [auth, sessionKey])\n\n const status: LensAuthStatus =\n sessionKey === undefined ? \"loading\"\n : sessionKey ? \"signed-in\"\n : wallet ? \"choosing-account\"\n : \"signed-out\"\n\n useBackgroundRefresh(auth)\n\n // A connected wallet checks the stored session is still valid (refreshing it or clearing it)\n React.useEffect(() => {\n if (wallet) void auth.resumeSession().catch(() => {})\n }, [auth, wallet?.address])\n\n const signOut = React.useCallback(async () => {\n setManualOpen(false)\n writeSelectedAccount(auth, null)\n try {\n await auth.logout()\n } finally {\n if (activeWallet) disconnect(activeWallet)\n }\n }, [auth, activeWallet, disconnect])\n\n const value = React.useMemo<LensAuthContextValue>(() => ({\n auth,\n status,\n isLoading: status === \"loading\",\n isSignedIn: status === \"signed-in\",\n wallet,\n account,\n signOut,\n openAccountDialog: () => setManualOpen(true),\n }), [auth, status, wallet, account, signOut])\n\n const required = status === \"choosing-account\"\n const dialog = React.useMemo<AccountDialogState>(() => ({\n open: required || (manualOpen && !!wallet),\n required,\n setOpen: (open) => {\n if (open) setManualOpen(true)\n else if (!required) setManualOpen(false)\n },\n completeSignIn: (signedIn) => {\n writeSelectedAccount(auth, signedIn)\n setManualOpen(false)\n if (onSignIn) setPendingSignIn(signedIn)\n },\n }), [auth, required, manualOpen, wallet, onSignIn])\n\n return (\n <LensAuthContext.Provider value={value}>\n <AccountDialogContext.Provider value={dialog}>\n {children}\n {pendingSignIn && onSignIn && (\n withConvex\n ? <ConvexSignInCallback account={pendingSignIn} onSignIn={onSignIn} done={() => setPendingSignIn(null)} />\n : <SignInCallback account={pendingSignIn} onSignIn={onSignIn} done={() => setPendingSignIn(null)} />\n )}\n </AccountDialogContext.Provider>\n </LensAuthContext.Provider>\n )\n}\n\ntype SignInCallbackProps = {\n account: SignedInAccount\n onSignIn: NonNullable<LensAuthProviderProps[\"onSignIn\"]>\n done: () => void\n}\n\nfunction SignInCallback({ account, onSignIn, done }: SignInCallbackProps) {\n React.useEffect(() => {\n Promise.resolve(onSignIn(account)).catch((err) => console.error(\"lens-convex-auth: onSignIn failed\", err)).finally(done)\n }, [account])\n return null\n}\n\n// Waits until Convex accepts the new session, so onSignIn can call authenticated Convex functions\nfunction ConvexSignInCallback(props: SignInCallbackProps) {\n const { isAuthenticated, isLoading } = useConvexAuth()\n return isAuthenticated && !isLoading ? <SignInCallback {...props} /> : null\n}\n\n// Refreshes the tokens a minute before they expire, so Convex and API calls always have a fresh one\nfunction useBackgroundRefresh(auth: LensAuth) {\n React.useEffect(() => {\n let timeout: ReturnType<typeof setTimeout> | undefined\n let stopped = false\n\n // Runs again whenever tokens are stored or cleared (a sign-in, a refresh, another tab)\n const schedule = () => {\n if (timeout) clearTimeout(timeout)\n timeout = undefined\n const tokens = auth.tokens.getStoredTokens()\n if (stopped || !tokens?.expiresAt) return\n const delay = Math.max(1000, tokens.expiresAt - Date.now() - 60 * 1000)\n timeout = setTimeout(() => void auth.tokens.refreshTokens(), delay)\n }\n\n const unsubscribe = subscribeToTokens(schedule)\n ;(async () => {\n try {\n await auth.resumeSession()\n } catch {}\n schedule()\n })()\n\n return () => {\n stopped = true\n unsubscribe()\n if (timeout) clearTimeout(timeout)\n }\n }, [auth])\n}\n","import * as React from \"react\"\nimport { useAccountsAvailable } from \"@lens-protocol/react\"\nimport { evmAddress, type Account, type AccountAvailable } from \"@lens-protocol/client\"\nimport type { Account as ThirdwebAccount } from \"thirdweb/wallets\"\nimport { Loader2 } from \"lucide-react\"\nimport { CHALLENGE_MAX_AGE_MS, CHALLENGE_REFRESH_MS, opensWalletWithDeepLink, type LensAuth, type LensChallenge } from \"../core/auth\"\nimport { fetchAccountUsername } from \"../core/onboarding\"\nimport { useAccountDialogState, useLensAuth } from \"./provider\"\nimport { CreateAccountForm, type CreatedAccount } from \"./CreateAccountForm\"\nimport { useMediaQuery } from \"./dom\"\nimport { Button } from \"./ui/button\"\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from \"./ui/dialog\"\nimport { Drawer, DrawerContent, DrawerDescription, DrawerHeader, DrawerTitle } from \"./ui/drawer\"\n\n// Lists the wallet's Lens accounts to sign in with, or the form to create one. Opens by itself when a\n// wallet connects without a Lens session, and can't be dismissed until an account is signed in to (or\n// the wallet disconnects). A dialog on desktop, a drawer on mobile.\nexport function AccountDialog() {\n const { wallet, signOut } = useLensAuth()\n const { open, required, setOpen } = useAccountDialogState()\n const isDesktop = useMediaQuery(\"(min-width: 768px)\")\n const [creating, setCreating] = React.useState(false)\n\n // Show the account list again the next time the dialog opens\n React.useEffect(() => {\n if (!open) setCreating(false)\n }, [open])\n\n const handleOpenChange = (next: boolean) => {\n if (!next && required) return\n setOpen(next)\n }\n\n const body = wallet\n ? <AccountDialogBody key={wallet.address} wallet={wallet} creating={creating} setCreating={setCreating} />\n : null\n const disconnect = (\n <Button onClick={signOut} variant=\"outline\" className=\"w-full\">\n Disconnect Wallet\n </Button>\n )\n\n if (isDesktop) {\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n className=\"sm:max-w-[425px] max-h-[80vh] overflow-y-auto\"\n showCloseButton={!required}\n onEscapeKeyDown={(e) => required && e.preventDefault()}\n onPointerDownOutside={(e) => required && e.preventDefault()}\n >\n {body}\n <div className=\"mt-4\">{disconnect}</div>\n </DialogContent>\n </Dialog>\n )\n }\n\n return (\n <Drawer open={open} onOpenChange={handleOpenChange} dismissible={!required}>\n <DrawerContent className=\"max-h-[80vh] overflow-y-auto\">\n {body}\n <div className=\"p-4\">{disconnect}</div>\n </DrawerContent>\n </Drawer>\n )\n}\n\nfunction AccountDialogBody({ wallet, creating, setCreating }: {\n wallet: ThirdwebAccount\n creating: boolean\n setCreating: (creating: boolean) => void\n}) {\n const { auth } = useLensAuth()\n const { completeSignIn } = useAccountDialogState()\n const isDesktop = useMediaQuery(\"(min-width: 768px)\")\n const { data, loading: loadingAccounts } = useAccountsAvailable({ managedBy: evmAddress(wallet.address), includeOwned: true })\n const accounts = data?.items\n const usernames = useAccountUsernames(auth, accounts)\n const loading = loadingAccounts || (!!accounts && !usernames)\n const usernameOf = React.useCallback((acc: Account) => {\n const resolved = usernames?.[acc.address.toLowerCase()]\n return resolved === undefined ? acc.username?.localName ?? null : resolved\n }, [usernames])\n // Accounts without a username aren't listed, so they don't count\n const hasAccounts = !loading && !!accounts?.some((item) => usernameOf(item.account))\n // Wallets without an account go straight to creating one\n const showCreate = creating || (!loading && !hasAccounts)\n\n const signIn = async (account: SelectableAccount, challenge: LensChallenge) => {\n // The signature request goes out before the first await, so a click handler calling this keeps its\n // user gesture, which mobile wallets need to open (see signLensChallenge).\n const signature = await auth.signChallenge(challenge, wallet)\n await auth.authenticate(challenge, signature)\n completeSignIn({ address: account.address.toLowerCase(), username: usernameOf(account) })\n }\n\n const handleCreated = async (created: CreatedAccount) => {\n completeSignIn({ address: created.address.toLowerCase(), username: created.localName })\n }\n\n const title = showCreate ? \"Create Account\" : \"Select Account\"\n const description = showCreate\n ? hasAccounts ? \"Pick a username for your new Lens account.\" : \"You don’t have a Lens account yet. Create one to continue.\"\n : \"Select an account to continue.\"\n\n const Header = isDesktop ? DialogHeader : DrawerHeader\n const Title = isDesktop ? DialogTitle : DrawerTitle\n const Description = isDesktop ? DialogDescription : DrawerDescription\n\n return (\n <>\n <Header className={isDesktop ? undefined : \"text-left\"}>\n <Title>{title}</Title>\n <Description>{description}</Description>\n </Header>\n <div className={isDesktop || !showCreate ? undefined : \"px-4\"}>\n {showCreate ? (\n <CreateAccountForm\n ownerAddress={wallet.address}\n onCreated={handleCreated}\n onBack={hasAccounts ? () => setCreating(false) : undefined}\n />\n ) : (\n <AccountList auth={auth} accounts={accounts} usernameOf={usernameOf} loading={loading} ownerAddress={wallet.address} onSign={signIn} onCreate={() => setCreating(true)} />\n )}\n </div>\n </>\n )\n}\n\n// Each account's username by lowercased address (see fetchAccountUsername), or undefined while they load.\n// An account whose lookup failed is left out, so it falls back to its global Lens username.\nfunction useAccountUsernames(auth: LensAuth, accounts?: readonly AccountAvailable[]) {\n const key = accounts?.map((item) => item.account.address.toLowerCase()).join(\",\")\n const [usernames, setUsernames] = React.useState<{ key: string; byAddress: Record<string, string | null> } | null>(null)\n\n React.useEffect(() => {\n if (key === undefined) return\n let cancelled = false\n const addresses = key ? key.split(\",\") : []\n Promise.all(addresses.map((address) =>\n fetchAccountUsername(auth, address).then((username) => [[address, username] as const], () => []),\n )).then((entries) => {\n if (!cancelled) setUsernames({ key, byAddress: Object.fromEntries(entries.flat()) })\n })\n return () => {\n cancelled = true\n }\n }, [auth, key])\n\n return usernames && usernames.key === key ? usernames.byAddress : undefined\n}\n\ntype SelectableAccount = Account & { isOwner: boolean }\n\ntype SignInStep =\n | { id: string; status: \"loading\" }\n | { id: string; status: \"sign\"; challenge: LensChallenge }\n\ntype PrefetchedChallenge = { owner: string; challenge: LensChallenge; fetchedAt: number }\n\nfunction fetchChallenge(auth: LensAuth, acc: SelectableAccount, ownerAddress: string) {\n return auth.requestChallenge({\n role: acc.isOwner ? \"ACCOUNT_OWNER\" : \"ACCOUNT_MANAGER\",\n account: acc.address,\n signer: ownerAddress,\n })\n}\n\nfunction AccountList({ auth, accounts, usernameOf, loading, ownerAddress, onSign, onCreate }: {\n auth: LensAuth\n accounts?: readonly AccountAvailable[]\n usernameOf: (account: Account) => string | null\n loading: boolean\n ownerAddress: string\n onSign: (account: SelectableAccount, challenge: LensChallenge) => Promise<void>\n onCreate: () => void\n}) {\n const [step, setStep] = React.useState<SignInStep | null>(null)\n const [errorId, setErrorId] = React.useState<string | null>(null)\n const [challenges, setChallenges] = React.useState<Record<string, PrefetchedChallenge>>({})\n\n const selectable = React.useMemo(() => (accounts ?? []).map((item, index) => {\n const acc: SelectableAccount = { ...item.account, isOwner: item.__typename === \"AccountOwned\" }\n return { acc, id: `${acc.address}-${index}` }\n }), [accounts])\n\n const prefetch = React.useCallback((acc: SelectableAccount, id: string) => {\n fetchChallenge(auth, acc, ownerAddress)\n .then((challenge) => setChallenges((prev) => ({ ...prev, [id]: { owner: ownerAddress, challenge, fetchedAt: Date.now() } })))\n .catch(() => {})\n }, [auth, ownerAddress])\n\n // Accounts can share a username across namespaces: those get their shortened address too\n const sharedUsernames = React.useMemo(() => {\n const counts = new Map<string, number>()\n for (const { acc } of selectable) {\n const username = usernameOf(acc)\n if (username) counts.set(username, (counts.get(username) ?? 0) + 1)\n }\n return new Set([...counts].filter(([, count]) => count > 1).map(([username]) => username))\n }, [selectable, usernameOf])\n\n // Fetch each account's challenge ahead of time, so a tap can ask the wallet to sign right away:\n // on mobile that tap is what lets the wallet app open (see opensWalletWithDeepLink).\n React.useEffect(() => {\n const refresh = () => {\n if (document.visibilityState !== \"visible\") return\n for (const { acc, id } of selectable) {\n if (usernameOf(acc)) prefetch(acc, id)\n }\n }\n refresh()\n const interval = setInterval(refresh, CHALLENGE_REFRESH_MS)\n document.addEventListener(\"visibilitychange\", refresh)\n return () => {\n clearInterval(interval)\n document.removeEventListener(\"visibilitychange\", refresh)\n }\n }, [selectable, usernameOf, prefetch])\n\n const readyChallenge = (id: string) => {\n if (step?.id === id && step.status === \"sign\") return step.challenge\n const prefetched = challenges[id]\n if (!prefetched || prefetched.owner !== ownerAddress) return null\n return Date.now() - prefetched.fetchedAt < CHALLENGE_MAX_AGE_MS ? prefetched.challenge : null\n }\n\n const handleClick = (acc: SelectableAccount, id: string) => {\n setErrorId(null)\n const fail = () => {\n setStep(null)\n setErrorId(id)\n prefetch(acc, id)\n }\n const challenge = readyChallenge(id)\n if (challenge) {\n // Sign now, while the tap still counts as a user gesture. A challenge can only be used once.\n const signing = onSign(acc, challenge)\n setChallenges(({ [id]: _used, ...rest }) => rest)\n setStep({ id, status: \"loading\" })\n signing.then(() => setStep(null), fail)\n return\n }\n // The challenge isn't ready yet: fetch it now. Desktop wallets sign without a user gesture;\n // on mobile it takes one more tap to open the wallet.\n setStep({ id, status: \"loading\" })\n ;(async () => {\n const fetched = await fetchChallenge(auth, acc, ownerAddress)\n if (opensWalletWithDeepLink()) return setStep({ id, status: \"sign\", challenge: fetched })\n await onSign(acc, fetched)\n setStep(null)\n })().catch(fail)\n }\n\n if (loading) {\n return (\n <div className=\"p-4\">\n <p className=\"text-sm text-muted-foreground\">Loading available profiles…</p>\n </div>\n )\n }\n\n return (\n <div className=\"py-4 space-y-3\">\n <ul className=\"space-y-2 max-h-80 overflow-y-auto\">\n {selectable.map(({ acc, id }) => {\n const username = usernameOf(acc)\n if (!username) return null\n const isLoading = step?.id === id && step.status === \"loading\"\n const awaitingSignature = step?.id === id && step.status === \"sign\"\n return (\n <li key={id}>\n <button\n type=\"button\"\n className=\"w-full text-left px-3 py-2 rounded-md border hover:bg-accent/50 flex items-center justify-between cursor-pointer disabled:cursor-default\"\n onClick={() => handleClick(acc, id)}\n disabled={step?.status === \"loading\"}\n >\n <span className=\"truncate\">\n {username}\n {sharedUsernames.has(username) && (\n <span className=\"text-muted-foreground\"> · {acc.address.slice(0, 6)}…{acc.address.slice(-4)}</span>\n )}\n </span>\n {isLoading && <Loader2 className=\"size-4 animate-spin text-muted-foreground\" />}\n {awaitingSignature && <span className=\"text-sm font-medium text-primary\">Sign in</span>}\n </button>\n {awaitingSignature && (\n <p className=\"px-1 pt-1 text-xs text-muted-foreground\">Tap again to sign the message in your wallet.</p>\n )}\n {errorId === id && (\n <p className=\"px-1 pt-1 text-xs text-destructive\">Couldn’t sign in. Please try again.</p>\n )}\n </li>\n )\n })}\n </ul>\n <Button variant=\"ghost\" className=\"w-full\" onClick={onCreate} disabled={step?.status === \"loading\"}>\n Create a new account\n </Button>\n </div>\n )\n}\n","import * as React from \"react\"\nimport { useActiveAccount, useActiveWallet } from \"thirdweb/react\"\nimport type { SessionClient } from \"@lens-protocol/client\"\nimport { Check, Loader2 } from \"lucide-react\"\nimport { CHALLENGE_MAX_AGE_MS, CHALLENGE_REFRESH_MS, opensWalletWithDeepLink, signLensChallenge, type LensChallenge } from \"../core/auth\"\nimport {\n OnboardingError,\n authenticateOnboarding,\n checkUsername,\n createLensAccount,\n createOnboardingClient,\n isUsernameTaken,\n requestOnboardingChallenge,\n signInToCreatedAccount,\n uploadAccountMetadata,\n usernameFormatError,\n} from \"../core/onboarding\"\nimport { useLensAuth } from \"./provider\"\nimport { cn } from \"./utils\"\nimport { Button } from \"./ui/button\"\nimport { Input } from \"./ui/input\"\nimport { Textarea } from \"./ui/textarea\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"./ui/avatar\"\nimport { Field, FieldContent, FieldDescription, FieldGroup, FieldLabel } from \"./ui/field\"\nimport { InputGroup, InputGroupAddon, InputGroupInput, InputGroupText } from \"./ui/input-group\"\n\nexport type CreatedAccount = { address: string; localName: string }\n\ntype Step =\n | { status: \"signing\" }\n // The challenge arrived after the tap: on mobile it takes one more tap to open the wallet\n | { status: \"sign\"; challenge: LensChallenge }\n | { status: \"checking\" | \"uploading\" | \"creating\" | \"signing-in\" }\n\nconst STEP_LABELS = {\n signing: \"Waiting for signature…\",\n sign: \"Sign in wallet\",\n checking: \"Checking username…\",\n uploading: \"Uploading profile…\",\n creating: \"Creating account…\",\n \"signing-in\": \"Signing in…\",\n} satisfies Record<Step[\"status\"], string>\n\ntype Availability = { localName: string; status: \"checking\" | \"available\" | \"taken\" | \"unknown\" }\n\n// Same delay as the search on the find page\nconst USERNAME_DEBOUNCE_MS = 300\nconst MAX_PICTURE_BYTES = 10 * 1024 * 1024\n\n// Render with `key={ownerAddress}`: the onboarding session belongs to the wallet that signed it.\nexport function CreateAccountForm({ ownerAddress, onCreated, onBack }: {\n ownerAddress: string\n onCreated: (account: CreatedAccount) => Promise<void>\n onBack?: () => void\n}) {\n const { auth } = useLensAuth()\n const activeAccount = useActiveAccount()\n const wallet = useActiveWallet()\n\n const [client] = React.useState(() => createOnboardingClient(auth))\n // Kept across attempts so a retry doesn't ask for another signature or create a second account\n const session = React.useRef<SessionClient | null>(null)\n const created = React.useRef<CreatedAccount | null>(null)\n const pictureInput = React.useRef<HTMLInputElement>(null)\n\n const [username, setUsername] = React.useState(\"\")\n const [debouncedUsername, setDebouncedUsername] = React.useState(\"\")\n const [name, setName] = React.useState(\"\")\n const [bio, setBio] = React.useState(\"\")\n const [picture, setPicture] = React.useState<File | null>(null)\n const [pictureUrl, setPictureUrl] = React.useState<string | null>(null)\n\n const [availability, setAvailability] = React.useState<Availability | null>(null)\n const [usernameError, setUsernameError] = React.useState<{ localName: string; message: string } | null>(null)\n const [step, setStep] = React.useState<Step | null>(null)\n const [error, setError] = React.useState<string | null>(null)\n const [prefetched, setPrefetched] = React.useState<{ challenge: LensChallenge; fetchedAt: number } | null>(null)\n\n const formatError = username ? usernameFormatError(username) : null\n const busy = step !== null && step.status !== \"sign\"\n\n // Fetch the challenge ahead of time, so the tap on \"Create account\" can ask the wallet to sign right\n // away: on mobile that tap is what lets the wallet app open (see opensWalletWithDeepLink).\n React.useEffect(() => {\n const refresh = () => {\n if (document.visibilityState !== \"visible\" || session.current) return\n requestOnboardingChallenge(auth, client, ownerAddress)\n .then((challenge) => setPrefetched({ challenge, fetchedAt: Date.now() }))\n .catch(() => {})\n }\n refresh()\n const interval = setInterval(refresh, CHALLENGE_REFRESH_MS)\n document.addEventListener(\"visibilitychange\", refresh)\n return () => {\n clearInterval(interval)\n document.removeEventListener(\"visibilitychange\", refresh)\n }\n }, [auth, client, ownerAddress])\n\n // End the onboarding session if the form is left before the account is signed in to\n React.useEffect(() => () => {\n if (!created.current) void session.current?.logout()\n }, [])\n\n React.useEffect(() => {\n if (!picture) return setPictureUrl(null)\n const url = URL.createObjectURL(picture)\n setPictureUrl(url)\n return () => URL.revokeObjectURL(url)\n }, [picture])\n\n // Only check the username once typing pauses, not on every keystroke\n React.useEffect(() => {\n const timeout = setTimeout(() => setDebouncedUsername(username), USERNAME_DEBOUNCE_MS)\n return () => clearTimeout(timeout)\n }, [username])\n\n React.useEffect(() => {\n if (!debouncedUsername || usernameFormatError(debouncedUsername)) return\n let cancelled = false\n setAvailability({ localName: debouncedUsername, status: \"checking\" })\n isUsernameTaken(auth, debouncedUsername)\n .then((taken) => !cancelled && setAvailability({ localName: debouncedUsername, status: taken ? \"taken\" : \"available\" }))\n .catch(() => !cancelled && setAvailability({ localName: debouncedUsername, status: \"unknown\" }))\n return () => {\n cancelled = true\n }\n }, [auth, debouncedUsername])\n\n const fail = (e: unknown) => {\n setStep(null)\n if ((e as Error)?.name === \"UnauthenticatedError\") session.current = null\n setError(e instanceof OnboardingError ? e.message : \"Couldn’t create your account. Please try again.\")\n }\n\n const create = async (onboarding: SessionClient) => {\n const localName = username\n if (!created.current) {\n setStep({ status: \"checking\" })\n const reason = await checkUsername(auth, onboarding, localName)\n if (reason) {\n setUsernameError({ localName, message: reason })\n setStep(null)\n return\n }\n setStep({ status: \"uploading\" })\n const metadataUri = await uploadAccountMetadata(auth, { name: name.trim(), bio: bio.trim(), picture })\n setStep({ status: \"creating\" })\n if (!wallet) throw new OnboardingError(\"Connect your wallet\")\n const account = await createLensAccount(auth, onboarding, wallet, { localName, metadataUri })\n // account.username is its global Lens username, which it has none of in the app's namespace\n created.current = { address: account.address, localName }\n }\n setStep({ status: \"signing-in\" })\n await signInToCreatedAccount(auth, onboarding, created.current.address)\n await onCreated(created.current)\n }\n\n const continueWith = (authenticating: Promise<SessionClient | null>) => {\n authenticating\n .then(async (onboarding) => {\n if (!onboarding) return\n session.current = onboarding\n await create(onboarding)\n })\n .catch(fail)\n }\n\n const readyChallenge = () => {\n if (step?.status === \"sign\") return step.challenge\n if (!prefetched || Date.now() - prefetched.fetchedAt >= CHALLENGE_MAX_AGE_MS) return null\n return prefetched.challenge\n }\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n if (busy || !activeAccount) return\n if (!username) return setUsernameError({ localName: username, message: \"Choose a username\" })\n if (formatError || availability?.status === \"taken\") return\n setError(null)\n setUsernameError(null)\n\n if (session.current) {\n setStep({ status: \"checking\" })\n create(session.current).catch(fail)\n return\n }\n\n const challenge = readyChallenge()\n if (challenge) {\n // Sign now, while the tap still counts as a user gesture. A challenge can only be used once.\n const signing = signLensChallenge(challenge, activeAccount)\n setPrefetched(null)\n setStep({ status: \"signing\" })\n continueWith(signing.then((signature) => authenticateOnboarding(client, challenge, signature)))\n return\n }\n\n // The challenge isn't ready yet: fetch it now. Desktop wallets sign without a user gesture;\n // on mobile it takes one more tap to open the wallet.\n setStep({ status: \"signing\" })\n continueWith((async () => {\n const fetched = await requestOnboardingChallenge(auth, client, ownerAddress)\n if (opensWalletWithDeepLink()) {\n setStep({ status: \"sign\", challenge: fetched })\n return null\n }\n const signature = await signLensChallenge(fetched, activeAccount)\n return authenticateOnboarding(client, fetched, signature)\n })())\n }\n\n const handlePictureChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0] ?? null\n e.target.value = \"\"\n if (file && file.size > MAX_PICTURE_BYTES) return setError(\"Choose a picture under 10 MB\")\n setError(null)\n setPicture(file)\n }\n\n const usernameMessage = (() => {\n if (formatError) return { text: formatError, isError: true }\n if (usernameError?.localName === username) return { text: usernameError.message, isError: true }\n if (availability?.localName !== username) return null\n switch (availability.status) {\n case \"checking\": return { text: \"Checking availability…\", isError: false }\n case \"available\": return { text: \"Available\", isError: false }\n case \"taken\": return { text: \"This username is taken\", isError: true }\n default: return null\n }\n })()\n\n const fallbackInitial = (name.trim() || username || \"?\").charAt(0).toUpperCase()\n const usernameStatus = availability?.localName === username && !formatError ? availability.status : null\n\n return (\n <form className=\"py-4\" onSubmit={handleSubmit} noValidate>\n <FieldGroup className=\"gap-5\">\n <Field orientation=\"horizontal\">\n <Avatar className=\"size-16\">\n {pictureUrl && <AvatarImage src={pictureUrl} alt=\"\" className=\"object-cover\" />}\n <AvatarFallback className=\"text-lg font-semibold\">{fallbackInitial}</AvatarFallback>\n </Avatar>\n <FieldContent>\n <FieldLabel htmlFor=\"create-account-picture\">\n Profile picture <span className=\"font-normal text-muted-foreground\">(optional)</span>\n </FieldLabel>\n <div className=\"flex gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => pictureInput.current?.click()} disabled={busy}>\n {picture ? \"Change\" : \"Add photo\"}\n </Button>\n {picture && (\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => setPicture(null)} disabled={busy}>\n Remove\n </Button>\n )}\n </div>\n </FieldContent>\n <input\n ref={pictureInput}\n id=\"create-account-picture\"\n type=\"file\"\n accept=\"image/*\"\n className=\"sr-only\"\n onChange={handlePictureChange}\n disabled={busy}\n />\n </Field>\n\n <Field data-invalid={usernameMessage?.isError || undefined}>\n <FieldLabel htmlFor=\"create-account-username\">Username</FieldLabel>\n <InputGroup>\n <InputGroupAddon>\n <InputGroupText>@</InputGroupText>\n </InputGroupAddon>\n <InputGroupInput\n id=\"create-account-username\"\n value={username}\n onChange={(e) => setUsername(e.target.value.trim().toLowerCase())}\n autoComplete=\"off\"\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n spellCheck={false}\n aria-invalid={usernameMessage?.isError || undefined}\n aria-describedby=\"create-account-username-status\"\n disabled={busy}\n />\n <InputGroupAddon align=\"inline-end\">\n {usernameStatus === \"checking\" && <Loader2 className=\"animate-spin\" />}\n {usernameStatus === \"available\" && <Check />}\n </InputGroupAddon>\n </InputGroup>\n {/* Always rendered with a fixed height, so the form doesn't shift as the feedback changes */}\n <FieldDescription\n id=\"create-account-username-status\"\n aria-live=\"polite\"\n className={cn(\"min-h-5 leading-5\", usernameMessage?.isError && \"text-destructive\")}\n >\n {usernameMessage?.text}\n </FieldDescription>\n </Field>\n\n <Field>\n <FieldLabel htmlFor=\"create-account-name\">\n Name <span className=\"font-normal text-muted-foreground\">(optional)</span>\n </FieldLabel>\n <Input id=\"create-account-name\" value={name} onChange={(e) => setName(e.target.value)} maxLength={100} disabled={busy} />\n </Field>\n\n <Field>\n <FieldLabel htmlFor=\"create-account-bio\">\n Bio <span className=\"font-normal text-muted-foreground\">(optional)</span>\n </FieldLabel>\n <Textarea\n id=\"create-account-bio\"\n value={bio}\n onChange={(e) => setBio(e.target.value)}\n maxLength={300}\n rows={3}\n className=\"resize-none\"\n disabled={busy}\n />\n </Field>\n\n <Field className=\"gap-2\">\n <Button type=\"submit\" className=\"w-full\" disabled={busy || !activeAccount}>\n {busy && <Loader2 className=\"animate-spin\" />}\n {step ? STEP_LABELS[step.status] : \"Create account\"}\n </Button>\n <FieldDescription aria-live=\"polite\" className={cn(\"min-h-5 leading-5\", error && \"text-destructive\")}>\n {error ?? (step?.status === \"sign\" ? \"Tap again to sign in your wallet.\" : \"You’ll sign a message in your wallet. It’s free.\")}\n </FieldDescription>\n {onBack && (\n <Button type=\"button\" variant=\"ghost\" className=\"w-full\" onClick={onBack} disabled={busy}>\n Back to your accounts\n </Button>\n )}\n </Field>\n </FieldGroup>\n </form>\n )\n}\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../utils\"\n\nconst buttonVariants = cva(\n \"cursor-pointer inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n xl: \"h-[50px] rounded-md px-8 has-[>svg]:px-6\",\n icon: \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","import * as React from \"react\"\nimport { cn } from \"../utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\n\nimport { cn } from \"../utils\"\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn(\n \"relative flex size-8 shrink-0 overflow-hidden rounded-full\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square size-full\", className)}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"bg-muted flex size-full items-center justify-center rounded-full\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","\"use client\"\n\nimport { useMemo } from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../utils\"\n\nimport { Label } from \"./label\"\nimport { Separator } from \"./separator\"\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<\"fieldset\">) {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn(\n \"flex flex-col gap-6\",\n \"has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLegend({\n className,\n variant = \"legend\",\n ...props\n}: React.ComponentProps<\"legend\"> & { variant?: \"legend\" | \"label\" }) {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn(\n \"mb-3 font-medium\",\n \"data-[variant=legend]:text-base\",\n \"data-[variant=label]:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n \"group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst fieldVariants = cva(\n \"group/field flex w-full gap-3 data-[invalid=true]:text-destructive\",\n {\n variants: {\n orientation: {\n vertical: [\"flex-col [&>*]:w-full [&>.sr-only]:w-auto\"],\n horizontal: [\n \"flex-row items-center\",\n \"[&>[data-slot=field-label]]:flex-auto\",\n \"has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n ],\n responsive: [\n \"flex-col @md/field-group:flex-row @md/field-group:items-center [&>*]:w-full @md/field-group:[&>*]:w-auto [&>.sr-only]:w-auto\",\n \"@md/field-group:[&>[data-slot=field-label]]:flex-auto\",\n \"@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n ],\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n },\n }\n)\n\nfunction Field({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof fieldVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"field\"\n data-orientation={orientation}\n className={cn(fieldVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn(\n \"group/field-content flex flex-1 flex-col gap-1.5 leading-snug\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLabel({\n className,\n ...props\n}: React.ComponentProps<typeof Label>) {\n return (\n <Label\n data-slot=\"field-label\"\n className={cn(\n \"group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50\",\n \"has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border [&>*]:data-[slot=field]:p-4\",\n \"has-data-[state=checked]:border-primary has-data-[state=checked]:bg-primary/5 dark:has-data-[state=checked]:bg-primary/10\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-label\"\n className={cn(\n \"flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(\n \"text-sm leading-normal font-normal text-muted-foreground group-has-[[data-orientation=horizontal]]/field:text-balance\",\n \"last:mt-0 nth-last-2:-mt-1 [[data-variant=legend]+&]:-mt-1.5\",\n \"[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n children?: React.ReactNode\n}) {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn(\n \"relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2\",\n className\n )}\n {...props}\n >\n <Separator className=\"absolute inset-0 top-1/2\" />\n {children && (\n <span\n className=\"relative mx-auto block w-fit bg-background px-2 text-muted-foreground\"\n data-slot=\"field-separator-content\"\n >\n {children}\n </span>\n )}\n </div>\n )\n}\n\nfunction FieldError({\n className,\n children,\n errors,\n ...props\n}: React.ComponentProps<\"div\"> & {\n errors?: Array<{ message?: string } | undefined>\n}) {\n const content = useMemo(() => {\n if (children) {\n return children\n }\n\n if (!errors?.length) {\n return null\n }\n\n const uniqueErrors = [\n ...new Map(errors.map((error) => [error?.message, error])).values(),\n ]\n\n if (uniqueErrors?.length == 1) {\n return uniqueErrors[0]?.message\n }\n\n return (\n <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n {uniqueErrors.map(\n (error, index) =>\n error?.message && <li key={index}>{error.message}</li>\n )}\n </ul>\n )\n }, [children, errors])\n\n if (!content) {\n return null\n }\n\n return (\n <div\n role=\"alert\"\n data-slot=\"field-error\"\n className={cn(\"text-sm font-normal text-destructive\", className)}\n {...props}\n >\n {content}\n </div>\n )\n}\n\nexport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n FieldContent,\n FieldTitle,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"../utils\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../utils\"\n\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Textarea } from \"./textarea\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex w-full items-center rounded-md border border-input shadow-xs transition-[color,box-shadow] outline-none dark:bg-input/30\",\n \"h-9 min-w-0 has-[>textarea]:h-auto\",\n\n // Variants based on alignment.\n \"has-[>[data-align=inline-start]]:[&>input]:pl-2\",\n \"has-[>[data-align=inline-end]]:[&>input]:pr-2\",\n \"has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3\",\n \"has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3\",\n\n // Focus state.\n \"has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-[3px] has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50\",\n\n // Error state.\n \"has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-destructive/20 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40\",\n\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]\",\n \"inline-end\":\n \"order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-3 pt-3 group-has-[>input]/input-group:pt-2.5 [.border-b]:pb-3\",\n \"block-end\":\n \"order-last w-full justify-start px-3 pb-3 group-has-[>input]/input-group:pb-2.5 [.border-t]:pt-3\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n \"flex items-center gap-2 text-sm shadow-none\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-2 has-[>svg]:px-2 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"h-8 gap-1.5 rounded-md px-2.5 has-[>svg]:px-2.5\",\n \"icon-xs\":\n \"size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n","import * as React from \"react\"\n\nexport function useMediaQuery(query: string): boolean {\n return React.useSyncExternalStore(\n (onChange) => {\n const media = window.matchMedia(query)\n media.addEventListener(\"change\", onChange)\n return () => media.removeEventListener(\"change\", onChange)\n },\n () => window.matchMedia(query).matches,\n () => false,\n )\n}\n\n// The page's theme: a `dark` or `light` class on <html> (as next-themes and shadcn set it), otherwise\n// the system preference.\nfunction readTheme(): \"light\" | \"dark\" {\n const classes = document.documentElement.classList\n if (classes.contains(\"dark\")) return \"dark\"\n if (classes.contains(\"light\")) return \"light\"\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\"\n}\n\nexport function useDocumentTheme(): \"light\" | \"dark\" {\n return React.useSyncExternalStore(\n (onChange) => {\n const observer = new MutationObserver(onChange)\n observer.observe(document.documentElement, { attributes: true, attributeFilter: [\"class\"] })\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\")\n media.addEventListener(\"change\", onChange)\n return () => {\n observer.disconnect()\n media.removeEventListener(\"change\", onChange)\n }\n },\n readTheme,\n () => \"light\",\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n >\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"text-lg leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\n\nimport { cn } from \"../utils\"\n\nfunction Drawer({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Root>) {\n return <DrawerPrimitive.Root data-slot=\"drawer\" {...props} />\n}\n\nfunction DrawerTrigger({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Trigger>) {\n return <DrawerPrimitive.Trigger data-slot=\"drawer-trigger\" {...props} />\n}\n\nfunction DrawerPortal({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Portal>) {\n return <DrawerPrimitive.Portal data-slot=\"drawer-portal\" {...props} />\n}\n\nfunction DrawerClose({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Close>) {\n return <DrawerPrimitive.Close data-slot=\"drawer-close\" {...props} />\n}\n\nfunction DrawerOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Overlay>) {\n return (\n <DrawerPrimitive.Overlay\n data-slot=\"drawer-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DrawerContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Content>) {\n return (\n <DrawerPortal data-slot=\"drawer-portal\">\n <DrawerOverlay />\n <DrawerPrimitive.Content\n data-slot=\"drawer-content\"\n className={cn(\n \"group/drawer-content bg-background fixed z-50 flex h-auto flex-col\",\n \"data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-lg data-[vaul-drawer-direction=top]:border-b\",\n \"data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-lg data-[vaul-drawer-direction=bottom]:border-t\",\n \"data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:border-l data-[vaul-drawer-direction=right]:sm:max-w-sm\",\n \"data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:border-r data-[vaul-drawer-direction=left]:sm:max-w-sm\",\n className\n )}\n {...props}\n >\n <div className=\"bg-muted mx-auto mt-4 hidden h-2 w-[100px] shrink-0 rounded-full group-data-[vaul-drawer-direction=bottom]/drawer-content:block\" />\n {children}\n </DrawerPrimitive.Content>\n </DrawerPortal>\n )\n}\n\nfunction DrawerHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-header\"\n className={cn(\n \"flex flex-col gap-0.5 p-4 group-data-[vaul-drawer-direction=bottom]/drawer-content:text-center group-data-[vaul-drawer-direction=top]/drawer-content:text-center md:gap-1.5 md:text-left\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DrawerFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction DrawerTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Title>) {\n return (\n <DrawerPrimitive.Title\n data-slot=\"drawer-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction DrawerDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Description>) {\n return (\n <DrawerPrimitive.Description\n data-slot=\"drawer-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Drawer,\n DrawerPortal,\n DrawerOverlay,\n DrawerTrigger,\n DrawerClose,\n DrawerContent,\n DrawerHeader,\n DrawerFooter,\n DrawerTitle,\n DrawerDescription,\n}\n","import * as React from \"react\"\nimport type { ConnectButtonProps } from \"thirdweb/react\"\nimport { useLensAuth } from \"./provider\"\nimport { useDocumentTheme } from \"./dom\"\nimport { Button } from \"./ui/button\"\nimport { cn } from \"./utils\"\n\n// thirdweb's ConnectButton pulls in ~480KB (gzipped) of wallet SDKs (WalletConnect, Coinbase, ...).\n// Loading it on demand keeps that out of every page's initial bundle, so pages hydrate without\n// waiting for it.\nconst ConnectButton = React.lazy(() => import(\"thirdweb/react\").then((m) => ({ default: m.ConnectButton })))\n\nexport type SignInButtonProps = {\n /** Defaults to \"Sign in\" */\n label?: React.ReactNode\n /** Defaults to \"Logout\" */\n signOutLabel?: React.ReactNode\n /** thirdweb modal theme. Defaults to the page's theme (a `dark` class on <html>, or the system's). */\n theme?: \"light\" | \"dark\"\n /** Classes for the placeholder and sign-out buttons. Size the button's wrapper to size them all alike. */\n className?: string\n /** Extra props for thirdweb's ConnectButton (wallets, connectModal, ...) */\n connectButtonProps?: Partial<Omit<ConnectButtonProps, \"client\" | \"chain\" | \"theme\">>\n}\n\n// Connects a wallet (the account dialog then opens to pick or create a Lens account) and signs out.\nexport function SignInButton({ label = \"Sign in\", signOutLabel = \"Logout\", theme, className, connectButtonProps }: SignInButtonProps) {\n const { auth, wallet, status, signOut } = useLensAuth()\n const documentTheme = useDocumentTheme()\n const [mounted, setMounted] = React.useState(false)\n React.useEffect(() => setMounted(true), [])\n\n // Same size as the real button, so nothing shifts when it loads\n const placeholder = (\n <Button variant=\"outline\" size=\"xl\" className={cn(\"min-w-[165px] px-0\", className)} disabled>\n Loading...\n </Button>\n )\n\n // thirdweb's ConnectButton doesn't render the same on the server and the client\n if (!mounted) return placeholder\n\n if (!wallet) {\n return (\n <React.Suspense fallback={placeholder}>\n <ConnectButton\n client={auth.thirdwebClient}\n chain={auth.chain}\n theme={theme ?? documentTheme}\n {...connectButtonProps}\n connectButton={{\n label,\n ...connectButtonProps?.connectButton,\n style: { height: \"50px\", minWidth: \"165px\", ...connectButtonProps?.connectButton?.style },\n }}\n />\n </React.Suspense>\n )\n }\n\n if (status !== \"signed-in\") return placeholder\n\n return (\n <Button variant=\"ghost\" size=\"xl\" className={cn(\"min-w-[165px] px-0\", className)} onClick={signOut}>\n {signOutLabel}\n </Button>\n )\n}\n"],"mappings":"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","names":["React","useActiveAccount","useActiveWallet","React","Loader2","jsx","jsx","jsx","cva","jsx","jsx","jsx","cva","jsx","cva","jsx","cva","jsx","jsx","jsxs","React","jsx","jsxs","jsx","jsx","jsxs","jsx","jsx","jsxs","jsx","jsx","jsxs","jsx","jsx","jsxs","Title","Description","Loader2","jsx","jsxs","useActiveAccount","useActiveWallet","React","jsx"]}
|
|
1
|
+
{"version":3,"sources":["../../src/react/provider.tsx","../../src/react/AccountDialog.tsx","../../src/react/CreateAccountForm.tsx","../../src/react/utils.ts","../../src/react/ui/button.tsx","../../src/react/ui/input.tsx","../../src/react/ui/textarea.tsx","../../src/react/ui/avatar.tsx","../../src/react/ui/field.tsx","../../src/react/ui/label.tsx","../../src/react/ui/input-group.tsx","../../src/react/dom.ts","../../src/react/ui/dialog.tsx","../../src/react/ui/drawer.tsx","../../src/react/SignInButton.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { LensProvider } from \"@lens-protocol/react\"\nimport { ThirdwebProvider, useActiveAccount, useActiveWallet, useDisconnect } from \"thirdweb/react\"\nimport type { Account as ThirdwebAccount, Wallet } from \"thirdweb/wallets\"\nimport { ConvexProviderWithAuth, useConvexAuth, type ConvexReactClient } from \"convex/react\"\nimport type { LensAuth } from \"../core/auth\"\nimport { TOKENS_CHANGED_EVENT } from \"../core/tokens\"\nimport { AccountDialog } from \"./AccountDialog\"\n\nexport type SignedInAccount = {\n /** Lens account address, lowercased */\n address: string\n /** Lens username (local name), when known */\n username: string | null\n}\n\nexport type LensAuthStatus =\n /** Reading the stored session (first render, and during SSR) */\n | \"loading\"\n /** No wallet and no Lens session */\n | \"signed-out\"\n /** Wallet connected, no Lens account signed in yet: the account dialog is open */\n | \"choosing-account\"\n /** Signed in to a Lens account (Convex is authenticated as it too) */\n | \"signed-in\"\n\nexport type LensAuthContextValue = {\n auth: LensAuth\n status: LensAuthStatus\n isLoading: boolean\n isSignedIn: boolean\n /** The connected thirdweb wallet account */\n wallet: ThirdwebAccount | undefined\n /** The signed-in Lens account */\n account: SignedInAccount | null\n /** Ends the Lens session and disconnects the wallet */\n signOut: () => Promise<void>\n /** Opens the account dialog, e.g. to switch to another account */\n openAccountDialog: () => void\n}\n\ntype AccountDialogState = {\n open: boolean\n // True while a wallet is connected without a Lens session: the dialog can't be dismissed\n required: boolean\n setOpen: (open: boolean) => void\n completeSignIn: (account: SignedInAccount) => void\n}\n\nconst LensAuthContext = React.createContext<LensAuthContextValue | null>(null)\nconst AccountDialogContext = React.createContext<AccountDialogState | null>(null)\n\nexport function useLensAuth(): LensAuthContextValue {\n const ctx = React.useContext(LensAuthContext)\n if (!ctx) throw new Error(\"useLensAuth must be used within <LensAuthProvider>\")\n return ctx\n}\n\nexport function useAccountDialogState(): AccountDialogState {\n const ctx = React.useContext(AccountDialogContext)\n if (!ctx) throw new Error(\"<AccountDialog> must be used within <LensAuthProvider>\")\n return ctx\n}\n\nfunction subscribeToTokens(onChange: () => void) {\n window.addEventListener(TOKENS_CHANGED_EVENT, onChange)\n // Signing in or out in another tab\n window.addEventListener(\"storage\", onChange)\n return () => {\n window.removeEventListener(TOKENS_CHANGED_EVENT, onChange)\n window.removeEventListener(\"storage\", onChange)\n }\n}\n\n// Identifies the stored Lens session: its id plus the account it acts for. Token refreshes keep it the\n// same; signing in again, or as another account, changes it. Undefined until read on the client.\nfunction useSessionKey(auth: LensAuth): string | null | undefined {\n return React.useSyncExternalStore(\n subscribeToTokens,\n () => {\n const session = auth.getSession()\n return session ? `${session.sessionId}:${session.account}` : null\n },\n () => undefined,\n )\n}\n\n// Signs Convex in as the Lens account the user signed in with. A new session gets a new\n// fetchAccessToken, which makes Convex fetch its token again.\nfunction createUseConvexAuth(auth: LensAuth) {\n return function useLensConvexAuth() {\n const sessionKey = useSessionKey(auth)\n const fetchAccessToken = React.useCallback(\n async ({ forceRefreshToken }: { forceRefreshToken: boolean }) =>\n sessionKey ? auth.fetchConvexToken(forceRefreshToken) : null,\n [sessionKey],\n )\n return { isLoading: sessionKey === undefined, isAuthenticated: !!sessionKey, fetchAccessToken }\n }\n}\n\nexport type LensAuthProviderProps = {\n /** From createLensAuth(), created once at module level */\n auth: LensAuth\n /** Your ConvexReactClient. Omit to use the package without Convex. */\n convex?: ConvexReactClient\n /**\n * Called after the user signs in from the account dialog (picking an account or creating one), once\n * Convex accepts the session. A good place to create the user's row: `convex.mutation(api.users.ensure)`\n */\n onSignIn?: (account: SignedInAccount) => void | Promise<void>\n /** Render the account dialog. Set to false to render <AccountDialog /> yourself. Defaults to true. */\n accountDialog?: boolean\n /**\n * Wallets to reconnect after a reload while a Lens session is stored. Pass the same list as\n * SignInButton's `connectButtonProps.wallets`, if you customize it. Defaults to thirdweb's wallets.\n */\n wallets?: Wallet[]\n children: React.ReactNode\n}\n\n// thirdweb's AutoConnect (loaded on demand, like the ConnectButton) reconnects the last wallet\nconst AutoConnect = React.lazy(() => import(\"thirdweb/react\").then((m) => ({ default: m.AutoConnect })))\n\n// Wraps the app in thirdweb, Lens and (optionally) Convex providers wired to one session.\nexport function LensAuthProvider({ auth, convex, onSignIn, accountDialog = true, wallets, children }: LensAuthProviderProps) {\n const [useConvexAuthHook] = React.useState(() => createUseConvexAuth(auth))\n const content = (\n <LensAuthState auth={auth} onSignIn={onSignIn} withConvex={!!convex} wallets={wallets}>\n {children}\n {accountDialog && <AccountDialog />}\n </LensAuthState>\n )\n return (\n <ThirdwebProvider>\n <LensProvider client={auth.lensClient}>\n {convex ? (\n <ConvexProviderWithAuth client={convex} useAuth={useConvexAuthHook}>\n {content}\n </ConvexProviderWithAuth>\n ) : content}\n </LensProvider>\n </ThirdwebProvider>\n )\n}\n\nfunction readSelectedAccount(auth: LensAuth, address: string): string | null {\n try {\n const stored = JSON.parse(localStorage.getItem(`${auth.storagePrefix}account`) ?? \"null\")\n return stored?.address === address && typeof stored.username === \"string\" ? stored.username : null\n } catch {\n return null\n }\n}\n\nfunction writeSelectedAccount(auth: LensAuth, account: SignedInAccount | null) {\n try {\n const key = `${auth.storagePrefix}account`\n if (account) localStorage.setItem(key, JSON.stringify(account))\n else localStorage.removeItem(key)\n } catch {}\n}\n\nfunction LensAuthState({ auth, onSignIn, withConvex, wallets, children }: {\n auth: LensAuth\n onSignIn?: LensAuthProviderProps[\"onSignIn\"]\n withConvex: boolean\n wallets?: Wallet[]\n children: React.ReactNode\n}) {\n const wallet = useActiveAccount()\n const activeWallet = useActiveWallet()\n const { disconnect } = useDisconnect()\n const sessionKey = useSessionKey(auth)\n const [manualOpen, setManualOpen] = React.useState(false)\n const [pendingSignIn, setPendingSignIn] = React.useState<SignedInAccount | null>(null)\n\n const account = React.useMemo<SignedInAccount | null>(() => {\n if (!sessionKey) return null\n const address = sessionKey.slice(sessionKey.lastIndexOf(\":\") + 1)\n return { address, username: readSelectedAccount(auth, address) }\n }, [auth, sessionKey])\n\n const status: LensAuthStatus =\n sessionKey === undefined ? \"loading\"\n : sessionKey ? \"signed-in\"\n : wallet ? \"choosing-account\"\n : \"signed-out\"\n\n useBackgroundRefresh(auth)\n\n // A connected wallet checks the stored session is still valid (refreshing it or clearing it)\n React.useEffect(() => {\n if (wallet) void auth.resumeSession().catch(() => {})\n }, [auth, wallet?.address])\n\n const signOut = React.useCallback(async () => {\n setManualOpen(false)\n writeSelectedAccount(auth, null)\n try {\n await auth.logout()\n } finally {\n if (activeWallet) disconnect(activeWallet)\n }\n }, [auth, activeWallet, disconnect])\n\n const value = React.useMemo<LensAuthContextValue>(() => ({\n auth,\n status,\n isLoading: status === \"loading\",\n isSignedIn: status === \"signed-in\",\n wallet,\n account,\n signOut,\n openAccountDialog: () => setManualOpen(true),\n }), [auth, status, wallet, account, signOut])\n\n const required = status === \"choosing-account\"\n const dialog = React.useMemo<AccountDialogState>(() => ({\n open: required || (manualOpen && !!wallet),\n required,\n setOpen: (open) => {\n if (open) setManualOpen(true)\n else if (!required) setManualOpen(false)\n },\n completeSignIn: (signedIn) => {\n writeSelectedAccount(auth, signedIn)\n setManualOpen(false)\n if (onSignIn) setPendingSignIn(signedIn)\n },\n }), [auth, required, manualOpen, wallet, onSignIn])\n\n return (\n <LensAuthContext.Provider value={value}>\n <AccountDialogContext.Provider value={dialog}>\n {children}\n {/* After a reload the Lens session is restored from storage, but the wallet only comes back if\n something reconnects it: SignInButton's ConnectButton does, but it's only shown while no\n wallet is connected and apps often hide it once signed in. */}\n {sessionKey && !wallet && (\n <React.Suspense fallback={null}>\n <AutoConnect client={auth.thirdwebClient} chain={auth.chain} wallets={wallets} />\n </React.Suspense>\n )}\n {pendingSignIn && onSignIn && (\n withConvex\n ? <ConvexSignInCallback account={pendingSignIn} onSignIn={onSignIn} done={() => setPendingSignIn(null)} />\n : <SignInCallback account={pendingSignIn} onSignIn={onSignIn} done={() => setPendingSignIn(null)} />\n )}\n </AccountDialogContext.Provider>\n </LensAuthContext.Provider>\n )\n}\n\ntype SignInCallbackProps = {\n account: SignedInAccount\n onSignIn: NonNullable<LensAuthProviderProps[\"onSignIn\"]>\n done: () => void\n}\n\nfunction SignInCallback({ account, onSignIn, done }: SignInCallbackProps) {\n React.useEffect(() => {\n Promise.resolve(onSignIn(account)).catch((err) => console.error(\"lens-convex-auth: onSignIn failed\", err)).finally(done)\n }, [account])\n return null\n}\n\n// Waits until Convex accepts the new session, so onSignIn can call authenticated Convex functions\nfunction ConvexSignInCallback(props: SignInCallbackProps) {\n const { isAuthenticated, isLoading } = useConvexAuth()\n return isAuthenticated && !isLoading ? <SignInCallback {...props} /> : null\n}\n\n// Refreshes the tokens a minute before they expire, so Convex and API calls always have a fresh one\nfunction useBackgroundRefresh(auth: LensAuth) {\n React.useEffect(() => {\n let timeout: ReturnType<typeof setTimeout> | undefined\n let stopped = false\n\n // Runs again whenever tokens are stored or cleared (a sign-in, a refresh, another tab)\n const schedule = () => {\n if (timeout) clearTimeout(timeout)\n timeout = undefined\n const tokens = auth.tokens.getStoredTokens()\n if (stopped || !tokens?.expiresAt) return\n const delay = Math.max(1000, tokens.expiresAt - Date.now() - 60 * 1000)\n timeout = setTimeout(() => void auth.tokens.refreshTokens(), delay)\n }\n\n const unsubscribe = subscribeToTokens(schedule)\n ;(async () => {\n try {\n await auth.resumeSession()\n } catch {}\n schedule()\n })()\n\n return () => {\n stopped = true\n unsubscribe()\n if (timeout) clearTimeout(timeout)\n }\n }, [auth])\n}\n","import * as React from \"react\"\nimport { useAccountsAvailable } from \"@lens-protocol/react\"\nimport { evmAddress, type Account, type AccountAvailable } from \"@lens-protocol/client\"\nimport type { Account as ThirdwebAccount } from \"thirdweb/wallets\"\nimport { Loader2 } from \"lucide-react\"\nimport { CHALLENGE_MAX_AGE_MS, CHALLENGE_REFRESH_MS, opensWalletWithDeepLink, type LensAuth, type LensChallenge } from \"../core/auth\"\nimport { fetchAccountUsername } from \"../core/onboarding\"\nimport { useAccountDialogState, useLensAuth } from \"./provider\"\nimport { CreateAccountForm, type CreatedAccount } from \"./CreateAccountForm\"\nimport { useMediaQuery } from \"./dom\"\nimport { Button } from \"./ui/button\"\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from \"./ui/dialog\"\nimport { Drawer, DrawerContent, DrawerDescription, DrawerHeader, DrawerTitle } from \"./ui/drawer\"\n\n// Lists the wallet's Lens accounts to sign in with, or the form to create one. Opens by itself when a\n// wallet connects without a Lens session, and can't be dismissed until an account is signed in to (or\n// the wallet disconnects). A dialog on desktop, a drawer on mobile.\nexport function AccountDialog() {\n const { wallet, signOut } = useLensAuth()\n const { open, required, setOpen } = useAccountDialogState()\n const isDesktop = useMediaQuery(\"(min-width: 768px)\")\n const [creating, setCreating] = React.useState(false)\n\n // Show the account list again the next time the dialog opens\n React.useEffect(() => {\n if (!open) setCreating(false)\n }, [open])\n\n const handleOpenChange = (next: boolean) => {\n if (!next && required) return\n setOpen(next)\n }\n\n const body = wallet\n ? <AccountDialogBody key={wallet.address} wallet={wallet} creating={creating} setCreating={setCreating} />\n : null\n const disconnect = (\n <Button onClick={signOut} variant=\"outline\" className=\"w-full\">\n Disconnect Wallet\n </Button>\n )\n\n if (isDesktop) {\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n className=\"sm:max-w-[425px] max-h-[80vh] overflow-y-auto\"\n showCloseButton={!required}\n onEscapeKeyDown={(e) => required && e.preventDefault()}\n onPointerDownOutside={(e) => required && e.preventDefault()}\n >\n {body}\n <div className=\"mt-4\">{disconnect}</div>\n </DialogContent>\n </Dialog>\n )\n }\n\n return (\n <Drawer open={open} onOpenChange={handleOpenChange} dismissible={!required}>\n <DrawerContent className=\"max-h-[80vh] overflow-y-auto\">\n {body}\n <div className=\"p-4\">{disconnect}</div>\n </DrawerContent>\n </Drawer>\n )\n}\n\nfunction AccountDialogBody({ wallet, creating, setCreating }: {\n wallet: ThirdwebAccount\n creating: boolean\n setCreating: (creating: boolean) => void\n}) {\n const { auth } = useLensAuth()\n const { completeSignIn } = useAccountDialogState()\n const isDesktop = useMediaQuery(\"(min-width: 768px)\")\n const { data, loading: loadingAccounts } = useAccountsAvailable({ managedBy: evmAddress(wallet.address), includeOwned: true })\n const accounts = data?.items\n const usernames = useAccountUsernames(auth, accounts)\n const loading = loadingAccounts || (!!accounts && !usernames)\n const usernameOf = React.useCallback((acc: Account) => {\n const resolved = usernames?.[acc.address.toLowerCase()]\n return resolved === undefined ? acc.username?.localName ?? null : resolved\n }, [usernames])\n // Accounts without a username aren't listed, so they don't count\n const hasAccounts = !loading && !!accounts?.some((item) => usernameOf(item.account))\n // Wallets without an account go straight to creating one\n const showCreate = creating || (!loading && !hasAccounts)\n\n const signIn = async (account: SelectableAccount, challenge: LensChallenge) => {\n // The signature request goes out before the first await, so a click handler calling this keeps its\n // user gesture, which mobile wallets need to open (see signLensChallenge).\n const signature = await auth.signChallenge(challenge, wallet)\n await auth.authenticate(challenge, signature)\n completeSignIn({ address: account.address.toLowerCase(), username: usernameOf(account) })\n }\n\n const handleCreated = async (created: CreatedAccount) => {\n completeSignIn({ address: created.address.toLowerCase(), username: created.localName })\n }\n\n const title = showCreate ? \"Create Account\" : \"Select Account\"\n const description = showCreate\n ? hasAccounts ? \"Pick a username for your new Lens account.\" : \"You don’t have a Lens account yet. Create one to continue.\"\n : \"Select an account to continue.\"\n\n const Header = isDesktop ? DialogHeader : DrawerHeader\n const Title = isDesktop ? DialogTitle : DrawerTitle\n const Description = isDesktop ? DialogDescription : DrawerDescription\n\n return (\n <>\n <Header className={isDesktop ? undefined : \"text-left\"}>\n <Title>{title}</Title>\n <Description>{description}</Description>\n </Header>\n <div className={isDesktop || !showCreate ? undefined : \"px-4\"}>\n {showCreate ? (\n <CreateAccountForm\n ownerAddress={wallet.address}\n onCreated={handleCreated}\n onBack={hasAccounts ? () => setCreating(false) : undefined}\n />\n ) : (\n <AccountList auth={auth} accounts={accounts} usernameOf={usernameOf} loading={loading} ownerAddress={wallet.address} onSign={signIn} onCreate={() => setCreating(true)} />\n )}\n </div>\n </>\n )\n}\n\n// Each account's username by lowercased address (see fetchAccountUsername), or undefined while they load.\n// An account whose lookup failed is left out, so it falls back to its global Lens username.\nfunction useAccountUsernames(auth: LensAuth, accounts?: readonly AccountAvailable[]) {\n const key = accounts?.map((item) => item.account.address.toLowerCase()).join(\",\")\n const [usernames, setUsernames] = React.useState<{ key: string; byAddress: Record<string, string | null> } | null>(null)\n\n React.useEffect(() => {\n if (key === undefined) return\n let cancelled = false\n const addresses = key ? key.split(\",\") : []\n Promise.all(addresses.map((address) =>\n fetchAccountUsername(auth, address).then((username) => [[address, username] as const], () => []),\n )).then((entries) => {\n if (!cancelled) setUsernames({ key, byAddress: Object.fromEntries(entries.flat()) })\n })\n return () => {\n cancelled = true\n }\n }, [auth, key])\n\n return usernames && usernames.key === key ? usernames.byAddress : undefined\n}\n\ntype SelectableAccount = Account & { isOwner: boolean }\n\ntype SignInStep =\n | { id: string; status: \"loading\" }\n | { id: string; status: \"sign\"; challenge: LensChallenge }\n\ntype PrefetchedChallenge = { owner: string; challenge: LensChallenge; fetchedAt: number }\n\nfunction fetchChallenge(auth: LensAuth, acc: SelectableAccount, ownerAddress: string) {\n return auth.requestChallenge({\n role: acc.isOwner ? \"ACCOUNT_OWNER\" : \"ACCOUNT_MANAGER\",\n account: acc.address,\n signer: ownerAddress,\n })\n}\n\nfunction AccountList({ auth, accounts, usernameOf, loading, ownerAddress, onSign, onCreate }: {\n auth: LensAuth\n accounts?: readonly AccountAvailable[]\n usernameOf: (account: Account) => string | null\n loading: boolean\n ownerAddress: string\n onSign: (account: SelectableAccount, challenge: LensChallenge) => Promise<void>\n onCreate: () => void\n}) {\n const [step, setStep] = React.useState<SignInStep | null>(null)\n const [errorId, setErrorId] = React.useState<string | null>(null)\n const [challenges, setChallenges] = React.useState<Record<string, PrefetchedChallenge>>({})\n\n const selectable = React.useMemo(() => (accounts ?? []).map((item, index) => {\n const acc: SelectableAccount = { ...item.account, isOwner: item.__typename === \"AccountOwned\" }\n return { acc, id: `${acc.address}-${index}` }\n }), [accounts])\n\n const prefetch = React.useCallback((acc: SelectableAccount, id: string) => {\n fetchChallenge(auth, acc, ownerAddress)\n .then((challenge) => setChallenges((prev) => ({ ...prev, [id]: { owner: ownerAddress, challenge, fetchedAt: Date.now() } })))\n .catch(() => {})\n }, [auth, ownerAddress])\n\n // Accounts can share a username across namespaces: those get their shortened address too\n const sharedUsernames = React.useMemo(() => {\n const counts = new Map<string, number>()\n for (const { acc } of selectable) {\n const username = usernameOf(acc)\n if (username) counts.set(username, (counts.get(username) ?? 0) + 1)\n }\n return new Set([...counts].filter(([, count]) => count > 1).map(([username]) => username))\n }, [selectable, usernameOf])\n\n // Fetch each account's challenge ahead of time, so a tap can ask the wallet to sign right away:\n // on mobile that tap is what lets the wallet app open (see opensWalletWithDeepLink).\n React.useEffect(() => {\n const refresh = () => {\n if (document.visibilityState !== \"visible\") return\n for (const { acc, id } of selectable) {\n if (usernameOf(acc)) prefetch(acc, id)\n }\n }\n refresh()\n const interval = setInterval(refresh, CHALLENGE_REFRESH_MS)\n document.addEventListener(\"visibilitychange\", refresh)\n return () => {\n clearInterval(interval)\n document.removeEventListener(\"visibilitychange\", refresh)\n }\n }, [selectable, usernameOf, prefetch])\n\n const readyChallenge = (id: string) => {\n if (step?.id === id && step.status === \"sign\") return step.challenge\n const prefetched = challenges[id]\n if (!prefetched || prefetched.owner !== ownerAddress) return null\n return Date.now() - prefetched.fetchedAt < CHALLENGE_MAX_AGE_MS ? prefetched.challenge : null\n }\n\n const handleClick = (acc: SelectableAccount, id: string) => {\n setErrorId(null)\n const fail = () => {\n setStep(null)\n setErrorId(id)\n prefetch(acc, id)\n }\n const challenge = readyChallenge(id)\n if (challenge) {\n // Sign now, while the tap still counts as a user gesture. A challenge can only be used once.\n const signing = onSign(acc, challenge)\n setChallenges(({ [id]: _used, ...rest }) => rest)\n setStep({ id, status: \"loading\" })\n signing.then(() => setStep(null), fail)\n return\n }\n // The challenge isn't ready yet: fetch it now. Desktop wallets sign without a user gesture;\n // on mobile it takes one more tap to open the wallet.\n setStep({ id, status: \"loading\" })\n ;(async () => {\n const fetched = await fetchChallenge(auth, acc, ownerAddress)\n if (opensWalletWithDeepLink()) return setStep({ id, status: \"sign\", challenge: fetched })\n await onSign(acc, fetched)\n setStep(null)\n })().catch(fail)\n }\n\n if (loading) {\n return (\n <div className=\"p-4\">\n <p className=\"text-sm text-muted-foreground\">Loading available profiles…</p>\n </div>\n )\n }\n\n return (\n <div className=\"py-4 space-y-3\">\n <ul className=\"space-y-2 max-h-80 overflow-y-auto\">\n {selectable.map(({ acc, id }) => {\n const username = usernameOf(acc)\n if (!username) return null\n const isLoading = step?.id === id && step.status === \"loading\"\n const awaitingSignature = step?.id === id && step.status === \"sign\"\n return (\n <li key={id}>\n <button\n type=\"button\"\n className=\"w-full text-left px-3 py-2 rounded-md border hover:bg-accent/50 flex items-center justify-between cursor-pointer disabled:cursor-default\"\n onClick={() => handleClick(acc, id)}\n disabled={step?.status === \"loading\"}\n >\n <span className=\"truncate\">\n {username}\n {sharedUsernames.has(username) && (\n <span className=\"text-muted-foreground\"> · {acc.address.slice(0, 6)}…{acc.address.slice(-4)}</span>\n )}\n </span>\n {isLoading && <Loader2 className=\"size-4 animate-spin text-muted-foreground\" />}\n {awaitingSignature && <span className=\"text-sm font-medium text-primary\">Sign in</span>}\n </button>\n {awaitingSignature && (\n <p className=\"px-1 pt-1 text-xs text-muted-foreground\">Tap again to sign the message in your wallet.</p>\n )}\n {errorId === id && (\n <p className=\"px-1 pt-1 text-xs text-destructive\">Couldn’t sign in. Please try again.</p>\n )}\n </li>\n )\n })}\n </ul>\n <Button variant=\"ghost\" className=\"w-full\" onClick={onCreate} disabled={step?.status === \"loading\"}>\n Create a new account\n </Button>\n </div>\n )\n}\n","import * as React from \"react\"\nimport { useActiveAccount, useActiveWallet } from \"thirdweb/react\"\nimport type { SessionClient } from \"@lens-protocol/client\"\nimport { Check, Loader2 } from \"lucide-react\"\nimport { CHALLENGE_MAX_AGE_MS, CHALLENGE_REFRESH_MS, opensWalletWithDeepLink, signLensChallenge, type LensChallenge } from \"../core/auth\"\nimport {\n OnboardingError,\n authenticateOnboarding,\n checkUsername,\n createLensAccount,\n createOnboardingClient,\n isUsernameTaken,\n requestOnboardingChallenge,\n signInToCreatedAccount,\n uploadAccountMetadata,\n usernameFormatError,\n} from \"../core/onboarding\"\nimport { useLensAuth } from \"./provider\"\nimport { cn } from \"./utils\"\nimport { Button } from \"./ui/button\"\nimport { Input } from \"./ui/input\"\nimport { Textarea } from \"./ui/textarea\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"./ui/avatar\"\nimport { Field, FieldContent, FieldDescription, FieldGroup, FieldLabel } from \"./ui/field\"\nimport { InputGroup, InputGroupAddon, InputGroupInput, InputGroupText } from \"./ui/input-group\"\n\nexport type CreatedAccount = { address: string; localName: string }\n\ntype Step =\n | { status: \"signing\" }\n // The challenge arrived after the tap: on mobile it takes one more tap to open the wallet\n | { status: \"sign\"; challenge: LensChallenge }\n | { status: \"checking\" | \"uploading\" | \"creating\" | \"signing-in\" }\n\nconst STEP_LABELS = {\n signing: \"Waiting for signature…\",\n sign: \"Sign in wallet\",\n checking: \"Checking username…\",\n uploading: \"Uploading profile…\",\n creating: \"Creating account…\",\n \"signing-in\": \"Signing in…\",\n} satisfies Record<Step[\"status\"], string>\n\ntype Availability = { localName: string; status: \"checking\" | \"available\" | \"taken\" | \"unknown\" }\n\n// Same delay as the search on the find page\nconst USERNAME_DEBOUNCE_MS = 300\nconst MAX_PICTURE_BYTES = 10 * 1024 * 1024\n\n// Render with `key={ownerAddress}`: the onboarding session belongs to the wallet that signed it.\nexport function CreateAccountForm({ ownerAddress, onCreated, onBack }: {\n ownerAddress: string\n onCreated: (account: CreatedAccount) => Promise<void>\n onBack?: () => void\n}) {\n const { auth } = useLensAuth()\n const activeAccount = useActiveAccount()\n const wallet = useActiveWallet()\n\n const [client] = React.useState(() => createOnboardingClient(auth))\n // Kept across attempts so a retry doesn't ask for another signature or create a second account\n const session = React.useRef<SessionClient | null>(null)\n const created = React.useRef<CreatedAccount | null>(null)\n const pictureInput = React.useRef<HTMLInputElement>(null)\n\n const [username, setUsername] = React.useState(\"\")\n const [debouncedUsername, setDebouncedUsername] = React.useState(\"\")\n const [name, setName] = React.useState(\"\")\n const [bio, setBio] = React.useState(\"\")\n const [picture, setPicture] = React.useState<File | null>(null)\n const [pictureUrl, setPictureUrl] = React.useState<string | null>(null)\n\n const [availability, setAvailability] = React.useState<Availability | null>(null)\n const [usernameError, setUsernameError] = React.useState<{ localName: string; message: string } | null>(null)\n const [step, setStep] = React.useState<Step | null>(null)\n const [error, setError] = React.useState<string | null>(null)\n const [prefetched, setPrefetched] = React.useState<{ challenge: LensChallenge; fetchedAt: number } | null>(null)\n\n const formatError = username ? usernameFormatError(username) : null\n const busy = step !== null && step.status !== \"sign\"\n\n // Fetch the challenge ahead of time, so the tap on \"Create account\" can ask the wallet to sign right\n // away: on mobile that tap is what lets the wallet app open (see opensWalletWithDeepLink).\n React.useEffect(() => {\n const refresh = () => {\n if (document.visibilityState !== \"visible\" || session.current) return\n requestOnboardingChallenge(auth, client, ownerAddress)\n .then((challenge) => setPrefetched({ challenge, fetchedAt: Date.now() }))\n .catch(() => {})\n }\n refresh()\n const interval = setInterval(refresh, CHALLENGE_REFRESH_MS)\n document.addEventListener(\"visibilitychange\", refresh)\n return () => {\n clearInterval(interval)\n document.removeEventListener(\"visibilitychange\", refresh)\n }\n }, [auth, client, ownerAddress])\n\n // End the onboarding session if the form is left before the account is signed in to\n React.useEffect(() => () => {\n if (!created.current) void session.current?.logout()\n }, [])\n\n React.useEffect(() => {\n if (!picture) return setPictureUrl(null)\n const url = URL.createObjectURL(picture)\n setPictureUrl(url)\n return () => URL.revokeObjectURL(url)\n }, [picture])\n\n // Only check the username once typing pauses, not on every keystroke\n React.useEffect(() => {\n const timeout = setTimeout(() => setDebouncedUsername(username), USERNAME_DEBOUNCE_MS)\n return () => clearTimeout(timeout)\n }, [username])\n\n React.useEffect(() => {\n if (!debouncedUsername || usernameFormatError(debouncedUsername)) return\n let cancelled = false\n setAvailability({ localName: debouncedUsername, status: \"checking\" })\n isUsernameTaken(auth, debouncedUsername)\n .then((taken) => !cancelled && setAvailability({ localName: debouncedUsername, status: taken ? \"taken\" : \"available\" }))\n .catch(() => !cancelled && setAvailability({ localName: debouncedUsername, status: \"unknown\" }))\n return () => {\n cancelled = true\n }\n }, [auth, debouncedUsername])\n\n const fail = (e: unknown) => {\n setStep(null)\n if ((e as Error)?.name === \"UnauthenticatedError\") session.current = null\n setError(e instanceof OnboardingError ? e.message : \"Couldn’t create your account. Please try again.\")\n }\n\n const create = async (onboarding: SessionClient) => {\n const localName = username\n if (!created.current) {\n setStep({ status: \"checking\" })\n const reason = await checkUsername(auth, onboarding, localName)\n if (reason) {\n setUsernameError({ localName, message: reason })\n setStep(null)\n return\n }\n setStep({ status: \"uploading\" })\n const metadataUri = await uploadAccountMetadata(auth, { name: name.trim(), bio: bio.trim(), picture })\n setStep({ status: \"creating\" })\n if (!wallet) throw new OnboardingError(\"Connect your wallet\")\n const account = await createLensAccount(auth, onboarding, wallet, { localName, metadataUri })\n // account.username is its global Lens username, which it has none of in the app's namespace\n created.current = { address: account.address, localName }\n }\n setStep({ status: \"signing-in\" })\n await signInToCreatedAccount(auth, onboarding, created.current.address)\n await onCreated(created.current)\n }\n\n const continueWith = (authenticating: Promise<SessionClient | null>) => {\n authenticating\n .then(async (onboarding) => {\n if (!onboarding) return\n session.current = onboarding\n await create(onboarding)\n })\n .catch(fail)\n }\n\n const readyChallenge = () => {\n if (step?.status === \"sign\") return step.challenge\n if (!prefetched || Date.now() - prefetched.fetchedAt >= CHALLENGE_MAX_AGE_MS) return null\n return prefetched.challenge\n }\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n if (busy || !activeAccount) return\n if (!username) return setUsernameError({ localName: username, message: \"Choose a username\" })\n if (formatError || availability?.status === \"taken\") return\n setError(null)\n setUsernameError(null)\n\n if (session.current) {\n setStep({ status: \"checking\" })\n create(session.current).catch(fail)\n return\n }\n\n const challenge = readyChallenge()\n if (challenge) {\n // Sign now, while the tap still counts as a user gesture. A challenge can only be used once.\n const signing = signLensChallenge(challenge, activeAccount)\n setPrefetched(null)\n setStep({ status: \"signing\" })\n continueWith(signing.then((signature) => authenticateOnboarding(client, challenge, signature)))\n return\n }\n\n // The challenge isn't ready yet: fetch it now. Desktop wallets sign without a user gesture;\n // on mobile it takes one more tap to open the wallet.\n setStep({ status: \"signing\" })\n continueWith((async () => {\n const fetched = await requestOnboardingChallenge(auth, client, ownerAddress)\n if (opensWalletWithDeepLink()) {\n setStep({ status: \"sign\", challenge: fetched })\n return null\n }\n const signature = await signLensChallenge(fetched, activeAccount)\n return authenticateOnboarding(client, fetched, signature)\n })())\n }\n\n const handlePictureChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0] ?? null\n e.target.value = \"\"\n if (file && file.size > MAX_PICTURE_BYTES) return setError(\"Choose a picture under 10 MB\")\n setError(null)\n setPicture(file)\n }\n\n const usernameMessage = (() => {\n if (formatError) return { text: formatError, isError: true }\n if (usernameError?.localName === username) return { text: usernameError.message, isError: true }\n if (availability?.localName !== username) return null\n switch (availability.status) {\n case \"checking\": return { text: \"Checking availability…\", isError: false }\n case \"available\": return { text: \"Available\", isError: false }\n case \"taken\": return { text: \"This username is taken\", isError: true }\n default: return null\n }\n })()\n\n const fallbackInitial = (name.trim() || username || \"?\").charAt(0).toUpperCase()\n const usernameStatus = availability?.localName === username && !formatError ? availability.status : null\n\n return (\n <form className=\"py-4\" onSubmit={handleSubmit} noValidate>\n <FieldGroup className=\"gap-5\">\n <Field orientation=\"horizontal\">\n <Avatar className=\"size-16\">\n {pictureUrl && <AvatarImage src={pictureUrl} alt=\"\" className=\"object-cover\" />}\n <AvatarFallback className=\"text-lg font-semibold\">{fallbackInitial}</AvatarFallback>\n </Avatar>\n <FieldContent>\n <FieldLabel htmlFor=\"create-account-picture\">\n Profile picture <span className=\"font-normal text-muted-foreground\">(optional)</span>\n </FieldLabel>\n <div className=\"flex gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => pictureInput.current?.click()} disabled={busy}>\n {picture ? \"Change\" : \"Add photo\"}\n </Button>\n {picture && (\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => setPicture(null)} disabled={busy}>\n Remove\n </Button>\n )}\n </div>\n </FieldContent>\n <input\n ref={pictureInput}\n id=\"create-account-picture\"\n type=\"file\"\n accept=\"image/*\"\n className=\"sr-only\"\n onChange={handlePictureChange}\n disabled={busy}\n />\n </Field>\n\n <Field data-invalid={usernameMessage?.isError || undefined}>\n <FieldLabel htmlFor=\"create-account-username\">Username</FieldLabel>\n <InputGroup>\n <InputGroupAddon>\n <InputGroupText>@</InputGroupText>\n </InputGroupAddon>\n <InputGroupInput\n id=\"create-account-username\"\n value={username}\n onChange={(e) => setUsername(e.target.value.trim().toLowerCase())}\n autoComplete=\"off\"\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n spellCheck={false}\n aria-invalid={usernameMessage?.isError || undefined}\n aria-describedby=\"create-account-username-status\"\n disabled={busy}\n />\n <InputGroupAddon align=\"inline-end\">\n {usernameStatus === \"checking\" && <Loader2 className=\"animate-spin\" />}\n {usernameStatus === \"available\" && <Check />}\n </InputGroupAddon>\n </InputGroup>\n {/* Always rendered with a fixed height, so the form doesn't shift as the feedback changes */}\n <FieldDescription\n id=\"create-account-username-status\"\n aria-live=\"polite\"\n className={cn(\"min-h-5 leading-5\", usernameMessage?.isError && \"text-destructive\")}\n >\n {usernameMessage?.text}\n </FieldDescription>\n </Field>\n\n <Field>\n <FieldLabel htmlFor=\"create-account-name\">\n Name <span className=\"font-normal text-muted-foreground\">(optional)</span>\n </FieldLabel>\n <Input id=\"create-account-name\" value={name} onChange={(e) => setName(e.target.value)} maxLength={100} disabled={busy} />\n </Field>\n\n <Field>\n <FieldLabel htmlFor=\"create-account-bio\">\n Bio <span className=\"font-normal text-muted-foreground\">(optional)</span>\n </FieldLabel>\n <Textarea\n id=\"create-account-bio\"\n value={bio}\n onChange={(e) => setBio(e.target.value)}\n maxLength={300}\n rows={3}\n className=\"resize-none\"\n disabled={busy}\n />\n </Field>\n\n <Field className=\"gap-2\">\n <Button type=\"submit\" className=\"w-full\" disabled={busy || !activeAccount}>\n {busy && <Loader2 className=\"animate-spin\" />}\n {step ? STEP_LABELS[step.status] : \"Create account\"}\n </Button>\n <FieldDescription aria-live=\"polite\" className={cn(\"min-h-5 leading-5\", error && \"text-destructive\")}>\n {error ?? (step?.status === \"sign\" ? \"Tap again to sign in your wallet.\" : \"You’ll sign a message in your wallet. It’s free.\")}\n </FieldDescription>\n {onBack && (\n <Button type=\"button\" variant=\"ghost\" className=\"w-full\" onClick={onBack} disabled={busy}>\n Back to your accounts\n </Button>\n )}\n </Field>\n </FieldGroup>\n </form>\n )\n}\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../utils\"\n\nconst buttonVariants = cva(\n \"cursor-pointer inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n xl: \"h-[50px] rounded-md px-8 has-[>svg]:px-6\",\n icon: \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","import * as React from \"react\"\nimport { cn } from \"../utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\n\nimport { cn } from \"../utils\"\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn(\n \"relative flex size-8 shrink-0 overflow-hidden rounded-full\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square size-full\", className)}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"bg-muted flex size-full items-center justify-center rounded-full\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","\"use client\"\n\nimport { useMemo } from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../utils\"\n\nimport { Label } from \"./label\"\nimport { Separator } from \"./separator\"\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<\"fieldset\">) {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn(\n \"flex flex-col gap-6\",\n \"has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLegend({\n className,\n variant = \"legend\",\n ...props\n}: React.ComponentProps<\"legend\"> & { variant?: \"legend\" | \"label\" }) {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn(\n \"mb-3 font-medium\",\n \"data-[variant=legend]:text-base\",\n \"data-[variant=label]:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n \"group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst fieldVariants = cva(\n \"group/field flex w-full gap-3 data-[invalid=true]:text-destructive\",\n {\n variants: {\n orientation: {\n vertical: [\"flex-col [&>*]:w-full [&>.sr-only]:w-auto\"],\n horizontal: [\n \"flex-row items-center\",\n \"[&>[data-slot=field-label]]:flex-auto\",\n \"has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n ],\n responsive: [\n \"flex-col @md/field-group:flex-row @md/field-group:items-center [&>*]:w-full @md/field-group:[&>*]:w-auto [&>.sr-only]:w-auto\",\n \"@md/field-group:[&>[data-slot=field-label]]:flex-auto\",\n \"@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n ],\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n },\n }\n)\n\nfunction Field({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof fieldVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"field\"\n data-orientation={orientation}\n className={cn(fieldVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn(\n \"group/field-content flex flex-1 flex-col gap-1.5 leading-snug\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLabel({\n className,\n ...props\n}: React.ComponentProps<typeof Label>) {\n return (\n <Label\n data-slot=\"field-label\"\n className={cn(\n \"group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50\",\n \"has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border [&>*]:data-[slot=field]:p-4\",\n \"has-data-[state=checked]:border-primary has-data-[state=checked]:bg-primary/5 dark:has-data-[state=checked]:bg-primary/10\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-label\"\n className={cn(\n \"flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(\n \"text-sm leading-normal font-normal text-muted-foreground group-has-[[data-orientation=horizontal]]/field:text-balance\",\n \"last:mt-0 nth-last-2:-mt-1 [[data-variant=legend]+&]:-mt-1.5\",\n \"[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n children?: React.ReactNode\n}) {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn(\n \"relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2\",\n className\n )}\n {...props}\n >\n <Separator className=\"absolute inset-0 top-1/2\" />\n {children && (\n <span\n className=\"relative mx-auto block w-fit bg-background px-2 text-muted-foreground\"\n data-slot=\"field-separator-content\"\n >\n {children}\n </span>\n )}\n </div>\n )\n}\n\nfunction FieldError({\n className,\n children,\n errors,\n ...props\n}: React.ComponentProps<\"div\"> & {\n errors?: Array<{ message?: string } | undefined>\n}) {\n const content = useMemo(() => {\n if (children) {\n return children\n }\n\n if (!errors?.length) {\n return null\n }\n\n const uniqueErrors = [\n ...new Map(errors.map((error) => [error?.message, error])).values(),\n ]\n\n if (uniqueErrors?.length == 1) {\n return uniqueErrors[0]?.message\n }\n\n return (\n <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n {uniqueErrors.map(\n (error, index) =>\n error?.message && <li key={index}>{error.message}</li>\n )}\n </ul>\n )\n }, [children, errors])\n\n if (!content) {\n return null\n }\n\n return (\n <div\n role=\"alert\"\n data-slot=\"field-error\"\n className={cn(\"text-sm font-normal text-destructive\", className)}\n {...props}\n >\n {content}\n </div>\n )\n}\n\nexport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n FieldContent,\n FieldTitle,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"../utils\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../utils\"\n\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Textarea } from \"./textarea\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex w-full items-center rounded-md border border-input shadow-xs transition-[color,box-shadow] outline-none dark:bg-input/30\",\n \"h-9 min-w-0 has-[>textarea]:h-auto\",\n\n // Variants based on alignment.\n \"has-[>[data-align=inline-start]]:[&>input]:pl-2\",\n \"has-[>[data-align=inline-end]]:[&>input]:pr-2\",\n \"has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3\",\n \"has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3\",\n\n // Focus state.\n \"has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-[3px] has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50\",\n\n // Error state.\n \"has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-destructive/20 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40\",\n\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]\",\n \"inline-end\":\n \"order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-3 pt-3 group-has-[>input]/input-group:pt-2.5 [.border-b]:pb-3\",\n \"block-end\":\n \"order-last w-full justify-start px-3 pb-3 group-has-[>input]/input-group:pb-2.5 [.border-t]:pt-3\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n \"flex items-center gap-2 text-sm shadow-none\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-2 has-[>svg]:px-2 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"h-8 gap-1.5 rounded-md px-2.5 has-[>svg]:px-2.5\",\n \"icon-xs\":\n \"size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n","import * as React from \"react\"\n\nexport function useMediaQuery(query: string): boolean {\n return React.useSyncExternalStore(\n (onChange) => {\n const media = window.matchMedia(query)\n media.addEventListener(\"change\", onChange)\n return () => media.removeEventListener(\"change\", onChange)\n },\n () => window.matchMedia(query).matches,\n () => false,\n )\n}\n\n// The page's theme: a `dark` or `light` class on <html> (as next-themes and shadcn set it), otherwise\n// the system preference.\nfunction readTheme(): \"light\" | \"dark\" {\n const classes = document.documentElement.classList\n if (classes.contains(\"dark\")) return \"dark\"\n if (classes.contains(\"light\")) return \"light\"\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\"\n}\n\nexport function useDocumentTheme(): \"light\" | \"dark\" {\n return React.useSyncExternalStore(\n (onChange) => {\n const observer = new MutationObserver(onChange)\n observer.observe(document.documentElement, { attributes: true, attributeFilter: [\"class\"] })\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\")\n media.addEventListener(\"change\", onChange)\n return () => {\n observer.disconnect()\n media.removeEventListener(\"change\", onChange)\n }\n },\n readTheme,\n () => \"light\",\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n >\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"text-lg leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\n\nimport { cn } from \"../utils\"\n\nfunction Drawer({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Root>) {\n return <DrawerPrimitive.Root data-slot=\"drawer\" {...props} />\n}\n\nfunction DrawerTrigger({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Trigger>) {\n return <DrawerPrimitive.Trigger data-slot=\"drawer-trigger\" {...props} />\n}\n\nfunction DrawerPortal({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Portal>) {\n return <DrawerPrimitive.Portal data-slot=\"drawer-portal\" {...props} />\n}\n\nfunction DrawerClose({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Close>) {\n return <DrawerPrimitive.Close data-slot=\"drawer-close\" {...props} />\n}\n\nfunction DrawerOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Overlay>) {\n return (\n <DrawerPrimitive.Overlay\n data-slot=\"drawer-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DrawerContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Content>) {\n return (\n <DrawerPortal data-slot=\"drawer-portal\">\n <DrawerOverlay />\n <DrawerPrimitive.Content\n data-slot=\"drawer-content\"\n className={cn(\n \"group/drawer-content bg-background fixed z-50 flex h-auto flex-col\",\n \"data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-lg data-[vaul-drawer-direction=top]:border-b\",\n \"data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-lg data-[vaul-drawer-direction=bottom]:border-t\",\n \"data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:border-l data-[vaul-drawer-direction=right]:sm:max-w-sm\",\n \"data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:border-r data-[vaul-drawer-direction=left]:sm:max-w-sm\",\n className\n )}\n {...props}\n >\n <div className=\"bg-muted mx-auto mt-4 hidden h-2 w-[100px] shrink-0 rounded-full group-data-[vaul-drawer-direction=bottom]/drawer-content:block\" />\n {children}\n </DrawerPrimitive.Content>\n </DrawerPortal>\n )\n}\n\nfunction DrawerHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-header\"\n className={cn(\n \"flex flex-col gap-0.5 p-4 group-data-[vaul-drawer-direction=bottom]/drawer-content:text-center group-data-[vaul-drawer-direction=top]/drawer-content:text-center md:gap-1.5 md:text-left\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DrawerFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction DrawerTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Title>) {\n return (\n <DrawerPrimitive.Title\n data-slot=\"drawer-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction DrawerDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Description>) {\n return (\n <DrawerPrimitive.Description\n data-slot=\"drawer-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Drawer,\n DrawerPortal,\n DrawerOverlay,\n DrawerTrigger,\n DrawerClose,\n DrawerContent,\n DrawerHeader,\n DrawerFooter,\n DrawerTitle,\n DrawerDescription,\n}\n","import * as React from \"react\"\nimport type { ConnectButtonProps } from \"thirdweb/react\"\nimport { useLensAuth } from \"./provider\"\nimport { useDocumentTheme } from \"./dom\"\nimport { Button } from \"./ui/button\"\nimport { cn } from \"./utils\"\n\n// thirdweb's ConnectButton pulls in ~480KB (gzipped) of wallet SDKs (WalletConnect, Coinbase, ...).\n// Loading it on demand keeps that out of every page's initial bundle, so pages hydrate without\n// waiting for it.\nconst ConnectButton = React.lazy(() => import(\"thirdweb/react\").then((m) => ({ default: m.ConnectButton })))\n\nexport type SignInButtonProps = {\n /** Defaults to \"Sign in\" */\n label?: React.ReactNode\n /** Defaults to \"Logout\" */\n signOutLabel?: React.ReactNode\n /** thirdweb modal theme. Defaults to the page's theme (a `dark` class on <html>, or the system's). */\n theme?: \"light\" | \"dark\"\n /** Classes for the placeholder and sign-out buttons. Size the button's wrapper to size them all alike. */\n className?: string\n /** Extra props for thirdweb's ConnectButton (wallets, connectModal, ...) */\n connectButtonProps?: Partial<Omit<ConnectButtonProps, \"client\" | \"chain\" | \"theme\">>\n}\n\n// Connects a wallet (the account dialog then opens to pick or create a Lens account) and signs out.\nexport function SignInButton({ label = \"Sign in\", signOutLabel = \"Logout\", theme, className, connectButtonProps }: SignInButtonProps) {\n const { auth, wallet, status, signOut } = useLensAuth()\n const documentTheme = useDocumentTheme()\n const [mounted, setMounted] = React.useState(false)\n React.useEffect(() => setMounted(true), [])\n\n // Same size as the real button, so nothing shifts when it loads\n const placeholder = (\n <Button variant=\"outline\" size=\"xl\" className={cn(\"min-w-[165px] px-0\", className)} disabled>\n Loading...\n </Button>\n )\n\n // thirdweb's ConnectButton doesn't render the same on the server and the client\n if (!mounted) return placeholder\n\n if (!wallet) {\n return (\n <React.Suspense fallback={placeholder}>\n <ConnectButton\n client={auth.thirdwebClient}\n chain={auth.chain}\n theme={theme ?? documentTheme}\n {...connectButtonProps}\n connectButton={{\n label,\n ...connectButtonProps?.connectButton,\n style: { height: \"50px\", minWidth: \"165px\", ...connectButtonProps?.connectButton?.style },\n }}\n />\n </React.Suspense>\n )\n }\n\n if (status !== \"signed-in\") return placeholder\n\n return (\n <Button variant=\"ghost\" size=\"xl\" className={cn(\"min-w-[165px] px-0\", className)} onClick={signOut}>\n {signOutLabel}\n </Button>\n )\n}\n"],"mappings":"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","names":["React","useActiveAccount","useActiveWallet","React","Loader2","jsx","jsx","jsx","cva","jsx","jsx","jsx","cva","jsx","cva","jsx","cva","jsx","jsx","jsxs","React","jsx","jsxs","jsx","jsx","jsxs","jsx","jsx","jsxs","jsx","jsx","jsxs","jsx","jsx","jsxs","Title","Description","Loader2","jsx","jsxs","useActiveAccount","useActiveWallet","React","jsx"]}
|
package/package.json
CHANGED