@amineslab/ui 0.1.0-next.20260925131012 → 0.1.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.
Files changed (89) hide show
  1. package/dist/form-fields-B1bIqSFO.d.cts +517 -0
  2. package/dist/form-fields-B1bIqSFO.d.ts +517 -0
  3. package/dist/label-1M8BaNQZ.d.cts +573 -0
  4. package/dist/label-1M8BaNQZ.d.ts +573 -0
  5. package/dist/label-B5sC6OFk.d.cts +565 -0
  6. package/dist/label-B5sC6OFk.d.ts +565 -0
  7. package/dist/label-BALpBplm.d.cts +565 -0
  8. package/dist/label-BALpBplm.d.ts +565 -0
  9. package/dist/label-BEgWK5BT.d.cts +588 -0
  10. package/dist/label-BEgWK5BT.d.ts +588 -0
  11. package/dist/label-BOY-jYQ0.d.cts +581 -0
  12. package/dist/label-BOY-jYQ0.d.ts +581 -0
  13. package/dist/label-BPY4z_UR.d.cts +588 -0
  14. package/dist/label-BPY4z_UR.d.ts +588 -0
  15. package/dist/label-BTlFxyV0.d.cts +586 -0
  16. package/dist/label-BTlFxyV0.d.ts +586 -0
  17. package/dist/label-BoJzJasZ.d.cts +582 -0
  18. package/dist/label-BoJzJasZ.d.ts +582 -0
  19. package/dist/label-BzBMyN3M.d.cts +577 -0
  20. package/dist/label-BzBMyN3M.d.ts +577 -0
  21. package/dist/label-C25JWmwg.d.cts +575 -0
  22. package/dist/label-C25JWmwg.d.ts +575 -0
  23. package/dist/label-C39geBGu.d.cts +569 -0
  24. package/dist/label-C39geBGu.d.ts +569 -0
  25. package/dist/label-CFa7H0MJ.d.cts +581 -0
  26. package/dist/label-CFa7H0MJ.d.ts +581 -0
  27. package/dist/label-CHN6RDds.d.cts +570 -0
  28. package/dist/label-CHN6RDds.d.ts +570 -0
  29. package/dist/label-CR4YDuK3.d.cts +576 -0
  30. package/dist/label-CR4YDuK3.d.ts +576 -0
  31. package/dist/label-CVCQcIB5.d.cts +581 -0
  32. package/dist/label-CVCQcIB5.d.ts +581 -0
  33. package/dist/label-Ccb4jRcY.d.cts +588 -0
  34. package/dist/label-Ccb4jRcY.d.ts +588 -0
  35. package/dist/label-CkBy2dW7.d.cts +591 -0
  36. package/dist/label-CkBy2dW7.d.ts +591 -0
  37. package/dist/label-CpDbegkn.d.cts +555 -0
  38. package/dist/label-CpDbegkn.d.ts +555 -0
  39. package/dist/label-D1UMApWv.d.cts +598 -0
  40. package/dist/label-D1UMApWv.d.ts +598 -0
  41. package/dist/label-DGHM7QEj.d.cts +591 -0
  42. package/dist/label-DGHM7QEj.d.ts +591 -0
  43. package/dist/label-DaXK-RuI.d.cts +576 -0
  44. package/dist/label-DaXK-RuI.d.ts +576 -0
  45. package/dist/label-DbfulioI.d.cts +581 -0
  46. package/dist/label-DbfulioI.d.ts +581 -0
  47. package/dist/label-DeyDJRuK.d.cts +600 -0
  48. package/dist/label-DeyDJRuK.d.ts +600 -0
  49. package/dist/label-Dx8QsMPn.d.cts +598 -0
  50. package/dist/label-Dx8QsMPn.d.ts +598 -0
  51. package/dist/label-Dz0DrmrO.d.cts +588 -0
  52. package/dist/label-Dz0DrmrO.d.ts +588 -0
  53. package/dist/label-DziZP2VL.d.cts +590 -0
  54. package/dist/label-DziZP2VL.d.ts +590 -0
  55. package/dist/label-FFoDgC1Z.d.cts +583 -0
  56. package/dist/label-FFoDgC1Z.d.ts +583 -0
  57. package/dist/label-NUIyafzR.d.cts +588 -0
  58. package/dist/label-NUIyafzR.d.ts +588 -0
  59. package/dist/label-NwHLobGQ.d.cts +590 -0
  60. package/dist/label-NwHLobGQ.d.ts +590 -0
  61. package/dist/label-SoZfJG7i.d.cts +571 -0
  62. package/dist/label-SoZfJG7i.d.ts +571 -0
  63. package/dist/label-YrBpLATh.d.cts +570 -0
  64. package/dist/label-YrBpLATh.d.ts +570 -0
  65. package/dist/label-Z97Pco2v.d.cts +567 -0
  66. package/dist/label-Z97Pco2v.d.ts +567 -0
  67. package/dist/label-a0g6Y_Q8.d.cts +543 -0
  68. package/dist/label-a0g6Y_Q8.d.ts +543 -0
  69. package/dist/label-gpy0nv42.d.cts +598 -0
  70. package/dist/label-gpy0nv42.d.ts +598 -0
  71. package/dist/label-ixshRIuw.d.cts +569 -0
  72. package/dist/label-ixshRIuw.d.ts +569 -0
  73. package/dist/label-voR-52GX.d.cts +588 -0
  74. package/dist/label-voR-52GX.d.ts +588 -0
  75. package/dist/use-submit-guard-AFkewFH5.d.cts +600 -0
  76. package/dist/use-submit-guard-AFkewFH5.d.ts +600 -0
  77. package/dist/use-submit-guard-BhJ0rrq_.d.cts +562 -0
  78. package/dist/use-submit-guard-BhJ0rrq_.d.ts +562 -0
  79. package/dist/use-submit-guard-D-knm_JT.d.cts +600 -0
  80. package/dist/use-submit-guard-D-knm_JT.d.ts +600 -0
  81. package/dist/use-submit-guard-D1dbZ2fP.d.cts +600 -0
  82. package/dist/use-submit-guard-D1dbZ2fP.d.ts +600 -0
  83. package/dist/use-submit-guard-DAoHfwqu.d.cts +600 -0
  84. package/dist/use-submit-guard-DAoHfwqu.d.ts +600 -0
  85. package/dist/use-submit-guard-DyOToVDM.d.cts +600 -0
  86. package/dist/use-submit-guard-DyOToVDM.d.ts +600 -0
  87. package/dist/use-submit-guard-P8ekrSuw.d.cts +600 -0
  88. package/dist/use-submit-guard-P8ekrSuw.d.ts +600 -0
  89. package/package.json +1 -1
@@ -0,0 +1,590 @@
1
+ import * as class_variance_authority_types from 'class-variance-authority/types';
2
+ import { VariantProps } from 'class-variance-authority';
3
+ import * as React from 'react';
4
+ import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
5
+ import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
6
+ import * as SelectPrimitive from '@radix-ui/react-select';
7
+
8
+ type FieldControlVariant = 'filled' | 'outline';
9
+ declare const fieldControlVariants: (props?: ({
10
+ variant?: "outline" | "filled" | null | undefined;
11
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
12
+ type FieldControlVariants = VariantProps<typeof fieldControlVariants>;
13
+
14
+ /** FileUpload와 PhotoField가 공유하는 drop surface 표현입니다. */
15
+ type FileDropzoneVariant = FieldControlVariant;
16
+ /** 레이아웃은 소유하지 않고 표면·focus·drag·invalid 상태만 제공하는 공통 variant입니다. */
17
+ declare const fileDropzoneVariants: (props?: ({
18
+ variant?: "outline" | "filled" | null | undefined;
19
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
20
+ type FileDropzoneVariants = VariantProps<typeof fileDropzoneVariants>;
21
+
22
+ /** FileInput·FileUpload·FilePicker가 공유하는 파일 모델과 검증 함수. */
23
+ type FileItem = {
24
+ kind: 'local';
25
+ file: File;
26
+ id: string;
27
+ } | {
28
+ kind: 'remote';
29
+ name: string;
30
+ url: string;
31
+ size?: number;
32
+ mimeType?: string;
33
+ id?: string;
34
+ };
35
+ type FileErrorReason = 'too-large' | 'invalid-type' | 'too-many';
36
+ interface FileError {
37
+ fileName: string;
38
+ reason: FileErrorReason;
39
+ message: string;
40
+ }
41
+ declare function getFileName(item: FileItem): string;
42
+ declare function getFileSize(item: FileItem): number | undefined;
43
+ declare function getItemKey(item: FileItem): string;
44
+ declare function formatBytes(bytes: number): string;
45
+ /** MIME type, MIME glob, 확장자를 모두 지원하는 accept 매칭. */
46
+ declare function matchesAccept(file: File, accept?: string): boolean;
47
+ declare function newLocalId(): string;
48
+ declare function isImageFile(item: FileItem): boolean;
49
+ declare function isPdfFile(item: FileItem): boolean;
50
+
51
+ declare const fileInputVariants: (props?: ({
52
+ size?: "sm" | "md" | "lg" | null | undefined;
53
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
54
+ interface FileInputProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue' | 'onError'>, VariantProps<typeof fileInputVariants> {
55
+ variant?: 'filled' | 'outline';
56
+ value?: FileItem[];
57
+ defaultValue?: FileItem[];
58
+ onChange?: (files: FileItem[]) => void;
59
+ multiple?: boolean;
60
+ accept?: string;
61
+ maxSize?: number;
62
+ maxFiles?: number;
63
+ disabled?: boolean;
64
+ uploading?: boolean;
65
+ onError?: (errors: FileError[]) => void;
66
+ placeholder?: React.ReactNode;
67
+ triggerLabel?: React.ReactNode;
68
+ invalid?: boolean;
69
+ id?: string;
70
+ }
71
+ /** 한 줄 폼 리듬에 맞춘 파일 선택기. DnD가 필요하면 FileUpload를 사용한다. */
72
+ declare const FileInput: React.ForwardRefExoticComponent<FileInputProps & React.RefAttributes<HTMLDivElement>>;
73
+
74
+ declare const fileDropAreaVariants: (props?: ({
75
+ variant?: "outline" | "filled" | null | undefined;
76
+ size?: "sm" | "md" | "lg" | null | undefined;
77
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
78
+ interface FileUploadProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue' | 'onError'>, Omit<VariantProps<typeof fileDropAreaVariants>, 'variant'> {
79
+ variant?: FileDropzoneVariant;
80
+ value?: FileItem[];
81
+ defaultValue?: FileItem[];
82
+ onChange?: (files: FileItem[]) => void;
83
+ multiple?: boolean;
84
+ accept?: string;
85
+ maxSize?: number;
86
+ maxFiles?: number;
87
+ disabled?: boolean;
88
+ uploading?: boolean;
89
+ onError?: (errors: FileError[]) => void;
90
+ placeholder?: React.ReactNode;
91
+ helpText?: React.ReactNode;
92
+ invalid?: boolean;
93
+ itemsClassName?: string;
94
+ itemsPlacement?: 'outside' | 'inside';
95
+ id?: string;
96
+ }
97
+ /** 클릭·키보드·드래그앤드롭과 로컬/원격 미리보기를 하나의 파일 수명주기로 묶는다. */
98
+ declare const FileUpload: React.ForwardRefExoticComponent<FileUploadProps & React.RefAttributes<HTMLDivElement>>;
99
+
100
+ /**
101
+ * 단일 날짜 선택기 — `Popover` + 트리거 `Button`(outline) + `Calendar` 조합.
102
+ * value/onChange 는 `YYYY-MM-DD` 문자열(`includeTime` 시 `YYYY-MM-DDTHH:mm`)을 주고받는다.
103
+ * controlled 컴포넌트이므로 호출부에서 상태를 관리한다 — react-hook-form 연동은
104
+ * `<FormField render={({ field }) => <DatePicker value={field.value} onChange={field.onChange} />} />`.
105
+ */
106
+ interface DatePickerProps {
107
+ /** YYYY-MM-DD 문자열 (includeTime 시 YYYY-MM-DDTHH:mm) */
108
+ value?: string;
109
+ onChange?: (value: string) => void;
110
+ placeholder?: string;
111
+ disabled?: boolean;
112
+ /** 선택 가능한 최소 날짜 (YYYY-MM-DD) */
113
+ minDate?: string;
114
+ /** 선택 가능한 최대 날짜 (YYYY-MM-DD) */
115
+ maxDate?: string;
116
+ /** 시간(HH:mm)까지 선택한다. value 형식이 YYYY-MM-DDTHH:mm 으로 바뀐다. */
117
+ includeTime?: boolean;
118
+ /** 팝오버/드로어가 닫힐 때(편집 완료) 호출. 소비측이 시작↔종료 정합성 보정 등에 쓴다. */
119
+ onClose?: () => void;
120
+ /** true면 danger 상태 outline과 `aria-invalid`를 적용한다. */
121
+ invalid?: boolean;
122
+ /** 기본은 부모 면 위 alpha surface, 명시적 경계가 필요하면 outline을 선택한다. */
123
+ variant?: FieldControlVariant;
124
+ /** FormControl이 주입하는 설명/오류 메시지 연결 ID. 실제 트리거에 전달한다. */
125
+ 'aria-describedby'?: string;
126
+ /** 필수 입력 상태를 실제 트리거에 전달한다. */
127
+ 'aria-required'?: React.AriaAttributes['aria-required'];
128
+ /** FormControl이 주입하는 invalid 상태. `invalid`와 병합해 실제 트리거에 전달한다. */
129
+ 'aria-invalid'?: React.AriaAttributes['aria-invalid'];
130
+ /** 트리거가 포커스를 잃을 때 호출합니다. RHF touched 처리에 사용합니다. */
131
+ onBlur?: React.FocusEventHandler<HTMLButtonElement>;
132
+ className?: string;
133
+ id?: string;
134
+ }
135
+ declare const DatePicker: React.ForwardRefExoticComponent<DatePickerProps & React.RefAttributes<HTMLButtonElement>>;
136
+
137
+ /**
138
+ * 시작일/종료일을 선택하는 날짜 범위 입력기 — `Calendar`(range mode).
139
+ * 기본은 `DatePicker` 와 같은 1개월 뷰이고, `numberOfMonths={2}` 로 2개월을 좌우로 펼친다.
140
+ * value/onChange 는 `{ from, to }` (각각 `YYYY-MM-DD` 문자열, 미선택 시 빈 문자열)을 주고받는다.
141
+ * `includeTime` 시 `from`/`to` 형식이 `YYYY-MM-DDTHH:mm` 으로 바뀐다.
142
+ *
143
+ * **반응형 캡슐화** — 데스크톱은 `Popover`, 모바일은 vaul `Drawer`(content-height, multi-detent)
144
+ * 로 풀폭 캘린더를 띄운다. 사용처는 분기 없이 한 번만 쓴다.
145
+ *
146
+ * **C2 전면 전환(plan 079)**: 이미 시트 안(`useInSheetPanel`)에서 열릴 때 종전엔 인라인
147
+ * `Collapsible` 아코디언으로 펼쳤으나, 본 플랜에서 **중첩 content-height 시트**(vaul NestedRoot)로
148
+ * 띄운다. nested 전환은 `Drawer` 프리미티브 내부에서 `useInSheetPanel()` 자동 감지로 처리되므로,
149
+ * 모바일이면 시트 안/밖 무관하게 동일하게 `Drawer` 를 렌더한다(`Combobox`·`Select` 와 동일 패턴).
150
+ *
151
+ * `to >= from` 같은 기간 정합성은 컴포넌트가 강제하지 않는다 — 소비측 zod refine 책임.
152
+ */
153
+ interface DateRange {
154
+ /** YYYY-MM-DD 문자열 (includeTime 시 YYYY-MM-DDTHH:mm), 미선택 시 빈 문자열 */
155
+ from: string;
156
+ /** YYYY-MM-DD 문자열 (includeTime 시 YYYY-MM-DDTHH:mm), 미선택 시 빈 문자열 */
157
+ to: string;
158
+ }
159
+ interface DateRangePickerProps {
160
+ value: DateRange;
161
+ onChange: (range: DateRange) => void;
162
+ placeholder?: string;
163
+ disabled?: boolean;
164
+ /** 시작·종료 시간(HH:mm)까지 선택한다. value.from/to 형식이 YYYY-MM-DDTHH:mm 으로 바뀐다. */
165
+ includeTime?: boolean;
166
+ /** 캘린더에 펼칠 개월 수. 기본 1(DatePicker 와 동일한 단일 뷰), 2 로 두 달을 좌우로 펼친다. */
167
+ numberOfMonths?: 1 | 2;
168
+ /**
169
+ * 트리거+팝오버 대신 **캘린더를 그 자리에 인라인**으로 렌더한다(중첩 오버레이 회피).
170
+ * 모바일 필터 시트처럼 이미 떠 있는 표면 안에서 날짜를 고를 때 사용 — 시트 위에 또
171
+ * 작은 팝오버를 띄우지 않는다(연구 권고). `className` 은 인라인 래퍼에 적용된다.
172
+ */
173
+ inline?: boolean;
174
+ /** true면 danger 상태 outline과 `aria-invalid`를 적용한다. */
175
+ invalid?: boolean;
176
+ /** 기본은 부모 면 위 alpha surface, 명시적 경계가 필요하면 outline을 선택한다. */
177
+ variant?: FieldControlVariant;
178
+ /** FormControl이 주입하는 설명/오류 메시지 연결 ID. 실제 트리거에 전달한다. */
179
+ 'aria-describedby'?: string;
180
+ /** 필수 입력 상태를 실제 트리거에 전달한다. */
181
+ 'aria-required'?: React.AriaAttributes['aria-required'];
182
+ /** FormControl이 주입하는 invalid 상태. `invalid`와 병합해 실제 트리거에 전달한다. */
183
+ 'aria-invalid'?: React.AriaAttributes['aria-invalid'];
184
+ /** inline 캘린더 group의 접근 가능한 이름. 트리거 모드에서는 필요하지 않다. */
185
+ 'aria-label'?: string;
186
+ /** inline 캘린더 group을 외부 제목에 연결한다. */
187
+ 'aria-labelledby'?: string;
188
+ /** 트리거가 포커스를 잃을 때 호출합니다. RHF touched 처리에 사용합니다. */
189
+ onBlur?: React.FocusEventHandler<HTMLButtonElement>;
190
+ className?: string;
191
+ id?: string;
192
+ }
193
+ declare const DateRangePicker: React.ForwardRefExoticComponent<DateRangePickerProps & React.RefAttributes<HTMLButtonElement>>;
194
+
195
+ /**
196
+ * 시간 단독 선택 — PC Popover + 시·분 dropdown / 모바일 bottom Drawer(시·분 리스트).
197
+ *
198
+ * `DatePicker` 의 짝꿍. value/onChange 는 `'HH:mm'` 24 시간 문자열을 주고받는다.
199
+ * `DatePicker` 의 `includeTime` 은 날짜와 시간을 함께 선택하지만, 시간만 필요한 폼
200
+ * (회의 시작 시각·약속 시간 등) 에는 본 컴포넌트가 더 가볍다.
201
+ *
202
+ * - 좌측 `Clock` 아이콘 (`DatePicker` 의 캘린더 아이콘과 동일 위치)
203
+ * - **PC**: native `<select>`(시/분) Popover — 마우스 친화, 기존 동작 유지.
204
+ * - **모바일(plan 079 C4)**: vaul `Drawer` 안 시·분 2열 리스트(`SelectableOption`) — 네이티브
205
+ * `<select>` popover 제거(모바일 popover 0 완성). 시트 안에서 열리면 `Drawer` 가 자동으로
206
+ * 중첩 시트(NestedRoot)로 뜬다(C1·C2).
207
+ * - `step` 으로 분 단위 제어 (1·5·10·15·30 등)
208
+ * - `minTime` / `maxTime` 로 선택 가능 범위 제약 — 옵션 목록을 동적으로 필터
209
+ * - `Button` outline 트리거 (`DatePicker` 와 동일 시각)
210
+ */
211
+ interface TimeInputProps {
212
+ /** `'HH:mm'` 24시간 문자열 */
213
+ value?: string;
214
+ onChange?: (value: string) => void;
215
+ placeholder?: string;
216
+ disabled?: boolean;
217
+ /** 선택 가능한 최소 시간 (`'HH:mm'`). */
218
+ minTime?: string;
219
+ /** 선택 가능한 최대 시간 (`'HH:mm'`). */
220
+ maxTime?: string;
221
+ /** 분 단위 step (1·5·10·15·30 등). 기본 1. */
222
+ step?: number;
223
+ /** 트리거 사이즈 (Button 과 동일 척도). */
224
+ size?: 'sm' | 'md' | 'lg';
225
+ /** invalid 시 destructive 보더. */
226
+ invalid?: boolean;
227
+ /** FormControl이 주입하는 설명/오류 메시지 연결 ID. 실제 트리거에 전달한다. */
228
+ 'aria-describedby'?: string;
229
+ /** 필수 입력 상태를 실제 트리거에 전달한다. */
230
+ 'aria-required'?: React.AriaAttributes['aria-required'];
231
+ /** FormControl이 주입하는 invalid 상태. `invalid`와 병합해 실제 트리거에 전달한다. */
232
+ 'aria-invalid'?: React.AriaAttributes['aria-invalid'];
233
+ /** 트리거가 포커스를 잃을 때 호출합니다. RHF touched 처리에 사용합니다. */
234
+ onBlur?: React.FocusEventHandler<HTMLButtonElement>;
235
+ /** 기본은 부모 면 위 alpha surface, 명시적 경계가 필요하면 outline을 선택한다. */
236
+ variant?: FieldControlVariant;
237
+ className?: string;
238
+ id?: string;
239
+ }
240
+ declare const TimeInput: React.ForwardRefExoticComponent<TimeInputProps & React.RefAttributes<HTMLButtonElement>>;
241
+
242
+ declare const checkboxVariants: (props?: ({
243
+ size?: "sm" | "md" | "lg" | null | undefined;
244
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
245
+ interface CheckboxProps extends React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>, VariantProps<typeof checkboxVariants> {
246
+ label?: React.ReactNode;
247
+ indeterminate?: boolean;
248
+ }
249
+ declare const Checkbox: React.ForwardRefExoticComponent<CheckboxProps & React.RefAttributes<HTMLButtonElement>>;
250
+
251
+ declare const inputVariants: (props?: ({
252
+ size?: "sm" | "md" | "lg" | null | undefined;
253
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
254
+ interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>, VariantProps<typeof inputVariants> {
255
+ variant?: FieldControlVariant;
256
+ invalid?: boolean;
257
+ leftSlot?: React.ReactNode;
258
+ rightSlot?: React.ReactNode;
259
+ wrapperClassName?: string;
260
+ }
261
+ interface InputFrameProps extends React.HTMLAttributes<HTMLDivElement> {
262
+ leftSlot?: React.ReactNode;
263
+ rightSlot?: React.ReactNode;
264
+ disabled?: boolean;
265
+ }
266
+ declare const InputFrame: React.ForwardRefExoticComponent<InputFrameProps & React.RefAttributes<HTMLDivElement>>;
267
+ declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
268
+
269
+ type InputSize = NonNullable<InputProps['size']>;
270
+
271
+ declare const radioItemVariants: (props?: ({
272
+ size?: "sm" | "md" | "lg" | null | undefined;
273
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
274
+ declare const RadioGroupRoot: React.ForwardRefExoticComponent<Omit<RadioGroupPrimitive.RadioGroupProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
275
+ label?: React.ReactNode;
276
+ } & React.RefAttributes<HTMLDivElement>>;
277
+ interface RadioGroupItemProps extends React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>, VariantProps<typeof radioItemVariants> {
278
+ label?: React.ReactNode;
279
+ }
280
+ declare const RadioGroupItem: React.ForwardRefExoticComponent<RadioGroupItemProps & React.RefAttributes<HTMLButtonElement>>;
281
+ declare const RadioGroup: React.ForwardRefExoticComponent<Omit<RadioGroupPrimitive.RadioGroupProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
282
+ label?: React.ReactNode;
283
+ } & React.RefAttributes<HTMLDivElement>> & {
284
+ Root: React.ForwardRefExoticComponent<Omit<RadioGroupPrimitive.RadioGroupProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
285
+ label?: React.ReactNode;
286
+ } & React.RefAttributes<HTMLDivElement>>;
287
+ Item: React.ForwardRefExoticComponent<RadioGroupItemProps & React.RefAttributes<HTMLButtonElement>>;
288
+ };
289
+ type RadioGroupProps = React.ComponentPropsWithoutRef<typeof RadioGroupRoot>;
290
+
291
+ declare const SelectGroup: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectGroupProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
292
+ declare const SelectValue: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectValueProps & React.RefAttributes<HTMLSpanElement>, "ref"> & React.RefAttributes<HTMLSpanElement>>;
293
+ declare const selectTriggerVariants: (props?: ({
294
+ size?: "sm" | "md" | "lg" | null | undefined;
295
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
296
+ interface SelectTriggerProps extends React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>, VariantProps<typeof selectTriggerVariants> {
297
+ variant?: FieldControlVariant;
298
+ required?: boolean;
299
+ }
300
+ declare const SelectTrigger: React.ForwardRefExoticComponent<SelectTriggerProps & React.RefAttributes<HTMLButtonElement>>;
301
+ declare const SelectScrollUpButton: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectScrollUpButtonProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
302
+ declare const SelectScrollDownButton: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectScrollDownButtonProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
303
+ declare const SelectContent: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
304
+ declare const SelectLabel: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectLabelProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
305
+ declare const SelectItem: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
306
+ declare const SelectSeparator: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectSeparatorProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
307
+ interface SelectProps extends React.ComponentPropsWithoutRef<typeof SelectPrimitive.Root> {
308
+ }
309
+ declare function Select({ value: controlled, defaultValue, onValueChange, disabled, open: openProp, defaultOpen, onOpenChange, children, ...rootProps }: SelectProps): React.JSX.Element;
310
+ declare namespace Select {
311
+ var displayName: string;
312
+ }
313
+
314
+ declare const textareaVariants: (props?: ({
315
+ size?: "sm" | "md" | "lg" | null | undefined;
316
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
317
+ interface TextareaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'>, VariantProps<typeof textareaVariants> {
318
+ resize?: TextareaResize;
319
+ showCount?: boolean;
320
+ footer?: React.ReactNode;
321
+ wrapperClassName?: string;
322
+ variant?: FieldControlVariant;
323
+ invalid?: boolean;
324
+ }
325
+ type TextareaResize = 'none' | 'vertical' | 'horizontal' | 'both';
326
+ declare const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
327
+
328
+ interface ComboboxOption {
329
+ value: string;
330
+ label: string;
331
+ keywords?: readonly string[];
332
+ disabled?: boolean;
333
+ leading?: React.ReactNode;
334
+ }
335
+ interface ComboboxProps {
336
+ options: readonly ComboboxOption[];
337
+ value?: string;
338
+ defaultValue?: string;
339
+ onValueChange?: (value: string) => void;
340
+ placeholder?: string;
341
+ searchPlaceholder?: string;
342
+ /** Accessible name for the search input inside the list surface. */
343
+ searchLabel?: string;
344
+ emptyLabel?: string;
345
+ disabled?: boolean;
346
+ invalid?: boolean;
347
+ triggerClassName?: string;
348
+ contentClassName?: string;
349
+ align?: 'start' | 'center' | 'end';
350
+ 'aria-label'?: string;
351
+ 'aria-describedby'?: string;
352
+ 'aria-required'?: React.AriaAttributes['aria-required'];
353
+ 'aria-invalid'?: React.AriaAttributes['aria-invalid'];
354
+ /** 트리거가 포커스를 잃을 때 호출합니다. RHF touched 처리에 사용합니다. */
355
+ onBlur?: React.FocusEventHandler<HTMLButtonElement>;
356
+ variant?: FieldControlVariant;
357
+ id?: string;
358
+ }
359
+ /** Searchable single selection that renders as a popover on pointer-fine screens and a Drawer on mobile. */
360
+ declare const Combobox: React.ForwardRefExoticComponent<ComboboxProps & React.RefAttributes<HTMLButtonElement>>;
361
+
362
+ declare const FormStack: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
363
+ interface FormLayoutFieldProps {
364
+ label?: React.ReactNode;
365
+ htmlFor?: string;
366
+ /** 복합 컨트롤의 accessible name을 연결할 label id입니다. */
367
+ labelId?: string;
368
+ required?: boolean;
369
+ description?: React.ReactNode;
370
+ error?: React.ReactNode;
371
+ descriptionId?: string;
372
+ errorId?: string;
373
+ labelClassName?: string;
374
+ className?: string;
375
+ children: React.ReactNode;
376
+ }
377
+ /** RHF 여부와 무관하게 라벨·설명·오류 리듬을 동일하게 유지하는 필드 레이아웃. */
378
+ declare function FormLayoutField({ children, className, description, descriptionId, error, errorId, htmlFor, label, labelId, labelClassName, required, }: FormLayoutFieldProps): React.JSX.Element;
379
+ declare namespace FormLayoutField {
380
+ var displayName: string;
381
+ }
382
+ /** Daeium의 `Field`와 같은 의미를 명시적으로 드러내는 별칭. */
383
+ declare const FieldLayout: typeof FormLayoutField;
384
+
385
+ interface NumberInputProps extends Omit<InputProps, 'type' | 'value' | 'onChange' | 'inputMode'> {
386
+ /** 천 단위 구분 기호를 표시한다. 기본값은 true다. */
387
+ commaize?: boolean;
388
+ /** 표시 문자열 정렬. */
389
+ textAlign?: 'left' | 'right';
390
+ /** 소비자가 받는 실제 숫자 값. 빈 값은 null이다. */
391
+ value?: number | null;
392
+ onChange?: (value: number | null) => void;
393
+ }
394
+ /** 표시 문자열과 실제 number 값을 분리하는 숫자 입력. */
395
+ declare const NumberInput: React.ForwardRefExoticComponent<NumberInputProps & React.RefAttributes<HTMLInputElement>>;
396
+
397
+ interface PasswordInputProps extends Omit<InputProps, 'type'> {
398
+ showToggle?: boolean;
399
+ }
400
+ /** 비밀번호 표시 상태를 키보드·스크린리더와 함께 제공하는 입력. */
401
+ declare const PasswordInput: React.ForwardRefExoticComponent<PasswordInputProps & React.RefAttributes<HTMLInputElement>>;
402
+
403
+ interface PhoneInputProps extends Omit<InputProps, 'type' | 'value' | 'onChange' | 'inputMode'> {
404
+ value?: string;
405
+ onChange?: (value: string) => void;
406
+ onValidityChange?: (valid: boolean) => void;
407
+ }
408
+ /** 입력 중에도 캐럿 위치를 보존하는 한국 전화번호 입력. */
409
+ declare const PhoneInput: React.ForwardRefExoticComponent<PhoneInputProps & React.RefAttributes<HTMLInputElement>>;
410
+
411
+ interface ManagedFieldProps<Value> extends Omit<FormLayoutFieldProps, 'children' | 'className'> {
412
+ /** 필드 레이아웃에만 적용할 클래스. `className`은 실제 컨트롤에 전달됩니다. */
413
+ containerClassName?: string;
414
+ value?: Value;
415
+ onChange?: (value: Value) => void;
416
+ onAfterChange?: (value: Value) => void;
417
+ }
418
+ interface TextFieldProps extends ManagedFieldProps<string>, Omit<InputProps, 'value' | 'onChange' | 'size'> {
419
+ size?: InputProps['size'];
420
+ submitOnEnter?: boolean;
421
+ }
422
+ declare const TextField: React.ForwardRefExoticComponent<TextFieldProps & React.RefAttributes<HTMLInputElement>>;
423
+ interface PasswordFieldProps extends ManagedFieldProps<string>, Omit<PasswordInputProps, 'value' | 'onChange' | 'size'> {
424
+ size?: PasswordInputProps['size'];
425
+ submitOnEnter?: boolean;
426
+ }
427
+ declare const PasswordField: React.ForwardRefExoticComponent<PasswordFieldProps & React.RefAttributes<HTMLInputElement>>;
428
+ interface NumberFieldProps extends ManagedFieldProps<number | null>, Omit<NumberInputProps, 'value' | 'onChange'> {
429
+ submitOnEnter?: boolean;
430
+ }
431
+ declare const NumberField: React.ForwardRefExoticComponent<NumberFieldProps & React.RefAttributes<HTMLInputElement>>;
432
+ interface PhoneFieldProps extends ManagedFieldProps<string>, Omit<PhoneInputProps, 'value' | 'onChange'> {
433
+ submitOnEnter?: boolean;
434
+ }
435
+ declare const PhoneField: React.ForwardRefExoticComponent<PhoneFieldProps & React.RefAttributes<HTMLInputElement>>;
436
+ interface TextareaFieldProps extends ManagedFieldProps<string>, Omit<TextareaProps, 'value' | 'onChange'> {
437
+ }
438
+ declare const TextareaField: React.ForwardRefExoticComponent<TextareaFieldProps & React.RefAttributes<HTMLTextAreaElement>>;
439
+ interface CheckboxFieldProps extends ManagedFieldProps<boolean>, Omit<CheckboxProps, 'checked' | 'onCheckedChange' | 'onChange' | 'label' | 'value'> {
440
+ invalid?: boolean;
441
+ }
442
+ declare function CheckboxField({ 'aria-describedby': ariaDescribedBy, 'aria-label': ariaLabel, 'aria-invalid': ariaInvalid, className, containerClassName, description, error, htmlFor, id, invalid, label, labelClassName, onAfterChange, onChange, required, value, ...props }: CheckboxFieldProps): React.JSX.Element;
443
+ declare namespace CheckboxField {
444
+ var displayName: string;
445
+ }
446
+ interface RadioOption extends Pick<RadioGroupItemProps, 'value' | 'disabled'> {
447
+ label: React.ReactNode;
448
+ }
449
+ interface RadioGroupFieldProps extends ManagedFieldProps<string>, Omit<React.ComponentPropsWithoutRef<typeof RadioGroup>, 'value' | 'onValueChange' | 'onChange' | 'children'> {
450
+ /** 간단한 라디오 목록을 만들 때 사용합니다. `children`과 함께 쓸 수 없습니다. */
451
+ options?: RadioOption[];
452
+ /** RadioGroupItem을 직접 조합할 때 사용합니다. */
453
+ children?: React.ReactNode;
454
+ invalid?: boolean;
455
+ }
456
+ declare function RadioGroupField({ 'aria-describedby': ariaDescribedBy, 'aria-labelledby': ariaLabelledBy, 'aria-invalid': ariaInvalid, className, containerClassName, children, description, error, htmlFor: _htmlFor, id, invalid, label, labelClassName: _labelClassName, onAfterChange, onChange, options, required, value, ...props }: RadioGroupFieldProps): React.JSX.Element;
457
+ declare namespace RadioGroupField {
458
+ var displayName: string;
459
+ }
460
+ interface SelectOption {
461
+ value: string;
462
+ label: React.ReactNode;
463
+ disabled?: boolean;
464
+ }
465
+ interface SelectFieldProps extends ManagedFieldProps<string>, Omit<React.ComponentPropsWithoutRef<typeof Select>, 'value' | 'onValueChange' | 'children'> {
466
+ options: SelectOption[];
467
+ placeholder?: string;
468
+ triggerProps?: React.ComponentPropsWithoutRef<typeof SelectTrigger>;
469
+ /** 트리거에 적용할 추가 클래스. */
470
+ className?: string;
471
+ invalid?: boolean;
472
+ 'aria-describedby'?: string;
473
+ 'aria-invalid'?: React.AriaAttributes['aria-invalid'];
474
+ }
475
+ declare function SelectField({ 'aria-describedby': ariaDescribedBy, 'aria-invalid': ariaInvalid, className, containerClassName, description, error, htmlFor: _htmlFor, invalid, label, labelClassName: _labelClassName, onAfterChange, onChange, options, placeholder, required, triggerProps, value, ...props }: SelectFieldProps): React.JSX.Element;
476
+ declare namespace SelectField {
477
+ var displayName: string;
478
+ }
479
+ /** 검색 가능한 선택 필드. Combobox가 PC Popover·모바일 Drawer 전환을 소유한다. */
480
+ interface ComboboxFieldProps extends ManagedFieldProps<string>, Omit<ComboboxProps, 'value' | 'onValueChange' | 'defaultValue' | 'invalid'> {
481
+ invalid?: boolean;
482
+ }
483
+ declare function ComboboxField({ 'aria-describedby': ariaDescribedBy, 'aria-label': ariaLabel, 'aria-invalid': ariaInvalid, containerClassName, description, error, htmlFor: _htmlFor, id, invalid, label, labelClassName, onAfterChange, onChange, required, value, ...props }: ComboboxFieldProps): React.JSX.Element;
484
+ declare namespace ComboboxField {
485
+ var displayName: string;
486
+ }
487
+ interface DateFieldProps extends ManagedFieldProps<string>, Omit<DatePickerProps, 'value' | 'onChange'> {
488
+ }
489
+ declare function DateField({ 'aria-describedby': ariaDescribedBy, 'aria-invalid': ariaInvalid, className, containerClassName, description, id, error, htmlFor, invalid, label, labelClassName, onAfterChange, onChange, required, value, ...props }: DateFieldProps): React.JSX.Element;
490
+ declare namespace DateField {
491
+ var displayName: string;
492
+ }
493
+ interface TimeFieldProps extends ManagedFieldProps<string>, Omit<TimeInputProps, 'value' | 'onChange'> {
494
+ }
495
+ declare function TimeField({ 'aria-describedby': ariaDescribedBy, 'aria-invalid': ariaInvalid, className, containerClassName, description, id, error, htmlFor, invalid, label, labelClassName, onAfterChange, onChange, required, value, ...props }: TimeFieldProps): React.JSX.Element;
496
+ declare namespace TimeField {
497
+ var displayName: string;
498
+ }
499
+ interface DateRangeFieldProps extends ManagedFieldProps<DateRange>, Omit<DateRangePickerProps, 'value' | 'onChange'> {
500
+ }
501
+ declare function DateRangeField({ 'aria-describedby': ariaDescribedBy, 'aria-invalid': ariaInvalid, className, containerClassName, description, id, error, htmlFor, invalid, label, labelClassName, onAfterChange, onChange, required, value, ...props }: DateRangeFieldProps): React.JSX.Element;
502
+ declare namespace DateRangeField {
503
+ var displayName: string;
504
+ }
505
+ type LunarConvertChoice = 'replace' | 'flag';
506
+ declare function resolveLunarConvertPreview(choice: LunarConvertChoice, current: string, converted: string): string;
507
+ interface LunarConvertDialogProps {
508
+ open: boolean;
509
+ next: boolean;
510
+ current: string;
511
+ converted: string;
512
+ onConfirm: (choice: LunarConvertChoice) => void;
513
+ onCancel: () => void;
514
+ }
515
+ /** 음력 토글의 치환/표기만 선택 UI. 날짜 변환 라이브러리는 호출부가 주입한다. */
516
+ declare function LunarConvertDialog({ open, next, current, converted, onCancel, onConfirm, }: LunarConvertDialogProps): React.JSX.Element;
517
+ declare namespace LunarConvertDialog {
518
+ var displayName: string;
519
+ }
520
+ type LunarToggleDecision = {
521
+ mode: 'plain';
522
+ } | {
523
+ mode: 'modal';
524
+ converted: string;
525
+ };
526
+ declare function decideLunarToggle(current: string | undefined, nextLunar: boolean, convert?: (value: string, toLunar: boolean) => string | null): LunarToggleDecision;
527
+ interface LunarDateFieldProps extends Omit<DatePickerProps, 'value' | 'onChange'> {
528
+ htmlFor?: string;
529
+ containerClassName?: string;
530
+ labelClassName?: string;
531
+ value?: string;
532
+ lunar?: boolean;
533
+ onChange?: (value: string) => void;
534
+ onAfterChange?: (value: string) => void;
535
+ onLunarChange?: (value: boolean) => void;
536
+ /** RHF가 음력 플래그 컨트롤을 직접 focus·touched 처리할 때 사용하는 ref입니다. */
537
+ lunarRef?: React.Ref<HTMLButtonElement>;
538
+ /** 음력 플래그 컨트롤에서 포커스가 빠질 때 호출합니다. */
539
+ onLunarBlur?: React.FocusEventHandler<HTMLButtonElement>;
540
+ convert?: (value: string, toLunar: boolean) => string | null;
541
+ lunarLabel?: React.ReactNode;
542
+ label?: React.ReactNode;
543
+ required?: boolean;
544
+ description?: React.ReactNode;
545
+ error?: React.ReactNode;
546
+ }
547
+ /** 날짜와 음력 플래그를 한 필드로 보여주며, 변환은 주입된 순수 함수로 확인한다. */
548
+ declare function LunarDateField({ 'aria-describedby': ariaDescribedBy, 'aria-invalid': ariaInvalid, containerClassName, convert, description, error, htmlFor, id, invalid, label, labelClassName, lunar, lunarLabel, lunarRef, onLunarBlur, onAfterChange, onChange, onLunarChange, required, value, ...dateProps }: LunarDateFieldProps): React.JSX.Element;
549
+ declare namespace LunarDateField {
550
+ var displayName: string;
551
+ }
552
+
553
+ /** 폼 검증 오류에서 사용자에게 보여 줄 첫 번째 메시지를 찾는다. */
554
+ declare function firstInvalidMessage(errors: unknown): string | null;
555
+ interface InvalidSubmitOptions {
556
+ /** 제품의 toast·알림 시스템을 주입한다. 생략하면 메시지를 반환하기만 한다. */
557
+ notify?: (message: string) => void;
558
+ fallback?: string;
559
+ }
560
+ /** 숨겨진/조건부 필드 때문에 조용히 실패하는 제출을 보완하는 프레임워크 독립 핸들러. */
561
+ declare function reportInvalidSubmit(errors: unknown, { fallback, notify }?: InvalidSubmitOptions): string;
562
+
563
+ interface SubmitGuardSchema {
564
+ safeParse: (value: unknown) => {
565
+ success: boolean;
566
+ };
567
+ }
568
+ interface SubmitGuardOptions {
569
+ busy?: boolean;
570
+ busyReason?: string;
571
+ incompleteReason?: string;
572
+ }
573
+ interface SubmitGuard {
574
+ canSubmit: boolean;
575
+ complete: boolean;
576
+ reason: string | null;
577
+ }
578
+ /**
579
+ * 검증 스키마와 현재 값을 연결하는 프레임워크 독립 제출 게이트.
580
+ * React Hook Form 연결은 optional subpath에서 values를 구독해 이 훅에 넘긴다.
581
+ */
582
+ declare function useSubmitGuard(values: unknown, schema: SubmitGuardSchema, { busy, busyReason, incompleteReason }?: SubmitGuardOptions): SubmitGuard;
583
+
584
+ interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {
585
+ asChild?: boolean;
586
+ }
587
+ /** Standalone label. Use Field.Label when the surrounding Field owns IDs and validation. */
588
+ declare const Label: React.ForwardRefExoticComponent<LabelProps & React.RefAttributes<HTMLLabelElement>>;
589
+
590
+ export { Label as $, type DateRangePickerProps as A, type FieldControlVariants as B, type CheckboxFieldProps as C, type DateFieldProps as D, FieldLayout as E, type FileInputProps as F, type FileDropzoneVariant as G, type FileDropzoneVariants as H, type InputProps as I, type FileError as J, type FileErrorReason as K, type LabelProps as L, FileInput as M, type NumberFieldProps as N, type FileItem as O, type PasswordFieldProps as P, FileUpload as Q, type RadioGroupFieldProps as R, type SubmitGuardOptions as S, type TextFieldProps as T, FormLayoutField as U, type FormLayoutFieldProps as V, FormStack as W, Input as X, InputFrame as Y, type InputSize as Z, type InvalidSubmitOptions as _, type ComboboxFieldProps as a, type LunarConvertChoice as a0, LunarConvertDialog as a1, type LunarConvertDialogProps as a2, LunarDateField as a3, type LunarToggleDecision as a4, NumberField as a5, NumberInput as a6, type NumberInputProps as a7, PasswordField as a8, PasswordInput as a9, TextareaField as aA, type TextareaProps as aB, type TextareaResize as aC, TimeField as aD, TimeInput as aE, type TimeInputProps as aF, checkboxVariants as aG, decideLunarToggle as aH, fileDropAreaVariants as aI, fieldControlVariants as aJ, fileDropzoneVariants as aK, fileInputVariants as aL, formatBytes as aM, getFileName as aN, getFileSize as aO, getItemKey as aP, inputVariants as aQ, isImageFile as aR, isPdfFile as aS, matchesAccept as aT, newLocalId as aU, radioItemVariants as aV, resolveLunarConvertPreview as aW, selectTriggerVariants as aX, textareaVariants as aY, useSubmitGuard as aZ, type PasswordInputProps as aa, PhoneField as ab, PhoneInput as ac, type PhoneInputProps as ad, RadioGroup as ae, RadioGroupField as af, RadioGroupItem as ag, type RadioGroupItemProps as ah, type RadioGroupProps as ai, RadioGroupRoot as aj, Select as ak, SelectContent as al, SelectField as am, SelectGroup as an, SelectItem as ao, SelectLabel as ap, type SelectOption as aq, type SelectProps as ar, SelectScrollDownButton as as, SelectScrollUpButton as at, SelectSeparator as au, SelectTrigger as av, type SelectTriggerProps as aw, SelectValue as ax, TextField as ay, Textarea as az, type DateRangeFieldProps as b, type FileUploadProps as c, type LunarDateFieldProps as d, type PhoneFieldProps as e, type SelectFieldProps as f, type TextareaFieldProps as g, type TimeFieldProps as h, type SubmitGuardSchema as i, type SubmitGuard as j, firstInvalidMessage as k, type FieldControlVariant as l, Checkbox as m, CheckboxField as n, type CheckboxProps as o, Combobox as p, ComboboxField as q, reportInvalidSubmit as r, type ComboboxOption as s, type ComboboxProps as t, DateField as u, DatePicker as v, type DatePickerProps as w, type DateRange as x, DateRangeField as y, DateRangePicker as z };