Skip to content

Button Tokens

Button tokens are defined in bambi.css (installed by the CLI) and consumed by button.css (installed alongside the component). Component tokens are namespaced --bambi-button-*; intent and state tokens are shared across components.

Override them in :root (global) or on a selector (scoped):

/* global override */
:root {
--bambi-button-radius: 9999px;
--bambi-state-hover-opacity: 0.85;
}
/* scoped to a container */
.my-card {
--bambi-button-radius: 0;
--bambi-intent-primary-bg: oklch(55% 0.2 160);
}

TokenDefaultResolved value
--bambi-button-gapvar(--bambi-space-1-5)0.375rem
--bambi-button-border-width1px
--bambi-button-line-height1
--bambi-button-font-familyvar(--bambi-font-sans)system-ui, sans-serif
--bambi-button-font-weightvar(--bambi-font-weight-medium)500
--bambi-button-font-size-smvar(--bambi-text-xs)0.75rem
--bambi-button-font-size-mdvar(--bambi-text-sm)0.875rem
--bambi-button-font-size-lgvar(--bambi-text-base)1rem

TokenDefault
--bambi-button-padding-sm0.375rem 0.75rem
--bambi-button-padding-md0.5rem 1rem
--bambi-button-padding-lg0.625rem 1.25rem
--bambi-button-padding-icon0.5rem

TokenDefaultResolved value
--bambi-button-radiusvar(--bambi-radius-md)0.5rem

All button sizes share --bambi-button-radius. The loading spinner uses --bambi-radius-full (9999px) directly.


TokenDefaultResolved value
--bambi-button-transitionbackground-color 0.15s ease, border-color 0.15s ease, color 0.15s ease, opacity 0.15s ease
--bambi-state-hover-opacity1
--bambi-button-disabled-opacityvar(--bambi-state-disabled-opacity)0.5
--bambi-button-focus-ring-widthvar(--bambi-state-focus-ring-width)2px
--bambi-button-focus-ring-offsetvar(--bambi-state-focus-ring-offset)2px
--bambi-button-ringvar(--bambi-state-focus-ring)oklch(55% 0.220 271) ¹

¹ Resolves to oklch(65% 0.220 271) in dark mode.


TokenDefault
--bambi-button-spinner-border-width2px
--bambi-button-spinner-duration0.6s

Color tokens resolve from the global theme and change between light and dark mode. Values shown are light mode defaults.

TokenDefaultLight value
--bambi-intent-primary-bgvar(--bambi-primary)oklch(55% 0.22 250)
--bambi-intent-primary-fgvar(--bambi-primary-foreground)oklch(98% 0 0)
TokenDefaultLight value
--bambi-intent-secondary-bgvar(--bambi-secondary)oklch(96% 0 0)
--bambi-intent-secondary-fgvar(--bambi-secondary-foreground)oklch(9% 0 0)
--bambi-bordervar(--bambi-border)oklch(70% 0 0)
TokenDefaultLight value
--bambi-primaryvar(--bambi-primary)oklch(55% 0.22 250)
--bambi-accentvar(--bambi-accent)oklch(94% 0.008 271)
TokenDefaultLight value
--bambi-foregroundvar(--bambi-foreground)oklch(9% 0 0)
--bambi-accentvar(--bambi-accent)oklch(93% 0 0)
--bambi-accent-foregroundvar(--bambi-accent-foreground)oklch(9% 0 0)
TokenDefaultLight value
--bambi-primaryvar(--bambi-primary)oklch(55% 0.22 250)
--bambi-button-link-underline-offset4px
TokenDefaultLight value
--bambi-intent-danger-bgvar(--bambi-danger)oklch(55% 0.22 25)
--bambi-intent-danger-fgvar(--bambi-danger-foreground)oklch(98% 0 0)
TokenDefaultLight value
--bambi-intent-success-bgvar(--bambi-success)oklch(55% 0.17 145)
--bambi-intent-success-fgvar(--bambi-success-foreground)oklch(98% 0 0)
TokenDefaultLight value
--bambi-intent-warning-bgvar(--bambi-warning)oklch(75% 0.17 70)
--bambi-intent-warning-fgvar(--bambi-warning-foreground)oklch(15% 0 0)

:root {
--bambi-button-radius: 9999px;
}
:root {
--bambi-intent-primary-bg: oklch(55% 0.2 160); /* green */
--bambi-intent-primary-fg: oklch(98% 0 0);
}
:root {
--bambi-button-transition: opacity 0.3s ease, background-color 0.3s ease;
}
:root {
--bambi-button-padding-md: 0.375rem 0.75rem;
--bambi-button-padding-lg: 0.5rem 1rem;
}