@uniai-fe/uds-primitives 0.2.1 → 0.2.3
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/README.md +1 -1
- package/dist/styles.css +391 -81
- package/package.json +17 -8
- package/src/components/button/index.tsx +0 -2
- package/src/components/button/markup/Base.tsx +22 -1
- package/src/components/button/styles/button.scss +24 -2
- package/src/components/button/styles/variables.scss +4 -0
- package/src/components/button/types/index.ts +7 -0
- package/src/components/{input/img/calendar → calendar/img}/calendar.svg +5 -0
- package/src/components/calendar/index.tsx +5 -3
- package/src/components/calendar/markup/Core.tsx +67 -0
- package/src/components/calendar/markup/Icon.tsx +20 -0
- package/src/components/calendar/markup/Root.tsx +126 -0
- package/src/components/calendar/markup/index.tsx +24 -2
- package/src/components/calendar/markup/layout/Body.tsx +12 -0
- package/src/components/calendar/markup/layout/Container.tsx +43 -0
- package/src/components/calendar/markup/layout/Footer.tsx +12 -0
- package/src/components/calendar/markup/layout/Header.tsx +12 -0
- package/src/components/calendar/styles/index.scss +2 -0
- package/src/components/calendar/styles/layout.scss +21 -0
- package/src/components/calendar/styles/mantine-calendar.scss +240 -0
- package/src/components/calendar/types/calendar.ts +208 -0
- package/src/components/calendar/types/index.ts +1 -4
- package/src/components/calendar/utils/index.ts +1 -4
- package/src/components/calendar/utils/value-mapper.ts +24 -0
- package/src/components/checkbox/markup/Checkbox.tsx +31 -25
- package/src/components/dropdown/markup/index.tsx +10 -1
- package/src/components/input/hooks/index.ts +1 -0
- package/src/components/input/hooks/useAddress.ts +247 -0
- package/src/components/input/index.scss +5 -1
- package/src/components/input/markup/address/Button.tsx +65 -0
- package/src/components/input/markup/address/Template.tsx +135 -0
- package/src/components/input/markup/address/index.ts +9 -0
- package/src/components/input/markup/date/Template.tsx +181 -0
- package/src/components/input/markup/date/Trigger.tsx +79 -0
- package/src/components/input/markup/date/button/ApplyButton.tsx +38 -0
- package/src/components/input/markup/date/button/ClearButton.tsx +36 -0
- package/src/components/input/markup/date/button/TodayButton.tsx +36 -0
- package/src/components/input/markup/date/footer/Container.tsx +24 -0
- package/src/components/input/markup/date/footer/Template.tsx +36 -0
- package/src/components/input/markup/date/footer/UtilContainer.tsx +23 -0
- package/src/components/input/markup/date/footer/index.ts +3 -0
- package/src/components/input/markup/date/index.tsx +27 -0
- package/src/components/input/markup/foundation/Input.tsx +20 -1
- package/src/components/input/markup/index.tsx +4 -4
- package/src/components/input/styles/address.scss +24 -0
- package/src/components/input/styles/date.scss +45 -0
- package/src/components/input/styles/foundation.scss +28 -2
- package/src/components/input/styles/variables.scss +4 -0
- package/src/components/input/types/address.ts +249 -0
- package/src/components/input/types/date.ts +366 -0
- package/src/components/input/types/foundation.ts +6 -0
- package/src/components/input/types/index.ts +2 -1
- package/src/components/input/utils/address.ts +165 -0
- package/src/components/input/utils/date.ts +61 -0
- package/src/components/input/utils/index.tsx +2 -0
- package/src/components/pop-over/index.scss +1 -0
- package/src/components/pop-over/index.tsx +4 -0
- package/src/components/pop-over/markup/Content.tsx +77 -0
- package/src/components/pop-over/markup/Root.tsx +28 -0
- package/src/components/pop-over/markup/Trigger.tsx +26 -0
- package/src/components/pop-over/markup/index.tsx +17 -0
- package/src/components/pop-over/styles/base.scss +5 -0
- package/src/components/pop-over/styles/content.scss +24 -0
- package/src/components/pop-over/styles/index.scss +2 -0
- package/src/components/pop-over/types/index.ts +1 -0
- package/src/components/pop-over/types/pop-over.ts +86 -0
- package/src/components/radio/markup/Radio.tsx +10 -2
- package/src/components/radio/markup/RadioCard.tsx +6 -1
- package/src/components/radio/markup/RadioCardGroup.tsx +6 -1
- package/src/components/select/markup/Default.tsx +2 -0
- package/src/components/select/markup/foundation/Container.tsx +23 -0
- package/src/components/select/markup/multiple/Multiple.tsx +2 -0
- package/src/components/select/styles/select.scss +25 -2
- package/src/components/select/styles/variables.scss +4 -0
- package/src/components/select/types/props.ts +24 -5
- package/src/index.scss +1 -0
- package/src/index.tsx +3 -1
- package/src/init/mantine.css +5 -0
- package/src/init/mantine.ts +2 -0
- package/src/components/input/markup/calendar/Base.tsx +0 -329
- package/src/components/input/markup/calendar/index.tsx +0 -8
- package/src/components/input/styles/calendar.scss +0 -110
- package/src/components/input/styles/index.scss +0 -4
- package/src/components/input/types/calendar.ts +0 -208
- /package/src/components/{input/img/calendar → calendar/img}/chevron-down.svg +0 -0
- /package/src/components/{input/img/calendar → calendar/img}/chevron-left.svg +0 -0
- /package/src/components/{input/img/calendar → calendar/img}/chevron-right.svg +0 -0
- /package/src/components/{input/img/calendar → calendar/img}/chevron-up.svg +0 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { Address } from "react-daum-postcode";
|
|
3
|
+
import type {
|
|
4
|
+
ButtonFill,
|
|
5
|
+
ButtonPriority,
|
|
6
|
+
ButtonSize,
|
|
7
|
+
} from "../../button/types";
|
|
8
|
+
import type { InputProps } from "./foundation";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* 주소 문자열/배열 정규화 결과.
|
|
12
|
+
* @property {string} text 최종 병합된 주소 문자열
|
|
13
|
+
* @property {string[]} parts 주소를 구성하는 파트 배열
|
|
14
|
+
*/
|
|
15
|
+
export interface AddressResolvedValue {
|
|
16
|
+
/**
|
|
17
|
+
* 최종 병합된 주소 문자열
|
|
18
|
+
*/
|
|
19
|
+
text: string;
|
|
20
|
+
/**
|
|
21
|
+
* 주소 파트 배열
|
|
22
|
+
*/
|
|
23
|
+
parts: string[];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* 주소 검색 완료 데이터.
|
|
28
|
+
* @property {string} address 전체 주소 문자열
|
|
29
|
+
* @property {string[]} [addressParts] 주소를 구성하는 문자열 배열
|
|
30
|
+
* @property {AddressStructure} [addressStructure] 주소 구성 정보(기본/추가 파트)
|
|
31
|
+
* @property {string} zipCode 우편번호(5자리)
|
|
32
|
+
* @property {string} [buildingName] 건물명
|
|
33
|
+
* @property {string} [district] 법정동/읍면 정보
|
|
34
|
+
* @property {Address} raw react-daum-postcode Address 원본 데이터
|
|
35
|
+
*/
|
|
36
|
+
export interface AddressSearchResult {
|
|
37
|
+
/**
|
|
38
|
+
* 전체 주소 문자열
|
|
39
|
+
*/
|
|
40
|
+
address: string;
|
|
41
|
+
/**
|
|
42
|
+
* 주소를 구성하는 문자열 배열
|
|
43
|
+
*/
|
|
44
|
+
addressParts?: string[];
|
|
45
|
+
/**
|
|
46
|
+
* 주소 구성 정보(기본 주소 + 추가 파트)
|
|
47
|
+
*/
|
|
48
|
+
addressStructure?: AddressStructure;
|
|
49
|
+
/**
|
|
50
|
+
* 우편번호(5자리)
|
|
51
|
+
*/
|
|
52
|
+
zipCode: string;
|
|
53
|
+
/**
|
|
54
|
+
* 건물명
|
|
55
|
+
*/
|
|
56
|
+
buildingName?: string;
|
|
57
|
+
/**
|
|
58
|
+
* 법정동/읍면 정보
|
|
59
|
+
*/
|
|
60
|
+
district?: string;
|
|
61
|
+
/**
|
|
62
|
+
* react-daum-postcode Address 원본 데이터
|
|
63
|
+
*/
|
|
64
|
+
raw: Address;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* 주소 구성 정보.
|
|
69
|
+
* @property {string} main 기본 주소
|
|
70
|
+
* @property {string[]} extras 추가 주소 파트 배열
|
|
71
|
+
* @example
|
|
72
|
+
* ```ts
|
|
73
|
+
* const structure: AddressStructure = {
|
|
74
|
+
* main: "서울시 강남구 ...",
|
|
75
|
+
* extras: ["도곡동", "OO아파트"],
|
|
76
|
+
* };
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export interface AddressStructure {
|
|
80
|
+
/**
|
|
81
|
+
* 기본 주소
|
|
82
|
+
*/
|
|
83
|
+
main: string;
|
|
84
|
+
/**
|
|
85
|
+
* 추가 주소 파트 배열
|
|
86
|
+
*/
|
|
87
|
+
extras: string[];
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* 주소 선택 처리 공통 옵션.
|
|
92
|
+
* @property {string} [addressFieldName] react-hook-form에 적용할 주소 필드 이름
|
|
93
|
+
* @property {string} [detailFieldName] react-hook-form에 적용할 상세 주소 필드 이름
|
|
94
|
+
* @property {string} [zipCodeFieldName] react-hook-form에 적용할 우편번호 필드 이름
|
|
95
|
+
* @property {boolean} [triggerValidation=true] setValue 이후 trigger 실행 여부
|
|
96
|
+
* @property {boolean} [resetDetailOnSelect=true] 새 주소 선택 시 상세 주소를 초기화할지 여부
|
|
97
|
+
* @property {(payload:AddressSearchResult)=>void} [onSelect] 주소 선택 후 콜백
|
|
98
|
+
*/
|
|
99
|
+
export interface AddressSelectionOptions {
|
|
100
|
+
/**
|
|
101
|
+
* react-hook-form 주소 필드 이름
|
|
102
|
+
*/
|
|
103
|
+
addressFieldName?: string;
|
|
104
|
+
/**
|
|
105
|
+
* react-hook-form 상세 주소 필드 이름
|
|
106
|
+
*/
|
|
107
|
+
detailFieldName?: string;
|
|
108
|
+
/**
|
|
109
|
+
* react-hook-form 우편번호 필드 이름
|
|
110
|
+
*/
|
|
111
|
+
zipCodeFieldName?: string;
|
|
112
|
+
/**
|
|
113
|
+
* setValue 이후 trigger 실행 여부
|
|
114
|
+
*/
|
|
115
|
+
triggerValidation?: boolean;
|
|
116
|
+
/**
|
|
117
|
+
* 새 주소 선택 시 상세 주소 초기화 여부
|
|
118
|
+
*/
|
|
119
|
+
resetDetailOnSelect?: boolean;
|
|
120
|
+
/**
|
|
121
|
+
* 주소 선택 후 콜백
|
|
122
|
+
*/
|
|
123
|
+
onSelect?: (payload: AddressSearchResult) => void;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* 제한된 입력 스타일 props; priority/size/state/block만 공유한다.
|
|
128
|
+
*/
|
|
129
|
+
export type AddressSharedInputStyleProps = Pick<
|
|
130
|
+
InputProps,
|
|
131
|
+
"priority" | "size" | "state"
|
|
132
|
+
>;
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* 주소 검색 버튼 props.
|
|
136
|
+
* @property {ReactNode} [children] 버튼 라벨
|
|
137
|
+
* @property {ButtonPriority} [priority] 버튼 priority
|
|
138
|
+
* @property {ButtonFill} [fill] 버튼 fill 타입
|
|
139
|
+
* @property {ButtonSize} [size] 버튼 size
|
|
140
|
+
* @property {string} [className] 추가 className
|
|
141
|
+
* @property {"button"|"submit"|"reset"} [type] button type
|
|
142
|
+
* @property {boolean} [disabled] disabled 여부
|
|
143
|
+
* @property {string} [addressFieldName] react-hook-form에 적용할 주소 필드 이름
|
|
144
|
+
* @property {string} [zipCodeFieldName] react-hook-form에 적용할 우편번호 필드 이름
|
|
145
|
+
* @property {boolean} [triggerValidation=true] setValue 이후 trigger 실행 여부
|
|
146
|
+
* @property {(payload:AddressSearchResult)=>void} [onSelect] 주소 선택 후 콜백
|
|
147
|
+
*/
|
|
148
|
+
export interface AddressFindButtonProps extends AddressSelectionOptions {
|
|
149
|
+
/**
|
|
150
|
+
* 버튼 라벨
|
|
151
|
+
*/
|
|
152
|
+
label?: ReactNode;
|
|
153
|
+
/**
|
|
154
|
+
* 버튼 priority
|
|
155
|
+
*/
|
|
156
|
+
priority?: ButtonPriority;
|
|
157
|
+
/**
|
|
158
|
+
* 버튼 fill 타입
|
|
159
|
+
*/
|
|
160
|
+
fill?: ButtonFill;
|
|
161
|
+
/**
|
|
162
|
+
* 버튼 size
|
|
163
|
+
*/
|
|
164
|
+
size?: ButtonSize;
|
|
165
|
+
/**
|
|
166
|
+
* 추가 className
|
|
167
|
+
*/
|
|
168
|
+
className?: string;
|
|
169
|
+
/**
|
|
170
|
+
* button type
|
|
171
|
+
*/
|
|
172
|
+
type?: "button" | "submit" | "reset";
|
|
173
|
+
/**
|
|
174
|
+
* disabled 여부
|
|
175
|
+
*/
|
|
176
|
+
disabled?: boolean;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* 주소 템플릿 버튼 옵션.
|
|
181
|
+
* @property {ReactNode} [label] 버튼 라벨
|
|
182
|
+
* @property {ButtonPriority} [priority] 버튼 priority
|
|
183
|
+
* @property {ButtonFill} [fill] 버튼 fill 타입
|
|
184
|
+
* @property {ButtonSize} [size] 버튼 size
|
|
185
|
+
* @property {boolean} [disabled] 버튼 disabled 여부
|
|
186
|
+
*/
|
|
187
|
+
export interface AddressTemplateButtonOptions {
|
|
188
|
+
/**
|
|
189
|
+
* 버튼 라벨
|
|
190
|
+
*/
|
|
191
|
+
label?: ReactNode;
|
|
192
|
+
/**
|
|
193
|
+
* 버튼 priority
|
|
194
|
+
*/
|
|
195
|
+
priority?: ButtonPriority;
|
|
196
|
+
/**
|
|
197
|
+
* 버튼 fill 타입
|
|
198
|
+
*/
|
|
199
|
+
fill?: ButtonFill;
|
|
200
|
+
/**
|
|
201
|
+
* 버튼 size
|
|
202
|
+
*/
|
|
203
|
+
size?: ButtonSize;
|
|
204
|
+
/**
|
|
205
|
+
* 버튼 disabled 여부
|
|
206
|
+
*/
|
|
207
|
+
disabled?: boolean;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* 주소 필드 템플릿 props.
|
|
212
|
+
* @property {string} [className] container className
|
|
213
|
+
* @property {AddressSharedInputStyleProps} [inputStyle] 공통 입력 스타일 props
|
|
214
|
+
* @property {InputProps} addressInput 주소 입력 Input props
|
|
215
|
+
* @property {InputProps} [detailInput] 상세 주소 입력 props
|
|
216
|
+
* @property {string} [detailFieldName] react-hook-form에 적용할 상세 주소 필드 이름
|
|
217
|
+
* @property {AddressTemplateButtonOptions} [buttonProps] 버튼 옵션
|
|
218
|
+
* @property {boolean} [disabled] 템플릿 disabled 여부
|
|
219
|
+
* @property {string} [addressFieldName] react-hook-form에 적용할 주소 필드 이름
|
|
220
|
+
* @property {string} [zipCodeFieldName] react-hook-form에 적용할 우편번호 필드 이름
|
|
221
|
+
* @property {boolean} [triggerValidation=true] setValue 이후 trigger 실행 여부
|
|
222
|
+
* @property {(payload:AddressSearchResult)=>void} [onSelect] 주소 선택 후 콜백
|
|
223
|
+
*/
|
|
224
|
+
export interface AddressTemplateProps extends AddressSelectionOptions {
|
|
225
|
+
/**
|
|
226
|
+
* container className
|
|
227
|
+
*/
|
|
228
|
+
className?: string;
|
|
229
|
+
/**
|
|
230
|
+
* 공통 입력 스타일 props
|
|
231
|
+
*/
|
|
232
|
+
inputStyle?: AddressSharedInputStyleProps;
|
|
233
|
+
/**
|
|
234
|
+
* 주소 입력 Input props
|
|
235
|
+
*/
|
|
236
|
+
addressInput: InputProps;
|
|
237
|
+
/**
|
|
238
|
+
* 상세 주소 입력 Input props
|
|
239
|
+
*/
|
|
240
|
+
detailInput?: InputProps;
|
|
241
|
+
/**
|
|
242
|
+
* 버튼 옵션
|
|
243
|
+
*/
|
|
244
|
+
buttonProps?: AddressTemplateButtonOptions;
|
|
245
|
+
/**
|
|
246
|
+
* 템플릿 disabled 여부
|
|
247
|
+
*/
|
|
248
|
+
disabled?: boolean;
|
|
249
|
+
}
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import type { MouseEvent, ReactNode } from "react";
|
|
2
|
+
import type { UseFormRegisterReturn } from "react-hook-form";
|
|
3
|
+
import type {
|
|
4
|
+
CalendarColumns,
|
|
5
|
+
CalendarDatePickerProps,
|
|
6
|
+
CalendarMode,
|
|
7
|
+
CalendarOnChange,
|
|
8
|
+
CalendarValue,
|
|
9
|
+
} from "../../calendar";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Calendar trigger(Input) 영역에서 필요한 속성 묶음.
|
|
13
|
+
* FormField와의 조합을 고려해 label/helper 등을 상위 Template에 위임한다.
|
|
14
|
+
* @property {string} [id] trigger id (label htmlFor 연동)
|
|
15
|
+
* @property {string} [name] form name; register 미사용 시 수동 지정
|
|
16
|
+
* @property {UseFormRegisterReturn} [register] react-hook-form register 결과
|
|
17
|
+
* @property {(event: MouseEvent<Element>) => void} [onClick] trigger 클릭 핸들러
|
|
18
|
+
* @property {boolean} [disabled] disabled 여부
|
|
19
|
+
* @property {string} [placeholder] trigger 내부 placeholder
|
|
20
|
+
*/
|
|
21
|
+
export interface InputCalendarTriggerProps {
|
|
22
|
+
/**
|
|
23
|
+
* trigger id (label htmlFor 연동)
|
|
24
|
+
*/
|
|
25
|
+
id?: string;
|
|
26
|
+
/**
|
|
27
|
+
* form name; register 미사용 시 수동 지정
|
|
28
|
+
*/
|
|
29
|
+
name?: string;
|
|
30
|
+
/**
|
|
31
|
+
* react-hook-form register 결과
|
|
32
|
+
*/
|
|
33
|
+
register?: UseFormRegisterReturn;
|
|
34
|
+
/**
|
|
35
|
+
* trigger 클릭 핸들러
|
|
36
|
+
*/
|
|
37
|
+
onClick?: (event: MouseEvent<Element>) => void;
|
|
38
|
+
/**
|
|
39
|
+
* disabled 여부
|
|
40
|
+
*/
|
|
41
|
+
disabled?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* trigger 내부 placeholder
|
|
44
|
+
*/
|
|
45
|
+
placeholder?: string;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Trigger view에서만 사용하는 부가 props.
|
|
50
|
+
* @property {string} [className] trigger root className
|
|
51
|
+
* @property {string} [displayValue] 표시 값 문자열
|
|
52
|
+
*/
|
|
53
|
+
export interface InputCalendarTriggerViewProps extends InputCalendarTriggerProps {
|
|
54
|
+
/**
|
|
55
|
+
* trigger root className
|
|
56
|
+
*/
|
|
57
|
+
className?: string;
|
|
58
|
+
/**
|
|
59
|
+
* 표시 값 문자열
|
|
60
|
+
*/
|
|
61
|
+
displayValue?: string;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Calendar Root가 커스텀 trigger에 전달하는 렌더 props.
|
|
66
|
+
* @property {string} [id] trigger id
|
|
67
|
+
* @property {string} [name] input name
|
|
68
|
+
* @property {string} [displayValue] 트리거 표시 문자열
|
|
69
|
+
* @property {string} [placeholder] 트리거 placeholder
|
|
70
|
+
* @property {boolean} [disabled] disabled 여부
|
|
71
|
+
* @property {(event: MouseEvent<Element>) => void} [onClick] 트리거 클릭 핸들러
|
|
72
|
+
*/
|
|
73
|
+
export interface InputCalendarTriggerRenderProps {
|
|
74
|
+
/**
|
|
75
|
+
* trigger id
|
|
76
|
+
*/
|
|
77
|
+
id?: string;
|
|
78
|
+
/**
|
|
79
|
+
* input name
|
|
80
|
+
*/
|
|
81
|
+
name?: string;
|
|
82
|
+
/**
|
|
83
|
+
* 트리거 표시 문자열
|
|
84
|
+
*/
|
|
85
|
+
displayValue?: string;
|
|
86
|
+
/**
|
|
87
|
+
* 트리거 placeholder
|
|
88
|
+
*/
|
|
89
|
+
placeholder?: string;
|
|
90
|
+
/**
|
|
91
|
+
* disabled 여부
|
|
92
|
+
*/
|
|
93
|
+
disabled?: boolean;
|
|
94
|
+
/**
|
|
95
|
+
* 트리거 클릭 핸들러
|
|
96
|
+
*/
|
|
97
|
+
onClick?: (event: MouseEvent<Element>) => void;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Input Calendar core props.
|
|
102
|
+
* @property {CalendarMode} [mode="date"] 날짜/시간 모드
|
|
103
|
+
* @property {CalendarColumns} [columns=1] 동시에 노출할 달력 열 수
|
|
104
|
+
* @property {CalendarValue} [value] 제어형 값
|
|
105
|
+
* @property {CalendarValue} [defaultValue] 비제어 초기값
|
|
106
|
+
* @property {CalendarOnChange} [onChange] 값 변경 핸들러(직렬화 문자열 기준)
|
|
107
|
+
* @property {CalendarOnChange} [onValueChange] onChange 별칭(추가 파이프라인용)
|
|
108
|
+
* @property {boolean} [readOnly] 읽기 전용 여부
|
|
109
|
+
* @property {boolean} [disabled] disabled 여부
|
|
110
|
+
* @property {CalendarDatePickerProps} [datePickerProps] Mantine DatePicker 직접 옵션
|
|
111
|
+
* @property {ReactNode} [header] 커스텀 header 콘텐츠
|
|
112
|
+
* @property {ReactNode} [footer] 커스텀 footer 콘텐츠
|
|
113
|
+
* @property {unknown} [timePicker] TimePicker 확장용 예약 슬롯(현재 미구현)
|
|
114
|
+
* @property {boolean} [calendarOpened] calendar 열림 제어 여부
|
|
115
|
+
* @property {string} [className] root className
|
|
116
|
+
* @property {ReactNode} [trigger] 커스텀 trigger 슬롯
|
|
117
|
+
* @property {(props: InputCalendarTriggerRenderProps) => ReactNode} [renderTrigger] 커스텀 trigger 렌더 함수
|
|
118
|
+
*/
|
|
119
|
+
export interface InputCalendarProps extends InputCalendarTriggerProps {
|
|
120
|
+
/**
|
|
121
|
+
* 날짜/시간 모드
|
|
122
|
+
*/
|
|
123
|
+
mode?: CalendarMode;
|
|
124
|
+
/**
|
|
125
|
+
* 동시에 노출할 달력 열 수
|
|
126
|
+
*/
|
|
127
|
+
columns?: CalendarColumns;
|
|
128
|
+
/**
|
|
129
|
+
* 제어형 값
|
|
130
|
+
*/
|
|
131
|
+
value?: CalendarValue;
|
|
132
|
+
/**
|
|
133
|
+
* 비제어 초기값
|
|
134
|
+
*/
|
|
135
|
+
defaultValue?: CalendarValue;
|
|
136
|
+
/**
|
|
137
|
+
* 값 변경 핸들러
|
|
138
|
+
*/
|
|
139
|
+
onChange?: CalendarOnChange;
|
|
140
|
+
/**
|
|
141
|
+
* onChange 별칭; 외부 파이프라인 시 사용
|
|
142
|
+
*/
|
|
143
|
+
onValueChange?: CalendarOnChange;
|
|
144
|
+
/**
|
|
145
|
+
* 읽기 전용 여부
|
|
146
|
+
*/
|
|
147
|
+
readOnly?: boolean;
|
|
148
|
+
/**
|
|
149
|
+
* disabled 여부
|
|
150
|
+
*/
|
|
151
|
+
disabled?: boolean;
|
|
152
|
+
/**
|
|
153
|
+
* Mantine DatePicker 옵션
|
|
154
|
+
*/
|
|
155
|
+
datePickerProps?: CalendarDatePickerProps;
|
|
156
|
+
/**
|
|
157
|
+
* 커스텀 header 콘텐츠
|
|
158
|
+
*/
|
|
159
|
+
header?: ReactNode;
|
|
160
|
+
/**
|
|
161
|
+
* 커스텀 footer 콘텐츠
|
|
162
|
+
*/
|
|
163
|
+
footer?: ReactNode;
|
|
164
|
+
/**
|
|
165
|
+
* TimePicker 확장용 예약 슬롯(현재 미구현).
|
|
166
|
+
* 추후 Calendar Body 조합 확장 시점에 구체 타입을 확정한다.
|
|
167
|
+
*/
|
|
168
|
+
timePicker?: unknown;
|
|
169
|
+
/**
|
|
170
|
+
* calendar 열림 제어 여부
|
|
171
|
+
*/
|
|
172
|
+
calendarOpened?: boolean;
|
|
173
|
+
/**
|
|
174
|
+
* root className
|
|
175
|
+
*/
|
|
176
|
+
className?: string;
|
|
177
|
+
/**
|
|
178
|
+
* 커스텀 trigger 슬롯
|
|
179
|
+
*/
|
|
180
|
+
trigger?: ReactNode;
|
|
181
|
+
/**
|
|
182
|
+
* 커스텀 trigger 렌더 함수
|
|
183
|
+
*/
|
|
184
|
+
renderTrigger?: (props: InputCalendarTriggerRenderProps) => ReactNode;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Calendar Container props; Header/Body/Footer depth를 고정한다.
|
|
189
|
+
* @deprecated Input.Date가 Calendar.Root 직접 위임 구조로 전환되어 현재는 호환용 타입으로만 유지한다.
|
|
190
|
+
* @property {string} [className] 커스텀 className
|
|
191
|
+
* @property {InputCalendarViewProps} calendarProps Calendar props
|
|
192
|
+
* @property {ReactNode} [header] header 콘텐츠
|
|
193
|
+
* @property {ReactNode} [footer] footer 콘텐츠
|
|
194
|
+
* @property {CalendarMode} [mode="date"] Calendar 모드
|
|
195
|
+
* @property {CalendarColumns} [columns=1] 동시에 노출할 열 수
|
|
196
|
+
* @property {boolean} [disabled] disabled 여부
|
|
197
|
+
* @property {boolean} [readOnly] readOnly 여부
|
|
198
|
+
*/
|
|
199
|
+
export interface InputCalendarContainerProps {
|
|
200
|
+
/**
|
|
201
|
+
* 커스텀 className
|
|
202
|
+
*/
|
|
203
|
+
className?: string;
|
|
204
|
+
/**
|
|
205
|
+
* Calendar props
|
|
206
|
+
*/
|
|
207
|
+
calendarProps: InputCalendarViewProps;
|
|
208
|
+
/**
|
|
209
|
+
* header 콘텐츠
|
|
210
|
+
*/
|
|
211
|
+
header?: ReactNode;
|
|
212
|
+
/**
|
|
213
|
+
* footer 콘텐츠
|
|
214
|
+
*/
|
|
215
|
+
footer?: ReactNode;
|
|
216
|
+
/**
|
|
217
|
+
* Calendar 모드
|
|
218
|
+
*/
|
|
219
|
+
mode?: CalendarMode;
|
|
220
|
+
/**
|
|
221
|
+
* 동시에 노출할 열 수
|
|
222
|
+
*/
|
|
223
|
+
columns?: CalendarColumns;
|
|
224
|
+
/**
|
|
225
|
+
* disabled 여부
|
|
226
|
+
*/
|
|
227
|
+
disabled?: boolean;
|
|
228
|
+
/**
|
|
229
|
+
* readOnly 여부
|
|
230
|
+
*/
|
|
231
|
+
readOnly?: boolean;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Calendar 본문(DatePicker/TimePicker) props.
|
|
236
|
+
* @deprecated Input.Date 내부에서 직접 사용하지 않으며, 과거 구조 호환을 위해 유지한다.
|
|
237
|
+
* @property {CalendarColumns} [columns=1] 열 개수
|
|
238
|
+
* @property {CalendarValue} value 현재 값
|
|
239
|
+
* @property {CalendarOnChange} onChange 값 변경 핸들러
|
|
240
|
+
* @property {CalendarDatePickerProps} [datePickerProps] Mantine DatePicker 옵션
|
|
241
|
+
* @property {unknown} [timePicker] TimePicker 확장용 예약 슬롯(현재 미구현)
|
|
242
|
+
*/
|
|
243
|
+
export interface InputCalendarViewProps {
|
|
244
|
+
/**
|
|
245
|
+
* 열 개수
|
|
246
|
+
*/
|
|
247
|
+
columns?: CalendarColumns;
|
|
248
|
+
/**
|
|
249
|
+
* 현재 값
|
|
250
|
+
*/
|
|
251
|
+
value: CalendarValue;
|
|
252
|
+
/**
|
|
253
|
+
* 값 변경 핸들러
|
|
254
|
+
*/
|
|
255
|
+
onChange: CalendarOnChange;
|
|
256
|
+
/**
|
|
257
|
+
* Mantine DatePicker 옵션
|
|
258
|
+
*/
|
|
259
|
+
datePickerProps?: CalendarDatePickerProps;
|
|
260
|
+
/**
|
|
261
|
+
* TimePicker 확장용 예약 슬롯(현재 미구현).
|
|
262
|
+
* 추후 Calendar Body 조합 확장 시점에 구체 타입을 확정한다.
|
|
263
|
+
*/
|
|
264
|
+
timePicker?: unknown;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* footer 개별 버튼 공용 props.
|
|
269
|
+
* @property {ReactNode} [children] 버튼 라벨
|
|
270
|
+
* @property {() => void} [onClick] click 핸들러
|
|
271
|
+
* @property {boolean} [disabled] disabled 여부
|
|
272
|
+
* @property {string} [className] 버튼 className
|
|
273
|
+
*/
|
|
274
|
+
export interface InputCalendarInlineButtonProps {
|
|
275
|
+
/**
|
|
276
|
+
* 버튼 라벨
|
|
277
|
+
*/
|
|
278
|
+
children?: ReactNode;
|
|
279
|
+
/**
|
|
280
|
+
* click 핸들러
|
|
281
|
+
*/
|
|
282
|
+
onClick?: () => void;
|
|
283
|
+
/**
|
|
284
|
+
* disabled 여부
|
|
285
|
+
*/
|
|
286
|
+
disabled?: boolean;
|
|
287
|
+
/**
|
|
288
|
+
* 버튼 className
|
|
289
|
+
*/
|
|
290
|
+
className?: string;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Apply 버튼 전용 props.
|
|
295
|
+
* @extends InputCalendarInlineButtonProps
|
|
296
|
+
* @property {ReactNode} [label] children 미지정 시 사용할 기본 라벨
|
|
297
|
+
*/
|
|
298
|
+
export interface InputCalendarApplyButtonProps extends InputCalendarInlineButtonProps {
|
|
299
|
+
/**
|
|
300
|
+
* 버튼 라벨
|
|
301
|
+
*/
|
|
302
|
+
label?: ReactNode;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Footer template의 util 버튼 컨테이너 props.
|
|
307
|
+
* @property {ReactNode} [children] util 버튼(children)
|
|
308
|
+
* @property {string} [className] container className
|
|
309
|
+
*/
|
|
310
|
+
export interface InputCalendarFooterUtilContainerProps {
|
|
311
|
+
/**
|
|
312
|
+
* util 버튼(children)
|
|
313
|
+
*/
|
|
314
|
+
children?: ReactNode;
|
|
315
|
+
/**
|
|
316
|
+
* container className
|
|
317
|
+
*/
|
|
318
|
+
className?: string;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Footer template의 루트 컨테이너 props.
|
|
323
|
+
* @property {ReactNode} [children] footer 내부 children
|
|
324
|
+
* @property {string} [className] container className
|
|
325
|
+
*/
|
|
326
|
+
export interface InputCalendarFooterTemplateContainerProps {
|
|
327
|
+
/**
|
|
328
|
+
* footer 내부 children
|
|
329
|
+
*/
|
|
330
|
+
children?: ReactNode;
|
|
331
|
+
/**
|
|
332
|
+
* container className
|
|
333
|
+
*/
|
|
334
|
+
className?: string;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* 기본 FooterTemplate props.
|
|
339
|
+
* @property {string} [className] root className
|
|
340
|
+
* @property {() => void} [onClear] clear 버튼 클릭 핸들러
|
|
341
|
+
* @property {() => void} [onToday] today 버튼 클릭 핸들러
|
|
342
|
+
* @property {() => void} [onApply] apply 버튼 클릭 핸들러
|
|
343
|
+
* @property {boolean} [disabled] 전체 버튼 disabled 여부
|
|
344
|
+
*/
|
|
345
|
+
export interface InputCalendarFooterTemplateProps {
|
|
346
|
+
/**
|
|
347
|
+
* root className
|
|
348
|
+
*/
|
|
349
|
+
className?: string;
|
|
350
|
+
/**
|
|
351
|
+
* clear 버튼 클릭 핸들러
|
|
352
|
+
*/
|
|
353
|
+
onClear?: () => void;
|
|
354
|
+
/**
|
|
355
|
+
* today 버튼 클릭 핸들러
|
|
356
|
+
*/
|
|
357
|
+
onToday?: () => void;
|
|
358
|
+
/**
|
|
359
|
+
* apply 버튼 클릭 핸들러
|
|
360
|
+
*/
|
|
361
|
+
onApply?: () => void;
|
|
362
|
+
/**
|
|
363
|
+
* 전체 버튼 disabled 여부
|
|
364
|
+
*/
|
|
365
|
+
disabled?: boolean;
|
|
366
|
+
}
|
|
@@ -5,6 +5,7 @@ import type {
|
|
|
5
5
|
ReactNode,
|
|
6
6
|
} from "react";
|
|
7
7
|
import type { UseFormRegisterReturn } from "react-hook-form";
|
|
8
|
+
import type { FormFieldWidth } from "../../form/types/props";
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* input; priority option
|
|
@@ -99,6 +100,7 @@ export interface InputIcon {
|
|
|
99
100
|
* @property {React.ReactNode} [clear] input reset버튼 커스텀 컨텐츠
|
|
100
101
|
* @property {React.ReactNode} [success] input 입력상태 성공시 커스텀 컨텐츠
|
|
101
102
|
* @property {React.ReactNode} [error] input 입력상태 에러시 커스텀 컨텐츠
|
|
103
|
+
* @property {FormFieldWidth} [width] width preset 옵션
|
|
102
104
|
*/
|
|
103
105
|
export interface InputProps extends Omit<NativeInputProps, "size">, InputIcon {
|
|
104
106
|
/**
|
|
@@ -129,6 +131,10 @@ export interface InputProps extends Omit<NativeInputProps, "size">, InputIcon {
|
|
|
129
131
|
* react-hook-form register 반환값
|
|
130
132
|
*/
|
|
131
133
|
register?: UseFormRegisterReturn;
|
|
134
|
+
/**
|
|
135
|
+
* width preset 옵션
|
|
136
|
+
*/
|
|
137
|
+
width?: FormFieldWidth;
|
|
132
138
|
/**
|
|
133
139
|
* Storybook 등에서 강제 상태 표현용
|
|
134
140
|
*/
|