Groo Design

Table Pagination

데이터 표 아래의 쪽 넘김 한 줄 — 한 번에 몇 줄을 볼지("10개 씩 보기")와 지금 범위("11-20 / 총 237개")를 고르고, 이전 · 다음으로 넘긴다. 표가 아닌 목록은 Pagination, 표는 Table 이다.

구조는 당근 SEED Table Pagination(Apache-2.0)을 따른다 — "데이터 테이블에서 대량의 데이터를 페이지 단위로 나누고, 페이지 이동과 페이지당 표시 행 수를 제어하는 컴포넌트" 로, 줄 수 고르기(Rows Per Page) · 범위 고르기(Page Range) · 이전 · 다음. 표에서는 번호로 뛰는 일보다 정렬 · 거르기로 찾거나 차례로 훑는 일이 많아 Pagination 과 따로 둔다(SEED). 값은 groo 토큰이고, SEED 와 다른 자리는 맨 아래 "SEED 와 다른 점" 에 적었다(2026-10-04 사용자 결정). groo 에 처음 두는 컴포넌트다 — 옛 Pagination 의 "표 오른쪽 아래" 쓰임을 대신한다.

수치 원본은 table-pagination.yaml이다. 고르기 둘은 Select medium, 이전 · 다음은 Pagination 의 화살표 칸이다. 수치 표 자리([표: …])와 그림 자리([그림: …])는 사이트가 그 파일로 그린다 — GitHub 에서는 그 파일 · 그림 코드로 가는 링크로 보인다.

라이트
사용자 21명
사용자 21명
이름
부서
직책
상태
김민수
개발팀
팀원
재직
이서연
디자인팀
팀장
재직
박지훈
개발팀
팀원
휴직
최유진
인사팀
팀원
재직
다크
휴가 내역
휴가 내역
날짜
종류
일수
상태
2026-09-21
연차
1일
승인
2026-09-04
반차(오후)
0.5일
승인
2026-08-18
연차
2일
승인
2026-07-31
병가
1일
승인
HR 사용자 표 · 휴가 내역 표 아래의 줄 — 라이트 · 다크

직접 골라 보기

전체 수(앎 · 모름 · 0개) · 줄 수 · 지금 범위를 고르면 스펙대로 그린 줄과 그 코드가 바뀐다. 줄 수를 바꾸면 첫 범위로 돌아가고, 마지막 범위에서는 다음이 막힌다.

사용자
사용자
이름
부서
상태
번호
김민수
개발팀
재직
11
이서연
디자인팀
재직
12
박지훈
개발팀
휴직
13
최유진
인사팀
재직
14
… 6줄 더(그림에서 줄였다)
씩 보기/ 총 237개
읽는 글—
줄 수를 바꾸면 첫 범위로 돌아가고, 마지막 범위에서는 다음이 막힌다(막혀도 초점은 남는다). 범위 목록은 최대 240 로 열린다.
전체 수
줄 수
지금 범위
모드
import { TablePagination } from "@/components/ui/table-pagination"

<div className="overflow-x-auto">
  <Table ref={tableRef}>…</Table>
  <TablePagination
    totalItems={users.length}
    value={{ page, pageSize }}
    onValueChange={(v) => { setPage(v.page); setPageSize(v.pageSize) }}
    scrollTarget={tableRef}
  />
</div>

Anatomy

ⓐ Rows Per Page — 줄 수 고르기 + "씩 보기"ⓑ Page Range — 범위 고르기 + "/ 총 N개"ⓒ Previous · Next
줄은 왼쪽 줄 수 고르기 + "씩 보기", 오른쪽 범위 고르기 + "/ 총 N개" + 이전 · 다음
부위설명
ⓐ Rows Per Page줄 수 고르기 — "10개" · "25개" · "50개" + "씩 보기".
ⓑ Page Range범위 고르기 — "11-20" + "/ 총 237개". 목록은 최대 높이 240.
ⓒ Previous · Next이전 · 다음 — 40 × 40 화살표, 끝에서는 막힌다.

부위

부위설명
root줄 — 표 아래, 한 줄. 왼쪽 줄 수 · 오른쪽 범위 · 이전 · 다음
pageSize줄 수 고르기 — Select medium "10개" · 선택지 10 · 25 · 50
pageSizeSuffix줄 수 뒤 글 — "씩 보기"
pageRange범위 고르기 — Select medium "11-20" · 목록 최대 높이 240
total전체 수 — "/ 총 237개"
arrow이전 · 다음 — Pagination 의 화살표 칸 40. 끝에서는 막힌다
focusRing키보드 포커스 링(웹)

Properties

줄

높이 40 · 한 줄 · 양 끝 정렬이고, 왼쪽 묶음과 오른쪽 묶음 · 범위 묶음과 화살표 사이는 16 이다. 고르기 둘은 Select medium(40 · 최소 폭 96)이고 고르기와 글 사이는 8, 글은 14 / 19 · 400 이다. 고르기는 화면 폭과 상관없이 medium 이다 — 줄이 한 높이 40 을 지키도록 Select 의 "1280 미만 large 52" 규칙에서 뺐다(사용자 결정 2026-10-08). 표 아래 12 에 둔다 — 이 12 는 넘김 줄이 갖는다(Table 의 자리는 좌우 24 만).

한 줄 40 · 양 끝 정렬 — 왼쪽 묶음 ↔ 오른쪽 묶음 · 범위 묶음 ↔ 화살표 16, 고르기 ↔ 글 8. 고르기는 Select medium(최소 폭 96), 화살표는 Pagination 의 칸 40 둘
줄의 간격 — 40 · 사이 16 · 8 · 화살표 40 둘

공통

부위속성값비고
root높이40px한 줄 — 줄바꿈하지 않는다. 좁으면 표와 같은 가로 스크롤 상자 안에 둔다(SEED)
root가로 맞춤space-between왼쪽 줄 수 · 오른쪽 범위와 화살표
root간격spacing-x4 16px왼쪽 묶음 ↔ 오른쪽 묶음 · 범위 묶음 ↔ 화살표 16
root위 바깥 여백spacing-component-default 12px표 아래 12 — 따로 정한 간격이 없는 컴포넌트 사이(v101 역할 간격). 이 12 는 넘김 줄이 갖는다 — Table 의 pagination 자리는 좌우 24 만 두고 위 여백을 더하지 않는다. 자리에 넣어도, 표 바로 뒤에 두어도 12 다(2026-10-17 사용자 결정 — 03-D 결정 5 B, Pagination root.marginTop 과 같은 방식)
pageSize크기Select medium높이 40 · 최소 폭 96 · 모서리 8 — 선택지 "10개" · "25개" · "50개"(3 ~ 4개를 넘지 않는다). 화면 폭과 상관없이 medium(Select 1280 규칙의 예외 — 사용자 결정 2026-10-08)
pageSize최소 너비96px
pageSize간격spacing-x2 8px고르기 ↔ "씩 보기"
pageSizeSuffix글자text-t4 14px / 19px
pageSizeSuffix굵기400
pageSizeSuffix글자·아이콘color-fg-neutral #1A1F2E · 다크 #F5F6FA
pageRange크기Select medium높이 40 · 최소 폭 96 — 선택지는 범위("1-10" · "11-20" …). 200개를 넘으면 첫 · 마지막 · 지금 둘레만
pageRange최소 너비96px
pageRange최대 높이240px열린 목록의 최대 높이 — Select 기본 480 대신(SEED)
pageRange간격spacing-x2 8px고르기 ↔ "/ 총 N개"
total글자text-t4 14px / 19px
total굵기400
total글자·아이콘color-fg-neutral #1A1F2E · 다크 #F5F6FA
total숫자 폭tabular-nums수는 세 자리마다 쉼표("1,240")
arrow크기40pxPagination 의 화살표 칸 — 둘이 붙는다
arrow모서리radius-r2 8px
arrow아이콘 크기16pxlucide chevron-left · chevron-right
arrow색color-fg-neutral #1A1F2E · 다크 #F5F6FA
arrow배경transparent
arrow터치 영역40 × 44위아래만 44 — Pagination 과 같은 예외. AA ✓ · AAA ⚠
arrow커서pointer
arrow전환 대상background-color, scale바탕 색과 누름 축소 둘 다 — Pagination 화살표 칸과 같다(Q-011-6). 시간은 motion 절
arrow전환 시간motion-duration-color-transition 150ms
arrow전환 곡선motion-ease-easing cubic-bezier(0.35, 0, 0.35, 1)

전체 수

전체 수를 알면 범위를 고르기로 두고 "/ 총 N개" 를 붙인다. 모르면(다음이 있는지만 안다) 범위를 글로만 보인다 — "11-20". 수는 세 자리마다 쉼표다("1,240").

전체를 앎 — 범위는 고르기 + “/ 총 237개”(세 자리마다 쉼표)
전체를 모름 — 범위는 “11-20” 글만(다음이 있는지만 안다)
전체를 앎 — 고르기 + "/ 총 237개" · 모름 — "11-20" 글만

전체 수

totalpageRange 글자·아이콘pageRange 보이기pageRange 막힘total 글자·아이콘total 보이기arrow 색arrow 커서설명
known (기본)———————전체 수를 안다 — 범위 고르기 + "/ 총 N개"
unknown—글로만 — "11-20" — 범위 고르기 · "/ 총 N개" 가 없다. 다음이 있는지만 안다——none——전체 수를 모른다 — 범위는 글로만("11-20")
emptycolor-fg-disabled #8A91A0 · 다크 #838997 — 막힌 범위 "0-0" — 글자 대비 예외(비활성)—막힘 — 범위 고르기(Select disabled)를 막는다 — 고를 범위가 없다. 보이는 값 "0-0"color-fg-neutral #1A1F2E · 다크 #F5F6FA — "/ 총 0개" — 흐리게 하지 않는다—color-fg-disabled #8A91A0 · 다크 #838997 — 이전 · 다음 둘 다 막힌다(aria-disabled). 줄 수 고르기는 그대로 바꿀 수 있다(Q-011-5)not-allowed빈 표(0개) — 이전 · 다음 둘 다 막힘 · 범위 "0-0" fg-disabled · "/ 총 0개". 줄 수는 그대로 바꿀 수 있다

이전 · 다음 — 끝에서 막힌다

이전 · 다음은 Pagination 의 화살표 칸(40 × 40 · 아이콘 16)이 붙은 것이다. 끝에서는 숨기지 않고 막는다(fg-disabled) — Pagination 은 빈 칸이다. 표가 비면(0개 — total: empty) 둘 다 막히고 범위 고르기도 막혀 "0-0"(fg-disabled)이다 — 줄 수는 그대로 바꿀 수 있다. 막힘(disabled) 상태는 끝 쪽 화살표 하나에만 쓰고, 빈 표는 전체 수의 값으로 따로 둔다 — 마지막 범위에서 범위 글까지 흐려지지 않게(Q-011-5). 칸 40 은 Pagination 과 같은 예외로 누르는 영역이 위아래만 44 다.

첫 범위 — 이전이 막힌다(숨기지 않는다 · 초점은 남는다)
사용자 0명
사용자 0명
이름
부서
직책
상태
사용자가 없어요
빈 표 — “0-0 / 총 0개”, 이전 · 다음 모두 막힘. 줄 수는 그대로 바꿀 수 있다
첫 범위 — 이전 막힘 · 빈 표 "0-0 / 총 0개"

State

상태모습
enabled화살표 바탕 없음
hovered웹 — 화살표에 bg-layer-default-pressed, 축소 없음
pressed같은 바탕 + 2px 거리 축소
focused웹 — 키보드 포커스에만 링(고르기는 Select 의 링)
disabled끝 쪽의 화살표 — fg-disabled. 빈 표(0개)는 total: empty(화살표 둘 · 범위 "0-0" 막힘)

상태 — 화살표

상태arrow 배경arrow 색arrow 배율arrow 커서arrow 축소 시간arrow 축소 곡선
enabled 기본transparentcolor-fg-neutral #1A1F2E · 다크 #F5F6FA—pointer——
hovered 웹 — 화살표에 누름과 같은 바탕color-bg-layer-default-pressed #F7F8FD · 다크 #353B4Dcolor-fg-neutral #1A1F2E · 다크 #F5F6FA—pointer——
pressed 누름 — 화살표 바탕 + 2px 거리 축소color-bg-layer-default-pressed #F7F8FD · 다크 #353B4D — SEED bg.transparent-pressed 의 불투명 짝color-fg-neutral #1A1F2E · 다크 #F5F6FA2px 거리 축소 — 기준 40 → 0.95 — 모션 줄이기면 하지 않는다pointermotion-duration-pressed-scale 150msmotion-ease-pressed-scale cubic-bezier(0, 0, 0.15, 1)
disabled 끝 쪽의 화살표(첫 범위의 이전 · 마지막 범위의 다음) · 막힌 줄(레시피 disabled — 고르기는 Select 의 막힘). 빈 표(0개)는 total emptytransparentcolor-fg-disabled #8A91A0 · 다크 #838997 — 첫 범위의 이전 · 마지막 범위의 다음 — 숨기지 않고 막는다(Pagination 과 다르다). 범위 · 줄 수는 그대로(Q-011-5)—not-allowed——

모션

전환시간곡선대상
바탕 색motion-duration-color-transition 150msmotion-ease-easing cubic-bezier(0.35, 0, 0.35, 1)background-color
누름motion-duration-pressed-scale 150msmotion-ease-pressed-scale cubic-bezier(0, 0, 0.15, 1)scale

Guidelines

표 아래에만

데이터 표 아래에 둔다(SEED — "데이터 테이블 상단에 배치하지 않습니다"). 표가 아닌 목록 · 카드 격자는 Pagination 이다. 표의 줄이 줄 수 하나(10)보다 적게 늘 들어맞으면 줄을 두지 않는다.

사용자
사용자
이름
부서
직책
상태
김민수
개발팀
팀원
재직
이서연
디자인팀
팀장
재직
박지훈
개발팀
팀원
휴직
최유진
인사팀
팀원
재직
이렇게 — 데이터 표 아래에 한 줄
사용자
사용자
이름
부서
직책
상태
김민수
개발팀
팀원
재직
이서연
디자인팀
팀장
재직
박지훈
개발팀
팀원
휴직
최유진
인사팀
팀원
재직
이렇게 하지 않는다 — 표 위에 둔 줄
표 아래 · 표 위에 둔 줄

줄 수 · 범위

줄 수는 10 · 25 · 50 셋이 기본이다 — 3 ~ 4개를 넘지 않는다(SEED). 줄 수를 바꾸면 첫 범위로 돌아간다. 범위 목록은 최대 높이 240 으로 열리고 지금 범위가 보이게 스크롤된다 — 범위가 200개를 넘으면 첫 · 마지막 · 지금 둘레만 둔다. 거르기 · 정렬을 바꾸면 첫 범위로 돌아가고, 줄이 줄어 지금 범위가 없어지면 마지막 범위로 옮긴다("Page 3 of 2" 가 되지 않게).

10개
10개
25개
50개
씩 보기
줄 수 — 10 · 25 · 50(3 ~ 4개를 넘지 않는다). 바꾸면 첫 범위로
11-20
1-10
11-20
21-30
31-40
41-50
51-60
61-70
71-80
81-90
91-100
101-110
111-120
121-130
131-140
141-150
151-160
161-170
171-180
181-190
191-200
201-210
211-220
221-230
231-237
/ 총 237개
범위 — 목록 최대 높이 240, 지금 범위가 보이게 열린다(200개를 넘으면 첫 · 마지막 · 지금 둘레만)
줄 수 목록 · 범위 목록(최대 240)

한 줄 — 좁으면 표와 함께 가로로

줄은 줄바꿈하지 않는다. 좁은 화면에서는 표와 줄을 같은 가로 스크롤 상자 안에 둔다(SEED) — 줄만 따로 접거나 글을 줄이지 않는다. 768 미만에서는 표가 List 줄로 바뀌므로 이 줄을 두지 않고 끝없이 불러온다(Table 의 "768 미만은 List 줄로" — 2026-10-08).

사용자
사용자
이름
부서
직책
상태
김민수
개발팀
팀원
재직
이서연
디자인팀
팀장
재직
박지훈
개발팀
팀원
휴직
이렇게 — 좁은 칸 — 카드 안 표 상자에서 표와 줄이 함께 가로로 민다(카드 머리는 그대로)
사용자
사용자
이름
부서
김민수
개발팀
이서연
디자인팀
박지훈
개발팀
이렇게 하지 않는다 — 줄만 두 줄로 접는다 — 줄은 늘 한 줄
좁은 화면 — 표와 줄이 함께 가로 스크롤

넘기면

넘기면 표의 맨 위가 보이게 스크롤하고 "11-20, 총 237개" 를 한 번 알린다(숨은 상태 글). 초점은 누른 화살표에 남는다 — 끝에 닿아 막혀도 막힌 버튼에 초점이 남는다(aria-disabled — 키보드가 그 자리를 잃지 않는다).

글 · 이름

"{n}개" + "씩 보기", 범위는 "11-20", 전체는 "/ 총 237개" 다. 이름은 줄 "표 페이지 탐색", 고르기 "페이지당 표시 개수" · "표시 범위", 화살표 "이전 페이지" · "다음 페이지"(SEED 문구). 영어("row(s)" · "Page x of y" · "Go to … page")를 쓰지 않는다.

코드

레시피 recipes/shadcn/components/ui/table-pagination.tsx 를 쓴다. 아래 미리보기는 스펙 값으로 그린 모습이다.

  • TablePagination — 줄(role="group" · aria-label="표 페이지 탐색"). totalItems(알면) — 또는 hasPreviousPage · hasNextPage · currentPageItemCount(모르면). value · defaultValue({ page, pageSize }) · onValueChange(value, { reason })(reason — "previous" · "next" · "page-range" · "page-size" · "constraint" — 줄이 줄어 범위를 옮겼을 때) · pageSizeOptions(기본 [10, 25, 50]) · scrollTarget(표 상자 — 넘기면 그 위 끝으로) · disabled.

HR 사용자 표

사용자 21명
사용자 21명
이름
부서
직책
상태
김민수
개발팀
팀원
재직
이서연
디자인팀
팀장
재직
박지훈
개발팀
팀원
휴직
최유진
인사팀
팀원
재직
씩 보기/ 총 21개
사용자 21명 — 10개 씩 · 11-20
import { TablePagination } from "@/components/ui/table-pagination"

<div className="overflow-x-auto">
  <Table ref={tableRef}>…</Table>
  <TablePagination
    totalItems={users.length}
    value={{ page, pageSize }}
    onValueChange={(v) => { setPage(v.page); setPageSize(v.pageSize) }}
    scrollTarget={tableRef}
  />
</div>

Behavior

인터랙션동작
줄 수 고르기그 줄 수로 — 첫 범위로 돌아간다
범위 고르기그 범위로 — 목록은 최대 240, 열면 지금 범위가 보인다
이전 · 다음앞 · 뒤 범위로. 끝에서는 막힌다(초점은 남는다)
줄이 줄어 지금 범위가 없어짐마지막 범위로 옮긴다(reason: "constraint")
넘김표 맨 위로 스크롤 · "11-20, 총 237개" 를 알린다
Tab줄 수 → 범위 → 이전 → 다음
좁은 화면표와 함께 가로 스크롤 — 768 미만은 표 대신 List 줄 · 끝없이 불러오기

Accessibility

기준검증
WCAG 1.4.3 Color contrast(글자 ≥ 4.5:1)"씩 보기" · "/ 총 N개" fg-neutral 흰 면 위 16.41 · 다크 13.42 ✓. 고르기는 Select 의 검증. 막힌 범위 "0-0" 은 예외(비활성)
WCAG 1.4.11 Non-text contrast(≥ 3:1)화살표 fg-neutral 16.41 · 13.42 ✓. 키보드 포커스 링 Desk 8.38 · 6.10 · HR 8.17 · 6.07 ✓
WCAG 4.1.3 Status messages넘기면 "11-20, 총 237개" 를 role="status" 로 ✓
WCAG 2.5.8 Target Size — Minimum(AA ≥ 24×24)고르기 40 · 화살표 40 × 44 ✓
WCAG 2.5.5 Target Size — Enhanced(AAA ≥ 44×44)⚠ 화살표는 위아래만 44(Pagination 과 같은 예외), 고르기 높이 40(Select medium — 폭과 상관없이, 사용자 결정 2026-10-08) — 표는 데스크톱 마우스로 다룬다
ARIA줄 role="group" · aria-label="표 페이지 탐색", 고르기 combobox(Select) 이름 "페이지당 표시 개수" · "표시 범위", 화살표 <button type="button"> "이전 페이지" · "다음 페이지" — 막히면 aria-disabled="true"

Do / Don't

✅ Do

  • 데이터 표 아래에 한 줄로 — 좁으면 표와 함께 가로 스크롤.
  • 줄 수는 10 · 25 · 50, 바꾸면 첫 범위로.
  • 끝에서는 막고, 줄이 줄면 범위를 옮긴다.
  • 넘기면 표 맨 위 + 범위를 알린다.

❌ Don't

  • 표 위에 두기 · 두 줄로 접기.
  • 표에 번호 넘김(Pagination)을 쓰기.
  • "Page 3 of 2" 처럼 없는 범위에 머물기.
  • 영어 글 · 이름.
  • 1280 미만에서 고르기만 52 로 키우기 — 줄은 한 높이 40 이다.

Specification

table-pagination.yaml 의 규칙을 하나도 빼지 않고 조건마다 그린다 — 웹이 Table Pagination 을 만들 때 이 값을 그대로 쓴다. 조건이 없는 Base 가 모든 조합에 걸리고, 뒤의 규칙이 앞의 같은 값을 덮는다. 상태는 enabled 에서 바뀌는 값만 적었다.

Base

부위상태속성값
rootenabled높이height40px한 줄 — 줄바꿈하지 않는다. 좁으면 표와 같은 가로 스크롤 상자 안에 둔다(SEED)
위 바깥 여백marginTopspacing-component-default12px표 아래 12 — 따로 정한 간격이 없는 컴포넌트 사이(v101 역할 간격). 이 12 는 넘김 줄이 갖는다 — Table 의 pagination 자리는 좌우 24 만 두고 위 여백을 더하지 않는다. 자리에 넣어도, 표 바로 뒤에 두어도 12 다(2026-10-17 사용자 결정 — 03-D 결정 5 B, Pagination root.marginTop 과 같은 방식)
간격gapspacing-x416px왼쪽 묶음 ↔ 오른쪽 묶음 · 범위 묶음 ↔ 화살표 16
가로 맞춤justifyContentspace-between왼쪽 줄 수 · 오른쪽 범위와 화살표
pageSizeenabled최소 너비minWidth96px
크기sizeSelect medium높이 40 · 최소 폭 96 · 모서리 8 — 선택지 "10개" · "25개" · "50개"(3 ~ 4개를 넘지 않는다). 화면 폭과 상관없이 medium(Select 1280 규칙의 예외 — 사용자 결정 2026-10-08)
간격gapspacing-x28px고르기 ↔ "씩 보기"
pageSizeSuffixenabled글자·아이콘foregroundfg-neutral#1A1F2E다크 #F5F6FA
글자typographytext-t414px / 19px
굵기fontWeight400
pageRangeenabled최대 높이maxHeight240px열린 목록의 최대 높이 — Select 기본 480 대신(SEED)
최소 너비minWidth96px
크기sizeSelect medium높이 40 · 최소 폭 96 — 선택지는 범위("1-10" · "11-20" …). 200개를 넘으면 첫 · 마지막 · 지금 둘레만
간격gapspacing-x28px고르기 ↔ "/ 총 N개"
totalenabled글자·아이콘foregroundfg-neutral#1A1F2E다크 #F5F6FA
글자typographytext-t414px / 19px
굵기fontWeight400
숫자 폭numeralstabular-nums수는 세 자리마다 쉼표("1,240")
arrowenabled크기size40pxPagination 의 화살표 칸 — 둘이 붙는다
아이콘 크기iconSize16pxlucide chevron-left · chevron-right
모서리radiusradius-r28px
배경backgroundtransparent
색colorfg-neutral#1A1F2E다크 #F5F6FA
커서cursorpointer
터치 영역touchTarget40 × 44위아래만 44 — Pagination 과 같은 예외. AA ✓ · AAA ⚠
전환 대상transitionPropertybackground-color, scale바탕 색과 누름 축소 둘 다 — Pagination 화살표 칸과 같다(Q-011-6). 시간은 motion 절
전환 시간transitionDurationmotion-duration-color-transition150ms
전환 곡선transitionEasingmotion-ease-easingcubic-bezier(0.35, 0, 0.35, 1)
arrowhovered배경backgroundbg-layer-default-pressed#F7F8FD다크 #353B4D
arrowpressed배경backgroundbg-layer-default-pressed#F7F8FD다크 #353B4DSEED bg.transparent-pressed 의 불투명 짝
배율scale2px 거리 축소기준 40 → 0.95 — 모션 줄이기면 하지 않는다
축소 시간scaleDurationmotion-duration-pressed-scale150ms
축소 곡선scaleEasingmotion-ease-pressed-scalecubic-bezier(0, 0, 0.15, 1)
focusRingfocused링 두께width2px
링 색colorstroke-focus-ringDesk#0147AD다크 #7AA9F6HR#075B3C다크 #2ABE84
링 간격offset2px칸 바깥 — 고르기의 링은 Select 그대로
arrowdisabled색colorfg-disabled#8A91A0다크 #838997첫 범위의 이전 · 마지막 범위의 다음 — 숨기지 않고 막는다(Pagination 과 다르다). 범위 · 줄 수는 그대로(Q-011-5)
커서cursornot-allowed

total=unknown

부위상태속성값
pageRangeenabled보이기display글로만"11-20" — 범위 고르기 · "/ 총 N개" 가 없다. 다음이 있는지만 안다
totalenabled보이기displaynone

total=empty

부위상태속성값
pageRangeenabled글자·아이콘foregroundfg-disabled#8A91A0다크 #838997막힌 범위 "0-0" — 글자 대비 예외(비활성)
막힘disabled막힘범위 고르기(Select disabled)를 막는다 — 고를 범위가 없다. 보이는 값 "0-0"
totalenabled글자·아이콘foregroundfg-neutral#1A1F2E다크 #F5F6FA"/ 총 0개" — 흐리게 하지 않는다
arrowenabled색colorfg-disabled#8A91A0다크 #838997이전 · 다음 둘 다 막힌다(aria-disabled). 줄 수 고르기는 그대로 바꿀 수 있다(Q-011-5)
커서cursornot-allowed

SEED 와 다른 점

  • 화살표 칸은 Pagination 과 같은 groo 값 — 불투명 누름 바탕 · 2px 거리 축소 · 세로 44 누르는 영역(v102 · v104 · v106 의 예외).
  • 고르기는 groo Select medium — 화면 폭과 상관없이 40 이다. Select 의 "1280 미만 large 52" 규칙의 예외다(사용자 결정 2026-10-08 — 줄 한 높이, 52 는 고르지 않았다). 범위 목록의 최대 높이 240 은 SEED 그대로.
  • 줄이 줄어 범위가 없어지면 마지막 범위로 옮기고, 넘기면 알린다 — SEED 는 constraint 로 범위를 맞추고, 결과 안내는 사용처의 몫이다.
  • 막힌 화살표는 aria-disabled — 초점이 그 자리에 남는다. SEED 는 disabled 라 끝에 닿으면 초점이 떨어진다.
  • 표 아래 12(spacing-component-default) — SEED 는 간격을 적지 않았다. 12 는 넘김 줄의 위 여백이다 — Table 의 pagination 자리는 좌우 24 만 두고 위 여백을 더하지 않아, 자리에 넣어도 표 바로 뒤에 두어도 12 다(2026-10-17 사용자 결정 — 03-D 비교 페이지 결정 5 B. 두 스펙이 같은 12 를 각자 적어 함께 쓰면 24 였다).

Migration notes

2026-10-17 — 표 아래 12 는 이 줄이 갖는다

사용자가 03-D 비교 페이지 결정 5 B 로 정했다 — 넘김 줄의 위 12(root.marginTop)는 그대로이고, Table 의 pagination 자리는 좌우 24 만 둔다(그 자리의 위 12 를 걷었다 — table.md). 지금 웹 ds 는 자리에 넣으면 24 다(table.tsx:164 pt-x3).

2026-10-15 — 구현 세션 질문 정리(Q-011-5 · 6)

사용자가 비교 페이지에서 정리 항목을 "추천대로" 정했다(2026-10-15). 보이는 모습은 바뀌지 않는다.

  • Q-011-5 막힘이 두 경우를 합쳤다 — disabled 상태는 끝 쪽 화살표만이다. 빈 표(0개)는 total 축의 empty 로 따로 두어 화살표 둘 · 범위 "0-0" 을 막는다. 전에는 disabled 가 범위 글까지 흐리게 해, 마지막 범위의 다음 화살표가 막힐 때 범위 글도 흐려지는 것처럼 읽혔다. 웹은 이미 둘로 나눠 그린다.
  • Q-011-6 화살표 전환 속성 — transitionProperty 를 background-color, scale 로 적었다(누름 축소가 있다). 웹 · 레시피는 이미 둘 다 전환한다.

2026-10-08 — 고르기는 폭과 상관없이 Select medium

스펙을 쓰다 남은 자리를 사용자가 화면 틀 · 이동 비교 페이지 14 그림으로 정했다 — 줄 수 · 범위 고르기는 화면 폭과 상관없이 Select medium 40 이라 줄이 한 높이다. Select 의 "1280 미만 large 52" 규칙의 예외로 적는다 — 1280 미만에서 52 로 키우는 안(14B)은 고르지 않았다.

2026-10-04 — SEED Table Pagination 으로 새로 둔다

사용자가 화면 틀 · 이동 비교 페이지에서 정했다 — 데이터 표는 Table Pagination(10A — 줄 수 10 · 25 · 50 "{n}개 씩 보기" · 범위 고르기 "11-20 / 총 237개" · 목록 최대 높이 240 · 이전 · 다음은 끝에서 막힘 · 표 아래에만 · 한 줄), 칸 40 은 누르는 영역 44 규칙의 예외. 표 아래에 같은 Pagination 을 두던 groo 옛 쓰임(10B)은 고르지 않았다.

제품은 앱 적용 단계에서 옮긴다(2026-10-04 조사 — HR 은 크로미움에 띄워 쟀다).

  • HR 표 셋 — 회비(5줄) · 휴가 현황(5줄) · 사용자(10줄)가 손으로 짠 바닥을 쓴다(features/culture-dues/ui/DuesTableContent.tsx:250-301 · features/vacation-history/ui/VacationHistoryContent.tsx:224-275 · features/admin-users-management/ui/UserTable.tsx:256-306). 왼쪽 "23 row(s)"(4.42) · 오른쪽 "Page 1 of 5" + 테두리 버튼 넷 32(처음 · 이전 · 다음 · 끝) — 글 · 숨은 이름 모두 영어다(F13 · F26).
  • 없는 쪽에 머문다 — 사용자 표는 21명 3쪽에서 20명으로 줄면 "Page 3 of 2" · 0줄이다(UserTable.tsx:38-41, 휴가 현황도 같다 — 되돌리기는 DuesTable.tsx:42-45 하나, F13). 마지막 범위로 옮긴다.
  • 마지막 쪽에서 초점을 잃는다 — "끝" 이 막히며 초점이 body 로 간다(F13). 막힌 버튼에 초점을 남긴다(aria-disabled).
  • 대시보드 위젯(DuesWidget.tsx:30 · VacationHistoryWidget.tsx:21)은 넘김 없이 스크롤한다 — 그대로 둔다.

이 페이지