Buttons

Interactive controls for primary actions, secondary options, and tertiary navigation. Built on a shared seed architecture with consistent token bindings across 4 color themes.

Overview

Button

The Button component has 3 variant axes: Type, Structure, and Size.

PropertyValues
TypePrimary, Secondary, Tertiary
StructureText-only, Text + Icon
SizeLarge (64px), Medium (56px), Small (48px)

Anatomy

← label-wrap (2px optical lift) ← arrow icon ↑ focus-ring (−4px inset)
button-primary — fill
label-primary — text + icon color
border-focus — focus ring stroke

Live Examples

Button Variants

Hover and press to see interactive states. All 4 color themes shown side by side.

Sizes

Light
Dark
Gray
Colored

Types & Structures

Light
Dark
Gray
Colored

States

Button States

All 5 interactive states for each button type. Tab through the live examples above to see focus rings.

Default
Hover
Pressed
Disabled
Focused
Primary
button-primary
button-primary-hover
button-primary-pressed
button-primary-disabled
border-focus
Secondary
button-secondary
button-secondary-hover
button-secondary-pressed
button-secondary-disabled
border-focus
Tertiary
button-tertiary
button-tertiary-hover
button-tertiary-pressed
button-tertiary-disabled
border-focus

Tokens

Button Tokens

Fill Tokens

TokenLightDarkGrayColored
button-primaryOrange50Orange50Orange50AlphaWhite90
button-primary-hoverOrange70Orange70Orange70White
button-primary-pressedOrange60Orange60Orange60AlphaWhite70
button-primary-disabledAlphaBlack20AlphaWhite20AlphaBlack20AlphaWhite20
button-secondaryDeepBlue80DeepBlue10DeepBlue80AlphaBlack80
button-secondary-hoverDeepBlue90WhiteDeepBlue90Black
button-secondary-pressedDeepBlue75DeepBlue15DeepBlue75AlphaBlack70
button-secondary-disabledAlphaBlack20AlphaWhite20AlphaBlack20AlphaWhite20
button-tertiaryTransparentTransparentTransparentTransparent
button-tertiary-hoverAlphaBlack20AlphaWhite20AlphaBlack20AlphaWhite20
button-tertiary-pressedAlphaBlack10AlphaWhite10AlphaBlack10AlphaWhite40

Label Color Tokens

TokenLightDarkGrayColored
label-primaryWhiteWhiteWhiteBlack
label-secondaryWhiteBlackWhiteWhite
label-tertiaryBlackWhiteBlackWhite

Stroke Tokens (Tertiary)

TokenLightDarkGrayColored
button-tertiary-stroke→ button-secondary→ button-secondary→ button-secondary→ button-primary-hover
button-tertiary-stroke-hover→ button-secondary-hover→ button-secondary-hover→ button-secondary-hover→ button-primary-hover
button-tertiary-stroke-pressed→ button-secondary-pressed→ button-secondary-pressed→ button-secondary-pressed→ button-primary-hover
button-tertiary-stroke-disabled→ button-secondary-disabled→ button-secondary-disabled→ button-secondary-disabled→ button-primary-disabled

Focus Ring

TokenLightDarkGrayColored
border-focusTeal50Teal40Teal50White

Specs

Button Specs

Padding — Text + Icon

SizeHeightTopRightBottomLeftGap
Large64px182218288
Medium56px141814248
Small48px101610208

Padding — Text-only (symmetric)

SizeHeightV-padH-pad
Large64px1828
Medium56px1424
Small48px1020

Typography

  • Font: Poppins SemiBold 600
  • Size: 16px
  • Letter-spacing: −0.025em
  • Line-height: 1 (single-line labels only)

Optical Alignment

The .btn__label wrapper adds padding-bottom: 2px for optical vertical centering. For Text+Icon buttons, left padding is 6px larger than right padding at each size to balance the visual weight of the arrow.

Arrow Animation Chain

  • Default: translateX(0)
  • Hover intermediary: quick shift, 50ms linear
  • Hover: translateX(4px) with 150ms ease-out-back cubic-bezier(0.175, 0.885, 0.32, 1.275)
  • Pressed: translateX(3px) — slight pull-back
  • Background fill transitions at 150ms with same easing

Overview

Arrow Button

Icon-only button with arrow. 36 variants from 4 axes: Type, Size, Direction, Shape.

PropertyValues
TypePrimary, Secondary, Tertiary
SizeLarge (64px), Medium (56px), Small (48px)
DirectionForward (→), Back (←)
ShapeSquare (0 radius), Circle (10000px radius)

= 3 × 3 × 2 × 2 = 36 variants. Wraps an Arrow Button Seed (18 variants: 3 Types × 6 States) that handles all interaction states internally.


Live Examples

Arrow Button Variants

Sizes

Types, Shapes & Directions


States

Arrow Button States

Arrow Button Seed has 6 states including a Hover Intermediary that creates the two-step animation chain.

Default
Hover Int.
Hover
Pressed
Disabled
Focused
Primary
opacity → 0
150ms ease-in-out
Secondary
Tertiary

Two-Step Animation Chain

  1. Default → Hover Intermediary: instant — Arrow 1 opacity fades to 0 (disappears)
  2. Hover Intermediary → Hover: after 25ms delay, Arrow 2 slides in from left to centered position — SMART_ANIMATE, Ease in and out, 150ms
  3. Hover → Pressed: instant — Arrow 2 shifts 1px to the left
  4. Hover → Mouse Leave → Default: instant snap back — Arrow 1 reappears, Arrow 2 returns offscreen

Tokens

Arrow Button Tokens

Arrow Button shares the same fill, label, and stroke tokens as Button — they both derive from the shared seed architecture. See the Button token table above for the complete reference.


Specs

Arrow Button Specs

Padding (symmetric)

SizeDimensionsPaddingIcon
Large64 × 6424px all16 × 16
Medium56 × 5620px all16 × 16
Small48 × 4816px all16 × 16

Direction

Back direction is achieved with scaleX(-1) on the icon wrapper, flipping the arrow horizontally. The transform is applied to the seed instance, not individual vector children.

Shape

Square uses border-radius: 0. Circle uses border-radius: 10000px (effectively a pill/circle at any size).


Overview

Play Button

Circle play button for video thumbnails. Two types (Primary = Orange50, Secondary = DeepBlue80), four sizes. The play triangle is always white and optically centered within the circle.

SizeDiameterIconOptical offsetClass
Extra Large96px64px+5px rightplay-btn--xl
Large64px42.67px+4px rightplay-btn--lg
Medium48px32px+3px rightplay-btn--md
Small24px16px+2px rightplay-btn--sm

Anatomy

Play Button Anatomy

← Orange50 fill (Primary type) ← white play icon (+5px optical offset) ↑ focus-ring (outline)
btn-primary — Primary fill
btn-secondary — Secondary fill
#FFFFFF — icon (always white)
border-focus — focus ring

Live Examples

Play Button Variants

Hover and click to see interactive states. Both types shown at all 4 sizes.

Primary — all sizes

Light
Dark

Secondary — all sizes

Light
Dark

States — Extra Large (Primary / Secondary)

Primary
Default
#FA4616
Hover
#FA4616 · 100%
Pressed
#C2320C · 100%
Secondary
Default
#293940
Hover
#293940 · 100%
Pressed
#172125 · 100%

Tokens

Play Button Tokens

TypeStateTokenValue
PrimaryDefaultbtn-primary#FA4616 · 60% opacity
PrimaryHoverbtn-primary#FA4616 · 100% opacity (reveals solid)
PrimaryPressedbtn-primary-hover#C2320C · 100% opacity
SecondaryDefaultbtn-secondary#293940 · 60% opacity
SecondaryHoverbtn-secondary#293940 · 100% opacity
SecondaryPressedbtn-secondary-hover#172125 · 100% opacity
BothAll states#FFFFFF icon · always 100% opacity
BothAll statesbackdrop-filter: blur(30px)

Specs

Play Button Specs

SizeDiameterIcon (CSS)Optical offset
Extra Large96px64pxmargin-left: 5px
Large64px42.67pxmargin-left: 4px
Medium48px32pxmargin-left: 3px
Small24px16pxmargin-left: 2px

Optical Centering

The play triangle's geometric centroid sits left of center — the left edge (base) is wider than the right tip. Icon is offset right by a small fixed amount per size so it appears visually centered in the circle.

SVG

Single viewBox="0 0 64 64" path for all sizes. CSS width/height on the icon controls rendered size. No separate path per size.

Transparency + Backdrop Blur

Default state is 60% opacity with backdrop-filter: blur(30px) — the circle is semi-transparent and blurs whatever is behind it (e.g. the video thumbnail). On hover, opacity goes to 100% (same color, just solid). On press, color darkens and stays at 100%. The icon SVG is a separate layer at full opacity — it's never dimmed by the button's opacity.

No Shadow

No box-shadow. The frosted fill provides sufficient contrast against the video overlay.


Accessibility

ARIA & Keyboard

ARIA Attributes

ElementAttributeValue
All buttonsroleImplicit from <button> — never use <div> or <span>
Link-styled buttonsrole="link"Only if a <button> is visually styled as a link
Disabled buttonsdisabled + aria-disabled="true"Both attributes required — disabled removes from tab order, aria-disabled announces state
Icon-only buttons (Arrow Button)aria-labelDescriptive label (e.g. "Next", "Previous") — CSS-masked icons are invisible to screen readers
Text + icon buttonsaria-hidden="true"On the arrow icon element — the label already describes the action

Focus

StateStyle
:focus-visibleoutline: 2px solid Teal50 (#0BA2B3); outline-offset: 2px
:focus:not(:focus-visible)No outline — mouse clicks don't show the ring
DisabledNot focusable — removed from tab order by disabled attribute

Keyboard Interaction

KeyAction
TabMoves focus to the next interactive element
Enter / SpaceActivates the button (native <button> behavior)