Skip to content

List row

For stacking rows where who or what comes first — people, sites, jobs.

Data display

Live preview

Source

<ul class="dc-lrow">
  <li class="dc-lrow__item">
    <a class="dc-lrow__link" href="#">
      <span class="dc-lrow__avatar" aria-hidden="true">김</span>
      <span class="dc-lrow__body">
        <span class="dc-lrow__title">김현수 반장</span>
        <span class="dc-lrow__sub">A현장 · 철근공 · 오늘 출근</span>
      </span>
      <span class="dc-lrow__arrow" aria-hidden="true">›</span>
    </a>
  </li>
  <li class="dc-lrow__item">
    <a class="dc-lrow__link" href="#">
      <span class="dc-lrow__avatar" aria-hidden="true">응</span>
      <span class="dc-lrow__body">
        <span class="dc-lrow__title">응우옌 반 안</span>
        <span class="dc-lrow__sub">A현장 · 형틀목공 · 오늘 출근</span>
      </span>
      <span class="dc-lrow__arrow" aria-hidden="true">›</span>
    </a>
  </li>
  <li class="dc-lrow__item">
    <a class="dc-lrow__link" href="#">
      <span class="dc-lrow__avatar" aria-hidden="true">박</span>
      <span class="dc-lrow__body">
        <span class="dc-lrow__title">박민정 팀장</span>
        <span class="dc-lrow__sub">B현장 · 안전관리 · 휴무</span>
      </span>
      <span class="dc-lrow__arrow" aria-hidden="true">›</span>
    </a>
  </li>
</ul>
.dc-lrow {
  margin: 0; padding: 0; list-style: none;
  background: var(--dc-surface);
  font-family: var(--dc-font);
}
.dc-lrow__item { position: relative; }
.dc-lrow__item + .dc-lrow__item { border-top: 1px solid var(--dc-line); }
.dc-lrow__item--unread { background: var(--dc-brand-soft); }
.dc-lrow__link {
  display: flex; align-items: center; gap: var(--dc-3);
  min-height: 64px; padding: var(--dc-3) var(--dc-4);
  color: inherit; text-decoration: none;
  transition: background var(--dc-fast);
}
.dc-lrow__link:active { background: var(--dc-sunken); }
.dc-lrow__avatar {
  flex: 0 0 auto; display: grid; place-items: center;
  width: 44px; height: 44px;
  border-radius: var(--dc-r-full);
  background: var(--dc-brand-soft); color: var(--dc-brand-text);
  font-size: 16px; font-weight: 700;
}
.dc-lrow__thumb {
  flex: 0 0 auto; width: 56px; height: 56px;
  border: 1px solid var(--dc-line); border-radius: var(--dc-r-sm);
  background: linear-gradient(135deg, var(--dc-brand-soft), var(--dc-sunken));
}
.dc-lrow__body {
  flex: 1 1 auto; min-width: 0;
  display: flex; flex-direction: column; gap: 2px;
}
.dc-lrow__title {
  font-size: 15px; font-weight: 700; color: var(--dc-text);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.dc-lrow__sub {
  font-size: 13px; line-height: 1.5; color: var(--dc-text-sub);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.dc-lrow__value {
  flex: 0 0 auto; font-size: 13px; font-weight: 700;
  color: var(--dc-text-sub); white-space: nowrap;
}
.dc-lrow__badge {
  flex: 0 0 auto; width: 8px; height: 8px;
  border-radius: var(--dc-r-full); background: var(--dc-danger);
}
.dc-lrow__arrow {
  flex: 0 0 auto; font-size: 20px; line-height: 1;
  color: var(--dc-text-mute);
}

How to use it

  • One title line and one subtitle — if you need a third line, use a card
  • Add the chevron only on rows that open another screen
  • Use a photo when there is one; initials in a circle when there isn't

Watch out for

  • Never shrink a tappable row below 56px — people tap these in a moving vehicle
  • Wrap the whole row in a single link; don't nest a second control inside it

Next