sellmate-design-system-react 9.0.0-beta.4 → 9.0.0-beta.41

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.
Files changed (196) hide show
  1. package/AGENTS.md +670 -95
  2. package/README.md +111 -9
  3. package/dist/components/SAccountListBox/AccountListBoxPortal.d.ts +31 -0
  4. package/dist/components/SAccountListBox/README.md +86 -0
  5. package/dist/components/SAccountListBox/SAccountListBox.d.ts +79 -0
  6. package/dist/components/SAccountListBox/SystemMenuPortal.d.ts +58 -0
  7. package/dist/components/SAccountListBox/accountListBox.config.d.ts +64 -0
  8. package/dist/components/SAccountListBox/index.d.ts +2 -0
  9. package/dist/components/SBadge/README.md +26 -0
  10. package/dist/components/SBadge/SBadge.d.ts +1 -1
  11. package/dist/components/SBarcodeInput/README.md +12 -4
  12. package/dist/components/SBarcodeInput/SBarcodeInput.d.ts +10 -2
  13. package/dist/components/SButton/README.md +38 -0
  14. package/dist/components/SCalendar/README.md +13 -0
  15. package/dist/components/SCalendarBoard/CalendarDayCard.d.ts +38 -0
  16. package/dist/components/SCalendarBoard/CalendarDayEventListBox.d.ts +26 -0
  17. package/dist/components/SCalendarBoard/CalendarEventButton.d.ts +13 -0
  18. package/dist/components/SCalendarBoard/CalendarMoreButton.d.ts +12 -0
  19. package/dist/components/SCalendarBoard/README.md +137 -0
  20. package/dist/components/SCalendarBoard/SCalendarBoard.d.ts +68 -0
  21. package/dist/components/SCalendarBoard/calendarBoard.config.d.ts +33 -0
  22. package/dist/components/SCalendarBoard/index.d.ts +3 -0
  23. package/dist/components/SCalendarBoard/types.d.ts +31 -0
  24. package/dist/components/SCallout/README.md +16 -1
  25. package/dist/components/SCallout/SCallout.d.ts +9 -4
  26. package/dist/components/SCard/README.md +16 -0
  27. package/dist/components/SCard/SCard.d.ts +17 -2
  28. package/dist/components/SCheckbox/README.md +8 -0
  29. package/dist/components/SChipFilter/README.md +339 -14
  30. package/dist/components/SChipFilter/SChipFilter.d.ts +150 -60
  31. package/dist/components/SChipFilter/index.d.ts +1 -1
  32. package/dist/components/SChipInput/README.md +16 -2
  33. package/dist/components/SChipInput/SChipInput.d.ts +8 -2
  34. package/dist/components/SChipInput/index.d.ts +1 -1
  35. package/dist/components/SCircleProgress/README.md +8 -0
  36. package/dist/components/SConfirmModal/README.md +11 -3
  37. package/dist/components/SConfirmModal/SConfirmModal.d.ts +16 -8
  38. package/dist/components/SDatePicker/README.md +20 -2
  39. package/dist/components/SDatePicker/SDatePicker.d.ts +27 -4
  40. package/dist/components/SDateRangePicker/README.md +19 -4
  41. package/dist/components/SDateRangePicker/SDateRangePicker.d.ts +19 -6
  42. package/dist/components/SDivider/README.md +7 -0
  43. package/dist/components/SDivider/SDivider.d.ts +11 -0
  44. package/dist/components/SDraggableItem/README.md +37 -0
  45. package/dist/components/SDraggableItem/SDraggableItem.d.ts +2 -0
  46. package/dist/components/SDraggableItem/index.d.ts +1 -1
  47. package/dist/components/SDraggableList/README.md +30 -0
  48. package/dist/components/SDraggableList/SDraggableList.d.ts +11 -0
  49. package/dist/components/SDraggableList/index.d.ts +1 -1
  50. package/dist/components/SDrawer/README.md +8 -0
  51. package/dist/components/SDropdownButton/README.md +19 -0
  52. package/dist/components/SEditor/EditorBody.d.ts +36 -0
  53. package/dist/components/SEditor/EditorToolbar.d.ts +93 -0
  54. package/dist/components/SEditor/README.md +203 -0
  55. package/dist/components/SEditor/SEditor.d.ts +114 -0
  56. package/dist/components/SEditor/editor-icons.d.ts +63 -0
  57. package/dist/components/SEditor/editor.config.d.ts +119 -0
  58. package/dist/components/SEditor/index.d.ts +8 -0
  59. package/dist/components/SEditor/tiptap-api.d.ts +29 -0
  60. package/dist/components/SEditor/use-is-mobile.d.ts +14 -0
  61. package/dist/components/SExpansionItem/README.md +36 -0
  62. package/dist/components/SExpansionItem/index.d.ts +1 -1
  63. package/dist/components/SField/README.md +29 -5
  64. package/dist/components/SField/SField.d.ts +20 -8
  65. package/dist/components/SFilePicker/README.md +18 -4
  66. package/dist/components/SFilePicker/SFilePicker.d.ts +11 -5
  67. package/dist/components/SFooter/README.md +25 -0
  68. package/dist/components/SFooter/SFooter.d.ts +4 -3
  69. package/dist/components/SForm/README.md +12 -1
  70. package/dist/components/SForm/SForm.d.ts +2 -2
  71. package/dist/components/SGhostButton/README.md +22 -4
  72. package/dist/components/SGnb/README.md +57 -6
  73. package/dist/components/SGnb/SGnb.d.ts +58 -8
  74. package/dist/components/SGnb/gnb.config.d.ts +12 -5
  75. package/dist/components/SGnb/index.d.ts +1 -1
  76. package/dist/components/SGnbSystem/README.md +186 -0
  77. package/dist/components/SGnbSystem/SGnbSystem.d.ts +179 -0
  78. package/dist/components/SGnbSystem/gnbSystem.config.d.ts +122 -0
  79. package/dist/components/SGnbSystem/index.d.ts +2 -0
  80. package/dist/components/SGuide/README.md +15 -0
  81. package/dist/components/SIcon/README.md +10 -0
  82. package/dist/components/SIcon/SIcon.d.ts +1 -1
  83. package/dist/components/SIcon/icons.gen.d.ts +4 -0
  84. package/dist/components/SImage/README.md +15 -1
  85. package/dist/components/SImage/SImage.d.ts +2 -2
  86. package/dist/components/SInput/README.md +6 -4
  87. package/dist/components/SInput/SInput.d.ts +10 -4
  88. package/dist/components/SKeyValueTable/README.md +86 -0
  89. package/dist/components/SKeyValueTable/SKeyValueTable.d.ts +6 -2
  90. package/dist/components/SKeyValueTable/index.d.ts +1 -1
  91. package/dist/components/SLayout/README.md +22 -1
  92. package/dist/components/SLayout/SLayout.d.ts +6 -2
  93. package/dist/components/SLayout/index.d.ts +1 -1
  94. package/dist/components/SLinearProgress/README.md +15 -0
  95. package/dist/components/SLinearProgress/SLinearProgress.d.ts +3 -0
  96. package/dist/components/SLinearProgress/index.d.ts +1 -1
  97. package/dist/components/SList/README.md +15 -3
  98. package/dist/components/SList/SList.d.ts +7 -5
  99. package/dist/components/SList/index.d.ts +1 -1
  100. package/dist/components/SListItem/README.md +41 -0
  101. package/dist/components/SListItem/index.d.ts +1 -1
  102. package/dist/components/SLoadingContainer/loading.d.ts +18 -2
  103. package/dist/components/SLoadingModal/README.md +10 -2
  104. package/dist/components/SLoadingModal/SLoadingModal.d.ts +4 -4
  105. package/dist/components/SLoadingModal/index.d.ts +1 -1
  106. package/dist/components/SModal/README.md +1 -1
  107. package/dist/components/SNumberInput/README.md +14 -6
  108. package/dist/components/SNumberInput/SNumberInput.d.ts +12 -4
  109. package/dist/components/SPage/README.md +87 -5
  110. package/dist/components/SPage/SPage.d.ts +29 -9
  111. package/dist/components/SPage/SPageHeader.d.ts +31 -13
  112. package/dist/components/SPage/index.d.ts +2 -2
  113. package/dist/components/SPage/page-column.d.ts +34 -0
  114. package/dist/components/SPage/page-width.d.ts +23 -0
  115. package/dist/components/SPage/page.config.d.ts +18 -0
  116. package/dist/components/SPopover/README.md +15 -0
  117. package/dist/components/SPopup/README.md +27 -2
  118. package/dist/components/SPopup/SPopup.d.ts +7 -3
  119. package/dist/components/SPopup/index.d.ts +1 -1
  120. package/dist/components/SPortal/README.md +18 -0
  121. package/dist/components/SRadio/README.md +20 -0
  122. package/dist/components/SRadioButton/README.md +18 -0
  123. package/dist/components/SRadioButton/SRadioButton.d.ts +1 -1
  124. package/dist/components/SRadioCard/README.md +78 -0
  125. package/dist/components/SRadioCard/SRadioCard.d.ts +29 -0
  126. package/dist/components/SRadioCard/SRadioCardGroup.d.ts +36 -0
  127. package/dist/components/SRadioCard/index.d.ts +2 -0
  128. package/dist/components/SScrollArea/README.md +27 -0
  129. package/dist/components/SSearchInput/README.md +63 -0
  130. package/dist/components/SSearchInput/SSearchInput.d.ts +52 -0
  131. package/dist/components/SSearchInput/index.d.ts +1 -0
  132. package/dist/components/SSectionHeaderCard/README.md +37 -0
  133. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.d.ts +10 -0
  134. package/dist/components/SSelect/README.md +29 -11
  135. package/dist/components/SSelect/SSelect.d.ts +28 -8
  136. package/dist/components/SSplitter/README.md +17 -2
  137. package/dist/components/SSplitter/SSplitter.d.ts +7 -3
  138. package/dist/components/SStepper/README.md +26 -0
  139. package/dist/components/SSwitch/README.md +13 -1
  140. package/dist/components/SSwitch/SSwitch.d.ts +1 -3
  141. package/dist/components/SSystemActionButton/README.md +221 -0
  142. package/dist/components/SSystemActionButton/SSystemActionButton.d.ts +161 -0
  143. package/dist/components/SSystemActionButton/index.d.ts +2 -0
  144. package/dist/components/SSystemActionButton/systemActionButton.config.d.ts +93 -0
  145. package/dist/components/STable/README.md +94 -10
  146. package/dist/components/STable/STable.d.ts +130 -22
  147. package/dist/components/STable/index.d.ts +1 -1
  148. package/dist/components/STabs/README.md +13 -2
  149. package/dist/components/STabs/STabs.d.ts +3 -5
  150. package/dist/components/STabs/index.d.ts +1 -1
  151. package/dist/components/STabs/tabs.config.d.ts +3 -4
  152. package/dist/components/STag/README.md +52 -0
  153. package/dist/components/STag/STag.d.ts +3 -1
  154. package/dist/components/STextLink/README.md +19 -1
  155. package/dist/components/STextLink/STextLink.d.ts +5 -1
  156. package/dist/components/STextarea/README.md +4 -4
  157. package/dist/components/STextarea/STextarea.d.ts +10 -4
  158. package/dist/components/STimePicker/README.md +16 -2
  159. package/dist/components/STimePicker/STimePicker.d.ts +11 -5
  160. package/dist/components/STimePicker/timepicker.config.d.ts +4 -2
  161. package/dist/components/STimeRangePicker/README.md +28 -2
  162. package/dist/components/STimeRangePicker/STimeRangePicker.d.ts +11 -5
  163. package/dist/components/SToast/README.md +25 -1
  164. package/dist/components/SToast/SToast.d.ts +2 -2
  165. package/dist/components/SToggle/README.md +8 -0
  166. package/dist/components/SToggle/index.d.ts +1 -1
  167. package/dist/components/STooltip/README.md +25 -1
  168. package/dist/components/STooltip/STooltip.d.ts +1 -1
  169. package/dist/components/STree/README.md +44 -3
  170. package/dist/components/STree/STree.d.ts +24 -4
  171. package/dist/components/STree/index.d.ts +1 -1
  172. package/dist/docs/Gallery.d.ts +9 -0
  173. package/dist/docs/gallery-previews.d.ts +24 -0
  174. package/dist/index.cjs +10890 -5322
  175. package/dist/index.cjs.map +1 -1
  176. package/dist/index.d.ts +8 -0
  177. package/dist/index.js +10852 -5322
  178. package/dist/index.js.map +1 -1
  179. package/dist/lib/doc-sections.d.ts +35 -0
  180. package/dist/lib/field-width.d.ts +31 -0
  181. package/dist/lib/floating-height.d.ts +15 -0
  182. package/dist/lib/story-docs.d.ts +19 -3
  183. package/dist/lib/truncated-value-tooltip.d.ts +18 -0
  184. package/dist/llms-full.txt +3396 -297
  185. package/dist/llms.txt +675 -97
  186. package/dist/playground/categories.d.ts +19 -0
  187. package/dist/styles.css +1731 -166
  188. package/dist/theme.css +216 -24
  189. package/eslint/index.mjs +14 -0
  190. package/eslint/lib/table-column.mjs +26 -0
  191. package/eslint/rules/divider-vertical-height.mjs +137 -0
  192. package/eslint/rules/field-width-grade.d.mts +41 -0
  193. package/eslint/rules/field-width-grade.mjs +311 -0
  194. package/eslint/rules/table-column-width.mjs +110 -0
  195. package/eslint/scale.gen.mjs +5 -2
  196. package/package.json +13 -1
@@ -9,27 +9,28 @@
9
9
  | Prop | Type | Default | Description |
10
10
  |------|------|---------|-------------|
11
11
  | `columns?` | `STableColumn[]` | `[]` | |
12
+ | `headerGroups?` | `STableHeaderGroup[]` | — | 상위 그룹 헤더. 지정하면 기존 컬럼 헤더가 두 번째 행에 렌더링된다. |
12
13
  | `rows?` | `SRow[]` | `[]` | |
13
14
  | `rowKey?` | `string` | `'id'` | 행 식별 필드 |
14
15
  | `selectable?` | `boolean` | `false` | 행 선택 체크박스 |
15
16
  | `selected?` | `SRow[]` | `[]` | |
17
+ | `sort?` | `STableSort \| null` | `null` | 정렬 상태 (controlled). `null`·미지정이면 정렬 없음. 컴포넌트는 정렬 상태를 갖지 않는다 — 서버 정렬이면 이 값이 곧 조회 조건이고, 뒤로가기·새로고침·링크 공유로 복원돼야 하므로 진실은 URL·store 쪽에 있어야 한다. 행을 실제로 정렬하는 것도 소비 앱 몫이다 (`STable` 은 받은 순서대로 그린다). |
16
18
  | `resizable?` | `boolean` | `false` | 컬럼 너비 조절 |
17
19
  | `width?` | `string` | — | |
18
20
  | `height?` | `string` | — | |
19
- | `stickyHeader?` | `boolean` | — | |
20
21
  | `stickyColumn?` | `STableStickyColumn` | — | 고정할 좌/우 컬럼 수 |
21
22
  | `radius?` | `'default' \| 'useTop' \| 'full'` | `'default'` | border-radius 제어 |
22
23
  | `bordered?` | `boolean` | `true` | 바깥 테두리. 기본은 `true`. `SSectionHeaderCard` 의 `padding="none"` 안에 넣어 카드 가장자리까지 채울 때 `false` 로 끈다 — 카드가 이미 바깥 테두리를 그리므로, 켜 두면 1px 두 개가 나란히 놓여 그 변만 2px 로 보인다. 페이지네이션 바의 테두리와 1px 겹침(`-mt-px`)도 함께 꺼진다. 본문 테두리가 없으면 겹칠 대상이 없어, 그대로 두면 페이지네이션만 테두리를 갖고 1px 어긋난다. |
23
- | `noDataLabel?` | `string` | `'데이터가 없습니다.'` | |
24
- | `noDataSlot?` | `ReactNode` | — | 데이터가 없을 때 body 영역 전체를 대체하는 슬롯. 지정하면 `noDataLabel` 대신 이 콘텐츠가 헤더 아래 영역을 채우며, 버튼 등 인터랙션도 동작한다. |
25
- | `isLoading?` | `boolean` | `false` | |
26
- | `dense?` | `boolean` | `false` | |
27
- | `noHover?` | `boolean` | `false` | true면 행에 마우스를 올려도 hover 배경(grey_05)을 표시하지 않는다 |
24
+ | `emptyLabel?` | `string` | `'데이터가 없습니다.'` | |
25
+ | `emptySlot?` | `ReactNode` | — | 데이터가 없을 때 body 영역 전체를 대체하는 슬롯. 지정하면 `emptyLabel` 대신 이 콘텐츠가 헤더 아래 영역을 채우며, 버튼 등 인터랙션도 동작한다. |
26
+ | `loading?` | `boolean` | `false` | |
27
+ | `dense?` | `boolean` | `false` | 행 높이를 좁게 (세로 여백만 줄인다 — 좌우 패딩은 그대로). **시작 밀도이자 밀도 토글의 스위치다.** 켜면 하단 바 우측에 `좁게 보기` · `넓게 보기` 토글이 붙는다 — 페이지네이션이 없으면 이 바를 토글만 담아 그린다. 누른 뒤의 밀도는 테이블이 내부 상태로 들고 가므로 `onDenseChange` 를 받지 않아도 토글은 동작하고, 넓게 본 뒤에도 토글은 그대로 남는다(붙일지는 이 prop 이 정한다). 이 prop 값이 바뀌면 내부 밀도도 그 값으로 맞춰진다. |
28
+ | `hoverable?` | `boolean` | `true` | true면 행에 마우스를 올려도 hover 배경(grey_05)을 표시하지 않는다 |
28
29
  | `pagination?` | `STablePagination` | — | 페이지네이션 (있으면 하단 표시) |
29
- | `useInternalPagination?` | `boolean` | `false` | 테이블 내부에서 페이지네이션을 직접 관리 (rows를 내부 슬라이싱) |
30
- | `useRowsPerPageSelect?` | `boolean` | `false` | 페이지당 행 수 셀렉트 표시 |
30
+ | `internalPagination?` | `boolean` | `false` | 테이블 내부에서 페이지네이션을 직접 관리 (rows를 내부 슬라이싱) |
31
+ | `showRowsPerPageSelect?` | `boolean` | `false` | 페이지당 행 수 셀렉트 표시 |
31
32
  | `rowsPerPageOption?` | `SSelectOption[]` | `DEFAULT_ROWS_PER_PAGE_OPTION` | |
32
- | `useVirtualScroll?` | `boolean` | `false` | 가상 스크롤 |
33
+ | `virtualScroll?` | `boolean` | `false` | 가상 스크롤 |
33
34
  | `rowHeight?` | `number` | — | |
34
35
  | `virtualBuffer?` | `number` | `5` | |
35
36
  | `virtualEndThreshold?` | `number` | `10` | |
@@ -42,6 +43,8 @@
42
43
  | Event | Type | Description |
43
44
  |-------|------|-------------|
44
45
  | `onSelectedChange` | `(rows: SRow[]) => void` | |
46
+ | `onSortChange` | `(sort: STableSort \| null) => void` | 정렬 헤더 클릭 (`asc → desc → 해제` 3단). 해제되면 `null` 이 온다. 다중 정렬은 1차 안에서 지원하지 않는다. |
47
+ | `onDenseChange` | `(dense: boolean) => void` | 밀도 변경 (하단 바의 밀도 토글을 눌렀을 때). 표시는 테이블이 알아서 바꾸므로 받지 않아도 되고, 사용자가 고른 밀도를 다음 방문까지 기억해 두려는(로컬 저장 등) 페이지만 받으면 된다. |
45
48
  | `onPageChange` | `(page: number) => void` | |
46
49
  | `onRowsPerPageChange` | `(perPage: number) => void` | |
47
50
  | `onVirtualUpdate` | `(range: { from: number; to: number }) => void` | |
@@ -54,21 +57,98 @@
54
57
  |--------|------|-------------|
55
58
  | `isRowSelected` | `(row: SRow) => boolean` | 행 선택 여부 |
56
59
  | `getIsAllChecked` | `(rows: SRow[]) => boolean \| null` | 주어진 행들의 전체 선택 상태 (true/false/null=indeterminate) |
57
- | `getPaginationInfo` | `<union 2종>` | 내부 페이지네이션 정보 (useInternalPagination 아니면 null) |
60
+ | `getPaginationInfo` | `<union 2종>` | 내부 페이지네이션 정보 (internalPagination 아니면 null) |
58
61
  | `getStickyStyle` | `(colIdx: number) => CSSProperties` | 컬럼 sticky 스타일 (CSS 변수 + 고정폭) |
59
62
  | `setRowCount` | `(count: number) => void` | 가상 스크롤 총 행 수 설정 |
60
63
  | `updateRowSelect` | `(row: SRow) => void` | 단일 행 선택 토글 (sd-table updateRowSelect) — onSelectedChange 발생 |
61
64
  | `toggleSelectAll` | `(checked: boolean, rows: SRow[]) => void` | 주어진 행들 전체 선택/해제 (sd-table toggleSelectAll) — onSelectedChange 발생 |
62
65
 
66
+ ## Types
67
+
68
+ ### STableColumn
69
+
70
+ ```ts
71
+ /**
72
+ * `autoWidth` 스페이서 열은 값을 그리지 않으므로 `field` 를 생략할 수 있다.
73
+ * 그 밖의 열은 값 접근자가 있어야 한다.
74
+ */
75
+ export type STableColumn = STableColumnBase &
76
+ (
77
+ { autoWidth: true; field?: STableColumnField } | { autoWidth?: false; field: STableColumnField }
78
+ );
79
+ ```
80
+
81
+ ### STableHeaderGroup
82
+
83
+ ```ts
84
+ /** 2단 헤더의 상위 셀. columnNames는 visible 컬럼 기준으로 연속되어야 한다. */
85
+ export interface STableHeaderGroup {
86
+ label?: ReactNode;
87
+ columnNames: string[];
88
+ rowSpan?: 1 | 2;
89
+ align?: 'left' | 'center' | 'right';
90
+ className?: string;
91
+ style?: CSSProperties;
92
+ render?: () => ReactNode;
93
+ }
94
+ ```
95
+
96
+ ### SRow
97
+
98
+ ```ts
99
+ export type SRow = Record<string, any>;
100
+ ```
101
+
102
+ ### STableSort
103
+
104
+ ```ts
105
+ /** 정렬 상태 — 어느 열을 어느 방향으로 정렬했는가 */
106
+ export interface STableSort {
107
+ /** 정렬 기준 컬럼의 `name` */
108
+ name: string;
109
+ dir: 'asc' | 'desc';
110
+ }
111
+ ```
112
+
113
+ ### STableStickyColumn
114
+
115
+ ```ts
116
+ export interface STableStickyColumn {
117
+ left?: number;
118
+ right?: number;
119
+ }
120
+ ```
121
+
122
+ ### STablePagination
123
+
124
+ ```ts
125
+ export interface STablePagination {
126
+ page: number;
127
+ rowsPerPage: number;
128
+ lastPage?: number;
129
+ }
130
+ ```
131
+
132
+ ### STableColumnField
133
+
134
+ ```ts
135
+ /** 값 접근: 필드명 또는 접근 함수 */
136
+ export type STableColumnField = string | ((row: SRow) => any);
137
+ ```
138
+
63
139
  ## Dependencies
64
140
 
65
141
  ### Depends on
66
142
 
67
143
  - [SCheckbox](../SCheckbox)
68
144
  - [SCircleProgress](../SCircleProgress)
145
+ - [SDivider](../SDivider)
146
+ - [SGhostButton](../SGhostButton)
69
147
  - [SIcon](../SIcon)
70
148
  - [SPagination](../SPagination)
71
149
  - [SSelect](../SSelect)
150
+ - [STextLink](../STextLink)
151
+ - [STooltip](../STooltip)
72
152
 
73
153
  ### Graph
74
154
 
@@ -76,8 +156,12 @@
76
156
  graph TD;
77
157
  STable --> SCheckbox
78
158
  STable --> SCircleProgress
159
+ STable --> SDivider
160
+ STable --> SGhostButton
79
161
  STable --> SIcon
80
162
  STable --> SPagination
81
163
  STable --> SSelect
164
+ STable --> STextLink
165
+ STable --> STooltip
82
166
  style STable fill:#f9f,stroke:#333,stroke-width:4px
83
167
  ```
@@ -1,6 +1,4 @@
1
1
  import { type CSSProperties, type ReactNode } from 'react';
2
- import { type SColor } from '../../lib/color';
3
- import { type SIconName } from '../SIcon';
4
2
  import { type SSelectOption } from '../SSelect';
5
3
  export type SRow = Record<string, any>;
6
4
  /** `STableColumn.renderCell`에 전달되는 컨텍스트 */
@@ -20,24 +18,78 @@ export interface STableCellContext {
20
18
  /** STable이 이 셀에 적용하려던 스타일 (패딩·정렬·폭·sticky offset 포함) */
21
19
  style: CSSProperties;
22
20
  }
23
- export interface STableColumn {
21
+ /** 값 접근: 필드명 또는 접근 함수 */
22
+ export type STableColumnField = string | ((row: SRow) => any);
23
+ interface STableColumnBase {
24
24
  name: string;
25
25
  label: string;
26
- /** 값 접근: 필드명 또는 접근 함수 */
27
- field: string | ((row: SRow) => any);
28
26
  align?: 'left' | 'center' | 'right';
29
- width?: string;
30
- /** 고정폭 없이 자동 너비 (sticky/resize 계산에서 제외) */
27
+ /**
28
+ * 컬럼 너비. **px 로만 준다** — 숫자는 px 로 해석하고, 문자열은 `'120px'` 형태만 받는다.
29
+ *
30
+ * % · `clamp()` · `min()` 은 쓰지 않는다. 폭은 `<colgroup>` 의 `<col width>` 로 들어가는데
31
+ * 테이블이 `table-fixed` 라 함수형 값은 계산되지 않고 통째로 무시된다 — 화면은 조용히
32
+ * auto 폭으로 떨어진다. `'30%'` 는 더 나쁘게 30px 로 읽힌다.
33
+ *
34
+ * 생략하면 기본 120px 이다. 내용이 들어가는 열은 값 길이에 맞춰 폭을 명시한다 —
35
+ * 폭을 주지 않은 열만 다른 열에 눌려 무너지거나 늘어난다.
36
+ */
37
+ width?: number | `${number}px`;
38
+ /**
39
+ * 고정폭 없이 남은 폭을 흡수한다 (sticky/resize 계산에서 제외).
40
+ *
41
+ * **남은 폭을 먹는 스페이서 열 하나에만 쓴다.** 내용이 들어가는 열에 주면 폭이 다른 열에
42
+ * 좌우돼 화면마다 달라진다 — 내용 열은 px 로 폭을 명시한다.
43
+ */
31
44
  autoWidth?: boolean;
32
- /** 리사이즈 최소/최대 너비 (px) */
45
+ /**
46
+ * 리사이즈 하한/상한 (px). **`resizable` 로 끄는 손잡이의 이동 범위일 뿐, 레이아웃에는
47
+ * 관여하지 않는다** — 폭을 주지 않은 열이 이 값 안에서 잡히는 것이 아니다.
48
+ */
33
49
  minWidth?: number;
34
50
  maxWidth?: number;
35
51
  /** 표시 포맷 */
36
52
  format?: (value: any, row: SRow) => string;
37
53
  visible?: boolean;
38
- icon?: SIconName;
39
- /** 헤더 아이콘 색상. 팔레트 키(`grey_65`, `red_95` …) 또는 임의 CSS 색상 */
40
- iconColor?: SColor;
54
+ /**
55
+ * 헤더 라벨 뒤 도움말 툴팁 (각 항목이 한 줄). `SKeyValueTable` 의 `field.helpText` 와 같은 역할 —
56
+ * 라벨만으로 뜻이 통하지 않는 컬럼의 산출 기준·단위를 설명한다.
57
+ *
58
+ * `renderHeader` 로 헤더를 통째로 교체하면 그리지 않는다 (헤더 전체가 소비 앱 책임).
59
+ */
60
+ helpText?: string[];
61
+ /**
62
+ * 라벨 뒤 필수 표시(`*`). `SKeyValueTable` 의 `field.required` 와 같은 규칙 —
63
+ * 그 열의 값을 반드시 채워야 하는 입력 열에만 쓴다.
64
+ *
65
+ * `renderHeader` 로 헤더를 통째로 교체하면 그리지 않는다 (헤더 전체가 소비 앱 책임).
66
+ */
67
+ required?: boolean;
68
+ /**
69
+ * 셀 값을 직접 고칠 수 있는 열. 라벨 뒤에 `pageEdit` 표식이 붙는다.
70
+ *
71
+ * **표식일 뿐 버튼이 아니다** — 실제로 고치는 UI 는 셀(`render`)이 그린다. 표식만 켜 두면
72
+ * 고칠 수 있다고 해 놓고 고칠 방법이 없는 열이 된다.
73
+ *
74
+ * `renderHeader` 로 헤더를 통째로 교체하면 그리지 않는다 (헤더 전체가 소비 앱 책임).
75
+ */
76
+ editable?: boolean;
77
+ /**
78
+ * 셀을 눌러 다른 화면으로 넘어가는 열. 라벨 뒤에 `pageMove` 표식이 붙는다.
79
+ *
80
+ * **표식일 뿐 버튼이 아니다** — 넘어가는 것은 셀(`render`)의 링크·클릭이 한다.
81
+ *
82
+ * `renderHeader` 로 헤더를 통째로 교체하면 그리지 않는다 (헤더 전체가 소비 앱 책임).
83
+ */
84
+ navigable?: boolean;
85
+ /**
86
+ * 정렬 가능한 열인지. 켜면 헤더 라벨 뒤에 정렬 버튼이 붙는다 — 누르는 곳은 그 버튼뿐이고
87
+ * 헤더 셀 전체가 클릭 영역이 되지는 않는다.
88
+ *
89
+ * 정렬 상태는 컴포넌트가 갖지 않는다 — `STable` 의 `sort` · `onSortChange` 로 주고받는다.
90
+ * `renderHeader` 로 헤더를 통째로 교체하면 버튼도 그리지 않는다 (헤더 전체가 소비 앱 책임).
91
+ */
92
+ sortable?: boolean;
41
93
  /**
42
94
  * 셀에 무엇이 들어가는지. 좌우 여백이 여기서 갈린다 — 기본은 `text`(넓게).
43
95
  *
@@ -69,6 +121,17 @@ export interface STableColumn {
69
121
  thClass?: string;
70
122
  thStyle?: CSSProperties;
71
123
  }
124
+ /**
125
+ * `autoWidth` 스페이서 열은 값을 그리지 않으므로 `field` 를 생략할 수 있다.
126
+ * 그 밖의 열은 값 접근자가 있어야 한다.
127
+ */
128
+ export type STableColumn = STableColumnBase & ({
129
+ autoWidth: true;
130
+ field?: STableColumnField;
131
+ } | {
132
+ autoWidth?: false;
133
+ field: STableColumnField;
134
+ });
72
135
  export interface STablePagination {
73
136
  page: number;
74
137
  rowsPerPage: number;
@@ -78,13 +141,29 @@ export interface STableStickyColumn {
78
141
  left?: number;
79
142
  right?: number;
80
143
  }
144
+ /** 정렬 상태 — 어느 열을 어느 방향으로 정렬했는가 */
145
+ export interface STableSort {
146
+ /** 정렬 기준 컬럼의 `name` */
147
+ name: string;
148
+ dir: 'asc' | 'desc';
149
+ }
150
+ /** 2단 헤더의 상위 셀. columnNames는 visible 컬럼 기준으로 연속되어야 한다. */
151
+ export interface STableHeaderGroup {
152
+ label?: ReactNode;
153
+ columnNames: string[];
154
+ rowSpan?: 1 | 2;
155
+ align?: 'left' | 'center' | 'right';
156
+ className?: string;
157
+ style?: CSSProperties;
158
+ render?: () => ReactNode;
159
+ }
81
160
  /** STable ref 명령형 API (sd-table @Method 대응) */
82
161
  export interface STableHandle {
83
162
  /** 행 선택 여부 */
84
163
  isRowSelected: (row: SRow) => boolean;
85
164
  /** 주어진 행들의 전체 선택 상태 (true/false/null=indeterminate) */
86
165
  getIsAllChecked: (rows: SRow[]) => boolean | null;
87
- /** 내부 페이지네이션 정보 (useInternalPagination 아니면 null) */
166
+ /** 내부 페이지네이션 정보 (internalPagination 아니면 null) */
88
167
  getPaginationInfo: () => {
89
168
  startIndex: number;
90
169
  endIndex: number;
@@ -102,6 +181,8 @@ export interface STableHandle {
102
181
  }
103
182
  export interface STableProps {
104
183
  columns?: STableColumn[];
184
+ /** 상위 그룹 헤더. 지정하면 기존 컬럼 헤더가 두 번째 행에 렌더링된다. */
185
+ headerGroups?: STableHeaderGroup[];
105
186
  rows?: SRow[];
106
187
  /** 행 식별 필드 */
107
188
  rowKey?: string;
@@ -109,12 +190,23 @@ export interface STableProps {
109
190
  selectable?: boolean;
110
191
  selected?: SRow[];
111
192
  onSelectedChange?: (rows: SRow[]) => void;
193
+ /**
194
+ * 정렬 상태 (controlled). `null`·미지정이면 정렬 없음.
195
+ *
196
+ * 컴포넌트는 정렬 상태를 갖지 않는다 — 서버 정렬이면 이 값이 곧 조회 조건이고,
197
+ * 뒤로가기·새로고침·링크 공유로 복원돼야 하므로 진실은 URL·store 쪽에 있어야 한다.
198
+ * 행을 실제로 정렬하는 것도 소비 앱 몫이다 (`STable` 은 받은 순서대로 그린다).
199
+ */
200
+ sort?: STableSort | null;
201
+ /**
202
+ * 정렬 헤더 클릭 (`asc → desc → 해제` 3단). 해제되면 `null` 이 온다.
203
+ * 다중 정렬은 1차 안에서 지원하지 않는다.
204
+ */
205
+ onSortChange?: (sort: STableSort | null) => void;
112
206
  /** 컬럼 너비 조절 */
113
207
  resizable?: boolean;
114
208
  width?: string;
115
209
  height?: string;
116
- /** @deprecated 헤더는 항상 세로 스크롤에서 제외되어 고정됩니다 (body만 세로 스크롤) */
117
- stickyHeader?: boolean;
118
210
  /** 고정할 좌/우 컬럼 수 */
119
211
  stickyColumn?: STableStickyColumn;
120
212
  /** border-radius 제어 */
@@ -129,27 +221,42 @@ export interface STableProps {
129
221
  * 없어, 그대로 두면 페이지네이션만 테두리를 갖고 1px 어긋난다.
130
222
  */
131
223
  bordered?: boolean;
132
- noDataLabel?: string;
224
+ emptyLabel?: string;
133
225
  /**
134
226
  * 데이터가 없을 때 body 영역 전체를 대체하는 슬롯.
135
- * 지정하면 `noDataLabel` 대신 이 콘텐츠가 헤더 아래 영역을 채우며, 버튼 등 인터랙션도 동작한다.
227
+ * 지정하면 `emptyLabel` 대신 이 콘텐츠가 헤더 아래 영역을 채우며, 버튼 등 인터랙션도 동작한다.
228
+ */
229
+ emptySlot?: ReactNode;
230
+ loading?: boolean;
231
+ /**
232
+ * 행 높이를 좁게 (세로 여백만 줄인다 — 좌우 패딩은 그대로).
233
+ *
234
+ * **시작 밀도이자 밀도 토글의 스위치다.** 켜면 하단 바 우측에 `좁게 보기` · `넓게 보기` 토글이
235
+ * 붙는다 — 페이지네이션이 없으면 이 바를 토글만 담아 그린다.
236
+ *
237
+ * 누른 뒤의 밀도는 테이블이 내부 상태로 들고 가므로 `onDenseChange` 를 받지 않아도 토글은
238
+ * 동작하고, 넓게 본 뒤에도 토글은 그대로 남는다(붙일지는 이 prop 이 정한다). 이 prop 값이
239
+ * 바뀌면 내부 밀도도 그 값으로 맞춰진다.
136
240
  */
137
- noDataSlot?: ReactNode;
138
- isLoading?: boolean;
139
241
  dense?: boolean;
242
+ /**
243
+ * 밀도 변경 (하단 바의 밀도 토글을 눌렀을 때). 표시는 테이블이 알아서 바꾸므로 받지 않아도 되고,
244
+ * 사용자가 고른 밀도를 다음 방문까지 기억해 두려는(로컬 저장 등) 페이지만 받으면 된다.
245
+ */
246
+ onDenseChange?: (dense: boolean) => void;
140
247
  /** true면 행에 마우스를 올려도 hover 배경(grey_05)을 표시하지 않는다 */
141
- noHover?: boolean;
248
+ hoverable?: boolean;
142
249
  /** 페이지네이션 (있으면 하단 표시) */
143
250
  pagination?: STablePagination;
144
251
  onPageChange?: (page: number) => void;
145
252
  /** 테이블 내부에서 페이지네이션을 직접 관리 (rows를 내부 슬라이싱) */
146
- useInternalPagination?: boolean;
253
+ internalPagination?: boolean;
147
254
  /** 페이지당 행 수 셀렉트 표시 */
148
- useRowsPerPageSelect?: boolean;
255
+ showRowsPerPageSelect?: boolean;
149
256
  rowsPerPageOption?: SSelectOption[];
150
257
  onRowsPerPageChange?: (perPage: number) => void;
151
258
  /** 가상 스크롤 */
152
- useVirtualScroll?: boolean;
259
+ virtualScroll?: boolean;
153
260
  rowHeight?: number;
154
261
  virtualBuffer?: number;
155
262
  virtualEndThreshold?: number;
@@ -175,3 +282,4 @@ export interface STableProps {
175
282
  * 내부 페이지네이션 + rows-per-page + 가상 스크롤 + 로딩 + dense.
176
283
  */
177
284
  export declare const STable: import("react").ForwardRefExoticComponent<STableProps & import("react").RefAttributes<STableHandle>>;
285
+ export {};
@@ -1 +1 @@
1
- export { STable, type STableProps, type STableColumn, type STableCellContext, type STablePagination, type STableStickyColumn, type STableHandle, type SRow, } from './STable';
1
+ export { STable, type STableProps, type STableColumn, type STableColumnField, type STableSort, type STableHeaderGroup, type STableCellContext, type STablePagination, type STableStickyColumn, type STableHandle, type SRow, } from './STable';
@@ -10,8 +10,7 @@
10
10
  |------|------|---------|-------------|
11
11
  | `value` | `string` | — | 현재 선택된 탭 value |
12
12
  | `tabs` | `STabOption[]` | — | 탭 옵션 목록 |
13
- | `size?` | `STabSize` | `'md'` | 탭 크기 (main 전용) |
14
- | `isSub?` | `boolean` | `false` | 서브 탭(밑줄형) 스타일 |
13
+ | `sub?` | `boolean` | `false` | 서브 탭(밑줄형) 스타일 |
15
14
  | `vertical?` | `boolean` | `false` | 세로 배치 (sub 전용 — main 폴더형은 항상 가로) |
16
15
  | `className?` | `string` | — | |
17
16
  | `style?` | `CSSProperties` | — | |
@@ -22,6 +21,18 @@
22
21
  |-------|------|-------------|
23
22
  | `onValueChange` | `(value: string) => void` | 탭 변경 (sdUpdate) |
24
23
 
24
+ ## Types
25
+
26
+ ### STabOption
27
+
28
+ ```ts
29
+ export interface STabOption {
30
+ label: string;
31
+ value: string;
32
+ badge?: string | number;
33
+ }
34
+ ```
35
+
25
36
  ## Dependencies
26
37
 
27
38
  ### Depends on
@@ -1,5 +1,5 @@
1
1
  import { type CSSProperties } from 'react';
2
- import { type STabSize, type STabOption } from './tabs.config';
2
+ import { type STabOption } from './tabs.config';
3
3
  export interface STabsProps {
4
4
  /** 현재 선택된 탭 value */
5
5
  value: string;
@@ -7,10 +7,8 @@ export interface STabsProps {
7
7
  tabs: STabOption[];
8
8
  /** 탭 변경 (sdUpdate) */
9
9
  onValueChange?: (value: string) => void;
10
- /** 탭 크기 (main 전용) */
11
- size?: STabSize;
12
10
  /** 서브 탭(밑줄형) 스타일 */
13
- isSub?: boolean;
11
+ sub?: boolean;
14
12
  /** 세로 배치 (sub 전용 — main 폴더형은 항상 가로) */
15
13
  vertical?: boolean;
16
14
  className?: string;
@@ -21,4 +19,4 @@ export interface STabsProps {
21
19
  * main = 폴더형(탭 줄에 파란 baseline, 탭은 위쪽만 둥글고 하단 테두리 없음),
22
20
  * sub = 밑줄형(선택 시 하단 라인). 뱃지(STag), 세로 배치, value 제어 + onValueChange(sdUpdate).
23
21
  */
24
- export declare function STabs({ value, tabs, onValueChange, size, isSub, vertical, className, style, }: STabsProps): import("react").JSX.Element;
22
+ export declare function STabs({ value, tabs, onValueChange, sub, vertical, className, style, }: STabsProps): import("react").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  export { STabs, type STabsProps } from './STabs';
2
- export { type STabOption, type STabSize } from './tabs.config';
2
+ export { type STabOption } from './tabs.config';
@@ -1,14 +1,13 @@
1
- export type STabSize = 'md' | 'lg';
2
1
  export interface STabOption {
3
2
  label: string;
4
3
  value: string;
5
4
  badge?: string | number;
6
5
  }
7
- /** main(분절형) 사이즈별 레이아웃 — size는 높이·패딩만 바꾸고 폰트는 고정 */
8
- export declare const TAB_MAIN_SIZE: Record<STabSize, {
6
+ /** main(분절형) 레이아웃 */
7
+ export declare const TAB_MAIN_SIZE: {
9
8
  height: number;
10
9
  paddingX: number;
11
- }>;
10
+ };
12
11
  /** 탭 타이포 (main/sub 공통, token: typography.navigation.sm) */
13
12
  export declare const TAB_TYPOGRAPHY: {
14
13
  fontSize: number;
@@ -11,11 +11,59 @@
11
11
  | `shape?` | `STagShape` | `'square'` | 모양 |
12
12
  | `size?` | `STagSize` | `'sm'` | 크기 |
13
13
  | `color?` | `STagColor` | `'grey'` | 색상 |
14
+ | `deep?` | `boolean` | `false` | 진한 배경(deep) 버전. 배경에 강조색을 채우고 텍스트·아이콘을 반전색으로 쓴다 |
14
15
  | `label?` | `string` | `''` | 레이블 텍스트 |
15
16
  | `icon?` | `SIconName` | — | 아이콘명 |
16
17
  | `iconLeft?` | `boolean` | `true` | 아이콘을 레이블 왼쪽에 배치 |
17
18
  | `width?` | `string \| number` | — | 태그 너비 (숫자면 px, 문자열이면 그대로 적용). 미지정 시 콘텐츠 크기 |
18
19
 
20
+ ## Types
21
+
22
+ ### STagShape
23
+
24
+ ```ts
25
+ export type STagShape = (typeof TAG_SHAPES)[number];
26
+ ```
27
+
28
+ ### STagSize
29
+
30
+ ```ts
31
+ export type STagSize = (typeof TAG_SIZES)[number];
32
+ ```
33
+
34
+ ### STagColor
35
+
36
+ ```ts
37
+ export type STagColor = (typeof TAG_COLORS)[number];
38
+ ```
39
+
40
+ ### TAG_SHAPES
41
+
42
+ ```ts
43
+ export const TAG_SHAPES = ['square', 'pill'] as const;
44
+ ```
45
+
46
+ ### TAG_SIZES
47
+
48
+ ```ts
49
+ export const TAG_SIZES = ['xs', 'sm', 'md'] as const;
50
+ ```
51
+
52
+ ### TAG_COLORS
53
+
54
+ ```ts
55
+ export const TAG_COLORS = [
56
+ 'grey',
57
+ 'red',
58
+ 'orange',
59
+ 'yellow',
60
+ 'green',
61
+ 'blue',
62
+ 'darkblue',
63
+ 'indigo',
64
+ ] as const;
65
+ ```
66
+
19
67
  ## Dependencies
20
68
 
21
69
  ### Used by
@@ -24,6 +72,8 @@
24
72
  - [SConfirmModal](../SConfirmModal)
25
73
  - [SGhostButton](../SGhostButton)
26
74
  - [SGnb](../SGnb)
75
+ - [SRadioCard](../SRadioCard)
76
+ - [SSystemActionButton](../SSystemActionButton)
27
77
  - [STabs](../STabs)
28
78
  - [STextLink](../STextLink)
29
79
 
@@ -40,6 +90,8 @@ graph TD;
40
90
  SConfirmModal --> STag
41
91
  SGhostButton --> STag
42
92
  SGnb --> STag
93
+ SRadioCard --> STag
94
+ SSystemActionButton --> STag
43
95
  STabs --> STag
44
96
  STextLink --> STag
45
97
  style STag fill:#f9f,stroke:#333,stroke-width:4px
@@ -8,6 +8,8 @@ export interface STagProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'color'
8
8
  size?: STagSize;
9
9
  /** 색상 */
10
10
  color?: STagColor;
11
+ /** 진한 배경(deep) 버전. 배경에 강조색을 채우고 텍스트·아이콘을 반전색으로 쓴다 */
12
+ deep?: boolean;
11
13
  /** 레이블 텍스트 */
12
14
  label?: string;
13
15
  /** 아이콘명 */
@@ -20,6 +22,6 @@ export interface STagProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'color'
20
22
  /**
21
23
  * STag — sd-tag 포팅.
22
24
  * Stencil의 `name`(예: square_sm_grey) 프리셋을 shape/size/color 세 prop으로 분리.
23
- * 색상은 컴포넌트 토큰 `--cmp-tag-<color>-{bg,content}` 참조.
25
+ * 색상은 컴포넌트 토큰 `--cmp-tag-<color>-{bg,content}`, deep 은 `--cmp-tag-<color>-deep-*` 참조.
24
26
  */
25
27
  export declare const STag: import("react").ForwardRefExoticComponent<STagProps & import("react").RefAttributes<HTMLSpanElement>>;
@@ -11,8 +11,10 @@
11
11
  | `label?` | `string` | `''` | 레이블 |
12
12
  | `icon?` | `SIconName` | — | 좌측 아이콘 |
13
13
  | `iconColor?` | `SColor` | — | 좌측 아이콘 색상. 팔레트 키(`grey_65`, `red_95` …) 또는 임의 CSS 색상 |
14
- | `labelClass?` | `string` | — | 레이블 span에 추가할 클래스 |
14
+ | `iconRotate?` | `0 \| 90 \| 180 \| 270` | — | 좌측 아이콘 회전 각도. 같은 아이콘을 방향만 바꿔 쓸 때 (`SIcon` 의 `rotate` 로 그대로 간다) |
15
+ | `labelClassName?` | `string` | — | 레이블 span에 추가할 클래스 |
15
16
  | `rightArrow?` | `STextLinkArrow` | `'none'` | 우측 화살표 |
17
+ | `rightArrowRotate?` | `0 \| 90 \| 180 \| 270` | — | 우측 화살표 회전 각도. 같은 화살표를 방향만 바꿔 쓸 때 (`SIcon` 의 `rotate` 로 그대로 간다) |
16
18
  | `underline?` | `boolean` | `false` | 밑줄 여부 |
17
19
  | `disabled?` | `boolean` | `false` | 비활성 |
18
20
  | `size?` | `STextLinkSize` | `'sm'` | 크기 |
@@ -24,6 +26,20 @@
24
26
  |-------|------|-------------|
25
27
  | `onClick` | `() => void` | |
26
28
 
29
+ ## Types
30
+
31
+ ### STextLinkArrow
32
+
33
+ ```ts
34
+ export type STextLinkArrow = 'none' | 'chevron' | 'caret';
35
+ ```
36
+
37
+ ### STextLinkSize
38
+
39
+ ```ts
40
+ export type STextLinkSize = 'sm' | 'md' | 'lg';
41
+ ```
42
+
27
43
  ## Dependencies
28
44
 
29
45
  ### Used by
@@ -31,6 +47,7 @@
31
47
  - [SChipFilter](../SChipFilter)
32
48
  - [SChipInput](../SChipInput)
33
49
  - [SPopover](../SPopover)
50
+ - [STable](../STable)
34
51
 
35
52
  ### Depends on
36
53
 
@@ -46,5 +63,6 @@ graph TD;
46
63
  SChipFilter --> STextLink
47
64
  SChipInput --> STextLink
48
65
  SPopover --> STextLink
66
+ STable --> STextLink
49
67
  style STextLink fill:#f9f,stroke:#333,stroke-width:4px
50
68
  ```
@@ -10,10 +10,14 @@ export interface STextLinkProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'o
10
10
  icon?: SIconName;
11
11
  /** 좌측 아이콘 색상. 팔레트 키(`grey_65`, `red_95` …) 또는 임의 CSS 색상 */
12
12
  iconColor?: SColor;
13
+ /** 좌측 아이콘 회전 각도. 같은 아이콘을 방향만 바꿔 쓸 때 (`SIcon` 의 `rotate` 로 그대로 간다) */
14
+ iconRotate?: 0 | 90 | 180 | 270;
13
15
  /** 레이블 span에 추가할 클래스 */
14
- labelClass?: string;
16
+ labelClassName?: string;
15
17
  /** 우측 화살표 */
16
18
  rightArrow?: STextLinkArrow;
19
+ /** 우측 화살표 회전 각도. 같은 화살표를 방향만 바꿔 쓸 때 (`SIcon` 의 `rotate` 로 그대로 간다) */
20
+ rightArrowRotate?: 0 | 90 | 180 | 270;
17
21
  /** 밑줄 여부 */
18
22
  underline?: boolean;
19
23
  /** 비활성 */
@@ -12,9 +12,9 @@
12
12
  | `rows?` | `number` | `3` | 행 수 |
13
13
  | `rules?` | `Rule[]` | — | 유효성 규칙 — blur 시 자동 검증 |
14
14
  | `status?` | `SFieldStatus` | — | 필드 상태 ('default' | 'pass' | 'error') |
15
- | `focused?` | `boolean` | — | 포커스 상태 (제어/반영) |
16
- | `hovered?` | `boolean` | — | 호버 상태 (제어/반영) |
17
- | `textareaClass?` | `string` | — | 내부 textarea 요소 className |
15
+ | `focused?` | `boolean` | — | 포커스 상태를 밖에서 지정한다 — 강조 테두리·링이 즉시 걸린다 (SField 로 그대로 넘어간다) |
16
+ | `hovered?` | `boolean` | — | 호버 상태를 밖에서 지정한다 — 강조는 `focused` 와 같다 (SField 로 그대로 넘어간다) |
17
+ | `textareaClassName?` | `string` | — | 내부 textarea 요소 className |
18
18
  | `textareaStyle?` | `CSSProperties` | — | 내부 textarea 요소 style |
19
19
  | `label?` | `string` | — | |
20
20
  | `labelWidth?` | `number \| string` | — | |
@@ -27,7 +27,7 @@
27
27
  | `hint?` | `string` | — | |
28
28
  | `error?` | `boolean` | — | |
29
29
  | `errorMessage?` | `string` | — | |
30
- | `width?` | `number \| string` | — | |
30
+ | `width?` | `SFieldWidth` | — | 컨트롤 너비 — 폭 등급(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`) · 숫자=px · CSS 길이. 등급은 `--cmp-field-width-*` 토큰으로 풀리므로 토큰이 바뀌면 화면이 따라간다. 값 길이에 상한이 없으면 `"100%"` 로 두어 행 전체를 쓴다. |
31
31
  | `disabled?` | `boolean` | `false` | |
32
32
  | `readOnly?` | `boolean` | `false` | |
33
33
  | `className?` | `string` | — | |