OptionCards present the functionality of a radio or checkbox in a more visually prominent card format with an increased click area.
title), a description (description), or both — a card requires at least one.layout="horizontal") for most groups, especially when the description carries meaning.layout="vertical") for icon-focused selections where the icon is the primary visual identifier, such as choosing a provider or integration.OptionCardGroup — it owns selection state, selection mode, sizing, and card arrangement.icon) or a custom image URL (iconSrc) for brand logos and illustrations the icon library doesn't cover. A custom image follows the same positioning and size rules as a Pluma icon.size="md" is the default and gives titles and descriptions more breathing room. size="sm" fits tighter layouts and simpler choices needing less visual emphasis.inputType="radio", the default) allows one selection per group and cards cannot be deselected — another card must be chosen instead.inputType="checkbox") allows multiple independent selections and each card toggles on and off.isSelected) renders the card as checked.2px focus ring.isDisabled) mutes the border and text colors and blocks all interaction.title and description render the built-in title and description. React children and the Ember default block render below them, so built-in and custom content can coexist.OptionCardTitle and OptionCardDescription (Ember: <PlumaOptionCardTitle>, <PlumaOptionCardDescription>) alongside other elements such as badges. Both accept any Text props.title, pass ariaLabel — the accessible name otherwise comes from the title.iconSrc renders through the Image component with alt="" (decorative). imageWithBoundingBox defaults to true; set it to false for a logo that needs to render larger without the icon-matching padding. It only applies alongside iconSrc.iconSize overrides the icon size, which otherwise follows the card's resolved size.icon or iconSrc is set and layout="horizontal" — it does not depend on a title being present, despite what the anatomy diagram describes.canSelect (default true) blocks selecting an unselected card while still allowing an already-selected card to be deselected. isDisabled blocks both.OptionCardGroup supplies inputType, value, onChange, size, name, isDisabled, and canSelect to its cards. Group values win over per-card inputType and size; group isDisabled and canSelect combine with the card's own.string for radio, a string[] for checkbox, with onChange receiving the matching type.cardsLayout ("flex" default, or "grid"), cardsDirection (default "row"), cardsGap (default "200"), shouldWrapCards, and the grid-only cardsColumns, cardsRows, cardsAreas, cardsAutoFlow.label, ariaLabel, or ariaLabelledby on OptionCardGroup.onChange on an individual OptionCard is deprecated — use onCheckedChange, which receives (checked, event). On OptionCardGroup, onChange is the supported callback and takes precedence over both card-level handlers.<PlumaOptionCard> and <PlumaOptionCardGroup> with @-prefixed args (@title, @icon, @layout) and yield custom content into the default block. @onChange receives a native change event; React receives a React synthetic event.