sellmate-design-system-react 9.0.0-beta.40 → 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 +41 -20
- package/dist/components/SBarcodeInput/README.md +3 -3
- package/dist/components/SBarcodeInput/SBarcodeInput.d.ts +3 -1
- package/dist/components/SChipInput/README.md +1 -1
- package/dist/components/SChipInput/SChipInput.d.ts +1 -1
- package/dist/components/SConfirmModal/README.md +3 -11
- package/dist/components/SConfirmModal/SConfirmModal.d.ts +16 -8
- package/dist/components/SConfirmModal/index.d.ts +1 -1
- package/dist/components/SDateRangePicker/README.md +2 -2
- package/dist/components/SDateRangePicker/SDateRangePicker.d.ts +4 -4
- package/dist/components/SEditor/EditorBody.d.ts +1 -1
- package/dist/components/SEditor/README.md +4 -4
- package/dist/components/SEditor/SEditor.d.ts +3 -3
- package/dist/components/SField/README.md +2 -2
- package/dist/components/SField/SField.d.ts +8 -2
- package/dist/components/SFilePicker/README.md +3 -3
- package/dist/components/SFilePicker/SFilePicker.d.ts +4 -4
- package/dist/components/SForm/README.md +1 -1
- package/dist/components/SForm/SForm.d.ts +2 -2
- package/dist/components/SGnb/README.md +7 -7
- package/dist/components/SGnb/SGnb.d.ts +9 -9
- package/dist/components/SGnb/gnb.config.d.ts +2 -2
- package/dist/components/SImage/README.md +1 -1
- package/dist/components/SImage/SImage.d.ts +2 -2
- package/dist/components/SInput/README.md +3 -3
- package/dist/components/SInput/SInput.d.ts +3 -3
- package/dist/components/SLayout/README.md +1 -1
- package/dist/components/SLayout/SLayout.d.ts +2 -2
- package/dist/components/SList/README.md +10 -2
- package/dist/components/SList/SList.d.ts +7 -3
- package/dist/components/SList/index.d.ts +1 -1
- package/dist/components/SLoadingModal/README.md +1 -1
- package/dist/components/SLoadingModal/SLoadingModal.d.ts +2 -2
- package/dist/components/SModal/README.md +1 -1
- package/dist/components/SNumberInput/README.md +5 -5
- package/dist/components/SNumberInput/SNumberInput.d.ts +5 -3
- package/dist/components/SPage/README.md +42 -3
- package/dist/components/SPage/SPage.d.ts +16 -1
- package/dist/components/SPage/SPageHeader.d.ts +19 -8
- package/dist/components/SPage/index.d.ts +1 -1
- package/dist/components/SPage/page-column.d.ts +11 -2
- package/dist/components/SPage/page-width.d.ts +23 -0
- package/dist/components/SPage/page.config.d.ts +18 -0
- package/dist/components/SPopup/README.md +8 -2
- package/dist/components/SPopup/SPopup.d.ts +7 -3
- package/dist/components/SPopup/index.d.ts +1 -1
- package/dist/components/SSearchInput/README.md +3 -3
- package/dist/components/SSearchInput/SSearchInput.d.ts +3 -3
- package/dist/components/SSelect/README.md +5 -5
- package/dist/components/SSelect/SSelect.d.ts +14 -6
- package/dist/components/SSplitter/README.md +2 -2
- package/dist/components/SSplitter/SSplitter.d.ts +7 -3
- package/dist/components/SSwitch/README.md +0 -1
- package/dist/components/SSwitch/SSwitch.d.ts +1 -3
- package/dist/components/STable/README.md +8 -9
- package/dist/components/STable/STable.d.ts +9 -11
- package/dist/components/STabs/README.md +1 -1
- package/dist/components/STabs/STabs.d.ts +2 -2
- package/dist/components/STextLink/README.md +1 -1
- package/dist/components/STextLink/STextLink.d.ts +1 -1
- package/dist/components/STextarea/README.md +3 -3
- package/dist/components/STextarea/STextarea.d.ts +3 -3
- package/dist/components/STimePicker/README.md +1 -1
- package/dist/components/STimePicker/STimePicker.d.ts +4 -4
- package/dist/components/STimeRangePicker/README.md +1 -1
- package/dist/components/STimeRangePicker/STimeRangePicker.d.ts +4 -4
- package/dist/components/SToast/README.md +1 -1
- package/dist/components/SToast/SToast.d.ts +2 -2
- package/dist/components/STooltip/README.md +1 -1
- package/dist/components/STooltip/STooltip.d.ts +1 -1
- package/dist/components/STree/README.md +4 -4
- package/dist/components/STree/STree.d.ts +17 -5
- package/dist/index.cjs +295 -237
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +294 -238
- package/dist/index.js.map +1 -1
- package/dist/llms-full.txt +170 -106
- package/dist/llms.txt +41 -20
- package/dist/styles.css +9 -0
- package/package.json +1 -1
|
@@ -45,19 +45,19 @@ export interface SGnbProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'>
|
|
|
45
45
|
type?: SGnbType;
|
|
46
46
|
/**
|
|
47
47
|
* 상단바 구조: fix(GNB 폭 고정) / full(레이아웃 전폭). 미지정 시 SLayout 의 header 를 따른다.
|
|
48
|
-
* 단,
|
|
48
|
+
* 단, showRail 이고 레일에 children 없는 아이템이 있으면 메뉴 폭이 출렁이므로 full 로 강제된다.
|
|
49
49
|
*/
|
|
50
50
|
header?: SGnbHeader;
|
|
51
51
|
/** 색상 테마: light / dark */
|
|
52
52
|
color?: SGnbColor;
|
|
53
|
-
/** 메뉴 트리 (depth1 → depth2 → depth3).
|
|
53
|
+
/** 메뉴 트리 (depth1 → depth2 → depth3). showRail 이면 첫 depth 가 레일이 되고 그 children 이 depth1 이 된다. */
|
|
54
54
|
items: SGnbMenuItem[];
|
|
55
55
|
/**
|
|
56
56
|
* 좌측 레일 사용 여부. 켜면 items 의 첫 depth 가 아이콘+라벨 버튼의 세로 레일로 서고,
|
|
57
|
-
* 선택된 레일 아이템의 children 이 오른쪽 메뉴 패널에 깔린다. 미지정 시 SLayout 의
|
|
57
|
+
* 선택된 레일 아이템의 children 이 오른쪽 메뉴 패널에 깔린다. 미지정 시 SLayout 의 showRail 을 따른다.
|
|
58
58
|
* children 없는 레일 아이템이 활성이면 메뉴 패널은 렌더되지 않고 레일만 남는다.
|
|
59
59
|
*/
|
|
60
|
-
|
|
60
|
+
showRail?: boolean;
|
|
61
61
|
/** 현재 선택된 아이템 value */
|
|
62
62
|
value?: string;
|
|
63
63
|
/** 선택 변경 (sdUpdate) */
|
|
@@ -67,7 +67,7 @@ export interface SGnbProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'>
|
|
|
67
67
|
/** 접힘(레일) 상태. 미지정 시 SLayout 의 folded 를 따른다. */
|
|
68
68
|
folded?: boolean;
|
|
69
69
|
/** 접힘 토글 (sdFoldChange) */
|
|
70
|
-
|
|
70
|
+
onFoldedChange?: (folded: boolean) => void;
|
|
71
71
|
/** 앱런처(그리드) 버튼 클릭. 미지정 시 런처 버튼을 렌더하지 않는다. 접힘 레일(fix)에는 폴드 버튼만 남으므로 표시되지 않는다. */
|
|
72
72
|
onLauncherClick?: () => void;
|
|
73
73
|
/** 상단바 로고 영역 (slot). header="full" 이면 폭이 140px 로 고정된다. */
|
|
@@ -80,12 +80,12 @@ export interface SGnbProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'>
|
|
|
80
80
|
topContent?: ReactNode;
|
|
81
81
|
/**
|
|
82
82
|
* 레일 상단 고정 슬롯. 레일 아이템이 많아 넘치면 아이템 목록(ul)만 스크롤되고
|
|
83
|
-
* 이 슬롯은 레일 상단(상단바 바로 아래)에 붙어 고정된다.
|
|
83
|
+
* 이 슬롯은 레일 상단(상단바 바로 아래)에 붙어 고정된다. showRail 일 때만 렌더된다.
|
|
84
84
|
*/
|
|
85
85
|
railTop?: ReactNode;
|
|
86
86
|
/**
|
|
87
87
|
* 레일 하단 고정 슬롯. 레일 아이템이 많아 넘치면 아이템 목록(ul)만 스크롤되고
|
|
88
|
-
* 이 슬롯은 레일 하단에 붙어 고정된다.
|
|
88
|
+
* 이 슬롯은 레일 하단에 붙어 고정된다. showRail 일 때만 렌더된다.
|
|
89
89
|
*/
|
|
90
90
|
railFooter?: ReactNode;
|
|
91
91
|
/**
|
|
@@ -123,7 +123,7 @@ export interface SGnbProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'>
|
|
|
123
123
|
/**
|
|
124
124
|
* system 슬롯(`SGnbSystem`). 놓이는 자리와 형태는 `header` 가 정한다.
|
|
125
125
|
* - fix : GNB 맨 아래 세로 판. 펼치면 메뉴 컬럼 바닥에, 접히면 `foldedFooter` 아래 레일 바닥에
|
|
126
|
-
* 여백 없이 붙는다.
|
|
126
|
+
* 여백 없이 붙는다. showRail 에서 메뉴가 없는 레일 아이템이 활성이면 메뉴 컬럼째 사라지므로
|
|
127
127
|
* 이 슬롯도 함께 빠진다.
|
|
128
128
|
* - full: 전폭 상단바 오른쪽 끝에 가로 한 줄로 선다. 상단바는 접어도 남으므로 조각들도 늘 남는다.
|
|
129
129
|
* 색·형태는 GNB 가 내려주므로 SGnbSystem 에 다시 넘기지 않아도 된다.
|
|
@@ -142,7 +142,7 @@ export interface SGnbProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'>
|
|
|
142
142
|
* - full: 상단바가 레이아웃 전폭을 가로지르고 그 아래 [메뉴 | 페이지]. 접으면 메뉴만 사라진다.
|
|
143
143
|
* system 조각들도 메뉴 바닥이 아니라 이 상단바 오른쪽 끝으로 올라온다.
|
|
144
144
|
*
|
|
145
|
-
*
|
|
145
|
+
* showRail 이면 items 의 첫 depth 가 좌측 레일(아이콘+라벨 68px)로 서고, 선택된 레일 아이템의
|
|
146
146
|
* children 이 메뉴 패널의 depth1 이 된다 — 트리는 그대로 두고 어디부터 그릴지만 바뀐다.
|
|
147
147
|
* children 없는 레일 아이템은 자기 자신이 선택(리프)이라 메뉴 패널을 렌더하지 않는다. 이런 리프가
|
|
148
148
|
* 하나라도 있으면 활성에 따라 메뉴 폭이 출렁이므로 header 는 full 로 강제해 상단바를 전폭에 고정한다.
|
|
@@ -80,7 +80,7 @@ export declare const GNB_COMMON: {
|
|
|
80
80
|
foldWidth: string;
|
|
81
81
|
};
|
|
82
82
|
/**
|
|
83
|
-
* 좌측 레일(
|
|
83
|
+
* 좌측 레일(showRail) — items 의 첫 depth 를 아이콘+라벨 버튼으로 세우는 1차 내비게이션.
|
|
84
84
|
* 선택 색은 레일 전용 토큰이 없어 메뉴 아이템의 선택 색(item-bg-selected / item-fg-selected)을 함께 쓴다.
|
|
85
85
|
*/
|
|
86
86
|
export declare const GNB_RAIL: {
|
|
@@ -154,7 +154,7 @@ export declare const GNB_TOP_ICON_SIZE = 24;
|
|
|
154
154
|
*/
|
|
155
155
|
export declare const GNB_FULL_LOGO_WIDTH_NO_LAUNCHER: number;
|
|
156
156
|
/**
|
|
157
|
-
*
|
|
157
|
+
* showRail 에서 value 를 품은 첫 depth(레일) 아이템의 value.
|
|
158
158
|
* value 자체가 레일 아이템이면 그 값을, 어디에도 없으면 undefined 를 반환한다.
|
|
159
159
|
*/
|
|
160
160
|
export declare function findGnbRailValue(items: SGnbMenuItem[], value: string): string | undefined;
|
|
@@ -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 등) |
|
|
@@ -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` | — | |
|
|
@@ -30,12 +30,12 @@ export interface SInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>,
|
|
|
30
30
|
rules?: Rule[];
|
|
31
31
|
/** 필드 상태 ('default' | 'pass' | 'error') */
|
|
32
32
|
status?: SFieldStatus;
|
|
33
|
-
/** 포커스
|
|
33
|
+
/** 포커스 상태를 밖에서 지정한다 — 강조 테두리·링이 즉시 걸린다 (SField 로 그대로 넘어간다) */
|
|
34
34
|
focused?: boolean;
|
|
35
|
-
/** 호버
|
|
35
|
+
/** 호버 상태를 밖에서 지정한다 — 강조는 `focused` 와 같다 (SField 로 그대로 넘어간다) */
|
|
36
36
|
hovered?: boolean;
|
|
37
37
|
/** 내부 input 요소 className */
|
|
38
|
-
|
|
38
|
+
inputClassName?: string;
|
|
39
39
|
/** 내부 input 요소 style */
|
|
40
40
|
inputStyle?: CSSProperties;
|
|
41
41
|
label?: string;
|
|
@@ -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
|
|
|
@@ -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) */
|
|
@@ -9,8 +9,16 @@
|
|
|
9
9
|
| Prop | Type | Default | Description |
|
|
10
10
|
|------|------|---------|-------------|
|
|
11
11
|
| `children?` | `ReactNode` | — | 리스트 컨테이너 내부에 렌더링할 내용 |
|
|
12
|
-
| `
|
|
13
|
-
| `
|
|
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
|
+
```
|
|
14
22
|
|
|
15
23
|
## Dependencies
|
|
16
24
|
|
|
@@ -1,10 +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
|
-
|
|
7
|
+
gap?: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* 컨테이너 안쪽 여백. 기본은 `none` — 목록이 담긴 면이 이미 여백을 쥔 경우가 많다.
|
|
10
|
+
* 목록이 배경 위에 직접 얹혀 스스로 여백을 쥐어야 할 때만 `default`.
|
|
11
|
+
*/
|
|
12
|
+
padding?: SListPadding;
|
|
9
13
|
}
|
|
10
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';
|
|
@@ -13,7 +13,7 @@
|
|
|
13
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` | |
|
|
@@ -13,7 +13,7 @@ export interface SLoadingModalProps {
|
|
|
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;
|
|
@@ -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
|
|
|
@@ -13,12 +13,12 @@
|
|
|
13
13
|
| `min?` | `number` | `Number.NEGATIVE_INFINITY` | 최솟값 |
|
|
14
14
|
| `max?` | `number` | `Number.POSITIVE_INFINITY` | 최댓값 |
|
|
15
15
|
| `step?` | `number` | `1` | 스텝 단위 |
|
|
16
|
-
| `
|
|
17
|
-
| `
|
|
16
|
+
| `showButton?` | `boolean` | `false` | 증감 버튼 표시 |
|
|
17
|
+
| `allowDecimal?` | `boolean` | `false` | 소수점 입력 허용 |
|
|
18
18
|
| `maxDecimalLength?` | `number` | — | 소수점 이하 최대 자리수 |
|
|
19
19
|
| `inputPrefix?` | `string` | `''` | 입력 앞 접두 텍스트 |
|
|
20
20
|
| `inputSuffix?` | `string` | `''` | 입력 뒤 접미 텍스트 |
|
|
21
|
-
| `
|
|
21
|
+
| `inputClassName?` | `string` | — | 네이티브 input className |
|
|
22
22
|
| `inputStyle?` | `CSSProperties` | — | 네이티브 input style |
|
|
23
23
|
| `autoFocus?` | `boolean` | — | 마운트 시 자동 포커스 |
|
|
24
24
|
| `name?` | `string` | — | 폼 연동 name |
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
| `readOnly?` | `boolean` | `false` | |
|
|
28
28
|
| `rules?` | `Rule[]` | — | 유효성 규칙 — blur 시 검증 |
|
|
29
29
|
| `status?` | `SFieldStatus` | — | |
|
|
30
|
-
| `focused?` | `boolean` | — |
|
|
31
|
-
| `hovered?` | `boolean` | — |
|
|
30
|
+
| `focused?` | `boolean` | — | 포커스 상태를 밖에서 지정한다 — 강조 테두리·링이 즉시 걸린다 (SField 로 그대로 넘어간다) |
|
|
31
|
+
| `hovered?` | `boolean` | — | 호버 상태를 밖에서 지정한다 — 강조는 `focused` 와 같다 (SField 로 그대로 넘어간다) |
|
|
32
32
|
| `label?` | `string` | — | |
|
|
33
33
|
| `labelWidth?` | `number \| string` | — | |
|
|
34
34
|
| `icon?` | `SIconName` | — | |
|
|
@@ -20,9 +20,9 @@ export interface SNumberInputProps {
|
|
|
20
20
|
/** 스텝 단위 */
|
|
21
21
|
step?: number;
|
|
22
22
|
/** 증감 버튼 표시 */
|
|
23
|
-
|
|
23
|
+
showButton?: boolean;
|
|
24
24
|
/** 소수점 입력 허용 */
|
|
25
|
-
|
|
25
|
+
allowDecimal?: boolean;
|
|
26
26
|
/** 소수점 이하 최대 자리수 */
|
|
27
27
|
maxDecimalLength?: number;
|
|
28
28
|
/** 입력 앞 접두 텍스트 */
|
|
@@ -30,7 +30,7 @@ export interface SNumberInputProps {
|
|
|
30
30
|
/** 입력 뒤 접미 텍스트 */
|
|
31
31
|
inputSuffix?: string;
|
|
32
32
|
/** 네이티브 input className */
|
|
33
|
-
|
|
33
|
+
inputClassName?: string;
|
|
34
34
|
/** 네이티브 input style */
|
|
35
35
|
inputStyle?: CSSProperties;
|
|
36
36
|
/** 마운트 시 자동 포커스 */
|
|
@@ -47,7 +47,9 @@ export interface SNumberInputProps {
|
|
|
47
47
|
/** 유효성 규칙 — blur 시 검증 */
|
|
48
48
|
rules?: Rule[];
|
|
49
49
|
status?: SFieldStatus;
|
|
50
|
+
/** 포커스 상태를 밖에서 지정한다 — 강조 테두리·링이 즉시 걸린다 (SField 로 그대로 넘어간다) */
|
|
50
51
|
focused?: boolean;
|
|
52
|
+
/** 호버 상태를 밖에서 지정한다 — 강조는 `focused` 와 같다 (SField 로 그대로 넘어간다) */
|
|
51
53
|
hovered?: boolean;
|
|
52
54
|
label?: string;
|
|
53
55
|
labelWidth?: number | string;
|
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
| Prop | Type | Default | Description |
|
|
10
10
|
|------|------|---------|-------------|
|
|
11
11
|
| `title` | `string` | — | 타이틀 (필수) |
|
|
12
|
-
| `subText?` | `string` | — | 서브 텍스트.
|
|
13
|
-
| `
|
|
12
|
+
| `subText?` | `string` | — | 서브 텍스트. `bar` 면 타이틀 오른쪽에, `plain` 이면 타이틀 아래에 놓인다. |
|
|
13
|
+
| `variant` | `SPageHeaderVariant` | — | 제목 영역의 모양 — **필수다.** - `plain`: 최소 높이(상하 패딩 안에서 타이틀 한 줄 높이로 결정) + 구분선 없음, 서브 텍스트가 타이틀 아래로 내려간다. - `bar`: 높이 고정 + 하단 구분선, 서브 텍스트가 타이틀과 같은 줄. 기본값을 두지 않는 이유는 이 값이 **앱 전체에서 하나로 고정돼야 하는 값**이기 때문이다. 기본값이 있으면 안 준 페이지만 조용히 다른 모양이 되어, 메뉴를 옮길 때 제목 줄의 높이와 구분선이 페이지마다 튄다. 셸을 한 번 감싸 쓰면(§4-1 AppShell) 지정하는 자리도 한 곳이다. 배경은 두 베리에이션 모두 흰 면이다. `SLayout` 의 `header`(`'fix' | 'full'`)와는 다른 축이다 — 그쪽은 상단바가 GNB 컬럼 안에 있는지 화면 전폭인지를 정한다. |
|
|
14
14
|
| `slot?` | `ReactNode` | — | 오른쪽 끝 커스텀 슬롯. 가이드 링크·액션 버튼 등 페이지마다 다른 것이 온다. |
|
|
15
|
-
| `scrolled?` | `boolean` | — | 아래 콘텐츠가 스크롤을 시작했는지.
|
|
15
|
+
| `scrolled?` | `boolean` | — | 아래 콘텐츠가 스크롤을 시작했는지. `plain` 일 때만 의미가 있다: 스크롤이 시작되면 그림자(floating)가 들어가 스크롤되는 콘텐츠 위에 뜬 것처럼 보인다. 배경은 흰 면 그대로다 — scrolled 가 더하는 것은 그림자뿐이다. `SLayout` 안에 놓았으면 **주지 않는다** — 같은 열의 `SPage` 가 자기 스크롤 상태를 올려 자동으로 들어온다. 스크롤 컨테이너를 앱이 직접 쥔 단독 배치에서만 `onScroll` 에서 준다. |
|
|
16
16
|
|
|
17
17
|
#### Events
|
|
18
18
|
|
|
@@ -30,9 +30,16 @@
|
|
|
30
30
|
| `scrollEndSpacing?` | `boolean` | `false` | 스크롤 끝 여백. 마지막 항목이 창 하단에 붙어 "여기서 끝"이 안 읽히는 것을 막는다. **기본은 꺼져 있다.** 페이지 스크롤 자체가 예외이기 때문이다 — 대부분의 화면은 본문이 창을 꽉 채우고 스크롤은 각 영역 안에서 일어난다. 여백을 조건 없이 붙이면 내용이 화면에 거의 딱 맞는 페이지까지 그 여백 때문에 스크롤되게 만든다. 페이지가 실제로 스크롤되는 화면(`contentHeight="auto"` + 내용이 창보다 김)에서만 켠다. 페이지네이션처럼 끝을 알려주는 것이 이미 있으면 켜지 않는다. |
|
|
31
31
|
| `overlayScrollbar?` | `boolean` | `false` | true면 네이티브 스크롤바를 숨기고 SPage 위에 오버레이 스크롤바를 얹는다. 스크롤바가 레이아웃 폭을 차지하지 않아 내부 콘텐츠 폭이 줄어들지 않는다. |
|
|
32
32
|
| `contentHeight?` | `SPageContentHeight` | `'auto'` | 본문 높이 모드. 기본은 `auto` — 콘텐츠가 흐르고 넘치면 페이지가 스크롤한다. `fill` 은 본문이 남은 높이를 정확히 채우고 페이지는 스크롤하지 않는다. 표가 자기 안에서 스크롤하고 페이지네이션이 하단에 고정되는 목록 화면용이다. 본문 루트에 `h-full` 이 먹으므로 `<div className="flex h-full min-h-0 flex-col">` + `<STable className="min-h-0 flex-1" />` 구성이 성립한다. `fill` 에서는 페이지가 스크롤하지 않으므로 `scrollEndSpacing` 이 무시된다. |
|
|
33
|
+
| `contentWidth?` | `SPageContentWidth` | `'full'` | 본문 가로 폭 모드. 기본은 `full` — 창이 넓어지면 본문도 같이 넓어진다(반응형). `fixed`·`fixedCenter` 는 본문을 **레이아웃 최소 폭일 때의 폭**으로 고정한다. 최소 폭 기준으로 그린 시안이 넓은 모니터에서 늘어나 성기어지는 것을 막는 모드다. 남는 폭은 `fixed` 면 오른쪽에, `fixedCenter` 면 좌우로 나뉘어 페이지 배경으로 남는다. 고정 폭은 GNB 폭·접힘을 반영해 저절로 따라오므로 앱이 숫자를 쓸 일은 없다. 창이 최소 폭보다 좁아지면 세 모드가 모두 같다 — 남는 폭이 없어 규칙이 꺼지고, 모자란 몫을 지금까지처럼 이 영역이 가로 스크롤로 삼킨다. 같은 열에 `SPageHeader` 가 있으면 헤더도 같은 폭·정렬을 따른다(제목과 본문의 좌우 끝이 맞는다). `SLayout` 밖에서는 기준이 될 최소 폭이 없으므로 무시된다. |
|
|
33
34
|
|
|
34
35
|
## Types
|
|
35
36
|
|
|
37
|
+
### SPageHeaderVariant
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
export type SPageHeaderVariant = (typeof PAGE_HEADER_VARIANTS)[number];
|
|
41
|
+
```
|
|
42
|
+
|
|
36
43
|
### SPageBackground
|
|
37
44
|
|
|
38
45
|
```ts
|
|
@@ -45,6 +52,24 @@ export type SPageBackground = (typeof PAGE_BACKGROUNDS)[number];
|
|
|
45
52
|
export type SPageContentHeight = (typeof PAGE_CONTENT_HEIGHTS)[number];
|
|
46
53
|
```
|
|
47
54
|
|
|
55
|
+
### SPageContentWidth
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
export type SPageContentWidth = (typeof PAGE_CONTENT_WIDTHS)[number];
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### PAGE_HEADER_VARIANTS
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
/**
|
|
65
|
+
* 페이지 제목 영역의 모양 — 문서와 디자인이 부르는 이름을 그대로 쓴다.
|
|
66
|
+
* 기본값은 없다. 앱 전체에서 하나로 고정할 값이라 `SPageHeader` 가 매번 지정하게 한다.
|
|
67
|
+
* - plain: 최소 높이(상하 패딩 안에서 타이틀 한 줄), 구분선 없음, 서브 텍스트가 타이틀 아래
|
|
68
|
+
* - bar: 높이 고정 + 하단 구분선, 서브 텍스트가 타이틀과 같은 줄
|
|
69
|
+
*/
|
|
70
|
+
export const PAGE_HEADER_VARIANTS = ['plain', 'bar'] as const;
|
|
71
|
+
```
|
|
72
|
+
|
|
48
73
|
### PAGE_BACKGROUNDS
|
|
49
74
|
|
|
50
75
|
```ts
|
|
@@ -69,6 +94,20 @@ export const PAGE_BACKGROUNDS = ['frame', 'neutral', 'screen'] as const;
|
|
|
69
94
|
export const PAGE_CONTENT_HEIGHTS = ['auto', 'fill'] as const;
|
|
70
95
|
```
|
|
71
96
|
|
|
97
|
+
### PAGE_CONTENT_WIDTHS
|
|
98
|
+
|
|
99
|
+
```ts
|
|
100
|
+
/**
|
|
101
|
+
* 본문 가로 폭 모드 — 창이 레이아웃 최소 폭보다 **넓을 때** 본문이 어떻게 설지.
|
|
102
|
+
* - full: 남는 폭을 본문이 다 쓴다 (반응형)
|
|
103
|
+
* - fixed: 창이 최소 폭일 때의 본문 폭 그대로 고정하고 왼쪽에 붙인다
|
|
104
|
+
* - fixedCenter: 같은 폭으로 고정하고 가운데 놓는다
|
|
105
|
+
*
|
|
106
|
+
* 창이 최소 폭보다 좁아지면 세 모드가 모두 같다 — 모자란 몫은 SPage 가 가로 스크롤로 삼킨다.
|
|
107
|
+
*/
|
|
108
|
+
export const PAGE_CONTENT_WIDTHS = ['full', 'fixed', 'fixedCenter'] as const;
|
|
109
|
+
```
|
|
110
|
+
|
|
72
111
|
## Dependencies
|
|
73
112
|
|
|
74
113
|
### Used by
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type HTMLAttributes } from 'react';
|
|
2
|
-
import type { SPageBackground, SPageContentHeight } from './page.config';
|
|
2
|
+
import type { SPageBackground, SPageContentHeight, SPageContentWidth } from './page.config';
|
|
3
3
|
export interface SPageProps extends HTMLAttributes<HTMLElement> {
|
|
4
4
|
/**
|
|
5
5
|
* 페이지 배경 표면. frame=흰 콘텐츠 면, neutral=옅은 회색 면, screen=앱 바탕.
|
|
@@ -33,6 +33,21 @@ export interface SPageProps extends HTMLAttributes<HTMLElement> {
|
|
|
33
33
|
* `fill` 에서는 페이지가 스크롤하지 않으므로 `scrollEndSpacing` 이 무시된다.
|
|
34
34
|
*/
|
|
35
35
|
contentHeight?: SPageContentHeight;
|
|
36
|
+
/**
|
|
37
|
+
* 본문 가로 폭 모드. 기본은 `full` — 창이 넓어지면 본문도 같이 넓어진다(반응형).
|
|
38
|
+
*
|
|
39
|
+
* `fixed`·`fixedCenter` 는 본문을 **레이아웃 최소 폭일 때의 폭**으로 고정한다. 최소 폭 기준으로
|
|
40
|
+
* 그린 시안이 넓은 모니터에서 늘어나 성기어지는 것을 막는 모드다. 남는 폭은 `fixed` 면 오른쪽에,
|
|
41
|
+
* `fixedCenter` 면 좌우로 나뉘어 페이지 배경으로 남는다. 고정 폭은 GNB 폭·접힘을 반영해
|
|
42
|
+
* 저절로 따라오므로 앱이 숫자를 쓸 일은 없다.
|
|
43
|
+
*
|
|
44
|
+
* 창이 최소 폭보다 좁아지면 세 모드가 모두 같다 — 남는 폭이 없어 규칙이 꺼지고, 모자란 몫을
|
|
45
|
+
* 지금까지처럼 이 영역이 가로 스크롤로 삼킨다.
|
|
46
|
+
*
|
|
47
|
+
* 같은 열에 `SPageHeader` 가 있으면 헤더도 같은 폭·정렬을 따른다(제목과 본문의 좌우 끝이 맞는다).
|
|
48
|
+
* `SLayout` 밖에서는 기준이 될 최소 폭이 없으므로 무시된다.
|
|
49
|
+
*/
|
|
50
|
+
contentWidth?: SPageContentWidth;
|
|
36
51
|
}
|
|
37
52
|
/**
|
|
38
53
|
* SPage — SLayout 안에서 남은 공간을 채우는 스크롤 콘텐츠 영역.
|
|
@@ -1,21 +1,31 @@
|
|
|
1
1
|
import { type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
import type { SPageHeaderVariant } from './page.config';
|
|
2
3
|
export interface SPageHeaderProps extends Omit<HTMLAttributes<HTMLElement>, 'slot' | 'title'> {
|
|
3
4
|
/** 타이틀 (필수) */
|
|
4
5
|
title: string;
|
|
5
|
-
/** 서브 텍스트.
|
|
6
|
+
/** 서브 텍스트. `bar` 면 타이틀 오른쪽에, `plain` 이면 타이틀 아래에 놓인다. */
|
|
6
7
|
subText?: string;
|
|
7
8
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
9
|
+
* 제목 영역의 모양 — **필수다.**
|
|
10
|
+
*
|
|
11
|
+
* - `plain`: 최소 높이(상하 패딩 안에서 타이틀 한 줄 높이로 결정) + 구분선 없음,
|
|
12
|
+
* 서브 텍스트가 타이틀 아래로 내려간다.
|
|
13
|
+
* - `bar`: 높이 고정 + 하단 구분선, 서브 텍스트가 타이틀과 같은 줄.
|
|
14
|
+
*
|
|
15
|
+
* 기본값을 두지 않는 이유는 이 값이 **앱 전체에서 하나로 고정돼야 하는 값**이기 때문이다.
|
|
16
|
+
* 기본값이 있으면 안 준 페이지만 조용히 다른 모양이 되어, 메뉴를 옮길 때 제목 줄의 높이와
|
|
17
|
+
* 구분선이 페이지마다 튄다. 셸을 한 번 감싸 쓰면(§4-1 AppShell) 지정하는 자리도 한 곳이다.
|
|
18
|
+
*
|
|
19
|
+
* 배경은 두 베리에이션 모두 흰 면이다. `SLayout` 의 `header`(`'fix' | 'full'`)와는 다른 축이다 —
|
|
20
|
+
* 그쪽은 상단바가 GNB 컬럼 안에 있는지 화면 전폭인지를 정한다.
|
|
11
21
|
*/
|
|
12
|
-
|
|
22
|
+
variant: SPageHeaderVariant;
|
|
13
23
|
/** 뒤로가기 클릭 핸들러. 지정하면 왼쪽에 뒤로가기 버튼이 나타난다. */
|
|
14
24
|
onBack?: () => void;
|
|
15
25
|
/** 오른쪽 끝 커스텀 슬롯. 가이드 링크·액션 버튼 등 페이지마다 다른 것이 온다. */
|
|
16
26
|
slot?: ReactNode;
|
|
17
27
|
/**
|
|
18
|
-
* 아래 콘텐츠가 스크롤을 시작했는지.
|
|
28
|
+
* 아래 콘텐츠가 스크롤을 시작했는지. `plain` 일 때만 의미가 있다: 스크롤이 시작되면
|
|
19
29
|
* 그림자(floating)가 들어가 스크롤되는 콘텐츠 위에 뜬 것처럼 보인다. 배경은 흰 면 그대로다 —
|
|
20
30
|
* scrolled 가 더하는 것은 그림자뿐이다.
|
|
21
31
|
*
|
|
@@ -26,12 +36,13 @@ export interface SPageHeaderProps extends Omit<HTMLAttributes<HTMLElement>, 'slo
|
|
|
26
36
|
}
|
|
27
37
|
/**
|
|
28
38
|
* 페이지 타이틀 영역(pageHeader 포팅).
|
|
29
|
-
*
|
|
39
|
+
* `variant` 로 bar(높이 고정·하단 구분선) / plain(최소 높이) 두 베리에이션을 고른다 — 배경은 둘 다 흰 면이다.
|
|
30
40
|
* 뒤로가기 버튼은 onBack 유무로 나타나며, 없을 때는 타이틀 쪽에 4px 여백이 대신 들어간다.
|
|
31
41
|
*
|
|
32
42
|
* **셸 안에서는 `SLayout` 의 자식으로 `SGnb` 와 `SPage` 사이에 놓는다.** SLayout 이 이 헤더부터
|
|
33
43
|
* 뒤를 하나의 페이지 열로 묶어(page-column.tsx) 스크롤·페이지 패딩 밖 상단에 고정하고,
|
|
34
|
-
* plain 일 때 `SPage` 가 올린 스크롤 상태를 열이 대신 물려준다.
|
|
44
|
+
* plain 일 때 `SPage` 가 올린 스크롤 상태를 열이 대신 물려준다. 같은 경로로 `SPage` 의
|
|
45
|
+
* `contentWidth` 도 물려받아, 본문이 고정 폭이면 제목 줄도 같은 폭·정렬로 선다(면은 늘 전폭이다).
|
|
35
46
|
*
|
|
36
47
|
* 셸 밖에 직접 놓을 수도 있다 — 스크롤 컨테이너를 앱이 쥐고 있는 단독 화면이다. 그때는 그림자만
|
|
37
48
|
* 앱 몫이 된다: 스크롤 컨테이너의 `onScroll` 에서 `scrolled` 를 넣어야 뜬다.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { SPage, type SPageProps } from './SPage';
|
|
2
|
-
export { PAGE_BACKGROUNDS, type SPageBackground, PAGE_CONTENT_HEIGHTS, type SPageContentHeight, } from './page.config';
|
|
2
|
+
export { PAGE_BACKGROUNDS, type SPageBackground, PAGE_CONTENT_HEIGHTS, type SPageContentHeight, PAGE_CONTENT_WIDTHS, type SPageContentWidth, PAGE_HEADER_VARIANTS, type SPageHeaderVariant, } from './page.config';
|
|
3
3
|
export { SPageHeader, type SPageHeaderProps } from './SPageHeader';
|
|
@@ -1,15 +1,24 @@
|
|
|
1
1
|
import { type ReactNode } from 'react';
|
|
2
|
+
import type { SPageContentWidth } from './page.config';
|
|
2
3
|
/**
|
|
3
4
|
* 페이지 열이 `SPageHeader` 와 `SPage` 사이에서 중개하는 것.
|
|
4
5
|
*
|
|
5
|
-
* 둘은 형제라 서로를 볼 수 없는데, 헤더의 그림자는 페이지의
|
|
6
|
-
* 열이 그 사이에 서서 값을 옮긴다 —
|
|
6
|
+
* 둘은 형제라 서로를 볼 수 없는데, 헤더의 그림자는 페이지의 스크롤에서, 헤더의 가로 정렬은
|
|
7
|
+
* 페이지의 폭 모드에서 나온다. 열이 그 사이에 서서 값을 옮긴다 —
|
|
8
|
+
* 아래(SPage)가 올리고 위(SPageHeader)가 읽는다.
|
|
7
9
|
*/
|
|
8
10
|
export interface SPageColumnValue {
|
|
9
11
|
/** 페이지가 스크롤을 시작했는지. `SPage` 가 올리고 `SPageHeader` 가 그림자로 쓴다. */
|
|
10
12
|
scrolled: boolean;
|
|
11
13
|
/** `SPage` 가 자기 스크롤 상태를 올린다. */
|
|
12
14
|
setScrolled: (scrolled: boolean) => void;
|
|
15
|
+
/**
|
|
16
|
+
* 페이지 본문의 가로 폭 모드. `SPage` 가 올리고 `SPageHeader` 가 자기 내용물을 같은 폭·정렬로 맞춘다.
|
|
17
|
+
* 헤더는 페이지 위에 서는 같은 열의 일부라, 본문만 가운데로 가면 제목과 본문 좌우 끝이 어긋난다.
|
|
18
|
+
*/
|
|
19
|
+
contentWidth: SPageContentWidth;
|
|
20
|
+
/** `SPage` 가 자기 폭 모드를 올린다. */
|
|
21
|
+
setContentWidth: (contentWidth: SPageContentWidth) => void;
|
|
13
22
|
}
|
|
14
23
|
export declare const SPageColumnContext: import("react").Context<SPageColumnValue | null>;
|
|
15
24
|
/**
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { CSSProperties } from 'react';
|
|
2
|
+
import type { SPageContentWidth } from './page.config';
|
|
3
|
+
/**
|
|
4
|
+
* 콘텐츠 상자의 최소 폭 — SLayout 이 보장하는 레이아웃 최소 폭을 이 상자가 대신 삼킨다.
|
|
5
|
+
*
|
|
6
|
+
* `100cqw` 는 SLayout 프레임의 폭, `100%` 는 이 상자를 담은 영역의 콘텐츠 폭이다.
|
|
7
|
+
* "프레임이 최소 폭보다 좁은 만큼" 콘텐츠를 넓히므로, GNB 폭·접힘·header 구성이 어떻든
|
|
8
|
+
* [GNB + 스크롤 끝까지 민 페이지] 합이 정확히 최소 폭이 된다. 패딩을 덮어써도 100% 가 따라온다.
|
|
9
|
+
*
|
|
10
|
+
* SLayout 밖이면 변수가 없어(폴백 0) 값이 음수가 되고, 음수 min-width 는 0 으로 클램프돼 규칙이 꺼진다.
|
|
11
|
+
*/
|
|
12
|
+
export declare const MIN_CONTENT_WIDTH = "calc(var(--s-layout-min-width, 0px) - 100cqw + 100%)";
|
|
13
|
+
/**
|
|
14
|
+
* 고정 폭 모드가 남는 폭을 어디로 미는지 — 폭을 직접 주지 않고 여백으로 민다.
|
|
15
|
+
* 그래서 남는 폭이 0 인 구간(창이 최소 폭 이하)에서는 아무 일도 하지 않고,
|
|
16
|
+
* 넓어진 만큼만 상자가 "최소 폭일 때의 폭"으로 되돌아간다.
|
|
17
|
+
*
|
|
18
|
+
* `full` 은 아무것도 하지 않는다 — 남는 폭을 본문이 그대로 쓴다.
|
|
19
|
+
*
|
|
20
|
+
* **SLayout 밖에서는 호출하지 않는다.** 최소 폭 변수가 없으면 남는 폭이 프레임 폭 전체가 되어
|
|
21
|
+
* 본문이 사라진다. 호출하는 쪽이 SLayout 안임을 확인하고 부른다.
|
|
22
|
+
*/
|
|
23
|
+
export declare const contentWidthStyle: (mode: SPageContentWidth) => CSSProperties | undefined;
|
|
@@ -14,3 +14,21 @@ export type SPageBackground = (typeof PAGE_BACKGROUNDS)[number];
|
|
|
14
14
|
*/
|
|
15
15
|
export declare const PAGE_CONTENT_HEIGHTS: readonly ["auto", "fill"];
|
|
16
16
|
export type SPageContentHeight = (typeof PAGE_CONTENT_HEIGHTS)[number];
|
|
17
|
+
/**
|
|
18
|
+
* 본문 가로 폭 모드 — 창이 레이아웃 최소 폭보다 **넓을 때** 본문이 어떻게 설지.
|
|
19
|
+
* - full: 남는 폭을 본문이 다 쓴다 (반응형)
|
|
20
|
+
* - fixed: 창이 최소 폭일 때의 본문 폭 그대로 고정하고 왼쪽에 붙인다
|
|
21
|
+
* - fixedCenter: 같은 폭으로 고정하고 가운데 놓는다
|
|
22
|
+
*
|
|
23
|
+
* 창이 최소 폭보다 좁아지면 세 모드가 모두 같다 — 모자란 몫은 SPage 가 가로 스크롤로 삼킨다.
|
|
24
|
+
*/
|
|
25
|
+
export declare const PAGE_CONTENT_WIDTHS: readonly ["full", "fixed", "fixedCenter"];
|
|
26
|
+
export type SPageContentWidth = (typeof PAGE_CONTENT_WIDTHS)[number];
|
|
27
|
+
/**
|
|
28
|
+
* 페이지 제목 영역의 모양 — 문서와 디자인이 부르는 이름을 그대로 쓴다.
|
|
29
|
+
* 기본값은 없다. 앱 전체에서 하나로 고정할 값이라 `SPageHeader` 가 매번 지정하게 한다.
|
|
30
|
+
* - plain: 최소 높이(상하 패딩 안에서 타이틀 한 줄), 구분선 없음, 서브 텍스트가 타이틀 아래
|
|
31
|
+
* - bar: 높이 고정 + 하단 구분선, 서브 텍스트가 타이틀과 같은 줄
|
|
32
|
+
*/
|
|
33
|
+
export declare const PAGE_HEADER_VARIANTS: readonly ["plain", "bar"];
|
|
34
|
+
export type SPageHeaderVariant = (typeof PAGE_HEADER_VARIANTS)[number];
|
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
|------|------|---------|-------------|
|
|
11
11
|
| `popupTitle?` | `string` | `''` | 헤더 제목 |
|
|
12
12
|
| `type?` | `SPopupType` | `'default'` | 타입 (헤더 색상) |
|
|
13
|
-
| `
|
|
13
|
+
| `showFooter?` | `boolean` | `false` | 하단 footer 표시 여부 |
|
|
14
14
|
| `submitButton?` | `SPopupSubmitButton` | — | 확인 버튼 설정 |
|
|
15
15
|
| `footerLeft?` | `ReactNode` | — | footer 좌측 영역 |
|
|
16
|
-
| `
|
|
16
|
+
| `padding?` | `SPopupBodyPadding` | `'default'` | 본문 안쪽 여백. 기본은 `default` — 표를 가장자리까지 채우는 등 본문이 여백을 직접 다룰 때만 `none`. (`SList` 의 `padding` 과 같은 이름이지만 기본값이 반대다 — 각 면의 성격이 다르다) |
|
|
17
17
|
| `children?` | `ReactNode` | — | 본문 |
|
|
18
18
|
| `className?` | `string` | — | |
|
|
19
19
|
| `style?` | `CSSProperties` | — | |
|
|
@@ -43,6 +43,12 @@ export interface SPopupSubmitButton {
|
|
|
43
43
|
}
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
+
### SPopupBodyPadding
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
export type SPopupBodyPadding = 'default' | 'none';
|
|
50
|
+
```
|
|
51
|
+
|
|
46
52
|
## Dependencies
|
|
47
53
|
|
|
48
54
|
### Depends on
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type ReactNode, type CSSProperties } from 'react';
|
|
2
2
|
import { type SButtonColor, type SButtonSize } from '../SButton';
|
|
3
3
|
export type SPopupType = 'default' | 'light';
|
|
4
|
+
export type SPopupBodyPadding = 'default' | 'none';
|
|
4
5
|
export interface SPopupSubmitButton {
|
|
5
6
|
label?: string;
|
|
6
7
|
color?: SButtonColor;
|
|
@@ -13,15 +14,18 @@ export interface SPopupProps {
|
|
|
13
14
|
/** 타입 (헤더 색상) */
|
|
14
15
|
type?: SPopupType;
|
|
15
16
|
/** 하단 footer 표시 여부 */
|
|
16
|
-
|
|
17
|
+
showFooter?: boolean;
|
|
17
18
|
/** 확인 버튼 설정 */
|
|
18
19
|
submitButton?: SPopupSubmitButton;
|
|
19
20
|
/** 확인 버튼 클릭 (sdSubmit) */
|
|
20
21
|
onSubmit?: () => void;
|
|
21
22
|
/** footer 좌측 영역 */
|
|
22
23
|
footerLeft?: ReactNode;
|
|
23
|
-
/**
|
|
24
|
-
|
|
24
|
+
/**
|
|
25
|
+
* 본문 안쪽 여백. 기본은 `default` — 표를 가장자리까지 채우는 등 본문이 여백을 직접
|
|
26
|
+
* 다룰 때만 `none`. (`SList` 의 `padding` 과 같은 이름이지만 기본값이 반대다 — 각 면의 성격이 다르다)
|
|
27
|
+
*/
|
|
28
|
+
padding?: SPopupBodyPadding;
|
|
25
29
|
/** 본문 */
|
|
26
30
|
children?: ReactNode;
|
|
27
31
|
className?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { SPopup, type SPopupProps, type SPopupType, type SPopupSubmitButton } from './SPopup';
|
|
1
|
+
export { SPopup, type SPopupBodyPadding, type SPopupProps, type SPopupType, type SPopupSubmitButton, } from './SPopup';
|