<div class="dashboard">
  <div class="widget">
    <div class="widget-header">매출 현황</div>
    <div class="widget-body">
      <div class="chart">차트</div>
      <div class="summary">1,200,000원</div>
    </div>
  </div>
  <div class="widget">
    <div class="widget-header">신규 가입자</div>
    <div class="widget-body">
      <div class="chart">차트</div>
      <div class="summary">85명</div>
    </div>
  </div>
</div>
/* 부모 그리드는 너비가 최소 300px부터 자동으로 열이 추가되는 구조로 설정 */
.dashboard {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: 16px;
}

/* 각 위젯 컨테이너 - Container Queries 활성화 */
.widget {
  display: grid;
  container-type: inline-size;
  border: 1px solid #ddd;
  padding: 10px;
}

/* 위젯 내부의 body 부분에 subgrid 적용 */
.widget-body {
  display: grid;
  grid-template-columns: subgrid; /* 부모 그리드 열 설정을 그대로 상속 */
  grid-column: span 2; /* 부모의 열을 모두 차지하도록 설정 */
  gap: 8px;
}

/* 위젯 헤더는 body와 별개로 상단에 위치, 전체 열 차지 */
.widget-header {
  font-size: 18px;
  font-weight: bold;
  grid-column: span 2;
}

/* 차트와 요약 부분은 박스만 표현 */
.chart {
  background-color: #f3f3f3;
  height: 80px;
}

.summary {
  background-color: #e3e3e3;
  display: flex;
  align-items: center;
  justify-content: center;
}

/* 위젯이 넓어질 때 (400px 이상), 차트와 요약을 나란히 배치 */
@container (min-width: 400px) {
  .widget-body {
    grid-template-columns: 2fr 1fr;
  }
}

/* 위젯이 좁을 때 (399px 이하), 차트와 요약을 세로로 배치 */
@container (max-width: 399px) {
  .widget-body {
    grid-template-columns: 1fr;
  }
}

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.