JSFiddle - React, Tailwind, and code Playground
by jmpp77
HTML
<div id="root"></div>
CSS
.deck {
margin: 1rem;
max-width: 300px;
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1rem;
perspective: 400px;
}
.card {
background-color: silver;
display: grid;
place-content: center;
padding: 1rem;
transform-origin: 50%;
transition: transform 300ms ease-out;
position: relative;
cursor: pointer;
}
.card:hover {
background-color: darkgray;
}
.card.card-open {
background-color: black;
color: white;
transform: rotateY(180deg);
}
.card.card-open > span {
transform: rotateY(180deg);
}
React
ReactDOM.createRoot(document.getElementById('root')).render(<Plateau />)
function Plateau() {
const MAX_CARDS_TOGETHER = 2;
const [cards, setCards] = React.useState([1, 2, 3, 4, 5, 6, 7, 8, 9])
const [cardsClicked, setCardsClicked] = React.useState([]);
function onCardClick(cardId) {
if (cardsClicked.length === MAX_CARDS_TOGETHER) {
setCardsClicked([cardId])
} else {
setCardsClicked(c => [...c, cardId])
}
}
return (
<div className="deck">
{cards.map(card => (
<Card key={card} id={card} className={cardsClicked.includes(card) ? 'card-open' : ''} onCardClick={onCardClick} />
))}
</div>
)
}
function Card({ id, className, onCardClick }) {
return (
<div className={`card ${className}`} onClick={() => onCardClick(id)}>
<span>{id}</span>
</div>
)
}