
Card-Based Design
FreeImplement visually engaging card layouts for web and apps.
Free · Opens the source repo
What Card-Based Design does
The Card-Based Design skill provides a comprehensive guide for implementing card layouts in web and mobile applications. This design approach focuses on encapsulating discrete pieces of information within visually distinct containers, making it ideal for applications that require bite-sized content presentation. The skill outlines core principles such as encapsulation, responsive flow, and clear boundaries, ensuring that each card stands out while maintaining a cohesive look across various devices.
This skill is particularly useful for developers and designers looking to create modern, user-friendly interfaces that prioritize content accessibility. By following the guidelines provided, users can create cards that are not only visually appealing but also functional, with features such as images, titles, descriptions, and action buttons. The emphasis on responsive design allows for seamless transitions from desktop to mobile views, ensuring that the content remains engaging regardless of screen size.
The implementation examples in CSS, SwiftUI, Flutter, and React Native provide practical code snippets that can be directly integrated into projects. This makes it easier for users to adopt the card-based design approach without extensive prior knowledge of the underlying technologies. The skill serves as a valuable resource for creating layouts that enhance user experience through clarity and aesthetic appeal, making it a go-to reference for modern design practices.
When to use it
Use this skill when you want to implement card-based designs for displaying information in a structured and visually engaging manner.
When not to use it
This skill is not suitable for applications that require complex layouts beyond simple card structures or for users looking for a comprehensive design framework.
What you can build with it
Creating a Pinterest-Style Layout
Utilize the card-based design principles to build a visually appealing Pinterest-style layout for a photo-sharing app.
Building a Product Showcase
Implement card-based layouts to showcase products in an e-commerce app, enhancing user engagement and navigation.
Designing a News Feed
Use cards to present articles in a news app, allowing users to quickly scan headlines and summaries.
How to install Card-Based Design
View source1. Install with the skills CLI
npx skills add sickn33/agentic-awesome-skills/card-based-design --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by sickn33Card-Based Design
"Bite-sized consumption. Encapsulating discrete pieces of information into distinct visual containers."
When to Use
Use this sub-style when the user's request matches the aesthetic described above. This is a child reference of the design-it skill and is not meant to be triggered directly.
Core Principles
- Encapsulation: Every card is self-contained. It has an image, a title, a short description, and usually an action (like a button or a 'like' icon).
- Responsive Flow: Cards easily reflow on different screen sizes (from a 4-column grid on desktop to a single column on mobile).
- Clear Boundaries: Cards must visually pop off the background.
Visual DNA
- Colors: Very flexible. The background should be slightly darker or distinct from the card color. Sophisticated Neutral works well for a premium feel.
- Typography: Clear hierarchy within the card (Header, Subheader, Body).
- Styling: Standard
border-radius: 8pxand a medium drop shadow.
Web Implementation
- CSS Grid with
auto-fitor a Masonry layout. - CSS Example:
body {
background-color: #f0f2f5; /* Standard app background */
padding: 40px;
}
.card-grid {
display: grid;
/* Auto-responsive magic */
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 24px;
}
.card {
background: #ffffff;
border-radius: 12px;
overflow: hidden; /* Keep images inside the rounded corners */
box-shadow: 0 4px 12px rgba(0,0,0,0.08);
transition: transform 0.2s, box-shadow 0.2s;
display: flex;
flex-direction: column;
}
.card:hover {
transform: translateY(-4px);
box-shadow: 0 8px 24px rgba(0,0,0,0.12);
}
.card-image {
width: 100%;
height: 200px;
object-fit: cover;
border-bottom: 1px solid #eee;
}
.card-content {
padding: 20px;
flex-grow: 1; /* Pushes footer to the bottom */
}
.card-footer {
padding: 16px 20px;
border-top: 1px solid #eee;
display: flex;
justify-content: space-between;
}
App Implementation
SwiftUI
struct ContentCard: View {
var body: some View {
VStack(alignment: .leading, spacing: 0) {
// Image Area
Rectangle()
.fill(Color.gray.opacity(0.2))
.frame(height: 160)
// Content Area
VStack(alignment: .leading, spacing: 8) {
Text("Card Title")
.font(.headline)
Text("A brief description of the content inside this discrete card container.")
.font(.subheadline)
.foregroundColor(.secondary)
.lineLimit(2)
}
.padding(16)
}
.background(Color.white)
.cornerRadius(12)
// Clean, subtle drop shadow
.shadow(color: Color.black.opacity(0.08), radius: 12, x: 0, y: 4)
}
}
// In your view:
// LazyVGrid(columns: [GridItem(.adaptive(minimum: 160), spacing: 16)]) { ... }
VStackinside a background with.cornerRadiusand.shadowis the standard.- Use
LazyVGridwith.adaptive(minimum: 160)to automatically create a multi-column card grid that flows perfectly on iPad or iPhone.
Flutter
class ContentCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Card(
elevation: 4, // Handles shadow natively
shadowColor: Colors.black.withOpacity(0.4),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
clipBehavior: Clip.antiAlias, // Critical: stops images from bleeding over corners
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
// Image Area
Container(
height: 160,
color: Colors.grey[300],
width: double.infinity,
),
// Content Area
Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: const [
Text('Card Title', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18)),
SizedBox(height: 8),
Text(
'A brief description of the content inside this discrete card container.',
style: TextStyle(color: Colors.black54),
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
],
),
),
],
),
);
}
}
// In your view: Use GridView.builder for the layout
- The native
Cardwidget does almost all the heavy lifting. - Critical fix: You must set
clipBehavior: Clip.antiAliason theCard, otherwise the top corners of your images will peek outside the border radius.
React Native
const ContentCard = () => {
return (
<View style={styles.card}>
<View style={styles.imageArea} />
<View style={styles.contentArea}>
<Text style={styles.title}>Card Title</Text>
<Text style={styles.description} numberOfLines={2}>
A brief description of the content inside this discrete card container.
</Text>
</View>
</View>
);
};
const styles = StyleSheet.create({
card: {
backgroundColor: '#FFF',
borderRadius: 12,
shadowColor: '#000',
shadowOffset: { width: 0, height: 4 },
shadowOpacity: 0.08,
shadowRadius: 12,
elevation: 4,
margin: 8,
overflow: 'hidden', // Keeps image inside borders
},
imageArea: {
height: 160,
backgroundColor: '#E0E0E0',
},
contentArea: {
padding: 16,
},
title: {
fontSize: 18,
fontWeight: '600',
marginBottom: 8,
},
description: {
color: '#666',
}
});
// In your view: <FlatList numColumns={2} data={data} renderItem={...} />
- Wrap everything in a View with
borderRadiusandoverflow: 'hidden'. elevation: 4provides the drop shadow on Android, while theshadow*props handle iOS.- For a Pinterest/Masonry style (columns of different heights), you must use a third-party library like
react-native-masonry-list, asFlatListcannot do varying row heights in columns.
Jetpack Compose
@Composable
fun ContentCard() {
// ElevatedCard provides the shadow and shape natively
ElevatedCard(
elevation = CardDefaults.elevatedCardElevation(defaultElevation = 4.dp),
shape = RoundedCornerShape(12.dp),
colors = CardDefaults.elevatedCardColors(containerColor = Color.White),
modifier = Modifier.fillMaxWidth().padding(8.dp)
) {
Column {
// Image Area
Box(
modifier = Modifier
.fillMaxWidth()
.height(160.dp)
.background(Color.LightGray)
)
// Content Area
Column(modifier = Modifier.padding(16.dp)) {
Text(
text = "Card Title",
style = MaterialTheme.typography.titleMedium,
fontWeight = FontWeight.Bold
)
Spacer(Modifier.height(8.dp))
Text(
text = "A brief description of the content inside this discrete card container.",
style = MaterialTheme.typography.bodyMedium,
color = Color.Gray,
maxLines = 2,
overflow = TextOverflow.Ellipsis
)
}
}
}
}
// In your view: LazyVerticalGrid(columns = GridCells.Adaptive(minSize = 160.dp)) { ... }
ElevatedCardis the perfect Material 3 component for this. It handles clipping and shadows automatically.- Use
GridCells.Adaptive(minSize = 160.dp)in aLazyVerticalGridto achieve an auto-flowing grid identical to CSS Gridauto-fit.
Do's and Don'ts
- DO: Make the entire card clickable, not just the title or image.
- DON'T: Put too much text in a card. If the user has to scroll within a card, the card is too big.
Limitations
- This is a styling reference and does not replace environment-specific validation, accessibility testing, or expert review.
- Ensure appropriate contrast ratios and responsive behaviors are verified separately.
Frequently asked questions about Card-Based Design
Similar skills
Penpot UI/UX Design
Create professional UI/UX designs in Penpot with ease.
UX Theming
Streamline your VS Code theming process with best practices.
Wireframe
Create low-fidelity UI wireframes in SVG format.
Waitlist Page
Create a clean, focused pre-launch landing page.
Hallmark
Design skill for creating unique, structured UIs.
UI Styling
Create beautiful, accessible user interfaces effortlessly.
