{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "anonymous",
  "title": "Anonymous",
  "description": "Adds a Continue as guest button backed by Better Auth's anonymous plugin.",
  "dependencies": [
    "@better-auth-ui/react@latest",
    "@better-auth-ui/core@latest",
    "better-auth",
    "lucide-react"
  ],
  "registryDependencies": [
    "button",
    "spinner"
  ],
  "files": [
    {
      "path": "src/lib/auth/auth-plugin.ts",
      "content": "import type {\n  AuthPluginComponents,\n  AuthPlugin as AuthPluginPrimitive\n} from \"@better-auth-ui/react\"\n\ndeclare module \"@better-auth-ui/core\" {\n  /** Widens `useAuth().plugins` to the shadcn-typed `AuthPlugin`. */\n  interface AuthPluginRegister {\n    shadcn: AuthPlugin\n  }\n}\n\n/** Props the shadcn `<Auth>` router spreads onto plugin-contributed auth views. */\nexport type AuthViewProps = {\n  className?: string\n  socialLayout?: \"auto\" | \"horizontal\" | \"vertical\" | \"grid\"\n  socialPosition?: \"top\" | \"bottom\"\n}\n\n/** Props the shadcn `<Settings>` router spreads onto plugin-contributed settings views. */\nexport type SettingsViewProps = {\n  className?: string\n}\n\n/** Shadcn plugin type. Plugin authors import this from `@/lib/auth/auth-plugin`. */\nexport type AuthPlugin = AuthPluginPrimitive<\n  AuthPluginComponents,\n  AuthViewProps,\n  SettingsViewProps\n>\n",
      "type": "registry:lib",
      "target": "@lib/auth/auth-plugin.ts"
    },
    {
      "path": "src/lib/auth/anonymous-plugin.ts",
      "content": "import { createAuthPlugin } from \"@better-auth-ui/core\"\nimport {\n  type AnonymousPluginOptions,\n  anonymousPlugin as coreAnonymousPlugin\n} from \"@better-auth-ui/core/plugins\"\n\nimport { AnonymousButton } from \"@/components/auth/anonymous/anonymous-button\"\n\nexport const anonymousPlugin = createAuthPlugin(\n  coreAnonymousPlugin.id,\n  (options: AnonymousPluginOptions = {}) => ({\n    ...coreAnonymousPlugin(options),\n    authButtons: [AnonymousButton]\n  })\n)\n",
      "type": "registry:lib",
      "target": "@lib/auth/anonymous-plugin.ts"
    },
    {
      "path": "src/components/auth/anonymous/anonymous-button.tsx",
      "content": "\"use client\"\n\nimport { authMutationKeys } from \"@better-auth-ui/core\"\nimport {\n  type AnonymousAuthClient,\n  useAuth,\n  useAuthPlugin,\n  useSignInAnonymous\n} from \"@better-auth-ui/react\"\nimport { useIsMutating } from \"@tanstack/react-query\"\nimport { UserRound } from \"lucide-react\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { Spinner } from \"@/components/ui/spinner\"\nimport { anonymousPlugin } from \"@/lib/auth/anonymous-plugin\"\nimport { cn } from \"@/lib/utils\"\n\n/** Sign in with a temporary anonymous account. */\nexport function AnonymousButton() {\n  const { authClient, navigate, redirectTo } = useAuth()\n  const { localization } = useAuthPlugin(anonymousPlugin)\n  const { mutate: signInAnonymous, isPending: anonymousPending } =\n    useSignInAnonymous(authClient as AnonymousAuthClient, {\n      onSuccess: () => navigate({ to: redirectTo })\n    })\n\n  const signInMutating = useIsMutating({\n    mutationKey: authMutationKeys.signIn.all\n  })\n  const signUpMutating = useIsMutating({\n    mutationKey: authMutationKeys.signUp.all\n  })\n  const isPending = signInMutating + signUpMutating > 0\n\n  return (\n    <Button\n      type=\"button\"\n      variant=\"outline\"\n      disabled={isPending}\n      className={cn(\"w-full\", isPending && \"pointer-events-none\")}\n      onClick={() => signInAnonymous()}\n    >\n      {anonymousPending ? (\n        <Spinner data-icon=\"inline-start\" />\n      ) : (\n        <UserRound data-icon=\"inline-start\" />\n      )}\n      {localization.continueAsGuest}\n    </Button>\n  )\n}\n",
      "type": "registry:component",
      "target": "@components/auth/anonymous/anonymous-button.tsx"
    }
  ],
  "type": "registry:component"
}