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
package/AGENTS.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **๋Œ€์ƒ**: ์ด ํŒจํ‚ค์ง€๋กœ ํ™”๋ฉด์„ ๋งŒ๋“œ๋Š” ์†Œ๋น„ ์•ฑ์˜ ๊ฐœ๋ฐœ์ž์™€ AI ์ฝ”๋”ฉ ์—์ด์ „ํŠธ(Claude ๋“ฑ).
4
4
  > ์ด ๋ฌธ์„œ๋Š” "๋ฌด์—‡์„ ์–ธ์ œ ์“ฐ๊ณ , ๋ฌด์—‡์„ ์“ฐ๋ฉด ์•ˆ ๋˜๋Š”์ง€"์˜ ๋‹จ์ผ ๊ธฐ์ค€์ด๋‹ค.
5
- > ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ์„ธ Props/Events๋Š” `node_modules/sellmate-design-system-react/dist/components/<์ด๋ฆ„>/README.md` ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
5
+ > ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ์„ธ Props/Events์™€ ๊ทธ Props ๊ฐ€ ์“ฐ๋Š” ํƒ€์ž… ์ •์˜(Types)๋Š” `node_modules/sellmate-design-system-react/dist/components/<์ด๋ฆ„>/README.md` ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
6
6
 
7
7
  ## 0. ์ตœ์šฐ์„  ์›์น™ โ€” ๋””์ž์ธ ์‹œ์Šคํ…œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋จผ์ €๋‹ค
8
8
 
@@ -20,17 +20,17 @@
20
20
 
21
21
  ### 0-1. ์ „์ฒด ์ปดํฌ๋„ŒํŠธ ์ธ๋ฑ์Šค
22
22
 
23
- ๋ฌด์—‡์„ ๋งŒ๋“ค์ง€ ์ •ํ–ˆ์œผ๋ฉด **์ด ํ‘œ์—์„œ ๋จผ์ € ์ฐพ๋Š”๋‹ค.** ์ƒ์„ธ Props ๋Š” `dist/components/<์ด๋ฆ„>/README.md` ์ฐธ์กฐ.
23
+ ๋ฌด์—‡์„ ๋งŒ๋“ค์ง€ ์ •ํ–ˆ์œผ๋ฉด **์ด ํ‘œ์—์„œ ๋จผ์ € ์ฐพ๋Š”๋‹ค.** ์ƒ์„ธ PropsยทTypes ๋Š” `dist/components/<์ด๋ฆ„>/README.md` ์ฐธ์กฐ.
24
24
 
25
25
  **์ด ํ‘œ์—์„œ ์–ด๋А ๊ฒƒ์„ ๊ณจ๋ผ์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์œผ๋ฉด ยง3-0 "์˜๋„ โ†’ ์ปดํฌ๋„ŒํŠธ ๋ผ์šฐํŒ…" ์œผ๋กœ ๊ฐ„๋‹ค.** ํ•˜๋ ค๋Š” ์ผ์„ ๋ฌธ์žฅ์œผ๋กœ ์ฐพ์œผ๋ฉด ๋‹ต์ด ํ•˜๋‚˜ ๋‚˜์˜จ๋‹ค โ€” ์—ฌ๊ธฐ ์ธ๋ฑ์Šค๋Š” "๋ฌด์—‡์ด ์žˆ๋Š”์ง€", ยง3-0 ์€ "์–ธ์ œ ๊ทธ๊ฑธ ์“ฐ๋Š”์ง€" ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.
26
26
 
27
27
  | ๋ถ„๋ฅ˜ | ์ปดํฌ๋„ŒํŠธ |
28
28
  | --- | --- |
29
29
  | **๋ฒ„ํŠผยท๋งํฌ** | `SButton` `SGhostButton` `SDropdownButton` `STextLink` `SSwitch` `SToggle` |
30
- | **์ž…๋ ฅ (ํผ)** | `SForm` `SField` `SInput` `SNumberInput` `STextarea` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SChip` `SChipInput` `SBarcodeInput` `SFilePicker` |
31
- | **๋‚ ์งœยท์‹œ๊ฐ„** | `SCalendar` `SDatePicker` `SDatePickerYearListbox` `SDatePickerMonthListbox` `SDateRangePicker` `STimePicker` `STimeRangePicker` |
30
+ | **์ž…๋ ฅ (ํผ)** | `SForm` `SField` `SInput` `SSearchInput` `SNumberInput` `STextarea` `SEditor` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SRadioCard` `SRadioCardGroup` `SChip` `SChipInput` `SBarcodeInput` `SFilePicker` |
31
+ | **๋‚ ์งœยท์‹œ๊ฐ„** | `SCalendar` `SCalendarBoard`(ํ•œ ๋‹ฌ์น˜ ์ผ์ • ํŒ) `SDatePicker` `SDatePickerYearListbox` `SDatePickerMonthListbox` `SDateRangePicker` `STimePicker` `STimeRangePicker` |
32
32
  | **ํ‘œยท๋ชฉ๋ก** | `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SListItem` `SExpansionList` `SDraggableList` `SDraggableItem` `STree` |
33
- | **๋ ˆ์ด์•„์›ƒ** | `SLayout` `SGnb` `SPage`(์ œ๋ชฉ ์˜์—ญ์€ `header` prop) `SSectionHeaderCard` `SCard` `SDivider` `SSplitter` `SScrollArea` `SExpansionItem` |
33
+ | **๋ ˆ์ด์•„์›ƒ** | `SLayout` `SGnb` `SGnbSystem` `SSystemActionButton`(GNB system ํŒจ๋„์— ํ•œ ์ค„์”ฉ ์Œ“๋Š” ์•ก์…˜ ํ–‰ โ€” ๋ฒ„ํŠผ ๊ณ ๋ฅด๊ธฐ๋Š” ยง3-5) `SAccountListBox`(๊ณ„์ • ํ–‰์„ ๋ˆŒ๋Ÿฌ ๋œจ๋Š” ๊ณ„์ • ํŒจ๋„) `SPage` `SPageHeader`(ํŽ˜์ด์ง€ ์ œ๋ชฉ ์˜์—ญ โ€” `SLayout` ์•ˆ์—์„œ `SPage` ์•ž์— ๋‘”๋‹ค) `SSectionHeaderCard` `SCard` `SDivider` `SSplitter` `SScrollArea` `SExpansionItem` |
34
34
  | **๋‚ด๋น„๊ฒŒ์ด์…˜** | `STabs` `SPagination` `SStepper` |
35
35
  | **ํ‘œ์‹œยท์ƒํƒœ** | `STag` `SBadge` `SIcon` `SImage` `SCallout` `SGuide` |
36
36
  | **์ง„ํ–‰ยท๋กœ๋”ฉ** | `SLinearProgress` `SCircleProgress` `SLoadingContainer` `SLoadingModal` |
@@ -60,12 +60,14 @@ AI ์—์ด์ „ํŠธ๋Š” ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์ „์— ์ด ๋ชฉ๋ก์„ ๋ฐ˜๋“œ์‹œ ์ง€ํ‚จ
60
60
  | --- | --- |
61
61
  | `<button>` | `SButton`, `SGhostButton`, `SDropdownButton`, `STextLink` |
62
62
  | `<input type="text/password/...">` | `SInput` |
63
+ | `<input type="search">` | `SSearchInput` |
63
64
  | `<input type="number">` | `SNumberInput` |
64
65
  | `<input type="checkbox">` | `SCheckbox`, `SToggle`, `SSwitch` |
65
66
  | `<input type="radio">` | `SRadio`, `SRadioButton` |
66
67
  | `<input type="file">` | `SFilePicker` |
67
68
  | `<select>` | `SSelect` |
68
69
  | `<textarea>` | `STextarea` |
70
+ | `contenteditable`, ์ง์ ‘ ๋ถ™์ธ ์—๋””ํ„ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ | `SEditor` |
69
71
  | `<table>` | `STable`, `SKeyValueTable` |
70
72
  | `<form>` | `SForm` |
71
73
  | `<dialog>`, ์ง์ ‘ ๋งŒ๋“  ์˜ค๋ฒ„๋ ˆ์ด | `SModal.confirm(...)`, `SModal.create(...)`, `SPopup` |
@@ -109,7 +111,7 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
109
111
 
110
112
  `text-14 font-bold` ๊ฐ™์€ ์กฐํ•ฉ์„ ์ฆ‰ํฅ์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค. ยง2-1์˜ `typo-*` ํ”„๋ฆฌ์…‹ ํด๋ž˜์Šค๋ฅผ ์“ด๋‹ค.
111
113
 
112
- ### 1-4. ์ˆซ์ž๋Š” ๋ฌด์กฐ๊ฑด `toLocaleString()`
114
+ ### 1-4. ์ˆซ์žยท๋‚ ์งœ ํ‘œ๊ธฐ
113
115
 
114
116
  **์ˆซ์ž๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•  ๋•Œ๋Š” ์˜ˆ์™ธ ์—†์ด `toLocaleString()` ์„ ๊ฑฐ์ณ ์„ธ ์ž๋ฆฌ๋งˆ๋‹ค ์ฝค๋งˆ๋ฅผ ๋„ฃ๋Š”๋‹ค.**
115
117
  ๊ธˆ์•กยท์ˆ˜๋Ÿ‰ยท๊ฑด์ˆ˜ยท์žฌ๊ณ  ๋ฌด์—‡์ด๋“ , ํ…Œ์ด๋ธ”ยท์ƒ์„ธยท์š”์•ฝ ๋ฌธ๊ตฌ ์–ด๋””์— ๋†“์ด๋“  ๊ฐ™๋‹ค.
@@ -124,6 +126,18 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
124
126
 
125
127
  **๋ฒˆํ˜ธยท์ฝ”๋“œ๋Š” ์ œ์™ธํ•œ๋‹ค.** ์ „ํ™”๋ฒˆํ˜ธยท์‚ฌ์—…์ž๋ฒˆํ˜ธยท์†ก์žฅ๋ฒˆํ˜ธยท์ƒํ’ˆ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋Œ€์ƒ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์€ ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•˜๋Š” ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ผ **์„œ์‹์ด ์ •ํ•ด์ง„ ๋ฌธ์ž์—ด**์ด๋‹ค. ์—ฌ๊ธฐ์— ์ฝค๋งˆ๋ฅผ ๋„ฃ์œผ๋ฉด ์†ก์žฅ๋ฒˆํ˜ธ `123456789` ๊ฐ€ `123,456,789` ๋กœ ๋ณด์—ฌ ๊ฐ’ ์ž์ฒด๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.
126
128
 
129
+ **๋‚ ์งœ๋Š” `YYYY-MM-DD` ๋กœ ์“ด๋‹ค.** ์ž๋ฆฟ์ˆ˜๋ฅผ ์ฑ„์šฐ๊ณ  ํ•˜์ดํ”ˆ์œผ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค โ€” `2026-08-13`.
130
+ `2026. 8. 13.` ์ฒ˜๋Ÿผ ์ ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๊ฑฐ๋‚˜ ํ•œ ์ž๋ฆฌ๋กœ ์ค„์ด์ง€ ์•Š๋Š”๋‹ค. ์ž๋ฆฟ์ˆ˜๊ฐ€ ๊ณ ์ •๋ผ์•ผ ์„ธ๋กœ์ค„์ด ๋งž๊ณ ,
131
+ ์ปฌ๋Ÿผ ํญ์„ ํ˜•์‹์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค(ยง3-4). ์ผ์‹œ๊ฐ€ ํ•„์š”ํ•˜๋ฉด `YYYY-MM-DD HH:mm`.
132
+
133
+ ```tsx
134
+ โŒ {new Date(v).toLocaleDateString()} โŒ {`${y}. ${m}. ${d}.`}
135
+ โœ… {v} // ์„œ๋ฒ„๊ฐ€ ์ด๋ฏธ YYYY-MM-DD ๋กœ ์ค€ ๊ฐ’
136
+ โœ… format: (v: string) => v.slice(0, 10)
137
+ ```
138
+
139
+ **`toLocaleDateString()` ์€ ์“ฐ์ง€ ์•Š๋Š”๋‹ค** โ€” ๋กœ์ผ€์ผ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ”๋€Œ์–ด ํ‘œ๊ธฐ๋ฅผ ์ง€ํ‚ฌ ์ˆ˜ ์—†๋‹ค.
140
+
127
141
  ---
128
142
 
129
143
  ## 2. ์กฐํ•ฉ ๊ทœ์น™ โ€” ํ™”๋ฉด์„ ์–ด๋–ป๊ฒŒ ์Œ“๋Š”๊ฐ€
@@ -136,11 +150,11 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
136
150
 
137
151
  | ์ธต | ๋ฌด์—‡์ธ๊ฐ€ | ์ปดํฌ๋„ŒํŠธ |
138
152
  | --- | --- | --- |
139
- | **์…ธ** | ์•ฑ ์ „์ฒด ๋ผˆ๋Œ€. ํŽ˜์ด์ง€๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ๋‚จ๋Š”๋‹ค | `SLayout` `SGnb` `SPage`(์ œ๋ชฉ ์˜์—ญ์€ `header` prop) |
140
- | **๋ธ”๋ก** | `SPage` ์˜ ์ง๊ณ„ ์ž์‹. ํŽ˜์ด์ง€๋ฅผ ์„ธ๋กœ๋กœ ์Œ“๋Š” ๋‹จ์œ„ | `SSectionHeaderCard` `SCard` `SForm` `SSplitter` `SScrollArea` `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SExpansionList` `SDraggableList` `STree` `SCallout` `STabs` `SStepper` `SPagination` `SDivider` |
141
- | **์š”์†Œ** | ๋ธ”๋ก **์•ˆ์—** ๋†“์ด๋Š” ์ปจํŠธ๋กค. ํ˜ผ์ž ํŽ˜์ด์ง€์— ์„œ์ง€ ์•Š๋Š”๋‹ค | `SButton` `SGhostButton` `SDropdownButton` `SField` `SInput` `SNumberInput` `STextarea` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SSwitch` `SToggle` `SChipInput` `SBarcodeInput` `SFilePicker` `SDatePicker` `SDatePickerYearListbox` `SDatePickerMonthListbox` `SDateRangePicker` `STimePicker` `STimeRangePicker` `SCalendar` `SListItem` `SExpansionItem` `SDraggableItem` `SImage` `SLinearProgress` `SCircleProgress` |
153
+ | **์…ธ** | ์•ฑ ์ „์ฒด ๋ผˆ๋Œ€. ํŽ˜์ด์ง€๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ๋‚จ๋Š”๋‹ค | `SLayout` `SGnb` `SGnbSystem`(GNB ๋งจ ์•„๋ž˜ ํŒ ยท ์ „ํญ ์ƒ๋‹จ๋ฐ” ์˜ค๋ฅธ์ชฝ ๋) `SPage` `SPageHeader`(`SLayout` ์•ˆ์—์„œ `SPage` ์•ž์— ๋‘”๋‹ค) |
154
+ | **๋ธ”๋ก** | `SPage` ์˜ ์ง๊ณ„ ์ž์‹. ํŽ˜์ด์ง€๋ฅผ ์„ธ๋กœ๋กœ ์Œ“๋Š” ๋‹จ์œ„ | `SSectionHeaderCard` `SCard` `SForm` `SSplitter` `SScrollArea` `SCalendarBoard` `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SExpansionList` `SDraggableList` `STree` `SCallout` `STabs` `SStepper` `SPagination` `SDivider` |
155
+ | **์š”์†Œ** | ๋ธ”๋ก **์•ˆ์—** ๋†“์ด๋Š” ์ปจํŠธ๋กค. ํ˜ผ์ž ํŽ˜์ด์ง€์— ์„œ์ง€ ์•Š๋Š”๋‹ค | `SButton` `SGhostButton` `SDropdownButton` `SSystemActionButton` `SField` `SInput` `SSearchInput` `SNumberInput` `STextarea` `SEditor` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SRadioCard` `SRadioCardGroup` `SSwitch` `SToggle` `SChipInput` `SBarcodeInput` `SFilePicker` `SDatePicker` `SDatePickerYearListbox` `SDatePickerMonthListbox` `SDateRangePicker` `STimePicker` `STimeRangePicker` `SCalendar` `SListItem` `SExpansionItem` `SDraggableItem` `SImage` `SLinearProgress` `SCircleProgress` |
142
156
  | **์ธ๋ผ์ธ** | ํ…์ŠคํŠธ ํ๋ฆ„ยท์…€ยท๋ผ๋ฒจ ์•ˆ์— ์„ž์ธ๋‹ค. ํ˜ผ์ž ๋ธ”๋ก์ด ๋˜์ง€ ์•Š๋Š”๋‹ค | `STag` `SBadge` `SIcon` `STextLink` `SChip` |
143
- | **๋ ˆ์ด์–ด** | ๋ฌธ์„œ ํ๋ฆ„ **๋ฐ–**์— ๋– ์„œ ๊ทธ๋ ค์ง„๋‹ค. ์–ด๋А ์ธต์—์„œ ๋„์šฐ๋“  ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์ด ์—†๋‹ค | `SModal` `SActionModal` `SConfirmModal` `SPopup` `SDrawer` `SPopover` `STooltip` `SPortal` `SToast` `SLoadingModal` `SLoadingContainer` `SGuide` |
157
+ | **๋ ˆ์ด์–ด** | ๋ฌธ์„œ ํ๋ฆ„ **๋ฐ–**์— ๋– ์„œ ๊ทธ๋ ค์ง„๋‹ค. ์–ด๋А ์ธต์—์„œ ๋„์šฐ๋“  ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์ด ์—†๋‹ค | `SModal` `SActionModal` `SConfirmModal` `SPopup` `SDrawer` `SPopover` `STooltip` `SPortal` `SAccountListBox`(๊ณ„์ • ํ–‰์— ๋ถ™์–ด ๋œฌ๋‹ค โ€” ์ง์ ‘ ๋„์šฐ์ง€ ์•Š๋Š”๋‹ค) `SToast` `SLoadingModal` `SLoadingContainer` `SGuide` |
144
158
 
145
159
  ์—ฌ๊ธฐ์— ํ™”๋ฉด์„ ์ฐจ์ง€ํ•˜์ง€ ์•Š๋Š” **๋ถ€ํŠธ์ŠคํŠธ๋žฉ** ์ด ๋”ฐ๋กœ ์žˆ๋‹ค โ€” `SModalOutlet` `SToastContainer` ๋Š” ์•ฑ ์ง„์ž…์ ์— ํ•œ ๋ฒˆ๋งŒ ๋ Œ๋”ํ•œ๋‹ค (ยง4-1).
146
160
 
@@ -186,7 +200,7 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
186
200
  ๋ธ”๋ก ์ˆœ์„œ๋Š” ํ™”๋ฉด ์ข…๋ฅ˜์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ฐ™๋‹ค. **ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๋‚จ๊ธฐ๋˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค.**
187
201
 
188
202
  ```text
189
- 1. ํŽ˜์ด์ง€ ์ œ๋ชฉ `SPage` ์˜ `header` prop (+ ๊ฐ€์ด๋“œยท๋งค๋‰ด์–ผ ๋งํฌ๋Š” slot. ์•ก์…˜ ๋ฒ„ํŠผ์€ ์˜ค์ง€ ์•Š๋Š”๋‹ค ยง4-2)
203
+ 1. ํŽ˜์ด์ง€ ์ œ๋ชฉ `SPageHeader` (SGnb ์™€ SPage ์‚ฌ์ด. ๊ฐ€์ด๋“œยท๋งค๋‰ด์–ผ ๋งํฌ๋Š” slot, ์•ก์…˜ ๋ฒ„ํŠผ์€ ์˜ค์ง€ ์•Š๋Š”๋‹ค ยง4-2)
190
204
  2. ์ƒ์‹œ ์•ˆ๋‚ด SCallout
191
205
  3. ํ•„ํ„ฐ SKeyValueTable ยท SChipFilter (ยง3-7-11)
192
206
  4. ํˆด๋ฐ” STableBar (๊ฑด์ˆ˜ ์š”์•ฝ + ์•ก์…˜)
@@ -214,7 +228,7 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
214
228
 
215
229
  | ์ธต (ยง2-0) | ์—ญํ•  | ํด๋ž˜์Šค | ํฌ๊ธฐ |
216
230
  | --- | --- | --- | --- |
217
- | ์…ธ | ํŽ˜์ด์ง€ ์ œ๋ชฉ (`SPage` ์˜ `header.title`) | `typo-heading-lg` | 18px |
231
+ | ์…ธ | ํŽ˜์ด์ง€ ์ œ๋ชฉ (`SPageHeader` ์˜ `title`) | `typo-heading-lg` | 18px |
218
232
  | ๋ธ”๋ก | ์„น์…˜ ์ œ๋ชฉ | `typo-heading-sm` | 14px |
219
233
  | ๋ธ”๋ก ๋‚ด๋ถ€ | ํ•˜์œ„ ์ œ๋ชฉ (์„น์…˜ ์•ˆ์„ ๋” ๋‚˜๋ˆŒ ๋•Œ) | `typo-heading-xs` | 12px |
220
234
  | โ€” | ๋ณธ๋ฌธ | `typo-body-sm-default` | 12px |
@@ -222,7 +236,7 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
222
236
 
223
237
  ํŽ˜์ด์ง€ ์ œ๋ชฉ๋งŒ 18px ๋กœ ํฌ๊ฒŒ ๋‘๊ณ  ๊ทธ ์•„๋ž˜๋Š” 14 / 12 ๋กœ ์ด˜์ด˜ํ•˜๊ฒŒ ๊ฐ„๋‹ค. ์ค‘๊ฐ„ ํฌ๊ธฐ(16px)๋Š” ๊ธฐ๋ณธ ๊ณจ๊ฒฉ์—์„œ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
224
238
 
225
- - **ํŽ˜์ด์ง€ยท์„น์…˜ ์ œ๋ชฉ์˜ ํƒ€์ดํฌ๋ฅผ ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.** `SPage` ์˜ `header.title`, `SSectionHeaderCard` ์˜ `header.title` ์ด ์ด๋ฏธ ๋„ฃ๋Š”๋‹ค โ€” ๊ทธ ์œ„์— `typo-heading-lg`/`typo-heading-sm` ์„ ๋˜ ์”Œ์šฐ์ง€ ์•Š๋Š”๋‹ค.
239
+ - **ํŽ˜์ด์ง€ยท์„น์…˜ ์ œ๋ชฉ์˜ ํƒ€์ดํฌ๋ฅผ ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.** `SPageHeader` ์˜ `title`, `SSectionHeaderCard` ์˜ `header.title` ์ด ์ด๋ฏธ ๋„ฃ๋Š”๋‹ค โ€” ๊ทธ ์œ„์— `typo-heading-lg`/`typo-heading-sm` ์„ ๋˜ ์”Œ์šฐ์ง€ ์•Š๋Š”๋‹ค.
226
240
  - **ํ•˜์œ„ ์ œ๋ชฉ์ด ํ•„์š”ํ•˜๋ฉด ๋จผ์ € ์„น์…˜์„ ๋‚˜๋ˆŒ ์ˆ˜ ์—†๋Š”์ง€ ๋ณธ๋‹ค.** ํ•œ ์„น์…˜ ์•ˆ์—์„œ ์ œ๋ชฉ์ด ๋‘ ๋‹จ์œผ๋กœ ๊ฐˆ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์€ ๋Œ€๊ฐœ ์„น์…˜์ด ๋‘˜์ด๋ผ๋Š” ๋œป์ด๋‹ค (ยง3-7-8).
227
241
  - ๋ณธ๋ฌธ ์•ˆ์—์„œ ํ•œ ๋‹จ์–ด๋ฅผ ๊ฐ•์กฐํ•  ๋•Œ๋Š” `typo-body-sm-medium` ์„ ์“ด๋‹ค. `typo-body-sm-bold` ๋Š” ์ œ๋ชฉ ์„ฑ๊ฒฉ์˜ ์งง์€ ๋ผ๋ฒจ์—๋งŒ ์“ด๋‹ค. <!-- TODO(๋””์ž์ธ): ๊ฐ•์กฐ ๊ตต๊ธฐ ๊ธฐ์ค€ ํ™•์ • -->
228
242
 
@@ -286,6 +300,7 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
286
300
 
287
301
  - **๋ผ๋””์˜ค๋Š” `SRadioGroup` ์„ ์“ด๋‹ค.** `direction="horizontal" | "vertical"` ๋งŒ ์ฃผ๋ฉด ๊ฐ„๊ฒฉ์„ ์•Œ์•„์„œ ๋งž์ถ˜๋‹ค โ€” ์ง์ ‘ `flex` ๋กœ ๊ฐ์‹ธ์ง€ ์•Š๋Š”๋‹ค.
288
302
  - `SRadioButton` ๊ทธ๋ฃน์˜ ๊ฐ„๊ฒฉ์€ `-1px`(ํ…Œ๋‘๋ฆฌ ๊ฒน์นจ ์ฒ˜๋ฆฌ)์ด๋ผ ์†์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
303
+ - **์นด๋“œํ˜• ๋ผ๋””์˜ค๋Š” `SRadioCardGroup` ์„ ์“ด๋‹ค.** ์นด๋“œ ์‚ฌ์ด ๊ฐ„๊ฒฉ์€ ์ˆ˜ํ‰ยท์ˆ˜์ง์ด ๊ฐ™๊ณ  `SRadioGroup` ๊ณผ ๋‹ค๋ฅด๋ฏ€๋กœ, ์†์œผ๋กœ `flex gap-โ€ฆ` ์„ ๋งž์ถ”์ง€ ๋ง๊ณ  `direction` ๋งŒ ์ค€๋‹ค.
289
304
  - ์ •ํ™•ํ•œ ๊ฐ’์ด ํ•„์š”ํ•˜๋ฉด ํ† ํฐ์„ ์ง์ ‘ ์ฐธ์กฐํ•ด๋„ ๋œ๋‹ค: `gap-[var(--cmp-checkbox-group-gap-horizontal)]`
290
305
 
291
306
  #### ์„น์…˜ยทํŒจ๋„ ์•ˆ์ชฝ ์—ฌ๋ฐฑ
@@ -368,6 +383,26 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
368
383
 
369
384
  ๋ฐ”ํƒ•์„ ๊น ๊ฒฝ์šฐ, ํ‘œ ์‚ฌ์ด ๊ตฌ๋ถ„์„ (`SDivider`)์€ ๋Œ€๊ฐœ ๋ถˆํ•„์š”ํ•ด์ง„๋‹ค โ€” ์ƒ‰์ด ์ด๋ฏธ ๊ฒฝ๊ณ„๋ฅผ ๋งŒ๋“ ๋‹ค.
370
385
 
386
+ #### ํŽ˜์ด์ง€ ๋†’์ด โ€” ํ™”๋ฉด์„ ๊ฝ‰ ์ฑ„์šฐ๊ณ , ์Šคํฌ๋กค์€ ๊ฐ ์˜์—ญ ์•ˆ์—์„œ
387
+
388
+ **๋Œ€๋ถ€๋ถ„์˜ ํ™”๋ฉด์€ ๋ณธ๋ฌธ์ด ์ฐฝ์„ ๊ฝ‰ ์ฑ„์šฐ๊ณ , ์Šคํฌ๋กค์€ ๊ฐ ์˜์—ญ ์•ˆ์—์„œ ์ผ์–ด๋‚œ๋‹ค.** ํ‘œ๋Š” ์ž๊ธฐ ์•ˆ์—์„œ ์Šคํฌ๋กคํ•˜๊ณ , ์ขŒ์ธก ๋ชฉ๋ก์€ ๋ชฉ๋ก ์•ˆ์—์„œ ์Šคํฌ๋กคํ•˜๊ณ , ํŽ˜์ด์ง€๋„ค์ด์…˜ยทํ•˜๋‹จ ์•ก์…˜์€ ์ž๋ฆฌ์— ๊ณ ์ •๋œ๋‹ค. ์ด๊ฒƒ์ด ํ‘œ์ค€์ด๋‹ค โ€” ๋ชฉ๋ก ํŽ˜์ด์ง€๋งŒ์˜ ์˜ˆ์™ธ๊ฐ€ ์•„๋‹ˆ๋‹ค.
389
+
390
+ `SPage` ์˜ `contentHeight="fill"` ์ด ๊ทธ ๋ชจ๋“œ๋‹ค. ํ”„๋ ˆ์ž„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋„˜๊ธด๋‹ค(ยง4-1).
391
+
392
+ ```tsx
393
+ <SPage contentHeight="fill">
394
+ <div className="flex h-full min-h-0 flex-col gap-sd-12">
395
+ <STableBar โ€ฆ />
396
+ <STable className="min-h-0 flex-1" pagination={โ€ฆ} />
397
+ </div>
398
+ </SPage>
399
+ ```
400
+
401
+ - **`min-h-0 flex-1` ์‚ฌ์Šฌ์ด ํŽ˜์ด์ง€์˜ ๊ธฐ๋ณธ ๊ณจ๊ฒฉ์ด๋‹ค.** `fill` ์€ ๋ณธ๋ฌธ ๋ž˜ํผ์— `h-full` ์„ ์ฃผ๊ณ , ๊ฑฐ๊ธฐ์„œ๋ถ€ํ„ฐ ์Šคํฌ๋กค๋  ์ž๋ฆฌ๊นŒ์ง€ `min-h-0 flex-1` ์ด ์ด์–ด์ ธ์•ผ ์ž์‹์ด ๋‚จ์€ ๋†’์ด๋ฅผ ์žก๋Š”๋‹ค.
402
+ - **์‚ฌ์Šฌ์ด ํ•œ ๊ตฐ๋ฐ๋งŒ ๋Š๊ฒจ๋„ ์ž์‹์ด ๋†’์ด๋ฅผ ๋ชป ์žก๋Š”๋ฐ, ๊ทธ ์‹คํŒจ๊ฐ€ ์กฐ์šฉํ•˜๋‹ค** โ€” ํ™”๋ฉด์€ ๊ทธ๋ ค์ง€๊ณ  ์Šคํฌ๋กค๋งŒ ์—‰๋šฑํ•œ ๋ฐ์„œ ์ผ์–ด๋‚œ๋‹ค. ์ฒดํฌ๋ฆฌ์ŠคํŠธ(ยง5)๋กœ ํ™•์ธํ•œ๋‹ค.
403
+ - **ํŽ˜์ด์ง€ ์Šคํฌ๋กค์€ ์˜ˆ์™ธ๋‹ค.** ๋ธ”๋ก์˜ ๋†’์ด๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๊ณ  ๊ทธ ๋†’์ด๊ฐ€ ์ฐฝ๋ณด๋‹ค ํด ๋•Œ๋งŒ ํŽ˜์ด์ง€๊ฐ€ ์Šคํฌ๋กคํ•œ๋‹ค. ๊ทธ๋•Œ๋งŒ `contentHeight="auto"` ์™€ `scrollEndSpacing` ์„ ์ผ ๋‹ค.
404
+ - **`SScrollArea` ๋กœ ํŽ˜์ด์ง€ ๋ณธ๋ฌธ ์ „์ฒด๋ฅผ ๊ฐ์‹ธ์ง€ ์•Š๋Š”๋‹ค.** ์Šคํฌ๋กค์€ `SPage` ์˜ `<main>` ๋ชซ์ด๊ณ , ๊ฐ์‹ธ๋ฉด ์Šคํฌ๋กค๋ฐ”๊ฐ€ ๋ณธ๋ฌธ ํŒจ๋”ฉ ์•ˆ์ชฝ์œผ๋กœ ๋“ค์–ด์™€ ๊ฐ€์žฅ์ž๋ฆฌ์—์„œ ๋œฌ๋‹ค. `SScrollArea` ๋Š” ํŽ˜์ด์ง€ ์•ˆ์˜ ํŠน์ • ์˜์—ญ์—๋งŒ ์“ด๋‹ค(ยง3-0 D).
405
+
371
406
  #### ์Šคํฌ๋กค ์˜์—ญ์˜ ํ•˜๋‹จ ์—ฌ๋ฐฑ
372
407
 
373
408
  ์Šคํฌ๋กค์„ ๋๊นŒ์ง€ ๋‚ด๋ ธ์„ ๋•Œ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์ด ํ™”๋ฉด ๊ฒฝ๊ณ„์— ๋ถ™์œผ๋ฉด **๋ชฉ๋ก์ด ๋๋‚œ ๊ฒƒ์ธ์ง€ ๋” ์žˆ๋Š” ๊ฒƒ์ธ์ง€** ์ฝํžˆ์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ์Šคํฌ๋กค ์˜์—ญ์€ **ํ•˜๋‹จ๋งŒ** ๋„“๊ฒŒ ๋‘”๋‹ค. ๋‚˜๋จธ์ง€ ์„ธ ๋ฐฉํ–ฅ์€ ์œ„ 16 / 24 ๊ทœ์น™ ๊ทธ๋Œ€๋กœ๋‹ค.
@@ -375,9 +410,9 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
375
410
  | ์Šคํฌ๋กค ์ข…๋ฅ˜ | ์–ด๋–ป๊ฒŒ |
376
411
  | --- | --- |
377
412
  | **ํŒจ๋„ ์ž์ฒด ์Šคํฌ๋กค** (์ขŒ์ธก ๋ชฉ๋ก, ์ค‘์•™ ๋Œ€ํ™” ๋“ฑ) | ๊ทธ ํŒจ๋„ ์•ˆ์ชฝ ํ•˜๋‹จ์— `pb-[var(--cmp-pageBody-padding-scrollEnd)]` โ€” `SPage` ์™€ ๊ฐ™์€ ํ† ํฐ์ด๋ผ ๊ฐ’์ด ๋ฐ”๋€Œ์–ด๋„ ํ•จ๊ป˜ ๋”ฐ๋ผ๊ฐ„๋‹ค |
378
- | **ํŽ˜์ด์ง€ ๋‹จ์œ„ ์Šคํฌ๋กค** | **`SPage` ๊ฐ€ ๋„ฃ๋Š”๋‹ค. ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค** |
413
+ | **ํŽ˜์ด์ง€ ๋‹จ์œ„ ์Šคํฌ๋กค** | **`SPage` ์˜ `scrollEndSpacing` ์œผ๋กœ ์ผ ๋‹ค. ์ง์ ‘ ํŒจ๋”ฉ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค** |
379
414
 
380
- `SPage` ๋Š” ๊ธฐ๋ณธ์œผ๋กœ ๋„ฃ์œผ๋ฏ€๋กœ **์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์œผ๋ฉด ๋งž๋‹ค.** ์ง์ ‘ ๋Œ ์ผ์€ ์—†๋‹ค โ€” **ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ๋ถ™์€ ํ…Œ์ด๋ธ”**์€ `contentHeight="fill"` ์„ ์“ฐ๊ณ , ์ด ๋ชจ๋“œ์—์„œ๋Š” ํŽ˜์ด์ง€๊ฐ€ ์Šคํฌ๋กคํ•˜์ง€ ์•Š์•„ ์Šคํฌ๋กค ๋ ์—ฌ๋ฐฑ์ด **์ž๋™์œผ๋กœ ๋ฌด์‹œ**๋œ๋‹ค (ยง4-2 ๋ชฉ๋ก ํŽ˜์ด์ง€).
415
+ **`scrollEndSpacing` ์€ ๊ธฐ๋ณธ์ด ๊บผ์ ธ ์žˆ๋‹ค.** ํŽ˜์ด์ง€๊ฐ€ ์‹ค์ œ๋กœ ์Šคํฌ๋กค๋  ๋•Œ๋งŒ ํ•„์š”ํ•œ ๊ฐ’์ด๋ผ, ์กฐ๊ฑด ์—†์ด ๋ถ™์ด๋ฉด ๋‚ด์šฉ์ด ํ™”๋ฉด์— ๊ฑฐ์˜ ๋”ฑ ๋งž๋Š” ํŽ˜์ด์ง€๊นŒ์ง€ ๊ทธ ์—ฌ๋ฐฑ ๋•Œ๋ฌธ์— ์Šคํฌ๋กค๋˜๊ฒŒ ๋งŒ๋“ ๋‹ค. ํŽ˜์ด์ง€ ์Šคํฌ๋กค์„ ์“ฐ๋Š” ํ™”๋ฉด(`contentHeight="auto"` + ๋‚ด์šฉ์ด ์ฐฝ๋ณด๋‹ค ๊น€)์—์„œ๋งŒ ์ผ ๋‹ค. ํŽ˜์ด์ง€๋„ค์ด์…˜์ฒ˜๋Ÿผ ๋์„ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด ์ด๋ฏธ ์žˆ์œผ๋ฉด ์ผœ์ง€ ์•Š๋Š”๋‹ค.
381
416
 
382
417
  ### 2-3. ์ƒ‰์ƒ
383
418
 
@@ -439,11 +474,15 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
439
474
  | --- | --- | --- |
440
475
  | ํ•œ ์ค„ ํ…์ŠคํŠธ๋ฅผ ๋ฐ›๋Š”๋‹ค | `SInput` | ยง3-7-1 |
441
476
  | ์—ฌ๋Ÿฌ ์ค„ ํ…์ŠคํŠธ๋ฅผ ๋ฐ›๋Š”๋‹ค | `STextarea` | ยง3-7-1 |
477
+ | ์ œ๋ชฉยท๊ตต๊ฒŒยท๋ชฉ๋กยท์ƒ‰ ๊ฐ™์€ **์„œ์‹์ด ๋‚จ์•„์•ผ ํ•˜๋Š”** ๊ธ€์„ ๋ฐ›๋Š”๋‹ค | `SEditor` | ยง3-7-1 |
478
+ | ๋ชฉ๋กยท๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ƒ‰์–ด๋กœ ์ขํžŒ๋‹ค | `SSearchInput` | ยง3-7-1 |
442
479
  | ์ˆซ์ž(์ˆ˜๋Ÿ‰ยท๊ธˆ์•ก)๋ฅผ ๋ฐ›๋Š”๋‹ค | `SNumberInput` | |
443
480
  | ๋ฐ”์ฝ”๋“œ๋ฅผ ์Šค์บ”ํ•ด ๋ฐ›๋Š”๋‹ค | `SBarcodeInput` | |
444
481
  | ๋ชฉ๋ก์—์„œ ํ•˜๋‚˜ ๊ณ ๋ฅด๊ฒŒ ํ•œ๋‹ค | `SSelect` | ยง3-7-2 |
445
482
  | ์„ ํƒ์ง€๋ฅผ ํ•ญ์ƒ ํŽผ์ณ ๋‘๊ณ  ํ•˜๋‚˜ ๊ณ ๋ฅด๊ฒŒ ํ•œ๋‹ค | `SRadioGroup` | ยง3-7-2 |
446
483
  | ๋ฒ„ํŠผ ๋ชจ์–‘์œผ๋กœ ๋ชจ๋“œ๋ฅผ ํ•˜๋‚˜ ๊ณ ๋ฅด๊ฒŒ ํ•œ๋‹ค | `SRadioButton` | ยง3-7-2 |
484
+ | ์„ ํƒ์ง€๋งˆ๋‹ค ์„ค๋ช…์ด ๋ถ™์–ด ํ•œ ์ค„๋กœ๋Š” ์•ˆ ๋œ๋‹ค | `SRadioCardGroup` | ยง3-7-2 |
485
+ | ์„ค๋ช…์ด ๋ถ™์€ ์„ ํƒ์ง€ ์นด๋“œ ํ•˜๋‚˜๋ฅผ ์ง์ ‘ ๋ฐฐ์น˜ํ•œ๋‹ค | `SRadioCard` | ยง3-7-2 |
447
486
  | ๋ผ๋””์˜ค ํ•˜๋‚˜๋ฅผ ํ‘œ ์…€ ๋“ฑ์— ์ง์ ‘ ๋ฐฐ์น˜ํ•œ๋‹ค | `SRadio` | ยง3-7-2 |
448
487
  | ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๊ณ ๋ฅด๊ฒŒ ํ•œ๋‹ค / ๋™์˜๋ฅผ ๋ฐ›๋Š”๋‹ค | `SCheckbox` | ยง3-7-3 |
449
488
  | ์ผœ๋Š” ์ฆ‰์‹œ ๋ฐ˜์˜๋˜๋Š” ์„ค์ •์„ ์ค€๋‹ค | `SSwitch` | ยง3-7-3 |
@@ -473,6 +512,7 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
473
512
  | ๋‚˜์—ดํ•œ ํ•ญ๋ชฉ์„ ํŽผ์ณ ํ•˜์œ„ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ค€๋‹ค | `SExpansionList` + `SExpansionItem` | ยง3-7-7 |
474
513
  | ๋ถ€๋ชจ-์ž์‹ ๊ณ„์ธต์„ ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ๋ณด์—ฌ์ค€๋‹ค | `STree` | ยง3-7-7 |
475
514
  | ์‚ฌ์šฉ์ž๊ฐ€ ์ˆœ์„œ๋ฅผ ๋“œ๋ž˜๊ทธ๋กœ ๋ฐ”๊พธ๊ฒŒ ํ•œ๋‹ค | `SDraggableList` + `SDraggableItem` | ยง3-7-6 |
515
+ | ๋‚ ์งœ๋ณ„ ์ผ์ •์„ ํ•œ ๋‹ฌ์น˜ ๊ฒฉ์ž๋กœ ํŽผ์ณ ๋ณด์—ฌ์ค€๋‹ค | `SCalendarBoard` | ยง3-7-4 |
476
516
  | ํ‘œ ์œ„์— ๊ฑด์ˆ˜ ์š”์•ฝ๊ณผ ์•ก์…˜์„ ์–น๋Š”๋‹ค | `STableBar` | ยง4-2 |
477
517
  | ์ƒํƒœยท๋ถ„๋ฅ˜๋ฅผ ๋ผ๋ฒจ๋กœ ์ฐ๋Š”๋‹ค | `STag` | ยง3-1 |
478
518
  | ์ƒ‰ ์ ๋งŒ์œผ๋กœ ์ƒํƒœ๋ฅผ ์ฐ๋Š”๋‹ค | `SBadge` | ยง3-1 |
@@ -487,6 +527,7 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
487
527
  | ๋ผ๋ฒจ์ด ์žˆ๋Š” ์ผ๋ฐ˜ ์•ก์…˜์„ ์ค€๋‹ค | `SButton` | ยง3-5 |
488
528
  | ์•„์ด์ฝ˜ ํ•˜๋‚˜๋กœ ๋œป์ด ํ†ตํ•˜๋Š” ๋ถ€๊ฐ€ ์กฐ์ž‘์„ ์ค€๋‹ค | `SGhostButton` | ยง3-5-5 |
489
529
  | ํ•œ ๋ฒ„ํŠผ์— ์—ฌ๋Ÿฌ ์„ ํƒ์ง€๋ฅผ ๋งค๋‹จ๋‹ค | `SDropdownButton` | ยง3-5-4 |
530
+ | GNB system ํŒจ๋„์—์„œ ํ•œ ์ค„์งœ๋ฆฌ ํ–‰ ์•ก์…˜์„ ์ค€๋‹ค | `SSystemActionButton` | ยง3-5-7 |
490
531
 
491
532
  #### D. ํ™”๋ฉด์„ ๋‹ด๊ณ  ๋‚˜๋ˆˆ๋‹ค
492
533
 
@@ -494,14 +535,19 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
494
535
  | --- | --- | --- |
495
536
  | ์•ฑ ์…ธ(์ƒ๋‹จ๋ฐ” + ๋‚ด๋น„ + ๋ณธ๋ฌธ)์„ ์„ธ์šด๋‹ค | `SLayout` | ยง4-1 |
496
537
  | ์ขŒ์ธก ๋‚ด๋น„๊ฒŒ์ด์…˜์„ ๋งŒ๋“ ๋‹ค | `SGnb` | ยง4-1 |
538
+ | ์ขŒ์ธก ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋งจ ์•„๋ž˜(๋˜๋Š” ์ „ํญ ์ƒ๋‹จ๋ฐ” ์˜ค๋ฅธ์ชฝ ๋)์— ์„œ๋น„์Šคยท๋„๋ฉ”์ธยท์•Œ๋ฆผยท์„ค์ •ยท๊ณ„์ • ๋ฌถ์Œ์„ ๋ถ™์ธ๋‹ค | `SGnbSystem` | ยง4-1 |
539
+ | ์•ฑ ์ƒ๋‹จ๋ฐ” ์˜ค๋ฅธ์ชฝ ๋์— ์•Œ๋ฆผ ๋ฒจยท๊ณ„์ • ์ด๋ฆ„์„ ๋‘”๋‹ค | `SGnbSystem` (`SGnb` ์˜ `system` ์Šฌ๋กฏ โ€” ์ง์ ‘ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค) | ยง4-1 |
540
+ | ๊ณ„์ • ์ด๋ฆ„์„ ๋ˆŒ๋Ÿฌ ์ด๋ฉ”์ผยท๊ถŒํ•œยท๊ณ„์ • ์„ค์ •ยท์–ธ์–ด ๋ณ€๊ฒฝยท๋กœ๊ทธ์•„์›ƒ์„ ๋„์šด๋‹ค | `SAccountListBox` (`SGnbSystem` ์˜ `account.listBox` ๋กœ ๋„˜๊ธด๋‹ค โ€” ์ง์ ‘ ๋„์šฐ์ง€ ์•Š๋Š”๋‹ค) | ยง4-1 |
497
541
  | ํŽ˜์ด์ง€ ๋ณธ๋ฌธ์„ ๋‹ด๋Š”๋‹ค (ํŒจ๋”ฉยท์Šคํฌ๋กค) | `SPage` | ยง4-1 |
498
- | ํŽ˜์ด์ง€ ์ œ๋ชฉ(+ ์„œ๋ธŒ ํ…์ŠคํŠธยท๋’ค๋กœ๊ฐ€๊ธฐยท์šฐ์ธก ์Šฌ๋กฏ)์„ ๋งŒ๋“ ๋‹ค | `SPage` ์˜ `header` prop | ยง4-1 |
542
+ | ํŽ˜์ด์ง€ ์ œ๋ชฉ(+ ์„œ๋ธŒ ํ…์ŠคํŠธยท๋’ค๋กœ๊ฐ€๊ธฐยท์šฐ์ธก ์Šฌ๋กฏ)์„ ๋งŒ๋“ ๋‹ค | `SPageHeader` (`SLayout` ์•ˆ์—์„œ `SPage` ์•ž์— ๋‘”๋‹ค) | ยง4-1 |
499
543
  | ์ œ๋ชฉ ์žˆ๋Š” ์„น์…˜์œผ๋กœ ๋ฌถ๋Š”๋‹ค | `SSectionHeaderCard` | ยง3-7-8 |
500
544
  | ์ œ๋ชฉ ์—†์ด ํฐ ๋ฉด์œผ๋กœ๋งŒ ๋ฌถ๋Š”๋‹ค | `SCard` | ยง3-7-8 |
501
545
  | ๊ฐ€๋กœ์„ ์œผ๋กœ ๋Š๋Š”๋‹ค | `SDivider` | ยง3-6 |
502
546
  | ์‚ฌ์šฉ์ž๊ฐ€ ์˜์—ญ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•˜๊ฒŒ ํ•œ๋‹ค | `SSplitter` | ยง3-6 |
503
547
  | ํŠน์ • ์˜์—ญ ์•ˆ์—์„œ๋งŒ ์Šคํฌ๋กค์‹œํ‚จ๋‹ค | `SScrollArea` | |
504
548
 
549
+ **`SScrollArea` ๋กœ ํŽ˜์ด์ง€ ๋ณธ๋ฌธ ์ „์ฒด๋ฅผ ๊ฐ์‹ธ์ง€ ์•Š๋Š”๋‹ค.** ํŽ˜์ด์ง€ ์Šคํฌ๋กค์€ `SPage` ์˜ `<main>` ๋ชซ์ด๋‹ค โ€” ๊ฐ์‹ธ๋ฉด ์Šคํฌ๋กค๋ฐ”๊ฐ€ ๋ณธ๋ฌธ ํŒจ๋”ฉ ์•ˆ์ชฝ์œผ๋กœ ๋“ค์–ด์™€ ํŽ˜์ด์ง€ ๊ฐ€์žฅ์ž๋ฆฌ์—์„œ ๋–จ์–ด์ ธ ๊ทธ๋ ค์ง„๋‹ค (ยง2-2).
550
+
505
551
  #### E. ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค
506
552
 
507
553
  | ํ•˜๋ ค๋Š” ์ผ | ์ปดํฌ๋„ŒํŠธ | ๊ฐˆ๋ฆผ |
@@ -569,6 +615,14 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
569
615
  | ํŠน์ • UI ์š”์†Œ์— ๋Œ€ํ•œ **์˜จ๋ณด๋”ฉยท๊ธฐ๋Šฅ ์•ˆ๋‚ด** | `SGuide` |
570
616
  | ๋กœ๋”ฉ ์ค‘ ํ™”๋ฉด ์ž ๊ธˆ | `SLoadingModal` / ์˜์—ญ ๋กœ๋”ฉ์€ `SLoadingContainer` |
571
617
 
618
+ **`SCallout` ์˜ `type` ์€ ๋†“์ด๋Š” ๋ฉด์ด ์ •ํ•œ๋‹ค.** ์•ˆ๋‚ด์˜ ๊ฐ•๋„๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐฐ๊ฒฝ ๋Œ€๋น„์˜ ๋ฌธ์ œ๋‹ค.
619
+
620
+ | `type` | ์–ธ์ œ |
621
+ | --- | --- |
622
+ | `default` | ํฐ ๋ฉด ์œ„ (`SPage background="frame"`) โ€” ์˜…์€ ํšŒ์ƒ‰ ๋ฉด์ด๋ผ ํŽ˜์ด์ง€์™€ ๊ตฌ๋ถ„๋œ๋‹ค |
623
+ | `white` | ํšŒ์ƒ‰ ๋ฉด ์œ„ (`background="neutral"`ยท`"screen"`) โ€” ๊ทธ ์œ„์—์„œ๋Š” `default` ๊ฐ€ ๋ฐฐ๊ฒฝ์— ๋ฌปํžŒ๋‹ค |
624
+ | `danger` | ๊ฒฝ๊ณ . ์ขŒ์ธก์— "์ฃผ์˜์‚ฌํ•ญ" ํƒ€์ดํ‹€์ด ๋ถ™์œผ๋ฏ€๋กœ ๋‹จ์ˆœ ์•ˆ๋‚ด์—๋Š” ์“ฐ์ง€ ์•Š๋Š”๋‹ค |
625
+
572
626
  ### 3-3. ํ”Œ๋กœํŒ…/์˜ค๋ฒ„๋ ˆ์ด๋ฅ˜
573
627
 
574
628
  | ์ƒํ™ฉ | ์‚ฌ์šฉ |
@@ -658,8 +712,8 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
658
712
 
659
713
  - ์ž‘์€ ์ฐฝ์ด ์•„๋‹ˆ๋ผ **ํ™”๋ฉด ํ•˜๋‚˜๊ฐ€ ํ†ต์งธ๋กœ** ๋“ค์–ด๊ฐ„๋‹ค โ€” ๊ฒ€์ƒ‰ ํ•„ํ„ฐยทํ…Œ์ด๋ธ”ยทํŽ˜์ด์ง€๋„ค์ด์…˜์ด ๊ทธ๋Œ€๋กœ ์žˆ๋Š” ๋ชฉ๋ก(`์—‘์…€ ํŒŒ์ผ ๊ด€๋ฆฌ`), ํ—ค๋” ์นด๋“œยทํƒญ์ด ์žˆ๋Š” ์ƒ์„ธ(`์ด๋™ ์˜ค๋” ์ƒ์„ธ`).
660
714
  - ์ƒ์„ธ๋ฅผ ํŒ์—…์œผ๋กœ ์—ฌ๋Š” ์ด์œ ๋Š” **๋ชฉ๋ก์„ ๋– ๋‚˜์ง€ ์•Š๊ณ  ์—ฌ๋Ÿฌ ๊ฑด์„ ๋ฒˆ๊ฐˆ์•„ ๋ณด๊ธฐ** ์œ„ํ•ด์„œ๋‹ค. ๋‹จ ์ƒ์„ธ๊ฐ€ **ํ•ญ์ƒ** ํŒ์—…์ธ ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , ๋ฐ์ดํ„ฐ ์–‘์ด ๋งŽ์„ ๋•Œ ํŒ์—…์„ ์“ด๋‹ค.
661
- - ๊ตฌ์กฐ๋Š” ํ—ค๋”(์ œ๋ชฉ ์ค‘์•™) + ๋ณธ๋ฌธ์ด๊ณ  **ํ‘ธํ„ฐ๋Š” ๊ธฐ๋ณธ์œผ๋กœ ์—†๋‹ค**. ์กฐํšŒ๋งŒ ํ•˜๋Š” ํŒ์—…์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ , **ํ™•์ •ํ•  ์ž‘์—…์ด ์žˆ์„ ๋•Œ๋งŒ `useFooter` ๋กœ ํ‘ธํ„ฐ๋ฅผ ์ผœ์„œ `submitButton` ์— `์ €์žฅ`** ์„ ๋‘”๋‹ค.
662
- - **๋ณธ๋ฌธ ํŒจ๋”ฉ์€ `SPopup` ์ด ํ† ํฐ์œผ๋กœ ๋„ฃ๋Š”๋‹ค. ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค** (`p-sd-*` ๋กœ ๋ฎ์–ด์“ฐ๋ฉด ํ† ํฐ์ด ๋ฐ”๋€Œ์–ด๋„ ์•ˆ ๋”ฐ๋ผ๊ฐ„๋‹ค). ํ‘œ๋ฅผ ๊ฐ€์žฅ์ž๋ฆฌ๊นŒ์ง€ ์ฑ„์šฐ๋Š” ๋“ฑ ์ฝ˜ํ…์ธ ๊ฐ€ ์—ฌ๋ฐฑ์„ ์ง์ ‘ ๋‹ค๋ค„์•ผ ํ•  ๋•Œ๋งŒ `noPadding` ์œผ๋กœ ๋ˆ๋‹ค.
715
+ - ๊ตฌ์กฐ๋Š” ํ—ค๋”(์ œ๋ชฉ ์ค‘์•™) + ๋ณธ๋ฌธ์ด๊ณ  **ํ‘ธํ„ฐ๋Š” ๊ธฐ๋ณธ์œผ๋กœ ์—†๋‹ค**. ์กฐํšŒ๋งŒ ํ•˜๋Š” ํŒ์—…์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ , **ํ™•์ •ํ•  ์ž‘์—…์ด ์žˆ์„ ๋•Œ๋งŒ `showFooter` ๋กœ ํ‘ธํ„ฐ๋ฅผ ์ผœ์„œ `submitButton` ์— `์ €์žฅ`** ์„ ๋‘”๋‹ค.
716
+ - **๋ณธ๋ฌธ ํŒจ๋”ฉ์€ `SPopup` ์ด ํ† ํฐ์œผ๋กœ ๋„ฃ๋Š”๋‹ค. ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค** (`p-sd-*` ๋กœ ๋ฎ์–ด์“ฐ๋ฉด ํ† ํฐ์ด ๋ฐ”๋€Œ์–ด๋„ ์•ˆ ๋”ฐ๋ผ๊ฐ„๋‹ค). ํ‘œ๋ฅผ ๊ฐ€์žฅ์ž๋ฆฌ๊นŒ์ง€ ์ฑ„์šฐ๋Š” ๋“ฑ ์ฝ˜ํ…์ธ ๊ฐ€ ์—ฌ๋ฐฑ์„ ์ง์ ‘ ๋‹ค๋ค„์•ผ ํ•  ๋•Œ๋งŒ `padding="none"` ์œผ๋กœ ๋ˆ๋‹ค.
663
717
  - ๊ทธ ๋ฐ–์—๋Š” ํŒ์—… ์•ˆ๋„ ์ผ๋ฐ˜ ํŽ˜์ด์ง€์™€ ๊ฐ™์€ ๊ทœ์น™(ยง4)์„ ๋”ฐ๋ฅธ๋‹ค: ๋ธ”๋ก ๊ฐ„๊ฒฉ `gap-sd-12`, ํ‘œ๋Š” `SKeyValueTable` / `STable`.
664
718
 
665
719
  ```tsx
@@ -742,36 +796,51 @@ SModal.create({ component: OrderModal, componentProps: { orderId } })
742
796
 
743
797
  ์ž‘์„ฑ ์ค‘์ธ ๋‚ด์šฉ์ด ์žˆ์„ ๋•Œ ๋‹ซ๊ธฐ๋ฅผ ์‹œ๋„ํ•˜๋ฉด ์ดํƒˆ ์•ˆ๋‚ด๋ฅผ ๋„์šฐ๋Š” ๊ฒƒ์€ **์†Œ๋น„ ์•ฑ ๋ชซ**์ด๋‹ค. ๋””์ž์ธ ์‹œ์Šคํ…œ์€ dirty ์ƒํƒœ๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋ฏ€๋กœ ๋ฐฑ๋“œ๋กญยทESC ๋ฅผ ์ผ๊ด„ ์ฐจ๋‹จํ•  ๋ฟ์ด๋‹ค. ์•ˆ๋‚ด๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์•ฑ์ด ์ž์ฒด dirty ํŒ์ • ํ›„ `SModal.confirm` ์œผ๋กœ ๋„์šด๋‹ค.
744
798
 
745
- ### 3-4. ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ โ€” ์ •๋ ฌ๊ณผ ๋„ˆ๋น„
799
+ ### 3-4. ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ โ€” ์ •๋ ฌยท๋„ˆ๋น„ยทํ—ค๋”
746
800
 
747
- #### ์ •๋ ฌ
801
+ #### ์ •๋ ฌ๊ณผ ๋„ˆ๋น„๋Š” ๊ฐ™์€ ํ‘œ์—์„œ ์ •ํ•œ๋‹ค
748
802
 
749
- **๊ฐ’์˜ ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•˜๋Š” ์ˆซ์ž ์ปฌ๋Ÿผ์€ ์˜ˆ์™ธ ์—†์ด ์˜ค๋ฅธ์ชฝ ์ •๋ ฌํ•œ๋‹ค** (`align: 'right'`).
750
- ์ž๋ฆฟ์ˆ˜๊ฐ€ ์„ธ๋กœ๋กœ ๋งž์•„์•ผ ๊ฐ’์˜ ํฌ๊ธฐ๋ฅผ ๋ˆˆ์œผ๋กœ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
803
+ ์ปฌ๋Ÿผ์„ ์ •์˜ํ•  ๋•Œ ์ •๋ ฌ๊ณผ ๋„ˆ๋น„๋Š” ๋”ฐ๋กœ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค **๊ฐ’์˜ ์„ฑ๊ฒฉ**์—์„œ ๋‚˜์˜จ๋‹ค.
751
804
 
752
- **ํŒ๋ณ„ ๊ธฐ์ค€์€ "์ˆซ์ž์ธ๊ฐ€"๊ฐ€ ์•„๋‹ˆ๋ผ "ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•˜๋Š”๊ฐ€"๋‹ค.** ์ž๋ฆฟ์ˆ˜ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†๊ณ  ๊ฐ’๋ผ๋ฆฌ ๋Œ€์†Œ๋ฅผ ๊ฒฌ์ค„ ์ผ์ด ์—†์œผ๋ฉด ์ˆซ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์–ด๋„ ์šฐ์ธก ์ •๋ ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
805
+ ์›์น™ ํ•œ ์ค„: **๊ธธ์ด๋ฅผ ํ˜•์‹์ด ์ •ํ•˜๋ฉด ๊ณ ์ •, ์‚ฌ์šฉ์ž๊ฐ€ ์ •ํ•˜๋ฉด ๊ฐ€๋ณ€.**
753
806
 
754
- | ๊ฐ’ ์„ฑ๊ฒฉ | ์ •๋ ฌ | ์˜ˆ |
755
- | --- | --- | --- |
756
- | **๊ธˆ์•กยท์ˆ˜๋Ÿ‰ยท๊ฐœ์ˆ˜ยท๋น„์œจ ๋“ฑ ์–‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’** | **`'right'`** | `39,000์›` ยท `12๊ฐœ` ยท `3๊ฑด` ยท `15%` |
757
- | ์ฝ”๋“œยท์‹๋ณ„์ž (์ฃผ๋ฌธ๋ฒˆํ˜ธ, ์ƒํ’ˆ์ฝ”๋“œ, ์ˆœ๋ฒˆ) | **`'center'`** | `RV20250728-000010` ยท `1024` |
758
- | ์ „ํ™”๋ฒˆํ˜ธยท์‚ฌ์—…์ž๋ฒˆํ˜ธ | **`'center'`** | `010-1234-5678` |
759
- | ์ผ์žยท์ผ์‹œ | **`'center'`** | `2024-10-23` |
760
- | ํ…์ŠคํŠธ | ์ƒ๋žต(๊ธฐ๋ณธ `left`) | ์ƒํ’ˆ๋ช…, ์นดํ…Œ๊ณ ๋ฆฌ |
761
- | ์ƒํƒœ ํƒœ๊ทธยท์•„์ด์ฝ˜ยท์ฒดํฌ๋ฐ•์Šค ๋“ฑ ๊ณ ์ •ํญ ์š”์†Œ | `'center'` | `STag`, `SIcon` |
807
+ | ๊ฐ’ ์„ฑ๊ฒฉ | ์ •๋ ฌ | ๋„ˆ๋น„ | ์˜ˆ |
808
+ | --- | --- | --- | --- |
809
+ | **๊ธˆ์•กยท์ˆ˜๋Ÿ‰ยท๊ฐœ์ˆ˜ยท๋น„์œจ** (์–‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’) | **`'right'`** | ๊ณ ์ • | `39,000์›` ยท `12๊ฐœ` ยท `3๊ฑด` ยท `15%` |
810
+ | ์ฝ”๋“œยท์‹๋ณ„์ž, ์ „ํ™”๋ฒˆํ˜ธ, ์ผ์žยท์ผ์‹œ | **`'center'`** | ๊ณ ์ • | `RV20250728-000010` ยท `010-1234-5678` ยท `2026-08-13` |
811
+ | **๋‹ซํžŒ ๊ฐ’ ์ง‘ํ•ฉ** (enum ยท ๋งˆ์Šคํ„ฐ ๋ชฉ๋ก์—์„œ ๊ณ ๋ฅด๋Š” ๊ฐ’) | **`'center'`** | ๊ณ ์ • | ์ƒํƒœ ยท ์ง๊ธ‰ ยท ๊ณต๊ฐœ ๋ฒ”์œ„ ยท ๊ณ ์šฉ ํ˜•ํƒœ ยท ์š”์ผ |
812
+ | ์ƒํƒœ ํƒœ๊ทธยท์•„์ด์ฝ˜ยท๋ฒ„ํŠผยท์ฒดํฌ๋ฐ•์Šค | `'center'` | ๊ณ ์ • (`contentType: 'control'`) | `STag` ยท `SIcon` ยท `SGhostButton` |
813
+ | **ํ…์ŠคํŠธ** (์‚ฌ์šฉ์ž๊ฐ€ ์ž์œ  ์ž…๋ ฅ) | ์ƒ๋žต(๊ธฐ๋ณธ `left`) | ๊ธฐ์ค€ ํญ + `resizable` | ์ด๋ฆ„ ยท ๋ชฉํ‘œ๋ช… ยท ์ด๋ฉ”์ผ ยท ๋ฉ”๋ชจ |
762
814
 
763
815
  **์ค‘์•™ ์ •๋ ฌ์€ `align: 'center'` ๋ฅผ ๋ช…์‹œํ•œ๋‹ค.** ๊ธฐ๋ณธ๊ฐ’์ด ์ขŒ์ธก์ด๋ผ ์ƒ๋žตํ•˜๋ฉด ์ค‘์•™์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.
764
816
 
817
+ ##### ํŒ๋ณ„ โ€” ๊ฐ’์˜ ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•˜๋Š”๊ฐ€
818
+
819
+ ์šฐ์ธก ์ •๋ ฌ์˜ ๊ทผ๊ฑฐ๋Š” "์ž๋ฆฟ์ˆ˜๋ฅผ ์„ธ๋กœ๋กœ ๋งž์ถฐ ํฌ๊ธฐ๋ฅผ ์ฝ๋Š”๋‹ค"๋‹ค. ์ž๋ฆฟ์ˆ˜ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†๊ณ  ๊ฐ’๋ผ๋ฆฌ ๋Œ€์†Œ๋ฅผ ๊ฒฌ์ค„ ์ผ์ด ์—†์œผ๋ฉด ์ˆซ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์–ด๋„ ์šฐ์ธก ์ •๋ ฌํ•˜์ง€ ์•Š๋Š”๋‹ค โ€” ์†ก์žฅ๋ฒˆํ˜ธ `123456789` ๋Š” ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฐ’์ด ์•„๋‹ˆ๋‹ค.
820
+
821
+ ##### ํŒ๋ณ„ โ€” ๊ฐ’ ์ง‘ํ•ฉ์ด ๋‹ซํ˜€ ์žˆ๋Š”๊ฐ€
822
+
823
+ **๋‹ซํžŒ ๊ฐ’ ์ง‘ํ•ฉ์ด๋ฉด ํƒœ๊ทธ๋กœ ๊ทธ๋ฆฌ๋“  ๋งจ ํ…์ŠคํŠธ๋กœ ๊ทธ๋ฆฌ๋“  `center` ๋‹ค.** ํŒ๋ณ„ ์งˆ๋ฌธ ํ•˜๋‚˜ โ€” *์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ ์นธ์„ ์ง์ ‘ ์น˜๋Š” ๊ฐ’์ธ๊ฐ€?* ์•„๋‹ˆ๋ฉด ๋‹ซํžŒ ์ง‘ํ•ฉ์ด๋‹ค.
824
+
825
+ | | ๊ฐ’์˜ ์ถœ์ฒ˜ | ์ •๋ ฌ | ์˜ˆ |
826
+ | --- | --- | --- | --- |
827
+ | **๋‹ซํž˜** | enum ยท ๋งˆ์Šคํ„ฐ ๋ชฉ๋ก์—์„œ ์„ ํƒ (`SSelect` ์˜ `options` ์—์„œ ์˜ค๋Š” ๊ฐ’) | `center` | ์ง๊ธ‰ ยท ์ƒํƒœ ยท ๊ณต๊ฐœ ๋ฒ”์œ„ ยท ์ตœ์ข… ๋“ฑ๊ธ‰ ยท ๊ณ ์šฉ ํ˜•ํƒœ ยท ์š”์ผ |
828
+ | **์—ด๋ฆผ** | ์‚ฌ์šฉ์ž๊ฐ€ ์ž์œ  ์ž…๋ ฅ (์ž์œ  ์ž…๋ ฅ ํ•„๋“œ์—์„œ ์˜ค๋Š” ๊ฐ’) | `left` | ์ด๋ฆ„ ยท ๋ชฉํ‘œ๋ช… ยท ์ด๋ฉ”์ผ ยท ๋ฌธํ•ญ ๊ทธ๋ฃน๋ช… |
829
+
830
+ - **๋ฌด์—‡์œผ๋กœ ๊ทธ๋ ธ๋Š”์ง€๋กœ ๊ฐ€๋ฅด์ง€ ์•Š๋Š”๋‹ค.** ๊ฐ™์€ ์„ฑ๊ฒฉ์˜ ๊ฐ’์ด `STag` ๋ฉด `center`, ๋งจ ํ…์ŠคํŠธ๋ฉด `left` ๊ฐ€ ๋˜๋ฉด ํ•œ ํ…Œ์ด๋ธ” ์•ˆ์—์„œ ๊ธฐ์ค€์ด ์–ด๊ธ‹๋‚œ๋‹ค.
831
+ - **๊ธธ์ด๋กœ๋„ ๊ฐ€๋ฅด์ง€ ์•Š๋Š”๋‹ค.** "์งง์€ ๋ผ๋ฒจ์ด๋ฉด center" ๊ฐ™์€ ๋‹จ์„œ๋ฅผ ๋ถ™์ด๋ฉด `ํ”„๋กœ๋•ํŠธ๋””์ž์ธํŒ€`(8์ž)์ฒ˜๋Ÿผ ๊ฒฝ๊ณ„์— ๊ฑธ๋ฆฌ๋Š” ๊ฐ’์—์„œ ๋งค๋ฒˆ ํŒ๋‹จ์ด ๊ฐˆ๋ฆฐ๋‹ค.
832
+ - ํ•œ ์—ด์— ํ…์ŠคํŠธ์™€ ํƒœ๊ทธ๊ฐ€ ํ•จ๊ป˜ ์˜ค๋ฉด ํƒœ๊ทธ ๊ธฐ์ค€(`center`)์— ๋งž์ถ˜๋‹ค.
833
+
765
834
  ```tsx
766
835
  const columns: STableColumn[] = [
767
- { name: 'orderNo', label: '์ฃผ๋ฌธ๋ฒˆํ˜ธ', field: 'orderNo', width: '140px', align: 'center' },
768
- { name: 'orderedAt', label: '์ฃผ๋ฌธ์ผ์ž', field: 'orderedAt', width: '100px', align: 'center' },
769
- { name: 'name', label: '์ƒํ’ˆ๋ช…', field: 'name' }, // ํ…์ŠคํŠธ โ†’ ์ƒ๋žต
770
- { name: 'qty', label: '์ˆ˜๋Ÿ‰', field: 'qty', width: '80px', align: 'right',
836
+ { name: 'orderNo', label: '์ฃผ๋ฌธ๋ฒˆํ˜ธ', field: 'orderNo', width: 140, align: 'center' },
837
+ { name: 'orderedAt', label: '์ฃผ๋ฌธ์ผ์ž', field: 'orderedAt', width: 100, align: 'center' },
838
+ { name: 'name', label: '์ƒํ’ˆ๋ช…', field: 'name', width: 240 }, // ์ž์œ  ์ž…๋ ฅ โ†’ ์ƒ๋žต
839
+ { name: 'qty', label: '์ˆ˜๋Ÿ‰', field: 'qty', width: 80, align: 'right',
771
840
  format: (v: number) => `${Number(v).toLocaleString()}๊ฐœ` },
772
- { name: 'price', label: 'ํŒ๋งค๊ฐ€', field: 'price', width: '120px', align: 'right',
841
+ { name: 'price', label: 'ํŒ๋งค๊ฐ€', field: 'price', width: 120, align: 'right',
773
842
  format: (v: number) => `${Number(v).toLocaleString()}์›` },
774
- { name: 'status', label: '์ƒํƒœ', field: 'status', width: '100px', align: 'center',
843
+ { name: 'status', label: '์ƒํƒœ', field: 'status', width: 100, align: 'center',
775
844
  render: () => <STag size="sm" color="green" label="ํŒ๋งค์ค‘" /> },
776
845
  ];
777
846
  ```
@@ -779,29 +848,56 @@ const columns: STableColumn[] = [
779
848
  - `format` ์œผ๋กœ ๋‹จ์œ„๋ฅผ ๋ถ™์ด๋”๋ผ๋„ **์–‘์„ ๋‚˜ํƒ€๋‚ด๋ฉด ์˜ค๋ฅธ์ชฝ ์ •๋ ฌ**์ด๋‹ค. ๋‹จ์œ„ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด์ด ๋˜๋Š” ๊ฒƒ์€ ์ •๋ ฌ ํŒ๋‹จ๊ณผ ๋ฌด๊ด€ํ•˜๋‹ค.
780
849
  - ์–‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž๋Š” ยง1-4 ๋Œ€๋กœ **`toLocaleString()` ์ด ํ•„์ˆ˜**๋‹ค. ์„ธ ์ž๋ฆฌ ์ฝค๋งˆ ์—†์ด ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
781
850
  - **๋ฒˆํ˜ธยท์ฝ”๋“œ์—๋Š” ์„ธ ์ž๋ฆฌ ์ฝค๋งˆ๋ฅผ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.** ์†ก์žฅ๋ฒˆํ˜ธ `123456789` ๋ฅผ `123,456,789` ๋กœ ํ‘œ์‹œํ•˜๋ฉด ๊ฐ’ ์ž์ฒด๊ฐ€ ๋‹ฌ๋ผ ๋ณด์ธ๋‹ค.
851
+ - ๋‚ ์งœ๋Š” ยง1-4 ๋Œ€๋กœ `YYYY-MM-DD` ๋กœ ์ ๋Š”๋‹ค. ์ž๋ฆฟ์ˆ˜๊ฐ€ ๊ณ ์ •์ด๋ผ ํญ์„ ํ˜•์‹์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
782
852
  - **ํ—ค๋”๋Š” ๊ฐ€์šด๋ฐ, ์…€๋งŒ ์šฐ์ธก**์œผ๋กœ ๋‘๋ ค๋ฉด `align` ์ด ์•„๋‹ˆ๋ผ `tdClass` ๋ฅผ ์“ด๋‹ค. `align` ์€ `<th>` ์™€ `<td>` ์— ํ•จ๊ป˜ ์ ์šฉ๋œ๋‹ค.
783
853
 
784
854
  ```tsx
785
- { name: 'views', label: '์กฐํšŒ์ˆ˜', field: 'views', align: 'center', tdClass: 'text-right!',
855
+ { name: 'views', label: '์กฐํšŒ์ˆ˜', field: 'views', align: 'center', width: 100, tdClass: 'text-right!',
786
856
  format: (v: number) => Number(v).toLocaleString() },
787
857
  ```
788
858
 
789
859
  - `SKeyValueTable` ์˜ ๊ฐ’ ์…€๋„ ๊ฐ™์€ ๊ธฐ์ค€์„ ๋”ฐ๋ฅธ๋‹ค.
790
860
 
791
- #### ์ปจํŠธ๋กค์ด ๋“ค์–ด๊ฐ€๋Š” ์ปฌ๋Ÿผ์€ ๋„ˆ๋น„๋ฅผ ๋ช…์‹œํ•œ๋‹ค
861
+ #### ๋„ˆ๋น„๋Š” px ๋กœ๋งŒ ์ค€๋‹ค
862
+
863
+ **์ปฌ๋Ÿผ ํญ์€ px ์ด๋‹ค.** ์ˆซ์ž๋ฅผ ์ฃผ๋ฉด px ๋กœ ์ฝ๊ณ , ๋ฌธ์ž์—ด์€ `'120px'` ํ˜•ํƒœ๋งŒ ๋ฐ›๋Š”๋‹ค. `%` ยท `clamp()` ยท `min()` ์€ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
792
864
 
793
- ์ปฌ๋Ÿผ ํญ์€ `width` ๋กœ **๊ณ ์ •**๋˜๊ณ , `<td>` ๋Š” ๊ทธ ํญ์„ ๋„˜๋Š” ๋‚ด์šฉ์„ ์ž˜๋ผ๋‚ธ๋‹ค(`overflow: hidden`). ํ…์ŠคํŠธ๋ผ๋ฉด ๋ง์ค„์ž„์œผ๋กœ ๋๋‚˜์ง€๋งŒ, ์…€์— `STag` ยท `SButton` ยท `SGhostButton` ยท `SSelect` ยท `SInput` ยท `SNumberInput` ์ฒ˜๋Ÿผ **์ž๊ธฐ ํญ์„ ๊ฐ€์ง„ ์š”์†Œ**๋ฅผ ๋„ฃ์œผ๋ฉด ์š”์†Œ ์ž์ฒด๊ฐ€ ์ž˜๋ ค **๋ˆ„๋ฅด๊ฑฐ๋‚˜ ์ฝ๊ฑฐ๋‚˜ ์ž…๋ ฅํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.** `width` ๋ฅผ ์ƒ๋žตํ•ด๋„ ๋‚ด์šฉ์— ๋งž์ถฐ ๋Š˜์–ด๋‚˜์ง€ ์•Š๊ณ  `STable` ์˜ ๊ธฐ๋ณธ ํญ์ด ๋  ๋ฟ์ด๋ฏ€๋กœ, ์ปจํŠธ๋กค์ด ๋“ค์–ด๊ฐ€๋Š” ์ปฌ๋Ÿผ์€ ํญ์„ ์ง์ ‘ ํŒ๋‹จํ•ด์„œ ์ค€๋‹ค.
865
+ ์ปฌ๋Ÿผ ํญ์€ `<colgroup>` ์˜ `<col width>` ๋กœ ๋“ค์–ด๊ฐ€๊ณ  ํ…Œ์ด๋ธ”์ด `table-fixed` ๋ผ, ํ•จ์ˆ˜ํ˜• ๊ฐ’์€ ๊ณ„์‚ฐ๋˜์ง€ ์•Š๊ณ  ํ†ต์งธ๋กœ ๋ฌด์‹œ๋œ ๋’ค auto ํญ์œผ๋กœ ๋–จ์–ด์ง„๋‹ค. `'30%'` ๋Š” ๋” ๋‚˜์˜๊ฒŒ `30`(px)์œผ๋กœ ์ฝํžŒ๋‹ค. **๋‘˜ ๋‹ค ์—๋Ÿฌ ์—†์ด ํ™”๋ฉด๋งŒ ํ‹€์–ด์ง„๋‹ค.**
866
+
867
+ - **๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ€๋Š” ์—ด์€ ์ „๋ถ€ ํญ์„ ๋ช…์‹œํ•œ๋‹ค.** ์ƒ๋žตํ•˜๋ฉด ๊ธฐ๋ณธ 120px ์ด ์กฐ์šฉํžˆ ๋“ค์–ด๊ฐ€๊ณ , "์งง์€ ์—ด์ด๋ผ ๊ทธ๋Œ€๋กœ ๋‘” ๊ฒƒ"๊ณผ "ํŒ๋‹จ์„ ๋น ๋œจ๋ฆฐ ๊ฒƒ"์ด ๊ตฌ๋ถ„๋˜์ง€ ์•Š๋Š”๋‹ค. 120px ์ด ๋งž๋”๋ผ๋„ `width: 120` ์„ ์ ๋Š”๋‹ค.
868
+ - **`autoWidth` ๋Š” ๋‚จ์€ ํญ์„ ํก์ˆ˜ํ•˜๋Š” ์ŠคํŽ˜์ด์„œ ์—ด ํ•˜๋‚˜์—๋งŒ ์“ด๋‹ค.** ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ€๋Š” ์—ด์—๋Š” ์“ฐ์ง€ ์•Š๋Š”๋‹ค โ€” ํญ์ด ๋‹ค๋ฅธ ์—ด์— ์ขŒ์šฐ๋ผ ํ™”๋ฉด๋งˆ๋‹ค ๋‹ฌ๋ผ์ง„๋‹ค. ์ŠคํŽ˜์ด์„œ ์—ด์€ ๊ฐ’์„ ๊ทธ๋ฆฌ์ง€ ์•Š์œผ๋ฏ€๋กœ `field` ๋„ ์ƒ๋žตํ•œ๋‹ค.
869
+
870
+ ```tsx
871
+ { name: 'spacer', label: '', autoWidth: true },
872
+ ```
873
+
874
+ - **`minWidth` ยท `maxWidth` ๋Š” `resizable` ์†์žก์ด์˜ ์ด๋™ ๋ฒ”์œ„์ผ ๋ฟ, ๋ ˆ์ด์•„์›ƒ์—๋Š” ๊ด€์—ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.** ํญ์„ ์ฃผ์ง€ ์•Š์€ ์—ด์ด ์ด ๊ฐ’ ์•ˆ์—์„œ ์žกํžˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.
875
+ - **๊ณ ์ •ํญ ํ•ฉ์ด ์ตœ์†Œ ์ฐฝ ํญ์„ ๋„˜์œผ๋ฉด ๊ฐ€๋กœ ์Šคํฌ๋กค์ด ๋œ๋‹ค.** `STable` ์ด ์ž๊ธฐ ์•ˆ์—์„œ ๊ฐ€๋กœ๋กœ ์Šคํฌ๋กคํ•˜๊ณ  ํ—ค๋”ยท๋ฐ”๋””๊ฐ€ ํ•จ๊ป˜ ์›€์ง์ด๋ฏ€๋กœ ๋ณ„๋„ ์กฐ์น˜๋Š” ํ•„์š” ์—†๋‹ค โ€” ํญ์„ ์ค„์—ฌ ๋งž์ถ”์ง€ ๋ง๊ณ , ์—ด์ด ์ •๋ง ๊ทธ๋งŒํผ ํ•„์š”ํ•œ์ง€๋ฅผ ๋ณธ๋‹ค.
876
+
877
+ ##### ๊ณ ์ •ํญ์„ ์–ด๋–ป๊ฒŒ ์ •ํ•˜๋Š”๊ฐ€
878
+
879
+ ```text
880
+ ํญ = ceil( ( max(๊ฐ’ ํญ + ๊ฐ’ ๊ธฐ์ค€ ํŒจ๋”ฉ, ํ—ค๋” ํญ + 32) + ์—ฌ์œ  ) / 8 ) ร— 8
881
+ ```
882
+
883
+ - **๊ฐ’๊ณผ ํ—ค๋”๋ฅผ ๋”ฐ๋กœ ๊ณ„์‚ฐํ•ด ํฐ ์ชฝ์„ ์“ด๋‹ค.** `contentType: 'control'` ์€ `<td>` ์—๋งŒ ์ ์šฉ๋˜๊ณ  `<th>` ๋Š” ํ•ญ์ƒ ํ…์ŠคํŠธ ํŒจ๋”ฉ์ด๋ผ, ์งง์€ ์ปจํŠธ๋กค + ๊ธด ํ—ค๋” ์กฐํ•ฉ์—์„œ ํ—ค๋”๊ฐ€ ์ž˜๋ฆฐ๋‹ค.
884
+ - ๊ฐ’์— ๋”ฐ๋ผ ํญ์ด ๋‹ฌ๋ผ์ง€๋Š” ์š”์†Œ(`STag` ๋ผ๋ฒจ, ๋ผ๋ฒจ ์žˆ๋Š” ๋ฒ„ํŠผ)๋Š” **๊ฐ€์žฅ ๊ธด ๊ฐ’** ๊ธฐ์ค€์œผ๋กœ ์žก๋Š”๋‹ค. `ํŒ๋งค์ค‘` ์— ๋งž์ถฐ๋‘๋ฉด `ํŒ๋งค์ค‘์ง€ ์š”์ฒญ` ์—์„œ ์ž˜๋ฆฐ๋‹ค.
885
+ - **์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ํ—ค๋”(`sortable`)๋Š” ์•„์ด์ฝ˜ ๋ฒ„ํŠผ + ๊ฐ„๊ฒฉ๋งŒํผ `+20px` ๋” ๋“ ๋‹ค.** `helpText` ๋ฅผ ํ•จ๊ป˜ ๋‹ฌ๋ฉด ๊ทธ๋งŒํผ ๋˜ ๋”ํ•œ๋‹ค.
886
+ - **`editable` ยท `navigable` ํ‘œ์‹๊ณผ `required` ํ‘œ์‹œ(`*`) ๋„ ๊ฐ๊ฐ ํญ์„ ๋จน๋Š”๋‹ค.** ํ—ค๋”์— ๋ถ™๋Š” ๊ฒƒ์ด ๋Š˜์ˆ˜๋ก **๋ผ๋ฒจ์ด ๋จผ์ € ์ž˜๋ฆฌ๋ฏ€๋กœ**, ๋ถ™์ธ ์—ด์€ ํญ์„ ํ•จ๊ป˜ ๋„“ํžŒ๋‹ค.
887
+ - **๊ณ„์‚ฐ๊ฐ’์€ ํ”ฝ์…€ ๋‹จ์œ„๊นŒ์ง€ ๋งž์ถ”๋ฉด ์–ด๊ธ‹๋‚œ๋‹ค** โ€” ์„œ๋ธŒํ”ฝ์…€ ๋ฐ˜์˜ฌ๋ฆผ ๋•Œ๋ฌธ์ด๋‹ค. ์—ฌ์œ  8px ์„ ์–น๊ณ  8 ๋‹จ์œ„๋กœ ์˜ฌ๋ฆผํ•œ๋‹ค.
888
+ - ์ขŒ์šฐ ํŒจ๋”ฉ์€ `STable` ์ด ํ† ํฐ์œผ๋กœ ๋„ฃ์œผ๋ฏ€๋กœ ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋งŒํผ์„ ๋บ€ ๋‚˜๋จธ์ง€๊ฐ€ ์š”์†Œ ๋ชซ์ด๋ผ๋Š” ์ ๋งŒ ๊ณ„์‚ฐ์— ๋„ฃ๋Š”๋‹ค.
889
+
890
+ #### ์ปจํŠธ๋กค์ด ๋“ค์–ด๊ฐ€๋Š” ์ปฌ๋Ÿผ
891
+
892
+ `<td>` ๋Š” ํญ์„ ๋„˜๋Š” ๋‚ด์šฉ์„ ์ž˜๋ผ๋‚ธ๋‹ค(`overflow: hidden`). ํ…์ŠคํŠธ๋ผ๋ฉด ๋ง์ค„์ž„์œผ๋กœ ๋๋‚˜์ง€๋งŒ, ์…€์— `STag` ยท `SButton` ยท `SGhostButton` ยท `SSelect` ยท `SInput` ยท `SNumberInput` ์ฒ˜๋Ÿผ **์ž๊ธฐ ํญ์„ ๊ฐ€์ง„ ์š”์†Œ**๋ฅผ ๋„ฃ์œผ๋ฉด ์š”์†Œ ์ž์ฒด๊ฐ€ ์ž˜๋ ค **๋ˆ„๋ฅด๊ฑฐ๋‚˜ ์ฝ๊ฑฐ๋‚˜ ์ž…๋ ฅํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.**
794
893
 
795
894
  - **์ปจํŠธ๋กค์ด ๋“ค์–ด๊ฐ€๋Š” ์ปฌ๋Ÿผ์—๋Š” `contentType: 'control'` ์„ ํ•จ๊ป˜ ์ค€๋‹ค.** ์ขŒ์šฐ ํŒจ๋”ฉ์ด ํ…์ŠคํŠธ์šฉ(๋„“๊ฒŒ)์—์„œ ์ปจํŠธ๋กค์šฉ(์ข๊ฒŒ)์œผ๋กœ ๋ฐ”๋€Œ์–ด, ๊ฐ™์€ ์ปฌ๋Ÿผ ํญ์—์„œ๋„ ์š”์†Œ๊ฐ€ ์“ธ ํญ์ด ๋„“์–ด์ง„๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `text` ๋‹ค.
796
- - ๊ธฐ์ค€์€ **์š”์†Œ๊ฐ€ ์˜จ์ „ํžˆ ๋ณด์ด๋Š” ํญ + ์…€ ์ขŒ์šฐ ํŒจ๋”ฉ**์ด๋‹ค. ์ขŒ์šฐ ํŒจ๋”ฉ์€ `STable` ์ด ํ† ํฐ์œผ๋กœ ๋„ฃ์œผ๋ฏ€๋กœ(์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค) ๊ทธ๋งŒํผ์„ ๋บ€ ๋‚˜๋จธ์ง€๊ฐ€ ์š”์†Œ ๋ชซ์ด๋ผ๋Š” ์ ์„ ๊ณ„์‚ฐ์— ๋„ฃ๋Š”๋‹ค.
797
895
  - ์š”์†Œ๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด ์š”์†Œ ํญ์˜ ํ•ฉ์— **`gap` ๊นŒ์ง€** ๋”ํ•œ๋‹ค (ํ–‰ ๋‚ด๋ถ€ ์ธ๋ผ์ธ ์•ก์…˜ ๊ฐ„๊ฒฉ์€ `gap-sd-4` ๊ณ ์ •, ยง3-5-5).
798
- - ๊ฐ’์— ๋”ฐ๋ผ ํญ์ด ๋‹ฌ๋ผ์ง€๋Š” ์š”์†Œ(`STag` ๋ผ๋ฒจ, ๋ผ๋ฒจ ์žˆ๋Š” ๋ฒ„ํŠผ)๋Š” **๊ฐ€์žฅ ๊ธด ๊ฐ’** ๊ธฐ์ค€์œผ๋กœ ์žก๋Š”๋‹ค. `ํŒ๋งค์ค‘` ์— ๋งž์ถฐ๋‘๋ฉด `ํŒ๋งค์ค‘์ง€ ์š”์ฒญ` ์—์„œ ์ž˜๋ฆฐ๋‹ค.
799
896
  - `SSelect` ยท `SInput` ์ฒ˜๋Ÿผ ์…€ ํญ์„ ์ฑ„์šฐ๋Š” ์ปจํŠธ๋กค์€ **์ปฌ๋Ÿผ ํญ์ด ๊ณง ์ปจํŠธ๋กค ํญ**์ด๋‹ค. ์‹ค์ œ ์„ ํƒ๊ฐ’ยท์ž…๋ ฅ๊ฐ’์ด ๋ง์ค„์ž„ ์—†์ด ์ฝํžˆ๋Š” ํญ์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
800
897
  - ํญ์„ ๋„‰๋„‰ํžˆ ์ค„ ์ˆ˜ ์—†๋Š” ์ž๋ฆฌ๋Š” ํญ์„ ์ค„์ด๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ **์š”์†Œ๋ฅผ ๋ฐ”๊พผ๋‹ค** โ€” ๋ผ๋ฒจ ๋ฒ„ํŠผ ๋Œ€์‹  ์•„์ด์ฝ˜๋งŒ ์žˆ๋Š” `SGhostButton`, `size="xs"` (ยง3-5-2, ยง3-5-5).
801
- - **`autoWidth` ๋Š” ํ•ด๋ฒ•์ด ์•„๋‹ˆ๋‹ค.** ๋‚ด์šฉ์— ๋งž์ถฐ ๋Š˜์–ด๋‚˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๊ณ ์ •ํญ ์ปฌ๋Ÿผ๋“ค์ด ๊ฐ€์ ธ๊ฐ€๊ณ  **๋‚จ์€ ํญ์„ ๋‚˜๋ˆ  ๊ฐ–๋Š” ๊ฒƒ**์ด๋ผ, ํ…Œ์ด๋ธ”์ด ์ข์œผ๋ฉด ์—ญ์‹œ ์ž˜๋ฆฐ๋‹ค. ์ปจํŠธ๋กค ์ปฌ๋Ÿผ์€ `width` ๋กœ ์ง์ ‘ ํ™•๋ณดํ•œ๋‹ค.
802
898
 
803
899
  ```tsx
804
- { name: 'normal', label: '์ •์ƒ', field: 'normal', width: '96px',
900
+ { name: 'normal', label: '์ •์ƒ', field: 'normal', width: 96,
805
901
  align: 'center', contentType: 'control', render: row => <SNumberInput โ€ฆ /> },
806
902
  ```
807
903
 
@@ -812,13 +908,13 @@ const columns: STableColumn[] = [
812
908
  ```tsx
813
909
  const columns: STableColumn[] = [
814
910
  // ํƒœ๊ทธ โ€” ๊ฐ€์žฅ ๊ธด ๋ผ๋ฒจ ๊ธฐ์ค€
815
- { name: 'status', label: '์ƒํƒœ', field: 'status', width: '120px', minWidth: 120, align: 'center',
911
+ { name: 'status', label: '์ƒํƒœ', field: 'status', width: 120, minWidth: 120, align: 'center',
816
912
  render: (row: SRow) => <STag size="sm" color="green" label={row.statusLabel} /> },
817
913
  // ์…€ ์•ˆ ์ž…๋ ฅ โ€” ์ปฌ๋Ÿผ ํญ์ด ๊ณง ์ž…๋ ฅ ํญ
818
- { name: 'qty', label: '์ˆ˜๋Ÿ‰', field: 'qty', width: '100px', minWidth: 100, align: 'right',
914
+ { name: 'qty', label: '์ˆ˜๋Ÿ‰', field: 'qty', width: 100, minWidth: 100, align: 'right',
819
915
  render: (row: SRow) => <SNumberInput value={row.qty} onValueChange={v => setQty(row, v)} /> },
820
916
  // ์ธ๋ผ์ธ ์•ก์…˜ ๋‘˜ โ€” ํญ = xs ๋ฒ„ํŠผ 2๊ฐœ + gap-sd-4 + ์…€ ์ขŒ์šฐ ํŒจ๋”ฉ
821
- { name: 'actions', label: '', field: 'id', width: '84px', minWidth: 84, align: 'center',
917
+ { name: 'actions', label: '', field: 'id', width: 84, minWidth: 84, align: 'center',
822
918
  render: (row: SRow) => (
823
919
  <div className="flex items-center justify-center gap-sd-4">
824
920
  <SGhostButton size="xs" intent="action" icon="edit" ariaLabel="์ˆ˜์ •" onClick={() => editRow(row)} />
@@ -826,11 +922,34 @@ const columns: STableColumn[] = [
826
922
  </div>
827
923
  ) },
828
924
 
829
- // โŒ ์ปจํŠธ๋กค ์ปฌ๋Ÿผ์— width ์ƒ๋žต โ€” ๊ธฐ๋ณธ ํญ์— ๋งก๊ธฐ๋ฉด ๋ฒ„ํŠผ์ด ์ž˜๋ฆฐ๋‹ค
925
+ // โŒ ์ปจํŠธ๋กค ์ปฌ๋Ÿผ์— width ์ƒ๋žต โ€” ๊ธฐ๋ณธ ํญ(120px)์— ๋งก๊ธฐ๋ฉด ๋ฒ„ํŠผ์ด ์ž˜๋ฆฐ๋‹ค
830
926
  { name: 'move', label: '', field: 'id', render: () => <SButton label="์žฌ๊ณ  ์ด๋™" size="xs" /> },
831
927
  ];
832
928
  ```
833
929
 
930
+ #### ์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ์ปฌ๋Ÿผ
931
+
932
+ **์ •๋ ฌ ์ƒํƒœ๋Š” `STable` ์ด ๊ฐ–์ง€ ์•Š๋Š”๋‹ค.** ์ปฌ๋Ÿผ์— `sortable: true` ๋ฅผ ์ฃผ๊ณ , ํŽ˜์ด์ง€๊ฐ€ `sort` ยท `onSortChange` ๋กœ ์ƒํƒœ๋ฅผ ๋“ค๊ณ  ์žˆ๋Š”๋‹ค.
933
+
934
+ ```tsx
935
+ const [sort, setSort] = useState<STableSort | null>({ name: 'orderedAt', dir: 'desc' });
936
+
937
+ <STable
938
+ columns={columns}
939
+ rows={rows}
940
+ sort={sort}
941
+ onSortChange={setSort}
942
+ />
943
+ ```
944
+
945
+ - **์ •๋ ฌ์€ ์กฐํšŒ ์กฐ๊ฑด์ด๋‹ค.** ์„œ๋ฒ„ ์ •๋ ฌ์ด๋ฉด `?sort=createdAt&dir=desc` ๊ฐ€ ๊ณง ์š”์ฒญ์ด๊ณ , ๋’ค๋กœ๊ฐ€๊ธฐยท์ƒˆ๋กœ๊ณ ์นจยท๋งํฌ ๊ณต์œ ๋กœ ๋ณต์›๋ผ์•ผ ํ•œ๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ณธ์„ ๋“ค๋ฉด URL ๊ณผ ํ™”๋ฉด์ด ์–ด๊ธ‹๋‚œ๋‹ค โ€” `SExpansionList` ์˜ ์„ ํƒ์„ ์•ฑ์ด ๋“œ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด์œ ๋‹ค (ยง3-7-7).
946
+ - **ํ–‰์„ ์‹ค์ œ๋กœ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ๋„ ํŽ˜์ด์ง€ ๋ชซ์ด๋‹ค.** `STable` ์€ ๋ฐ›์€ ์ˆœ์„œ๋Œ€๋กœ ๊ทธ๋ฆฐ๋‹ค.
947
+ - **๋™์ž‘** โ€” ํ—ค๋” ํด๋ฆญ ์‹œ `asc โ†’ desc โ†’ ํ•ด์ œ` 3๋‹จ. ๋‹ค๋ฅธ ์—ด์„ ๋ˆ„๋ฅด๋ฉด ๊ทธ ์—ด์˜ `asc` ๋กœ ์‹œ์ž‘ํ•œ๋‹ค. ํ•ด์ œ๋˜๋ฉด `onSortChange(null)`.
948
+ - **์•„์ด์ฝ˜** โ€” ๋ฏธ์ •๋ ฌ `updown`, ์˜ค๋ฆ„ `arrowUp`, ๋‚ด๋ฆผ `arrowDown`. ์ •๋ ฌ ์ค‘์ธ ์—ด๋งŒ `action` ์ƒ‰์œผ๋กœ ์˜ฌ๋ผ์˜จ๋‹ค. `SGhostButton size="xxs"` ๋กœ ๊ทธ๋ ค์ง€๋ฏ€๋กœ ์ง์ ‘ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
949
+ - **ํด๋ฆญ ์˜์—ญ์€ ์ •๋ ฌ ๋ฒ„ํŠผ๋ฟ์ด๋‹ค.** ํ—ค๋” ์…€ ์ „์ฒด๋ฅผ ๋ˆ„๋ฅด๊ฒŒ ํ•˜์ง€ ์•Š๋Š”๋‹ค โ€” ๋ผ๋ฒจ์„ ๋“œ๋ž˜๊ทธํ•ด ๊ณ ๋ฅด๊ฑฐ๋‚˜ `helpText` ์•„์ด์ฝ˜์— hover ํ•˜๋Š” ๊ฒƒ๊ณผ ๋’ค์„ž์ธ๋‹ค.
950
+ - **๋‹ค์ค‘ ์ •๋ ฌ์€ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.** ํ•œ ๋ฒˆ์— ํ•œ ์—ด์ด๋‹ค.
951
+ - `renderHeader` ๋กœ ํ—ค๋”๋ฅผ ํ†ต์งธ๋กœ ๊ต์ฒดํ•˜๋ฉด ์ •๋ ฌ ์•„์ด์ฝ˜๋„ ํด๋ฆญ๋„ ๊ทธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค โ€” ํ—ค๋” ์ „์ฒด๊ฐ€ ์†Œ๋น„ ์•ฑ ์ฑ…์ž„์ด ๋œ๋‹ค.
952
+
834
953
  #### ๊ฐ’์ด ์—†๋Š” ์…€์€ ํšŒ์ƒ‰ ํ•˜์ดํ”ˆ
835
954
 
836
955
  ์…€์„ **๋นˆ์นธ์œผ๋กœ ๋‘์ง€ ์•Š๋Š”๋‹ค.** ๊ฐ’์ด `null` ยท `undefined` ยท ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด `-` ๋ฅผ `text-fg-tertiary`(`grey_65`)๋กœ ํ‘œ์‹œํ•œ๋‹ค.
@@ -842,9 +961,9 @@ const emptyCell = <span className="text-fg-tertiary">-</span>;
842
961
  const hasValue = (v: unknown) => v !== null && v !== undefined && v !== '';
843
962
 
844
963
  const columns: STableColumn[] = [
845
- { name: 'memo', label: '๋ฉ”๋ชจ', field: 'memo',
964
+ { name: 'memo', label: '๋ฉ”๋ชจ', field: 'memo', width: 240,
846
965
  render: (row: SRow) => (hasValue(row.memo) ? row.memo : emptyCell) },
847
- { name: 'price', label: 'ํŒ๋งค๊ฐ€', field: 'price', width: '120px', align: 'right',
966
+ { name: 'price', label: 'ํŒ๋งค๊ฐ€', field: 'price', width: 120, align: 'right',
848
967
  render: (row: SRow) =>
849
968
  hasValue(row.price) ? `${Number(row.price).toLocaleString()}์›` : emptyCell },
850
969
  ];
@@ -852,6 +971,54 @@ const columns: STableColumn[] = [
852
971
 
853
972
  `0` ์€ ๊ฐ’์ด ์žˆ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ํ•˜์ดํ”ˆ์œผ๋กœ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค โ€” `0์›` ๊ทธ๋Œ€๋กœ ํ‘œ์‹œํ•œ๋‹ค.
854
973
 
974
+ #### ๋ผ๋ฒจ๋งŒ์œผ๋กœ ๋œป์ด ์•ˆ ํ†ตํ•˜๋Š” ์ปฌ๋Ÿผ์€ `helpText`
975
+
976
+ ํ—ค๋” ๋ผ๋ฒจ์€ ์ปฌ๋Ÿผ ํญ ์•ˆ์— ๋“ค์–ด๊ฐ€์•ผ ํ•ด์„œ ์งง์•„์ง„๋‹ค. **์‚ฐ์ถœ ๊ธฐ์ค€ยท๋‹จ์œ„ยท์ƒํƒœ ๊ฐ’์˜ ๋œป์ฒ˜๋Ÿผ ๋ผ๋ฒจ์— ๋‹ด๊ธฐ์ง€ ์•Š๋Š” ์„ค๋ช…์€ `column.helpText` ๋กœ ์ค€๋‹ค** โ€” ๋ผ๋ฒจ ๋’ค์— ๋„์›€๋ง ์•„์ด์ฝ˜์ด ๋ถ™๊ณ  hover ํ•˜๋ฉด ํˆดํŒ์ด ๋œฌ๋‹ค. ๋ฐฐ์—ด์˜ ๊ฐ ํ•ญ๋ชฉ์ด ํ•œ ์ค„์ด๋‹ค. `SKeyValueTable` ์˜ `field.helpText`, `SSectionHeaderCard` ์˜ `helpText` ์™€ ๊ฐ™์€ ๊ฒƒ์ด๋‹ค.
977
+
978
+ ํŒ๋‹จ ๊ธฐ์ค€ ํ•œ ์ค„: *์ปฌ๋Ÿผ ์ œ๋ชฉ์ด ์ค„์ž„๋งยท์‚ฌ๋‚ด ์šฉ์–ดยท๊ณ„์‚ฐ์‹์ด๊ฑฐ๋‚˜, ๊ฐ’์ด ์•„๋‹ˆ๋ผ ์—ด ์ž์ฒด์˜ ์„ค๋ช…์ด ํ•„์š”ํ•  ๋•Œ ํ—ค๋”์— ๋‹จ๋‹ค.*
979
+
980
+ ```tsx
981
+ const columns: STableColumn[] = [
982
+ { name: 'orderCount', label: '์ฃผ๋ฌธ ์ˆ˜', field: 'orderCount', width: 120, align: 'right',
983
+ helpText: ['์ทจ์†Œยท๋ฐ˜ํ’ˆ์„ ์ œ์™ธํ•œ ํ™•์ • ์ฃผ๋ฌธ ์ˆ˜์ž…๋‹ˆ๋‹ค.'],
984
+ format: (v: number) => `${Number(v).toLocaleString()}๊ฑด` },
985
+ { name: 'status', label: '์ƒํƒœ', field: 'status', width: 100, align: 'center',
986
+ helpText: ['ํ™œ์„ฑ: ์ตœ๊ทผ 30์ผ ๋‚ด ์ฃผ๋ฌธ ์žˆ์Œ', '๋ณด๊ด€๋จ: ๊ฑฐ๋ž˜ ์ข…๋ฃŒ'] },
987
+ ];
988
+ ```
989
+
990
+ - **`renderHeader` ๋กœ ํ—ค๋”๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด `STooltip` ์„ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค.** `renderHeader` ๋Š” ํ—ค๋” ์ „์ฒด๋ฅผ ๊ต์ฒดํ•˜๋ฏ€๋กœ `helpText` ๊ฐ€ ๋ฌด์‹œ๋˜๊ณ , ์•„์ด์ฝ˜ยทํฌ๊ธฐยท์ƒ‰ยท๊ฐ„๊ฒฉ์„ ์†์œผ๋กœ ๋งž์ถ”๊ฒŒ ๋œ๋‹ค.
991
+ - **๋ชจ๋“  ์ปฌ๋Ÿผ์— ๋‹ฌ์ง€ ์•Š๋Š”๋‹ค.** ๋ผ๋ฒจ๋กœ ๋œป์ด ํ†ตํ•˜๋Š” ์ปฌ๋Ÿผ(`์ฃผ๋ฌธ๋ฒˆํ˜ธ`ยท`์ƒํ’ˆ๋ช…`)๊นŒ์ง€ ๋ถ™์ด๋ฉด ํ—ค๋”๊ฐ€ ์•„์ด์ฝ˜์œผ๋กœ ๋’ค๋ฎ์—ฌ ์ •์ž‘ ์„ค๋ช…์ด ํ•„์š”ํ•œ ์ปฌ๋Ÿผ์ด ๋ฌปํžŒ๋‹ค.
992
+ - ๊ธด ๋ฌธ์žฅ์„ ๋„ฃ๋Š” ์ž๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋‹ค. ํ•œ ์ค„์— ํ•œ ๊ฐ€์ง€ ์‚ฌ์‹ค๋งŒ ๋‹ด๊ณ , ๊ทธ ์ด์ƒ์€ ํŽ˜์ด์ง€ ์ƒ๋‹จ ์•ˆ๋‚ด(`SCallout`)๋กœ ๋บ€๋‹ค.
993
+ - ์•„์ด์ฝ˜๋„ ํญ์„ ๋จน๋Š”๋‹ค โ€” ํ—ค๋” ํญ ๊ณ„์‚ฐ์— ๋„ฃ๋Š”๋‹ค.
994
+
995
+ #### ํ—ค๋”์— ๋ถ™๋Š” ๊ฒƒ๋“ค์˜ ์ˆœ์„œ ยท ์—ด์„ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฃจ๋Š”์ง€ ์•Œ๋ฆฌ๋Š” ํ‘œ์‹
996
+
997
+ ํ—ค๋” ๋ผ๋ฒจ ๋’ค์— ๋ถ™๋Š” ๊ฒƒ์€ ๋„ค ๊ฐ€์ง€๊ณ , **์ˆœ์„œ๋Š” `STable` ์ด ๊ณ ์ •ํ•œ๋‹ค.** ์†Œ๋น„ ์•ฑ์ด ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.
998
+
999
+ ```text
1000
+ ๋ผ๋ฒจ [helpText ?] [editable] [navigable] [required *] [sortable ์ •๋ ฌ๋ฒ„ํŠผ]
1001
+ ```
1002
+
1003
+ **`editable` ์€ ๊ฐ’์„ ์ง์ ‘ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” ์—ด, `navigable` ์€ ๋ˆŒ๋Ÿฌ์„œ ๋‹ค๋ฅธ ํ™”๋ฉด์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ์—ด์— ์ค€๋‹ค.** ๋‘˜ ๋‹ค **ํ‘œ์‹์ผ ๋ฟ ๋ฒ„ํŠผ์ด ์•„๋‹ˆ๋‹ค** โ€” ์•„์ด์ฝ˜ยทํฌ๊ธฐยท์ƒ‰์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ณ ์ •ํ•˜๊ณ  ํด๋ฆญ์€ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
1004
+
1005
+ ```tsx
1006
+ const columns: STableColumn[] = [
1007
+ { name: 'name', label: '์ƒํ’ˆ๋ช…', field: 'name', width: 200,
1008
+ navigable: true,
1009
+ render: (row: SRow) => <STextLink label={row.name} onClick={() => goDetail(row.id)} /> },
1010
+ { name: 'stock', label: '์žฌ๊ณ ', field: 'stock', width: 160, contentType: 'control',
1011
+ editable: true, required: true,
1012
+ render: (row: SRow) => <SNumberInput value={row.stock} width="100%" /> },
1013
+ ];
1014
+ ```
1015
+
1016
+ - **์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒ ๋™์ž‘ํ•˜๋Š” ์—ด์—๋งŒ ์ผ ๋‹ค.** ํ‘œ์‹๋งŒ ์ผœ๊ณ  ์…€์€ ํ…์ŠคํŠธ ๊ทธ๋Œ€๋กœ ๋‘๋ฉด, ๊ณ ์น  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ด ๋†“๊ณ  ๊ณ ์น  ๋ฐฉ๋ฒ•์ด ์—†๊ณ  ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ด ๋†“๊ณ  ๋ˆ„๋ฅผ ๊ฒƒ์ด ์—†๋‹ค. `editable` ์ด๋ฉด ์…€์— ์ž…๋ ฅ ์ปจํŠธ๋กค์ด, `navigable` ์ด๋ฉด ์…€์— ๋งํฌยทํด๋ฆญ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
1017
+ - **ํ‘œ์‹์œผ๋กœ ๋™์ž‘์„ ๋Œ€์‹ ํ•˜์ง€ ์•Š๋Š”๋‹ค.** ๊ณ ์น˜๋Š” UI ๋„ ๋„˜์–ด๊ฐ€๋Š” ๋™์ž‘๋„ ์…€(`column.render`) ๋ชซ์ด๋‹ค.
1018
+ - **`renderHeader` ๋กœ ํ—ค๋”๋ฅผ ํ†ต์งธ๋กœ ๊ต์ฒดํ•˜๋ฉด ํ‘œ์‹๋„ `required` ๋„ ๊ทธ๋ ค์ง€์ง€ ์•Š๋Š”๋‹ค** โ€” ํ—ค๋” ์ „์ฒด๊ฐ€ ์†Œ๋น„ ์•ฑ ์ฑ…์ž„์ด ๋˜๋ฏ€๋กœ ์ˆœ์„œยทํฌ๊ธฐยท์ƒ‰์„ ์†์œผ๋กœ ๋งž์ถ”๊ฒŒ ๋œ๋‹ค.
1019
+
1020
+ **๊ฐ’์„ ๋ฐ˜๋“œ์‹œ ์ฑ„์›Œ์•ผ ํ•˜๋Š” ์—ด์—๋Š” `column.required`** ๋ฅผ ์ค€๋‹ค โ€” ๋ผ๋ฒจ ๋’ค์— `*` ๊ฐ€ ๋ถ™๋Š”๋‹ค. `SKeyValueTable` ์˜ `field.required` ์™€ ๊ฐ™์€ ๊ฒƒ์ด๋‹ค. **์ฝ๊ธฐ ์ „์šฉ ์—ด์— ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค** โ€” ํ‘œ์‹œ๋งŒ ์žˆ๊ณ  ์ฑ„์šธ ๋ฐฉ๋ฒ•์ด ์—†์–ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ง‰ํžŒ๋‹ค.
1021
+
855
1022
  ### 3-5. ๋ฒ„ํŠผ๋ฅ˜
856
1023
 
857
1024
  | ์ƒํ™ฉ | ์‚ฌ์šฉ |
@@ -861,6 +1028,7 @@ const columns: STableColumn[] = [
861
1028
  | **์•„์ด์ฝ˜ ํ•˜๋‚˜๋กœ ๋œป์ด ํ†ตํ•˜๋Š” ๋ถ€๊ฐ€ ์กฐ์ž‘** | **`SGhostButton`** โ€” ๋ผ๋ฒจ์ด ์—†๋Š” ์•„์ด์ฝ˜ ์ „์šฉ ๋ฒ„ํŠผ (์•„๋ž˜ 3-5-5) |
862
1029
  | ๋ณธ๋ฌธ ์† ์ด๋™ ๋งํฌ | `STextLink` |
863
1030
  | ๋ฉ”์ธ ์•ก์…˜ + ๋ถ€๊ฐ€ ๋ฉ”๋‰ด | `SDropdownButton` |
1031
+ | **GNB system ํŒจ๋„์˜ ํ•œ ์ค„ ์•ก์…˜** | **`SSystemActionButton`** โ€” ํ–‰ ์ „์ฒด๊ฐ€ ๋ฒ„ํŠผ์ธ ํ‘œ๋ฉดํ˜• (์•„๋ž˜ 3-5-7) |
864
1032
 
865
1033
  #### 3-5-1. ์ฑ„์›€ ๋ฒ„ํŠผ์€ ํŽ˜์ด์ง€๋‹น ๊ฐœ์ˆ˜ ์ œํ•œ์ด ์žˆ๋‹ค
866
1034
 
@@ -875,6 +1043,19 @@ const columns: STableColumn[] = [
875
1043
 
876
1044
  `SDropdownButton` ๋„ ๊ฐ™์€ ๊ทœ์น™์„ ๋”ฐ๋ฅด๋ฉฐ, **ํŽ˜์ด์ง€๋‹น `primary` ์ฑ„์›€ 1๊ฐœ ๊ณ„์‚ฐ์— ํฌํ•จ**๋œ๋‹ค.
877
1045
 
1046
+ ##### ๋ฌด์—‡์ด ์–ด๋А ์œ„๊ณ„์ธ๊ฐ€
1047
+
1048
+ ๊ฐœ์ˆ˜๋งŒ์œผ๋กœ๋Š” ํ›„๋ณด๊ฐ€ ์—ฌ๋Ÿฟ์ผ ๋•Œ ์–ด๋А ๊ฒƒ์„ ์˜ฌ๋ฆด์ง€ ๊ฐˆ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ๊ธฐ์ค€์€ **๊ทธ ์กฐ์ž‘์ด ๋ฌด์—‡์— ๋ฏธ์น˜๋Š”๊ฐ€**๋‹ค.
1049
+
1050
+ | ์œ„๊ณ„ | ๋ฌด์—‡์— ์“ฐ๋‚˜ |
1051
+ | --- | --- |
1052
+ | `primary` ์ฑ„์›€ | **ํŽ˜์ด์ง€ ์ „์ฒด์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ •**ํ•˜๋Š” ์‹คํ–‰ (ํผ ์ €์žฅ, ์ƒ์„ธ ์ˆ˜์ • ํ™•์ •, ์ผ๊ด„ ๋ฐ˜์˜) |
1053
+ | `secondary` ์ฑ„์›€ | **ํŽ˜์ด์ง€ ์•ˆ ์ค‘์‹ฌ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ** (์„ ํƒ ํ•ญ๋ชฉ ์ƒํƒœ ๋ณ€๊ฒฝ, ๋ฐœ์†ก, ์Šน์ธ) |
1054
+ | `outline` (`neutral` ยท `primary`) | ๋‹จ์ˆœ ๋“ฑ๋ก, ์„ค์ • ๋ณ€๊ฒฝ, ์ด๋™ยท์ทจ์†Œ |
1055
+
1056
+ - **`primary` ์ฑ„์›€์€ ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ์‹คํ–‰ ํ•˜๋‚˜์—๋งŒ ์“ด๋‹ค. ๊ทธ๋Ÿฐ ์กฐ์ž‘์ด ์—†์œผ๋ฉด ํŽ˜์ด์ง€์— `primary` ๊ฐ€ ์—†์–ด๋„ ๋œ๋‹ค.** ๊ฐœ์ˆ˜ ์ œํ•œ์ด "๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค"๋Š” ๋œป์€ ์•„๋‹ˆ๋‹ค.
1057
+ - **`secondary` ์—ฐ์† ๋ฐฐ์น˜ ๊ธˆ์ง€๋Š” ์„น์…˜์ด ๋‹ค๋ฅด๋ฉด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.** ์„น์…˜๋งˆ๋‹ค ๋…๋ฆฝ ์ธ๋ผ์ธ ํผ์ด ์žˆ๋Š” ์ƒ์„ธ ํŽ˜์ด์ง€(ยง4-4)๊ฐ€ ๊ทธ๋ ‡๋‹ค โ€” ๋‚˜๋ž€ํžˆ ๋†“์ธ ๋‘ ๋ฒ„ํŠผ์ด ๊ฐ™์€ ํŒ๋‹จ ๋‹จ์œ„ ์•ˆ์— ์žˆ์„ ๋•Œ์˜ ๊ทœ์น™์ด๋‹ค.
1058
+
878
1059
  #### 3-5-2. `size` ๋Š” ๋†“์ด๋Š” ์œ„์น˜๊ฐ€ ์ •ํ•œ๋‹ค
879
1060
 
880
1061
  | ์œ„์น˜ | size |
@@ -980,6 +1161,98 @@ const columns: STableColumn[] = [
980
1161
  </div>
981
1162
  ```
982
1163
 
1164
+ #### 3-5-7. `SSystemActionButton` โ€” GNB system ํŒจ๋„์˜ ํ•œ ์ค„ ์•ก์…˜
1165
+
1166
+ **ํ–‰ ์ „์ฒด๊ฐ€ ํ•˜๋‚˜์˜ ๋ฒ„ํŠผ**์ธ ํ‘œ๋ฉดํ˜• ์ปจํŠธ๋กค์ด๋‹ค. ์•„์ด์ฝ˜ ํ”„๋ ˆ์ž„ + ๋ผ๋ฒจ + ์šฐ์ธก ์•ก์…˜์ด ํ•œ ์ค„์— ๋ถ™๊ณ , hover ํ•˜๋ฉด ํ‘œ๋ฉด์ƒ‰์ด ํ•œ ๋‹จ๊ณ„ ๋ฐ”๋€๋‹ค.
1167
+
1168
+ | ์ƒํ™ฉ | ์‚ฌ์šฉ |
1169
+ | --- | --- |
1170
+ | ํŽ˜์ด์ง€ยท๋ชจ๋‹ฌ์˜ ์ผ๋ฐ˜ ์•ก์…˜ | `SButton` โ€” ๋ผ๋ฒจ ํญ๋งŒํผ๋งŒ ์ฐจ์ง€ํ•œ๋‹ค |
1171
+ | ๋ชฉ๋ก์—์„œ ํ•ญ๋ชฉ ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅด๊ฒŒ ํ•œ๋‹ค | `SListItem` ยท `STree` (ยง3-7-6ยทยง3-7-7) |
1172
+ | ์ขŒ์ธก ๋‚ด๋น„๊ฒŒ์ด์…˜์˜ ๋ฉ”๋‰ด | `SGnb` ์˜ `menus` (ยง4-1) |
1173
+ | **GNB system ํŒจ๋„์—์„œ ์„ค์ •ยท์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ํ•œ ์ค„์”ฉ ์Œ“๊ณ , ๊ทธ ์ค„์„ ๋ˆŒ๋Ÿฌ ๋“ค์–ด๊ฐ€๊ฒŒ ํ•œ๋‹ค** | **`SSystemActionButton`** |
1174
+
1175
+ **๋ฌด์—‡์ด ๊ทธ๋ ค์ง€๋Š”์ง€๋Š” `type` ์ด ์ •ํ•œ๋‹ค.** ํƒ€์ž…๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฐ’๋งŒ `option` ์œผ๋กœ ๋ฐ›์œผ๋ฏ€๋กœ, ํƒ€์ž…์— ๋งž์ง€ ์•Š๋Š” `option` ์€ ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ๋œ๋‹ค.
1176
+
1177
+ | `type` | ์„ ํ–‰ ์•„์ด์ฝ˜ | ๋ผ๋ฒจ | ์šฐ์ธก | ์–ธ์ œ |
1178
+ | --- | --- | --- | --- | --- |
1179
+ | `account` | `user` ๊ณ ์ • | `label` | ์—†์Œ | ๋กœ๊ทธ์ธํ•œ ๊ณ„์ •์„ ๋ณด์—ฌ์ค„ ๋•Œ. ๋ˆ„๋ฅด๋ฉด **์–ธ์ œ๋‚˜** ๊ณ„์ • ๋ฆฌ์ŠคํŠธ๋ฐ•์Šค๊ฐ€ ๋œฌ๋‹ค โ€” `option` ํ•„์ˆ˜ (ยง3-5-8) |
1180
+ | `select` | `option.icon` (ํ•„์ˆ˜) | `label` | ํ™”์‚ดํ‘œ | ๋ˆŒ๋Ÿฌ์„œ ํ•˜์œ„ ํ™”๋ฉด์œผ๋กœ ๋“ค์–ด๊ฐˆ ๋•Œ |
1181
+ | `switch` | `option.icon` (ํ•„์ˆ˜) | `label` | `option.text` + ์ƒˆ๋กœ๊ณ ์นจ | ์ง€๊ธˆ ๋ถ™์–ด ์žˆ๋Š” ๋Œ€์ƒ์„ ๊ฐˆ์•„ ๋ผ์šธ ๋•Œ |
1182
+ | `subSelect` | `option.icon` (ํ•„์ˆ˜) | `label` | ์ง€๊ธˆ ๊ฐ’ + ํ™”์‚ดํ‘œ | ๊ฐ’์„ ๋ณด์—ฌ์ฃผ๊ณ  **๋ˆŒ๋Ÿฌ์„œ ๋ฐ”๊ฟ€** ๋•Œ. ๋ˆ„๋ฅด๋ฉด ์–ธ์ œ๋‚˜ ๋ฉ”๋‰ด๊ฐ€ ๋œฌ๋‹ค โ€” `option.options` ํ•„์ˆ˜ |
1183
+ | `status` | ์—†์Œ | ์ƒํƒœ ํƒœ๊ทธ(๊ณ ๋ฅธ ์นธ์˜ `color`ยท`label`) | ํ™”์‚ดํ‘œ | ์ƒํƒœ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  **๋ˆŒ๋Ÿฌ์„œ ๋ฐ”๊ฟ€** ๋•Œ. ๋ˆ„๋ฅด๋ฉด ์–ธ์ œ๋‚˜ ๋ฉ”๋‰ด๊ฐ€ ๋œฌ๋‹ค โ€” `option.options` ํ•„์ˆ˜ |
1184
+
1185
+ - **`SPage` ๋ณธ๋ฌธ์— ์ง์ ‘ ๋†“์ง€ ์•Š๋Š”๋‹ค.** ํญ์„ ๊ฐ€๋“ ์ฑ„์šฐ๋Š” ํ–‰์ด๋ผ ํŽ˜์ด์ง€์— ๋ฐ”๋กœ ๋†“์œผ๋ฉด ํ‘œ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. GNB system ํŒจ๋„ยท`SDrawer`ยท`SPopover` ์ฒ˜๋Ÿผ **์ข์€ ํญ์ด ์ •ํ•ด์ง„ ์ž๋ฆฌ**์— ์Œ“๋Š”๋‹ค. ํ–‰ ์‚ฌ์ด ๊ฐ„๊ฒฉ์€ `--cmp-gnb-system-panel-gap` ์ด๋‹ค.
1186
+ - **GNB ์˜ system ์ž๋ฆฌ(๋งจ ์•„๋ž˜ ํŒ ยท ์ „ํญ ์ƒ๋‹จ๋ฐ”)์— ๋†“๋Š” ๊ฒƒ์ด๋ผ๋ฉด ์ด ๋ฒ„ํŠผ์„ ์ง์ ‘ ๋ฐฐ์น˜ํ•˜์ง€ ๋ง๊ณ  `SGnbSystem` ์˜ `actions` ์— ๋„˜๊ธด๋‹ค** (ยง4-1). ํŒจ๋„์˜ ๋ฐฐ๊ฒฝยท๊ตฌ๋ถ„์„ ยท๋„๋ฉ”์ธ ํƒœ๊ทธยท์•Œ๋ฆผยท๊ณ„์ •๊นŒ์ง€ ํ•œ ๋ฒŒ๋กœ ๊ทธ๋ ค์ฃผ๋ฏ€๋กœ, ์กฐ๊ฐ์„ ์†์œผ๋กœ ์กฐ๋ฆฝํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค. **๋‹จ `type="account"` ๋Š” `actions` ๊ฐ€ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค** โ€” ๊ณ„์ • ํ–‰์€ ํŒจ๋„์— ํ•˜๋‚˜๋ฟ์ด๊ณ  ์ž๋ฆฌ๋„ ๋งจ ์•„๋ž˜๋กœ ์ •ํ•ด์ ธ ์žˆ์–ด `account` prop ์ด ๋”ฐ๋กœ ์žˆ๋‹ค (ยง3-5-8).
1187
+ - **`color` ๋Š” ๋†“์ด๋Š” ํ‘œ๋ฉด์„ ๋”ฐ๋ผ๊ฐ„๋‹ค** โ€” ํฐ ๋ฉด์ด๋ฉด `light`, ์˜ค์…˜๋ธ”๋ฃจ ๋ฉด์ด๋ฉด `dark`, ๋„ค์ด๋น„ ๋ฉด์ด๋ฉด `darker`. ๋ฐฐ๊ฒฝ๊ณผ ๋‹ค๋ฅธ ์ƒ‰์„ ๊ณ ๋ฅด๋ฉด ๋ฒ„ํŠผ๋งŒ ๋–  ๋ณด์ธ๋‹ค.
1188
+ - **์ƒํƒœ๋Š” defaultยทhover ๋‘˜๋ฟ์ด๋‹ค.** ํ† ํฐ์— selected ๊ฐ€ ์—†์œผ๋ฏ€๋กœ "์ง€๊ธˆ ์—ด๋ ค ์žˆ๋Š” ํ•ญ๋ชฉ"์„ ์ด ๋ฒ„ํŠผ์œผ๋กœ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค. ์„ ํƒ ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•œ ์ž๋ฆฌ๋ฉด `SGnb` ๋ฉ”๋‰ด๋‚˜ `SListItem`(ยง3-7-6) ์ด๋‹ค.
1189
+ - **์„ ํ–‰ ์•„์ด์ฝ˜์ด ๋น„๋Š” ํ–‰์€ ์—†๋‹ค.** `account` ๋Š” `user` ๊ณ ์ •, `status` ๋Š” ํƒœ๊ทธ๊ฐ€ ์ž๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ณ , ๋‚˜๋จธ์ง€๋Š” `option.icon` ์ด ํ•„์ˆ˜๋‹ค.
1190
+ - **`account` ์˜ `option` ๋งŒ ์„ฑ๊ฒฉ์ด ๋‹ค๋ฅด๋‹ค** โ€” ์•„์ด์ฝ˜์ด ์•„๋‹ˆ๋ผ **๋ˆ„๋ฅด๋ฉด ๋œจ๋Š” ๊ณ„์ • ๋ฆฌ์ŠคํŠธ๋ฐ•์Šค์˜ ๋‚ด์šฉ**์ด๊ณ , **ํ•„์ˆ˜๋‹ค** (ยง3-5-8). ๋ˆŒ๋Ÿฌ๋„ ์•„๋ฌด๊ฒƒ๋„ ๋œจ์ง€ ์•Š๋Š” ๊ณ„์ • ํ–‰์€ ์—†๋‹ค โ€” ๊ณ„์ • ํ™”๋ฉด์œผ๋กœ ๋„˜๊ธฐ๋Š” ๊ฒƒ์€ ์ด ํ–‰์ด ์•„๋‹ˆ๋ผ ํŒจ๋„์˜ `accountSetting` ์ด ๋งก๋Š”๋‹ค.
1191
+ - **์šฐ์ธก ์•„์ด์ฝ˜์€ `type` ์ด ์ •ํ•˜๋ฏ€๋กœ ๋ฐ–์—์„œ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค.** ํ™”์‚ดํ‘œ๊ฐ€ ํ•„์š”ํ•œ๋ฐ ๋ฌธ๊ตฌ๊ฐ€ ์—†์œผ๋ฉด `select`, ๋ฌธ๊ตฌ๊ฐ€ ํ•จ๊ป˜ ํ•„์š”ํ•˜๋ฉด `subSelect` ๋‹ค.
1192
+ - **`subSelect` ยท `status` ๋Š” ์–ธ์ œ๋‚˜ ๊ฐ’ ๊ณ ๋ฅด๊ธฐ ๋ฉ”๋‰ด์˜ ํŠธ๋ฆฌ๊ฑฐ๋‹ค** โ€” ์ง€๊ธˆ ๊ฐ’์ด ์ ํ˜€ ์žˆ๋Š” ํ–‰์ด๋ผ ๋ˆ„๋ฅด๋ฉด ๊ทธ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ๋ฉ”๋‰ด๊ฐ€ ๋œฌ๋‹ค. ๊ทธ๋ž˜์„œ `option.options` ๊ฐ€ **ํ•„์ˆ˜**์ด๊ณ , ๋ฉ”๋‰ด๋Š” **ํ–‰ ์˜ค๋ฅธ์ชฝ์œผ๋กœ**, ํ–‰ ์œ„์ชฝ ๋์— ๋งž์ถฐ ํŽผ์ณ์ง„๋‹ค โ€” ์ด ํ–‰์€ ํŒ ์•ˆ์— ์„ธ๋กœ๋กœ ์Œ“์ด๋Š” ์ž๋ฆฌ๋ผ ์•„๋ž˜๋กœ ํŽด๋ฉด ๋ฐ”๋กœ ๋‹ค์Œ ํ–‰์„ ๋ฎ๋Š”๋‹ค. ๊ณ ๋ฅด๋ฉด `onChange(value)` ๊ฐ€ ๋Œ๋ฉฐ ๋‹ซํžŒ๋‹ค. **๋ฉ”๋‰ด๋ฅผ ์†์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค** โ€” ๋œจ๋Š” ์ž๋ฆฌยท๋‹ซํžˆ๋Š” ์‹œ์ ์ด ์–ด๊ธ‹๋‚œ๋‹ค. ๊ณ„์ • ํŒจ๋„์˜ ์–ธ์–ด ๋ณ€๊ฒฝ ํ–‰(ยง3-5-8)๋„ ๊ฐ™์€ ๋ฉ”๋‰ด์ด์ง€๋งŒ, ๊ทธ์ชฝ์€ ํŒ ์•ˆ์— ๊ฐ‡ํ˜€ ์žˆ์–ด ์šฐ์ธก ๊ฐ’ ์•„๋ž˜๋กœ ํŽธ๋‹ค.
1193
+
1194
+ ```tsx
1195
+ <SSystemActionButton
1196
+ type="subSelect" label="์ž‘์—… ๊ณต๊ฐ„"
1197
+ option={{ icon: 'board', value: workspaceId, options: WORKSPACES, onChange: setWorkspace }}
1198
+ />
1199
+ <SSystemActionButton
1200
+ type="status"
1201
+ option={{ value: status, options: STATUSES, onChange: setStatus }} // STATUSES: { value, label, color? }[]
1202
+ />
1203
+ ```
1204
+
1205
+ - **`value` ๋ฅผ ํ•จ๊ป˜ ์ค€๋‹ค.** ์šฐ์ธก ๊ฐ’(`subSelect`)ยท์ƒํƒœ ํƒœ๊ทธ(`status`)๋Š” `options` ์—์„œ ๊ฐ™์€ `value` ๋ฅผ ์ฐพ์•„ ๊ทธ `label`(๊ณผ `status` ๋Š” `color`)๋กœ ๊ทธ๋ฆฐ๋‹ค. ๋ชป ์ฐพ์œผ๋ฉด `value` ๋ฌธ์ž์—ด์ด ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ๋˜๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ๋งž์ถฐ ์ค€๋‹ค.
1206
+ - **๋ˆŒ๋Ÿฌ์„œ ๊ฐ’ ๊ณ ๋ฅด๋Š” ํ™”๋ฉด์œผ๋กœ ๋ณด๋‚ผ ๊ฒƒ์ด๋ฉด `select` ๋‹ค.** ๊ทธ ํƒ€์ž…์€ ํ–‰์„ ๋ˆ„๋ฅด๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ์•ก์…˜์ด๋ผ `onClick` ๋งŒ ๋ˆ๋‹ค. ์ƒํƒœ๋ฅผ **๋ณด์—ฌ์ฃผ๊ธฐ๋งŒ** ํ•  ๊ฒƒ์ด๋ฉด ์ด ๋ฒ„ํŠผ์ด ์•„๋‹ˆ๋ผ `STag`(ยง3-7-2) ๋‹ค โ€” ํ™”์‚ดํ‘œ๊ฐ€ ๋ถ™๋Š” ํ–‰์€ "๋ˆŒ๋Ÿฌ์„œ ๋ฐ”๊พผ๋‹ค"๋Š” ์•ฝ์†์ด๋‹ค.
1207
+ - **ํƒœ๊ทธ์˜ ์ƒ‰ยท์ด๋ฆ„์„ ๋ฐ–์—์„œ ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค** (`status`). `option.color`ยท`option.label` ์€ ์—†๋‹ค โ€” ์ง€๊ธˆ ์ƒํƒœ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” `options` ์นธ์ด ๊ณง ํƒœ๊ทธ๋‹ค. ์ƒ‰์ด ์ƒํƒœ์˜ ๋œป์ด๋ผ ๋‘˜์ด ์–ด๊ธ‹๋‚˜๋ฉด ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
1208
+ - **์ƒํƒœ ๋ฉ”๋‰ด์˜ ์ƒ‰์€ ์นธ๋งˆ๋‹ค ์ค€๋‹ค** โ€” ์ ๊ณผ ๊ธ€์ž๊ฐ€ ๊ทธ ์ƒํƒœ์˜ ์ƒ‰์œผ๋กœ ํ•จ๊ป˜ ๋ฌผ๋“ ๋‹ค. ์ƒํƒœ๋Š” ์ƒ‰ ์ž์ฒด๊ฐ€ ๋œป์ด๋ผ ๊ณ ๋ฅด๋Š” ์ž๋ฆฌ์—์„œ๋„ ์ƒ‰์„ ๋ณด๊ณ  ๊ณ ๋ฅธ๋‹ค.
1209
+ - `switch` ๋Š” ๋ฉ”๋‰ด๋ฅผ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค โ€” ์šฐ์ธก ๋ฌธ๊ตฌ๊ฐ€ "์ง€๊ธˆ ๊ฐ’"์ด ์•„๋‹ˆ๋ผ ๋ณด์กฐ ์กฐ์ž‘ ๋ฌธ๊ตฌ๋ผ, ๊ณ ๋ฅผ ๋ชฉ๋ก์ด ์žˆ์œผ๋ฉด ๊ทธ๊ฒƒ์€ `subSelect` ๋‹ค.
1210
+ - ๋†’์ดยท๋ผ์šด๋“œยท์•„์ด์ฝ˜ ํฌ๊ธฐยท์ขŒ์šฐ ์—ฌ๋ฐฑ์€ ์ „๋ถ€ ํ† ํฐ์ด ๋„ฃ๋Š”๋‹ค. ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
1211
+
1212
+ #### 3-5-8. `SAccountListBox` โ€” ๊ณ„์ • ํ–‰์„ ๋ˆŒ๋Ÿฌ ๋œจ๋Š” ๊ณ„์ • ํŒจ๋„
1213
+
1214
+ **"์ง€๊ธˆ ๋ˆ„๊ตฌ๋กœ ๋กœ๊ทธ์ธํ•ด ์žˆ๋Š”๊ฐ€"์™€ "์—ฌ๊ธฐ์„œ ๋‚˜๊ฐ„๋‹ค"๋ฅผ ํ•œ ์ž๋ฆฌ์— ๋ชจ์€ ํŒจ๋„**์ด๋‹ค. ์œ„์—์„œ๋ถ€ํ„ฐ [์‚ฌ์šฉ์ž์ •๋ณด(์ด๋ฉ”์ผ ยท ์ด๋ฆ„ + ๊ถŒํ•œ)] ยท [๊ณ„์ • ์„ค์ •] ยท [์–ธ์–ด ๋ณ€๊ฒฝ] ยท [๊ณ„์ • ๋กœ๊ทธ์•„์›ƒ] ์ด๋‹ค.
1215
+
1216
+ **์ง์ ‘ ๋„์šฐ์ง€ ์•Š๋Š”๋‹ค.** ๊ณ„์ • ํ–‰์— ๋ถ™์—ฌ ์—ฌ๋Š” ๊ฒƒ์€ ๋‘ ๊ณณ์ด ๋งก๋Š”๋‹ค โ€” ์–ด๋А ์ชฝ์ด๋“  ๋œจ๋Š” ๋ฐฉํ–ฅยท๋‹ซํžˆ๋Š” ์‹œ์ ์„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ •ํ•˜๋ฏ€๋กœ ์•ฑ์ด ํŒ์˜ค๋ฒ„๋ฅผ ์กฐ๋ฆฝํ•˜์ง€ ์•Š๋Š”๋‹ค. **๋‘ ๊ณณ ๋ชจ๋‘ ์ด ๋‚ด์šฉ์ด ํ•„์ˆ˜๋‹ค** โ€” ๊ณ„์ • ํ–‰์€ ์˜ˆ์™ธ ์—†์ด ์ด ํŒจ๋„์˜ ํŠธ๋ฆฌ๊ฑฐ๋ผ, ๋ˆŒ๋Ÿฌ๋„ ์•„๋ฌด๊ฒƒ๋„ ๋œจ์ง€ ์•Š๋Š” ๊ณ„์ • ํ–‰์€ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค.
1217
+
1218
+ | ์–ด๋””์— | ์–ด๋–ป๊ฒŒ |
1219
+ | --- | --- |
1220
+ | GNB ์˜ system ์ž๋ฆฌ (๊ธฐ๋ณธ) | `SGnbSystem` ์˜ `account.listBox` โ€” ํ•„์ˆ˜ (ยง4-1) |
1221
+ | system ๋ฐ–์˜ **์ข์€ ์„ธ๋กœ ํŒ ์•„๋ž˜์ชฝ** (SDrawerยทSPopover ํ•˜๋‹จ ๋“ฑ) | `SSystemActionButton type="account"` ์˜ `option` โ€” ํ•„์ˆ˜ |
1222
+
1223
+ ```tsx
1224
+ <SGnbSystem
1225
+ account={{
1226
+ label: userName,
1227
+ listBox: {
1228
+ email: user.email,
1229
+ name: user.name,
1230
+ authority: user.authority, // ์˜ต์…˜
1231
+ accountSetting: { onClick: openAccountSetting }, // ์˜ต์…˜
1232
+ language: { // ์˜ต์…˜
1233
+ value: languageCode,
1234
+ options: LANGUAGES, // ์ฃผ๋ฉด ํ•˜์œ„ ๋ฉ”๋‰ด๊ฐ€ ํŽผ์ณ์ง„๋‹ค
1235
+ onChange: setLanguage,
1236
+ },
1237
+ logout: { onClick: signOut },
1238
+ },
1239
+ }}
1240
+ />
1241
+ ```
1242
+
1243
+ - **`authority` ยท `accountSetting` ยท `language` ๋Š” ์˜ต์…˜์ด๊ณ , ์‚ฌ์šฉ์ž์ •๋ณด์™€ ๋กœ๊ทธ์•„์›ƒ ํ–‰์€ ๋Š˜ ์žˆ๋‹ค.** ์ด ํŒจ๋„์ด ์กด์žฌํ•˜๋Š” ์ด์œ ๊ฐ€ ๊ทธ ๋‘˜์ด๋‹ค. ์˜ต์…˜์„ ๋นผ๋ฉด ๊ทธ ์ค„์ด ํ†ต์งธ๋กœ ์‚ฌ๋ผ์ง€๊ณ  ๋‚˜๋จธ์ง€๊ฐ€ ์œ„๋กœ ๋ถ™์œผ๋ฏ€๋กœ, ์ค„์„ ์ง€์šฐ๋ ค๊ณ  ๋นˆ ๋ฌธ์ž์—ด์ด๋‚˜ ๋นˆ ๊ฐ์ฒด๋ฅผ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค (`accountSetting={{}}` ์€ "์ด ํ–‰์„ ์“ด๋‹ค" ๋Š” ๋œป์ด๋‹ค).
1244
+ - **๊ถŒํ•œ prop ์€ `authority` ๋‹ค (`role` ์•„๋‹˜).** `role` ์€ DOM ์˜ ARIA ์†์„ฑ์ด๋ผ, ๊ทธ ์ด๋ฆ„์„ ์“ฐ๋ฉด ์†Œ๋น„ ์•ฑ์˜ a11y lint ๊ฐ€ "์ตœ๊ณ  ๊ด€๋ฆฌ์ž" ๋ฅผ ARIA ๋กค๋กœ ์ฝ๊ณ  ์‹คํŒจํ•œ๋‹ค.
1245
+ - **`language` ๋ฅผ ์“ฐ๋ฉด `value` ๋ฅผ ํ•จ๊ป˜ ์ค€๋‹ค.** ์šฐ์ธก์— ๋ถ™๋Š” ๊ทธ ๊ฐ’์ด "์ง€๊ธˆ ๋ฌด์Šจ ์–ธ์–ด์ธ๊ฐ€" ๋‹ค โ€” ์—†์œผ๋ฉด ์šฐ์ธก์ด ๋น„์–ด ๋ˆŒ๋Ÿฌ์•ผ ์•Œ ์ˆ˜ ์žˆ๋Š” ํ–‰์ด ๋œ๋‹ค.
1246
+ - **์–ธ์–ด๋ฅผ ์•ฑ ์•ˆ์—์„œ ๋ฐ”๊พธ๋ฉด `language.options` ๋ฅผ ์ค€๋‹ค.** ๊ทธ ํ–‰์ด ์šฐ์ธก ๊ฐ’ ์•„๋ž˜๋กœ ํ•˜์œ„ ๋ฉ”๋‰ด๋ฅผ ํŽด๊ณ , ๊ณ ๋ฅด๋ฉด `onChange(value)` ๊ฐ€ ๋Œ๋ฉฐ ํ•˜์œ„ ๋ฉ”๋‰ด์™€ ๊ณ„์ • ํŒจ๋„์ด ํ•จ๊ป˜ ๋‹ซํžŒ๋‹ค. `value` ๋Š” `options` ์˜ `value` ์™€ ๋งž์ถ”๋ฉด ๋˜๊ณ , ์šฐ์ธก์—๋Š” ๊ทธ ํ•ญ๋ชฉ์˜ `label` ์ด ์ ํžŒ๋‹ค. **ํ•˜์œ„ ๋ฉ”๋‰ด๋ฅผ ์†์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค** โ€” ๋œจ๋Š” ์ž๋ฆฌยท๋‹ซํžˆ๋Š” ์‹œ์ ์ด ์–ด๊ธ‹๋‚œ๋‹ค.
1247
+ - **์–ธ์–ด๋ฅผ ๊ณ ๋ฅด๋Š” ํ™”๋ฉด์ด ๋”ฐ๋กœ ์žˆ์œผ๋ฉด `options` ๋ฅผ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.** ๊ทธ๋Ÿฌ๋ฉด ํ–‰์„ ๋ˆ„๋ฅด๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ์•ก์…˜์ด๋ผ `onClick` ์ด ๋Œ๊ณ  ๊ณ„์ • ํŒจ๋„์ด ๋‹ซํžŒ๋‹ค. ๋‘˜์„ ๊ฐ™์ด ์ฃผ๋ฉด ํ™”๋ฉด์œผ๋กœ ๊ฐ€์ง€ ์•Š๊ณ  ๋ฉ”๋‰ด๋งŒ ํŽด์ง„๋‹ค.
1248
+ - ํ•˜์œ„ ๋ฉ”๋‰ด๊ฐ€ ์—ด๋ ค ์žˆ๋Š” ๋™์•ˆ ๊ณ„์ • ํŒจ๋„์€ ๋‹ซํžˆ์ง€ ์•Š๋Š”๋‹ค โ€” ์–ธ์–ด๋ฅผ ๊ณ ๋ฅด๋Š” ์ผ์ด ์•„์ง ๋๋‚˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
1249
+ - **ํ–‰ ์•„์ด์ฝ˜์€ ๋ฐ–์—์„œ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค.** ๋ฌด์—‡์„ ํ•˜๋Š” ํ–‰์ธ์ง€๊ฐ€ ๊ณง ๊ทธ ํ–‰์˜ ์ •์ฒด๋‹ค. ์„œ๋น„์Šค ๋ฌธ๊ตฌ๊ฐ€ ๋‹ค๋ฅด๋ฉด `label` ๋งŒ ๋ฐ”๊พผ๋‹ค.
1250
+ - **ํญ์„ ๋Š˜๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.** `--cmp-gnb-system-accountListBox-width` ๊ฐ€ ์ •ํ•˜๋Š” ๊ณ ์ • ํญ์ด๋‹ค โ€” GNB ํญ์— ๋งž์ถฐ ๋œจ๋Š” ํŒจ๋„์ด๋ผ ๋Š˜๋ฆฌ๋ฉด ํ–‰ ์—ฌ๋ฐฑ์ด ์–ด๊ธ‹๋‚œ๋‹ค.
1251
+ - **ํ™”๋ฉด ์œ„์ชฝ์— ๊ณ„์ • ํ–‰์„ ์ง์ ‘ ์„ธ์šฐ์ง€ ์•Š๋Š”๋‹ค.** system ๋ฐ–์— ์„ธ์šด ๊ณ„์ • ํ–‰์˜ ํŒจ๋„์€ **๋Š˜ ํ–‰ ์œ„๋กœ** ํŽผ์ณ์ง„๋‹ค โ€” ๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ๋Š” prop ์ด ์—†์œผ๋ฏ€๋กœ ์œ„๊ฐ€ ํ™”๋ฉด ๋์ธ ์ž๋ฆฌ(์•ฑ ์ƒ๋‹จ๋ฐ”ยทํ—ค๋”)์— ๋‘๋ฉด ์ž˜๋ฆฐ๋‹ค. ์•ฑ ์ƒ๋‹จ๋ฐ”์˜ ๊ณ„์ •์€ ์†์œผ๋กœ ๋งŒ๋“ค์ง€ ๋ง๊ณ  `SGnb` ์˜ `system` ์Šฌ๋กฏ์— ๋งก๊ธด๋‹ค(`header="full"` ์ด๋ฉด ์กฐ๊ฐ๋“ค์ด ์ƒ๋‹จ๋ฐ” ์˜ค๋ฅธ์ชฝ ๋์œผ๋กœ ์˜ฌ๋ผ๊ฐ€๊ณ , ๊ทธ ์ž๋ฆฌ์—์„œ๋Š” ํŒจ๋„์ด ์•„๋ž˜๋กœ ํŽผ์ณ์ง„๋‹ค โ€” ยง4-1).
1252
+ - **๋œจ๋Š” ๋ฐฉํ–ฅ์€ prop ์ด ์•„๋‹ˆ๋‹ค โ€” ๋†“์ธ ์ž๋ฆฌ๊ฐ€ ์ •ํ•œ๋‹ค.** ํŒ์ด๋ฉด ๊ณ„์ • ํ–‰์ด ๋งจ ์•„๋ž˜์— ์žˆ์œผ๋ฏ€๋กœ **์œ„๋กœ ยท ํ–‰ ์™ผ์ชฝ ๋์— ๋งž์ถฐ**, ์ „ํญ ์ƒ๋‹จ๋ฐ”๋ฉด **์•„๋ž˜๋กœ ยท ์˜ค๋ฅธ์ชฝ ๋์— ๋งž์ถฐ** ํŽผ์นœ๋‹ค(์ ‘ํžŒ ๋ ˆ์ผ์€ ํŒ๊ณผ ๊ฐ™๋‹ค). ๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ๋Š” prop ์€ ์—†์œผ๋‹ˆ ์ฐพ์ง€ ์•Š๋Š”๋‹ค โ€” ๊ฐ™์€ ๊ณ„์ • ํ–‰์ด ์•ฑ๋งˆ๋‹ค ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๋œจ๋ฉด ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
1253
+ - **`header="fix"` ์—์„œ GNB ๋ฅผ ์ ‘๊ฑฐ๋‚˜ ํŽด๋ฉด ์—ด๋ ค ์žˆ๋˜ ํŒจ๋„์€ ๋‹ซํžŒ๋‹ค.** ๊ณ„์ • ํ–‰์ด ๋ฉ”๋‰ด ์ปฌ๋Ÿผ ๋ฐ”๋‹ฅ์—์„œ ์ ‘ํž˜ ๋ ˆ์ผ ๋ฐ”๋‹ฅ์œผ๋กœ(๋˜๋Š” ๋ฐ˜๋Œ€๋กœ) ์˜ฎ๊ฒจ ์„œ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค โ€” ๋‹ซํžˆ๋Š” ๊ฒƒ์„ ์•ฑ์ด ๋ง‰์„ ์ˆ˜ ์—†๊ณ , ๋ง‰์„ ์ด์œ ๋„ ์—†๋‹ค(๋ˆ„๋ฅธ ๊ทธ ํ–‰์ด ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง„๋‹ค). ์ „ํญ ์ƒ๋‹จ๋ฐ”(`header="full"`)๋Š” ์ ‘์–ด๋„ ๊ณ„์ • ํ–‰์ด ์ œ์ž๋ฆฌ๋ผ ์—ด๋ฆฐ ์ฑ„ ๋‚จ๋Š”๋‹ค. **๊ทธ ๋‹ซํž˜์„ ์•Œ์•„์•ผ ํ•˜๋ฉด `account.onOpenChange` ๋ฅผ ์ค€๋‹ค** โ€” ์—ด๋ฆผ์„ ๋”ฐ๋ผ ๊ทธ๋ฆฌ๋Š” ํ™”๋ฉด์ด ์•ฑ์— ์žˆ์„ ๋•Œ๋งŒ ํ•„์š”ํ•˜๋‹ค.
1254
+ - **๋กœ๊ทธ์•„์›ƒ์„ ์—ฌ๊ธฐ ๋ง๊ณ  ๋‹ค๋ฅธ ๊ณณ์— ๋˜ ๋‘์ง€ ์•Š๋Š”๋‹ค.** ๊ณ„์ •์—์„œ ๋‚˜๊ฐ€๋Š” ๊ธธ์ด ํ™”๋ฉด๋งˆ๋‹ค ๋‹ค๋ฅด๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋งค๋ฒˆ ์ฐพ๋Š”๋‹ค.
1255
+
983
1256
  ### 3-6. ์˜์—ญ ๋‚˜๋ˆ„๊ธฐ โ€” SDivider vs SSplitter
984
1257
 
985
1258
  | ์ƒํ™ฉ | ์‚ฌ์šฉ |
@@ -989,6 +1262,25 @@ const columns: STableColumn[] = [
989
1262
 
990
1263
  `SSplitter` ์˜ ๊ตฌ๋ถ„์„ ์€ ํ‰์†Œ ์ž๋ฆฌ๋งŒ ์žก๊ณ  ์น ํ•ด์ง€์ง€ ์•Š๋‹ค๊ฐ€, ๊ฒฝ๊ณ„์— ์ปค์„œ๋ฅผ ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜ ํฌ์ปค์Šค๋ฅผ ์ฃผ๋ฉด ๊ทธ๋•Œ ๋“œ๋Ÿฌ๋‚œ๋‹ค โ€” ์กฐ์ ˆ ๊ฐ€๋Šฅํ•œ ์ž๋ฆฌ๋ผ๋Š” ์‹ ํ˜ธ๋‹ค. **ํ•ญ์ƒ ๋ณด์ด๋Š” ์„ ์ด ํ•„์š”ํ•˜๋ฉด `SDivider` ๋ฅผ ์“ด๋‹ค.** ์„  ์ƒ‰ยท๋‘๊ป˜ยท์ฃผ๋ณ€ ์—ฌ๋ฐฑ์€ ํ† ํฐ์ด ์ •ํ•˜๋ฏ€๋กœ ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
991
1264
 
1265
+ **์„ธ๋กœ ๊ตฌ๋ถ„์„ ์˜ ๊ธธ์ด๋Š” `height` prop ์œผ๋กœ ์ค€๋‹ค โ€” `className` ์˜ `h-*` ๋กœ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.**
1266
+
1267
+ ```tsx
1268
+ // ์ค„ ๋†’์ด๋ฅผ ๊ทธ๋Œ€๋กœ ์ฑ„์šด๋‹ค (๊ธฐ๋ณธ)
1269
+ <div className="flex items-center gap-sd-8">
1270
+ <span>์ด ์ฃผ๋ฌธ 3๊ฑด</span>
1271
+ <SDivider vertical />
1272
+ <span>์ด ํ’ˆ๋ชฉ 12๊ฑด</span>
1273
+ </div>
1274
+
1275
+ // ์–‘์˜† ๊ธ€์ž๋ณด๋‹ค ์งง์€ ์„ ์ด ํ•„์š”ํ•  ๋•Œ๋งŒ ๊ธธ์ด๋ฅผ ์ •ํ•œ๋‹ค
1276
+ <SDivider vertical height={20} />
1277
+
1278
+ // ํ•˜์ง€ ๋ง ๊ฒƒ โ€” ์„ ์ด ์ค„ ๋งจ ์œ„์— ๋ถ™๋Š”๋‹ค
1279
+ <SDivider vertical className="h-sd-20" />
1280
+ ```
1281
+
1282
+ ๊ธธ์ด๋ฅผ ์ฃผ์ง€ ์•Š์œผ๋ฉด `align-self: stretch` ๋กœ ๋ถ€๋ชจ ์ค„ ๋†’์ด๋ฅผ ์ฑ„์šฐ๋Š”๋ฐ, `stretch` ๋Š” ๋†’์ด๊ฐ€ `auto` ์ผ ๋•Œ๋งŒ ๋Š˜๋ฆฐ๋‹ค. `className` ์œผ๋กœ ๋†’์ด๋ฅผ ์ •ํ•˜๋ฉด `stretch` ๊ฐ€ ์กฐ์šฉํžˆ ๋ฌดํšจ๊ฐ€ ๋˜์–ด ์„ ์ด ์œ„๋กœ ์†Ÿ๋Š”๋‹ค. `height` ๋Š” ๊ธธ์ด์™€ ๊ต์ฐจ์ถ• ๊ฐ€์šด๋ฐ ์ •๋ ฌ์„ ํ•จ๊ป˜ ์ ์šฉํ•˜๋ฏ€๋กœ ์ด ํ•จ์ •์ด ์—†๋‹ค โ€” ์œ„ยท์•„๋ž˜ ์ •๋ ฌ์ด ํ•„์š”ํ•˜๋ฉด `className="self-start"` ์ฒ˜๋Ÿผ ๋ช…์‹œํ•œ๋‹ค. (`sellmate/divider-vertical-height` ๊ทœ์น™์ด ์žก๋Š”๋‹ค.)
1283
+
992
1284
  ```tsx
993
1285
  <SSplitter defaultValue={30} limits={[20, 60]}>
994
1286
  <SSplitter.Before>๋‚ด๋น„๊ฒŒ์ด์…˜</SSplitter.Before>
@@ -1003,7 +1295,7 @@ const columns: STableColumn[] = [
1003
1295
  - ๋ชจ๋ธ์€ ํ•ญ์ƒ **์ฒซ ํŒจ๋„**(`SSplitter.Before`) ํฌ๊ธฐ๋‹ค. ์‚ฌ์ด๋“œ๊ฐ€ ๊ธฐ์ค€์ธ ํ™”๋ฉด์ด๋ฉด ์‚ฌ์ด๋“œ๋ฅผ `Before` ์— ๋‘”๋‹ค.
1004
1296
  - ์•ฑ ์…ธ์˜ GNB ํญ์€ `SGnb` ๊ฐ€ ์†Œ์œ ํ•œ๋‹ค. `SLayout`/`SGnb` ๋ฅผ `SSplitter` ๋กœ ๊ฐ์‹ธ์ง€ ์•Š๋Š”๋‹ค โ€” **GNB ํญ์„ ๋Œ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด `SGnb` ์— `resizable` ์„ ์ค€๋‹ค**(ยง4-1).
1005
1297
 
1006
- **Quasar `q-splitter` ์—์„œ ์˜ฎ๊ฒจ์˜ฌ ๋•Œ** โ€” `unit` ยท `limits` ยท `emitImmediately` ๋Š” ์ด๋ฆ„๊ณผ ๋œป์ด ๊ฐ™๊ณ , ๋‚˜๋จธ์ง€๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฐ”๋€๋‹ค. `emitImmediately` ๋ฅผ ์ฃผ์ง€ ์•Š์œผ๋ฉด **๋“œ๋ž˜๊ทธ๋ฅผ ๋†“๋Š” ์ˆœ๊ฐ„ ํ•œ ๋ฒˆ๋งŒ** `onValueChange` ๊ฐ€ ์˜จ๋‹ค.
1298
+ **Quasar `q-splitter` ์—์„œ ์˜ฎ๊ฒจ์˜ฌ ๋•Œ** โ€” `unit` ยท `limits` ยท `updateWhileDragging` ๋Š” ์ด๋ฆ„๊ณผ ๋œป์ด ๊ฐ™๊ณ , ๋‚˜๋จธ์ง€๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฐ”๋€๋‹ค. `updateWhileDragging` ๋ฅผ ์ฃผ์ง€ ์•Š์œผ๋ฉด **๋“œ๋ž˜๊ทธ๋ฅผ ๋†“๋Š” ์ˆœ๊ฐ„ ํ•œ ๋ฒˆ๋งŒ** `onValueChange` ๊ฐ€ ์˜จ๋‹ค.
1007
1299
 
1008
1300
  | q-splitter | SSplitter |
1009
1301
  | --- | --- |
@@ -1019,18 +1311,42 @@ const columns: STableColumn[] = [
1019
1311
 
1020
1312
  > ยง3-0 ๋ผ์šฐํŒ…์—์„œ ์ด ์ ˆ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ž๋ฆฌ๋“ค์ด๋‹ค. <!-- TODO(๋””์ž์ธ): ์ „์ฒด ๊ฒ€์ˆ˜ยทํ™•์ • -->
1021
1313
 
1022
- #### 3-7-1. SInput vs STextarea
1314
+ #### 3-7-1. SInput vs STextarea vs SEditor vs SSearchInput
1023
1315
 
1024
- **์ค„ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ’์˜ ์„ฑ๊ฒฉ์œผ๋กœ ๊ณ ๋ฅธ๋‹ค.** ๊ฐ’์˜ ๊ธธ์ด๋ฅผ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉด `SInput`, ์—†์œผ๋ฉด `STextarea` ๋‹ค.
1316
+ **๋จผ์ € "๊ทธ ๊ฐ’์ด ์ €์žฅ๋˜๋Š”๊ฐ€"๋ฅผ ๋ณธ๋‹ค.** ์ €์žฅ๋˜๋ฉด ํผ ํ•„๋“œ(`SInput`ยท`STextarea`), ํ™”๋ฉด์„ ์ขํžˆ๊ธฐ๋งŒ ํ•˜๊ณ  ์‚ฌ๋ผ์ง€๋ฉด `SSearchInput` ์ด๋‹ค.
1025
1317
 
1026
1318
  | ๊ฐ’ | ์‚ฌ์šฉ |
1027
1319
  | --- | --- |
1028
1320
  | ์ด๋ฆ„ยท์ฝ”๋“œยท์ „ํ™”๋ฒˆํ˜ธยทURL ์ฒ˜๋Ÿผ ํ˜•์‹์ด ์ •ํ•ด์ง„ ๊ฐ’ | `SInput` |
1029
1321
  | ๋ฉ”๋ชจยท์‚ฌ์œ ยท์„ค๋ช…์ฒ˜๋Ÿผ ๊ธธ์ด๊ฐ€ ์˜ˆ์ธก๋˜์ง€ ์•Š๋Š” ๋ฌธ์žฅ | `STextarea` |
1322
+ | ์„œ์‹(์ œ๋ชฉยท๊ตต๊ฒŒยท๋ชฉ๋กยท์ •๋ ฌยท์ƒ‰ยท๋งํฌยท์ด๋ฏธ์ง€)์ด ๊ฐ’์˜ ์ผ๋ถ€๋กœ ์ €์žฅ๋˜์–ด์•ผ ํ•˜๋Š” ๊ธ€ | `SEditor` |
1323
+ | ์ง€๊ธˆ ๋ณด์ด๋Š” ๋ชฉ๋กยท๊ฒฐ๊ณผ๋ฅผ ์ขํžˆ๋Š” ๊ฒ€์ƒ‰์–ด | `SSearchInput` |
1324
+
1325
+ ํผ ํ•„๋“œ ๋‘˜์€ **์ค„ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ’์˜ ์„ฑ๊ฒฉ์œผ๋กœ** ๊ฐˆ๋ฆฐ๋‹ค. ๊ฐ’์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ `SInput` ์„ ์“ฐ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ž๊ธฐ๊ฐ€ ์“ด ๊ฒƒ์„ ๋‹ค์‹œ ์ฝ์ง€ ๋ชปํ•œ๋‹ค โ€” ํ•œ ์ค„ ์•ˆ์—์„œ ์ขŒ์šฐ๋กœ ์Šคํฌ๋กคํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฐ˜๋Œ€๋กœ ์งง์€ ๊ฐ’์— `STextarea` ๋ฅผ ์“ฐ๋ฉด ๋นˆ ๊ณต๊ฐ„์ด ๋‚จ์•„ ์ž…๋ ฅ๋Ÿ‰์„ ์ž˜๋ชป ๊ธฐ๋Œ€ํ•˜๊ฒŒ ํ•œ๋‹ค.
1030
1326
 
1031
- ๊ฐ’์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ `SInput` ์„ ์“ฐ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ž๊ธฐ๊ฐ€ ์“ด ๊ฒƒ์„ ๋‹ค์‹œ ์ฝ์ง€ ๋ชปํ•œ๋‹ค โ€” ํ•œ ์ค„ ์•ˆ์—์„œ ์ขŒ์šฐ๋กœ ์Šคํฌ๋กคํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฐ˜๋Œ€๋กœ ์งง์€ ๊ฐ’์— `STextarea` ๋ฅผ ์“ฐ๋ฉด ๋นˆ ๊ณต๊ฐ„์ด ๋‚จ์•„ ์ž…๋ ฅ๋Ÿ‰์„ ์ž˜๋ชป ๊ธฐ๋Œ€ํ•˜๊ฒŒ ํ•œ๋‹ค.
1327
+ `SEditor` ๋Š” **์„œ์‹์ด ๊ฐ’์˜ ์ผ๋ถ€์ผ ๋•Œ๋งŒ** ์“ด๋‹ค. ๊ฐ’์„ HTML ๋ฌธ์ž์—ด๋กœ ์ฃผ๊ณ ๋ฐ›์œผ๋ฏ€๋กœ ์ €์žฅยท๊ฒ€์ƒ‰ยท๋น„๊ต๊ฐ€ ํ‰๋ฌธ๋ณด๋‹ค ๋น„์‹ธ๊ณ , ํ™”๋ฉด์— ๋‹ค์‹œ ๋ณด์—ฌ์ค„ ๋•Œ๋„ HTML ๋กœ ๋ Œ๋”ํ•ด์•ผ ํ•œ๋‹ค. ์„œ์‹์ด ํ•„์š” ์—†๋Š” ๋ฉ”๋ชจยท์‚ฌ์œ ๋Š” `STextarea` ๋‹ค โ€” "์ž…๋ ฅ์ฐฝ์ด ์ปค ๋ณด์—ฌ์„œ" ๊ณ ๋ฅด๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๊ณต์ง€ยท์•ˆ๋‚ด๋ฌธยท์ƒํ’ˆ ์ƒ์„ธ์ฒ˜๋Ÿผ **์ž‘์„ฑ์ž๊ฐ€ ์ •ํ•œ ๊ฐ•์กฐ์™€ ๋ชฉ๋ก์ด ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ๊ธ€**์ด๋ฉด `STextarea` ๋กœ๋Š” ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋‹ค.
1032
1328
 
1033
- #### 3-7-2. ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅด๊ฒŒ ํ•˜๋Š” ๋‹ค์„ฏ โ€” SSelect vs SRadioGroup vs SRadioButton vs STabs vs SRadio
1329
+ `SEditor` ๋„ `SInput`ยท`STextarea` ์™€ ๊ฐ™์€ ํผ ํ•„๋“œ๋‹ค โ€” `label`ยท`hint`ยท`rules`ยท`errorMessage` ๋ฅผ ์ž๊ธฐ prop ์œผ๋กœ ๋ฐ›๊ณ  `SForm` ์ œ์ถœ ๊ฒ€์ฆ์—๋„ ๋“ค์–ด๊ฐ„๋‹ค. ๋นˆ ๋ฌธ์„œ๋Š” ๋นˆ ๋ฌธ์ž์—ด๋กœ ๋‚˜์˜ค๋ฏ€๋กœ `required` ๊ทœ์น™์ด ๊ทธ๋Œ€๋กœ ๊ฑธ๋ฆฐ๋‹ค. **ํˆด๋ฐ”๋ฅผ ๋„๋Š” ๊ธธ์€ ์—†๋‹ค** โ€” ์„œ์‹ ์ž…๋ ฅ์ด ํ•„์š” ์—†๋Š” ์ž๋ฆฌ๋ผ๋ฉด ์„œ์‹ ์—†๋Š” `SEditor` ๊ฐ€ ์•„๋‹ˆ๋ผ `STextarea` ๋ฅผ ๊ณ ๋ฅธ๋‹ค.
1330
+
1331
+ ํˆด๋ฐ”๋Š” **ํ”„๋ฆฌ์…‹ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฟ์ด๋‹ค.** ๊ธฐ๋ณธ์€ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๋ชจ๋‘ ๋ณด์ด๊ณ , **`simple` ์„ ์ผœ๋ฉด ๊ธ€์ž์— ๊ฑฐ๋Š” ์„œ์‹๋งŒ ๋‚จ๋Š”๋‹ค** โ€” ๋ชฉ๋กยท์ •๋ ฌยท์ธ์šฉยท์ฝ”๋“œยท๋งํฌยท์ด๋ฏธ์ง€ยท๊ตฌ๋ถ„์„ ์ด ๋น ์ง€๊ณ  ์„ ํƒํ–ˆ์„ ๋•Œ ๋œจ๋Š” ํŒ๋„ ๊ฐ™์€ ๋ฒ”์œ„๋กœ ์ค„์–ด๋“ ๋‹ค. ๋ฐ›์€ ๊ธ€์˜ **๋ฌธ๋‹จ ๊ตฌ์กฐ๊นŒ์ง€ ์ž‘์„ฑ์ž๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉด ๊ณค๋ž€ํ•œ ์ž๋ฆฌ**(์ข์€ ์นธ์˜ ๋ฉ”๋ชจยท์‚ฌ์œ ยท์งง์€ ์•ˆ๋‚ด๋ฌธ)๊ฐ€ `simple` ์ด๋‹ค. ํ•ญ๋ชฉ์„ ์ง์ ‘ ์กฐํ•ฉํ•˜๋Š” prop ์€ ์—†๋‹ค โ€” ํ™”๋ฉด๋งˆ๋‹ค ๋‹ค๋ฅธ ํˆด๋ฐ”๊ฐ€ ์„œ๋ฉด ๊ทธ ์ž์ฒด๊ฐ€ ํ•™์Šต ๋น„์šฉ์ด ๋œ๋‹ค.
1332
+
1333
+ ๋ณธ๋ฌธ์—์„œ ๋”ฐ์˜ดํ‘œยทํ•˜์ดํ”ˆยทํ™”์‚ดํ‘œ๋Š” **์ž๋™์œผ๋กœ ์น˜ํ™˜๋œ๋‹ค**(`"` โ†’ `โ€œโ€`, `--` โ†’ `โ€”`, `->` โ†’ `โ†’`). ๋Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ์ƒํ’ˆ ์ฝ”๋“œยท๊ทœ๊ฒฉ ๋ฌธ์ž์—ด์ฒ˜๋Ÿผ **์ž…๋ ฅํ•œ ๊ทธ๋Œ€๋กœ ๋‚จ์•„์•ผ ํ•˜๋Š” ๊ฐ’**์€ `SEditor` ๋ณธ๋ฌธ์ด ์•„๋‹ˆ๋ผ `SInput` ์œผ๋กœ ๋”ฐ๋กœ ๋ฐ›๋Š”๋‹ค.
1334
+
1335
+ ํˆด๋ฐ”๋Š” **์ž๋ฆฌ๋ฅผ ์ง€ํ‚จ๋‹ค**(๊ณ ์ •). ๊ธด ๊ธ€์„ ์“ฐ๋Š” ๋™์•ˆ ๋ง‰๋Œ€๊ฐ€ ํ™”๋ฉด ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€์ง€ ์•Š์œผ๋ฏ€๋กœ, ํˆด๋ฐ”๋ฅผ ๋”ฐ๋กœ ๊ฐ์‹ธ๊ฑฐ๋‚˜ ์œ„์น˜๋ฅผ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
1336
+
1337
+ ํˆด๋ฐ”์—๋Š” **๊ธ€์ž ํฌ๊ธฐ ๋“œ๋กญ๋‹ค์šด**๊ณผ **๊ธ€์ž์ƒ‰ ํŒ”๋ ˆํŠธ**๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค โ€” ์ž‘์„ฑ์ž๊ฐ€ ๋ฌธ๋‹จ๋งˆ๋‹ค ํฌ๊ธฐยท์ƒ‰์„ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ํฌ๊ธฐ ๋ชฉ๋ก ๋งจ ์œ„ `๊ธฐ๋ณธ` ์€ ์ง€์ •์„ ๋–ผ๋Š” ์ž๋ฆฌ๋‹ค. ํฌ๊ธฐ ๋ˆˆ๊ธˆ์€ ํ™”๋ฉด ํƒ€์ดํฌ(ยง2-1)๊ฐ€ ์•„๋‹ˆ๋ผ ์›Œ๋“œํ”„๋กœ์„ธ์„œ์˜ ๋ˆˆ๊ธˆ์ด๋ผ ๋ณธ๋ฌธ๋ณด๋‹ค ํ›จ์”ฌ ํฐ ๋‹จ๊ณ„๊นŒ์ง€ ์žˆ๋‹ค. **๋ˆˆ๊ธˆ๋„ ํŒ”๋ ˆํŠธ๋„ ์ขํžˆ๋Š” prop ์ด ์—†๋‹ค** โ€” ํ™”๋ฉด๋งˆ๋‹ค ๊ณ ๋ฅผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋‹ค๋ฅด๋ฉด ๊ฐ™์€ ๊ธ€์ด ์–ด๋””์— ๋ถ™๋А๋ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ **์ž‘์„ฑ์ž๊ฐ€ ํ™”๋ฉด ๋ฆฌ๋“ฌ์„ ๋ฒ—์–ด๋‚˜๋ฉด ๊ณค๋ž€ํ•œ ์ž๋ฆฌ(์ƒํ’ˆ ์ƒ์„ธ ์„ค๋ช…ยท๋ฐ˜๋ณต ๋…ธ์ถœ๋˜๋Š” ์•ˆ๋‚ด๋ฌธ ๋“ฑ)๋ผ๋ฉด `SEditor` ๊ฐ€ ๋งž๋Š” ์ž๋ฆฌ์ธ์ง€ ๋จผ์ € ๋ณธ๋‹ค** โ€” ์„œ์‹์ด ๊ฐ’์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด `STextarea` ๋‹ค. ๊ณ ๋ฅธ ํฌ๊ธฐยท์ƒ‰์€ ์ €์žฅ๋˜๋Š” HTML ์— ๊ทธ๋Œ€๋กœ ๋‚จ์•„ ๋‚˜์ค‘์— ๋˜๋Œ๋ฆด ์ˆ˜ ์—†๋‹ค.
1338
+
1339
+ ๋ณธ๋ฌธ์—๋Š” **ํ‘œ**๋„ ๋“ค์–ด๊ฐ„๋‹ค โ€” ํˆด๋ฐ”์˜ `ํ‘œ` ๋“œ๋กญ๋‹ค์šด์—์„œ ๊ฒฉ์ž๋ฅผ ๋Œ์–ด ํฌ๊ธฐ๋ฅผ ๊ณ ๋ฅด๊ณ (์ตœ๋Œ€ 8ํ–‰ ร— 10์—ด), ํ–‰ยท์—ด์„ ๋Š˜๋ฆฌ๊ณ , ์นธ์„ ๋ณ‘ํ•ฉํ•œ๋‹ค. **์—ด ๋„ˆ๋น„๋Š” ๊ท ๋“ฑ ๊ณ ์ •์ด๊ณ  ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค**: ๋„ˆ๋น„๋ฅผ ์ €์žฅํ•˜๋ฉด ๊ทธ ๊ฐ’์ด px ๋กœ ๋ฐ•ํ˜€ ์ž‘์„ฑํ•œ ํ™”๋ฉด๋ณด๋‹ค ์ข์€ ๊ณณ์—์„œ ํ‘œ๊ฐ€ ๋„˜์นœ๋‹ค. ๋Œ€์‹  ์–ด๋–ค ํญ์—์„œ๋„ ํ‘œ๊ฐ€ ์ƒ์ž ์•ˆ์— ๋“ค์–ด์˜ค๋„๋ก ์—ด์„ ๊ณ ๋ฅด๊ฒŒ ๋‚˜๋ˆˆ๋‹ค โ€” ์—ด์ด ๋งŽ์€ ํ‘œ๋Š” ์ข์€ ์นธ์—์„œ ๊ธ€์ž๊ฐ€ ์ž˜๊ฒŒ ์ ‘ํžˆ๋ฏ€๋กœ, **์—ด์ด ๋„ท์„ ๋„˜์–ด๊ฐ€๋Š” ํ‘œ๋ผ๋ฉด `SEditor` ๋ณธ๋ฌธ์ด ์•„๋‹ˆ๋ผ `STable` ์ด ๋งž๋Š” ์ž๋ฆฌ์ธ์ง€ ๋ณธ๋‹ค.** ํ‘œ๋Š” ์ž‘์„ฑ์ž๊ฐ€ ์“ฐ๋Š” ๊ธ€์˜ ์ผ๋ถ€์ผ ๋•Œ๋งŒ ์—ฌ๊ธฐ์— ์žˆ๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์ค„ ์„ธ์›Œ ๋ณด์—ฌ ์ฃผ๋Š” ๊ฒƒ์€ `STable` ์ด๋‹ค.
1340
+
1341
+ ๊ธ€์„ ์„ ํƒํ•˜๋ฉด **๊ทธ ์œ„์— ์„œ์‹ ํŒ์ด ๋œฌ๋‹ค**(๋ฒ„๋ธ” ๋ฉ”๋‰ด). ํˆด๋ฐ”๊นŒ์ง€ ์ปค์„œ๋ฅผ ์˜ฎ๊ธฐ์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ๊ตต๊ฒŒยท์ƒ‰ยท๋งํฌ๋ฅผ ๊ฑฐ๋Š” ๊ธธ์ด๋‹ค. **๋„๊ณ  ์ผœ๋Š” prop ์€ ์—†๋‹ค** โ€” ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์–ธ์ œ๋‚˜ ๋œจ๊ณ , ์ฝ๊ธฐ ์ „์šฉยท๋น„ํ™œ์„ฑ์ผ ๋•Œ๋Š” ๋œจ์ง€ ์•Š๋Š”๋‹ค. ํ™”๋ฉด๋งˆ๋‹ค ์žˆ๊ณ  ์—†๊ณ ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉด ๊ทธ ์ž์ฒด๊ฐ€ ํ•™์Šต ๋น„์šฉ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํŒ์˜ ๊ตฌ์„ฑ์€ `simple` ์ด ๋ง‰๋Œ€์™€ ํ•จ๊ป˜ ์ •ํ•œ๋‹ค. ๋œจ๋Š” ์ž๋ฆฌ๋Š” DS ๊ฐ€ ์žก๋Š”๋‹ค, ์ง์ ‘ ๊ฐ์‹ธ๊ฑฐ๋‚˜ ์œ„์น˜๋ฅผ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
1342
+
1343
+ `SEditor` ๋Š” ํ™”๋ฉด์— ์ฒ˜์Œ ๋†“์ผ ๋•Œ **์—๋””ํ„ฐ ์—”์ง„์„ ๋”ฐ๋กœ ๋ถˆ๋Ÿฌ์˜จ๋‹ค** โ€” ์•ฑ ์ดˆ๊ธฐ ๋ฒˆ๋“ค์—๋Š” ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋™์•ˆ์€ ๊ฐ™์€ ํฌ๊ธฐ์˜ ๋นˆ ํŽธ์ง‘ ์˜์—ญ์ด ์ž๋ฆฌ๋ฅผ ์ง€ํ‚ค๋ฏ€๋กœ ๋ ˆ์ด์•„์›ƒ์€ ํ”๋“ค๋ฆฌ์ง€ ์•Š์ง€๋งŒ, **๋งˆ์šดํŠธํ•˜์ž๋งˆ์ž `ref.current.getHTML()` ๋กœ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ํˆด๋ฐ”๋ฅผ ๋ˆ„๋ฅผ ์ˆ˜๋Š” ์—†๋‹ค.** ์—ด์ž๋งˆ์ž ์ปค์„œ๋ฅผ ๋†“๊ณ  ์‹ถ์œผ๋ฉด `ref.current.focus()` ๋ฅผ ๊ทธ๋ƒฅ ๋ถ€๋ฅด๋ฉด ๋œ๋‹ค โ€” ์ค€๋น„๋˜๋Š” ์ˆœ๊ฐ„ ๋Œ€์‹  ์‹คํ–‰๋œ๋‹ค.
1344
+
1345
+ **์ด๋ฏธ์ง€๋ฅผ ๋„ฃ์œผ๋ ค๋ฉด `onImageUpload` ๋ฅผ ์ค€๋‹ค** โ€” ๊ณ ๋ฅธ ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ํ‘œ์‹œํ•  URL ์„ ๋Œ๋ ค์ฃผ๋Š” ํ›…์ด๋‹ค. ์ €์žฅ ์œ„์น˜๋Š” ์•ฑ๋งˆ๋‹ค ๋‹ค๋ฅด๋ฏ€๋กœ DS ๊ฐ€ ์ •ํ•˜์ง€ ์•Š๊ณ , ํ›…์ด ์—†์œผ๋ฉด ํˆด๋ฐ”์—์„œ ์ด๋ฏธ์ง€ ํ•ญ๋ชฉ์ด ๋น ์ง„๋‹ค. ๋ณธ๋ฌธ์— base64 ๋ฅผ ๋ฐ•๋Š” ๊ธธ์€ ๋ง‰์•„ ๋‘์—ˆ๋‹ค โ€” ์ €์žฅ HTML ์ด ์ˆ˜ MB ๋กœ ๋ถ€ํ’€์–ด ๊ทธ๋Œ€๋กœ DBยทAPI ์— ์‹ค๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
1346
+
1347
+ `SSearchInput` ์€ ํผ ํ•„๋“œ๊ฐ€ ์•„๋‹ˆ๋‹ค โ€” ๋ผ๋ฒจยทํžŒํŠธยท์œ ํšจ์„ฑ ๊ทœ์น™ยท์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์ง€ ์•Š๊ณ , `SForm` ์˜ ์ œ์ถœ ๊ฒ€์ฆ ๋Œ€์ƒ์—๋„ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค. ๋‹๋ณด๊ธฐ ์•„์ด์ฝ˜์ด ํ•ญ์ƒ ์•ž์— ๋ถ™์–ด "์—ฌ๊ธฐ๋Š” ๊ฒ€์ƒ‰"์ž„์„ ์Šค์Šค๋กœ ๋ฐํžˆ๋ฏ€๋กœ ๋ผ๋ฒจ์„ ๋”ฐ๋กœ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค. ๊ฒ€์ƒ‰ ์‹คํ–‰์€ `onSearch`(Enter) ๋กœ ๋ฐ›๊ณ , ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์ขํžˆ๋Š” ์‹ค์‹œ๊ฐ„ ํ•„ํ„ฐ๋ผ๋ฉด `onValueChange` ๋งŒ ์“ด๋‹ค. ๋ฐ˜๋Œ€๋กœ ๊ฒ€์ƒ‰์–ด๋ฅผ **์ €์žฅํ•˜๊ฑฐ๋‚˜ ๊ฒ€์ฆํ•ด์•ผ ํ•œ๋‹ค๋ฉด** ๊ทธ๊ฒƒ์€ ํผ ๊ฐ’์ด๋ฏ€๋กœ `SInput` ์ด๋‹ค.
1348
+
1349
+ #### 3-7-2. ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅด๊ฒŒ ํ•˜๋Š” ์—ฌ์„ฏ โ€” SSelect vs SRadioGroup vs SRadioCardGroup vs SRadioButton vs STabs vs SRadio
1034
1350
 
1035
1351
  **๋จผ์ € "๊ณ ๋ฅด๋ฉด ๋ฌด์—‡์ด ๋ฐ”๋€Œ๋Š”๊ฐ€"๋ฅผ ๋ณธ๋‹ค.**
1036
1352
 
@@ -1041,10 +1357,17 @@ const columns: STableColumn[] = [
1041
1357
  | --- | --- |
1042
1358
  | 6๊ฐœ ์ด์ƒ, ๋˜๋Š” ์„œ๋ฒ„์—์„œ ์˜ค๋Š” ๋™์  ๋ชฉ๋ก | `SSelect` |
1043
1359
  | 2~5๊ฐœ ๊ณ ์ • + ์„ ํƒ์ง€๋ฅผ ํ•ญ์ƒ ๋ณด์—ฌ์•ผ ํ•จ | `SRadioGroup` |
1360
+ | 2~5๊ฐœ ๊ณ ์ • + **์„ ํƒ์ง€๋งˆ๋‹ค ์„ค๋ช… ํ•œ ์ค„์ด ํ•„์š”ํ•จ** | `SRadioCardGroup` |
1044
1361
  | 2~4๊ฐœ + ์งง์€ ๋ผ๋ฒจ์˜ ๋ฐฐํƒ€์  ๋ชจ๋“œ ์ „ํ™˜ (์„ธ๊ทธ๋จผํŠธ) | `SRadioButton` |
1045
1362
 
1046
1363
  - **`SRadio` ๋ฅผ ์ง์ ‘ ๋‚˜์—ดํ•˜์ง€ ์•Š๋Š”๋‹ค.** ๊ทธ๋ฃน ๊ฐ„๊ฒฉ์€ `SRadioGroup` ์ด ๋งž์ถ˜๋‹ค (ยง2-2). `SRadio` ๋‹จ๋…์€ `SRadioGroup` ์ด ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ๋ฐฐ์น˜ โ€” ํ‘œ ์…€ ์•ˆ์— ํ–‰๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ๋†“๋Š” ๊ฒฝ์šฐ โ€” ์—๋งŒ ์“ด๋‹ค.
1047
1364
  - `SRadioButton` ์€ `options` ๋ฅผ ํ†ต์งธ๋กœ ๋ฐ›๋Š” ์„ธ๊ทธ๋จผํŠธ ์ปจํŠธ๋กค์ด๋ผ `SRadio` ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋„ฃ๋Š” ๊ฒŒ ์•„๋‹ˆ๋‹ค.
1365
+ - **`SRadioGroup` ๊ณผ `SRadioCardGroup` ์˜ ๊ฐˆ๋ฆผ๊ธธ์€ "์„ค๋ช…์ด ํ•„์š”ํ•œ๊ฐ€" ํ•˜๋‚˜๋‹ค.** ๋ผ๋ฒจ๋งŒ์œผ๋กœ ๋œป์ด ํ†ตํ•˜๋ฉด `SRadioGroup`, ๊ณ ๋ฅด๊ธฐ ์ „์— ํ•œ ์ค„ ์„ค๋ช…์„ ์ฝ์–ด์•ผ ํ•˜๋ฉด `SRadioCardGroup` ์ด๋‹ค. ๋ผ๋ฒจ ์˜†์— ์„ค๋ช…์„ ๊ด„ํ˜ธ๋กœ ๋ง๋ถ™์—ฌ ๋Š˜์ด์ง€ ์•Š๋Š”๋‹ค.
1366
+ - **`SRadioCardGroup` ์€ `SRadioGroup` ์˜ ๋Œ€์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฒฉ์ƒํŒ์ด๋‹ค.** ๋ผ๋ฒจ์ด ํ•œ ๋‹จ๊ณ„ ํฌ๊ณ  ๊ทธ ์•„๋ž˜ ์„ค๋ช… ์ค„๊นŒ์ง€ ๋“ค์–ด๊ฐ€ ์นด๋“œ ํ•œ ์žฅ์ด ์ž๋ฆฌ๋ฅผ ๋„‰๋„‰ํžˆ ์“ด๋‹ค โ€” ์„ ํƒ์ง€๊ฐ€ ์กฐ๋ฐ€ํ•˜๊ฒŒ ๋ฐ˜๋ณต๋˜๋Š” ์ž๋ฆฌ์—๋Š” ๊ณผํ•˜๋‹ค.
1367
+ - **์“ฐ๋Š” ์ž๋ฆฌ๋Š” ์„ค์ • ํ™”๋ฉดยท๋งˆ๋ฒ•์‚ฌ(์Šคํ…)์˜ ์†Œ์ˆ˜ ๊ฒฐ์ •์ด๋‹ค.** ๊ณ ๋ฅด๊ณ  ๋‚˜๋ฉด ๋’ค ํ™”๋ฉด์ด ํ†ต์งธ๋กœ ๋ฐ”๋€Œ๊ฑฐ๋‚˜ ๋˜๋Œ๋ฆฌ๊ธฐ ์–ด๋ ค์šด ์„ ํƒ โ€” ํ‰๊ฐ€ ๋Œ€์ƒ์ž ๋ฒ”์œ„(์ „์ฒด/ํŠน์ • ๊ตฌ์„ฑ์›), ์ƒ๋‹ด ์ž๋™ ๋ฐฐ์ • ๋ฐฉ์‹ ๊ฐ™์€ ๊ฒƒ. ๋ชฉ๋ก ํ•„ํ„ฐยทํ‘œ ์•ˆ ์กฐ๊ฑด์ฒ˜๋Ÿผ ๊ฐ™์€ ์„ ํƒ์ง€๊ฐ€ ํ™”๋ฉด๋งˆ๋‹ค ๋ฐ˜๋ณต ๋…ธ์ถœ๋˜๋Š” ์ž๋ฆฌ์—๋Š” `SRadioGroup` ์„ ์“ด๋‹ค.
1368
+ - `SRadioCard` ๋‹จ๋…์€ `SRadioCardGroup` ์ด ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ๋ฐฐ์น˜์—๋งŒ ์“ด๋‹ค โ€” ๋‚˜์—ด์€ ๊ทธ๋ฃน์ด ๋งก๋Š”๋‹ค (ยง2-2).
1369
+ - ์นด๋“œ ์•ˆ์— ์ƒํƒœ ๋ฐฐ์ง€๋ฅผ ๋„ฃ์œผ๋ ค๋ฉด `tag` ์Šฌ๋กฏ์— `STag` ๋ฅผ ์ค€๋‹ค. ๋ผ๋ฒจ ๋ฌธ์ž์—ด์— "(์ถ”์ฒœ)" ์ฒ˜๋Ÿผ ์„ž์–ด ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
1370
+ - **์นด๋“œ์ฒ˜๋Ÿผ ์ƒ๊ฒผ๋‹ค๊ณ  `SCard`/`SSectionHeaderCard` ๋กœ ๊ฐ์‹ธ์ง€ ์•Š๋Š”๋‹ค.** `SRadioCard` ์ž์ฒด๊ฐ€ ์™„๊ฒฐ๋œ ์š”์†Œ์ด๊ณ , ๋‚˜์—ด ๊ฐ„๊ฒฉ์€ `SRadioCardGroup` ์˜ `direction` ์ด ๋งž์ถ˜๋‹ค (ยง2-2).
1048
1371
 
1049
1372
  #### 3-7-3. ์ผœ๊ณ  ๋„๋Š” ์…‹ โ€” SCheckbox vs SSwitch vs SToggle
1050
1373
 
@@ -1060,7 +1383,7 @@ const columns: STableColumn[] = [
1060
1383
  - ์•ฝ๊ด€ ๋™์˜์ฒ˜๋Ÿผ **์ œ์ถœ ์‹œ์ ์— ๊ฐ’์ด ํ•„์š”ํ•œ ๊ฒƒ์€ ํ•ญ์ƒ `SCheckbox`** ๋‹ค โ€” ๋ชจ์–‘์ด ์Šค์œ„์น˜์— ๊ฐ€๊นŒ์›Œ ๋ณด์—ฌ๋„ ๊ทธ๋ ‡๋‹ค.
1061
1384
  - `SToggle` ์€ ์•Œ์•ฝํ˜• ๋ฒ„ํŠผ์ด๋ผ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๊ฐ€๋กœ๋กœ ๋Š˜์–ด๋†“๋Š” ํ•„ํ„ฐ ์ž๋ฆฌ์— ๋งž๋Š”๋‹ค. ์„ค์ • ํ™”๋ฉด์˜ on/off ํ•œ ์ค„์—๋Š” ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
1062
1385
 
1063
- #### 3-7-4. ๋‚ ์งœ ์…‹ โ€” SDatePicker vs SDateRangePicker vs SCalendar
1386
+ #### 3-7-4. ๋‚ ์งœ ์…‹ โ€” SDatePicker vs SDateRangePicker vs SCalendar vs SCalendarBoard
1064
1387
 
1065
1388
  | ํŒ๋ณ„ | ์‚ฌ์šฉ |
1066
1389
  | --- | --- |
@@ -1068,10 +1391,19 @@ const columns: STableColumn[] = [
1068
1391
  | ์—ฐ๋„ ์„ ํƒ ๋ฆฌ์ŠคํŠธ๋งŒ ํ•„์š”ํ•˜๋‹ค (ํŠธ๋ฆฌ๊ฑฐยทํŒ์˜ค๋ฒ„๋Š” ์ง์ ‘ ์กฐํ•ฉ) | `SDatePickerYearListbox` |
1069
1392
  | ์—ฐ๋„+์›” ์„ ํƒ ๋ฆฌ์ŠคํŠธ๋งŒ ํ•„์š”ํ•˜๋‹ค (ํŠธ๋ฆฌ๊ฑฐยทํŒ์˜ค๋ฒ„๋Š” ์ง์ ‘ ์กฐํ•ฉ) | `SDatePickerMonthListbox` |
1070
1393
  | **์‹œ์ž‘~์ข…๋ฃŒ** ๋ฅผ ๊ฐ’์œผ๋กœ ๋ฐ›๋Š”๋‹ค | `SDateRangePicker` |
1071
- | ๋‹ฌ๋ ฅ ๊ฒฉ์ž **์ž์ฒด๊ฐ€ ํ™”๋ฉด ์ฝ˜ํ…์ธ ** ๋‹ค (์ผ์ •ยท์ด๋ฒคํŠธ ๋ณด๊ธฐ) | `SCalendar` |
1394
+ | ๋‹ฌ๋ ฅ ๊ฒฉ์ž **์ž์ฒด๊ฐ€ ํ™”๋ฉด ์ฝ˜ํ…์ธ ** ๋‹ค (๋‚ ์งœ๋ฅผ ๊ณ ๋ฅด๊ฒŒ ํ•œ๋‹ค) | `SCalendar` |
1395
+ | ํ•œ ๋‹ฌ์น˜ **์ผ์ •์„ ์ฝ๊ฒŒ** ํŽผ์นœ๋‹ค (์นธ๋งˆ๋‹ค ์—ฌ๋Ÿฌ ๊ฑด) | `SCalendarBoard` |
1072
1396
 
1073
1397
  - **๊ธฐ๊ฐ„์„ `SDatePicker` ๋‘ ๊ฐœ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.** ์‹œ์ž‘์ด ์ข…๋ฃŒ๋ณด๋‹ค ๋’ค์ธ ์ž…๋ ฅ์„ ๋ง‰๋Š” ๊ฒ€์ฆ๊ณผ ํ•œ์ชฝ๋งŒ ๊ณ ๋ฅธ ์ค‘๊ฐ„ ์ƒํƒœ ์ฒ˜๋ฆฌ๊ฐ€ `SDateRangePicker` ์•ˆ์— ์ด๋ฏธ ์žˆ๋‹ค. ๋‘ ๊ฐœ๋กœ ์ชผ๊ฐœ๋ฉด ๊ทธ๊ฒŒ ์ „๋ถ€ ์•ฑ ๋ชซ์ด ๋œ๋‹ค.
1074
1398
  - `SDatePicker`ยท`SDateRangePicker` ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ `SCalendar` ๋ฅผ ํŒ์˜ค๋ฒ„๋กœ ๋„์šด๋‹ค. ๊ฐ’์„ ๋ฐ›๋Š” ์ž๋ฆฌ์— `SCalendar` ๋ฅผ ์ง์ ‘ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
1399
+ - **`SCalendar` ์™€ `SCalendarBoard` ๋Š” ๋ฐฉํ–ฅ์ด ๋ฐ˜๋Œ€๋‹ค.** `SCalendar` ๋Š” ๋‚ ์งœ๋ฅผ **๊ณ ๋ฅด๋Š”** ๋‹ฌ๋ ฅ(์นธ์—๋Š” ์ ๋งŒ ์ฐํžŒ๋‹ค)์ด๊ณ , `SCalendarBoard` ๋Š” ์ผ์ •์„ **์ฝ๋Š”** ๋‹ฌ๋ ฅ์ด๋‹ค โ€” ์นธ๋งˆ๋‹ค ์ผ์ •์ด ์ค„๋กœ ์Œ“์ด๊ณ , ์นธ ๋†’์ด์— ๋‹ด๊ธฐ๋Š” ์ค„ ์ˆ˜๋ฅผ ๋„˜์œผ๋ฉด "N๊ฐœ ๋”๋ณด๊ธฐ" ๋กœ ์ ‘ํžˆ๊ณ , **"๋”๋ณด๊ธฐ" ๋˜๋Š” ์ผ์ •์ด ์žˆ๋Š” ์นธ ์•„๋ฌด ๋ฐ๋‚˜** ๋ˆ„๋ฅด๋ฉด **๊ทธ ์นธ์„ ๋ฎ์œผ๋ฉฐ ๋œจ๋Š” ํŒ**์— ๊ทธ ๋‚ ์งœ์˜ ์ผ์ •์ด ์ „๋ถ€ ํŽผ์ณ์ง„๋‹ค. ํญ๋„ ๋‹ค๋ฅด๋‹ค: `SCalendar` ๋Š” ์ œ ํญ์„ ๊ฐ–๋Š” ์š”์†Œ, `SCalendarBoard` ๋Š” ํŽ˜์ด์ง€ ํญ์„ ์ฑ„์šฐ๋Š” ๋ธ”๋ก์ด๋‹ค.
1400
+ - **`SCalendarBoard` ๋Š” ๊ธฐ๋ณธ์ด ์ฝ๊ธฐ ์ „์šฉ ํŒ์ด๋‹ค.** ๋‚ ์งœ ์นธ์„ ๋ˆŒ๋Ÿฌ **๊ณ ๋ฅด๊ฒŒ** ํ•˜๋ ค๋ฉด `selectable` ์„ ์ผ ๋‹ค โ€” ์ผœ์•ผ `onValueChange(date, events)` ๋กœ ๊ณ ๋ฅธ ๋‚ ์งœ์™€ **๊ทธ ๋‚ ์งœ์˜ ์ผ์ •**์ด ํ•จ๊ป˜ ์˜จ๋‹ค. ๋‹ค๋งŒ **์ผ์ •์ด ์žˆ๋Š” ์นธ์€ `selectable` ๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋ˆŒ๋ฆฐ๋‹ค** โ€” ๊ทธ๋•Œ๋Š” ๋ชฉ๋ก ํŒ์ด ์—ด๋ฆฐ๋‹ค. ๋‘˜ ๋‹ค ์ผœ์ ธ ์žˆ์œผ๋ฉด ๊ณ ๋ฅด๊ธฐ์™€ ์—ด๊ธฐ๊ฐ€ ํ•จ๊ป˜ ์ผ์–ด๋‚œ๋‹ค. ์ผ์ • ๋ฒ„ํŠผ๊ณผ "N๊ฐœ ๋”๋ณด๊ธฐ" ๋„ ํ•ญ์ƒ ๋ˆŒ๋ฆฐ๋‹ค.
1401
+ - **์นธ ๋ฐฐ๊ฒฝ๊ณผ ์ผ์ • ์ƒ‰์€ ๋‹ค๋ฅธ ์ธต์ด๋‹ค.** ๊ทธ๋‚ ์˜ ์„ฑ๊ฒฉ(๋งˆ๊ฐยท์™„๋ฃŒยทํœด๋ฌด ๋“ฑ)์€ `dayColors` ๋กœ **์นธ ์ „์ฒด**์— ์น ํ•˜๊ณ (`default` `danger` `accent` `complete` `dim`), ์ผ์ • ํ•˜๋‚˜์˜ ์ƒ‰์€ `events[].color` ๋กœ ์ค€๋‹ค. ๋‘˜์„ ์„ž์–ด ์“ฐ๋ฉด ์„œ๋กœ๋ฅผ ๊ฐ€๋ฆฌ์ง€ ์•Š๊ณ  ํ•จ๊ป˜ ์ฝํžŒ๋‹ค.
1402
+ - ์ผ์ • ์™ผ์ชฝ์˜ ์ƒ‰ ์ ์€ `SBadge` ๋‹ค โ€” `events[].color` ํ”„๋ฆฌ์…‹์ด ์  ์ƒ‰๊นŒ์ง€ ์ •ํ•˜๊ณ , ๋”ฐ๋กœ ์ฃผ๋ ค๋ฉด `dotColor` ์— `SBadge` 9์ƒ‰ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋„ฃ๋Š”๋‹ค (ยง3-1).
1403
+ - **์นธ ๋ณธ๋ฌธ์„ ํ†ต์งธ๋กœ ๋ฐ”๊พธ๋ ค๋ฉด `dayContent` ๋‹ค.** ์ผ์ •์œผ๋กœ ํ‘œํ˜„๋˜์ง€ ์•Š๋Š” ๊ทธ๋‚ ์น˜ ์š”์•ฝ(์žฌ๊ณ ยท๋งค์ถœ ๊ฐ™์€)์„ ์นธ์— ์–น์„ ๋•Œ ์“ด๋‹ค. **์Šฌ๋กฏ์„ ์ค€ ๋‚ ์งœ๋Š” ๊ทธ ๋‚ ์งœ์˜ `events` ๋ฅผ ๊ทธ๋ฆฌ์ง€ ์•Š๊ณ  ๋ชฉ๋ก ํŒ๋„ ์—ด์ง€ ์•Š๋Š”๋‹ค** โ€” ํ•œ ์นธ์— ๋‘˜์„ ๊ฒน์ณ ๋‹ด์ง€ ์•Š๋Š”๋‹ค. ์ผ์ •๊ณผ ์š”์•ฝ์„ ํ•จ๊ป˜ ๋ณด์—ฌ์•ผ ํ•˜๋ฉด ์š”์•ฝ์„ ์ผ์ • ํ•œ ๊ฑด(`events[]`)์œผ๋กœ ๋„ฃ๋Š”๋‹ค.
1404
+ - **`SCalendarBoard` ๋Š” ๋†’์ด๋ฅผ ๋ถ€๋ชจ์—๊ฒŒ์„œ ๋ฐ›๋Š”๋‹ค.** ํ–‰์ด ๊ทธ ๋†’์ด๋ฅผ ๊ท ๋“ฑํ•˜๊ฒŒ ๋‚˜๋ˆ  ๊ฐ–๊ณ , ์นธ ๋†’์ด๊ฐ€ ๋‹ค์‹œ "ํ•œ ์นธ์— ๋ช‡ ์ค„์ด ๋ณด์ผ์ง€" ๋ฅผ ์ •ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ **๋†“๋Š” ์ž๋ฆฌ์— ๋†’์ด๋ฅผ ์ค€๋‹ค** โ€” ํŽ˜์ด์ง€ ๋ณธ๋ฌธ์˜ ๋‚จ์€ ๋†’์ด๋ฅผ ์ฑ„์šฐ๋ ค๋ฉด `SPage` ์•ˆ์—์„œ ์Šคํƒ์„ `flex-1 min-h-0` ์œผ๋กœ ๋‘๊ณ  ํŒ์— `h-full` ์„ ์ค€๋‹ค. ๋†’์ด๋ฅผ ์ฃผ์ง€ ์•Š์œผ๋ฉด ์นธ์ด ์ตœ์†Œ ๋†’์ด๋กœ ์ฃผ์ €์•‰์•„ ํ•œ๋‘ ์ค„๋งŒ ๋ณด์ธ๋‹ค.
1405
+ - **ํ•œ ์นธ์— ๋ช‡ ์ค„์„ ํŽผ์น ์ง€๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฐ๋‹ค.** ์กฐ์ ˆํ•˜๋Š” prop ์ด ์—†๋‹ค โ€” ์นธ ๋†’์ด์—์„œ ๋‚˜์˜ค๋Š” ๊ฐ’์ด๋ผ ๋”ฐ๋กœ ์ •ํ•  ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์ค„์ด ๋„˜์น˜๋ฉด ๋งˆ์ง€๋ง‰ ํ•œ ์ค„์„ "N๊ฐœ ๋”๋ณด๊ธฐ" ์— ๋‚ด์ฃผ๋ฏ€๋กœ **์ ‘ํžˆ๋“  ์•„๋‹ˆ๋“  ์นธ ๋†’์ด๊ฐ€ ๊ฐ™๋‹ค.** **์†Œ๋น„ ์•ฑ์ด `events` ๋ฅผ ๋ฏธ๋ฆฌ ์ž˜๋ผ ๋„˜๊ธฐ์ง€ ์•Š๋Š”๋‹ค.** ์ž˜๋ผ ๋„˜๊ธฐ๋ฉด "N๊ฐœ ๋”๋ณด๊ธฐ" ์˜ ์ˆ˜๊ฐ€ ์‹ค์ œ ๊ฑด์ˆ˜์™€ ์–ด๊ธ‹๋‚˜๊ณ , ๋ˆŒ๋Ÿฌ๋„ ๋‚˜๋จธ์ง€๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค.
1406
+ - **`events[].label` ์€ ํ•„์ˆ˜๋‹ค** โ€” ์ผ์ •์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๋ฆฌ๋Š” ๋ถ€๋ถ„์ด๋ผ ๋น„์›Œ ๋‘์ง€ ์•Š๋Š”๋‹ค. ์ธ๋ผ์ธ HTML ์„ ๋ฐ›์œผ๋ฏ€๋กœ ๋ถ€๋ถ„ ๊ฐ•์กฐ๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งŒ ํƒœ๊ทธ๋ฅผ ์“ฐ๊ณ , ๋‚˜๋จธ์ง€๋Š” `description`ยท`value` ๋กœ ๋‚˜๋ˆ  ๋‹ด๋Š”๋‹ค. ์นธ์ด ์ข์•„์ง€๋ฉด `label`+`description` ์ด ํ•œ ๋ฉ์–ด๋ฆฌ๋กœ ๋ง์ค„์ž„๋˜๊ณ  `value` ๋งŒ ๋์— ์˜จ์ „ํžˆ ๋‚จ๋Š”๋‹ค โ€” **๊ธˆ์•กยท์ˆ˜๋Ÿ‰์€ ๋ฐ˜๋“œ์‹œ `value` ์— ๋‹ด๋Š”๋‹ค.** `description` ์— ๋„ฃ์œผ๋ฉด ์ž˜๋ฆฐ๋‹ค.
1075
1407
  - `SDatePickerYearListbox`ยท`SDatePickerMonthListbox` ๋Š” `SDatePicker` ์˜ mode listbox ์กฐ๊ฐ๋งŒ ๋–ผ์–ด๋‚ธ ์ปดํฌ๋„ŒํŠธ๋‹ค. ์ผ๋ฐ˜ ํผ ์ž…๋ ฅ์—๋Š” `SDatePicker mode="year" | "month"` ๋ฅผ ์šฐ์„  ์“ฐ๊ณ , ๋‹ค๋ฅธ ํŠธ๋ฆฌ๊ฑฐยทํŒ์˜ค๋ฒ„ ์•ˆ์— ๋ฆฌ์ŠคํŠธ๋งŒ ๋ผ์›Œ ๋„ฃ์„ ๋•Œ๋งŒ ์ง์ ‘ ์“ด๋‹ค.
1076
1408
 
1077
1409
  **๋‚ ์งœยท์‹œ๊ฐ„ ํ”ผ์ปค๋Š” ํญ ์ƒํ•œ์„ ์Šค์Šค๋กœ ๊ฐ–๋Š”๋‹ค โ€” `width` ๋ฅผ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.** ๊ฐ’ ๊ธธ์ด๊ฐ€ `YYYY-MM-DD` ์ฒ˜๋Ÿผ ์ •ํ•ด์ ธ ์žˆ์–ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ์ด์ฆˆ๋ณ„ ์ƒํ•œ์„ ์•ˆ๋‹ค. `SKeyValueTable` ์ด ๋ชจ๋“  ์ปจํŠธ๋กค์— `width="100%"` ๋ฅผ ๋„˜๊ธฐ์ง€๋งŒ, ์ด ์ƒํ•œ ๋•๋ถ„์— ํ–‰ ์ „์ฒด๋กœ ๋Š˜์–ด๋‚˜์ง€ ์•Š๊ณ  ์ œ ํญ์—์„œ ๋ฉˆ์ถ˜๋‹ค.
@@ -1085,9 +1417,25 @@ const columns: STableColumn[] = [
1085
1417
 
1086
1418
  `SDateRangePicker` ๊ฐ€ ํ•œ ๋“ฑ๊ธ‰์”ฉ ์œ„์ธ ๊ฒƒ์€ ๊ฐ’์ด `YYYY-MM-DD ~ YYYY-MM-DD` ๋กœ ๋‘ ๋ฐฐ๊ฐ€ ๋„˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ฐ™์€ ์ด์œ ๋กœ `STimeRangePicker` ์˜ ์˜ค์ „/์˜คํ›„ ๋ชจ๋“œ๋„ sm ์—์„œ ํ•œ ๋“ฑ๊ธ‰ ์œ„๋ฅผ ์“ด๋‹ค โ€” ๊ทธ ๋ชจ๋“œ์˜ ์ตœ์†Œ ํญ์ด md ๋“ฑ๊ธ‰์„ ์ด๋ฏธ ๋„˜์–ด, ๊ทธ๋Œ€๋กœ ๋‘๋ฉด ํ•˜ํ•œ์ด ์ƒํ•œ์„ ๋„˜์–ด ์ƒํ•œ์ด ๋ฌด๋ ฅํ•ด์ง„๋‹ค.
1087
1419
 
1420
+ `SDatePicker` ๋งŒ ์ด ์ƒํ•œ์„ `maxWidth` ๋กœ ๋ฎ์„ ์ˆ˜ ์žˆ๋‹ค โ€” ๋“ฑ๊ธ‰์„ ์ฃผ๋ฉด ๊ทธ ๋“ฑ๊ธ‰์ด ์ƒํ•œ์ด ๋˜๊ณ , `width="100%" maxWidth="100%"` ๋ฉด ๋ถ€๋ชจ ํญ์„ ๊ทธ๋Œ€๋กœ ์ฑ„์šด๋‹ค. **ํญ์ด ์ด๋ฏธ ์ข๊ฒŒ ์ •ํ•ด์ง„ ์ž๋ฆฌ(ํŒ์˜ค๋ฒ„ยท์ข์€ ์นด๋“œ)์—์„œ๋งŒ ์“ด๋‹ค.** ํผยทํ‘œ ํ–‰์—์„œ๋Š” ์“ฐ์ง€ ์•Š๋Š”๋‹ค โ€” ๊ฑฐ๊ธฐ์„œ ์ƒํ•œ์„ ํ’€๋ฉด 4~10๊ธ€์ž์งœ๋ฆฌ ๊ฐ’์ด ํ–‰ ์ „์ฒด๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค.
1421
+
1422
+ ##### ๊ฐ’์„ ์ง€์šธ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด `clearable`
1423
+
1424
+ `SSelect` ยท `SDatePicker` ยท `SDateRangePicker` ยท `STimePicker` ยท `STimeRangePicker` ๊ฐ€ ๊ฐ™์€ ๊ทœ์น™์œผ๋กœ ๊ฐ–๋Š”๋‹ค. ๊ฐ’์ด ์žˆ์„ ๋•Œ๋งŒ ์ง€์šฐ๊ธฐ ๋ฒ„ํŠผ์ด ๋‚˜ํƒ€๋‚˜๊ณ , ๋ˆ„๋ฅด๋ฉด **`onValueChange` ๋กœ `null` ์ด ์˜จ๋‹ค** (๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋‹ค). ๋ฐ›๋Š” ์ชฝ ์ƒํƒœ๋„ `null` ์„ ๋‹ด์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
1425
+
1426
+ ```tsx
1427
+ const [from, setFrom] = useState<string | null>(null);
1428
+
1429
+ <SDatePicker label="์‹œ์ž‘์ผ" clearable value={from} onValueChange={setFrom} />;
1430
+ ```
1431
+
1432
+ - **์กฐํšŒ ์กฐ๊ฑด(ํ•„ํ„ฐ)์—๋Š” ์ผ ๋‹ค.** ํ•œ ๋ฒˆ ๊ณ ๋ฅธ ๋‚ ์งœ๋ฅผ ๋˜๋Œ๋ฆด ๋ฐฉ๋ฒ•์ด ์—†์œผ๋ฉด ์ „์ฒด ์กฐํšŒ๋กœ ๋Œ์•„๊ฐ€๋ ค๊ณ  ์ƒˆ๋กœ๊ณ ์นจํ•˜๊ฒŒ ๋œ๋‹ค.
1433
+ - **ํ•„์ˆ˜ ์ž…๋ ฅ ํ•„๋“œ์—๋Š” ์ผœ์ง€ ์•Š๋Š”๋‹ค.** ์ง€์šฐ๋ฉด ๋‹ค์‹œ ๊ณ ๋ฅด๊ธฐ ์ „๊นŒ์ง€ ํผ์ด ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•œ๋‹ค โ€” ์ง€์šธ ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฐ’์ด๋ฉด ์• ์ดˆ์— ํ•„์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.
1434
+ - `disabled` ์ด๋ฉด ์ง€์šฐ๊ธฐ ๋ฒ„ํŠผ๋„ ํ•จ๊ป˜ ์‚ฌ๋ผ์ง„๋‹ค. ๋ˆ ํ•„๋“œ๋ฅผ ์ง€์šธ ์ˆ˜ ์žˆ์œผ๋ฉด ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
1435
+
1088
1436
  #### 3-7-5. SField ๋ฅผ ์ง์ ‘ ์“ฐ๋Š” ๊ฒฝ์šฐ
1089
1437
 
1090
- **๊ฑฐ์˜ ์—†๋‹ค.** `SInput`ยท`SNumberInput`ยท`STextarea`ยท`SSelect`ยท๋‚ ์งœ/์‹œ๊ฐ„ ํ”ผ์ปค๋Š” ์ด๋ฏธ ๋‚ด๋ถ€์—์„œ `SField` ๋ฅผ ์“ฐ๊ณ  ์žˆ์–ด์„œ `label`ยท`required`ยท์—๋Ÿฌ ํ‘œ์‹œ๋ฅผ ์ž๊ธฐ prop ์œผ๋กœ ๋ฐ›๋Š”๋‹ค. ๊ทธ ์œ„์— `SField` ๋ฅผ ํ•œ ๊ฒน ๋” ๊ฐ์‹ธ๋ฉด ๋ผ๋ฒจ์ด ๋‘ ๋ฒˆ ๋‚˜์˜จ๋‹ค.
1438
+ **๊ฑฐ์˜ ์—†๋‹ค.** `SInput`ยท`SNumberInput`ยท`STextarea`ยท`SEditor`ยท`SSelect`ยท๋‚ ์งœ/์‹œ๊ฐ„ ํ”ผ์ปค๋Š” ์ด๋ฏธ ๋‚ด๋ถ€์—์„œ `SField` ๋ฅผ ์“ฐ๊ณ  ์žˆ์–ด์„œ `label`ยท`required`ยท์—๋Ÿฌ ํ‘œ์‹œ๋ฅผ ์ž๊ธฐ prop ์œผ๋กœ ๋ฐ›๋Š”๋‹ค. ๊ทธ ์œ„์— `SField` ๋ฅผ ํ•œ ๊ฒน ๋” ๊ฐ์‹ธ๋ฉด ๋ผ๋ฒจ์ด ๋‘ ๋ฒˆ ๋‚˜์˜จ๋‹ค.
1091
1439
 
1092
1440
  ์ง์ ‘ ์“ฐ๋Š” ๊ฒฝ์šฐ๋Š” ํ•˜๋‚˜๋ฟ์ด๋‹ค โ€” **๋””์ž์ธ ์‹œ์Šคํ…œ์— ์—†๋Š” ์ปจํŠธ๋กค**์— ๋‹ค๋ฅธ ํ•„๋“œ์™€ ๋˜‘๊ฐ™์€ ๋ผ๋ฒจยทํ•„์ˆ˜ยท์—๋Ÿฌ ๋ชจ์–‘์„ ๋ถ™์ผ ๋•Œ.
1093
1441
 
@@ -1100,15 +1448,17 @@ const columns: STableColumn[] = [
1100
1448
  | **์ˆœ์„œ ์ž์ฒด๊ฐ€ ๋ฐ์ดํ„ฐ**๋ผ ์‚ฌ์šฉ์ž๊ฐ€ ๋Œ์–ด์„œ ๋ฐ”๊พผ๋‹ค | `SDraggableList` + `SDraggableItem` |
1101
1449
 
1102
1450
  - **ํ•ญ๋ชฉ ํ•˜๋‚˜์˜ ์†์„ฑ์„ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์€ ๋ชฉ๋ก์ด ์•„๋‹ˆ๋‹ค.** `๋ผ๋ฒจ: ๊ฐ’` ์ด ์„ธ๋กœ๋กœ ์Œ“์ด๋Š” ๊ฒƒ์€ `SKeyValueTable` ์ด๋‹ค (ยง4-4).
1103
- - `SList` ๋Š” ๋ ˆ์ด์•„์›ƒ๋งŒ ๋‹ด๋‹นํ•œ๋‹ค. ํŽผ์นจยท๋‹จ์ผ ์„ ํƒ ๋™์ž‘์ด ํ•„์š”ํ•˜๋ฉด `SExpansionList` ๋‹ค (ยง3-7-7).
1104
- - **ํ•ญ๋ชฉ ์‚ฌ์ด ๊ตฌ๋ถ„์„ ์€ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ทธ๋ฆฐ๋‹ค.** `SListItem`ยท`SExpansionItem`ยท`SDraggableItem` ์…‹ ๋‹ค ์Šค์Šค๋กœ ๊ตฌ๋ถ„์„ ์„ ๊ทธ๋ฆฌ์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋ชฉ๋ก์„ ๊ฐ์‹ธ๋Š” `SList`ยท`SExpansionList`ยท`SDraggableList` ์— `separator` ๋ฅผ ์ค€๋‹ค โ€” ์•„์ดํ…œ์— `border-b` ๋ฅผ ์ง์ ‘ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค. ํ…Œ๋‘๋ฆฌํ˜•(`bordered`)์€ ํ…Œ๋‘๋ฆฌ๊ฐ€ ๊ตฌ๋ถ„ ์—ญํ• ์„ ํ•˜๋ฏ€๋กœ `separator` ๋Œ€์‹  `useGap` ์œผ๋กœ ๋„์šด๋‹ค.
1105
- - **`SListItem` ์€ ๊ธฐ๋ณธ์ด ํ‘œ์‹œ ์ „์šฉ์ด๋‹ค.** ๋ˆŒ๋Ÿฌ์„œ ์ด๋™ยท์„ ํƒํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด `clickable` ์„ ์ค€๋‹ค โ€” hoverยท`selected`ยท`interaction="chevron"` ํ‘œํ˜„์ด ์ „๋ถ€ ์—ฌ๊ธฐ์— ๋”ธ๋ ค ์žˆ์–ด์„œ, `clickable` ์—†์ด `selected` ๋งŒ ์ฃผ๋ฉด ์„ ํƒ ํ‘œ์‹œ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค. `SExpansionList` ๋Š” ์„ ํƒ์„ ์ž๊ธฐ๊ฐ€ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ์ž์‹ ์•„์ดํ…œ์„ ์•Œ์•„์„œ ํด๋ฆญ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
1451
+ - `SList` ๋Š” ๋ ˆ์ด์•„์›ƒ๋งŒ ๋‹ด๋‹นํ•œ๋‹ค. depth ๋ณ„ ๋‹จ์ผ ํŽผ์นจ์ด ํ•„์š”ํ•˜๋ฉด `SExpansionList` ๋‹ค (ยง3-7-7).
1452
+ - **`SList` ์˜ ์ž์‹์€ `SListItem` ์„ ๊ถŒ์žฅํ•œ๋‹ค.** ๋‹ค๋ฅธ ์ž์‹๋„ ๊ทธ๋Œ€๋กœ ๋ Œ๋”๋˜์ง€๋งŒ, ํŽผ์น˜๋Š” ํ•ญ๋ชฉ์€ `SExpansionList` + `SExpansionItem` ์ด, ๋Œ์–ด์„œ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋Š” ํ•ญ๋ชฉ์€ `SDraggableList` + `SDraggableItem` ์ด ์—ฌ๋‹ซํž˜ยท์ •๋ ฌ ๋™์ž‘๊นŒ์ง€ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ๊ทธ์ชฝ์„ ์“ด๋‹ค (ยง3-7-7).
1453
+ - **ํ•ญ๋ชฉ ์‚ฌ์ด ๊ตฌ๋ถ„์„ ์€ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์•Œ์•„์„œ ๊ทธ๋ฆฐ๋‹ค.** `SListItem`ยท`SExpansionItem`ยท`SDraggableItem` ์…‹ ๋‹ค ์Šค์Šค๋กœ ๊ตฌ๋ถ„์„ ์„ ๊ทธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. `SList`ยท`SExpansionList`ยท`SDraggableList` ๊ฐ€ ์ž์‹ **์‚ฌ์ด์—** ๊ตฌ๋ถ„์„ ์„ ๋„ฃ์œผ๋ฏ€๋กœ ์•„์ดํ…œ์— `border-b` ๋ฅผ ์ง์ ‘ ๋ถ™์ด์ง€ ์•Š๊ณ , ์ผœ๋Š” prop ๋„ ๋”ฐ๋กœ ์—†๋‹ค. ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ ์•„๋ž˜์—๋Š” ์„ ์ด ๋‚จ์ง€ ์•Š๋Š”๋‹ค. ํ…Œ๋‘๋ฆฌํ˜•(`bordered`)์€ ํ…Œ๋‘๋ฆฌ๊ฐ€ ๊ตฌ๋ถ„ ์—ญํ• ์„ ํ•˜๋ฏ€๋กœ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ตฌ๋ถ„์„ ์„ ๋นผ๊ณ , `gap` ์œผ๋กœ ๋„์šด๋‹ค โ€” `gap` ์„ ์ค€ ๋ชฉ๋ก์—๋„ ๊ตฌ๋ถ„์„ ์€ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค.
1454
+ - **`SListItem` ์€ ๊ธฐ๋ณธ์ด ํ‘œ์‹œ ์ „์šฉ์ด๋‹ค.** ๋ˆŒ๋Ÿฌ์„œ ์ด๋™ยท์„ ํƒํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด `clickable` ์„ ์ค€๋‹ค โ€” hoverยท`selected`ยท`interaction="chevron"` ํ‘œํ˜„์ด ์ „๋ถ€ ์—ฌ๊ธฐ์— ๋”ธ๋ ค ์žˆ์–ด์„œ, `clickable` ์—†์ด `selected` ๋งŒ ์ฃผ๋ฉด ์„ ํƒ ํ‘œ์‹œ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค. `SExpansionList` ๋Š” ์ž์‹ ์•„์ดํ…œ์„ ์•Œ์•„์„œ ํด๋ฆญ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ด ํ•จ์ •์„ ๋ง‰์•„ ์ค€๋‹ค โ€” ์„ ํƒ ์ƒํƒœ ์ž์ฒด๋Š” ์•ฑ์ด ๋“ ๋‹ค (ยง3-7-7).
1106
1455
 
1107
1456
  ```tsx
1108
- โœ… <SList separator><SListItem title="์ผ๋ฐ˜ ๋ฌธ์˜" />โ€ฆ</SList> {/* ์ค„๋กœ ๊ตฌ๋ถ„๋˜๋Š” ๋ชฉ๋ก */}
1109
- โœ… <SList useGap><SListItem title="์ผ๋ฐ˜ ๋ฌธ์˜" bordered />โ€ฆ</SList> {/* ์นด๋“œ์ฒ˜๋Ÿผ ๋–จ์–ด์ง„ ๋ชฉ๋ก */}
1457
+ โœ… <SList><SListItem title="์ผ๋ฐ˜ ๋ฌธ์˜" />โ€ฆ</SList> {/* ์ค„๋กœ ๊ตฌ๋ถ„๋˜๋Š” ๋ชฉ๋ก โ€” ๊ตฌ๋ถ„์„ ์€ ์ž๋™ */}
1458
+ โœ… <SList gap><SListItem title="์ผ๋ฐ˜ ๋ฌธ์˜" bordered />โ€ฆ</SList> {/* ์นด๋“œ์ฒ˜๋Ÿผ ๋–จ์–ด์ง„ ๋ชฉ๋ก */}
1110
1459
  โœ… <SListItem title="์ผ๋ฐ˜ ๋ฌธ์˜" clickable selected onClick={โ€ฆ} /> {/* ๋ˆŒ๋Ÿฌ์„œ ๊ณ ๋ฅด๋Š” ๋ชฉ๋ก */}
1111
- โŒ <SList><SListItem title="์ผ๋ฐ˜ ๋ฌธ์˜" className="border-b" />โ€ฆ</SList>
1460
+ โŒ <SList><SListItem title="์ผ๋ฐ˜ ๋ฌธ์˜" className="border-b" />โ€ฆ</SList> {/* ๊ตฌ๋ถ„์„ ์„ ์ง์ ‘ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค */}
1461
+ โŒ <SList><><SListItem title="์ผ๋ฐ˜ ๋ฌธ์˜" /><SListItem title="๊ฒฐ์ œ ๋ฌธ์˜" /></></SList> {/* Fragment ๋กœ ๋ฌถ์œผ๋ฉด ๊ทธ ์•ˆ์ชฝ์€ ๊ตฌ๋ถ„๋˜์ง€ ์•Š๋Š”๋‹ค */}
1112
1462
  โŒ <SListItem title="์ผ๋ฐ˜ ๋ฌธ์˜" selected /> {/* clickable ์—†์œผ๋ฉด ์„ ํƒ ํ‘œ์‹œ๊ฐ€ ์•ˆ ๋‚˜์˜จ๋‹ค */}
1113
1463
  ```
1114
1464
 
@@ -1120,7 +1470,30 @@ const columns: STableColumn[] = [
1120
1470
  | **ํ•œ ๋ฒˆ์— ํ•˜๋‚˜๋งŒ** ์—ด๋ ค์•ผ ํ•œ๋‹ค (์•„์ฝ”๋””์–ธ) | `SExpansionList` + `SExpansionItem` |
1121
1471
  | **๋ถ€๋ชจ-์ž์‹ ๊ณ„์ธต ์ž์ฒด**๋ฅผ ๋ณด์—ฌ์ค˜์•ผ ํ•œ๋‹ค (2๋‹จ ์ด์ƒ, ์—ฐ๊ฒฐ์„ ) | `STree` |
1122
1472
 
1123
- `SExpansionList` ๋Š” depth ๋ณ„ ๋‹จ์ผ ํ™•์žฅยท์„ ํƒ์„ ๊ด€๋ฆฌํ•˜๋Š” wrapper ๋‹ค. ์ง์ ‘ `useState` ๋กœ "์—ด๋ฆฐ ํ•ญ๋ชฉ ํ•˜๋‚˜"๋ฅผ ๋“ค๊ณ  ์žˆ์ง€ ์•Š๋Š”๋‹ค. ํ•ญ๋ชฉ ์‚ฌ์ด ๊ตฌ๋ถ„์„ ์€ ์—ฌ๊ธฐ์„œ๋„ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ทธ๋ฆฐ๋‹ค โ€” `separator` ๋ฅผ ์ค€๋‹ค (ยง3-7-6).
1473
+ `SExpansionList` ๋Š” depth ๋ณ„ **๋‹จ์ผ ํ™•์žฅ**์„ ๊ด€๋ฆฌํ•˜๋Š” wrapper ๋‹ค. ์ง์ ‘ `useState` ๋กœ "์—ด๋ฆฐ ํ•ญ๋ชฉ ํ•˜๋‚˜"๋ฅผ ๋“ค๊ณ  ์žˆ์ง€ ์•Š๋Š”๋‹ค. ํ•ญ๋ชฉ ์‚ฌ์ด ๊ตฌ๋ถ„์„ ์€ ์—ฌ๊ธฐ์„œ๋„ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์•Œ์•„์„œ ๊ทธ๋ฆฐ๋‹ค โ€” ๋”ฐ๋กœ ์ค„ prop ์ด ์—†๋‹ค (ยง3-7-6).
1474
+
1475
+ ##### ํŽผ์นจ โ‰  ์„ ํƒ
1476
+
1477
+ **ํŽผ์นจ์€ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๊ณ , ์„ ํƒ์€ ์•ฑ์ด ๊ด€๋ฆฌํ•œ๋‹ค.**
1478
+
1479
+ ํŽผ์นจ์€ ํ™”๋ฉด ๋ฐ–์— ์ง„์‹ค์ด ์—†๋Š” ์ˆœ๊ฐ„ UI ์ƒํƒœ๋‹ค. ๊ฐ ํ•ญ๋ชฉ์ด ์ž๊ธฐ `expanded` ๋ฅผ ๋“ค๊ณ  ์žˆ์œผ๋ฉด "ํ•˜๋‚˜๋งŒ ์—ด๋ฆผ"์„ ๋งŒ๋“ค ์ˆ˜ ์—†์–ด ๋ˆ„๊ตฐ๊ฐ€ ๋‚˜๋จธ์ง€๋ฅผ ๋‹ซ์•„์•ผ ํ•˜๊ณ , ๊ทธ๊ฒƒ์ด ์ด wrapper ๋‹ค.
1480
+
1481
+ ์„ ํƒ์€ ๋‹ค๋ฅด๋‹ค. ์•ฑ์ด `selectedId` ์Šค์นผ๋ผ ํ•˜๋‚˜๋ฅผ ๋“ค๋ฉด ์ƒํ˜ธ๋ฐฐ์ œ๊ฐ€ ๊ตฌ์กฐ์ ์œผ๋กœ ๋ณด์žฅ๋˜๊ณ , ๊ทธ ๊ฐ’์€ URLยทstore ๋กœ ๋ณต์›๋ผ์•ผ ํ•œ๋‹ค. ๋ฆฌ์ŠคํŠธ๊ฐ€ ์‚ฌ๋ณธ์„ ๋“ค๋ฉด ๊ทธ ์ˆœ๊ฐ„ ์ง„์‹ค์ด ๋‘˜์ด ๋˜์–ด ์–ด๊ธ‹๋‚œ๋‹ค.
1482
+
1483
+ ```tsx
1484
+ const [selectedId, setSelectedId] = useState<string>();
1485
+
1486
+ <SExpansionList>
1487
+ {/* ํ•˜์œ„๊ฐ€ ์—†๋Š” ํ•ญ๋ชฉ(์ „์ฒดยท๋ฏธ๋ถ„๋ฅ˜)์€ SExpansionItem ์ด ์•„๋‹ˆ๋ผ SListItem ์ด๋‹ค */}
1488
+ <SListItem title="์ „์ฒด" selected={selectedId === 'all'} onClick={() => setSelectedId('all')} />
1489
+ <SExpansionItem title="์กฐ์ง">
1490
+ <SListItem title="์˜์—…ํŒ€" selected={selectedId === 'sales'} onClick={() => setSelectedId('sales')} />
1491
+ </SExpansionItem>
1492
+ </SExpansionList>
1493
+ ```
1494
+
1495
+ - `clickable` ์€ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ž์‹ `SListItem` ์— ๊ธฐ๋ณธ์œผ๋กœ ์ผœ ์ค€๋‹ค โ€” `clickable` ์—†์ด `selected` ๋งŒ ์ฃผ๋ฉด ํ‘œ์‹œ๊ฐ€ ์•ˆ ๋‚˜์˜ค๋Š” ํ•จ์ •(ยง3-7-6)์„ ๋ง‰๋Š” ๊ฐ’์ด๋‹ค.
1496
+ - **ํ•˜์œ„๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ํ•ญ๋ชฉ์€ `SExpansionItem` ์ด ์•„๋‹ˆ๋ผ `SListItem`** ์œผ๋กœ ๋‘”๋‹ค. ํŽผ์น  ๊ฒƒ์ด ์—†๋Š”๋ฐ ํŽผ์นจ ํ•ญ๋ชฉ์œผ๋กœ ๋งŒ๋“ค๋ฉด ํ™”์‚ดํ‘œ๋งŒ ๋‚จ๋Š”๋‹ค.
1124
1497
 
1125
1498
  #### 3-7-8. SCard vs SSectionHeaderCard
1126
1499
 
@@ -1133,6 +1506,22 @@ const columns: STableColumn[] = [
1133
1506
  - **์นด๋“œ ์•ˆ์— ์นด๋“œ๋ฅผ ๊ฒน์น˜์ง€ ์•Š๋Š”๋‹ค.** ์„น์…˜ ์•ˆ์„ ๋” ๋‚˜๋ˆ ์•ผ ํ•˜๋ฉด `SDivider` ๋กœ ๋Š๊ฑฐ๋‚˜(ยง3-6) ์„น์…˜์„ ๋‘˜๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.
1134
1507
  - ์•ˆ์ชฝ ์—ฌ๋ฐฑ์€ `SSectionHeaderCard` ์˜ `padding` prop ์œผ๋กœ ์ค€๋‹ค โ€” `p-sd-*` ๋ฅผ ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค (ยง2-2).
1135
1508
 
1509
+ **์นด๋“œ๊ฐ€ ์ž๊ธฐ ์•ˆ์—์„œ ํ™•์ •ํ•˜๋Š” ์•ก์…˜์„ ๊ฐ€์ง€๋ฉด ํ•˜๋‹จ ๋ฒ„ํŠผ์„ `children` ์— ์ง์ ‘ ๋‘์ง€ ์•Š๋Š”๋‹ค.** ๋‘ ์นด๋“œ ๋ชจ๋‘ ๋ชจ๋‹ฌยท๋“œ๋กœ์–ด์™€ ๊ฐ™์€ ํ•˜๋‹จ ์•ก์…˜ ์˜์—ญ์„ ๊ฐ–๋Š”๋‹ค โ€” ์ฃผ ์•ก์…˜์€ `button`, ๋ณด์กฐ ๋ฒ„ํŠผ์€ `footerLeft` ๋กœ ๋„˜๊ธด๋‹ค(ยง3-3-4 ์™€ ๊ฐ™์€ ๊ทœ์น™). ๋ฐฐ๊ฒฝยท์ƒ๋‹จ ๊ตฌ๋ถ„์„ ยท์ขŒ์šฐ ์—ฌ๋ฐฑยท์–‘๋ ๋ถ„๋ฆฌ๊ฐ€ ์ปดํฌ๋„ŒํŠธ ๊ทœ์น™๋Œ€๋กœ ์žกํžˆ๊ณ , ์ขŒ์šฐ ๋์ด ํ—ค๋”ยท๋ณธ๋ฌธ๊ณผ ๋งž๋Š”๋‹ค. `footerLeft` ๋Š” ์Šฌ๋กฏ์ด๋ผ `SButton` ์„ ์ง์ ‘ ๋ฐฐ์น˜ํ•˜๋ฉฐ `size="md"` ๋ฅผ ๋ช…์‹œํ•œ๋‹ค(ยง3-5-2).
1510
+
1511
+ ```tsx
1512
+ {/* ์„น์…˜ ์•ˆ์—์„œ ๋ฐ”๋กœ ์ˆ˜์ •ยท์ €์žฅํ•˜๋Š” ์ธ๋ผ์ธ ํผ ์„น์…˜ (ยง4-4) */}
1513
+ <SSectionHeaderCard
1514
+ title="๋ฐฐ์†ก์ง€"
1515
+ marker
1516
+ footerLeft={<SButton color="neutral" outline size="md" label="์ทจ์†Œ" onClick={reset} />}
1517
+ button={{ label: '์ €์žฅ', onClick: save }}
1518
+ >
1519
+ <SKeyValueTable โ€ฆ />
1520
+ </SSectionHeaderCard>
1521
+ ```
1522
+
1523
+ **ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ํ™•์ •ํ•˜๋Š” ์•ก์…˜์€ ์นด๋“œ ํ‘ธํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ํŽ˜์ด์ง€ ํ•˜๋‹จ์— ๋‘”๋‹ค.** ์นด๋“œ ํ‘ธํ„ฐ๋Š” **๊ทธ ์นด๋“œ ์•ˆ์—์„œ ๋‹ซํžˆ๋Š” ์•ก์…˜**์˜ ์ž๋ฆฌ๋‹ค โ€” ์—ฌ๋Ÿฌ ์„น์…˜์„ ํ•œ ๋ฒˆ์— ์ €์žฅํ•˜๋Š” ๋ฒ„ํŠผ์„ ๋งˆ์ง€๋ง‰ ์นด๋“œ์˜ ํ‘ธํ„ฐ์— ๋„ฃ์œผ๋ฉด ๊ทธ ์นด๋“œ์—๋งŒ ๊ฑธ๋ฆฌ๋Š” ์•ก์…˜์œผ๋กœ ์ฝํžŒ๋‹ค. ์ด๋•Œ๋Š” ยง4-4 ์ฒ˜๋Ÿผ ์นด๋“œ ๋ฐ– ํ•˜๋‹จ ์ค„์— ๋‘”๋‹ค.
1524
+
1136
1525
  #### 3-7-9. SLinearProgress vs SCircleProgress
1137
1526
 
1138
1527
  | ํŒ๋ณ„ | ์‚ฌ์šฉ |
@@ -1157,8 +1546,11 @@ const columns: STableColumn[] = [
1157
1546
 
1158
1547
  - **๊ธฐ๋ณธ์€ `SKeyValueTable` ์ด๋‹ค** (ยง4-2). ์กฐ๊ฑด์ด ๋Œ€์—ฌ์„ฏ ๊ฐœ ์ดํ•˜๋กœ ๊ณ ์ •์ด๋ฉด ํ‘œ๋กœ ํŽผ์ณ ๋‘๋Š” ํŽธ์ด ํ•œ๋ˆˆ์— ์ฝํžŒ๋‹ค.
1159
1548
  - `SChipFilter` ๋Š” ์กฐ๊ฑด์„ **์นฉ ํ•œ ์ค„**๋กœ ์ ‘๊ณ , "ํ•„ํ„ฐ ์ถ”๊ฐ€" ๋กœ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๊บผ๋‚ด ์“ฐ๊ฒŒ ํ•œ๋‹ค. ์นฉ์„ ๋ˆ„๋ฅด๋ฉด ํŽธ์ง‘ ํŒ์˜ค๋ฒ„๊ฐ€ ์—ด๋ฆฌ๊ณ , ๋‚ ์งœ๋Š” ํ”„๋ฆฌ์…‹(์˜ค๋Š˜ยท์ง€๋‚œ 7์ผยท์‚ฌ์šฉ์ž ์ง€์ •)์œผ๋กœ ๊ณ ๋ฅธ๋‹ค. ์กฐ๊ฑด ํ›„๋ณด๊ฐ€ ๋งŽ์€ ๋ชฉ๋ก ํ™”๋ฉด์—์„œ ํ•„ํ„ฐ๊ฐ€ ํ™”๋ฉด์„ ์„ธ๋กœ๋กœ ์žก์•„๋จน๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ์šฉ๋„๋‹ค.
1160
- - ๊ฒ€์ƒ‰ ์‹คํ–‰ ์‹œ์ ์ด ๋‹ค๋ฅด๋‹ค โ€” `SKeyValueTable` ํ•„ํ„ฐ๋Š” ์•ฑ์ด ๊ฒ€์ƒ‰ ๋ฒ„ํŠผ์„ ์ง์ ‘ ๋†“์ง€๋งŒ, `SChipFilter` ๋Š” ํŽธ์ง‘ ํŒ์˜ค๋ฒ„๊ฐ€ ๋‹ซํžˆ๊ฑฐ๋‚˜ "๊ฒ€์ƒ‰" ์„ ๋ˆ„๋ฅผ ๋•Œ `onSearch` ๊ฐ€ ๊ฐ’ ๋งต๊ณผ ํ•จ๊ป˜ ํ˜ธ์ถœ๋œ๋‹ค. ๊ฐ’์ด ๋ฐ”๋€Œ์ง€ ์•Š์•˜์œผ๋ฉด ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.
1161
- - ํ•จ๊ป˜ ๊ฑธ์–ด์•ผ ํ•˜๋Š” ์กฐ๊ฑด(์˜ˆ: ๊ธฐ๊ฐ„ ์ค‘ ํ•˜๋‚˜๋Š” ํ•„์ˆ˜)์ด ์žˆ์œผ๋ฉด `fields` ๋ฅผ ๊ทธ๋ฃน์œผ๋กœ ๋„˜๊ธด๋‹ค. ๊ทœ์น™์„ ๋ชป ์ฑ„์šด ๋™์•ˆ ๊ฒฝ๊ณ  ํˆดํŒ์ด ๋–  ์žˆ๊ณ  `onSearch` ๊ฐ€ ๋ง‰ํžŒ๋‹ค.
1549
+ - ๊ฒ€์ƒ‰ ์‹คํ–‰ ์‹œ์ ์ด ๋‹ค๋ฅด๋‹ค โ€” `SKeyValueTable` ํ•„ํ„ฐ๋Š” ์•ฑ์ด ๊ฒ€์ƒ‰ ๋ฒ„ํŠผ์„ ์ง์ ‘ ๋†“์ง€๋งŒ, `SChipFilter` ๋Š” ํŽธ์ง‘ ํŒ์˜ค๋ฒ„๊ฐ€ ๋‹ซํžˆ๊ฑฐ๋‚˜ "๊ฒ€์ƒ‰" ์„ ๋ˆ„๋ฅผ ๋•Œ `onSearch` ๊ฐ€ ๊ฐ’ ๋งต๊ณผ ํ•จ๊ป˜ ํ˜ธ์ถœ๋œ๋‹ค. ๊ฐ’์ด ๋ฐ”๋€Œ์ง€ ์•Š์•˜์œผ๋ฉด ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค. **๋‹จ ๋งˆ์šดํŠธ ํ›„ ์ฒซ ํ˜ธ์ถœ์€ ๊ฐ’์ด ์ฒ˜์Œ ๊ทธ๋Œ€๋กœ์—ฌ๋„ ๋‚˜๊ฐ„๋‹ค** โ€” ๋งˆ์šดํŠธ ์‹œ ์ž๋™ ์กฐํšŒํ•˜์ง€ ์•Š๋Š” ํ™”๋ฉด(๋‹ค์ด์–ผ๋กœ๊ทธ ๋“ฑ)์—์„œ ์กฐ๊ฑด์„ ํ•˜๋‚˜๋„ ๋„ฃ์ง€ ์•Š๊ณ  ๋ˆ„๋ฅธ ์ฒซ "๊ฒ€์ƒ‰" ์ด ๋ง‰ํžˆ๋ฉด ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ **๋งˆ์šดํŠธ ์‹œ ์กฐํšŒํ• ์ง€ ๋ง์ง€๋Š” ์•ฑ์ด ์ •ํ•œ๋‹ค** โ€” `SChipFilter` ๋Š” ๋งˆ์šดํŠธ๋งŒ์œผ๋กœ `onSearch` ๋ฅผ ๋ถ€๋ฅด์ง€ ์•Š๋Š”๋‹ค.
1550
+ - **keyword ์นฉ์€ ์ž…๋ ฅ์ฐฝ์— ๋‚จ์€ ํ…์ŠคํŠธ๊นŒ์ง€ ์กฐํšŒ์— ๋„ฃ๋Š”๋‹ค.** Enter ๋กœ ๋‹ด์ง€ ์•Š๊ณ  ํŒ์˜ค๋ฒ„๋ฅผ ๋‹ซ์•„๋„(="๊ฒ€์ƒ‰" ํด๋ฆญยท๋ฐ”๊นฅ ํด๋ฆญยทEscยท๋‹ค๋ฅธ ์นฉ์œผ๋กœ ์ „ํ™˜) ๊ทธ ํ…์ŠคํŠธ๋ฅผ ํ‚ค์›Œ๋“œ๋กœ ํ™•์ •ํ•œ ๋’ค ์กฐํšŒํ•œ๋‹ค. ์•ฑ์ด ๋”ฐ๋กœ ํ™•์ •์‹œํ‚ฌ ์ผ์€ ์—†๋‹ค.
1551
+ - **๋…ธ์ถœํ•  ์นฉ์„ ์•ฑ์ด ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.** ๋ฐ”์— ๋†“์ด๋Š” ๊ฒƒ์€ `fixed`ยท`required` ํ•„๋“œ์™€ **`value` ์— ๊ฐ’์ด ๋“ค์–ด ์žˆ๋Š” ํ•„๋“œ**๋‹ค. ๋…ธ์ถœ ๋ชฉ๋ก์„ ๋ฐ–์—์„œ ๋„˜๊ธฐ๋Š” prop ์€ ์—†๋‹ค. ์ฟผ๋ฆฌ์ŠคํŠธ๋งยท์„œ๋ฒ„ ์ƒํƒœ์—์„œ ์กฐ๊ฑด์„ ๋ณต์›ํ•˜๋Š” ๋ชฉ๋ก ํ™”๋ฉด๋„ **`value` ๋งŒ ๋„˜๊ธฐ๋ฉด ์นฉ์ด ํ•จ๊ป˜ ์‚ด์•„๋‚˜๊ณ **, ๊ทธ ์กฐ๊ฑด์„ ๋นผ๋ฉด ์นฉ๋„ ํ•จ๊ป˜ ๋น ์ง„๋‹ค โ€” ์นฉ๊ณผ ์กฐํšŒ ์กฐ๊ฑด์ด ์–ด๊ธ‹๋‚  ์ž๋ฆฌ๊ฐ€ ์—†๋‹ค. "ํ•„ํ„ฐ ์ถ”๊ฐ€" ๋กœ ๊บผ๋‚ธ ํ•„ํ„ฐ๋Š” ๊ฐ’์„ ๋„ฃ๊ธฐ ์ „์—๋„ ์ž๋ฆฌ๋ฅผ ์ง€ํ‚ค์ง€๋งŒ, "๊ฒ€์ƒ‰ ์ดˆ๊ธฐํ™”" ๋ฅผ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ํ™”๋ฉด์„ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋ฉด ์‚ฌ๋ผ์ง„๋‹ค. ๊ฑธ๋ฆฐ ์กฐ๊ฑด์ด ์—†์œผ๋‹ˆ ๋ฌธ์ œ๋˜์ง€ ์•Š๋Š”๋‹ค.
1552
+ - **`fixed`ยท`required` ์ด๋ฉด์„œ ํ›„๋ณด๊ฐ€ ํ•˜๋‚˜๋ฟ์ธ `select`ยท`select-multi` ๋Š” ์ž๋™์œผ๋กœ ์„ ํƒ๋œ๋‹ค.** ๊ณ ๋ฅผ ์—ฌ์ง€๊ฐ€ ์—†๋Š” ๋ชฉ๋ก์ด๋ผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ทธ ๊ฐ’์„ ์ฑ„์šฐ๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋ฅด์ง€ ์•Š์•„๋„ `onValueChange` ๊ฐ€ ๊ทธ ๊ฐ’๊ณผ ํ•จ๊ป˜ ํ˜ธ์ถœ๋œ๋‹ค โ€” ๋งˆ์šดํŠธ ์งํ›„๋ถ€ํ„ฐ ๊ทธ ์กฐ๊ฑด์ด ๊ฐ’ ๋งต์— ๋“ค์–ด ์žˆ๋‹ค๊ณ  ๋ณด๊ณ  ์กฐํšŒ๋ฅผ ์ง ๋‹ค. ์˜ต์…˜์ด API ์‘๋‹ต์ด๋ผ ๋Šฆ๊ฒŒ ๋„์ฐฉํ•ด๋„ ๋„์ฐฉํ•œ ์‹œ์ ์— ์ฑ„์›Œ์ง€๋ฏ€๋กœ, ์•ฑ์ด ๋”ฐ๋กœ ์ฑ„์›Œ ๋„ฃ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ ๊ฐ’์„ ์ง€์šฐ๋ฉด ๋‹ค์‹œ ์ฑ„์šฐ์ง€ ์•Š๋Š”๋‹ค. **๋บ„ ์ˆ˜ ์žˆ๋Š” ํ•„ํ„ฐ๋Š” ํ›„๋ณด๊ฐ€ ํ•˜๋‚˜์—ฌ๋„ ์ฑ„์šฐ์ง€ ์•Š๋Š”๋‹ค** โ€” ์ฒ˜์Œ์— ๋ฐ”์— ์—†๋Š” ํ•„ํ„ฐ๋ผ, ์ฑ„์šฐ๋ฉด ๋ณด์ด์ง€๋„ ์ง€์šธ ์ˆ˜๋„ ์—†๋Š” ์กฐ๊ฑด์ด ๊ฒ€์ƒ‰์— ๊ฑธ๋ฆฐ๋‹ค(`defaultValue` ๋ฅผ `fixed`ยท`required` ๋กœ ์ œํ•œํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด์œ ). ํ›„๋ณด๊ฐ€ ํ•˜๋‚˜๋ฟ์ธ ์กฐ๊ฑด์„ ๋ฐ˜๋“œ์‹œ ๊ฑธ์–ด์•ผ ํ•˜๋ฉด ๊ทธ ํ•„๋“œ๋ฅผ `fixed` ๋‚˜ `required` ๋กœ ์ค€๋‹ค.
1553
+ - **`fields` ๋Š” ํ•ญ์ƒ ๊ทธ๋ฃน ๋ฐฐ์—ด์ด๋‹ค.** ๋ฌถ์„ ๊ฒƒ์ด ์—†์–ด๋„ `[{ fields: [...] }]` ๋กœ ํ•œ ๊ฒน ๊ฐ์‹ผ๋‹ค. ํ•จ๊ป˜ ๊ฑธ์–ด์•ผ ํ•˜๋Š” ์กฐ๊ฑด(์˜ˆ: ๊ธฐ๊ฐ„ ์ค‘ ํ•˜๋‚˜๋Š” ํ•„์ˆ˜)์ด ์žˆ์œผ๋ฉด ๊ทธ ํ•„๋“œ๋“ค๋งŒ ๋ณ„๋„ ๊ทธ๋ฃน์œผ๋กœ ๋–ผ์–ด `rule` ์„ ์ค€๋‹ค โ€” ๊ทœ์น™์„ ๋ชป ์ฑ„์šด ๋™์•ˆ ๊ฒฝ๊ณ  ํˆดํŒ์ด ๋–  ์žˆ๊ณ  `onSearch` ๊ฐ€ ๋ง‰ํžŒ๋‹ค. ๊ทธ๋ฃน ์•ž ๊ตฌ๋ถ„์„ ์€ `divider` ๋กœ ์ผ ๋‹ค. ๊ฒ€์ฆ ๋‹จ์œ„์™€ ๊ตฌ๋ถ„์„ ์€ ๋ณ„๊ฐœ๋ผ, ๋ฌถ์–ด์„œ ๊ฒ€์ฆ๋งŒ ํ•˜๊ณ  ์‹ถ์œผ๋ฉด `divider` ๋ฅผ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
1162
1554
 
1163
1555
  #### 3-7-12. ์ด๋ฏธ์ง€ โ€” SImage
1164
1556
 
@@ -1192,7 +1584,7 @@ const columns: STableColumn[] = [
1192
1584
  ### 4-1. ์•ฑ ์…ธ (๋ชจ๋“  ํŽ˜์ด์ง€ ๊ณตํ†ต)
1193
1585
 
1194
1586
  ```tsx
1195
- import { SLayout, SGnb, SPage, type SGnbMenuItem, type SPageHeaderProps } from 'sellmate-design-system-react';
1587
+ import { SLayout, SGnb, SPage, SPageHeader, type SGnbMenuItem, type SPageHeaderProps } from 'sellmate-design-system-react';
1196
1588
 
1197
1589
  const MENU: SGnbMenuItem[] = [
1198
1590
  { label: '์ฃผ๋ฌธ', value: 'orders', icon: 'bill' },
@@ -1209,20 +1601,24 @@ export default function AppShell({
1209
1601
  header?: SPageHeaderProps;
1210
1602
  scrollEndSpacing?: boolean;
1211
1603
  contentHeight?: SPageContentHeight;
1604
+ contentWidth?: SPageContentWidth;
1212
1605
  }) {
1213
1606
  return (
1214
1607
  <SLayout type="box" header="fix">
1215
1608
  {/* type/header/folded ๋Š” SLayout ์—๋งŒ ์ค€๋‹ค โ€” SGnb ๋Š” context ์—์„œ ์ฝ๋Š”๋‹ค */}
1216
1609
  <SGnb items={MENU} value={current} onValueChange={navigate} logo={<Logo />} />
1610
+ {/* ํŽ˜์ด์ง€ ์ œ๋ชฉ์€ SPage ์•ž์— ํ˜•์ œ๋กœ ๋‘”๋‹ค โ€” SLayout ์ด ํ—ค๋”๋ถ€ํ„ฐ ๋’ค๋ฅผ ํ•œ ์—ด๋กœ ๋ฌถ๋Š”๋‹ค.
1611
+ header ๋Š” ํŽ˜์ด์ง€๋งˆ๋‹ค ๋‹ฌ๋ผ AppShell ์ด ๊ทธ๋Œ€๋กœ ๋ฐ›์•„ ๋„˜๊ธด๋‹ค โ€” ์—ฌ๊ธฐ์„œ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค */}
1612
+ {header && <SPageHeader {...header} />}
1217
1613
  {/* ์ฝ˜ํ…์ธ  ํŒจ๋”ฉ์€ SPage ๊ฐ€ ํ† ํฐ์œผ๋กœ ๋„ฃ๋Š”๋‹ค โ€” p-sd-* ๋กœ ๋ฎ์–ด์“ฐ์ง€ ์•Š๋Š”๋‹ค */}
1218
- {/* ์Šคํฌ๋กค ๋ ์—ฌ๋ฐฑ๋„ SPage ๊ฐ€ ๋„ฃ๋Š”๋‹ค. ๋„๋Š” ๊ฑด ํŽ˜์ด์ง€๋„ค์ด์…˜ ์žˆ๋Š” ๋ชฉ๋ก๋ฟ์ด๋ผ ํŽ˜์ด์ง€๊ฐ€ ์ •ํ•œ๋‹ค */}
1219
- {/* ๋ณธ๋ฌธ์ด ๋‚จ์€ ๋†’์ด๋ฅผ ์ฑ„์šฐ๋Š” ๋ชฉ๋ก ํŽ˜์ด์ง€๋Š” contentHeight="fill" ์„ ๋„˜๊ธด๋‹ค (ยง4-2) */}
1220
- {/* header ๋Š” ํŽ˜์ด์ง€๋งˆ๋‹ค ๋‹ฌ๋ผ AppShell ์ด ๊ทธ๋Œ€๋กœ ๋ฐ›์•„ ๋„˜๊ธด๋‹ค โ€” ํŽ˜์ด์ง€ ์ œ๋ชฉ์€ ์—ฌ๊ธฐ์„œ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค */}
1614
+ {/* ๋†’์ด ๋ชจ๋“œ๋Š” ํŽ˜์ด์ง€๊ฐ€ ์ •ํ•œ๋‹ค โ€” ๋Œ€๋ถ€๋ถ„ contentHeight="fill" ์ด๋‹ค (ยง2-2) */}
1615
+ {/* ์Šคํฌ๋กค ๋ ์—ฌ๋ฐฑ๋„ SPage ๊ฐ€ ๋„ฃ๋Š”๋‹ค. ํŽ˜์ด์ง€๊ฐ€ ์‹ค์ œ๋กœ ์Šคํฌ๋กค๋˜๋Š” ํ™”๋ฉด์—์„œ๋งŒ ์ผ ๋‹ค */}
1616
+ {/* ๊ฐ€๋กœ ํญ ๋ชจ๋“œ๋„ ํŽ˜์ด์ง€๊ฐ€ ์ •ํ•œ๋‹ค โ€” ๋„“์€ ์ฐฝ์—์„œ ๋ณธ๋ฌธ์„ ๋Š˜๋ฆด์ง€ ์ตœ์†Œ ํญ์œผ๋กœ ์„ธ์šธ์ง€ */}
1221
1617
  <SPage
1222
1618
  background="frame"
1223
1619
  scrollEndSpacing={scrollEndSpacing}
1224
1620
  contentHeight={contentHeight}
1225
- header={header}
1621
+ contentWidth={contentWidth}
1226
1622
  >
1227
1623
  {children}
1228
1624
  </SPage>
@@ -1231,20 +1627,44 @@ export default function AppShell({
1231
1627
  }
1232
1628
  ```
1233
1629
 
1234
- **ํŽ˜์ด์ง€๋Š” `AppShell` ์„ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉฐ ์ž๊ธฐ `header` ๋ฅผ ๋„˜๊ธด๋‹ค** โ€” SPage ๋Š” ์…ธ ์•ˆ์— ํ•˜๋‚˜๋ฟ์ด๋ฏ€๋กœ, ํŽ˜์ด์ง€ ์ œ๋ชฉ์ด ํŽ˜์ด์ง€๋งˆ๋‹ค ๋‹ค๋ฅด๋‹ค๋Š” ์‚ฌ์‹ค์€ ์ด๋ ‡๊ฒŒ ํ”„๋ ˆ์ž„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด ํ˜๋ ค๋ณด๋‚ธ๋‹ค(ยง4-2ยทยง4-3ยทยง4-4 ์ฐธ๊ณ ).
1630
+ **ํŽ˜์ด์ง€๋Š” `AppShell` ์„ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉฐ ์ž๊ธฐ `header` ๋ฅผ ๋„˜๊ธด๋‹ค** โ€” ์…ธ์€ ์•ฑ์— ํ•˜๋‚˜๋ฟ์ด๋ฏ€๋กœ, ํŽ˜์ด์ง€ ์ œ๋ชฉ์ด ํŽ˜์ด์ง€๋งˆ๋‹ค ๋‹ค๋ฅด๋‹ค๋Š” ์‚ฌ์‹ค์€ ์ด๋ ‡๊ฒŒ ํ”„๋ ˆ์ž„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด ํ˜๋ ค๋ณด๋‚ธ๋‹ค(ยง4-2ยทยง4-3ยทยง4-4 ์ฐธ๊ณ ).
1631
+
1632
+ **์ž์‹ ์ˆœ์„œ๋Š” `SGnb` โ†’ `SPageHeader` โ†’ `SPage` ๋‹ค.** `SLayout` ์€ `SPageHeader` ์ž์‹์„ ๋ณด๋ฉด **๊ทธ ์ž์‹๋ถ€ํ„ฐ ๋’ค๋ฅผ** ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€ ์—ด๋กœ ๋ฌถ์–ด ํ—ค๋”๋ฅผ ํŽ˜์ด์ง€ ์œ„์— ๊ณ ์ •ํ•œ๋‹ค โ€” ์Šคํฌ๋กค๋„ ํŽ˜์ด์ง€ ํŒจ๋”ฉ๋„ ๊ทธ ์•„๋ž˜ `SPage` ์•ˆ์—์„œ๋งŒ ์ผ์–ด๋‚œ๋‹ค. ๊ทธ๋ž˜์„œ ์ˆœ์„œ๊ฐ€ ๊ทœ์น™์ด๋‹ค: ํ—ค๋”๋ฅผ `SGnb` ์•ž์— ๋‘๋ฉด GNB ๊นŒ์ง€ ํŽ˜์ด์ง€ ์—ด๋กœ ๋”ธ๋ ค ๋“ค์–ด๊ฐ€๊ณ , `SPage` ์˜ `children` ์•ˆ์— ๋„ฃ์œผ๋ฉด ๋ณธ๋ฌธ ํŒจ๋”ฉ ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ€ ์Šคํฌ๋กค๊ณผ ํ•จ๊ป˜ ๋ฐ€๋ ค ์˜ฌ๋ผ๊ฐ„๋‹ค.
1633
+
1634
+ **`scrolled` ๋ฅผ ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.** plain ํ—ค๋”์˜ ๊ทธ๋ฆผ์ž๋Š” ๊ฐ™์€ ์—ด์˜ `SPage` ๊ฐ€ ์˜ฌ๋ฆฐ ์Šคํฌ๋กค ์ƒํƒœ๋กœ ์ผœ์ง„๋‹ค โ€” ์†์œผ๋กœ ์ค€ ๊ฐ’์€ ๊ทธ ์ž๋™ ๋™์ž‘์„ ๋ฎ์–ด์จ ์Šคํฌ๋กค๊ณผ ์–ด๊ธ‹๋‚œ ๊ทธ๋ฆผ์ž๋ฅผ ๋‚จ๊ธด๋‹ค.
1235
1635
 
1236
- **ํŽ˜์ด์ง€ ํ—ค๋”(`header`) ์‚ฌ์šฉ ๊ทœ์น™ โ€” ์ด ์•ฑ์—์„œ๋Š” ๊ฐ’์ด ์•„๋‹ˆ๋ผ ๊ฐ’์˜ ์ผ๊ด€์„ฑ์ด ๊ทœ์น™์ด๋‹ค.**
1636
+ **ํŽ˜์ด์ง€ ํ—ค๋” ์‚ฌ์šฉ ๊ทœ์น™ โ€” ์ด ์•ฑ์—์„œ๋Š” ๊ฐ’์ด ์•„๋‹ˆ๋ผ ๊ฐ’์˜ ์ผ๊ด€์„ฑ์ด ๊ทœ์น™์ด๋‹ค.**
1237
1637
 
1238
- - **`fix` ๋Š” ์•ฑ ์ „์ฒด์—์„œ ํ•˜๋‚˜๋กœ ๊ณ ์ •ํ•œ๋‹ค.** ์–ด๋–ค ํŽ˜์ด์ง€๋Š” `fix: true`(๋ฐ”), ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋Š” `fix: false`(ํˆฌ๋ช…) ๋กœ ์„ž์–ด ์“ฐ์ง€ ์•Š๋Š”๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅด๋ฉด(์˜ˆ: ์ „๋ถ€ `fix: true`) ๋ชจ๋“  `header` ๊ฐ€ ๊ทธ ๊ฐ’์„ ์“ด๋‹ค.
1638
+ - **`variant` ๋Š” ํ•„์ˆ˜์ด๊ณ , ์•ฑ ์ „์ฒด์—์„œ ํ•˜๋‚˜๋กœ ๊ณ ์ •ํ•œ๋‹ค.** ์–ด๋–ค ํŽ˜์ด์ง€๋Š” `"bar"`(๋†’์ด ๊ณ ์ • + ํ•˜๋‹จ ๊ตฌ๋ถ„์„ ), ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋Š” `"plain"`(์ตœ์†Œ ๋†’์ด) ๋กœ ์„ž์–ด ์“ฐ์ง€ ์•Š๋Š”๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅด๋ฉด(์˜ˆ: ์ „๋ถ€ `"bar"`) ๋ชจ๋“  ํŽ˜์ด์ง€ ํ—ค๋”๊ฐ€ ๊ทธ ๊ฐ’์„ ์“ด๋‹ค. **๊ธฐ๋ณธ๊ฐ’์ด ์—†๋Š” ๊ฒƒ๋„ ์ด ๊ทœ์น™ ๋•Œ๋ฌธ์ด๋‹ค** โ€” ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ์œผ๋ฉด ์•ˆ ์ค€ ํŽ˜์ด์ง€๋งŒ ์กฐ์šฉํžˆ ๋‹ค๋ฅธ ๋ชจ์–‘์ด ๋˜์–ด ๋ฉ”๋‰ด๋ฅผ ์˜ฎ๊ธธ ๋•Œ๋งˆ๋‹ค ์ œ๋ชฉ ์ค„์ด ํŠ„๋‹ค. ์…ธ์„ ํ•œ ๋ฒˆ ๊ฐ์‹ธ ์“ฐ๋ฉด ์ง€์ •ํ•˜๋Š” ์ž๋ฆฌ๋Š” `AppShell` ํ•œ ๊ณณ์ด๋‹ค. `SLayout` ์˜ `header`(`"fix" | "full"`)์™€๋Š” ๋‹ค๋ฅธ ์ถ•์ด๋‹ค โ€” ๊ทธ์ชฝ์€ ์ƒ๋‹จ๋ฐ”๊ฐ€ GNB ์ปฌ๋Ÿผ ์•ˆ์— ์žˆ๋Š”์ง€ ํ™”๋ฉด ์ „ํญ์ธ์ง€๋ฅผ ์ •ํ•œ๋‹ค.
1239
1639
  - **`slot`ยท`onBack` ๋„ ํŽ˜์ด์ง€ ์„ฑ๊ฒฉ์ด ์‹ค์ œ๋กœ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ์žˆ๋Š” ๋Œ€๋กœ ํ†ต์ผํ•œ๋‹ค.** "๋ชฉ๋ก ํŽ˜์ด์ง€์—” ์—†๊ณ  ์ƒ์„ธยท๋“ฑ๋ก ํŽ˜์ด์ง€์—” ์žˆ๋‹ค"์ฒ˜๋Ÿผ ํ™”๋ฉด ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๊ฐˆ๋ฆฌ๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋˜์ง€๋งŒ, ๊ฐ™์€ ์ข…๋ฅ˜์˜ ํ™”๋ฉด๋ผ๋ฆฌ๋Š” ์ž„์˜๋กœ ๋„ฃ์—ˆ๋‹ค ๋บ๋‹ค ํ•˜์ง€ ์•Š๋Š”๋‹ค.
1240
1640
  - **`slot` ์€ `ReactNode` ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ›์ง€๋งŒ, ์›์น™์€ `size="sm"` ๋ฒ„ํŠผ ์œ„์ฃผ๋กœ๋งŒ ์ฑ„์šด๋‹ค.** `STextLink`ยท๋ณต์žกํ•œ ์ปค์Šคํ…€ ๋งˆํฌ์—…์„ ์Šฌ๋กฏ์— ๋„ฃ์ง€ ์•Š๋Š”๋‹ค โ€” ๊ทธ ์ด์ƒ์ด ํ•„์š”ํ•˜๋ฉด ํŽ˜์ด์ง€ ํ—ค๋”๊ฐ€ ์•„๋‹ˆ๋ผ ยง4-2 ์˜ `STableBar` ์ฒ˜๋Ÿผ ๋ณธ๋ฌธ ์ชฝ ์•ก์…˜ ์ž๋ฆฌ๋ฅผ ์“ด๋‹ค.
1241
1641
 
1642
+ **์…ธ ๋ฐ–์˜ ๋‹จ๋… ํ™”๋ฉด(๋กœ๊ทธ์ธยท์˜จ๋ณด๋”ฉ ๋“ฑ)์—์„œ๋„ ๊ฐ™์€ ์ œ๋ชฉ ์˜์—ญ์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค.** ์ด๋•Œ๋Š” ํŽ˜์ด์ง€ ์—ด์ด ์—†์œผ๋ฏ€๋กœ `scrolled` ๊ฐ€ ์•ฑ ๋ชซ์ด ๋œ๋‹ค.
1643
+
1644
+ ```tsx
1645
+ import { SPageHeader } from 'sellmate-design-system-react';
1646
+
1647
+ const [scrolled, setScrolled] = useState(false);
1648
+
1649
+ {/* ํ—ค๋”๋Š” ์ž๊ธฐ ํฐ ๋ฉด์„ ์Šค์Šค๋กœ ์น ํ•œ๋‹ค โ€” ๊ฐ์‹ธ๋Š” ์ชฝ์€ ๋ณธ๋ฌธ์ด ๋†“์ผ ๋ฉด๋งŒ ์ •ํ•˜๋ฉด ๋œ๋‹ค */}
1650
+ <div className="flex h-full min-h-0 flex-col bg-[var(--sys-color-bg-frame)]">
1651
+ <SPageHeader variant="plain" title="์ƒํ’ˆ ๋ชฉ๋ก" subText="ํŒ๋งค ์ค‘์ธ ์ƒํ’ˆ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค." scrolled={scrolled} />
1652
+ {/* ์Šคํฌ๋กค์„ ์•ฑ์ด ์ฅ๋ฏ€๋กœ scrolled ๋„ ์•ฑ์ด ๋„ฃ๋Š”๋‹ค โ€” ํŒจ๋”ฉ์€ SPage ๊ฐ€ ์—†์œผ๋‹ˆ ์—ฌ๊ธฐ์„œ ์ค€๋‹ค */}
1653
+ <div
1654
+ className="min-h-0 flex-1 overflow-auto p-sd-16"
1655
+ onScroll={e => setScrolled(e.currentTarget.scrollTop > 0)}
1656
+ >
1657
+ โ€ฆ๋ณธ๋ฌธโ€ฆ
1658
+ </div>
1659
+ </div>;
1660
+ ```
1661
+
1242
1662
  **GNB ํญ์„ ์‚ฌ์šฉ์ž๊ฐ€ ์กฐ์ ˆํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด `SGnb` ์— `resizable` ์„ ์ค€๋‹ค.** ๋ฉ”๋‰ด ์˜ค๋ฅธ์ชฝ ๊ฒฝ๊ณ„๊ฐ€ ์กฐ์ ˆ์„ ์ด ๋˜๊ณ , ๋ ˆ์ผ ํญ์€ ๊ณ ์ •๋œ ์ฑ„ ๋ฉ”๋‰ด ์ปฌ๋Ÿผ๋งŒ ๋Š˜๊ณ  ์ค€๋‹ค. ๋ฒ”์œ„๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ •ํ•˜๋ฏ€๋กœ ์ˆซ์ž๋ฅผ ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
1243
1663
 
1244
1664
  ```tsx
1245
1665
  {/* ํญ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•˜๋ฉด menuWidth ๋ฅผ ์•ฑ์ด ์ฅ๊ณ  onMenuWidthChange ๋กœ ๋˜๋ฐ›์•„ ์ €์žฅํ•œ๋‹ค.
1246
1666
  ์ดˆ๊ธฐ๊ฐ’๋งŒ ์ •ํ•˜๋ฉด ๋˜๋ฉด defaultMenuWidth ํ•˜๋‚˜๋กœ ๋๋‚œ๋‹ค. */}
1247
- <SGnb items={MENU} value={current} onValueChange={navigate} resizable defaultMenuWidth={240} />
1667
+ <SGnb items={MENU} value={current} onValueChange={navigate} resizable defaultMenuWidth={220} />
1248
1668
  ```
1249
1669
 
1250
1670
  `onMenuWidthChange` ๋Š” **๋“œ๋ž˜๊ทธ๋ฅผ ๋†“๋Š” ์ˆœ๊ฐ„**(๋˜๋Š” ๋ฐฉํ–ฅํ‚ค ์กฐ์ž‘) ํ•œ ๋ฒˆ๋งŒ ์˜จ๋‹ค โ€” ์ €์žฅ ๋กœ์ง์„ ๊ทธ๋Œ€๋กœ ๋ถ™์—ฌ๋„ ํ”„๋ ˆ์ž„๋งˆ๋‹ค ์“ฐ์ด์ง€ ์•Š๋Š”๋‹ค. ์ ‘ํ˜€ ์žˆ๊ฑฐ๋‚˜ ๋ ˆ์ผ ๋ฆฌํ”„๊ฐ€ ํ™œ์„ฑ์ด๋ผ ๊น” ๋ฉ”๋‰ด๊ฐ€ ์—†์œผ๋ฉด ์กฐ์ ˆ์„ ์€ ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค.
@@ -1265,16 +1685,32 @@ import { SModalOutlet } from 'sellmate-design-system-react';
1265
1685
 
1266
1686
  **์ตœ์†Œ ๋„ˆ๋น„๋Š” `SLayout` ์ด ๋ณด์žฅํ•œ๋‹ค โ€” ์•ฑ์ด `min-w-*` ๋ฅผ ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.** ์ฐฝ์ด ์ตœ์†Œ ๋„ˆ๋น„(`SLAYOUT_MIN_WIDTH`, GNB ํฌํ•จํ•œ ์ „์ฒด ๊ธฐ์ค€)๋ณด๋‹ค ์ข์•„์ง€๋ฉด GNBยท์ƒ๋‹จ๋ฐ”๋Š” ์ œ์ž๋ฆฌ์— ๋‚จ๊ณ  **`SPage` ์•ˆ์—๋งŒ ๊ฐ€๋กœ ์Šคํฌ๋กค์ด ์ƒ๊ธด๋‹ค.** ๋ฌธ์„œ(๋ธŒ๋ผ์šฐ์ € ์ฐฝ)์—๋Š” ๊ฐ€๋กœ ์Šคํฌ๋กค์ด ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ์…ธ์„ ๊ฐ์‹ธ๋Š” ์š”์†Œ์— `min-width` ๋‚˜ `overflow-x` ๋ฅผ ๊ฑธ์ง€ ์•Š๋Š”๋‹ค โ€” ๊ฑธ๋ฉด ์ฐฝ ์ „์ฒด๊ฐ€ ์Šคํฌ๋กค๋˜์–ด GNB ๊ฐ€ ํ™”๋ฉด ๋ฐ–์œผ๋กœ ๋ฐ€๋ฆฐ๋‹ค.
1267
1687
 
1268
- **์…ธ์˜ `SPage` ๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ๊ณต์œ ํ•˜๋ฏ€๋กœ, ํŽ˜์ด์ง€๋งˆ๋‹ค ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์€ ํŽ˜์ด์ง€๊ฐ€ ์…ธ์— ์•Œ๋ ค์•ผ ํ•œ๋‹ค.** ์œ„์ฒ˜๋Ÿผ ํ”„๋ ˆ์ž„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ `scrollEndSpacing` ยท `contentHeight` ๋ฅผ ๋ฐ›์•„ ๊ทธ๋Œ€๋กœ ๋„˜๊ธฐ๊ณ , ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ์žˆ๋Š” ๋ชฉ๋ก ํŽ˜์ด์ง€๋งŒ `contentHeight="fill"` ์„ ์ค€๋‹ค (ยง4-2). ๋‚˜๋จธ์ง€ ํŽ˜์ด์ง€๋Š” ๋„˜๊ธฐ์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’(`auto`, ์Šคํฌ๋กค ๋ ์—ฌ๋ฐฑ ์ผฌ)์ด ์ ์šฉ๋œ๋‹ค.
1688
+ **์ฐฝ์ด ์ตœ์†Œ ๋„ˆ๋น„๋ณด๋‹ค ๋„“์„ ๋•Œ ๋ณธ๋ฌธ์„ ์–ด๋–ป๊ฒŒ ์„ธ์šธ์ง€๋Š” `SPage` ์˜ `contentWidth` ๊ฐ€ ์ •ํ•œ๋‹ค โ€” ํญ์„ ์ง์ ‘ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.** ๋„“์€ ๋ชจ๋‹ˆํ„ฐ์—์„œ ๋ณธ๋ฌธ์ด ๋๊นŒ์ง€ ๋Š˜์–ด๋‚˜ ์„ฑ๊ธฐ์–ด์ง€๋Š” ํ™”๋ฉด์ด ์žˆ์œผ๋ฏ€๋กœ ์„ธ ๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅธ๋‹ค.
1689
+
1690
+ | `contentWidth` | ๋„“์€ ์ฐฝ์—์„œ | ์“ฐ๋Š” ๊ณณ |
1691
+ | --- | --- | --- |
1692
+ | `"full"` (๊ธฐ๋ณธ) | ๋‚จ๋Š” ํญ์„ ๋ณธ๋ฌธ์ด ๋‹ค ์“ด๋‹ค | ํ‘œยท๋ชฉ๋ก์ฒ˜๋Ÿผ ๊ฐ€๋กœ๋ฅผ ๋„“๊ฒŒ ์“ธ์ˆ˜๋ก ์ •๋ณด๊ฐ€ ๋” ๋“ค์–ด๊ฐ€๋Š” ํ™”๋ฉด |
1693
+ | `"fixed"` | ์ตœ์†Œ ๋„ˆ๋น„์ผ ๋•Œ์˜ ๋ณธ๋ฌธ ํญ์œผ๋กœ ๊ณ ์ •, ์™ผ์ชฝ ์ •๋ ฌ (๋‚จ๋Š” ํญ์€ ์˜ค๋ฅธ์ชฝ) | ์‹œ์•ˆ ํญ ๊ทธ๋Œ€๋กœ ์„ธ์šฐ๋˜ ์™ผ์ชฝ ๊ธฐ์ค€์„ ์œ ์ง€ํ•  ํ™”๋ฉด |
1694
+ | `"fixedCenter"` | ๊ฐ™์€ ํญ์œผ๋กœ ๊ณ ์ •, ๊ฐ€์šด๋ฐ ์ •๋ ฌ (๋‚จ๋Š” ํญ์€ ์ขŒ์šฐ) | ํผยท์ƒ์„ธ์ฒ˜๋Ÿผ ๊ฐ€๋กœ๋ฅผ ๋„“๊ฒŒ ์จ๋„ ์–ป์„ ๊ฒƒ์ด ์—†๋Š” ํ™”๋ฉด |
1695
+
1696
+ - **๊ณ ์ • ํญ์— ์ˆซ์ž๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.** `max-w-*` ๋‚˜ `mx-auto` ๋กœ ํ‰๋‚ด ๋‚ด๋ฉด GNB ํญยท์ ‘ํž˜์ด ๋ฐ˜์˜๋˜์ง€ ์•Š์•„ ์‹œ์•ˆ๊ณผ ์–ด๊ธ‹๋‚œ๋‹ค. ๊ณ ์ • ํญ์€ "์ฐฝ์ด ์ตœ์†Œ ๋„ˆ๋น„์ผ ๋•Œ์˜ ๋ณธ๋ฌธ ํญ"์ด๊ณ  `SPage` ๊ฐ€ GNB ์ƒํƒœ๊นŒ์ง€ ๋ฐ˜์˜ํ•ด ๊ณ„์‚ฐํ•œ๋‹ค.
1697
+ - **์ฐฝ์ด ์ตœ์†Œ ๋„ˆ๋น„๋ณด๋‹ค ์ข์•„์ง€๋ฉด ์„ธ ๋ชจ๋“œ๊ฐ€ ๋ชจ๋‘ ๊ฐ™๋‹ค** โ€” ๋‚จ๋Š” ํญ์ด ์—†์œผ๋ฏ€๋กœ ์œ„ ๋ฌธ๋‹จ๋Œ€๋กœ `SPage` ์•ˆ์—๋งŒ ๊ฐ€๋กœ ์Šคํฌ๋กค์ด ์ƒ๊ธด๋‹ค.
1698
+ - ๊ฐ™์€ ์—ด์˜ `SPageHeader` ๋Š” ์ž๋™์œผ๋กœ ๊ฐ™์€ ํญยท์ •๋ ฌ์„ ๋”ฐ๋ฅธ๋‹ค โ€” ์ œ๋ชฉ ์ค„์— ๋ณ„๋„๋กœ ์ฃผ์ง€ ์•Š๋Š”๋‹ค. ํ—ค๋”์˜ ํฐ ๋ฉดยท๊ตฌ๋ถ„์„ ์€ ๋Š˜ ์ „ํญ์ด๋‹ค.
1699
+ - **๊ฐ™์€ ์ข…๋ฅ˜์˜ ํ™”๋ฉด๋ผ๋ฆฌ๋Š” ๊ฐ’์„ ํ†ต์ผํ•œ๋‹ค** (ํ—ค๋” `fix` ์™€ ๊ฐ™์€ ์ด์œ ). ๋ชฉ๋ก ํŽ˜์ด์ง€๋งˆ๋‹ค `full`ยท`fixedCenter` ๊ฐ€ ์„ž์ด๋ฉด ๋ฉ”๋‰ด๋ฅผ ์˜ฎ๊ธธ ๋•Œ๋งˆ๋‹ค ๋ณธ๋ฌธ ํญ์ด ํŠ„๋‹ค.
1700
+
1701
+ **์…ธ์˜ `SPage` ๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ๊ณต์œ ํ•˜๋ฏ€๋กœ, ํŽ˜์ด์ง€๋งˆ๋‹ค ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์€ ํŽ˜์ด์ง€๊ฐ€ ์…ธ์— ์•Œ๋ ค์•ผ ํ•œ๋‹ค.** ์œ„์ฒ˜๋Ÿผ ํ”„๋ ˆ์ž„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ `contentHeight` ยท `scrollEndSpacing` ยท `contentWidth` ๋ฅผ ๋ฐ›์•„ ๊ทธ๋Œ€๋กœ ๋„˜๊ธด๋‹ค.
1702
+
1703
+ **๋Œ€๋ถ€๋ถ„์˜ ํŽ˜์ด์ง€๋Š” `contentHeight="fill"` ์ด๋‹ค** โ€” ๋ณธ๋ฌธ์ด ์ฐฝ์„ ๊ฝ‰ ์ฑ„์šฐ๊ณ  ์Šคํฌ๋กค์€ ๊ฐ ์˜์—ญ ์•ˆ์—์„œ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์ด ํ‘œ์ค€์ด๋‹ค(ยง2-2). ๋ธ”๋ก์˜ ๋†’์ด๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๊ณ  ๊ทธ ๋†’์ด๊ฐ€ ์ฐฝ๋ณด๋‹ค ์ปค์„œ ํŽ˜์ด์ง€ ์ž์ฒด๊ฐ€ ์Šคํฌ๋กค๋ผ์•ผ ํ•˜๋Š” ํ™”๋ฉด์—์„œ๋งŒ `contentHeight="auto"`(๊ธฐ๋ณธ๊ฐ’) + `scrollEndSpacing` ์„ ์ผ ๋‹ค.
1269
1704
 
1270
1705
  **์ƒ๋‹จ๋ฐ” ๋ฐฐ์น˜๋Š” `header` ๊ฐ€ ์ •ํ•œ๋‹ค.** ์š”์†Œ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ์Šฌ๋กฏ์„ ์ฑ„์šฐ๊ธฐ ์ „์— ์–ด๋А ์ชฝ์ธ์ง€๋ถ€ํ„ฐ ์ •ํ•œ๋‹ค.
1271
1706
 
1272
1707
  | `header` | ์ƒ๋‹จ๋ฐ” ๋ฐฐ์น˜ | ๋กœ๊ณ  ํญ | `topContent` |
1273
1708
  | --- | --- | --- | --- |
1274
1709
  | `"fix"` (๊ธฐ๋ณธ) | `[๋Ÿฐ์ฒ˜ ยท ๋กœ๊ณ  โ€ฆ ํด๋“œ]` โ€” ์ƒ๋‹จ๋ฐ”๊ฐ€ GNB ์ปฌ๋Ÿผ ์•ˆ์— ์žˆ๊ณ  ํด๋“œ๊ฐ€ ์ปฌ๋Ÿผ ์˜ค๋ฅธ์ชฝ ๋ | ๋‚ด์šฉ ํญ | **๋ Œ๋”๋˜์ง€ ์•Š๋Š”๋‹ค** (๋†“์„ ์ž๋ฆฌ๊ฐ€ ์—†๋‹ค) |
1275
- | `"full"` | `[๋Ÿฐ์ฒ˜ ยท ํด๋“œ ยท ๋กœ๊ณ  ยท topContent]` โ€” ์ƒ๋‹จ๋ฐ”๊ฐ€ ํ™”๋ฉด ์ „ํญ | **140px ๊ณ ์ •** (๋Ÿฐ์ฒ˜ ์—†์œผ๋ฉด 172px) | ๋กœ๊ณ  ์˜ค๋ฅธ์ชฝ ๋‚จ๋Š” ํญ ์ „์ฒด |
1710
+ | `"full"` | `[๋Ÿฐ์ฒ˜ ยท ํด๋“œ ยท ๋กœ๊ณ  ยท topContent โ€ฆ system]` โ€” ์ƒ๋‹จ๋ฐ”๊ฐ€ ํ™”๋ฉด ์ „ํญ์ด๊ณ  `system` ์€ ์˜ค๋ฅธ์ชฝ ๋ | **140px ๊ณ ์ •** (๋Ÿฐ์ฒ˜ ์—†์œผ๋ฉด 172px) | ๋กœ๊ณ  ์˜ค๋ฅธ์ชฝ ๋‚จ๋Š” ํญ ์ „์ฒด |
1276
1711
 
1277
- - `topContent` ๋Š” ์ƒ๋‹จ๋ฐ” ๋กœ๊ณ  ์˜ค๋ฅธ์ชฝ ์Šฌ๋กฏ์ด๋‹ค. ์ „์—ญ ๊ฒ€์ƒ‰ยท๊ณ„์ • ๋ฉ”๋‰ดยท์•Œ๋ฆผ์ฒ˜๋Ÿผ **๋ชจ๋“  ํŽ˜์ด์ง€์— ๊ณตํ†ต์ธ ๊ฒƒ๋งŒ** ๋„ฃ๋Š”๋‹ค. ํŽ˜์ด์ง€๋ณ„ ์•ก์…˜์€ ์—ฌ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ ยง4-2 ์˜ `STableBar` ๋กœ ๊ฐ„๋‹ค.
1712
+ - `topContent` ๋Š” ์ƒ๋‹จ๋ฐ” ๋กœ๊ณ  ์˜ค๋ฅธ์ชฝ ์Šฌ๋กฏ์ด๋‹ค. ์ „์—ญ ๊ฒ€์ƒ‰์ฒ˜๋Ÿผ **๋ชจ๋“  ํŽ˜์ด์ง€์— ๊ณตํ†ต์ธ ๊ฒƒ๋งŒ** ๋„ฃ๋Š”๋‹ค. ํŽ˜์ด์ง€๋ณ„ ์•ก์…˜์€ ์—ฌ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ ยง4-2 ์˜ `STableBar` ๋กœ ๊ฐ„๋‹ค.
1713
+ - **๊ณ„์ •ยท์•Œ๋ฆผยท์„ค์ •ยท๋„๋ฉ”์ธยท์„œ๋น„์Šค ์ „ํ™˜์€ `topContent` ์— ์†์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.** `header="full"` ์ด๋ฉด `system` ์Šฌ๋กฏ์˜ ์กฐ๊ฐ๋“ค์ด ์ƒ๋‹จ๋ฐ” ์˜ค๋ฅธ์ชฝ ๋์œผ๋กœ ์˜ฌ๋ผ์˜ค๋ฏ€๋กœ, ๊ทธ๊ฒƒ๋“ค์€ ์ „๋ถ€ `SGnbSystem` ์ด ๊ทธ๋ฆฐ๋‹ค (๋ฐ”๋กœ ์•„๋ž˜ ์ ˆ).
1278
1714
  - ์Šฌ๋กฏ์ด ๋‚จ๋Š” ํญ์„ ํ†ต์งธ๋กœ ๋ฐ›์œผ๋ฏ€๋กœ **์ •๋ ฌ์€ ์•ˆ์—์„œ ์ง์ ‘ ์žก๋Š”๋‹ค** (์ขŒ์ธก ์ •๋ ฌ + ์šฐ์ธก์€ `ml-auto`).
1279
1715
  - `header="full"` ์—์„œ ๋กœ๊ณ  ์ž๋ฆฌ๋Š” 140px ๋กœ ๊ณ ์ •๋œ๋‹ค โ€” ๋กœ๊ณ  ๋‚ด์šฉ์ด ๋ฐ”๋€Œ์–ด๋„ `topContent` ์‹œ์ž‘์ ์ด ํ”๋“ค๋ฆฌ์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ๋กœ๊ณ ๊ฐ€ ๊ทธ๋ณด๋‹ค ๋„“์œผ๋ฉด ์ž˜๋ฆฌ๋ฏ€๋กœ ์ด ํญ์— ๋งž์ถฐ ์ค€๋น„ํ•œ๋‹ค.
1280
1716
  - `onLauncherClick` ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด ๋Ÿฐ์ฒ˜๊ฐ€ ๋ Œ๋”๋˜์ง€ ์•Š๊ณ , ๊ทธ ์ž๋ฆฌ(๋ฒ„ํŠผ + ๊ฐ„๊ฒฉ)๋ฅผ ๋กœ๊ณ  ์Šฌ๋กฏ์ด ์ด์–ด๋ฐ›์•„ 172px ๊ฐ€ ๋œ๋‹ค. `topContent` ์‹œ์ž‘์ ์€ ๋Ÿฐ์ฒ˜ ์œ ๋ฌด์™€ ๊ด€๊ณ„์—†์ด ๊ฐ™์€ ์ž๋ฆฌ๋‹ค.
@@ -1285,26 +1721,28 @@ import { SModalOutlet } from 'sellmate-design-system-react';
1285
1721
  items={MENU} value={current} onValueChange={navigate}
1286
1722
  logo={<Logo />}
1287
1723
  topContent={
1288
- /* ๋‚จ๋Š” ํญ ์ „์ฒด๋ฅผ ๋ฐ›๋Š”๋‹ค โ€” ์™ผ์ชฝ์€ ๊ทธ๋Œ€๋กœ, ์˜ค๋ฅธ์ชฝ ๋์€ ml-auto */
1724
+ /* ๋‚จ๋Š” ํญ ์ „์ฒด๋ฅผ ๋ฐ›๋Š”๋‹ค โ€” ์™ผ์ชฝ์€ ๊ทธ๋Œ€๋กœ, ์˜ค๋ฅธ์ชฝ ๋์€ ml-auto.
1725
+ ๊ณ„์ •ยท์•Œ๋ฆผ์€ ์—ฌ๊ธฐ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค โ€” system ์Šฌ๋กฏ์ด ์ƒ๋‹จ๋ฐ” ์˜ค๋ฅธ์ชฝ ๋์— ๊ทธ๋ฆฐ๋‹ค */
1289
1726
  <div className="flex w-full items-center gap-sd-8">
1290
- <SInput value={keyword} onValueChange={setKeyword} placeholder="ํ†ตํ•ฉ ๊ฒ€์ƒ‰" />
1291
- <SButton size="sm" color="neutral" outline label="๋‚ด ๊ณ„์ •" className="ml-auto" onClick={openAccount} />
1727
+ <SSearchInput value={keyword} onValueChange={setKeyword} onSearch={runSearch} placeholder="ํ†ตํ•ฉ ๊ฒ€์ƒ‰" />
1728
+ <SButton size="sm" color="neutral" outline label="๋„์›€๋ง" className="ml-auto" onClick={openHelp} />
1292
1729
  </div>
1293
1730
  }
1731
+ system={<SGnbSystem alert={{ count: unreadCount, onClick: openAlerts }} account={{ label: userName, listBox: accountPanel }} />}
1294
1732
  />
1295
1733
  <SPage background="frame">{children}</SPage>
1296
1734
  </SLayout>
1297
1735
  ```
1298
1736
 
1299
- **๋ฉ”๋‰ด ๋ชฉ๋ก๊ณผ ํ•จ๊ป˜ ์Šคํฌ๋กค๋˜๋ฉด ์•ˆ ๋˜๋Š” ๊ฒƒ์€ `SGnb` ์˜ ์œ„์•„๋ž˜ ๊ณ ์ • ์Šฌ๋กฏ์— ๋‘”๋‹ค.** ๋ ˆ์ผ๊ณผ ๋ฉ”๋‰ด์— ๊ฐ๊ฐ ์œ„(`railTop`ยท`menuTop`)์™€ ์•„๋ž˜(`railFooter`ยท`menuFooter`) ์Šฌ๋กฏ์ด ์žˆ๋‹ค. ์•„์ดํ…œ์ด ๋งŽ์•„ ๋„˜์น˜๋ฉด **๋ชฉ๋ก๋งŒ ์Šคํฌ๋กค๋˜๊ณ  ์ด ์Šฌ๋กฏ๋“ค์€ ์ œ์ž๋ฆฌ์— ๋‚จ๋Š”๋‹ค** โ€” ๋ฉ”๋‰ด ๊ฒ€์ƒ‰, ์›Œํฌ์ŠคํŽ˜์ด์Šค ์ „ํ™˜, ๊ณ„์ • ํ–‰์ฒ˜๋Ÿผ ํ•ญ์ƒ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์—ฌ๊ธฐ ์˜จ๋‹ค. ๋ ˆ์ผ ์Šฌ๋กฏ์€ `useRail` ์ผ ๋•Œ๋งŒ, ๋ฉ”๋‰ด ์Šฌ๋กฏ์€ ๊น” ๋ฉ”๋‰ด๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ๋ Œ๋”๋œ๋‹ค.
1737
+ **๋ฉ”๋‰ด ๋ชฉ๋ก๊ณผ ํ•จ๊ป˜ ์Šคํฌ๋กค๋˜๋ฉด ์•ˆ ๋˜๋Š” ๊ฒƒ์€ `SGnb` ์˜ ์œ„์•„๋ž˜ ๊ณ ์ • ์Šฌ๋กฏ์— ๋‘”๋‹ค.** ๋ ˆ์ผ๊ณผ ๋ฉ”๋‰ด์— ๊ฐ๊ฐ ์œ„(`railTop`ยท`menuTop`)์™€ ์•„๋ž˜(`railFooter`ยท`menuFooter`) ์Šฌ๋กฏ์ด ์žˆ๋‹ค. ์•„์ดํ…œ์ด ๋งŽ์•„ ๋„˜์น˜๋ฉด **๋ชฉ๋ก๋งŒ ์Šคํฌ๋กค๋˜๊ณ  ์ด ์Šฌ๋กฏ๋“ค์€ ์ œ์ž๋ฆฌ์— ๋‚จ๋Š”๋‹ค** โ€” ๋ฉ”๋‰ด ๊ฒ€์ƒ‰, ์›Œํฌ์ŠคํŽ˜์ด์Šค ์ „ํ™˜, ๊ณ„์ • ํ–‰์ฒ˜๋Ÿผ ํ•ญ์ƒ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์—ฌ๊ธฐ ์˜จ๋‹ค. ๋ ˆ์ผ ์Šฌ๋กฏ์€ `showRail` ์ผ ๋•Œ๋งŒ, ๋ฉ”๋‰ด ์Šฌ๋กฏ์€ ๊น” ๋ฉ”๋‰ด๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ๋ Œ๋”๋œ๋‹ค.
1300
1738
 
1301
1739
  **์ ‘์œผ๋ฉด ๋ ˆ์ผยท๋ฉ”๋‰ด๊ฐ€ ํ†ต์งธ๋กœ ๋น ์ ธ๋‚˜๊ฐ€๋ฉด์„œ ๊ทธ ์Šฌ๋กฏ๋“ค๋„ ํ•จ๊ป˜ ์‚ฌ๋ผ์ง„๋‹ค.** ์ ‘ํžŒ ์ƒํƒœ์—์„œ๋„ ๋‚จ๊ฒจ์•ผ ํ•  ๊ฒƒ์€ `foldedTop`ยท`foldedFooter` ๋กœ ๋”ฐ๋กœ ์ค€๋‹ค โ€” `header="fix"` ๋กœ ์ ‘ํ˜”์„ ๋•Œ๋งŒ ๋‚˜ํƒ€๋‚˜๋ฉฐ, ํญ์ด ์ข์€ ํด๋“œ ๋ ˆ์ผ์ด๋ฏ€๋กœ ์•„์ด์ฝ˜ ๋ฒ„ํŠผ ํ•˜๋‚˜ ์ •๋„๋กœ ์ค„์ธ๋‹ค.
1302
1740
 
1303
1741
  ```tsx
1304
1742
  {/* ์ ‘ํžˆ๋ฉด menuTopยทmenuFooter ๊ฐ€ ํ•จ๊ป˜ ๋น ์ง€๋ฏ€๋กœ, ํด๋“œ ๋ ˆ์ผ์— ๋‚จ๊ธธ ๊ฒƒ๋งŒ foldedTop ์œผ๋กœ ๋”ฐ๋กœ ์ค€๋‹ค */}
1305
1743
  <SGnb
1306
- items={MENU} value={current} onValueChange={navigate} useRail
1307
- menuTop={<SInput value={keyword} onValueChange={setKeyword} placeholder="๋ฉ”๋‰ด ๊ฒ€์ƒ‰" />}
1744
+ items={MENU} value={current} onValueChange={navigate} showRail
1745
+ menuTop={<SSearchInput value={keyword} onValueChange={setKeyword} placeholder="๋ฉ”๋‰ด ๊ฒ€์ƒ‰" />}
1308
1746
  menuFooter={<AccountRow />}
1309
1747
  foldedTop={<SGhostButton icon="search" size="sm" ariaLabel="๋ฉ”๋‰ด ๊ฒ€์ƒ‰" onClick={openSearch} />}
1310
1748
  />
@@ -1312,6 +1750,62 @@ import { SModalOutlet } from 'sellmate-design-system-react';
1312
1750
 
1313
1751
  ์Šฌ๋กฏ ์•ˆ์ชฝ ์—ฌ๋ฐฑ์€ **์Šฌ๋กฏ ๋‚ด์šฉ์ด ์ง์ ‘ ๊ฐ–๋Š”๋‹ค** โ€” ์ปดํฌ๋„ŒํŠธ๋Š” ์ž๋ฆฌ๋งŒ ์žก๋Š”๋‹ค(ํด๋“œ ์Šฌ๋กฏ๋งŒ ์ข์€ ํญ์— ๋งž์ถฐ ๊ฐ€์šด๋ฐ ์ •๋ ฌํ•œ๋‹ค). ๋ฉ”๋‰ด ํญ์€ `resizable` ๋กœ ๋ฐ”๋€” ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์Šฌ๋กฏ ๋‚ด์šฉ์€ ๊ณ ์ • ํญ ๋Œ€์‹  `w-full` ๋กœ ๋”ฐ๋ผ๊ฐ€๊ฒŒ ๋‘”๋‹ค.
1314
1752
 
1753
+ #### ์„œ๋น„์Šคยท๋„๋ฉ”์ธยท์•Œ๋ฆผยท์„ค์ •ยท๊ณ„์ • ๋ฌถ์Œ (system ์Šฌ๋กฏ)
1754
+
1755
+ **์„œ๋น„์Šค ์ „ํ™˜ยท๋„๋ฉ”์ธยท์•Œ๋ฆผยท์„ค์ •ยท๊ณ„์ •์ฒ˜๋Ÿผ "์ง€๊ธˆ ์–ด๋–ค ์ž๊ฒฉ์œผ๋กœ ๋ณด๊ณ  ์žˆ๋Š”๊ฐ€" ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฌถ์Œ์€ `SGnbSystem` ์„ `SGnb` ์˜ `system` ์Šฌ๋กฏ์— ๋„ฃ๋Š”๋‹ค.** ์ด ์กฐ๊ฐ๋“ค์„ `menuFooter` ๋‚˜ `topContent` ์— ์†์œผ๋กœ ์กฐ๋ฆฝํ•˜์ง€ ์•Š๋Š”๋‹ค โ€” ๋ฐฐ๊ฒฝยท๊ฒฝ๊ณ„ยท๊ตฌ๋ถ„์„ ยทํ–‰ ๊ฐ„๊ฒฉ์ด ์ „๋ถ€ ํ† ํฐ์œผ๋กœ ์ •ํ•ด์ ธ ์žˆ์–ด ์ง์ ‘ ๋งŒ๋“ค๋ฉด ์–ด๊ธ‹๋‚œ๋‹ค.
1756
+
1757
+ **๋†“์ด๋Š” ์ž๋ฆฌ๋Š” `header` ๊ฐ€ ์ •ํ•œ๋‹ค. ์•ฑ์ด ๋„˜๊ธฐ๋Š” ๊ฒƒ์€ ์–‘์ชฝ ๋ชจ๋‘ ๋˜‘๊ฐ™๋‹ค.**
1758
+
1759
+ | `header` | system ์ด ์„œ๋Š” ์ž๋ฆฌ | ํ˜•ํƒœ |
1760
+ | --- | --- | --- |
1761
+ | `"fix"` (๊ธฐ๋ณธ) | GNB ๋งจ ์•„๋ž˜ (์ ‘ํžˆ๋ฉด `foldedFooter` ์•„๋ž˜ ๋ ˆ์ผ ๋ฐ”๋‹ฅ) | ์„ธ๋กœ ํŒ โ€” ์œ„์—์„œ๋ถ€ํ„ฐ `actions` ยท ๋„๋ฉ”์ธ ยท `[์•Œ๋ฆผ \| ์„ค์ •]` ยท ๊ณ„์ • |
1762
+ | `"full"` | ์ „ํญ ์ƒ๋‹จ๋ฐ” **์˜ค๋ฅธ์ชฝ ๋** | ๊ฐ€๋กœ ํ•œ ์ค„ โ€” `actions` \| ์•Œ๋ฆผ \| ์„ค์ • \| ๋„๋ฉ”์ธยท๊ณ„์ • |
1763
+
1764
+ `system` ์€ ๋‹ค๋ฅธ ์Šฌ๋กฏ๊ณผ ๋‹ฌ๋ฆฌ **ํŽผ์นจยท์ ‘ํž˜ ์–‘์ชฝ์„ ํ˜ผ์ž ๋งก๋Š”๋‹ค** โ€” `header="fix"` ๋ฉด ํŽผ์ณค์„ ๋•Œ ๋ฉ”๋‰ด ์ปฌ๋Ÿผ ๋ฐ”๋‹ฅ์—, ์ ‘ํ˜”์„ ๋•Œ ๋ ˆ์ผ ๋ฐ”๋‹ฅ์— ์—ฌ๋ฐฑ ์—†์ด ๋ถ™๋Š”๋‹ค. ๊ทธ๋ž˜์„œ `menuFooter`/`foldedFooter` ๋กœ ๋‚˜๋ˆ  ์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค.
1765
+
1766
+ ```tsx
1767
+ <SGnb
1768
+ items={MENU} value={current} onValueChange={navigate} logo={<Logo />}
1769
+ system={
1770
+ <SGnbSystem
1771
+ /* ์ƒ๋‹จ์— ์Œ“๋Š” ํ–‰ โ€” SSystemActionButton ์˜ props ๋ฐฐ์—ด์ด๋‹ค (ยง3-5).
1772
+ color ๋Š” ๋„˜๊ธฐ์ง€ ์•Š๊ณ , ๊ณ„์ • ํ–‰์€ ์—ฌ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ ์•„๋ž˜ account ๋กœ ์ค€๋‹ค */
1773
+ actions={[{ type: 'select', label: '์„œ๋น„์Šค ์ „ํ™˜', option: { icon: 'robot' }, onClick: openServices }]}
1774
+ domain={domainName}
1775
+ alert={{ count: unreadCount, onClick: openAlerts }}
1776
+ setting={{ onClick: openSettings }}
1777
+ /* ๊ณ„์ • ํ–‰. listBox ๋ฅผ ์ฃผ๋ฉด ๋ˆŒ๋ €์„ ๋•Œ ๊ณ„์ • ํŒจ๋„์ด ๋œฌ๋‹ค (ยง3-5-8) */
1778
+ account={{
1779
+ label: userName,
1780
+ listBox: {
1781
+ email: user.email, name: user.name, authority: user.authority,
1782
+ accountSetting: { onClick: openAccountSetting },
1783
+ language: { value: currentLanguage, onClick: openLanguage },
1784
+ logout: { onClick: signOut },
1785
+ },
1786
+ }}
1787
+ />
1788
+ }
1789
+ />
1790
+ ```
1791
+
1792
+ - **`color`ยท`folded` ๋ฅผ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.** `system` ์Šฌ๋กฏ์— ์žˆ์œผ๋ฉด GNB ๊ฐ€ ์ž๊ธฐ ์ƒ‰๊ณผ ํ˜•ํƒœ๋ฅผ ๋‚ด๋ ค์ค€๋‹ค. ์ด ๋‘˜์€ GNB ๋ฐ–์—์„œ ๋‹จ๋…์œผ๋กœ ์“ธ ๋•Œ๋งŒ ์ค€๋‹ค.
1793
+ - **๋†“์ด๋Š” ์ž๋ฆฌ๋Š” prop ์ด ์•„๋‹ˆ๋‹ค.** ์„ธ๋กœ ํŒ์ด๋ƒ ์ƒ๋‹จ๋ฐ” ํ•œ ์ค„์ด๋ƒ๋Š” GNB ์˜ `header` ๊ฐ€ ์ •ํ•œ๋‹ค(fix โ†’ ํŒ, full โ†’ ์ƒ๋‹จ๋ฐ”). ๊ณ ๋ฅด๋Š” prop ์€ ์—†์œผ๋‹ˆ ์ฐพ์ง€ ์•Š๋Š”๋‹ค โ€” ์ž๋ฆฌ์™€ ์–ด๊ธ‹๋‚œ ํ˜•ํƒœ๋ฅผ ์„ธ์šธ ์ด์œ ๊ฐ€ ์žˆ๋Š” ํ™”๋ฉด์ด ์—†๋‹ค.
1794
+ - **๊ฐ ์กฐ๊ฐ์€ ํ•ด๋‹น prop ์„ ์ค„ ๋•Œ๋งŒ ๋‚˜ํƒ€๋‚œ๋‹ค โ€” ์–ด๋–ค ์กฐํ•ฉ์ด์–ด๋„ ๊ทธ๊ฒƒ๋งŒ์œผ๋กœ ํŒ์ด ์„ฑ๋ฆฝํ•œ๋‹ค.** ๊ณ„์ •๋งŒ, ์•Œ๋ฆผ๋งŒ, ์„ค์ •๋งŒ, ์•Œ๋ฆผ+๊ณ„์ • โ€ฆ ์„œ๋น„์Šค๊ฐ€ ์“ฐ๋Š” ๊ฒƒ๋งŒ ๋„˜๊ธด๋‹ค. ์กฐ๊ฐ์„ ๋นผ๋ ค๊ณ  ๋นˆ ๋ฌธ์ž์—ด์ด๋‚˜ ๋นˆ ๊ฐ์ฒด๋ฅผ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค(`setting={{}}` ์€ "์„ค์ • ๋ฒ„ํŠผ์„ ์“ด๋‹ค" ๋Š” ๋œป์ด๋‹ค).
1795
+ - ๊ตฌ๋ถ„์„ ์€ **์œ„์•„๋ž˜ ์–‘์ชฝ์— ๋‚ด์šฉ์ด ์žˆ์„ ๋•Œ๋งŒ** ๊ทธ์–ด์ง„๋‹ค โ€” `actions` ๋งŒ ๋„˜๊ฒจ๋„ ๋ฐ”๋‹ฅ์— ๋œป ์—†๋Š” ์„ ์ด ๋‚จ์ง€ ์•Š๋Š”๋‹ค.
1796
+ - ์•Œ๋ฆผยท์„ค์ •์€ **ํ˜ผ์ž ์„œ๋ฉด ํญ์„ ๋‹ค ๋จน๊ณ **, ๋‘˜์ด ๋‚˜๋ž€ํžˆ ์„œ๋ฉด ์•Œ๋ฆผ์ด ๋‚จ๋Š” ํญ์„ยท์„ค์ •์ด ์ œ ํญ์„ ๊ฐ–๋Š”๋‹ค. ์–ด๋А ์ชฝ์ด ๋น ์ ธ๋„ ์™ผ์ชฝ ๋์€ ์œ„์•„๋ž˜ ํ–‰๊ณผ ๋งž์œผ๋ฏ€๋กœ ์•ฑ์ด ์ •๋ ฌ์„ ๋งž์ถœ ์ผ์ด ์—†๋‹ค.
1797
+ - **์ผœ์ง„ ์กฐ๊ฐ์ด ํ•˜๋‚˜๋„ ์—†์œผ๋ฉด ์•„๋ฌด๊ฒƒ๋„ ๋ Œ๋”๋˜์ง€ ์•Š๋Š”๋‹ค.** ์กฐ๊ฑด๋ถ€๋กœ ์กฐ๊ฐ์ด ๋‹ค ๋น ์ง€๋Š” ํ™”๋ฉด์—์„œ๋„ GNB ๋ฐ”๋‹ฅ์— ๋นˆ ํŒ์ด ๋‚จ์ง€ ์•Š๋Š”๋‹ค.
1798
+ - **`header="fix"` ๋ฅผ ์ ‘์œผ๋ฉด ์•Œ๋ฆผยท๊ณ„์ • ์•„์ด์ฝ˜๋งŒ ๋‚จ๋Š”๋‹ค** โ€” `actions`ยท`domain`ยท`setting` ์€ 48px ํญ์— ๋†“์„ ์ž๋ฆฌ๊ฐ€ ์—†์–ด ๋ Œ๋”๋˜์ง€ ์•Š๊ณ , ์•Œ๋ฆผ ๊ฐœ์ˆ˜๋Š” ์  ๋ฐฐ์ง€๊ฐ€ ๋œ๋‹ค. **์•Œ๋ฆผ๋„ ๊ณ„์ •๋„ ์•ˆ ์“ฐ๋Š” ์กฐํ•ฉ์ด๋ฉด ์ ‘ํžŒ ํŒจ๋„์€ ์•„์˜ˆ ๋ Œ๋”๋˜์ง€ ์•Š๋Š”๋‹ค** โ€” ์ ‘ํžŒ ์ƒํƒœ์—์„œ๋„ ๋ฐ˜๋“œ์‹œ ๋ˆŒ๋Ÿฌ์•ผ ํ•˜๋Š” ๊ฒƒ์ด ๊ทธ ๋‘˜ ๋ฐ–์— ์žˆ์œผ๋ฉด `foldedTop`/`foldedFooter` ๋กœ ๋”ฐ๋กœ ์ค€๋‹ค.
1799
+ - **`header="full"` ์€ ์ ‘์–ด๋„ ์ƒ๋‹จ๋ฐ”๊ฐ€ ๋‚จ์œผ๋ฏ€๋กœ ์กฐ๊ฐ๋“ค๋„ ๊ทธ๋Œ€๋กœ ๋‚จ๋Š”๋‹ค.** ๋Œ€์‹  ๊ฐ€๋กœ๋กœ ์ž๋ฆฌ๊ฐ€ ๋„‰๋„‰ํ•˜์ง€ ์•Š์•„ ์•Œ๋ฆผยท์„ค์ •์ด ๋ผ๋ฒจ์„ ๋ฒ—๊ณ  ์•„์ด์ฝ˜(์•Œ๋ฆผ์€ ๊ฐœ์ˆ˜๊นŒ์ง€)๋งŒ ๋‚จ๋Š”๋‹ค โ€” ์ด๊ฑด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•Œ์•„์„œ ํ•˜๋ฏ€๋กœ ์•ฑ์ด ๋ผ๋ฒจ์„ ์ง€์šฐ์ง€ ์•Š๋Š”๋‹ค.
1800
+ - **`account` ๋ฅผ ์“ฐ๋ฉด `account.listBox` ๊ฐ€ ํ•„์ˆ˜๋‹ค** (ยง3-5-8) โ€” ๊ณ„์ • ํ–‰์„ ๋ˆ„๋ฅด๋ฉด ์ด๋ฉ”์ผยท์ด๋ฆ„ยท๊ถŒํ•œ๊ณผ ๊ณ„์ • ์„ค์ •ยท์–ธ์–ด ๋ณ€๊ฒฝยท๋กœ๊ทธ์•„์›ƒ์ด ์˜ˆ์™ธ ์—†์ด ๋œฌ๋‹ค. ๋œจ๋Š” ๋ฐฉํ–ฅ์€ ํŒ์ด ๋†“์ธ ์ž๋ฆฌ๊ฐ€ ์ •ํ•˜๋ฏ€๋กœ ์•ฑ์ด ๋„˜๊ธฐ์ง€ ์•Š๋Š”๋‹ค โ€” ํŒ์ด๋ฉด ๊ณ„์ • ํ–‰ ์œ„๋กœ, ์ƒ๋‹จ๋ฐ”๋ฉด ์•„๋ž˜๋กœ ํŽผ์น˜๊ณ , ์ ‘ํžŒ ๋ ˆ์ผ๋„ ํŒ๊ณผ ๊ฐ™๋‹ค. `account.onClick` ์€ ํŒจ๋„์„ ์—ฌ๋Š” ๊ฒƒ ๋ง๊ณ  ๋”ฐ๋กœ ํ•  ์ผ(๋กœ๊น… ๋“ฑ)์ด ์žˆ์„ ๋•Œ๋งŒ ์ค€๋‹ค.
1801
+ - **์•Œ๋ฆผ ๊ฐœ์ˆ˜๋Š” `alert.count` ํ•˜๋‚˜๋กœ ํ‘œํ˜„ํ•œ๋‹ค.** 1 ์ด์ƒ์ด๋ฉด ๋ฒจ์ด ์šธ๋ฆฌ๋Š” ์•„์ด์ฝ˜๊ณผ ๊ฐ•์กฐ์ƒ‰์œผ๋กœ ๋ฐ”๋€๋‹ค โ€” ์ƒ‰์€ GNB ์ƒ‰์ด ์ •ํ•˜๋ฏ€๋กœ ์•ฑ์ด ์ง์ ‘ ์น ํ•˜์ง€ ์•Š๋Š”๋‹ค. **`resizable` ๋กœ ๋ฉ”๋‰ด๋ฅผ ๊ธฐ๋ณธ ํญ๋ณด๋‹ค ์ข๊ฒŒ ์ค„์ด๋ฉด ๊ฐœ์ˆ˜๋ฅผ ์ ์„ ๊ฐ€๋กœ๊ฐ€ ๋ชจ์ž๋ผ ์ ‘ํž˜๊ณผ ๊ฐ™์€ ์  ๋ฐฐ์ง€๋กœ ๋ฐ”๋€๋‹ค** โ€” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•Œ์•„์„œ ํ•˜๋ฏ€๋กœ ์•ฑ์ด ํญ์„ ๋ณด๊ณ  `count` ๋ฅผ ์ง€์šฐ์ง€ ์•Š๋Š”๋‹ค.
1802
+ - **์•Œ๋ฆผ์„ ๋ˆŒ๋Ÿฌ ๋œจ๋Š” ๋ชฉ๋ก์€ `alert.listBox` ์— ๋‚ด์šฉ๋งŒ ๋„˜๊ธด๋‹ค** โ€” `SPortal` ์„ ๋”ฐ๋กœ ๋„์›Œ ์•Œ๋ฆผ ๋ฒ„ํŠผ์— ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค. ๋ชฉ๋ก์— ๋ฌด์—‡์„ ์Œ“์„์ง€๋Š” ์„œ๋น„์Šค๋งˆ๋‹ค ๋‹ค๋ฅด์ง€๋งŒ **๋œจ๋Š” ์ž๋ฆฌ๋Š” ๋Š˜ ๊ฐ™์•„์•ผ ํ•˜๋ฏ€๋กœ**, ๋ฐฉํ–ฅ(ํŒยท์ ‘ํžŒ ๋ ˆ์ผ์€ ๋ฒ„ํŠผ ์˜ค๋ฅธ์ชฝ ยท ์ƒ๋‹จ๋ฐ”๋Š” ์•„๋ž˜๋กœ ์˜ค๋ฅธ์ชฝ ๋)๊ณผ ๋ฐ”๊นฅ ํด๋ฆญยทESC ๋‹ซํž˜, ๋ฐฐ๊ฒฝยท๋ผ์šด๋“œยท๊ทธ๋ฆผ์ž๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฅ”๋‹ค. ์—ฌ๋‹ซ๋Š” ์ผ๋„ ์•Œ๋ฆผ ๋ฒ„ํŠผ์ด ํ•˜๋ฏ€๋กœ **`onOpenChange` ๋Š” ๊ทธ ์‚ฌ์‹ค์„ ์•Œ์•„์•ผ ํ•  ๋•Œ๋งŒ** ๋ฐ›๋Š”๋‹ค(์—ฐ ๊น€์— ์ฝ์Œ ์ฒ˜๋ฆฌํ•˜๋Š” ํ™”๋ฉด ๋“ฑ) โ€” ์ด ๊ฐ’์œผ๋กœ ๋ชฉ๋ก์„ ๋Œ€์‹  ์—ด๊ฑฐ๋‚˜ ๋ง‰์ง€ ์•Š๋Š”๋‹ค. ๊ณ„์ • ํ–‰(`account.listBox`)๊ณผ ๊ฐ™์€ ๊ทœ์น™์ด๋‹ค.
1803
+ - **์•Œ๋ฆผ์— ์•ˆ๋‚ด ํˆดํŒ์„ ๋„์šฐ๋ ค๋ฉด `alert.tooltip` ์— ๋ฌธ๊ตฌ๋งŒ ๋„˜๊ธด๋‹ค** โ€” `STooltip` ์„ ์ง์ ‘ ์„ธ์›Œ ์•Œ๋ฆผ ๋ฒ„ํŠผ์— ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค. ์ƒ‰(ํŒ์ด light ๋ฉด ๊ธฐ๋ณธ ยท ๊ทธ ๋ฐ–์€ ๊ฐ•์กฐ)๊ณผ ๋ฐฉํ–ฅ(ํŒยท์ ‘ํžŒ ๋ ˆ์ผ์€ ์˜ค๋ฅธ์ชฝ ยท ์ƒ๋‹จ๋ฐ”๋Š” ์•„๋ž˜)์€ ์ž๋ฆฌ๊ฐ€ ์ •ํ•˜๊ณ , ์Šค์Šค๋กœ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋‹ค๊ฐ€ **์•Œ๋ฆผ์„ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ๋ฒ„ํŠผ์—์„œ ์ปค์„œ๋ฅผ ๋บ„ ๋•Œ** ๋‹ซํžŒ๋‹ค.
1804
+ - **๋‹ซํž˜์€ `onTooltipDismiss` ๋กœ ๋ฐ›์•„ `tooltip` ์„ ๋น„์›Œ ๋‘”๋‹ค.** ๊ฐ™์€ ๊ฐ’์„ ๊ณ„์† ๋„˜๊ธฐ๋Š” ๋™์•ˆ์—๋Š” ๋‹ค์‹œ ๋œจ์ง€ ์•Š๊ณ , **๋น„์› ๋‹ค ๋‹ค์‹œ ๋„˜๊ธฐ๋ฉด ๋ฌธ๊ตฌ๊ฐ€ ๊ฐ™์•„๋„ ์ƒˆ ์•ˆ๋‚ด๋กœ ๋œฌ๋‹ค** โ€” ์ƒˆ ์•Œ๋ฆผ๋งˆ๋‹ค ๊ฐ™์€ ์•ˆ๋‚ด๋ฅผ ๋‹ค์‹œ ๋„์šฐ๋Š” ํ™”๋ฉด์ด ๋ง‰ํžˆ์ง€ ์•Š๋Š”๋‹ค.
1805
+ - ์žฌ๋…ธ์ถœ ์‹ ํ˜ธ๋Š” ๋ฌธ๊ตฌ๊ฐ€ **์—†์Œ โ†’ ์žˆ์Œ** ์œผ๋กœ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ด๋‹ค. ํ•œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์•ˆ์—์„œ ๋น„์› ๋‹ค ๊ณง๋ฐ”๋กœ ๋„ฃ์œผ๋ฉด ๋ Œ๋”๊ฐ€ ํ•œ ๋ฒˆ์œผ๋กœ ๋ฌถ์—ฌ ์‹ ํ˜ธ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค โ€” ๋‹ซ์„ ๋•Œ ๋น„์šฐ๊ณ , ๋‹ค์‹œ ํ•„์š”ํ•  ๋•Œ ๋„˜๊ธด๋‹ค.
1806
+ - ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•„๋Š” ๋ฒ”์œ„๋Š” ๊ทธ ์ž๋ฆฌ๊ฐ€ ์„œ ์žˆ๋Š” ๋™์•ˆ๋ฟ์ด๋‹ค(์ƒˆ๋กœ๊ณ ์นจํ•˜๊ฑฐ๋‚˜ GNB ๋ฅผ ์ ‘์–ด ์•Œ๋ฆผ์ด ๋‹ค๋ฅธ ์ž๋ฆฌ๋กœ ์˜ฎ๊ฒจ ์„œ๋ฉด ์ƒˆ๋กœ ๋งˆ์šดํŠธ๋œ๋‹ค). **๊ทธ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‘ ๋ฒˆ ๋‹ค์‹œ ๋ณด์ด์ง€ ์•Š์•„์•ผ ํ•˜๋ฉด ์•ฑ์ด ๋‹ซํž˜์„ ์ €์žฅํ•ด ๋‘๊ณ  `tooltip` ์„ ๋„˜๊ธฐ์ง€ ์•Š๋Š”๋‹ค.**
1807
+ - **`header="fix"` + `showRail` ์—์„œ ํ•˜์œ„ ๋ฉ”๋‰ด๊ฐ€ ์—†๋Š” ๋ ˆ์ผ ์•„์ดํ…œ์ด ํ™œ์„ฑ์ด๋ฉด ๋ฉ”๋‰ด ์ปฌ๋Ÿผ์งธ ์‚ฌ๋ผ์ง€๋ฏ€๋กœ ์ด ํŒจ๋„๋„ ํ•จ๊ป˜ ๋น ์ง„๋‹ค.** ํ•ญ์ƒ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ๊ณ„์ •ยท์•Œ๋ฆผ์ด๋ผ๋ฉด ๊ทธ๋Ÿฐ ๋ ˆ์ผ ๋ฆฌํ”„๋ฅผ ๋‘์ง€ ์•Š๋Š”๋‹ค โ€” ๋˜๋Š” `header="full"` ๋กœ ๋‘๋ฉด ์ƒ๋‹จ๋ฐ”์— ๋‚จ๋Š”๋‹ค(๊ทธ๋Ÿฐ ๋ ˆ์ผ ๋ฆฌํ”„๊ฐ€ ์žˆ์œผ๋ฉด GNB ๊ฐ€ `header` ๋ฅผ `full` ๋กœ ๊ฐ•์ œํ•œ๋‹ค).
1808
+
1315
1809
  ### 4-2. ๋ชฉ๋ก ํŽ˜์ด์ง€ (ํ•„ํ„ฐ + ํ…Œ์ด๋ธ”)
1316
1810
 
1317
1811
  ๊ตฌ์กฐ: **ํŽ˜์ด์ง€ ํ—ค๋”(`AppShell` ์˜ `header` prop, ๊ฐ€์ด๋“œ ๋“ฑ ๋ถ€๊ฐ€ ์•ก์…˜์€ slot) โ†’ ํ•„ํ„ฐ(`SKeyValueTable`) โ†’ `STableBar` โ†’ `STable`**
@@ -1323,9 +1817,10 @@ import { SModalOutlet } from 'sellmate-design-system-react';
1323
1817
  - **ํŽ˜์ด์ง€ ์ œ๋ชฉ ์ค„์—๋Š” ์ด ํŽ˜์ด์ง€์˜ ์ฃผ์š” ์•ก์…˜์„ ๋‘์ง€ ์•Š๋Š”๋‹ค.** ๋ถ€๊ฐ€์ ์ธ ๊ฒƒ๋งŒ `header.slot` ์— `SButton size="sm"` ์œผ๋กœ ์˜จ๋‹ค (ยง4-1 "ํŽ˜์ด์ง€ ํ—ค๋” ์‚ฌ์šฉ ๊ทœ์น™").
1324
1818
  - **์ฃผ์š” ์•ก์…˜(๋“ฑ๋ก ๋“ฑ)์€ `STableBar` ์˜ `rightActions`** ์— ๋‘”๋‹ค.
1325
1819
  - **์„ ํƒ ์ƒํƒœ ์•ก์…˜(์„ ํƒ ์‚ญ์ œ ๋“ฑ)์€ `STableBar` ์˜ `actions`** ์— ๋‘”๋‹ค. `actions` ์Šฌ๋กฏ์€ ๊ฑด์ˆ˜ ์š”์•ฝ์ด ์žˆ์œผ๋ฉด ์•ž์— ๊ตฌ๋ถ„์„ (`SDivider`)์„ **์ž๋™์œผ๋กœ** ๋„ฃ์œผ๋ฏ€๋กœ ์ง์ ‘ ๊ตฌ๋ถ„์„ ์„ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
1326
- - **ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ์žˆ์œผ๋ฉด ๋ณธ๋ฌธ์ด ๋‚จ์€ ๋†’์ด๋ฅผ ์ฑ„์šฐ๊ฒŒ ํ•œ๋‹ค** โ€” `AppShell` ์— `contentHeight="fill"` ์„ ๋„˜๊ธด๋‹ค. ํŽ˜์ด์ง€๊ฐ€ ํ†ต์งธ๋กœ ์Šคํฌ๋กค๋˜๋ฉด ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ํ™”๋ฉด ๋ฐ–์œผ๋กœ ๋ฐ€๋ ค "์—ฌ๊ธฐ์„œ ๋"์ด ์ฝํžˆ์ง€ ์•Š๋Š”๋‹ค. `fill` ์ด๋ฉด **ํ‘œ๋งŒ ์ž๊ธฐ ์•ˆ์—์„œ ์Šคํฌ๋กคํ•˜๊ณ  ํŽ˜์ด์ง€๋„ค์ด์…˜์€ ํ•˜๋‹จ์— ๊ณ ์ •**๋œ๋‹ค.
1820
+ - **๋ณธ๋ฌธ์ด ๋‚จ์€ ๋†’์ด๋ฅผ ์ฑ„์šฐ๊ฒŒ ํ•œ๋‹ค** โ€” `AppShell` ์— `contentHeight="fill"` ์„ ๋„˜๊ธด๋‹ค(ยง2-2 ํ‘œ์ค€). ํŽ˜์ด์ง€๊ฐ€ ํ†ต์งธ๋กœ ์Šคํฌ๋กค๋˜๋ฉด ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ํ™”๋ฉด ๋ฐ–์œผ๋กœ ๋ฐ€๋ ค "์—ฌ๊ธฐ์„œ ๋"์ด ์ฝํžˆ์ง€ ์•Š๋Š”๋‹ค. `fill` ์ด๋ฉด **ํ‘œ๋งŒ ์ž๊ธฐ ์•ˆ์—์„œ ์Šคํฌ๋กคํ•˜๊ณ  ํŽ˜์ด์ง€๋„ค์ด์…˜์€ ํ•˜๋‹จ์— ๊ณ ์ •**๋œ๋‹ค.
1327
1821
  - ๋ณธ๋ฌธ ๋ฃจํŠธ์— `h-full min-h-0` ์œผ๋กœ ์„ธ๋กœ ์ถ•์„ ์ž‡๊ณ , ๋‚จ์€ ๋†’์ด๋ฅผ ๋จน์„ `STable` ์— `min-h-0 flex-1` ์„ ์ค€๋‹ค. ์ด ์‚ฌ์Šฌ์ด ํ•˜๋‚˜๋ผ๋„ ๋Š๊ธฐ๋ฉด ํ‘œ๊ฐ€ ๋†’์ด๋ฅผ ๋ชป ์žก๋Š”๋‹ค.
1328
1822
  - `fill` ์—์„œ๋Š” ํŽ˜์ด์ง€๊ฐ€ ์Šคํฌ๋กคํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ **`scrollEndSpacing` ์€ ๋ฌด์‹œ๋œ๋‹ค** โ€” ๋”ฐ๋กœ ๋„์ง€ ์•Š๋Š”๋‹ค (ยง2-2).
1823
+ - **์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ์ปฌ๋Ÿผ์€ `sortable` ๋กœ ์ค€๋‹ค.** ์ •๋ ฌ ์ƒํƒœ(`sort`)๋Š” ์ด ํŽ˜์ด์ง€๊ฐ€ ๋“ค๊ณ  `onSortChange` ๋กœ ๋ฐ›๋Š”๋‹ค โ€” ์กฐํšŒ ์กฐ๊ฑด์ด๋ผ URL ์— ์‹ค๋ ค์•ผ ํ•œ๋‹ค (ยง3-4).
1329
1824
 
1330
1825
  ```tsx
1331
1826
  import {
@@ -1337,7 +1832,7 @@ import {
1337
1832
  const filterFields: SKeyValueField[][] = [
1338
1833
  [
1339
1834
  { name: 'status', label: '์ƒํƒœ', type: 'select',
1340
- options: { options: STATUS_OPTIONS, emitValue: true } },
1835
+ options: { options: STATUS_OPTIONS, valueAsPrimitive: true } },
1341
1836
  { name: 'keyword', label: '๊ฒ€์ƒ‰์–ด', type: 'input',
1342
1837
  options: { placeholder: '์ƒํ’ˆ๋ช… / ์ƒํ’ˆ์ฝ”๋“œ' } },
1343
1838
  ],
@@ -1369,6 +1864,7 @@ export default function ProductListPage() {
1369
1864
  return (
1370
1865
  <AppShell
1371
1866
  header={{
1867
+ variant: 'bar',
1372
1868
  title: '์ƒํ’ˆ ๋ชฉ๋ก',
1373
1869
  // ์ด ํŽ˜์ด์ง€์˜ ์ฃผ์š” ์•ก์…˜์ด ์•„๋‹ˆ๋ผ ๋ถ€๊ฐ€ ์•ก์…˜ โ€” slot ์€ sm ๋ฒ„ํŠผ์œผ๋กœ๋งŒ ์ฑ„์šด๋‹ค
1374
1870
  slot: <SButton size="sm" color="neutral" outline label="์ด์šฉ ๊ฐ€์ด๋“œ" onClick={openGuide} />,
@@ -1411,7 +1907,7 @@ export default function ProductListPage() {
1411
1907
  selected={selected}
1412
1908
  onSelectedChange={setSelected}
1413
1909
  pagination={{ currentPage, lastPage }}
1414
- isLoading={isLoading}
1910
+ loading={loading}
1415
1911
  />
1416
1912
  </div>
1417
1913
  </AppShell>
@@ -1419,6 +1915,33 @@ export default function ProductListPage() {
1419
1915
  }
1420
1916
  ```
1421
1917
 
1918
+ #### ํ•œ ํ™”๋ฉด์— ๋” ๋งŽ์€ ํ–‰์„ โ€” `dense` ์™€ ๋ฐ€๋„ ํ† ๊ธ€
1919
+
1920
+ ํ–‰ ๋†’์ด๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์€ `dense` ๋‹ค. ์„ธ๋กœ ์—ฌ๋ฐฑ๋งŒ ์ค„๊ณ  ์ขŒ์šฐ ํŒจ๋”ฉ์€ ๊ทธ๋Œ€๋กœ๋ผ, ๊ฐ’์ด ์ž˜๋ฆฌ์ง€ ์•Š์œผ๋ฉด์„œ ํ•œ ํ™”๋ฉด์— ๋“ค์–ด๊ฐ€๋Š” ํ–‰ ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค.
1921
+
1922
+ **์–ด๋А ์ชฝ์ด ํŽธํ•œ์ง€๋Š” ํ™”๋ฉด์ด ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž๊ฐ€ ์•ˆ๋‹ค.** ๊ทธ๋ž˜์„œ `dense` ๋Š” ๋ฐ€๋„๋ฅผ ๊ณ ์ •ํ•˜๋Š” ์Šค์œ„์น˜๊ฐ€ ์•„๋‹ˆ๋ผ **์‹œ์ž‘ ๋ฐ€๋„์ด์ž ๋ฐ€๋„ ํ† ๊ธ€์˜ ์Šค์œ„์น˜**๋‹ค โ€” ์ผœ๋ฉด ํ•˜๋‹จ ๋ฐ” ์šฐ์ธก(rows per page ์…€๋ ‰ํŠธ ์™ผ์ชฝ)์— `์ข๊ฒŒ ๋ณด๊ธฐ` ยท `๋„“๊ฒŒ ๋ณด๊ธฐ` ๋งํฌ๊ฐ€ ๋ถ™๋Š”๋‹ค. ์ผœ๊ณ  ๋„๋Š” ๋ณ„๋„ prop ์€ ์—†๋‹ค.
1923
+
1924
+ ```tsx
1925
+ // ์ข๊ฒŒ ์‹œ์ž‘ํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ”๊พธ๋Š” ๋ฐ€๋„๋Š” ํ‘œ๊ฐ€ ์•Œ์•„์„œ ๋“ค๊ณ  ๊ฐ„๋‹ค
1926
+ <STable dense showRowsPerPageSelect pagination={{ currentPage, lastPage }} />;
1927
+
1928
+ // ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋ฅธ ๋ฐ€๋„๋ฅผ ๋‹ค์Œ ๋ฐฉ๋ฌธ์—๋„ ๋‚จ๊ธฐ๋ ค๋Š” ํ™”๋ฉด๋งŒ ๋ฐ›์•„์„œ ์ €์žฅํ•œ๋‹ค.
1929
+ // ์ €์žฅํ•œ ๊ฐ’์€ ์‹œ์ž‘ ๋ฐ€๋„๋กœ๋งŒ ๋Œ๋ ค์ค€๋‹ค โ€” ๋˜๋Œ๋ ค ๋„ฃ์ง€ ์•Š๋Š”๋‹ค
1930
+ const [initialDense] = useState(() => loadPref('list.dense', true));
1931
+
1932
+ <STable
1933
+ dense={initialDense}
1934
+ onDenseChange={next => savePref('list.dense', next)}
1935
+ showRowsPerPageSelect
1936
+ pagination={{ currentPage, lastPage }}
1937
+ />;
1938
+ ```
1939
+
1940
+ - **๋ˆ„๋ฅธ ๋’ค์˜ ๋ฐ€๋„๋Š” `STable` ์ด ๋‚ด๋ถ€ ์ƒํƒœ๋กœ ๋“ค๊ณ  ๊ฐ„๋‹ค.** `onDenseChange` ์—†์ด๋„ ํ† ๊ธ€์€ ๋™์ž‘ํ•œ๋‹ค. ์ €์žฅ์ด ํ•„์š”ํ•œ ํ™”๋ฉด๋งŒ ๋ฐ›์•„์„œ ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค.
1941
+ - **`dense` ์— `onDenseChange` ๊ฐ’์„ ๋˜๋Œ๋ ค ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.** ํ† ๊ธ€์„ ๋ถ™์ผ์ง€๋Š” ์ด prop ์ด ์ •ํ•˜๋ฏ€๋กœ, ๋„“๊ฒŒ ๋ณธ ์ˆœ๊ฐ„ `dense` ๊ฐ€ `false` ๊ฐ€ ๋˜๋ฉด ํ† ๊ธ€์ด ์‚ฌ๋ผ์ ธ ๋‹ค์‹œ ์ขํž ๊ธธ์ด ์—†๋‹ค. prop ๊ฐ’์„ ๋ฐ”๊ฟ” ๋„˜๊ธฐ๋Š” ๊ฒƒ์€ ์™ธ๋ถ€ ๋ฒ„ํŠผ ๋“ฑ์œผ๋กœ ๋ฐ€๋„๋ฅผ **๋˜๋Œ๋ฆด ๋•Œ**๋งŒ ์“ด๋‹ค โ€” ๋‚ด๋ถ€ ๋ฐ€๋„๊ฐ€ ๊ทธ ๊ฐ’์œผ๋กœ ๋งž์ถฐ์ง„๋‹ค.
1942
+ - **`dense` ๋ฉด ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ์—†์–ด๋„ ํ† ๊ธ€์ด ๋‚˜์˜จ๋‹ค** โ€” ํ•˜๋‹จ ๋ฐ”๋ฅผ ํ† ๊ธ€๋งŒ ๋‹ด์•„ ๊ทธ๋ฆฐ๋‹ค. `dense` ๊ฐ€ ์•„๋‹ˆ๋ฉด ํ† ๊ธ€๋„ ์—†๋‹ค.
1943
+ - ๋ผ๋ฒจ๊ณผ ์•„์ด์ฝ˜์€ ํ˜„์žฌ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ **๋ˆ„๋ฅด๋ฉด ๋˜๋Š” ์ƒํƒœ**๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ข๊ฒŒ ๋ณด๊ณ  ์žˆ์œผ๋ฉด `๋„“๊ฒŒ ๋ณด๊ธฐ` ๋‹ค.
1944
+
1422
1945
  ### 4-3. ํผ ํŽ˜์ด์ง€ (๋“ฑ๋ก/์ˆ˜์ •)
1423
1946
 
1424
1947
  ๊ตฌ์กฐ: **ํŽ˜์ด์ง€ ์ œ๋ชฉ(`AppShell` ์˜ `header` prop) โ†’ `SForm` + `SKeyValueTable` โ†’ ํ•˜๋‹จ ๋ฒ„ํŠผ**
@@ -1426,6 +1949,19 @@ export default function ProductListPage() {
1426
1949
  - ํ•„๋“œ๋ฅผ `div` ๋กœ ๋‚˜์—ดํ•˜์ง€ ์•Š๊ณ  **`SKeyValueTable` ์˜ ํ–‰์œผ๋กœ ๊ตฌ์„ฑ**ํ•œ๋‹ค.
1427
1950
  - ๊ฒ€์ฆ ๊ทœ์น™์€ ๊ฐ field ์˜ `options.rules` ๋กœ ๋„˜๊ธด๋‹ค. `SForm` ์ด ํ•˜์œ„ ์ปจํŠธ๋กค์„ ์ž๋™ ์ˆ˜์ง‘ํ•ด submit ์‹œ ์ผ๊ด„ ๊ฒ€์ฆํ•˜๊ณ , ์‹คํŒจ ์‹œ ์ฒซ ์‹คํŒจ ํ•„๋“œ๋กœ ํฌ์ปค์Šค๋ฅผ ์˜ฎ๊ธด๋‹ค.
1428
1951
  - **๋ฒ„ํŠผ ์ˆœ์„œ: ์ทจ์†Œยท๋‹ซ๊ธฐ๊ฐ€ ์™ผ์ชฝ, ์ €์žฅยท๋“ฑ๋กยท์ˆ˜์ •ยท์‚ญ์ œ๊ฐ€ ์˜ค๋ฅธ์ชฝ.** ์ด ์ˆœ์„œ๋Š” ๋ชจ๋“  ํ™”๋ฉด์—์„œ ๋™์ผํ•˜๋‹ค.
1952
+ - **ํผ ํŽ˜์ด์ง€๋„ `contentHeight="fill"` ์ด ๊ธฐ๋ณธ์ด๋‹ค**(ยง2-2). ํผ์ด ๊ธธ์–ด ํŽ˜์ด์ง€๊ฐ€ ์‹ค์ œ๋กœ ์Šคํฌ๋กค๋˜๋Š” ํ™”๋ฉด์—์„œ๋งŒ `auto` + `scrollEndSpacing` ์„ ์ผ ๋‹ค.
1953
+ - **ํ•„๋“œ ํญ์€ ๋“ฑ๊ธ‰์œผ๋กœ ์ค€๋‹ค** โ€” `width="md"` ์ฒ˜๋Ÿผ `'xs' | 'sm' | 'md' | 'lg' | 'xl'` ์ค‘ ํ•˜๋‚˜๋‹ค. px ๋ฅผ ์ง์ ‘ ์ ์ง€ ์•Š๋Š”๋‹ค. ๋“ฑ๊ธ‰์€ `maxLength`(= ์Šคํ‚ค๋งˆ ์ƒํ•œ)๋กœ ๊ณ ๋ฅด๊ณ , ์ƒํ•œ์ด `xl` ์„ ๋„˜๊ฑฐ๋‚˜ ์ƒํ•œ์ด ์—†์œผ๋ฉด `width="100%"` ๋กœ ํ–‰ ์ „์ฒด๋ฅผ ์“ด๋‹ค (ยง6 `field-width-grade`).
1954
+
1955
+ **`SKeyValueTable` ์˜ ์ „์ฒด ์—ด ์ˆ˜๋Š” ๊ฐ€์žฅ ๊ธด ํ–‰์ด ์ •ํ•œ๋‹ค.** ์–ด๋–ค ํ–‰์ด ๊ทธ๋ณด๋‹ค ์งง์œผ๋ฉด ๋‚จ๋Š” ์ž๋ฆฌ์— ์…€์ด ์—†์–ด ๊ทธ ๊ตฌ๊ฐ„์˜ ํ–‰ ๊ตฌ๋ถ„์„ ์ด ๋Š๊ธด๋‹ค. ๋งˆ์ง€๋ง‰ ํ•„๋“œ์— `tdColSpan` ์„ ์ฃผ์–ด ์ฑ„์šด๋‹ค.
1956
+
1957
+ ```tsx
1958
+ [
1959
+ [{ name: 'category', โ€ฆ }, { name: 'price', โ€ฆ }], // ํ•„๋“œ 2๊ฐœ โ†’ 4์นธ
1960
+ [{ name: 'memo', โ€ฆ, tdColSpan: 3 }], // th(1) + td(3) = 4์นธ
1961
+ ]
1962
+ ```
1963
+
1964
+ **ํ•œ ํ–‰์— ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋‹ค๋ฅธ ํ–‰๋“ค์˜ `tdColSpan` ๋„ ํ•จ๊ป˜ ๋ด์•ผ ํ•œ๋‹ค.** ์ „์ฒด ์—ด ์ˆ˜๊ฐ€ ๋Š˜๋ฉด ๋‚˜๋จธ์ง€ ํ–‰๋“ค์ด ์กฐ์šฉํžˆ ์งง์•„์ง„๋‹ค โ€” ํ™”๋ฉด์—์„œ๋งŒ ๋“œ๋Ÿฌ๋‚˜๋Š” ์ปดํฌ๋„ŒํŠธ ๊ณ ์œ  ๋™์ž‘์ด๋ผ ์ž๋™์œผ๋กœ ์ฑ„์›Œ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
1429
1965
 
1430
1966
  ```tsx
1431
1967
  import {
@@ -1444,7 +1980,7 @@ const fields: SKeyValueField[][] = [
1444
1980
  ],
1445
1981
  [
1446
1982
  { name: 'category', label: '์นดํ…Œ๊ณ ๋ฆฌ', required: true, type: 'select',
1447
- options: { options: CATEGORY_OPTIONS, emitValue: true,
1983
+ options: { options: CATEGORY_OPTIONS, valueAsPrimitive: true,
1448
1984
  rules: [required('์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์„ ํƒํ•ด ์ฃผ์„ธ์š”.')] } },
1449
1985
  { name: 'price', label: 'ํŒ๋งค๊ฐ€', type: 'number-input' },
1450
1986
  ],
@@ -1459,9 +1995,9 @@ export default function ProductCreatePage() {
1459
1995
  const [values, setValues] = useState<Record<string, unknown>>({});
1460
1996
 
1461
1997
  return (
1462
- <AppShell header={{ title: '์ƒํ’ˆ ๋“ฑ๋ก', onBack: goBack }}>
1998
+ <AppShell header={{ variant: 'bar', title: '์ƒํ’ˆ ๋“ฑ๋ก', onBack: goBack }}>
1463
1999
  <div className="flex flex-col gap-sd-12">
1464
- <SForm ref={formRef} formClass="flex flex-col gap-sd-12" onSubmit={save}>
2000
+ <SForm ref={formRef} formClassName="flex flex-col gap-sd-12" onSubmit={save}>
1465
2001
  <SKeyValueTable
1466
2002
  fields={fields}
1467
2003
  values={values}
@@ -1491,6 +2027,8 @@ export default function ProductCreatePage() {
1491
2027
  - ํ–‰์ด ๋งŽ์•„์ง€๋ฉด **์œ ํ˜•๋ณ„๋กœ ์„น์…˜์„ ๋‚˜๋ˆ„๊ณ , ๊ฐ ์„น์…˜์„ `SSectionHeaderCard` ๋กœ ๊ฐ์‹ผ๋‹ค.**
1492
2028
  ์„น์…˜ ์ œ๋ชฉ์€ `title` prop ์œผ๋กœ, ๋ฐ”๋”” ์—ฌ๋ฐฑ์€ `padding` prop ์œผ๋กœ ์ค€๋‹ค.
1493
2029
  - **์ˆ˜์ •ยท์‚ญ์ œ ๋ฒ„ํŠผ์€ ํ•˜๋‹จ์— ๋‘”๋‹ค.** ๋‚ด์šฉ์ด ์งง์•„ ์šฐ์ธก ์ƒ๋‹จ์— ๋‘๋Š” ๋ณ€ํ˜•๋„ ์žˆ์œผ๋‚˜ ๊ธฐ๋ณธ์€ ํ•˜๋‹จ์ด๋‹ค.
2030
+ - **์ƒ์„ธ ํŽ˜์ด์ง€๋„ `contentHeight="fill"` ์ด ๊ธฐ๋ณธ์ด๋‹ค**(ยง2-2). ์„น์…˜์ด ๋งŽ์•„ ํŽ˜์ด์ง€๊ฐ€ ์‹ค์ œ๋กœ ์Šคํฌ๋กค๋˜๋Š” ํ™”๋ฉด์—์„œ๋งŒ `auto` + `scrollEndSpacing` ์„ ์ผ ๋‹ค.
2031
+ - **์„น์…˜๋งˆ๋‹ค ๋…๋ฆฝ ์ธ๋ผ์ธ ํผ์ด ์žˆ๋Š” ํ˜•ํƒœ**๋„ ์ƒ์„ธ ํŽ˜์ด์ง€์˜ ๋ณ€ํ˜•์ด๋‹ค. ์„น์…˜ ์•ˆ์—์„œ ๋ฐ”๋กœ ์ˆ˜์ •ยท์ €์žฅํ•˜๊ฒŒ ํ•˜๋Š” ํ™”๋ฉด์ธ๋ฐ, ์ด๋•Œ ๋ฒ„ํŠผ ๊ฐ•์กฐ๋Š” **์„น์…˜ ๋‹จ์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ํŒ๋‹จํ•œ๋‹ค** โ€” ยง3-5-1 ์˜ "`secondary` ์—ฐ์† ๋ฐฐ์น˜ ๊ธˆ์ง€"๋Š” ์„น์…˜์ด ๋‹ค๋ฅด๋ฉด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ ์„น์…˜ ์•ˆ์—์„œ ๋‹ซํžˆ๋Š” ์ €์žฅยท์ทจ์†Œ๋Š” `SSectionHeaderCard` ์˜ `button`ยท`footerLeft` ๋กœ ๋„˜๊ธด๋‹ค (ยง3-7-8). ์•„๋ž˜ ์˜ˆ์ฒ˜๋Ÿผ **ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ํ™•์ •ํ•˜๋Š” ๋ฒ„ํŠผ์€ ์นด๋“œ ๋ฐ– ํ•˜๋‹จ ์ค„**์— ๋‘”๋‹ค โ€” ๋‘˜์„ ์„ž์ง€ ์•Š๋Š”๋‹ค.
1494
2032
 
1495
2033
  ```tsx
1496
2034
  import {
@@ -1520,7 +2058,7 @@ const priceFields: SKeyValueField[][] = [
1520
2058
  export default function ProductDetailPage() {
1521
2059
  return (
1522
2060
  // ๋ชฉ๋ก์—์„œ ๋“ค์–ด์˜จ ์ƒ์„ธ ํŽ˜์ด์ง€ โ€” onBack ์œผ๋กœ ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ์ค€๋‹ค
1523
- <AppShell header={{ fix: true, title: 'ํด๋ž˜์‹ ์…”์ธ ', onBack: goList }}>
2061
+ <AppShell header={{ variant: 'bar', title: 'ํด๋ž˜์‹ ์…”์ธ ', onBack: goList }}>
1524
2062
  <div className="flex flex-col gap-sd-12">
1525
2063
  <SSectionHeaderCard title="๊ธฐ๋ณธ ์ •๋ณด" marker thickness="accent">
1526
2064
  <SKeyValueTable fields={basicFields} values={product} />
@@ -1567,6 +2105,29 @@ export default function ProductDetailPage() {
1567
2105
  | Prop (Body) | ์šฉ๋„ |
1568
2106
  | --- | --- |
1569
2107
  | `padding` | ์•ˆ์ชฝ ์—ฌ๋ฐฑ โ€” `'default'`(๊ธฐ๋ณธ) / `'wide'` / `'none'`. ํŒ์ •์€ ยง2-2 "์„น์…˜ยทํŒจ๋„ ์•ˆ์ชฝ ์—ฌ๋ฐฑ". `p-sd-*` ๋ฅผ ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค |
2108
+ | `background` | ๋ณธ๋ฌธ ๋ฐ”ํƒ• โ€” `'frame'`(๊ธฐ๋ณธ) / `'neutral'`. ํŒ์ •์€ ยง2-2 "๋ณธ๋ฌธ ๋ฐ”ํƒ• ๋ˆŒ๋Ÿฌ์•‰ํžˆ๊ธฐ" |
2109
+
2110
+ | Prop (Footer) | ์šฉ๋„ |
2111
+ | --- | --- |
2112
+ | `button` | ํ•˜๋‹จ ์•ก์…˜ ์˜์—ญ ์šฐ์ธก ์ฃผ ์•ก์…˜ (ยง3-7-8) |
2113
+ | `footerLeft` | ํ•˜๋‹จ ์•ก์…˜ ์˜์—ญ ์ขŒ์ธก ์Šฌ๋กฏ โ€” ๋ณด์กฐ ๋ฒ„ํŠผ. `SButton` ์— `size="md"` ๋ฅผ ๋ช…์‹œํ•œ๋‹ค |
2114
+
2115
+ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ฃผ๋ฉด ํ•˜๋‹จ ์•ก์…˜ ์˜์—ญ์ด ๋ Œ๋”๋œ๋‹ค. ํšŒ์ƒ‰ ๋ฐ”ํƒ• + ์ƒ๋‹จ ๊ตฌ๋ถ„์„ ์ด๋ฉฐ ์ขŒ์šฐ ๋์€ ํ—ค๋”์— ๋งž๋Š”๋‹ค โ€” ๋ฐฐ๊ฒฝยท์—ฌ๋ฐฑ์„ ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
2116
+
2117
+ **ํ•œ ํŽ˜์ด์ง€์— ์„น์…˜ ์นด๋“œ๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด `marker` ๋ฅผ ์ผ ๋‹ค.** ์ ์€ ์„น์…˜์„ ์„œ๋กœ ๊ตฌ๋ถ„ํ•  ๋Œ€์ƒ์ด ์—ฌ๋Ÿฟ์ผ ๋•Œ๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ์–ด, ์นด๋“œ๊ฐ€ ํ•˜๋‚˜๋ฟ์ธ ํŽ˜์ด์ง€์—์„œ๋Š” ์ผœ์ง€ ์•Š๋Š”๋‹ค. ํ•œ ํŽ˜์ด์ง€ ์•ˆ์—์„œ๋Š” ์ผœ๊ฑฐ๋‚˜ ๋„๊ฑฐ๋‚˜ ์ „๋ถ€ ๊ฐ™๊ฒŒ ๊ฐ„๋‹ค.
2118
+
2119
+ **์„น์…˜ ๋ณธ๋ฌธ์ด ์ž๊ธฐ ์•ˆ์—์„œ ์Šคํฌ๋กคํ•ด์•ผ ํ•˜๋ฉด ๋ฃจํŠธ `className` ์œผ๋กœ ๋งˆ์ง€๋ง‰ ์ž์‹์— ์„ธ๋กœ ์ถ•์„ ์ž‡๋Š”๋‹ค.**
2120
+
2121
+ ```tsx
2122
+ <SSectionHeaderCard
2123
+ title="โ€ฆ"
2124
+ className="[&>div:last-child]:min-h-0 [&>div:last-child]:flex-1"
2125
+ >
2126
+ <STable className="min-h-0 flex-1" โ€ฆ />
2127
+ </SSectionHeaderCard>
2128
+ ```
2129
+
2130
+ ๋ณธ๋ฌธ ๋ž˜ํผ๋Š” `className` ์„ ๋ฐ›์ง€ ์•Š์œผ๋ฏ€๋กœ(์—ฌ๋ฐฑ์€ `padding` prop ์œผ๋กœ๋งŒ ๋ฐ›๋Š”๋‹ค) ๋ฃจํŠธ์—์„œ ๋‚ด๋ ค ์ค€๋‹ค. **ํ•˜๋‹จ ์•ก์…˜ ์˜์—ญ์ด ์žˆ์œผ๋ฉด ๋ณธ๋ฌธ์ด ๋” ์ด์ƒ ๋งˆ์ง€๋ง‰ ์ž์‹์ด ์•„๋‹ˆ๋‹ค** โ€” ๊ทธ๋•Œ๋Š” `[&>div:nth-last-child(2)]` ๋กœ ๊ฒจ๋ˆˆ๋‹ค. ํ”ํ•œ ๊ตฌ์„ฑ์€ ์•„๋‹ˆ๋‹ค โ€” ๋Œ€๋ถ€๋ถ„์€ `STable` ์ด ์ž๊ธฐ ์•ˆ์—์„œ ์Šคํฌ๋กคํ•˜๋ฏ€๋กœ ์—ฌ๊ธฐ๊นŒ์ง€ ๊ฐˆ ์ผ์ด ์—†๋‹ค.
1570
2131
 
1571
2132
  ---
1572
2133
 
@@ -1583,7 +2144,10 @@ export default function ProductDetailPage() {
1583
2144
  - [ ] `SPage`ยท`SPopup` ์˜ ๊ธฐ๋ณธ ํŒจ๋”ฉ์„ `p-sd-*` ๋กœ ๋ฎ์–ด์“ฐ์ง€ ์•Š์•˜๋Š”๊ฐ€, ๋ธ”๋กยท์„น์…˜ **๊ฐ„๊ฒฉ**์ด `gap-sd-12` ์ธ๊ฐ€ (`gap-sd-16`/`gap-sd-24` โŒ โ€” 24 ๋Š” ์•ˆ์ชฝ ์—ฌ๋ฐฑ์—๋งŒ ์—ด๋ฆฐ๋‹ค)
1584
2145
  - [ ] ์„น์…˜ยทํŒจ๋„์˜ ์•ˆ์ชฝ **์—ฌ๋ฐฑ**์ด ยง2-2 ํŒ์ •๊ณผ ๋งž๋Š”๊ฐ€ (๋ฉ์–ด๋ฆฌ ๋‘ ์ข…๋ฅ˜ โ†’ 16 / ์„ธ ์ข…๋ฅ˜ ์ด์ƒ โ†’ 24, ์„œ๋ฉด 16)
1585
2146
  - [ ] `SSectionHeaderCard` ์˜ ์—ฌ๋ฐฑ์„ `p-sd-*` ๊ฐ€ ์•„๋‹ˆ๋ผ `padding` prop ์œผ๋กœ ์คฌ๋Š”๊ฐ€
1586
- - [ ] ์ž์ฒด ์Šคํฌ๋กคํ•˜๋Š” ํŒจ๋„์˜ ํ•˜๋‹จ์— `pb-[var(--cmp-pageBody-padding-scrollEnd)]` ์ด ์žˆ๋Š”๊ฐ€, ํŽ˜์ด์ง€๋„ค์ด์…˜ ์žˆ๋Š” ๋ชฉ๋ก์—์„œ `contentHeight="fill"` ์„ ๋„˜๊ธฐ๊ณ  `h-full min-h-0` โ†’ `STable` ์˜ `min-h-0 flex-1` ์‚ฌ์Šฌ์„ ์ด์—ˆ๋Š”๊ฐ€
2147
+ - [ ] ํŽ˜์ด์ง€์— `contentHeight="fill"` ์„ ๋„˜๊ฒผ๋Š”๊ฐ€ (ยง2-2 ํ‘œ์ค€ โ€” ํŽ˜์ด์ง€ ์Šคํฌ๋กค์„ ์“ฐ๋Š” ํ™”๋ฉด์—์„œ๋งŒ `auto` + `scrollEndSpacing`)
2148
+ - [ ] `fill` ์„ ์“ด ๋ธ”๋ก์—์„œ **์ž์‹๊นŒ์ง€ `min-h-0 flex-1` ์ด ๋Š๊ธฐ์ง€ ์•Š์•˜๋Š”๊ฐ€** (ํ•œ ๊ตฐ๋ฐ๋งŒ ๋Š๊ฒจ๋„ ์ž์‹์ด ๋†’์ด๋ฅผ ๋ชป ์žก๋Š”๋ฐ ์‹คํŒจ๊ฐ€ ์กฐ์šฉํ•˜๋‹ค)
2149
+ - [ ] ์ž์ฒด ์Šคํฌ๋กคํ•˜๋Š” ํŒจ๋„์˜ ํ•˜๋‹จ์— `pb-[var(--cmp-pageBody-padding-scrollEnd)]` ์ด ์žˆ๋Š”๊ฐ€
2150
+ - [ ] ํ•œ ํŽ˜์ด์ง€์— ์„น์…˜ ์นด๋“œ๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด `marker` ๋ฅผ ์ผฐ๋Š”๊ฐ€, ํ•˜๋‚˜๋ฟ์ด๋ฉด ๊ป๋Š”๊ฐ€ (ยง4-5)
1587
2151
  - [ ] ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‚˜์—ดํ•  ๋•Œ ยง2-2 ๊ทธ๋ฃน ๊ฐ„๊ฒฉ์„ ์ผ๋Š”๊ฐ€ (์ฒดํฌ๋ฐ•์Šค ๊ฐ€๋กœ `gap-sd-24` ๋“ฑ)
1588
2152
  - [ ] ํŽ˜์ด์ง€๊ฐ€ ยง4์˜ ํ‘œ์ค€ ๊ณจ๊ฒฉ์—์„œ ์‹œ์ž‘ํ–ˆ๋Š”๊ฐ€
1589
2153
  - [ ] `header.fix` ๊ฐ€ ํ”„๋กœ์ ํŠธ ์ „์ฒด์™€ ๊ฐ™์€ ๊ฐ’์ธ๊ฐ€ (๋‹ค๋ฅธ ํŽ˜์ด์ง€์™€ ๋‹ค๋ฅด๊ฒŒ ์„ž์–ด ์“ฐ์ง€ ์•Š์•˜๋Š”๊ฐ€, ยง4-1)
@@ -1592,11 +2156,20 @@ export default function ProductDetailPage() {
1592
2156
  - [ ] ํ•„ํ„ฐยทํผยท์ƒ์„ธ ์ •๋ณด๋ฅผ `SKeyValueTable` ๋กœ ๋งŒ๋“ค์—ˆ๋Š”๊ฐ€ (์ปจํŠธ๋กค์„ `div` ๋กœ ๋‚˜์—ดํ•˜์ง€ ์•Š์•˜๋Š”๊ฐ€). ํ•„ํ„ฐ๋ฅผ `SChipFilter` ๋กœ ํ–ˆ๋‹ค๋ฉด ยง3-7-11 ์˜ ํŒ์ •์„ ๊ฑฐ์ณค๋Š”๊ฐ€
1593
2157
  - [ ] ์„น์…˜ ๊ตฌ๋ถ„์— `SSectionHeaderCard` ๋ฅผ ์ผ๋Š”๊ฐ€ (์ง์ ‘ ๋งŒ๋“  ์นด๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ)
1594
2158
  - [ ] ๋ชฉ๋ก์˜ ์ฃผ์š” ์•ก์…˜์ด `STableBar` ์˜ `rightActions` ์— ์žˆ๋Š”๊ฐ€ (ํŽ˜์ด์ง€ ์ œ๋ชฉ ์ค„์ด ์•„๋‹ˆ๋ผ)
2159
+ - [ ] ๋ชฉ๋ก ํŽ˜์ด์ง€ ํ‘œ์— `dense` ๋กœ ๋ฐ€๋„ ํ† ๊ธ€์„ ๋„์› ๋Š”๊ฐ€, ๊ทธ ๊ฐ’์„ `onDenseChange` ๊ฒฐ๊ณผ๋กœ ๋˜๋Œ๋ ค ๋„ฃ์ง€๋Š” ์•Š์•˜๋Š”๊ฐ€ (ยง4-2 โ€” ๋˜๋Œ๋ ค ๋„ฃ์œผ๋ฉด ๋„“๊ฒŒ ๋ณธ ์ˆœ๊ฐ„ ํ† ๊ธ€์ด ์‚ฌ๋ผ์ง„๋‹ค)
1595
2160
  - [ ] ์ƒํƒœ ํ‘œ์‹œ์— `STag size="sm"` ์„ ์ผ๋Š”๊ฐ€
1596
2161
  - [ ] ํ…Œ์ด๋ธ”์—์„œ ์–‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ปฌ๋Ÿผ(๊ธˆ์•กยท์ˆ˜๋Ÿ‰ยท๊ฐœ์ˆ˜ ๋“ฑ)์ด ์ „๋ถ€ `align: 'right'` ์ธ๊ฐ€
1597
2162
  - [ ] ๋ฒˆํ˜ธยท์ฝ”๋“œยท์ „ํ™”๋ฒˆํ˜ธยท์ผ์ž ์ปฌ๋Ÿผ์— `align: 'center'` ๋ฅผ **๋ช…์‹œ**ํ–ˆ๋Š”๊ฐ€ (์ƒ๋žตํ•˜๋ฉด ์ขŒ์ธก์ด ๋œ๋‹ค)
1598
- - [ ] ์ปจํŠธ๋กค(`STag`ยท`SButton`ยท`SSelect`ยท`SInput` โ€ฆ)์ด ๋“ค์–ด๊ฐ€๋Š” ์ปฌ๋Ÿผ์— `width` ๋ฅผ ๋ช…์‹œํ–ˆ๋Š”๊ฐ€, `resizable` ์ด๋ฉด `minWidth` ๋„ ์คฌ๋Š”๊ฐ€ (ยง3-4 โ€” ํญ์ด ๋ชจ์ž๋ผ๋ฉด ์š”์†Œ๊ฐ€ ์ž˜๋ ค ๋ชป ์“ด๋‹ค)
2163
+ - [ ] ๋‹ซํžŒ ๊ฐ’ ์ง‘ํ•ฉ(enumยท๋งˆ์Šคํ„ฐ ๋ชฉ๋ก์—์„œ ๊ณ ๋ฅด๋Š” ๊ฐ’) ์ปฌ๋Ÿผ์— `align: 'center'` ๋ฅผ ์คฌ๋Š”๊ฐ€ โ€” ํƒœ๊ทธ๋กœ ๊ทธ๋ ธ๋“  ๋งจ ํ…์ŠคํŠธ๋กœ ๊ทธ๋ ธ๋“  ๊ฐ™๋‹ค (ยง3-4)
2164
+ - [ ] **๋ชจ๋“  ์ปฌ๋Ÿผ์— ํญ์„ ๋ช…์‹œ**ํ–ˆ๋Š”๊ฐ€, px ๋กœ๋งŒ ์คฌ๋Š”๊ฐ€ (`%`ยท`clamp()` โŒ), `autoWidth` ๋Š” ์ŠคํŽ˜์ด์„œ ์—ด ํ•˜๋‚˜๋ฟ์ธ๊ฐ€ (ยง3-4)
2165
+ - [ ] ์ปจํŠธ๋กค(`STag`ยท`SButton`ยท`SSelect`ยท`SInput` โ€ฆ)์ด ๋“ค์–ด๊ฐ€๋Š” ์ปฌ๋Ÿผ์ด `resizable` ์ด๋ฉด `minWidth` ๋„ ์คฌ๋Š”๊ฐ€ (ยง3-4 โ€” ํญ์ด ๋ชจ์ž๋ผ๋ฉด ์š”์†Œ๊ฐ€ ์ž˜๋ ค ๋ชป ์“ด๋‹ค)
2166
+ - [ ] ์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ์—ด์— `sortable` ์„ ์คฌ๋Š”๊ฐ€ (`renderHeader` ๋กœ ์ง์ ‘ ๋งŒ๋“ค์ง€ ์•Š์•˜๋Š”๊ฐ€), ์ •๋ ฌ ์ƒํƒœ๋ฅผ ํŽ˜์ด์ง€๊ฐ€ ๋“ค๊ณ  ์žˆ๋Š”๊ฐ€ (ยง3-4)
2167
+ - [ ] `editable` ยท `navigable` ํ‘œ์‹์„ ์ผ  ์—ด์ด **์…€์—์„œ๋„ ์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€** (์ž…๋ ฅ ์ปจํŠธ๋กค ยท ๋งํฌ๊ฐ€ ์žˆ๋Š”๊ฐ€), ํ‘œ์‹์„ ๋ถ™์ธ ์—ด์˜ ํญ์„ ํ•จ๊ป˜ ๋„“ํ˜”๋Š”๊ฐ€ (ยง3-4)
1599
2168
  - [ ] ๊ธˆ์•กยท์ˆ˜๋Ÿ‰ ๋“ฑ ์–‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž์— ๋น ์ง์—†์ด `toLocaleString()` ์„ ์ผ๋Š”๊ฐ€ (๋ฒˆํ˜ธยท์ฝ”๋“œ๋Š” ์ œ์™ธ)
2169
+ - [ ] ๋‚ ์งœ๋ฅผ `YYYY-MM-DD` ๋กœ ํ‘œ๊ธฐํ–ˆ๋Š”๊ฐ€ (`toLocaleDateString()` โŒ, ยง1-4)
2170
+ - [ ] ํ•„๋“œ ํญ์„ ๋“ฑ๊ธ‰(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`)์œผ๋กœ ์คฌ๋Š”๊ฐ€ โ€” px ์ง์ ‘ ์ง€์ • โŒ (ยง4-3)
2171
+ - [ ] ์กฐํšŒ ์กฐ๊ฑด์œผ๋กœ ์“ฐ๋Š” ์…€๋ ‰ํŠธยท๋‚ ์งœยท์‹œ๊ฐ„ ํ”ผ์ปค์— `clearable` ์„ ์คฌ๋Š”๊ฐ€, ๊ทธ ์ƒํƒœ๊ฐ€ `null` ์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š”๊ฐ€ (ยง3-7-4 โ€” ํ•„์ˆ˜ ์ž…๋ ฅ ํ•„๋“œ์—๋Š” ์ผœ์ง€ ์•Š๋Š”๋‹ค)
2172
+ - [ ] `SKeyValueTable` ์˜ ์งง์€ ํ–‰์— `tdColSpan` ์„ ์ฃผ์–ด ์ „์ฒด ์—ด ์ˆ˜๋ฅผ ์ฑ„์› ๋Š”๊ฐ€ (ยง4-3 โ€” ์•ˆ ์ฑ„์šฐ๋ฉด ๊ทธ ๊ตฌ๊ฐ„์˜ ํ–‰ ๊ตฌ๋ถ„์„ ์ด ๋Š๊ธด๋‹ค)
1600
2173
  - [ ] ํ•˜๋‹จ ๋ฒ„ํŠผ์ด ์–‘๋ ๋ถ„๋ฆฌ(`justify-between`)์ด๊ณ , ๋˜๋Œ๋ฆฌ๊ธฐ๊ฐ€ ์™ผ์ชฝ ๋ ยท ์‹คํ–‰์ด ์˜ค๋ฅธ์ชฝ ๋์ธ๊ฐ€
1601
2174
  - [ ] ํŽ˜์ด์ง€์— `color="primary"` ์ฑ„์›€ ๋ฒ„ํŠผ์ด **1๊ฐœ๋ฟ**์ธ๊ฐ€ (`danger` ์ฑ„์›€๋„ 1๊ฐœ, `SDropdownButton` ํฌํ•จ)
1602
2175
  - [ ] ๋ฒ„ํŠผ `size` ๊ฐ€ ์œ„์น˜ ๊ทœ์น™๊ณผ ๋งž๋Š”๊ฐ€ (ํ–‰ ๋‚ด๋ถ€ `xs` / ํ™”๋ฉด ์•ก์…˜ `sm` / ๋ชจ๋‹ฌ ํ‘ธํ„ฐ `md`)
@@ -1605,7 +2178,7 @@ export default function ProductDetailPage() {
1605
2178
  - [ ] `SGhostButton` ์˜ `intent` ๊ฐ€ ์กฐ์ž‘ ์„ฑ๊ฒฉ๊ณผ ๋งž๋Š”๊ฐ€ (๋˜๋Œ๋ฆด ์ˆ˜ ์—†๋Š” ์‚ญ์ œ๋งŒ `danger`, ์ง„์ž…ยท์ถ”๊ฐ€๋Š” `action`, ๋‚˜๋จธ์ง€๋Š” `default`)
1606
2179
  - [ ] ์ฐฝ์„ ๋„์šธ ๋•Œ ยง3-3-1 ํŒ๋ณ„ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ž๋Š”๊ฐ€ (๊ทธ ์ž์ฒด๊ฐ€ ํ™”๋ฉด โ†’ `SPopup` / ์‹คํ–‰ ์—ฌ๋ถ€๋งŒ ํ™•์ • โ†’ `SModal.confirm` / ๋ชจ๋‹ฌ ์•ˆ์—์„œ ์ž‘์„ฑ โ†’ `SActionModal`)
1607
2180
  - [ ] ์ž‘์—…์šฉ ๋ชจ๋‹ฌ์„ `SActionModal` + `SModal.create` ๋กœ ๋งŒ๋“ค์—ˆ๋Š”๊ฐ€ (์ง์ ‘ ์˜ค๋ฒ„๋ ˆ์ด โŒ)
1608
- - [ ] ๋ชจ๋‹ฌยท๋“œ๋กœ์–ด์˜ ํ•˜๋‹จ ๋ฒ„ํŠผ์„ ๋ณธ๋ฌธ์ด ์•„๋‹ˆ๋ผ `button` ยท `footerLeft` prop ์œผ๋กœ ๋„˜๊ฒผ๋Š”๊ฐ€ (ยง3-3-4)
2181
+ - [ ] ๋ชจ๋‹ฌยท๋“œ๋กœ์–ด์˜ ํ•˜๋‹จ ๋ฒ„ํŠผ์„ ๋ณธ๋ฌธ์ด ์•„๋‹ˆ๋ผ `button` ยท `footerLeft` prop ์œผ๋กœ ๋„˜๊ฒผ๋Š”๊ฐ€ (ยง3-3-4), ์นด๋“œ ์•ˆ์—์„œ ๋‹ซํžˆ๋Š” ์•ก์…˜๋„ ๊ฐ™์€ prop ์œผ๋กœ ๋„˜๊ฒผ๋Š”๊ฐ€ (ยง3-7-8)
1609
2182
  - [ ] ์•ฑ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ์˜ Provider ์•ˆ์ชฝ์— `<SModalOutlet />` ์ด ํ•œ ๋ฒˆ ๋ Œ๋”๋˜์–ด ์žˆ๋Š”๊ฐ€ (ยง4-1 โ€” ์—†์œผ๋ฉด ๋ชจ๋‹ฌ ์•ˆ์—์„œ ์•ฑ ํ›…์ด ์ฃฝ๋Š”๋‹ค), ๊ทธ ๋Œ€์‹ ์œผ๋กœ ๋ชจ๋‹ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ Provider ๋กœ ๋‹ค์‹œ ๊ฐ์‹ธ์ง€ ์•Š์•˜๋Š”๊ฐ€
1610
2183
  - [ ] ๊ณ ๋ฅธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ยง2-0 ์˜ ์ œ ์ธต์— ๋†“์•˜๋Š”๊ฐ€ (์š”์†Œ๋ฅผ `SPage` ์— ์ง์ ‘ ๋†“์ง€ ์•Š์•˜๋Š”๊ฐ€, ๋ธ”๋ก์„ `div` ๋กœ ๊ฐ์‹ธ์ง€ ์•Š์•˜๋Š”๊ฐ€)
1611
2184
  - [ ] ยง2-0 ํฌํ•จ ๊ทœ์น™์„ ์ง€์ผฐ๋Š”๊ฐ€ (์นด๋“œ ์•ˆ ์นด๋“œ โŒ, ํ‘œ ์…€ ์•ˆ ๋ธ”๋ก โŒ)
@@ -1633,6 +2206,8 @@ export default function ProductDetailPage() {
1633
2206
  | `sellmate/component-group-gap` | warn | ยง2-2 ์ปดํฌ๋„ŒํŠธ ๊ทธ๋ฃน ๊ฐ„๊ฒฉ (์ฒดํฌ๋ฐ•์Šค ๊ฐ€๋กœ 24 / ์„ธ๋กœ 8 ๋“ฑ) |
1634
2207
  | `sellmate/table-numeric-align` | warn | ยง3-4 ์ˆซ์ž ์ปฌ๋Ÿผ์˜ `align: 'right'` ๋ˆ„๋ฝ (`--fix` ์ง€์›) |
1635
2208
  | `sellmate/require-locale-number` | warn | ยง1-4 ๊ธˆ์•กยท์ˆ˜๋Ÿ‰ ๋“ฑ ์ˆ˜๋Ÿ‰ ์ปฌ๋Ÿผ์˜ `toLocaleString()` ๋ˆ„๋ฝ |
2209
+ | `sellmate/field-width-grade` | warn | ยง4-3 ํ•„๋“œ ํญ์ด `maxLength` ์ƒํ•œ๊ณผ ๋งž๋Š” ๋“ฑ๊ธ‰์ธ๊ฐ€, px ๋ฅผ ์ง์ ‘ ์ ์ง€ ์•Š์•˜๋Š”๊ฐ€ (px โ†’ ๋“ฑ๊ธ‰ `--fix` ์ง€์›) |
2210
+ | `sellmate/table-column-width` | warn | ยง3-4 ์ปฌ๋Ÿผ ํญ ๋ฏธ์ง€์ •(๊ธฐ๋ณธ 120px)ยทpx ์•„๋‹Œ ๊ฐ’(`%`ยท`clamp()`)ยท`autoWidth` ์˜ค์šฉ |
1636
2211
  | `sellmate/no-arbitrary-class` | off | ยง1-2 ํ† ํฐ ์žˆ๋Š” ์†์„ฑ์˜ ์ž„์˜ ๊ฐ’ (`text-[14px]`, `bg-[#eee]`) โ€” ํŒ€์ด ์ผค ๋•Œ๋งŒ |
1637
2212
 
1638
2213
  `configs.strict` ๋ฅผ ์“ฐ๋Š” ํ”„๋กœ์ ํŠธ๋Š” ์ „๋ถ€ error ์ด๊ณ  ๊ฐ„๊ฒฉ `sd-` ์ ‘๋‘๊นŒ์ง€ ๊ฐ•์ œ๋œ๋‹ค.