RegisterLogin
DocsPricing
RegisterLogin
  • Getting Started
  • Introduction
  • Quick Start
  • SDKs
  • React
  • TypeScript
  • Next.js
  • Express
  • NestJS
  • Python
  • API Reference
  • Support and Resources
  • FAQ
  • Contact Support

AuthSafe

Product

HighlightFeatureIntegrationPricingFAQ

Company

AboutBlogContactSitemap

Developer

DashboardDocumentation

Legal

Terms & ConditionsPrivacyComplianceShippingCancellation

© 2026 AuthSafe. All rights reserved.

We value your privacy

This website uses cookies for anonymous analytics to help us improve your experience. No personal information is stored or shared. You can allow or reject analytics tracking at any time. See our Privacy Policy.

We use cookies for anonymous analytics. No personal info is stored. See our Privacy Policy.

Pre-built Components

Ready-to-use authentication components for quick integration.

SignInButton

Pre-styled button that redirects to sign in flow.

Import

'use client';

import { SignInButton } from 'authsafe-nextjs/client';

Props

interface SignInButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
  redirectTo?: string; // Redirect URL after sign in
  children?: ReactNode; // Custom label (default: "Sign In")
}

Examples

Basic Usage

import { SignInButton } from 'authsafe-nextjs/client';

export function Header() {
  return <SignInButton>Sign In</SignInButton>;
}

With Redirect

import { SignInButton } from 'authsafe-nextjs/client';

export function LandingPage() {
  return <SignInButton redirectTo="/dashboard">Get Started</SignInButton>;
}

Custom Styling

import { SignInButton } from 'authsafe-nextjs/client';

export function CTAButton() {
  return (
    <SignInButton
      redirectTo="/onboarding"
      className="px-6 py-3 bg-blue-600 text-white rounded-lg font-semibold hover:bg-blue-700 transition"
    >
      Start Free Trial
    </SignInButton>
  );
}

Loading State

import { SignInButton } from 'authsafe-nextjs/client';
import { useAuth } from 'authsafe-nextjs/client';

export function LoginButton() {
  const { isLoading } = useAuth();

  return (
    <SignInButton disabled={isLoading}>
      {isLoading ? 'Redirecting...' : 'Sign In'}
    </SignInButton>
  );
}

SignOutButton

Pre-styled button that signs out the user and clears session.

Import

'use client';

import { SignOutButton } from 'authsafe-nextjs/client';

Props

interface SignOutButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
  redirectTo?: string; // Redirect URL after sign out
  children?: ReactNode; // Custom label (default: "Sign Out")
}

Examples

Basic Usage

import { SignOutButton } from 'authsafe-nextjs/client';

export function UserMenu() {
  return <SignOutButton>Logout</SignOutButton>;
}

With Redirect

import { SignOutButton } from 'authsafe-nextjs/client';

export function NavBar() {
  return <SignOutButton redirectTo="/">Sign Out</SignOutButton>;
}

Custom Styling

import { SignOutButton } from 'authsafe-nextjs/client';

export function ProfilePage() {
  return (
    <SignOutButton
      redirectTo="/goodbye"
      className="text-red-600 hover:text-red-800 underline"
    >
      Logout
    </SignOutButton>
  );
}

With Confirmation

import { SignOutButton } from 'authsafe-nextjs/client';

export function LogoutButton() {
  const handleClick = (e: React.MouseEvent) => {
    if (!confirm('Are you sure you want to sign out?')) {
      e.preventDefault();
    }
  };

  return <SignOutButton onClick={handleClick}>Sign Out</SignOutButton>;
}

UserButton

User button with dropdown menu showing user info and sign out option.

Import

'use client';

import { UserButton } from 'authsafe-nextjs/client';

Props

interface UserButtonProps {
  showEmail?: boolean; // Show email (default: true)
  showSignOut?: boolean; // Show sign out button (default: true)
  children?: (user: { email: string; name?: string }) => ReactNode; // Custom renderer
}

Examples

Basic Usage

import { UserButton } from 'authsafe-nextjs/client';

export function Header() {
  return <UserButton showEmail showSignOut />;
}

Custom Renderer

import { UserButton } from 'authsafe-nextjs/client';

export function CustomUserButton() {
  return (
    <UserButton>
      {(user) => (
        <div className="flex items-center gap-2">
          <div className="w-8 h-8 rounded-full bg-blue-600 flex items-center justify-center text-white font-semibold">
            {user.name?.[0] || user.email[0]}
          </div>
          <span>{user.email}</span>
        </div>
      )}
    </UserButton>
  );
}

Dropdown Menu

'use client';

import { useAuth } from 'authsafe-nextjs/client';
import { useState } from 'react';

export function UserDropdown() {
  const { user, signOut } = useAuth();
  const [isOpen, setIsOpen] = useState(false);

  if (!user) return null;

  return (
    <div className="relative">
      <button
        onClick={() => setIsOpen(!isOpen)}
        className="flex items-center gap-2 px-3 py-2 rounded-lg hover:bg-gray-100"
      >
        <div className="w-8 h-8 rounded-full bg-gradient-to-r from-blue-500 to-purple-600 flex items-center justify-center text-white text-sm font-bold">
          {user.name?.[0] || user.email[0]}
        </div>
        <span className="text-sm font-medium">{user.email}</span>
      </button>

      {isOpen && (
        <div className="absolute right-0 mt-2 w-48 bg-white rounded-lg shadow-lg border py-1">
          <a
            href="/profile"
            className="block px-4 py-2 text-sm hover:bg-gray-100"
          >
            Profile
          </a>
          <a
            href="/settings"
            className="block px-4 py-2 text-sm hover:bg-gray-100"
          >
            Settings
          </a>
          <hr className="my-1" />
          <button
            onClick={() => signOut()}
            className="w-full text-left px-4 py-2 text-sm text-red-600 hover:bg-gray-100"
          >
            Sign Out
          </button>
        </div>
      )}
    </div>
  );
}

Complete Example: Navigation Bar

'use client';

import { useAuth, SignInButton, SignOutButton } from 'authsafe-nextjs/client';
import Link from 'next/link';
import { useState } from 'react';

export function NavigationBar() {
  const { isAuthenticated, user, isLoading } = useAuth();
  const [isDropdownOpen, setIsDropdownOpen] = useState(false);

  return (
    <nav className="bg-white shadow-sm border-b">
      <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
        <div className="flex justify-between h-16">
          {/* Logo */}
          <div className="flex items-center">
            <Link href="/" className="text-2xl font-bold text-blue-600">
              MyApp
            </Link>
          </div>

          {/* Navigation Links */}
          <div className="flex items-center gap-6">
            <Link href="/about" className="text-gray-700 hover:text-gray-900">
              About
            </Link>
            <Link href="/pricing" className="text-gray-700 hover:text-gray-900">
              Pricing
            </Link>

            {/* Auth Section */}
            {isLoading ? (
              <div className="w-20 h-10 bg-gray-200 animate-pulse rounded"></div>
            ) : isAuthenticated && user ? (
              <div className="relative">
                <button
                  onClick={() => setIsDropdownOpen(!isDropdownOpen)}
                  className="flex items-center gap-2 px-3 py-2 rounded-lg hover:bg-gray-100"
                >
                  <div className="w-8 h-8 rounded-full bg-gradient-to-r from-blue-500 to-purple-600 flex items-center justify-center text-white text-sm font-bold">
                    {user.name?.[0]?.toUpperCase() ||
                      user.email[0].toUpperCase()}
                  </div>
                  <span className="text-sm font-medium">
                    {user.name || user.email}
                  </span>
                  <svg
                    className="w-4 h-4"
                    fill="currentColor"
                    viewBox="0 0 20 20"
                  >
                    <path
                      fillRule="evenodd"
                      d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
                      clipRule="evenodd"
                    />
                  </svg>
                </button>

                {isDropdownOpen && (
                  <>
                    <div
                      className="fixed inset-0 z-10"
                      onClick={() => setIsDropdownOpen(false)}
                    ></div>
                    <div className="absolute right-0 mt-2 w-56 bg-white rounded-lg shadow-lg border py-1 z-20">
                      <div className="px-4 py-3 border-b">
                        <p className="text-sm font-medium text-gray-900">
                          {user.name}
                        </p>
                        <p className="text-xs text-gray-500">{user.email}</p>
                      </div>
                      <Link
                        href="/dashboard"
                        className="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100"
                        onClick={() => setIsDropdownOpen(false)}
                      >
                        Dashboard
                      </Link>
                      <Link
                        href="/profile"
                        className="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100"
                        onClick={() => setIsDropdownOpen(false)}
                      >
                        Profile
                      </Link>
                      <Link
                        href="/settings"
                        className="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100"
                        onClick={() => setIsDropdownOpen(false)}
                      >
                        Settings
                      </Link>
                      <hr className="my-1" />
                      <div className="px-2 py-1">
                        <SignOutButton
                          redirectTo="/"
                          className="w-full text-left px-2 py-2 text-sm text-red-600 hover:bg-red-50 rounded"
                        >
                          Sign Out
                        </SignOutButton>
                      </div>
                    </div>
                  </>
                )}
              </div>
            ) : (
              <SignInButton
                redirectTo="/dashboard"
                className="px-4 py-2 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 transition"
              >
                Sign In
              </SignInButton>
            )}
          </div>
        </div>
      </div>
    </nav>
  );
}

Customization

All components accept standard HTML button props and can be fully customized:
<SignInButton
  className="your-custom-classes"
  style={
    {
      /* your custom styles */
    }
  }
  onClick={handleClick}
  disabled={someCondition}
>
  Custom Label
</SignInButton>

Related

  • useAuth() - Authentication hook for custom components
  • Profile Component - Full profile management UI
  • AuthProvider - Required provider