sellmate-design-system-react 9.0.0-beta.4 → 9.0.0-beta.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +670 -95
- package/README.md +111 -9
- 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/SBadge/README.md +26 -0
- package/dist/components/SBadge/SBadge.d.ts +1 -1
- package/dist/components/SBarcodeInput/README.md +12 -4
- package/dist/components/SBarcodeInput/SBarcodeInput.d.ts +10 -2
- package/dist/components/SButton/README.md +38 -0
- package/dist/components/SCalendar/README.md +13 -0
- package/dist/components/SCalendarBoard/CalendarDayCard.d.ts +38 -0
- package/dist/components/SCalendarBoard/CalendarDayEventListBox.d.ts +26 -0
- package/dist/components/SCalendarBoard/CalendarEventButton.d.ts +13 -0
- package/dist/components/SCalendarBoard/CalendarMoreButton.d.ts +12 -0
- package/dist/components/SCalendarBoard/README.md +137 -0
- package/dist/components/SCalendarBoard/SCalendarBoard.d.ts +68 -0
- package/dist/components/SCalendarBoard/calendarBoard.config.d.ts +33 -0
- package/dist/components/SCalendarBoard/index.d.ts +3 -0
- package/dist/components/SCalendarBoard/types.d.ts +31 -0
- package/dist/components/SCallout/README.md +16 -1
- package/dist/components/SCallout/SCallout.d.ts +9 -4
- package/dist/components/SCard/README.md +16 -0
- package/dist/components/SCard/SCard.d.ts +17 -2
- package/dist/components/SCheckbox/README.md +8 -0
- package/dist/components/SChipFilter/README.md +339 -14
- package/dist/components/SChipFilter/SChipFilter.d.ts +150 -60
- package/dist/components/SChipFilter/index.d.ts +1 -1
- package/dist/components/SChipInput/README.md +16 -2
- package/dist/components/SChipInput/SChipInput.d.ts +8 -2
- package/dist/components/SChipInput/index.d.ts +1 -1
- package/dist/components/SCircleProgress/README.md +8 -0
- package/dist/components/SConfirmModal/README.md +11 -3
- package/dist/components/SConfirmModal/SConfirmModal.d.ts +16 -8
- package/dist/components/SDatePicker/README.md +20 -2
- package/dist/components/SDatePicker/SDatePicker.d.ts +27 -4
- package/dist/components/SDateRangePicker/README.md +19 -4
- package/dist/components/SDateRangePicker/SDateRangePicker.d.ts +19 -6
- package/dist/components/SDivider/README.md +7 -0
- package/dist/components/SDivider/SDivider.d.ts +11 -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 +30 -0
- package/dist/components/SDraggableList/SDraggableList.d.ts +11 -0
- 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 +203 -0
- package/dist/components/SEditor/SEditor.d.ts +114 -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 +36 -0
- package/dist/components/SExpansionItem/index.d.ts +1 -1
- package/dist/components/SField/README.md +29 -5
- package/dist/components/SField/SField.d.ts +20 -8
- package/dist/components/SFilePicker/README.md +18 -4
- package/dist/components/SFilePicker/SFilePicker.d.ts +11 -5
- package/dist/components/SFooter/README.md +25 -0
- package/dist/components/SFooter/SFooter.d.ts +4 -3
- package/dist/components/SForm/README.md +12 -1
- package/dist/components/SForm/SForm.d.ts +2 -2
- package/dist/components/SGhostButton/README.md +22 -4
- package/dist/components/SGnb/README.md +57 -6
- package/dist/components/SGnb/SGnb.d.ts +58 -8
- package/dist/components/SGnb/gnb.config.d.ts +12 -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 +15 -0
- package/dist/components/SIcon/README.md +10 -0
- package/dist/components/SIcon/SIcon.d.ts +1 -1
- package/dist/components/SIcon/icons.gen.d.ts +4 -0
- package/dist/components/SImage/README.md +15 -1
- package/dist/components/SImage/SImage.d.ts +2 -2
- package/dist/components/SInput/README.md +6 -4
- package/dist/components/SInput/SInput.d.ts +10 -4
- package/dist/components/SKeyValueTable/README.md +86 -0
- package/dist/components/SKeyValueTable/SKeyValueTable.d.ts +6 -2
- package/dist/components/SKeyValueTable/index.d.ts +1 -1
- 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/SLinearProgress/README.md +15 -0
- package/dist/components/SLinearProgress/SLinearProgress.d.ts +3 -0
- package/dist/components/SLinearProgress/index.d.ts +1 -1
- package/dist/components/SList/README.md +15 -3
- package/dist/components/SList/SList.d.ts +7 -5
- package/dist/components/SList/index.d.ts +1 -1
- package/dist/components/SListItem/README.md +41 -0
- package/dist/components/SListItem/index.d.ts +1 -1
- package/dist/components/SLoadingContainer/loading.d.ts +18 -2
- 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/SModal/README.md +1 -1
- package/dist/components/SNumberInput/README.md +14 -6
- package/dist/components/SNumberInput/SNumberInput.d.ts +12 -4
- package/dist/components/SPage/README.md +87 -5
- package/dist/components/SPage/SPage.d.ts +29 -9
- 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 +18 -0
- package/dist/components/SPopover/README.md +15 -0
- package/dist/components/SPopup/README.md +27 -2
- package/dist/components/SPopup/SPopup.d.ts +7 -3
- package/dist/components/SPopup/index.d.ts +1 -1
- package/dist/components/SPortal/README.md +18 -0
- package/dist/components/SRadio/README.md +20 -0
- package/dist/components/SRadioButton/README.md +18 -0
- package/dist/components/SRadioButton/SRadioButton.d.ts +1 -1
- 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 +27 -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 +37 -0
- package/dist/components/SSectionHeaderCard/SSectionHeaderCard.d.ts +10 -0
- package/dist/components/SSelect/README.md +29 -11
- package/dist/components/SSelect/SSelect.d.ts +28 -8
- 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 +221 -0
- package/dist/components/SSystemActionButton/SSystemActionButton.d.ts +161 -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 +94 -10
- package/dist/components/STable/STable.d.ts +130 -22
- package/dist/components/STable/index.d.ts +1 -1
- package/dist/components/STabs/README.md +13 -2
- package/dist/components/STabs/STabs.d.ts +3 -5
- package/dist/components/STabs/index.d.ts +1 -1
- package/dist/components/STabs/tabs.config.d.ts +3 -4
- package/dist/components/STag/README.md +52 -0
- package/dist/components/STag/STag.d.ts +3 -1
- package/dist/components/STextLink/README.md +19 -1
- package/dist/components/STextLink/STextLink.d.ts +5 -1
- package/dist/components/STextarea/README.md +4 -4
- package/dist/components/STextarea/STextarea.d.ts +10 -4
- package/dist/components/STimePicker/README.md +16 -2
- package/dist/components/STimePicker/STimePicker.d.ts +11 -5
- package/dist/components/STimePicker/timepicker.config.d.ts +4 -2
- package/dist/components/STimeRangePicker/README.md +28 -2
- package/dist/components/STimeRangePicker/STimeRangePicker.d.ts +11 -5
- 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 +25 -1
- package/dist/components/STooltip/STooltip.d.ts +1 -1
- package/dist/components/STree/README.md +44 -3
- package/dist/components/STree/STree.d.ts +24 -4
- package/dist/components/STree/index.d.ts +1 -1
- package/dist/docs/Gallery.d.ts +9 -0
- package/dist/docs/gallery-previews.d.ts +24 -0
- package/dist/index.cjs +10890 -5322
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.js +10852 -5322
- package/dist/index.js.map +1 -1
- package/dist/lib/doc-sections.d.ts +35 -0
- package/dist/lib/field-width.d.ts +31 -0
- package/dist/lib/floating-height.d.ts +15 -0
- package/dist/lib/story-docs.d.ts +19 -3
- package/dist/lib/truncated-value-tooltip.d.ts +18 -0
- package/dist/llms-full.txt +3396 -297
- package/dist/llms.txt +675 -97
- package/dist/playground/categories.d.ts +19 -0
- package/dist/styles.css +1731 -166
- package/dist/theme.css +216 -24
- package/eslint/index.mjs +14 -0
- package/eslint/lib/table-column.mjs +26 -0
- package/eslint/rules/divider-vertical-height.mjs +137 -0
- package/eslint/rules/field-width-grade.d.mts +41 -0
- package/eslint/rules/field-width-grade.mjs +311 -0
- package/eslint/rules/table-column-width.mjs +110 -0
- package/eslint/scale.gen.mjs +5 -2
- package/package.json +13 -1
|
@@ -3,6 +3,7 @@ export type IconRenderProps = {
|
|
|
3
3
|
size?: number | string;
|
|
4
4
|
} & SVGProps<SVGSVGElement>;
|
|
5
5
|
export declare const ICONS: {
|
|
6
|
+
readonly account: (p: IconRenderProps) => import("react").JSX.Element;
|
|
6
7
|
readonly add: (p: IconRenderProps) => import("react").JSX.Element;
|
|
7
8
|
readonly alert: (p: IconRenderProps) => import("react").JSX.Element;
|
|
8
9
|
readonly alignKorean: (p: IconRenderProps) => import("react").JSX.Element;
|
|
@@ -15,6 +16,7 @@ export declare const ICONS: {
|
|
|
15
16
|
readonly attachFile: (p: IconRenderProps) => import("react").JSX.Element;
|
|
16
17
|
readonly barcode: (p: IconRenderProps) => import("react").JSX.Element;
|
|
17
18
|
readonly bell: (p: IconRenderProps) => import("react").JSX.Element;
|
|
19
|
+
readonly bellRinging: (p: IconRenderProps) => import("react").JSX.Element;
|
|
18
20
|
readonly bill: (p: IconRenderProps) => import("react").JSX.Element;
|
|
19
21
|
readonly board: (p: IconRenderProps) => import("react").JSX.Element;
|
|
20
22
|
readonly box: (p: IconRenderProps) => import("react").JSX.Element;
|
|
@@ -39,6 +41,7 @@ export declare const ICONS: {
|
|
|
39
41
|
readonly clockFill: (p: IconRenderProps) => import("react").JSX.Element;
|
|
40
42
|
readonly clockOutline: (p: IconRenderProps) => import("react").JSX.Element;
|
|
41
43
|
readonly close: (p: IconRenderProps) => import("react").JSX.Element;
|
|
44
|
+
readonly company: (p: IconRenderProps) => import("react").JSX.Element;
|
|
42
45
|
readonly copy: (p: IconRenderProps) => import("react").JSX.Element;
|
|
43
46
|
readonly coupon: (p: IconRenderProps) => import("react").JSX.Element;
|
|
44
47
|
readonly dashboard: (p: IconRenderProps) => import("react").JSX.Element;
|
|
@@ -76,6 +79,7 @@ export declare const ICONS: {
|
|
|
76
79
|
readonly reset: (p: IconRenderProps) => import("react").JSX.Element;
|
|
77
80
|
readonly robot: (p: IconRenderProps) => import("react").JSX.Element;
|
|
78
81
|
readonly row: (p: IconRenderProps) => import("react").JSX.Element;
|
|
82
|
+
readonly rowDense: (p: IconRenderProps) => import("react").JSX.Element;
|
|
79
83
|
readonly save: (p: IconRenderProps) => import("react").JSX.Element;
|
|
80
84
|
readonly search: (p: IconRenderProps) => import("react").JSX.Element;
|
|
81
85
|
readonly send: (p: IconRenderProps) => import("react").JSX.Element;
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
| `position?` | `string` | `'50% 50%'` | 이미지 정렬 위치 (object-position) |
|
|
16
16
|
| `loading?` | `'lazy' \| 'eager'` | `'lazy'` | 브라우저 로딩 방식 |
|
|
17
17
|
| `loadingShowDelay?` | `number` | `0` | 스피너를 띄우기까지 기다리는 시간(ms). 이 시간 안에 로드되면 스피너를 아예 그리지 않는다 — 캐시된 이미지에서 스피너가 한 프레임 번쩍이는 것을 막는다. |
|
|
18
|
-
| `
|
|
18
|
+
| `showSpinner?` | `boolean` | `true` | 로딩 중 스피너를 그릴지. 끄면 `loadingSlot` 도 없을 때 로딩 표시가 아무것도 남지 않는다. |
|
|
19
19
|
| `loadingSlot?` | `ReactNode` | — | 로딩 중 표시를 직접 지정한다 (기본: 스피너) |
|
|
20
20
|
| `errorSlot?` | `ReactNode` | — | 실패·빈 상태 표시를 직접 지정한다 (기본: 빈 이미지 아이콘) |
|
|
21
21
|
| `imgProps?` | `ImgHTMLAttributes<HTMLImageElement>` | — | 안쪽 `<img>` 로 넘길 네이티브 속성 (srcSet · sizes · crossOrigin · draggable 등) |
|
|
@@ -27,6 +27,20 @@
|
|
|
27
27
|
| `onLoad` | `(src: string) => void` | 로드 완료. 로드된 src 를 넘긴다 |
|
|
28
28
|
| `onError` | `(event: SyntheticEvent<HTMLImageElement>) => void` | 로드 실패 |
|
|
29
29
|
|
|
30
|
+
## Types
|
|
31
|
+
|
|
32
|
+
### SImageFit
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
export type SImageFit = (typeof IMAGE_FITS)[number];
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### IMAGE_FITS
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
export const IMAGE_FITS = ['cover', 'contain', 'fill', 'none', 'scale-down'] as const;
|
|
42
|
+
```
|
|
43
|
+
|
|
30
44
|
## Dependencies
|
|
31
45
|
|
|
32
46
|
### Depends on
|
|
@@ -19,8 +19,8 @@ export interface SImageProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onLoa
|
|
|
19
19
|
* 캐시된 이미지에서 스피너가 한 프레임 번쩍이는 것을 막는다.
|
|
20
20
|
*/
|
|
21
21
|
loadingShowDelay?: number;
|
|
22
|
-
/** 로딩
|
|
23
|
-
|
|
22
|
+
/** 로딩 중 스피너를 그릴지. 끄면 `loadingSlot` 도 없을 때 로딩 표시가 아무것도 남지 않는다. */
|
|
23
|
+
showSpinner?: boolean;
|
|
24
24
|
/** 로딩 중 표시를 직접 지정한다 (기본: 스피너) */
|
|
25
25
|
loadingSlot?: ReactNode;
|
|
26
26
|
/** 실패·빈 상태 표시를 직접 지정한다 (기본: 빈 이미지 아이콘) */
|
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
| `clearable?` | `boolean` | `false` | 지우기 버튼 |
|
|
19
19
|
| `rules?` | `Rule[]` | — | 유효성 규칙 — blur 시 자동 검증 |
|
|
20
20
|
| `status?` | `SFieldStatus` | — | 필드 상태 ('default' | 'pass' | 'error') |
|
|
21
|
-
| `focused?` | `boolean` | — | 포커스
|
|
22
|
-
| `hovered?` | `boolean` | — | 호버
|
|
23
|
-
| `
|
|
21
|
+
| `focused?` | `boolean` | — | 포커스 상태를 밖에서 지정한다 — 강조 테두리·링이 즉시 걸린다 (SField 로 그대로 넘어간다) |
|
|
22
|
+
| `hovered?` | `boolean` | — | 호버 상태를 밖에서 지정한다 — 강조는 `focused` 와 같다 (SField 로 그대로 넘어간다) |
|
|
23
|
+
| `inputClassName?` | `string` | — | 내부 input 요소 className |
|
|
24
24
|
| `inputStyle?` | `CSSProperties` | — | 내부 input 요소 style |
|
|
25
25
|
| `label?` | `string` | — | |
|
|
26
26
|
| `labelWidth?` | `number \| string` | — | |
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
| `errorMessage?` | `string` | — | |
|
|
32
32
|
| `addonLabel?` | `string` | — | |
|
|
33
33
|
| `addonAlign?` | `SFieldAddonAlign` | — | 어드온 정렬 |
|
|
34
|
-
| `width?` | `
|
|
34
|
+
| `width?` | `SFieldWidth` | — | 컨트롤 너비 — 폭 등급(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`) · 숫자=px · CSS 길이. 등급은 `--cmp-field-width-*` 토큰으로 풀리며 `maxLength`(= 스키마 상한)로 고른다. 상한이 `xl` 을 넘거나 상한이 없으면 `"100%"`. (`sellmate/field-width-grade` 가 검사한다) |
|
|
35
35
|
| `disabled?` | `boolean` | `false` | |
|
|
36
36
|
| `readOnly?` | `boolean` | `false` | |
|
|
37
37
|
| `className?` | `string` | — | |
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
|
|
49
49
|
### Used by
|
|
50
50
|
|
|
51
|
+
- [SEditor](../SEditor)
|
|
51
52
|
- [SKeyValueTable](../SKeyValueTable)
|
|
52
53
|
|
|
53
54
|
### Depends on
|
|
@@ -61,6 +62,7 @@
|
|
|
61
62
|
graph TD;
|
|
62
63
|
SInput --> SField
|
|
63
64
|
SInput --> SGhostButton
|
|
65
|
+
SEditor --> SInput
|
|
64
66
|
SKeyValueTable --> SInput
|
|
65
67
|
style SInput fill:#f9f,stroke:#333,stroke-width:4px
|
|
66
68
|
```
|
|
@@ -4,6 +4,7 @@ import { type SIconName } from '../SIcon';
|
|
|
4
4
|
import { type SColor } from '../../lib/color';
|
|
5
5
|
import { type Rule } from '../../lib/form';
|
|
6
6
|
import { type STooltipProps } from '../STooltip';
|
|
7
|
+
import { type SFieldWidth } from '../../lib/field-width';
|
|
7
8
|
export interface SInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'value' | 'onChange' | 'type' | 'prefix' | 'suffix'> {
|
|
8
9
|
/** 값 (제어) */
|
|
9
10
|
value?: string | number;
|
|
@@ -29,12 +30,12 @@ export interface SInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>,
|
|
|
29
30
|
rules?: Rule[];
|
|
30
31
|
/** 필드 상태 ('default' | 'pass' | 'error') */
|
|
31
32
|
status?: SFieldStatus;
|
|
32
|
-
/** 포커스
|
|
33
|
+
/** 포커스 상태를 밖에서 지정한다 — 강조 테두리·링이 즉시 걸린다 (SField 로 그대로 넘어간다) */
|
|
33
34
|
focused?: boolean;
|
|
34
|
-
/** 호버
|
|
35
|
+
/** 호버 상태를 밖에서 지정한다 — 강조는 `focused` 와 같다 (SField 로 그대로 넘어간다) */
|
|
35
36
|
hovered?: boolean;
|
|
36
37
|
/** 내부 input 요소 className */
|
|
37
|
-
|
|
38
|
+
inputClassName?: string;
|
|
38
39
|
/** 내부 input 요소 style */
|
|
39
40
|
inputStyle?: CSSProperties;
|
|
40
41
|
label?: string;
|
|
@@ -49,7 +50,12 @@ export interface SInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>,
|
|
|
49
50
|
addonLabel?: string;
|
|
50
51
|
/** 어드온 정렬 */
|
|
51
52
|
addonAlign?: SFieldAddonAlign;
|
|
52
|
-
|
|
53
|
+
/**
|
|
54
|
+
* 컨트롤 너비 — 폭 등급(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`) · 숫자=px · CSS 길이.
|
|
55
|
+
* 등급은 `--cmp-field-width-*` 토큰으로 풀리며 `maxLength`(= 스키마 상한)로 고른다.
|
|
56
|
+
* 상한이 `xl` 을 넘거나 상한이 없으면 `"100%"`. (`sellmate/field-width-grade` 가 검사한다)
|
|
57
|
+
*/
|
|
58
|
+
width?: SFieldWidth;
|
|
53
59
|
disabled?: boolean;
|
|
54
60
|
readOnly?: boolean;
|
|
55
61
|
className?: string;
|
|
@@ -23,6 +23,90 @@
|
|
|
23
23
|
| `onChange` | `(detail: SKeyValueChangeDetail) => void` | 값 변경 (sdChange) |
|
|
24
24
|
| `onSearch` | `() => void` | 검색 클릭 (sdSearch) |
|
|
25
25
|
|
|
26
|
+
## Types
|
|
27
|
+
|
|
28
|
+
### SKeyValueField
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
export type SKeyValueField = SKeyValueFieldBase & SKeyValueFieldByType;
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### SKeyValueChangeDetail
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
/**
|
|
38
|
+
* `onChange` 콜백 detail.
|
|
39
|
+
* 제네릭 `V`에 폼 값 형태(`{ [name]: value }`)를 넘기면 `name`/`value`/`values`가 정밀하게 타이핑됩니다.
|
|
40
|
+
* 미지정 시 `value`는 {@link SKeyValueFieldValue} 유니온으로 잡힙니다.
|
|
41
|
+
*/
|
|
42
|
+
export interface SKeyValueChangeDetail<
|
|
43
|
+
V extends Record<string, SKeyValueFieldValue> = Record<string, SKeyValueFieldValue>,
|
|
44
|
+
> {
|
|
45
|
+
/** 변경된 field의 name */
|
|
46
|
+
name: Extract<keyof V, string>;
|
|
47
|
+
/** 변경된 field의 새 값 */
|
|
48
|
+
value: V[Extract<keyof V, string>];
|
|
49
|
+
/** 변경이 반영된 전체 값 객체 (`{ [name]: value }`). controlled 패턴에서 그대로 상태에 반영하면 됩니다. */
|
|
50
|
+
values: V;
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### SKeyValueFieldBase
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
/** field type과 무관한 공통 속성 (레이아웃·레이블·스팬 등) */
|
|
58
|
+
export interface SKeyValueFieldBase {
|
|
59
|
+
name: string;
|
|
60
|
+
label?: string;
|
|
61
|
+
required?: boolean;
|
|
62
|
+
helpText?: string[];
|
|
63
|
+
hideTh?: boolean;
|
|
64
|
+
thRowSpan?: number;
|
|
65
|
+
thColSpan?: number;
|
|
66
|
+
tdRowSpan?: number;
|
|
67
|
+
tdColSpan?: number;
|
|
68
|
+
thWidth?: number | string;
|
|
69
|
+
thClass?: string;
|
|
70
|
+
tdClass?: string;
|
|
71
|
+
/** 셀 커스텀 렌더 (React 확장). 지정 시 type/options는 무시되고 이 노드가 그대로 렌더됩니다. */
|
|
72
|
+
render?: ReactNode;
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### SKeyValueFieldByType
|
|
77
|
+
|
|
78
|
+
```ts
|
|
79
|
+
/**
|
|
80
|
+
* `type`에 따라 `options`가 해당 컴포넌트의 props로 좁혀지는 discriminated union.
|
|
81
|
+
* `type` 생략 시 `text`로 동작합니다.
|
|
82
|
+
*/
|
|
83
|
+
export type SKeyValueFieldByType =
|
|
84
|
+
| { type?: 'text'; options?: { value?: ReactNode } }
|
|
85
|
+
| { type: 'input'; options?: FieldOptions<SInputProps> }
|
|
86
|
+
| { type: 'textarea'; options?: FieldOptions<STextareaProps> }
|
|
87
|
+
| { type: 'number-input'; options?: FieldOptions<SNumberInputProps> }
|
|
88
|
+
| { type: 'select'; options?: FieldOptions<SSelectProps> }
|
|
89
|
+
| { type: 'radio'; options?: FieldOptions<SRadioGroupProps> }
|
|
90
|
+
| { type: 'checkbox'; options?: FieldOptions<SCheckboxProps> }
|
|
91
|
+
| { type: 'switch'; options?: FieldOptions<SSwitchProps> }
|
|
92
|
+
| { type: 'date-picker'; options?: FieldOptions<SDatePickerProps> }
|
|
93
|
+
| { type: 'date-range-picker'; options?: FieldOptions<SDateRangePickerProps> }
|
|
94
|
+
| { type: 'file-picker'; options?: FieldOptions<SFilePickerProps> };
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### SKeyValueFieldValue
|
|
98
|
+
|
|
99
|
+
```ts
|
|
100
|
+
/**
|
|
101
|
+
* field type별 `onChange`로 올라오는 값 타입.
|
|
102
|
+
* - `string`: input · textarea · select · radio · date-picker
|
|
103
|
+
* - `number`: number-input
|
|
104
|
+
* - `boolean`: checkbox · switch
|
|
105
|
+
* - `string[]`: date-range-picker
|
|
106
|
+
*/
|
|
107
|
+
export type SKeyValueFieldValue = string | number | boolean | string[];
|
|
108
|
+
```
|
|
109
|
+
|
|
26
110
|
## Dependencies
|
|
27
111
|
|
|
28
112
|
### Depends on
|
|
@@ -37,6 +121,7 @@
|
|
|
37
121
|
- [SNumberInput](../SNumberInput)
|
|
38
122
|
- [SRadio](../SRadio)
|
|
39
123
|
- [SSelect](../SSelect)
|
|
124
|
+
- [SSwitch](../SSwitch)
|
|
40
125
|
- [STextarea](../STextarea)
|
|
41
126
|
- [STooltip](../STooltip)
|
|
42
127
|
|
|
@@ -54,6 +139,7 @@ graph TD;
|
|
|
54
139
|
SKeyValueTable --> SNumberInput
|
|
55
140
|
SKeyValueTable --> SRadio
|
|
56
141
|
SKeyValueTable --> SSelect
|
|
142
|
+
SKeyValueTable --> SSwitch
|
|
57
143
|
SKeyValueTable --> STextarea
|
|
58
144
|
SKeyValueTable --> STooltip
|
|
59
145
|
style SKeyValueTable fill:#f9f,stroke:#333,stroke-width:4px
|
|
@@ -5,10 +5,11 @@ import { type SNumberInputProps } from '../SNumberInput';
|
|
|
5
5
|
import { type SSelectProps } from '../SSelect';
|
|
6
6
|
import { type SRadioGroupProps } from '../SRadio';
|
|
7
7
|
import { type SCheckboxProps } from '../SCheckbox';
|
|
8
|
+
import { type SSwitchProps } from '../SSwitch';
|
|
8
9
|
import { type SDatePickerProps } from '../SDatePicker';
|
|
9
10
|
import { type SDateRangePickerProps } from '../SDateRangePicker';
|
|
10
11
|
import { type SFilePickerProps } from '../SFilePicker';
|
|
11
|
-
export type SKeyValueFieldType = 'text' | 'input' | 'textarea' | 'number-input' | 'select' | 'radio' | 'checkbox' | 'date-picker' | 'date-range-picker' | 'file-picker';
|
|
12
|
+
export type SKeyValueFieldType = 'text' | 'input' | 'textarea' | 'number-input' | 'select' | 'radio' | 'checkbox' | 'switch' | 'date-picker' | 'date-range-picker' | 'file-picker';
|
|
12
13
|
/** field type과 무관한 공통 속성 (레이아웃·레이블·스팬 등) */
|
|
13
14
|
export interface SKeyValueFieldBase {
|
|
14
15
|
name: string;
|
|
@@ -59,6 +60,9 @@ export type SKeyValueFieldByType = {
|
|
|
59
60
|
} | {
|
|
60
61
|
type: 'checkbox';
|
|
61
62
|
options?: FieldOptions<SCheckboxProps>;
|
|
63
|
+
} | {
|
|
64
|
+
type: 'switch';
|
|
65
|
+
options?: FieldOptions<SSwitchProps>;
|
|
62
66
|
} | {
|
|
63
67
|
type: 'date-picker';
|
|
64
68
|
options?: FieldOptions<SDatePickerProps>;
|
|
@@ -74,7 +78,7 @@ export type SKeyValueField = SKeyValueFieldBase & SKeyValueFieldByType;
|
|
|
74
78
|
* field type별 `onChange`로 올라오는 값 타입.
|
|
75
79
|
* - `string`: input · textarea · select · radio · date-picker
|
|
76
80
|
* - `number`: number-input
|
|
77
|
-
* - `boolean`: checkbox
|
|
81
|
+
* - `boolean`: checkbox · switch
|
|
78
82
|
* - `string[]`: date-range-picker
|
|
79
83
|
*/
|
|
80
84
|
export type SKeyValueFieldValue = string | number | boolean | string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { SKeyValueTable, type SKeyValueTableProps, type SKeyValueField, type SKeyValueFieldType, type SKeyValueChangeDetail, } from './SKeyValueTable';
|
|
1
|
+
export { SKeyValueTable, type SKeyValueTableProps, type SKeyValueField, type SKeyValueFieldBase, type SKeyValueFieldByType, type SKeyValueFieldType, type SKeyValueFieldValue, type SKeyValueChangeDetail, } from './SKeyValueTable';
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|------|------|---------|-------------|
|
|
11
11
|
| `type?` | `SLayoutType` | `'box'` | 메뉴 스타일: box(라운드) / belt(풀폭 행). 자식 SGnb 가 이 값을 따른다. |
|
|
12
12
|
| `header?` | `SLayoutHeader` | `'fix'` | 레이아웃 구조: fix(가로 분할) / full(풀폭 상단바). 자식 SGnb·SPage 가 이 값을 따른다. |
|
|
13
|
-
| `
|
|
13
|
+
| `showRail?` | `boolean` | `false` | GNB 좌측 레일 사용 여부. 자식 SGnb 가 이 값을 따르고, 그만큼 넓어진 컬럼 폭을 되올린다. 레일에 children 없는 아이템이 있으면 SGnb 가 full 상단바를 요구하고, 이 레이아웃도 그에 맞춰 full 그리드로 선다. |
|
|
14
14
|
| `folded?` | `boolean` | — | GNB 접힘 상태 (controlled) |
|
|
15
15
|
| `defaultFolded?` | `boolean` | `false` | GNB 초기 접힘 상태 (uncontrolled) |
|
|
16
16
|
|
|
@@ -20,6 +20,22 @@
|
|
|
20
20
|
|-------|------|-------------|
|
|
21
21
|
| `onFoldedChange` | `(folded: boolean) => void` | 접힘 상태 변경 |
|
|
22
22
|
|
|
23
|
+
## Types
|
|
24
|
+
|
|
25
|
+
### SLayoutType
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
/** 메뉴 스타일: box(라운드) / belt(풀폭 행) — 자식 SGnb 의 메뉴 모양 */
|
|
29
|
+
export type SLayoutType = SGnbType;
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### SLayoutHeader
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
/** 레이아웃 구조: fix(좌측 GNB + 페이지 가로 분할) / full(풀폭 상단바 + 아래에 메뉴|페이지) */
|
|
36
|
+
export type SLayoutHeader = SGnbHeader;
|
|
37
|
+
```
|
|
38
|
+
|
|
23
39
|
## Dependencies
|
|
24
40
|
|
|
25
41
|
### Used by
|
|
@@ -27,10 +43,15 @@
|
|
|
27
43
|
- [SGnb](../SGnb)
|
|
28
44
|
- [SPage](../SPage)
|
|
29
45
|
|
|
46
|
+
### Depends on
|
|
47
|
+
|
|
48
|
+
- [SPage](../SPage)
|
|
49
|
+
|
|
30
50
|
### Graph
|
|
31
51
|
|
|
32
52
|
```mermaid
|
|
33
53
|
graph TD;
|
|
54
|
+
SLayout --> SPage
|
|
34
55
|
SGnb --> SLayout
|
|
35
56
|
SPage --> SLayout
|
|
36
57
|
style SLayout fill:#f9f,stroke:#333,stroke-width:4px
|
|
@@ -42,7 +42,7 @@ export interface SLayoutContextValue {
|
|
|
42
42
|
*/
|
|
43
43
|
header: SLayoutHeader;
|
|
44
44
|
/** GNB 좌측 레일 사용 여부 — 자식 SGnb 가 따른다 */
|
|
45
|
-
|
|
45
|
+
showRail: boolean;
|
|
46
46
|
/** GNB 접힘 상태 */
|
|
47
47
|
folded: boolean;
|
|
48
48
|
/** 접힘 상태 변경 */
|
|
@@ -81,7 +81,7 @@ export interface SLayoutProps extends HTMLAttributes<HTMLDivElement> {
|
|
|
81
81
|
* GNB 좌측 레일 사용 여부. 자식 SGnb 가 이 값을 따르고, 그만큼 넓어진 컬럼 폭을 되올린다.
|
|
82
82
|
* 레일에 children 없는 아이템이 있으면 SGnb 가 full 상단바를 요구하고, 이 레이아웃도 그에 맞춰 full 그리드로 선다.
|
|
83
83
|
*/
|
|
84
|
-
|
|
84
|
+
showRail?: boolean;
|
|
85
85
|
/** GNB 접힘 상태 (controlled) */
|
|
86
86
|
folded?: boolean;
|
|
87
87
|
/** GNB 초기 접힘 상태 (uncontrolled) */
|
|
@@ -106,5 +106,9 @@ export interface SLayoutProps extends HTMLAttributes<HTMLDivElement> {
|
|
|
106
106
|
* "header header" ← 전폭 상단바 (1행, 높이 = 등록된 topHeight)
|
|
107
107
|
* "nav page" ← 메뉴 열(등록된 columnWidth) | 페이지
|
|
108
108
|
* 접으면 nav 열을 0 으로 접어 페이지가 전폭을 쓴다.
|
|
109
|
+
*
|
|
110
|
+
* 자식 순서는 `SGnb` → (선택) `SPageHeader` → `SPage` 다. `SPageHeader` 를 두면 **그 자식부터 뒤가**
|
|
111
|
+
* 하나의 페이지 열로 묶여(page-column.tsx) 헤더가 페이지 위에 고정되고, 그 아래에서만 스크롤이 일어난다.
|
|
112
|
+
* 헤더를 두지 않으면 아무것도 감싸지 않는다 — `SPage` 가 예전처럼 프레임의 자식으로 남는다.
|
|
109
113
|
*/
|
|
110
114
|
export declare const SLayout: import("react").ForwardRefExoticComponent<SLayoutProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { SLayout, SLayoutContext, SLAYOUT_MIN_WIDTH, useSLayout, type SLayoutProps, type SLayoutType, type SLayoutHeader, type SLayoutContextValue, } from './SLayout';
|
|
1
|
+
export { SLayout, SLayoutContext, SLAYOUT_MIN_WIDTH, useSLayout, type SLayoutProps, type SLayoutType, type SLayoutHeader, type SLayoutNavState, type SLayoutContextValue, } from './SLayout';
|
|
@@ -10,8 +10,23 @@
|
|
|
10
10
|
|------|------|---------|-------------|
|
|
11
11
|
| `value?` | `number` | `0` | 진행률 (0–100) |
|
|
12
12
|
| `type?` | `SLinearProgressType` | `'primary'` | 색상 타입 |
|
|
13
|
+
| `size?` | `SLinearProgressSize` | `'sm'` | 바 높이. xs 는 바 안에 퍼센트 텍스트를 넣지 않는다 |
|
|
13
14
|
| `indeterminate?` | `boolean` | `false` | 진행률 없이 무한 애니메이션 |
|
|
14
15
|
| `label?` | `string` | — | 하단 레이블 |
|
|
15
16
|
| `className?` | `string` | — | |
|
|
16
17
|
| `style?` | `CSSProperties` | — | |
|
|
17
18
|
|
|
19
|
+
## Types
|
|
20
|
+
|
|
21
|
+
### SLinearProgressType
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
export type SLinearProgressType = 'primary' | 'error' | 'complete';
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### SLinearProgressSize
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
export type SLinearProgressSize = 'xs' | 'sm' | 'md';
|
|
31
|
+
```
|
|
32
|
+
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { type CSSProperties } from 'react';
|
|
2
2
|
export type SLinearProgressType = 'primary' | 'error' | 'complete';
|
|
3
|
+
export type SLinearProgressSize = 'xs' | 'sm' | 'md';
|
|
3
4
|
export interface SLinearProgressProps {
|
|
4
5
|
/** 진행률 (0–100) */
|
|
5
6
|
value?: number;
|
|
6
7
|
/** 색상 타입 */
|
|
7
8
|
type?: SLinearProgressType;
|
|
9
|
+
/** 바 높이. xs 는 바 안에 퍼센트 텍스트를 넣지 않는다 */
|
|
10
|
+
size?: SLinearProgressSize;
|
|
8
11
|
/** 진행률 없이 무한 애니메이션 */
|
|
9
12
|
indeterminate?: boolean;
|
|
10
13
|
/** 하단 레이블 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { SLinearProgress, type SLinearProgressProps, type SLinearProgressType, } from './SLinearProgress';
|
|
1
|
+
export { SLinearProgress, type SLinearProgressProps, type SLinearProgressType, type SLinearProgressSize, } from './SLinearProgress';
|
|
@@ -9,9 +9,16 @@
|
|
|
9
9
|
| Prop | Type | Default | Description |
|
|
10
10
|
|------|------|---------|-------------|
|
|
11
11
|
| `children?` | `ReactNode` | — | 리스트 컨테이너 내부에 렌더링할 내용 |
|
|
12
|
-
| `
|
|
13
|
-
| `
|
|
14
|
-
|
|
12
|
+
| `gap?` | `boolean` | `false` | 리스트 아이템 사이 gap 토큰 적용 여부 |
|
|
13
|
+
| `padding?` | `SListPadding` | `'none'` | 컨테이너 안쪽 여백. 기본은 `none` — 목록이 담긴 면이 이미 여백을 쥔 경우가 많다. 목록이 배경 위에 직접 얹혀 스스로 여백을 쥐어야 할 때만 `default`. |
|
|
14
|
+
|
|
15
|
+
## Types
|
|
16
|
+
|
|
17
|
+
### SListPadding
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
export type SListPadding = 'default' | 'none';
|
|
21
|
+
```
|
|
15
22
|
|
|
16
23
|
## Dependencies
|
|
17
24
|
|
|
@@ -20,10 +27,15 @@
|
|
|
20
27
|
- [SDraggableList](../SDraggableList)
|
|
21
28
|
- [SExpansionList](../SExpansionList)
|
|
22
29
|
|
|
30
|
+
### Depends on
|
|
31
|
+
|
|
32
|
+
- [SDivider](../SDivider)
|
|
33
|
+
|
|
23
34
|
### Graph
|
|
24
35
|
|
|
25
36
|
```mermaid
|
|
26
37
|
graph TD;
|
|
38
|
+
SList --> SDivider
|
|
27
39
|
SDraggableList --> SList
|
|
28
40
|
SExpansionList --> SList
|
|
29
41
|
style SList fill:#f9f,stroke:#333,stroke-width:4px
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
export type SListPadding = 'default' | 'none';
|
|
2
3
|
export interface SListProps extends HTMLAttributes<HTMLDivElement> {
|
|
3
4
|
/** 리스트 컨테이너 내부에 렌더링할 내용 */
|
|
4
5
|
children?: ReactNode;
|
|
5
6
|
/** 리스트 아이템 사이 gap 토큰 적용 여부 */
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
gap?: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* 컨테이너 안쪽 여백. 기본은 `none` — 목록이 담긴 면이 이미 여백을 쥔 경우가 많다.
|
|
10
|
+
* 목록이 배경 위에 직접 얹혀 스스로 여백을 쥐어야 할 때만 `default`.
|
|
11
|
+
*/
|
|
12
|
+
padding?: SListPadding;
|
|
11
13
|
}
|
|
12
14
|
export declare const SList: import("react").ForwardRefExoticComponent<SListProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { SList, type SListProps } from './SList';
|
|
1
|
+
export { SList, type SListPadding, type SListProps } from './SList';
|
|
@@ -23,6 +23,47 @@
|
|
|
23
23
|
| `size?` | `SListItemSize` | `'sm'` | 타이포그래피 크기 |
|
|
24
24
|
| `disabled?` | `boolean` | `false` | 비활성 상태 여부 |
|
|
25
25
|
|
|
26
|
+
## Types
|
|
27
|
+
|
|
28
|
+
### SListItemSlot
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
export type SListItemSlot = ReactNode | SListItemRenderProp;
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### SListItemSupportingTextPosition
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
export type SListItemSupportingTextPosition = 'right' | 'bottom';
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### SListItemInteraction
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
export type SListItemInteraction = 'chevron';
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### SListItemSize
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
export type SListItemSize = 'sm' | 'md';
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### SListItemRenderProp
|
|
53
|
+
|
|
54
|
+
```ts
|
|
55
|
+
export type SListItemRenderProp = (state: SListItemRenderState) => ReactNode;
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### SListItemRenderState
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
export interface SListItemRenderState {
|
|
62
|
+
hovered: boolean;
|
|
63
|
+
disabled: boolean;
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
26
67
|
## Dependencies
|
|
27
68
|
|
|
28
69
|
### Used by
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { SListItem, type SListItemProps, type SListItemSupportingTextPosition } from './SListItem';
|
|
1
|
+
export { SListItem, type SListItemInteraction, type SListItemProps, type SListItemRenderProp, type SListItemRenderState, type SListItemSize, type SListItemSlot, type SListItemSupportingTextPosition, } from './SListItem';
|
|
@@ -1,10 +1,26 @@
|
|
|
1
1
|
/** 오버레이 뷰포트 — 스토어를 구독해 SLoadingContainer 를 렌더한다. 직접 배치도 가능. */
|
|
2
2
|
export declare function SLoadingViewport(): import("react").JSX.Element;
|
|
3
3
|
export declare const loading: {
|
|
4
|
-
/**
|
|
4
|
+
/**
|
|
5
|
+
* 로딩 오버레이 표시. 겹쳐 부르면 그만큼 쌓이고 **마지막 하나가 걷힐 때** 닫힌다.
|
|
6
|
+
* 반환값은 이 호출 하나만 걷는 함수다(두 번 불러도 한 번만 걷힌다) — `hide()` 대신 이것을
|
|
7
|
+
* 쓰면 짝이 어긋나지 않는다.
|
|
8
|
+
*
|
|
9
|
+
* ⚠️ 메시지만 바꾸려면 `update()` 를 쓴다. `show()` 를 다시 부르면 하나 더 쌓여
|
|
10
|
+
* `hide()` 한 번으로는 닫히지 않는다.
|
|
11
|
+
*/
|
|
5
12
|
show(options?: {
|
|
6
13
|
message?: string;
|
|
14
|
+
}): () => void;
|
|
15
|
+
/** 표시 중인 메시지 갱신 — 쌓인 수는 그대로다 */
|
|
16
|
+
update(options: {
|
|
17
|
+
message?: string;
|
|
7
18
|
}): void;
|
|
8
|
-
/**
|
|
19
|
+
/** 가장 나중의 show 하나를 걷는다. 남은 것이 없을 때만 오버레이가 닫힌다 */
|
|
9
20
|
hide(): void;
|
|
21
|
+
/**
|
|
22
|
+
* 쌓인 것을 모두 걷고 즉시 닫는다. 화면 전환·에러 복구처럼 진행 중이던 작업의 짝을 더는
|
|
23
|
+
* 맞출 수 없을 때만 쓴다 — 평소에는 `hide()` 나 `show()` 가 준 함수로 하나씩 걷는다.
|
|
24
|
+
*/
|
|
25
|
+
hideAll(): void;
|
|
10
26
|
};
|
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
|------|------|---------|-------------|
|
|
11
11
|
| `open?` | `boolean` | — | |
|
|
12
12
|
| `persistent?` | `boolean` | — | 백드롭·ESC로 안 닫히고 흔들림 (sd-modal-container persistent). **기본값 true** |
|
|
13
|
-
| `state?` | `
|
|
13
|
+
| `state?` | `SLoadingModalState` | `'loading'` | 상태 (loading: 스피너, error: 경고 아이콘) |
|
|
14
14
|
| `progress?` | `number` | — | 진행률 (0–100) — 지정 시 determinate 스피너 |
|
|
15
15
|
| `message?` | `string \| string[]` | — | 메시지 (없으면 state 기본값) |
|
|
16
|
-
| `
|
|
16
|
+
| `showButton?` | `boolean` | `false` | 하단 버튼 표시 |
|
|
17
17
|
| `buttonLabel?` | `string` | — | 버튼 레이블 (없으면 state 기본값) |
|
|
18
18
|
| `width?` | `number \| string` | `520` | |
|
|
19
19
|
| `height?` | `number \| string` | `320` | |
|
|
@@ -26,6 +26,14 @@
|
|
|
26
26
|
| `onClose` | `() => void` | 닫기(X) 버튼 클릭 (sdClose) — error 상태에서만 노출 |
|
|
27
27
|
| `onButtonClick` | `() => void` | 버튼 클릭 (sdClick) |
|
|
28
28
|
|
|
29
|
+
## Types
|
|
30
|
+
|
|
31
|
+
### SLoadingModalState
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
export type SLoadingModalState = 'loading' | 'error';
|
|
35
|
+
```
|
|
36
|
+
|
|
29
37
|
## Dependencies
|
|
30
38
|
|
|
31
39
|
### Used by
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type
|
|
1
|
+
export type SLoadingModalState = 'loading' | 'error';
|
|
2
2
|
export interface SLoadingModalProps {
|
|
3
3
|
open?: boolean;
|
|
4
4
|
onOpenChange?: (open: boolean) => void;
|
|
@@ -7,13 +7,13 @@ export interface SLoadingModalProps {
|
|
|
7
7
|
/** 백드롭·ESC로 안 닫히고 흔들림 (sd-modal-container persistent). **기본값 true** */
|
|
8
8
|
persistent?: boolean;
|
|
9
9
|
/** 상태 (loading: 스피너, error: 경고 아이콘) */
|
|
10
|
-
state?:
|
|
10
|
+
state?: SLoadingModalState;
|
|
11
11
|
/** 진행률 (0–100) — 지정 시 determinate 스피너 */
|
|
12
12
|
progress?: number;
|
|
13
13
|
/** 메시지 (없으면 state 기본값) */
|
|
14
14
|
message?: string | string[];
|
|
15
15
|
/** 하단 버튼 표시 */
|
|
16
|
-
|
|
16
|
+
showButton?: boolean;
|
|
17
17
|
/** 버튼 레이블 (없으면 state 기본값) */
|
|
18
18
|
buttonLabel?: string;
|
|
19
19
|
/** 버튼 클릭 (sdClick) */
|
|
@@ -22,4 +22,4 @@ export interface SLoadingModalProps {
|
|
|
22
22
|
height?: number | string;
|
|
23
23
|
}
|
|
24
24
|
/** SLoadingModal — sd-loading-modal 포팅. state(loading/error) + progress + 옵션 버튼. */
|
|
25
|
-
export declare function SLoadingModal({ open, onOpenChange, onClose, persistent, state, progress, message,
|
|
25
|
+
export declare function SLoadingModal({ open, onOpenChange, onClose, persistent, state, progress, message, showButton, buttonLabel, onButtonClick, width, height, }: SLoadingModalProps): import("react").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { SLoadingModal, type SLoadingModalProps } from './SLoadingModal';
|
|
1
|
+
export { SLoadingModal, type SLoadingModalProps, type SLoadingModalState } from './SLoadingModal';
|
|
@@ -61,7 +61,7 @@ SModal.confirm({
|
|
|
61
61
|
.onCancel(() => {});
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
**옵션 (`SConfirmOptions`)** — 선언형 `SConfirmModalProps` 에서 제어 흐름 props(`open`/`onOpenChange`/`onOk`/`onCancel`/`onClose`)를 제외한 전부. 주요 키: `type`, `modalTitle`, `topMessage`/`bottomMessage`, `mainButtonLabel`/`
|
|
64
|
+
**옵션 (`SConfirmOptions`)** — 선언형 `SConfirmModalProps` 에서 제어 흐름 props(`open`/`onOpenChange`/`onOk`/`onCancel`/`onClose`)를 제외한 전부. 주요 키: `type`, `modalTitle`, `topMessage`/`bottomMessage`, `mainButtonLabel`/`mainButtonOutline`, `subButtonLabel`, `tagSlot`/`optionSlot`/`contentSlot`, `persistent`.
|
|
65
65
|
|
|
66
66
|
---
|
|
67
67
|
|