Button

Interactive button component. All values — colors, sizes, padding, states — are pulled directly from the LUSTER Figma component.

Figma Properties
Background: #916DFF
Text color: #F2EDFF
Padding: 16px 32px
Font: Inter 400 / 16px
Radius: 6px
Opacity: 100%

Variant

Primary
Secondary

Style

Filled
Text

Size

Small
Medium
Icon Only

State

Default
Hover
Focus
Disabled

Design Tokens

Token NameFigma VariableDefault Value
--buttonPrimaryFontColorButton/Primary/Font/Color#F2EDFF
--buttonPrimaryIconColorButton/Primary/Icon/Color#F2EDFF
--buttonPrimaryDefaultBgColorButton/Primary/Default/Bg/Color#916DFF
--buttonPrimaryDefaultTextColorButton/Primary/Default/Text/Font/Color#916DFF
--buttonPrimaryDefaultTextIconColorButton/Primary/Default/Text/Icon/Color#916DFF
--buttonPrimaryHoverBgColorButton/Primary/Hover/Bg/Color#794DFF
--buttonPrimaryHoverTextColorButton/Primary/Hover/Text/Font/Color#794DFF
--buttonPrimaryHoverTextIconColorButton/Primary/Hover/Text/Icon/Color#794DFF
--buttonPrimaryFocusBgColorButton/Primary/Focus/Bg/Color#6741D9
--buttonPrimaryFocusTextColorButton/Primary/Focus/Text/Font/Color#6741D9
--buttonPrimaryFocusTextIconColorButton/Primary/Focus/Text/Icon/Color#6741D9
--buttonSecondaryFontColorButton/Secondary/Font/Color#F1F1F2
--buttonSecondaryIconColorButton/Secondary/Icon/Color#F1F1F2
--buttonSecondaryDefaultBgColorButton/Secondary/Default/Bg/Color#8F8B96
--buttonSecondaryDefaultTextColorButton/Secondary/Default/Text/Font/Color#8F8B96
--buttonSecondaryDefaultTextIconColorButton/Secondary/Default/Text/Icon/Color#8F8B96
--buttonSecondaryHoverBgColorButton/Secondary/Hover/Bg/Color#76717F
--buttonSecondaryHoverTextColorButton/Secondary/Hover/Text/Font/Color#76717F
--buttonSecondaryHoverTextIconColorButton/Secondary/Hover/Text/Icon/Color#76717F
--buttonSecondaryFocusBgColorButton/Secondary/Focus/Bg/Color#64606C
--buttonSecondaryFocusTextColorButton/Secondary/Focus/Text/Font/Color#64606C
--buttonSecondaryFocusTextIconColorButton/Secondary/Focus/Text/Icon/Color#64606C
--buttonSmPaddingXButton/Sm/Padding/X28px
--buttonSmPaddingYButton/Sm/Padding/Y12px
--buttonLgPaddingXButton/Lg/Padding/X32px
--buttonLgPaddingYButton/Lg/Padding/Y16px
--buttonIconPaddingXButton/Icon/Padding/X16px
--buttonIconPaddingYButton/Icon/Padding/Y16px
--buttonBorderRadiusButton/Border/Radius0px
--buttonOpacityButton/Opacity50%
--buttonFontFamilyBody/Font/FamilyInter
--buttonSmFontSizeTypography/Button/Sm/Font/Size12px
--buttonSmFontLineHeightTypography/Button/Sm/Font/LineHeight14px
--buttonSmFontWeightTypography/Button/Sm/Font/Weight400
--buttonLgFontSizeTypography/Button/Lg/Font/Size16px
--buttonLgFontLineHeightTypography/Button/Lg/Font/LineHeight19px
--buttonLgFontWeightTypography/Button/Lg/Font/Weight400

Usage Guidelines

✓ DO

Use Primary for the main action, Secondary for alternatives.

✓ DO

Reserve Focus color for keyboard navigation states.

✕ DON'T

Don't use buttons for navigation — use links.

✕ DON'T

Don't override the 50% disabled opacity.

Implementation

Values shown are the Diamond brand, Light mode defaults (the Figma file's default mode). Other brands (Amber, Opal) and Dark mode resolve to different values via the Color Theme & Component Brand collections.

import React from 'react';
import './Button.css';

export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
  variant?: 'primary' | 'secondary';
  styleType?: 'filled' | 'text';
  size?: 'small' | 'medium' | 'iconOnly';
}

export const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
  ({ variant = 'primary', styleType = 'filled', size = 'medium', className = '', children, ...props }, ref) => {
    const classes = [
      'btn',
      `btn--${variant}`,
      `btn--${styleType}`,
      `btn--${size}`,
      className,
    ].join(' ').trim();

    return (
      <button ref={ref} className={classes} {...props}>
        {children}
      </button>
    );
  }
);

Button.displayName = 'Button';