Card-Based Design is a modular UI pattern that organizes content into discrete, self-contained rectangular units – cards – each representing a single idea, product, article, or action. Rooted in the physical metaphor of index cards, playing cards, and sticky notes, the pattern gained massive digital traction through Microsoft’s Metro “live tiles” (2010), Google Now’s information cards (2012), and Google’s Material Design system (2014). Pinterest’s masonry-grid layout became the definitive visual expression of card-based browsing at scale. The aesthetic prizes containment, scannability, and modularity: every card is a digestible chunk of content with clear boundaries, consistent internal structure, and the flexibility to be rearranged, filtered, or reflowed across any viewport. In modern web and UI design, Card-Based Design translates to clean surfaces with subtle elevation, generous white space, rounded corners, image-forward compositions, and responsive grid systems that adapt gracefully from multi-column masonry layouts on desktop to single-column stacks on mobile.
| Color Name | Hex | Role / Usage |
|---|---|---|
| Canvas Gray | #F5F5F7 |
Page background, the surface cards sit upon |
| Card White | #FFFFFF |
Primary card surface, clean and bright |
| Warm Canvas | #FAF9F6 |
Alternative warm page background |
| Soft Gray | #E8E8ED |
Card borders, dividers, inactive states |
| Medium Gray | #C7C7CC |
Placeholder text, disabled elements |
| Text Primary | #1D1D1F |
Headlines, primary card titles |
| Text Secondary | #6E6E73 |
Descriptions, supporting text, metadata |
| Text Tertiary | #9A9AA0 |
Captions, timestamps, subtle labels |
| Action Blue | #0071E3 |
Primary CTAs, links, interactive accents |
| Action Hover | #0062CC |
Hovered links and buttons, darker active state |
| Success Green | #34C759 |
Positive indicators, success badges |
| Warning Amber | #FF9500 |
Alerts, attention-required badges |
| Error Red | #FF3B30 |
Errors, destructive actions, urgent badges |
| Card Shadow | rgba(0,0,0,0.08) |
Default card elevation shadow |
:root {
/* Backgrounds */
--card-bg-canvas: #f5f5f7;
--card-bg-canvas-warm: #faf9f6;
--card-bg-surface: #ffffff;
/* Borders & Dividers */
--card-border-light: #e8e8ed;
--card-border-medium: #c7c7cc;
/* Text */
--card-text-primary: #1d1d1f;
--card-text-secondary: #6e6e73;
--card-text-tertiary: #9a9aa0;
/* Actions */
--card-action-blue: #0071e3;
--card-action-hover: #0062cc;
/* Status */
--card-success: #34c759;
--card-warning: #ff9500;
--card-error: #ff3b30;
/* Elevation Shadows */
--card-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.06), 0 1px 2px rgba(0, 0, 0, 0.04);
--card-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08), 0 2px 4px rgba(0, 0, 0, 0.04);
--card-shadow-lg: 0 12px 32px rgba(0, 0, 0, 0.12), 0 4px 8px rgba(0, 0, 0, 0.06);
--card-shadow-xl: 0 20px 48px rgba(0, 0, 0, 0.16), 0 8px 16px rgba(0, 0, 0, 0.08);
/* Border Radius */
--card-radius-sm: 8px;
--card-radius-md: 12px;
--card-radius-lg: 16px;
--card-radius-xl: 20px;
/* Spacing */
--card-gap: 24px;
--card-padding: 24px;
--card-padding-compact: 16px;
/* Transitions */
--card-transition: 0.25s cubic-bezier(0.4, 0, 0.2, 1);
}
Card-Based Design typography is:
| Font | Style | Best For |
|---|---|---|
| Inter | Modern geometric sans | Card titles, body text, all-purpose |
| Roboto | Material Design standard | Cards in Material-inspired layouts |
| DM Sans | Geometric, friendly | Card titles, clean modern layouts |
| Plus Jakarta Sans | Rounded geometric | Warm, approachable card designs |
| Source Sans 3 | Humanist sans | Body text, descriptions, metadata |
| Nunito | Rounded, soft | Friendly card UIs, consumer apps |
| Manrope | Modern, geometric | Tech dashboards, SaaS card layouts |
| Lato | Stable, warm | Body text, subtle and professional |
| Work Sans | Slightly condensed | Navigation, labels, compact cards |
| Space Grotesk | Geometric, contemporary | Feature cards, modern portfolios |
| Heading Font | Body Font | Character |
|---|---|---|
| DM Sans (700) | Inter (400) | Clean, modern, tech-friendly |
| Plus Jakarta Sans (700) | Source Sans 3 (400) | Warm, approachable, editorial |
| Manrope (800) | Inter (400) | Bold headers, clean reading |
| Space Grotesk (600) | Lato (400) | Geometric contrast, professional |
| Nunito (700) | Work Sans (400) | Rounded warmth, efficient body text |
/* Import fonts */
@import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&family=Inter:wght@400;500;600&display=swap');
/* Headings */
h1, h2, h3, h4, h5, h6 {
font-family: 'DM Sans', sans-serif;
font-weight: 700;
color: var(--card-text-primary);
line-height: 1.25;
letter-spacing: -0.01em;
}
/* Card title */
.card-title {
font-family: 'DM Sans', sans-serif;
font-weight: 700;
font-size: 1.125rem;
color: var(--card-text-primary);
line-height: 1.35;
margin-bottom: 8px;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
/* Card description */
.card-description {
font-family: 'Inter', sans-serif;
font-weight: 400;
font-size: 0.9rem;
color: var(--card-text-secondary);
line-height: 1.6;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
/* Body text */
body {
font-family: 'Inter', sans-serif;
font-weight: 400;
font-size: 1rem;
line-height: 1.65;
color: var(--card-text-primary);
}
/* Metadata / Labels */
.card-meta {
font-family: 'Inter', sans-serif;
font-size: 0.75rem;
font-weight: 500;
letter-spacing: 0.02em;
text-transform: uppercase;
color: var(--card-text-tertiary);
}
/* Card action link */
.card-action {
font-family: 'DM Sans', sans-serif;
font-size: 0.875rem;
font-weight: 600;
color: var(--card-action-blue);
text-decoration: none;
transition: color var(--card-transition);
}
.card-action:hover {
color: var(--card-action-hover);
}
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)) is the workhorse for card layoutsmasonry-rows or column-based CSS) fill vertical gaps naturallyauto-fit with minmax() to let the browser determine column count based on available space.card {
background: var(--card-bg-surface);
border-radius: var(--card-radius-md);
box-shadow: var(--card-shadow-md);
overflow: hidden;
display: flex;
flex-direction: column;
transition:
transform var(--card-transition),
box-shadow var(--card-transition);
cursor: pointer;
}
.card:hover {
transform: translateY(-4px);
box-shadow: var(--card-shadow-lg);
}
.card__image {
width: 100%;
aspect-ratio: 16 / 9;
object-fit: cover;
display: block;
}
.card__body {
padding: var(--card-padding);
flex: 1;
display: flex;
flex-direction: column;
}
.card__category {
font-size: 0.7rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--card-action-blue);
margin-bottom: 8px;
}
.card__title {
font-family: 'DM Sans', sans-serif;
font-weight: 700;
font-size: 1.125rem;
color: var(--card-text-primary);
line-height: 1.35;
margin-bottom: 8px;
}
.card__text {
font-family: 'Inter', sans-serif;
font-size: 0.9rem;
color: var(--card-text-secondary);
line-height: 1.6;
flex: 1;
}
.card__footer {
display: flex;
align-items: center;
justify-content: space-between;
padding-top: 16px;
margin-top: 16px;
border-top: 1px solid var(--card-border-light);
}
/* Card Grid */
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: var(--card-gap);
}
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
font-family: 'DM Sans', sans-serif;
font-weight: 600;
font-size: 0.9rem;
padding: 12px 24px;
border-radius: var(--card-radius-sm);
border: none;
cursor: pointer;
text-decoration: none;
transition:
background var(--card-transition),
box-shadow var(--card-transition),
transform var(--card-transition);
}
/* Primary */
.btn--primary {
background: var(--card-action-blue);
color: #ffffff;
}
.btn--primary:hover {
background: var(--card-action-hover);
box-shadow: 0 4px 12px rgba(0, 113, 227, 0.3);
transform: translateY(-1px);
}
/* Secondary / Outlined */
.btn--secondary {
background: transparent;
color: var(--card-action-blue);
border: 1.5px solid var(--card-border-light);
}
.btn--secondary:hover {
background: var(--card-bg-canvas);
border-color: var(--card-action-blue);
}
/* Ghost / Text Button */
.btn--ghost {
background: transparent;
color: var(--card-action-blue);
padding: 8px 12px;
}
.btn--ghost:hover {
background: rgba(0, 113, 227, 0.06);
}
.navbar {
display: flex;
align-items: center;
justify-content: space-between;
max-width: 1200px;
margin: 0 auto;
padding: 16px 32px;
position: sticky;
top: 0;
z-index: 100;
background: rgba(255, 255, 255, 0.85);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border-bottom: 1px solid var(--card-border-light);
}
.navbar__logo {
font-family: 'DM Sans', sans-serif;
font-size: 1.25rem;
font-weight: 700;
color: var(--card-text-primary);
text-decoration: none;
letter-spacing: -0.02em;
}
.navbar__links {
display: flex;
gap: 32px;
list-style: none;
margin: 0;
padding: 0;
}
.navbar__links a {
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 0.9rem;
color: var(--card-text-secondary);
text-decoration: none;
transition: color var(--card-transition);
position: relative;
}
.navbar__links a:hover {
color: var(--card-text-primary);
}
.navbar__links a::after {
content: '';
position: absolute;
bottom: -4px;
left: 0;
width: 0;
height: 2px;
background: var(--card-action-blue);
transition: width var(--card-transition);
}
.navbar__links a:hover::after {
width: 100%;
}
.hero {
padding: 80px 32px;
max-width: 1200px;
margin: 0 auto;
}
.hero__featured {
display: grid;
grid-template-columns: 1.2fr 1fr;
gap: 32px;
align-items: center;
background: var(--card-bg-surface);
border-radius: var(--card-radius-lg);
box-shadow: var(--card-shadow-lg);
overflow: hidden;
}
.hero__image {
width: 100%;
height: 100%;
min-height: 400px;
object-fit: cover;
display: block;
}
.hero__content {
padding: 48px 48px 48px 16px;
}
.hero__label {
font-family: 'Inter', sans-serif;
font-size: 0.7rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--card-action-blue);
margin-bottom: 16px;
}
.hero__title {
font-family: 'DM Sans', sans-serif;
font-weight: 700;
font-size: clamp(1.75rem, 3vw, 2.5rem);
color: var(--card-text-primary);
line-height: 1.2;
letter-spacing: -0.02em;
margin-bottom: 16px;
}
.hero__description {
font-family: 'Inter', sans-serif;
font-size: 1.05rem;
color: var(--card-text-secondary);
line-height: 1.65;
margin-bottom: 32px;
}
@media (max-width: 768px) {
.hero__featured {
grid-template-columns: 1fr;
}
.hero__image { min-height: 240px; }
.hero__content { padding: 32px; }
}
/* CSS Columns Masonry (widely supported) */
.masonry {
column-count: 3;
column-gap: var(--card-gap);
max-width: 1200px;
margin: 0 auto;
padding: 0 32px;
}
.masonry .card {
break-inside: avoid;
margin-bottom: var(--card-gap);
display: inline-block;
width: 100%;
}
@media (max-width: 1024px) {
.masonry { column-count: 2; }
}
@media (max-width: 640px) {
.masonry { column-count: 1; }
}
/* CSS Grid Masonry (experimental, progressive enhancement) */
@supports (grid-template-rows: masonry) {
.masonry-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
grid-template-rows: masonry;
gap: var(--card-gap);
max-width: 1200px;
margin: 0 auto;
padding: 0 32px;
}
.masonry-grid .card {
break-inside: auto;
margin-bottom: 0;
display: flex;
}
}
/* Lift and deepen shadow */
.card--lift {
transition:
transform var(--card-transition),
box-shadow var(--card-transition);
}
.card--lift:hover {
transform: translateY(-6px);
box-shadow: var(--card-shadow-xl);
}
/* Image zoom on hover */
.card--zoom .card__image-wrap {
overflow: hidden;
border-radius: var(--card-radius-md) var(--card-radius-md) 0 0;
}
.card--zoom .card__image {
transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}
.card--zoom:hover .card__image {
transform: scale(1.06);
}
/* Border highlight on hover */
.card--border {
border: 2px solid transparent;
transition:
border-color var(--card-transition),
box-shadow var(--card-transition);
}
.card--border:hover {
border-color: var(--card-action-blue);
box-shadow: 0 0 0 4px rgba(0, 113, 227, 0.08);
}
/* Overlay reveal on hover */
.card--overlay {
position: relative;
}
.card--overlay .card__overlay {
position: absolute;
inset: 0;
background: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
transition: opacity var(--card-transition);
border-radius: var(--card-radius-md);
}
.card--overlay:hover .card__overlay {
opacity: 1;
}
/* Focus visible state for accessibility */
.card:focus-visible {
outline: 3px solid var(--card-action-blue);
outline-offset: 2px;
box-shadow: var(--card-shadow-lg);
}
.carousel {
max-width: 1200px;
margin: 0 auto;
padding: 0 32px;
}
.carousel__header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 24px;
}
.carousel__title {
font-family: 'DM Sans', sans-serif;
font-weight: 700;
font-size: 1.5rem;
color: var(--card-text-primary);
}
.carousel__controls {
display: flex;
gap: 8px;
}
.carousel__btn {
width: 40px;
height: 40px;
border-radius: 50%;
border: 1.5px solid var(--card-border-light);
background: var(--card-bg-surface);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.1rem;
color: var(--card-text-secondary);
transition:
background var(--card-transition),
border-color var(--card-transition);
}
.carousel__btn:hover {
background: var(--card-bg-canvas);
border-color: var(--card-action-blue);
color: var(--card-action-blue);
}
.carousel__track {
display: flex;
gap: var(--card-gap);
overflow-x: auto;
scroll-snap-type: x mandatory;
scroll-behavior: smooth;
-ms-overflow-style: none;
scrollbar-width: none;
padding-bottom: 8px;
}
.carousel__track::-webkit-scrollbar {
display: none;
}
.carousel__track .card {
flex: 0 0 300px;
scroll-snap-align: start;
}
@media (max-width: 640px) {
.carousel__track .card {
flex: 0 0 85vw;
}
}
.filter-bar {
display: flex;
gap: 10px;
flex-wrap: wrap;
margin-bottom: 32px;
max-width: 1200px;
margin-left: auto;
margin-right: auto;
padding: 0 32px 32px;
}
.chip {
font-family: 'Inter', sans-serif;
font-size: 0.825rem;
font-weight: 500;
padding: 8px 18px;
border-radius: 100px;
border: 1.5px solid var(--card-border-light);
background: var(--card-bg-surface);
color: var(--card-text-secondary);
cursor: pointer;
transition:
background var(--card-transition),
border-color var(--card-transition),
color var(--card-transition);
white-space: nowrap;
}
.chip:hover {
border-color: var(--card-action-blue);
color: var(--card-action-blue);
}
.chip--active {
background: var(--card-action-blue);
border-color: var(--card-action-blue);
color: #ffffff;
}
.chip--active:hover {
background: var(--card-action-hover);
border-color: var(--card-action-hover);
color: #ffffff;
}
auto-fit / minmax() grid patterns or masonry columns| Aesthetic | Relationship to Card-Based Design |
|---|---|
| Material Design | Google’s design system formalized the card as a primary UI component; Material Design is card-based design codified with specific elevation, motion, and color rules |
| Metro Design | Microsoft’s “live tiles” were an early card-like pattern; Metro uses flat, borderless tiles while card-based design adds elevation and rounded corners |
| Flat Design | Cards evolved from flat design by reintroducing subtle depth (shadows, layering) while retaining clean, minimal surfaces |
| Minimalism | Shares the emphasis on white space, typography hierarchy, and content focus; card-based design adds the modular container structure |
| Brutalist Web Design | The anti-card aesthetic: rejects containment, shadows, and polished surfaces in favor of raw, undecorated layouts |
| Neumorphism | Takes the card elevation concept further with soft inner/outer shadows that make cards appear extruded from the background |
| Glassmorphism | Applies frosted-glass transparency to card surfaces; a stylistic variant of card-based design with blur and translucency |
| Dashboard UI | Heavily relies on card-based layouts for data widgets, metric panels, and chart containers |
| Pinterest / Masonry | The visual archetype of card-based design at scale; variable-height cards in a waterfall grid |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Card-Based Design</title>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
<style>
:root {
--card-bg-canvas: #f5f5f7;
--card-bg-surface: #ffffff;
--card-border-light: #e8e8ed;
--card-text-primary: #1d1d1f;
--card-text-secondary: #6e6e73;
--card-text-tertiary: #9a9aa0;
--card-action-blue: #0071e3;
--card-action-hover: #0062cc;
--card-shadow-sm: 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04);
--card-shadow-md: 0 4px 12px rgba(0,0,0,0.08), 0 2px 4px rgba(0,0,0,0.04);
--card-shadow-lg: 0 12px 32px rgba(0,0,0,0.12), 0 4px 8px rgba(0,0,0,0.06);
--card-radius-sm: 8px;
--card-radius-md: 12px;
--card-radius-lg: 16px;
--card-gap: 24px;
--card-padding: 24px;
--card-transition: 0.25s cubic-bezier(0.4, 0, 0.2, 1);
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
background: var(--card-bg-canvas);
color: var(--card-text-primary);
font-family: 'Inter', sans-serif;
font-size: 1rem;
line-height: 1.65;
}
h1, h2, h3 {
font-family: 'DM Sans', sans-serif;
font-weight: 700;
line-height: 1.25;
letter-spacing: -0.01em;
}
/* Navigation */
nav {
display: flex;
align-items: center;
justify-content: space-between;
max-width: 1200px;
margin: 0 auto;
padding: 16px 32px;
position: sticky;
top: 0;
z-index: 100;
background: rgba(245, 245, 247, 0.85);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
}
nav a.logo {
font-family: 'DM Sans', sans-serif;
font-size: 1.25rem;
font-weight: 700;
color: var(--card-text-primary);
text-decoration: none;
letter-spacing: -0.02em;
}
nav ul {
display: flex;
gap: 32px;
list-style: none;
}
nav ul a {
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 0.9rem;
color: var(--card-text-secondary);
text-decoration: none;
transition: color var(--card-transition);
}
nav ul a:hover {
color: var(--card-text-primary);
}
/* Hero */
.hero {
max-width: 1200px;
margin: 0 auto;
padding: 60px 32px 48px;
}
.hero-card {
display: grid;
grid-template-columns: 1.2fr 1fr;
background: var(--card-bg-surface);
border-radius: var(--card-radius-lg);
box-shadow: var(--card-shadow-lg);
overflow: hidden;
}
.hero-image {
min-height: 380px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
display: flex;
align-items: center;
justify-content: center;
color: rgba(255,255,255,0.3);
font-size: 4rem;
}
.hero-body {
padding: 48px;
display: flex;
flex-direction: column;
justify-content: center;
}
.hero-label {
font-size: 0.7rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--card-action-blue);
margin-bottom: 16px;
}
.hero-body h1 {
font-size: clamp(1.75rem, 3vw, 2.5rem);
color: var(--card-text-primary);
margin-bottom: 16px;
letter-spacing: -0.02em;
}
.hero-body p {
font-size: 1rem;
color: var(--card-text-secondary);
margin-bottom: 32px;
line-height: 1.65;
}
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
font-family: 'DM Sans', sans-serif;
font-weight: 600;
font-size: 0.9rem;
padding: 12px 28px;
border-radius: var(--card-radius-sm);
border: none;
cursor: pointer;
text-decoration: none;
transition: background var(--card-transition), box-shadow var(--card-transition), transform var(--card-transition);
}
.btn--primary {
background: var(--card-action-blue);
color: #ffffff;
}
.btn--primary:hover {
background: var(--card-action-hover);
box-shadow: 0 4px 12px rgba(0,113,227,0.3);
transform: translateY(-1px);
}
.btn--secondary {
background: transparent;
color: var(--card-action-blue);
border: 1.5px solid var(--card-border-light);
margin-left: 12px;
}
.btn--secondary:hover {
border-color: var(--card-action-blue);
background: rgba(0,113,227,0.04);
}
/* Filter Chips */
.filters {
display: flex;
gap: 10px;
flex-wrap: wrap;
max-width: 1200px;
margin: 0 auto;
padding: 0 32px 32px;
}
.chip {
font-family: 'Inter', sans-serif;
font-size: 0.825rem;
font-weight: 500;
padding: 8px 18px;
border-radius: 100px;
border: 1.5px solid var(--card-border-light);
background: var(--card-bg-surface);
color: var(--card-text-secondary);
cursor: pointer;
transition: background var(--card-transition), border-color var(--card-transition), color var(--card-transition);
}
.chip:hover {
border-color: var(--card-action-blue);
color: var(--card-action-blue);
}
.chip--active {
background: var(--card-action-blue);
border-color: var(--card-action-blue);
color: #ffffff;
}
/* Section headings */
.section-header {
max-width: 1200px;
margin: 0 auto;
padding: 48px 32px 24px;
}
.section-header h2 {
font-size: 1.5rem;
color: var(--card-text-primary);
}
.section-header p {
font-size: 0.95rem;
color: var(--card-text-secondary);
margin-top: 6px;
}
/* Card Grid */
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: var(--card-gap);
max-width: 1200px;
margin: 0 auto;
padding: 0 32px 48px;
}
.card {
background: var(--card-bg-surface);
border-radius: var(--card-radius-md);
box-shadow: var(--card-shadow-md);
overflow: hidden;
display: flex;
flex-direction: column;
transition: transform var(--card-transition), box-shadow var(--card-transition);
cursor: pointer;
}
.card:hover {
transform: translateY(-4px);
box-shadow: var(--card-shadow-lg);
}
.card-img {
width: 100%;
aspect-ratio: 16 / 9;
display: flex;
align-items: center;
justify-content: center;
font-size: 2rem;
color: rgba(255,255,255,0.4);
}
.card-body {
padding: var(--card-padding);
flex: 1;
display: flex;
flex-direction: column;
}
.card-cat {
font-size: 0.7rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--card-action-blue);
margin-bottom: 8px;
}
.card-body h3 {
font-size: 1.1rem;
margin-bottom: 8px;
line-height: 1.35;
}
.card-body p {
font-size: 0.9rem;
color: var(--card-text-secondary);
line-height: 1.6;
flex: 1;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
.card-footer {
display: flex;
align-items: center;
justify-content: space-between;
padding-top: 16px;
margin-top: 16px;
border-top: 1px solid var(--card-border-light);
font-size: 0.8rem;
color: var(--card-text-tertiary);
}
.card-footer a {
font-family: 'DM Sans', sans-serif;
font-weight: 600;
font-size: 0.825rem;
color: var(--card-action-blue);
text-decoration: none;
}
.card-footer a:hover {
color: var(--card-action-hover);
}
/* Masonry Section */
.masonry {
column-count: 3;
column-gap: var(--card-gap);
max-width: 1200px;
margin: 0 auto;
padding: 0 32px 48px;
}
.masonry .card {
break-inside: avoid;
margin-bottom: var(--card-gap);
display: inline-block;
width: 100%;
}
.masonry .card-img {
aspect-ratio: auto;
min-height: 120px;
}
/* Carousel */
.carousel-header {
display: flex;
align-items: center;
justify-content: space-between;
max-width: 1200px;
margin: 0 auto;
padding: 48px 32px 24px;
}
.carousel-header h2 {
font-size: 1.5rem;
color: var(--card-text-primary);
}
.carousel-controls {
display: flex;
gap: 8px;
}
.carousel-btn {
width: 38px;
height: 38px;
border-radius: 50%;
border: 1.5px solid var(--card-border-light);
background: var(--card-bg-surface);
cursor: pointer;
font-size: 1rem;
color: var(--card-text-secondary);
display: flex;
align-items: center;
justify-content: center;
transition: border-color var(--card-transition), color var(--card-transition);
}
.carousel-btn:hover {
border-color: var(--card-action-blue);
color: var(--card-action-blue);
}
.carousel-track {
display: flex;
gap: var(--card-gap);
overflow-x: auto;
scroll-snap-type: x mandatory;
scroll-behavior: smooth;
max-width: 1200px;
margin: 0 auto;
padding: 0 32px 48px;
-ms-overflow-style: none;
scrollbar-width: none;
}
.carousel-track::-webkit-scrollbar { display: none; }
.carousel-track .card {
flex: 0 0 280px;
scroll-snap-align: start;
}
/* CTA Banner */
.cta-banner {
max-width: 1200px;
margin: 0 auto;
padding: 0 32px 48px;
}
.cta-card {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-radius: var(--card-radius-lg);
padding: 64px;
text-align: center;
color: #ffffff;
}
.cta-card h2 {
font-size: clamp(1.5rem, 3vw, 2.25rem);
color: #ffffff;
margin-bottom: 12px;
}
.cta-card p {
font-size: 1.05rem;
color: rgba(255,255,255,0.8);
margin-bottom: 32px;
max-width: 520px;
margin-left: auto;
margin-right: auto;
}
.btn--white {
background: #ffffff;
color: #764ba2;
font-family: 'DM Sans', sans-serif;
font-weight: 600;
font-size: 0.9rem;
padding: 14px 32px;
border-radius: var(--card-radius-sm);
border: none;
cursor: pointer;
text-decoration: none;
transition: box-shadow var(--card-transition), transform var(--card-transition);
}
.btn--white:hover {
box-shadow: 0 6px 20px rgba(0,0,0,0.2);
transform: translateY(-2px);
}
/* Footer */
footer {
background: var(--card-bg-surface);
border-top: 1px solid var(--card-border-light);
}
.footer-inner {
max-width: 1200px;
margin: 0 auto;
padding: 40px 32px;
display: flex;
align-items: center;
justify-content: space-between;
}
.footer-brand {
font-family: 'DM Sans', sans-serif;
font-weight: 700;
font-size: 1.1rem;
color: var(--card-text-primary);
}
.footer-links {
display: flex;
gap: 24px;
list-style: none;
}
.footer-links a {
font-size: 0.85rem;
color: var(--card-text-secondary);
text-decoration: none;
}
.footer-links a:hover {
color: var(--card-text-primary);
}
.footer-copy {
font-size: 0.8rem;
color: var(--card-text-tertiary);
text-align: center;
padding: 0 32px 24px;
max-width: 1200px;
margin: 0 auto;
}
/* Responsive */
@media (max-width: 768px) {
nav { padding: 14px 20px; }
nav ul { gap: 20px; }
.hero { padding: 40px 20px 32px; }
.hero-card { grid-template-columns: 1fr; }
.hero-image { min-height: 200px; }
.hero-body { padding: 32px; }
.card-grid { padding: 0 20px 32px; }
.masonry { column-count: 1; padding: 0 20px 32px; }
.carousel-track .card { flex: 0 0 85vw; }
.cta-card { padding: 40px 24px; }
.filters { padding: 0 20px 24px; }
.section-header { padding: 32px 20px 16px; }
.carousel-header { padding: 32px 20px 16px; }
.carousel-track { padding: 0 20px 32px; }
.cta-banner { padding: 0 20px 32px; }
.footer-inner { flex-direction: column; gap: 16px; text-align: center; padding: 32px 20px; }
}
</style>
</head>
<body>
<nav>
<a href="#" class="logo">Cardfolio</a>
<ul>
<li><a href="#">Explore</a></li>
<li><a href="#">Collections</a></li>
<li><a href="#">Trending</a></li>
<li><a href="#">About</a></li>
</ul>
</nav>
<!-- Hero -->
<section class="hero">
<div class="hero-card">
<div class="hero-image">◆</div>
<div class="hero-body">
<span class="hero-label">Featured Collection</span>
<h1>Discover Curated Content</h1>
<p>Browse through beautifully organized cards. Every piece of content has its own space, making discovery effortless and delightful.</p>
<div>
<a href="#" class="btn btn--primary">Get Started</a>
<a href="#" class="btn btn--secondary">Learn More</a>
</div>
</div>
</div>
</section>
<!-- Filters -->
<div class="filters">
<button class="chip chip--active">All</button>
<button class="chip">Design</button>
<button class="chip">Development</button>
<button class="chip">Photography</button>
<button class="chip">Illustration</button>
<button class="chip">Typography</button>
</div>
<!-- Uniform Card Grid -->
<section class="card-grid">
<div class="card">
<div class="card-img" style="background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);">★</div>
<div class="card-body">
<span class="card-cat">Design</span>
<h3>Principles of Visual Hierarchy</h3>
<p>Learn how size, color, and spacing guide the viewer's eye through a composition to create clear communication.</p>
<div class="card-footer">
<span>5 min read</span>
<a href="#">Read More →</a>
</div>
</div>
</div>
<div class="card">
<div class="card-img" style="background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);">♦</div>
<div class="card-body">
<span class="card-cat">Development</span>
<h3>Building Responsive Grid Systems</h3>
<p>A practical guide to CSS Grid and Flexbox patterns that adapt beautifully across every device and screen size.</p>
<div class="card-footer">
<span>8 min read</span>
<a href="#">Read More →</a>
</div>
</div>
</div>
<div class="card">
<div class="card-img" style="background: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%);">♣</div>
<div class="card-body">
<span class="card-cat">Photography</span>
<h3>Composition and the Rule of Thirds</h3>
<p>Discover how professional photographers use compositional grids to create balanced and compelling images.</p>
<div class="card-footer">
<span>4 min read</span>
<a href="#">Read More →</a>
</div>
</div>
</div>
<div class="card">
<div class="card-img" style="background: linear-gradient(135deg, #fa709a 0%, #fee140 100%);">♠</div>
<div class="card-body">
<span class="card-cat">Illustration</span>
<h3>Color Theory for Digital Artists</h3>
<p>Understanding warm and cool color relationships, contrast ratios, and accessible palettes for screen-based work.</p>
<div class="card-footer">
<span>6 min read</span>
<a href="#">Read More →</a>
</div>
</div>
</div>
<div class="card">
<div class="card-img" style="background: linear-gradient(135deg, #a18cd1 0%, #fbc2eb 100%);">✦</div>
<div class="card-body">
<span class="card-cat">Typography</span>
<h3>The Art of Font Pairing</h3>
<p>How to combine typefaces for contrast and harmony, from classic serif-sans pairings to modern geometric combinations.</p>
<div class="card-footer">
<span>7 min read</span>
<a href="#">Read More →</a>
</div>
</div>
</div>
<div class="card">
<div class="card-img" style="background: linear-gradient(135deg, #ffecd2 0%, #fcb69f 100%);">◈</div>
<div class="card-body">
<span class="card-cat">Design</span>
<h3>White Space as a Design Element</h3>
<p>Why the empty areas of your layout are just as important as the content they surround and how to use them with purpose.</p>
<div class="card-footer">
<span>3 min read</span>
<a href="#">Read More →</a>
</div>
</div>
</div>
</section>
<!-- Masonry Section -->
<div class="section-header">
<h2>Masonry Collection</h2>
<p>Variable-height cards in a Pinterest-style waterfall layout.</p>
</div>
<section class="masonry">
<div class="card">
<div class="card-img" style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 200px;">◆</div>
<div class="card-body">
<span class="card-cat">Design</span>
<h3>Layout Fundamentals</h3>
<p>Exploring the building blocks of page structure.</p>
</div>
</div>
<div class="card">
<div class="card-img" style="background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); min-height: 280px;">★</div>
<div class="card-body">
<span class="card-cat">Photography</span>
<h3>Golden Hour Techniques</h3>
<p>Capture the warm, soft light that makes outdoor photographs feel magical. Tips on timing, exposure, and composition during the golden hour window.</p>
</div>
</div>
<div class="card">
<div class="card-img" style="background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); min-height: 160px;">♦</div>
<div class="card-body">
<span class="card-cat">Development</span>
<h3>CSS Grid Tricks</h3>
</div>
</div>
<div class="card">
<div class="card-img" style="background: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%); min-height: 240px;">♣</div>
<div class="card-body">
<span class="card-cat">Illustration</span>
<h3>Geometric Abstraction</h3>
<p>Using simple shapes to create complex visual narratives that communicate ideas without words.</p>
</div>
</div>
<div class="card">
<div class="card-img" style="background: linear-gradient(135deg, #fa709a 0%, #fee140 100%); min-height: 180px;">♠</div>
<div class="card-body">
<span class="card-cat">Typography</span>
<h3>Variable Fonts in Action</h3>
<p>How a single font file can replace dozens of weights and styles.</p>
</div>
</div>
<div class="card">
<div class="card-img" style="background: linear-gradient(135deg, #a18cd1 0%, #fbc2eb 100%); min-height: 300px;">✦</div>
<div class="card-body">
<span class="card-cat">Design</span>
<h3>Designing for Accessibility</h3>
<p>Inclusive design practices that ensure your interfaces are usable by everyone, regardless of ability or assistive technology. Color contrast, keyboard navigation, and semantic markup all play critical roles.</p>
</div>
</div>
</section>
<!-- Carousel -->
<div class="carousel-header">
<h2>Trending Now</h2>
<div class="carousel-controls">
<button class="carousel-btn">←</button>
<button class="carousel-btn">→</button>
</div>
</div>
<div class="carousel-track">
<div class="card">
<div class="card-img" style="background: linear-gradient(135deg, #ffecd2 0%, #fcb69f 100%); aspect-ratio: 4/3;">◈</div>
<div class="card-body">
<span class="card-cat">Trending</span>
<h3>Micro-interactions Guide</h3>
<p>Small animations that make big differences in user experience.</p>
</div>
</div>
<div class="card">
<div class="card-img" style="background: linear-gradient(135deg, #d4fc79 0%, #96e6a1 100%); aspect-ratio: 4/3;">◆</div>
<div class="card-body">
<span class="card-cat">Trending</span>
<h3>Design Tokens Explained</h3>
<p>The building blocks of scalable design systems.</p>
</div>
</div>
<div class="card">
<div class="card-img" style="background: linear-gradient(135deg, #84fab0 0%, #8fd3f4 100%); aspect-ratio: 4/3;">★</div>
<div class="card-body">
<span class="card-cat">Trending</span>
<h3>AI in UI Design</h3>
<p>How artificial intelligence is transforming interface design workflows.</p>
</div>
</div>
<div class="card">
<div class="card-img" style="background: linear-gradient(135deg, #cfd9df 0%, #e2ebf0 100%); aspect-ratio: 4/3;">♦</div>
<div class="card-body">
<span class="card-cat">Trending</span>
<h3>Minimalism in 2026</h3>
<p>The evolution of less-is-more in modern web design.</p>
</div>
</div>
<div class="card">
<div class="card-img" style="background: linear-gradient(135deg, #fccb90 0%, #d57eeb 100%); aspect-ratio: 4/3;">♣</div>
<div class="card-body">
<span class="card-cat">Trending</span>
<h3>Container Queries Deep Dive</h3>
<p>Responsive components that adapt to their parent, not the viewport.</p>
</div>
</div>
</div>
<!-- CTA -->
<div class="cta-banner">
<div class="cta-card">
<h2>Start Building with Cards</h2>
<p>Modular, responsive, and endlessly adaptable. Card-based design is the foundation of modern interfaces.</p>
<a href="#" class="btn--white">Create Your Collection</a>
</div>
</div>
<!-- Footer -->
<footer>
<div class="footer-inner">
<span class="footer-brand">Cardfolio</span>
<ul class="footer-links">
<li><a href="#">Terms</a></li>
<li><a href="#">Privacy</a></li>
<li><a href="#">Contact</a></li>
<li><a href="#">GitHub</a></li>
</ul>
</div>
<p class="footer-copy">Designed with modular thinking. Every card tells a story.</p>
</footer>
</body>
</html>