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.
- package/AGENTS.md +3974 -267
- package/README.md +76 -24
- package/bin/sellmate-ds.mjs +91 -59
- package/dist/components/SAccountListBox/AccountListBoxPortal.d.ts +31 -0
- package/dist/components/SAccountListBox/README.md +86 -0
- package/dist/components/SAccountListBox/SAccountListBox.d.ts +79 -0
- package/dist/components/SAccountListBox/SystemMenuPortal.d.ts +58 -0
- package/dist/components/SAccountListBox/accountListBox.config.d.ts +64 -0
- package/dist/components/SAccountListBox/index.d.ts +2 -0
- package/dist/components/SActionModal/README.md +1 -0
- package/dist/components/SActionModal/SActionModal.d.ts +9 -1
- package/dist/components/SBadge/README.md +27 -0
- package/dist/components/SBadge/SBadge.d.ts +1 -1
- package/dist/components/SBarChart/README.md +122 -0
- package/dist/components/SBarChart/SBarChart.d.ts +99 -0
- package/dist/components/SBarChart/barChart.config.d.ts +85 -0
- package/dist/components/SBarChart/index.d.ts +2 -0
- package/dist/components/SBarcodeInput/README.md +14 -4
- package/dist/components/SBarcodeInput/SBarcodeInput.d.ts +25 -3
- package/dist/components/SButton/README.md +40 -0
- package/dist/components/SCalendar/README.md +13 -0
- package/dist/components/SCalendarBoard/CalendarDayCard.d.ts +53 -0
- package/dist/components/SCalendarBoard/CalendarDayEventListBox.d.ts +26 -0
- package/dist/components/SCalendarBoard/CalendarEventButton.d.ts +20 -0
- package/dist/components/SCalendarBoard/CalendarMoreButton.d.ts +18 -0
- package/dist/components/SCalendarBoard/README.md +148 -0
- package/dist/components/SCalendarBoard/SCalendarBoard.d.ts +83 -0
- package/dist/components/SCalendarBoard/calendar-board-layout.d.ts +59 -0
- package/dist/components/SCalendarBoard/calendarBoard.config.d.ts +38 -0
- package/dist/components/SCalendarBoard/index.d.ts +3 -0
- package/dist/components/SCalendarBoard/types.d.ts +40 -0
- package/dist/components/SCallout/README.md +17 -1
- package/dist/components/SCallout/SCallout.d.ts +14 -4
- package/dist/components/SCard/README.md +17 -0
- package/dist/components/SCard/SCard.d.ts +26 -2
- package/dist/components/SChatAttachedFile/README.md +33 -0
- package/dist/components/SChatAttachedFile/SChatAttachedFile.d.ts +13 -0
- package/dist/components/SChatAttachedFile/chatAttachedFile.config.d.ts +23 -0
- package/dist/components/SChatAttachedFile/index.d.ts +2 -0
- package/dist/components/SChatFile/README.md +33 -0
- package/dist/components/SChatFile/SChatFile.d.ts +37 -0
- package/dist/components/SChatFile/chatFile.config.d.ts +56 -0
- package/dist/components/SChatFile/index.d.ts +2 -0
- package/dist/components/SChatInput/README.md +44 -0
- package/dist/components/SChatInput/SChatInput.d.ts +60 -0
- package/dist/components/SChatInput/index.d.ts +1 -0
- package/dist/components/SChatMessage/README.md +86 -0
- package/dist/components/SChatMessage/SChatMessage.d.ts +123 -0
- package/dist/components/SChatMessage/index.d.ts +1 -0
- package/dist/components/SChatSystemMessage/README.md +12 -0
- package/dist/components/SChatSystemMessage/SChatSystemMessage.d.ts +18 -0
- package/dist/components/SChatSystemMessage/index.d.ts +1 -0
- package/dist/components/SCheckbox/README.md +8 -0
- package/dist/components/SChip/README.md +25 -0
- package/dist/components/SChip/SChip.d.ts +8 -0
- package/dist/components/SChip/index.d.ts +1 -1
- package/dist/components/SChipFilter/README.md +369 -14
- package/dist/components/SChipFilter/SChipFilter.d.ts +169 -60
- package/dist/components/SChipFilter/index.d.ts +1 -1
- package/dist/components/SChipInput/README.md +18 -2
- package/dist/components/SChipInput/SChipInput.d.ts +23 -3
- package/dist/components/SChipInput/index.d.ts +1 -1
- package/dist/components/SCircleProgress/README.md +13 -2
- package/dist/components/SCircleProgress/SCircleProgress.d.ts +11 -3
- package/dist/components/SConfirmModal/README.md +13 -4
- package/dist/components/SConfirmModal/SConfirmModal.d.ts +46 -9
- package/dist/components/SContextAlert/README.md +52 -0
- package/dist/components/SContextAlert/SContextAlert.d.ts +51 -0
- package/dist/components/SContextAlert/contextAlert.config.d.ts +22 -0
- package/dist/components/SContextAlert/index.d.ts +2 -0
- package/dist/components/SDatePicker/README.md +22 -2
- package/dist/components/SDatePicker/SDatePicker.d.ts +42 -5
- package/dist/components/SDateRangePicker/README.md +22 -4
- package/dist/components/SDateRangePicker/SDateRangePicker.d.ts +44 -7
- package/dist/components/SDivider/README.md +7 -0
- package/dist/components/SDivider/SDivider.d.ts +11 -0
- package/dist/components/SDonutChart/README.md +105 -0
- package/dist/components/SDonutChart/SDonutChart.d.ts +82 -0
- package/dist/components/SDonutChart/index.d.ts +1 -0
- package/dist/components/SDraggableItem/README.md +37 -0
- package/dist/components/SDraggableItem/SDraggableItem.d.ts +2 -0
- package/dist/components/SDraggableItem/index.d.ts +1 -1
- package/dist/components/SDraggableList/README.md +33 -3
- package/dist/components/SDraggableList/SDraggableList.d.ts +18 -3
- package/dist/components/SDraggableList/index.d.ts +1 -1
- package/dist/components/SDrawer/README.md +8 -0
- package/dist/components/SDropdownButton/README.md +19 -0
- package/dist/components/SEditor/EditorBody.d.ts +36 -0
- package/dist/components/SEditor/EditorToolbar.d.ts +93 -0
- package/dist/components/SEditor/README.md +205 -0
- package/dist/components/SEditor/SEditor.d.ts +128 -0
- package/dist/components/SEditor/editor-icons.d.ts +63 -0
- package/dist/components/SEditor/editor.config.d.ts +119 -0
- package/dist/components/SEditor/index.d.ts +8 -0
- package/dist/components/SEditor/tiptap-api.d.ts +29 -0
- package/dist/components/SEditor/use-is-mobile.d.ts +14 -0
- package/dist/components/SExpansionItem/README.md +38 -2
- package/dist/components/SExpansionItem/SExpansionItem.d.ts +8 -2
- package/dist/components/SExpansionItem/index.d.ts +1 -1
- package/dist/components/SField/README.md +37 -5
- package/dist/components/SField/SField.d.ts +40 -8
- package/dist/components/SField/index.d.ts +1 -1
- package/dist/components/SFilePicker/README.md +20 -4
- package/dist/components/SFilePicker/SFilePicker.d.ts +26 -6
- package/dist/components/SFooter/README.md +44 -0
- package/dist/components/SFooter/SFooter.d.ts +29 -13
- package/dist/components/SFooter/index.d.ts +1 -1
- package/dist/components/SForm/README.md +12 -1
- package/dist/components/SForm/SForm.d.ts +2 -2
- package/dist/components/SGhostButton/README.md +28 -4
- package/dist/components/SGhostButton/SGhostButton.d.ts +4 -1
- package/dist/components/SGnb/README.md +109 -8
- package/dist/components/SGnb/SGnb.d.ts +112 -11
- package/dist/components/SGnb/gnb.config.d.ts +18 -5
- package/dist/components/SGnb/index.d.ts +1 -1
- package/dist/components/SGnbSystem/README.md +186 -0
- package/dist/components/SGnbSystem/SGnbSystem.d.ts +179 -0
- package/dist/components/SGnbSystem/gnbSystem.config.d.ts +122 -0
- package/dist/components/SGnbSystem/index.d.ts +2 -0
- package/dist/components/SGuide/README.md +16 -1
- package/dist/components/SGuide/SGuide.d.ts +5 -2
- package/dist/components/SIcon/README.md +20 -0
- package/dist/components/SIcon/SIcon.d.ts +1 -1
- package/dist/components/SIcon/icons.gen.d.ts +20 -1
- package/dist/components/SImage/README.md +23 -1
- package/dist/components/SImage/SImage.d.ts +11 -8
- package/dist/components/SInput/README.md +8 -4
- package/dist/components/SInput/SInput.d.ts +17 -5
- package/dist/components/SKeyValueTable/README.md +88 -0
- package/dist/components/SKeyValueTable/SKeyValueTable.d.ts +30 -3
- package/dist/components/SKeyValueTable/index.d.ts +1 -1
- package/dist/components/SLauncherListBox/README.md +82 -0
- package/dist/components/SLauncherListBox/SLauncherListBox.d.ts +80 -0
- package/dist/components/SLauncherListBox/index.d.ts +2 -0
- package/dist/components/SLauncherListBox/launcherListBox.config.d.ts +154 -0
- package/dist/components/SLayout/README.md +22 -1
- package/dist/components/SLayout/SLayout.d.ts +6 -2
- package/dist/components/SLayout/index.d.ts +1 -1
- package/dist/components/SLineChart/README.md +131 -0
- package/dist/components/SLineChart/SLineChart.d.ts +110 -0
- package/dist/components/SLineChart/index.d.ts +1 -0
- package/dist/components/SLineChart/lineChart.config.d.ts +95 -0
- package/dist/components/SLinearProgress/README.md +16 -1
- package/dist/components/SLinearProgress/SLinearProgress.d.ts +11 -2
- package/dist/components/SLinearProgress/index.d.ts +1 -1
- package/dist/components/SList/README.md +15 -2
- package/dist/components/SList/SList.d.ts +7 -3
- package/dist/components/SList/index.d.ts +1 -1
- package/dist/components/SListItem/README.md +43 -2
- package/dist/components/SListItem/SListItem.d.ts +8 -2
- package/dist/components/SListItem/index.d.ts +1 -1
- package/dist/components/SLoadingContainer/index.d.ts +1 -1
- package/dist/components/SLoadingContainer/loading.d.ts +41 -6
- package/dist/components/SLoadingModal/README.md +10 -2
- package/dist/components/SLoadingModal/SLoadingModal.d.ts +4 -4
- package/dist/components/SLoadingModal/index.d.ts +1 -1
- package/dist/components/SLoginCard/README.md +37 -0
- package/dist/components/SLoginCard/SLoginCard.d.ts +43 -0
- package/dist/components/SLoginCard/index.d.ts +1 -0
- package/dist/components/SLogo/README.md +103 -0
- package/dist/components/SLogo/SLogo.d.ts +72 -0
- package/dist/components/SLogo/index.d.ts +2 -0
- package/dist/components/SLogo/logo.config.d.ts +29 -0
- package/dist/components/SLogo/logos.d.ts +16 -0
- package/dist/components/SMeatballButton/README.md +67 -0
- package/dist/components/SMeatballButton/SMeatballButton.d.ts +36 -0
- package/dist/components/SMeatballButton/index.d.ts +1 -0
- package/dist/components/SModal/README.md +15 -5
- package/dist/components/SModal/SModal.d.ts +1 -1
- package/dist/components/SNumberInput/README.md +19 -8
- package/dist/components/SNumberInput/SNumberInput.d.ts +49 -7
- package/dist/components/SPage/README.md +105 -5
- package/dist/components/SPage/SPage.d.ts +34 -10
- package/dist/components/SPage/SPageHeader.d.ts +31 -13
- package/dist/components/SPage/index.d.ts +2 -2
- package/dist/components/SPage/page-column.d.ts +34 -0
- package/dist/components/SPage/page-width.d.ts +23 -0
- package/dist/components/SPage/page.config.d.ts +26 -0
- package/dist/components/SPieChart/README.md +93 -0
- package/dist/components/SPieChart/SPieChart.d.ts +73 -0
- package/dist/components/SPieChart/index.d.ts +1 -0
- package/dist/components/SPopover/README.md +15 -0
- package/dist/components/SPopup/README.md +26 -2
- package/dist/components/SPopup/SPopup.d.ts +13 -10
- package/dist/components/SPopup/index.d.ts +1 -1
- package/dist/components/SPortal/README.md +20 -0
- package/dist/components/SRadio/README.md +20 -0
- package/dist/components/SRadioButton/README.md +26 -0
- package/dist/components/SRadioButton/SRadioButton.d.ts +9 -2
- package/dist/components/SRadioCard/README.md +78 -0
- package/dist/components/SRadioCard/SRadioCard.d.ts +29 -0
- package/dist/components/SRadioCard/SRadioCardGroup.d.ts +36 -0
- package/dist/components/SRadioCard/index.d.ts +2 -0
- package/dist/components/SScrollArea/README.md +28 -0
- package/dist/components/SScrollArea/SScrollArea.d.ts +17 -0
- package/dist/components/SSearchInput/README.md +63 -0
- package/dist/components/SSearchInput/SSearchInput.d.ts +52 -0
- package/dist/components/SSearchInput/index.d.ts +1 -0
- package/dist/components/SSectionHeaderCard/README.md +38 -0
- package/dist/components/SSectionHeaderCard/SSectionHeaderCard.d.ts +19 -0
- package/dist/components/SSelect/README.md +64 -11
- package/dist/components/SSelect/SSelect.d.ts +135 -15
- package/dist/components/SSelect/index.d.ts +1 -1
- package/dist/components/SSelect/select.config.d.ts +17 -0
- package/dist/components/SSkeleton/README.md +55 -0
- package/dist/components/SSkeleton/SSkeleton.d.ts +39 -0
- package/dist/components/SSkeleton/index.d.ts +2 -0
- package/dist/components/SSkeleton/skeleton.config.d.ts +22 -0
- package/dist/components/SSplitter/README.md +17 -2
- package/dist/components/SSplitter/SSplitter.d.ts +7 -3
- package/dist/components/SStepper/README.md +26 -0
- package/dist/components/SSwitch/README.md +13 -1
- package/dist/components/SSwitch/SSwitch.d.ts +1 -3
- package/dist/components/SSystemActionButton/README.md +246 -0
- package/dist/components/SSystemActionButton/SSystemActionButton.d.ts +167 -0
- package/dist/components/SSystemActionButton/index.d.ts +2 -0
- package/dist/components/SSystemActionButton/systemActionButton.config.d.ts +93 -0
- package/dist/components/STable/README.md +135 -20
- package/dist/components/STable/STable.d.ts +292 -46
- package/dist/components/STable/index.d.ts +1 -1
- package/dist/components/STableBar/README.md +1 -0
- package/dist/components/STableBar/STableBar.d.ts +8 -1
- package/dist/components/STabs/README.md +13 -1
- package/dist/components/STabs/STabs.d.ts +2 -2
- package/dist/components/STag/README.md +55 -0
- package/dist/components/STag/STag.d.ts +3 -1
- package/dist/components/STag/tag.config.d.ts +1 -1
- package/dist/components/STextLink/README.md +21 -1
- package/dist/components/STextLink/STextLink.d.ts +5 -1
- package/dist/components/STextarea/README.md +12 -5
- package/dist/components/STextarea/STextarea.d.ts +49 -6
- package/dist/components/STimePicker/README.md +19 -2
- package/dist/components/STimePicker/STimePicker.d.ts +36 -6
- package/dist/components/STimePicker/timepicker.config.d.ts +4 -2
- package/dist/components/STimeRangePicker/README.md +31 -2
- package/dist/components/STimeRangePicker/STimeRangePicker.d.ts +35 -6
- package/dist/components/SToast/README.md +25 -1
- package/dist/components/SToast/SToast.d.ts +2 -2
- package/dist/components/SToggle/README.md +8 -0
- package/dist/components/SToggle/index.d.ts +1 -1
- package/dist/components/STooltip/README.md +27 -1
- package/dist/components/STooltip/STooltip.d.ts +1 -1
- package/dist/components/STree/README.md +42 -4
- package/dist/components/STree/STree.d.ts +18 -6
- package/dist/components/STree/STree.examples.d.ts +2 -0
- package/dist/docs/Gallery.d.ts +9 -0
- package/dist/docs/RecipeGallery.d.ts +13 -0
- package/dist/docs/gallery-previews.d.ts +24 -0
- package/dist/fonts/LICENSE.txt +94 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.0.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.1.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.10.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.11.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.12.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.13.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.14.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.15.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.16.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.17.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.18.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.19.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.2.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.20.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.21.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.22.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.23.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.24.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.25.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.26.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.27.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.28.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.29.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.3.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.30.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.31.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.32.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.33.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.34.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.35.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.36.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.37.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.38.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.39.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.4.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.40.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.41.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.42.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.43.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.44.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.45.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.46.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.47.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.48.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.49.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.5.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.50.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.51.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.52.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.53.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.54.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.55.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.56.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.57.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.58.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.59.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.6.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.60.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.61.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.62.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.63.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.64.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.65.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.66.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.67.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.68.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.69.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.7.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.70.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.71.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.72.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.73.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.74.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.75.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.76.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.77.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.78.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.79.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.8.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.80.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.81.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.82.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.83.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.84.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.85.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.86.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.87.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.88.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.89.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.9.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.90.woff2 +0 -0
- package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.91.woff2 +0 -0
- package/dist/index.cjs +21789 -10666
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +23 -0
- package/dist/index.js +21704 -10665
- package/dist/index.js.map +1 -1
- package/dist/lib/chart/cartesian.d.ts +56 -0
- package/dist/lib/chart/frame.d.ts +21 -0
- package/dist/lib/chart/hover-dim.d.ts +19 -0
- package/dist/lib/chart/legend.d.ts +21 -0
- package/dist/lib/chart/palette.d.ts +28 -0
- package/dist/lib/chart/radial.d.ts +99 -0
- package/dist/lib/chart/scale.d.ts +26 -0
- package/dist/lib/chart/tooltip.d.ts +60 -0
- package/dist/lib/chart/types.d.ts +29 -0
- package/dist/lib/chart/use-element-size.d.ts +39 -0
- package/dist/lib/date.d.ts +2 -1
- package/dist/lib/depth-filter.d.ts +27 -0
- package/dist/lib/doc-sections.d.ts +35 -0
- package/dist/lib/dropdown-menu.d.ts +19 -0
- package/dist/lib/field-width.d.ts +31 -0
- package/dist/lib/floating-height.d.ts +15 -0
- package/dist/lib/global-overlay.d.ts +5 -0
- package/dist/lib/hover-preview.d.ts +32 -0
- package/dist/lib/inert.d.ts +11 -0
- package/dist/lib/overlay-scrollbar.d.ts +32 -0
- package/dist/lib/row-metrics.d.ts +61 -0
- package/dist/lib/story-docs.d.ts +19 -3
- package/dist/llms-full.txt +9674 -2059
- package/dist/llms.txt +4062 -326
- package/dist/playground/categories.d.ts +19 -0
- package/dist/pretendard.css +937 -0
- package/dist/recipes/AppShell.d.ts +21 -0
- package/dist/recipes/CategoryManagePage.d.ts +1 -0
- package/dist/recipes/ConsultConsolePage.d.ts +1 -0
- package/dist/recipes/ExcelFilePopupPage.d.ts +5 -0
- package/dist/recipes/LoginPage.d.ts +6 -0
- package/dist/recipes/ProductBulkUploadPage.d.ts +1 -0
- package/dist/recipes/ProductCreatePage.d.ts +1 -0
- package/dist/recipes/ProductCreateSectionsPage.d.ts +5 -0
- package/dist/recipes/ProductDetailInlineEditPage.d.ts +9 -0
- package/dist/recipes/ProductDetailPage.d.ts +1 -0
- package/dist/recipes/ProductListChipFilterPage.d.ts +1 -0
- package/dist/recipes/ProductListPage.d.ts +1 -0
- package/dist/recipes/ProductOverlayPage.d.ts +1 -0
- package/dist/recipes/SalesDashboardPage.d.ts +1 -0
- package/dist/recipes/SettingsPage.d.ts +1 -0
- package/dist/recipes/StoreSetupPage.d.ts +1 -0
- package/dist/recipes/TransferOrderPopupPage.d.ts +2 -0
- package/dist/recipes/api.d.ts +220 -0
- package/dist/recipes/recipe-story.d.ts +33 -0
- package/dist/recipes/router.d.ts +9 -0
- package/dist/styles.css +3541 -262
- package/dist/theme.css +598 -28
- package/eslint/index.mjs +44 -35
- package/eslint/lib/class-names.mjs +23 -25
- package/eslint/lib/table-column.mjs +34 -8
- package/eslint/rules/component-group-gap.mjs +32 -30
- package/eslint/rules/divider-vertical-height.mjs +137 -0
- package/eslint/rules/field-width-grade.mjs +69 -52
- package/eslint/rules/no-arbitrary-class.mjs +63 -20
- package/eslint/rules/no-off-scale-spacing.mjs +61 -41
- package/eslint/rules/no-raw-html-control.mjs +38 -36
- package/eslint/rules/prefer-typo-preset.mjs +23 -17
- package/eslint/rules/require-locale-number.mjs +14 -19
- package/eslint/rules/table-column-width.mjs +114 -0
- package/eslint/rules/table-numeric-align.mjs +14 -14
- package/eslint/scale.gen.mjs +6 -3
- 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`
|
|
184
|
-
| `sellmate/no-raw-html-control`
|
|
185
|
-
| `sellmate/
|
|
186
|
-
| `sellmate/
|
|
187
|
-
| `sellmate/
|
|
188
|
-
| `sellmate/
|
|
189
|
-
| `sellmate/
|
|
190
|
-
| `sellmate/
|
|
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
|
-
|
|
249
|
-
|
|
|
250
|
-
|
|
|
251
|
-
| `
|
|
252
|
-
| `
|
|
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=
|
|
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=
|
|
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)
|
|
283
|
-
| ---- |
|
|
284
|
-
| `xs` | —
|
|
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`). 디자인 시스템 규칙을 처음부터 전면 적용하는 신규 프로젝트용입니다.
|
package/bin/sellmate-ds.mjs
CHANGED
|
@@ -12,23 +12,28 @@
|
|
|
12
12
|
* - 안전하게 고칠 수 없는 파일은 손대지 않고 붙여넣을 스니펫을 출력한다.
|
|
13
13
|
* - 무엇을 바꿨는지 전부 보고한다.
|
|
14
14
|
*/
|
|
15
|
-
import { readFileSync, writeFileSync, existsSync, readdirSync, statSync } from
|
|
16
|
-
import { join, relative, dirname, sep } from
|
|
15
|
+
import { readFileSync, writeFileSync, existsSync, readdirSync, statSync } from 'node:fs';
|
|
16
|
+
import { join, relative, dirname, sep } from 'node:path';
|
|
17
17
|
|
|
18
|
-
const PKG =
|
|
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(
|
|
23
|
-
const dryRun = args.includes(
|
|
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:
|
|
31
|
-
|
|
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 =
|
|
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,
|
|
51
|
-
console.error(paint(
|
|
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 =
|
|
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 = [
|
|
77
|
-
const targets = existing.length ? existing : [
|
|
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(
|
|
89
|
+
add('skipped', file, '이미 llms.txt 참조가 있습니다');
|
|
85
90
|
continue;
|
|
86
91
|
}
|
|
87
92
|
|
|
88
93
|
const next = current
|
|
89
|
-
? `${current.replace(/\s*$/,
|
|
94
|
+
? `${current.replace(/\s*$/, '')}\n${AGENT_SECTION}`
|
|
90
95
|
: `# 프로젝트 지침\n${AGENT_SECTION}`;
|
|
91
96
|
|
|
92
97
|
write(path, next);
|
|
93
|
-
add(
|
|
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 ===
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
152
|
+
add('manual', file, '자동 삽입이 어려운 형태입니다 — 아래를 직접 추가하세요', ESLINT_SNIPPET);
|
|
140
153
|
return;
|
|
141
154
|
}
|
|
142
155
|
|
|
143
|
-
const openIndex = src.indexOf(
|
|
156
|
+
const openIndex = src.indexOf('[', exportMatch.index);
|
|
144
157
|
const closeIndex = matchingBracket(src, openIndex);
|
|
145
158
|
if (closeIndex === -1) {
|
|
146
|
-
add(
|
|
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*$/,
|
|
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(
|
|
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
|
-
|
|
180
|
-
|
|
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 = [
|
|
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 ===
|
|
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(
|
|
234
|
+
} else if (name.endsWith('.css')) {
|
|
215
235
|
try {
|
|
216
|
-
if (read(p).includes(
|
|
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
|
-
|
|
231
|
-
|
|
232
|
-
|
|
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,
|
|
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(
|
|
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
|
-
|
|
281
|
+
'manual',
|
|
262
282
|
file,
|
|
263
283
|
"@import 'tailwindcss' 를 찾지 못했습니다 — 아래를 직접 추가하세요",
|
|
264
|
-
lines.join(
|
|
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) +
|
|
290
|
+
const next = src.slice(0, insertAt) + '\n' + lines.join('\n') + src.slice(insertAt);
|
|
271
291
|
write(path, next);
|
|
272
|
-
add(
|
|
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(
|
|
299
|
+
${paint('bold', 'sellmate-ds')} — ${PKG} 소비 앱 설정
|
|
280
300
|
|
|
281
|
-
${paint(
|
|
282
|
-
${paint(
|
|
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 ===
|
|
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 !==
|
|
299
|
-
console.error(paint(
|
|
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(
|
|
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 = {
|
|
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(
|
|
342
|
+
console.log(` ${icon[r.status]} ${paint('bold', r.file)} ${paint('dim', r.detail)}`);
|
|
318
343
|
if (r.snippet) {
|
|
319
|
-
console.log(
|
|
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(
|
|
324
|
-
const manual = results.filter(
|
|
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(
|
|
358
|
+
console.log(
|
|
359
|
+
paint('yellow', ` ${added}개 항목이 변경됩니다. --dry-run 을 빼고 다시 실행하세요.`),
|
|
360
|
+
);
|
|
329
361
|
} else if (added) {
|
|
330
|
-
console.log(paint(
|
|
362
|
+
console.log(paint('green', ` ${added}개 항목을 설정했습니다.`));
|
|
331
363
|
} else if (!manual) {
|
|
332
|
-
console.log(paint(
|
|
364
|
+
console.log(paint('dim', ' 이미 모두 설정되어 있습니다.'));
|
|
333
365
|
}
|
|
334
366
|
if (manual) {
|
|
335
|
-
console.log(paint(
|
|
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
|
+
```
|