sellmate-design-system-react 9.0.0-beta.8 → 9.0.0-beta.80

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 (409) hide show
  1. package/AGENTS.md +3974 -267
  2. package/README.md +76 -24
  3. package/bin/sellmate-ds.mjs +91 -59
  4. package/dist/components/SAccountListBox/AccountListBoxPortal.d.ts +31 -0
  5. package/dist/components/SAccountListBox/README.md +86 -0
  6. package/dist/components/SAccountListBox/SAccountListBox.d.ts +79 -0
  7. package/dist/components/SAccountListBox/SystemMenuPortal.d.ts +58 -0
  8. package/dist/components/SAccountListBox/accountListBox.config.d.ts +64 -0
  9. package/dist/components/SAccountListBox/index.d.ts +2 -0
  10. package/dist/components/SActionModal/README.md +1 -0
  11. package/dist/components/SActionModal/SActionModal.d.ts +9 -1
  12. package/dist/components/SBadge/README.md +27 -0
  13. package/dist/components/SBadge/SBadge.d.ts +1 -1
  14. package/dist/components/SBarChart/README.md +122 -0
  15. package/dist/components/SBarChart/SBarChart.d.ts +99 -0
  16. package/dist/components/SBarChart/barChart.config.d.ts +85 -0
  17. package/dist/components/SBarChart/index.d.ts +2 -0
  18. package/dist/components/SBarcodeInput/README.md +14 -4
  19. package/dist/components/SBarcodeInput/SBarcodeInput.d.ts +25 -3
  20. package/dist/components/SButton/README.md +40 -0
  21. package/dist/components/SCalendar/README.md +13 -0
  22. package/dist/components/SCalendarBoard/CalendarDayCard.d.ts +53 -0
  23. package/dist/components/SCalendarBoard/CalendarDayEventListBox.d.ts +26 -0
  24. package/dist/components/SCalendarBoard/CalendarEventButton.d.ts +20 -0
  25. package/dist/components/SCalendarBoard/CalendarMoreButton.d.ts +18 -0
  26. package/dist/components/SCalendarBoard/README.md +148 -0
  27. package/dist/components/SCalendarBoard/SCalendarBoard.d.ts +83 -0
  28. package/dist/components/SCalendarBoard/calendar-board-layout.d.ts +59 -0
  29. package/dist/components/SCalendarBoard/calendarBoard.config.d.ts +38 -0
  30. package/dist/components/SCalendarBoard/index.d.ts +3 -0
  31. package/dist/components/SCalendarBoard/types.d.ts +40 -0
  32. package/dist/components/SCallout/README.md +17 -1
  33. package/dist/components/SCallout/SCallout.d.ts +14 -4
  34. package/dist/components/SCard/README.md +17 -0
  35. package/dist/components/SCard/SCard.d.ts +26 -2
  36. package/dist/components/SChatAttachedFile/README.md +33 -0
  37. package/dist/components/SChatAttachedFile/SChatAttachedFile.d.ts +13 -0
  38. package/dist/components/SChatAttachedFile/chatAttachedFile.config.d.ts +23 -0
  39. package/dist/components/SChatAttachedFile/index.d.ts +2 -0
  40. package/dist/components/SChatFile/README.md +33 -0
  41. package/dist/components/SChatFile/SChatFile.d.ts +37 -0
  42. package/dist/components/SChatFile/chatFile.config.d.ts +56 -0
  43. package/dist/components/SChatFile/index.d.ts +2 -0
  44. package/dist/components/SChatInput/README.md +44 -0
  45. package/dist/components/SChatInput/SChatInput.d.ts +60 -0
  46. package/dist/components/SChatInput/index.d.ts +1 -0
  47. package/dist/components/SChatMessage/README.md +86 -0
  48. package/dist/components/SChatMessage/SChatMessage.d.ts +123 -0
  49. package/dist/components/SChatMessage/index.d.ts +1 -0
  50. package/dist/components/SChatSystemMessage/README.md +12 -0
  51. package/dist/components/SChatSystemMessage/SChatSystemMessage.d.ts +18 -0
  52. package/dist/components/SChatSystemMessage/index.d.ts +1 -0
  53. package/dist/components/SCheckbox/README.md +8 -0
  54. package/dist/components/SChip/README.md +25 -0
  55. package/dist/components/SChip/SChip.d.ts +8 -0
  56. package/dist/components/SChip/index.d.ts +1 -1
  57. package/dist/components/SChipFilter/README.md +369 -14
  58. package/dist/components/SChipFilter/SChipFilter.d.ts +169 -60
  59. package/dist/components/SChipFilter/index.d.ts +1 -1
  60. package/dist/components/SChipInput/README.md +18 -2
  61. package/dist/components/SChipInput/SChipInput.d.ts +23 -3
  62. package/dist/components/SChipInput/index.d.ts +1 -1
  63. package/dist/components/SCircleProgress/README.md +13 -2
  64. package/dist/components/SCircleProgress/SCircleProgress.d.ts +11 -3
  65. package/dist/components/SConfirmModal/README.md +13 -4
  66. package/dist/components/SConfirmModal/SConfirmModal.d.ts +46 -9
  67. package/dist/components/SContextAlert/README.md +52 -0
  68. package/dist/components/SContextAlert/SContextAlert.d.ts +51 -0
  69. package/dist/components/SContextAlert/contextAlert.config.d.ts +22 -0
  70. package/dist/components/SContextAlert/index.d.ts +2 -0
  71. package/dist/components/SDatePicker/README.md +22 -2
  72. package/dist/components/SDatePicker/SDatePicker.d.ts +42 -5
  73. package/dist/components/SDateRangePicker/README.md +22 -4
  74. package/dist/components/SDateRangePicker/SDateRangePicker.d.ts +44 -7
  75. package/dist/components/SDivider/README.md +7 -0
  76. package/dist/components/SDivider/SDivider.d.ts +11 -0
  77. package/dist/components/SDonutChart/README.md +105 -0
  78. package/dist/components/SDonutChart/SDonutChart.d.ts +82 -0
  79. package/dist/components/SDonutChart/index.d.ts +1 -0
  80. package/dist/components/SDraggableItem/README.md +37 -0
  81. package/dist/components/SDraggableItem/SDraggableItem.d.ts +2 -0
  82. package/dist/components/SDraggableItem/index.d.ts +1 -1
  83. package/dist/components/SDraggableList/README.md +33 -3
  84. package/dist/components/SDraggableList/SDraggableList.d.ts +18 -3
  85. package/dist/components/SDraggableList/index.d.ts +1 -1
  86. package/dist/components/SDrawer/README.md +8 -0
  87. package/dist/components/SDropdownButton/README.md +19 -0
  88. package/dist/components/SEditor/EditorBody.d.ts +36 -0
  89. package/dist/components/SEditor/EditorToolbar.d.ts +93 -0
  90. package/dist/components/SEditor/README.md +205 -0
  91. package/dist/components/SEditor/SEditor.d.ts +128 -0
  92. package/dist/components/SEditor/editor-icons.d.ts +63 -0
  93. package/dist/components/SEditor/editor.config.d.ts +119 -0
  94. package/dist/components/SEditor/index.d.ts +8 -0
  95. package/dist/components/SEditor/tiptap-api.d.ts +29 -0
  96. package/dist/components/SEditor/use-is-mobile.d.ts +14 -0
  97. package/dist/components/SExpansionItem/README.md +38 -2
  98. package/dist/components/SExpansionItem/SExpansionItem.d.ts +8 -2
  99. package/dist/components/SExpansionItem/index.d.ts +1 -1
  100. package/dist/components/SField/README.md +37 -5
  101. package/dist/components/SField/SField.d.ts +40 -8
  102. package/dist/components/SField/index.d.ts +1 -1
  103. package/dist/components/SFilePicker/README.md +20 -4
  104. package/dist/components/SFilePicker/SFilePicker.d.ts +26 -6
  105. package/dist/components/SFooter/README.md +44 -0
  106. package/dist/components/SFooter/SFooter.d.ts +29 -13
  107. package/dist/components/SFooter/index.d.ts +1 -1
  108. package/dist/components/SForm/README.md +12 -1
  109. package/dist/components/SForm/SForm.d.ts +2 -2
  110. package/dist/components/SGhostButton/README.md +28 -4
  111. package/dist/components/SGhostButton/SGhostButton.d.ts +4 -1
  112. package/dist/components/SGnb/README.md +109 -8
  113. package/dist/components/SGnb/SGnb.d.ts +112 -11
  114. package/dist/components/SGnb/gnb.config.d.ts +18 -5
  115. package/dist/components/SGnb/index.d.ts +1 -1
  116. package/dist/components/SGnbSystem/README.md +186 -0
  117. package/dist/components/SGnbSystem/SGnbSystem.d.ts +179 -0
  118. package/dist/components/SGnbSystem/gnbSystem.config.d.ts +122 -0
  119. package/dist/components/SGnbSystem/index.d.ts +2 -0
  120. package/dist/components/SGuide/README.md +16 -1
  121. package/dist/components/SGuide/SGuide.d.ts +5 -2
  122. package/dist/components/SIcon/README.md +20 -0
  123. package/dist/components/SIcon/SIcon.d.ts +1 -1
  124. package/dist/components/SIcon/icons.gen.d.ts +20 -1
  125. package/dist/components/SImage/README.md +23 -1
  126. package/dist/components/SImage/SImage.d.ts +11 -8
  127. package/dist/components/SInput/README.md +8 -4
  128. package/dist/components/SInput/SInput.d.ts +17 -5
  129. package/dist/components/SKeyValueTable/README.md +88 -0
  130. package/dist/components/SKeyValueTable/SKeyValueTable.d.ts +30 -3
  131. package/dist/components/SKeyValueTable/index.d.ts +1 -1
  132. package/dist/components/SLauncherListBox/README.md +82 -0
  133. package/dist/components/SLauncherListBox/SLauncherListBox.d.ts +80 -0
  134. package/dist/components/SLauncherListBox/index.d.ts +2 -0
  135. package/dist/components/SLauncherListBox/launcherListBox.config.d.ts +154 -0
  136. package/dist/components/SLayout/README.md +22 -1
  137. package/dist/components/SLayout/SLayout.d.ts +6 -2
  138. package/dist/components/SLayout/index.d.ts +1 -1
  139. package/dist/components/SLineChart/README.md +131 -0
  140. package/dist/components/SLineChart/SLineChart.d.ts +110 -0
  141. package/dist/components/SLineChart/index.d.ts +1 -0
  142. package/dist/components/SLineChart/lineChart.config.d.ts +95 -0
  143. package/dist/components/SLinearProgress/README.md +16 -1
  144. package/dist/components/SLinearProgress/SLinearProgress.d.ts +11 -2
  145. package/dist/components/SLinearProgress/index.d.ts +1 -1
  146. package/dist/components/SList/README.md +15 -2
  147. package/dist/components/SList/SList.d.ts +7 -3
  148. package/dist/components/SList/index.d.ts +1 -1
  149. package/dist/components/SListItem/README.md +43 -2
  150. package/dist/components/SListItem/SListItem.d.ts +8 -2
  151. package/dist/components/SListItem/index.d.ts +1 -1
  152. package/dist/components/SLoadingContainer/index.d.ts +1 -1
  153. package/dist/components/SLoadingContainer/loading.d.ts +41 -6
  154. package/dist/components/SLoadingModal/README.md +10 -2
  155. package/dist/components/SLoadingModal/SLoadingModal.d.ts +4 -4
  156. package/dist/components/SLoadingModal/index.d.ts +1 -1
  157. package/dist/components/SLoginCard/README.md +37 -0
  158. package/dist/components/SLoginCard/SLoginCard.d.ts +43 -0
  159. package/dist/components/SLoginCard/index.d.ts +1 -0
  160. package/dist/components/SLogo/README.md +103 -0
  161. package/dist/components/SLogo/SLogo.d.ts +72 -0
  162. package/dist/components/SLogo/index.d.ts +2 -0
  163. package/dist/components/SLogo/logo.config.d.ts +29 -0
  164. package/dist/components/SLogo/logos.d.ts +16 -0
  165. package/dist/components/SMeatballButton/README.md +67 -0
  166. package/dist/components/SMeatballButton/SMeatballButton.d.ts +36 -0
  167. package/dist/components/SMeatballButton/index.d.ts +1 -0
  168. package/dist/components/SModal/README.md +15 -5
  169. package/dist/components/SModal/SModal.d.ts +1 -1
  170. package/dist/components/SNumberInput/README.md +19 -8
  171. package/dist/components/SNumberInput/SNumberInput.d.ts +49 -7
  172. package/dist/components/SPage/README.md +105 -5
  173. package/dist/components/SPage/SPage.d.ts +34 -10
  174. package/dist/components/SPage/SPageHeader.d.ts +31 -13
  175. package/dist/components/SPage/index.d.ts +2 -2
  176. package/dist/components/SPage/page-column.d.ts +34 -0
  177. package/dist/components/SPage/page-width.d.ts +23 -0
  178. package/dist/components/SPage/page.config.d.ts +26 -0
  179. package/dist/components/SPieChart/README.md +93 -0
  180. package/dist/components/SPieChart/SPieChart.d.ts +73 -0
  181. package/dist/components/SPieChart/index.d.ts +1 -0
  182. package/dist/components/SPopover/README.md +15 -0
  183. package/dist/components/SPopup/README.md +26 -2
  184. package/dist/components/SPopup/SPopup.d.ts +13 -10
  185. package/dist/components/SPopup/index.d.ts +1 -1
  186. package/dist/components/SPortal/README.md +20 -0
  187. package/dist/components/SRadio/README.md +20 -0
  188. package/dist/components/SRadioButton/README.md +26 -0
  189. package/dist/components/SRadioButton/SRadioButton.d.ts +9 -2
  190. package/dist/components/SRadioCard/README.md +78 -0
  191. package/dist/components/SRadioCard/SRadioCard.d.ts +29 -0
  192. package/dist/components/SRadioCard/SRadioCardGroup.d.ts +36 -0
  193. package/dist/components/SRadioCard/index.d.ts +2 -0
  194. package/dist/components/SScrollArea/README.md +28 -0
  195. package/dist/components/SScrollArea/SScrollArea.d.ts +17 -0
  196. package/dist/components/SSearchInput/README.md +63 -0
  197. package/dist/components/SSearchInput/SSearchInput.d.ts +52 -0
  198. package/dist/components/SSearchInput/index.d.ts +1 -0
  199. package/dist/components/SSectionHeaderCard/README.md +38 -0
  200. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.d.ts +19 -0
  201. package/dist/components/SSelect/README.md +64 -11
  202. package/dist/components/SSelect/SSelect.d.ts +135 -15
  203. package/dist/components/SSelect/index.d.ts +1 -1
  204. package/dist/components/SSelect/select.config.d.ts +17 -0
  205. package/dist/components/SSkeleton/README.md +55 -0
  206. package/dist/components/SSkeleton/SSkeleton.d.ts +39 -0
  207. package/dist/components/SSkeleton/index.d.ts +2 -0
  208. package/dist/components/SSkeleton/skeleton.config.d.ts +22 -0
  209. package/dist/components/SSplitter/README.md +17 -2
  210. package/dist/components/SSplitter/SSplitter.d.ts +7 -3
  211. package/dist/components/SStepper/README.md +26 -0
  212. package/dist/components/SSwitch/README.md +13 -1
  213. package/dist/components/SSwitch/SSwitch.d.ts +1 -3
  214. package/dist/components/SSystemActionButton/README.md +246 -0
  215. package/dist/components/SSystemActionButton/SSystemActionButton.d.ts +167 -0
  216. package/dist/components/SSystemActionButton/index.d.ts +2 -0
  217. package/dist/components/SSystemActionButton/systemActionButton.config.d.ts +93 -0
  218. package/dist/components/STable/README.md +135 -20
  219. package/dist/components/STable/STable.d.ts +292 -46
  220. package/dist/components/STable/index.d.ts +1 -1
  221. package/dist/components/STableBar/README.md +1 -0
  222. package/dist/components/STableBar/STableBar.d.ts +8 -1
  223. package/dist/components/STabs/README.md +13 -1
  224. package/dist/components/STabs/STabs.d.ts +2 -2
  225. package/dist/components/STag/README.md +55 -0
  226. package/dist/components/STag/STag.d.ts +3 -1
  227. package/dist/components/STag/tag.config.d.ts +1 -1
  228. package/dist/components/STextLink/README.md +21 -1
  229. package/dist/components/STextLink/STextLink.d.ts +5 -1
  230. package/dist/components/STextarea/README.md +12 -5
  231. package/dist/components/STextarea/STextarea.d.ts +49 -6
  232. package/dist/components/STimePicker/README.md +19 -2
  233. package/dist/components/STimePicker/STimePicker.d.ts +36 -6
  234. package/dist/components/STimePicker/timepicker.config.d.ts +4 -2
  235. package/dist/components/STimeRangePicker/README.md +31 -2
  236. package/dist/components/STimeRangePicker/STimeRangePicker.d.ts +35 -6
  237. package/dist/components/SToast/README.md +25 -1
  238. package/dist/components/SToast/SToast.d.ts +2 -2
  239. package/dist/components/SToggle/README.md +8 -0
  240. package/dist/components/SToggle/index.d.ts +1 -1
  241. package/dist/components/STooltip/README.md +27 -1
  242. package/dist/components/STooltip/STooltip.d.ts +1 -1
  243. package/dist/components/STree/README.md +42 -4
  244. package/dist/components/STree/STree.d.ts +18 -6
  245. package/dist/components/STree/STree.examples.d.ts +2 -0
  246. package/dist/docs/Gallery.d.ts +9 -0
  247. package/dist/docs/RecipeGallery.d.ts +13 -0
  248. package/dist/docs/gallery-previews.d.ts +24 -0
  249. package/dist/fonts/LICENSE.txt +94 -0
  250. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.0.woff2 +0 -0
  251. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.1.woff2 +0 -0
  252. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.10.woff2 +0 -0
  253. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.11.woff2 +0 -0
  254. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.12.woff2 +0 -0
  255. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.13.woff2 +0 -0
  256. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.14.woff2 +0 -0
  257. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.15.woff2 +0 -0
  258. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.16.woff2 +0 -0
  259. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.17.woff2 +0 -0
  260. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.18.woff2 +0 -0
  261. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.19.woff2 +0 -0
  262. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.2.woff2 +0 -0
  263. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.20.woff2 +0 -0
  264. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.21.woff2 +0 -0
  265. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.22.woff2 +0 -0
  266. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.23.woff2 +0 -0
  267. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.24.woff2 +0 -0
  268. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.25.woff2 +0 -0
  269. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.26.woff2 +0 -0
  270. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.27.woff2 +0 -0
  271. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.28.woff2 +0 -0
  272. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.29.woff2 +0 -0
  273. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.3.woff2 +0 -0
  274. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.30.woff2 +0 -0
  275. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.31.woff2 +0 -0
  276. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.32.woff2 +0 -0
  277. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.33.woff2 +0 -0
  278. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.34.woff2 +0 -0
  279. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.35.woff2 +0 -0
  280. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.36.woff2 +0 -0
  281. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.37.woff2 +0 -0
  282. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.38.woff2 +0 -0
  283. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.39.woff2 +0 -0
  284. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.4.woff2 +0 -0
  285. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.40.woff2 +0 -0
  286. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.41.woff2 +0 -0
  287. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.42.woff2 +0 -0
  288. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.43.woff2 +0 -0
  289. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.44.woff2 +0 -0
  290. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.45.woff2 +0 -0
  291. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.46.woff2 +0 -0
  292. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.47.woff2 +0 -0
  293. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.48.woff2 +0 -0
  294. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.49.woff2 +0 -0
  295. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.5.woff2 +0 -0
  296. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.50.woff2 +0 -0
  297. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.51.woff2 +0 -0
  298. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.52.woff2 +0 -0
  299. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.53.woff2 +0 -0
  300. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.54.woff2 +0 -0
  301. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.55.woff2 +0 -0
  302. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.56.woff2 +0 -0
  303. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.57.woff2 +0 -0
  304. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.58.woff2 +0 -0
  305. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.59.woff2 +0 -0
  306. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.6.woff2 +0 -0
  307. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.60.woff2 +0 -0
  308. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.61.woff2 +0 -0
  309. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.62.woff2 +0 -0
  310. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.63.woff2 +0 -0
  311. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.64.woff2 +0 -0
  312. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.65.woff2 +0 -0
  313. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.66.woff2 +0 -0
  314. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.67.woff2 +0 -0
  315. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.68.woff2 +0 -0
  316. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.69.woff2 +0 -0
  317. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.7.woff2 +0 -0
  318. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.70.woff2 +0 -0
  319. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.71.woff2 +0 -0
  320. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.72.woff2 +0 -0
  321. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.73.woff2 +0 -0
  322. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.74.woff2 +0 -0
  323. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.75.woff2 +0 -0
  324. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.76.woff2 +0 -0
  325. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.77.woff2 +0 -0
  326. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.78.woff2 +0 -0
  327. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.79.woff2 +0 -0
  328. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.8.woff2 +0 -0
  329. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.80.woff2 +0 -0
  330. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.81.woff2 +0 -0
  331. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.82.woff2 +0 -0
  332. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.83.woff2 +0 -0
  333. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.84.woff2 +0 -0
  334. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.85.woff2 +0 -0
  335. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.86.woff2 +0 -0
  336. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.87.woff2 +0 -0
  337. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.88.woff2 +0 -0
  338. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.89.woff2 +0 -0
  339. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.9.woff2 +0 -0
  340. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.90.woff2 +0 -0
  341. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.91.woff2 +0 -0
  342. package/dist/index.cjs +21789 -10666
  343. package/dist/index.cjs.map +1 -1
  344. package/dist/index.d.ts +23 -0
  345. package/dist/index.js +21704 -10665
  346. package/dist/index.js.map +1 -1
  347. package/dist/lib/chart/cartesian.d.ts +56 -0
  348. package/dist/lib/chart/frame.d.ts +21 -0
  349. package/dist/lib/chart/hover-dim.d.ts +19 -0
  350. package/dist/lib/chart/legend.d.ts +21 -0
  351. package/dist/lib/chart/palette.d.ts +28 -0
  352. package/dist/lib/chart/radial.d.ts +99 -0
  353. package/dist/lib/chart/scale.d.ts +26 -0
  354. package/dist/lib/chart/tooltip.d.ts +60 -0
  355. package/dist/lib/chart/types.d.ts +29 -0
  356. package/dist/lib/chart/use-element-size.d.ts +39 -0
  357. package/dist/lib/date.d.ts +2 -1
  358. package/dist/lib/depth-filter.d.ts +27 -0
  359. package/dist/lib/doc-sections.d.ts +35 -0
  360. package/dist/lib/dropdown-menu.d.ts +19 -0
  361. package/dist/lib/field-width.d.ts +31 -0
  362. package/dist/lib/floating-height.d.ts +15 -0
  363. package/dist/lib/global-overlay.d.ts +5 -0
  364. package/dist/lib/hover-preview.d.ts +32 -0
  365. package/dist/lib/inert.d.ts +11 -0
  366. package/dist/lib/overlay-scrollbar.d.ts +32 -0
  367. package/dist/lib/row-metrics.d.ts +61 -0
  368. package/dist/lib/story-docs.d.ts +19 -3
  369. package/dist/llms-full.txt +9674 -2059
  370. package/dist/llms.txt +4062 -326
  371. package/dist/playground/categories.d.ts +19 -0
  372. package/dist/pretendard.css +937 -0
  373. package/dist/recipes/AppShell.d.ts +21 -0
  374. package/dist/recipes/CategoryManagePage.d.ts +1 -0
  375. package/dist/recipes/ConsultConsolePage.d.ts +1 -0
  376. package/dist/recipes/ExcelFilePopupPage.d.ts +5 -0
  377. package/dist/recipes/LoginPage.d.ts +6 -0
  378. package/dist/recipes/ProductBulkUploadPage.d.ts +1 -0
  379. package/dist/recipes/ProductCreatePage.d.ts +1 -0
  380. package/dist/recipes/ProductCreateSectionsPage.d.ts +5 -0
  381. package/dist/recipes/ProductDetailInlineEditPage.d.ts +9 -0
  382. package/dist/recipes/ProductDetailPage.d.ts +1 -0
  383. package/dist/recipes/ProductListChipFilterPage.d.ts +1 -0
  384. package/dist/recipes/ProductListPage.d.ts +1 -0
  385. package/dist/recipes/ProductOverlayPage.d.ts +1 -0
  386. package/dist/recipes/SalesDashboardPage.d.ts +1 -0
  387. package/dist/recipes/SettingsPage.d.ts +1 -0
  388. package/dist/recipes/StoreSetupPage.d.ts +1 -0
  389. package/dist/recipes/TransferOrderPopupPage.d.ts +2 -0
  390. package/dist/recipes/api.d.ts +220 -0
  391. package/dist/recipes/recipe-story.d.ts +33 -0
  392. package/dist/recipes/router.d.ts +9 -0
  393. package/dist/styles.css +3541 -262
  394. package/dist/theme.css +598 -28
  395. package/eslint/index.mjs +44 -35
  396. package/eslint/lib/class-names.mjs +23 -25
  397. package/eslint/lib/table-column.mjs +34 -8
  398. package/eslint/rules/component-group-gap.mjs +32 -30
  399. package/eslint/rules/divider-vertical-height.mjs +137 -0
  400. package/eslint/rules/field-width-grade.mjs +69 -52
  401. package/eslint/rules/no-arbitrary-class.mjs +63 -20
  402. package/eslint/rules/no-off-scale-spacing.mjs +61 -41
  403. package/eslint/rules/no-raw-html-control.mjs +38 -36
  404. package/eslint/rules/prefer-typo-preset.mjs +23 -17
  405. package/eslint/rules/require-locale-number.mjs +14 -19
  406. package/eslint/rules/table-column-width.mjs +114 -0
  407. package/eslint/rules/table-numeric-align.mjs +14 -14
  408. package/eslint/scale.gen.mjs +6 -3
  409. package/package.json +19 -5
package/README.md CHANGED
@@ -50,6 +50,19 @@ npx sellmate-ds init
50
50
  `sd-` 접두로 씁니다: `p-sd-16`(16px) · `gap-sd-8`(8px). 자세한 규칙은 `AGENTS.md` §2-2.
51
51
  - `@source` — 라이브러리 `dist`를 Tailwind 스캔 대상에 포함시켜 컴포넌트 클래스가 생성되게 합니다. **경로는 여러분의 CSS 파일 위치 기준 상대경로**이며, `node_modules` 전체가 아니라 반드시 이 패키지 `dist`만 지정하세요.
52
52
 
53
+ ## 글꼴
54
+
55
+ `theme.css` 가 문서 전역 글꼴을 디자인 토큰 `--font-base`(Pretendard 스택)로 깝니다. 앱은 **글꼴 클래스를 붙이지 않습니다** — `font-sans` 도 같은 스택을 가리키므로 붙일 이유가 없습니다.
56
+
57
+ **글꼴 파일도 패키지에 들어 있습니다.** Pretendard Variable 다이내믹 서브셋을 `theme.css` 가 함께 싣기 때문에, 앱은 CDN 을 걸거나 폰트를 따로 설치할 필요가 없습니다. 위 **방식 1**(또는 방식 2) 설정만 하면 끝입니다.
58
+
59
+ - **CDN 을 쓰지 않습니다.** 사내망·오프라인·폐쇄망에서도 그대로 동작하고, 외부로 나가는 요청이 없습니다.
60
+ - **버전이 이 패키지에 고정됩니다.** CDN 최신 추적으로 글꼴이 말없이 바뀌는 일이 없습니다.
61
+ - 다이내믹 서브셋이라 브라우저는 화면에 실제 쓰인 글자 범위의 조각만 내려받습니다. 한글 전체 폰트(약 1MB)를 통째로 받지 않습니다. 패키지 용량은 약 3MB 늘지만 **앱 JS 번들에는 전혀 들어가지 않습니다.**
62
+ - 폰트 자산은 `dist/fonts/` 에 있고 라이선스(SIL OFL 1.1)는 `dist/fonts/LICENSE.txt` 입니다.
63
+
64
+ 앱이 Pretendard 를 이미 자체 호스팅하고 있어도 문제되지 않습니다 — `@font-face` 선언이 겹칠 뿐, 브라우저가 실제로 내려받는 파일은 한 벌입니다.
65
+
53
66
  ## 설정 (방식 2 — 폴백, Tailwind 미사용)
54
67
 
55
68
  Tailwind를 쓰지 않는 앱은 컴파일된 CSS를 직접 import 합니다.
@@ -178,16 +191,18 @@ export default [
178
191
 
179
192
  **`error` 는 "지키지 않으면 깨지는 것" 에만 씁니다.** 앱 화면을 Tailwind 로 자유롭게 만드는 것은 정상이고, 디자인 시스템이 그 자유까지 막지 않습니다. 나머지는 권고(`warn`)입니다.
180
193
 
181
- | 규칙 | 기본 | 검출 대상 |
182
- | -------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
183
- | `sellmate/no-off-scale-spacing` | **error** | 스케일 밖 디자인 시스템 간격 (`gap-sd-13`) — Tailwind v4 에서 **조용히 무시되어** 스타일이 사라진다 |
184
- | `sellmate/no-raw-html-control` | **error** | 대응 컴포넌트가 있는 생 HTML (`<button>` `<input>` `<select>` `<textarea>` `<table>` `<form>` `<dialog>` `<hr>` `<details>` `<progress>`), `alert()`/`confirm()` — 디자인 시스템을 통째로 우회하는 경우 |
185
- | `sellmate/prefer-typo-preset` | warn | `text-14 font-bold` 같은 낱개 조합 → `typo-*` 프리셋 |
186
- | `sellmate/component-group-gap` | warn | 같은 컴포넌트를 나열할 때의 그룹 간격 — 배열 방향에 따라 값이 다르다(체크박스 가로 24 / 세로 8) |
187
- | `sellmate/table-numeric-align` | warn | 수량 컬럼(금액·수량 등)에 `align: 'right'` 누락 — **`--fix` 로 자동 교정** |
188
- | `sellmate/require-locale-number` | warn | 수량 컬럼의 `toLocaleString()` 누락 — 세 자리 콤마 |
189
- | `sellmate/field-width-grade` | warn | 필드 폭이 `maxLength`(스키마 상한)와 어긋남 — 등급 미지정 · 등급 밖 폭 · 상한 대비 과부족 |
190
- | `sellmate/no-arbitrary-class` | **off** | 토큰이 있는 속성(색·타이포·간격·모서리)의 임의 값 — `text-[14px]`, `bg-[#eee]`. 앱 고유 화면에는 정당한 사용이 많아 기본값은 끕니다 |
194
+ | 규칙 | 기본 | 검출 대상 |
195
+ | ---------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
196
+ | `sellmate/no-off-scale-spacing` | **error** | 스케일 밖 디자인 시스템 간격 (`gap-sd-13`) — Tailwind v4 에서 **조용히 무시되어** 스타일이 사라진다 |
197
+ | `sellmate/no-raw-html-control` | **error** | 대응 컴포넌트가 있는 생 HTML (`<button>` `<input>` `<select>` `<textarea>` `<table>` `<form>` `<dialog>` `<hr>` `<details>` `<progress>`), `alert()`/`confirm()` — 디자인 시스템을 통째로 우회하는 경우 |
198
+ | `sellmate/divider-vertical-height` | **error** | 세로 `SDivider` 의 높이를 `className="h-*"` 로 준 경우 — `align-self: stretch` 가 무효가 되어 선이 줄 맨 위에 붙는다. `height` prop 으로 준다(**`--fix` 로 치환**) |
199
+ | `sellmate/prefer-typo-preset` | warn | `text-14 font-bold` 같은 낱개 조합 → `typo-*` 프리셋 |
200
+ | `sellmate/component-group-gap` | warn | 같은 컴포넌트를 나열할 때의 그룹 간격 — 배열 방향에 따라 값이 다르다(체크박스 가로 24 / 세로 8) |
201
+ | `sellmate/table-numeric-align` | warn | 수량 컬럼(금액·수량 등)에 `align: 'right'` 누락 — **`--fix` 로 자동 교정** |
202
+ | `sellmate/require-locale-number` | warn | 수량 컬럼의 `toLocaleString()` 누락 — 세 자리 콤마 |
203
+ | `sellmate/field-width-grade` | warn | 필드 폭이 `maxLength`(스키마 상한)와 어긋남 — 등급 미지정 · 등급 밖 폭 · 상한 대비 과부족 · 등급 px 직접 지정(**`--fix` 로 등급 이름 치환**) |
204
+ | `sellmate/table-column-width` | warn | 컬럼 폭 미지정(기본 120px 이 조용히 들어감) · px 아닌 폭(`%` `clamp()`) · 값을 그리는 열의 `autoWidth` 오용 |
205
+ | `sellmate/no-arbitrary-class` | **off** | 토큰이 있는 속성(색·타이포·간격·모서리)의 임의 값 — `text-[14px]`, `bg-[#eee]`. 앱 고유 화면에는 정당한 사용이 많아 기본값은 끕니다 |
191
206
 
192
207
  `className` 뿐 아니라 `cn()`/`clsx()` 인자, 템플릿 리터럴, 객체 키 안까지 검사합니다.
193
208
 
@@ -243,23 +258,29 @@ export default [
243
258
  필드 너비는 **`maxLength`(= 스키마 상한)로 정합니다.** 상한이 등급 안에 들어오면 그 등급으로 고정하고,
244
259
  등급 상한(`xl`)을 넘거나 상한이 아예 없으면 행 전체(`width="100%"` 또는 생략)로 둡니다.
245
260
 
246
- | 등급 | 폭 | |
247
- | ---- | ----- | ------------------------ |
248
- | `xs` | 80px | 숫자 필드 전용 |
249
- | `sm` | 120px | |
250
- | `md` | 160px | |
251
- | `lg` | 240px | |
252
- | `xl` | 480px | 정책상 상한 |
261
+ **폭은 등급 이름으로 줍니다** — `width="md"` 처럼 씁니다. 등급은 `--cmp-field-width-*` 토큰으로
262
+ 풀리므로 토큰이 바뀌면 화면이 따라갑니다. 같은 값을 px 로 적으면 그 화면만 옛 값에 남습니다.
263
+
264
+ | 등급 | 쓰는 곳 |
265
+ | ---- | -------------- |
266
+ | `xs` | 숫자 필드 전용 |
267
+ | `sm` | |
268
+ | `md` | |
269
+ | `lg` | |
270
+ | `xl` | 정책상 상한 |
253
271
 
254
272
  ```tsx
255
273
  // 상한이 등급 안에 들어온다 → 그 등급으로 고정
256
- <SInput name="code" label="코드" maxLength={10} width={160} />
274
+ <SInput name="code" label="코드" maxLength={10} width="md" />
257
275
 
258
276
  // 상한이 xl 로도 안 담긴다 → 행 전체
259
277
  <SInput name="desc" label="설명" maxLength={100} width="100%" />
260
278
 
261
279
  // 숫자 필드의 상한은 maxLength 가 아니라 max 다 (천단위 콤마도 폭을 먹는다)
262
- <SNumberInput name="qty" label="수량" max={99} width={80} />
280
+ <SNumberInput name="qty" label="수량" max={99} width="xs" />
281
+
282
+ // 등급 값과 같은 px 를 적으면 등급 이름으로 자동 수정됩니다 (--fix)
283
+ <SInput name="code" label="코드" maxLength={10} width={160} /> // → width="md"
263
284
  ```
264
285
 
265
286
  대상은 `SInput` · `SNumberInput` · `SBarcodeInput` 입니다. `STextarea` 는 여러 줄로 접혀 상한이 폭을
@@ -279,9 +300,9 @@ export default [
279
300
  한글은 전각이라 영숫자의 약 두 배를 먹으므로 **두 기준 사이에는 아무것도 보고하지 않습니다** —
280
301
  영숫자로 채워도 넘칠 때만 "좁다", 한글로 채워도 남을 때만 "넓다" 로 판정합니다.
281
302
 
282
- | 등급 | `SInput` (sm) | `SInput` (md) | `SNumberInput` (sm) | `SNumberInput` (sm, `useButton`) |
283
- | ---- | ------------- | ------------- | ------------------- | -------------------------------- |
284
- | `xs` | — | — | 영숫자 8 | 영숫자 2 |
303
+ | 등급 | `SInput` (sm) | `SInput` (md) | `SNumberInput` (sm) | `SNumberInput` (sm, `useButton`) |
304
+ | ---- | ------------------- | ------------------- | ------------------- | -------------------------------- |
305
+ | `xs` | — | — | 영숫자 8 | 영숫자 2 |
285
306
  | `sm` | 영숫자 14 / 한글 7 | 영숫자 11 / 한글 6 | 영숫자 14 | 영숫자 8 |
286
307
  | `md` | 영숫자 20 / 한글 11 | 영숫자 16 / 한글 9 | 영숫자 20 | 영숫자 14 |
287
308
  | `lg` | 영숫자 32 / 한글 17 | 영숫자 26 / 한글 14 | 영숫자 32 | 영숫자 26 |
@@ -291,15 +312,46 @@ export default [
291
312
  두 배가 되고(기본값), 있으면 버튼 두 개와 간격이 폭을 먹습니다. 규칙은 JSX 의 `useButton` 을 읽어
292
313
  둘을 구분합니다.
293
314
 
294
- 값이 팀 기준과 다르면 옵션으로 덮습니다.
315
+ 등급 폭은 `--cmp-field-width-*` 토큰에서 읽으므로 규칙과 컴포넌트가 같은 값을 봅니다.
316
+ 글자수 환산 비율이 팀 기준과 다르면 옵션으로 덮습니다(등급 폭도 덮을 수 있지만, 토큰과 어긋나게 됩니다).
295
317
 
296
318
  ```js
297
319
  'sellmate/field-width-grade': ['warn', {
298
- grades: { sm: 120, md: 160, lg: 240, xl: 480 },
299
320
  charRatio: { narrow: 0.55, wide: 1 },
300
321
  }],
301
322
  ```
302
323
 
324
+ ### 컬럼 폭 (`table-column-width`)
325
+
326
+ `STable` 의 컬럼 폭은 `<colgroup>` 의 `<col width>` 로 들어가고 테이블이 `table-fixed` 라,
327
+ **px 이 아닌 값은 에러 없이 화면만 틀어집니다** — `'30%'` 는 `30`(px)으로 읽히고, `clamp()` 같은
328
+ 함수형 값은 폭이 통째로 무효가 된 뒤 auto 로 떨어집니다.
329
+
330
+ ```tsx
331
+ // 내용이 들어가는 열은 전부 폭을 명시한다 (생략하면 기본 120px 이 조용히 들어간다)
332
+ { name: 'name', label: '이름', field: 'name', width: 160 }
333
+ { name: 'code', label: '코드', field: 'code', width: '120px' }
334
+
335
+ // autoWidth 는 남은 폭을 흡수하는 스페이서 열 하나에만 (값을 그리지 않으므로 field 도 없다)
336
+ { name: 'spacer', label: '', autoWidth: true }
337
+
338
+ // ❌ 조용히 깨진다
339
+ { name: 'ratio', label: '비율', field: 'ratio', width: '30%' }
340
+ // ❌ 값을 그리는 열의 autoWidth — 폭이 다른 열에 좌우돼 화면마다 달라진다
341
+ { name: 'title', label: '상품명', field: 'title', autoWidth: true, render: r => r.title }
342
+ ```
343
+
344
+ 검사 대상은 `name`(문자열 리터럴) · `label` 에 더해 **`field` 또는 `autoWidth` 를 가진 객체**입니다.
345
+ 검색 필터 필드나 상세 모달의 키-값 필드가 컬럼과 같은 `{ name, label, ... }` 모양이라, 그 둘만으로
346
+ 판정하면 표와 무관한 객체가 대부분 걸리기 때문입니다. 대신 `{ ...base, name, label }` 처럼 `field` 가
347
+ 스프레드로 들어오는 컬럼은 보고하지 않습니다 — 정적으로 필터 필드와 구분되지 않습니다.
348
+
349
+ 예외는 컬럼 `name` 을 `allow` 로 지정해 뺍니다.
350
+
351
+ ```js
352
+ 'sellmate/table-column-width': ['warn', { allow: ['spacer'] }],
353
+ ```
354
+
303
355
  ### 더 엄격하게 / 더 느슨하게
304
356
 
305
357
  `configs.strict` 는 전 규칙을 error 로 올리고, `<ul>` `<ol>` `<li>` `<svg>` `<label>` 까지 검사하며, 간격 유틸리티에 `sd-` 접두를 강제합니다(`requirePrefix`). 디자인 시스템 규칙을 처음부터 전면 적용하는 신규 프로젝트용입니다.
@@ -12,23 +12,28 @@
12
12
  * - 안전하게 고칠 수 없는 파일은 손대지 않고 붙여넣을 스니펫을 출력한다.
13
13
  * - 무엇을 바꿨는지 전부 보고한다.
14
14
  */
15
- import { readFileSync, writeFileSync, existsSync, readdirSync, statSync } from "node:fs";
16
- import { join, relative, dirname, sep } from "node:path";
15
+ import { readFileSync, writeFileSync, existsSync, readdirSync, statSync } from 'node:fs';
16
+ import { join, relative, dirname, sep } from 'node:path';
17
17
 
18
- const PKG = "sellmate-design-system-react";
18
+ const PKG = 'sellmate-design-system-react';
19
19
  const LLMS_PATH = `node_modules/${PKG}/dist/llms.txt`;
20
20
 
21
21
  const args = process.argv.slice(2);
22
- const command = args.find((a) => !a.startsWith("-")) ?? "init";
23
- const dryRun = args.includes("--dry-run") || args.includes("-n");
22
+ const command = args.find(a => !a.startsWith('-')) ?? 'init';
23
+ const dryRun = args.includes('--dry-run') || args.includes('-n');
24
24
 
25
25
  const cwd = process.cwd();
26
26
 
27
27
  /* ─────────────────────────── 출력 ─────────────────────────── */
28
28
 
29
29
  const c = {
30
- reset: "\x1b[0m", bold: "\x1b[1m", dim: "\x1b[2m",
31
- green: "\x1b[32m", yellow: "\x1b[33m", cyan: "\x1b[36m", red: "\x1b[31m",
30
+ reset: '\x1b[0m',
31
+ bold: '\x1b[1m',
32
+ dim: '\x1b[2m',
33
+ green: '\x1b[32m',
34
+ yellow: '\x1b[33m',
35
+ cyan: '\x1b[36m',
36
+ red: '\x1b[31m',
32
37
  };
33
38
  const paint = (color, s) => (process.stdout.isTTY ? `${c[color]}${s}${c.reset}` : s);
34
39
 
@@ -38,7 +43,7 @@ const add = (status, file, detail, snippet) => results.push({ status, file, deta
38
43
 
39
44
  /* ─────────────────────────── 유틸 ─────────────────────────── */
40
45
 
41
- const read = (p) => readFileSync(p, "utf8");
46
+ const read = p => readFileSync(p, 'utf8');
42
47
 
43
48
  function write(path, content) {
44
49
  if (dryRun) return;
@@ -47,14 +52,14 @@ function write(path, content) {
47
52
 
48
53
  /** node_modules 가 있는 프로젝트 루트인지 확인 */
49
54
  function assertProjectRoot() {
50
- if (!existsSync(join(cwd, "package.json"))) {
51
- console.error(paint("red", "package.json 이 없습니다. 프로젝트 루트에서 실행하세요."));
55
+ if (!existsSync(join(cwd, 'package.json'))) {
56
+ console.error(paint('red', 'package.json 이 없습니다. 프로젝트 루트에서 실행하세요.'));
52
57
  process.exit(1);
53
58
  }
54
59
  }
55
60
 
56
61
  /** 후보 경로 중 처음 존재하는 것 */
57
- const firstExisting = (candidates) => candidates.find((p) => existsSync(join(cwd, p)));
62
+ const firstExisting = candidates => candidates.find(p => existsSync(join(cwd, p)));
58
63
 
59
64
  /* ────────────────── 1. 에이전트 지침 파일 ────────────────── */
60
65
 
@@ -73,24 +78,24 @@ UI 작업 전 \`${LLMS_PATH}\` 를 **반드시 먼저 읽는다.**
73
78
  `;
74
79
 
75
80
  function stepAgentInstructions() {
76
- const existing = ["CLAUDE.md", "AGENTS.md"].filter((f) => existsSync(join(cwd, f)));
77
- const targets = existing.length ? existing : ["CLAUDE.md"];
81
+ const existing = ['CLAUDE.md', 'AGENTS.md'].filter(f => existsSync(join(cwd, f)));
82
+ const targets = existing.length ? existing : ['CLAUDE.md'];
78
83
 
79
84
  for (const file of targets) {
80
85
  const path = join(cwd, file);
81
- const current = existsSync(path) ? read(path) : "";
86
+ const current = existsSync(path) ? read(path) : '';
82
87
 
83
88
  if (current.includes(LLMS_PATH)) {
84
- add("skipped", file, "이미 llms.txt 참조가 있습니다");
89
+ add('skipped', file, '이미 llms.txt 참조가 있습니다');
85
90
  continue;
86
91
  }
87
92
 
88
93
  const next = current
89
- ? `${current.replace(/\s*$/, "")}\n${AGENT_SECTION}`
94
+ ? `${current.replace(/\s*$/, '')}\n${AGENT_SECTION}`
90
95
  : `# 프로젝트 지침\n${AGENT_SECTION}`;
91
96
 
92
97
  write(path, next);
93
- add("added", file, existsSync(path) ? "디자인 시스템 지침 섹션 추가" : "생성 후 지침 추가");
98
+ add('added', file, existsSync(path) ? '디자인 시스템 지침 섹션 추가' : '생성 후 지침 추가');
94
99
  }
95
100
  }
96
101
 
@@ -105,8 +110,8 @@ function matchingBracket(src, openIndex) {
105
110
  let depth = 0;
106
111
  for (let i = openIndex; i < src.length; i++) {
107
112
  const ch = src[i];
108
- if (ch === "[") depth++;
109
- else if (ch === "]") {
113
+ if (ch === '[') depth++;
114
+ else if (ch === ']') {
110
115
  depth--;
111
116
  if (depth === 0) return i;
112
117
  }
@@ -116,11 +121,19 @@ function matchingBracket(src, openIndex) {
116
121
 
117
122
  function stepEslint() {
118
123
  const file = firstExisting([
119
- "eslint.config.mjs", "eslint.config.js", "eslint.config.ts", "eslint.config.cjs",
124
+ 'eslint.config.mjs',
125
+ 'eslint.config.js',
126
+ 'eslint.config.ts',
127
+ 'eslint.config.cjs',
120
128
  ]);
121
129
 
122
130
  if (!file) {
123
- add("manual", "eslint.config.mjs", "설정 파일이 없습니다 — 아래 내용으로 만드세요", ESLINT_SNIPPET);
131
+ add(
132
+ 'manual',
133
+ 'eslint.config.mjs',
134
+ '설정 파일이 없습니다 — 아래 내용으로 만드세요',
135
+ ESLINT_SNIPPET,
136
+ );
124
137
  return;
125
138
  }
126
139
 
@@ -128,7 +141,7 @@ function stepEslint() {
128
141
  const src = read(path);
129
142
 
130
143
  if (src.includes(`${PKG}/eslint`)) {
131
- add("skipped", file, "이미 ESLint 프리셋이 연결되어 있습니다");
144
+ add('skipped', file, '이미 ESLint 프리셋이 연결되어 있습니다');
132
145
  return;
133
146
  }
134
147
 
@@ -136,14 +149,14 @@ function stepEslint() {
136
149
  // 배열 경계를 확신할 수 없으므로 손대지 않고 스니펫을 안내한다.
137
150
  const exportMatch = src.match(/export\s+default\s*\[/);
138
151
  if (!exportMatch) {
139
- add("manual", file, "자동 삽입이 어려운 형태입니다 — 아래를 직접 추가하세요", ESLINT_SNIPPET);
152
+ add('manual', file, '자동 삽입이 어려운 형태입니다 — 아래를 직접 추가하세요', ESLINT_SNIPPET);
140
153
  return;
141
154
  }
142
155
 
143
- const openIndex = src.indexOf("[", exportMatch.index);
156
+ const openIndex = src.indexOf('[', exportMatch.index);
144
157
  const closeIndex = matchingBracket(src, openIndex);
145
158
  if (closeIndex === -1) {
146
- add("manual", file, "배열 끝을 찾지 못했습니다 — 아래를 직접 추가하세요", ESLINT_SNIPPET);
159
+ add('manual', file, '배열 끝을 찾지 못했습니다 — 아래를 직접 추가하세요', ESLINT_SNIPPET);
147
160
  return;
148
161
  }
149
162
 
@@ -164,11 +177,13 @@ function stepEslint() {
164
177
  const before = withImport.slice(0, close);
165
178
  const needsComma = /[^[\s,]\s*$/.test(before);
166
179
  const next =
167
- before.replace(/\s*$/, "") + (needsComma ? "," : "") + `\n${ESLINT_SPREAD}\n` +
180
+ before.replace(/\s*$/, '') +
181
+ (needsComma ? ',' : '') +
182
+ `\n${ESLINT_SPREAD}\n` +
168
183
  withImport.slice(close);
169
184
 
170
185
  write(path, next);
171
- add("added", file, "프리셋(configs.recommended) 연결");
186
+ add('added', file, '프리셋(configs.recommended) 연결');
172
187
  }
173
188
 
174
189
  /* ────────────────── 3. 전역 CSS ────────────────── */
@@ -176,14 +191,19 @@ function stepEslint() {
176
191
  /** 앱의 전역 CSS 를 찾는다 */
177
192
  function findGlobalCss() {
178
193
  const candidates = [
179
- "app/globals.css", "src/app/globals.css", "src/styles/globals.css",
180
- "styles/globals.css", "src/index.css", "src/main.css", "src/global.css",
194
+ 'app/globals.css',
195
+ 'src/app/globals.css',
196
+ 'src/styles/globals.css',
197
+ 'styles/globals.css',
198
+ 'src/index.css',
199
+ 'src/main.css',
200
+ 'src/global.css',
181
201
  ];
182
202
  const found = firstExisting(candidates);
183
203
  if (found) return found;
184
204
 
185
205
  // 후보에 없으면 @import "tailwindcss" 가 있는 css 를 얕게 탐색
186
- const roots = ["src", "app", "styles"].filter((d) => existsSync(join(cwd, d)));
206
+ const roots = ['src', 'app', 'styles'].filter(d => existsSync(join(cwd, d)));
187
207
  for (const root of roots) {
188
208
  const hit = walkCss(join(cwd, root), 3);
189
209
  if (hit) return relative(cwd, hit);
@@ -200,7 +220,7 @@ function walkCss(dir, depth) {
200
220
  return null;
201
221
  }
202
222
  for (const name of entries) {
203
- if (name === "node_modules" || name.startsWith(".")) continue;
223
+ if (name === 'node_modules' || name.startsWith('.')) continue;
204
224
  const p = join(dir, name);
205
225
  let st;
206
226
  try {
@@ -211,9 +231,9 @@ function walkCss(dir, depth) {
211
231
  if (st.isDirectory()) {
212
232
  const hit = walkCss(p, depth - 1);
213
233
  if (hit) return hit;
214
- } else if (name.endsWith(".css")) {
234
+ } else if (name.endsWith('.css')) {
215
235
  try {
216
- if (read(p).includes("tailwindcss")) return p;
236
+ if (read(p).includes('tailwindcss')) return p;
217
237
  } catch {
218
238
  /* 읽기 실패는 무시 */
219
239
  }
@@ -227,9 +247,9 @@ function stepGlobalCss() {
227
247
 
228
248
  if (!file) {
229
249
  add(
230
- "manual",
231
- "전역 CSS",
232
- "전역 CSS 를 찾지 못했습니다 — 앱의 전역 CSS 에 아래를 추가하세요",
250
+ 'manual',
251
+ '전역 CSS',
252
+ '전역 CSS 를 찾지 못했습니다 — 앱의 전역 CSS 에 아래를 추가하세요',
233
253
  `@import 'tailwindcss';\n@import '${PKG}/theme.css';\n@source "<상대경로>/node_modules/${PKG}/dist";`,
234
254
  );
235
255
  return;
@@ -239,14 +259,14 @@ function stepGlobalCss() {
239
259
  const src = read(path);
240
260
 
241
261
  // CSS 파일 기준 상대경로로 @source 를 계산한다 (README 주의사항)
242
- const toNodeModules = relative(dirname(path), join(cwd, "node_modules", PKG, "dist"));
243
- const sourcePath = toNodeModules.split(sep).join("/");
262
+ const toNodeModules = relative(dirname(path), join(cwd, 'node_modules', PKG, 'dist'));
263
+ const sourcePath = toNodeModules.split(sep).join('/');
244
264
 
245
265
  const hasTheme = src.includes(`${PKG}/theme.css`);
246
266
  const hasSource = src.includes(`node_modules/${PKG}/dist`);
247
267
 
248
268
  if (hasTheme && hasSource) {
249
- add("skipped", file, "theme.css · @source 가 이미 설정되어 있습니다");
269
+ add('skipped', file, 'theme.css · @source 가 이미 설정되어 있습니다');
250
270
  return;
251
271
  }
252
272
 
@@ -258,28 +278,28 @@ function stepGlobalCss() {
258
278
  const tw = src.match(/@import\s+["']tailwindcss["'];?/);
259
279
  if (!tw) {
260
280
  add(
261
- "manual",
281
+ 'manual',
262
282
  file,
263
283
  "@import 'tailwindcss' 를 찾지 못했습니다 — 아래를 직접 추가하세요",
264
- lines.join("\n"),
284
+ lines.join('\n'),
265
285
  );
266
286
  return;
267
287
  }
268
288
 
269
289
  const insertAt = tw.index + tw[0].length;
270
- const next = src.slice(0, insertAt) + "\n" + lines.join("\n") + src.slice(insertAt);
290
+ const next = src.slice(0, insertAt) + '\n' + lines.join('\n') + src.slice(insertAt);
271
291
  write(path, next);
272
- add("added", file, lines.length === 2 ? "theme.css import · @source 추가" : "누락분 추가");
292
+ add('added', file, lines.length === 2 ? 'theme.css import · @source 추가' : '누락분 추가');
273
293
  }
274
294
 
275
295
  /* ─────────────────────────── 실행 ─────────────────────────── */
276
296
 
277
297
  function printHelp() {
278
298
  console.log(`
279
- ${paint("bold", "sellmate-ds")} — ${PKG} 소비 앱 설정
299
+ ${paint('bold', 'sellmate-ds')} — ${PKG} 소비 앱 설정
280
300
 
281
- ${paint("cyan", "npx sellmate-ds init")} 설정을 자동으로 연결합니다
282
- ${paint("cyan", "npx sellmate-ds init --dry-run")} 무엇이 바뀔지만 보여줍니다
301
+ ${paint('cyan', 'npx sellmate-ds init')} 설정을 자동으로 연결합니다
302
+ ${paint('cyan', 'npx sellmate-ds init --dry-run')} 무엇이 바뀔지만 보여줍니다
283
303
 
284
304
  연결하는 것
285
305
  · CLAUDE.md / AGENTS.md AI 에이전트가 규칙(llms.txt)을 읽도록 지침 추가
@@ -290,13 +310,13 @@ ${paint("bold", "sellmate-ds")} — ${PKG} 소비 앱 설정
290
310
  `);
291
311
  }
292
312
 
293
- if (command === "help" || args.includes("--help") || args.includes("-h")) {
313
+ if (command === 'help' || args.includes('--help') || args.includes('-h')) {
294
314
  printHelp();
295
315
  process.exit(0);
296
316
  }
297
317
 
298
- if (command !== "init") {
299
- console.error(paint("red", `알 수 없는 명령: ${command}`));
318
+ if (command !== 'init') {
319
+ console.error(paint('red', `알 수 없는 명령: ${command}`));
300
320
  printHelp();
301
321
  process.exit(1);
302
322
  }
@@ -304,34 +324,46 @@ if (command !== "init") {
304
324
  assertProjectRoot();
305
325
 
306
326
  console.log(
307
- `\n${paint("bold", `${PKG} 설정`)}${dryRun ? paint("yellow", " (dry-run — 파일을 바꾸지 않습니다)") : ""}\n`,
327
+ `\n${paint('bold', `${PKG} 설정`)}${dryRun ? paint('yellow', ' (dry-run — 파일을 바꾸지 않습니다)') : ''}\n`,
308
328
  );
309
329
 
310
330
  stepAgentInstructions();
311
331
  stepEslint();
312
332
  stepGlobalCss();
313
333
 
314
- const icon = { added: paint("green", "✓"), skipped: paint("dim", "·"), manual: paint("yellow", "!"), error: paint("red", "✗") };
334
+ const icon = {
335
+ added: paint('green', '✓'),
336
+ skipped: paint('dim', '·'),
337
+ manual: paint('yellow', '!'),
338
+ error: paint('red', '✗'),
339
+ };
315
340
 
316
341
  for (const r of results) {
317
- console.log(` ${icon[r.status]} ${paint("bold", r.file)} ${paint("dim", r.detail)}`);
342
+ console.log(` ${icon[r.status]} ${paint('bold', r.file)} ${paint('dim', r.detail)}`);
318
343
  if (r.snippet) {
319
- console.log(r.snippet.split("\n").map((l) => ` ${paint("cyan", l)}`).join("\n"));
344
+ console.log(
345
+ r.snippet
346
+ .split('\n')
347
+ .map(l => ` ${paint('cyan', l)}`)
348
+ .join('\n'),
349
+ );
320
350
  }
321
351
  }
322
352
 
323
- const added = results.filter((r) => r.status === "added").length;
324
- const manual = results.filter((r) => r.status === "manual").length;
353
+ const added = results.filter(r => r.status === 'added').length;
354
+ const manual = results.filter(r => r.status === 'manual').length;
325
355
 
326
356
  console.log();
327
357
  if (dryRun) {
328
- console.log(paint("yellow", ` ${added}개 항목이 변경됩니다. --dry-run 을 빼고 다시 실행하세요.`));
358
+ console.log(
359
+ paint('yellow', ` ${added}개 항목이 변경됩니다. --dry-run 을 빼고 다시 실행하세요.`),
360
+ );
329
361
  } else if (added) {
330
- console.log(paint("green", ` ${added}개 항목을 설정했습니다.`));
362
+ console.log(paint('green', ` ${added}개 항목을 설정했습니다.`));
331
363
  } else if (!manual) {
332
- console.log(paint("dim", " 이미 모두 설정되어 있습니다."));
364
+ console.log(paint('dim', ' 이미 모두 설정되어 있습니다.'));
333
365
  }
334
366
  if (manual) {
335
- console.log(paint("yellow", ` ${manual}개 항목은 위 내용을 직접 추가해야 합니다.`));
367
+ console.log(paint('yellow', ` ${manual}개 항목은 위 내용을 직접 추가해야 합니다.`));
336
368
  }
337
369
  console.log();
@@ -0,0 +1,31 @@
1
+ import { type RefObject } from 'react';
2
+ import { type SAccountListBoxContent } from './SAccountListBox';
3
+ /**
4
+ * 계정 행이 놓인 자리. 리스트박스가 어느 방향으로 펼쳐질지를 **이것만** 정한다.
5
+ * - `panel` — GNB 바닥의 세로 판(접힌 레일 포함). 계정 행이 맨 아래라 위로 편다.
6
+ * - `top` — 전폭 상단바 오른쪽 끝. 줄이 화면 맨 위라 아래로 편다.
7
+ */
8
+ type AccountListBoxAnchor = 'panel' | 'top';
9
+ export declare const AccountListBoxAnchorProvider: import("react").Provider<AccountListBoxAnchor>;
10
+ /**
11
+ * 계정 리스트박스를 앵커에 붙여 띄우는 내부 래퍼.
12
+ *
13
+ * 계정 행은 GNB 판(펼침)·레일(접힘)·상단바 세 자리에 서고, 세 자리 모두 "누르면 같은 패널이
14
+ * 뜬다". 그 여는 방식(위치 · SPortal 설정 · 행을 고르면 닫기)을 한 곳에 모아 두어야 자리마다
15
+ * 동작이 갈리지 않는다. 공개 API 가 아니므로 index.ts 로 내보내지 않는다 —
16
+ * 앱은 `SSystemActionButton` 의 `option` 이나 `SGnbSystem` 의 `account.listBox` 로 닿는다.
17
+ */
18
+ interface AccountListBoxPortalOptions {
19
+ /** 표시 여부 */
20
+ open: boolean;
21
+ /** 표시 상태 변경 */
22
+ onOpenChange: (open: boolean) => void;
23
+ /** 붙을 트리거 엘리먼트 */
24
+ anchorRef: RefObject<HTMLElement | null>;
25
+ /** 접근성 이름 */
26
+ ariaLabel?: string;
27
+ /** 패널에 담기는 내용 */
28
+ content: SAccountListBoxContent;
29
+ }
30
+ export declare function AccountListBoxPortal({ open, onOpenChange, anchorRef, ariaLabel, content, }: AccountListBoxPortalOptions): import("react").JSX.Element;
31
+ export {};
@@ -0,0 +1,86 @@
1
+ # SAccountListBox
2
+
3
+ > 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
4
+
5
+ ### SAccountListBox
6
+
7
+ #### Props
8
+
9
+ | Prop | Type | Default | Description |
10
+ |------|------|---------|-------------|
11
+ | `email?` | `string` | — | 로그인한 계정의 이메일 |
12
+ | `name?` | `string` | — | 로그인한 계정의 이름 |
13
+ | `authority?` | `string` | — | 권한. 이름 오른쪽 끝에 붙는다. 없으면 이름만 남는다. (`role` 이 아닌 이유 — 그 이름은 DOM 의 ARIA 속성이라 소비 앱의 a11y lint 가 값을 ARIA 롤로 읽는다) |
14
+ | `accountSetting?` | `SAccountListBoxItem` | — | 계정 설정 행. 주지 않으면 행이 빠진다 |
15
+ | `language?` | `SAccountListBoxLanguage` | — | 언어 변경 행. 주지 않으면 행이 빠진다 |
16
+ | `logout?` | `SAccountListBoxItem` | — | 로그아웃 행. 이 행은 늘 있고, 라벨과 클릭만 받는다 |
17
+
18
+ ## Types
19
+
20
+ ### SAccountListBoxItem
21
+
22
+ ```ts
23
+ /** 리스트박스의 한 행 — 라벨은 기본값이 있고 클릭만 앱이 준다 */
24
+ export interface SAccountListBoxItem {
25
+ /** 라벨 텍스트. 행마다 기본값이 있다 */
26
+ label?: string;
27
+ /** 클릭 */
28
+ onClick?: () => void;
29
+ }
30
+ ```
31
+
32
+ ### SAccountListBoxLanguage
33
+
34
+ ```ts
35
+ /** 언어 변경 행 — 지금 쓰는 언어가 우측에 붙고, 고를 것이 있으면 눌러서 편다 */
36
+ export interface SAccountListBoxLanguage extends SAccountListBoxItem {
37
+ /**
38
+ * 지금 선택돼 있는 언어. 우측에 브랜드색으로 붙는다.
39
+ * `options` 를 함께 주면 그 목록에서 같은 `value` 를 찾아 `label` 로 적는다.
40
+ */
41
+ value?: string;
42
+ /**
43
+ * 고를 수 있는 언어. 주면 행을 눌렀을 때 **하위 메뉴가 우측 아래로 펼쳐지고**,
44
+ * 그동안 계정 패널은 닫히지 않는다. 주지 않으면 행을 누르는 것 자체가 액션이라
45
+ * `onClick` 만 돌고 패널이 닫힌다 — 언어 화면을 따로 두는 앱이 그렇다.
46
+ */
47
+ options?: SAccountListBoxLanguageOption[];
48
+ /** 하위 메뉴에서 언어를 고름. 고르면 하위 메뉴와 계정 패널이 함께 닫힌다 */
49
+ onChange?: (value: string) => void;
50
+ }
51
+ ```
52
+
53
+ ### SAccountListBoxLanguageOption
54
+
55
+ ```ts
56
+ /** 언어 변경 하위 메뉴의 한 칸 */
57
+ export interface SAccountListBoxLanguageOption {
58
+ /** 값. `SAccountListBoxLanguage.value` 와 맞춰 지금 언어를 가린다 */
59
+ value: string;
60
+ /** 화면에 적히는 언어명 */
61
+ label: string;
62
+ }
63
+ ```
64
+
65
+ ## Dependencies
66
+
67
+ ### Used by
68
+
69
+ - [SGnbSystem](../SGnbSystem)
70
+ - [SSystemActionButton](../SSystemActionButton)
71
+
72
+ ### Depends on
73
+
74
+ - [SIcon](../SIcon)
75
+ - [SPortal](../SPortal)
76
+
77
+ ### Graph
78
+
79
+ ```mermaid
80
+ graph TD;
81
+ SAccountListBox --> SIcon
82
+ SAccountListBox --> SPortal
83
+ SGnbSystem --> SAccountListBox
84
+ SSystemActionButton --> SAccountListBox
85
+ style SAccountListBox fill:#f9f,stroke:#333,stroke-width:4px
86
+ ```