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

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 (185) hide show
  1. package/AGENTS.md +642 -88
  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 +9 -1
  12. package/dist/components/SBarcodeInput/SBarcodeInput.d.ts +7 -1
  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 +15 -1
  33. package/dist/components/SChipInput/SChipInput.d.ts +7 -1
  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 +17 -1
  37. package/dist/components/SConfirmModal/SConfirmModal.d.ts +2 -2
  38. package/dist/components/SConfirmModal/index.d.ts +1 -1
  39. package/dist/components/SDatePicker/README.md +20 -2
  40. package/dist/components/SDatePicker/SDatePicker.d.ts +27 -4
  41. package/dist/components/SDateRangePicker/README.md +17 -2
  42. package/dist/components/SDateRangePicker/SDateRangePicker.d.ts +16 -3
  43. package/dist/components/SDivider/README.md +7 -0
  44. package/dist/components/SDivider/SDivider.d.ts +11 -0
  45. package/dist/components/SDraggableItem/README.md +37 -0
  46. package/dist/components/SDraggableItem/SDraggableItem.d.ts +2 -0
  47. package/dist/components/SDraggableItem/index.d.ts +1 -1
  48. package/dist/components/SDraggableList/README.md +30 -0
  49. package/dist/components/SDraggableList/SDraggableList.d.ts +11 -0
  50. package/dist/components/SDraggableList/index.d.ts +1 -1
  51. package/dist/components/SDrawer/README.md +8 -0
  52. package/dist/components/SDropdownButton/README.md +19 -0
  53. package/dist/components/SEditor/EditorBody.d.ts +36 -0
  54. package/dist/components/SEditor/EditorToolbar.d.ts +93 -0
  55. package/dist/components/SEditor/README.md +203 -0
  56. package/dist/components/SEditor/SEditor.d.ts +114 -0
  57. package/dist/components/SEditor/editor-icons.d.ts +63 -0
  58. package/dist/components/SEditor/editor.config.d.ts +119 -0
  59. package/dist/components/SEditor/index.d.ts +8 -0
  60. package/dist/components/SEditor/tiptap-api.d.ts +29 -0
  61. package/dist/components/SEditor/use-is-mobile.d.ts +14 -0
  62. package/dist/components/SExpansionItem/README.md +36 -0
  63. package/dist/components/SExpansionItem/index.d.ts +1 -1
  64. package/dist/components/SField/README.md +27 -3
  65. package/dist/components/SField/SField.d.ts +12 -6
  66. package/dist/components/SFilePicker/README.md +15 -1
  67. package/dist/components/SFilePicker/SFilePicker.d.ts +7 -1
  68. package/dist/components/SFooter/README.md +25 -0
  69. package/dist/components/SFooter/SFooter.d.ts +4 -3
  70. package/dist/components/SForm/README.md +11 -0
  71. package/dist/components/SGhostButton/README.md +22 -4
  72. package/dist/components/SGnb/README.md +51 -0
  73. package/dist/components/SGnb/SGnb.d.ts +50 -0
  74. package/dist/components/SGnb/gnb.config.d.ts +10 -3
  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 +14 -0
  85. package/dist/components/SInput/README.md +3 -1
  86. package/dist/components/SInput/SInput.d.ts +7 -1
  87. package/dist/components/SKeyValueTable/README.md +86 -0
  88. package/dist/components/SKeyValueTable/SKeyValueTable.d.ts +6 -2
  89. package/dist/components/SKeyValueTable/index.d.ts +1 -1
  90. package/dist/components/SLayout/README.md +21 -0
  91. package/dist/components/SLayout/SLayout.d.ts +4 -0
  92. package/dist/components/SLayout/index.d.ts +1 -1
  93. package/dist/components/SLinearProgress/README.md +15 -0
  94. package/dist/components/SLinearProgress/SLinearProgress.d.ts +3 -0
  95. package/dist/components/SLinearProgress/index.d.ts +1 -1
  96. package/dist/components/SList/README.md +5 -1
  97. package/dist/components/SList/SList.d.ts +0 -2
  98. package/dist/components/SListItem/README.md +41 -0
  99. package/dist/components/SListItem/index.d.ts +1 -1
  100. package/dist/components/SLoadingContainer/loading.d.ts +18 -2
  101. package/dist/components/SLoadingModal/README.md +9 -1
  102. package/dist/components/SLoadingModal/SLoadingModal.d.ts +2 -2
  103. package/dist/components/SLoadingModal/index.d.ts +1 -1
  104. package/dist/components/SNumberInput/README.md +9 -1
  105. package/dist/components/SNumberInput/SNumberInput.d.ts +7 -1
  106. package/dist/components/SPage/README.md +47 -4
  107. package/dist/components/SPage/SPage.d.ts +15 -10
  108. package/dist/components/SPage/SPageHeader.d.ts +18 -11
  109. package/dist/components/SPage/index.d.ts +1 -1
  110. package/dist/components/SPage/page-column.d.ts +25 -0
  111. package/dist/components/SPopover/README.md +15 -0
  112. package/dist/components/SPopup/README.md +19 -0
  113. package/dist/components/SPortal/README.md +18 -0
  114. package/dist/components/SRadio/README.md +20 -0
  115. package/dist/components/SRadioButton/README.md +18 -0
  116. package/dist/components/SRadioButton/SRadioButton.d.ts +1 -1
  117. package/dist/components/SRadioCard/README.md +78 -0
  118. package/dist/components/SRadioCard/SRadioCard.d.ts +29 -0
  119. package/dist/components/SRadioCard/SRadioCardGroup.d.ts +36 -0
  120. package/dist/components/SRadioCard/index.d.ts +2 -0
  121. package/dist/components/SScrollArea/README.md +27 -0
  122. package/dist/components/SSearchInput/README.md +63 -0
  123. package/dist/components/SSearchInput/SSearchInput.d.ts +52 -0
  124. package/dist/components/SSearchInput/index.d.ts +1 -0
  125. package/dist/components/SSectionHeaderCard/README.md +37 -0
  126. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.d.ts +10 -0
  127. package/dist/components/SSelect/README.md +24 -6
  128. package/dist/components/SSelect/SSelect.d.ts +14 -2
  129. package/dist/components/SSplitter/README.md +15 -0
  130. package/dist/components/SStepper/README.md +26 -0
  131. package/dist/components/SSwitch/README.md +13 -0
  132. package/dist/components/SSystemActionButton/README.md +221 -0
  133. package/dist/components/SSystemActionButton/SSystemActionButton.d.ts +161 -0
  134. package/dist/components/SSystemActionButton/index.d.ts +2 -0
  135. package/dist/components/SSystemActionButton/systemActionButton.config.d.ts +93 -0
  136. package/dist/components/STable/README.md +86 -1
  137. package/dist/components/STable/STable.d.ts +121 -11
  138. package/dist/components/STable/index.d.ts +1 -1
  139. package/dist/components/STabs/README.md +12 -1
  140. package/dist/components/STabs/STabs.d.ts +2 -4
  141. package/dist/components/STabs/index.d.ts +1 -1
  142. package/dist/components/STabs/tabs.config.d.ts +3 -4
  143. package/dist/components/STag/README.md +52 -0
  144. package/dist/components/STag/STag.d.ts +3 -1
  145. package/dist/components/STextLink/README.md +18 -0
  146. package/dist/components/STextLink/STextLink.d.ts +4 -0
  147. package/dist/components/STextarea/README.md +1 -1
  148. package/dist/components/STextarea/STextarea.d.ts +7 -1
  149. package/dist/components/STimePicker/README.md +15 -1
  150. package/dist/components/STimePicker/STimePicker.d.ts +7 -1
  151. package/dist/components/STimePicker/timepicker.config.d.ts +4 -2
  152. package/dist/components/STimeRangePicker/README.md +27 -1
  153. package/dist/components/STimeRangePicker/STimeRangePicker.d.ts +7 -1
  154. package/dist/components/SToast/README.md +24 -0
  155. package/dist/components/SToggle/README.md +8 -0
  156. package/dist/components/SToggle/index.d.ts +1 -1
  157. package/dist/components/STooltip/README.md +24 -0
  158. package/dist/components/STree/README.md +41 -0
  159. package/dist/components/STree/STree.d.ts +8 -0
  160. package/dist/components/STree/index.d.ts +1 -1
  161. package/dist/docs/Gallery.d.ts +9 -0
  162. package/dist/docs/gallery-previews.d.ts +24 -0
  163. package/dist/index.cjs +10754 -5244
  164. package/dist/index.cjs.map +1 -1
  165. package/dist/index.d.ts +8 -0
  166. package/dist/index.js +10718 -5244
  167. package/dist/index.js.map +1 -1
  168. package/dist/lib/doc-sections.d.ts +35 -0
  169. package/dist/lib/field-width.d.ts +31 -0
  170. package/dist/lib/floating-height.d.ts +15 -0
  171. package/dist/lib/story-docs.d.ts +19 -3
  172. package/dist/lib/truncated-value-tooltip.d.ts +18 -0
  173. package/dist/llms-full.txt +3263 -228
  174. package/dist/llms.txt +647 -90
  175. package/dist/playground/categories.d.ts +19 -0
  176. package/dist/styles.css +1725 -169
  177. package/dist/theme.css +216 -24
  178. package/eslint/index.mjs +14 -0
  179. package/eslint/lib/table-column.mjs +26 -0
  180. package/eslint/rules/divider-vertical-height.mjs +137 -0
  181. package/eslint/rules/field-width-grade.d.mts +41 -0
  182. package/eslint/rules/field-width-grade.mjs +311 -0
  183. package/eslint/rules/table-column-width.mjs +110 -0
  184. package/eslint/scale.gen.mjs +5 -2
  185. package/package.json +13 -1
@@ -0,0 +1,161 @@
1
+ import { type ButtonHTMLAttributes } from 'react';
2
+ import { type SAccountListBoxContent } from '../SAccountListBox';
3
+ import { type SIconName } from '../SIcon';
4
+ import { type STagColor } from '../STag';
5
+ import { type SSystemActionButtonColor } from './systemActionButton.config';
6
+ /** 선행 아이콘만 받는 타입(`select`)의 option */
7
+ export interface SSystemActionButtonIconOption {
8
+ /** 선행 아이콘명 */
9
+ icon: SIconName;
10
+ }
11
+ /** 우측 액션 텍스트까지 받는 타입(`switch` · `subSelect`)의 option */
12
+ export interface SSystemActionButtonTextOption extends SSystemActionButtonIconOption {
13
+ /** 우측 액션 텍스트 */
14
+ text?: string;
15
+ }
16
+ /** 값 고르기 메뉴의 한 칸 */
17
+ export interface SSystemActionButtonMenuOption {
18
+ /** 값. `option.value` 와 맞춰 지금 값을 가린다 */
19
+ value: string;
20
+ /** 화면에 적히는 이름 */
21
+ label: string;
22
+ }
23
+ /**
24
+ * `subSelect` 타입의 option — 지금 값 + 고를 목록.
25
+ *
26
+ * `options` 는 **필수다** — `subSelect` 는 "지금 값이 적혀 있고 눌러서 바꾸는 행"이라, 눌러도
27
+ * 아무것도 뜨지 않으면 그것은 `select`(눌러 들어가는 행)이지 `subSelect` 가 아니다.
28
+ */
29
+ export interface SSystemActionButtonSubSelectOption extends SSystemActionButtonIconOption {
30
+ /**
31
+ * 지금 값. `options` 에서 같은 `value` 를 찾아 우측에 그 `label` 로 적는다
32
+ * (못 찾으면 `value` 가 그대로 남는다).
33
+ */
34
+ value?: string;
35
+ /** 고를 수 있는 값. **필수다** — 이 목록이 행 오른쪽으로 펼쳐진다 */
36
+ options: SSystemActionButtonMenuOption[];
37
+ /** 메뉴에서 값을 고름. 고르면 메뉴가 닫힌다 */
38
+ onChange?: (value: string) => void;
39
+ }
40
+ /** 상태 메뉴의 한 칸 — 점과 글자가 그 상태의 색으로 함께 물든다 */
41
+ export interface SSystemActionButtonStatusMenuOption extends SSystemActionButtonMenuOption {
42
+ /** 상태 색. 기본 `'blue'` */
43
+ color?: STagColor;
44
+ }
45
+ /**
46
+ * `status` 타입의 option — 라벨 자리에 들어가는 상태 태그 + 고를 목록.
47
+ *
48
+ * `options` 는 **필수다** — 상태 행은 늘 그 상태를 바꾸는 메뉴의 트리거이고, 지금 상태(`value`)에
49
+ * 해당하는 칸의 색·이름이 곧 태그가 된다. 보여주기만 하는 상태 줄이 필요하면 이 버튼이 아니라
50
+ * `STag` 를 쓴다.
51
+ */
52
+ export interface SSystemActionButtonStatusOption {
53
+ /** 지금 상태. `options` 에서 같은 `value` 를 찾아 그 색·이름으로 태그를 그린다 */
54
+ value?: string;
55
+ /** 고를 수 있는 상태. **필수다** — 이 목록이 행 오른쪽으로 펼쳐진다 */
56
+ options: SSystemActionButtonStatusMenuOption[];
57
+ /** 메뉴에서 상태를 고름. 고르면 메뉴가 닫힌다 */
58
+ onChange?: (value: string) => void;
59
+ }
60
+ /** 모든 타입이 공통으로 받는 props */
61
+ export interface SSystemActionButtonBaseProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'color' | 'type' | 'children'> {
62
+ /** 색상(놓이는 표면). light = 흰 면, dark = 오션블루 면, darker = 네이비 면. 기본 `'light'` */
63
+ color?: SSystemActionButtonColor;
64
+ /** 비활성 여부. 기본 `false` */
65
+ disabled?: boolean;
66
+ }
67
+ /**
68
+ * `account` 타입의 option — 행을 눌렀을 때 뜨는 계정 리스트박스.
69
+ * 내용(이메일·이름·권한·행들)은 `SAccountListBox` 와 같다.
70
+ *
71
+ * **뜨는 자리는 받지 않는다.** 계정 행이 놓인 자리가 정한다 — 판이면 행 위로 · 왼쪽 끝에 맞춰,
72
+ * 전폭 상단바면 행 아래로 · 오른쪽 끝에 맞춰 펼친다(시안). 화면마다 고를 값이 아니라,
73
+ * prop 으로 열면 같은 계정 행이 앱마다 다른 방향으로 뜬다.
74
+ */
75
+ export interface SSystemActionButtonAccountOption extends SAccountListBoxContent {
76
+ /**
77
+ * 리스트박스 열림 상태를 밖에서 쥔다(controlled). 주지 않으면 버튼이 스스로 여닫는다.
78
+ * 행을 담은 쪽이 닫아야 하는 자리가 있어 열어 둔 통로다 — 리스트박스는 SPortal 로 떠 있어
79
+ * 트리거가 화면에서 빠져도(GNB 를 접으면 메뉴 컬럼이 미끄러져 나간다) 따라 사라지지 않는다.
80
+ */
81
+ open?: boolean;
82
+ /** 리스트박스 열림/닫힘 변경 */
83
+ onOpenChange?: (open: boolean) => void;
84
+ }
85
+ /** 계정 행 — 아이콘이 `user` 로 고정이고 우측 액션이 없다 */
86
+ export interface SSystemActionButtonAccountProps extends SSystemActionButtonBaseProps {
87
+ /** 계정 행 */
88
+ type: 'account';
89
+ /** 라벨 텍스트 */
90
+ label?: string;
91
+ /**
92
+ * 누르면 뜨는 계정 리스트박스. **필수다** — 계정 행은 늘 이 패널의 트리거이고, 눌러도 아무것도
93
+ * 뜨지 않는 계정 행은 없다. 아이콘은 `user` 로 고정이라 여기서 받지 않는다.
94
+ */
95
+ option: SSystemActionButtonAccountOption;
96
+ }
97
+ /** 화살표만 붙는 행 — 눌러 들어간다는 뜻 */
98
+ export interface SSystemActionButtonSelectProps extends SSystemActionButtonBaseProps {
99
+ /** 화살표만 붙는 행 */
100
+ type: 'select';
101
+ /** 라벨 텍스트 */
102
+ label?: string;
103
+ /** 선행 아이콘 */
104
+ option: SSystemActionButtonIconOption;
105
+ }
106
+ /** 우측에 보조 조작 문구가 붙는 행 — 지금 붙어 있는 대상을 갈아 끼운다 */
107
+ export interface SSystemActionButtonSwitchProps extends SSystemActionButtonBaseProps {
108
+ /** 우측에 보조 조작 문구가 붙는 행 */
109
+ type: 'switch';
110
+ /** 라벨 텍스트 */
111
+ label?: string;
112
+ /** 선행 아이콘 + 우측 액션 텍스트 */
113
+ option: SSystemActionButtonTextOption;
114
+ }
115
+ /** 우측에 지금 선택된 값이 붙는 행 — `options` 를 주면 행 오른쪽으로 메뉴가 펼쳐진다 */
116
+ export interface SSystemActionButtonSubSelectProps extends SSystemActionButtonBaseProps {
117
+ /** 우측에 지금 선택된 값이 붙는 행 */
118
+ type: 'subSelect';
119
+ /** 라벨 텍스트 */
120
+ label?: string;
121
+ /** 선행 아이콘 + 우측 값 + 고를 목록 */
122
+ option: SSystemActionButtonSubSelectOption;
123
+ }
124
+ /** 우측에 문구가 붙는 두 타입을 함께 가리킨다 — `switch` · `subSelect` */
125
+ export type SSystemActionButtonTextProps = SSystemActionButtonSwitchProps | SSystemActionButtonSubSelectProps;
126
+ /** 라벨 자리에 상태 태그가 들어가는 행 — `options` 를 주면 행 오른쪽으로 메뉴가 펼쳐진다 */
127
+ export interface SSystemActionButtonStatusProps extends SSystemActionButtonBaseProps {
128
+ /** 라벨 자리에 상태 태그가 들어가는 행 */
129
+ type: 'status';
130
+ /** 태그가 라벨 자리를 차지하므로 받지 않는다 */
131
+ label?: never;
132
+ /**
133
+ * 상태 태그 + 고를 목록. **필수다** — 상태 행은 늘 그 상태를 바꾸는 메뉴의 트리거다.
134
+ */
135
+ option: SSystemActionButtonStatusOption;
136
+ }
137
+ /** `type` 으로 갈리는 판별 유니온. 타입에 맞지 않는 option 은 컴파일 단계에서 막힌다. */
138
+ export type SSystemActionButtonProps = SSystemActionButtonAccountProps | SSystemActionButtonSelectProps | SSystemActionButtonSwitchProps | SSystemActionButtonSubSelectProps | SSystemActionButtonStatusProps;
139
+ /**
140
+ * SSystemActionButton — GNB system 패널의 한 줄짜리 액션 버튼.
141
+ *
142
+ * 아이콘 프레임 + 라벨 + 우측 액션이 한 행에 붙고, 행 전체가 버튼이다. 무엇이 그려지는지는
143
+ * `type` 이 정하고(`account` `switch` `select` `subSelect` `status`), 타입마다 다른 값만
144
+ * `option` 으로 받는다. 선행 아이콘은 항상 있다 — `account` 는 `user` 고정, `status` 는 태그가
145
+ * 자리를 차지해 아이콘이 없고, 나머지는 `option.icon` 이 필수다.
146
+ *
147
+ * `account` 는 **언제나 계정 리스트박스(`SAccountListBox`)의 트리거**다 — 눌러도 아무것도 뜨지
148
+ * 않는 계정 행은 없으므로 `option` 이 필수이고, 누르면 이메일·이름·권한과 계정 설정·언어 변경·
149
+ * 로그아웃을 보여주고 행을 고르면 닫힌다. 뜨는 자리는 받지 않고 놓인 자리가 정한다
150
+ * (판이면 행 위로 · 왼쪽 끝, 전폭 상단바면 행 아래로 · 오른쪽 끝).
151
+ *
152
+ * `subSelect` · `status` 는 **언제나 값 고르기 메뉴의 트리거**다 — 지금 값이 적혀 있는 행이라
153
+ * 누르면 그 값을 바꾸는 메뉴가 뜬다. 그래서 `option.options` 가 필수이고, 메뉴는 행 오른쪽으로
154
+ * (행 위쪽 끝에 맞춰) 펼쳐지며 고르면 `option.onChange(value)` 가 돌고 닫힌다.
155
+ * 눌러서 값 고르는 화면으로 보낼 것이면 `select`, 보여주기만 할 것이면 `STag` 다.
156
+ *
157
+ * hover 하면 표면색이 한 단계 바뀌고, 어두운 색에서는 아이콘 프레임이 흰색으로 떠오른다.
158
+ * 상태는 default·hover 둘뿐이다 — 토큰에 selected 가 없다.
159
+ * 토큰은 `--cmp-gnb-system-item-*` · `--cmp-gnb-system-actionButton-*`.
160
+ */
161
+ export declare const SSystemActionButton: import("react").ForwardRefExoticComponent<SSystemActionButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
@@ -0,0 +1,2 @@
1
+ export { SSystemActionButton, type SSystemActionButtonProps, type SSystemActionButtonBaseProps, type SSystemActionButtonAccountProps, type SSystemActionButtonAccountOption, type SSystemActionButtonSelectProps, type SSystemActionButtonTextProps, type SSystemActionButtonSwitchProps, type SSystemActionButtonSubSelectProps, type SSystemActionButtonStatusProps, type SSystemActionButtonIconOption, type SSystemActionButtonTextOption, type SSystemActionButtonSubSelectOption, type SSystemActionButtonMenuOption, type SSystemActionButtonStatusOption, type SSystemActionButtonStatusMenuOption, } from './SSystemActionButton';
2
+ export { SYSTEM_ACTION_BUTTON_COLORS, SYSTEM_ACTION_BUTTON_TYPES, SYSTEM_ACTION_BUTTON_COLOR_CONFIG, SYSTEM_ACTION_BUTTON_TYPE_CONFIG, SYSTEM_ACTION_BUTTON_LAYOUT, type SSystemActionButtonColor, type SSystemActionButtonType, } from './systemActionButton.config';
@@ -0,0 +1,93 @@
1
+ import type { SIconName } from '../SIcon';
2
+ /**
3
+ * SSystemActionButton 설정.
4
+ *
5
+ * 토큰은 GNB system 패널 한 벌(`--cmp-gnb-system-*`)을 그대로 쓴다.
6
+ * 행 공통(높이·라운드·아이콘 프레임·라벨) → --cmp-gnb-system-item-*
7
+ * 색(color 축) light / dark / darker → --cmp-gnb-system-item-<color>-*
8
+ * 우측 액션(패딩·간격·아이콘·텍스트색) → --cmp-gnb-system-actionButton-*
9
+ *
10
+ * 타이포그래피는 CSS 변수가 아니라 `.typo-*` 프리셋으로 나온다.
11
+ * item.label → typo-body-sm-semibold (12/600/20)
12
+ * actionButton.switch → typo-field-sm-default (12/400/20)
13
+ * actionButton.selectData → typo-control-xs-medium (12/500/20)
14
+ */
15
+ /** 색상(표면). light = 흰 면, dark = 오션블루 면, darker = 네이비 면 */
16
+ export declare const SYSTEM_ACTION_BUTTON_COLORS: readonly ["light", "dark", "darker"];
17
+ export type SSystemActionButtonColor = (typeof SYSTEM_ACTION_BUTTON_COLORS)[number];
18
+ /**
19
+ * 행 구성.
20
+ * - `account` — 계정 행. 아이콘이 `user` 로 고정이고 우측 액션이 없다
21
+ * - `switch` — 보조 조작 문구 + 새로고침 아이콘
22
+ * - `select` — 화살표만. 눌러 들어간다는 뜻
23
+ * - `subSelect` — 지금 선택돼 있는 값 + 화살표
24
+ * - `status` — 라벨 자리에 상태 태그가 들어가고 화살표가 붙는다
25
+ */
26
+ export declare const SYSTEM_ACTION_BUTTON_TYPES: readonly ["account", "switch", "select", "subSelect", "status"];
27
+ export type SSystemActionButtonType = (typeof SYSTEM_ACTION_BUTTON_TYPES)[number];
28
+ /** 우측 액션 텍스트의 색·타이포가 어느 토큰 그룹을 쓰는지 (토큰의 하위 그룹명과 같다) */
29
+ export type SystemActionButtonActionTextToken = 'switch' | 'selectData';
30
+ export interface SystemActionButtonColorTokens {
31
+ /** 행 배경 (기본) */
32
+ bg: string;
33
+ /** 행 배경 (hover·selected) */
34
+ bgHover: string;
35
+ /** 아이콘 프레임 배경 (기본) */
36
+ iconBg: string;
37
+ /** 아이콘 프레임 배경 (hover·selected). 지금은 어느 색에서도 기본과 같다 — 아래 주석 참고 */
38
+ iconBgHover: string;
39
+ /** 아이콘 글리프색 (기본) */
40
+ iconGlyph: string;
41
+ /** 아이콘 글리프색 (hover·selected) */
42
+ iconGlyphHover: string;
43
+ /** 라벨 텍스트색 */
44
+ text: string;
45
+ /** 우측 액션 텍스트색 (토큰 그룹별) */
46
+ actionText: Record<SystemActionButtonActionTextToken, string>;
47
+ /** 우측 액션 아이콘색 */
48
+ actionIcon: string;
49
+ }
50
+ export declare const SYSTEM_ACTION_BUTTON_COLOR_CONFIG: Record<SSystemActionButtonColor, SystemActionButtonColorTokens>;
51
+ export interface SystemActionButtonTypeSpec {
52
+ /** 선행 아이콘 고정값. 있으면 `option.icon` 을 받지 않는다 */
53
+ fixedIcon?: SIconName;
54
+ /** 우측 액션 텍스트의 색·타이포. 없으면 텍스트를 그리지 않는다 */
55
+ actionText?: {
56
+ token: SystemActionButtonActionTextToken;
57
+ typo: string;
58
+ };
59
+ /** 우측 액션 아이콘. 타입이 정하므로 밖에서 바꾸지 않는다 */
60
+ actionIcon?: {
61
+ name: SIconName;
62
+ size: string;
63
+ };
64
+ }
65
+ /** 타입이 정하는 고정 구성 — 무엇이 그려지는가 */
66
+ export declare const SYSTEM_ACTION_BUTTON_TYPE_CONFIG: Record<SSystemActionButtonType, SystemActionButtonTypeSpec>;
67
+ /** 치수 — 대응 토큰이 있으면 전부 토큰 참조 */
68
+ export declare const SYSTEM_ACTION_BUTTON_LAYOUT: {
69
+ /** 행 높이 */
70
+ readonly height: string;
71
+ /** 행 라운드 */
72
+ readonly radius: string;
73
+ /** 아이콘 프레임 한 변 */
74
+ readonly iconFrame: string;
75
+ /** 아이콘 글리프 크기 */
76
+ readonly iconGlyph: string;
77
+ /** 아이콘 프레임 라운드 */
78
+ readonly iconRadius: string;
79
+ /** 아이콘 프레임 ↔ 라벨 간격 */
80
+ readonly iconLabelGap: string;
81
+ /** 좌측 여백 */
82
+ readonly paddingLeft: string;
83
+ /** 우측 여백 */
84
+ readonly paddingRight: string;
85
+ /** 액션 텍스트 ↔ 액션 아이콘 간격 */
86
+ readonly actionGap: string;
87
+ /**
88
+ * 액션 아이콘 글리프 한 변. 프레임 한 변은 타입별 토큰(`actionButton.*-icon`)이 정하고
89
+ * 그 안에 글리프가 이 크기로 놓인다 — 선행 아이콘의 프레임(24)/글리프(20) 과 같은 구조다.
90
+ * 대응 토큰이 없어 디자인 값을 그대로 쓴다.
91
+ */
92
+ readonly actionIconGlyph: "12px";
93
+ };
@@ -9,10 +9,12 @@
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` | — | |
@@ -23,7 +25,7 @@
23
25
  | `noDataLabel?` | `string` | `'데이터가 없습니다.'` | |
24
26
  | `noDataSlot?` | `ReactNode` | — | 데이터가 없을 때 body 영역 전체를 대체하는 슬롯. 지정하면 `noDataLabel` 대신 이 콘텐츠가 헤더 아래 영역을 채우며, 버튼 등 인터랙션도 동작한다. |
25
27
  | `isLoading?` | `boolean` | `false` | |
26
- | `dense?` | `boolean` | `false` | |
28
+ | `dense?` | `boolean` | `false` | 행 높이를 좁게 (세로 여백만 줄인다 — 좌우 패딩은 그대로). **시작 밀도이자 밀도 토글의 스위치다.** 켜면 하단 바 우측에 `좁게 보기` · `넓게 보기` 토글이 붙는다 — 페이지네이션이 없으면 이 바를 토글만 담아 그린다. 누른 뒤의 밀도는 테이블이 내부 상태로 들고 가므로 `onDenseChange` 를 받지 않아도 토글은 동작하고, 넓게 본 뒤에도 토글은 그대로 남는다(붙일지는 이 prop 이 정한다). 이 prop 값이 바뀌면 내부 밀도도 그 값으로 맞춰진다. |
27
29
  | `noHover?` | `boolean` | `false` | true면 행에 마우스를 올려도 hover 배경(grey_05)을 표시하지 않는다 |
28
30
  | `pagination?` | `STablePagination` | — | 페이지네이션 (있으면 하단 표시) |
29
31
  | `useInternalPagination?` | `boolean` | `false` | 테이블 내부에서 페이지네이션을 직접 관리 (rows를 내부 슬라이싱) |
@@ -42,6 +44,8 @@
42
44
  | Event | Type | Description |
43
45
  |-------|------|-------------|
44
46
  | `onSelectedChange` | `(rows: SRow[]) => void` | |
47
+ | `onSortChange` | `(sort: STableSort \| null) => void` | 정렬 헤더 클릭 (`asc → desc → 해제` 3단). 해제되면 `null` 이 온다. 다중 정렬은 1차 안에서 지원하지 않는다. |
48
+ | `onDenseChange` | `(dense: boolean) => void` | 밀도 변경 (하단 바의 밀도 토글을 눌렀을 때). 표시는 테이블이 알아서 바꾸므로 받지 않아도 되고, 사용자가 고른 밀도를 다음 방문까지 기억해 두려는(로컬 저장 등) 페이지만 받으면 된다. |
45
49
  | `onPageChange` | `(page: number) => void` | |
46
50
  | `onRowsPerPageChange` | `(perPage: number) => void` | |
47
51
  | `onVirtualUpdate` | `(range: { from: number; to: number }) => void` | |
@@ -60,15 +64,92 @@
60
64
  | `updateRowSelect` | `(row: SRow) => void` | 단일 행 선택 토글 (sd-table updateRowSelect) — onSelectedChange 발생 |
61
65
  | `toggleSelectAll` | `(checked: boolean, rows: SRow[]) => void` | 주어진 행들 전체 선택/해제 (sd-table toggleSelectAll) — onSelectedChange 발생 |
62
66
 
67
+ ## Types
68
+
69
+ ### STableColumn
70
+
71
+ ```ts
72
+ /**
73
+ * `autoWidth` 스페이서 열은 값을 그리지 않으므로 `field` 를 생략할 수 있다.
74
+ * 그 밖의 열은 값 접근자가 있어야 한다.
75
+ */
76
+ export type STableColumn = STableColumnBase &
77
+ (
78
+ { autoWidth: true; field?: STableColumnField } | { autoWidth?: false; field: STableColumnField }
79
+ );
80
+ ```
81
+
82
+ ### STableHeaderGroup
83
+
84
+ ```ts
85
+ /** 2단 헤더의 상위 셀. columnNames는 visible 컬럼 기준으로 연속되어야 한다. */
86
+ export interface STableHeaderGroup {
87
+ label?: ReactNode;
88
+ columnNames: string[];
89
+ rowSpan?: 1 | 2;
90
+ align?: 'left' | 'center' | 'right';
91
+ className?: string;
92
+ style?: CSSProperties;
93
+ render?: () => ReactNode;
94
+ }
95
+ ```
96
+
97
+ ### SRow
98
+
99
+ ```ts
100
+ export type SRow = Record<string, any>;
101
+ ```
102
+
103
+ ### STableSort
104
+
105
+ ```ts
106
+ /** 정렬 상태 — 어느 열을 어느 방향으로 정렬했는가 */
107
+ export interface STableSort {
108
+ /** 정렬 기준 컬럼의 `name` */
109
+ name: string;
110
+ dir: 'asc' | 'desc';
111
+ }
112
+ ```
113
+
114
+ ### STableStickyColumn
115
+
116
+ ```ts
117
+ export interface STableStickyColumn {
118
+ left?: number;
119
+ right?: number;
120
+ }
121
+ ```
122
+
123
+ ### STablePagination
124
+
125
+ ```ts
126
+ export interface STablePagination {
127
+ page: number;
128
+ rowsPerPage: number;
129
+ lastPage?: number;
130
+ }
131
+ ```
132
+
133
+ ### STableColumnField
134
+
135
+ ```ts
136
+ /** 값 접근: 필드명 또는 접근 함수 */
137
+ export type STableColumnField = string | ((row: SRow) => any);
138
+ ```
139
+
63
140
  ## Dependencies
64
141
 
65
142
  ### Depends on
66
143
 
67
144
  - [SCheckbox](../SCheckbox)
68
145
  - [SCircleProgress](../SCircleProgress)
146
+ - [SDivider](../SDivider)
147
+ - [SGhostButton](../SGhostButton)
69
148
  - [SIcon](../SIcon)
70
149
  - [SPagination](../SPagination)
71
150
  - [SSelect](../SSelect)
151
+ - [STextLink](../STextLink)
152
+ - [STooltip](../STooltip)
72
153
 
73
154
  ### Graph
74
155
 
@@ -76,8 +157,12 @@
76
157
  graph TD;
77
158
  STable --> SCheckbox
78
159
  STable --> SCircleProgress
160
+ STable --> SDivider
161
+ STable --> SGhostButton
79
162
  STable --> SIcon
80
163
  STable --> SPagination
81
164
  STable --> SSelect
165
+ STable --> STextLink
166
+ STable --> STooltip
82
167
  style STable fill:#f9f,stroke:#333,stroke-width:4px
83
168
  ```
@@ -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,6 +141,22 @@ 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
  /** 행 선택 여부 */
@@ -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,6 +190,19 @@ 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;
@@ -136,7 +230,22 @@ export interface STableProps {
136
230
  */
137
231
  noDataSlot?: ReactNode;
138
232
  isLoading?: boolean;
233
+ /**
234
+ * 행 높이를 좁게 (세로 여백만 줄인다 — 좌우 패딩은 그대로).
235
+ *
236
+ * **시작 밀도이자 밀도 토글의 스위치다.** 켜면 하단 바 우측에 `좁게 보기` · `넓게 보기` 토글이
237
+ * 붙는다 — 페이지네이션이 없으면 이 바를 토글만 담아 그린다.
238
+ *
239
+ * 누른 뒤의 밀도는 테이블이 내부 상태로 들고 가므로 `onDenseChange` 를 받지 않아도 토글은
240
+ * 동작하고, 넓게 본 뒤에도 토글은 그대로 남는다(붙일지는 이 prop 이 정한다). 이 prop 값이
241
+ * 바뀌면 내부 밀도도 그 값으로 맞춰진다.
242
+ */
139
243
  dense?: boolean;
244
+ /**
245
+ * 밀도 변경 (하단 바의 밀도 토글을 눌렀을 때). 표시는 테이블이 알아서 바꾸므로 받지 않아도 되고,
246
+ * 사용자가 고른 밀도를 다음 방문까지 기억해 두려는(로컬 저장 등) 페이지만 받으면 된다.
247
+ */
248
+ onDenseChange?: (dense: boolean) => void;
140
249
  /** true면 행에 마우스를 올려도 hover 배경(grey_05)을 표시하지 않는다 */
141
250
  noHover?: boolean;
142
251
  /** 페이지네이션 (있으면 하단 표시) */
@@ -175,3 +284,4 @@ export interface STableProps {
175
284
  * 내부 페이지네이션 + rows-per-page + 가상 스크롤 + 로딩 + dense.
176
285
  */
177
286
  export declare const STable: import("react").ForwardRefExoticComponent<STableProps & import("react").RefAttributes<STableHandle>>;
287
+ 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,7 +10,6 @@
10
10
  |------|------|---------|-------------|
11
11
  | `value` | `string` | — | 현재 선택된 탭 value |
12
12
  | `tabs` | `STabOption[]` | — | 탭 옵션 목록 |
13
- | `size?` | `STabSize` | `'md'` | 탭 크기 (main 전용) |
14
13
  | `isSub?` | `boolean` | `false` | 서브 탭(밑줄형) 스타일 |
15
14
  | `vertical?` | `boolean` | `false` | 세로 배치 (sub 전용 — main 폴더형은 항상 가로) |
16
15
  | `className?` | `string` | — | |
@@ -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,8 +7,6 @@ export interface STabsProps {
7
7
  tabs: STabOption[];
8
8
  /** 탭 변경 (sdUpdate) */
9
9
  onValueChange?: (value: string) => void;
10
- /** 탭 크기 (main 전용) */
11
- size?: STabSize;
12
10
  /** 서브 탭(밑줄형) 스타일 */
13
11
  isSub?: boolean;
14
12
  /** 세로 배치 (sub 전용 — main 폴더형은 항상 가로) */
@@ -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, isSub, 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;