Skip to main content
For development, import InteractiveCard from @servicetitan/anvil2/beta. For design, find it in the Anvil2 file.
Beta FeatureThis feature is currently in beta, and needs to be imported from @servicetitan/anvil2/beta.While we hope to minimize breaking changes, they may occur due to feedback we receive or other improvements. These will always be documented in the changelog and communicated in Slack.Please reach out in the #ask-designsystem channel with any questions or feedback!
Anatomy of the Interactive Card
component

Anatomy

Interactive Card consists of three primary elements that work together to create clickable cards with nested interactive elements.
Anatomy of the Interactive Card
component
  1. Card - Interactive card is a Card under the hood.
  2. Card (hover) - Interacting with the card enables clickable behavior

Options

Interactive Card uses a Card under the hood to provide the base styling and layout. Refer to the Card design docs for all available options.

Simple interactive card

Behavior

Interactive Card responds to user interaction with distinct visual feedback while maintaining support for nested interactive elements.

Hover, focus, and disabled states

Disabled state does not apply disabled styling to nested interactive elements. Apply disabled styling manually to nested elements when needed.

Nested interactive elements

Interactive Card can support nested interactions within the card layout itself. This can be useful when both the Card itself and nested interactive elements have different behaviors.

Usage Guidelines

Alternatives

Interactive Card vs Card

Use Interactive Card when the card itself needs an interaction. If no interaction is needed, or only an inner element needs an interaction, use Card instead.

Interactive Card vs Select Card

Select Card provides a card-like checkbox or radio input for selection scenarios. Use Select Card when users need to select one or more options from a group of cards, such as choosing services or items. Use Interactive Card when the card triggers an action or navigates to another page, especially when the card contains nested interactive elements like buttons or links.

Content

Content within Interactive Card should be clearly organized and include required ARIA labels for accessibility.

Content organization

  • Use a heading to make the card’s purpose clear, following heading structure for the page
  • Avoid too many call-to-actions in a single card
  • Cards should have an intentional focus - avoid overloading a single card with too much or unrelated information
  • Cards of similar importance should be structured in the same way

Keyboard Interaction

Users can navigate Interactive Card using standard keyboard controls. Interactive Card provides full keyboard support for both the card action and nested interactive elements. Tab navigation moves focus between the card and its nested elements, while Enter and Space activate button variant cards.

Code

Beta FeatureThis feature is currently in beta, and needs to be imported from @servicetitan/anvil2/beta.While we hope to minimize breaking changes, they may occur due to feedback we receive or other improvements. These will always be documented in the changelog and communicated in Slack.Please reach out in the #ask-designsystem channel with any questions or feedback!

Common Examples

Interactive card provides a clickable card interface that supports visually nested interactive elements without accessibility violations. Use the button variant for actions and the link variant for navigation.

Button Card

Use the button variant when the card triggers an action (e.g., expanding content, opening a modal).

Use the link variant when the card navigates to another page or section.

Disabled State

Disable user interaction with the disabled prop on actionProps. Only available for button cards (not link cards).
The disabled prop only disables the card action layer. Nested interactive elements (buttons, links, etc.) remain fully functional. If you need to disable nested elements to reflect the disabled state, handle that separately in your implementation.

React Accessibility

  • Uses a role="group" wrapper with aria-label (via wrapperProps) to describe the card’s content
  • The interactive layer (button or link) has its own aria-label (via actionProps) describing the action
  • Full keyboard support: Tab to navigate between the card and nested elements, Enter/Space to activate
  • Touch-friendly: Handles touch events on mobile devices
  • WCAG AA 2.2 compliant: No nested button violations due to sibling structure approach

Dual ARIA Labels

Interactive card requires two ARIA labels to maintain accessibility:
  • wrapperProps["aria-label"]: Describes what the card contains (e.g., “Kitchen Measurement 2 card”)
  • actionProps["aria-label"]: Describes the action that will be taken (e.g., “Expand Kitchen Measurement 2”)
Screen readers will announce both labels, providing context about the card’s content and the available action.
Last modified on October 27, 2026