sellmate-design-system-react 9.0.0-beta.3 โ†’ 9.0.0-beta.30

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 (164) hide show
  1. package/AGENTS.md +599 -94
  2. package/README.md +111 -9
  3. package/dist/components/SBadge/README.md +24 -0
  4. package/dist/components/SBadge/SBadge.d.ts +1 -1
  5. package/dist/components/SBarcodeInput/README.md +9 -1
  6. package/dist/components/SBarcodeInput/SBarcodeInput.d.ts +7 -1
  7. package/dist/components/SButton/README.md +36 -0
  8. package/dist/components/SCalendar/README.md +13 -0
  9. package/dist/components/SCallout/README.md +15 -0
  10. package/dist/components/SCard/README.md +16 -0
  11. package/dist/components/SCard/SCard.d.ts +17 -2
  12. package/dist/components/SCheckbox/README.md +8 -0
  13. package/dist/components/SChipFilter/README.md +326 -13
  14. package/dist/components/SChipFilter/SChipFilter.d.ts +137 -58
  15. package/dist/components/SChipFilter/index.d.ts +1 -1
  16. package/dist/components/SChipInput/README.md +15 -1
  17. package/dist/components/SChipInput/SChipInput.d.ts +7 -1
  18. package/dist/components/SChipInput/index.d.ts +1 -1
  19. package/dist/components/SCircleProgress/README.md +8 -0
  20. package/dist/components/SConfirmModal/README.md +17 -1
  21. package/dist/components/SConfirmModal/SConfirmModal.d.ts +2 -2
  22. package/dist/components/SConfirmModal/index.d.ts +1 -1
  23. package/dist/components/SDatePicker/README.md +57 -2
  24. package/dist/components/SDatePicker/SDatePicker.d.ts +57 -4
  25. package/dist/components/SDatePicker/index.d.ts +1 -1
  26. package/dist/components/SDateRangePicker/README.md +17 -2
  27. package/dist/components/SDateRangePicker/SDateRangePicker.d.ts +16 -3
  28. package/dist/components/SDivider/README.md +5 -0
  29. package/dist/components/SDivider/SDivider.d.ts +11 -0
  30. package/dist/components/SDraggableItem/README.md +37 -0
  31. package/dist/components/SDraggableItem/SDraggableItem.d.ts +2 -0
  32. package/dist/components/SDraggableItem/index.d.ts +1 -1
  33. package/dist/components/SDraggableList/README.md +30 -0
  34. package/dist/components/SDraggableList/SDraggableList.d.ts +11 -0
  35. package/dist/components/SDraggableList/index.d.ts +1 -1
  36. package/dist/components/SDrawer/README.md +8 -0
  37. package/dist/components/SDropdownButton/README.md +19 -0
  38. package/dist/components/SEditor/EditorBody.d.ts +36 -0
  39. package/dist/components/SEditor/EditorToolbar.d.ts +93 -0
  40. package/dist/components/SEditor/README.md +203 -0
  41. package/dist/components/SEditor/SEditor.d.ts +114 -0
  42. package/dist/components/SEditor/editor-icons.d.ts +63 -0
  43. package/dist/components/SEditor/editor.config.d.ts +119 -0
  44. package/dist/components/SEditor/index.d.ts +8 -0
  45. package/dist/components/SEditor/tiptap-api.d.ts +29 -0
  46. package/dist/components/SEditor/use-is-mobile.d.ts +14 -0
  47. package/dist/components/SExpansionItem/README.md +36 -0
  48. package/dist/components/SExpansionItem/index.d.ts +1 -1
  49. package/dist/components/SField/README.md +27 -2
  50. package/dist/components/SField/SField.d.ts +22 -4
  51. package/dist/components/SFilePicker/README.md +15 -1
  52. package/dist/components/SFilePicker/SFilePicker.d.ts +7 -1
  53. package/dist/components/SFooter/README.md +25 -0
  54. package/dist/components/SFooter/SFooter.d.ts +4 -3
  55. package/dist/components/SForm/README.md +11 -0
  56. package/dist/components/SGhostButton/README.md +20 -4
  57. package/dist/components/SGnb/README.md +51 -0
  58. package/dist/components/SGnb/SGnb.d.ts +22 -0
  59. package/dist/components/SGnb/gnb.config.d.ts +7 -0
  60. package/dist/components/SGnb/index.d.ts +1 -1
  61. package/dist/components/SGnbSystem/README.md +121 -0
  62. package/dist/components/SGnbSystem/SGnbSystem.d.ts +93 -0
  63. package/dist/components/SGnbSystem/gnbSystem.config.d.ts +89 -0
  64. package/dist/components/SGnbSystem/index.d.ts +2 -0
  65. package/dist/components/SGuide/README.md +15 -0
  66. package/dist/components/SIcon/README.md +8 -0
  67. package/dist/components/SIcon/SIcon.d.ts +1 -1
  68. package/dist/components/SIcon/icons.gen.d.ts +2 -0
  69. package/dist/components/SImage/README.md +14 -0
  70. package/dist/components/SInput/README.md +3 -1
  71. package/dist/components/SInput/SInput.d.ts +7 -1
  72. package/dist/components/SKeyValueTable/README.md +87 -0
  73. package/dist/components/SKeyValueTable/SKeyValueTable.d.ts +14 -3
  74. package/dist/components/SKeyValueTable/index.d.ts +1 -1
  75. package/dist/components/SLayout/README.md +16 -0
  76. package/dist/components/SLayout/index.d.ts +1 -1
  77. package/dist/components/SLinearProgress/README.md +15 -0
  78. package/dist/components/SLinearProgress/SLinearProgress.d.ts +3 -0
  79. package/dist/components/SLinearProgress/index.d.ts +1 -1
  80. package/dist/components/SList/README.md +5 -1
  81. package/dist/components/SList/SList.d.ts +0 -2
  82. package/dist/components/SListItem/README.md +41 -0
  83. package/dist/components/SListItem/index.d.ts +1 -1
  84. package/dist/components/SLoadingModal/README.md +9 -1
  85. package/dist/components/SLoadingModal/SLoadingModal.d.ts +2 -2
  86. package/dist/components/SLoadingModal/index.d.ts +1 -1
  87. package/dist/components/SNumberInput/README.md +9 -1
  88. package/dist/components/SNumberInput/SNumberInput.d.ts +7 -1
  89. package/dist/components/SPage/README.md +41 -1
  90. package/dist/components/SPage/SPage.d.ts +24 -2
  91. package/dist/components/SPage/index.d.ts +1 -1
  92. package/dist/components/SPage/page.config.d.ts +8 -0
  93. package/dist/components/SPopover/README.md +15 -0
  94. package/dist/components/SPopup/README.md +19 -0
  95. package/dist/components/SPortal/README.md +14 -0
  96. package/dist/components/SRadio/README.md +20 -0
  97. package/dist/components/SRadioButton/README.md +18 -0
  98. package/dist/components/SRadioButton/SRadioButton.d.ts +1 -1
  99. package/dist/components/SRadioCard/README.md +78 -0
  100. package/dist/components/SRadioCard/SRadioCard.d.ts +29 -0
  101. package/dist/components/SRadioCard/SRadioCardGroup.d.ts +36 -0
  102. package/dist/components/SRadioCard/index.d.ts +2 -0
  103. package/dist/components/SScrollArea/README.md +14 -0
  104. package/dist/components/SSearchInput/README.md +63 -0
  105. package/dist/components/SSearchInput/SSearchInput.d.ts +52 -0
  106. package/dist/components/SSearchInput/index.d.ts +1 -0
  107. package/dist/components/SSectionHeaderCard/README.md +44 -20
  108. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.d.ts +31 -14
  109. package/dist/components/SSectionHeaderCard/index.d.ts +1 -1
  110. package/dist/components/SSelect/README.md +24 -4
  111. package/dist/components/SSelect/SSelect.d.ts +14 -2
  112. package/dist/components/SSplitter/README.md +15 -0
  113. package/dist/components/SStepper/README.md +26 -0
  114. package/dist/components/SSwitch/README.md +13 -0
  115. package/dist/components/SSystemActionButton/README.md +134 -0
  116. package/dist/components/SSystemActionButton/SSystemActionButton.d.ts +79 -0
  117. package/dist/components/SSystemActionButton/index.d.ts +2 -0
  118. package/dist/components/SSystemActionButton/systemActionButton.config.d.ts +87 -0
  119. package/dist/components/STable/README.md +87 -1
  120. package/dist/components/STable/STable.d.ts +141 -11
  121. package/dist/components/STable/index.d.ts +1 -1
  122. package/dist/components/STabs/README.md +12 -1
  123. package/dist/components/STabs/STabs.d.ts +2 -4
  124. package/dist/components/STabs/index.d.ts +1 -1
  125. package/dist/components/STabs/tabs.config.d.ts +3 -4
  126. package/dist/components/STag/README.md +52 -0
  127. package/dist/components/STag/STag.d.ts +3 -1
  128. package/dist/components/STextLink/README.md +17 -0
  129. package/dist/components/STextLink/STextLink.d.ts +2 -0
  130. package/dist/components/STextarea/README.md +1 -1
  131. package/dist/components/STextarea/STextarea.d.ts +7 -1
  132. package/dist/components/STimePicker/README.md +15 -1
  133. package/dist/components/STimePicker/STimePicker.d.ts +7 -1
  134. package/dist/components/STimePicker/timepicker.config.d.ts +7 -0
  135. package/dist/components/STimeRangePicker/README.md +27 -1
  136. package/dist/components/STimeRangePicker/STimeRangePicker.d.ts +7 -1
  137. package/dist/components/SToast/README.md +24 -0
  138. package/dist/components/SToggle/README.md +8 -0
  139. package/dist/components/SToggle/index.d.ts +1 -1
  140. package/dist/components/STooltip/README.md +22 -0
  141. package/dist/components/STree/README.md +41 -0
  142. package/dist/components/STree/STree.d.ts +8 -0
  143. package/dist/components/STree/index.d.ts +1 -1
  144. package/dist/index.cjs +5483 -1150
  145. package/dist/index.cjs.map +1 -1
  146. package/dist/index.d.ts +6 -0
  147. package/dist/index.js +5458 -1149
  148. package/dist/index.js.map +1 -1
  149. package/dist/lib/field-width.d.ts +31 -0
  150. package/dist/lib/floating-height.d.ts +15 -0
  151. package/dist/lib/story-docs.d.ts +19 -3
  152. package/dist/lib/truncated-value-tooltip.d.ts +18 -0
  153. package/dist/llms-full.txt +2813 -193
  154. package/dist/llms.txt +604 -96
  155. package/dist/styles.css +1249 -135
  156. package/dist/theme.css +142 -16
  157. package/eslint/index.mjs +14 -0
  158. package/eslint/lib/table-column.mjs +26 -0
  159. package/eslint/rules/divider-vertical-height.mjs +137 -0
  160. package/eslint/rules/field-width-grade.d.mts +41 -0
  161. package/eslint/rules/field-width-grade.mjs +311 -0
  162. package/eslint/rules/table-column-width.mjs +110 -0
  163. package/eslint/scale.gen.mjs +5 -2
  164. package/package.json +11 -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
- | **๋ฒ„ํŠผยท๋งํฌ** | `SButton` `SGhostButton` `SDropdownButton` `STextLink` `SSwitch` `SToggle` |
30
- | **์ž…๋ ฅ (ํผ)** | `SForm` `SField` `SInput` `SNumberInput` `STextarea` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SChip` `SChipInput` `SBarcodeInput` `SFilePicker` |
31
- | **๋‚ ์งœยท์‹œ๊ฐ„** | `SCalendar` `SDatePicker` `SDateRangePicker` `STimePicker` `STimeRangePicker` |
29
+ | **๋ฒ„ํŠผยท๋งํฌ** | `SButton` `SGhostButton` `SDropdownButton` `SSystemActionButton` `STextLink` `SSwitch` `SToggle` |
30
+ | **์ž…๋ ฅ (ํผ)** | `SForm` `SField` `SInput` `SSearchInput` `SNumberInput` `STextarea` `SEditor` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SRadioCard` `SRadioCardGroup` `SChip` `SChipInput` `SBarcodeInput` `SFilePicker` |
31
+ | **๋‚ ์งœยท์‹œ๊ฐ„** | `SCalendar` `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` `SPage`(์ œ๋ชฉ ์˜์—ญ์€ `header` prop) `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,19 +60,21 @@ 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` |
72
74
  | `alert()`, `confirm()` | `SToast`, `SModal.confirm(...)` |
73
75
  | ์ง์ ‘ ๋งŒ๋“  ํƒญ/ํŽ˜์ด์ง€๋„ค์ด์…˜/์Šคํ…ํผ | `STabs`, `SPagination`, `SStepper` |
74
76
  | `<ul>`/`<li>` ๋กœ ๋งŒ๋“  ๋ชฉ๋ก UI | `SList` + `SListItem` (๋“œ๋ž˜๊ทธ ์ •๋ ฌ์€ `SDraggableItem`) |
75
- | ์ง์ ‘ ๋งŒ๋“  ์„น์…˜ ์นด๋“œ(์ œ๋ชฉ ๋ฐ” + ๋ณธ๋ฌธ ๋ฐ•์Šค) | `SSectionHeaderCard` + `.Header` / `.Body` |
77
+ | ์ง์ ‘ ๋งŒ๋“  ์„น์…˜ ์นด๋“œ(์ œ๋ชฉ ๋ฐ” + ๋ณธ๋ฌธ ๋ฐ•์Šค) | `SSectionHeaderCard` ์˜ `title` / `padding` props |
76
78
  | `<svg>` ์ง์ ‘ ์‚ฝ์ž…, ์ด๋ชจ์ง€ ์•„์ด์ฝ˜ | `SIcon` |
77
79
  | `<hr>` | `SDivider` |
78
80
  | `<details>` / `<summary>` | `SExpansionItem` |
@@ -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,9 +150,9 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
136
150
 
137
151
  | ์ธต | ๋ฌด์—‡์ธ๊ฐ€ | ์ปดํฌ๋„ŒํŠธ |
138
152
  | --- | --- | --- |
139
- | **์…ธ** | ์•ฑ ์ „์ฒด ๋ผˆ๋Œ€. ํŽ˜์ด์ง€๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ๋‚จ๋Š”๋‹ค | `SLayout` `SGnb` `SPage`(์ œ๋ชฉ ์˜์—ญ์€ `header` prop) |
153
+ | **์…ธ** | ์•ฑ ์ „์ฒด ๋ผˆ๋Œ€. ํŽ˜์ด์ง€๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ๋‚จ๋Š”๋‹ค | `SLayout` `SGnb` `SGnbSystem`(GNB ๋งจ ์•„๋ž˜ ํŒจ๋„) `SPage`(์ œ๋ชฉ ์˜์—ญ์€ `header` prop) |
140
154
  | **๋ธ”๋ก** | `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` `SDateRangePicker` `STimePicker` `STimeRangePicker` `SCalendar` `SListItem` `SExpansionItem` `SDraggableItem` `SImage` `SLinearProgress` `SCircleProgress` |
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
157
  | **๋ ˆ์ด์–ด** | ๋ฌธ์„œ ํ๋ฆ„ **๋ฐ–**์— ๋– ์„œ ๊ทธ๋ ค์ง„๋‹ค. ์–ด๋А ์ธต์—์„œ ๋„์šฐ๋“  ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์ด ์—†๋‹ค | `SModal` `SActionModal` `SConfirmModal` `SPopup` `SDrawer` `SPopover` `STooltip` `SPortal` `SToast` `SLoadingModal` `SLoadingContainer` `SGuide` |
144
158
 
@@ -158,7 +172,7 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
158
172
  | ๋‹ด๋Š” ๊ฒƒ | ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ | ์˜ค๋ฉด ์•ˆ ๋˜๋Š” ๊ฒƒ |
159
173
  | --- | --- | --- |
160
174
  | `SPage` | **๋ธ”๋ก๋งŒ** | **์š”์†Œ๋ฅผ ์ง์ ‘** โ€” ๋ฒ„ํŠผ ํ•˜๋‚˜๋„ ๋ธ”๋ก์— ๋‹ด์•„ ๋†“๋Š”๋‹ค |
161
- | `SSectionHeaderCard.Body` | ๊ทธ๋ฆฌ๋Š” ๋ธ”๋ก ยท ์š”์†Œ | `SSectionHeaderCard` ยท `SCard` (์นด๋“œ ๊ฒน์นจ, ยง3-7-8) |
175
+ | `SSectionHeaderCard` ์˜ `children` | ๊ทธ๋ฆฌ๋Š” ๋ธ”๋ก ยท ์š”์†Œ | `SSectionHeaderCard` ยท `SCard` (์นด๋“œ ๊ฒน์นจ, ยง3-7-8) |
162
176
  | `SCard` | ๊ทธ๋ฆฌ๋Š” ๋ธ”๋ก ยท ์š”์†Œ | `SCard` ยท `SSectionHeaderCard` |
163
177
  | `SForm` | ๋ธ”๋ก (๋ณดํ†ต `SKeyValueTable` + ํ•˜๋‹จ ์•ก์…˜) | โ€” |
164
178
  | `SSplitter.Before` / `.After` | ๋ธ”๋ก | โ€” |
@@ -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
+ - **ํŽ˜์ด์ง€ยท์„น์…˜ ์ œ๋ชฉ์˜ ํƒ€์ดํฌ๋ฅผ ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.** `SPage` ์˜ `header.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,13 +300,14 @@ 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
  #### ์„น์…˜ยทํŒจ๋„ ์•ˆ์ชฝ ์—ฌ๋ฐฑ
292
307
 
293
308
  **ํŽ˜์ด์ง€ ํ”„๋ ˆ์ž„์€ ์˜ˆ์™ธ ์—†์ด `SPage` ๊ฐ€ ๋„ฃ๋Š”๋‹ค.** ์•„๋ž˜ ๊ทœ์น™์€ ๊ทธ ์•ˆ์˜ **์„น์…˜ยทํŒจ๋„ ๋ ˆ๋ฒจ์—๋งŒ** ์ ์šฉ๋œ๋‹ค.
294
309
 
295
- **์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์ฒด ์—ฌ๋ฐฑ์„ ๊ฐ€์ง€๋ฉด ์ปดํฌ๋„ŒํŠธ ๊ธฐ์ค€์ด ์šฐ์„ ํ•œ๋‹ค.** `SKeyValueTable`ยท`STable` ์ฒ˜๋Ÿผ ์ž๊ธฐ ์—ฌ๋ฐฑ์„ ํ† ํฐ์œผ๋กœ ๊ฐ–๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์—๋Š” ์ด ํŒ์ •์„ ์ ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค โ€” ์†๋Œˆ ๊ฒƒ์ด ์—†๋‹ค. ์•„๋ž˜ ํŒ์ •์ด ํ•„์š”ํ•œ ์ž๋ฆฌ๋Š” **์ง์ ‘ ๋งŒ๋“  ์ปจํ…Œ์ด๋„ˆ**์™€ **`SSectionHeaderCard.Body`** ๋‘ ๊ณณ๋ฟ์ด๋‹ค.
310
+ **์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์ฒด ์—ฌ๋ฐฑ์„ ๊ฐ€์ง€๋ฉด ์ปดํฌ๋„ŒํŠธ ๊ธฐ์ค€์ด ์šฐ์„ ํ•œ๋‹ค.** `SKeyValueTable`ยท`STable` ์ฒ˜๋Ÿผ ์ž๊ธฐ ์—ฌ๋ฐฑ์„ ํ† ํฐ์œผ๋กœ ๊ฐ–๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์—๋Š” ์ด ํŒ์ •์„ ์ ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค โ€” ์†๋Œˆ ๊ฒƒ์ด ์—†๋‹ค. ์•„๋ž˜ ํŒ์ •์ด ํ•„์š”ํ•œ ์ž๋ฆฌ๋Š” **์ง์ ‘ ๋งŒ๋“  ์ปจํ…Œ์ด๋„ˆ**์™€ **`SSectionHeaderCard` ์˜ `padding`** ๋‘ ๊ณณ๋ฟ์ด๋‹ค.
296
311
 
297
312
  ํŒ์ •์€ **๊ทธ ์˜์—ญ์ด ๋‹ด๊ณ  ์žˆ๋Š” ์ฝ˜ํ…์ธ  ๋ฉ์–ด๋ฆฌ์˜ ์ข…๋ฅ˜ ์ˆ˜**๋กœ ํ•œ๋‹ค.
298
313
 
@@ -327,14 +342,67 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
327
342
 
328
343
  **์ค‘์ฒฉ๋˜๋ฉด ์•ˆ์ชฝ ์—ฌ๋ฐฑ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.** 24 ์˜์—ญ ์•ˆ์— ๋˜ ์—ฌ๋ฐฑ์„ ์ฃผ๋ฉด ๊ฐ€์žฅ์ž๋ฆฌ๊ฐ€ 40 ์œผ๋กœ ๋ฒŒ์–ด์ ธ ํ•œ ๋ฉด์ ์ฒ˜๋Ÿผ ์ฝํžŒ๋‹ค. ์•ˆ์ชฝ ์นด๋“œยท๋ชฉ๋ก์ด **๋ฐฐ๊ฒฝ์ƒ‰์ด ๋‹ค๋ฅด๊ฑฐ๋‚˜ ํ…Œ๋‘๋ฆฌ๊ฐ€ ์žˆ์–ด** ๊ฒฝ๊ณ„๊ฐ€ ์Šค์Šค๋กœ ๋ณด์ด๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž๊ธฐ ์—ฌ๋ฐฑ์„ ์œ ์ง€ํ•œ๋‹ค.
329
344
 
330
- `SSectionHeaderCard.Body` ๋Š” ์ด ๊ทœ์น™์„ **prop ์œผ๋กœ ๋ฐ›๋Š”๋‹ค** โ€” ์ง์ ‘ `p-sd-*` ๋ฅผ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
345
+ `SSectionHeaderCard` ๋Š” ์ด ๊ทœ์น™์„ **`padding` prop ์œผ๋กœ ๋ฐ›๋Š”๋‹ค** โ€” ์ง์ ‘ `p-sd-*` ๋ฅผ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
346
+
347
+ ```tsx
348
+ <SSectionHeaderCard title="๊ธฐ๋ณธ ์ •๋ณด">โ€ฆ</SSectionHeaderCard> {/* ๊ธฐ๋ณธ = 16 */}
349
+ <SSectionHeaderCard title="๊ธฐ๋ณธ ์ •๋ณด" padding="wide">โ€ฆ</SSectionHeaderCard> {/* 3์ข…๋ฅ˜ ์ด์ƒ */}
350
+ <SSectionHeaderCard title="๊ธฐ๋ณธ ์ •๋ณด" padding="none">โ€ฆ</SSectionHeaderCard> {/* ํ‘œ๋ฅผ ๊ฐ€์žฅ์ž๋ฆฌ๊นŒ์ง€ */}
351
+ ```
352
+
353
+ ##### ์นด๋“œ ๊ฐ€์žฅ์ž๋ฆฌ๊นŒ์ง€ ์ฑ„์šฐ๋Š” ํ‘œ๋Š” ์ž๊ธฐ ํ…Œ๋‘๋ฆฌ๋ฅผ ๋ˆ๋‹ค
354
+
355
+ ์—ฌ๊ธฐ์„œ "ํ‘œ"๋Š” **`STable` ๊ณผ `SKeyValueTable` ๋‘˜ ๋‹ค**๋‹ค. ๋‘ ์ปดํฌ๋„ŒํŠธ ๋ชจ๋‘ ์ž๊ธฐ ๋ฐ”๊นฅ ํ…Œ๋‘๋ฆฌ๋ฅผ ๊ทธ๋ฆฌ๋Š”๋ฐ, ์นด๋“œ๋„ ๋ฐ”๊นฅ ํ…Œ๋‘๋ฆฌ๋ฅผ ๊ทธ๋ฆฐ๋‹ค. `padding="none"` ์œผ๋กœ ๋ถ™์ด๋ฉด **1px ๋‘ ๊ฐœ๊ฐ€ ๋‚˜๋ž€ํžˆ ๋†“์—ฌ ๊ทธ ๋ณ€๋งŒ 2px** ๋กœ ๋ณด์ธ๋‹ค(์นด๋“œ์˜ ๋‹ค๋ฅธ ๋ณ€์€ 1px ๊ทธ๋Œ€๋กœ๋ผ ๊ตต๊ธฐ๊ฐ€ ์–ด๊ธ‹๋‚œ๋‹ค).
356
+
357
+ ```tsx
358
+ <SSectionHeaderCard title="๋ฐœ์ฃผ ๋‚ด์—ญ" padding="none">
359
+ <SKeyValueTable fields={โ€ฆ} bordered={false} radius="useTop" />
360
+ <STable columns={โ€ฆ} rows={โ€ฆ} bordered={false} radius="useTop" />
361
+ </SSectionHeaderCard>
362
+ ```
363
+
364
+ - **`bordered={false}`** ๋กœ ํ‘œ์˜ ํ…Œ๋‘๋ฆฌ๋ฅผ ๋ˆ๋‹ค. ์นด๋“œ๊ฐ€ ์ด๋ฏธ ๊ทธ๋ฆฐ๋‹ค.
365
+ - **`radius="useTop"`** ์œผ๋กœ ์œ„์ชฝ ๋ชจ์„œ๋ฆฌ๋ฅผ ์ฃฝ์ธ๋‹ค. ์•„๋ž˜์ชฝ ๋ผ์šด๋“œ๋Š” ์นด๋“œ๊ฐ€ ์ฒ˜๋ฆฌํ•œ๋‹ค.
366
+ - `STable` ์€ **ํŽ˜์ด์ง€๋„ค์ด์…˜ ๋ฐ”์˜ ํ…Œ๋‘๋ฆฌ์™€ `-mt-px` ๊ฒน์นจ๋„ ํ•จ๊ป˜ ๊บผ์ง„๋‹ค** โ€” ๋ณธ๋ฌธ ํ…Œ๋‘๋ฆฌ๊ฐ€ ์—†์œผ๋ฉด ๊ฒน์น  ๋Œ€์ƒ์ด ์—†์–ด, ๊ทธ๋Œ€๋กœ ๋‘๋ฉด ํŽ˜์ด์ง€๋„ค์ด์…˜๋งŒ ํ…Œ๋‘๋ฆฌ๋ฅผ ๊ฐ–๊ณ  1px ์–ด๊ธ‹๋‚œ๋‹ค.
367
+
368
+ #### ๋ณธ๋ฌธ ๋ฐ”ํƒ• ๋ˆŒ๋Ÿฌ์•‰ํžˆ๊ธฐ (์„ ํƒ)
369
+
370
+ `SSectionHeaderCard` ๋Š” **`background="neutral"`** ๋กœ ๋ณธ๋ฌธ ๋ฐ”ํƒ•์„ ํ•œ ๋‹จ๊ณ„ ๋ˆŒ๋Ÿฌ์•‰ํž ์ˆ˜ ์žˆ๋‹ค. ํฐ ๋ฉด ๋ฉ์–ด๋ฆฌ(ํ‘œยท๋ฆฌ์ŠคํŠธ)๊ฐ€ ์—ฌ๋Ÿฟ์ผ ๋•Œ ๊ทธ ๋ฉ์–ด๋ฆฌ๋“ค์ด **"๋ฉด ์œ„์— ๋†“์ธ ๊ฐ์ฒด"๋กœ ์ฝํ˜€ ๋ฌถ์Œ์ด ๋” ๊ฐ•ํ•˜๊ฒŒ ๋ณด์ธ๋‹ค.**
331
371
 
332
372
  ```tsx
333
- <SSectionHeaderCard.Body>โ€ฆ</SSectionHeaderCard.Body> {/* ๊ธฐ๋ณธ = 16 */}
334
- <SSectionHeaderCard.Body padding="wide">โ€ฆ</SSectionHeaderCard.Body> {/* 3์ข…๋ฅ˜ ์ด์ƒ */}
335
- <SSectionHeaderCard.Body padding="none">โ€ฆ</SSectionHeaderCard.Body> {/* ํ‘œ๋ฅผ ๊ฐ€์žฅ์ž๋ฆฌ๊นŒ์ง€ */}
373
+ <SSectionHeaderCard title="๋ฐœ์ฃผ ์ƒ์„ธ" background="neutral">โ€ฆํฐ ๋ฉด ํ‘œ ์—ฌ๋Ÿฟโ€ฆ</SSectionHeaderCard>
336
374
  ```
337
375
 
376
+ **๊ธฐ๋ณธ๊ฐ’(`frame`, ํฐ ๋ฉด)์ด ํ‹€๋ฆฐ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.** ์ด ์ €์žฅ์†Œ์˜ ํ‘œยท๋ฆฌ์ŠคํŠธ๋Š” ํ…Œ๋‘๋ฆฌยท๋ผ์šด๋“œยทํ—ค๋” ์ค„๊ณผ `gap-sd-12` ๋ฅผ ์ด๋ฏธ ๊ฐ–๊ณ  ์žˆ์–ด ํฐ ๋ฐ”ํƒ•์—์„œ๋„ ๊ฒฝ๊ณ„๊ฐ€ ์ฝํžŒ๋‹ค. ์œ„๊ณ„๋ฅผ ํ•œ ๋‹จ๊ณ„ ๋” ์ฃผ๊ณ  ์‹ถ์„ ๋•Œ ๊ณ ๋ฅด๋Š” ์ˆ˜๋‹จ์ด์ง€, ๋ฉ์–ด๋ฆฌ๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด ๋ฐ˜๋“œ์‹œ ๊น”์•„์•ผ ํ•˜๋Š” ๊ทœ์น™์ด ์•„๋‹ˆ๋‹ค.
377
+
378
+ ๊น”์•„๋„ **ํšจ๊ณผ๊ฐ€ ์—†๋Š”** ์ž๋ฆฌ๋Š” ์žˆ๋‹ค.
379
+
380
+ - **๋ฉ์–ด๋ฆฌ๊ฐ€ ๊ฐ€์žฅ์ž๋ฆฌ๊นŒ์ง€ ์ฐจ๋Š” ๊ฒฝ์šฐ** โ€” `padding="none"` ์œผ๋กœ ํ‘œ๋ฅผ ์ฑ„์šฐ๋ฉด ๊น ๋ฐ”ํƒ•์ด ํ‘œ์— ์™„์ „ํžˆ ๊ฐ€๋ ค ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.
381
+ - **๋ฉ์–ด๋ฆฌ์— ํšŒ์ƒ‰ ๋ฉด์ด ์„ž์ธ ๊ฒฝ์šฐ** โ€” ๊ทธ ๋ฉ์–ด๋ฆฌ๊ฐ€ ๋ฐ”ํƒ•๊ณผ ๊ฐ™์€ ์ƒ‰์ด ๋˜์–ด ๋ฌปํžŒ๋‹ค.
382
+ - **๋งจ ํ…์ŠคํŠธยทํผ ์ปจํŠธ๋กค๋งŒ ์žˆ๋Š” ๋ณธ๋ฌธ** โ€” ๋– ์˜ค๋ฅผ ํฐ ๋ฉด์ด ์—†๋‹ค.
383
+
384
+ ๋ฐ”ํƒ•์„ ๊น ๊ฒฝ์šฐ, ํ‘œ ์‚ฌ์ด ๊ตฌ๋ถ„์„ (`SDivider`)์€ ๋Œ€๊ฐœ ๋ถˆํ•„์š”ํ•ด์ง„๋‹ค โ€” ์ƒ‰์ด ์ด๋ฏธ ๊ฒฝ๊ณ„๋ฅผ ๋งŒ๋“ ๋‹ค.
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
+
338
406
  #### ์Šคํฌ๋กค ์˜์—ญ์˜ ํ•˜๋‹จ ์—ฌ๋ฐฑ
339
407
 
340
408
  ์Šคํฌ๋กค์„ ๋๊นŒ์ง€ ๋‚ด๋ ธ์„ ๋•Œ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์ด ํ™”๋ฉด ๊ฒฝ๊ณ„์— ๋ถ™์œผ๋ฉด **๋ชฉ๋ก์ด ๋๋‚œ ๊ฒƒ์ธ์ง€ ๋” ์žˆ๋Š” ๊ฒƒ์ธ์ง€** ์ฝํžˆ์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ์Šคํฌ๋กค ์˜์—ญ์€ **ํ•˜๋‹จ๋งŒ** ๋„“๊ฒŒ ๋‘”๋‹ค. ๋‚˜๋จธ์ง€ ์„ธ ๋ฐฉํ–ฅ์€ ์œ„ 16 / 24 ๊ทœ์น™ ๊ทธ๋Œ€๋กœ๋‹ค.
@@ -342,9 +410,9 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
342
410
  | ์Šคํฌ๋กค ์ข…๋ฅ˜ | ์–ด๋–ป๊ฒŒ |
343
411
  | --- | --- |
344
412
  | **ํŒจ๋„ ์ž์ฒด ์Šคํฌ๋กค** (์ขŒ์ธก ๋ชฉ๋ก, ์ค‘์•™ ๋Œ€ํ™” ๋“ฑ) | ๊ทธ ํŒจ๋„ ์•ˆ์ชฝ ํ•˜๋‹จ์— `pb-[var(--cmp-pageBody-padding-scrollEnd)]` โ€” `SPage` ์™€ ๊ฐ™์€ ํ† ํฐ์ด๋ผ ๊ฐ’์ด ๋ฐ”๋€Œ์–ด๋„ ํ•จ๊ป˜ ๋”ฐ๋ผ๊ฐ„๋‹ค |
345
- | **ํŽ˜์ด์ง€ ๋‹จ์œ„ ์Šคํฌ๋กค** | **`SPage` ๊ฐ€ ๋„ฃ๋Š”๋‹ค. ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค** |
413
+ | **ํŽ˜์ด์ง€ ๋‹จ์œ„ ์Šคํฌ๋กค** | **`SPage` ์˜ `scrollEndSpacing` ์œผ๋กœ ์ผ ๋‹ค. ์ง์ ‘ ํŒจ๋”ฉ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค** |
346
414
 
347
- `SPage` ๋Š” ๊ธฐ๋ณธ์œผ๋กœ ๋„ฃ์œผ๋ฏ€๋กœ **์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์œผ๋ฉด ๋งž๋‹ค.** ๋„๋Š” ๊ฒฝ์šฐ๋Š” ํ•˜๋‚˜๋ฟ์ด๋‹ค โ€” **ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ๋ถ™์€ ํ…Œ์ด๋ธ”.** ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ์ด๋ฏธ "์—ฌ๊ธฐ์„œ ๋"์„ ์•Œ๋ ค์ฃผ๋ฏ€๋กœ `scrollEndSpacing={false}` ๋กœ ๋ˆ๋‹ค (ยง4-2 ๋ชฉ๋ก ํŽ˜์ด์ง€).
415
+ **`scrollEndSpacing` ์€ ๊ธฐ๋ณธ์ด ๊บผ์ ธ ์žˆ๋‹ค.** ํŽ˜์ด์ง€๊ฐ€ ์‹ค์ œ๋กœ ์Šคํฌ๋กค๋  ๋•Œ๋งŒ ํ•„์š”ํ•œ ๊ฐ’์ด๋ผ, ์กฐ๊ฑด ์—†์ด ๋ถ™์ด๋ฉด ๋‚ด์šฉ์ด ํ™”๋ฉด์— ๊ฑฐ์˜ ๋”ฑ ๋งž๋Š” ํŽ˜์ด์ง€๊นŒ์ง€ ๊ทธ ์—ฌ๋ฐฑ ๋•Œ๋ฌธ์— ์Šคํฌ๋กค๋˜๊ฒŒ ๋งŒ๋“ ๋‹ค. ํŽ˜์ด์ง€ ์Šคํฌ๋กค์„ ์“ฐ๋Š” ํ™”๋ฉด(`contentHeight="auto"` + ๋‚ด์šฉ์ด ์ฐฝ๋ณด๋‹ค ๊น€)์—์„œ๋งŒ ์ผ ๋‹ค. ํŽ˜์ด์ง€๋„ค์ด์…˜์ฒ˜๋Ÿผ ๋์„ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด ์ด๋ฏธ ์žˆ์œผ๋ฉด ์ผœ์ง€ ์•Š๋Š”๋‹ค.
348
416
 
349
417
  ### 2-3. ์ƒ‰์ƒ
350
418
 
@@ -406,11 +474,15 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
406
474
  | --- | --- | --- |
407
475
  | ํ•œ ์ค„ ํ…์ŠคํŠธ๋ฅผ ๋ฐ›๋Š”๋‹ค | `SInput` | ยง3-7-1 |
408
476
  | ์—ฌ๋Ÿฌ ์ค„ ํ…์ŠคํŠธ๋ฅผ ๋ฐ›๋Š”๋‹ค | `STextarea` | ยง3-7-1 |
477
+ | ์ œ๋ชฉยท๊ตต๊ฒŒยท๋ชฉ๋กยท์ƒ‰ ๊ฐ™์€ **์„œ์‹์ด ๋‚จ์•„์•ผ ํ•˜๋Š”** ๊ธ€์„ ๋ฐ›๋Š”๋‹ค | `SEditor` | ยง3-7-1 |
478
+ | ๋ชฉ๋กยท๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ƒ‰์–ด๋กœ ์ขํžŒ๋‹ค | `SSearchInput` | ยง3-7-1 |
409
479
  | ์ˆซ์ž(์ˆ˜๋Ÿ‰ยท๊ธˆ์•ก)๋ฅผ ๋ฐ›๋Š”๋‹ค | `SNumberInput` | |
410
480
  | ๋ฐ”์ฝ”๋“œ๋ฅผ ์Šค์บ”ํ•ด ๋ฐ›๋Š”๋‹ค | `SBarcodeInput` | |
411
481
  | ๋ชฉ๋ก์—์„œ ํ•˜๋‚˜ ๊ณ ๋ฅด๊ฒŒ ํ•œ๋‹ค | `SSelect` | ยง3-7-2 |
412
482
  | ์„ ํƒ์ง€๋ฅผ ํ•ญ์ƒ ํŽผ์ณ ๋‘๊ณ  ํ•˜๋‚˜ ๊ณ ๋ฅด๊ฒŒ ํ•œ๋‹ค | `SRadioGroup` | ยง3-7-2 |
413
483
  | ๋ฒ„ํŠผ ๋ชจ์–‘์œผ๋กœ ๋ชจ๋“œ๋ฅผ ํ•˜๋‚˜ ๊ณ ๋ฅด๊ฒŒ ํ•œ๋‹ค | `SRadioButton` | ยง3-7-2 |
484
+ | ์„ ํƒ์ง€๋งˆ๋‹ค ์„ค๋ช…์ด ๋ถ™์–ด ํ•œ ์ค„๋กœ๋Š” ์•ˆ ๋œ๋‹ค | `SRadioCardGroup` | ยง3-7-2 |
485
+ | ์„ค๋ช…์ด ๋ถ™์€ ์„ ํƒ์ง€ ์นด๋“œ ํ•˜๋‚˜๋ฅผ ์ง์ ‘ ๋ฐฐ์น˜ํ•œ๋‹ค | `SRadioCard` | ยง3-7-2 |
414
486
  | ๋ผ๋””์˜ค ํ•˜๋‚˜๋ฅผ ํ‘œ ์…€ ๋“ฑ์— ์ง์ ‘ ๋ฐฐ์น˜ํ•œ๋‹ค | `SRadio` | ยง3-7-2 |
415
487
  | ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๊ณ ๋ฅด๊ฒŒ ํ•œ๋‹ค / ๋™์˜๋ฅผ ๋ฐ›๋Š”๋‹ค | `SCheckbox` | ยง3-7-3 |
416
488
  | ์ผœ๋Š” ์ฆ‰์‹œ ๋ฐ˜์˜๋˜๋Š” ์„ค์ •์„ ์ค€๋‹ค | `SSwitch` | ยง3-7-3 |
@@ -419,6 +491,8 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
419
491
  | ์ž…๋ ฅ๋œ ๊ฐ’ ํ•˜๋‚˜๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ ๊ณ ์น˜๊ฒŒ ํ•œ๋‹ค | `SChip` | ยง3-1 |
420
492
  | ํŒŒ์ผ์„ ๋ฐ›๋Š”๋‹ค | `SFilePicker` | |
421
493
  | ๋‚ ์งœ ํ•˜๋‚˜๋ฅผ ๋ฐ›๋Š”๋‹ค | `SDatePicker` | ยง3-7-4 |
494
+ | ์—ฐ๋„ ์„ ํƒ ๋ฆฌ์ŠคํŠธ๋งŒ ์ปค์Šคํ…€ ์กฐํ•ฉ์— ๋„ฃ๋Š”๋‹ค | `SDatePickerYearListbox` | ยง3-7-4 |
495
+ | ์—ฐ๋„+์›” ์„ ํƒ ๋ฆฌ์ŠคํŠธ๋งŒ ์ปค์Šคํ…€ ์กฐํ•ฉ์— ๋„ฃ๋Š”๋‹ค | `SDatePickerMonthListbox` | ยง3-7-4 |
422
496
  | ๋‚ ์งœ ๊ธฐ๊ฐ„์„ ๋ฐ›๋Š”๋‹ค | `SDateRangePicker` | ยง3-7-4 |
423
497
  | ์‹œ๊ฐ ํ•˜๋‚˜๋ฅผ ๋ฐ›๋Š”๋‹ค | `STimePicker` | |
424
498
  | ์‹œ๊ฐ ๋ฒ”์œ„๋ฅผ ๋ฐ›๋Š”๋‹ค | `STimeRangePicker` | |
@@ -452,6 +526,7 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
452
526
  | ๋ผ๋ฒจ์ด ์žˆ๋Š” ์ผ๋ฐ˜ ์•ก์…˜์„ ์ค€๋‹ค | `SButton` | ยง3-5 |
453
527
  | ์•„์ด์ฝ˜ ํ•˜๋‚˜๋กœ ๋œป์ด ํ†ตํ•˜๋Š” ๋ถ€๊ฐ€ ์กฐ์ž‘์„ ์ค€๋‹ค | `SGhostButton` | ยง3-5-5 |
454
528
  | ํ•œ ๋ฒ„ํŠผ์— ์—ฌ๋Ÿฌ ์„ ํƒ์ง€๋ฅผ ๋งค๋‹จ๋‹ค | `SDropdownButton` | ยง3-5-4 |
529
+ | GNB system ํŒจ๋„์—์„œ ํ•œ ์ค„์งœ๋ฆฌ ํ–‰ ์•ก์…˜์„ ์ค€๋‹ค | `SSystemActionButton` | ยง3-5-7 |
455
530
 
456
531
  #### D. ํ™”๋ฉด์„ ๋‹ด๊ณ  ๋‚˜๋ˆˆ๋‹ค
457
532
 
@@ -459,6 +534,7 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
459
534
  | --- | --- | --- |
460
535
  | ์•ฑ ์…ธ(์ƒ๋‹จ๋ฐ” + ๋‚ด๋น„ + ๋ณธ๋ฌธ)์„ ์„ธ์šด๋‹ค | `SLayout` | ยง4-1 |
461
536
  | ์ขŒ์ธก ๋‚ด๋น„๊ฒŒ์ด์…˜์„ ๋งŒ๋“ ๋‹ค | `SGnb` | ยง4-1 |
537
+ | ์ขŒ์ธก ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋งจ ์•„๋ž˜์— ์„œ๋น„์Šคยท๋„๋ฉ”์ธยท์•Œ๋ฆผยท์„ค์ •ยท๊ณ„์ • ๋ฌถ์Œ์„ ๋ถ™์ธ๋‹ค | `SGnbSystem` | ยง4-1 |
462
538
  | ํŽ˜์ด์ง€ ๋ณธ๋ฌธ์„ ๋‹ด๋Š”๋‹ค (ํŒจ๋”ฉยท์Šคํฌ๋กค) | `SPage` | ยง4-1 |
463
539
  | ํŽ˜์ด์ง€ ์ œ๋ชฉ(+ ์„œ๋ธŒ ํ…์ŠคํŠธยท๋’ค๋กœ๊ฐ€๊ธฐยท์šฐ์ธก ์Šฌ๋กฏ)์„ ๋งŒ๋“ ๋‹ค | `SPage` ์˜ `header` prop | ยง4-1 |
464
540
  | ์ œ๋ชฉ ์žˆ๋Š” ์„น์…˜์œผ๋กœ ๋ฌถ๋Š”๋‹ค | `SSectionHeaderCard` | ยง3-7-8 |
@@ -467,6 +543,8 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
467
543
  | ์‚ฌ์šฉ์ž๊ฐ€ ์˜์—ญ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•˜๊ฒŒ ํ•œ๋‹ค | `SSplitter` | ยง3-6 |
468
544
  | ํŠน์ • ์˜์—ญ ์•ˆ์—์„œ๋งŒ ์Šคํฌ๋กค์‹œํ‚จ๋‹ค | `SScrollArea` | |
469
545
 
546
+ **`SScrollArea` ๋กœ ํŽ˜์ด์ง€ ๋ณธ๋ฌธ ์ „์ฒด๋ฅผ ๊ฐ์‹ธ์ง€ ์•Š๋Š”๋‹ค.** ํŽ˜์ด์ง€ ์Šคํฌ๋กค์€ `SPage` ์˜ `<main>` ๋ชซ์ด๋‹ค โ€” ๊ฐ์‹ธ๋ฉด ์Šคํฌ๋กค๋ฐ”๊ฐ€ ๋ณธ๋ฌธ ํŒจ๋”ฉ ์•ˆ์ชฝ์œผ๋กœ ๋“ค์–ด์™€ ํŽ˜์ด์ง€ ๊ฐ€์žฅ์ž๋ฆฌ์—์„œ ๋–จ์–ด์ ธ ๊ทธ๋ ค์ง„๋‹ค (ยง2-2).
547
+
470
548
  #### E. ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค
471
549
 
472
550
  | ํ•˜๋ ค๋Š” ์ผ | ์ปดํฌ๋„ŒํŠธ | ๊ฐˆ๋ฆผ |
@@ -550,9 +628,26 @@ Tailwind ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” **ํ† ํฐ ์Šค์ผ€์ผ์— ์žˆ๋Š” ๊ฐ’๋งŒ** ์‚ฌ์šฉํ•œ๋‹ค.
550
628
  | | ๋ฌด์—‡์ธ๊ฐ€ | ํฌ๊ธฐ |
551
629
  | --- | --- | --- |
552
630
  | **SPopup** | **๋ณ„๋„ ๋ธŒ๋ผ์šฐ์ € ์ฐฝ** (`window.open` ์œผ๋กœ ์—ฌ๋Š” ์ „์šฉ ๋ผ์šฐํŠธ) | ์ฐฝ ํฌ๊ธฐ = ์ฝ˜ํ…์ธ  ํฌ๊ธฐ |
553
- | **SActionModal** | ๊ฐ™์€ ์ฐฝ ์œ„ ์˜ค๋ฒ„๋ ˆ์ด ์นด๋“œ | `width` / `height` prop |
631
+ | **SActionModal** | ๊ฐ™์€ ์ฐฝ ์œ„ ์˜ค๋ฒ„๋ ˆ์ด ์นด๋“œ | `width` prop. **๋†’์ด๋Š” ์ฃผ์ง€ ์•Š๋Š”๋‹ค** (์•„๋ž˜) |
554
632
  | **SModal.confirm** (`SConfirmModal`) | ๊ฐ™์€ ์ฐฝ ์œ„ ํ™•์ธ์ฐฝ | ๊ณ ์ • |
555
633
 
634
+ ##### ๋ชจ๋‹ฌ ๋†’์ด๋Š” ๋‚ด์šฉ์ด ์ •ํ•˜๊ณ , ์ƒํ•œ์€ ์‹œ์Šคํ…œ์ด ๊ฑด๋‹ค
635
+
636
+ **`height` ๋ฅผ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.** ๋†’์ด๋Š” ๋‚ด์šฉ์ด ์ •ํ•˜๊ณ , ์นด๋“œ๋Š” **๋ทฐํฌํŠธ์˜ 85%** ์—์„œ ๋ฉˆ์ถ˜๋‹ค(์‹œ์Šคํ…œ์ด ๋ชจ๋“  ๋ชจ๋‹ฌ์— ๊ฑด๋‹ค). ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์œผ๋ฉด ๋‚ด์šฉ๋งŒํผ ์ž‘์•„์ง€๊ณ , ๋งŽ์œผ๋ฉด 85% ์—์„œ ๋ฉˆ์ถ˜๋‹ค.
637
+
638
+ ๊ฐ€๋กœ๋Š” ์ขŒ์šฐ 24px ์”ฉ์„ ๋บ€ ๊ฐ’์œผ๋กœ ํด๋žจํ•‘ํ•˜๋Š”๋ฐ **์„ธ๋กœ๋งŒ ๋น„์œจ**์ธ ์ด์œ ๋Š”, ๋ชจ๋‹ฌ์ด ํ™”๋ฉด์„ ๊ฑฐ์˜ ๋‹ค ๋ฎ์œผ๋ฉด ๋’ค ๋งฅ๋ฝ์ด ์‚ฌ๋ผ์ ธ "๋–  ์žˆ๋Š” ๊ฒƒ"์œผ๋กœ ์ฝํžˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
639
+
640
+ **์ƒํ•œ์— ๋‹ฟ์•˜์„ ๋•Œ ์Šคํฌ๋กค๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ๋ชจ๋‹ฌ ๋ณธ๋ฌธ์ด ์•„๋‹ˆ๋ผ ํ‘œ๋‹ค.**
641
+
642
+ ```tsx
643
+ <SActionModal modalTitle="๋ฐœ์ฃผ ๊ฒ€ํ† " button={{ label: 'ํ™•์ •', onClick: submit }}>
644
+ {/* ํ‘œ๊ฐ€ ๋‚จ์€ ๋†’์ด๋ฅผ ๋จน๊ณ  ์ž๊ธฐ ์•ˆ์—์„œ ์Šคํฌ๋กคํ•œ๋‹ค โ€” ํ—ค๋”ยทํ•ฉ๊ณ„ยทํ‘ธํ„ฐ๋Š” ๋Š˜ ๋ณด์ธ๋‹ค */}
645
+ <STable className="min-h-0 flex-1" columns={columns} rows={rows} />
646
+ </SActionModal>
647
+ ```
648
+
649
+ ๋ณธ๋ฌธ(`overflow-auto` ์˜์—ญ)์ด ํ†ต์งธ๋กœ ์Šคํฌ๋กค๋˜๋ฉด ํ‘œ ํ—ค๋”์™€ ํ•ฉ๊ณ„ ์ค„์ด ์œ„๋กœ ๋ฐ€๋ ค ์‚ฌ๋ผ์ง„๋‹ค. `SActionModal` ์˜ ๋ณธ๋ฌธ์€ ์ด๋ฏธ `min-h-0 flex-1` ์ด๋ฏ€๋กœ, ํ‘œ์— `min-h-0 flex-1` ์„ ์ฃผ๋ฉด ์„ธ๋กœ ์ถ•์ด ์ด์–ด์ ธ ํ‘œ๋งŒ ์Šคํฌ๋กคํ•œ๋‹ค (ยง4-2 ๋ชฉ๋ก ํŽ˜์ด์ง€์™€ ๊ฐ™์€ ์‚ฌ์Šฌ์ด๋‹ค).
650
+
556
651
  **์„ฑ๊ฒฉ์ด ๋จผ์ € ๋‘˜๋กœ ๊ฐˆ๋ฆฐ๋‹ค.**
557
652
 
558
653
  | ์„ฑ๊ฒฉ | ์ •์˜ | ์ปดํฌ๋„ŒํŠธ |
@@ -690,36 +785,51 @@ SModal.create({ component: OrderModal, componentProps: { orderId } })
690
785
 
691
786
  ์ž‘์„ฑ ์ค‘์ธ ๋‚ด์šฉ์ด ์žˆ์„ ๋•Œ ๋‹ซ๊ธฐ๋ฅผ ์‹œ๋„ํ•˜๋ฉด ์ดํƒˆ ์•ˆ๋‚ด๋ฅผ ๋„์šฐ๋Š” ๊ฒƒ์€ **์†Œ๋น„ ์•ฑ ๋ชซ**์ด๋‹ค. ๋””์ž์ธ ์‹œ์Šคํ…œ์€ dirty ์ƒํƒœ๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋ฏ€๋กœ ๋ฐฑ๋“œ๋กญยทESC ๋ฅผ ์ผ๊ด„ ์ฐจ๋‹จํ•  ๋ฟ์ด๋‹ค. ์•ˆ๋‚ด๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์•ฑ์ด ์ž์ฒด dirty ํŒ์ • ํ›„ `SModal.confirm` ์œผ๋กœ ๋„์šด๋‹ค.
692
787
 
693
- ### 3-4. ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ โ€” ์ •๋ ฌ๊ณผ ๋„ˆ๋น„
788
+ ### 3-4. ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ โ€” ์ •๋ ฌยท๋„ˆ๋น„ยทํ—ค๋”
694
789
 
695
- #### ์ •๋ ฌ
790
+ #### ์ •๋ ฌ๊ณผ ๋„ˆ๋น„๋Š” ๊ฐ™์€ ํ‘œ์—์„œ ์ •ํ•œ๋‹ค
696
791
 
697
- **๊ฐ’์˜ ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•˜๋Š” ์ˆซ์ž ์ปฌ๋Ÿผ์€ ์˜ˆ์™ธ ์—†์ด ์˜ค๋ฅธ์ชฝ ์ •๋ ฌํ•œ๋‹ค** (`align: 'right'`).
698
- ์ž๋ฆฟ์ˆ˜๊ฐ€ ์„ธ๋กœ๋กœ ๋งž์•„์•ผ ๊ฐ’์˜ ํฌ๊ธฐ๋ฅผ ๋ˆˆ์œผ๋กœ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
792
+ ์ปฌ๋Ÿผ์„ ์ •์˜ํ•  ๋•Œ ์ •๋ ฌ๊ณผ ๋„ˆ๋น„๋Š” ๋”ฐ๋กœ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค **๊ฐ’์˜ ์„ฑ๊ฒฉ**์—์„œ ๋‚˜์˜จ๋‹ค.
699
793
 
700
- **ํŒ๋ณ„ ๊ธฐ์ค€์€ "์ˆซ์ž์ธ๊ฐ€"๊ฐ€ ์•„๋‹ˆ๋ผ "ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•˜๋Š”๊ฐ€"๋‹ค.** ์ž๋ฆฟ์ˆ˜ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†๊ณ  ๊ฐ’๋ผ๋ฆฌ ๋Œ€์†Œ๋ฅผ ๊ฒฌ์ค„ ์ผ์ด ์—†์œผ๋ฉด ์ˆซ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์–ด๋„ ์šฐ์ธก ์ •๋ ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
794
+ ์›์น™ ํ•œ ์ค„: **๊ธธ์ด๋ฅผ ํ˜•์‹์ด ์ •ํ•˜๋ฉด ๊ณ ์ •, ์‚ฌ์šฉ์ž๊ฐ€ ์ •ํ•˜๋ฉด ๊ฐ€๋ณ€.**
701
795
 
702
- | ๊ฐ’ ์„ฑ๊ฒฉ | ์ •๋ ฌ | ์˜ˆ |
703
- | --- | --- | --- |
704
- | **๊ธˆ์•กยท์ˆ˜๋Ÿ‰ยท๊ฐœ์ˆ˜ยท๋น„์œจ ๋“ฑ ์–‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’** | **`'right'`** | `39,000์›` ยท `12๊ฐœ` ยท `3๊ฑด` ยท `15%` |
705
- | ์ฝ”๋“œยท์‹๋ณ„์ž (์ฃผ๋ฌธ๋ฒˆํ˜ธ, ์ƒํ’ˆ์ฝ”๋“œ, ์ˆœ๋ฒˆ) | **`'center'`** | `RV20250728-000010` ยท `1024` |
706
- | ์ „ํ™”๋ฒˆํ˜ธยท์‚ฌ์—…์ž๋ฒˆํ˜ธ | **`'center'`** | `010-1234-5678` |
707
- | ์ผ์žยท์ผ์‹œ | **`'center'`** | `2024-10-23` |
708
- | ํ…์ŠคํŠธ | ์ƒ๋žต(๊ธฐ๋ณธ `left`) | ์ƒํ’ˆ๋ช…, ์นดํ…Œ๊ณ ๋ฆฌ |
709
- | ์ƒํƒœ ํƒœ๊ทธยท์•„์ด์ฝ˜ยท์ฒดํฌ๋ฐ•์Šค ๋“ฑ ๊ณ ์ •ํญ ์š”์†Œ | `'center'` | `STag`, `SIcon` |
796
+ | ๊ฐ’ ์„ฑ๊ฒฉ | ์ •๋ ฌ | ๋„ˆ๋น„ | ์˜ˆ |
797
+ | --- | --- | --- | --- |
798
+ | **๊ธˆ์•กยท์ˆ˜๋Ÿ‰ยท๊ฐœ์ˆ˜ยท๋น„์œจ** (์–‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’) | **`'right'`** | ๊ณ ์ • | `39,000์›` ยท `12๊ฐœ` ยท `3๊ฑด` ยท `15%` |
799
+ | ์ฝ”๋“œยท์‹๋ณ„์ž, ์ „ํ™”๋ฒˆํ˜ธ, ์ผ์žยท์ผ์‹œ | **`'center'`** | ๊ณ ์ • | `RV20250728-000010` ยท `010-1234-5678` ยท `2026-08-13` |
800
+ | **๋‹ซํžŒ ๊ฐ’ ์ง‘ํ•ฉ** (enum ยท ๋งˆ์Šคํ„ฐ ๋ชฉ๋ก์—์„œ ๊ณ ๋ฅด๋Š” ๊ฐ’) | **`'center'`** | ๊ณ ์ • | ์ƒํƒœ ยท ์ง๊ธ‰ ยท ๊ณต๊ฐœ ๋ฒ”์œ„ ยท ๊ณ ์šฉ ํ˜•ํƒœ ยท ์š”์ผ |
801
+ | ์ƒํƒœ ํƒœ๊ทธยท์•„์ด์ฝ˜ยท๋ฒ„ํŠผยท์ฒดํฌ๋ฐ•์Šค | `'center'` | ๊ณ ์ • (`contentType: 'control'`) | `STag` ยท `SIcon` ยท `SGhostButton` |
802
+ | **ํ…์ŠคํŠธ** (์‚ฌ์šฉ์ž๊ฐ€ ์ž์œ  ์ž…๋ ฅ) | ์ƒ๋žต(๊ธฐ๋ณธ `left`) | ๊ธฐ์ค€ ํญ + `resizable` | ์ด๋ฆ„ ยท ๋ชฉํ‘œ๋ช… ยท ์ด๋ฉ”์ผ ยท ๋ฉ”๋ชจ |
710
803
 
711
804
  **์ค‘์•™ ์ •๋ ฌ์€ `align: 'center'` ๋ฅผ ๋ช…์‹œํ•œ๋‹ค.** ๊ธฐ๋ณธ๊ฐ’์ด ์ขŒ์ธก์ด๋ผ ์ƒ๋žตํ•˜๋ฉด ์ค‘์•™์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.
712
805
 
806
+ ##### ํŒ๋ณ„ โ€” ๊ฐ’์˜ ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•˜๋Š”๊ฐ€
807
+
808
+ ์šฐ์ธก ์ •๋ ฌ์˜ ๊ทผ๊ฑฐ๋Š” "์ž๋ฆฟ์ˆ˜๋ฅผ ์„ธ๋กœ๋กœ ๋งž์ถฐ ํฌ๊ธฐ๋ฅผ ์ฝ๋Š”๋‹ค"๋‹ค. ์ž๋ฆฟ์ˆ˜ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†๊ณ  ๊ฐ’๋ผ๋ฆฌ ๋Œ€์†Œ๋ฅผ ๊ฒฌ์ค„ ์ผ์ด ์—†์œผ๋ฉด ์ˆซ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์–ด๋„ ์šฐ์ธก ์ •๋ ฌํ•˜์ง€ ์•Š๋Š”๋‹ค โ€” ์†ก์žฅ๋ฒˆํ˜ธ `123456789` ๋Š” ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฐ’์ด ์•„๋‹ˆ๋‹ค.
809
+
810
+ ##### ํŒ๋ณ„ โ€” ๊ฐ’ ์ง‘ํ•ฉ์ด ๋‹ซํ˜€ ์žˆ๋Š”๊ฐ€
811
+
812
+ **๋‹ซํžŒ ๊ฐ’ ์ง‘ํ•ฉ์ด๋ฉด ํƒœ๊ทธ๋กœ ๊ทธ๋ฆฌ๋“  ๋งจ ํ…์ŠคํŠธ๋กœ ๊ทธ๋ฆฌ๋“  `center` ๋‹ค.** ํŒ๋ณ„ ์งˆ๋ฌธ ํ•˜๋‚˜ โ€” *์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ ์นธ์„ ์ง์ ‘ ์น˜๋Š” ๊ฐ’์ธ๊ฐ€?* ์•„๋‹ˆ๋ฉด ๋‹ซํžŒ ์ง‘ํ•ฉ์ด๋‹ค.
813
+
814
+ | | ๊ฐ’์˜ ์ถœ์ฒ˜ | ์ •๋ ฌ | ์˜ˆ |
815
+ | --- | --- | --- | --- |
816
+ | **๋‹ซํž˜** | enum ยท ๋งˆ์Šคํ„ฐ ๋ชฉ๋ก์—์„œ ์„ ํƒ (`SSelect` ์˜ `options` ์—์„œ ์˜ค๋Š” ๊ฐ’) | `center` | ์ง๊ธ‰ ยท ์ƒํƒœ ยท ๊ณต๊ฐœ ๋ฒ”์œ„ ยท ์ตœ์ข… ๋“ฑ๊ธ‰ ยท ๊ณ ์šฉ ํ˜•ํƒœ ยท ์š”์ผ |
817
+ | **์—ด๋ฆผ** | ์‚ฌ์šฉ์ž๊ฐ€ ์ž์œ  ์ž…๋ ฅ (์ž์œ  ์ž…๋ ฅ ํ•„๋“œ์—์„œ ์˜ค๋Š” ๊ฐ’) | `left` | ์ด๋ฆ„ ยท ๋ชฉํ‘œ๋ช… ยท ์ด๋ฉ”์ผ ยท ๋ฌธํ•ญ ๊ทธ๋ฃน๋ช… |
818
+
819
+ - **๋ฌด์—‡์œผ๋กœ ๊ทธ๋ ธ๋Š”์ง€๋กœ ๊ฐ€๋ฅด์ง€ ์•Š๋Š”๋‹ค.** ๊ฐ™์€ ์„ฑ๊ฒฉ์˜ ๊ฐ’์ด `STag` ๋ฉด `center`, ๋งจ ํ…์ŠคํŠธ๋ฉด `left` ๊ฐ€ ๋˜๋ฉด ํ•œ ํ…Œ์ด๋ธ” ์•ˆ์—์„œ ๊ธฐ์ค€์ด ์–ด๊ธ‹๋‚œ๋‹ค.
820
+ - **๊ธธ์ด๋กœ๋„ ๊ฐ€๋ฅด์ง€ ์•Š๋Š”๋‹ค.** "์งง์€ ๋ผ๋ฒจ์ด๋ฉด center" ๊ฐ™์€ ๋‹จ์„œ๋ฅผ ๋ถ™์ด๋ฉด `ํ”„๋กœ๋•ํŠธ๋””์ž์ธํŒ€`(8์ž)์ฒ˜๋Ÿผ ๊ฒฝ๊ณ„์— ๊ฑธ๋ฆฌ๋Š” ๊ฐ’์—์„œ ๋งค๋ฒˆ ํŒ๋‹จ์ด ๊ฐˆ๋ฆฐ๋‹ค.
821
+ - ํ•œ ์—ด์— ํ…์ŠคํŠธ์™€ ํƒœ๊ทธ๊ฐ€ ํ•จ๊ป˜ ์˜ค๋ฉด ํƒœ๊ทธ ๊ธฐ์ค€(`center`)์— ๋งž์ถ˜๋‹ค.
822
+
713
823
  ```tsx
714
824
  const columns: STableColumn[] = [
715
- { name: 'orderNo', label: '์ฃผ๋ฌธ๋ฒˆํ˜ธ', field: 'orderNo', width: '140px', align: 'center' },
716
- { name: 'orderedAt', label: '์ฃผ๋ฌธ์ผ์ž', field: 'orderedAt', width: '100px', align: 'center' },
717
- { name: 'name', label: '์ƒํ’ˆ๋ช…', field: 'name' }, // ํ…์ŠคํŠธ โ†’ ์ƒ๋žต
718
- { name: 'qty', label: '์ˆ˜๋Ÿ‰', field: 'qty', width: '80px', align: 'right',
825
+ { name: 'orderNo', label: '์ฃผ๋ฌธ๋ฒˆํ˜ธ', field: 'orderNo', width: 140, align: 'center' },
826
+ { name: 'orderedAt', label: '์ฃผ๋ฌธ์ผ์ž', field: 'orderedAt', width: 100, align: 'center' },
827
+ { name: 'name', label: '์ƒํ’ˆ๋ช…', field: 'name', width: 240 }, // ์ž์œ  ์ž…๋ ฅ โ†’ ์ƒ๋žต
828
+ { name: 'qty', label: '์ˆ˜๋Ÿ‰', field: 'qty', width: 80, align: 'right',
719
829
  format: (v: number) => `${Number(v).toLocaleString()}๊ฐœ` },
720
- { name: 'price', label: 'ํŒ๋งค๊ฐ€', field: 'price', width: '120px', align: 'right',
830
+ { name: 'price', label: 'ํŒ๋งค๊ฐ€', field: 'price', width: 120, align: 'right',
721
831
  format: (v: number) => `${Number(v).toLocaleString()}์›` },
722
- { name: 'status', label: '์ƒํƒœ', field: 'status', width: '100px', align: 'center',
832
+ { name: 'status', label: '์ƒํƒœ', field: 'status', width: 100, align: 'center',
723
833
  render: () => <STag size="sm" color="green" label="ํŒ๋งค์ค‘" /> },
724
834
  ];
725
835
  ```
@@ -727,38 +837,73 @@ const columns: STableColumn[] = [
727
837
  - `format` ์œผ๋กœ ๋‹จ์œ„๋ฅผ ๋ถ™์ด๋”๋ผ๋„ **์–‘์„ ๋‚˜ํƒ€๋‚ด๋ฉด ์˜ค๋ฅธ์ชฝ ์ •๋ ฌ**์ด๋‹ค. ๋‹จ์œ„ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด์ด ๋˜๋Š” ๊ฒƒ์€ ์ •๋ ฌ ํŒ๋‹จ๊ณผ ๋ฌด๊ด€ํ•˜๋‹ค.
728
838
  - ์–‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž๋Š” ยง1-4 ๋Œ€๋กœ **`toLocaleString()` ์ด ํ•„์ˆ˜**๋‹ค. ์„ธ ์ž๋ฆฌ ์ฝค๋งˆ ์—†์ด ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
729
839
  - **๋ฒˆํ˜ธยท์ฝ”๋“œ์—๋Š” ์„ธ ์ž๋ฆฌ ์ฝค๋งˆ๋ฅผ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.** ์†ก์žฅ๋ฒˆํ˜ธ `123456789` ๋ฅผ `123,456,789` ๋กœ ํ‘œ์‹œํ•˜๋ฉด ๊ฐ’ ์ž์ฒด๊ฐ€ ๋‹ฌ๋ผ ๋ณด์ธ๋‹ค.
840
+ - ๋‚ ์งœ๋Š” ยง1-4 ๋Œ€๋กœ `YYYY-MM-DD` ๋กœ ์ ๋Š”๋‹ค. ์ž๋ฆฟ์ˆ˜๊ฐ€ ๊ณ ์ •์ด๋ผ ํญ์„ ํ˜•์‹์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
730
841
  - **ํ—ค๋”๋Š” ๊ฐ€์šด๋ฐ, ์…€๋งŒ ์šฐ์ธก**์œผ๋กœ ๋‘๋ ค๋ฉด `align` ์ด ์•„๋‹ˆ๋ผ `tdClass` ๋ฅผ ์“ด๋‹ค. `align` ์€ `<th>` ์™€ `<td>` ์— ํ•จ๊ป˜ ์ ์šฉ๋œ๋‹ค.
731
842
 
732
843
  ```tsx
733
- { name: 'views', label: '์กฐํšŒ์ˆ˜', field: 'views', align: 'center', tdClass: 'text-right!',
844
+ { name: 'views', label: '์กฐํšŒ์ˆ˜', field: 'views', align: 'center', width: 100, tdClass: 'text-right!',
734
845
  format: (v: number) => Number(v).toLocaleString() },
735
846
  ```
736
847
 
737
848
  - `SKeyValueTable` ์˜ ๊ฐ’ ์…€๋„ ๊ฐ™์€ ๊ธฐ์ค€์„ ๋”ฐ๋ฅธ๋‹ค.
738
849
 
739
- #### ์ปจํŠธ๋กค์ด ๋“ค์–ด๊ฐ€๋Š” ์ปฌ๋Ÿผ์€ ๋„ˆ๋น„๋ฅผ ๋ช…์‹œํ•œ๋‹ค
850
+ #### ๋„ˆ๋น„๋Š” px ๋กœ๋งŒ ์ค€๋‹ค
740
851
 
741
- ์ปฌ๋Ÿผ ํญ์€ `width` ๋กœ **๊ณ ์ •**๋˜๊ณ , `<td>` ๋Š” ๊ทธ ํญ์„ ๋„˜๋Š” ๋‚ด์šฉ์„ ์ž˜๋ผ๋‚ธ๋‹ค(`overflow: hidden`). ํ…์ŠคํŠธ๋ผ๋ฉด ๋ง์ค„์ž„์œผ๋กœ ๋๋‚˜์ง€๋งŒ, ์…€์— `STag` ยท `SButton` ยท `SGhostButton` ยท `SSelect` ยท `SInput` ยท `SNumberInput` ์ฒ˜๋Ÿผ **์ž๊ธฐ ํญ์„ ๊ฐ€์ง„ ์š”์†Œ**๋ฅผ ๋„ฃ์œผ๋ฉด ์š”์†Œ ์ž์ฒด๊ฐ€ ์ž˜๋ ค **๋ˆ„๋ฅด๊ฑฐ๋‚˜ ์ฝ๊ฑฐ๋‚˜ ์ž…๋ ฅํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.** `width` ๋ฅผ ์ƒ๋žตํ•ด๋„ ๋‚ด์šฉ์— ๋งž์ถฐ ๋Š˜์–ด๋‚˜์ง€ ์•Š๊ณ  `STable` ์˜ ๊ธฐ๋ณธ ํญ์ด ๋  ๋ฟ์ด๋ฏ€๋กœ, ์ปจํŠธ๋กค์ด ๋“ค์–ด๊ฐ€๋Š” ์ปฌ๋Ÿผ์€ ํญ์„ ์ง์ ‘ ํŒ๋‹จํ•ด์„œ ์ค€๋‹ค.
852
+ **์ปฌ๋Ÿผ ํญ์€ px ์ด๋‹ค.** ์ˆซ์ž๋ฅผ ์ฃผ๋ฉด px ๋กœ ์ฝ๊ณ , ๋ฌธ์ž์—ด์€ `'120px'` ํ˜•ํƒœ๋งŒ ๋ฐ›๋Š”๋‹ค. `%` ยท `clamp()` ยท `min()` ์€ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
742
853
 
743
- - ๊ธฐ์ค€์€ **์š”์†Œ๊ฐ€ ์˜จ์ „ํžˆ ๋ณด์ด๋Š” ํญ + ์…€ ์ขŒ์šฐ ํŒจ๋”ฉ**์ด๋‹ค. ์ขŒ์šฐ ํŒจ๋”ฉ์€ `STable` ์ด ํ† ํฐ์œผ๋กœ ๋„ฃ์œผ๋ฏ€๋กœ(์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค) ๊ทธ๋งŒํผ์„ ๋บ€ ๋‚˜๋จธ์ง€๊ฐ€ ์š”์†Œ ๋ชซ์ด๋ผ๋Š” ์ ์„ ๊ณ„์‚ฐ์— ๋„ฃ๋Š”๋‹ค.
744
- - ์š”์†Œ๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด ์š”์†Œ ํญ์˜ ํ•ฉ์— **`gap` ๊นŒ์ง€** ๋”ํ•œ๋‹ค (ํ–‰ ๋‚ด๋ถ€ ์ธ๋ผ์ธ ์•ก์…˜ ๊ฐ„๊ฒฉ์€ `gap-sd-4` ๊ณ ์ •, ยง3-5-5).
854
+ ์ปฌ๋Ÿผ ํญ์€ `<colgroup>` ์˜ `<col width>` ๋กœ ๋“ค์–ด๊ฐ€๊ณ  ํ…Œ์ด๋ธ”์ด `table-fixed` ๋ผ, ํ•จ์ˆ˜ํ˜• ๊ฐ’์€ ๊ณ„์‚ฐ๋˜์ง€ ์•Š๊ณ  ํ†ต์งธ๋กœ ๋ฌด์‹œ๋œ ๋’ค auto ํญ์œผ๋กœ ๋–จ์–ด์ง„๋‹ค. `'30%'` ๋Š” ๋” ๋‚˜์˜๊ฒŒ `30`(px)์œผ๋กœ ์ฝํžŒ๋‹ค. **๋‘˜ ๋‹ค ์—๋Ÿฌ ์—†์ด ํ™”๋ฉด๋งŒ ํ‹€์–ด์ง„๋‹ค.**
855
+
856
+ - **๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ€๋Š” ์—ด์€ ์ „๋ถ€ ํญ์„ ๋ช…์‹œํ•œ๋‹ค.** ์ƒ๋žตํ•˜๋ฉด ๊ธฐ๋ณธ 120px ์ด ์กฐ์šฉํžˆ ๋“ค์–ด๊ฐ€๊ณ , "์งง์€ ์—ด์ด๋ผ ๊ทธ๋Œ€๋กœ ๋‘” ๊ฒƒ"๊ณผ "ํŒ๋‹จ์„ ๋น ๋œจ๋ฆฐ ๊ฒƒ"์ด ๊ตฌ๋ถ„๋˜์ง€ ์•Š๋Š”๋‹ค. 120px ์ด ๋งž๋”๋ผ๋„ `width: 120` ์„ ์ ๋Š”๋‹ค.
857
+ - **`autoWidth` ๋Š” ๋‚จ์€ ํญ์„ ํก์ˆ˜ํ•˜๋Š” ์ŠคํŽ˜์ด์„œ ์—ด ํ•˜๋‚˜์—๋งŒ ์“ด๋‹ค.** ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ€๋Š” ์—ด์—๋Š” ์“ฐ์ง€ ์•Š๋Š”๋‹ค โ€” ํญ์ด ๋‹ค๋ฅธ ์—ด์— ์ขŒ์šฐ๋ผ ํ™”๋ฉด๋งˆ๋‹ค ๋‹ฌ๋ผ์ง„๋‹ค. ์ŠคํŽ˜์ด์„œ ์—ด์€ ๊ฐ’์„ ๊ทธ๋ฆฌ์ง€ ์•Š์œผ๋ฏ€๋กœ `field` ๋„ ์ƒ๋žตํ•œ๋‹ค.
858
+
859
+ ```tsx
860
+ { name: 'spacer', label: '', autoWidth: true },
861
+ ```
862
+
863
+ - **`minWidth` ยท `maxWidth` ๋Š” `resizable` ์†์žก์ด์˜ ์ด๋™ ๋ฒ”์œ„์ผ ๋ฟ, ๋ ˆ์ด์•„์›ƒ์—๋Š” ๊ด€์—ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.** ํญ์„ ์ฃผ์ง€ ์•Š์€ ์—ด์ด ์ด ๊ฐ’ ์•ˆ์—์„œ ์žกํžˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.
864
+ - **๊ณ ์ •ํญ ํ•ฉ์ด ์ตœ์†Œ ์ฐฝ ํญ์„ ๋„˜์œผ๋ฉด ๊ฐ€๋กœ ์Šคํฌ๋กค์ด ๋œ๋‹ค.** `STable` ์ด ์ž๊ธฐ ์•ˆ์—์„œ ๊ฐ€๋กœ๋กœ ์Šคํฌ๋กคํ•˜๊ณ  ํ—ค๋”ยท๋ฐ”๋””๊ฐ€ ํ•จ๊ป˜ ์›€์ง์ด๋ฏ€๋กœ ๋ณ„๋„ ์กฐ์น˜๋Š” ํ•„์š” ์—†๋‹ค โ€” ํญ์„ ์ค„์—ฌ ๋งž์ถ”์ง€ ๋ง๊ณ , ์—ด์ด ์ •๋ง ๊ทธ๋งŒํผ ํ•„์š”ํ•œ์ง€๋ฅผ ๋ณธ๋‹ค.
865
+
866
+ ##### ๊ณ ์ •ํญ์„ ์–ด๋–ป๊ฒŒ ์ •ํ•˜๋Š”๊ฐ€
867
+
868
+ ```text
869
+ ํญ = ceil( ( max(๊ฐ’ ํญ + ๊ฐ’ ๊ธฐ์ค€ ํŒจ๋”ฉ, ํ—ค๋” ํญ + 32) + ์—ฌ์œ  ) / 8 ) ร— 8
870
+ ```
871
+
872
+ - **๊ฐ’๊ณผ ํ—ค๋”๋ฅผ ๋”ฐ๋กœ ๊ณ„์‚ฐํ•ด ํฐ ์ชฝ์„ ์“ด๋‹ค.** `contentType: 'control'` ์€ `<td>` ์—๋งŒ ์ ์šฉ๋˜๊ณ  `<th>` ๋Š” ํ•ญ์ƒ ํ…์ŠคํŠธ ํŒจ๋”ฉ์ด๋ผ, ์งง์€ ์ปจํŠธ๋กค + ๊ธด ํ—ค๋” ์กฐํ•ฉ์—์„œ ํ—ค๋”๊ฐ€ ์ž˜๋ฆฐ๋‹ค.
745
873
  - ๊ฐ’์— ๋”ฐ๋ผ ํญ์ด ๋‹ฌ๋ผ์ง€๋Š” ์š”์†Œ(`STag` ๋ผ๋ฒจ, ๋ผ๋ฒจ ์žˆ๋Š” ๋ฒ„ํŠผ)๋Š” **๊ฐ€์žฅ ๊ธด ๊ฐ’** ๊ธฐ์ค€์œผ๋กœ ์žก๋Š”๋‹ค. `ํŒ๋งค์ค‘` ์— ๋งž์ถฐ๋‘๋ฉด `ํŒ๋งค์ค‘์ง€ ์š”์ฒญ` ์—์„œ ์ž˜๋ฆฐ๋‹ค.
874
+ - **์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ํ—ค๋”(`sortable`)๋Š” ์•„์ด์ฝ˜ ๋ฒ„ํŠผ + ๊ฐ„๊ฒฉ๋งŒํผ `+20px` ๋” ๋“ ๋‹ค.** `helpText` ๋ฅผ ํ•จ๊ป˜ ๋‹ฌ๋ฉด ๊ทธ๋งŒํผ ๋˜ ๋”ํ•œ๋‹ค.
875
+ - **`editable` ยท `navigable` ํ‘œ์‹๊ณผ `required` ํ‘œ์‹œ(`*`) ๋„ ๊ฐ๊ฐ ํญ์„ ๋จน๋Š”๋‹ค.** ํ—ค๋”์— ๋ถ™๋Š” ๊ฒƒ์ด ๋Š˜์ˆ˜๋ก **๋ผ๋ฒจ์ด ๋จผ์ € ์ž˜๋ฆฌ๋ฏ€๋กœ**, ๋ถ™์ธ ์—ด์€ ํญ์„ ํ•จ๊ป˜ ๋„“ํžŒ๋‹ค.
876
+ - **๊ณ„์‚ฐ๊ฐ’์€ ํ”ฝ์…€ ๋‹จ์œ„๊นŒ์ง€ ๋งž์ถ”๋ฉด ์–ด๊ธ‹๋‚œ๋‹ค** โ€” ์„œ๋ธŒํ”ฝ์…€ ๋ฐ˜์˜ฌ๋ฆผ ๋•Œ๋ฌธ์ด๋‹ค. ์—ฌ์œ  8px ์„ ์–น๊ณ  8 ๋‹จ์œ„๋กœ ์˜ฌ๋ฆผํ•œ๋‹ค.
877
+ - ์ขŒ์šฐ ํŒจ๋”ฉ์€ `STable` ์ด ํ† ํฐ์œผ๋กœ ๋„ฃ์œผ๋ฏ€๋กœ ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋งŒํผ์„ ๋บ€ ๋‚˜๋จธ์ง€๊ฐ€ ์š”์†Œ ๋ชซ์ด๋ผ๋Š” ์ ๋งŒ ๊ณ„์‚ฐ์— ๋„ฃ๋Š”๋‹ค.
878
+
879
+ #### ์ปจํŠธ๋กค์ด ๋“ค์–ด๊ฐ€๋Š” ์ปฌ๋Ÿผ
880
+
881
+ `<td>` ๋Š” ํญ์„ ๋„˜๋Š” ๋‚ด์šฉ์„ ์ž˜๋ผ๋‚ธ๋‹ค(`overflow: hidden`). ํ…์ŠคํŠธ๋ผ๋ฉด ๋ง์ค„์ž„์œผ๋กœ ๋๋‚˜์ง€๋งŒ, ์…€์— `STag` ยท `SButton` ยท `SGhostButton` ยท `SSelect` ยท `SInput` ยท `SNumberInput` ์ฒ˜๋Ÿผ **์ž๊ธฐ ํญ์„ ๊ฐ€์ง„ ์š”์†Œ**๋ฅผ ๋„ฃ์œผ๋ฉด ์š”์†Œ ์ž์ฒด๊ฐ€ ์ž˜๋ ค **๋ˆ„๋ฅด๊ฑฐ๋‚˜ ์ฝ๊ฑฐ๋‚˜ ์ž…๋ ฅํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.**
882
+
883
+ - **์ปจํŠธ๋กค์ด ๋“ค์–ด๊ฐ€๋Š” ์ปฌ๋Ÿผ์—๋Š” `contentType: 'control'` ์„ ํ•จ๊ป˜ ์ค€๋‹ค.** ์ขŒ์šฐ ํŒจ๋”ฉ์ด ํ…์ŠคํŠธ์šฉ(๋„“๊ฒŒ)์—์„œ ์ปจํŠธ๋กค์šฉ(์ข๊ฒŒ)์œผ๋กœ ๋ฐ”๋€Œ์–ด, ๊ฐ™์€ ์ปฌ๋Ÿผ ํญ์—์„œ๋„ ์š”์†Œ๊ฐ€ ์“ธ ํญ์ด ๋„“์–ด์ง„๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `text` ๋‹ค.
884
+ - ์š”์†Œ๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด ์š”์†Œ ํญ์˜ ํ•ฉ์— **`gap` ๊นŒ์ง€** ๋”ํ•œ๋‹ค (ํ–‰ ๋‚ด๋ถ€ ์ธ๋ผ์ธ ์•ก์…˜ ๊ฐ„๊ฒฉ์€ `gap-sd-4` ๊ณ ์ •, ยง3-5-5).
746
885
  - `SSelect` ยท `SInput` ์ฒ˜๋Ÿผ ์…€ ํญ์„ ์ฑ„์šฐ๋Š” ์ปจํŠธ๋กค์€ **์ปฌ๋Ÿผ ํญ์ด ๊ณง ์ปจํŠธ๋กค ํญ**์ด๋‹ค. ์‹ค์ œ ์„ ํƒ๊ฐ’ยท์ž…๋ ฅ๊ฐ’์ด ๋ง์ค„์ž„ ์—†์ด ์ฝํžˆ๋Š” ํญ์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
747
886
  - ํญ์„ ๋„‰๋„‰ํžˆ ์ค„ ์ˆ˜ ์—†๋Š” ์ž๋ฆฌ๋Š” ํญ์„ ์ค„์ด๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ **์š”์†Œ๋ฅผ ๋ฐ”๊พผ๋‹ค** โ€” ๋ผ๋ฒจ ๋ฒ„ํŠผ ๋Œ€์‹  ์•„์ด์ฝ˜๋งŒ ์žˆ๋Š” `SGhostButton`, `size="xs"` (ยง3-5-2, ยง3-5-5).
748
- - **`autoWidth` ๋Š” ํ•ด๋ฒ•์ด ์•„๋‹ˆ๋‹ค.** ๋‚ด์šฉ์— ๋งž์ถฐ ๋Š˜์–ด๋‚˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๊ณ ์ •ํญ ์ปฌ๋Ÿผ๋“ค์ด ๊ฐ€์ ธ๊ฐ€๊ณ  **๋‚จ์€ ํญ์„ ๋‚˜๋ˆ  ๊ฐ–๋Š” ๊ฒƒ**์ด๋ผ, ํ…Œ์ด๋ธ”์ด ์ข์œผ๋ฉด ์—ญ์‹œ ์ž˜๋ฆฐ๋‹ค. ์ปจํŠธ๋กค ์ปฌ๋Ÿผ์€ `width` ๋กœ ์ง์ ‘ ํ™•๋ณดํ•œ๋‹ค.
887
+
888
+ ```tsx
889
+ { name: 'normal', label: '์ •์ƒ', field: 'normal', width: 96,
890
+ align: 'center', contentType: 'control', render: row => <SNumberInput โ€ฆ /> },
891
+ ```
892
+
893
+ **์…€ ์ขŒ์šฐ ์—ฌ๋ฐฑ์€ ๋‚ด์šฉ์ด ์ •ํ•œ๋‹ค.** ํ…์ŠคํŠธ๋Š” ๋„“๊ฒŒ, ์ปจํŠธ๋กค์€ ์ข๊ฒŒ๋‹ค โ€” `SKeyValueTable` ์€ `field.type` ์œผ๋กœ ์ด ํŒ์ •์„ ์Šค์Šค๋กœ ํ•˜์ง€๋งŒ, `STable` ์˜ ์…€์€ ์†Œ๋น„ ์•ฑ์ด ๋„˜๊ธด ์ž„์˜์˜ `render` ๊ฒฐ๊ณผ๋ผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•Œ ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ž˜์„œ `contentType` ์œผ๋กœ ์•Œ๋ ค์ค€๋‹ค. ์—ฌ๋ฐฑ ๊ฐ’ ์ž์ฒด๋Š” ํ† ํฐ์ด ์ •ํ•˜๋ฏ€๋กœ `tdClass` ๋กœ ํŒจ๋”ฉ์„ ์ง์ ‘ ๋ฎ์–ด์“ฐ์ง€ ์•Š๋Š”๋‹ค.
749
894
 
750
895
  **`resizable` ํ…Œ์ด๋ธ”์ด๋ฉด `minWidth` ๋ฅผ ํ•จ๊ป˜ ์ค€๋‹ค.** resize ํ•˜ํ•œ ๊ธฐ๋ณธ๊ฐ’์€ ์–ด๋–ค ์ปจํŠธ๋กค๋„ ๋‹ด์ง€ ๋ชปํ•  ๋งŒํผ ์ž‘์•„, ์‚ฌ์šฉ์ž๊ฐ€ ๋๊นŒ์ง€ ๋Œ๋ฉด ๊ทธ๋Œ€๋กœ ์ž˜๋ฆฐ๋‹ค. `width` ๋ฅผ ์ •ํ•œ ๊ทผ๊ฑฐ์™€ ๊ฐ™์€ ๊ฐ’์„ ํ•˜ํ•œ์œผ๋กœ ๋‘”๋‹ค โ€” ํ…์ŠคํŠธ ์ปฌ๋Ÿผ๊ณผ ๋‹ฌ๋ฆฌ ์—ฌ๊ธฐ์„œ๋Š” ๋” ์ค„์ผ ์—ฌ์ง€๊ฐ€ ์—†๋‹ค.
751
896
 
752
897
  ```tsx
753
898
  const columns: STableColumn[] = [
754
899
  // ํƒœ๊ทธ โ€” ๊ฐ€์žฅ ๊ธด ๋ผ๋ฒจ ๊ธฐ์ค€
755
- { name: 'status', label: '์ƒํƒœ', field: 'status', width: '120px', minWidth: 120, align: 'center',
900
+ { name: 'status', label: '์ƒํƒœ', field: 'status', width: 120, minWidth: 120, align: 'center',
756
901
  render: (row: SRow) => <STag size="sm" color="green" label={row.statusLabel} /> },
757
902
  // ์…€ ์•ˆ ์ž…๋ ฅ โ€” ์ปฌ๋Ÿผ ํญ์ด ๊ณง ์ž…๋ ฅ ํญ
758
- { name: 'qty', label: '์ˆ˜๋Ÿ‰', field: 'qty', width: '100px', minWidth: 100, align: 'right',
903
+ { name: 'qty', label: '์ˆ˜๋Ÿ‰', field: 'qty', width: 100, minWidth: 100, align: 'right',
759
904
  render: (row: SRow) => <SNumberInput value={row.qty} onValueChange={v => setQty(row, v)} /> },
760
905
  // ์ธ๋ผ์ธ ์•ก์…˜ ๋‘˜ โ€” ํญ = xs ๋ฒ„ํŠผ 2๊ฐœ + gap-sd-4 + ์…€ ์ขŒ์šฐ ํŒจ๋”ฉ
761
- { name: 'actions', label: '', field: 'id', width: '84px', minWidth: 84, align: 'center',
906
+ { name: 'actions', label: '', field: 'id', width: 84, minWidth: 84, align: 'center',
762
907
  render: (row: SRow) => (
763
908
  <div className="flex items-center justify-center gap-sd-4">
764
909
  <SGhostButton size="xs" intent="action" icon="edit" ariaLabel="์ˆ˜์ •" onClick={() => editRow(row)} />
@@ -766,11 +911,34 @@ const columns: STableColumn[] = [
766
911
  </div>
767
912
  ) },
768
913
 
769
- // โŒ ์ปจํŠธ๋กค ์ปฌ๋Ÿผ์— width ์ƒ๋žต โ€” ๊ธฐ๋ณธ ํญ์— ๋งก๊ธฐ๋ฉด ๋ฒ„ํŠผ์ด ์ž˜๋ฆฐ๋‹ค
914
+ // โŒ ์ปจํŠธ๋กค ์ปฌ๋Ÿผ์— width ์ƒ๋žต โ€” ๊ธฐ๋ณธ ํญ(120px)์— ๋งก๊ธฐ๋ฉด ๋ฒ„ํŠผ์ด ์ž˜๋ฆฐ๋‹ค
770
915
  { name: 'move', label: '', field: 'id', render: () => <SButton label="์žฌ๊ณ  ์ด๋™" size="xs" /> },
771
916
  ];
772
917
  ```
773
918
 
919
+ #### ์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ์ปฌ๋Ÿผ
920
+
921
+ **์ •๋ ฌ ์ƒํƒœ๋Š” `STable` ์ด ๊ฐ–์ง€ ์•Š๋Š”๋‹ค.** ์ปฌ๋Ÿผ์— `sortable: true` ๋ฅผ ์ฃผ๊ณ , ํŽ˜์ด์ง€๊ฐ€ `sort` ยท `onSortChange` ๋กœ ์ƒํƒœ๋ฅผ ๋“ค๊ณ  ์žˆ๋Š”๋‹ค.
922
+
923
+ ```tsx
924
+ const [sort, setSort] = useState<STableSort | null>({ name: 'orderedAt', dir: 'desc' });
925
+
926
+ <STable
927
+ columns={columns}
928
+ rows={rows}
929
+ sort={sort}
930
+ onSortChange={setSort}
931
+ />
932
+ ```
933
+
934
+ - **์ •๋ ฌ์€ ์กฐํšŒ ์กฐ๊ฑด์ด๋‹ค.** ์„œ๋ฒ„ ์ •๋ ฌ์ด๋ฉด `?sort=createdAt&dir=desc` ๊ฐ€ ๊ณง ์š”์ฒญ์ด๊ณ , ๋’ค๋กœ๊ฐ€๊ธฐยท์ƒˆ๋กœ๊ณ ์นจยท๋งํฌ ๊ณต์œ ๋กœ ๋ณต์›๋ผ์•ผ ํ•œ๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ณธ์„ ๋“ค๋ฉด URL ๊ณผ ํ™”๋ฉด์ด ์–ด๊ธ‹๋‚œ๋‹ค โ€” `SExpansionList` ์˜ ์„ ํƒ์„ ์•ฑ์ด ๋“œ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด์œ ๋‹ค (ยง3-7-7).
935
+ - **ํ–‰์„ ์‹ค์ œ๋กœ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ๋„ ํŽ˜์ด์ง€ ๋ชซ์ด๋‹ค.** `STable` ์€ ๋ฐ›์€ ์ˆœ์„œ๋Œ€๋กœ ๊ทธ๋ฆฐ๋‹ค.
936
+ - **๋™์ž‘** โ€” ํ—ค๋” ํด๋ฆญ ์‹œ `asc โ†’ desc โ†’ ํ•ด์ œ` 3๋‹จ. ๋‹ค๋ฅธ ์—ด์„ ๋ˆ„๋ฅด๋ฉด ๊ทธ ์—ด์˜ `asc` ๋กœ ์‹œ์ž‘ํ•œ๋‹ค. ํ•ด์ œ๋˜๋ฉด `onSortChange(null)`.
937
+ - **์•„์ด์ฝ˜** โ€” ๋ฏธ์ •๋ ฌ `updown`, ์˜ค๋ฆ„ `arrowUp`, ๋‚ด๋ฆผ `arrowDown`. ์ •๋ ฌ ์ค‘์ธ ์—ด๋งŒ `action` ์ƒ‰์œผ๋กœ ์˜ฌ๋ผ์˜จ๋‹ค. `SGhostButton size="xxs"` ๋กœ ๊ทธ๋ ค์ง€๋ฏ€๋กœ ์ง์ ‘ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
938
+ - **ํด๋ฆญ ์˜์—ญ์€ ์ •๋ ฌ ๋ฒ„ํŠผ๋ฟ์ด๋‹ค.** ํ—ค๋” ์…€ ์ „์ฒด๋ฅผ ๋ˆ„๋ฅด๊ฒŒ ํ•˜์ง€ ์•Š๋Š”๋‹ค โ€” ๋ผ๋ฒจ์„ ๋“œ๋ž˜๊ทธํ•ด ๊ณ ๋ฅด๊ฑฐ๋‚˜ `helpText` ์•„์ด์ฝ˜์— hover ํ•˜๋Š” ๊ฒƒ๊ณผ ๋’ค์„ž์ธ๋‹ค.
939
+ - **๋‹ค์ค‘ ์ •๋ ฌ์€ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.** ํ•œ ๋ฒˆ์— ํ•œ ์—ด์ด๋‹ค.
940
+ - `renderHeader` ๋กœ ํ—ค๋”๋ฅผ ํ†ต์งธ๋กœ ๊ต์ฒดํ•˜๋ฉด ์ •๋ ฌ ์•„์ด์ฝ˜๋„ ํด๋ฆญ๋„ ๊ทธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค โ€” ํ—ค๋” ์ „์ฒด๊ฐ€ ์†Œ๋น„ ์•ฑ ์ฑ…์ž„์ด ๋œ๋‹ค.
941
+
774
942
  #### ๊ฐ’์ด ์—†๋Š” ์…€์€ ํšŒ์ƒ‰ ํ•˜์ดํ”ˆ
775
943
 
776
944
  ์…€์„ **๋นˆ์นธ์œผ๋กœ ๋‘์ง€ ์•Š๋Š”๋‹ค.** ๊ฐ’์ด `null` ยท `undefined` ยท ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด `-` ๋ฅผ `text-fg-tertiary`(`grey_65`)๋กœ ํ‘œ์‹œํ•œ๋‹ค.
@@ -782,9 +950,9 @@ const emptyCell = <span className="text-fg-tertiary">-</span>;
782
950
  const hasValue = (v: unknown) => v !== null && v !== undefined && v !== '';
783
951
 
784
952
  const columns: STableColumn[] = [
785
- { name: 'memo', label: '๋ฉ”๋ชจ', field: 'memo',
953
+ { name: 'memo', label: '๋ฉ”๋ชจ', field: 'memo', width: 240,
786
954
  render: (row: SRow) => (hasValue(row.memo) ? row.memo : emptyCell) },
787
- { name: 'price', label: 'ํŒ๋งค๊ฐ€', field: 'price', width: '120px', align: 'right',
955
+ { name: 'price', label: 'ํŒ๋งค๊ฐ€', field: 'price', width: 120, align: 'right',
788
956
  render: (row: SRow) =>
789
957
  hasValue(row.price) ? `${Number(row.price).toLocaleString()}์›` : emptyCell },
790
958
  ];
@@ -792,6 +960,54 @@ const columns: STableColumn[] = [
792
960
 
793
961
  `0` ์€ ๊ฐ’์ด ์žˆ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ํ•˜์ดํ”ˆ์œผ๋กœ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค โ€” `0์›` ๊ทธ๋Œ€๋กœ ํ‘œ์‹œํ•œ๋‹ค.
794
962
 
963
+ #### ๋ผ๋ฒจ๋งŒ์œผ๋กœ ๋œป์ด ์•ˆ ํ†ตํ•˜๋Š” ์ปฌ๋Ÿผ์€ `helpText`
964
+
965
+ ํ—ค๋” ๋ผ๋ฒจ์€ ์ปฌ๋Ÿผ ํญ ์•ˆ์— ๋“ค์–ด๊ฐ€์•ผ ํ•ด์„œ ์งง์•„์ง„๋‹ค. **์‚ฐ์ถœ ๊ธฐ์ค€ยท๋‹จ์œ„ยท์ƒํƒœ ๊ฐ’์˜ ๋œป์ฒ˜๋Ÿผ ๋ผ๋ฒจ์— ๋‹ด๊ธฐ์ง€ ์•Š๋Š” ์„ค๋ช…์€ `column.helpText` ๋กœ ์ค€๋‹ค** โ€” ๋ผ๋ฒจ ๋’ค์— ๋„์›€๋ง ์•„์ด์ฝ˜์ด ๋ถ™๊ณ  hover ํ•˜๋ฉด ํˆดํŒ์ด ๋œฌ๋‹ค. ๋ฐฐ์—ด์˜ ๊ฐ ํ•ญ๋ชฉ์ด ํ•œ ์ค„์ด๋‹ค. `SKeyValueTable` ์˜ `field.helpText`, `SSectionHeaderCard` ์˜ `helpText` ์™€ ๊ฐ™์€ ๊ฒƒ์ด๋‹ค.
966
+
967
+ ํŒ๋‹จ ๊ธฐ์ค€ ํ•œ ์ค„: *์ปฌ๋Ÿผ ์ œ๋ชฉ์ด ์ค„์ž„๋งยท์‚ฌ๋‚ด ์šฉ์–ดยท๊ณ„์‚ฐ์‹์ด๊ฑฐ๋‚˜, ๊ฐ’์ด ์•„๋‹ˆ๋ผ ์—ด ์ž์ฒด์˜ ์„ค๋ช…์ด ํ•„์š”ํ•  ๋•Œ ํ—ค๋”์— ๋‹จ๋‹ค.*
968
+
969
+ ```tsx
970
+ const columns: STableColumn[] = [
971
+ { name: 'orderCount', label: '์ฃผ๋ฌธ ์ˆ˜', field: 'orderCount', width: 120, align: 'right',
972
+ helpText: ['์ทจ์†Œยท๋ฐ˜ํ’ˆ์„ ์ œ์™ธํ•œ ํ™•์ • ์ฃผ๋ฌธ ์ˆ˜์ž…๋‹ˆ๋‹ค.'],
973
+ format: (v: number) => `${Number(v).toLocaleString()}๊ฑด` },
974
+ { name: 'status', label: '์ƒํƒœ', field: 'status', width: 100, align: 'center',
975
+ helpText: ['ํ™œ์„ฑ: ์ตœ๊ทผ 30์ผ ๋‚ด ์ฃผ๋ฌธ ์žˆ์Œ', '๋ณด๊ด€๋จ: ๊ฑฐ๋ž˜ ์ข…๋ฃŒ'] },
976
+ ];
977
+ ```
978
+
979
+ - **`renderHeader` ๋กœ ํ—ค๋”๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด `STooltip` ์„ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค.** `renderHeader` ๋Š” ํ—ค๋” ์ „์ฒด๋ฅผ ๊ต์ฒดํ•˜๋ฏ€๋กœ `helpText` ๊ฐ€ ๋ฌด์‹œ๋˜๊ณ , ์•„์ด์ฝ˜ยทํฌ๊ธฐยท์ƒ‰ยท๊ฐ„๊ฒฉ์„ ์†์œผ๋กœ ๋งž์ถ”๊ฒŒ ๋œ๋‹ค.
980
+ - **๋ชจ๋“  ์ปฌ๋Ÿผ์— ๋‹ฌ์ง€ ์•Š๋Š”๋‹ค.** ๋ผ๋ฒจ๋กœ ๋œป์ด ํ†ตํ•˜๋Š” ์ปฌ๋Ÿผ(`์ฃผ๋ฌธ๋ฒˆํ˜ธ`ยท`์ƒํ’ˆ๋ช…`)๊นŒ์ง€ ๋ถ™์ด๋ฉด ํ—ค๋”๊ฐ€ ์•„์ด์ฝ˜์œผ๋กœ ๋’ค๋ฎ์—ฌ ์ •์ž‘ ์„ค๋ช…์ด ํ•„์š”ํ•œ ์ปฌ๋Ÿผ์ด ๋ฌปํžŒ๋‹ค.
981
+ - ๊ธด ๋ฌธ์žฅ์„ ๋„ฃ๋Š” ์ž๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋‹ค. ํ•œ ์ค„์— ํ•œ ๊ฐ€์ง€ ์‚ฌ์‹ค๋งŒ ๋‹ด๊ณ , ๊ทธ ์ด์ƒ์€ ํŽ˜์ด์ง€ ์ƒ๋‹จ ์•ˆ๋‚ด(`SCallout`)๋กœ ๋บ€๋‹ค.
982
+ - ์•„์ด์ฝ˜๋„ ํญ์„ ๋จน๋Š”๋‹ค โ€” ํ—ค๋” ํญ ๊ณ„์‚ฐ์— ๋„ฃ๋Š”๋‹ค.
983
+
984
+ #### ํ—ค๋”์— ๋ถ™๋Š” ๊ฒƒ๋“ค์˜ ์ˆœ์„œ ยท ์—ด์„ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฃจ๋Š”์ง€ ์•Œ๋ฆฌ๋Š” ํ‘œ์‹
985
+
986
+ ํ—ค๋” ๋ผ๋ฒจ ๋’ค์— ๋ถ™๋Š” ๊ฒƒ์€ ๋„ค ๊ฐ€์ง€๊ณ , **์ˆœ์„œ๋Š” `STable` ์ด ๊ณ ์ •ํ•œ๋‹ค.** ์†Œ๋น„ ์•ฑ์ด ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.
987
+
988
+ ```text
989
+ ๋ผ๋ฒจ [helpText ?] [editable] [navigable] [required *] [sortable ์ •๋ ฌ๋ฒ„ํŠผ]
990
+ ```
991
+
992
+ **`editable` ์€ ๊ฐ’์„ ์ง์ ‘ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” ์—ด, `navigable` ์€ ๋ˆŒ๋Ÿฌ์„œ ๋‹ค๋ฅธ ํ™”๋ฉด์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ์—ด์— ์ค€๋‹ค.** ๋‘˜ ๋‹ค **ํ‘œ์‹์ผ ๋ฟ ๋ฒ„ํŠผ์ด ์•„๋‹ˆ๋‹ค** โ€” ์•„์ด์ฝ˜ยทํฌ๊ธฐยท์ƒ‰์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ณ ์ •ํ•˜๊ณ  ํด๋ฆญ์€ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
993
+
994
+ ```tsx
995
+ const columns: STableColumn[] = [
996
+ { name: 'name', label: '์ƒํ’ˆ๋ช…', field: 'name', width: 200,
997
+ navigable: true,
998
+ render: (row: SRow) => <STextLink label={row.name} onClick={() => goDetail(row.id)} /> },
999
+ { name: 'stock', label: '์žฌ๊ณ ', field: 'stock', width: 160, contentType: 'control',
1000
+ editable: true, required: true,
1001
+ render: (row: SRow) => <SNumberInput value={row.stock} width="100%" /> },
1002
+ ];
1003
+ ```
1004
+
1005
+ - **์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒ ๋™์ž‘ํ•˜๋Š” ์—ด์—๋งŒ ์ผ ๋‹ค.** ํ‘œ์‹๋งŒ ์ผœ๊ณ  ์…€์€ ํ…์ŠคํŠธ ๊ทธ๋Œ€๋กœ ๋‘๋ฉด, ๊ณ ์น  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ด ๋†“๊ณ  ๊ณ ์น  ๋ฐฉ๋ฒ•์ด ์—†๊ณ  ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ด ๋†“๊ณ  ๋ˆ„๋ฅผ ๊ฒƒ์ด ์—†๋‹ค. `editable` ์ด๋ฉด ์…€์— ์ž…๋ ฅ ์ปจํŠธ๋กค์ด, `navigable` ์ด๋ฉด ์…€์— ๋งํฌยทํด๋ฆญ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
1006
+ - **ํ‘œ์‹์œผ๋กœ ๋™์ž‘์„ ๋Œ€์‹ ํ•˜์ง€ ์•Š๋Š”๋‹ค.** ๊ณ ์น˜๋Š” UI ๋„ ๋„˜์–ด๊ฐ€๋Š” ๋™์ž‘๋„ ์…€(`column.render`) ๋ชซ์ด๋‹ค.
1007
+ - **`renderHeader` ๋กœ ํ—ค๋”๋ฅผ ํ†ต์งธ๋กœ ๊ต์ฒดํ•˜๋ฉด ํ‘œ์‹๋„ `required` ๋„ ๊ทธ๋ ค์ง€์ง€ ์•Š๋Š”๋‹ค** โ€” ํ—ค๋” ์ „์ฒด๊ฐ€ ์†Œ๋น„ ์•ฑ ์ฑ…์ž„์ด ๋˜๋ฏ€๋กœ ์ˆœ์„œยทํฌ๊ธฐยท์ƒ‰์„ ์†์œผ๋กœ ๋งž์ถ”๊ฒŒ ๋œ๋‹ค.
1008
+
1009
+ **๊ฐ’์„ ๋ฐ˜๋“œ์‹œ ์ฑ„์›Œ์•ผ ํ•˜๋Š” ์—ด์—๋Š” `column.required`** ๋ฅผ ์ค€๋‹ค โ€” ๋ผ๋ฒจ ๋’ค์— `*` ๊ฐ€ ๋ถ™๋Š”๋‹ค. `SKeyValueTable` ์˜ `field.required` ์™€ ๊ฐ™์€ ๊ฒƒ์ด๋‹ค. **์ฝ๊ธฐ ์ „์šฉ ์—ด์— ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค** โ€” ํ‘œ์‹œ๋งŒ ์žˆ๊ณ  ์ฑ„์šธ ๋ฐฉ๋ฒ•์ด ์—†์–ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ง‰ํžŒ๋‹ค.
1010
+
795
1011
  ### 3-5. ๋ฒ„ํŠผ๋ฅ˜
796
1012
 
797
1013
  | ์ƒํ™ฉ | ์‚ฌ์šฉ |
@@ -801,6 +1017,7 @@ const columns: STableColumn[] = [
801
1017
  | **์•„์ด์ฝ˜ ํ•˜๋‚˜๋กœ ๋œป์ด ํ†ตํ•˜๋Š” ๋ถ€๊ฐ€ ์กฐ์ž‘** | **`SGhostButton`** โ€” ๋ผ๋ฒจ์ด ์—†๋Š” ์•„์ด์ฝ˜ ์ „์šฉ ๋ฒ„ํŠผ (์•„๋ž˜ 3-5-5) |
802
1018
  | ๋ณธ๋ฌธ ์† ์ด๋™ ๋งํฌ | `STextLink` |
803
1019
  | ๋ฉ”์ธ ์•ก์…˜ + ๋ถ€๊ฐ€ ๋ฉ”๋‰ด | `SDropdownButton` |
1020
+ | **GNB system ํŒจ๋„์˜ ํ•œ ์ค„ ์•ก์…˜** | **`SSystemActionButton`** โ€” ํ–‰ ์ „์ฒด๊ฐ€ ๋ฒ„ํŠผ์ธ ํ‘œ๋ฉดํ˜• (์•„๋ž˜ 3-5-7) |
804
1021
 
805
1022
  #### 3-5-1. ์ฑ„์›€ ๋ฒ„ํŠผ์€ ํŽ˜์ด์ง€๋‹น ๊ฐœ์ˆ˜ ์ œํ•œ์ด ์žˆ๋‹ค
806
1023
 
@@ -815,6 +1032,19 @@ const columns: STableColumn[] = [
815
1032
 
816
1033
  `SDropdownButton` ๋„ ๊ฐ™์€ ๊ทœ์น™์„ ๋”ฐ๋ฅด๋ฉฐ, **ํŽ˜์ด์ง€๋‹น `primary` ์ฑ„์›€ 1๊ฐœ ๊ณ„์‚ฐ์— ํฌํ•จ**๋œ๋‹ค.
817
1034
 
1035
+ ##### ๋ฌด์—‡์ด ์–ด๋А ์œ„๊ณ„์ธ๊ฐ€
1036
+
1037
+ ๊ฐœ์ˆ˜๋งŒ์œผ๋กœ๋Š” ํ›„๋ณด๊ฐ€ ์—ฌ๋Ÿฟ์ผ ๋•Œ ์–ด๋А ๊ฒƒ์„ ์˜ฌ๋ฆด์ง€ ๊ฐˆ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ๊ธฐ์ค€์€ **๊ทธ ์กฐ์ž‘์ด ๋ฌด์—‡์— ๋ฏธ์น˜๋Š”๊ฐ€**๋‹ค.
1038
+
1039
+ | ์œ„๊ณ„ | ๋ฌด์—‡์— ์“ฐ๋‚˜ |
1040
+ | --- | --- |
1041
+ | `primary` ์ฑ„์›€ | **ํŽ˜์ด์ง€ ์ „์ฒด์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ •**ํ•˜๋Š” ์‹คํ–‰ (ํผ ์ €์žฅ, ์ƒ์„ธ ์ˆ˜์ • ํ™•์ •, ์ผ๊ด„ ๋ฐ˜์˜) |
1042
+ | `secondary` ์ฑ„์›€ | **ํŽ˜์ด์ง€ ์•ˆ ์ค‘์‹ฌ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ** (์„ ํƒ ํ•ญ๋ชฉ ์ƒํƒœ ๋ณ€๊ฒฝ, ๋ฐœ์†ก, ์Šน์ธ) |
1043
+ | `outline` (`neutral` ยท `primary`) | ๋‹จ์ˆœ ๋“ฑ๋ก, ์„ค์ • ๋ณ€๊ฒฝ, ์ด๋™ยท์ทจ์†Œ |
1044
+
1045
+ - **`primary` ์ฑ„์›€์€ ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ์‹คํ–‰ ํ•˜๋‚˜์—๋งŒ ์“ด๋‹ค. ๊ทธ๋Ÿฐ ์กฐ์ž‘์ด ์—†์œผ๋ฉด ํŽ˜์ด์ง€์— `primary` ๊ฐ€ ์—†์–ด๋„ ๋œ๋‹ค.** ๊ฐœ์ˆ˜ ์ œํ•œ์ด "๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค"๋Š” ๋œป์€ ์•„๋‹ˆ๋‹ค.
1046
+ - **`secondary` ์—ฐ์† ๋ฐฐ์น˜ ๊ธˆ์ง€๋Š” ์„น์…˜์ด ๋‹ค๋ฅด๋ฉด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.** ์„น์…˜๋งˆ๋‹ค ๋…๋ฆฝ ์ธ๋ผ์ธ ํผ์ด ์žˆ๋Š” ์ƒ์„ธ ํŽ˜์ด์ง€(ยง4-4)๊ฐ€ ๊ทธ๋ ‡๋‹ค โ€” ๋‚˜๋ž€ํžˆ ๋†“์ธ ๋‘ ๋ฒ„ํŠผ์ด ๊ฐ™์€ ํŒ๋‹จ ๋‹จ์œ„ ์•ˆ์— ์žˆ์„ ๋•Œ์˜ ๊ทœ์น™์ด๋‹ค.
1047
+
818
1048
  #### 3-5-2. `size` ๋Š” ๋†“์ด๋Š” ์œ„์น˜๊ฐ€ ์ •ํ•œ๋‹ค
819
1049
 
820
1050
  | ์œ„์น˜ | size |
@@ -920,6 +1150,35 @@ const columns: STableColumn[] = [
920
1150
  </div>
921
1151
  ```
922
1152
 
1153
+ #### 3-5-7. `SSystemActionButton` โ€” GNB system ํŒจ๋„์˜ ํ•œ ์ค„ ์•ก์…˜
1154
+
1155
+ **ํ–‰ ์ „์ฒด๊ฐ€ ํ•˜๋‚˜์˜ ๋ฒ„ํŠผ**์ธ ํ‘œ๋ฉดํ˜• ์ปจํŠธ๋กค์ด๋‹ค. ์•„์ด์ฝ˜ ํ”„๋ ˆ์ž„ + ๋ผ๋ฒจ + ์šฐ์ธก ์•ก์…˜์ด ํ•œ ์ค„์— ๋ถ™๊ณ , hover ํ•˜๋ฉด ํ‘œ๋ฉด์ƒ‰์ด ํ•œ ๋‹จ๊ณ„ ๋ฐ”๋€๋‹ค.
1156
+
1157
+ | ์ƒํ™ฉ | ์‚ฌ์šฉ |
1158
+ | --- | --- |
1159
+ | ํŽ˜์ด์ง€ยท๋ชจ๋‹ฌ์˜ ์ผ๋ฐ˜ ์•ก์…˜ | `SButton` โ€” ๋ผ๋ฒจ ํญ๋งŒํผ๋งŒ ์ฐจ์ง€ํ•œ๋‹ค |
1160
+ | ๋ชฉ๋ก์—์„œ ํ•ญ๋ชฉ ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅด๊ฒŒ ํ•œ๋‹ค | `SListItem` ยท `STree` (ยง3-7-6ยทยง3-7-7) |
1161
+ | ์ขŒ์ธก ๋‚ด๋น„๊ฒŒ์ด์…˜์˜ ๋ฉ”๋‰ด | `SGnb` ์˜ `menus` (ยง4-1) |
1162
+ | **GNB system ํŒจ๋„์—์„œ ์„ค์ •ยท์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ํ•œ ์ค„์”ฉ ์Œ“๊ณ , ๊ทธ ์ค„์„ ๋ˆŒ๋Ÿฌ ๋“ค์–ด๊ฐ€๊ฒŒ ํ•œ๋‹ค** | **`SSystemActionButton`** |
1163
+
1164
+ **๋ฌด์—‡์ด ๊ทธ๋ ค์ง€๋Š”์ง€๋Š” `type` ์ด ์ •ํ•œ๋‹ค.** ํƒ€์ž…๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฐ’๋งŒ `option` ์œผ๋กœ ๋ฐ›์œผ๋ฏ€๋กœ, ํƒ€์ž…์— ๋งž์ง€ ์•Š๋Š” `option` ์€ ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ๋œ๋‹ค.
1165
+
1166
+ | `type` | ์„ ํ–‰ ์•„์ด์ฝ˜ | ๋ผ๋ฒจ | ์šฐ์ธก | ์–ธ์ œ |
1167
+ | --- | --- | --- | --- | --- |
1168
+ | `account` | `user` ๊ณ ์ • | `label` | ์—†์Œ | ๋กœ๊ทธ์ธํ•œ ๊ณ„์ •์„ ๋ณด์—ฌ์ฃผ๊ณ  ๊ณ„์ • ํ™”๋ฉด์œผ๋กœ ๋ณด๋‚ผ ๋•Œ |
1169
+ | `select` | `option.icon` (ํ•„์ˆ˜) | `label` | ํ™”์‚ดํ‘œ | ๋ˆŒ๋Ÿฌ์„œ ํ•˜์œ„ ํ™”๋ฉด์œผ๋กœ ๋“ค์–ด๊ฐˆ ๋•Œ |
1170
+ | `switch` | `option.icon` (ํ•„์ˆ˜) | `label` | `option.text` + ์ƒˆ๋กœ๊ณ ์นจ | ์ง€๊ธˆ ๋ถ™์–ด ์žˆ๋Š” ๋Œ€์ƒ์„ ๊ฐˆ์•„ ๋ผ์šธ ๋•Œ |
1171
+ | `subSelect` | `option.icon` (ํ•„์ˆ˜) | `label` | `option.text` + ํ™”์‚ดํ‘œ | ์ง€๊ธˆ ์„ ํƒ๋ผ ์žˆ๋Š” ๊ฐ’์„ ํ•จ๊ป˜ ๋ณด์—ฌ์ค„ ๋•Œ |
1172
+ | `status` | ์—†์Œ | ์ƒํƒœ ํƒœ๊ทธ(`option.color`ยท`option.label`) | ํ™”์‚ดํ‘œ | ๋ผ๋ฒจ ๋Œ€์‹  ์ƒํƒœ ์ž์ฒด๊ฐ€ ์ œ๋ชฉ์ผ ๋•Œ |
1173
+
1174
+ - **`SPage` ๋ณธ๋ฌธ์— ์ง์ ‘ ๋†“์ง€ ์•Š๋Š”๋‹ค.** ํญ์„ ๊ฐ€๋“ ์ฑ„์šฐ๋Š” ํ–‰์ด๋ผ ํŽ˜์ด์ง€์— ๋ฐ”๋กœ ๋†“์œผ๋ฉด ํ‘œ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. GNB system ํŒจ๋„ยท`SDrawer`ยท`SPopover` ์ฒ˜๋Ÿผ **์ข์€ ํญ์ด ์ •ํ•ด์ง„ ์ž๋ฆฌ**์— ์Œ“๋Š”๋‹ค. ํ–‰ ์‚ฌ์ด ๊ฐ„๊ฒฉ์€ `--cmp-gnb-system-panel-gap` ์ด๋‹ค.
1175
+ - **GNB ๋งจ ์•„๋ž˜์— ์Œ“๋Š” ๊ฒƒ์ด๋ผ๋ฉด ์ด ๋ฒ„ํŠผ์„ ์ง์ ‘ ๋ฐฐ์น˜ํ•˜์ง€ ๋ง๊ณ  `SGnbSystem` ์˜ `actions` ์— ๋„˜๊ธด๋‹ค** (ยง4-1). ํŒจ๋„์˜ ๋ฐฐ๊ฒฝยท๊ตฌ๋ถ„์„ ยท๋„๋ฉ”์ธ ํƒœ๊ทธยท์•Œ๋ฆผยท๊ณ„์ •๊นŒ์ง€ ํ•œ ๋ฒŒ๋กœ ๊ทธ๋ ค์ฃผ๋ฏ€๋กœ, ์กฐ๊ฐ์„ ์†์œผ๋กœ ์กฐ๋ฆฝํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค.
1176
+ - **`color` ๋Š” ๋†“์ด๋Š” ํ‘œ๋ฉด์„ ๋”ฐ๋ผ๊ฐ„๋‹ค** โ€” ํฐ ๋ฉด์ด๋ฉด `light`, ์˜ค์…˜๋ธ”๋ฃจ ๋ฉด์ด๋ฉด `dark`, ๋„ค์ด๋น„ ๋ฉด์ด๋ฉด `darker`. ๋ฐฐ๊ฒฝ๊ณผ ๋‹ค๋ฅธ ์ƒ‰์„ ๊ณ ๋ฅด๋ฉด ๋ฒ„ํŠผ๋งŒ ๋–  ๋ณด์ธ๋‹ค.
1177
+ - **์ƒํƒœ๋Š” defaultยทhover ๋‘˜๋ฟ์ด๋‹ค.** ํ† ํฐ์— selected ๊ฐ€ ์—†์œผ๋ฏ€๋กœ "์ง€๊ธˆ ์—ด๋ ค ์žˆ๋Š” ํ•ญ๋ชฉ"์„ ์ด ๋ฒ„ํŠผ์œผ๋กœ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค. ์„ ํƒ ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•œ ์ž๋ฆฌ๋ฉด `SGnb` ๋ฉ”๋‰ด๋‚˜ `SListItem`(ยง3-7-6) ์ด๋‹ค.
1178
+ - **์„ ํ–‰ ์•„์ด์ฝ˜์ด ๋น„๋Š” ํ–‰์€ ์—†๋‹ค.** `account` ๋Š” `user` ๊ณ ์ •, `status` ๋Š” ํƒœ๊ทธ๊ฐ€ ์ž๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ณ , ๋‚˜๋จธ์ง€๋Š” `option.icon` ์ด ํ•„์ˆ˜๋‹ค.
1179
+ - **์šฐ์ธก ์•„์ด์ฝ˜์€ `type` ์ด ์ •ํ•˜๋ฏ€๋กœ ๋ฐ–์—์„œ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค.** ํ™”์‚ดํ‘œ๊ฐ€ ํ•„์š”ํ•œ๋ฐ ๋ฌธ๊ตฌ๊ฐ€ ์—†์œผ๋ฉด `select`, ๋ฌธ๊ตฌ๊ฐ€ ํ•จ๊ป˜ ํ•„์š”ํ•˜๋ฉด `subSelect` ๋‹ค.
1180
+ - ๋†’์ดยท๋ผ์šด๋“œยท์•„์ด์ฝ˜ ํฌ๊ธฐยท์ขŒ์šฐ ์—ฌ๋ฐฑ์€ ์ „๋ถ€ ํ† ํฐ์ด ๋„ฃ๋Š”๋‹ค. ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
1181
+
923
1182
  ### 3-6. ์˜์—ญ ๋‚˜๋ˆ„๊ธฐ โ€” SDivider vs SSplitter
924
1183
 
925
1184
  | ์ƒํ™ฉ | ์‚ฌ์šฉ |
@@ -929,6 +1188,25 @@ const columns: STableColumn[] = [
929
1188
 
930
1189
  `SSplitter` ์˜ ๊ตฌ๋ถ„์„ ์€ ํ‰์†Œ ์ž๋ฆฌ๋งŒ ์žก๊ณ  ์น ํ•ด์ง€์ง€ ์•Š๋‹ค๊ฐ€, ๊ฒฝ๊ณ„์— ์ปค์„œ๋ฅผ ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜ ํฌ์ปค์Šค๋ฅผ ์ฃผ๋ฉด ๊ทธ๋•Œ ๋“œ๋Ÿฌ๋‚œ๋‹ค โ€” ์กฐ์ ˆ ๊ฐ€๋Šฅํ•œ ์ž๋ฆฌ๋ผ๋Š” ์‹ ํ˜ธ๋‹ค. **ํ•ญ์ƒ ๋ณด์ด๋Š” ์„ ์ด ํ•„์š”ํ•˜๋ฉด `SDivider` ๋ฅผ ์“ด๋‹ค.** ์„  ์ƒ‰ยท๋‘๊ป˜ยท์ฃผ๋ณ€ ์—ฌ๋ฐฑ์€ ํ† ํฐ์ด ์ •ํ•˜๋ฏ€๋กœ ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
931
1190
 
1191
+ **์„ธ๋กœ ๊ตฌ๋ถ„์„ ์˜ ๊ธธ์ด๋Š” `height` prop ์œผ๋กœ ์ค€๋‹ค โ€” `className` ์˜ `h-*` ๋กœ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.**
1192
+
1193
+ ```tsx
1194
+ // ์ค„ ๋†’์ด๋ฅผ ๊ทธ๋Œ€๋กœ ์ฑ„์šด๋‹ค (๊ธฐ๋ณธ)
1195
+ <div className="flex items-center gap-sd-8">
1196
+ <span>์ด ์ฃผ๋ฌธ 3๊ฑด</span>
1197
+ <SDivider vertical />
1198
+ <span>์ด ํ’ˆ๋ชฉ 12๊ฑด</span>
1199
+ </div>
1200
+
1201
+ // ์–‘์˜† ๊ธ€์ž๋ณด๋‹ค ์งง์€ ์„ ์ด ํ•„์š”ํ•  ๋•Œ๋งŒ ๊ธธ์ด๋ฅผ ์ •ํ•œ๋‹ค
1202
+ <SDivider vertical height={20} />
1203
+
1204
+ // ํ•˜์ง€ ๋ง ๊ฒƒ โ€” ์„ ์ด ์ค„ ๋งจ ์œ„์— ๋ถ™๋Š”๋‹ค
1205
+ <SDivider vertical className="h-sd-20" />
1206
+ ```
1207
+
1208
+ ๊ธธ์ด๋ฅผ ์ฃผ์ง€ ์•Š์œผ๋ฉด `align-self: stretch` ๋กœ ๋ถ€๋ชจ ์ค„ ๋†’์ด๋ฅผ ์ฑ„์šฐ๋Š”๋ฐ, `stretch` ๋Š” ๋†’์ด๊ฐ€ `auto` ์ผ ๋•Œ๋งŒ ๋Š˜๋ฆฐ๋‹ค. `className` ์œผ๋กœ ๋†’์ด๋ฅผ ์ •ํ•˜๋ฉด `stretch` ๊ฐ€ ์กฐ์šฉํžˆ ๋ฌดํšจ๊ฐ€ ๋˜์–ด ์„ ์ด ์œ„๋กœ ์†Ÿ๋Š”๋‹ค. `height` ๋Š” ๊ธธ์ด์™€ ๊ต์ฐจ์ถ• ๊ฐ€์šด๋ฐ ์ •๋ ฌ์„ ํ•จ๊ป˜ ์ ์šฉํ•˜๋ฏ€๋กœ ์ด ํ•จ์ •์ด ์—†๋‹ค โ€” ์œ„ยท์•„๋ž˜ ์ •๋ ฌ์ด ํ•„์š”ํ•˜๋ฉด `className="self-start"` ์ฒ˜๋Ÿผ ๋ช…์‹œํ•œ๋‹ค. (`sellmate/divider-vertical-height` ๊ทœ์น™์ด ์žก๋Š”๋‹ค.)
1209
+
932
1210
  ```tsx
933
1211
  <SSplitter defaultValue={30} limits={[20, 60]}>
934
1212
  <SSplitter.Before>๋‚ด๋น„๊ฒŒ์ด์…˜</SSplitter.Before>
@@ -959,18 +1237,42 @@ const columns: STableColumn[] = [
959
1237
 
960
1238
  > ยง3-0 ๋ผ์šฐํŒ…์—์„œ ์ด ์ ˆ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ž๋ฆฌ๋“ค์ด๋‹ค. <!-- TODO(๋””์ž์ธ): ์ „์ฒด ๊ฒ€์ˆ˜ยทํ™•์ • -->
961
1239
 
962
- #### 3-7-1. SInput vs STextarea
1240
+ #### 3-7-1. SInput vs STextarea vs SEditor vs SSearchInput
963
1241
 
964
- **์ค„ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ’์˜ ์„ฑ๊ฒฉ์œผ๋กœ ๊ณ ๋ฅธ๋‹ค.** ๊ฐ’์˜ ๊ธธ์ด๋ฅผ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉด `SInput`, ์—†์œผ๋ฉด `STextarea` ๋‹ค.
1242
+ **๋จผ์ € "๊ทธ ๊ฐ’์ด ์ €์žฅ๋˜๋Š”๊ฐ€"๋ฅผ ๋ณธ๋‹ค.** ์ €์žฅ๋˜๋ฉด ํผ ํ•„๋“œ(`SInput`ยท`STextarea`), ํ™”๋ฉด์„ ์ขํžˆ๊ธฐ๋งŒ ํ•˜๊ณ  ์‚ฌ๋ผ์ง€๋ฉด `SSearchInput` ์ด๋‹ค.
965
1243
 
966
1244
  | ๊ฐ’ | ์‚ฌ์šฉ |
967
1245
  | --- | --- |
968
1246
  | ์ด๋ฆ„ยท์ฝ”๋“œยท์ „ํ™”๋ฒˆํ˜ธยทURL ์ฒ˜๋Ÿผ ํ˜•์‹์ด ์ •ํ•ด์ง„ ๊ฐ’ | `SInput` |
969
1247
  | ๋ฉ”๋ชจยท์‚ฌ์œ ยท์„ค๋ช…์ฒ˜๋Ÿผ ๊ธธ์ด๊ฐ€ ์˜ˆ์ธก๋˜์ง€ ์•Š๋Š” ๋ฌธ์žฅ | `STextarea` |
1248
+ | ์„œ์‹(์ œ๋ชฉยท๊ตต๊ฒŒยท๋ชฉ๋กยท์ •๋ ฌยท์ƒ‰ยท๋งํฌยท์ด๋ฏธ์ง€)์ด ๊ฐ’์˜ ์ผ๋ถ€๋กœ ์ €์žฅ๋˜์–ด์•ผ ํ•˜๋Š” ๊ธ€ | `SEditor` |
1249
+ | ์ง€๊ธˆ ๋ณด์ด๋Š” ๋ชฉ๋กยท๊ฒฐ๊ณผ๋ฅผ ์ขํžˆ๋Š” ๊ฒ€์ƒ‰์–ด | `SSearchInput` |
1250
+
1251
+ ํผ ํ•„๋“œ ๋‘˜์€ **์ค„ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ’์˜ ์„ฑ๊ฒฉ์œผ๋กœ** ๊ฐˆ๋ฆฐ๋‹ค. ๊ฐ’์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ `SInput` ์„ ์“ฐ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ž๊ธฐ๊ฐ€ ์“ด ๊ฒƒ์„ ๋‹ค์‹œ ์ฝ์ง€ ๋ชปํ•œ๋‹ค โ€” ํ•œ ์ค„ ์•ˆ์—์„œ ์ขŒ์šฐ๋กœ ์Šคํฌ๋กคํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฐ˜๋Œ€๋กœ ์งง์€ ๊ฐ’์— `STextarea` ๋ฅผ ์“ฐ๋ฉด ๋นˆ ๊ณต๊ฐ„์ด ๋‚จ์•„ ์ž…๋ ฅ๋Ÿ‰์„ ์ž˜๋ชป ๊ธฐ๋Œ€ํ•˜๊ฒŒ ํ•œ๋‹ค.
1252
+
1253
+ `SEditor` ๋Š” **์„œ์‹์ด ๊ฐ’์˜ ์ผ๋ถ€์ผ ๋•Œ๋งŒ** ์“ด๋‹ค. ๊ฐ’์„ HTML ๋ฌธ์ž์—ด๋กœ ์ฃผ๊ณ ๋ฐ›์œผ๋ฏ€๋กœ ์ €์žฅยท๊ฒ€์ƒ‰ยท๋น„๊ต๊ฐ€ ํ‰๋ฌธ๋ณด๋‹ค ๋น„์‹ธ๊ณ , ํ™”๋ฉด์— ๋‹ค์‹œ ๋ณด์—ฌ์ค„ ๋•Œ๋„ HTML ๋กœ ๋ Œ๋”ํ•ด์•ผ ํ•œ๋‹ค. ์„œ์‹์ด ํ•„์š” ์—†๋Š” ๋ฉ”๋ชจยท์‚ฌ์œ ๋Š” `STextarea` ๋‹ค โ€” "์ž…๋ ฅ์ฐฝ์ด ์ปค ๋ณด์—ฌ์„œ" ๊ณ ๋ฅด๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๊ณต์ง€ยท์•ˆ๋‚ด๋ฌธยท์ƒํ’ˆ ์ƒ์„ธ์ฒ˜๋Ÿผ **์ž‘์„ฑ์ž๊ฐ€ ์ •ํ•œ ๊ฐ•์กฐ์™€ ๋ชฉ๋ก์ด ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ๊ธ€**์ด๋ฉด `STextarea` ๋กœ๋Š” ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋‹ค.
970
1254
 
971
- ๊ฐ’์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ `SInput` ์„ ์“ฐ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ž๊ธฐ๊ฐ€ ์“ด ๊ฒƒ์„ ๋‹ค์‹œ ์ฝ์ง€ ๋ชปํ•œ๋‹ค โ€” ํ•œ ์ค„ ์•ˆ์—์„œ ์ขŒ์šฐ๋กœ ์Šคํฌ๋กคํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฐ˜๋Œ€๋กœ ์งง์€ ๊ฐ’์— `STextarea` ๋ฅผ ์“ฐ๋ฉด ๋นˆ ๊ณต๊ฐ„์ด ๋‚จ์•„ ์ž…๋ ฅ๋Ÿ‰์„ ์ž˜๋ชป ๊ธฐ๋Œ€ํ•˜๊ฒŒ ํ•œ๋‹ค.
1255
+ `SEditor` ๋„ `SInput`ยท`STextarea` ์™€ ๊ฐ™์€ ํผ ํ•„๋“œ๋‹ค โ€” `label`ยท`hint`ยท`rules`ยท`errorMessage` ๋ฅผ ์ž๊ธฐ prop ์œผ๋กœ ๋ฐ›๊ณ  `SForm` ์ œ์ถœ ๊ฒ€์ฆ์—๋„ ๋“ค์–ด๊ฐ„๋‹ค. ๋นˆ ๋ฌธ์„œ๋Š” ๋นˆ ๋ฌธ์ž์—ด๋กœ ๋‚˜์˜ค๋ฏ€๋กœ `required` ๊ทœ์น™์ด ๊ทธ๋Œ€๋กœ ๊ฑธ๋ฆฐ๋‹ค. **ํˆด๋ฐ”๋ฅผ ๋„๋Š” ๊ธธ์€ ์—†๋‹ค** โ€” ์„œ์‹ ์ž…๋ ฅ์ด ํ•„์š” ์—†๋Š” ์ž๋ฆฌ๋ผ๋ฉด ์„œ์‹ ์—†๋Š” `SEditor` ๊ฐ€ ์•„๋‹ˆ๋ผ `STextarea` ๋ฅผ ๊ณ ๋ฅธ๋‹ค.
972
1256
 
973
- #### 3-7-2. ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅด๊ฒŒ ํ•˜๋Š” ๋‹ค์„ฏ โ€” SSelect vs SRadioGroup vs SRadioButton vs STabs vs SRadio
1257
+ ํˆด๋ฐ”๋Š” **ํ”„๋ฆฌ์…‹ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฟ์ด๋‹ค.** ๊ธฐ๋ณธ์€ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๋ชจ๋‘ ๋ณด์ด๊ณ , **`simple` ์„ ์ผœ๋ฉด ๊ธ€์ž์— ๊ฑฐ๋Š” ์„œ์‹๋งŒ ๋‚จ๋Š”๋‹ค** โ€” ๋ชฉ๋กยท์ •๋ ฌยท์ธ์šฉยท์ฝ”๋“œยท๋งํฌยท์ด๋ฏธ์ง€ยท๊ตฌ๋ถ„์„ ์ด ๋น ์ง€๊ณ  ์„ ํƒํ–ˆ์„ ๋•Œ ๋œจ๋Š” ํŒ๋„ ๊ฐ™์€ ๋ฒ”์œ„๋กœ ์ค„์–ด๋“ ๋‹ค. ๋ฐ›์€ ๊ธ€์˜ **๋ฌธ๋‹จ ๊ตฌ์กฐ๊นŒ์ง€ ์ž‘์„ฑ์ž๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉด ๊ณค๋ž€ํ•œ ์ž๋ฆฌ**(์ข์€ ์นธ์˜ ๋ฉ”๋ชจยท์‚ฌ์œ ยท์งง์€ ์•ˆ๋‚ด๋ฌธ)๊ฐ€ `simple` ์ด๋‹ค. ํ•ญ๋ชฉ์„ ์ง์ ‘ ์กฐํ•ฉํ•˜๋Š” prop ์€ ์—†๋‹ค โ€” ํ™”๋ฉด๋งˆ๋‹ค ๋‹ค๋ฅธ ํˆด๋ฐ”๊ฐ€ ์„œ๋ฉด ๊ทธ ์ž์ฒด๊ฐ€ ํ•™์Šต ๋น„์šฉ์ด ๋œ๋‹ค.
1258
+
1259
+ ๋ณธ๋ฌธ์—์„œ ๋”ฐ์˜ดํ‘œยทํ•˜์ดํ”ˆยทํ™”์‚ดํ‘œ๋Š” **์ž๋™์œผ๋กœ ์น˜ํ™˜๋œ๋‹ค**(`"` โ†’ `โ€œโ€`, `--` โ†’ `โ€”`, `->` โ†’ `โ†’`). ๋Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ์ƒํ’ˆ ์ฝ”๋“œยท๊ทœ๊ฒฉ ๋ฌธ์ž์—ด์ฒ˜๋Ÿผ **์ž…๋ ฅํ•œ ๊ทธ๋Œ€๋กœ ๋‚จ์•„์•ผ ํ•˜๋Š” ๊ฐ’**์€ `SEditor` ๋ณธ๋ฌธ์ด ์•„๋‹ˆ๋ผ `SInput` ์œผ๋กœ ๋”ฐ๋กœ ๋ฐ›๋Š”๋‹ค.
1260
+
1261
+ ํˆด๋ฐ”๋Š” **์ž๋ฆฌ๋ฅผ ์ง€ํ‚จ๋‹ค**(๊ณ ์ •). ๊ธด ๊ธ€์„ ์“ฐ๋Š” ๋™์•ˆ ๋ง‰๋Œ€๊ฐ€ ํ™”๋ฉด ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€์ง€ ์•Š์œผ๋ฏ€๋กœ, ํˆด๋ฐ”๋ฅผ ๋”ฐ๋กœ ๊ฐ์‹ธ๊ฑฐ๋‚˜ ์œ„์น˜๋ฅผ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
1262
+
1263
+ ํˆด๋ฐ”์—๋Š” **๊ธ€์ž ํฌ๊ธฐ ๋“œ๋กญ๋‹ค์šด**๊ณผ **๊ธ€์ž์ƒ‰ ํŒ”๋ ˆํŠธ**๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค โ€” ์ž‘์„ฑ์ž๊ฐ€ ๋ฌธ๋‹จ๋งˆ๋‹ค ํฌ๊ธฐยท์ƒ‰์„ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ํฌ๊ธฐ ๋ชฉ๋ก ๋งจ ์œ„ `๊ธฐ๋ณธ` ์€ ์ง€์ •์„ ๋–ผ๋Š” ์ž๋ฆฌ๋‹ค. ํฌ๊ธฐ ๋ˆˆ๊ธˆ์€ ํ™”๋ฉด ํƒ€์ดํฌ(ยง2-1)๊ฐ€ ์•„๋‹ˆ๋ผ ์›Œ๋“œํ”„๋กœ์„ธ์„œ์˜ ๋ˆˆ๊ธˆ์ด๋ผ ๋ณธ๋ฌธ๋ณด๋‹ค ํ›จ์”ฌ ํฐ ๋‹จ๊ณ„๊นŒ์ง€ ์žˆ๋‹ค. **๋ˆˆ๊ธˆ๋„ ํŒ”๋ ˆํŠธ๋„ ์ขํžˆ๋Š” prop ์ด ์—†๋‹ค** โ€” ํ™”๋ฉด๋งˆ๋‹ค ๊ณ ๋ฅผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋‹ค๋ฅด๋ฉด ๊ฐ™์€ ๊ธ€์ด ์–ด๋””์— ๋ถ™๋А๋ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ **์ž‘์„ฑ์ž๊ฐ€ ํ™”๋ฉด ๋ฆฌ๋“ฌ์„ ๋ฒ—์–ด๋‚˜๋ฉด ๊ณค๋ž€ํ•œ ์ž๋ฆฌ(์ƒํ’ˆ ์ƒ์„ธ ์„ค๋ช…ยท๋ฐ˜๋ณต ๋…ธ์ถœ๋˜๋Š” ์•ˆ๋‚ด๋ฌธ ๋“ฑ)๋ผ๋ฉด `SEditor` ๊ฐ€ ๋งž๋Š” ์ž๋ฆฌ์ธ์ง€ ๋จผ์ € ๋ณธ๋‹ค** โ€” ์„œ์‹์ด ๊ฐ’์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด `STextarea` ๋‹ค. ๊ณ ๋ฅธ ํฌ๊ธฐยท์ƒ‰์€ ์ €์žฅ๋˜๋Š” HTML ์— ๊ทธ๋Œ€๋กœ ๋‚จ์•„ ๋‚˜์ค‘์— ๋˜๋Œ๋ฆด ์ˆ˜ ์—†๋‹ค.
1264
+
1265
+ ๋ณธ๋ฌธ์—๋Š” **ํ‘œ**๋„ ๋“ค์–ด๊ฐ„๋‹ค โ€” ํˆด๋ฐ”์˜ `ํ‘œ` ๋“œ๋กญ๋‹ค์šด์—์„œ ๊ฒฉ์ž๋ฅผ ๋Œ์–ด ํฌ๊ธฐ๋ฅผ ๊ณ ๋ฅด๊ณ (์ตœ๋Œ€ 8ํ–‰ ร— 10์—ด), ํ–‰ยท์—ด์„ ๋Š˜๋ฆฌ๊ณ , ์นธ์„ ๋ณ‘ํ•ฉํ•œ๋‹ค. **์—ด ๋„ˆ๋น„๋Š” ๊ท ๋“ฑ ๊ณ ์ •์ด๊ณ  ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค**: ๋„ˆ๋น„๋ฅผ ์ €์žฅํ•˜๋ฉด ๊ทธ ๊ฐ’์ด px ๋กœ ๋ฐ•ํ˜€ ์ž‘์„ฑํ•œ ํ™”๋ฉด๋ณด๋‹ค ์ข์€ ๊ณณ์—์„œ ํ‘œ๊ฐ€ ๋„˜์นœ๋‹ค. ๋Œ€์‹  ์–ด๋–ค ํญ์—์„œ๋„ ํ‘œ๊ฐ€ ์ƒ์ž ์•ˆ์— ๋“ค์–ด์˜ค๋„๋ก ์—ด์„ ๊ณ ๋ฅด๊ฒŒ ๋‚˜๋ˆˆ๋‹ค โ€” ์—ด์ด ๋งŽ์€ ํ‘œ๋Š” ์ข์€ ์นธ์—์„œ ๊ธ€์ž๊ฐ€ ์ž˜๊ฒŒ ์ ‘ํžˆ๋ฏ€๋กœ, **์—ด์ด ๋„ท์„ ๋„˜์–ด๊ฐ€๋Š” ํ‘œ๋ผ๋ฉด `SEditor` ๋ณธ๋ฌธ์ด ์•„๋‹ˆ๋ผ `STable` ์ด ๋งž๋Š” ์ž๋ฆฌ์ธ์ง€ ๋ณธ๋‹ค.** ํ‘œ๋Š” ์ž‘์„ฑ์ž๊ฐ€ ์“ฐ๋Š” ๊ธ€์˜ ์ผ๋ถ€์ผ ๋•Œ๋งŒ ์—ฌ๊ธฐ์— ์žˆ๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์ค„ ์„ธ์›Œ ๋ณด์—ฌ ์ฃผ๋Š” ๊ฒƒ์€ `STable` ์ด๋‹ค.
1266
+
1267
+ ๊ธ€์„ ์„ ํƒํ•˜๋ฉด **๊ทธ ์œ„์— ์„œ์‹ ํŒ์ด ๋œฌ๋‹ค**(๋ฒ„๋ธ” ๋ฉ”๋‰ด). ํˆด๋ฐ”๊นŒ์ง€ ์ปค์„œ๋ฅผ ์˜ฎ๊ธฐ์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ๊ตต๊ฒŒยท์ƒ‰ยท๋งํฌ๋ฅผ ๊ฑฐ๋Š” ๊ธธ์ด๋‹ค. **๋„๊ณ  ์ผœ๋Š” prop ์€ ์—†๋‹ค** โ€” ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์–ธ์ œ๋‚˜ ๋œจ๊ณ , ์ฝ๊ธฐ ์ „์šฉยท๋น„ํ™œ์„ฑ์ผ ๋•Œ๋Š” ๋œจ์ง€ ์•Š๋Š”๋‹ค. ํ™”๋ฉด๋งˆ๋‹ค ์žˆ๊ณ  ์—†๊ณ ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉด ๊ทธ ์ž์ฒด๊ฐ€ ํ•™์Šต ๋น„์šฉ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํŒ์˜ ๊ตฌ์„ฑ์€ `simple` ์ด ๋ง‰๋Œ€์™€ ํ•จ๊ป˜ ์ •ํ•œ๋‹ค. ๋œจ๋Š” ์ž๋ฆฌ๋Š” DS ๊ฐ€ ์žก๋Š”๋‹ค, ์ง์ ‘ ๊ฐ์‹ธ๊ฑฐ๋‚˜ ์œ„์น˜๋ฅผ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
1268
+
1269
+ `SEditor` ๋Š” ํ™”๋ฉด์— ์ฒ˜์Œ ๋†“์ผ ๋•Œ **์—๋””ํ„ฐ ์—”์ง„์„ ๋”ฐ๋กœ ๋ถˆ๋Ÿฌ์˜จ๋‹ค** โ€” ์•ฑ ์ดˆ๊ธฐ ๋ฒˆ๋“ค์—๋Š” ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋™์•ˆ์€ ๊ฐ™์€ ํฌ๊ธฐ์˜ ๋นˆ ํŽธ์ง‘ ์˜์—ญ์ด ์ž๋ฆฌ๋ฅผ ์ง€ํ‚ค๋ฏ€๋กœ ๋ ˆ์ด์•„์›ƒ์€ ํ”๋“ค๋ฆฌ์ง€ ์•Š์ง€๋งŒ, **๋งˆ์šดํŠธํ•˜์ž๋งˆ์ž `ref.current.getHTML()` ๋กœ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ํˆด๋ฐ”๋ฅผ ๋ˆ„๋ฅผ ์ˆ˜๋Š” ์—†๋‹ค.** ์—ด์ž๋งˆ์ž ์ปค์„œ๋ฅผ ๋†“๊ณ  ์‹ถ์œผ๋ฉด `ref.current.focus()` ๋ฅผ ๊ทธ๋ƒฅ ๋ถ€๋ฅด๋ฉด ๋œ๋‹ค โ€” ์ค€๋น„๋˜๋Š” ์ˆœ๊ฐ„ ๋Œ€์‹  ์‹คํ–‰๋œ๋‹ค.
1270
+
1271
+ **์ด๋ฏธ์ง€๋ฅผ ๋„ฃ์œผ๋ ค๋ฉด `onImageUpload` ๋ฅผ ์ค€๋‹ค** โ€” ๊ณ ๋ฅธ ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ํ‘œ์‹œํ•  URL ์„ ๋Œ๋ ค์ฃผ๋Š” ํ›…์ด๋‹ค. ์ €์žฅ ์œ„์น˜๋Š” ์•ฑ๋งˆ๋‹ค ๋‹ค๋ฅด๋ฏ€๋กœ DS ๊ฐ€ ์ •ํ•˜์ง€ ์•Š๊ณ , ํ›…์ด ์—†์œผ๋ฉด ํˆด๋ฐ”์—์„œ ์ด๋ฏธ์ง€ ํ•ญ๋ชฉ์ด ๋น ์ง„๋‹ค. ๋ณธ๋ฌธ์— base64 ๋ฅผ ๋ฐ•๋Š” ๊ธธ์€ ๋ง‰์•„ ๋‘์—ˆ๋‹ค โ€” ์ €์žฅ HTML ์ด ์ˆ˜ MB ๋กœ ๋ถ€ํ’€์–ด ๊ทธ๋Œ€๋กœ DBยทAPI ์— ์‹ค๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
1272
+
1273
+ `SSearchInput` ์€ ํผ ํ•„๋“œ๊ฐ€ ์•„๋‹ˆ๋‹ค โ€” ๋ผ๋ฒจยทํžŒํŠธยท์œ ํšจ์„ฑ ๊ทœ์น™ยท์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์ง€ ์•Š๊ณ , `SForm` ์˜ ์ œ์ถœ ๊ฒ€์ฆ ๋Œ€์ƒ์—๋„ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค. ๋‹๋ณด๊ธฐ ์•„์ด์ฝ˜์ด ํ•ญ์ƒ ์•ž์— ๋ถ™์–ด "์—ฌ๊ธฐ๋Š” ๊ฒ€์ƒ‰"์ž„์„ ์Šค์Šค๋กœ ๋ฐํžˆ๋ฏ€๋กœ ๋ผ๋ฒจ์„ ๋”ฐ๋กœ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค. ๊ฒ€์ƒ‰ ์‹คํ–‰์€ `onSearch`(Enter) ๋กœ ๋ฐ›๊ณ , ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์ขํžˆ๋Š” ์‹ค์‹œ๊ฐ„ ํ•„ํ„ฐ๋ผ๋ฉด `onValueChange` ๋งŒ ์“ด๋‹ค. ๋ฐ˜๋Œ€๋กœ ๊ฒ€์ƒ‰์–ด๋ฅผ **์ €์žฅํ•˜๊ฑฐ๋‚˜ ๊ฒ€์ฆํ•ด์•ผ ํ•œ๋‹ค๋ฉด** ๊ทธ๊ฒƒ์€ ํผ ๊ฐ’์ด๋ฏ€๋กœ `SInput` ์ด๋‹ค.
1274
+
1275
+ #### 3-7-2. ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅด๊ฒŒ ํ•˜๋Š” ์—ฌ์„ฏ โ€” SSelect vs SRadioGroup vs SRadioCardGroup vs SRadioButton vs STabs vs SRadio
974
1276
 
975
1277
  **๋จผ์ € "๊ณ ๋ฅด๋ฉด ๋ฌด์—‡์ด ๋ฐ”๋€Œ๋Š”๊ฐ€"๋ฅผ ๋ณธ๋‹ค.**
976
1278
 
@@ -981,10 +1283,17 @@ const columns: STableColumn[] = [
981
1283
  | --- | --- |
982
1284
  | 6๊ฐœ ์ด์ƒ, ๋˜๋Š” ์„œ๋ฒ„์—์„œ ์˜ค๋Š” ๋™์  ๋ชฉ๋ก | `SSelect` |
983
1285
  | 2~5๊ฐœ ๊ณ ์ • + ์„ ํƒ์ง€๋ฅผ ํ•ญ์ƒ ๋ณด์—ฌ์•ผ ํ•จ | `SRadioGroup` |
1286
+ | 2~5๊ฐœ ๊ณ ์ • + **์„ ํƒ์ง€๋งˆ๋‹ค ์„ค๋ช… ํ•œ ์ค„์ด ํ•„์š”ํ•จ** | `SRadioCardGroup` |
984
1287
  | 2~4๊ฐœ + ์งง์€ ๋ผ๋ฒจ์˜ ๋ฐฐํƒ€์  ๋ชจ๋“œ ์ „ํ™˜ (์„ธ๊ทธ๋จผํŠธ) | `SRadioButton` |
985
1288
 
986
1289
  - **`SRadio` ๋ฅผ ์ง์ ‘ ๋‚˜์—ดํ•˜์ง€ ์•Š๋Š”๋‹ค.** ๊ทธ๋ฃน ๊ฐ„๊ฒฉ์€ `SRadioGroup` ์ด ๋งž์ถ˜๋‹ค (ยง2-2). `SRadio` ๋‹จ๋…์€ `SRadioGroup` ์ด ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ๋ฐฐ์น˜ โ€” ํ‘œ ์…€ ์•ˆ์— ํ–‰๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ๋†“๋Š” ๊ฒฝ์šฐ โ€” ์—๋งŒ ์“ด๋‹ค.
987
1290
  - `SRadioButton` ์€ `options` ๋ฅผ ํ†ต์งธ๋กœ ๋ฐ›๋Š” ์„ธ๊ทธ๋จผํŠธ ์ปจํŠธ๋กค์ด๋ผ `SRadio` ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋„ฃ๋Š” ๊ฒŒ ์•„๋‹ˆ๋‹ค.
1291
+ - **`SRadioGroup` ๊ณผ `SRadioCardGroup` ์˜ ๊ฐˆ๋ฆผ๊ธธ์€ "์„ค๋ช…์ด ํ•„์š”ํ•œ๊ฐ€" ํ•˜๋‚˜๋‹ค.** ๋ผ๋ฒจ๋งŒ์œผ๋กœ ๋œป์ด ํ†ตํ•˜๋ฉด `SRadioGroup`, ๊ณ ๋ฅด๊ธฐ ์ „์— ํ•œ ์ค„ ์„ค๋ช…์„ ์ฝ์–ด์•ผ ํ•˜๋ฉด `SRadioCardGroup` ์ด๋‹ค. ๋ผ๋ฒจ ์˜†์— ์„ค๋ช…์„ ๊ด„ํ˜ธ๋กœ ๋ง๋ถ™์—ฌ ๋Š˜์ด์ง€ ์•Š๋Š”๋‹ค.
1292
+ - **`SRadioCardGroup` ์€ `SRadioGroup` ์˜ ๋Œ€์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฒฉ์ƒํŒ์ด๋‹ค.** ๋ผ๋ฒจ์ด ํ•œ ๋‹จ๊ณ„ ํฌ๊ณ  ๊ทธ ์•„๋ž˜ ์„ค๋ช… ์ค„๊นŒ์ง€ ๋“ค์–ด๊ฐ€ ์นด๋“œ ํ•œ ์žฅ์ด ์ž๋ฆฌ๋ฅผ ๋„‰๋„‰ํžˆ ์“ด๋‹ค โ€” ์„ ํƒ์ง€๊ฐ€ ์กฐ๋ฐ€ํ•˜๊ฒŒ ๋ฐ˜๋ณต๋˜๋Š” ์ž๋ฆฌ์—๋Š” ๊ณผํ•˜๋‹ค.
1293
+ - **์“ฐ๋Š” ์ž๋ฆฌ๋Š” ์„ค์ • ํ™”๋ฉดยท๋งˆ๋ฒ•์‚ฌ(์Šคํ…)์˜ ์†Œ์ˆ˜ ๊ฒฐ์ •์ด๋‹ค.** ๊ณ ๋ฅด๊ณ  ๋‚˜๋ฉด ๋’ค ํ™”๋ฉด์ด ํ†ต์งธ๋กœ ๋ฐ”๋€Œ๊ฑฐ๋‚˜ ๋˜๋Œ๋ฆฌ๊ธฐ ์–ด๋ ค์šด ์„ ํƒ โ€” ํ‰๊ฐ€ ๋Œ€์ƒ์ž ๋ฒ”์œ„(์ „์ฒด/ํŠน์ • ๊ตฌ์„ฑ์›), ์ƒ๋‹ด ์ž๋™ ๋ฐฐ์ • ๋ฐฉ์‹ ๊ฐ™์€ ๊ฒƒ. ๋ชฉ๋ก ํ•„ํ„ฐยทํ‘œ ์•ˆ ์กฐ๊ฑด์ฒ˜๋Ÿผ ๊ฐ™์€ ์„ ํƒ์ง€๊ฐ€ ํ™”๋ฉด๋งˆ๋‹ค ๋ฐ˜๋ณต ๋…ธ์ถœ๋˜๋Š” ์ž๋ฆฌ์—๋Š” `SRadioGroup` ์„ ์“ด๋‹ค.
1294
+ - `SRadioCard` ๋‹จ๋…์€ `SRadioCardGroup` ์ด ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ๋ฐฐ์น˜์—๋งŒ ์“ด๋‹ค โ€” ๋‚˜์—ด์€ ๊ทธ๋ฃน์ด ๋งก๋Š”๋‹ค (ยง2-2).
1295
+ - ์นด๋“œ ์•ˆ์— ์ƒํƒœ ๋ฐฐ์ง€๋ฅผ ๋„ฃ์œผ๋ ค๋ฉด `tag` ์Šฌ๋กฏ์— `STag` ๋ฅผ ์ค€๋‹ค. ๋ผ๋ฒจ ๋ฌธ์ž์—ด์— "(์ถ”์ฒœ)" ์ฒ˜๋Ÿผ ์„ž์–ด ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
1296
+ - **์นด๋“œ์ฒ˜๋Ÿผ ์ƒ๊ฒผ๋‹ค๊ณ  `SCard`/`SSectionHeaderCard` ๋กœ ๊ฐ์‹ธ์ง€ ์•Š๋Š”๋‹ค.** `SRadioCard` ์ž์ฒด๊ฐ€ ์™„๊ฒฐ๋œ ์š”์†Œ์ด๊ณ , ๋‚˜์—ด ๊ฐ„๊ฒฉ์€ `SRadioCardGroup` ์˜ `direction` ์ด ๋งž์ถ˜๋‹ค (ยง2-2).
988
1297
 
989
1298
  #### 3-7-3. ์ผœ๊ณ  ๋„๋Š” ์…‹ โ€” SCheckbox vs SSwitch vs SToggle
990
1299
 
@@ -1005,15 +1314,45 @@ const columns: STableColumn[] = [
1005
1314
  | ํŒ๋ณ„ | ์‚ฌ์šฉ |
1006
1315
  | --- | --- |
1007
1316
  | ๋‚ ์งœ **ํ•˜๋‚˜**๋ฅผ ๊ฐ’์œผ๋กœ ๋ฐ›๋Š”๋‹ค | `SDatePicker` |
1317
+ | ์—ฐ๋„ ์„ ํƒ ๋ฆฌ์ŠคํŠธ๋งŒ ํ•„์š”ํ•˜๋‹ค (ํŠธ๋ฆฌ๊ฑฐยทํŒ์˜ค๋ฒ„๋Š” ์ง์ ‘ ์กฐํ•ฉ) | `SDatePickerYearListbox` |
1318
+ | ์—ฐ๋„+์›” ์„ ํƒ ๋ฆฌ์ŠคํŠธ๋งŒ ํ•„์š”ํ•˜๋‹ค (ํŠธ๋ฆฌ๊ฑฐยทํŒ์˜ค๋ฒ„๋Š” ์ง์ ‘ ์กฐํ•ฉ) | `SDatePickerMonthListbox` |
1008
1319
  | **์‹œ์ž‘~์ข…๋ฃŒ** ๋ฅผ ๊ฐ’์œผ๋กœ ๋ฐ›๋Š”๋‹ค | `SDateRangePicker` |
1009
1320
  | ๋‹ฌ๋ ฅ ๊ฒฉ์ž **์ž์ฒด๊ฐ€ ํ™”๋ฉด ์ฝ˜ํ…์ธ ** ๋‹ค (์ผ์ •ยท์ด๋ฒคํŠธ ๋ณด๊ธฐ) | `SCalendar` |
1010
1321
 
1011
1322
  - **๊ธฐ๊ฐ„์„ `SDatePicker` ๋‘ ๊ฐœ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.** ์‹œ์ž‘์ด ์ข…๋ฃŒ๋ณด๋‹ค ๋’ค์ธ ์ž…๋ ฅ์„ ๋ง‰๋Š” ๊ฒ€์ฆ๊ณผ ํ•œ์ชฝ๋งŒ ๊ณ ๋ฅธ ์ค‘๊ฐ„ ์ƒํƒœ ์ฒ˜๋ฆฌ๊ฐ€ `SDateRangePicker` ์•ˆ์— ์ด๋ฏธ ์žˆ๋‹ค. ๋‘ ๊ฐœ๋กœ ์ชผ๊ฐœ๋ฉด ๊ทธ๊ฒŒ ์ „๋ถ€ ์•ฑ ๋ชซ์ด ๋œ๋‹ค.
1012
1323
  - `SDatePicker`ยท`SDateRangePicker` ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ `SCalendar` ๋ฅผ ํŒ์˜ค๋ฒ„๋กœ ๋„์šด๋‹ค. ๊ฐ’์„ ๋ฐ›๋Š” ์ž๋ฆฌ์— `SCalendar` ๋ฅผ ์ง์ ‘ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
1324
+ - `SDatePickerYearListbox`ยท`SDatePickerMonthListbox` ๋Š” `SDatePicker` ์˜ mode listbox ์กฐ๊ฐ๋งŒ ๋–ผ์–ด๋‚ธ ์ปดํฌ๋„ŒํŠธ๋‹ค. ์ผ๋ฐ˜ ํผ ์ž…๋ ฅ์—๋Š” `SDatePicker mode="year" | "month"` ๋ฅผ ์šฐ์„  ์“ฐ๊ณ , ๋‹ค๋ฅธ ํŠธ๋ฆฌ๊ฑฐยทํŒ์˜ค๋ฒ„ ์•ˆ์— ๋ฆฌ์ŠคํŠธ๋งŒ ๋ผ์›Œ ๋„ฃ์„ ๋•Œ๋งŒ ์ง์ ‘ ์“ด๋‹ค.
1325
+
1326
+ **๋‚ ์งœยท์‹œ๊ฐ„ ํ”ผ์ปค๋Š” ํญ ์ƒํ•œ์„ ์Šค์Šค๋กœ ๊ฐ–๋Š”๋‹ค โ€” `width` ๋ฅผ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.** ๊ฐ’ ๊ธธ์ด๊ฐ€ `YYYY-MM-DD` ์ฒ˜๋Ÿผ ์ •ํ•ด์ ธ ์žˆ์–ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ์ด์ฆˆ๋ณ„ ์ƒํ•œ์„ ์•ˆ๋‹ค. `SKeyValueTable` ์ด ๋ชจ๋“  ์ปจํŠธ๋กค์— `width="100%"` ๋ฅผ ๋„˜๊ธฐ์ง€๋งŒ, ์ด ์ƒํ•œ ๋•๋ถ„์— ํ–‰ ์ „์ฒด๋กœ ๋Š˜์–ด๋‚˜์ง€ ์•Š๊ณ  ์ œ ํญ์—์„œ ๋ฉˆ์ถ˜๋‹ค.
1327
+
1328
+ | ์ปดํฌ๋„ŒํŠธ | `size="sm"` | `size="md"` |
1329
+ | --- | --- | --- |
1330
+ | `SDatePicker` | md | lg |
1331
+ | `SDateRangePicker` | lg | xl |
1332
+ | `STimePicker` | md | lg |
1333
+ | `STimeRangePicker` | md | lg (์˜ค์ „/์˜คํ›„ ํ‘œ์‹œ๋Š” ๋‘ ์‚ฌ์ด์ฆˆ ๋ชจ๋‘ lg) |
1334
+
1335
+ `SDateRangePicker` ๊ฐ€ ํ•œ ๋“ฑ๊ธ‰์”ฉ ์œ„์ธ ๊ฒƒ์€ ๊ฐ’์ด `YYYY-MM-DD ~ YYYY-MM-DD` ๋กœ ๋‘ ๋ฐฐ๊ฐ€ ๋„˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ฐ™์€ ์ด์œ ๋กœ `STimeRangePicker` ์˜ ์˜ค์ „/์˜คํ›„ ๋ชจ๋“œ๋„ sm ์—์„œ ํ•œ ๋“ฑ๊ธ‰ ์œ„๋ฅผ ์“ด๋‹ค โ€” ๊ทธ ๋ชจ๋“œ์˜ ์ตœ์†Œ ํญ์ด md ๋“ฑ๊ธ‰์„ ์ด๋ฏธ ๋„˜์–ด, ๊ทธ๋Œ€๋กœ ๋‘๋ฉด ํ•˜ํ•œ์ด ์ƒํ•œ์„ ๋„˜์–ด ์ƒํ•œ์ด ๋ฌด๋ ฅํ•ด์ง„๋‹ค.
1336
+
1337
+ `SDatePicker` ๋งŒ ์ด ์ƒํ•œ์„ `maxWidth` ๋กœ ๋ฎ์„ ์ˆ˜ ์žˆ๋‹ค โ€” ๋“ฑ๊ธ‰์„ ์ฃผ๋ฉด ๊ทธ ๋“ฑ๊ธ‰์ด ์ƒํ•œ์ด ๋˜๊ณ , `width="100%" maxWidth="100%"` ๋ฉด ๋ถ€๋ชจ ํญ์„ ๊ทธ๋Œ€๋กœ ์ฑ„์šด๋‹ค. **ํญ์ด ์ด๋ฏธ ์ข๊ฒŒ ์ •ํ•ด์ง„ ์ž๋ฆฌ(ํŒ์˜ค๋ฒ„ยท์ข์€ ์นด๋“œ)์—์„œ๋งŒ ์“ด๋‹ค.** ํผยทํ‘œ ํ–‰์—์„œ๋Š” ์“ฐ์ง€ ์•Š๋Š”๋‹ค โ€” ๊ฑฐ๊ธฐ์„œ ์ƒํ•œ์„ ํ’€๋ฉด 4~10๊ธ€์ž์งœ๋ฆฌ ๊ฐ’์ด ํ–‰ ์ „์ฒด๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค.
1338
+
1339
+ ##### ๊ฐ’์„ ์ง€์šธ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด `clearable`
1340
+
1341
+ `SSelect` ยท `SDatePicker` ยท `SDateRangePicker` ยท `STimePicker` ยท `STimeRangePicker` ๊ฐ€ ๊ฐ™์€ ๊ทœ์น™์œผ๋กœ ๊ฐ–๋Š”๋‹ค. ๊ฐ’์ด ์žˆ์„ ๋•Œ๋งŒ ์ง€์šฐ๊ธฐ ๋ฒ„ํŠผ์ด ๋‚˜ํƒ€๋‚˜๊ณ , ๋ˆ„๋ฅด๋ฉด **`onValueChange` ๋กœ `null` ์ด ์˜จ๋‹ค** (๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋‹ค). ๋ฐ›๋Š” ์ชฝ ์ƒํƒœ๋„ `null` ์„ ๋‹ด์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
1342
+
1343
+ ```tsx
1344
+ const [from, setFrom] = useState<string | null>(null);
1345
+
1346
+ <SDatePicker label="์‹œ์ž‘์ผ" clearable value={from} onValueChange={setFrom} />;
1347
+ ```
1348
+
1349
+ - **์กฐํšŒ ์กฐ๊ฑด(ํ•„ํ„ฐ)์—๋Š” ์ผ ๋‹ค.** ํ•œ ๋ฒˆ ๊ณ ๋ฅธ ๋‚ ์งœ๋ฅผ ๋˜๋Œ๋ฆด ๋ฐฉ๋ฒ•์ด ์—†์œผ๋ฉด ์ „์ฒด ์กฐํšŒ๋กœ ๋Œ์•„๊ฐ€๋ ค๊ณ  ์ƒˆ๋กœ๊ณ ์นจํ•˜๊ฒŒ ๋œ๋‹ค.
1350
+ - **ํ•„์ˆ˜ ์ž…๋ ฅ ํ•„๋“œ์—๋Š” ์ผœ์ง€ ์•Š๋Š”๋‹ค.** ์ง€์šฐ๋ฉด ๋‹ค์‹œ ๊ณ ๋ฅด๊ธฐ ์ „๊นŒ์ง€ ํผ์ด ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•œ๋‹ค โ€” ์ง€์šธ ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฐ’์ด๋ฉด ์• ์ดˆ์— ํ•„์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.
1351
+ - `disabled` ์ด๋ฉด ์ง€์šฐ๊ธฐ ๋ฒ„ํŠผ๋„ ํ•จ๊ป˜ ์‚ฌ๋ผ์ง„๋‹ค. ๋ˆ ํ•„๋“œ๋ฅผ ์ง€์šธ ์ˆ˜ ์žˆ์œผ๋ฉด ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
1013
1352
 
1014
1353
  #### 3-7-5. SField ๋ฅผ ์ง์ ‘ ์“ฐ๋Š” ๊ฒฝ์šฐ
1015
1354
 
1016
- **๊ฑฐ์˜ ์—†๋‹ค.** `SInput`ยท`SNumberInput`ยท`STextarea`ยท`SSelect`ยท๋‚ ์งœ/์‹œ๊ฐ„ ํ”ผ์ปค๋Š” ์ด๋ฏธ ๋‚ด๋ถ€์—์„œ `SField` ๋ฅผ ์“ฐ๊ณ  ์žˆ์–ด์„œ `label`ยท`required`ยท์—๋Ÿฌ ํ‘œ์‹œ๋ฅผ ์ž๊ธฐ prop ์œผ๋กœ ๋ฐ›๋Š”๋‹ค. ๊ทธ ์œ„์— `SField` ๋ฅผ ํ•œ ๊ฒน ๋” ๊ฐ์‹ธ๋ฉด ๋ผ๋ฒจ์ด ๋‘ ๋ฒˆ ๋‚˜์˜จ๋‹ค.
1355
+ **๊ฑฐ์˜ ์—†๋‹ค.** `SInput`ยท`SNumberInput`ยท`STextarea`ยท`SEditor`ยท`SSelect`ยท๋‚ ์งœ/์‹œ๊ฐ„ ํ”ผ์ปค๋Š” ์ด๋ฏธ ๋‚ด๋ถ€์—์„œ `SField` ๋ฅผ ์“ฐ๊ณ  ์žˆ์–ด์„œ `label`ยท`required`ยท์—๋Ÿฌ ํ‘œ์‹œ๋ฅผ ์ž๊ธฐ prop ์œผ๋กœ ๋ฐ›๋Š”๋‹ค. ๊ทธ ์œ„์— `SField` ๋ฅผ ํ•œ ๊ฒน ๋” ๊ฐ์‹ธ๋ฉด ๋ผ๋ฒจ์ด ๋‘ ๋ฒˆ ๋‚˜์˜จ๋‹ค.
1017
1356
 
1018
1357
  ์ง์ ‘ ์“ฐ๋Š” ๊ฒฝ์šฐ๋Š” ํ•˜๋‚˜๋ฟ์ด๋‹ค โ€” **๋””์ž์ธ ์‹œ์Šคํ…œ์— ์—†๋Š” ์ปจํŠธ๋กค**์— ๋‹ค๋ฅธ ํ•„๋“œ์™€ ๋˜‘๊ฐ™์€ ๋ผ๋ฒจยทํ•„์ˆ˜ยท์—๋Ÿฌ ๋ชจ์–‘์„ ๋ถ™์ผ ๋•Œ.
1019
1358
 
@@ -1026,15 +1365,17 @@ const columns: STableColumn[] = [
1026
1365
  | **์ˆœ์„œ ์ž์ฒด๊ฐ€ ๋ฐ์ดํ„ฐ**๋ผ ์‚ฌ์šฉ์ž๊ฐ€ ๋Œ์–ด์„œ ๋ฐ”๊พผ๋‹ค | `SDraggableList` + `SDraggableItem` |
1027
1366
 
1028
1367
  - **ํ•ญ๋ชฉ ํ•˜๋‚˜์˜ ์†์„ฑ์„ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์€ ๋ชฉ๋ก์ด ์•„๋‹ˆ๋‹ค.** `๋ผ๋ฒจ: ๊ฐ’` ์ด ์„ธ๋กœ๋กœ ์Œ“์ด๋Š” ๊ฒƒ์€ `SKeyValueTable` ์ด๋‹ค (ยง4-4).
1029
- - `SList` ๋Š” ๋ ˆ์ด์•„์›ƒ๋งŒ ๋‹ด๋‹นํ•œ๋‹ค. ํŽผ์นจยท๋‹จ์ผ ์„ ํƒ ๋™์ž‘์ด ํ•„์š”ํ•˜๋ฉด `SExpansionList` ๋‹ค (ยง3-7-7).
1030
- - **ํ•ญ๋ชฉ ์‚ฌ์ด ๊ตฌ๋ถ„์„ ์€ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ทธ๋ฆฐ๋‹ค.** `SListItem`ยท`SExpansionItem`ยท`SDraggableItem` ์…‹ ๋‹ค ์Šค์Šค๋กœ ๊ตฌ๋ถ„์„ ์„ ๊ทธ๋ฆฌ์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋ชฉ๋ก์„ ๊ฐ์‹ธ๋Š” `SList`ยท`SExpansionList`ยท`SDraggableList` ์— `separator` ๋ฅผ ์ค€๋‹ค โ€” ์•„์ดํ…œ์— `border-b` ๋ฅผ ์ง์ ‘ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค. ํ…Œ๋‘๋ฆฌํ˜•(`bordered`)์€ ํ…Œ๋‘๋ฆฌ๊ฐ€ ๊ตฌ๋ถ„ ์—ญํ• ์„ ํ•˜๋ฏ€๋กœ `separator` ๋Œ€์‹  `useGap` ์œผ๋กœ ๋„์šด๋‹ค.
1031
- - **`SListItem` ์€ ๊ธฐ๋ณธ์ด ํ‘œ์‹œ ์ „์šฉ์ด๋‹ค.** ๋ˆŒ๋Ÿฌ์„œ ์ด๋™ยท์„ ํƒํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด `clickable` ์„ ์ค€๋‹ค โ€” hoverยท`selected`ยท`interaction="chevron"` ํ‘œํ˜„์ด ์ „๋ถ€ ์—ฌ๊ธฐ์— ๋”ธ๋ ค ์žˆ์–ด์„œ, `clickable` ์—†์ด `selected` ๋งŒ ์ฃผ๋ฉด ์„ ํƒ ํ‘œ์‹œ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค. `SExpansionList` ๋Š” ์„ ํƒ์„ ์ž๊ธฐ๊ฐ€ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ์ž์‹ ์•„์ดํ…œ์„ ์•Œ์•„์„œ ํด๋ฆญ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
1368
+ - `SList` ๋Š” ๋ ˆ์ด์•„์›ƒ๋งŒ ๋‹ด๋‹นํ•œ๋‹ค. depth ๋ณ„ ๋‹จ์ผ ํŽผ์นจ์ด ํ•„์š”ํ•˜๋ฉด `SExpansionList` ๋‹ค (ยง3-7-7).
1369
+ - **`SList` ์˜ ์ž์‹์€ `SListItem` ์„ ๊ถŒ์žฅํ•œ๋‹ค.** ๋‹ค๋ฅธ ์ž์‹๋„ ๊ทธ๋Œ€๋กœ ๋ Œ๋”๋˜์ง€๋งŒ, ํŽผ์น˜๋Š” ํ•ญ๋ชฉ์€ `SExpansionList` + `SExpansionItem` ์ด, ๋Œ์–ด์„œ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋Š” ํ•ญ๋ชฉ์€ `SDraggableList` + `SDraggableItem` ์ด ์—ฌ๋‹ซํž˜ยท์ •๋ ฌ ๋™์ž‘๊นŒ์ง€ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ๊ทธ์ชฝ์„ ์“ด๋‹ค (ยง3-7-7).
1370
+ - **ํ•ญ๋ชฉ ์‚ฌ์ด ๊ตฌ๋ถ„์„ ์€ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์•Œ์•„์„œ ๊ทธ๋ฆฐ๋‹ค.** `SListItem`ยท`SExpansionItem`ยท`SDraggableItem` ์…‹ ๋‹ค ์Šค์Šค๋กœ ๊ตฌ๋ถ„์„ ์„ ๊ทธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. `SList`ยท`SExpansionList`ยท`SDraggableList` ๊ฐ€ ์ž์‹ **์‚ฌ์ด์—** ๊ตฌ๋ถ„์„ ์„ ๋„ฃ์œผ๋ฏ€๋กœ ์•„์ดํ…œ์— `border-b` ๋ฅผ ์ง์ ‘ ๋ถ™์ด์ง€ ์•Š๊ณ , ์ผœ๋Š” prop ๋„ ๋”ฐ๋กœ ์—†๋‹ค. ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ ์•„๋ž˜์—๋Š” ์„ ์ด ๋‚จ์ง€ ์•Š๋Š”๋‹ค. ํ…Œ๋‘๋ฆฌํ˜•(`bordered`)์€ ํ…Œ๋‘๋ฆฌ๊ฐ€ ๊ตฌ๋ถ„ ์—ญํ• ์„ ํ•˜๋ฏ€๋กœ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ตฌ๋ถ„์„ ์„ ๋นผ๊ณ , `useGap` ์œผ๋กœ ๋„์šด๋‹ค โ€” `useGap` ์„ ์ค€ ๋ชฉ๋ก์—๋„ ๊ตฌ๋ถ„์„ ์€ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค.
1371
+ - **`SListItem` ์€ ๊ธฐ๋ณธ์ด ํ‘œ์‹œ ์ „์šฉ์ด๋‹ค.** ๋ˆŒ๋Ÿฌ์„œ ์ด๋™ยท์„ ํƒํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด `clickable` ์„ ์ค€๋‹ค โ€” hoverยท`selected`ยท`interaction="chevron"` ํ‘œํ˜„์ด ์ „๋ถ€ ์—ฌ๊ธฐ์— ๋”ธ๋ ค ์žˆ์–ด์„œ, `clickable` ์—†์ด `selected` ๋งŒ ์ฃผ๋ฉด ์„ ํƒ ํ‘œ์‹œ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค. `SExpansionList` ๋Š” ์ž์‹ ์•„์ดํ…œ์„ ์•Œ์•„์„œ ํด๋ฆญ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ด ํ•จ์ •์„ ๋ง‰์•„ ์ค€๋‹ค โ€” ์„ ํƒ ์ƒํƒœ ์ž์ฒด๋Š” ์•ฑ์ด ๋“ ๋‹ค (ยง3-7-7).
1032
1372
 
1033
1373
  ```tsx
1034
- โœ… <SList separator><SListItem title="์ผ๋ฐ˜ ๋ฌธ์˜" />โ€ฆ</SList> {/* ์ค„๋กœ ๊ตฌ๋ถ„๋˜๋Š” ๋ชฉ๋ก */}
1374
+ โœ… <SList><SListItem title="์ผ๋ฐ˜ ๋ฌธ์˜" />โ€ฆ</SList> {/* ์ค„๋กœ ๊ตฌ๋ถ„๋˜๋Š” ๋ชฉ๋ก โ€” ๊ตฌ๋ถ„์„ ์€ ์ž๋™ */}
1035
1375
  โœ… <SList useGap><SListItem title="์ผ๋ฐ˜ ๋ฌธ์˜" bordered />โ€ฆ</SList> {/* ์นด๋“œ์ฒ˜๋Ÿผ ๋–จ์–ด์ง„ ๋ชฉ๋ก */}
1036
1376
  โœ… <SListItem title="์ผ๋ฐ˜ ๋ฌธ์˜" clickable selected onClick={โ€ฆ} /> {/* ๋ˆŒ๋Ÿฌ์„œ ๊ณ ๋ฅด๋Š” ๋ชฉ๋ก */}
1037
- โŒ <SList><SListItem title="์ผ๋ฐ˜ ๋ฌธ์˜" className="border-b" />โ€ฆ</SList>
1377
+ โŒ <SList><SListItem title="์ผ๋ฐ˜ ๋ฌธ์˜" className="border-b" />โ€ฆ</SList> {/* ๊ตฌ๋ถ„์„ ์„ ์ง์ ‘ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค */}
1378
+ โŒ <SList><><SListItem title="์ผ๋ฐ˜ ๋ฌธ์˜" /><SListItem title="๊ฒฐ์ œ ๋ฌธ์˜" /></></SList> {/* Fragment ๋กœ ๋ฌถ์œผ๋ฉด ๊ทธ ์•ˆ์ชฝ์€ ๊ตฌ๋ถ„๋˜์ง€ ์•Š๋Š”๋‹ค */}
1038
1379
  โŒ <SListItem title="์ผ๋ฐ˜ ๋ฌธ์˜" selected /> {/* clickable ์—†์œผ๋ฉด ์„ ํƒ ํ‘œ์‹œ๊ฐ€ ์•ˆ ๋‚˜์˜จ๋‹ค */}
1039
1380
  ```
1040
1381
 
@@ -1046,7 +1387,30 @@ const columns: STableColumn[] = [
1046
1387
  | **ํ•œ ๋ฒˆ์— ํ•˜๋‚˜๋งŒ** ์—ด๋ ค์•ผ ํ•œ๋‹ค (์•„์ฝ”๋””์–ธ) | `SExpansionList` + `SExpansionItem` |
1047
1388
  | **๋ถ€๋ชจ-์ž์‹ ๊ณ„์ธต ์ž์ฒด**๋ฅผ ๋ณด์—ฌ์ค˜์•ผ ํ•œ๋‹ค (2๋‹จ ์ด์ƒ, ์—ฐ๊ฒฐ์„ ) | `STree` |
1048
1389
 
1049
- `SExpansionList` ๋Š” depth ๋ณ„ ๋‹จ์ผ ํ™•์žฅยท์„ ํƒ์„ ๊ด€๋ฆฌํ•˜๋Š” wrapper ๋‹ค. ์ง์ ‘ `useState` ๋กœ "์—ด๋ฆฐ ํ•ญ๋ชฉ ํ•˜๋‚˜"๋ฅผ ๋“ค๊ณ  ์žˆ์ง€ ์•Š๋Š”๋‹ค. ํ•ญ๋ชฉ ์‚ฌ์ด ๊ตฌ๋ถ„์„ ์€ ์—ฌ๊ธฐ์„œ๋„ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ทธ๋ฆฐ๋‹ค โ€” `separator` ๋ฅผ ์ค€๋‹ค (ยง3-7-6).
1390
+ `SExpansionList` ๋Š” depth ๋ณ„ **๋‹จ์ผ ํ™•์žฅ**์„ ๊ด€๋ฆฌํ•˜๋Š” wrapper ๋‹ค. ์ง์ ‘ `useState` ๋กœ "์—ด๋ฆฐ ํ•ญ๋ชฉ ํ•˜๋‚˜"๋ฅผ ๋“ค๊ณ  ์žˆ์ง€ ์•Š๋Š”๋‹ค. ํ•ญ๋ชฉ ์‚ฌ์ด ๊ตฌ๋ถ„์„ ์€ ์—ฌ๊ธฐ์„œ๋„ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์•Œ์•„์„œ ๊ทธ๋ฆฐ๋‹ค โ€” ๋”ฐ๋กœ ์ค„ prop ์ด ์—†๋‹ค (ยง3-7-6).
1391
+
1392
+ ##### ํŽผ์นจ โ‰  ์„ ํƒ
1393
+
1394
+ **ํŽผ์นจ์€ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๊ณ , ์„ ํƒ์€ ์•ฑ์ด ๊ด€๋ฆฌํ•œ๋‹ค.**
1395
+
1396
+ ํŽผ์นจ์€ ํ™”๋ฉด ๋ฐ–์— ์ง„์‹ค์ด ์—†๋Š” ์ˆœ๊ฐ„ UI ์ƒํƒœ๋‹ค. ๊ฐ ํ•ญ๋ชฉ์ด ์ž๊ธฐ `expanded` ๋ฅผ ๋“ค๊ณ  ์žˆ์œผ๋ฉด "ํ•˜๋‚˜๋งŒ ์—ด๋ฆผ"์„ ๋งŒ๋“ค ์ˆ˜ ์—†์–ด ๋ˆ„๊ตฐ๊ฐ€ ๋‚˜๋จธ์ง€๋ฅผ ๋‹ซ์•„์•ผ ํ•˜๊ณ , ๊ทธ๊ฒƒ์ด ์ด wrapper ๋‹ค.
1397
+
1398
+ ์„ ํƒ์€ ๋‹ค๋ฅด๋‹ค. ์•ฑ์ด `selectedId` ์Šค์นผ๋ผ ํ•˜๋‚˜๋ฅผ ๋“ค๋ฉด ์ƒํ˜ธ๋ฐฐ์ œ๊ฐ€ ๊ตฌ์กฐ์ ์œผ๋กœ ๋ณด์žฅ๋˜๊ณ , ๊ทธ ๊ฐ’์€ URLยทstore ๋กœ ๋ณต์›๋ผ์•ผ ํ•œ๋‹ค. ๋ฆฌ์ŠคํŠธ๊ฐ€ ์‚ฌ๋ณธ์„ ๋“ค๋ฉด ๊ทธ ์ˆœ๊ฐ„ ์ง„์‹ค์ด ๋‘˜์ด ๋˜์–ด ์–ด๊ธ‹๋‚œ๋‹ค.
1399
+
1400
+ ```tsx
1401
+ const [selectedId, setSelectedId] = useState<string>();
1402
+
1403
+ <SExpansionList>
1404
+ {/* ํ•˜์œ„๊ฐ€ ์—†๋Š” ํ•ญ๋ชฉ(์ „์ฒดยท๋ฏธ๋ถ„๋ฅ˜)์€ SExpansionItem ์ด ์•„๋‹ˆ๋ผ SListItem ์ด๋‹ค */}
1405
+ <SListItem title="์ „์ฒด" selected={selectedId === 'all'} onClick={() => setSelectedId('all')} />
1406
+ <SExpansionItem title="์กฐ์ง">
1407
+ <SListItem title="์˜์—…ํŒ€" selected={selectedId === 'sales'} onClick={() => setSelectedId('sales')} />
1408
+ </SExpansionItem>
1409
+ </SExpansionList>
1410
+ ```
1411
+
1412
+ - `clickable` ์€ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ž์‹ `SListItem` ์— ๊ธฐ๋ณธ์œผ๋กœ ์ผœ ์ค€๋‹ค โ€” `clickable` ์—†์ด `selected` ๋งŒ ์ฃผ๋ฉด ํ‘œ์‹œ๊ฐ€ ์•ˆ ๋‚˜์˜ค๋Š” ํ•จ์ •(ยง3-7-6)์„ ๋ง‰๋Š” ๊ฐ’์ด๋‹ค.
1413
+ - **ํ•˜์œ„๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ํ•ญ๋ชฉ์€ `SExpansionItem` ์ด ์•„๋‹ˆ๋ผ `SListItem`** ์œผ๋กœ ๋‘”๋‹ค. ํŽผ์น  ๊ฒƒ์ด ์—†๋Š”๋ฐ ํŽผ์นจ ํ•ญ๋ชฉ์œผ๋กœ ๋งŒ๋“ค๋ฉด ํ™”์‚ดํ‘œ๋งŒ ๋‚จ๋Š”๋‹ค.
1050
1414
 
1051
1415
  #### 3-7-8. SCard vs SSectionHeaderCard
1052
1416
 
@@ -1057,7 +1421,23 @@ const columns: STableColumn[] = [
1057
1421
 
1058
1422
  - ํŽ˜์ด์ง€ ๊ณจ๊ฒฉ์—์„œ ์ฝ˜ํ…์ธ ๋ฅผ ๋ฌถ๋Š” ์„น์…˜์€ **์‚ฌ์‹ค์ƒ ์ „๋ถ€ `SSectionHeaderCard`** ๋‹ค (ยง4-4ยทยง4-5). ์ œ๋ชฉยทํ•„์ˆ˜ ํ‘œ์‹œยท๋„์›€๋งยทํ—ค๋” ์šฐ์ธก ์•ก์…˜์ด ์ „๋ถ€ ์—ฌ๊ธฐ ๋ถ™๋Š”๋‹ค.
1059
1423
  - **์นด๋“œ ์•ˆ์— ์นด๋“œ๋ฅผ ๊ฒน์น˜์ง€ ์•Š๋Š”๋‹ค.** ์„น์…˜ ์•ˆ์„ ๋” ๋‚˜๋ˆ ์•ผ ํ•˜๋ฉด `SDivider` ๋กœ ๋Š๊ฑฐ๋‚˜(ยง3-6) ์„น์…˜์„ ๋‘˜๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.
1060
- - ์•ˆ์ชฝ ์—ฌ๋ฐฑ์€ `SSectionHeaderCard.Body` ์˜ `padding` prop ์œผ๋กœ ์ค€๋‹ค โ€” `p-sd-*` ๋ฅผ ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค (ยง2-2).
1424
+ - ์•ˆ์ชฝ ์—ฌ๋ฐฑ์€ `SSectionHeaderCard` ์˜ `padding` prop ์œผ๋กœ ์ค€๋‹ค โ€” `p-sd-*` ๋ฅผ ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค (ยง2-2).
1425
+
1426
+ **์นด๋“œ๊ฐ€ ์ž๊ธฐ ์•ˆ์—์„œ ํ™•์ •ํ•˜๋Š” ์•ก์…˜์„ ๊ฐ€์ง€๋ฉด ํ•˜๋‹จ ๋ฒ„ํŠผ์„ `children` ์— ์ง์ ‘ ๋‘์ง€ ์•Š๋Š”๋‹ค.** ๋‘ ์นด๋“œ ๋ชจ๋‘ ๋ชจ๋‹ฌยท๋“œ๋กœ์–ด์™€ ๊ฐ™์€ ํ•˜๋‹จ ์•ก์…˜ ์˜์—ญ์„ ๊ฐ–๋Š”๋‹ค โ€” ์ฃผ ์•ก์…˜์€ `button`, ๋ณด์กฐ ๋ฒ„ํŠผ์€ `footerLeft` ๋กœ ๋„˜๊ธด๋‹ค(ยง3-3-4 ์™€ ๊ฐ™์€ ๊ทœ์น™). ๋ฐฐ๊ฒฝยท์ƒ๋‹จ ๊ตฌ๋ถ„์„ ยท์ขŒ์šฐ ์—ฌ๋ฐฑยท์–‘๋ ๋ถ„๋ฆฌ๊ฐ€ ์ปดํฌ๋„ŒํŠธ ๊ทœ์น™๋Œ€๋กœ ์žกํžˆ๊ณ , ์ขŒ์šฐ ๋์ด ํ—ค๋”ยท๋ณธ๋ฌธ๊ณผ ๋งž๋Š”๋‹ค. `footerLeft` ๋Š” ์Šฌ๋กฏ์ด๋ผ `SButton` ์„ ์ง์ ‘ ๋ฐฐ์น˜ํ•˜๋ฉฐ `size="md"` ๋ฅผ ๋ช…์‹œํ•œ๋‹ค(ยง3-5-2).
1427
+
1428
+ ```tsx
1429
+ {/* ์„น์…˜ ์•ˆ์—์„œ ๋ฐ”๋กœ ์ˆ˜์ •ยท์ €์žฅํ•˜๋Š” ์ธ๋ผ์ธ ํผ ์„น์…˜ (ยง4-4) */}
1430
+ <SSectionHeaderCard
1431
+ title="๋ฐฐ์†ก์ง€"
1432
+ marker
1433
+ footerLeft={<SButton color="neutral" outline size="md" label="์ทจ์†Œ" onClick={reset} />}
1434
+ button={{ label: '์ €์žฅ', onClick: save }}
1435
+ >
1436
+ <SKeyValueTable โ€ฆ />
1437
+ </SSectionHeaderCard>
1438
+ ```
1439
+
1440
+ **ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ํ™•์ •ํ•˜๋Š” ์•ก์…˜์€ ์นด๋“œ ํ‘ธํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ํŽ˜์ด์ง€ ํ•˜๋‹จ์— ๋‘”๋‹ค.** ์นด๋“œ ํ‘ธํ„ฐ๋Š” **๊ทธ ์นด๋“œ ์•ˆ์—์„œ ๋‹ซํžˆ๋Š” ์•ก์…˜**์˜ ์ž๋ฆฌ๋‹ค โ€” ์—ฌ๋Ÿฌ ์„น์…˜์„ ํ•œ ๋ฒˆ์— ์ €์žฅํ•˜๋Š” ๋ฒ„ํŠผ์„ ๋งˆ์ง€๋ง‰ ์นด๋“œ์˜ ํ‘ธํ„ฐ์— ๋„ฃ์œผ๋ฉด ๊ทธ ์นด๋“œ์—๋งŒ ๊ฑธ๋ฆฌ๋Š” ์•ก์…˜์œผ๋กœ ์ฝํžŒ๋‹ค. ์ด๋•Œ๋Š” ยง4-4 ์ฒ˜๋Ÿผ ์นด๋“œ ๋ฐ– ํ•˜๋‹จ ์ค„์— ๋‘”๋‹ค.
1061
1441
 
1062
1442
  #### 3-7-9. SLinearProgress vs SCircleProgress
1063
1443
 
@@ -1084,7 +1464,8 @@ const columns: STableColumn[] = [
1084
1464
  - **๊ธฐ๋ณธ์€ `SKeyValueTable` ์ด๋‹ค** (ยง4-2). ์กฐ๊ฑด์ด ๋Œ€์—ฌ์„ฏ ๊ฐœ ์ดํ•˜๋กœ ๊ณ ์ •์ด๋ฉด ํ‘œ๋กœ ํŽผ์ณ ๋‘๋Š” ํŽธ์ด ํ•œ๋ˆˆ์— ์ฝํžŒ๋‹ค.
1085
1465
  - `SChipFilter` ๋Š” ์กฐ๊ฑด์„ **์นฉ ํ•œ ์ค„**๋กœ ์ ‘๊ณ , "ํ•„ํ„ฐ ์ถ”๊ฐ€" ๋กœ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๊บผ๋‚ด ์“ฐ๊ฒŒ ํ•œ๋‹ค. ์นฉ์„ ๋ˆ„๋ฅด๋ฉด ํŽธ์ง‘ ํŒ์˜ค๋ฒ„๊ฐ€ ์—ด๋ฆฌ๊ณ , ๋‚ ์งœ๋Š” ํ”„๋ฆฌ์…‹(์˜ค๋Š˜ยท์ง€๋‚œ 7์ผยท์‚ฌ์šฉ์ž ์ง€์ •)์œผ๋กœ ๊ณ ๋ฅธ๋‹ค. ์กฐ๊ฑด ํ›„๋ณด๊ฐ€ ๋งŽ์€ ๋ชฉ๋ก ํ™”๋ฉด์—์„œ ํ•„ํ„ฐ๊ฐ€ ํ™”๋ฉด์„ ์„ธ๋กœ๋กœ ์žก์•„๋จน๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ์šฉ๋„๋‹ค.
1086
1466
  - ๊ฒ€์ƒ‰ ์‹คํ–‰ ์‹œ์ ์ด ๋‹ค๋ฅด๋‹ค โ€” `SKeyValueTable` ํ•„ํ„ฐ๋Š” ์•ฑ์ด ๊ฒ€์ƒ‰ ๋ฒ„ํŠผ์„ ์ง์ ‘ ๋†“์ง€๋งŒ, `SChipFilter` ๋Š” ํŽธ์ง‘ ํŒ์˜ค๋ฒ„๊ฐ€ ๋‹ซํžˆ๊ฑฐ๋‚˜ "๊ฒ€์ƒ‰" ์„ ๋ˆ„๋ฅผ ๋•Œ `onSearch` ๊ฐ€ ๊ฐ’ ๋งต๊ณผ ํ•จ๊ป˜ ํ˜ธ์ถœ๋œ๋‹ค. ๊ฐ’์ด ๋ฐ”๋€Œ์ง€ ์•Š์•˜์œผ๋ฉด ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.
1087
- - ํ•จ๊ป˜ ๊ฑธ์–ด์•ผ ํ•˜๋Š” ์กฐ๊ฑด(์˜ˆ: ๊ธฐ๊ฐ„ ์ค‘ ํ•˜๋‚˜๋Š” ํ•„์ˆ˜)์ด ์žˆ์œผ๋ฉด `fields` ๋ฅผ ๊ทธ๋ฃน์œผ๋กœ ๋„˜๊ธด๋‹ค. ๊ทœ์น™์„ ๋ชป ์ฑ„์šด ๋™์•ˆ ๊ฒฝ๊ณ  ํˆดํŒ์ด ๋–  ์žˆ๊ณ  `onSearch` ๊ฐ€ ๋ง‰ํžŒ๋‹ค.
1467
+ - **๋…ธ์ถœํ•  ์นฉ์„ ์•ฑ์ด ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.** ๋ฐ”์— ๋†“์ด๋Š” ๊ฒƒ์€ `fixed`ยท`required` ํ•„๋“œ์™€ **`value` ์— ๊ฐ’์ด ๋“ค์–ด ์žˆ๋Š” ํ•„๋“œ**๋‹ค. ๋…ธ์ถœ ๋ชฉ๋ก์„ ๋ฐ–์—์„œ ๋„˜๊ธฐ๋Š” prop ์€ ์—†๋‹ค. ์ฟผ๋ฆฌ์ŠคํŠธ๋งยท์„œ๋ฒ„ ์ƒํƒœ์—์„œ ์กฐ๊ฑด์„ ๋ณต์›ํ•˜๋Š” ๋ชฉ๋ก ํ™”๋ฉด๋„ **`value` ๋งŒ ๋„˜๊ธฐ๋ฉด ์นฉ์ด ํ•จ๊ป˜ ์‚ด์•„๋‚˜๊ณ **, ๊ทธ ์กฐ๊ฑด์„ ๋นผ๋ฉด ์นฉ๋„ ํ•จ๊ป˜ ๋น ์ง„๋‹ค โ€” ์นฉ๊ณผ ์กฐํšŒ ์กฐ๊ฑด์ด ์–ด๊ธ‹๋‚  ์ž๋ฆฌ๊ฐ€ ์—†๋‹ค. "ํ•„ํ„ฐ ์ถ”๊ฐ€" ๋กœ ๊บผ๋‚ธ ํ•„ํ„ฐ๋Š” ๊ฐ’์„ ๋„ฃ๊ธฐ ์ „์—๋„ ์ž๋ฆฌ๋ฅผ ์ง€ํ‚ค์ง€๋งŒ, "๊ฒ€์ƒ‰ ์ดˆ๊ธฐํ™”" ๋ฅผ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ํ™”๋ฉด์„ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋ฉด ์‚ฌ๋ผ์ง„๋‹ค. ๊ฑธ๋ฆฐ ์กฐ๊ฑด์ด ์—†์œผ๋‹ˆ ๋ฌธ์ œ๋˜์ง€ ์•Š๋Š”๋‹ค.
1468
+ - **`fields` ๋Š” ํ•ญ์ƒ ๊ทธ๋ฃน ๋ฐฐ์—ด์ด๋‹ค.** ๋ฌถ์„ ๊ฒƒ์ด ์—†์–ด๋„ `[{ fields: [...] }]` ๋กœ ํ•œ ๊ฒน ๊ฐ์‹ผ๋‹ค. ํ•จ๊ป˜ ๊ฑธ์–ด์•ผ ํ•˜๋Š” ์กฐ๊ฑด(์˜ˆ: ๊ธฐ๊ฐ„ ์ค‘ ํ•˜๋‚˜๋Š” ํ•„์ˆ˜)์ด ์žˆ์œผ๋ฉด ๊ทธ ํ•„๋“œ๋“ค๋งŒ ๋ณ„๋„ ๊ทธ๋ฃน์œผ๋กœ ๋–ผ์–ด `rule` ์„ ์ค€๋‹ค โ€” ๊ทœ์น™์„ ๋ชป ์ฑ„์šด ๋™์•ˆ ๊ฒฝ๊ณ  ํˆดํŒ์ด ๋–  ์žˆ๊ณ  `onSearch` ๊ฐ€ ๋ง‰ํžŒ๋‹ค. ๊ทธ๋ฃน ์•ž ๊ตฌ๋ถ„์„ ์€ `divider` ๋กœ ์ผ ๋‹ค. ๊ฒ€์ฆ ๋‹จ์œ„์™€ ๊ตฌ๋ถ„์„ ์€ ๋ณ„๊ฐœ๋ผ, ๋ฌถ์–ด์„œ ๊ฒ€์ฆ๋งŒ ํ•˜๊ณ  ์‹ถ์œผ๋ฉด `divider` ๋ฅผ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
1088
1469
 
1089
1470
  #### 3-7-12. ์ด๋ฏธ์ง€ โ€” SImage
1090
1471
 
@@ -1129,15 +1510,27 @@ export default function AppShell({
1129
1510
  children,
1130
1511
  header,
1131
1512
  scrollEndSpacing,
1132
- }: { children: React.ReactNode; header?: SPageHeaderProps; scrollEndSpacing?: boolean }) {
1513
+ contentHeight,
1514
+ }: {
1515
+ children: React.ReactNode;
1516
+ header?: SPageHeaderProps;
1517
+ scrollEndSpacing?: boolean;
1518
+ contentHeight?: SPageContentHeight;
1519
+ }) {
1133
1520
  return (
1134
1521
  <SLayout type="box" header="fix">
1135
1522
  {/* type/header/folded ๋Š” SLayout ์—๋งŒ ์ค€๋‹ค โ€” SGnb ๋Š” context ์—์„œ ์ฝ๋Š”๋‹ค */}
1136
1523
  <SGnb items={MENU} value={current} onValueChange={navigate} logo={<Logo />} />
1137
1524
  {/* ์ฝ˜ํ…์ธ  ํŒจ๋”ฉ์€ SPage ๊ฐ€ ํ† ํฐ์œผ๋กœ ๋„ฃ๋Š”๋‹ค โ€” p-sd-* ๋กœ ๋ฎ์–ด์“ฐ์ง€ ์•Š๋Š”๋‹ค */}
1138
- {/* ์Šคํฌ๋กค ๋ ์—ฌ๋ฐฑ๋„ SPage ๊ฐ€ ๋„ฃ๋Š”๋‹ค. ๋„๋Š” ๊ฑด ํŽ˜์ด์ง€๋„ค์ด์…˜ ์žˆ๋Š” ๋ชฉ๋ก๋ฟ์ด๋ผ ํŽ˜์ด์ง€๊ฐ€ ์ •ํ•œ๋‹ค */}
1525
+ {/* ๋†’์ด ๋ชจ๋“œ๋Š” ํŽ˜์ด์ง€๊ฐ€ ์ •ํ•œ๋‹ค โ€” ๋Œ€๋ถ€๋ถ„ contentHeight="fill" ์ด๋‹ค (ยง2-2) */}
1526
+ {/* ์Šคํฌ๋กค ๋ ์—ฌ๋ฐฑ๋„ SPage ๊ฐ€ ๋„ฃ๋Š”๋‹ค. ํŽ˜์ด์ง€๊ฐ€ ์‹ค์ œ๋กœ ์Šคํฌ๋กค๋˜๋Š” ํ™”๋ฉด์—์„œ๋งŒ ์ผ ๋‹ค */}
1139
1527
  {/* header ๋Š” ํŽ˜์ด์ง€๋งˆ๋‹ค ๋‹ฌ๋ผ AppShell ์ด ๊ทธ๋Œ€๋กœ ๋ฐ›์•„ ๋„˜๊ธด๋‹ค โ€” ํŽ˜์ด์ง€ ์ œ๋ชฉ์€ ์—ฌ๊ธฐ์„œ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค */}
1140
- <SPage background="frame" scrollEndSpacing={scrollEndSpacing} header={header}>
1528
+ <SPage
1529
+ background="frame"
1530
+ scrollEndSpacing={scrollEndSpacing}
1531
+ contentHeight={contentHeight}
1532
+ header={header}
1533
+ >
1141
1534
  {children}
1142
1535
  </SPage>
1143
1536
  </SLayout>
@@ -1179,7 +1572,9 @@ import { SModalOutlet } from 'sellmate-design-system-react';
1179
1572
 
1180
1573
  **์ตœ์†Œ ๋„ˆ๋น„๋Š” `SLayout` ์ด ๋ณด์žฅํ•œ๋‹ค โ€” ์•ฑ์ด `min-w-*` ๋ฅผ ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.** ์ฐฝ์ด ์ตœ์†Œ ๋„ˆ๋น„(`SLAYOUT_MIN_WIDTH`, GNB ํฌํ•จํ•œ ์ „์ฒด ๊ธฐ์ค€)๋ณด๋‹ค ์ข์•„์ง€๋ฉด GNBยท์ƒ๋‹จ๋ฐ”๋Š” ์ œ์ž๋ฆฌ์— ๋‚จ๊ณ  **`SPage` ์•ˆ์—๋งŒ ๊ฐ€๋กœ ์Šคํฌ๋กค์ด ์ƒ๊ธด๋‹ค.** ๋ฌธ์„œ(๋ธŒ๋ผ์šฐ์ € ์ฐฝ)์—๋Š” ๊ฐ€๋กœ ์Šคํฌ๋กค์ด ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ์…ธ์„ ๊ฐ์‹ธ๋Š” ์š”์†Œ์— `min-width` ๋‚˜ `overflow-x` ๋ฅผ ๊ฑธ์ง€ ์•Š๋Š”๋‹ค โ€” ๊ฑธ๋ฉด ์ฐฝ ์ „์ฒด๊ฐ€ ์Šคํฌ๋กค๋˜์–ด GNB ๊ฐ€ ํ™”๋ฉด ๋ฐ–์œผ๋กœ ๋ฐ€๋ฆฐ๋‹ค.
1181
1574
 
1182
- **์…ธ์˜ `SPage` ๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ๊ณต์œ ํ•˜๋ฏ€๋กœ, ์Šคํฌ๋กค ๋ ์—ฌ๋ฐฑ์„ ๋„๋ ค๋ฉด ํŽ˜์ด์ง€๊ฐ€ ์…ธ์— ์•Œ๋ ค์•ผ ํ•œ๋‹ค.** ์œ„์ฒ˜๋Ÿผ ํ”„๋ ˆ์ž„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ `scrollEndSpacing` ์„ ๋ฐ›์•„ ๊ทธ๋Œ€๋กœ ๋„˜๊ธฐ๊ณ , ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ์žˆ๋Š” ๋ชฉ๋ก ํŽ˜์ด์ง€๋งŒ `false` ๋ฅผ ์ค€๋‹ค (ยง4-2). ๋‚˜๋จธ์ง€ ํŽ˜์ด์ง€๋Š” ๋„˜๊ธฐ์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’(์ผฌ)์ด ์ ์šฉ๋œ๋‹ค.
1575
+ **์…ธ์˜ `SPage` ๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ๊ณต์œ ํ•˜๋ฏ€๋กœ, ํŽ˜์ด์ง€๋งˆ๋‹ค ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์€ ํŽ˜์ด์ง€๊ฐ€ ์…ธ์— ์•Œ๋ ค์•ผ ํ•œ๋‹ค.** ์œ„์ฒ˜๋Ÿผ ํ”„๋ ˆ์ž„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ `contentHeight` ยท `scrollEndSpacing` ์„ ๋ฐ›์•„ ๊ทธ๋Œ€๋กœ ๋„˜๊ธด๋‹ค.
1576
+
1577
+ **๋Œ€๋ถ€๋ถ„์˜ ํŽ˜์ด์ง€๋Š” `contentHeight="fill"` ์ด๋‹ค** โ€” ๋ณธ๋ฌธ์ด ์ฐฝ์„ ๊ฝ‰ ์ฑ„์šฐ๊ณ  ์Šคํฌ๋กค์€ ๊ฐ ์˜์—ญ ์•ˆ์—์„œ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์ด ํ‘œ์ค€์ด๋‹ค(ยง2-2). ๋ธ”๋ก์˜ ๋†’์ด๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๊ณ  ๊ทธ ๋†’์ด๊ฐ€ ์ฐฝ๋ณด๋‹ค ์ปค์„œ ํŽ˜์ด์ง€ ์ž์ฒด๊ฐ€ ์Šคํฌ๋กค๋ผ์•ผ ํ•˜๋Š” ํ™”๋ฉด์—์„œ๋งŒ `contentHeight="auto"`(๊ธฐ๋ณธ๊ฐ’) + `scrollEndSpacing` ์„ ์ผ ๋‹ค.
1183
1578
 
1184
1579
  **์ƒ๋‹จ๋ฐ” ๋ฐฐ์น˜๋Š” `header` ๊ฐ€ ์ •ํ•œ๋‹ค.** ์š”์†Œ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ์Šฌ๋กฏ์„ ์ฑ„์šฐ๊ธฐ ์ „์— ์–ด๋А ์ชฝ์ธ์ง€๋ถ€ํ„ฐ ์ •ํ•œ๋‹ค.
1185
1580
 
@@ -1201,7 +1596,7 @@ import { SModalOutlet } from 'sellmate-design-system-react';
1201
1596
  topContent={
1202
1597
  /* ๋‚จ๋Š” ํญ ์ „์ฒด๋ฅผ ๋ฐ›๋Š”๋‹ค โ€” ์™ผ์ชฝ์€ ๊ทธ๋Œ€๋กœ, ์˜ค๋ฅธ์ชฝ ๋์€ ml-auto */
1203
1598
  <div className="flex w-full items-center gap-sd-8">
1204
- <SInput value={keyword} onValueChange={setKeyword} placeholder="ํ†ตํ•ฉ ๊ฒ€์ƒ‰" />
1599
+ <SSearchInput value={keyword} onValueChange={setKeyword} onSearch={runSearch} placeholder="ํ†ตํ•ฉ ๊ฒ€์ƒ‰" />
1205
1600
  <SButton size="sm" color="neutral" outline label="๋‚ด ๊ณ„์ •" className="ml-auto" onClick={openAccount} />
1206
1601
  </div>
1207
1602
  }
@@ -1218,7 +1613,7 @@ import { SModalOutlet } from 'sellmate-design-system-react';
1218
1613
  {/* ์ ‘ํžˆ๋ฉด menuTopยทmenuFooter ๊ฐ€ ํ•จ๊ป˜ ๋น ์ง€๋ฏ€๋กœ, ํด๋“œ ๋ ˆ์ผ์— ๋‚จ๊ธธ ๊ฒƒ๋งŒ foldedTop ์œผ๋กœ ๋”ฐ๋กœ ์ค€๋‹ค */}
1219
1614
  <SGnb
1220
1615
  items={MENU} value={current} onValueChange={navigate} useRail
1221
- menuTop={<SInput value={keyword} onValueChange={setKeyword} placeholder="๋ฉ”๋‰ด ๊ฒ€์ƒ‰" />}
1616
+ menuTop={<SSearchInput value={keyword} onValueChange={setKeyword} placeholder="๋ฉ”๋‰ด ๊ฒ€์ƒ‰" />}
1222
1617
  menuFooter={<AccountRow />}
1223
1618
  foldedTop={<SGhostButton icon="search" size="sm" ariaLabel="๋ฉ”๋‰ด ๊ฒ€์ƒ‰" onClick={openSearch} />}
1224
1619
  />
@@ -1226,6 +1621,37 @@ import { SModalOutlet } from 'sellmate-design-system-react';
1226
1621
 
1227
1622
  ์Šฌ๋กฏ ์•ˆ์ชฝ ์—ฌ๋ฐฑ์€ **์Šฌ๋กฏ ๋‚ด์šฉ์ด ์ง์ ‘ ๊ฐ–๋Š”๋‹ค** โ€” ์ปดํฌ๋„ŒํŠธ๋Š” ์ž๋ฆฌ๋งŒ ์žก๋Š”๋‹ค(ํด๋“œ ์Šฌ๋กฏ๋งŒ ์ข์€ ํญ์— ๋งž์ถฐ ๊ฐ€์šด๋ฐ ์ •๋ ฌํ•œ๋‹ค). ๋ฉ”๋‰ด ํญ์€ `resizable` ๋กœ ๋ฐ”๋€” ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์Šฌ๋กฏ ๋‚ด์šฉ์€ ๊ณ ์ • ํญ ๋Œ€์‹  `w-full` ๋กœ ๋”ฐ๋ผ๊ฐ€๊ฒŒ ๋‘”๋‹ค.
1228
1623
 
1624
+ #### GNB ๋งจ ์•„๋ž˜์˜ system ํŒจ๋„
1625
+
1626
+ **์„œ๋น„์Šค ์ „ํ™˜ยท๋„๋ฉ”์ธยท์•Œ๋ฆผยท์„ค์ •ยท๊ณ„์ •์ฒ˜๋Ÿผ "์ง€๊ธˆ ์–ด๋–ค ์ž๊ฒฉ์œผ๋กœ ๋ณด๊ณ  ์žˆ๋Š”๊ฐ€" ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฌถ์Œ์€ `SGnbSystem` ์„ `SGnb` ์˜ `system` ์Šฌ๋กฏ์— ๋„ฃ๋Š”๋‹ค.** ์ด ์กฐ๊ฐ๋“ค์„ `menuFooter` ์— ์†์œผ๋กœ ์กฐ๋ฆฝํ•˜์ง€ ์•Š๋Š”๋‹ค โ€” ํŒจ๋„์˜ ๋ฐฐ๊ฒฝยท์œ„์ชฝ ๊ฒฝ๊ณ„ยท๊ตฌ๋ถ„์„ ยทํ–‰ ๊ฐ„๊ฒฉ์ด ์ „๋ถ€ ํ† ํฐ์œผ๋กœ ์ •ํ•ด์ ธ ์žˆ์–ด ์ง์ ‘ ๋งŒ๋“ค๋ฉด ์–ด๊ธ‹๋‚œ๋‹ค.
1627
+
1628
+ `system` ์€ ๋‹ค๋ฅธ ์Šฌ๋กฏ๊ณผ ๋‹ฌ๋ฆฌ **ํŽผ์นจยท์ ‘ํž˜ ์–‘์ชฝ์„ ํ˜ผ์ž ๋งก๋Š”๋‹ค** โ€” ํŽผ์น˜๋ฉด ๋ฉ”๋‰ด ์ปฌ๋Ÿผ ๋ฐ”๋‹ฅ์—, ์ ‘ํžˆ๋ฉด(`header="fix"`) `foldedFooter` ์•„๋ž˜ ๋ ˆ์ผ ๋ฐ”๋‹ฅ์— ์—ฌ๋ฐฑ ์—†์ด ๋ถ™๋Š”๋‹ค. ๊ทธ๋ž˜์„œ `menuFooter`/`foldedFooter` ๋กœ ๋‚˜๋ˆ  ์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค.
1629
+
1630
+ ```tsx
1631
+ <SGnb
1632
+ items={MENU} value={current} onValueChange={navigate} logo={<Logo />}
1633
+ system={
1634
+ <SGnbSystem
1635
+ /* ์ƒ๋‹จ์— ์Œ“๋Š” ํ–‰ โ€” SSystemActionButton ์˜ props ๋ฐฐ์—ด์ด๋‹ค (ยง3-5). color ๋Š” ๋„˜๊ธฐ์ง€ ์•Š๋Š”๋‹ค */
1636
+ actions={[{ type: 'select', label: '์„œ๋น„์Šค ์ „ํ™˜', option: { icon: 'robot' }, onClick: openServices }]}
1637
+ domain={domainName}
1638
+ alert={{ count: unreadCount, onClick: openAlerts }}
1639
+ setting={{ onClick: openSettings }}
1640
+ account={{ label: userName, onClick: openAccount }}
1641
+ />
1642
+ }
1643
+ />
1644
+ ```
1645
+
1646
+ - **`color` ์™€ `folded` ๋ฅผ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.** `system` ์Šฌ๋กฏ์— ์žˆ์œผ๋ฉด GNB ๊ฐ€ ์ž๊ธฐ ์ƒ‰๊ณผ ์ ‘ํž˜ ํ˜•ํƒœ๋ฅผ ๋‚ด๋ ค์ค€๋‹ค. ๋‘ prop ์€ GNB ๋ฐ–์—์„œ ์ด ํŒจ๋„์„ ๋‹จ๋…์œผ๋กœ ์“ธ ๋•Œ๋งŒ ์ค€๋‹ค.
1647
+ - **๊ฐ ์กฐ๊ฐ์€ ํ•ด๋‹น prop ์„ ์ค„ ๋•Œ๋งŒ ๋‚˜ํƒ€๋‚œ๋‹ค โ€” ์–ด๋–ค ์กฐํ•ฉ์ด์–ด๋„ ๊ทธ๊ฒƒ๋งŒ์œผ๋กœ ํŒ์ด ์„ฑ๋ฆฝํ•œ๋‹ค.** ๊ณ„์ •๋งŒ, ์•Œ๋ฆผ๋งŒ, ์„ค์ •๋งŒ, ์•Œ๋ฆผ+๊ณ„์ • โ€ฆ ์„œ๋น„์Šค๊ฐ€ ์“ฐ๋Š” ๊ฒƒ๋งŒ ๋„˜๊ธด๋‹ค. ์กฐ๊ฐ์„ ๋นผ๋ ค๊ณ  ๋นˆ ๋ฌธ์ž์—ด์ด๋‚˜ ๋นˆ ๊ฐ์ฒด๋ฅผ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค(`setting={{}}` ์€ "์„ค์ • ๋ฒ„ํŠผ์„ ์“ด๋‹ค" ๋Š” ๋œป์ด๋‹ค).
1648
+ - ๊ตฌ๋ถ„์„ ์€ **์œ„์•„๋ž˜ ์–‘์ชฝ์— ๋‚ด์šฉ์ด ์žˆ์„ ๋•Œ๋งŒ** ๊ทธ์–ด์ง„๋‹ค โ€” `actions` ๋งŒ ๋„˜๊ฒจ๋„ ๋ฐ”๋‹ฅ์— ๋œป ์—†๋Š” ์„ ์ด ๋‚จ์ง€ ์•Š๋Š”๋‹ค.
1649
+ - ์•Œ๋ฆผยท์„ค์ •์€ **ํ˜ผ์ž ์„œ๋ฉด ํญ์„ ๋‹ค ๋จน๊ณ **, ๋‘˜์ด ๋‚˜๋ž€ํžˆ ์„œ๋ฉด ์•Œ๋ฆผ์ด ๋‚จ๋Š” ํญ์„ยท์„ค์ •์ด ์ œ ํญ์„ ๊ฐ–๋Š”๋‹ค. ์–ด๋А ์ชฝ์ด ๋น ์ ธ๋„ ์™ผ์ชฝ ๋์€ ์œ„์•„๋ž˜ ํ–‰๊ณผ ๋งž์œผ๋ฏ€๋กœ ์•ฑ์ด ์ •๋ ฌ์„ ๋งž์ถœ ์ผ์ด ์—†๋‹ค.
1650
+ - **์ผœ์ง„ ์กฐ๊ฐ์ด ํ•˜๋‚˜๋„ ์—†์œผ๋ฉด ์•„๋ฌด๊ฒƒ๋„ ๋ Œ๋”๋˜์ง€ ์•Š๋Š”๋‹ค.** ์กฐ๊ฑด๋ถ€๋กœ ์กฐ๊ฐ์ด ๋‹ค ๋น ์ง€๋Š” ํ™”๋ฉด์—์„œ๋„ GNB ๋ฐ”๋‹ฅ์— ๋นˆ ํŒ์ด ๋‚จ์ง€ ์•Š๋Š”๋‹ค.
1651
+ - **์ ‘ํžˆ๋ฉด ์•Œ๋ฆผยท๊ณ„์ • ์•„์ด์ฝ˜๋งŒ ๋‚จ๋Š”๋‹ค** โ€” `actions`ยท`domain`ยท`setting` ์€ 48px ํญ์— ๋†“์„ ์ž๋ฆฌ๊ฐ€ ์—†์–ด ๋ Œ๋”๋˜์ง€ ์•Š๊ณ , ์•Œ๋ฆผ ๊ฐœ์ˆ˜๋Š” ์  ๋ฐฐ์ง€๊ฐ€ ๋œ๋‹ค. **์•Œ๋ฆผ๋„ ๊ณ„์ •๋„ ์•ˆ ์“ฐ๋Š” ์กฐํ•ฉ์ด๋ฉด ์ ‘ํžŒ ํŒจ๋„์€ ์•„์˜ˆ ๋ Œ๋”๋˜์ง€ ์•Š๋Š”๋‹ค** โ€” ์ ‘ํžŒ ์ƒํƒœ์—์„œ๋„ ๋ฐ˜๋“œ์‹œ ๋ˆŒ๋Ÿฌ์•ผ ํ•˜๋Š” ๊ฒƒ์ด ๊ทธ ๋‘˜ ๋ฐ–์— ์žˆ์œผ๋ฉด `foldedTop`/`foldedFooter` ๋กœ ๋”ฐ๋กœ ์ค€๋‹ค.
1652
+ - **์•Œ๋ฆผ ๊ฐœ์ˆ˜๋Š” `alert.count` ํ•˜๋‚˜๋กœ ํ‘œํ˜„ํ•œ๋‹ค.** 1 ์ด์ƒ์ด๋ฉด ๋ฒจ์ด ์šธ๋ฆฌ๋Š” ์•„์ด์ฝ˜๊ณผ ๊ฐ•์กฐ์ƒ‰์œผ๋กœ ๋ฐ”๋€๋‹ค โ€” ์ƒ‰์€ GNB ์ƒ‰์ด ์ •ํ•˜๋ฏ€๋กœ ์•ฑ์ด ์ง์ ‘ ์น ํ•˜์ง€ ์•Š๋Š”๋‹ค.
1653
+ - **`useRail` ์—์„œ ํ•˜์œ„ ๋ฉ”๋‰ด๊ฐ€ ์—†๋Š” ๋ ˆ์ผ ์•„์ดํ…œ์ด ํ™œ์„ฑ์ด๋ฉด ๋ฉ”๋‰ด ์ปฌ๋Ÿผ์งธ ์‚ฌ๋ผ์ง€๋ฏ€๋กœ ์ด ํŒจ๋„๋„ ํ•จ๊ป˜ ๋น ์ง„๋‹ค.** ํ•ญ์ƒ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ๊ณ„์ •ยท์•Œ๋ฆผ์ด๋ผ๋ฉด ๊ทธ๋Ÿฐ ๋ ˆ์ผ ๋ฆฌํ”„๋ฅผ ๋‘์ง€ ์•Š๋Š”๋‹ค.
1654
+
1229
1655
  ### 4-2. ๋ชฉ๋ก ํŽ˜์ด์ง€ (ํ•„ํ„ฐ + ํ…Œ์ด๋ธ”)
1230
1656
 
1231
1657
  ๊ตฌ์กฐ: **ํŽ˜์ด์ง€ ํ—ค๋”(`AppShell` ์˜ `header` prop, ๊ฐ€์ด๋“œ ๋“ฑ ๋ถ€๊ฐ€ ์•ก์…˜์€ slot) โ†’ ํ•„ํ„ฐ(`SKeyValueTable`) โ†’ `STableBar` โ†’ `STable`**
@@ -1237,7 +1663,10 @@ import { SModalOutlet } from 'sellmate-design-system-react';
1237
1663
  - **ํŽ˜์ด์ง€ ์ œ๋ชฉ ์ค„์—๋Š” ์ด ํŽ˜์ด์ง€์˜ ์ฃผ์š” ์•ก์…˜์„ ๋‘์ง€ ์•Š๋Š”๋‹ค.** ๋ถ€๊ฐ€์ ์ธ ๊ฒƒ๋งŒ `header.slot` ์— `SButton size="sm"` ์œผ๋กœ ์˜จ๋‹ค (ยง4-1 "ํŽ˜์ด์ง€ ํ—ค๋” ์‚ฌ์šฉ ๊ทœ์น™").
1238
1664
  - **์ฃผ์š” ์•ก์…˜(๋“ฑ๋ก ๋“ฑ)์€ `STableBar` ์˜ `rightActions`** ์— ๋‘”๋‹ค.
1239
1665
  - **์„ ํƒ ์ƒํƒœ ์•ก์…˜(์„ ํƒ ์‚ญ์ œ ๋“ฑ)์€ `STableBar` ์˜ `actions`** ์— ๋‘”๋‹ค. `actions` ์Šฌ๋กฏ์€ ๊ฑด์ˆ˜ ์š”์•ฝ์ด ์žˆ์œผ๋ฉด ์•ž์— ๊ตฌ๋ถ„์„ (`SDivider`)์„ **์ž๋™์œผ๋กœ** ๋„ฃ์œผ๋ฏ€๋กœ ์ง์ ‘ ๊ตฌ๋ถ„์„ ์„ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
1240
- - **ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ์žˆ์œผ๋ฉด ์Šคํฌ๋กค ๋ ์—ฌ๋ฐฑ์„ ๋ˆ๋‹ค** โ€” `AppShell` ์— `scrollEndSpacing={false}` ๋ฅผ ๋„˜๊ธด๋‹ค (ยง2-2). ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ์ด๋ฏธ "์—ฌ๊ธฐ์„œ ๋"์„ ์•Œ๋ ค์ค€๋‹ค.
1666
+ - **๋ณธ๋ฌธ์ด ๋‚จ์€ ๋†’์ด๋ฅผ ์ฑ„์šฐ๊ฒŒ ํ•œ๋‹ค** โ€” `AppShell` ์— `contentHeight="fill"` ์„ ๋„˜๊ธด๋‹ค(ยง2-2 ํ‘œ์ค€). ํŽ˜์ด์ง€๊ฐ€ ํ†ต์งธ๋กœ ์Šคํฌ๋กค๋˜๋ฉด ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ํ™”๋ฉด ๋ฐ–์œผ๋กœ ๋ฐ€๋ ค "์—ฌ๊ธฐ์„œ ๋"์ด ์ฝํžˆ์ง€ ์•Š๋Š”๋‹ค. `fill` ์ด๋ฉด **ํ‘œ๋งŒ ์ž๊ธฐ ์•ˆ์—์„œ ์Šคํฌ๋กคํ•˜๊ณ  ํŽ˜์ด์ง€๋„ค์ด์…˜์€ ํ•˜๋‹จ์— ๊ณ ์ •**๋œ๋‹ค.
1667
+ - ๋ณธ๋ฌธ ๋ฃจํŠธ์— `h-full min-h-0` ์œผ๋กœ ์„ธ๋กœ ์ถ•์„ ์ž‡๊ณ , ๋‚จ์€ ๋†’์ด๋ฅผ ๋จน์„ `STable` ์— `min-h-0 flex-1` ์„ ์ค€๋‹ค. ์ด ์‚ฌ์Šฌ์ด ํ•˜๋‚˜๋ผ๋„ ๋Š๊ธฐ๋ฉด ํ‘œ๊ฐ€ ๋†’์ด๋ฅผ ๋ชป ์žก๋Š”๋‹ค.
1668
+ - `fill` ์—์„œ๋Š” ํŽ˜์ด์ง€๊ฐ€ ์Šคํฌ๋กคํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ **`scrollEndSpacing` ์€ ๋ฌด์‹œ๋œ๋‹ค** โ€” ๋”ฐ๋กœ ๋„์ง€ ์•Š๋Š”๋‹ค (ยง2-2).
1669
+ - **์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ์ปฌ๋Ÿผ์€ `sortable` ๋กœ ์ค€๋‹ค.** ์ •๋ ฌ ์ƒํƒœ(`sort`)๋Š” ์ด ํŽ˜์ด์ง€๊ฐ€ ๋“ค๊ณ  `onSortChange` ๋กœ ๋ฐ›๋Š”๋‹ค โ€” ์กฐํšŒ ์กฐ๊ฑด์ด๋ผ URL ์— ์‹ค๋ ค์•ผ ํ•œ๋‹ค (ยง3-4).
1241
1670
 
1242
1671
  ```tsx
1243
1672
  import {
@@ -1285,9 +1714,10 @@ export default function ProductListPage() {
1285
1714
  // ์ด ํŽ˜์ด์ง€์˜ ์ฃผ์š” ์•ก์…˜์ด ์•„๋‹ˆ๋ผ ๋ถ€๊ฐ€ ์•ก์…˜ โ€” slot ์€ sm ๋ฒ„ํŠผ์œผ๋กœ๋งŒ ์ฑ„์šด๋‹ค
1286
1715
  slot: <SButton size="sm" color="neutral" outline label="์ด์šฉ ๊ฐ€์ด๋“œ" onClick={openGuide} />,
1287
1716
  }}
1288
- scrollEndSpacing={false} // ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ์žˆ์œผ๋ฏ€๋กœ ๋ˆ๋‹ค
1717
+ contentHeight="fill" // ํ‘œ๊ฐ€ ๋‚จ์€ ๋†’์ด๋ฅผ ์ฑ„์šฐ๊ณ  ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ํ•˜๋‹จ์— ๊ณ ์ •๋œ๋‹ค
1289
1718
  >
1290
- <div className="flex flex-col gap-sd-12">
1719
+ {/* h-full min-h-0 โ†’ STable ์˜ min-h-0 flex-1 ๋กœ ์„ธ๋กœ ์ถ•์ด ์ด์–ด์ง„๋‹ค */}
1720
+ <div className="flex h-full min-h-0 flex-col gap-sd-12">
1291
1721
  {/* ํ•„ํ„ฐ โ€” search ๋ฅผ ์ผœ๋ฉด ์šฐ์ธก์— ๊ฒ€์ƒ‰ ํŒจ๋„์ด ๋ถ™๋Š”๋‹ค */}
1292
1722
  <SKeyValueTable
1293
1723
  fields={filterFields}
@@ -1312,7 +1742,9 @@ export default function ProductListPage() {
1312
1742
  }
1313
1743
  />
1314
1744
 
1745
+ {/* ๋‚จ์€ ๋†’์ด๋ฅผ ์ฑ„์šฐ๊ณ  ๋ณธ๋ฌธ๋งŒ ์Šคํฌ๋กคํ•œ๋‹ค โ€” ํŽ˜์ด์ง€๋„ค์ด์…˜ ๋ฐ”๋Š” ํ‘œ ์•ˆ์—์„œ ํ•˜๋‹จ ๊ณ ์ • */}
1315
1746
  <STable
1747
+ className="min-h-0 flex-1"
1316
1748
  columns={columns}
1317
1749
  rows={rows}
1318
1750
  rowKey="id"
@@ -1328,6 +1760,33 @@ export default function ProductListPage() {
1328
1760
  }
1329
1761
  ```
1330
1762
 
1763
+ #### ํ•œ ํ™”๋ฉด์— ๋” ๋งŽ์€ ํ–‰์„ โ€” `dense` ์™€ ๋ฐ€๋„ ํ† ๊ธ€
1764
+
1765
+ ํ–‰ ๋†’์ด๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์€ `dense` ๋‹ค. ์„ธ๋กœ ์—ฌ๋ฐฑ๋งŒ ์ค„๊ณ  ์ขŒ์šฐ ํŒจ๋”ฉ์€ ๊ทธ๋Œ€๋กœ๋ผ, ๊ฐ’์ด ์ž˜๋ฆฌ์ง€ ์•Š์œผ๋ฉด์„œ ํ•œ ํ™”๋ฉด์— ๋“ค์–ด๊ฐ€๋Š” ํ–‰ ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค.
1766
+
1767
+ **์–ด๋А ์ชฝ์ด ํŽธํ•œ์ง€๋Š” ํ™”๋ฉด์ด ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž๊ฐ€ ์•ˆ๋‹ค.** ๊ทธ๋ž˜์„œ `dense` ๋Š” ๋ฐ€๋„๋ฅผ ๊ณ ์ •ํ•˜๋Š” ์Šค์œ„์น˜๊ฐ€ ์•„๋‹ˆ๋ผ **์‹œ์ž‘ ๋ฐ€๋„์ด์ž ๋ฐ€๋„ ํ† ๊ธ€์˜ ์Šค์œ„์น˜**๋‹ค โ€” ์ผœ๋ฉด ํ•˜๋‹จ ๋ฐ” ์šฐ์ธก(rows per page ์…€๋ ‰ํŠธ ์™ผ์ชฝ)์— `์ข๊ฒŒ ๋ณด๊ธฐ` ยท `๋„“๊ฒŒ ๋ณด๊ธฐ` ๋งํฌ๊ฐ€ ๋ถ™๋Š”๋‹ค. ์ผœ๊ณ  ๋„๋Š” ๋ณ„๋„ prop ์€ ์—†๋‹ค.
1768
+
1769
+ ```tsx
1770
+ // ์ข๊ฒŒ ์‹œ์ž‘ํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ”๊พธ๋Š” ๋ฐ€๋„๋Š” ํ‘œ๊ฐ€ ์•Œ์•„์„œ ๋“ค๊ณ  ๊ฐ„๋‹ค
1771
+ <STable dense useRowsPerPageSelect pagination={{ currentPage, lastPage }} />;
1772
+
1773
+ // ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋ฅธ ๋ฐ€๋„๋ฅผ ๋‹ค์Œ ๋ฐฉ๋ฌธ์—๋„ ๋‚จ๊ธฐ๋ ค๋Š” ํ™”๋ฉด๋งŒ ๋ฐ›์•„์„œ ์ €์žฅํ•œ๋‹ค.
1774
+ // ์ €์žฅํ•œ ๊ฐ’์€ ์‹œ์ž‘ ๋ฐ€๋„๋กœ๋งŒ ๋Œ๋ ค์ค€๋‹ค โ€” ๋˜๋Œ๋ ค ๋„ฃ์ง€ ์•Š๋Š”๋‹ค
1775
+ const [initialDense] = useState(() => loadPref('list.dense', true));
1776
+
1777
+ <STable
1778
+ dense={initialDense}
1779
+ onDenseChange={next => savePref('list.dense', next)}
1780
+ useRowsPerPageSelect
1781
+ pagination={{ currentPage, lastPage }}
1782
+ />;
1783
+ ```
1784
+
1785
+ - **๋ˆ„๋ฅธ ๋’ค์˜ ๋ฐ€๋„๋Š” `STable` ์ด ๋‚ด๋ถ€ ์ƒํƒœ๋กœ ๋“ค๊ณ  ๊ฐ„๋‹ค.** `onDenseChange` ์—†์ด๋„ ํ† ๊ธ€์€ ๋™์ž‘ํ•œ๋‹ค. ์ €์žฅ์ด ํ•„์š”ํ•œ ํ™”๋ฉด๋งŒ ๋ฐ›์•„์„œ ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค.
1786
+ - **`dense` ์— `onDenseChange` ๊ฐ’์„ ๋˜๋Œ๋ ค ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.** ํ† ๊ธ€์„ ๋ถ™์ผ์ง€๋Š” ์ด prop ์ด ์ •ํ•˜๋ฏ€๋กœ, ๋„“๊ฒŒ ๋ณธ ์ˆœ๊ฐ„ `dense` ๊ฐ€ `false` ๊ฐ€ ๋˜๋ฉด ํ† ๊ธ€์ด ์‚ฌ๋ผ์ ธ ๋‹ค์‹œ ์ขํž ๊ธธ์ด ์—†๋‹ค. prop ๊ฐ’์„ ๋ฐ”๊ฟ” ๋„˜๊ธฐ๋Š” ๊ฒƒ์€ ์™ธ๋ถ€ ๋ฒ„ํŠผ ๋“ฑ์œผ๋กœ ๋ฐ€๋„๋ฅผ **๋˜๋Œ๋ฆด ๋•Œ**๋งŒ ์“ด๋‹ค โ€” ๋‚ด๋ถ€ ๋ฐ€๋„๊ฐ€ ๊ทธ ๊ฐ’์œผ๋กœ ๋งž์ถฐ์ง„๋‹ค.
1787
+ - **`dense` ๋ฉด ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ์—†์–ด๋„ ํ† ๊ธ€์ด ๋‚˜์˜จ๋‹ค** โ€” ํ•˜๋‹จ ๋ฐ”๋ฅผ ํ† ๊ธ€๋งŒ ๋‹ด์•„ ๊ทธ๋ฆฐ๋‹ค. `dense` ๊ฐ€ ์•„๋‹ˆ๋ฉด ํ† ๊ธ€๋„ ์—†๋‹ค.
1788
+ - ๋ผ๋ฒจ๊ณผ ์•„์ด์ฝ˜์€ ํ˜„์žฌ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ **๋ˆ„๋ฅด๋ฉด ๋˜๋Š” ์ƒํƒœ**๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ข๊ฒŒ ๋ณด๊ณ  ์žˆ์œผ๋ฉด `๋„“๊ฒŒ ๋ณด๊ธฐ` ๋‹ค.
1789
+
1331
1790
  ### 4-3. ํผ ํŽ˜์ด์ง€ (๋“ฑ๋ก/์ˆ˜์ •)
1332
1791
 
1333
1792
  ๊ตฌ์กฐ: **ํŽ˜์ด์ง€ ์ œ๋ชฉ(`AppShell` ์˜ `header` prop) โ†’ `SForm` + `SKeyValueTable` โ†’ ํ•˜๋‹จ ๋ฒ„ํŠผ**
@@ -1335,6 +1794,19 @@ export default function ProductListPage() {
1335
1794
  - ํ•„๋“œ๋ฅผ `div` ๋กœ ๋‚˜์—ดํ•˜์ง€ ์•Š๊ณ  **`SKeyValueTable` ์˜ ํ–‰์œผ๋กœ ๊ตฌ์„ฑ**ํ•œ๋‹ค.
1336
1795
  - ๊ฒ€์ฆ ๊ทœ์น™์€ ๊ฐ field ์˜ `options.rules` ๋กœ ๋„˜๊ธด๋‹ค. `SForm` ์ด ํ•˜์œ„ ์ปจํŠธ๋กค์„ ์ž๋™ ์ˆ˜์ง‘ํ•ด submit ์‹œ ์ผ๊ด„ ๊ฒ€์ฆํ•˜๊ณ , ์‹คํŒจ ์‹œ ์ฒซ ์‹คํŒจ ํ•„๋“œ๋กœ ํฌ์ปค์Šค๋ฅผ ์˜ฎ๊ธด๋‹ค.
1337
1796
  - **๋ฒ„ํŠผ ์ˆœ์„œ: ์ทจ์†Œยท๋‹ซ๊ธฐ๊ฐ€ ์™ผ์ชฝ, ์ €์žฅยท๋“ฑ๋กยท์ˆ˜์ •ยท์‚ญ์ œ๊ฐ€ ์˜ค๋ฅธ์ชฝ.** ์ด ์ˆœ์„œ๋Š” ๋ชจ๋“  ํ™”๋ฉด์—์„œ ๋™์ผํ•˜๋‹ค.
1797
+ - **ํผ ํŽ˜์ด์ง€๋„ `contentHeight="fill"` ์ด ๊ธฐ๋ณธ์ด๋‹ค**(ยง2-2). ํผ์ด ๊ธธ์–ด ํŽ˜์ด์ง€๊ฐ€ ์‹ค์ œ๋กœ ์Šคํฌ๋กค๋˜๋Š” ํ™”๋ฉด์—์„œ๋งŒ `auto` + `scrollEndSpacing` ์„ ์ผ ๋‹ค.
1798
+ - **ํ•„๋“œ ํญ์€ ๋“ฑ๊ธ‰์œผ๋กœ ์ค€๋‹ค** โ€” `width="md"` ์ฒ˜๋Ÿผ `'xs' | 'sm' | 'md' | 'lg' | 'xl'` ์ค‘ ํ•˜๋‚˜๋‹ค. px ๋ฅผ ์ง์ ‘ ์ ์ง€ ์•Š๋Š”๋‹ค. ๋“ฑ๊ธ‰์€ `maxLength`(= ์Šคํ‚ค๋งˆ ์ƒํ•œ)๋กœ ๊ณ ๋ฅด๊ณ , ์ƒํ•œ์ด `xl` ์„ ๋„˜๊ฑฐ๋‚˜ ์ƒํ•œ์ด ์—†์œผ๋ฉด `width="100%"` ๋กœ ํ–‰ ์ „์ฒด๋ฅผ ์“ด๋‹ค (ยง6 `field-width-grade`).
1799
+
1800
+ **`SKeyValueTable` ์˜ ์ „์ฒด ์—ด ์ˆ˜๋Š” ๊ฐ€์žฅ ๊ธด ํ–‰์ด ์ •ํ•œ๋‹ค.** ์–ด๋–ค ํ–‰์ด ๊ทธ๋ณด๋‹ค ์งง์œผ๋ฉด ๋‚จ๋Š” ์ž๋ฆฌ์— ์…€์ด ์—†์–ด ๊ทธ ๊ตฌ๊ฐ„์˜ ํ–‰ ๊ตฌ๋ถ„์„ ์ด ๋Š๊ธด๋‹ค. ๋งˆ์ง€๋ง‰ ํ•„๋“œ์— `tdColSpan` ์„ ์ฃผ์–ด ์ฑ„์šด๋‹ค.
1801
+
1802
+ ```tsx
1803
+ [
1804
+ [{ name: 'category', โ€ฆ }, { name: 'price', โ€ฆ }], // ํ•„๋“œ 2๊ฐœ โ†’ 4์นธ
1805
+ [{ name: 'memo', โ€ฆ, tdColSpan: 3 }], // th(1) + td(3) = 4์นธ
1806
+ ]
1807
+ ```
1808
+
1809
+ **ํ•œ ํ–‰์— ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋‹ค๋ฅธ ํ–‰๋“ค์˜ `tdColSpan` ๋„ ํ•จ๊ป˜ ๋ด์•ผ ํ•œ๋‹ค.** ์ „์ฒด ์—ด ์ˆ˜๊ฐ€ ๋Š˜๋ฉด ๋‚˜๋จธ์ง€ ํ–‰๋“ค์ด ์กฐ์šฉํžˆ ์งง์•„์ง„๋‹ค โ€” ํ™”๋ฉด์—์„œ๋งŒ ๋“œ๋Ÿฌ๋‚˜๋Š” ์ปดํฌ๋„ŒํŠธ ๊ณ ์œ  ๋™์ž‘์ด๋ผ ์ž๋™์œผ๋กœ ์ฑ„์›Œ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
1338
1810
 
1339
1811
  ```tsx
1340
1812
  import {
@@ -1398,8 +1870,10 @@ export default function ProductCreatePage() {
1398
1870
 
1399
1871
  - ์กฐํšŒ ๊ฐ’์€ `type: 'text'` ํ–‰์œผ๋กœ ํ‘œ์‹œํ•œ๋‹ค. **์ƒํƒœยท๋ถ„๋ฅ˜ ํƒœ๊ทธ๋„ ๋ณ„๋„ ์˜์—ญ์ด ์•„๋‹ˆ๋ผ ํ‘œ์˜ ํ•œ ํ–‰**์œผ๋กœ ๋„ฃ๋Š”๋‹ค (`render` ์— `STag`).
1400
1872
  - ํ–‰์ด ๋งŽ์•„์ง€๋ฉด **์œ ํ˜•๋ณ„๋กœ ์„น์…˜์„ ๋‚˜๋ˆ„๊ณ , ๊ฐ ์„น์…˜์„ `SSectionHeaderCard` ๋กœ ๊ฐ์‹ผ๋‹ค.**
1401
- ํ•ฉ์„ฑ ์ปดํฌ๋„ŒํŠธ๋ผ `SSectionHeaderCard.Header` / `SSectionHeaderCard.Body` ๋ฅผ ์ž์‹์œผ๋กœ ์“ด๋‹ค.
1873
+ ์„น์…˜ ์ œ๋ชฉ์€ `title` prop ์œผ๋กœ, ๋ฐ”๋”” ์—ฌ๋ฐฑ์€ `padding` prop ์œผ๋กœ ์ค€๋‹ค.
1402
1874
  - **์ˆ˜์ •ยท์‚ญ์ œ ๋ฒ„ํŠผ์€ ํ•˜๋‹จ์— ๋‘”๋‹ค.** ๋‚ด์šฉ์ด ์งง์•„ ์šฐ์ธก ์ƒ๋‹จ์— ๋‘๋Š” ๋ณ€ํ˜•๋„ ์žˆ์œผ๋‚˜ ๊ธฐ๋ณธ์€ ํ•˜๋‹จ์ด๋‹ค.
1875
+ - **์ƒ์„ธ ํŽ˜์ด์ง€๋„ `contentHeight="fill"` ์ด ๊ธฐ๋ณธ์ด๋‹ค**(ยง2-2). ์„น์…˜์ด ๋งŽ์•„ ํŽ˜์ด์ง€๊ฐ€ ์‹ค์ œ๋กœ ์Šคํฌ๋กค๋˜๋Š” ํ™”๋ฉด์—์„œ๋งŒ `auto` + `scrollEndSpacing` ์„ ์ผ ๋‹ค.
1876
+ - **์„น์…˜๋งˆ๋‹ค ๋…๋ฆฝ ์ธ๋ผ์ธ ํผ์ด ์žˆ๋Š” ํ˜•ํƒœ**๋„ ์ƒ์„ธ ํŽ˜์ด์ง€์˜ ๋ณ€ํ˜•์ด๋‹ค. ์„น์…˜ ์•ˆ์—์„œ ๋ฐ”๋กœ ์ˆ˜์ •ยท์ €์žฅํ•˜๊ฒŒ ํ•˜๋Š” ํ™”๋ฉด์ธ๋ฐ, ์ด๋•Œ ๋ฒ„ํŠผ ๊ฐ•์กฐ๋Š” **์„น์…˜ ๋‹จ์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ํŒ๋‹จํ•œ๋‹ค** โ€” ยง3-5-1 ์˜ "`secondary` ์—ฐ์† ๋ฐฐ์น˜ ๊ธˆ์ง€"๋Š” ์„น์…˜์ด ๋‹ค๋ฅด๋ฉด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ ์„น์…˜ ์•ˆ์—์„œ ๋‹ซํžˆ๋Š” ์ €์žฅยท์ทจ์†Œ๋Š” `SSectionHeaderCard` ์˜ `button`ยท`footerLeft` ๋กœ ๋„˜๊ธด๋‹ค (ยง3-7-8). ์•„๋ž˜ ์˜ˆ์ฒ˜๋Ÿผ **ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ํ™•์ •ํ•˜๋Š” ๋ฒ„ํŠผ์€ ์นด๋“œ ๋ฐ– ํ•˜๋‹จ ์ค„**์— ๋‘”๋‹ค โ€” ๋‘˜์„ ์„ž์ง€ ์•Š๋Š”๋‹ค.
1403
1877
 
1404
1878
  ```tsx
1405
1879
  import {
@@ -1431,24 +1905,18 @@ export default function ProductDetailPage() {
1431
1905
  // ๋ชฉ๋ก์—์„œ ๋“ค์–ด์˜จ ์ƒ์„ธ ํŽ˜์ด์ง€ โ€” onBack ์œผ๋กœ ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ์ค€๋‹ค
1432
1906
  <AppShell header={{ fix: true, title: 'ํด๋ž˜์‹ ์…”์ธ ', onBack: goList }}>
1433
1907
  <div className="flex flex-col gap-sd-12">
1434
- <SSectionHeaderCard>
1435
- <SSectionHeaderCard.Header title="๊ธฐ๋ณธ ์ •๋ณด" marker thickness="accent" />
1436
- <SSectionHeaderCard.Body>
1437
- <SKeyValueTable fields={basicFields} values={product} />
1438
- </SSectionHeaderCard.Body>
1908
+ <SSectionHeaderCard title="๊ธฐ๋ณธ ์ •๋ณด" marker thickness="accent">
1909
+ <SKeyValueTable fields={basicFields} values={product} />
1439
1910
  </SSectionHeaderCard>
1440
1911
 
1441
- <SSectionHeaderCard>
1442
- {/* ํ—ค๋” ์šฐ์ธก์— ์•ก์…˜์ด ํ•„์š”ํ•˜๋ฉด slot ์„ ์“ด๋‹ค */}
1443
- <SSectionHeaderCard.Header
1444
- title="๊ฐ€๊ฒฉ ์ •๋ณด"
1445
- marker
1446
- helpText={['๋ถ€๊ฐ€์„ธ ํฌํ•จ ๊ธˆ์•ก์ž…๋‹ˆ๋‹ค.']}
1447
- slot={<SButton size="sm" color="secondary" label="์ด๋ ฅ" onClick={openHistory} />}
1448
- />
1449
- <SSectionHeaderCard.Body>
1450
- <SKeyValueTable fields={priceFields} values={product} />
1451
- </SSectionHeaderCard.Body>
1912
+ {/* ํ—ค๋” ์šฐ์ธก์— ์•ก์…˜์ด ํ•„์š”ํ•˜๋ฉด slot ์„ ์“ด๋‹ค */}
1913
+ <SSectionHeaderCard
1914
+ title="๊ฐ€๊ฒฉ ์ •๋ณด"
1915
+ marker
1916
+ helpText={['๋ถ€๊ฐ€์„ธ ํฌํ•จ ๊ธˆ์•ก์ž…๋‹ˆ๋‹ค.']}
1917
+ slot={<SButton size="sm" color="secondary" label="์ด๋ ฅ" onClick={openHistory} />}
1918
+ >
1919
+ <SKeyValueTable fields={priceFields} values={product} />
1452
1920
  </SSectionHeaderCard>
1453
1921
 
1454
1922
  {/* ์•ก์…˜์€ ํ•˜๋‹จ โ€” ๋ชฉ๋ก(๋˜๋Œ๋ฆฌ๊ธฐ)์€ ์™ผ์ชฝ ๋, ์‹คํ–‰ ์•ก์…˜์€ ์˜ค๋ฅธ์ชฝ ๋ */}
@@ -1482,6 +1950,29 @@ export default function ProductDetailPage() {
1482
1950
  | Prop (Body) | ์šฉ๋„ |
1483
1951
  | --- | --- |
1484
1952
  | `padding` | ์•ˆ์ชฝ ์—ฌ๋ฐฑ โ€” `'default'`(๊ธฐ๋ณธ) / `'wide'` / `'none'`. ํŒ์ •์€ ยง2-2 "์„น์…˜ยทํŒจ๋„ ์•ˆ์ชฝ ์—ฌ๋ฐฑ". `p-sd-*` ๋ฅผ ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค |
1953
+ | `background` | ๋ณธ๋ฌธ ๋ฐ”ํƒ• โ€” `'frame'`(๊ธฐ๋ณธ) / `'neutral'`. ํŒ์ •์€ ยง2-2 "๋ณธ๋ฌธ ๋ฐ”ํƒ• ๋ˆŒ๋Ÿฌ์•‰ํžˆ๊ธฐ" |
1954
+
1955
+ | Prop (Footer) | ์šฉ๋„ |
1956
+ | --- | --- |
1957
+ | `button` | ํ•˜๋‹จ ์•ก์…˜ ์˜์—ญ ์šฐ์ธก ์ฃผ ์•ก์…˜ (ยง3-7-8) |
1958
+ | `footerLeft` | ํ•˜๋‹จ ์•ก์…˜ ์˜์—ญ ์ขŒ์ธก ์Šฌ๋กฏ โ€” ๋ณด์กฐ ๋ฒ„ํŠผ. `SButton` ์— `size="md"` ๋ฅผ ๋ช…์‹œํ•œ๋‹ค |
1959
+
1960
+ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ฃผ๋ฉด ํ•˜๋‹จ ์•ก์…˜ ์˜์—ญ์ด ๋ Œ๋”๋œ๋‹ค. ํšŒ์ƒ‰ ๋ฐ”ํƒ• + ์ƒ๋‹จ ๊ตฌ๋ถ„์„ ์ด๋ฉฐ ์ขŒ์šฐ ๋์€ ํ—ค๋”์— ๋งž๋Š”๋‹ค โ€” ๋ฐฐ๊ฒฝยท์—ฌ๋ฐฑ์„ ์ง์ ‘ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
1961
+
1962
+ **ํ•œ ํŽ˜์ด์ง€์— ์„น์…˜ ์นด๋“œ๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด `marker` ๋ฅผ ์ผ ๋‹ค.** ์ ์€ ์„น์…˜์„ ์„œ๋กœ ๊ตฌ๋ถ„ํ•  ๋Œ€์ƒ์ด ์—ฌ๋Ÿฟ์ผ ๋•Œ๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ์–ด, ์นด๋“œ๊ฐ€ ํ•˜๋‚˜๋ฟ์ธ ํŽ˜์ด์ง€์—์„œ๋Š” ์ผœ์ง€ ์•Š๋Š”๋‹ค. ํ•œ ํŽ˜์ด์ง€ ์•ˆ์—์„œ๋Š” ์ผœ๊ฑฐ๋‚˜ ๋„๊ฑฐ๋‚˜ ์ „๋ถ€ ๊ฐ™๊ฒŒ ๊ฐ„๋‹ค.
1963
+
1964
+ **์„น์…˜ ๋ณธ๋ฌธ์ด ์ž๊ธฐ ์•ˆ์—์„œ ์Šคํฌ๋กคํ•ด์•ผ ํ•˜๋ฉด ๋ฃจํŠธ `className` ์œผ๋กœ ๋งˆ์ง€๋ง‰ ์ž์‹์— ์„ธ๋กœ ์ถ•์„ ์ž‡๋Š”๋‹ค.**
1965
+
1966
+ ```tsx
1967
+ <SSectionHeaderCard
1968
+ title="โ€ฆ"
1969
+ className="[&>div:last-child]:min-h-0 [&>div:last-child]:flex-1"
1970
+ >
1971
+ <STable className="min-h-0 flex-1" โ€ฆ />
1972
+ </SSectionHeaderCard>
1973
+ ```
1974
+
1975
+ ๋ณธ๋ฌธ ๋ž˜ํผ๋Š” `className` ์„ ๋ฐ›์ง€ ์•Š์œผ๋ฏ€๋กœ(์—ฌ๋ฐฑ์€ `padding` prop ์œผ๋กœ๋งŒ ๋ฐ›๋Š”๋‹ค) ๋ฃจํŠธ์—์„œ ๋‚ด๋ ค ์ค€๋‹ค. **ํ•˜๋‹จ ์•ก์…˜ ์˜์—ญ์ด ์žˆ์œผ๋ฉด ๋ณธ๋ฌธ์ด ๋” ์ด์ƒ ๋งˆ์ง€๋ง‰ ์ž์‹์ด ์•„๋‹ˆ๋‹ค** โ€” ๊ทธ๋•Œ๋Š” `[&>div:nth-last-child(2)]` ๋กœ ๊ฒจ๋ˆˆ๋‹ค. ํ”ํ•œ ๊ตฌ์„ฑ์€ ์•„๋‹ˆ๋‹ค โ€” ๋Œ€๋ถ€๋ถ„์€ `STable` ์ด ์ž๊ธฐ ์•ˆ์—์„œ ์Šคํฌ๋กคํ•˜๋ฏ€๋กœ ์—ฌ๊ธฐ๊นŒ์ง€ ๊ฐˆ ์ผ์ด ์—†๋‹ค.
1485
1976
 
1486
1977
  ---
1487
1978
 
@@ -1497,8 +1988,11 @@ export default function ProductDetailPage() {
1497
1988
  - [ ] ํ…์ŠคํŠธ ํšŒ์ƒ‰ ์œ„๊ณ„๋ฅผ ์ˆœ์ฐจ ์ ์šฉํ–ˆ๋Š”๊ฐ€ (๊ธฐ๋ณธ โ†’ `text-fg-secondary` โ†’ `text-fg-tertiary`, ๋‹จ๊ณ„ ๊ฑด๋„ˆ๋›ฐ๊ธฐ โŒ)
1498
1989
  - [ ] `SPage`ยท`SPopup` ์˜ ๊ธฐ๋ณธ ํŒจ๋”ฉ์„ `p-sd-*` ๋กœ ๋ฎ์–ด์“ฐ์ง€ ์•Š์•˜๋Š”๊ฐ€, ๋ธ”๋กยท์„น์…˜ **๊ฐ„๊ฒฉ**์ด `gap-sd-12` ์ธ๊ฐ€ (`gap-sd-16`/`gap-sd-24` โŒ โ€” 24 ๋Š” ์•ˆ์ชฝ ์—ฌ๋ฐฑ์—๋งŒ ์—ด๋ฆฐ๋‹ค)
1499
1990
  - [ ] ์„น์…˜ยทํŒจ๋„์˜ ์•ˆ์ชฝ **์—ฌ๋ฐฑ**์ด ยง2-2 ํŒ์ •๊ณผ ๋งž๋Š”๊ฐ€ (๋ฉ์–ด๋ฆฌ ๋‘ ์ข…๋ฅ˜ โ†’ 16 / ์„ธ ์ข…๋ฅ˜ ์ด์ƒ โ†’ 24, ์„œ๋ฉด 16)
1500
- - [ ] `SSectionHeaderCard.Body` ์˜ ์—ฌ๋ฐฑ์„ `p-sd-*` ๊ฐ€ ์•„๋‹ˆ๋ผ `padding` prop ์œผ๋กœ ์คฌ๋Š”๊ฐ€
1501
- - [ ] ์ž์ฒด ์Šคํฌ๋กคํ•˜๋Š” ํŒจ๋„์˜ ํ•˜๋‹จ์— `pb-[var(--cmp-pageBody-padding-scrollEnd)]` ์ด ์žˆ๋Š”๊ฐ€, ํŽ˜์ด์ง€๋„ค์ด์…˜ ์žˆ๋Š” ๋ชฉ๋ก์—์„œ `scrollEndSpacing={false}` ๋ฅผ ๋„˜๊ฒผ๋Š”๊ฐ€
1991
+ - [ ] `SSectionHeaderCard` ์˜ ์—ฌ๋ฐฑ์„ `p-sd-*` ๊ฐ€ ์•„๋‹ˆ๋ผ `padding` prop ์œผ๋กœ ์คฌ๋Š”๊ฐ€
1992
+ - [ ] ํŽ˜์ด์ง€์— `contentHeight="fill"` ์„ ๋„˜๊ฒผ๋Š”๊ฐ€ (ยง2-2 ํ‘œ์ค€ โ€” ํŽ˜์ด์ง€ ์Šคํฌ๋กค์„ ์“ฐ๋Š” ํ™”๋ฉด์—์„œ๋งŒ `auto` + `scrollEndSpacing`)
1993
+ - [ ] `fill` ์„ ์“ด ๋ธ”๋ก์—์„œ **์ž์‹๊นŒ์ง€ `min-h-0 flex-1` ์ด ๋Š๊ธฐ์ง€ ์•Š์•˜๋Š”๊ฐ€** (ํ•œ ๊ตฐ๋ฐ๋งŒ ๋Š๊ฒจ๋„ ์ž์‹์ด ๋†’์ด๋ฅผ ๋ชป ์žก๋Š”๋ฐ ์‹คํŒจ๊ฐ€ ์กฐ์šฉํ•˜๋‹ค)
1994
+ - [ ] ์ž์ฒด ์Šคํฌ๋กคํ•˜๋Š” ํŒจ๋„์˜ ํ•˜๋‹จ์— `pb-[var(--cmp-pageBody-padding-scrollEnd)]` ์ด ์žˆ๋Š”๊ฐ€
1995
+ - [ ] ํ•œ ํŽ˜์ด์ง€์— ์„น์…˜ ์นด๋“œ๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด `marker` ๋ฅผ ์ผฐ๋Š”๊ฐ€, ํ•˜๋‚˜๋ฟ์ด๋ฉด ๊ป๋Š”๊ฐ€ (ยง4-5)
1502
1996
  - [ ] ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‚˜์—ดํ•  ๋•Œ ยง2-2 ๊ทธ๋ฃน ๊ฐ„๊ฒฉ์„ ์ผ๋Š”๊ฐ€ (์ฒดํฌ๋ฐ•์Šค ๊ฐ€๋กœ `gap-sd-24` ๋“ฑ)
1503
1997
  - [ ] ํŽ˜์ด์ง€๊ฐ€ ยง4์˜ ํ‘œ์ค€ ๊ณจ๊ฒฉ์—์„œ ์‹œ์ž‘ํ–ˆ๋Š”๊ฐ€
1504
1998
  - [ ] `header.fix` ๊ฐ€ ํ”„๋กœ์ ํŠธ ์ „์ฒด์™€ ๊ฐ™์€ ๊ฐ’์ธ๊ฐ€ (๋‹ค๋ฅธ ํŽ˜์ด์ง€์™€ ๋‹ค๋ฅด๊ฒŒ ์„ž์–ด ์“ฐ์ง€ ์•Š์•˜๋Š”๊ฐ€, ยง4-1)
@@ -1507,11 +2001,20 @@ export default function ProductDetailPage() {
1507
2001
  - [ ] ํ•„ํ„ฐยทํผยท์ƒ์„ธ ์ •๋ณด๋ฅผ `SKeyValueTable` ๋กœ ๋งŒ๋“ค์—ˆ๋Š”๊ฐ€ (์ปจํŠธ๋กค์„ `div` ๋กœ ๋‚˜์—ดํ•˜์ง€ ์•Š์•˜๋Š”๊ฐ€). ํ•„ํ„ฐ๋ฅผ `SChipFilter` ๋กœ ํ–ˆ๋‹ค๋ฉด ยง3-7-11 ์˜ ํŒ์ •์„ ๊ฑฐ์ณค๋Š”๊ฐ€
1508
2002
  - [ ] ์„น์…˜ ๊ตฌ๋ถ„์— `SSectionHeaderCard` ๋ฅผ ์ผ๋Š”๊ฐ€ (์ง์ ‘ ๋งŒ๋“  ์นด๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ)
1509
2003
  - [ ] ๋ชฉ๋ก์˜ ์ฃผ์š” ์•ก์…˜์ด `STableBar` ์˜ `rightActions` ์— ์žˆ๋Š”๊ฐ€ (ํŽ˜์ด์ง€ ์ œ๋ชฉ ์ค„์ด ์•„๋‹ˆ๋ผ)
2004
+ - [ ] ๋ชฉ๋ก ํŽ˜์ด์ง€ ํ‘œ์— `dense` ๋กœ ๋ฐ€๋„ ํ† ๊ธ€์„ ๋„์› ๋Š”๊ฐ€, ๊ทธ ๊ฐ’์„ `onDenseChange` ๊ฒฐ๊ณผ๋กœ ๋˜๋Œ๋ ค ๋„ฃ์ง€๋Š” ์•Š์•˜๋Š”๊ฐ€ (ยง4-2 โ€” ๋˜๋Œ๋ ค ๋„ฃ์œผ๋ฉด ๋„“๊ฒŒ ๋ณธ ์ˆœ๊ฐ„ ํ† ๊ธ€์ด ์‚ฌ๋ผ์ง„๋‹ค)
1510
2005
  - [ ] ์ƒํƒœ ํ‘œ์‹œ์— `STag size="sm"` ์„ ์ผ๋Š”๊ฐ€
1511
2006
  - [ ] ํ…Œ์ด๋ธ”์—์„œ ์–‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ปฌ๋Ÿผ(๊ธˆ์•กยท์ˆ˜๋Ÿ‰ยท๊ฐœ์ˆ˜ ๋“ฑ)์ด ์ „๋ถ€ `align: 'right'` ์ธ๊ฐ€
1512
2007
  - [ ] ๋ฒˆํ˜ธยท์ฝ”๋“œยท์ „ํ™”๋ฒˆํ˜ธยท์ผ์ž ์ปฌ๋Ÿผ์— `align: 'center'` ๋ฅผ **๋ช…์‹œ**ํ–ˆ๋Š”๊ฐ€ (์ƒ๋žตํ•˜๋ฉด ์ขŒ์ธก์ด ๋œ๋‹ค)
1513
- - [ ] ์ปจํŠธ๋กค(`STag`ยท`SButton`ยท`SSelect`ยท`SInput` โ€ฆ)์ด ๋“ค์–ด๊ฐ€๋Š” ์ปฌ๋Ÿผ์— `width` ๋ฅผ ๋ช…์‹œํ–ˆ๋Š”๊ฐ€, `resizable` ์ด๋ฉด `minWidth` ๋„ ์คฌ๋Š”๊ฐ€ (ยง3-4 โ€” ํญ์ด ๋ชจ์ž๋ผ๋ฉด ์š”์†Œ๊ฐ€ ์ž˜๋ ค ๋ชป ์“ด๋‹ค)
2008
+ - [ ] ๋‹ซํžŒ ๊ฐ’ ์ง‘ํ•ฉ(enumยท๋งˆ์Šคํ„ฐ ๋ชฉ๋ก์—์„œ ๊ณ ๋ฅด๋Š” ๊ฐ’) ์ปฌ๋Ÿผ์— `align: 'center'` ๋ฅผ ์คฌ๋Š”๊ฐ€ โ€” ํƒœ๊ทธ๋กœ ๊ทธ๋ ธ๋“  ๋งจ ํ…์ŠคํŠธ๋กœ ๊ทธ๋ ธ๋“  ๊ฐ™๋‹ค (ยง3-4)
2009
+ - [ ] **๋ชจ๋“  ์ปฌ๋Ÿผ์— ํญ์„ ๋ช…์‹œ**ํ–ˆ๋Š”๊ฐ€, px ๋กœ๋งŒ ์คฌ๋Š”๊ฐ€ (`%`ยท`clamp()` โŒ), `autoWidth` ๋Š” ์ŠคํŽ˜์ด์„œ ์—ด ํ•˜๋‚˜๋ฟ์ธ๊ฐ€ (ยง3-4)
2010
+ - [ ] ์ปจํŠธ๋กค(`STag`ยท`SButton`ยท`SSelect`ยท`SInput` โ€ฆ)์ด ๋“ค์–ด๊ฐ€๋Š” ์ปฌ๋Ÿผ์ด `resizable` ์ด๋ฉด `minWidth` ๋„ ์คฌ๋Š”๊ฐ€ (ยง3-4 โ€” ํญ์ด ๋ชจ์ž๋ผ๋ฉด ์š”์†Œ๊ฐ€ ์ž˜๋ ค ๋ชป ์“ด๋‹ค)
2011
+ - [ ] ์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ์—ด์— `sortable` ์„ ์คฌ๋Š”๊ฐ€ (`renderHeader` ๋กœ ์ง์ ‘ ๋งŒ๋“ค์ง€ ์•Š์•˜๋Š”๊ฐ€), ์ •๋ ฌ ์ƒํƒœ๋ฅผ ํŽ˜์ด์ง€๊ฐ€ ๋“ค๊ณ  ์žˆ๋Š”๊ฐ€ (ยง3-4)
2012
+ - [ ] `editable` ยท `navigable` ํ‘œ์‹์„ ์ผ  ์—ด์ด **์…€์—์„œ๋„ ์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€** (์ž…๋ ฅ ์ปจํŠธ๋กค ยท ๋งํฌ๊ฐ€ ์žˆ๋Š”๊ฐ€), ํ‘œ์‹์„ ๋ถ™์ธ ์—ด์˜ ํญ์„ ํ•จ๊ป˜ ๋„“ํ˜”๋Š”๊ฐ€ (ยง3-4)
1514
2013
  - [ ] ๊ธˆ์•กยท์ˆ˜๋Ÿ‰ ๋“ฑ ์–‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž์— ๋น ์ง์—†์ด `toLocaleString()` ์„ ์ผ๋Š”๊ฐ€ (๋ฒˆํ˜ธยท์ฝ”๋“œ๋Š” ์ œ์™ธ)
2014
+ - [ ] ๋‚ ์งœ๋ฅผ `YYYY-MM-DD` ๋กœ ํ‘œ๊ธฐํ–ˆ๋Š”๊ฐ€ (`toLocaleDateString()` โŒ, ยง1-4)
2015
+ - [ ] ํ•„๋“œ ํญ์„ ๋“ฑ๊ธ‰(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`)์œผ๋กœ ์คฌ๋Š”๊ฐ€ โ€” px ์ง์ ‘ ์ง€์ • โŒ (ยง4-3)
2016
+ - [ ] ์กฐํšŒ ์กฐ๊ฑด์œผ๋กœ ์“ฐ๋Š” ์…€๋ ‰ํŠธยท๋‚ ์งœยท์‹œ๊ฐ„ ํ”ผ์ปค์— `clearable` ์„ ์คฌ๋Š”๊ฐ€, ๊ทธ ์ƒํƒœ๊ฐ€ `null` ์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š”๊ฐ€ (ยง3-7-4 โ€” ํ•„์ˆ˜ ์ž…๋ ฅ ํ•„๋“œ์—๋Š” ์ผœ์ง€ ์•Š๋Š”๋‹ค)
2017
+ - [ ] `SKeyValueTable` ์˜ ์งง์€ ํ–‰์— `tdColSpan` ์„ ์ฃผ์–ด ์ „์ฒด ์—ด ์ˆ˜๋ฅผ ์ฑ„์› ๋Š”๊ฐ€ (ยง4-3 โ€” ์•ˆ ์ฑ„์šฐ๋ฉด ๊ทธ ๊ตฌ๊ฐ„์˜ ํ–‰ ๊ตฌ๋ถ„์„ ์ด ๋Š๊ธด๋‹ค)
1515
2018
  - [ ] ํ•˜๋‹จ ๋ฒ„ํŠผ์ด ์–‘๋ ๋ถ„๋ฆฌ(`justify-between`)์ด๊ณ , ๋˜๋Œ๋ฆฌ๊ธฐ๊ฐ€ ์™ผ์ชฝ ๋ ยท ์‹คํ–‰์ด ์˜ค๋ฅธ์ชฝ ๋์ธ๊ฐ€
1516
2019
  - [ ] ํŽ˜์ด์ง€์— `color="primary"` ์ฑ„์›€ ๋ฒ„ํŠผ์ด **1๊ฐœ๋ฟ**์ธ๊ฐ€ (`danger` ์ฑ„์›€๋„ 1๊ฐœ, `SDropdownButton` ํฌํ•จ)
1517
2020
  - [ ] ๋ฒ„ํŠผ `size` ๊ฐ€ ์œ„์น˜ ๊ทœ์น™๊ณผ ๋งž๋Š”๊ฐ€ (ํ–‰ ๋‚ด๋ถ€ `xs` / ํ™”๋ฉด ์•ก์…˜ `sm` / ๋ชจ๋‹ฌ ํ‘ธํ„ฐ `md`)
@@ -1520,7 +2023,7 @@ export default function ProductDetailPage() {
1520
2023
  - [ ] `SGhostButton` ์˜ `intent` ๊ฐ€ ์กฐ์ž‘ ์„ฑ๊ฒฉ๊ณผ ๋งž๋Š”๊ฐ€ (๋˜๋Œ๋ฆด ์ˆ˜ ์—†๋Š” ์‚ญ์ œ๋งŒ `danger`, ์ง„์ž…ยท์ถ”๊ฐ€๋Š” `action`, ๋‚˜๋จธ์ง€๋Š” `default`)
1521
2024
  - [ ] ์ฐฝ์„ ๋„์šธ ๋•Œ ยง3-3-1 ํŒ๋ณ„ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ž๋Š”๊ฐ€ (๊ทธ ์ž์ฒด๊ฐ€ ํ™”๋ฉด โ†’ `SPopup` / ์‹คํ–‰ ์—ฌ๋ถ€๋งŒ ํ™•์ • โ†’ `SModal.confirm` / ๋ชจ๋‹ฌ ์•ˆ์—์„œ ์ž‘์„ฑ โ†’ `SActionModal`)
1522
2025
  - [ ] ์ž‘์—…์šฉ ๋ชจ๋‹ฌ์„ `SActionModal` + `SModal.create` ๋กœ ๋งŒ๋“ค์—ˆ๋Š”๊ฐ€ (์ง์ ‘ ์˜ค๋ฒ„๋ ˆ์ด โŒ)
1523
- - [ ] ๋ชจ๋‹ฌยท๋“œ๋กœ์–ด์˜ ํ•˜๋‹จ ๋ฒ„ํŠผ์„ ๋ณธ๋ฌธ์ด ์•„๋‹ˆ๋ผ `button` ยท `footerLeft` prop ์œผ๋กœ ๋„˜๊ฒผ๋Š”๊ฐ€ (ยง3-3-4)
2026
+ - [ ] ๋ชจ๋‹ฌยท๋“œ๋กœ์–ด์˜ ํ•˜๋‹จ ๋ฒ„ํŠผ์„ ๋ณธ๋ฌธ์ด ์•„๋‹ˆ๋ผ `button` ยท `footerLeft` prop ์œผ๋กœ ๋„˜๊ฒผ๋Š”๊ฐ€ (ยง3-3-4), ์นด๋“œ ์•ˆ์—์„œ ๋‹ซํžˆ๋Š” ์•ก์…˜๋„ ๊ฐ™์€ prop ์œผ๋กœ ๋„˜๊ฒผ๋Š”๊ฐ€ (ยง3-7-8)
1524
2027
  - [ ] ์•ฑ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ์˜ Provider ์•ˆ์ชฝ์— `<SModalOutlet />` ์ด ํ•œ ๋ฒˆ ๋ Œ๋”๋˜์–ด ์žˆ๋Š”๊ฐ€ (ยง4-1 โ€” ์—†์œผ๋ฉด ๋ชจ๋‹ฌ ์•ˆ์—์„œ ์•ฑ ํ›…์ด ์ฃฝ๋Š”๋‹ค), ๊ทธ ๋Œ€์‹ ์œผ๋กœ ๋ชจ๋‹ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ Provider ๋กœ ๋‹ค์‹œ ๊ฐ์‹ธ์ง€ ์•Š์•˜๋Š”๊ฐ€
1525
2028
  - [ ] ๊ณ ๋ฅธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ยง2-0 ์˜ ์ œ ์ธต์— ๋†“์•˜๋Š”๊ฐ€ (์š”์†Œ๋ฅผ `SPage` ์— ์ง์ ‘ ๋†“์ง€ ์•Š์•˜๋Š”๊ฐ€, ๋ธ”๋ก์„ `div` ๋กœ ๊ฐ์‹ธ์ง€ ์•Š์•˜๋Š”๊ฐ€)
1526
2029
  - [ ] ยง2-0 ํฌํ•จ ๊ทœ์น™์„ ์ง€์ผฐ๋Š”๊ฐ€ (์นด๋“œ ์•ˆ ์นด๋“œ โŒ, ํ‘œ ์…€ ์•ˆ ๋ธ”๋ก โŒ)
@@ -1548,6 +2051,8 @@ export default function ProductDetailPage() {
1548
2051
  | `sellmate/component-group-gap` | warn | ยง2-2 ์ปดํฌ๋„ŒํŠธ ๊ทธ๋ฃน ๊ฐ„๊ฒฉ (์ฒดํฌ๋ฐ•์Šค ๊ฐ€๋กœ 24 / ์„ธ๋กœ 8 ๋“ฑ) |
1549
2052
  | `sellmate/table-numeric-align` | warn | ยง3-4 ์ˆซ์ž ์ปฌ๋Ÿผ์˜ `align: 'right'` ๋ˆ„๋ฝ (`--fix` ์ง€์›) |
1550
2053
  | `sellmate/require-locale-number` | warn | ยง1-4 ๊ธˆ์•กยท์ˆ˜๋Ÿ‰ ๋“ฑ ์ˆ˜๋Ÿ‰ ์ปฌ๋Ÿผ์˜ `toLocaleString()` ๋ˆ„๋ฝ |
2054
+ | `sellmate/field-width-grade` | warn | ยง4-3 ํ•„๋“œ ํญ์ด `maxLength` ์ƒํ•œ๊ณผ ๋งž๋Š” ๋“ฑ๊ธ‰์ธ๊ฐ€, px ๋ฅผ ์ง์ ‘ ์ ์ง€ ์•Š์•˜๋Š”๊ฐ€ (px โ†’ ๋“ฑ๊ธ‰ `--fix` ์ง€์›) |
2055
+ | `sellmate/table-column-width` | warn | ยง3-4 ์ปฌ๋Ÿผ ํญ ๋ฏธ์ง€์ •(๊ธฐ๋ณธ 120px)ยทpx ์•„๋‹Œ ๊ฐ’(`%`ยท`clamp()`)ยท`autoWidth` ์˜ค์šฉ |
1551
2056
  | `sellmate/no-arbitrary-class` | off | ยง1-2 ํ† ํฐ ์žˆ๋Š” ์†์„ฑ์˜ ์ž„์˜ ๊ฐ’ (`text-[14px]`, `bg-[#eee]`) โ€” ํŒ€์ด ์ผค ๋•Œ๋งŒ |
1552
2057
 
1553
2058
  `configs.strict` ๋ฅผ ์“ฐ๋Š” ํ”„๋กœ์ ํŠธ๋Š” ์ „๋ถ€ error ์ด๊ณ  ๊ฐ„๊ฒฉ `sd-` ์ ‘๋‘๊นŒ์ง€ ๊ฐ•์ œ๋œ๋‹ค.