FlipCard
An animated card that flips to reveal content on the back, with hover or click triggers.
Loading...
Installation
pnpm add @corew500/uiUsage
import { FlipCard, FlipCardFront, FlipCardBack } from "@corew500/ui/flip-card"
<FlipCard>
<FlipCardFront>
<h3>Front Side</h3>
<p>Hover to flip</p>
</FlipCardFront>
<FlipCardBack>
<h3>Back Side</h3>
<p>Hidden content revealed!</p>
</FlipCardBack>
</FlipCard>Trigger Types
Control how the card flips.
{/* Flip on hover (default) */}
<FlipCard trigger="hover">
<FlipCardFront>Hover me</FlipCardFront>
<FlipCardBack>Back content</FlipCardBack>
</FlipCard>
{/* Flip on click */}
<FlipCard trigger="click">
<FlipCardFront>Click me</FlipCardFront>
<FlipCardBack>Back content</FlipCardBack>
</FlipCard>Flip Direction
Choose horizontal or vertical flip animation.
{/* Horizontal flip (default) */}
<FlipCard direction="horizontal">
<FlipCardFront>Front</FlipCardFront>
<FlipCardBack>Back</FlipCardBack>
</FlipCard>
{/* Vertical flip */}
<FlipCard direction="vertical">
<FlipCardFront>Front</FlipCardFront>
<FlipCardBack>Back</FlipCardBack>
</FlipCard>Sizes
<FlipCard size="sm">
{/* Small card */}
</FlipCard>
<FlipCard size="default">
{/* Default size */}
</FlipCard>
<FlipCard size="lg">
{/* Large card */}
</FlipCard>
<FlipCard size="full">
{/* Full container size */}
</FlipCard>Controlled State
Control the flipped state externally.
function ControlledFlipCard() {
const [flipped, setFlipped] = useState(false)
return (
<>
<Button onClick={() => setFlipped(!flipped)}>
{flipped ? "Show Front" : "Show Back"}
</Button>
<FlipCard flipped={flipped} onFlippedChange={setFlipped}>
<FlipCardFront>Front Content</FlipCardFront>
<FlipCardBack>Back Content</FlipCardBack>
</FlipCard>
</>
)
}Complete Example
import { FlipCard, FlipCardFront, FlipCardBack } from "@corew500/ui/flip-card"
import { Card, CardHeader, CardTitle, CardContent } from "@corew500/ui/card"
import { Button } from "@corew500/ui/button"
function TeamMemberCard({ member }) {
return (
<FlipCard trigger="hover">
<FlipCardFront>
<Card className="h-full">
<CardHeader>
<img
src={member.photo}
alt={member.name}
className="w-full h-48 object-cover rounded-t"
/>
</CardHeader>
<CardContent>
<CardTitle>{member.name}</CardTitle>
<p className="text-sm text-muted-foreground">{member.role}</p>
</CardContent>
</Card>
</FlipCardFront>
<FlipCardBack>
<Card className="h-full">
<CardContent className="p-6">
<h4 className="font-medium mb-2">About</h4>
<p className="text-sm mb-4">{member.bio}</p>
<div className="flex gap-2">
<Button size="sm" variant="outline">
LinkedIn
</Button>
<Button size="sm" variant="outline">
Twitter
</Button>
</div>
</CardContent>
</Card>
</FlipCardBack>
</FlipCard>
)
}API Reference
FlipCard
Props
| Prop | Type | Default | Description |
|---|---|---|---|
| trigger | enum | hover | How to trigger the flip |
| direction | enum | horizontal | Direction of the flip |
| flipped | enum | — | Controlled flipped state |
| onFlippedChange | (flipped: boolean) => void | — | Callback when flipped state changes |
| defaultFlipped | enum | false | Default flipped state (uncontrolled) |
| size | enum | — | — |
Accessibility
Keyboard Navigation
- For click triggers, the entire card becomes keyboard accessible
- Hidden side content is not in tab order or announced to screen readers
Screen Readers
- Consider adding aria-label describing the flip action
Additional
- - Ensure both sides have appropriate semantic markup
Localization
Translatable Content
- - Pass translated content to FlipCardFront and FlipCardBack children
- If using text prompts like "Click to flip", ensure they're localized
FlipCardFront
No documentation found for FlipCardFront. Run pnpm generate:props to generate.
FlipCardBack
No documentation found for FlipCardBack. Run pnpm generate:props to generate.