반응형 카드 그리드

CSS Grid auto-fill을 사용한 반응형 카드 레이아웃. 호버 효과, 배지, 액션 버튼 포함.

Gist
<section class="card-grid-section">
  <div class="section-header">
    <h2 class="section-title">카드 그리드</h2>
    <p class="section-desc">반응형 카드 레이아웃 예시</p>
  </div>

  <div class="card-grid">
    <article class="card">
      <div class="card-badge">신규</div>
      <div class="card-icon">🚀</div>
      <h3 class="card-title">카드 제목</h3>
      <p class="card-desc">카드 설명 텍스트가 여기에 들어갑니다. 두 줄로 제한됩니다.</p>
      <div class="card-tags">
        <span class="tag">태그1</span>
        <span class="tag">태그2</span>
      </div>
      <div class="card-footer">
        <span class="card-meta">2026.05.05</span>
        <a href="#" class="card-action">자세히 →</a>
      </div>
    </article>
    <!-- 카드 반복 -->
  </div>
</section>

<style>
:root {
  --bg: #0d1117; --surface: #161b22; --surface-2: #21262d;
  --text: #e6edf3; --text-muted: #8b949e; --border: #30363d;
  --accent: #58a6ff; --accent-bg: #1f6feb; --success: #3fb950;
  --radius: 12px; --transition: 0.15s ease;
}

*, *::before, *::after { box-sizing: border-box; }
body { background: var(--bg); color: var(--text); font-family: system-ui, sans-serif; padding: 2rem; }

.section-header { margin-bottom: 1.5rem; }
.section-title { font-size: 1.5rem; font-weight: 700; margin-bottom: 0.25rem; }
.section-desc { color: var(--text-muted); font-size: 0.9375rem; }

.card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  gap: 1rem;
}

.card {
  position: relative;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 1.5rem;
  display: flex; flex-direction: column; gap: 0.625rem;
  transition: border-color var(--transition), transform var(--transition), box-shadow var(--transition);
}
.card:hover {
  border-color: var(--accent);
  transform: translateY(-3px);
  box-shadow: 0 8px 24px rgba(0,0,0,0.3);
}

.card-badge {
  position: absolute; top: 1rem; right: 1rem;
  font-size: 0.6875rem; font-weight: 600;
  background: var(--success); color: #000;
  padding: 0.125rem 0.5rem; border-radius: 999px;
}

.card-icon { font-size: 2rem; line-height: 1; }
.card-title { font-size: 1rem; font-weight: 600; color: var(--text); margin: 0; }
.card-desc {
  font-size: 0.8125rem; color: var(--text-muted); margin: 0; line-height: 1.5;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}

.card-tags { display: flex; flex-wrap: wrap; gap: 0.375rem; margin-top: auto; }
.tag {
  font-size: 0.75rem; font-weight: 500; padding: 0.15rem 0.5rem;
  border-radius: 999px; background: var(--surface-2);
  color: var(--text-muted); border: 1px solid var(--border);
}

.card-footer {
  display: flex; align-items: center; justify-content: space-between;
  padding-top: 0.75rem; border-top: 1px solid var(--border);
  margin-top: 0.25rem;
}
.card-meta { font-size: 0.75rem; color: var(--text-muted); font-family: monospace; }
.card-action { font-size: 0.8125rem; color: var(--accent); text-decoration: none; font-weight: 500; }
.card-action:hover { color: #79c0ff; }
</style>