# Grid 많은 행을 페이지 단위로 보여주는 데이터 테이블입니다. 헤더는 고정되고, 컬럼은 정렬·이동·너비 조절·고정·필터를 지원합니다. > 원본: `03_ASSET_GUIDE/catalog/grid.js` · CSS: `03_ASSET_GUIDE/styles/elements/grid.css` > kind `component` · category `display` · status `stable` · specSource `measured` > 함께 쓰는 블록: [Pagination](./pagination.md) (Footer 중앙) · [Select](./select.md) (Page size · 필터 조건) · [Text Input](./text-input.md) · [Multi Select](./multi-select.md) Option · [Button](./button.md) (필터 popover) > [!NOTE] > **출처는 `GRID_기능정의.pptx` 입니다** > `WG2 작업폴더/디벨럭스/김유진/GRID_기능정의.pptx` (2026-08-25, 슬라이드 2장)에 정의된 > GRID 기능 ①~⑥ 과 Column 기능 Ⓐ~Ⓕ 를 그대로 옮겼습니다. 문구(`총 건수 : %NUM%` · > `로딩중입니다` · `조회된 데이터가 없습니다`)와 동작 규칙(정렬 순서, 페이지 번호 10개 상한, > Row 개수 기본 100)은 원본 그대로이고, 치수·토큰은 `styles/elements/grid.css` 에서 > 실측했습니다. seed · Codeit 에는 대응 항목이 없습니다. **기능 정의 대응표** | 원본 | 이 문서 | 비고 | | --- | --- | --- | | ① 총 건수 : %NUM% | [총 건수](#총-건수) | 숫자 FORMATTER 적용. Footer 좌측 | | ② PAGINATION | [Pagination](#pagination) | 처음 / 이전 / 번호 최대 10 / 다음 / 마지막. Footer 중앙. 별도 컴포넌트로 분리 | | ③ Grid row 개수 설정 | [Page size](#page-size) | Default 100, Option 100·500·1000. Footer 우측, 컨트롤은 Select | | ④ 헤더 고정 · 가로 스크롤 | [헤더 고정 · 가로 스크롤](#헤더-고정--가로-스크롤) | | | ⑤ 데이터 조회시 로딩화면 | [로딩](#로딩) | `로딩중입니다` | | ⑥ 데이터가 없는 CASE | [조회 결과 없음](#조회-결과-없음) | `조회된 데이터가 없습니다` | | Ⓐ ROW CHECKBOX | [행 선택](#행-선택) | HEADER CHECKBOX → 전체 행 | | Ⓑ COLUMN MOVE | [컬럼 이동](#컬럼-이동) | 드래그로 순서 변경 | | Ⓒ 정렬 | [정렬](#정렬) | 내림차 → 오름차 → 기본값 | | Ⓓ COLUMN RESIZE | [컬럼 너비 조절](#컬럼-너비-조절) | 드래그로 너비 조절 | | Ⓔ COLUMN PINNED | [컬럼 고정](#컬럼-고정) | 가로 스크롤 고정 | | Ⓕ COLUMN FILTER | [컬럼 필터](#컬럼-필터) | 텍스트 필터 + 데이터 필터 popover. 원본에 세부 설명이 없어 구성은 이 문서에서 정의 | --- ## 1. 구성 위에서 아래로 **Header** · **Body** · **Footer** 세 층입니다. 스크롤은 Header 와 Body 를 감싸는 영역에만 걸리고, Footer 는 그 바깥에 남아 항상 보입니다. ``` ┌─ ⓪ atom-grid ────────────────────────────────────────────────┐ │┌─ __scroll ─────────────────────────────────────────────────┐│ ││ [■] │ 항목명 ▾ ┆ │ 상태 ⏷ ┆ │ 수량 ▴▾ │ ← ① Header (sticky) ││ ││ [✓] │ 항목 A-01 │ 사용중 │ 1,240 │ ← ④ Body row (선택) ││ ││ [ ] │ 항목 A-02 │ 대기 │ 0 │ ││ ││ ② ③ Pinned column ││ │└────────────────────────────────────────────────────────────┘│ │ 총 건수 : 1,284 « ‹ 1 2 3 › » [100 ▾] │ │ ⑤ Footer 좌 ⑥ Footer 중앙 ⑦ Footer 우 │ └──────────────────────────────────────────────────────────────┘ ``` | # | 요소 | 필수 | 클래스 | 설명 | |---|---|---|---|---| | ⓪ | Container | 필수 | `atom-grid` | `data-state` 와 크기 modifier 를 가집니다. 높이를 주면 `__scroll` 이 남는 공간을 채웁니다. | | — | Scroll | 필수 | `atom-grid__scroll` | 세로·가로 스크롤 영역. 안에 `__table` · `__overlay` · `__empty` 가 들어갑니다. | | ① | Header | 필수 | `atom-grid__thead` · `__th` · `__th-inner` · `__th-label` | 컬럼 이름과 정렬·필터·너비 조절·이동 컨트롤이 모두 여기 붙습니다. (`__th-sort` · `__th-filter` · `__th-grip` · `__th-resize`) | | ② | Row checkbox | 선택 | `atom-grid__th--check` · `__td--check` · `__check` | 행 선택입니다. Header 의 체크박스는 전체 선택을 담당합니다. | | ③ | Pinned column | 선택 | `atom-grid__th--pinned` · `__td--pinned` | 가로 스크롤에서 제자리에 남는 컬럼입니다. | | ④ | Body row | 필수 | `atom-grid__tbody` · `__tr` · `__td` | 선택되면 배경이 바뀝니다. | | ⑤ | Footer 좌 | 필수 | `atom-grid__footer` · `__count` · `__count-value` | 총 건수입니다. | | ⑥ | Footer 중앙 | 필수 | `atom-pagination` | [Pagination](./pagination.md). 처음 / 이전 / 번호 / 다음 / 마지막입니다. | | ⑦ | Footer 우 | 필수 | `atom-grid__page-size` | Page size. 한 페이지에 담을 행 수입니다. | | — | Loading overlay | `loading` 일 때 | `atom-grid__overlay` · `__spinner` · `__overlay-text` | 표 위에 덮는 오버레이입니다. | | — | Empty | `empty` 일 때 | `atom-grid__empty` · `__empty-text` | Body 자리에 놓이는 안내 문구입니다. | | — | Filter popover | 필터를 열 때 | `atom-grid__filter-popover` · `__filter-group` · `__filter-title` · `__filter-row` · `__filter-list` · `__filter-divider` · `__filter-actions` | `__scroll` 바깥, `.atom-grid` 기준으로 배치합니다. | 계층을 켜면 컬럼 하나에 부품이 셋 더 붙습니다. [트리](#트리) 에서 다룹니다. | # | 요소 | 필수 | 클래스 | 설명 | |---|---|---|---|---| | — | Tree cell | `treeData` 일 때 | `atom-grid__td--tree` · `__tree-cell` · `__tree-label` | 캐럿과 이름을 담는 셀 안의 행입니다. 계층을 지는 컬럼에만 있습니다. | | — | Tree caret | `treeData` 일 때 | `atom-grid__tree-caret` (잎: `--empty`) | 가지를 여닫는 버튼입니다. 잎에서는 자리만 남고 글리프가 사라집니다. | | — | Tree count | 선택 | `atom-grid__tree-count` | 부모 행 뒤의 자손 수입니다. 끌 수 있습니다. | --- ## 2. 종류 / 크기 ### Footer 구성 **총 건수 · Pagination · Page size** 를 한 줄에 왼쪽부터 순서대로 둡니다. 셋 다 조회 상태를 다루므로 Footer 한 곳에 모읍니다. | 위치 | 요소 | 역할 | | --- | --- | --- | | 좌 | `__count` | 지금 조회된 전체 결과 수 | | 중앙 | `atom-pagination` | 페이지 이동. Grid 와 별개인 독립 블록입니다 | | 우 | `__page-size` | 한 페이지에 담을 행 수 | > [!NOTE] > **Pager 는 Grid 기준으로 가운데입니다** > 양옆 요소 사이의 남는 공간이 아닌 Grid 전체 폭을 기준으로 중앙에 둡니다. 총 건수의 > 자릿수가 바뀌어도 페이지 번호 위치가 유지됩니다. ### 총 건수 Footer 왼쪽 끝에 놓입니다. 필터와 검색이 적용된 뒤의 **전체 결과 수**입니다. 현재 페이지에 그려진 행 수가 아닙니다. 숫자에는 천 단위 구분 포맷터를 적용하고, 자리수가 흔들리지 않도록 `tabular-nums` 로 렌더합니다. > [!NOTE] > **0 건도 숫자로 씁니다** > 결과가 없을 때도 `총 건수 : 0` 을 그대로 보여줍니다. 건수 줄이 없으면 조회 실패와 결과 > 없음을 구분할 수 없습니다. ### Pagination Footer 가운데입니다. 처음 / 이전 / 페이지 번호 / 다음 / 마지막 다섯 부분이고, 번호는 **한 번에 최대 10개**까지만 노출합니다. [Pagination](./pagination.md) 컴포넌트를 그대로 씁니다. 컨트롤별 동작과 비활성 조건, 번호 창이 넘어가는 규칙은 그쪽 문서에 있습니다. Grid 에서 정하는 규칙은 두 가지입니다. **Footer 가운데에 둡니다.** **결과가 0건이어도 `1` 을 비활성으로 남깁니다.** ### Page size Footer 오른쪽 끝입니다. 값이 셋뿐인 단일 선택이므로 컨트롤은 [Select](./select.md) 를 그대로 씁니다. 기본값은 `100`, 선택지는 `100` · `500` · `1000` 입니다. > [!WARNING] > **Select 마크업을 그대로 씁니다** > `atom-select` 는 블록 요소여야 폭을 가지고, `__trigger` 는 ` ``` 계층을 켰을 때입니다. 표가 `role="treegrid"` 가 되고, 각 행이 자기 깊이와 펼침 상태를 답니다. ```html
분류 A (3) 사용중
항목 A-01 사용중
```