sellmate-design-system-react 8.1.0 → 9.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +176 -111
- package/README.md +38 -8
- package/dist/components/SChipFilter/README.md +69 -0
- package/dist/components/SChipFilter/SChipFilter.d.ts +160 -0
- package/dist/components/SChipFilter/index.d.ts +1 -0
- package/dist/components/SCircleProgress/README.md +3 -0
- package/dist/components/SCircleProgress/SCircleProgress.d.ts +7 -1
- package/dist/components/SDatePicker/README.md +2 -0
- package/dist/components/SDateRangePicker/README.md +21 -0
- package/dist/components/SDateRangePicker/SDateRangePicker.d.ts +16 -0
- package/dist/components/SDateRangePicker/index.d.ts +1 -1
- package/dist/components/SGhostButton/README.md +4 -0
- package/dist/components/SGuide/README.md +1 -1
- package/dist/components/SGuide/SGuide.d.ts +1 -1
- package/dist/components/SIcon/README.md +4 -0
- package/dist/components/SIcon/icons.gen.d.ts +1 -0
- package/dist/components/SImage/README.md +44 -0
- package/dist/components/SImage/SImage.d.ts +41 -0
- package/dist/components/SImage/index.d.ts +1 -0
- package/dist/components/SList/README.md +1 -0
- package/dist/components/SList/SList.d.ts +2 -0
- package/dist/components/SListItem/README.md +2 -2
- package/dist/components/SListItem/SListItem.d.ts +2 -2
- package/dist/components/SPage/README.md +21 -0
- package/dist/components/SPage/SPage.d.ts +10 -0
- package/dist/components/SPage/SPageHeader.d.ts +32 -0
- package/dist/components/SPage/index.d.ts +1 -0
- package/dist/components/SPortal/README.md +1 -1
- package/dist/components/SPortal/SPortal.d.ts +7 -1
- package/dist/components/SRadio/README.md +2 -0
- package/dist/components/SRadioButton/README.md +13 -0
- package/dist/components/SSelect/README.md +2 -2
- package/dist/components/SSelect/SSelect.d.ts +2 -2
- package/dist/components/STag/README.md +2 -0
- package/dist/components/STextLink/README.md +2 -0
- package/dist/components/SToggle/README.md +1 -0
- package/dist/components/SToggle/SToggle.d.ts +4 -1
- package/dist/components/STooltip/README.md +2 -0
- package/dist/index.cjs +1830 -319
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1826 -319
- package/dist/index.js.map +1 -1
- package/dist/lib/floating-width.d.ts +22 -0
- package/dist/llms-full.txt +343 -118
- package/dist/llms.txt +180 -114
- package/dist/styles.css +218 -16
- package/dist/theme.css +12 -5
- package/eslint/scale.gen.mjs +1 -1
- package/package.json +7 -4
package/dist/llms-full.txt
CHANGED
|
@@ -37,10 +37,10 @@
|
|
|
37
37
|
| **버튼·링크** | `SButton` `SGhostButton` `SDropdownButton` `STextLink` `SSwitch` `SToggle` |
|
|
38
38
|
| **입력 (폼)** | `SForm` `SField` `SInput` `SNumberInput` `STextarea` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SChip` `SChipInput` `SBarcodeInput` `SFilePicker` |
|
|
39
39
|
| **날짜·시간** | `SCalendar` `SDatePicker` `SDateRangePicker` `STimePicker` `STimeRangePicker` |
|
|
40
|
-
| **표·목록** | `STable` `STableBar` `SKeyValueTable` `SList` `SListItem` `SExpansionList` `SDraggableList` `SDraggableItem` `STree` |
|
|
41
|
-
| **레이아웃** | `SLayout` `SGnb` `SPage` `SSectionHeaderCard` `SCard` `SDivider` `SSplitter` `SScrollArea` `SExpansionItem` |
|
|
40
|
+
| **표·목록** | `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SListItem` `SExpansionList` `SDraggableList` `SDraggableItem` `STree` |
|
|
41
|
+
| **레이아웃** | `SLayout` `SGnb` `SPage`(제목 영역은 `header` prop) `SSectionHeaderCard` `SCard` `SDivider` `SSplitter` `SScrollArea` `SExpansionItem` |
|
|
42
42
|
| **내비게이션** | `STabs` `SPagination` `SStepper` |
|
|
43
|
-
| **표시·상태** | `STag` `SBadge` `SIcon` `SCallout` `SGuide` |
|
|
43
|
+
| **표시·상태** | `STag` `SBadge` `SIcon` `SImage` `SCallout` `SGuide` |
|
|
44
44
|
| **진행·로딩** | `SLinearProgress` `SCircleProgress` `SLoadingContainer` `SLoadingModal` |
|
|
45
45
|
| **오버레이** | `STooltip` `SPopover` `SPopup` `SDrawer` `SPortal` |
|
|
46
46
|
| **모달** | `SModal.confirm()` `SModal.create()` + `SActionModal` `SConfirmModal` `SModalOutlet`(앱 루트 1회) |
|
|
@@ -144,9 +144,9 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
144
144
|
|
|
145
145
|
| 층 | 무엇인가 | 컴포넌트 |
|
|
146
146
|
| --- | --- | --- |
|
|
147
|
-
| **셸** | 앱 전체 뼈대. 페이지가 바뀌어도 남는다 | `SLayout` `SGnb` `SPage` |
|
|
148
|
-
| **블록** | `SPage` 의 직계 자식. 페이지를 세로로 쌓는 단위 | `SSectionHeaderCard` `SCard` `SForm` `SSplitter` `SScrollArea` `STable` `STableBar` `SKeyValueTable` `SList` `SExpansionList` `SDraggableList` `STree` `SCallout` `STabs` `SStepper` `SPagination` `SDivider` |
|
|
149
|
-
| **요소** | 블록 **안에** 놓이는 컨트롤. 혼자 페이지에 서지 않는다 | `SButton` `SGhostButton` `SDropdownButton` `SField` `SInput` `SNumberInput` `STextarea` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SSwitch` `SToggle` `SChipInput` `SBarcodeInput` `SFilePicker` `SDatePicker` `SDateRangePicker` `STimePicker` `STimeRangePicker` `SCalendar` `SListItem` `SExpansionItem` `SDraggableItem` `SLinearProgress` `SCircleProgress` |
|
|
147
|
+
| **셸** | 앱 전체 뼈대. 페이지가 바뀌어도 남는다 | `SLayout` `SGnb` `SPage`(제목 영역은 `header` prop) |
|
|
148
|
+
| **블록** | `SPage` 의 직계 자식. 페이지를 세로로 쌓는 단위 | `SSectionHeaderCard` `SCard` `SForm` `SSplitter` `SScrollArea` `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SExpansionList` `SDraggableList` `STree` `SCallout` `STabs` `SStepper` `SPagination` `SDivider` |
|
|
149
|
+
| **요소** | 블록 **안에** 놓이는 컨트롤. 혼자 페이지에 서지 않는다 | `SButton` `SGhostButton` `SDropdownButton` `SField` `SInput` `SNumberInput` `STextarea` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SSwitch` `SToggle` `SChipInput` `SBarcodeInput` `SFilePicker` `SDatePicker` `SDateRangePicker` `STimePicker` `STimeRangePicker` `SCalendar` `SListItem` `SExpansionItem` `SDraggableItem` `SImage` `SLinearProgress` `SCircleProgress` |
|
|
150
150
|
| **인라인** | 텍스트 흐름·셀·라벨 안에 섞인다. 혼자 블록이 되지 않는다 | `STag` `SBadge` `SIcon` `STextLink` `SChip` |
|
|
151
151
|
| **레이어** | 문서 흐름 **밖**에 떠서 그려진다. 어느 층에서 띄우든 레이아웃에 영향이 없다 | `SModal` `SActionModal` `SConfirmModal` `SPopup` `SDrawer` `SPopover` `STooltip` `SPortal` `SToast` `SLoadingModal` `SLoadingContainer` `SGuide` |
|
|
152
152
|
|
|
@@ -194,9 +194,9 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
194
194
|
블록 순서는 화면 종류와 무관하게 같다. **필요한 것만 남기되 순서를 바꾸지 않는다.**
|
|
195
195
|
|
|
196
196
|
```text
|
|
197
|
-
1. 페이지 제목 (+ 가이드·매뉴얼
|
|
197
|
+
1. 페이지 제목 `SPage` 의 `header` prop (+ 가이드·매뉴얼 링크는 slot. 액션 버튼은 오지 않는다 §4-2)
|
|
198
198
|
2. 상시 안내 SCallout
|
|
199
|
-
3. 필터 SKeyValueTable
|
|
199
|
+
3. 필터 SKeyValueTable · SChipFilter (§3-7-11)
|
|
200
200
|
4. 툴바 STableBar (건수 요약 + 액션)
|
|
201
201
|
5. 본문 STable · 섹션 카드들 · SList …
|
|
202
202
|
6. 페이지네이션 SPagination (STable 이 pagination prop 으로 직접 그린다)
|
|
@@ -222,7 +222,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
222
222
|
|
|
223
223
|
| 층 (§2-0) | 역할 | 클래스 | 크기 |
|
|
224
224
|
| --- | --- | --- | --- |
|
|
225
|
-
| 셸 | 페이지 제목 (
|
|
225
|
+
| 셸 | 페이지 제목 (`SPage` 의 `header.title`) | `typo-heading-lg` | 18px |
|
|
226
226
|
| 블록 | 섹션 제목 | `typo-heading-sm` | 14px |
|
|
227
227
|
| 블록 내부 | 하위 제목 (섹션 안을 더 나눌 때) | `typo-heading-xs` | 12px |
|
|
228
228
|
| — | 본문 | `typo-body-sm-default` | 12px |
|
|
@@ -230,7 +230,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
230
230
|
|
|
231
231
|
페이지 제목만 18px 로 크게 두고 그 아래는 14 / 12 로 촘촘하게 간다. 중간 크기(16px)는 기본 골격에서 쓰지 않는다.
|
|
232
232
|
|
|
233
|
-
-
|
|
233
|
+
- **페이지·섹션 제목의 타이포를 직접 주지 않는다.** `SPage` 의 `header.title`, `SSectionHeaderCard.Header` 의 `title` 이 이미 넣는다 — 그 위에 `typo-heading-lg`/`typo-heading-sm` 을 또 씌우지 않는다.
|
|
234
234
|
- **하위 제목이 필요하면 먼저 섹션을 나눌 수 없는지 본다.** 한 섹션 안에서 제목이 두 단으로 갈린다는 것은 대개 섹션이 둘이라는 뜻이다 (§3-7-8).
|
|
235
235
|
- 본문 안에서 한 단어를 강조할 때는 `typo-body-sm-medium` 을 쓴다. `typo-body-sm-bold` 는 제목 성격의 짧은 라벨에만 쓴다. <!-- TODO(디자인): 강조 굵기 기준 확정 -->
|
|
236
236
|
|
|
@@ -434,6 +434,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
434
434
|
| 컨트롤에 라벨·필수·에러를 붙인다 | `SField` | §3-7-5 |
|
|
435
435
|
| 입력 여러 개를 묶어 한 번에 검증한다 | `SForm` | §4-3 |
|
|
436
436
|
| 폼·필터를 표 형태로 배치한다 | `SKeyValueTable` | §4 |
|
|
437
|
+
| 필요한 검색 조건만 칩으로 골라 붙이게 한다 | `SChipFilter` | §3-7-11 |
|
|
437
438
|
|
|
438
439
|
#### B. 정보를 읽게 보여준다
|
|
439
440
|
|
|
@@ -449,6 +450,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
449
450
|
| 상태·분류를 라벨로 찍는다 | `STag` | §3-1 |
|
|
450
451
|
| 색 점만으로 상태를 찍는다 | `SBadge` | §3-1 |
|
|
451
452
|
| 아이콘을 넣는다 | `SIcon` | |
|
|
453
|
+
| 사진·썸네일을 보여준다 (로딩·실패 상태 포함) | `SImage` | §3-7-12 |
|
|
452
454
|
| 문장 안에서 다른 화면으로 보낸다 | `STextLink` | §3-5-6 |
|
|
453
455
|
|
|
454
456
|
#### C. 동작을 실행시킨다
|
|
@@ -466,6 +468,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
466
468
|
| 앱 셸(상단바 + 내비 + 본문)을 세운다 | `SLayout` | §4-1 |
|
|
467
469
|
| 좌측 내비게이션을 만든다 | `SGnb` | §4-1 |
|
|
468
470
|
| 페이지 본문을 담는다 (패딩·스크롤) | `SPage` | §4-1 |
|
|
471
|
+
| 페이지 제목(+ 서브 텍스트·뒤로가기·우측 슬롯)을 만든다 | `SPage` 의 `header` prop | §4-1 |
|
|
469
472
|
| 제목 있는 섹션으로 묶는다 | `SSectionHeaderCard` | §3-7-8 |
|
|
470
473
|
| 제목 없이 흰 면으로만 묶는다 | `SCard` | §3-7-8 |
|
|
471
474
|
| 가로선으로 끊는다 | `SDivider` | §3-6 |
|
|
@@ -1032,6 +1035,16 @@ const columns: STableColumn[] = [
|
|
|
1032
1035
|
|
|
1033
1036
|
- **항목 하나의 속성을 나열하는 것은 목록이 아니다.** `라벨: 값` 이 세로로 쌓이는 것은 `SKeyValueTable` 이다 (§4-4).
|
|
1034
1037
|
- `SList` 는 레이아웃만 담당한다. 펼침·단일 선택 동작이 필요하면 `SExpansionList` 다 (§3-7-7).
|
|
1038
|
+
- **항목 사이 구분선은 리스트가 그린다.** `SListItem`·`SExpansionItem`·`SDraggableItem` 셋 다 스스로 구분선을 그리지 않으므로, 목록을 감싸는 `SList`·`SExpansionList`·`SDraggableList` 에 `separator` 를 준다 — 아이템에 `border-b` 를 직접 붙이지 않는다. 테두리형(`bordered`)은 테두리가 구분 역할을 하므로 `separator` 대신 `useGap` 으로 띄운다.
|
|
1039
|
+
- **`SListItem` 은 기본이 표시 전용이다.** 눌러서 이동·선택하게 하려면 `clickable` 을 준다 — hover·`selected`·`interaction="chevron"` 표현이 전부 여기에 딸려 있어서, `clickable` 없이 `selected` 만 주면 선택 표시가 나오지 않는다. `SExpansionList` 는 선택을 자기가 관리하므로 자식 아이템을 알아서 클릭 가능하게 만든다.
|
|
1040
|
+
|
|
1041
|
+
```tsx
|
|
1042
|
+
✅ <SList separator><SListItem title="일반 문의" />…</SList> {/* 줄로 구분되는 목록 */}
|
|
1043
|
+
✅ <SList useGap><SListItem title="일반 문의" bordered />…</SList> {/* 카드처럼 떨어진 목록 */}
|
|
1044
|
+
✅ <SListItem title="일반 문의" clickable selected onClick={…} /> {/* 눌러서 고르는 목록 */}
|
|
1045
|
+
❌ <SList><SListItem title="일반 문의" className="border-b" />…</SList>
|
|
1046
|
+
❌ <SListItem title="일반 문의" selected /> {/* clickable 없으면 선택 표시가 안 나온다 */}
|
|
1047
|
+
```
|
|
1035
1048
|
|
|
1036
1049
|
#### 3-7-7. 펼치는 셋 — SExpansionItem vs SExpansionList vs STree
|
|
1037
1050
|
|
|
@@ -1041,7 +1054,7 @@ const columns: STableColumn[] = [
|
|
|
1041
1054
|
| **한 번에 하나만** 열려야 한다 (아코디언) | `SExpansionList` + `SExpansionItem` |
|
|
1042
1055
|
| **부모-자식 계층 자체**를 보여줘야 한다 (2단 이상, 연결선) | `STree` |
|
|
1043
1056
|
|
|
1044
|
-
`SExpansionList` 는 depth 별 단일 확장·선택을 관리하는 wrapper 다. 직접 `useState` 로 "열린 항목 하나"를 들고 있지 않는다.
|
|
1057
|
+
`SExpansionList` 는 depth 별 단일 확장·선택을 관리하는 wrapper 다. 직접 `useState` 로 "열린 항목 하나"를 들고 있지 않는다. 항목 사이 구분선은 여기서도 리스트가 그린다 — `separator` 를 준다 (§3-7-6).
|
|
1045
1058
|
|
|
1046
1059
|
#### 3-7-8. SCard vs SSectionHeaderCard
|
|
1047
1060
|
|
|
@@ -1067,6 +1080,37 @@ const columns: STableColumn[] = [
|
|
|
1067
1080
|
|
|
1068
1081
|
`STooltip`·`SPopover`·`SSelect`·날짜 피커가 내부에서 쓰는 저수준 레이어다. 앵커에 붙여 띄우는 동작이 필요하면 **먼저 §3-3 에서 대응 컴포넌트를 찾는다.** `SPortal` 을 직접 쓰는 것은 그 넷 중 어느 것도 아닌 새로운 부착형 레이어를 만들 때뿐이고, 그때도 모달 안에서 열릴 수 있다면 소속 컨테이너를 맞춰야 한다.
|
|
1069
1082
|
|
|
1083
|
+
#### 3-7-11. 필터 둘 — SKeyValueTable vs SChipFilter
|
|
1084
|
+
|
|
1085
|
+
둘 다 §2-0 블록 순서의 **3번 자리(필터)** 에 놓이고, 한 화면에 둘을 같이 두지 않는다.
|
|
1086
|
+
|
|
1087
|
+
| 상황 | 컴포넌트 |
|
|
1088
|
+
| --- | --- |
|
|
1089
|
+
| 조건이 정해져 있고 **항상 다 보여야** 한다 (기본 형태) | `SKeyValueTable` |
|
|
1090
|
+
| 조건 후보가 많아 **쓸 것만 골라 붙이고** 나머지는 숨겨야 한다 | `SChipFilter` |
|
|
1091
|
+
|
|
1092
|
+
- **기본은 `SKeyValueTable` 이다** (§4-2). 조건이 대여섯 개 이하로 고정이면 표로 펼쳐 두는 편이 한눈에 읽힌다.
|
|
1093
|
+
- `SChipFilter` 는 조건을 **칩 한 줄**로 접고, "필터 추가" 로 필요한 것만 꺼내 쓰게 한다. 칩을 누르면 편집 팝오버가 열리고, 날짜는 프리셋(오늘·지난 7일·사용자 지정)으로 고른다. 조건 후보가 많은 목록 화면에서 필터가 화면을 세로로 잡아먹는 것을 막는 용도다.
|
|
1094
|
+
- 검색 실행 시점이 다르다 — `SKeyValueTable` 필터는 앱이 검색 버튼을 직접 놓지만, `SChipFilter` 는 편집 팝오버가 닫히거나 "검색" 을 누를 때 `onSearch` 가 값 맵과 함께 호출된다. 값이 바뀌지 않았으면 호출되지 않는다.
|
|
1095
|
+
- 함께 걸어야 하는 조건(예: 기간 중 하나는 필수)이 있으면 `fields` 를 그룹으로 넘긴다. 규칙을 못 채운 동안 경고 툴팁이 떠 있고 `onSearch` 가 막힌다.
|
|
1096
|
+
|
|
1097
|
+
#### 3-7-12. 이미지 — SImage
|
|
1098
|
+
|
|
1099
|
+
사진·썸네일은 `<img>` 를 직접 쓰지 않고 `SImage` 를 쓴다. **로딩·실패 상태를 컴포넌트가 이미 처리하기 때문이다.**
|
|
1100
|
+
|
|
1101
|
+
- **로딩 스피너와 실패 표시를 앱이 만들지 않는다.** `src` 가 없거나 로드에 실패하면 빈 이미지 아이콘이, 로딩 중에는 스피너가 자동으로 놓인다. 크기는 상자 높이에 비례하므로 썸네일이든 큰 미리보기든 따로 맞출 것이 없다.
|
|
1102
|
+
- **크기는 `ratio` 와 너비로 준다.** `ratio` 기본값이 `1`(정사각형)이라 너비만 주면 정사각형이 된다. `className`/`style` 로 높이를 직접 주면 그쪽이 이기고 `ratio` 는 무시된다.
|
|
1103
|
+
- 상자를 채우는 방식은 `fit`(기본 `cover`), 붙는 위치는 `position` 이다. 안쪽 `<img>` 에 네이티브 속성이 필요하면 `imgProps` 로 넘긴다 — 목록에서 고스트 드래그를 막는 `imgProps={{ draggable: false }}` 가 대표적이다.
|
|
1104
|
+
- 썸네일이 많은 목록에서는 `loadingShowDelay` 를 준다. 캐시된 이미지가 즉시 로드될 때 스피너가 한 프레임 번쩍이는 것을 막는다.
|
|
1105
|
+
|
|
1106
|
+
```tsx
|
|
1107
|
+
✅ <SImage src={item.thumbnailUrl} alt={item.name} style={{ width: 64 }} /> {/* 정사각 썸네일 */}
|
|
1108
|
+
✅ <SImage src={banner} ratio={16 / 9} className="w-full" /> {/* 가로형 배너 */}
|
|
1109
|
+
|
|
1110
|
+
❌ <img src={item.thumbnailUrl} /> {/* 로딩·실패 상태가 없다 */}
|
|
1111
|
+
❌ {loading ? <SCircleProgress indeterminate /> : <SImage src={url} />} {/* SImage 가 이미 한다 */}
|
|
1112
|
+
```
|
|
1113
|
+
|
|
1070
1114
|
---
|
|
1071
1115
|
|
|
1072
1116
|
## 4. 페이지 레시피 — 표준 골격
|
|
@@ -1077,11 +1121,12 @@ const columns: STableColumn[] = [
|
|
|
1077
1121
|
>
|
|
1078
1122
|
> **핵심 원칙 — 표 형태의 정보는 `SKeyValueTable` 로 만든다.** 필터·등록/수정 폼·상세 정보가 모두 여기 해당한다.
|
|
1079
1123
|
> `SField` 컨트롤을 `div` 로 직접 나열해 폼을 만들지 않는다.
|
|
1124
|
+
> (필터만 예외가 하나 있다 — 조건 후보가 많아 골라 붙이게 해야 하면 `SChipFilter` 다. §3-7-11)
|
|
1080
1125
|
|
|
1081
1126
|
### 4-1. 앱 셸 (모든 페이지 공통)
|
|
1082
1127
|
|
|
1083
1128
|
```tsx
|
|
1084
|
-
import { SLayout, SGnb, SPage, type SGnbMenuItem } from 'sellmate-design-system-react';
|
|
1129
|
+
import { SLayout, SGnb, SPage, type SGnbMenuItem, type SPageHeaderProps } from 'sellmate-design-system-react';
|
|
1085
1130
|
|
|
1086
1131
|
const MENU: SGnbMenuItem[] = [
|
|
1087
1132
|
{ label: '주문', value: 'orders', icon: 'bill' },
|
|
@@ -1090,20 +1135,32 @@ const MENU: SGnbMenuItem[] = [
|
|
|
1090
1135
|
|
|
1091
1136
|
export default function AppShell({
|
|
1092
1137
|
children,
|
|
1138
|
+
header,
|
|
1093
1139
|
scrollEndSpacing,
|
|
1094
|
-
}: { children: React.ReactNode; scrollEndSpacing?: boolean }) {
|
|
1140
|
+
}: { children: React.ReactNode; header?: SPageHeaderProps; scrollEndSpacing?: boolean }) {
|
|
1095
1141
|
return (
|
|
1096
1142
|
<SLayout type="box" header="fix">
|
|
1097
1143
|
{/* type/header/folded 는 SLayout 에만 준다 — SGnb 는 context 에서 읽는다 */}
|
|
1098
1144
|
<SGnb items={MENU} value={current} onValueChange={navigate} logo={<Logo />} />
|
|
1099
1145
|
{/* 콘텐츠 패딩은 SPage 가 토큰으로 넣는다 — p-sd-* 로 덮어쓰지 않는다 */}
|
|
1100
1146
|
{/* 스크롤 끝 여백도 SPage 가 넣는다. 끄는 건 페이지네이션 있는 목록뿐이라 페이지가 정한다 */}
|
|
1101
|
-
|
|
1147
|
+
{/* header 는 페이지마다 달라 AppShell 이 그대로 받아 넘긴다 — 페이지 제목은 여기서 만들지 않는다 */}
|
|
1148
|
+
<SPage background="frame" scrollEndSpacing={scrollEndSpacing} header={header}>
|
|
1149
|
+
{children}
|
|
1150
|
+
</SPage>
|
|
1102
1151
|
</SLayout>
|
|
1103
1152
|
);
|
|
1104
1153
|
}
|
|
1105
1154
|
```
|
|
1106
1155
|
|
|
1156
|
+
**페이지는 `AppShell` 을 직접 호출하며 자기 `header` 를 넘긴다** — SPage 는 셸 안에 하나뿐이므로, 페이지 제목이 페이지마다 다르다는 사실은 이렇게 프레임 컴포넌트를 통해 흘려보낸다(§4-2·§4-3·§4-4 참고).
|
|
1157
|
+
|
|
1158
|
+
**페이지 헤더(`header`) 사용 규칙 — 이 앱에서는 값이 아니라 값의 일관성이 규칙이다.**
|
|
1159
|
+
|
|
1160
|
+
- **`fix` 는 앱 전체에서 하나로 고정한다.** 어떤 페이지는 `fix: true`(바), 다른 페이지는 `fix: false`(투명) 로 섞어 쓰지 않는다. 프로젝트에서 하나를 고르면(예: 전부 `fix: true`) 모든 `header` 가 그 값을 쓴다.
|
|
1161
|
+
- **`slot`·`onBack` 도 페이지 성격이 실제로 다른 경우가 아니면 있는 대로 통일한다.** "목록 페이지엔 없고 상세·등록 페이지엔 있다"처럼 화면 종류에 따라 갈리는 것은 허용되지만, 같은 종류의 화면끼리는 임의로 넣었다 뺐다 하지 않는다.
|
|
1162
|
+
- **`slot` 은 `ReactNode` 를 그대로 받지만, 원칙은 `size="sm"` 버튼 위주로만 채운다.** `STextLink`·복잡한 커스텀 마크업을 슬롯에 넣지 않는다 — 그 이상이 필요하면 페이지 헤더가 아니라 §4-2 의 `STableBar` 처럼 본문 쪽 액션 자리를 쓴다.
|
|
1163
|
+
|
|
1107
1164
|
**GNB 폭을 사용자가 조절하게 하려면 `SGnb` 에 `resizable` 을 준다.** 메뉴 오른쪽 경계가 조절선이 되고, 레일 폭은 고정된 채 메뉴 컬럼만 늘고 준다. 범위는 컴포넌트가 정하므로 숫자를 직접 주지 않는다.
|
|
1108
1165
|
|
|
1109
1166
|
```tsx
|
|
@@ -1179,18 +1236,20 @@ import { SModalOutlet } from 'sellmate-design-system-react';
|
|
|
1179
1236
|
|
|
1180
1237
|
### 4-2. 목록 페이지 (필터 + 테이블)
|
|
1181
1238
|
|
|
1182
|
-
구조: **페이지 헤더(
|
|
1239
|
+
구조: **페이지 헤더(`AppShell` 의 `header` prop, 가이드 등 부가 액션은 slot) → 필터(`SKeyValueTable`) → `STableBar` → `STable`**
|
|
1240
|
+
|
|
1241
|
+
필터 자리는 `SChipFilter` 로 바꿔 놓을 수 있다 — 조건 후보가 많아 쓸 것만 골라 붙이게 하는 화면이면 그쪽이다 (§3-7-11). 나머지 골격은 같다.
|
|
1183
1242
|
|
|
1184
1243
|
액션 버튼의 위치가 핵심이다:
|
|
1185
1244
|
|
|
1186
|
-
- **페이지 제목 줄에는
|
|
1245
|
+
- **페이지 제목 줄에는 이 페이지의 주요 액션을 두지 않는다.** 부가적인 것만 `header.slot` 에 `SButton size="sm"` 으로 온다 (§4-1 "페이지 헤더 사용 규칙").
|
|
1187
1246
|
- **주요 액션(등록 등)은 `STableBar` 의 `rightActions`** 에 둔다.
|
|
1188
1247
|
- **선택 상태 액션(선택 삭제 등)은 `STableBar` 의 `actions`** 에 둔다. `actions` 슬롯은 건수 요약이 있으면 앞에 구분선(`SDivider`)을 **자동으로** 넣으므로 직접 구분선을 만들지 않는다.
|
|
1189
|
-
- **페이지네이션이 있으면 스크롤 끝 여백을 끈다** —
|
|
1248
|
+
- **페이지네이션이 있으면 스크롤 끝 여백을 끈다** — `AppShell` 에 `scrollEndSpacing={false}` 를 넘긴다 (§2-2). 페이지네이션이 이미 "여기서 끝"을 알려준다.
|
|
1190
1249
|
|
|
1191
1250
|
```tsx
|
|
1192
1251
|
import {
|
|
1193
|
-
SButton,
|
|
1252
|
+
SButton, SKeyValueTable, STableBar, STable, STag,
|
|
1194
1253
|
type STableColumn, type SRow, type SKeyValueField,
|
|
1195
1254
|
} from 'sellmate-design-system-react';
|
|
1196
1255
|
|
|
@@ -1228,55 +1287,58 @@ export default function ProductListPage() {
|
|
|
1228
1287
|
const [selected, setSelected] = useState<SRow[]>([]);
|
|
1229
1288
|
|
|
1230
1289
|
return (
|
|
1231
|
-
<
|
|
1232
|
-
{
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
<
|
|
1236
|
-
|
|
1290
|
+
<AppShell
|
|
1291
|
+
header={{
|
|
1292
|
+
title: '상품 목록',
|
|
1293
|
+
// 이 페이지의 주요 액션이 아니라 부가 액션 — slot 은 sm 버튼으로만 채운다
|
|
1294
|
+
slot: <SButton size="sm" color="neutral" outline label="이용 가이드" onClick={openGuide} />,
|
|
1295
|
+
}}
|
|
1296
|
+
scrollEndSpacing={false} // 페이지네이션이 있으므로 끈다
|
|
1297
|
+
>
|
|
1298
|
+
<div className="flex flex-col gap-sd-12">
|
|
1299
|
+
{/* 필터 — search 를 켜면 우측에 검색 패널이 붙는다 */}
|
|
1300
|
+
<SKeyValueTable
|
|
1301
|
+
fields={filterFields}
|
|
1302
|
+
values={filters}
|
|
1303
|
+
search
|
|
1304
|
+
onChange={({ values }) => setFilters(values)}
|
|
1305
|
+
onSearch={fetchList}
|
|
1306
|
+
/>
|
|
1237
1307
|
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
rowKey="id"
|
|
1266
|
-
selectable
|
|
1267
|
-
selected={selected}
|
|
1268
|
-
onSelectedChange={setSelected}
|
|
1269
|
-
pagination={{ currentPage, lastPage }}
|
|
1270
|
-
isLoading={isLoading}
|
|
1271
|
-
/>
|
|
1272
|
-
</div>
|
|
1308
|
+
{/* 툴바 — 좌: 건수 + (구분선 자동) + 선택 액션 / 우: 주요 액션 */}
|
|
1309
|
+
<STableBar
|
|
1310
|
+
total={total}
|
|
1311
|
+
selected={selected.length}
|
|
1312
|
+
actions={
|
|
1313
|
+
/* 선택 항목 단위 파괴 액션 → danger outline (§3-5-3) */
|
|
1314
|
+
<SButton size="sm" color="danger" outline label="선택 삭제"
|
|
1315
|
+
disabled={!selected.length} onClick={removeSelected} />
|
|
1316
|
+
}
|
|
1317
|
+
rightActions={
|
|
1318
|
+
/* 이 페이지의 유일한 primary 채움 (§3-5-1) */
|
|
1319
|
+
<SButton size="sm" label="상품 등록" onClick={goCreate} />
|
|
1320
|
+
}
|
|
1321
|
+
/>
|
|
1322
|
+
|
|
1323
|
+
<STable
|
|
1324
|
+
columns={columns}
|
|
1325
|
+
rows={rows}
|
|
1326
|
+
rowKey="id"
|
|
1327
|
+
selectable
|
|
1328
|
+
selected={selected}
|
|
1329
|
+
onSelectedChange={setSelected}
|
|
1330
|
+
pagination={{ currentPage, lastPage }}
|
|
1331
|
+
isLoading={isLoading}
|
|
1332
|
+
/>
|
|
1333
|
+
</div>
|
|
1334
|
+
</AppShell>
|
|
1273
1335
|
);
|
|
1274
1336
|
}
|
|
1275
1337
|
```
|
|
1276
1338
|
|
|
1277
1339
|
### 4-3. 폼 페이지 (등록/수정)
|
|
1278
1340
|
|
|
1279
|
-
구조: **페이지 제목 → `SForm` + `SKeyValueTable` → 하단 버튼**
|
|
1341
|
+
구조: **페이지 제목(`AppShell` 의 `header` prop) → `SForm` + `SKeyValueTable` → 하단 버튼**
|
|
1280
1342
|
|
|
1281
1343
|
- 필드를 `div` 로 나열하지 않고 **`SKeyValueTable` 의 행으로 구성**한다.
|
|
1282
1344
|
- 검증 규칙은 각 field 의 `options.rules` 로 넘긴다. `SForm` 이 하위 컨트롤을 자동 수집해 submit 시 일괄 검증하고, 실패 시 첫 실패 필드로 포커스를 옮긴다.
|
|
@@ -1314,33 +1376,33 @@ export default function ProductCreatePage() {
|
|
|
1314
1376
|
const [values, setValues] = useState<Record<string, unknown>>({});
|
|
1315
1377
|
|
|
1316
1378
|
return (
|
|
1317
|
-
<
|
|
1318
|
-
<
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1379
|
+
<AppShell header={{ title: '상품 등록', onBack: goBack }}>
|
|
1380
|
+
<div className="flex flex-col gap-sd-12">
|
|
1381
|
+
<SForm ref={formRef} formClass="flex flex-col gap-sd-12" onSubmit={save}>
|
|
1382
|
+
<SKeyValueTable
|
|
1383
|
+
fields={fields}
|
|
1384
|
+
values={values}
|
|
1385
|
+
onChange={({ values }) => setValues(values)}
|
|
1386
|
+
/>
|
|
1387
|
+
|
|
1388
|
+
{/* 하단 버튼은 양끝으로 벌린다. 부가 요소(체크박스 등)는 저장 바로 왼쪽 */}
|
|
1389
|
+
<div className="flex items-center justify-between">
|
|
1390
|
+
<SButton type="button" color="neutral" outline label="취소" onClick={goBack} />
|
|
1391
|
+
<div className="flex items-center gap-sd-8">
|
|
1392
|
+
<SCheckbox label="계속 등록하기" value={keepOpen} onValueChange={v => setKeepOpen(v as boolean)} />
|
|
1393
|
+
<SButton type="submit" label="저장" />
|
|
1394
|
+
</div>
|
|
1333
1395
|
</div>
|
|
1334
|
-
</
|
|
1335
|
-
</
|
|
1336
|
-
</
|
|
1396
|
+
</SForm>
|
|
1397
|
+
</div>
|
|
1398
|
+
</AppShell>
|
|
1337
1399
|
);
|
|
1338
1400
|
}
|
|
1339
1401
|
```
|
|
1340
1402
|
|
|
1341
1403
|
### 4-4. 상세(조회) 페이지
|
|
1342
1404
|
|
|
1343
|
-
구조: **페이지 헤더(
|
|
1405
|
+
구조: **페이지 헤더(`AppShell` 의 `header` prop, 목록에서 들어오는 뒤로가기는 onBack) → 섹션별 `SSectionHeaderCard` + `SKeyValueTable` → 하단 버튼**
|
|
1344
1406
|
|
|
1345
1407
|
- 조회 값은 `type: 'text'` 행으로 표시한다. **상태·분류 태그도 별도 영역이 아니라 표의 한 행**으로 넣는다 (`render` 에 `STag`).
|
|
1346
1408
|
- 행이 많아지면 **유형별로 섹션을 나누고, 각 섹션을 `SSectionHeaderCard` 로 감싼다.**
|
|
@@ -1374,38 +1436,39 @@ const priceFields: SKeyValueField[][] = [
|
|
|
1374
1436
|
|
|
1375
1437
|
export default function ProductDetailPage() {
|
|
1376
1438
|
return (
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1439
|
+
// 목록에서 들어온 상세 페이지 — onBack 으로 뒤로가기를 준다
|
|
1440
|
+
<AppShell header={{ fix: true, title: '클래식 셔츠', onBack: goList }}>
|
|
1441
|
+
<div className="flex flex-col gap-sd-12">
|
|
1442
|
+
<SSectionHeaderCard>
|
|
1443
|
+
<SSectionHeaderCard.Header title="기본 정보" marker thickness="accent" />
|
|
1444
|
+
<SSectionHeaderCard.Body>
|
|
1445
|
+
<SKeyValueTable fields={basicFields} values={product} />
|
|
1446
|
+
</SSectionHeaderCard.Body>
|
|
1447
|
+
</SSectionHeaderCard>
|
|
1448
|
+
|
|
1449
|
+
<SSectionHeaderCard>
|
|
1450
|
+
{/* 헤더 우측에 액션이 필요하면 slot 을 쓴다 */}
|
|
1451
|
+
<SSectionHeaderCard.Header
|
|
1452
|
+
title="가격 정보"
|
|
1453
|
+
marker
|
|
1454
|
+
helpText={['부가세 포함 금액입니다.']}
|
|
1455
|
+
slot={<SButton size="sm" color="secondary" label="이력" onClick={openHistory} />}
|
|
1456
|
+
/>
|
|
1457
|
+
<SSectionHeaderCard.Body>
|
|
1458
|
+
<SKeyValueTable fields={priceFields} values={product} />
|
|
1459
|
+
</SSectionHeaderCard.Body>
|
|
1460
|
+
</SSectionHeaderCard>
|
|
1461
|
+
|
|
1462
|
+
{/* 액션은 하단 — 목록(되돌리기)은 왼쪽 끝, 실행 액션은 오른쪽 끝 */}
|
|
1463
|
+
<div className="flex items-center justify-between">
|
|
1464
|
+
<SButton color="neutral" outline label="목록" onClick={goList} />
|
|
1465
|
+
<div className="flex items-center gap-sd-8">
|
|
1466
|
+
<SButton color="danger" outline label="삭제" onClick={confirmDelete} />
|
|
1467
|
+
<SButton label="수정" onClick={goEdit} />
|
|
1468
|
+
</div>
|
|
1406
1469
|
</div>
|
|
1407
1470
|
</div>
|
|
1408
|
-
</
|
|
1471
|
+
</AppShell>
|
|
1409
1472
|
);
|
|
1410
1473
|
}
|
|
1411
1474
|
```
|
|
@@ -1446,8 +1509,10 @@ export default function ProductDetailPage() {
|
|
|
1446
1509
|
- [ ] 자체 스크롤하는 패널의 하단에 `pb-[var(--cmp-pageBody-padding-scrollEnd)]` 이 있는가, 페이지네이션 있는 목록에서 `scrollEndSpacing={false}` 를 넘겼는가
|
|
1447
1510
|
- [ ] 같은 컴포넌트를 나열할 때 §2-2 그룹 간격을 썼는가 (체크박스 가로 `gap-sd-24` 등)
|
|
1448
1511
|
- [ ] 페이지가 §4의 표준 골격에서 시작했는가
|
|
1512
|
+
- [ ] `header.fix` 가 프로젝트 전체와 같은 값인가 (다른 페이지와 다르게 섞어 쓰지 않았는가, §4-1)
|
|
1513
|
+
- [ ] `header.slot` 을 채웠다면 `SButton size="sm"` 위주인가 (§4-1 "페이지 헤더 사용 규칙")
|
|
1449
1514
|
- [ ] 앱 셸이나 그 바깥에 `min-width`·`overflow-x` 를 직접 걸지 않았는가 (최소 너비는 `SLayout` 이 보장한다, §4-1)
|
|
1450
|
-
- [ ] 필터·폼·상세 정보를 `SKeyValueTable` 로 만들었는가 (컨트롤을 `div` 로 나열하지 않았는가)
|
|
1515
|
+
- [ ] 필터·폼·상세 정보를 `SKeyValueTable` 로 만들었는가 (컨트롤을 `div` 로 나열하지 않았는가). 필터를 `SChipFilter` 로 했다면 §3-7-11 의 판정을 거쳤는가
|
|
1451
1516
|
- [ ] 섹션 구분에 `SSectionHeaderCard` 를 썼는가 (직접 만든 카드가 아니라)
|
|
1452
1517
|
- [ ] 목록의 주요 액션이 `STableBar` 의 `rightActions` 에 있는가 (페이지 제목 줄이 아니라)
|
|
1453
1518
|
- [ ] 상태 표시에 `STag size="sm"` 을 썼는가
|
|
@@ -1528,7 +1593,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
1528
1593
|
- oceanblue: 15 25 50 60 65 70 75 80 85 90 95 99
|
|
1529
1594
|
- brilliantblue: 10 20 25 40 50 60 70 75 80 85 90 95 99 05
|
|
1530
1595
|
- bg: screen frame brand subtle accent accentLight accentBright accentFaint deep danger dangerLight warning caution progress success successLight neutralLight neutralBright tableHeader
|
|
1531
|
-
- fg: primary secondary tertiary quaternary brand subtleWarm subtleCool deep success dangerLight accent accentLight danger warning inverse
|
|
1596
|
+
- fg: primary secondary tertiary quaternary brand subtleWarm subtleCool deep success successLight dangerLight accent accentLight danger warning inverse
|
|
1532
1597
|
- border: default strong bold accent accentLight danger warning success
|
|
1533
1598
|
- disabled: bg text icon border
|
|
1534
1599
|
- link: accent
|
|
@@ -1654,6 +1719,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
1654
1719
|
--sys-color-fg-subtleCool
|
|
1655
1720
|
--sys-color-fg-subtleWarm
|
|
1656
1721
|
--sys-color-fg-success
|
|
1722
|
+
--sys-color-fg-successLight
|
|
1657
1723
|
--sys-color-fg-tertiary
|
|
1658
1724
|
--sys-color-fg-warning
|
|
1659
1725
|
--sys-color-field-bg-default
|
|
@@ -2006,6 +2072,64 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
2006
2072
|
|
|
2007
2073
|
---
|
|
2008
2074
|
|
|
2075
|
+
# SChipFilter
|
|
2076
|
+
|
|
2077
|
+
> 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
|
|
2078
|
+
|
|
2079
|
+
### SChipFilter
|
|
2080
|
+
|
|
2081
|
+
#### Props
|
|
2082
|
+
|
|
2083
|
+
| Prop | Type | Default | Description |
|
|
2084
|
+
|------|------|---------|-------------|
|
|
2085
|
+
| `fields?` | `SChipFilterField[] \| SChipFilterGroup[]` | — | 필터 정의 목록. 그룹으로 묶으려면 SChipFilterGroup[]을 넘긴다 — 그룹이 시작될 때마다 앞에 구분선이 자동으로 붙는다(showLabel·인접 그룹·인라인 date 필터와 중첩되지 않도록 처리됨). |
|
|
2086
|
+
| `value?` | `SChipFilterValueMap` | — | 필터 값 맵 |
|
|
2087
|
+
| `activeKeys?` | `string[]` | — | 노출 필터 key 목록. 지정하면 제어 컴포넌트로 동작 — "필터 추가"로 고른 필드를 이 배열에 직접 넣어줘야 칩이 나타난다(onActiveKeysChange에서 받은 keys로 갱신). 지정하지 않으면 필드별 defaultActive 값을 기준으로 컴포넌트가 내부 상태로 관리하는 비제어 방식으로 동작한다 |
|
|
2088
|
+
| `label?` | `string` | `'검색 필터'` | 좌측 태그 텍스트 |
|
|
2089
|
+
| `showLabel?` | `boolean` | `false` | 좌측 태그(label)·구분선 표시 여부 |
|
|
2090
|
+
| `showAddButton?` | `boolean` | `true` | 필터 추가 버튼 표시 여부 |
|
|
2091
|
+
| `showReset?` | `boolean` | `true` | 검색 초기화 링크 표시 여부 |
|
|
2092
|
+
| `disabled?` | `boolean` | `false` | 바 비활성 상태 |
|
|
2093
|
+
| `className?` | `string` | — | |
|
|
2094
|
+
| `style?` | `CSSProperties` | — | |
|
|
2095
|
+
|
|
2096
|
+
#### Events
|
|
2097
|
+
|
|
2098
|
+
| Event | Type | Description |
|
|
2099
|
+
|-------|------|-------------|
|
|
2100
|
+
| `onValueChange` | `(value: SChipFilterValueMap) => void` | 전체 값 변경 — 편집 중인 값이 바뀔 때마다(선택할 때마다) 호출된다. 실제 검색 실행은 onSearch를 쓴다 |
|
|
2101
|
+
| `onFilterChange` | `(detail: SChipFilterChangeDetail) => void` | 개별 필터 값 변경 |
|
|
2102
|
+
| `onSearch` | `(value: SChipFilterValueMap) => void` | 실제 검색을 실행할 시점 — 편집 팝오버의 "검색" 버튼을 누르거나 팝오버가 닫힐 때(바깥 클릭·Esc·다른 칩으로 전환 포함) 그 시점의 전체 값 맵과 함께 호출된다. 팝오버가 없는 필드(인라인 date 프리셋·custom, clearable ×, 검색 초기화)는 값이 바뀌는 즉시 호출된다. dirty 체크가 기본 적용되어 있어 — 마지막으로 실제 검색이 실행된 값 맵과 비교해 하나라도 달라진 게 없으면(예: 팝오버를 열었다 아무것도 안 바꾸고 닫는 경우) 호출되지 않는다. fields를 그룹으로 넘겼다면 rule을 만족하지 못한 그룹이 있는 동안엔 onSearch가 호출되지 않는다 — 해당 그룹의 경고 툴팁은 이 시점과 무관하게 값이 비어 있는 동안 항상 실시간으로 떠 있다(별도로 validate()를 호출할 필요 없음) |
|
|
2103
|
+
| `onActiveKeysChange` | `(keys: string[]) => void` | 노출 필터 key 변경(칩 추가·제거) — 비제어 방식에서도 참고용으로 호출된다. activeKeys를 직접 제어할 때는 이 값을 그대로 activeKeys에 반영해야 한다 |
|
|
2104
|
+
| `onReset` | `() => void` | "검색 초기화" 클릭 — 모든 필드가 기본값(또는 null)으로 리셋된 뒤 호출된다 |
|
|
2105
|
+
| `onAddFilter` | `(key: string) => void` | "필터 추가" 목록에서 항목을 골랐을 때 — activeKeys를 직접 제어 중이면 이 콜백에서 (또는 onActiveKeysChange에서) key를 activeKeys에 추가해줘야 칩이 실제로 나타난다. activeKeys를 넘기지 않았다면(비제어) 별도 처리 없이도 컴포넌트가 알아서 칩을 노출한다 |
|
|
2106
|
+
|
|
2107
|
+
#### Methods (ref)
|
|
2108
|
+
|
|
2109
|
+
| Method | Type | Description |
|
|
2110
|
+
|--------|------|-------------|
|
|
2111
|
+
| `open` | `(key: string) => void` | 특정 필터 편집 팝오버를 엽니다. |
|
|
2112
|
+
| `reset` | `() => void` | 모든 필터 값을 초기화합니다. |
|
|
2113
|
+
| `validate` | `() => boolean` | fields를 그룹(SChipFilterGroup[])으로 넘겼을 때, 현재 값 기준으로 각 그룹의 rule을 만족하는지 반환합니다. 경고 툴팁은 이 호출과 무관하게 rule 위반 상태인 동안 항상 실시간으로 떠 있으므로, 이 메서드는 그 상태를 그대로 읽어오는 용도다(예: 검색 버튼을 눌러도 되는지 사전 확인) |
|
|
2114
|
+
|
|
2115
|
+
## Dependencies
|
|
2116
|
+
|
|
2117
|
+
### Depends on
|
|
2118
|
+
|
|
2119
|
+
- [SDatePicker](../SDatePicker)
|
|
2120
|
+
- [SDateRangePicker](../SDateRangePicker)
|
|
2121
|
+
- [SGhostButton](../SGhostButton)
|
|
2122
|
+
- [SIcon](../SIcon)
|
|
2123
|
+
- [SRadio](../SRadio)
|
|
2124
|
+
- [SRadioButton](../SRadioButton)
|
|
2125
|
+
- [STag](../STag)
|
|
2126
|
+
- [STextLink](../STextLink)
|
|
2127
|
+
- [STooltip](../STooltip)
|
|
2128
|
+
|
|
2129
|
+
### Graph
|
|
2130
|
+
|
|
2131
|
+
---
|
|
2132
|
+
|
|
2009
2133
|
# SChipInput
|
|
2010
2134
|
|
|
2011
2135
|
> 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
|
|
@@ -2089,6 +2213,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
2089
2213
|
| `value?` | `number` | `0` | 진행률 (0–100) |
|
|
2090
2214
|
| `type?` | `SCircleProgressType` | `'primary'` | 색상 테마 |
|
|
2091
2215
|
| `indeterminate?` | `boolean` | `false` | 불확정(스피너) 모드 — value 무시 |
|
|
2216
|
+
| `size?` | `number \| string` | `DEFAULT_SIZE` | 링의 지름. 숫자는 px 로 해석한다. 부모 크기에 비례시키려면 컨테이너 쿼리 단위(`'45cqh'`)를 쓴다 — 퍼센트는 부모가 inline-flex 라 기준 폭이 정해지지 않아 해석되지 않는다. |
|
|
2092
2217
|
| `label?` | `string` | — | 하단 레이블 |
|
|
2093
2218
|
| `innerValue?` | `boolean` | `false` | true면 퍼센트를 원 아래가 아닌 원 가운데에 표시 |
|
|
2094
2219
|
| `className?` | `string` | — | |
|
|
@@ -2098,6 +2223,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
2098
2223
|
|
|
2099
2224
|
### Used by
|
|
2100
2225
|
|
|
2226
|
+
- [SImage](../SImage)
|
|
2101
2227
|
- [SLoadingContainer](../SLoadingContainer)
|
|
2102
2228
|
- [SLoadingModal](../SLoadingModal)
|
|
2103
2229
|
- [STable](../STable)
|
|
@@ -2205,6 +2331,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
2205
2331
|
|
|
2206
2332
|
### Used by
|
|
2207
2333
|
|
|
2334
|
+
- [SChipFilter](../SChipFilter)
|
|
2208
2335
|
- [SKeyValueTable](../SKeyValueTable)
|
|
2209
2336
|
|
|
2210
2337
|
### Depends on
|
|
@@ -2259,10 +2386,30 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
2259
2386
|
| `onValueChange` | `(range: SDateRangeValue) => void` | 선택 변경 (sdUpdate) — [start, end] |
|
|
2260
2387
|
| `onViewChange` | `(view: { year: number; month: number }) => void` | 보이는 연·월 변경 (sdViewChange) |
|
|
2261
2388
|
|
|
2389
|
+
### SRangeCalendar
|
|
2390
|
+
|
|
2391
|
+
#### Props
|
|
2392
|
+
|
|
2393
|
+
| Prop | Type | Default | Description |
|
|
2394
|
+
|------|------|---------|-------------|
|
|
2395
|
+
| `value` | `SDateRangeValue` | — | |
|
|
2396
|
+
| `selectable?` | `[string, string]` | — | |
|
|
2397
|
+
| `maxRange?` | `number` | — | |
|
|
2398
|
+
| `useTimePicker?` | `boolean` | `false` | |
|
|
2399
|
+
|
|
2400
|
+
#### Events
|
|
2401
|
+
|
|
2402
|
+
| Event | Type | Description |
|
|
2403
|
+
|-------|------|-------------|
|
|
2404
|
+
| `onSelect` | `(r: [string, string]) => void` | |
|
|
2405
|
+
| `onPendingStartChange` | `(start: string \| null) => void` | 시작일만 선택된(종료일 대기) 상태를 상위로 전달 — 트리거에 `start ~` 프리뷰 표시용 |
|
|
2406
|
+
| `onViewChange` | `(view: { year: number; month: number }) => void` | |
|
|
2407
|
+
|
|
2262
2408
|
## Dependencies
|
|
2263
2409
|
|
|
2264
2410
|
### Used by
|
|
2265
2411
|
|
|
2412
|
+
- [SChipFilter](../SChipFilter)
|
|
2266
2413
|
- [SKeyValueTable](../SKeyValueTable)
|
|
2267
2414
|
|
|
2268
2415
|
### Depends on
|
|
@@ -2790,6 +2937,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
2790
2937
|
- [SBarcodeInput](../SBarcodeInput)
|
|
2791
2938
|
- [SCalendar](../SCalendar)
|
|
2792
2939
|
- [SChip](../SChip)
|
|
2940
|
+
- [SChipFilter](../SChipFilter)
|
|
2793
2941
|
- [SDateRangePicker](../SDateRangePicker)
|
|
2794
2942
|
- [SFilePicker](../SFilePicker)
|
|
2795
2943
|
- [SGnb](../SGnb)
|
|
@@ -2797,6 +2945,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
2797
2945
|
- [SInput](../SInput)
|
|
2798
2946
|
- [SModalContainer](../SModalContainer)
|
|
2799
2947
|
- [SOverlayHeader](../SOverlayHeader)
|
|
2948
|
+
- [SPage](../SPage)
|
|
2800
2949
|
- [SPopover](../SPopover)
|
|
2801
2950
|
- [SSelect](../SSelect)
|
|
2802
2951
|
- [STimePicker](../STimePicker)
|
|
@@ -2882,7 +3031,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
2882
3031
|
| `message?` | `SGuideMessage` | `''` | 팝업 메시지 (배열이면 리스트, 중첩 배열이면 depth 표현) |
|
|
2883
3032
|
| `url?` | `string` | `''` | notion 타입 클릭 시 이동 URL |
|
|
2884
3033
|
| `popupTitle?` | `string` | `''` | 팝업 제목 (없으면 type 기본값) |
|
|
2885
|
-
| `popupWidth?` | `number` | — | 팝업 너비 (px, 기본 426) |
|
|
3034
|
+
| `popupWidth?` | `number` | — | 팝업 너비 (px, 기본 426). 창보다 넓게 줘도 창 폭까지만 벌어진다. |
|
|
2886
3035
|
| `className?` | `string` | — | |
|
|
2887
3036
|
| `style?` | `CSSProperties` | — | |
|
|
2888
3037
|
|
|
@@ -2922,6 +3071,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
2922
3071
|
- [SButton](../SButton)
|
|
2923
3072
|
- [SCallout](../SCallout)
|
|
2924
3073
|
- [SCheckbox](../SCheckbox)
|
|
3074
|
+
- [SChipFilter](../SChipFilter)
|
|
2925
3075
|
- [SChipInput](../SChipInput)
|
|
2926
3076
|
- [SConfirmModal](../SConfirmModal)
|
|
2927
3077
|
- [SDatePicker](../SDatePicker)
|
|
@@ -2934,6 +3084,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
2934
3084
|
- [SGhostButton](../SGhostButton)
|
|
2935
3085
|
- [SGnb](../SGnb)
|
|
2936
3086
|
- [SGuide](../SGuide)
|
|
3087
|
+
- [SImage](../SImage)
|
|
2937
3088
|
- [SKeyValueTable](../SKeyValueTable)
|
|
2938
3089
|
- [SListItem](../SListItem)
|
|
2939
3090
|
- [SLoadingModal](../SLoadingModal)
|
|
@@ -2955,6 +3106,46 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
2955
3106
|
|
|
2956
3107
|
---
|
|
2957
3108
|
|
|
3109
|
+
# SImage
|
|
3110
|
+
|
|
3111
|
+
> 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
|
|
3112
|
+
|
|
3113
|
+
### SImage
|
|
3114
|
+
|
|
3115
|
+
#### Props
|
|
3116
|
+
|
|
3117
|
+
| Prop | Type | Default | Description |
|
|
3118
|
+
|------|------|---------|-------------|
|
|
3119
|
+
| `src?` | `string` | — | 이미지 경로. 없으면 빈 이미지 아이콘이 나온다 |
|
|
3120
|
+
| `alt?` | `string` | `''` | 대체 텍스트 |
|
|
3121
|
+
| `ratio?` | `number` | `1` | 가로세로 비율. 소비자가 높이를 직접 주면 그쪽이 이긴다 |
|
|
3122
|
+
| `fit?` | `SImageFit` | `'cover'` | 이미지가 상자를 채우는 방식 (object-fit) |
|
|
3123
|
+
| `position?` | `string` | `'50% 50%'` | 이미지 정렬 위치 (object-position) |
|
|
3124
|
+
| `loading?` | `'lazy' \| 'eager'` | `'lazy'` | 브라우저 로딩 방식 |
|
|
3125
|
+
| `loadingShowDelay?` | `number` | `0` | 스피너를 띄우기까지 기다리는 시간(ms). 이 시간 안에 로드되면 스피너를 아예 그리지 않는다 — 캐시된 이미지에서 스피너가 한 프레임 번쩍이는 것을 막는다. |
|
|
3126
|
+
| `noSpinner?` | `boolean` | `false` | 로딩 중에도 스피너를 그리지 않는다 |
|
|
3127
|
+
| `loadingSlot?` | `ReactNode` | — | 로딩 중 표시를 직접 지정한다 (기본: 스피너) |
|
|
3128
|
+
| `errorSlot?` | `ReactNode` | — | 실패·빈 상태 표시를 직접 지정한다 (기본: 빈 이미지 아이콘) |
|
|
3129
|
+
| `imgProps?` | `ImgHTMLAttributes<HTMLImageElement>` | — | 안쪽 `<img>` 로 넘길 네이티브 속성 (srcSet · sizes · crossOrigin · draggable 등) |
|
|
3130
|
+
|
|
3131
|
+
#### Events
|
|
3132
|
+
|
|
3133
|
+
| Event | Type | Description |
|
|
3134
|
+
|-------|------|-------------|
|
|
3135
|
+
| `onLoad` | `(src: string) => void` | 로드 완료. 로드된 src 를 넘긴다 |
|
|
3136
|
+
| `onError` | `(event: SyntheticEvent<HTMLImageElement>) => void` | 로드 실패 |
|
|
3137
|
+
|
|
3138
|
+
## Dependencies
|
|
3139
|
+
|
|
3140
|
+
### Depends on
|
|
3141
|
+
|
|
3142
|
+
- [SCircleProgress](../SCircleProgress)
|
|
3143
|
+
- [SIcon](../SIcon)
|
|
3144
|
+
|
|
3145
|
+
### Graph
|
|
3146
|
+
|
|
3147
|
+
---
|
|
3148
|
+
|
|
2958
3149
|
# SInput
|
|
2959
3150
|
|
|
2960
3151
|
> 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
|
|
@@ -3126,6 +3317,7 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
3126
3317
|
| `children?` | `ReactNode` | — | 리스트 컨테이너 내부에 렌더링할 내용 |
|
|
3127
3318
|
| `useGap?` | `boolean` | `false` | 리스트 아이템 사이 gap 토큰 적용 여부 |
|
|
3128
3319
|
| `usePadding?` | `boolean` | `false` | 리스트 컨테이너 padding 토큰 적용 여부 |
|
|
3320
|
+
| `separator?` | `boolean` | `false` | 아이템 하단 구분선 표시 여부. 테두리를 가진 아이템(`bordered`)에는 쓰지 않는다 |
|
|
3129
3321
|
|
|
3130
3322
|
## Dependencies
|
|
3131
3323
|
|
|
@@ -3155,8 +3347,8 @@ Tailwind 유틸리티는 아래 스케일에 있는 값만 사용한다. 리터
|
|
|
3155
3347
|
| `leading?` | `SListItemSlot` | — | 타이틀 앞에 표시할 아이콘/콘텐츠 |
|
|
3156
3348
|
| `trailing?` | `SListItemSlot` | — | 타이틀 뒤에 표시할 태그/콘텐츠 |
|
|
3157
3349
|
| `bordered?` | `boolean` | `false` | 외곽 테두리 사용 여부 |
|
|
3158
|
-
| `selected?` | `boolean` | `false` | 선택 상태
|
|
3159
|
-
| `clickable?` | `boolean` | `
|
|
3350
|
+
| `selected?` | `boolean` | `false` | 선택 상태 여부. `clickable` 이 false 면 무시된다 |
|
|
3351
|
+
| `clickable?` | `boolean` | `false` | 클릭 가능 상태 여부. hover·selected·chevron 등 인터랙션 표현이 여기에 딸린다 |
|
|
3160
3352
|
| `interaction?` | `SListItemInteraction` | — | hover/selected 상태에서 적용할 인터랙션 preset |
|
|
3161
3353
|
| `accentStripe?` | `boolean` | `false` | 아이템 왼쪽 accent stripe 표시 여부 |
|
|
3162
3354
|
| `dense?` | `boolean` | `false` | 조밀한 높이 사용 여부 |
|
|
@@ -3634,6 +3826,24 @@ function OrderModal({ open, onOpenChange, onClose, modalRef, orderId }: OrderMod
|
|
|
3634
3826
|
|
|
3635
3827
|
> 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
|
|
3636
3828
|
|
|
3829
|
+
### SPageHeader
|
|
3830
|
+
|
|
3831
|
+
#### Props
|
|
3832
|
+
|
|
3833
|
+
| Prop | Type | Default | Description |
|
|
3834
|
+
|------|------|---------|-------------|
|
|
3835
|
+
| `title` | `string` | — | 타이틀 (필수) |
|
|
3836
|
+
| `subText?` | `string` | — | 서브 텍스트. fix=true 면 타이틀 오른쪽에, fix=false(기본) 면 타이틀 아래에 놓인다. |
|
|
3837
|
+
| `fix?` | `boolean` | `false` | true: 높이 56 고정 + 흰 배경 + 하단 구분선, 서브 텍스트가 타이틀과 같은 줄. false(기본): 최소 높이 66(상하 패딩 20/16 안에서 타이틀 한 줄 높이로 결정) + 투명 배경, 서브 텍스트가 타이틀 아래로 내려간다. |
|
|
3838
|
+
| `slot?` | `ReactNode` | — | 오른쪽 끝 커스텀 슬롯. 가이드 링크·액션 버튼 등 페이지마다 다른 것이 온다. |
|
|
3839
|
+
| `scrolled?` | `boolean` | `false` | `<SPage>` 가 스크롤 여부를 보고 자동으로 넣어준다 — 직접 주지 않는다. fix=false 일 때만 의미가 있다: 스크롤이 시작되면 그림자(floating)가 들어가 스크롤되는 콘텐츠 위에 뜬 것처럼 보인다. 배경은 그대로 페이지 배경을 따라간다 — 배경을 바꾸는 건 scrolled 가 아니라 fix 다. |
|
|
3840
|
+
|
|
3841
|
+
#### Events
|
|
3842
|
+
|
|
3843
|
+
| Event | Type | Description |
|
|
3844
|
+
|-------|------|-------------|
|
|
3845
|
+
| `onBack` | `() => void` | 뒤로가기 클릭 핸들러. 지정하면 왼쪽에 뒤로가기 버튼이 나타난다. |
|
|
3846
|
+
|
|
3637
3847
|
### SPage
|
|
3638
3848
|
|
|
3639
3849
|
#### Props
|
|
@@ -3642,11 +3852,13 @@ function OrderModal({ open, onOpenChange, onClose, modalRef, orderId }: OrderMod
|
|
|
3642
3852
|
|------|------|---------|-------------|
|
|
3643
3853
|
| `background?` | `SPageBackground` | `'frame'` | 페이지 배경 표면. frame=흰 콘텐츠 면, neutral=옅은 회색 면, screen=앱 바탕. 스크롤바 처리도 여기 묶여 있다 — 셋 다 구분선+트랙 배경이고, 트랙 색만 neutral 에서 흰색이 된다. |
|
|
3644
3854
|
| `scrollEndSpacing?` | `boolean` | `true` | 스크롤 끝 여백. 마지막 항목이 창 하단에 붙어 "여기서 끝"이 안 읽히는 것을 막는다. 기본으로 켜져 있고, 페이지네이션처럼 끝을 알려주는 것이 이미 있으면 끈다(목록 페이지). |
|
|
3855
|
+
| `header?` | `SPageHeaderProps` | — | 페이지 타이틀 영역(pageHeader 포팅). 주면 스크롤·페이지 패딩 밖으로 빼내 상단에 고정 배치한다. `children` 은 항상 본문이다 — header 유무와 무관하게 같은 자리에 같은 뜻으로 들어간다. |
|
|
3645
3856
|
|
|
3646
3857
|
## Dependencies
|
|
3647
3858
|
|
|
3648
3859
|
### Depends on
|
|
3649
3860
|
|
|
3861
|
+
- [SGhostButton](../SGhostButton)
|
|
3650
3862
|
- [SLayout](../SLayout)
|
|
3651
3863
|
|
|
3652
3864
|
### Graph
|
|
@@ -3793,7 +4005,7 @@ function OrderModal({ open, onOpenChange, onClose, modalRef, orderId }: OrderMod
|
|
|
3793
4005
|
| `maxHeight?` | `number` | — | 콘텐츠 최대 높이 px. 넘치면 세로 스크롤. |
|
|
3794
4006
|
| `autoClose?` | `boolean` | `false` | 콘텐츠 내부를 클릭하면 자동으로 닫는다. |
|
|
3795
4007
|
| `persistent?` | `boolean` | `false` | 외부 클릭 · ESC 로 닫히지 않게 한다. |
|
|
3796
|
-
| `viewportPadding?` | `number` | `0` | 뷰포트 경계 여백 px (충돌 회피 패딩). |
|
|
4008
|
+
| `viewportPadding?` | `number` | `0` | 뷰포트 경계 여백 px (충돌 회피 패딩). 콘텐츠 폭은 항상 `창 폭 - viewportPadding*2` 를 넘지 않게 잘린다. |
|
|
3797
4009
|
| `children?` | `ReactNode` | — | 본문 내용 (콘텐츠 자유). |
|
|
3798
4010
|
| `className?` | `string` | — | |
|
|
3799
4011
|
| `style?` | `CSSProperties` | — | |
|
|
@@ -3868,6 +4080,7 @@ function OrderModal({ open, onOpenChange, onClose, modalRef, orderId }: OrderMod
|
|
|
3868
4080
|
|
|
3869
4081
|
### Used by
|
|
3870
4082
|
|
|
4083
|
+
- [SChipFilter](../SChipFilter)
|
|
3871
4084
|
- [SKeyValueTable](../SKeyValueTable)
|
|
3872
4085
|
|
|
3873
4086
|
### Graph
|
|
@@ -3898,6 +4111,14 @@ function OrderModal({ open, onOpenChange, onClose, modalRef, orderId }: OrderMod
|
|
|
3898
4111
|
|-------|------|-------------|
|
|
3899
4112
|
| `onValueChange` | `(value: string \| number) => void` | 변경 (sdUpdate) |
|
|
3900
4113
|
|
|
4114
|
+
## Dependencies
|
|
4115
|
+
|
|
4116
|
+
### Used by
|
|
4117
|
+
|
|
4118
|
+
- [SChipFilter](../SChipFilter)
|
|
4119
|
+
|
|
4120
|
+
### Graph
|
|
4121
|
+
|
|
3901
4122
|
---
|
|
3902
4123
|
|
|
3903
4124
|
# SScrollArea
|
|
@@ -3990,8 +4211,8 @@ function OrderModal({ open, onOpenChange, onClose, modalRef, orderId }: OrderMod
|
|
|
3990
4211
|
| `rules?` | `Rule[]` | — | 유효성 규칙 — 닫힐 때 자동 검증 |
|
|
3991
4212
|
| `labelTooltipProps?` | `Partial<STooltipProps>` | — | 레이블 툴팁 상세 옵션 |
|
|
3992
4213
|
| `dropdownHeight?` | `string` | `'260px'` | 드롭다운 최대 높이 |
|
|
3993
|
-
| `dropdownWidth?` | `string` | — | 드롭다운 너비 (없으면 트리거 너비) |
|
|
3994
|
-
| `maxDropdownWidth?` | `string` | `'640px'` | 드롭다운 최대
|
|
4214
|
+
| `dropdownWidth?` | `string` | — | 드롭다운 너비 (없으면 트리거 너비). 창보다 넓게 줘도 창 폭까지만 벌어진다. |
|
|
4215
|
+
| `maxDropdownWidth?` | `string` | `'640px'` | 드롭다운 최대 너비. 창이 이보다 좁으면 창 폭이 상한이 된다. |
|
|
3995
4216
|
| `label?` | `string` | — | |
|
|
3996
4217
|
| `labelWidth?` | `number \| string` | — | |
|
|
3997
4218
|
| `icon?` | `SIconName` | — | 레이블 영역 아이콘 |
|
|
@@ -4291,6 +4512,7 @@ function OrderModal({ open, onOpenChange, onClose, modalRef, orderId }: OrderMod
|
|
|
4291
4512
|
|
|
4292
4513
|
### Used by
|
|
4293
4514
|
|
|
4515
|
+
- [SChipFilter](../SChipFilter)
|
|
4294
4516
|
- [SConfirmModal](../SConfirmModal)
|
|
4295
4517
|
- [SGhostButton](../SGhostButton)
|
|
4296
4518
|
- [SGnb](../SGnb)
|
|
@@ -4335,6 +4557,7 @@ function OrderModal({ open, onOpenChange, onClose, modalRef, orderId }: OrderMod
|
|
|
4335
4557
|
|
|
4336
4558
|
### Used by
|
|
4337
4559
|
|
|
4560
|
+
- [SChipFilter](../SChipFilter)
|
|
4338
4561
|
- [SChipInput](../SChipInput)
|
|
4339
4562
|
- [SPopover](../SPopover)
|
|
4340
4563
|
|
|
@@ -4597,6 +4820,7 @@ function OrderModal({ open, onOpenChange, onClose, modalRef, orderId }: OrderMod
|
|
|
4597
4820
|
| `value?` | `boolean` | `false` | 선택(on/off) 상태 |
|
|
4598
4821
|
| `label?` | `string` | `''` | 라벨 |
|
|
4599
4822
|
| `disabled?` | `boolean` | `false` | 비활성 |
|
|
4823
|
+
| `size?` | `SToggleSize` | `'sm'` | 크기 |
|
|
4600
4824
|
| `className?` | `string` | — | |
|
|
4601
4825
|
| `style?` | `CSSProperties` | — | |
|
|
4602
4826
|
|
|
@@ -4654,6 +4878,7 @@ function OrderModal({ open, onOpenChange, onClose, modalRef, orderId }: OrderMod
|
|
|
4654
4878
|
|
|
4655
4879
|
### Used by
|
|
4656
4880
|
|
|
4881
|
+
- [SChipFilter](../SChipFilter)
|
|
4657
4882
|
- [SField](../SField)
|
|
4658
4883
|
- [SKeyValueTable](../SKeyValueTable)
|
|
4659
4884
|
- [SSectionHeaderCard](../SSectionHeaderCard)
|