Custom theme
UI components are fully customizable so you can match your app’s branding.
What you can customize in the pre-built authentication component:
- Overall theme: colors, radius, illustrations, custom css
- Header: text, logo, custom component
- External wallet connectors: featured wallets, specify order, chain filtering (EVM/Solana), WalletConnect, and more via
configForExternalWallets()
. See EOA connectors for more details.
Need to set up Tailwind first? See the complete Tailwind setup guide for installation and configuration instructions.
Theme
Theme customizations and styling are passed through withAccountKitUi
, the Account Kit Tailwind plugin, in your tailwind.config.js
file.
Colors
The Account Kit Theme object passed to withAccountKitUi
supports an overridable colors
object which accepts a set of color values. Each color is a key-value pair where the key is the name of the color and the value is an object containing the light
and dark
mode value to use.
Border colors
active
- the color of the border when the input is focusedstatic
- the color of the border when the input is not focusedcritical
- the color of the border when the input is in an error state
Button colors
These colors affect the background of buttons
btn-primary
- the color of the primary buttonbtn-secondary
- the color of the secondary buttonbtn-auth
- the color of the authentication button
Foreground colors
These colors primarily affect the text color of the components
fg-primary
- the color of the primary textfg-secondary
- the color of the secondary textfg-tertiary
- the color of the tertiary textfg-invert
- the color of the inverted textfg-disabled
- the color of the disabled textfg-accent-brand
- your brand colorfg-critical
- the color of the critical text
Surface colors
These colors affect the background of various components (eg. modal, inputs, etc)
bg-surface-default
- the default background colorbg-surface-subtle
- a subtle background colorbg-surface-inset
- the background color of inset componentsbg-surface-critical
- the background color of critical componentsbg-surface-error
- the background color of error componentsbg-surface-success
- the background color of success componentsbg-surface-warning
- the background color of warning components
Example
import { const withAccountKitUi: (config: Partial<Config>, themeOverride?: AccountKitThemeOverride) => ConfigA utility function for augmenting an existing tailwind config with the account kit ui components
withAccountKitUi, const createColorSet: (light: string, dark: string) => ColorVariantRecordCreates a color object to be used within account kit utilities, components, and themes
createColorSet } from "@account-kit/react/tailwind";
export const const tailwindConfig: UserConfigtailwindConfig = function withAccountKitUi(config: Partial<Config>, themeOverride?: AccountKitThemeOverride): ConfigA utility function for augmenting an existing tailwind config with the account kit ui components
withAccountKitUi(
{
content?: ContentFile[] | {
relative?: boolean;
files: ContentFile[];
} | undefinedcontent: [],
// your tailwind config
},
{
colors?: {
active?: {
dark?: string | undefined;
light?: string | undefined;
} | undefined;
static?: {
dark?: string | undefined;
light?: string | undefined;
} | undefined;
critical?: {
dark?: string | undefined;
light?: string | undefined;
} | undefined;
... 17 more ...;
"bg-surface-error"?: {
dark?: string | undefined;
light?: string | undefined;
} | undefined;
} | undefinedcolors: {
active?: {
dark?: string | undefined;
light?: string | undefined;
} | undefinedactive: function createColorSet(light: string, dark: string): ColorVariantRecordCreates a color object to be used within account kit utilities, components, and themes
createColorSet("#94A3B8", "#94A3B8"),
},
},
);
Customizing Multiple Colors
You can customize multiple color properties at once for comprehensive theming:
Available Color Variables
Account Kit supports these color customizations:
Border Colors:
active
- Border color when input is focusedstatic
- Border color when input is not focusedcritical
- Border color for error states
Button Colors:
btn-primary
- Primary button backgroundbtn-secondary
- Secondary button backgroundbtn-auth
- Authentication button background
Text Colors:
fg-primary
- Primary text colorfg-secondary
- Secondary text colorfg-tertiary
- Tertiary text colorfg-invert
- Inverted text colorfg-disabled
- Disabled text colorfg-accent-brand
- Brand accent colorfg-critical
- Critical/error text color
Background Colors:
bg-surface-default
- Default backgroundbg-surface-subtle
- Subtle backgroundbg-surface-inset
- Inset component backgroundbg-surface-critical
- Critical component backgroundbg-surface-error
- Error component backgroundbg-surface-success
- Success component backgroundbg-surface-warning
- Warning component background
Borders
Similar to colors, the Account Theme object passed to withAccountKitUi
supports an overridable borderRadius
field to customize the border radius size. The default value is sm
which is an 8px
border radius.
import { const withAccountKitUi: (config: Partial<Config>, themeOverride?: AccountKitThemeOverride) => ConfigA utility function for augmenting an existing tailwind config with the account kit ui components
withAccountKitUi } from "@account-kit/react/tailwind";
export const const tailwindConfig: UserConfigtailwindConfig = function withAccountKitUi(config: Partial<Config>, themeOverride?: AccountKitThemeOverride): ConfigA utility function for augmenting an existing tailwind config with the account kit ui components
withAccountKitUi(
{
content?: ContentFile[] | {
relative?: boolean;
files: ContentFile[];
} | undefinedcontent: [],
// your tailwind config
},
{
borderRadius?: "none" | "xs" | "sm" | "md" | "lg" | undefinedborderRadius: "md",
},
);
The available options are:
none
(0px)xs
(4px)sm
(8px)md
(16px)lg
(24px)
Illustration styles
Unlike colors and border radius, illustration styles are not passed through the Tailwind plugin.
Customize the illustration style of various icons used in the components by passing one of the enum values to illustrationStyle
in your uiConfig
when you call createConfig
.
import { const createConfig: (props: CreateConfigProps, ui?: AlchemyAccountsUIConfig) => AlchemyAccountsConfigWithUIWraps the createConfig
that is exported from @aa-sdk/core
to allow passing an additional argument, the configuration object for the Auth Components UI (the modal and AuthCard).
createConfig } from "@account-kit/react";
import { const sepolia: Chainsepolia, function alchemy(config: AlchemyTransportConfig): AlchemyTransportCreates an Alchemy transport with the specified configuration options. When sending all traffic to Alchemy, you must pass in one of rpcUrl, apiKey, or jwt. If you want to send Bundler and Paymaster traffic to Alchemy and Node traffic to a different RPC, you must pass in alchemyConnection and nodeRpcUrl.
alchemy } from "@account-kit/infra";
const const config: AlchemyAccountsConfigWithUIconfig = function createConfig(props: CreateConfigProps, ui?: AlchemyAccountsUIConfig): AlchemyAccountsConfigWithUIWraps the createConfig
that is exported from @aa-sdk/core
to allow passing an additional argument, the configuration object for the Auth Components UI (the modal and AuthCard).
createConfig(
{
transport: AlchemyTransporttransport: function alchemy(config: AlchemyTransportConfig): AlchemyTransportCreates an Alchemy transport with the specified configuration options. When sending all traffic to Alchemy, you must pass in one of rpcUrl, apiKey, or jwt. If you want to send Bundler and Paymaster traffic to Alchemy and Node traffic to a different RPC, you must pass in alchemyConnection and nodeRpcUrl.
alchemy({ apiKey: stringapiKey: "YOUR_KEY" }),
chain: Chainchain: const sepolia: Chainsepolia,
},
{
// ... other ui config options
illustrationStyle?: "outline" | "linear" | "filled" | "flat" | undefinedillustrationStyle: "outline",
},
);
Branding the header
To customize the header, you can override either of the header
or hideSignInText
options of the auth
config when calling createConfig
.
Changing the header text
The auth modal, by default, shows a Sign in
text header.
In this example, we hide the default header text and replace it with our own.
import { const createConfig: (props: CreateConfigProps, ui?: AlchemyAccountsUIConfig) => AlchemyAccountsConfigWithUIWraps the createConfig
that is exported from @aa-sdk/core
to allow passing an additional argument, the configuration object for the Auth Components UI (the modal and AuthCard).
createConfig } from "@account-kit/react";
import { const sepolia: Chainsepolia, function alchemy(config: AlchemyTransportConfig): AlchemyTransportCreates an Alchemy transport with the specified configuration options. When sending all traffic to Alchemy, you must pass in one of rpcUrl, apiKey, or jwt. If you want to send Bundler and Paymaster traffic to Alchemy and Node traffic to a different RPC, you must pass in alchemyConnection and nodeRpcUrl.
alchemy } from "@account-kit/infra";
export const const config: AlchemyAccountsConfigWithUIconfig = function createConfig(props: CreateConfigProps, ui?: AlchemyAccountsUIConfig): AlchemyAccountsConfigWithUIWraps the createConfig
that is exported from @aa-sdk/core
to allow passing an additional argument, the configuration object for the Auth Components UI (the modal and AuthCard).
createConfig(
{
transport: AlchemyTransporttransport: function alchemy(config: AlchemyTransportConfig): AlchemyTransportCreates an Alchemy transport with the specified configuration options. When sending all traffic to Alchemy, you must pass in one of rpcUrl, apiKey, or jwt. If you want to send Bundler and Paymaster traffic to Alchemy and Node traffic to a different RPC, you must pass in alchemyConnection and nodeRpcUrl.
alchemy({ apiKey: stringapiKey: "YOUR_API_KEY" }),
chain: Chainchain: const sepolia: Chainsepolia,
},
{
auth?: {
addPasskeyOnSignup?: boolean;
header?: React.ReactNode;
hideError?: boolean;
onAuthSuccess?: () => void;
sections: AuthType[][];
hideSignInText?: boolean;
} | undefinedauth: {
header?: React.ReactNodeheader: "Sign in with your account",
hideSignInText?: boolean | undefinedWhether to show the "Sign in" header text in the first auth step
hideSignInText: true,
},
},
);
Adding an icon
In this example, we leave the Sign in
text in the modal and add an icon above it.
import { const createConfig: (props: CreateConfigProps, ui?: AlchemyAccountsUIConfig) => AlchemyAccountsConfigWithUIWraps the createConfig
that is exported from @aa-sdk/core
to allow passing an additional argument, the configuration object for the Auth Components UI (the modal and AuthCard).
createConfig } from "@account-kit/react";
import { const sepolia: Chainsepolia, function alchemy(config: AlchemyTransportConfig): AlchemyTransportCreates an Alchemy transport with the specified configuration options. When sending all traffic to Alchemy, you must pass in one of rpcUrl, apiKey, or jwt. If you want to send Bundler and Paymaster traffic to Alchemy and Node traffic to a different RPC, you must pass in alchemyConnection and nodeRpcUrl.
alchemy } from "@account-kit/infra";
export const const config: AlchemyAccountsConfigWithUIconfig = function createConfig(props: CreateConfigProps, ui?: AlchemyAccountsUIConfig): AlchemyAccountsConfigWithUIWraps the createConfig
that is exported from @aa-sdk/core
to allow passing an additional argument, the configuration object for the Auth Components UI (the modal and AuthCard).
createConfig(
{
transport: AlchemyTransporttransport: function alchemy(config: AlchemyTransportConfig): AlchemyTransportCreates an Alchemy transport with the specified configuration options. When sending all traffic to Alchemy, you must pass in one of rpcUrl, apiKey, or jwt. If you want to send Bundler and Paymaster traffic to Alchemy and Node traffic to a different RPC, you must pass in alchemyConnection and nodeRpcUrl.
alchemy({ apiKey: stringapiKey: "YOUR_API_KEY" }),
chain: Chainchain: const sepolia: Chainsepolia,
},
{
auth?: {
addPasskeyOnSignup?: boolean;
header?: React.ReactNode;
hideError?: boolean;
onAuthSuccess?: () => void;
sections: AuthType[][];
hideSignInText?: boolean;
} | undefinedauth: {
header?: React.ReactNodeheader: <React.JSX.IntrinsicElements.img: React.DetailedHTMLProps<React.ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>img React.ImgHTMLAttributes<HTMLImageElement>.src?: string | undefinedsrc="img.src" />,
},
},
);