sellmate-design-system-react 8.1.0 → 9.0.0-beta.10
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 +279 -124
- package/README.md +101 -8
- package/dist/components/SChipFilter/README.md +70 -0
- package/dist/components/SChipFilter/SChipFilter.d.ts +167 -0
- package/dist/components/SChipFilter/index.d.ts +1 -0
- package/dist/components/SCircleProgress/README.md +3 -0
- package/dist/components/SCircleProgress/SCircleProgress.d.ts +7 -1
- package/dist/components/SDatePicker/README.md +43 -3
- package/dist/components/SDatePicker/SDatePicker.d.ts +36 -3
- package/dist/components/SDatePicker/index.d.ts +1 -1
- package/dist/components/SDateRangePicker/README.md +21 -0
- package/dist/components/SDateRangePicker/SDateRangePicker.d.ts +16 -0
- package/dist/components/SDateRangePicker/index.d.ts +1 -1
- package/dist/components/SField/README.md +3 -0
- package/dist/components/SField/SField.d.ts +12 -0
- package/dist/components/SGhostButton/README.md +6 -0
- package/dist/components/SGnb/gnb.config.d.ts +2 -0
- package/dist/components/SGuide/README.md +1 -1
- package/dist/components/SGuide/SGuide.d.ts +1 -1
- package/dist/components/SIcon/README.md +6 -0
- package/dist/components/SIcon/icons.gen.d.ts +1 -0
- package/dist/components/SImage/README.md +44 -0
- package/dist/components/SImage/SImage.d.ts +41 -0
- package/dist/components/SImage/index.d.ts +1 -0
- package/dist/components/SKeyValueTable/README.md +1 -0
- package/dist/components/SKeyValueTable/SKeyValueTable.d.ts +8 -1
- package/dist/components/SListItem/README.md +2 -2
- package/dist/components/SListItem/SListItem.d.ts +2 -2
- package/dist/components/SPage/README.md +23 -0
- package/dist/components/SPage/SPage.d.ts +27 -1
- package/dist/components/SPage/SPageHeader.d.ts +32 -0
- package/dist/components/SPage/index.d.ts +2 -1
- package/dist/components/SPage/page.config.d.ts +8 -0
- package/dist/components/SPortal/README.md +1 -1
- package/dist/components/SPortal/SPortal.d.ts +7 -1
- package/dist/components/SRadio/README.md +2 -0
- package/dist/components/SRadioButton/README.md +13 -0
- package/dist/components/SSearchInput/README.md +48 -0
- package/dist/components/SSearchInput/SSearchInput.d.ts +46 -0
- package/dist/components/SSearchInput/index.d.ts +1 -0
- package/dist/components/SSectionHeaderCard/README.md +10 -23
- package/dist/components/SSectionHeaderCard/SSectionHeaderCard.d.ts +21 -14
- package/dist/components/SSectionHeaderCard/index.d.ts +1 -1
- package/dist/components/SSelect/README.md +4 -2
- package/dist/components/SSelect/SSelect.d.ts +2 -2
- package/dist/components/STable/README.md +1 -0
- package/dist/components/STable/STable.d.ts +20 -0
- package/dist/components/STabs/README.md +0 -1
- package/dist/components/STabs/STabs.d.ts +2 -4
- 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 +2 -0
- package/dist/components/STextLink/README.md +2 -0
- package/dist/components/STimePicker/timepicker.config.d.ts +5 -0
- package/dist/components/SToggle/README.md +1 -0
- package/dist/components/SToggle/SToggle.d.ts +4 -1
- package/dist/components/STooltip/README.md +2 -0
- package/dist/components/STree/README.md +3 -0
- package/dist/components/STree/STree.d.ts +8 -0
- package/dist/components/STree/index.d.ts +1 -1
- package/dist/index.cjs +2988 -393
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +2981 -394
- package/dist/index.js.map +1 -1
- package/dist/lib/floating-width.d.ts +22 -0
- package/dist/lib/truncated-value-tooltip.d.ts +18 -0
- package/dist/llms-full.txt +545 -152
- package/dist/llms.txt +283 -127
- package/dist/styles.css +397 -36
- package/dist/theme.css +34 -11
- package/eslint/index.mjs +5 -0
- package/eslint/rules/field-width-grade.d.mts +41 -0
- package/eslint/rules/field-width-grade.mjs +294 -0
- package/eslint/scale.gen.mjs +1 -1
- package/package.json +7 -4
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
| `readOnly?` | `boolean` | `false` | 읽기 전용 (회색 배경) |
|
|
31
31
|
| `width?` | `number \| string` | — | 컨트롤 너비 (숫자=px). 지정하면 필드가 부모 폭을 다 먹지 않고 (레이블 + width) 만큼만 차지한다. 다른 요소와 나란히 놓으려면 부모를 flex 로 두면 된다. |
|
|
32
32
|
| `minWidth?` | `number \| string` | — | 컨트롤 최소 너비 (숫자=px). 하한선만 지정하며 필드는 계속 부모 폭을 채운다 |
|
|
33
|
+
| `maxWidth?` | `number \| string` | — | 컨트롤 최대 너비 (숫자=px). 상한선만 지정하며 필드는 그 아래에서 부모 폭을 채운다. `width` 와 달리 hug 로 전환하지 않는다 — 부모가 좁으면 같이 좁아지고, 넓어도 여기서 멈춘다. 값 길이가 정해진 컨트롤(날짜·시간)이 `width="100%"` 를 받아 행 전체로 늘어나는 것을 막는 데 쓴다. **라벨은 상한에 들어가지 않는다** — 라벨은 컨트롤의 형제라 이 상한 밖이다. `addonLabel` 은 테두리 박스 안이라 상한을 나눠 먹으므로, `labelWidth`(= addon 폭)만큼 상한을 자동으로 늘린다. addon 이 있는데 `labelWidth` 가 없으면 폭을 알 수 없어 상한을 걸지 않는다 — 컨트롤이 잘리는 것보다 넓은 편이 낫다. |
|
|
33
34
|
| `multiline?` | `boolean` | `false` | 멀티라인(textarea) — 컨트롤 높이를 고정하지 않고 min-height만 적용 |
|
|
34
35
|
| `borderless?` | `boolean` | `false` | 테두리 박스 제거 (inline 컨트롤용) — border/배경/hover·focus 강조만 사라지고 label·hint·errorMessage 등 나머지 필드 구성은 그대로 동작한다. |
|
|
35
36
|
| `children?` | `ReactNode` | — | 실제 컨트롤 (input/select 등) — 테두리 없이 렌더, 테두리는 SField가 제공 |
|
|
@@ -60,6 +61,7 @@
|
|
|
60
61
|
- [SFilePicker](../SFilePicker)
|
|
61
62
|
- [SInput](../SInput)
|
|
62
63
|
- [SNumberInput](../SNumberInput)
|
|
64
|
+
- [SSearchInput](../SSearchInput)
|
|
63
65
|
- [SSelect](../SSelect)
|
|
64
66
|
- [STextarea](../STextarea)
|
|
65
67
|
- [STimePicker](../STimePicker)
|
|
@@ -83,6 +85,7 @@ graph TD;
|
|
|
83
85
|
SFilePicker --> SField
|
|
84
86
|
SInput --> SField
|
|
85
87
|
SNumberInput --> SField
|
|
88
|
+
SSearchInput --> SField
|
|
86
89
|
SSelect --> SField
|
|
87
90
|
STextarea --> SField
|
|
88
91
|
STimePicker --> SField
|
|
@@ -63,6 +63,18 @@ export interface SFieldProps {
|
|
|
63
63
|
width?: number | string;
|
|
64
64
|
/** 컨트롤 최소 너비 (숫자=px). 하한선만 지정하며 필드는 계속 부모 폭을 채운다 */
|
|
65
65
|
minWidth?: number | string;
|
|
66
|
+
/**
|
|
67
|
+
* 컨트롤 최대 너비 (숫자=px). 상한선만 지정하며 필드는 그 아래에서 부모 폭을 채운다.
|
|
68
|
+
*
|
|
69
|
+
* `width` 와 달리 hug 로 전환하지 않는다 — 부모가 좁으면 같이 좁아지고, 넓어도 여기서 멈춘다.
|
|
70
|
+
* 값 길이가 정해진 컨트롤(날짜·시간)이 `width="100%"` 를 받아 행 전체로 늘어나는 것을 막는 데 쓴다.
|
|
71
|
+
*
|
|
72
|
+
* **라벨은 상한에 들어가지 않는다** — 라벨은 컨트롤의 형제라 이 상한 밖이다.
|
|
73
|
+
* `addonLabel` 은 테두리 박스 안이라 상한을 나눠 먹으므로, `labelWidth`(= addon 폭)만큼
|
|
74
|
+
* 상한을 자동으로 늘린다. addon 이 있는데 `labelWidth` 가 없으면 폭을 알 수 없어 상한을
|
|
75
|
+
* 걸지 않는다 — 컨트롤이 잘리는 것보다 넓은 편이 낫다.
|
|
76
|
+
*/
|
|
77
|
+
maxWidth?: number | string;
|
|
66
78
|
/** 멀티라인(textarea) — 컨트롤 높이를 고정하지 않고 min-height만 적용 */
|
|
67
79
|
multiline?: boolean;
|
|
68
80
|
/**
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
- [SBarcodeInput](../SBarcodeInput)
|
|
35
35
|
- [SCalendar](../SCalendar)
|
|
36
36
|
- [SChip](../SChip)
|
|
37
|
+
- [SChipFilter](../SChipFilter)
|
|
37
38
|
- [SDateRangePicker](../SDateRangePicker)
|
|
38
39
|
- [SFilePicker](../SFilePicker)
|
|
39
40
|
- [SGnb](../SGnb)
|
|
@@ -41,7 +42,9 @@
|
|
|
41
42
|
- [SInput](../SInput)
|
|
42
43
|
- [SModalContainer](../SModalContainer)
|
|
43
44
|
- [SOverlayHeader](../SOverlayHeader)
|
|
45
|
+
- [SPage](../SPage)
|
|
44
46
|
- [SPopover](../SPopover)
|
|
47
|
+
- [SSearchInput](../SSearchInput)
|
|
45
48
|
- [SSelect](../SSelect)
|
|
46
49
|
- [STimePicker](../STimePicker)
|
|
47
50
|
- [STimeRangePicker](../STimeRangePicker)
|
|
@@ -63,6 +66,7 @@ graph TD;
|
|
|
63
66
|
SBarcodeInput --> SGhostButton
|
|
64
67
|
SCalendar --> SGhostButton
|
|
65
68
|
SChip --> SGhostButton
|
|
69
|
+
SChipFilter --> SGhostButton
|
|
66
70
|
SDateRangePicker --> SGhostButton
|
|
67
71
|
SFilePicker --> SGhostButton
|
|
68
72
|
SGnb --> SGhostButton
|
|
@@ -70,7 +74,9 @@ graph TD;
|
|
|
70
74
|
SInput --> SGhostButton
|
|
71
75
|
SModalContainer --> SGhostButton
|
|
72
76
|
SOverlayHeader --> SGhostButton
|
|
77
|
+
SPage --> SGhostButton
|
|
73
78
|
SPopover --> SGhostButton
|
|
79
|
+
SSearchInput --> SGhostButton
|
|
74
80
|
SSelect --> SGhostButton
|
|
75
81
|
STimePicker --> SGhostButton
|
|
76
82
|
STimeRangePicker --> SGhostButton
|
|
@@ -48,6 +48,8 @@ export declare const GNB_MENU: Record<SGnbType, {
|
|
|
48
48
|
depth1FontWeight: number;
|
|
49
49
|
itemFontSize: number;
|
|
50
50
|
itemLineHeight: number;
|
|
51
|
+
itemFontWeight: number;
|
|
52
|
+
itemFontWeightSelected: number;
|
|
51
53
|
}>;
|
|
52
54
|
/**
|
|
53
55
|
* 색상(color 축). light → --cmp-gnb-light-* 색, dark → --cmp-gnb-dark-* 색
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
| `message?` | `SGuideMessage` | `''` | 팝업 메시지 (배열이면 리스트, 중첩 배열이면 depth 표현) |
|
|
14
14
|
| `url?` | `string` | `''` | notion 타입 클릭 시 이동 URL |
|
|
15
15
|
| `popupTitle?` | `string` | `''` | 팝업 제목 (없으면 type 기본값) |
|
|
16
|
-
| `popupWidth?` | `number` | — | 팝업 너비 (px, 기본 426) |
|
|
16
|
+
| `popupWidth?` | `number` | — | 팝업 너비 (px, 기본 426). 창보다 넓게 줘도 창 폭까지만 벌어진다. |
|
|
17
17
|
| `className?` | `string` | — | |
|
|
18
18
|
| `style?` | `CSSProperties` | — | |
|
|
19
19
|
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
- [SButton](../SButton)
|
|
24
24
|
- [SCallout](../SCallout)
|
|
25
25
|
- [SCheckbox](../SCheckbox)
|
|
26
|
+
- [SChipFilter](../SChipFilter)
|
|
26
27
|
- [SChipInput](../SChipInput)
|
|
27
28
|
- [SConfirmModal](../SConfirmModal)
|
|
28
29
|
- [SDatePicker](../SDatePicker)
|
|
@@ -35,12 +36,14 @@
|
|
|
35
36
|
- [SGhostButton](../SGhostButton)
|
|
36
37
|
- [SGnb](../SGnb)
|
|
37
38
|
- [SGuide](../SGuide)
|
|
39
|
+
- [SImage](../SImage)
|
|
38
40
|
- [SKeyValueTable](../SKeyValueTable)
|
|
39
41
|
- [SListItem](../SListItem)
|
|
40
42
|
- [SLoadingModal](../SLoadingModal)
|
|
41
43
|
- [SNumberInput](../SNumberInput)
|
|
42
44
|
- [SPagination](../SPagination)
|
|
43
45
|
- [SPopover](../SPopover)
|
|
46
|
+
- [SSearchInput](../SSearchInput)
|
|
44
47
|
- [SSectionHeaderCard](../SSectionHeaderCard)
|
|
45
48
|
- [SSelect](../SSelect)
|
|
46
49
|
- [SStepper](../SStepper)
|
|
@@ -59,6 +62,7 @@ graph TD;
|
|
|
59
62
|
SButton --> SIcon
|
|
60
63
|
SCallout --> SIcon
|
|
61
64
|
SCheckbox --> SIcon
|
|
65
|
+
SChipFilter --> SIcon
|
|
62
66
|
SChipInput --> SIcon
|
|
63
67
|
SConfirmModal --> SIcon
|
|
64
68
|
SDatePicker --> SIcon
|
|
@@ -71,12 +75,14 @@ graph TD;
|
|
|
71
75
|
SGhostButton --> SIcon
|
|
72
76
|
SGnb --> SIcon
|
|
73
77
|
SGuide --> SIcon
|
|
78
|
+
SImage --> SIcon
|
|
74
79
|
SKeyValueTable --> SIcon
|
|
75
80
|
SListItem --> SIcon
|
|
76
81
|
SLoadingModal --> SIcon
|
|
77
82
|
SNumberInput --> SIcon
|
|
78
83
|
SPagination --> SIcon
|
|
79
84
|
SPopover --> SIcon
|
|
85
|
+
SSearchInput --> SIcon
|
|
80
86
|
SSectionHeaderCard --> SIcon
|
|
81
87
|
SSelect --> SIcon
|
|
82
88
|
SStepper --> SIcon
|
|
@@ -83,6 +83,7 @@ export declare const ICONS: {
|
|
|
83
83
|
readonly settingOutline: (p: IconRenderProps) => import("react").JSX.Element;
|
|
84
84
|
readonly shield: (p: IconRenderProps) => import("react").JSX.Element;
|
|
85
85
|
readonly sidebar: (p: IconRenderProps) => import("react").JSX.Element;
|
|
86
|
+
readonly star: (p: IconRenderProps) => import("react").JSX.Element;
|
|
86
87
|
readonly store: (p: IconRenderProps) => import("react").JSX.Element;
|
|
87
88
|
readonly synchronize: (p: IconRenderProps) => import("react").JSX.Element;
|
|
88
89
|
readonly thumbsDown: (p: IconRenderProps) => import("react").JSX.Element;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# SImage
|
|
2
|
+
|
|
3
|
+
> 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
|
|
4
|
+
|
|
5
|
+
### SImage
|
|
6
|
+
|
|
7
|
+
#### Props
|
|
8
|
+
|
|
9
|
+
| Prop | Type | Default | Description |
|
|
10
|
+
|------|------|---------|-------------|
|
|
11
|
+
| `src?` | `string` | — | 이미지 경로. 없으면 빈 이미지 아이콘이 나온다 |
|
|
12
|
+
| `alt?` | `string` | `''` | 대체 텍스트 |
|
|
13
|
+
| `ratio?` | `number` | `1` | 가로세로 비율. 소비자가 높이를 직접 주면 그쪽이 이긴다 |
|
|
14
|
+
| `fit?` | `SImageFit` | `'cover'` | 이미지가 상자를 채우는 방식 (object-fit) |
|
|
15
|
+
| `position?` | `string` | `'50% 50%'` | 이미지 정렬 위치 (object-position) |
|
|
16
|
+
| `loading?` | `'lazy' \| 'eager'` | `'lazy'` | 브라우저 로딩 방식 |
|
|
17
|
+
| `loadingShowDelay?` | `number` | `0` | 스피너를 띄우기까지 기다리는 시간(ms). 이 시간 안에 로드되면 스피너를 아예 그리지 않는다 — 캐시된 이미지에서 스피너가 한 프레임 번쩍이는 것을 막는다. |
|
|
18
|
+
| `noSpinner?` | `boolean` | `false` | 로딩 중에도 스피너를 그리지 않는다 |
|
|
19
|
+
| `loadingSlot?` | `ReactNode` | — | 로딩 중 표시를 직접 지정한다 (기본: 스피너) |
|
|
20
|
+
| `errorSlot?` | `ReactNode` | — | 실패·빈 상태 표시를 직접 지정한다 (기본: 빈 이미지 아이콘) |
|
|
21
|
+
| `imgProps?` | `ImgHTMLAttributes<HTMLImageElement>` | — | 안쪽 `<img>` 로 넘길 네이티브 속성 (srcSet · sizes · crossOrigin · draggable 등) |
|
|
22
|
+
|
|
23
|
+
#### Events
|
|
24
|
+
|
|
25
|
+
| Event | Type | Description |
|
|
26
|
+
|-------|------|-------------|
|
|
27
|
+
| `onLoad` | `(src: string) => void` | 로드 완료. 로드된 src 를 넘긴다 |
|
|
28
|
+
| `onError` | `(event: SyntheticEvent<HTMLImageElement>) => void` | 로드 실패 |
|
|
29
|
+
|
|
30
|
+
## Dependencies
|
|
31
|
+
|
|
32
|
+
### Depends on
|
|
33
|
+
|
|
34
|
+
- [SCircleProgress](../SCircleProgress)
|
|
35
|
+
- [SIcon](../SIcon)
|
|
36
|
+
|
|
37
|
+
### Graph
|
|
38
|
+
|
|
39
|
+
```mermaid
|
|
40
|
+
graph TD;
|
|
41
|
+
SImage --> SCircleProgress
|
|
42
|
+
SImage --> SIcon
|
|
43
|
+
style SImage fill:#f9f,stroke:#333,stroke-width:4px
|
|
44
|
+
```
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type HTMLAttributes, type ImgHTMLAttributes, type ReactNode, type SyntheticEvent } from 'react';
|
|
2
|
+
export declare const IMAGE_FITS: readonly ["cover", "contain", "fill", "none", "scale-down"];
|
|
3
|
+
export type SImageFit = (typeof IMAGE_FITS)[number];
|
|
4
|
+
export interface SImageProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onLoad' | 'onError'> {
|
|
5
|
+
/** 이미지 경로. 없으면 빈 이미지 아이콘이 나온다 */
|
|
6
|
+
src?: string;
|
|
7
|
+
/** 대체 텍스트 */
|
|
8
|
+
alt?: string;
|
|
9
|
+
/** 가로세로 비율. 소비자가 높이를 직접 주면 그쪽이 이긴다 */
|
|
10
|
+
ratio?: number;
|
|
11
|
+
/** 이미지가 상자를 채우는 방식 (object-fit) */
|
|
12
|
+
fit?: SImageFit;
|
|
13
|
+
/** 이미지 정렬 위치 (object-position) */
|
|
14
|
+
position?: string;
|
|
15
|
+
/** 브라우저 로딩 방식 */
|
|
16
|
+
loading?: 'lazy' | 'eager';
|
|
17
|
+
/**
|
|
18
|
+
* 스피너를 띄우기까지 기다리는 시간(ms). 이 시간 안에 로드되면 스피너를 아예 그리지 않는다 —
|
|
19
|
+
* 캐시된 이미지에서 스피너가 한 프레임 번쩍이는 것을 막는다.
|
|
20
|
+
*/
|
|
21
|
+
loadingShowDelay?: number;
|
|
22
|
+
/** 로딩 중에도 스피너를 그리지 않는다 */
|
|
23
|
+
noSpinner?: boolean;
|
|
24
|
+
/** 로딩 중 표시를 직접 지정한다 (기본: 스피너) */
|
|
25
|
+
loadingSlot?: ReactNode;
|
|
26
|
+
/** 실패·빈 상태 표시를 직접 지정한다 (기본: 빈 이미지 아이콘) */
|
|
27
|
+
errorSlot?: ReactNode;
|
|
28
|
+
/** 안쪽 `<img>` 로 넘길 네이티브 속성 (srcSet · sizes · crossOrigin · draggable 등) */
|
|
29
|
+
imgProps?: ImgHTMLAttributes<HTMLImageElement>;
|
|
30
|
+
/** 로드 완료. 로드된 src 를 넘긴다 */
|
|
31
|
+
onLoad?: (src: string) => void;
|
|
32
|
+
/** 로드 실패 */
|
|
33
|
+
onError?: (event: SyntheticEvent<HTMLImageElement>) => void;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* SImage — 이미지 로딩·실패 상태를 스스로 표현하는 이미지 상자.
|
|
37
|
+
*
|
|
38
|
+
* 로딩 중에는 스피너, `src` 가 없거나 로드에 실패하면 빈 이미지 아이콘을 컨테이너 높이에
|
|
39
|
+
* 비례한 크기로 가운데에 그린다.
|
|
40
|
+
*/
|
|
41
|
+
export declare const SImage: import("react").ForwardRefExoticComponent<SImageProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SImage, IMAGE_FITS, type SImageProps, type SImageFit } from './SImage';
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
| `values?` | `Record<string, unknown>` | `{}` | field name을 key로 하는 값 객체 (`{ [name]: value }`). 지정 시 해당 field의 값으로 사용되며, field별 `options.value`보다 우선합니다. `onChange`의 `detail.values`와 함께 controlled 패턴으로 사용합니다. |
|
|
13
13
|
| `search?` | `boolean` | `false` | 우측 검색 패널 |
|
|
14
14
|
| `radius?` | `'default' \| 'useTop' \| 'full'` | `'default'` | border-radius 제어 |
|
|
15
|
+
| `bordered?` | `boolean` | `true` | 바깥 테두리. 기본은 `true`. `SSectionHeaderCard` 의 `padding="none"` 안에 넣어 카드 가장자리까지 채울 때 `false` 로 끈다 — 카드가 이미 바깥 테두리를 그리므로, 켜 두면 1px 두 개가 나란히 놓여 그 변만 2px 로 보인다. |
|
|
15
16
|
| `className?` | `string` | — | |
|
|
16
17
|
| `style?` | `CSSProperties` | — | |
|
|
17
18
|
|
|
@@ -104,6 +104,13 @@ export interface SKeyValueTableProps {
|
|
|
104
104
|
search?: boolean;
|
|
105
105
|
/** border-radius 제어 */
|
|
106
106
|
radius?: 'default' | 'useTop' | 'full';
|
|
107
|
+
/**
|
|
108
|
+
* 바깥 테두리. 기본은 `true`.
|
|
109
|
+
*
|
|
110
|
+
* `SSectionHeaderCard` 의 `padding="none"` 안에 넣어 카드 가장자리까지 채울 때 `false` 로 끈다 —
|
|
111
|
+
* 카드가 이미 바깥 테두리를 그리므로, 켜 두면 1px 두 개가 나란히 놓여 그 변만 2px 로 보인다.
|
|
112
|
+
*/
|
|
113
|
+
bordered?: boolean;
|
|
107
114
|
/** 값 변경 (sdChange) */
|
|
108
115
|
onChange?: (detail: SKeyValueChangeDetail) => void;
|
|
109
116
|
/** 검색 클릭 (sdSearch) */
|
|
@@ -112,5 +119,5 @@ export interface SKeyValueTableProps {
|
|
|
112
119
|
style?: CSSProperties;
|
|
113
120
|
}
|
|
114
121
|
/** SKeyValueTable — sd-key-value-table 포팅. th/td 폼 레이아웃 + 필드 렌더러. */
|
|
115
|
-
export declare function SKeyValueTable({ fields, values, search, radius, onChange, onSearch, className, style, }: SKeyValueTableProps): import("react").JSX.Element | null;
|
|
122
|
+
export declare function SKeyValueTable({ fields, values, search, radius, bordered, onChange, onSearch, className, style, }: SKeyValueTableProps): import("react").JSX.Element | null;
|
|
116
123
|
export {};
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
| `leading?` | `SListItemSlot` | — | 타이틀 앞에 표시할 아이콘/콘텐츠 |
|
|
16
16
|
| `trailing?` | `SListItemSlot` | — | 타이틀 뒤에 표시할 태그/콘텐츠 |
|
|
17
17
|
| `bordered?` | `boolean` | `false` | 외곽 테두리 사용 여부 |
|
|
18
|
-
| `selected?` | `boolean` | `false` | 선택 상태
|
|
19
|
-
| `clickable?` | `boolean` | `
|
|
18
|
+
| `selected?` | `boolean` | `false` | 선택 상태 여부. `clickable` 이 false 면 무시된다 |
|
|
19
|
+
| `clickable?` | `boolean` | `false` | 클릭 가능 상태 여부. hover·selected·chevron 등 인터랙션 표현이 여기에 딸린다 |
|
|
20
20
|
| `interaction?` | `SListItemInteraction` | — | hover/selected 상태에서 적용할 인터랙션 preset |
|
|
21
21
|
| `accentStripe?` | `boolean` | `false` | 아이템 왼쪽 accent stripe 표시 여부 |
|
|
22
22
|
| `dense?` | `boolean` | `false` | 조밀한 높이 사용 여부 |
|
|
@@ -23,9 +23,9 @@ export interface SListItemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'ch
|
|
|
23
23
|
trailing?: SListItemSlot;
|
|
24
24
|
/** 외곽 테두리 사용 여부 */
|
|
25
25
|
bordered?: boolean;
|
|
26
|
-
/** 선택 상태
|
|
26
|
+
/** 선택 상태 여부. `clickable` 이 false 면 무시된다 */
|
|
27
27
|
selected?: boolean;
|
|
28
|
-
/** 클릭 가능 상태
|
|
28
|
+
/** 클릭 가능 상태 여부. hover·selected·chevron 등 인터랙션 표현이 여기에 딸린다 */
|
|
29
29
|
clickable?: boolean;
|
|
30
30
|
/** hover/selected 상태에서 적용할 인터랙션 preset */
|
|
31
31
|
interaction?: SListItemInteraction;
|
|
@@ -2,6 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
> 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
|
|
4
4
|
|
|
5
|
+
### SPageHeader
|
|
6
|
+
|
|
7
|
+
#### Props
|
|
8
|
+
|
|
9
|
+
| Prop | Type | Default | Description |
|
|
10
|
+
|------|------|---------|-------------|
|
|
11
|
+
| `title` | `string` | — | 타이틀 (필수) |
|
|
12
|
+
| `subText?` | `string` | — | 서브 텍스트. fix=true 면 타이틀 오른쪽에, fix=false(기본) 면 타이틀 아래에 놓인다. |
|
|
13
|
+
| `fix?` | `boolean` | `false` | true: 높이 56 고정 + 흰 배경 + 하단 구분선, 서브 텍스트가 타이틀과 같은 줄. false(기본): 최소 높이 66(상하 패딩 20/16 안에서 타이틀 한 줄 높이로 결정) + 투명 배경, 서브 텍스트가 타이틀 아래로 내려간다. |
|
|
14
|
+
| `slot?` | `ReactNode` | — | 오른쪽 끝 커스텀 슬롯. 가이드 링크·액션 버튼 등 페이지마다 다른 것이 온다. |
|
|
15
|
+
| `scrolled?` | `boolean` | `false` | `<SPage>` 가 스크롤 여부를 보고 자동으로 넣어준다 — 직접 주지 않는다. fix=false 일 때만 의미가 있다: 스크롤이 시작되면 그림자(floating)가 들어가 스크롤되는 콘텐츠 위에 뜬 것처럼 보인다. 배경은 그대로 페이지 배경을 따라간다 — 배경을 바꾸는 건 scrolled 가 아니라 fix 다. |
|
|
16
|
+
|
|
17
|
+
#### Events
|
|
18
|
+
|
|
19
|
+
| Event | Type | Description |
|
|
20
|
+
|-------|------|-------------|
|
|
21
|
+
| `onBack` | `() => void` | 뒤로가기 클릭 핸들러. 지정하면 왼쪽에 뒤로가기 버튼이 나타난다. |
|
|
22
|
+
|
|
5
23
|
### SPage
|
|
6
24
|
|
|
7
25
|
#### Props
|
|
@@ -10,17 +28,22 @@
|
|
|
10
28
|
|------|------|---------|-------------|
|
|
11
29
|
| `background?` | `SPageBackground` | `'frame'` | 페이지 배경 표면. frame=흰 콘텐츠 면, neutral=옅은 회색 면, screen=앱 바탕. 스크롤바 처리도 여기 묶여 있다 — 셋 다 구분선+트랙 배경이고, 트랙 색만 neutral 에서 흰색이 된다. |
|
|
12
30
|
| `scrollEndSpacing?` | `boolean` | `true` | 스크롤 끝 여백. 마지막 항목이 창 하단에 붙어 "여기서 끝"이 안 읽히는 것을 막는다. 기본으로 켜져 있고, 페이지네이션처럼 끝을 알려주는 것이 이미 있으면 끈다(목록 페이지). |
|
|
31
|
+
| `overlayScrollbar?` | `boolean` | `false` | true면 네이티브 스크롤바를 숨기고 SPage 위에 오버레이 스크롤바를 얹는다. 스크롤바가 레이아웃 폭을 차지하지 않아 내부 콘텐츠 폭이 줄어들지 않는다. |
|
|
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
|
+
| `header?` | `SPageHeaderProps` | — | 페이지 타이틀 영역(pageHeader 포팅). 주면 스크롤·페이지 패딩 밖으로 빼내 상단에 고정 배치한다. `children` 은 항상 본문이다 — header 유무와 무관하게 같은 자리에 같은 뜻으로 들어간다. |
|
|
13
34
|
|
|
14
35
|
## Dependencies
|
|
15
36
|
|
|
16
37
|
### Depends on
|
|
17
38
|
|
|
39
|
+
- [SGhostButton](../SGhostButton)
|
|
18
40
|
- [SLayout](../SLayout)
|
|
19
41
|
|
|
20
42
|
### Graph
|
|
21
43
|
|
|
22
44
|
```mermaid
|
|
23
45
|
graph TD;
|
|
46
|
+
SPage --> SGhostButton
|
|
24
47
|
SPage --> SLayout
|
|
25
48
|
style SPage fill:#f9f,stroke:#333,stroke-width:4px
|
|
26
49
|
```
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type HTMLAttributes } from 'react';
|
|
2
|
-
import type { SPageBackground } from './page.config';
|
|
2
|
+
import type { SPageBackground, SPageContentHeight } from './page.config';
|
|
3
|
+
import { type SPageHeaderProps } from './SPageHeader';
|
|
3
4
|
export interface SPageProps extends HTMLAttributes<HTMLElement> {
|
|
4
5
|
/**
|
|
5
6
|
* 페이지 배경 표면. frame=흰 콘텐츠 면, neutral=옅은 회색 면, screen=앱 바탕.
|
|
@@ -11,6 +12,27 @@ export interface SPageProps extends HTMLAttributes<HTMLElement> {
|
|
|
11
12
|
* 기본으로 켜져 있고, 페이지네이션처럼 끝을 알려주는 것이 이미 있으면 끈다(목록 페이지).
|
|
12
13
|
*/
|
|
13
14
|
scrollEndSpacing?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* true면 네이티브 스크롤바를 숨기고 SPage 위에 오버레이 스크롤바를 얹는다.
|
|
17
|
+
* 스크롤바가 레이아웃 폭을 차지하지 않아 내부 콘텐츠 폭이 줄어들지 않는다.
|
|
18
|
+
*/
|
|
19
|
+
overlayScrollbar?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* 본문 높이 모드. 기본은 `auto` — 콘텐츠가 흐르고 넘치면 페이지가 스크롤한다.
|
|
22
|
+
*
|
|
23
|
+
* `fill` 은 본문이 남은 높이를 정확히 채우고 페이지는 스크롤하지 않는다. 표가 자기 안에서
|
|
24
|
+
* 스크롤하고 페이지네이션이 하단에 고정되는 목록 화면용이다. 본문 루트에 `h-full` 이 먹으므로
|
|
25
|
+
* `<div className="flex h-full min-h-0 flex-col">` + `<STable className="min-h-0 flex-1" />`
|
|
26
|
+
* 구성이 성립한다.
|
|
27
|
+
*
|
|
28
|
+
* `fill` 에서는 페이지가 스크롤하지 않으므로 `scrollEndSpacing` 이 무시된다.
|
|
29
|
+
*/
|
|
30
|
+
contentHeight?: SPageContentHeight;
|
|
31
|
+
/**
|
|
32
|
+
* 페이지 타이틀 영역(pageHeader 포팅). 주면 스크롤·페이지 패딩 밖으로 빼내 상단에 고정 배치한다.
|
|
33
|
+
* `children` 은 항상 본문이다 — header 유무와 무관하게 같은 자리에 같은 뜻으로 들어간다.
|
|
34
|
+
*/
|
|
35
|
+
header?: SPageHeaderProps;
|
|
14
36
|
}
|
|
15
37
|
/**
|
|
16
38
|
* SPage — SLayout 안에서 남은 공간을 채우는 스크롤 콘텐츠 영역.
|
|
@@ -21,5 +43,9 @@ export interface SPageProps extends HTMLAttributes<HTMLElement> {
|
|
|
21
43
|
* - header="fix": flex 자식으로 남은 가로 공간을 채운다.
|
|
22
44
|
* - header="full": SLayout 이 깐 grid 의 "page" 영역 = 상단바 아래·메뉴 오른쪽 자리를 차지한다.
|
|
23
45
|
* 좌표가 아니라 이름으로 잡으므로 프레임의 열·행 구성이 바뀌어도 여기는 그대로다.
|
|
46
|
+
*
|
|
47
|
+
* **`header` prop 을 주면** 스크롤·페이지 패딩 밖으로 빼내 상단에 고정 배치한다(fix 베리에이션이
|
|
48
|
+
* 늘 보이는 높이 56 바가 되도록). 주지 않으면 이전과 동일하게 동작한다 — ref·className·style·
|
|
49
|
+
* 나머지 속성이 전부 스크롤 영역 자체(`<main>`)에 그대로 붙는다.
|
|
24
50
|
*/
|
|
25
51
|
export declare const SPage: import("react").ForwardRefExoticComponent<SPageProps & import("react").RefAttributes<HTMLElement>>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
export interface SPageHeaderProps extends Omit<HTMLAttributes<HTMLElement>, 'slot' | 'title'> {
|
|
3
|
+
/** 타이틀 (필수) */
|
|
4
|
+
title: string;
|
|
5
|
+
/** 서브 텍스트. fix=true 면 타이틀 오른쪽에, fix=false(기본) 면 타이틀 아래에 놓인다. */
|
|
6
|
+
subText?: string;
|
|
7
|
+
/**
|
|
8
|
+
* true: 높이 56 고정 + 흰 배경 + 하단 구분선, 서브 텍스트가 타이틀과 같은 줄.
|
|
9
|
+
* false(기본): 최소 높이 66(상하 패딩 20/16 안에서 타이틀 한 줄 높이로 결정) + 투명 배경,
|
|
10
|
+
* 서브 텍스트가 타이틀 아래로 내려간다.
|
|
11
|
+
*/
|
|
12
|
+
fix?: boolean;
|
|
13
|
+
/** 뒤로가기 클릭 핸들러. 지정하면 왼쪽에 뒤로가기 버튼이 나타난다. */
|
|
14
|
+
onBack?: () => void;
|
|
15
|
+
/** 오른쪽 끝 커스텀 슬롯. 가이드 링크·액션 버튼 등 페이지마다 다른 것이 온다. */
|
|
16
|
+
slot?: ReactNode;
|
|
17
|
+
/**
|
|
18
|
+
* `<SPage>` 가 스크롤 여부를 보고 자동으로 넣어준다 — 직접 주지 않는다.
|
|
19
|
+
* fix=false 일 때만 의미가 있다: 스크롤이 시작되면 그림자(floating)가 들어가 스크롤되는
|
|
20
|
+
* 콘텐츠 위에 뜬 것처럼 보인다. 배경은 그대로 페이지 배경을 따라간다 — 배경을 바꾸는 건
|
|
21
|
+
* scrolled 가 아니라 fix 다.
|
|
22
|
+
* @nodemo SPage 가 스크롤 이벤트로 넣어준다 — 사용자가 직접 시연할 값이 아니다.
|
|
23
|
+
*/
|
|
24
|
+
scrolled?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* SPage 위에 얹는 페이지 타이틀 영역(pageHeader 포팅). `SPage` 가 `header` prop 값으로
|
|
28
|
+
* 내부적으로만 렌더한다 — 직접 임포트해 쓰지 않는다 (SPage.tsx 참고).
|
|
29
|
+
* fix 로 bar(높이 고정·흰 배경) / plain(투명·최소 높이) 두 베리에이션을 고른다.
|
|
30
|
+
* 뒤로가기 버튼은 onBack 유무로 나타나며, 없을 때는 타이틀 쪽에 4px 여백이 대신 들어간다.
|
|
31
|
+
*/
|
|
32
|
+
export declare const SPageHeader: import("react").ForwardRefExoticComponent<SPageHeaderProps & import("react").RefAttributes<HTMLElement>>;
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export { SPage, type SPageProps } from './SPage';
|
|
2
|
-
export { PAGE_BACKGROUNDS, type SPageBackground } from './page.config';
|
|
2
|
+
export { PAGE_BACKGROUNDS, type SPageBackground, PAGE_CONTENT_HEIGHTS, type SPageContentHeight, } from './page.config';
|
|
3
|
+
export { type SPageHeaderProps } from './SPageHeader';
|
|
@@ -6,3 +6,11 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export declare const PAGE_BACKGROUNDS: readonly ["frame", "neutral", "screen"];
|
|
8
8
|
export type SPageBackground = (typeof PAGE_BACKGROUNDS)[number];
|
|
9
|
+
/**
|
|
10
|
+
* 본문 높이 모드 — 페이지가 스크롤할지, 본문이 남은 높이를 채울지.
|
|
11
|
+
* - auto: 콘텐츠가 흐르고, 넘치면 페이지가 스크롤한다
|
|
12
|
+
* - fill: 본문이 남은 높이를 정확히 채우고 페이지는 스크롤하지 않는다.
|
|
13
|
+
* 표가 자기 안에서 스크롤하고 페이지네이션이 하단에 고정되는 목록 화면용.
|
|
14
|
+
*/
|
|
15
|
+
export declare const PAGE_CONTENT_HEIGHTS: readonly ["auto", "fill"];
|
|
16
|
+
export type SPageContentHeight = (typeof PAGE_CONTENT_HEIGHTS)[number];
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
| `maxHeight?` | `number` | — | 콘텐츠 최대 높이 px. 넘치면 세로 스크롤. |
|
|
19
19
|
| `autoClose?` | `boolean` | `false` | 콘텐츠 내부를 클릭하면 자동으로 닫는다. |
|
|
20
20
|
| `persistent?` | `boolean` | `false` | 외부 클릭 · ESC 로 닫히지 않게 한다. |
|
|
21
|
-
| `viewportPadding?` | `number` | `0` | 뷰포트 경계 여백 px (충돌 회피 패딩). |
|
|
21
|
+
| `viewportPadding?` | `number` | `0` | 뷰포트 경계 여백 px (충돌 회피 패딩). 콘텐츠 폭은 항상 `창 폭 - viewportPadding*2` 를 넘지 않게 잘린다. |
|
|
22
22
|
| `children?` | `ReactNode` | — | 본문 내용 (콘텐츠 자유). |
|
|
23
23
|
| `className?` | `string` | — | |
|
|
24
24
|
| `style?` | `CSSProperties` | — | |
|
|
@@ -29,7 +29,10 @@ export interface SPortalProps {
|
|
|
29
29
|
autoClose?: boolean;
|
|
30
30
|
/** 외부 클릭 · ESC 로 닫히지 않게 한다. */
|
|
31
31
|
persistent?: boolean;
|
|
32
|
-
/**
|
|
32
|
+
/**
|
|
33
|
+
* 뷰포트 경계 여백 px (충돌 회피 패딩).
|
|
34
|
+
* 콘텐츠 폭은 항상 `창 폭 - viewportPadding*2` 를 넘지 않게 잘린다.
|
|
35
|
+
*/
|
|
33
36
|
viewportPadding?: number;
|
|
34
37
|
/** 열릴 때 포커스 이동 처리 (기본은 Radix가 콘텐츠로 포커스를 옮김). e.preventDefault()로 막을 수 있다. */
|
|
35
38
|
onOpenAutoFocus?: (event: Event) => void;
|
|
@@ -49,5 +52,8 @@ export interface SPortalProps {
|
|
|
49
52
|
* 트리거를 감싸지 않고 `anchorRef` 로 임의의 엘리먼트에 붙는다(=sd-portal `parentRef`).
|
|
50
53
|
* open/onClose 로 외부에서 제어하며, flip·collision·스크롤 재배치·외부클릭·ESC·모달 포털은
|
|
51
54
|
* Radix 가 처리한다. 콘텐츠는 children 으로 완전히 자유롭다.
|
|
55
|
+
*
|
|
56
|
+
* 콘텐츠가 창보다 넓으면 창 폭에 맞춰 줄어든다(sd-portal 과 동일). `style` 로 준
|
|
57
|
+
* width·minWidth·maxWidth 도 이 상한 안으로 가둬지므로 화면 밖으로 나가지 않는다.
|
|
52
58
|
*/
|
|
53
59
|
export declare function SPortal({ open, onClose, onOpenChange, anchorRef, placement, align, offset, alignOffset, fit, maxHeight, autoClose, persistent, viewportPadding, onOpenAutoFocus, onCloseAutoFocus, onPointerDownOutside, children, className, style, ariaLabel, }: SPortalProps): import("react").JSX.Element;
|
|
@@ -46,12 +46,14 @@
|
|
|
46
46
|
|
|
47
47
|
### Used by
|
|
48
48
|
|
|
49
|
+
- [SChipFilter](../SChipFilter)
|
|
49
50
|
- [SKeyValueTable](../SKeyValueTable)
|
|
50
51
|
|
|
51
52
|
### Graph
|
|
52
53
|
|
|
53
54
|
```mermaid
|
|
54
55
|
graph TD;
|
|
56
|
+
SChipFilter --> SRadio
|
|
55
57
|
SKeyValueTable --> SRadio
|
|
56
58
|
style SRadio fill:#f9f,stroke:#333,stroke-width:4px
|
|
57
59
|
```
|
|
@@ -22,3 +22,16 @@
|
|
|
22
22
|
|-------|------|-------------|
|
|
23
23
|
| `onValueChange` | `(value: string \| number) => void` | 변경 (sdUpdate) |
|
|
24
24
|
|
|
25
|
+
## Dependencies
|
|
26
|
+
|
|
27
|
+
### Used by
|
|
28
|
+
|
|
29
|
+
- [SChipFilter](../SChipFilter)
|
|
30
|
+
|
|
31
|
+
### Graph
|
|
32
|
+
|
|
33
|
+
```mermaid
|
|
34
|
+
graph TD;
|
|
35
|
+
SChipFilter --> SRadioButton
|
|
36
|
+
style SRadioButton fill:#f9f,stroke:#333,stroke-width:4px
|
|
37
|
+
```
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# SSearchInput
|
|
2
|
+
|
|
3
|
+
> 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
|
|
4
|
+
|
|
5
|
+
### SSearchInput
|
|
6
|
+
|
|
7
|
+
#### Props
|
|
8
|
+
|
|
9
|
+
| Prop | Type | Default | Description |
|
|
10
|
+
|------|------|---------|-------------|
|
|
11
|
+
| `value?` | `string \| number` | — | 값 (제어) |
|
|
12
|
+
| `size?` | `SSearchInputSize` | `'sm'` | 크기 |
|
|
13
|
+
| `placeholder?` | `string` | `'결과 내 검색'` | 플레이스홀더 |
|
|
14
|
+
| `clearable?` | `boolean` | `false` | 지우기 버튼 — 값이 있을 때만 나타난다 |
|
|
15
|
+
| `disabled?` | `boolean` | `false` | 비활성 |
|
|
16
|
+
| `width?` | `number \| string` | — | 컨트롤 너비 (숫자=px). 미지정 시 부모 폭을 채운다 |
|
|
17
|
+
| `focused?` | `boolean` | — | 포커스 상태 (제어/반영) |
|
|
18
|
+
| `hovered?` | `boolean` | — | 호버 상태 (제어/반영) |
|
|
19
|
+
| `inputClass?` | `string` | — | 내부 input 요소 className |
|
|
20
|
+
| `inputStyle?` | `CSSProperties` | — | 내부 input 요소 style |
|
|
21
|
+
| `className?` | `string` | — | |
|
|
22
|
+
| `style?` | `CSSProperties` | — | |
|
|
23
|
+
|
|
24
|
+
#### Events
|
|
25
|
+
|
|
26
|
+
| Event | Type | Description |
|
|
27
|
+
|-------|------|-------------|
|
|
28
|
+
| `onValueChange` | `(value: string) => void` | 값 변경 — 문자열 전달 |
|
|
29
|
+
| `onChange` | `InputHTMLAttributes<HTMLInputElement>['onChange']` | 네이티브 onChange (form-agnostic 연동용, RHF 등) |
|
|
30
|
+
| `onSearch` | `(value: string) => void` | 검색 실행 — Enter 키에서 현재 값과 함께 호출된다. 한글 조합 중의 Enter(IME 확정)는 검색으로 치지 않는다. |
|
|
31
|
+
|
|
32
|
+
## Dependencies
|
|
33
|
+
|
|
34
|
+
### Depends on
|
|
35
|
+
|
|
36
|
+
- [SField](../SField)
|
|
37
|
+
- [SGhostButton](../SGhostButton)
|
|
38
|
+
- [SIcon](../SIcon)
|
|
39
|
+
|
|
40
|
+
### Graph
|
|
41
|
+
|
|
42
|
+
```mermaid
|
|
43
|
+
graph TD;
|
|
44
|
+
SSearchInput --> SField
|
|
45
|
+
SSearchInput --> SGhostButton
|
|
46
|
+
SSearchInput --> SIcon
|
|
47
|
+
style SSearchInput fill:#f9f,stroke:#333,stroke-width:4px
|
|
48
|
+
```
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type CSSProperties, type InputHTMLAttributes } from 'react';
|
|
2
|
+
import { type SFieldSize } from '../SField';
|
|
3
|
+
export type SSearchInputSize = SFieldSize;
|
|
4
|
+
export interface SSearchInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'value' | 'onChange' | 'type' | 'prefix' | 'suffix'> {
|
|
5
|
+
/** 값 (제어) */
|
|
6
|
+
value?: string | number;
|
|
7
|
+
/** 값 변경 — 문자열 전달 */
|
|
8
|
+
onValueChange?: (value: string) => void;
|
|
9
|
+
/** 네이티브 onChange (form-agnostic 연동용, RHF 등) */
|
|
10
|
+
onChange?: InputHTMLAttributes<HTMLInputElement>['onChange'];
|
|
11
|
+
/**
|
|
12
|
+
* 검색 실행 — Enter 키에서 현재 값과 함께 호출된다.
|
|
13
|
+
* 한글 조합 중의 Enter(IME 확정)는 검색으로 치지 않는다.
|
|
14
|
+
*/
|
|
15
|
+
onSearch?: (value: string) => void;
|
|
16
|
+
/** 크기 */
|
|
17
|
+
size?: SSearchInputSize;
|
|
18
|
+
/** 플레이스홀더 */
|
|
19
|
+
placeholder?: string;
|
|
20
|
+
/** 지우기 버튼 — 값이 있을 때만 나타난다 */
|
|
21
|
+
clearable?: boolean;
|
|
22
|
+
/** 비활성 */
|
|
23
|
+
disabled?: boolean;
|
|
24
|
+
/** 컨트롤 너비 (숫자=px). 미지정 시 부모 폭을 채운다 */
|
|
25
|
+
width?: number | string;
|
|
26
|
+
/** 포커스 상태 (제어/반영) */
|
|
27
|
+
focused?: boolean;
|
|
28
|
+
/** 호버 상태 (제어/반영) */
|
|
29
|
+
hovered?: boolean;
|
|
30
|
+
/** 내부 input 요소 className */
|
|
31
|
+
inputClass?: string;
|
|
32
|
+
/** 내부 input 요소 style */
|
|
33
|
+
inputStyle?: CSSProperties;
|
|
34
|
+
className?: string;
|
|
35
|
+
style?: CSSProperties;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* SSearchInput — 목록·결과를 검색어로 좁히는 한 줄 입력.
|
|
39
|
+
*
|
|
40
|
+
* 테두리 박스(border/radius/배경 + hover·focus 강조)는 `SField` 가 소유하고,
|
|
41
|
+
* 이 컴포넌트는 그 안의 돋보기 아이콘 + input 만 그린다.
|
|
42
|
+
* 좌측 아이콘은 **장식**이라 클릭 대상이 아니다 — 검색 실행은 Enter(`onSearch`) 다.
|
|
43
|
+
*
|
|
44
|
+
* 라벨·검증·에러 메시지가 필요한 폼 필드라면 `SInput` 을 쓴다.
|
|
45
|
+
*/
|
|
46
|
+
export declare const SSearchInput: import("react").ForwardRefExoticComponent<SSearchInputProps & import("react").RefAttributes<HTMLInputElement>>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SSearchInput, type SSearchInputProps, type SSearchInputSize } from './SSearchInput';
|