@uniai-fe/uds-templates 0.4.32 → 0.5.0

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.
@@ -1,4 +1,7 @@
1
+ export { AuthSignupTypeSelectForm } from "./TypeSelectForm";
1
2
  export { AuthSignupUserInfoForm } from "./UserInfoForm";
3
+ export { AuthSignupFarmCodeForm } from "./FarmCodeForm";
4
+ export { AuthSignupAgreementForm } from "./AgreementForm";
2
5
  export { AuthSignupVerificationForm } from "./VerificationForm";
3
6
  export { AuthSignupAccountForm } from "./AccountForm";
4
7
  export { AuthSignupComplete } from "./Complete";
@@ -11,6 +11,64 @@
11
11
  gap: var(--spacing-padding-5);
12
12
  }
13
13
 
14
+ .auth-signup-type-options {
15
+ display: flex;
16
+ flex-direction: column;
17
+ gap: var(--spacing-padding-6);
18
+ }
19
+
20
+ .auth-signup-type-option-group {
21
+ display: flex;
22
+ flex-direction: column;
23
+ gap: var(--spacing-padding-3);
24
+ }
25
+
26
+ .auth-signup-type-question {
27
+ margin: 0;
28
+ color: var(--color-label-standard);
29
+ font-size: var(--font-heading-xxsmall-size);
30
+ line-height: 1.4;
31
+ }
32
+
33
+ .auth-signup-type-option {
34
+ display: flex;
35
+ justify-content: flex-start;
36
+ text-align: left;
37
+
38
+ --button-default-padding-inline-large: 16px;
39
+ --button-default-tertiary-outline-foreground: var(--color-label-alternative);
40
+
41
+ .button-left {
42
+ display: flex;
43
+ width: 24px;
44
+ height: 24px;
45
+ align-items: center;
46
+ justify-content: center;
47
+ flex-shrink: 0;
48
+ }
49
+ .button-left svg {
50
+ display: block;
51
+ width: 24px;
52
+ height: 24px;
53
+ }
54
+ .button-label {
55
+ flex: 1;
56
+ text-align: left;
57
+ }
58
+ }
59
+
60
+ .auth-signup-type-option-label {
61
+ font-size: var(--font-body-large-size);
62
+ line-height: 1.5;
63
+ }
64
+
65
+ .auth-signup-type-description {
66
+ margin: 0;
67
+ color: var(--color-label-assistive);
68
+ font-size: var(--font-body-xxsmall-size);
69
+ line-height: 1.5;
70
+ }
71
+
14
72
  .auth-signup-verification {
15
73
  display: flex;
16
74
  flex-direction: column;
@@ -21,34 +79,47 @@
21
79
  .auth-signup-agreements {
22
80
  display: flex;
23
81
  flex-direction: column;
24
- gap: var(--spacing-padding-4);
82
+ gap: 12px;
83
+ }
84
+
85
+ .auth-signup-agreement-all-field {
86
+ gap: 0;
25
87
  }
26
88
 
27
89
  .auth-signup-agreement-all {
28
- height: var(--theme-size-medium-3);
29
- display: flex;
30
- align-items: center;
90
+ width: 100%;
91
+ min-height: 56px;
31
92
  background: var(--color-bg-alternative-cool-gray, #f2f2f3);
32
- border-radius: var(--theme-radius-large-2, 16px);
33
- border-radius: var(--theme-radius-medium-3, 8px);
34
- padding: 0 var(--spacing-padding-5);
93
+ border-radius: 12px;
94
+ padding: 8px 12px;
95
+ gap: 6px;
96
+ align-items: center;
97
+ }
98
+
99
+ .auth-signup-agreement-all-checkbox {
100
+ flex-shrink: 0;
101
+ }
102
+
103
+ .auth-signup-agreement-all-label {
104
+ color: var(--color-label-standard);
105
+ font-size: var(--font-body-large-size);
106
+ font-weight: 500;
107
+ line-height: 1.5;
35
108
  }
36
109
 
37
110
  .auth-signup-agreements-list {
38
111
  width: 100%;
39
- background: var(--color-common-100);
40
- border-radius: var(--theme-radius-medium-3, 8px);
41
- padding: var(--spacing-padding-3);
42
112
  display: flex;
43
113
  flex-direction: column;
44
- gap: var(--spacing-padding-3);
114
+ gap: 12px;
115
+ padding: 4px 12px;
45
116
  }
46
117
 
47
118
  .auth-signup-agreement-row {
48
119
  display: flex;
49
120
  align-items: center;
50
121
  justify-content: space-between;
51
- gap: var(--spacing-padding-3);
122
+ gap: 8px;
52
123
  }
53
124
 
54
125
  // 약관 토글 행은 SVG 아이콘/텍스트를 하나의 버튼으로 묶어 디자인 명세와 일치시킨다.
@@ -59,12 +130,13 @@
59
130
  margin: 0;
60
131
  display: flex;
61
132
  align-items: center;
62
- gap: var(--spacing-padding-3);
133
+ gap: 8px;
63
134
  cursor: pointer;
64
135
  flex: 1;
65
136
  text-align: left;
66
137
  flex-wrap: nowrap;
67
138
  font-size: 14px;
139
+ min-width: 0;
68
140
  }
69
141
 
70
142
  .auth-signup-agreement-icon {
@@ -86,19 +158,19 @@
86
158
 
87
159
  .auth-signup-agreement-toggle[data-checked="true"] .auth-signup-agreement-icon {
88
160
  color: var(--color-primary-default);
89
- border-color: var(--color-primary-default);
90
161
  }
91
162
 
92
163
  .auth-signup-agreement-label {
93
- display: inline-flex;
94
- gap: var(--spacing-padding-1);
164
+ display: flex;
165
+ gap: 0;
95
166
  align-items: baseline;
96
167
  flex-wrap: nowrap;
168
+ min-width: 0;
97
169
  }
98
170
 
99
171
  .auth-signup-agreement-badge {
100
172
  font-size: 14px;
101
- // font-weight: 600;
173
+ font-weight: 400;
102
174
  color: var(--color-primary-default);
103
175
 
104
176
  &[data-required="false"] {
@@ -110,7 +182,9 @@
110
182
  font-size: 14px;
111
183
  color: var(--color-label-standard);
112
184
  font-weight: 400;
113
- line-height: 1.4;
185
+ line-height: 1.5;
186
+ overflow: hidden;
187
+ text-overflow: ellipsis;
114
188
  }
115
189
 
116
190
  .auth-signup-agreement-description {
@@ -131,11 +205,12 @@
131
205
  justify-content: center;
132
206
  width: 20px;
133
207
  height: 20px;
208
+ flex-shrink: 0;
134
209
 
135
210
  svg {
136
211
  display: block;
137
- width: 100%;
138
- height: 100%;
212
+ width: 16px;
213
+ height: 16px;
139
214
  }
140
215
  }
141
216
 
@@ -4,8 +4,14 @@ import type { AuthPasswordRule } from "../../common/password/types";
4
4
  import type {
5
5
  AuthSignupFieldProps,
6
6
  AuthSignupFormValues,
7
+ AuthSignupTypeSelectValues,
8
+ AuthSignupTypeValue,
7
9
  AuthSignupUserInfoFields,
8
10
  AuthSignupUserInfoValues,
11
+ AuthSignupAgreementOption,
12
+ AuthSignupAgreementState,
13
+ AuthSignupFarmCodeFields,
14
+ AuthSignupFarmCodeValues,
9
15
  AuthSignupVerificationFields,
10
16
  AuthSignupVerificationValues,
11
17
  AuthSignupAccountFields,
@@ -17,6 +23,42 @@ import type {
17
23
  UseFormReturn,
18
24
  } from "react-hook-form";
19
25
 
26
+ /**
27
+ * Step1 옵션.
28
+ */
29
+ export interface UseSignupTypeSelectFormOptions {
30
+ /**
31
+ * RHF form 객체
32
+ */
33
+ form: UseFormReturn<AuthSignupFormValues>;
34
+ /**
35
+ * 제출 핸들러
36
+ */
37
+ onSubmit: SubmitHandler<AuthSignupTypeSelectValues>;
38
+ }
39
+
40
+ /**
41
+ * Step1 반환 값.
42
+ */
43
+ export interface UseSignupTypeSelectFormReturn {
44
+ /**
45
+ * 선택된 가입 유형
46
+ */
47
+ selectedType?: AuthSignupTypeValue;
48
+ /**
49
+ * 유형 변경 핸들러
50
+ */
51
+ onValueChange: (value: AuthSignupTypeValue) => void;
52
+ /**
53
+ * disabled 상태
54
+ */
55
+ disabled: boolean;
56
+ /**
57
+ * 제출 핸들러
58
+ */
59
+ onSubmit: ReturnType<UseFormReturn<AuthSignupFormValues>["handleSubmit"]>;
60
+ }
61
+
20
62
  /**
21
63
  * 공용 Helper 타입
22
64
  */
@@ -128,6 +170,96 @@ export interface UseSignupVerificationFormReturn<
128
170
  onSubmit: ReturnType<UseFormReturn<AuthSignupFormValues>["handleSubmit"]>;
129
171
  }
130
172
 
173
+ /**
174
+ * Step3 옵션.
175
+ * @interface UseSignupFarmCodeFormOptions
176
+ * @template TFields extends Record<string, AuthSignupFieldProps>
177
+ */
178
+ export interface UseSignupFarmCodeFormOptions<
179
+ TFields extends Record<string, AuthSignupFieldProps> =
180
+ AuthSignupFarmCodeFields,
181
+ > {
182
+ /**
183
+ * 필드 설정
184
+ */
185
+ fields: TFields;
186
+ /**
187
+ * RHF form 객체
188
+ */
189
+ form: UseFormReturn<AuthSignupFormValues>;
190
+ /**
191
+ * 제출 핸들러
192
+ */
193
+ onSubmit: SubmitHandler<AuthSignupFarmCodeValues>;
194
+ }
195
+
196
+ /**
197
+ * Step3 반환 값.
198
+ * @interface UseSignupFarmCodeFormReturn
199
+ * @template TFields extends Record<string, AuthSignupFieldProps>
200
+ */
201
+ export interface UseSignupFarmCodeFormReturn<
202
+ TFields extends Record<string, AuthSignupFieldProps> =
203
+ AuthSignupFarmCodeFields,
204
+ > {
205
+ /**
206
+ * 필드별 register
207
+ */
208
+ register: Record<keyof TFields, UseFormRegisterReturn>;
209
+ /**
210
+ * helper 상태
211
+ */
212
+ helpers: AuthSignupHelperMap<TFields>;
213
+ /**
214
+ * disabled 상태
215
+ */
216
+ disabled: boolean;
217
+ /**
218
+ * 제출 핸들러
219
+ */
220
+ onSubmit: ReturnType<UseFormReturn<AuthSignupFormValues>["handleSubmit"]>;
221
+ }
222
+
223
+ /**
224
+ * Step4 옵션.
225
+ */
226
+ export interface UseSignupAgreementFormOptions {
227
+ /**
228
+ * 약관 목록
229
+ */
230
+ agreements: AuthSignupAgreementOption[];
231
+ /**
232
+ * 약관 체크 상태
233
+ */
234
+ agreementState: AuthSignupAgreementState;
235
+ /**
236
+ * 제3자 제공 동의 필수 여부
237
+ */
238
+ isThirdPartyRequired?: boolean;
239
+ /**
240
+ * 제3자 제공 동의 id
241
+ */
242
+ thirdPartyAgreementId?: string;
243
+ }
244
+
245
+ /**
246
+ * Step4 반환 값.
247
+ */
248
+ export interface UseSignupAgreementFormReturn {
249
+ /**
250
+ * 필수 약관 id 목록
251
+ */
252
+ requiredAgreementIds: string[];
253
+ /**
254
+ * 필수 약관 충족 여부
255
+ */
256
+ allRequiredChecked: boolean;
257
+ /**
258
+ * CTA disabled 상태
259
+ */
260
+ disabled: boolean;
261
+ }
262
+
131
263
  /**
132
264
  * Step3 옵션.
133
265
  * @interface UseSignupAccountFormOptions
@@ -31,9 +31,84 @@ export type AuthSignupFieldProps<TProps extends InputProps = InputProps> = Omit<
31
31
  };
32
32
 
33
33
  /**
34
- * 회원가입 전체 값; Step1/2/3 값을 모두 포함한다.
34
+ * 회원가입 유형 값.
35
35
  */
36
- export type AuthSignupFormValues = AuthSignupUserInfoValues &
36
+ export type AuthSignupTypeValue = "farmMember" | "regionManager";
37
+
38
+ /**
39
+ * 회원가입 유형 선택 값.
40
+ * @property {"farmMember" | "regionManager"} [signupType] 선택된 가입 유형
41
+ */
42
+ export interface AuthSignupTypeSelectValues {
43
+ /**
44
+ * 선택된 가입 유형
45
+ */
46
+ signupType?: AuthSignupTypeValue;
47
+ }
48
+
49
+ /**
50
+ * 회원가입 유형 옵션.
51
+ * @property {"farmMember" | "regionManager"} id 옵션 식별자
52
+ * @property {React.ReactNode} question 질문 문구
53
+ * @property {React.ReactNode} label 선택 카드 라벨
54
+ * @property {React.ReactNode} [description] 보조 설명
55
+ * @property {boolean} [disabled] 비활성 여부
56
+ */
57
+ export interface AuthSignupTypeSelectOption {
58
+ /**
59
+ * 옵션 식별자
60
+ */
61
+ id: AuthSignupTypeValue;
62
+ /**
63
+ * 질문 문구
64
+ */
65
+ question: ReactNode;
66
+ /**
67
+ * 선택 카드 라벨
68
+ */
69
+ label: ReactNode;
70
+ /**
71
+ * 보조 설명
72
+ */
73
+ description?: ReactNode;
74
+ /**
75
+ * 비활성 여부
76
+ */
77
+ disabled?: boolean;
78
+ }
79
+
80
+ /**
81
+ * 회원가입 유형 선택 Step props.
82
+ * @property {AuthSignupTypeSelectOption[]} options 선택 옵션 목록
83
+ * @property {React.ReactNode} [submitLabel] CTA 라벨
84
+ * @property {React.FormHTMLAttributes<HTMLFormElement>} [formAttr] form attr
85
+ * @property {SubmitHandler<AuthSignupTypeSelectValues>} onSubmit 제출 핸들러
86
+ */
87
+ export interface AuthSignupTypeSelectProps {
88
+ /**
89
+ * 선택 옵션 목록
90
+ */
91
+ options: AuthSignupTypeSelectOption[];
92
+ /**
93
+ * CTA 라벨
94
+ */
95
+ submitLabel?: ReactNode;
96
+ /**
97
+ * form attr
98
+ */
99
+ formAttr?: React.FormHTMLAttributes<HTMLFormElement>;
100
+ /**
101
+ * 제출 핸들러
102
+ */
103
+ onSubmit: SubmitHandler<AuthSignupTypeSelectValues>;
104
+ }
105
+
106
+ /**
107
+ * 회원가입 폼 전체 값; 유형/본인확인/농장코드/계정 생성 값을 포함한다.
108
+ */
109
+ export type AuthSignupFormValues = AuthSignupTypeSelectValues &
110
+ AuthSignupUserInfoValues &
111
+ AuthSignupFarmCodeValues &
37
112
  AuthSignupVerificationValues &
38
113
  AuthSignupAccountValues;
39
114
 
@@ -270,6 +345,112 @@ export interface AuthSignupVerificationProps {
270
345
  onSubmit: SubmitHandler<AuthSignupVerificationValues>;
271
346
  }
272
347
 
348
+ /**
349
+ * 농장 식별번호 필드 정의.
350
+ * @property {AuthSignupFieldProps<InputProps>} farmCode 농장 식별번호 필드
351
+ */
352
+ export interface AuthSignupFarmCodeFields extends Record<
353
+ string,
354
+ AuthSignupFieldProps
355
+ > {
356
+ /**
357
+ * 농장 식별번호 필드
358
+ */
359
+ farmCode: AuthSignupFieldProps<InputProps>;
360
+ }
361
+
362
+ /**
363
+ * 농장 식별번호 값 집합.
364
+ */
365
+ export type AuthSignupFarmCodeValues = Record<string, string>;
366
+
367
+ /**
368
+ * 농장 식별번호 Step props.
369
+ * @property {AuthSignupFarmCodeFields} fields 필드 설정
370
+ * @property {React.ReactNode} [submitLabel] CTA 라벨
371
+ * @property {React.FormHTMLAttributes<HTMLFormElement>} [formAttr] form attr
372
+ * @property {SubmitHandler<AuthSignupFarmCodeValues>} onSubmit 제출 핸들러
373
+ */
374
+ export interface AuthSignupFarmCodeProps {
375
+ /**
376
+ * 필드 설정
377
+ */
378
+ fields: AuthSignupFarmCodeFields;
379
+ /**
380
+ * CTA 라벨
381
+ */
382
+ submitLabel?: ReactNode;
383
+ /**
384
+ * form attr
385
+ */
386
+ formAttr?: React.FormHTMLAttributes<HTMLFormElement>;
387
+ /**
388
+ * 제출 핸들러
389
+ */
390
+ onSubmit: SubmitHandler<AuthSignupFarmCodeValues>;
391
+ }
392
+
393
+ /**
394
+ * 약관 동의 Step props.
395
+ * @property {AuthSignupAgreementOption[]} agreements 약관 옵션 목록
396
+ * @property {AuthSignupAgreementState} agreementState 약관 체크 상태
397
+ * @property {boolean} [isThirdPartyRequired] 제3자 제공 동의 필수 여부
398
+ * @property {string} [thirdPartyAgreementId] 제3자 제공 동의 option id
399
+ * @property {(agreementId: string) => void} onToggleAgreement 단일 약관 토글
400
+ * @property {(options?: AuthSignupAgreementToggleAllOptions) => void} onToggleAll 전체 동의 토글
401
+ * @property {(agreementId: string) => void} [onOpenAgreementDetail] 약관 상세 열기
402
+ * @property {React.ReactNode} [submitLabel] CTA 라벨
403
+ * @property {boolean} [submitDisabled] CTA disabled override
404
+ * @property {React.FormHTMLAttributes<HTMLFormElement>} [formAttr] form attr
405
+ * @property {() => void} onSubmit 제출 핸들러
406
+ */
407
+ export interface AuthSignupAgreementProps {
408
+ /**
409
+ * 약관 옵션 목록
410
+ */
411
+ agreements: AuthSignupAgreementOption[];
412
+ /**
413
+ * 약관 체크 상태
414
+ */
415
+ agreementState: AuthSignupAgreementState;
416
+ /**
417
+ * 제3자 제공 동의 필수 여부
418
+ */
419
+ isThirdPartyRequired?: boolean;
420
+ /**
421
+ * 제3자 제공 동의 option id
422
+ */
423
+ thirdPartyAgreementId?: string;
424
+ /**
425
+ * 단일 약관 토글
426
+ */
427
+ onToggleAgreement: (agreementId: string) => void;
428
+ /**
429
+ * 전체 동의 토글
430
+ */
431
+ onToggleAll: (options?: AuthSignupAgreementToggleAllOptions) => void;
432
+ /**
433
+ * 약관 상세 열기
434
+ */
435
+ onOpenAgreementDetail?: (agreementId: string) => void;
436
+ /**
437
+ * CTA 라벨
438
+ */
439
+ submitLabel?: ReactNode;
440
+ /**
441
+ * CTA disabled override
442
+ */
443
+ submitDisabled?: boolean;
444
+ /**
445
+ * form attr
446
+ */
447
+ formAttr?: React.FormHTMLAttributes<HTMLFormElement>;
448
+ /**
449
+ * 제출 핸들러
450
+ */
451
+ onSubmit: () => void;
452
+ }
453
+
273
454
  /**
274
455
  * 계정 정보(아이디/비밀번호) 필드 정의.
275
456
  * @interface AuthSignupAccountFields
@@ -367,9 +548,14 @@ export interface AuthSignupCompleteProps {
367
548
  * Step 식별자.
368
549
  */
369
550
  export type AuthSignupStepId =
551
+ | "typeSelect"
552
+ | "identity"
553
+ | "farmCode"
554
+ | "agreement"
370
555
  | "userInfo"
371
556
  | "verifyAgreement"
372
557
  | "generateAccount"
558
+ | "account"
373
559
  | "complete";
374
560
 
375
561
  /**
@@ -440,11 +626,27 @@ export interface AuthSignupStepIndicatorProps {
440
626
  */
441
627
  export interface AuthSignupFlowProps {
442
628
  /**
443
- * 사용자 정보 Step
629
+ * 가입 유형 선택 Step
630
+ */
631
+ typeSelect?: AuthSignupTypeSelectProps;
632
+ /**
633
+ * 본인 확인 Step
634
+ */
635
+ identity?: AuthSignupUserInfoProps;
636
+ /**
637
+ * 농장 식별번호 Step
638
+ */
639
+ farmCode?: AuthSignupFarmCodeProps;
640
+ /**
641
+ * 약관 동의 Step
642
+ */
643
+ agreement?: AuthSignupAgreementProps;
644
+ /**
645
+ * 사용자 정보 Step(legacy)
444
646
  */
445
647
  userInfo: AuthSignupUserInfoProps;
446
648
  /**
447
- * 인증 Step
649
+ * 인증 Step(legacy)
448
650
  */
449
651
  verification: AuthSignupVerificationProps;
450
652
  /**
@@ -465,6 +667,10 @@ export interface AuthSignupTemplateProps extends AuthSignupFlowProps {
465
667
  * 래퍼 className
466
668
  */
467
669
  className?: string;
670
+ /**
671
+ * 현재 가입 유형
672
+ */
673
+ signupType?: AuthSignupTypeValue;
468
674
  /**
469
675
  * 헤더 구성
470
676
  */
@@ -1,6 +1,9 @@
1
1
  .uds-modal-container {
2
- display: flex;
3
- flex-direction: column;
2
+ // 변경: modal surface의 max-height 안에서 header/body/footer 3행 계약을 고정한다.
3
+ display: grid;
4
+ grid-template-rows: auto minmax(0, 1fr) auto;
5
+ flex: 1 1 auto;
6
+ min-height: 0;
4
7
  width: 100%;
5
8
  }
6
9
 
@@ -9,11 +12,23 @@
9
12
  padding: 0;
10
13
  margin: 0;
11
14
  }
15
+
16
+ .uds-modal-header {
17
+ grid-row: 1;
18
+ }
19
+
20
+ .uds-modal-body {
21
+ // 변경: body만 남는 높이를 차지하고 내부 스크롤을 담당한다.
22
+ grid-row: 2;
23
+ min-height: 0;
24
+ overflow: auto;
25
+ }
12
26
  .uds-modal-header-close-button {
13
27
  font-size: 0;
14
28
  }
15
29
 
16
30
  .uds-modal-footer {
31
+ grid-row: 3;
17
32
  padding: 0;
18
33
  border-top: none;
19
34
  }