Skip to content
Create account or Sign in
The Stripe Docs logo
/
Ask AI
Create accountSign in
Get started
Payments
Revenue
Platforms and marketplaces
Money management
Developer resources
APIs & SDKsHelp
Overview
About Stripe payments
Upgrade your integration
Payments analytics
Online payments
OverviewFind your use caseUse Managed Payments
Use Payment Links
Use a prebuilt checkout page
Build a custom integration with Elements
    Overview
    Quickstart guides
    Stripe Elements
    Compare Checkout Sessions and PaymentIntents
    Design an advanced integration
    Customize look and feel
    Manage payment methods
    Collect additional information
    Build a subscriptions integration
    Dynamic updates
    Add discounts
    Collect taxes on your payments
    Redeem credits
    Let customers pay in their local currency
    Save and retrieve customer payment methods
    Send receipts and paid invoices
    Manually approve payments on your server
    Authorize and capture a payment separately
    Elements with Checkout Sessions API beta changelog
Build an in-app integration
In-person payments
Terminal
Payment methods
Add payment methods
Manage payment methods
Faster checkout with Link
Payment scenarios
Handle multiple currencies
Custom payment flows
Flexible acquiring
Orchestration
Beyond payments
Incorporate your company
Crypto
Agentic commerce
Financial Connections
Climate
Understand fraud
Radar fraud protection
Manage disputes
Verify identities
United States
English (United States)
HomePaymentsBuild a custom integration with Elements

Elements Appearance API

Customize the look and feel of Elements to match the design of your site.

Stripe Elements supports visual customization, which allows you to match the design of your site with the appearance option. The layout of each Element stays consistent, but you can modify colors, fonts, borders, padding, and more.

  1. Pick a prebuilt theme that most closely resembles your website.
  2. Customize the theme using inputs and labels. You can also set variables, such as the fontFamily and colorPrimary to broadly customize components appearing throughout each Element.
  3. If needed, fine-tune individual components and states using rules.

For complete control, specify custom CSS properties for individual components appearing in the Element.

Note

The Elements Appearance API doesn’t support individual payment method Elements (such as CardElement). Use the Style object to customize your Element instead.

Customer location
Layout

Themes

Start customizing Elements by selecting one of the following themes:

  • stripe
  • night
  • flat
const appearance = { theme: 'night' }; // Pass the appearance object when initializing checkout const checkout = stripe.initCheckout({clientSecret, elementsOptions: {appearance}});

Inputs and labels

Customize the appearance of input fields and their associated labels.

Layout
Inputs
Labels
Checkout.js
const appearance = { inputs: 'spaced', labels: 'auto' }

Inputs

Choose the style of input fields to suit your design.

VariantDescription
spacedEach input field has space surrounding it. This is the default option.
condensedRelated input fields are grouped together without space between them.

Labels

Control the position and visibility of labels associated with input fields.

VariantDescription
autoLabels adjust based on the input variant. When inputs are spaced, labels are above. When inputs are condensed, labels are floating. This is the default option.
aboveLabels are positioned above the corresponding input fields.
floatingLabels float within the input fields.

Variables

Set variables to affect the appearance of many components appearing throughout each Element.

Payment form with card input fields, major credit card icons, and Klarna payment option, with labeled Appearance API variables for colors and styling.

The variables option works like CSS variables. You can specify CSS values for each variable and reference other variables with the var(--myVariable) syntax. You can even inspect the resulting DOM using the DOM explorer in your browser.

const appearance = { theme: 'stripe', variables: { colorPrimary: '#0570de', colorBackground: '#ffffff', colorText: '#30313d', colorDanger: '#df1b41', fontFamily: 'Ideal Sans, system-ui, sans-serif', spacingUnit: '2px', borderRadius: '4px', // See all possible variables below } }; // Pass the appearance object when initializing checkout const checkout = stripe.initCheckout({clientSecret, elementsOptions: {appearance}});

Commonly used variables

VariableDescription
fontFamilyThe font family used throughout Elements. Elements supports custom fonts by passing the fonts option to the Elements group.
fontSizeBaseThe font size that’s set on the root of the Element. By default, other font size variables such as fontSizeXs or fontSizeSm are scaled from this value using rem units. Make sure that you choose a font size of at least 16px for input fields on mobile.
spacingUnitThe base spacing unit that all other spacing is derived from. Increase or decrease this value to make your layout more or less spacious.
borderRadiusThe border radius used for tabs, inputs, and other components in the Element.
colorPrimaryA primary color used throughout the Element. Set this to your primary brand color.
colorBackgroundThe color used for the background of inputs, tabs, and other components in the Element.
colorTextThe default text color used in the Element.
colorDangerA color used to indicate errors or destructive actions in the Element.

Less commonly used variables

Rules

The rules option is a map of CSS-like selectors to CSS properties, allowing granular customization of individual components. After defining your theme and variables, use rules to seamlessly integrate Elements to match the design of your site.

const appearance = { rules: { '.Tab': { border: '1px solid #E0E6EB', boxShadow: '0px 1px 1px rgba(0, 0, 0, 0.03), 0px 3px 6px rgba(18, 42, 66, 0.02)', }, '.Tab:hover': { color: 'var(--colorText)', }, '.Tab--selected': { borderColor: '#E0E6EB', boxShadow: '0px 1px 1px rgba(0, 0, 0, 0.03), 0px 3px 6px rgba(18, 42, 66, 0.02), 0 0 0 2px var(--colorPrimary)', }, '.Input--invalid': { boxShadow: '0 1px 1px 0 rgba(0, 0, 0, 0.07), 0 0 0 2px var(--colorDanger)', }, // See all supported class names and selector syntax below } }; // Pass the appearance object when initializing checkout const checkout = stripe.initCheckout({clientSecret, elementsOptions: {appearance}});

All rules

The selector for a rule can target any of the public class names in the Element, as well as the supported states, pseudo-classes, and pseudo-elements for each class. For example, the following are valid selectors:

  • .Tab, .Label, .Input
  • .Tab:focus
  • .Input--invalid, .Label--invalid
  • .Input::placeholder

The following are not valid selectors:

  • .p-SomePrivateClass, img, only public class names can be targeted
  • .Tab .TabLabel, ancestor-descendant relationships in selectors are unsupported
  • .Tab--invalid, the .Tab class does not support the --invalid state

Each class name used in a selector supports an allowlist of CSS properties, that you specify using camel case (for example, boxShadow for the box-shadow property).

The following is the complete list of supported class names and corresponding states, pseudo-classes, and pseudo-elements.

Tabs

Class nameStates Pseudo-classesPseudo-elements
.Tab--selected:hover, :focus, :active, :disabled
.TabIcon--selected:hover, :focus, :active, :disabled
.TabLabel--selected:hover, :focus, :active, :disabled

Inputs (above labels)

Make sure that you choose a font size of at least 16px for input fields on mobile.

Class nameStates Pseudo-classesPseudo-elements
.Label--empty, --invalid, --focused
.Input--empty, --invalid:hover, :focus, :disabled, :autofill::placeholder, ::selection
.Error

Inputs (floating labels)

Note

You can enable floating labels as an additional configuration option.

Class nameStates Pseudo-classesPseudo-elements
.Label--empty, --invalid, --focused, --floating, --resting
.Input--empty, --invalid:hover, :focus, :disabled, :autofill::placeholder, ::selection
.Error

Block

Class nameStates Pseudo-classesPseudo-elements
.Block
.BlockDivider
.BlockAction--negative:hover, :focus, :active

Code Input

Class nameStates Pseudo-classesPseudo-elements
.CodeInput:hover, :focus, :disabled

Checkbox

Class nameStates Pseudo-classesPseudo-elements
.Checkbox--checked
.CheckboxLabel--checked:hover, :focus, :focus-visible
.CheckboxInput--checked:hover, :focus, :focus-visible

Dropdown

Class nameStates Pseudo-classesPseudo-elements
.Dropdown
.DropdownItem--highlight:active

Note

Dropdown styling is limited on macOS. The appearance API for dropdowns primarily affects Windows systems. On macOS, you can’t style system dropdowns, such as the country selector, using these rules because of operating system restrictions.

Switch

Class nameStates Pseudo-classesPseudo-elements
.Switch--active:hover
.SwitchControl:hover

Picker

Class nameStates Pseudo-classesPseudo-elements
.PickerItem--selected, --highlight, --new, --disabled:hover, :focus, :active
.PickerAction:hover, :focus, :active

Make sure your .PickerItem active state stands out from the other states.

DO

Use a noticeable, high-contrast primary color, weight, and/or outline to distinguish the active state your customer has already selected.

DON’T

Don’t use two equally weighted options or low-contrast colors for your .PickerItem states because it makes distinguishing which one is active more difficult.

Menu

Class nameStates Pseudo-classesPseudo-elements
.Menu
.MenuIcon--open:hover
.MenuAction--negative:hover, :focus, :active

Accordion

Class nameStates Pseudo-classesPseudo-elements
.AccordionItem--selected:hover, :focus-visible

Payment Method Messaging Element

Class nameStates Pseudo-classesPseudo-elements
.PaymentMethodMessaging

Radio Icon

Class nameStates Pseudo-classesPseudo-elements
.RadioIcon
.RadioIconOuter--checked, --hovered
.RadioIconInner--checked, --hovered

You can control the overall size of the icon with the width property on .RadioIcon. You can control the relative size of .RadioIconInner with the r (radius) property. .RadioIconOuter and .RadioIconInner are SVG elements and can be styled with stroke and fill properties. See the full list of supported CSS properties below.

const appearance = { rules: { '.RadioIcon': { width: '24px' }, '.RadioIconOuter': { stroke: '#E0E6EB' }, '.RadioIconInner': { r: '16' } } };

Toggle

Class nameStates Pseudo-classesPseudo-elements
.ToggleItem--selected:active, :hover, :focus, :disabled

Supported CSS properties

Other configuration options

In addition to themes, labels, inputs, variables and rules, you can style Elements using other appearance configuration options.

You can customize these by adding them to the appearance object:

const appearance = { disableAnimations: true, // other configurations such as `theme`, `labels`, `inputs`, `variables` and `rules`... }

We currently support the below options:

ConfigurationDescription
disableAnimationsDisables animations throughout Elements. Boolean, defaults to false.
Was this page helpful?
YesNo
  • Need help? Contact Support.
  • Check out our changelog.
  • Questions? Contact Sales.
  • LLM? Read llms.txt.
  • Powered by Markdoc