About this set
One-of-many choices presented as cards. The plan picker shows three pricing cards with a name, a price and a line of detail; the selected plan gets a blue border and a soft ring. The icon tiles offer view layouts as square tiles with a symbol and a caption, and the selected tile fills dark. The highlighted rows list payment methods in a bordered panel, with a visible radio circle and a tinted background on the selected row. Use cards when each option needs a little more than a word, and rows when the options are long or there are many of them. Every card is a label around a real radio input, and all options in a group share a name, so the browser keeps exactly one selected. The selected and focused styles come from :has() on the label. The Bootstrap version pairs a visually hidden .btn-check radio with a .card or .btn label and uses a .list-group for the rows. The Tailwind version uses has-[:checked] on the label and peer-checked on the row circles.
What’s included
- Plan picker cards with prices
- Icon tiles that fill when selected
- Payment rows with a highlighted selection
- Whole card is the click target
- Bootstrap version uses .btn-check, .card and .list-group
Accessibility
Each group has role="radiogroup" and an aria-label, and each card's visible text forms its accessible name; the icon glyphs are aria-hidden so they are not read out. Tab enters a group and the arrow keys move the selection. The focused card or tile shows a 2px blue outline, and in the rows the outline is drawn around the radio circle. Transitions are disabled under prefers-reduced-motion.
Customise it
Plain CSS: change #2563eb and #dbeafe in the .rc:has(input:checked) rule, #0f172a for the tiles and #eff6ff for the selected row. Bootstrap: set --choice-accent on .choice-plan and .choice-rows and the --bs-btn-active-* variables on .btn-icon. Tailwind: swap blue-600, blue-100, blue-50 and slate-900 in the has-[:checked] classes.






