@likelion-design/ui 1.0.1 → 1.0.4

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/dist/index.d.mts CHANGED
@@ -145,9 +145,7 @@ interface ChipProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>,
145
145
  /** Close 버튼 클릭 핸들러 */
146
146
  onClose?: (e: React.MouseEvent<HTMLButtonElement>) => void;
147
147
  }
148
- /** Chip 컴포넌트는 사용자가 직접 선택, 추가, 삭제할 수 있는 인터랙티브한 컴포넌트다. */
149
- declare const Chip: ({ type, size, variant, value, onChange, checked: checkedProp, defaultChecked, selectedValue, selectedValues, label, prefixIcon, suffixIcon, showClose, onClose, className, disabled, onClick, ...props }: ChipProps) => react_jsx_runtime.JSX.Element;
150
- interface ChipGroupProps {
148
+ interface ChipGroupProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange"> {
151
149
  /** 선택된 값 (controlled) - 단일: string, 다중: string[] */
152
150
  value?: string | string[];
153
151
  /** 초기 선택 값 (uncontrolled) */
@@ -166,13 +164,20 @@ interface ChipGroupProps {
166
164
  disabled?: boolean;
167
165
  /** 자식 Chip 컴포넌트들 */
168
166
  children: React.ReactNode;
169
- /** 추가 CSS 클래스명 */
170
- className?: string;
171
167
  }
172
168
  /** Chip.Group은 여러 Chip을 그룹화하여 단일/다중 선택을 관리한다. */
173
169
  declare const ChipGroup: {
174
- ({ value: valueProp, defaultValue, onChange, multiple, type, size, variant, disabled, children, className, }: ChipGroupProps): react_jsx_runtime.JSX.Element;
170
+ ({ value: valueProp, defaultValue, onChange, multiple, type, size, variant, disabled, children, className, ...rest }: ChipGroupProps): react_jsx_runtime.JSX.Element;
171
+ displayName: string;
172
+ };
173
+ declare const Chip: {
174
+ ({ type, size, variant, value, onChange, checked: checkedProp, defaultChecked, selectedValue, selectedValues, label, prefixIcon, suffixIcon, showClose, onClose, className, disabled, onClick, ...props }: ChipProps): react_jsx_runtime.JSX.Element;
175
175
  displayName: string;
176
+ } & {
177
+ Group: {
178
+ ({ value: valueProp, defaultValue, onChange, multiple, type, size, variant, disabled, children, className, ...rest }: ChipGroupProps): react_jsx_runtime.JSX.Element;
179
+ displayName: string;
180
+ };
176
181
  };
177
182
 
178
183
  type DialogAlign = "center" | "left";
@@ -181,65 +186,937 @@ type DialogVariant = "alert" | "confirm";
181
186
  type DialogActionColor = ButtonColor;
182
187
  type DialogActionType = ButtonType;
183
188
  type DialogActionSize = Exclude<ButtonSize, "xlarge">;
184
- interface DialogProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
185
- /** Dialog 표시 여부 */
189
+ /** 기존 방식의 Action Item 정의 */
190
+ interface DialogActionItem {
191
+ label: string;
192
+ color?: DialogActionColor;
193
+ type?: DialogActionType;
194
+ size?: DialogActionSize;
195
+ prefixIcon?: React.ReactNode;
196
+ suffixIcon?: React.ReactNode;
197
+ loading?: boolean;
198
+ disabled?: boolean;
199
+ onClick?: () => void | Promise<void>;
200
+ /** 클릭 시 다이얼로그 닫기 여부 (기본값: true) */
201
+ closeOnClick?: boolean;
202
+ }
203
+ interface DialogProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title" | "content"> {
186
204
  open?: boolean;
187
- /** Dialog 타입 */
205
+ onClose?: () => void;
206
+ /** 오버레이 클릭 시 닫기 여부 (기본값: true) */
207
+ closeOnOverlayClick?: boolean;
208
+ /** ESC 키로 닫기 여부 (기본값: true) */
209
+ closeOnEsc?: boolean;
210
+ /** 다이얼로그 타입 (스타일링용) */
188
211
  variant?: DialogVariant;
189
- /** 타이틀 정렬 */
212
+ /** 정렬 (기본값: variant가 alert면 left, 아니면 center) */
190
213
  align?: DialogAlign;
191
- /** 타이틀 */
214
+ /** 다이얼로그 제목 */
192
215
  title?: React.ReactNode;
193
- /** 설명 텍스트 */
216
+ /** 다이얼로그 본문/설명 */
194
217
  description?: React.ReactNode;
195
- /** 아이콘 */
218
+ /** 다이얼로그 아이콘 */
196
219
  icon?: React.ReactNode;
197
- /** 하단 액션 영역 */
220
+ /** 하단 버튼 목록 (Compound Component 대신 사용 가능) */
198
221
  actionItems?: DialogActionItem[];
199
- /** 액션 레이아웃 */
222
+ /** actionItems 사용 시 버튼 레이아웃 */
200
223
  footerLayout?: DialogFooterLayout;
201
- /** 액션 클릭 닫기 핸들러 (internal) */
202
- onActionClose?: () => void;
224
+ /** 커스텀 컨텐츠 (헤더/푸터 없이 내용만 렌더링할 때 사용) */
225
+ content?: React.ReactNode;
226
+ className?: string;
227
+ children?: React.ReactNode;
203
228
  }
204
- interface DialogActionItem {
205
- /** 버튼 라벨 */
229
+ interface DialogHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
230
+ title?: React.ReactNode;
231
+ icon?: React.ReactNode;
232
+ }
233
+ type DialogBodyProps = React.HTMLAttributes<HTMLDivElement>;
234
+ interface DialogFooterProps extends React.HTMLAttributes<HTMLDivElement> {
235
+ layout?: DialogFooterLayout;
236
+ }
237
+ interface DialogButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "type"> {
206
238
  label: string;
207
- /** 버튼 색상 */
208
- color?: DialogActionColor;
209
- /** 버튼 타입 */
210
- type?: DialogActionType;
211
- /** 버튼 크기 */
212
- size?: DialogActionSize;
213
- /** Prefix 아이콘 */
239
+ color?: ButtonColor;
240
+ type?: ButtonType;
241
+ size?: Exclude<ButtonSize, "xlarge">;
214
242
  prefixIcon?: React.ReactNode;
215
- /** Suffix 아이콘 */
216
243
  suffixIcon?: React.ReactNode;
217
- /** 로딩 상태 */
218
244
  loading?: boolean;
219
- /** 비활성화 */
220
245
  disabled?: boolean;
221
- /** 클릭 핸들러 */
222
- onClick?: () => void;
223
- /** 클릭 시 다이얼로그 닫기 */
246
+ /** 클릭 다이얼로그 닫기 여부 (기본값: false - 명시적으로 닫아야 함) */
224
247
  closeOnClick?: boolean;
225
248
  }
226
- interface DialogOpenOptions extends Omit<DialogProps, "open" | "onActionClose"> {
227
- /** 닫힐 호출 */
249
+ declare const Dialog: (({ open, onClose, closeOnOverlayClick, closeOnEsc, variant, align, title, description, icon, actionItems, footerLayout, content, className, children, ...props }: DialogProps) => react_jsx_runtime.JSX.Element | null) & {
250
+ Header: ({ title, icon, className, children, ...props }: DialogHeaderProps) => react_jsx_runtime.JSX.Element;
251
+ Body: ({ className, children, ...props }: DialogBodyProps) => react_jsx_runtime.JSX.Element;
252
+ Footer: ({ layout, className, children, ...props }: DialogFooterProps) => react_jsx_runtime.JSX.Element;
253
+ Button: ({ label, color, type, size, prefixIcon, suffixIcon, loading, disabled, onClick, closeOnClick, style, ...props }: DialogButtonProps) => react_jsx_runtime.JSX.Element;
254
+ };
255
+ interface DialogOptions {
256
+ id?: string;
257
+ variant?: DialogVariant;
258
+ align?: DialogAlign;
259
+ title?: React.ReactNode;
260
+ description?: React.ReactNode;
261
+ icon?: React.ReactNode;
262
+ buttons?: DialogActionItem[];
263
+ content?: React.ReactNode;
228
264
  onClose?: () => void;
229
- /** 오버레이 클릭 시 닫기 */
230
265
  closeOnOverlayClick?: boolean;
231
- /** ESC 키로 닫기 */
232
266
  closeOnEsc?: boolean;
233
267
  }
234
- /** Dialog 컴포넌트는 중요한 정보를 전달하고 확인을 받는 모달 레이아웃이다. */
235
- declare const Dialog: ({ open, variant, align, title, description, icon, actionItems, footerLayout, onActionClose, className, ...props }: DialogProps) => react_jsx_runtime.JSX.Element | null;
268
+ interface AlertOptions extends Omit<DialogOptions, "buttons" | "content"> {
269
+ confirmLabel?: string;
270
+ onConfirm?: () => void | Promise<void>;
271
+ }
272
+ interface ConfirmOptions extends Omit<DialogOptions, "buttons" | "content"> {
273
+ confirmLabel?: string;
274
+ cancelLabel?: string;
275
+ onConfirm?: () => void | Promise<void>;
276
+ onCancel?: () => void | Promise<void>;
277
+ }
278
+ interface DialogContextType {
279
+ open: (options: DialogOptions) => string;
280
+ close: (id: string) => void;
281
+ closeAll: () => void;
282
+ alert: (options: AlertOptions) => Promise<void>;
283
+ confirm: (options: ConfirmOptions) => Promise<boolean>;
284
+ }
285
+ declare const DialogProvider: ({ children }: {
286
+ children: React.ReactNode;
287
+ }) => react_jsx_runtime.JSX.Element;
288
+ declare function useDialog(): DialogContextType;
289
+
290
+ type TextInputSize = "pc" | "mo" | "medium" | "small";
291
+ type TextInputState = "default" | "error";
292
+ interface TextInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "title"> {
293
+ /** Title 텍스트 (있으면 표시) */
294
+ title?: string;
295
+ /** 필수 필드 표시 여부 */
296
+ required?: boolean;
297
+ /**
298
+ * Input 크기
299
+ * - "pc" / "mo": 디바이스 기반 네이밍
300
+ * - "medium" / "small": 스토리/디자인 토큰 기반 네이밍 (pc ↔ medium, mo ↔ small)
301
+ * 미지정 시 breakpoint 기준: tablet 미만 mo(small), 이상 pc(medium). 지정 시 오버라이드
302
+ */
303
+ size?: TextInputSize;
304
+ /** Input 상태 (에러 상태) */
305
+ error?: boolean;
306
+ /** Help text */
307
+ description?: React.ReactNode;
308
+ /** Character count 표시 (예: "99/100") */
309
+ maxLength?: number;
310
+ /** 왼쪽 아이콘 */
311
+ prefixIcon?: React.ReactNode;
312
+ /** 오른쪽 아이콘 */
313
+ suffixIcon?: React.ReactNode;
314
+ /** 오른쪽 단위 (타이머 등) */
315
+ suffixUnit?: React.ReactNode;
316
+ /** Help text 아이콘 (true면 기본 아이콘, 노드면 커스텀) */
317
+ accentIcon?: boolean | React.ReactNode;
318
+ }
319
+ /** TextInput 컴포넌트는 사용자로부터 텍스트 입력을 받는 폼 컴포넌트입니다. */
320
+ declare const TextInput: ({ required, size, error, description, maxLength, prefixIcon, suffixIcon, suffixUnit, title, accentIcon, className, id, value, defaultValue, onChange, onFocus, onBlur, ...props }: TextInputProps) => react_jsx_runtime.JSX.Element;
321
+
322
+ type ToggleSize = "medium" | "small";
323
+ type ToggleLabelPosition = "start" | "end";
324
+ interface ToggleProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "onChange" | "type"> {
325
+ /** Toggle 크기 */
326
+ size?: ToggleSize;
327
+ /** Toggle 라벨 */
328
+ label?: React.ReactNode;
329
+ /** Toggle 라벨 위치 */
330
+ labelPosition?: ToggleLabelPosition;
331
+ /** Toggle 설명 텍스트 */
332
+ description?: React.ReactNode;
333
+ /** Toggle 상태 변경 핸들러 */
334
+ onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;
335
+ }
336
+ /** Toggle 컴포넌트는 사용자가 on/off 상태를 전환할 수 있는 스위치 컴포넌트다. */
337
+ declare const Toggle: React.ForwardRefExoticComponent<ToggleProps & React.RefAttributes<HTMLInputElement>>;
338
+
339
+ type TextVariant = "display-d1" | "display-d2" | "display-d3" | "display-d4" | "heading-h1" | "heading-h2" | "heading-h3" | "heading-h4" | "heading-h5" | "heading-h6" | "subtitle-p1" | "subtitle-p2" | "subtitle-p3" | "body-p1" | "body-p2" | "body-p3" | "body-p4" | "body-p5";
340
+ type TextDecoration = "none" | "underline";
341
+ interface TextProps extends React.HTMLAttributes<HTMLElement> {
342
+ /** Text 변형 */
343
+ variant: TextVariant;
344
+ /** 텍스트 장식 (underline 등) */
345
+ decoration?: TextDecoration;
346
+ /** HTML 태그 (기본값: variant에 따라 자동 결정) */
347
+ as?: keyof React.JSX.IntrinsicElements;
348
+ /** 자식 요소 */
349
+ children: React.ReactNode;
350
+ }
351
+ /** Text 컴포넌트는 텍스트 스타일을 일관되게 적용하는 컴포넌트입니다. */
352
+ declare const Text: ({ variant, decoration, as, children, className, ...props }: TextProps) => React.DOMElement<{
353
+ defaultChecked?: boolean | undefined;
354
+ defaultValue?: string | number | readonly string[] | undefined;
355
+ suppressContentEditableWarning?: boolean | undefined;
356
+ suppressHydrationWarning?: boolean | undefined;
357
+ accessKey?: string | undefined;
358
+ autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {});
359
+ autoFocus?: boolean | undefined;
360
+ contentEditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
361
+ contextMenu?: string | undefined;
362
+ dir?: string | undefined;
363
+ draggable?: (boolean | "true" | "false") | undefined;
364
+ enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
365
+ hidden?: boolean | undefined;
366
+ id?: string | undefined;
367
+ lang?: string | undefined;
368
+ nonce?: string | undefined;
369
+ slot?: string | undefined;
370
+ spellCheck?: (boolean | "true" | "false") | undefined;
371
+ style?: React.CSSProperties | undefined;
372
+ tabIndex?: number | undefined;
373
+ title?: string | undefined;
374
+ translate?: "yes" | "no" | undefined;
375
+ radioGroup?: string | undefined;
376
+ role?: React.AriaRole | undefined;
377
+ about?: string | undefined;
378
+ content?: string | undefined;
379
+ datatype?: string | undefined;
380
+ inlist?: any;
381
+ prefix?: string | undefined;
382
+ property?: string | undefined;
383
+ rel?: string | undefined;
384
+ resource?: string | undefined;
385
+ rev?: string | undefined;
386
+ typeof?: string | undefined;
387
+ vocab?: string | undefined;
388
+ autoCorrect?: string | undefined;
389
+ autoSave?: string | undefined;
390
+ color?: string | undefined;
391
+ itemProp?: string | undefined;
392
+ itemScope?: boolean | undefined;
393
+ itemType?: string | undefined;
394
+ itemID?: string | undefined;
395
+ itemRef?: string | undefined;
396
+ results?: number | undefined;
397
+ security?: string | undefined;
398
+ unselectable?: "on" | "off" | undefined;
399
+ popover?: "" | "auto" | "manual" | "hint" | undefined;
400
+ popoverTargetAction?: "toggle" | "show" | "hide" | undefined;
401
+ popoverTarget?: string | undefined;
402
+ inert?: boolean | undefined;
403
+ inputMode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined;
404
+ is?: string | undefined;
405
+ exportparts?: string | undefined;
406
+ part?: string | undefined;
407
+ "aria-activedescendant"?: string | undefined;
408
+ "aria-atomic"?: (boolean | "true" | "false") | undefined;
409
+ "aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined;
410
+ "aria-braillelabel"?: string | undefined;
411
+ "aria-brailleroledescription"?: string | undefined;
412
+ "aria-busy"?: (boolean | "true" | "false") | undefined;
413
+ "aria-checked"?: boolean | "false" | "mixed" | "true" | undefined;
414
+ "aria-colcount"?: number | undefined;
415
+ "aria-colindex"?: number | undefined;
416
+ "aria-colindextext"?: string | undefined;
417
+ "aria-colspan"?: number | undefined;
418
+ "aria-controls"?: string | undefined;
419
+ "aria-current"?: boolean | "false" | "true" | "page" | "step" | "location" | "date" | "time" | undefined;
420
+ "aria-describedby"?: string | undefined;
421
+ "aria-description"?: string | undefined;
422
+ "aria-details"?: string | undefined;
423
+ "aria-disabled"?: (boolean | "true" | "false") | undefined;
424
+ "aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined;
425
+ "aria-errormessage"?: string | undefined;
426
+ "aria-expanded"?: (boolean | "true" | "false") | undefined;
427
+ "aria-flowto"?: string | undefined;
428
+ "aria-grabbed"?: (boolean | "true" | "false") | undefined;
429
+ "aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined;
430
+ "aria-hidden"?: (boolean | "true" | "false") | undefined;
431
+ "aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined;
432
+ "aria-keyshortcuts"?: string | undefined;
433
+ "aria-label"?: string | undefined;
434
+ "aria-labelledby"?: string | undefined;
435
+ "aria-level"?: number | undefined;
436
+ "aria-live"?: "off" | "assertive" | "polite" | undefined;
437
+ "aria-modal"?: (boolean | "true" | "false") | undefined;
438
+ "aria-multiline"?: (boolean | "true" | "false") | undefined;
439
+ "aria-multiselectable"?: (boolean | "true" | "false") | undefined;
440
+ "aria-orientation"?: "horizontal" | "vertical" | undefined;
441
+ "aria-owns"?: string | undefined;
442
+ "aria-placeholder"?: string | undefined;
443
+ "aria-posinset"?: number | undefined;
444
+ "aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined;
445
+ "aria-readonly"?: (boolean | "true" | "false") | undefined;
446
+ "aria-relevant"?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined;
447
+ "aria-required"?: (boolean | "true" | "false") | undefined;
448
+ "aria-roledescription"?: string | undefined;
449
+ "aria-rowcount"?: number | undefined;
450
+ "aria-rowindex"?: number | undefined;
451
+ "aria-rowindextext"?: string | undefined;
452
+ "aria-rowspan"?: number | undefined;
453
+ "aria-selected"?: (boolean | "true" | "false") | undefined;
454
+ "aria-setsize"?: number | undefined;
455
+ "aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined;
456
+ "aria-valuemax"?: number | undefined;
457
+ "aria-valuemin"?: number | undefined;
458
+ "aria-valuenow"?: number | undefined;
459
+ "aria-valuetext"?: string | undefined;
460
+ dangerouslySetInnerHTML?: {
461
+ __html: string | TrustedHTML;
462
+ } | undefined;
463
+ onCopy?: React.ClipboardEventHandler<HTMLElement> | undefined;
464
+ onCopyCapture?: React.ClipboardEventHandler<HTMLElement> | undefined;
465
+ onCut?: React.ClipboardEventHandler<HTMLElement> | undefined;
466
+ onCutCapture?: React.ClipboardEventHandler<HTMLElement> | undefined;
467
+ onPaste?: React.ClipboardEventHandler<HTMLElement> | undefined;
468
+ onPasteCapture?: React.ClipboardEventHandler<HTMLElement> | undefined;
469
+ onCompositionEnd?: React.CompositionEventHandler<HTMLElement> | undefined;
470
+ onCompositionEndCapture?: React.CompositionEventHandler<HTMLElement> | undefined;
471
+ onCompositionStart?: React.CompositionEventHandler<HTMLElement> | undefined;
472
+ onCompositionStartCapture?: React.CompositionEventHandler<HTMLElement> | undefined;
473
+ onCompositionUpdate?: React.CompositionEventHandler<HTMLElement> | undefined;
474
+ onCompositionUpdateCapture?: React.CompositionEventHandler<HTMLElement> | undefined;
475
+ onFocus?: React.FocusEventHandler<HTMLElement> | undefined;
476
+ onFocusCapture?: React.FocusEventHandler<HTMLElement> | undefined;
477
+ onBlur?: React.FocusEventHandler<HTMLElement> | undefined;
478
+ onBlurCapture?: React.FocusEventHandler<HTMLElement> | undefined;
479
+ onChange?: React.FormEventHandler<HTMLElement> | undefined;
480
+ onChangeCapture?: React.FormEventHandler<HTMLElement> | undefined;
481
+ onBeforeInput?: React.InputEventHandler<HTMLElement> | undefined;
482
+ onBeforeInputCapture?: React.FormEventHandler<HTMLElement> | undefined;
483
+ onInput?: React.FormEventHandler<HTMLElement> | undefined;
484
+ onInputCapture?: React.FormEventHandler<HTMLElement> | undefined;
485
+ onReset?: React.FormEventHandler<HTMLElement> | undefined;
486
+ onResetCapture?: React.FormEventHandler<HTMLElement> | undefined;
487
+ onSubmit?: React.FormEventHandler<HTMLElement> | undefined;
488
+ onSubmitCapture?: React.FormEventHandler<HTMLElement> | undefined;
489
+ onInvalid?: React.FormEventHandler<HTMLElement> | undefined;
490
+ onInvalidCapture?: React.FormEventHandler<HTMLElement> | undefined;
491
+ onLoad?: React.ReactEventHandler<HTMLElement> | undefined;
492
+ onLoadCapture?: React.ReactEventHandler<HTMLElement> | undefined;
493
+ onError?: React.ReactEventHandler<HTMLElement> | undefined;
494
+ onErrorCapture?: React.ReactEventHandler<HTMLElement> | undefined;
495
+ onKeyDown?: React.KeyboardEventHandler<HTMLElement> | undefined;
496
+ onKeyDownCapture?: React.KeyboardEventHandler<HTMLElement> | undefined;
497
+ onKeyPress?: React.KeyboardEventHandler<HTMLElement> | undefined;
498
+ onKeyPressCapture?: React.KeyboardEventHandler<HTMLElement> | undefined;
499
+ onKeyUp?: React.KeyboardEventHandler<HTMLElement> | undefined;
500
+ onKeyUpCapture?: React.KeyboardEventHandler<HTMLElement> | undefined;
501
+ onAbort?: React.ReactEventHandler<HTMLElement> | undefined;
502
+ onAbortCapture?: React.ReactEventHandler<HTMLElement> | undefined;
503
+ onCanPlay?: React.ReactEventHandler<HTMLElement> | undefined;
504
+ onCanPlayCapture?: React.ReactEventHandler<HTMLElement> | undefined;
505
+ onCanPlayThrough?: React.ReactEventHandler<HTMLElement> | undefined;
506
+ onCanPlayThroughCapture?: React.ReactEventHandler<HTMLElement> | undefined;
507
+ onDurationChange?: React.ReactEventHandler<HTMLElement> | undefined;
508
+ onDurationChangeCapture?: React.ReactEventHandler<HTMLElement> | undefined;
509
+ onEmptied?: React.ReactEventHandler<HTMLElement> | undefined;
510
+ onEmptiedCapture?: React.ReactEventHandler<HTMLElement> | undefined;
511
+ onEncrypted?: React.ReactEventHandler<HTMLElement> | undefined;
512
+ onEncryptedCapture?: React.ReactEventHandler<HTMLElement> | undefined;
513
+ onEnded?: React.ReactEventHandler<HTMLElement> | undefined;
514
+ onEndedCapture?: React.ReactEventHandler<HTMLElement> | undefined;
515
+ onLoadedData?: React.ReactEventHandler<HTMLElement> | undefined;
516
+ onLoadedDataCapture?: React.ReactEventHandler<HTMLElement> | undefined;
517
+ onLoadedMetadata?: React.ReactEventHandler<HTMLElement> | undefined;
518
+ onLoadedMetadataCapture?: React.ReactEventHandler<HTMLElement> | undefined;
519
+ onLoadStart?: React.ReactEventHandler<HTMLElement> | undefined;
520
+ onLoadStartCapture?: React.ReactEventHandler<HTMLElement> | undefined;
521
+ onPause?: React.ReactEventHandler<HTMLElement> | undefined;
522
+ onPauseCapture?: React.ReactEventHandler<HTMLElement> | undefined;
523
+ onPlay?: React.ReactEventHandler<HTMLElement> | undefined;
524
+ onPlayCapture?: React.ReactEventHandler<HTMLElement> | undefined;
525
+ onPlaying?: React.ReactEventHandler<HTMLElement> | undefined;
526
+ onPlayingCapture?: React.ReactEventHandler<HTMLElement> | undefined;
527
+ onProgress?: React.ReactEventHandler<HTMLElement> | undefined;
528
+ onProgressCapture?: React.ReactEventHandler<HTMLElement> | undefined;
529
+ onRateChange?: React.ReactEventHandler<HTMLElement> | undefined;
530
+ onRateChangeCapture?: React.ReactEventHandler<HTMLElement> | undefined;
531
+ onSeeked?: React.ReactEventHandler<HTMLElement> | undefined;
532
+ onSeekedCapture?: React.ReactEventHandler<HTMLElement> | undefined;
533
+ onSeeking?: React.ReactEventHandler<HTMLElement> | undefined;
534
+ onSeekingCapture?: React.ReactEventHandler<HTMLElement> | undefined;
535
+ onStalled?: React.ReactEventHandler<HTMLElement> | undefined;
536
+ onStalledCapture?: React.ReactEventHandler<HTMLElement> | undefined;
537
+ onSuspend?: React.ReactEventHandler<HTMLElement> | undefined;
538
+ onSuspendCapture?: React.ReactEventHandler<HTMLElement> | undefined;
539
+ onTimeUpdate?: React.ReactEventHandler<HTMLElement> | undefined;
540
+ onTimeUpdateCapture?: React.ReactEventHandler<HTMLElement> | undefined;
541
+ onVolumeChange?: React.ReactEventHandler<HTMLElement> | undefined;
542
+ onVolumeChangeCapture?: React.ReactEventHandler<HTMLElement> | undefined;
543
+ onWaiting?: React.ReactEventHandler<HTMLElement> | undefined;
544
+ onWaitingCapture?: React.ReactEventHandler<HTMLElement> | undefined;
545
+ onAuxClick?: React.MouseEventHandler<HTMLElement> | undefined;
546
+ onAuxClickCapture?: React.MouseEventHandler<HTMLElement> | undefined;
547
+ onClick?: React.MouseEventHandler<HTMLElement> | undefined;
548
+ onClickCapture?: React.MouseEventHandler<HTMLElement> | undefined;
549
+ onContextMenu?: React.MouseEventHandler<HTMLElement> | undefined;
550
+ onContextMenuCapture?: React.MouseEventHandler<HTMLElement> | undefined;
551
+ onDoubleClick?: React.MouseEventHandler<HTMLElement> | undefined;
552
+ onDoubleClickCapture?: React.MouseEventHandler<HTMLElement> | undefined;
553
+ onDrag?: React.DragEventHandler<HTMLElement> | undefined;
554
+ onDragCapture?: React.DragEventHandler<HTMLElement> | undefined;
555
+ onDragEnd?: React.DragEventHandler<HTMLElement> | undefined;
556
+ onDragEndCapture?: React.DragEventHandler<HTMLElement> | undefined;
557
+ onDragEnter?: React.DragEventHandler<HTMLElement> | undefined;
558
+ onDragEnterCapture?: React.DragEventHandler<HTMLElement> | undefined;
559
+ onDragExit?: React.DragEventHandler<HTMLElement> | undefined;
560
+ onDragExitCapture?: React.DragEventHandler<HTMLElement> | undefined;
561
+ onDragLeave?: React.DragEventHandler<HTMLElement> | undefined;
562
+ onDragLeaveCapture?: React.DragEventHandler<HTMLElement> | undefined;
563
+ onDragOver?: React.DragEventHandler<HTMLElement> | undefined;
564
+ onDragOverCapture?: React.DragEventHandler<HTMLElement> | undefined;
565
+ onDragStart?: React.DragEventHandler<HTMLElement> | undefined;
566
+ onDragStartCapture?: React.DragEventHandler<HTMLElement> | undefined;
567
+ onDrop?: React.DragEventHandler<HTMLElement> | undefined;
568
+ onDropCapture?: React.DragEventHandler<HTMLElement> | undefined;
569
+ onMouseDown?: React.MouseEventHandler<HTMLElement> | undefined;
570
+ onMouseDownCapture?: React.MouseEventHandler<HTMLElement> | undefined;
571
+ onMouseEnter?: React.MouseEventHandler<HTMLElement> | undefined;
572
+ onMouseLeave?: React.MouseEventHandler<HTMLElement> | undefined;
573
+ onMouseMove?: React.MouseEventHandler<HTMLElement> | undefined;
574
+ onMouseMoveCapture?: React.MouseEventHandler<HTMLElement> | undefined;
575
+ onMouseOut?: React.MouseEventHandler<HTMLElement> | undefined;
576
+ onMouseOutCapture?: React.MouseEventHandler<HTMLElement> | undefined;
577
+ onMouseOver?: React.MouseEventHandler<HTMLElement> | undefined;
578
+ onMouseOverCapture?: React.MouseEventHandler<HTMLElement> | undefined;
579
+ onMouseUp?: React.MouseEventHandler<HTMLElement> | undefined;
580
+ onMouseUpCapture?: React.MouseEventHandler<HTMLElement> | undefined;
581
+ onSelect?: React.ReactEventHandler<HTMLElement> | undefined;
582
+ onSelectCapture?: React.ReactEventHandler<HTMLElement> | undefined;
583
+ onTouchCancel?: React.TouchEventHandler<HTMLElement> | undefined;
584
+ onTouchCancelCapture?: React.TouchEventHandler<HTMLElement> | undefined;
585
+ onTouchEnd?: React.TouchEventHandler<HTMLElement> | undefined;
586
+ onTouchEndCapture?: React.TouchEventHandler<HTMLElement> | undefined;
587
+ onTouchMove?: React.TouchEventHandler<HTMLElement> | undefined;
588
+ onTouchMoveCapture?: React.TouchEventHandler<HTMLElement> | undefined;
589
+ onTouchStart?: React.TouchEventHandler<HTMLElement> | undefined;
590
+ onTouchStartCapture?: React.TouchEventHandler<HTMLElement> | undefined;
591
+ onPointerDown?: React.PointerEventHandler<HTMLElement> | undefined;
592
+ onPointerDownCapture?: React.PointerEventHandler<HTMLElement> | undefined;
593
+ onPointerMove?: React.PointerEventHandler<HTMLElement> | undefined;
594
+ onPointerMoveCapture?: React.PointerEventHandler<HTMLElement> | undefined;
595
+ onPointerUp?: React.PointerEventHandler<HTMLElement> | undefined;
596
+ onPointerUpCapture?: React.PointerEventHandler<HTMLElement> | undefined;
597
+ onPointerCancel?: React.PointerEventHandler<HTMLElement> | undefined;
598
+ onPointerCancelCapture?: React.PointerEventHandler<HTMLElement> | undefined;
599
+ onPointerEnter?: React.PointerEventHandler<HTMLElement> | undefined;
600
+ onPointerLeave?: React.PointerEventHandler<HTMLElement> | undefined;
601
+ onPointerOver?: React.PointerEventHandler<HTMLElement> | undefined;
602
+ onPointerOverCapture?: React.PointerEventHandler<HTMLElement> | undefined;
603
+ onPointerOut?: React.PointerEventHandler<HTMLElement> | undefined;
604
+ onPointerOutCapture?: React.PointerEventHandler<HTMLElement> | undefined;
605
+ onGotPointerCapture?: React.PointerEventHandler<HTMLElement> | undefined;
606
+ onGotPointerCaptureCapture?: React.PointerEventHandler<HTMLElement> | undefined;
607
+ onLostPointerCapture?: React.PointerEventHandler<HTMLElement> | undefined;
608
+ onLostPointerCaptureCapture?: React.PointerEventHandler<HTMLElement> | undefined;
609
+ onScroll?: React.UIEventHandler<HTMLElement> | undefined;
610
+ onScrollCapture?: React.UIEventHandler<HTMLElement> | undefined;
611
+ onScrollEnd?: React.UIEventHandler<HTMLElement> | undefined;
612
+ onScrollEndCapture?: React.UIEventHandler<HTMLElement> | undefined;
613
+ onWheel?: React.WheelEventHandler<HTMLElement> | undefined;
614
+ onWheelCapture?: React.WheelEventHandler<HTMLElement> | undefined;
615
+ onAnimationStart?: React.AnimationEventHandler<HTMLElement> | undefined;
616
+ onAnimationStartCapture?: React.AnimationEventHandler<HTMLElement> | undefined;
617
+ onAnimationEnd?: React.AnimationEventHandler<HTMLElement> | undefined;
618
+ onAnimationEndCapture?: React.AnimationEventHandler<HTMLElement> | undefined;
619
+ onAnimationIteration?: React.AnimationEventHandler<HTMLElement> | undefined;
620
+ onAnimationIterationCapture?: React.AnimationEventHandler<HTMLElement> | undefined;
621
+ onToggle?: React.ToggleEventHandler<HTMLElement> | undefined;
622
+ onBeforeToggle?: React.ToggleEventHandler<HTMLElement> | undefined;
623
+ onTransitionCancel?: React.TransitionEventHandler<HTMLElement> | undefined;
624
+ onTransitionCancelCapture?: React.TransitionEventHandler<HTMLElement> | undefined;
625
+ onTransitionEnd?: React.TransitionEventHandler<HTMLElement> | undefined;
626
+ onTransitionEndCapture?: React.TransitionEventHandler<HTMLElement> | undefined;
627
+ onTransitionRun?: React.TransitionEventHandler<HTMLElement> | undefined;
628
+ onTransitionRunCapture?: React.TransitionEventHandler<HTMLElement> | undefined;
629
+ onTransitionStart?: React.TransitionEventHandler<HTMLElement> | undefined;
630
+ onTransitionStartCapture?: React.TransitionEventHandler<HTMLElement> | undefined;
631
+ className: string;
632
+ }, Element>;
633
+
634
+ interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "onChange"> {
635
+ /** Checkbox 라벨 */
636
+ label?: React.ReactNode;
637
+ /** label 스타일 오버라이드 (옵션) */
638
+ labelProps?: Omit<React.ComponentProps<typeof Text>, "children" | "variant"> & {
639
+ variant?: React.ComponentProps<typeof Text>["variant"];
640
+ };
641
+ /** Checkbox 설명 텍스트 */
642
+ description?: React.ReactNode;
643
+ /** Checkbox 값 (Checkbox.Group에서 사용) */
644
+ value?: string;
645
+ /** Checkbox 상태 변경 핸들러 */
646
+ onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;
647
+ /** Indeterminate 상태 (부분 선택 상태) */
648
+ indeterminate?: boolean;
649
+ }
650
+ /** Checkbox 컴포넌트는 사용자가 선택/해제할 수 있는 체크박스 입력 컴포넌트다. */
651
+ declare const Checkbox: React.ForwardRefExoticComponent<CheckboxProps & React.RefAttributes<HTMLInputElement>>;
652
+ interface CheckboxGroupProps {
653
+ /** 그룹 라벨 */
654
+ label?: React.ReactNode;
655
+ /** 그룹 라벨 스타일 오버라이드 (옵션) */
656
+ labelProps?: Omit<React.ComponentProps<typeof Text>, "children" | "variant"> & {
657
+ variant?: React.ComponentProps<typeof Text>["variant"];
658
+ };
659
+ /** 그룹 설명 */
660
+ description?: React.ReactNode;
661
+ /** 그룹 설명 스타일 오버라이드 (옵션) */
662
+ descriptionProps?: Omit<React.ComponentProps<typeof Text>, "children" | "variant"> & {
663
+ variant?: React.ComponentProps<typeof Text>["variant"];
664
+ };
665
+ /** 복수 선택 허용 여부. false면 단일 선택(라디오처럼 동작) */
666
+ multiple?: boolean;
667
+ /** 선택된 값들 (controlled). multiple=false일 때는 길이 0 또는 1 */
668
+ value?: string[];
669
+ /** 초기 선택된 값들 (uncontrolled) */
670
+ defaultValue?: string[];
671
+ /** 값 변경 핸들러 */
672
+ onChange?: (values: string[]) => void;
673
+ /** 비활성화 상태 */
674
+ disabled?: boolean;
675
+ /** 자식 Checkbox 컴포넌트들 */
676
+ children: React.ReactNode;
677
+ /** 추가 CSS 클래스명 */
678
+ className?: string;
679
+ }
680
+ /** Checkbox.Group은 여러 Checkbox를 그룹화하여 관리할 수 있는 컴포넌트다. */
681
+ declare const CheckboxGroup: {
682
+ ({ label, labelProps, description, descriptionProps, multiple, value: valueProp, defaultValue, onChange, disabled, children, className, }: CheckboxGroupProps): react_jsx_runtime.JSX.Element;
683
+ displayName: string;
684
+ };
685
+
686
+ interface UseCheckboxGroupOptions {
687
+ /** 선택 가능한 값 목록 (CheckboxGroup 자식들의 value와 일치) */
688
+ options: readonly string[];
689
+ /** 초기 선택 값 (uncontrolled일 때) */
690
+ defaultValue?: string[];
691
+ /** 선택 값 (controlled일 때). 지정하면 onChange와 함께 사용 */
692
+ value?: string[];
693
+ /** 선택 값 변경 핸들러 (controlled일 때 필수) */
694
+ onChange?: (values: string[]) => void;
695
+ }
696
+ interface UseCheckboxGroupResult {
697
+ /** 현재 선택된 값들. CheckboxGroup의 value에 전달 */
698
+ value: string[];
699
+ /** 선택 변경 핸들러. CheckboxGroup의 onChange에 전달 */
700
+ onChange: (values: string[]) => void;
701
+ /** '전체 선택' 체크박스에 넘길 checked */
702
+ selectAllChecked: boolean;
703
+ /** '전체 선택' 체크박스에 넘길 indeterminate (일부만 선택된 경우) */
704
+ selectAllIndeterminate: boolean;
705
+ /** '전체 선택' 체크박스에 넘길 onChange */
706
+ handleSelectAll: (e: React.ChangeEvent<HTMLInputElement>) => void;
707
+ /** '전체 선택' Checkbox에 그대로 spread 가능한 props (checked, indeterminate, onChange) */
708
+ selectAllProps: {
709
+ checked: boolean;
710
+ indeterminate: boolean;
711
+ onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
712
+ };
713
+ }
236
714
  /**
237
- * Dialog를 가장 간편하게 쓰기 위한
715
+ * CheckboxGroup + '전체 선택' 체크박스(indeterminate 포함) 상태를 관리하는 훅.
716
+ * options와 동기화된 value/onChange와, 전체 선택용 checked/indeterminate/onChange를 반환한다.
717
+ * 외부에서는 이 훅만 사용하면 된다.
718
+ *
719
+ * @example
720
+ * const options = ['react', 'vue', 'angular'] as const;
721
+ * const { value, onChange, selectAllProps } = useCheckboxGroup({ options });
722
+ *
723
+ * <Checkbox label="전체 선택" {...selectAllProps} />
724
+ * <CheckboxGroup value={value} onChange={onChange} ...>
725
+ * {options.map(v => <Checkbox key={v} value={v} label={v} />)}
726
+ * </CheckboxGroup>
238
727
  */
239
- declare function useDialog(): {
240
- openDialog: (options: DialogOpenOptions) => void;
241
- closeDialog: () => void;
242
- DialogContainer: () => React.ReactPortal | null;
728
+ declare function useCheckboxGroup(config: UseCheckboxGroupOptions): UseCheckboxGroupResult;
729
+
730
+ interface SelectMenuItem {
731
+ value: string;
732
+ label: React.ReactNode;
733
+ disabled?: boolean;
734
+ }
735
+ interface SelectMenuProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange"> {
736
+ /** 메뉴 항목들 */
737
+ items: SelectMenuItem[];
738
+ /**
739
+ * 메뉴 사이즈
740
+ * - "medium": Web~Tab 권장 사이즈
741
+ * - "small": Mo 권장 사이즈
742
+ * - 지정하지 않으면 breakpoint에 따라 자동 결정됨.
743
+ */
744
+ size?: "medium" | "small";
745
+ /** 선택된 값 (controlled) */
746
+ value?: string | string[];
747
+ /** 초기 선택 값 (uncontrolled) */
748
+ defaultValue?: string | string[];
749
+ /** 값 변경 핸들러 */
750
+ onChange?: (value: string | string[] | undefined) => void;
751
+ /** 다중 선택 허용 여부 */
752
+ multiple?: boolean;
753
+ /** 항목 텍스트 스타일 오버라이드 (옵션) */
754
+ itemTextProps?: Omit<React.ComponentProps<typeof Text>, "children" | "variant"> & {
755
+ variant?: React.ComponentProps<typeof Text>["variant"];
756
+ };
757
+ /** 선택된 항목 suffix 아이콘 (기본 체크 아이콘, 함수로 커스터마이즈 가능) */
758
+ suffixIcon?: React.ReactNode | ((item: SelectMenuItem) => React.ReactNode);
759
+ }
760
+ /** SelectMenu는 옵션 리스트를 표시하고 값을 선택하는 메뉴 컴포넌트다. */
761
+ declare const SelectMenu: React.ForwardRefExoticComponent<SelectMenuProps & React.RefAttributes<HTMLDivElement>>;
762
+ interface SelectMenuOverlayProps extends Omit<SelectMenuProps, "onClose"> {
763
+ /** 메뉴를 열기 위한 트리거 요소 (버튼/텍스트/아이콘 등) */
764
+ children: React.ReactNode;
765
+ /** 열림 상태 (controlled) */
766
+ open?: boolean;
767
+ /** 초기 열림 상태 (uncontrolled) */
768
+ defaultOpen?: boolean;
769
+ /** 열림 상태 변경 핸들러 */
770
+ onOpenChange?: (open: boolean) => void;
771
+ /** 메뉴 컨테이너 스타일 (positioning 커스터마이즈용) */
772
+ menuContainerStyle?: React.CSSProperties;
773
+ }
774
+ /** SelectMenuOverlay는 트리거(children)를 감싸고 SelectMenu를 토글하는 래퍼 컴포넌트다. */
775
+ declare const SelectMenuOverlay: {
776
+ ({ children, open: openProp, defaultOpen, onOpenChange, menuContainerStyle, ...menuProps }: SelectMenuOverlayProps): react_jsx_runtime.JSX.Element;
777
+ displayName: string;
778
+ };
779
+
780
+ type SelectHeaderType = "outlined" | "underlined";
781
+ type SelectHeaderSize = "medium" | "small";
782
+ interface SelectHeaderProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "type" | "onChange" | "value"> {
783
+ /** SelectHeader 타입 */
784
+ type?: SelectHeaderType;
785
+ /**
786
+ * SelectHeader 사이즈
787
+ * - "medium": Web~Tab 권장 사이즈
788
+ * - "small": Mo 권장 사이즈
789
+ * - 지정하지 않으면 breakpoint에 따라 자동 결정됨.
790
+ */
791
+ size?: SelectHeaderSize;
792
+ /** Title 텍스트 */
793
+ title?: string;
794
+ /** 필수 필드 표시 여부 */
795
+ required?: boolean;
796
+ /** 선택된 값 표시 (items 없을 때) / 선택된 값 controlled (items 있을 때) */
797
+ value?: string | string[] | null;
798
+ /** 플레이스홀더 텍스트 */
799
+ placeholder?: string;
800
+ /** 비활성화 상태 */
801
+ disabled?: boolean;
802
+ /** 에러 상태 */
803
+ error?: boolean;
804
+ /** Help text (도움말 텍스트) */
805
+ description?: React.ReactNode;
806
+ /** Help text 아이콘 (true면 기본 아이콘, 노드면 커스텀, false면 아이콘 없음) */
807
+ accentIcon?: boolean | React.ReactNode;
808
+ /** 클릭 핸들러 */
809
+ onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;
810
+ /** 값 클리어 핸들러 */
811
+ onClear?: (event: React.MouseEvent<HTMLButtonElement>) => void;
812
+ /** 커스텀 아이콘 */
813
+ icon?: React.ReactNode;
814
+ /** SelectMenu 항목들 (있으면 클릭 시 메뉴 열림) */
815
+ items?: SelectMenuItem[];
816
+ /** 초기 선택 값 (uncontrolled, items 있을 때) */
817
+ defaultValue?: string | string[];
818
+ /** 값 변경 핸들러 (items 있을 때) */
819
+ onChange?: (value: string | string[] | undefined) => void;
820
+ /** 다중 선택 허용 여부 (items 있을 때) */
821
+ multiple?: boolean;
822
+ /** 래퍼(Wrapper)에 적용할 클래스 이름 */
823
+ wrapperClassName?: string;
824
+ /** 래퍼(Wrapper)에 적용할 인라인 스타일 */
825
+ wrapperStyle?: React.CSSProperties;
826
+ /** 너비 설정 (예: "100%", "300px"). 설정 시 max-width 제한이 해제됨 */
827
+ width?: string | number;
828
+ }
829
+ /** SelectHeader 컴포넌트는 선택된 값을 표시하고 드롭다운을 여는 헤더 컴포넌트다. items를 주면 클릭 시 메뉴가 열린다. */
830
+ declare const SelectHeader: React.ForwardRefExoticComponent<SelectHeaderProps & React.RefAttributes<HTMLButtonElement>>;
831
+
832
+ type PaginationType = "basic" | "compact";
833
+ interface PaginationProps {
834
+ /** 총 페이지 수 (1 이상) */
835
+ totalPages: number;
836
+ /** 현재 페이지 (1부터 시작) */
837
+ currentPage: number;
838
+ /** 페이지 변경 핸들러 */
839
+ onChange?: (page: number) => void;
840
+ /** Pagination 타입 (기본형 / 축약형) */
841
+ type?: PaginationType;
842
+ /** 추가 CSS 클래스명 */
843
+ className?: string;
844
+ }
845
+ /** Pagination 컴포넌트는 리스트/테이블 등에서 여러 페이지를 탐색할 때 사용하는 페이지네이션 컴포넌트다. */
846
+ declare const Pagination: {
847
+ ({ totalPages, currentPage, onChange, type, className, ...rest }: PaginationProps): react_jsx_runtime.JSX.Element;
848
+ displayName: string;
849
+ };
850
+
851
+ interface RadioButtonProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "type" | "size" | "onChange"> {
852
+ /** 라디오 라벨 */
853
+ label?: React.ReactNode;
854
+ /** label 스타일 오버라이드 (옵션) */
855
+ labelProps?: Omit<React.ComponentProps<typeof Text>, "children" | "variant"> & {
856
+ variant?: React.ComponentProps<typeof Text>["variant"];
857
+ };
858
+ /** 라디오 설명 텍스트 */
859
+ description?: React.ReactNode;
860
+ /** 라디오 값 (RadioButton.Group에서 사용) */
861
+ value?: string;
862
+ /** 라디오 상태 변경 핸들러 */
863
+ onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;
864
+ }
865
+ /** RadioButton은 단일 선택(라디오) 입력 컴포넌트다. */
866
+ declare const RadioButton: React.ForwardRefExoticComponent<RadioButtonProps & React.RefAttributes<HTMLInputElement>>;
867
+ interface RadioButtonGroupProps {
868
+ /** 그룹 라벨 */
869
+ label?: React.ReactNode;
870
+ /** 그룹 라벨 스타일 오버라이드 (옵션) */
871
+ labelProps?: Omit<React.ComponentProps<typeof Text>, "children" | "variant"> & {
872
+ variant?: React.ComponentProps<typeof Text>["variant"];
873
+ };
874
+ /** 그룹 설명 */
875
+ description?: React.ReactNode;
876
+ /** 그룹 설명 스타일 오버라이드 (옵션) */
877
+ descriptionProps?: Omit<React.ComponentProps<typeof Text>, "children" | "variant"> & {
878
+ variant?: React.ComponentProps<typeof Text>["variant"];
879
+ };
880
+ /** 선택된 값 (controlled) */
881
+ value?: string;
882
+ /** 초기 선택 값 (uncontrolled) */
883
+ defaultValue?: string;
884
+ /** 값 변경 핸들러 (선택 해제 시 value는 undefined) */
885
+ onChange?: (value: string | undefined) => void;
886
+ /** 비활성화 상태 */
887
+ disabled?: boolean;
888
+ /** name (미지정 시 내부 생성) */
889
+ name?: string;
890
+ /** 자식 RadioButton 컴포넌트들 */
891
+ children: React.ReactNode;
892
+ /** 추가 CSS 클래스명 */
893
+ className?: string;
894
+ }
895
+ /** RadioButton.Group은 여러 RadioButton을 그룹화하여 단일 선택을 관리한다. */
896
+ declare const RadioButtonGroup: {
897
+ ({ label, labelProps, description, descriptionProps, value: valueProp, defaultValue, onChange, disabled, name, children, className, }: RadioButtonGroupProps): react_jsx_runtime.JSX.Element;
898
+ displayName: string;
899
+ };
900
+
901
+ type BadgeVariant = "primary" | "secondary" | "progressing" | "success" | "warning" | "error" | "disabled";
902
+ type BadgeType = "number" | "dot";
903
+ interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
904
+ /** number: 글자(숫자/문자) 표시, dot: 점만 표시 */
905
+ type?: BadgeType;
906
+ /** Badge variant (primary, secondary, progressing, success, warning, error, disabled) */
907
+ variant?: BadgeVariant;
908
+ /** Badge 값 (type이 number일 때 표시할 숫자 또는 글자) */
909
+ value?: number | string;
910
+ /** 최대 표시 숫자 (숫자일 때 이 값을 넘으면 maxValue+ 형태로 표시) */
911
+ maxValue?: number;
912
+ }
913
+ /** Badge 컴포넌트는 알림 카운트, 상태 등을 시각적으로 표현하는 원형 라벨 컴포넌트다. */
914
+ declare const Badge: ({ type, variant, value, maxValue, className, ...props }: BadgeProps) => react_jsx_runtime.JSX.Element;
915
+
916
+ type TagType = "solid" | "outline" | "weak";
917
+ type TagSize = "medium" | "small";
918
+ type TagState = "enabled" | "error" | "progress" | "warning" | "success";
919
+ interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {
920
+ /** 태그 타입 (solid, outline, weak) */
921
+ type?: TagType;
922
+ /** 태그 크기 */
923
+ size?: TagSize;
924
+ /** 태그 상태 (type이 weak일 때만 사용 가능) */
925
+ state?: TagState;
926
+ /** 태그 라벨 */
927
+ label: React.ReactNode;
928
+ /** Prefix 아이콘 */
929
+ prefixIcon?: React.ReactNode;
930
+ /** Suffix 아이콘 */
931
+ suffixIcon?: React.ReactNode;
932
+ }
933
+ /** Tag 컴포넌트는 콘텐츠의 속성, 상태, 카테고리를 시각적으로 표현하는 읽기 전용 라벨 컴포넌트다. */
934
+ declare const Tag: ({ type, size, state, label, prefixIcon, suffixIcon, className, ...props }: TagProps) => react_jsx_runtime.JSX.Element;
935
+
936
+ type TooltipPosition = "top" | "top-start" | "top-end" | "bottom" | "bottom-start" | "bottom-end" | "left" | "left-start" | "left-end" | "right" | "right-start" | "right-end";
937
+ type TooltipType = "word" | "sentence";
938
+ interface TooltipProps {
939
+ /** 툴팁에 표시할 내용 */
940
+ label: React.ReactNode;
941
+ /** 툴팁 타입 (word: 단어형, sentence: 장문형) */
942
+ type?: TooltipType;
943
+ /** Prefix 아이콘 (왼쪽) */
944
+ prefixIcon?: React.ReactNode;
945
+ /** Close 버튼 클릭 핸들러 (제공 시 닫기 버튼이 표시됨) */
946
+ onClose?: (e: React.MouseEvent<HTMLButtonElement>) => void;
947
+ /** 툴팁이 표시될 방향 */
948
+ direction?: TooltipPosition;
949
+ /** 화살표 표시 여부 */
950
+ withArrow?: boolean;
951
+ /** 툴팁 열림 상태 (controlled) */
952
+ opened?: boolean;
953
+ /** 툴팁 초기 열림 상태 (uncontrolled) */
954
+ defaultOpened?: boolean;
955
+ /** 툴팁 비활성화 */
956
+ disabled?: boolean;
957
+ /** 툴팁 너비 */
958
+ width?: number | string;
959
+ /** 툴팁 오프셋 (px) */
960
+ offset?: number;
961
+ /** 포털 사용 여부 */
962
+ withinPortal?: boolean;
963
+ /** 툴팁 표시 지연 시간 (ms) */
964
+ openDelay?: number;
965
+ /** 툴팁 숨김 지연 시간 (ms) */
966
+ closeDelay?: number;
967
+ /** 툴팁이 표시될 대상 요소 */
968
+ children: React.ReactElement;
969
+ /** 추가 클래스명 */
970
+ className?: string;
971
+ }
972
+ /** Tooltip 컴포넌트는 사용자에게 추가 정보나 설명을 제공하는 작은 팝오버입니다. */
973
+ declare const Tooltip: ({ label, type, prefixIcon, onClose, direction, withArrow, opened: openedProp, defaultOpened, disabled, width, offset, withinPortal, openDelay, closeDelay, children, className, }: TooltipProps) => react_jsx_runtime.JSX.Element;
974
+
975
+ type ToastSize = "medium" | "small";
976
+ type ToastState = "default" | "error" | "warning" | "success" | "information";
977
+ type ToastPosition = "top" | "bottom";
978
+ type ToastHorizontalAlign = "center" | "left" | "right";
979
+ interface ToastProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "style"> {
980
+ /** Toast 크기. 미지정 시 breakpoint 기준(tablet 미만: small, 이상: medium). 지정 시 해당 값으로 오버라이드 */
981
+ size?: ToastSize;
982
+ /** Toast 상태 (default, error, warning, success, information) */
983
+ state?: ToastState;
984
+ /** Toast 메시지 */
985
+ label: React.ReactNode;
986
+ /** State 아이콘 (state에 따라 자동으로 표시되지만, 커스텀 아이콘을 전달할 수 있음) */
987
+ icon?: React.ReactNode;
988
+ /** Toast 위치 (top: 상단, bottom: 하단) - 기본값: top */
989
+ position?: ToastPosition;
990
+ /** 수평 정렬 (center: 중앙, left: 왼쪽, right: 오른쪽) - 기본값: center */
991
+ horizontalAlign?: ToastHorizontalAlign;
992
+ /** 상단 여백 (px) - 기본값: medium일 때 60px, small일 때 20px */
993
+ topOffset?: number;
994
+ /** 하단 여백 (px) - 기본값: 20px */
995
+ bottomOffset?: number;
996
+ /** 좌우 여백 (px) - small 사이즈일 때만 적용, 기본값: 16px */
997
+ horizontalPadding?: number;
998
+ /** 추가 스타일 (position이 명시되면 fixed position 로직을 건너뜁니다) */
999
+ style?: React.CSSProperties;
1000
+ }
1001
+ /** Toast 컴포넌트는 화면에 짧은 시간 동안 나타났다가 자동으로 사라지는 경량 알림 컴포넌트다. */
1002
+ declare const Toast: (props: ToastProps) => react_jsx_runtime.JSX.Element;
1003
+ interface ToastOptions {
1004
+ /** Toast 상태 */
1005
+ state?: ToastState;
1006
+ /** Toast 크기 */
1007
+ size?: ToastSize;
1008
+ /** 자동으로 사라지는 시간 (ms) - 기본값: 3000 */
1009
+ duration?: number;
1010
+ /** Toast 위치 */
1011
+ position?: ToastPosition;
1012
+ /** 수평 정렬 */
1013
+ horizontalAlign?: ToastHorizontalAlign;
1014
+ /** 상단 여백 */
1015
+ topOffset?: number;
1016
+ /** 하단 여백 */
1017
+ bottomOffset?: number;
1018
+ /** 좌우 여백 */
1019
+ horizontalPadding?: number;
1020
+ }
1021
+ interface ToastContextType {
1022
+ showToast: (message: string, options?: ToastOptions) => void;
1023
+ hideToast: (id: string) => void;
1024
+ }
1025
+ /**
1026
+ * ToastProvider
1027
+ *
1028
+ * 앱의 최상위(Root)에 선언하여 전역 Toast 기능을 제공합니다.
1029
+ * Portal을 사용하여 document.body에 Toast를 렌더링합니다.
1030
+ */
1031
+ declare const ToastProvider: ({ children }: {
1032
+ children: React.ReactNode;
1033
+ }) => react_jsx_runtime.JSX.Element;
1034
+ /**
1035
+ * useToast Hook
1036
+ *
1037
+ * ToastProvider 내부의 컴포넌트에서 호출하여 사용합니다.
1038
+ * { showToast } 함수를 반환합니다.
1039
+ *
1040
+ * @example
1041
+ * const { showToast } = useToast();
1042
+ * showToast("메시지", { state: "success" });
1043
+ */
1044
+ declare function useToast(): ToastContextType;
1045
+
1046
+ type LogoType = "likelion-eng" | "likelion-kr" | "bootcamp" | "symbol" | "favicon" | "og-image";
1047
+ type LogoVariant = "primary" | "secondary" | "white";
1048
+ type LogoSize = "large" | "medium" | "small" | "favicon" | "og-image";
1049
+ interface LogoProps extends React.HTMLAttributes<HTMLDivElement> {
1050
+ /** 로고 타입 */
1051
+ type?: LogoType;
1052
+ /** 로고 색상 변형 */
1053
+ variant?: LogoVariant;
1054
+ /** 로고 크기 */
1055
+ size?: LogoSize;
1056
+ /** 서비스 타입 (og-image용) */
1057
+ service?: "likelion" | "bootcamp";
1058
+ }
1059
+ /** Logo 컴포넌트는 브랜드 아이덴티티를 표현하는 로고 컴포넌트다. */
1060
+ declare const Logo: ({ type, variant, size, service, className, ...props }: LogoProps) => react_jsx_runtime.JSX.Element;
1061
+
1062
+ interface BreakpointContextType {
1063
+ isMobile?: boolean;
1064
+ isTablet?: boolean;
1065
+ isDesktop?: boolean;
1066
+ isUnderTablet?: boolean;
1067
+ }
1068
+ declare const BreakpointProvider: React.Provider<BreakpointContextType | null>;
1069
+ declare function useMediaQuery(query: string): boolean;
1070
+ /**
1071
+ * 프로젝트 브레이크포인트 전용 훅
1072
+ */
1073
+ declare function useBreakpoint(): {
1074
+ isMobile: boolean;
1075
+ isTablet: boolean;
1076
+ isDesktop: boolean;
1077
+ isUnderTablet: boolean;
1078
+ };
1079
+
1080
+ declare const BREAKPOINTS: {
1081
+ readonly mobile: {
1082
+ readonly min: 375;
1083
+ readonly max: 743;
1084
+ };
1085
+ readonly tablet: {
1086
+ readonly min: 744;
1087
+ readonly max: 1279;
1088
+ };
1089
+ readonly desktop: {
1090
+ readonly min: 1280;
1091
+ };
1092
+ };
1093
+ declare const TAILWIND_SCREENS: {
1094
+ readonly mo: "375px";
1095
+ readonly tb: "744px";
1096
+ readonly pc: "1280px";
1097
+ };
1098
+ declare const MEDIA_QUERIES: {
1099
+ readonly mobile: "(min-width: 375px) and (max-width: 743px)";
1100
+ readonly tablet: "(min-width: 744px) and (max-width: 1279px)";
1101
+ readonly desktop: "(min-width: 1280px)";
1102
+ readonly underTablet: "(max-width: 743px)";
1103
+ };
1104
+ declare const LAYOUT_SYSTEM: {
1105
+ readonly mobile: {
1106
+ readonly margin: 16;
1107
+ readonly column: 4;
1108
+ readonly gutter: 16;
1109
+ };
1110
+ readonly tablet: {
1111
+ readonly margin: 24;
1112
+ readonly column: 8;
1113
+ readonly gutter: 24;
1114
+ };
1115
+ readonly desktop: {
1116
+ readonly margin: 24;
1117
+ readonly column: 12;
1118
+ readonly gutter: 24;
1119
+ };
243
1120
  };
244
1121
 
245
- export { ActionButton, type ActionButtonProps, ActionButton as Button, type ButtonColor, type ActionButtonProps as ButtonProps, type ButtonSize, type ButtonState, type ButtonType, Chip, ChipGroup, type ChipGroupProps, type ChipProps, type ChipSize, type ChipType, type ChipVariant, Dialog, type DialogActionColor, type DialogActionItem, type DialogActionSize, type DialogActionType, type DialogAlign, type DialogFooterLayout, type DialogOpenOptions, type DialogProps, type DialogVariant, IconButton, type IconButtonColor, type IconButtonProps, type IconButtonSize, type IconButtonState, type IconButtonType, Tab, TabGroup, type TabGroupProps, type TabProps, type TabSize, type TabType, useDialog };
1122
+ export { ActionButton, type ActionButtonProps, type AlertOptions, BREAKPOINTS, Badge, type BadgeProps, type BadgeType, type BadgeVariant, BreakpointProvider, ActionButton as Button, type ButtonColor, type ActionButtonProps as ButtonProps, type ButtonSize, type ButtonState, type ButtonType, Checkbox, CheckboxGroup, type CheckboxGroupProps, type CheckboxProps, Chip, ChipGroup, type ChipGroupProps, type ChipProps, type ChipSize, type ChipType, type ChipVariant, type ConfirmOptions, Dialog, type DialogActionColor, type DialogActionItem, type DialogActionSize, type DialogActionType, type DialogAlign, type DialogFooterLayout, type DialogOptions, type DialogProps, DialogProvider, type DialogVariant, IconButton, type IconButtonColor, type IconButtonProps, type IconButtonSize, type IconButtonState, type IconButtonType, LAYOUT_SYSTEM, Logo, type LogoProps, type LogoSize, type LogoType, type LogoVariant, MEDIA_QUERIES, Pagination, type PaginationProps, RadioButton, RadioButtonGroup, type RadioButtonGroupProps, type RadioButtonProps, SelectHeader, type SelectHeaderProps, type SelectHeaderType, SelectMenu, type SelectMenuItem, SelectMenuOverlay, type SelectMenuOverlayProps, type SelectMenuProps, TAILWIND_SCREENS, Tab, TabGroup, type TabGroupProps, type TabProps, type TabSize, type TabType, Tag, type TagProps, type TagSize, type TagState, type TagType, Text, type TextDecoration, TextInput, type TextInputProps, type TextInputSize, type TextInputState, type TextProps, type TextVariant, Toast, type ToastHorizontalAlign, type ToastOptions, type ToastPosition, type ToastProps, ToastProvider, type ToastSize, type ToastState, Toggle, type ToggleProps, type ToggleSize, Tooltip, type TooltipPosition, type TooltipProps, type TooltipType, type UseCheckboxGroupOptions, type UseCheckboxGroupResult, useBreakpoint, useCheckboxGroup, useDialog, useMediaQuery, useToast };