@bestow-ui/react 1.0.0 → 1.2.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.
package/dist/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as _bestow_ui_tokens from '@bestow-ui/tokens';
2
2
  import { space } from '@bestow-ui/tokens';
3
3
  import * as react from 'react';
4
- import { ReactNode, HTMLAttributes, CSSProperties, ComponentPropsWithoutRef, InputHTMLAttributes, ElementType, ButtonHTMLAttributes, AnchorHTMLAttributes, ReactElement, TdHTMLAttributes, ThHTMLAttributes, TextareaHTMLAttributes } from 'react';
4
+ import { ReactNode, HTMLAttributes, ElementType, CSSProperties, ComponentPropsWithoutRef, InputHTMLAttributes, ButtonHTMLAttributes, AnchorHTMLAttributes, ReactElement, TdHTMLAttributes, ThHTMLAttributes, TextareaHTMLAttributes } from 'react';
5
5
  import * as RadixAccordion from '@radix-ui/react-accordion';
6
6
  import * as Dialog from '@radix-ui/react-dialog';
7
7
  import * as RadixMenu from '@radix-ui/react-dropdown-menu';
@@ -285,6 +285,16 @@ interface BestowMessages {
285
285
  /** Combobox — "결과가 없어요", "목록 열기" */
286
286
  noResults: string;
287
287
  openList: string;
288
+ /**
289
+ * Combobox clearable — "선택 지우기".
290
+ * 1.0 이후에 추가한 키는 선택(?)으로 둔다 — 직접 만든 BestowMessages 객체(다른 언어 묶음)가 타입 오류로 깨지지 않게.
291
+ */
292
+ clearSelection?: string;
293
+ /** SkipLink — "본문 바로가기" (1.0 이후 추가, 선택 키) */
294
+ skipToContent?: string;
295
+ /** NumberInput −/+ 버튼 — "줄이기", "늘리기" (1.0 이후 추가, 선택 키) */
296
+ decrement?: string;
297
+ increment?: string;
288
298
  /** Slider 범위 손잡이 — "최소", "최대" */
289
299
  rangeStart: string;
290
300
  rangeEnd: string;
@@ -440,6 +450,118 @@ interface AgreementItem {
440
450
  /** 필수 항목에 모두 동의했는지 */
441
451
  declare function hasAllRequiredAgreements(items: AgreementItem[], value: string[]): boolean;
442
452
 
453
+ interface BadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'color'> {
454
+ /** 시각적 스타일 */
455
+ variant?: 'solid' | 'soft' | 'outline';
456
+ /** 의미 색상 */
457
+ color?: 'primary' | 'neutral' | 'danger' | 'success' | 'warning';
458
+ /** 크기 */
459
+ size?: 'sm' | 'md' | 'lg';
460
+ /** 텍스트 앞에 표시할 아이콘 (장식용 — 의미는 텍스트로 전달한다) */
461
+ startIcon?: ReactNode;
462
+ }
463
+ declare const Badge: react.ForwardRefExoticComponent<BadgeProps & react.RefAttributes<HTMLSpanElement>>;
464
+
465
+ interface CardProps extends HTMLAttributes<HTMLElement> {
466
+ /** 시각적 스타일. outline 은 테두리, elevated 는 그림자(다크 모드는 가장자리 ring 포함), soft 는 옅은 배경 */
467
+ variant?: 'outline' | 'elevated' | 'soft';
468
+ /** 안쪽 여백 (sm 16px, md 24px, lg 32px). 이미지를 가장자리까지 붙이려면 none */
469
+ padding?: 'none' | 'sm' | 'md' | 'lg';
470
+ /** 렌더링할 요소 (기본 div). 목록이면 li, 독립된 콘텐츠면 article 등 */
471
+ as?: ElementType;
472
+ }
473
+ /** 배경·테두리·radius·padding 을 가진 컨테이너. 자식 사이 간격은 16px. */
474
+ declare const Card: react.ForwardRefExoticComponent<CardProps & react.RefAttributes<HTMLElement>>;
475
+ type CardSectionProps = HTMLAttributes<HTMLDivElement>;
476
+ /** 제목·설명 영역. Typography 와 함께 쓴다. */
477
+ declare const CardHeader: react.ForwardRefExoticComponent<CardSectionProps & react.RefAttributes<HTMLDivElement>>;
478
+ /** 본문 영역 */
479
+ declare const CardBody: react.ForwardRefExoticComponent<CardSectionProps & react.RefAttributes<HTMLDivElement>>;
480
+ /** 버튼 등 동작 영역. 오른쪽 정렬 */
481
+ declare const CardFooter: react.ForwardRefExoticComponent<CardSectionProps & react.RefAttributes<HTMLDivElement>>;
482
+
483
+ interface DividerProps extends HTMLAttributes<HTMLDivElement> {
484
+ /** 방향. vertical 은 flex 행 안에서 부모 높이를 채운다 */
485
+ orientation?: 'horizontal' | 'vertical';
486
+ /** 시각적 구분만 하고 의미가 없으면 true — 스크린리더에서 숨긴다 */
487
+ decorative?: boolean;
488
+ /**
489
+ * 가운데에 표시할 텍스트 (예: "또는"). horizontal 에서만 쓴다.
490
+ * separator 역할의 자식은 스크린리더가 읽지 않으므로, 텍스트가 있으면 선만 숨기고 텍스트는 읽히게 둔다.
491
+ */
492
+ children?: ReactNode;
493
+ }
494
+ declare const Divider: react.ForwardRefExoticComponent<DividerProps & react.RefAttributes<HTMLDivElement>>;
495
+
496
+ interface ProgressProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'> {
497
+ /** 현재 값 (0 ~ max). 생략하거나 null 이면 진행률을 모르는 상태(indeterminate)로 움직이는 막대를 보여 준다 */
498
+ value?: number | null;
499
+ /** 최댓값 */
500
+ max?: number;
501
+ /** 막대 위에 보이는 레이블. progressbar 의 이름이 된다 */
502
+ label?: ReactNode;
503
+ /** 레이블이 없을 때 스크린리더용 이름 */
504
+ 'aria-label'?: string;
505
+ /** 오른쪽에 값 텍스트(기본 "42%")를 보여 준다 */
506
+ showValue?: boolean;
507
+ /** 값 텍스트 형식. 화면 표시와 스크린리더(aria-valuetext)에 함께 쓴다 (예: (v, max) => `${v}/${max}개`) */
508
+ formatValue?: (value: number, max: number) => string;
509
+ /** 막대 두께 (sm 4px · md 8px · lg 12px) */
510
+ size?: 'sm' | 'md' | 'lg';
511
+ /** 의미 색상 */
512
+ color?: 'primary' | 'neutral' | 'success' | 'warning' | 'danger';
513
+ }
514
+ declare const Progress: react.ForwardRefExoticComponent<ProgressProps & react.RefAttributes<HTMLDivElement>>;
515
+
516
+ interface SkeletonProps extends HTMLAttributes<HTMLSpanElement> {
517
+ /** 모양. text 는 글자 높이(1em), circle 은 width 를 지름으로 쓴다 */
518
+ variant?: 'text' | 'rect' | 'circle';
519
+ /** 너비. 숫자는 px (기본: text·rect 100%, circle 40px) */
520
+ width?: number | string;
521
+ /** 높이. 숫자는 px (기본: text 1em, rect 100px, circle 은 width 와 같음) */
522
+ height?: number | string;
523
+ /** text 에서 여러 줄을 그린다. 마지막 줄은 60% 너비 */
524
+ lines?: number;
525
+ }
526
+ /**
527
+ * 콘텐츠를 불러오는 동안 자리를 표시한다. 장식용이라 스크린리더에서 숨긴다 —
528
+ * 로딩 중인 영역(감싸는 요소)에 `aria-busy="true"` 를 붙여 상태를 알린다.
529
+ */
530
+ declare const Skeleton: react.ForwardRefExoticComponent<SkeletonProps & react.RefAttributes<HTMLSpanElement>>;
531
+
532
+ interface StackProps extends HTMLAttributes<HTMLElement> {
533
+ /** 렌더링할 요소 */
534
+ as?: ElementType;
535
+ /** 배치 방향 */
536
+ direction?: 'row' | 'column' | 'row-reverse' | 'column-reverse';
537
+ /** 자식 사이 간격 (space 토큰 키) */
538
+ gap?: keyof typeof space;
539
+ /** 교차축 정렬 (align-items) */
540
+ align?: 'start' | 'center' | 'end' | 'stretch' | 'baseline';
541
+ /** 주축 정렬 (justify-content) */
542
+ justify?: 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';
543
+ /** 줄바꿈 허용 */
544
+ wrap?: boolean;
545
+ }
546
+ declare const Stack: react.ForwardRefExoticComponent<StackProps & react.RefAttributes<HTMLElement>>;
547
+
548
+ type TypographyVariant = 'display' | 'h1' | 'h2' | 'h3' | 'h4' | 'body-lg' | 'body' | 'body-sm' | 'caption';
549
+ interface TypographyProps extends Omit<HTMLAttributes<HTMLElement>, 'color'> {
550
+ /** 텍스트 스타일 */
551
+ variant?: TypographyVariant;
552
+ /** 렌더링할 요소. 기본값은 variant 에 따라 결정된다 (h1, p, span 등) */
553
+ as?: ElementType;
554
+ /** 글자 색상 */
555
+ color?: 'default' | 'muted' | 'subtle' | 'primary' | 'danger' | 'success' | 'warning' | 'inherit';
556
+ /** variant 의 기본 굵기를 덮어쓴다 */
557
+ weight?: 'regular' | 'medium' | 'semibold' | 'bold';
558
+ /** 정렬 */
559
+ align?: 'start' | 'center' | 'end';
560
+ /** 한 줄로 자르고 말줄임표를 표시한다 */
561
+ truncate?: boolean;
562
+ }
563
+ declare const Typography: react.ForwardRefExoticComponent<TypographyProps & react.RefAttributes<HTMLElement>>;
564
+
443
565
  interface ThemeProviderProps extends HTMLAttributes<HTMLDivElement> {
444
566
  /** 라이트/다크 모드. 생략하면 바깥 ThemeProvider 의 모드를 이어받는다 (최상위는 light). */
445
567
  theme?: ThemeName;
@@ -601,6 +723,19 @@ interface TextFieldProps extends Omit<InputProps, 'invalid'> {
601
723
  helperText?: ReactNode;
602
724
  /** 에러 상태 */
603
725
  error?: boolean;
726
+ /** 필수 입력 (레이블에 * 표시, required 속성) */
727
+ required?: boolean;
728
+ disabled?: boolean;
729
+ /** 크기 */
730
+ size?: 'sm' | 'md' | 'lg';
731
+ /** 부모 너비를 꽉 채운다 */
732
+ fullWidth?: boolean;
733
+ /** 입력창 앞에 표시할 요소 (아이콘, 단위 등) */
734
+ startAdornment?: ReactNode;
735
+ /** 입력창 뒤에 표시할 요소 */
736
+ endAdornment?: ReactNode;
737
+ placeholder?: string;
738
+ type?: InputHTMLAttributes<HTMLInputElement>['type'];
604
739
  }
605
740
  declare const TextField: react.ForwardRefExoticComponent<TextFieldProps & react.RefAttributes<HTMLInputElement>>;
606
741
 
@@ -620,6 +755,22 @@ interface AmountInputProps extends Omit<TextFieldProps, 'value' | 'defaultValue'
620
755
  * helperText 를 주면 그 아래 줄로 함께 보여 준다.
621
756
  */
622
757
  showKoreanAmount?: boolean;
758
+ /** 입력창 위에 표시할 레이블 */
759
+ label?: ReactNode;
760
+ /** 입력창 아래에 표시할 도움말. error 일 때는 에러 메시지로 표시된다 */
761
+ helperText?: ReactNode;
762
+ /** 에러 상태 */
763
+ error?: boolean;
764
+ /** 필수 입력 (레이블에 * 표시, required 속성) */
765
+ required?: boolean;
766
+ disabled?: boolean;
767
+ /** 크기 */
768
+ size?: 'sm' | 'md' | 'lg';
769
+ /** 부모 너비를 꽉 채운다 */
770
+ fullWidth?: boolean;
771
+ placeholder?: string;
772
+ /** form 제출 시 사용할 이름 */
773
+ name?: string;
623
774
  }
624
775
  /**
625
776
  * 금액 입력. 천 단위 쉼표를 넣고 뒤에 단위("원")를 붙이며, 아래에 "12만 5,000원" 처럼 읽기 쉬운 금액을 보여 준다.
@@ -643,18 +794,6 @@ interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {
643
794
  }
644
795
  declare const Avatar: react.ForwardRefExoticComponent<AvatarProps & react.RefAttributes<HTMLSpanElement>>;
645
796
 
646
- interface BadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'color'> {
647
- /** 시각적 스타일 */
648
- variant?: 'solid' | 'soft' | 'outline';
649
- /** 의미 색상 */
650
- color?: 'primary' | 'neutral' | 'danger' | 'success' | 'warning';
651
- /** 크기 */
652
- size?: 'sm' | 'md' | 'lg';
653
- /** 텍스트 앞에 표시할 아이콘 (장식용 — 의미는 텍스트로 전달한다) */
654
- startIcon?: ReactNode;
655
- }
656
- declare const Badge: react.ForwardRefExoticComponent<BadgeProps & react.RefAttributes<HTMLSpanElement>>;
657
-
658
797
  interface BreadcrumbItemData {
659
798
  /** 표시할 이름 */
660
799
  label: ReactNode;
@@ -693,6 +832,22 @@ interface BusinessNumberInputProps extends Omit<TextFieldProps, 'value' | 'defau
693
832
  validate?: boolean;
694
833
  /** 자동 검증 오류 문구 */
695
834
  invalidText?: string;
835
+ /** 입력창 위에 표시할 레이블 */
836
+ label?: ReactNode;
837
+ /** 입력창 아래에 표시할 도움말. error 일 때는 에러 메시지로 표시된다 */
838
+ helperText?: ReactNode;
839
+ /** 에러 상태 */
840
+ error?: boolean;
841
+ /** 필수 입력 (레이블에 * 표시, required 속성) */
842
+ required?: boolean;
843
+ disabled?: boolean;
844
+ /** 크기 */
845
+ size?: 'sm' | 'md' | 'lg';
846
+ /** 부모 너비를 꽉 채운다 */
847
+ fullWidth?: boolean;
848
+ placeholder?: string;
849
+ /** form 제출 시 사용할 이름 */
850
+ name?: string;
696
851
  }
697
852
  /**
698
853
  * 사업자등록번호 입력. 123-45-67890 형식으로 하이픈을 넣고, 10자리를 채우면 검증 공식으로 확인한다.
@@ -755,24 +910,6 @@ interface CalendarProps {
755
910
  */
756
911
  declare const Calendar: react.ForwardRefExoticComponent<CalendarProps & react.RefAttributes<HTMLDivElement>>;
757
912
 
758
- interface CardProps extends HTMLAttributes<HTMLElement> {
759
- /** 시각적 스타일. outline 은 테두리, elevated 는 그림자(다크 모드는 가장자리 ring 포함), soft 는 옅은 배경 */
760
- variant?: 'outline' | 'elevated' | 'soft';
761
- /** 안쪽 여백 (sm 16px, md 24px, lg 32px). 이미지를 가장자리까지 붙이려면 none */
762
- padding?: 'none' | 'sm' | 'md' | 'lg';
763
- /** 렌더링할 요소 (기본 div). 목록이면 li, 독립된 콘텐츠면 article 등 */
764
- as?: ElementType;
765
- }
766
- /** 배경·테두리·radius·padding 을 가진 컨테이너. 자식 사이 간격은 16px. */
767
- declare const Card: react.ForwardRefExoticComponent<CardProps & react.RefAttributes<HTMLElement>>;
768
- type CardSectionProps = HTMLAttributes<HTMLDivElement>;
769
- /** 제목·설명 영역. Typography 와 함께 쓴다. */
770
- declare const CardHeader: react.ForwardRefExoticComponent<CardSectionProps & react.RefAttributes<HTMLDivElement>>;
771
- /** 본문 영역 */
772
- declare const CardBody: react.ForwardRefExoticComponent<CardSectionProps & react.RefAttributes<HTMLDivElement>>;
773
- /** 버튼 등 동작 영역. 오른쪽 정렬 */
774
- declare const CardFooter: react.ForwardRefExoticComponent<CardSectionProps & react.RefAttributes<HTMLDivElement>>;
775
-
776
913
  interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'> {
777
914
  /** 체크박스 옆에 표시할 레이블 */
778
915
  label?: ReactNode;
@@ -823,6 +960,13 @@ interface ComboboxProps {
823
960
  'aria-label'?: string;
824
961
  /** 목록 열기 버튼의 이름 */
825
962
  toggleLabel?: string;
963
+ /**
964
+ * 값이 있을 때 "선택 지우기" 버튼을 보여 준다. 버튼이 없어도 입력창 글자를 모두 지우고 닫으면(포커스 이동·Esc·Enter) 선택이 지워진다.
965
+ * 지우면 `onValueChange('')` 가 호출된다.
966
+ */
967
+ clearable?: boolean;
968
+ /** "선택 지우기" 버튼의 이름 */
969
+ clearLabel?: string;
826
970
  /** 입력창 래퍼 className */
827
971
  className?: string;
828
972
  }
@@ -873,19 +1017,6 @@ interface DatePickerProps {
873
1017
  */
874
1018
  declare const DatePicker: react.ForwardRefExoticComponent<DatePickerProps & react.RefAttributes<HTMLInputElement>>;
875
1019
 
876
- interface DividerProps extends HTMLAttributes<HTMLDivElement> {
877
- /** 방향. vertical 은 flex 행 안에서 부모 높이를 채운다 */
878
- orientation?: 'horizontal' | 'vertical';
879
- /** 시각적 구분만 하고 의미가 없으면 true — 스크린리더에서 숨긴다 */
880
- decorative?: boolean;
881
- /**
882
- * 가운데에 표시할 텍스트 (예: "또는"). horizontal 에서만 쓴다.
883
- * separator 역할의 자식은 스크린리더가 읽지 않으므로, 텍스트가 있으면 선만 숨기고 텍스트는 읽히게 둔다.
884
- */
885
- children?: ReactNode;
886
- }
887
- declare const Divider: react.ForwardRefExoticComponent<DividerProps & react.RefAttributes<HTMLDivElement>>;
888
-
889
1020
  interface DrawerProps {
890
1021
  /** 열림 상태 (제어 모드) */
891
1022
  open?: boolean;
@@ -954,6 +1085,41 @@ type DropdownMenuLabelProps = ComponentPropsWithoutRef<typeof RadixMenu.Label>;
954
1085
  declare const DropdownMenuLabel: react.ForwardRefExoticComponent<Omit<RadixMenu.DropdownMenuLabelProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
955
1086
  type DropdownMenuSeparatorProps = ComponentPropsWithoutRef<typeof RadixMenu.Separator>;
956
1087
  declare const DropdownMenuSeparator: react.ForwardRefExoticComponent<Omit<RadixMenu.DropdownMenuSeparatorProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1088
+ interface DropdownMenuCheckboxItemProps extends ComponentPropsWithoutRef<typeof RadixMenu.CheckboxItem> {
1089
+ /** 켜짐 여부. `'indeterminate'` 는 일부만 선택된 상태(− 표시) */
1090
+ checked?: boolean | 'indeterminate';
1091
+ /** 상태가 바뀔 때 */
1092
+ onCheckedChange?: (checked: boolean) => void;
1093
+ }
1094
+ /**
1095
+ * 켜고 끄는 항목 (role="menuitemcheckbox" + aria-checked). 기본으로 고르면 메뉴가 닫힌다 —
1096
+ * 여러 개를 이어서 바꾸게 하려면 `onSelect={(e) => e.preventDefault()}` 로 열어 둔다.
1097
+ */
1098
+ declare const DropdownMenuCheckboxItem: react.ForwardRefExoticComponent<DropdownMenuCheckboxItemProps & react.RefAttributes<HTMLDivElement>>;
1099
+ /**
1100
+ * 하나만 고르는 항목 묶음 (role="group"). 안에 `DropdownMenuRadioItem` 을 둔다.
1101
+ * 선택 상태를 스스로 갖지 않는다 — 항상 `value` + `onValueChange` 로 제어한다.
1102
+ */
1103
+ declare const DropdownMenuRadioGroup: react.ForwardRefExoticComponent<RadixMenu.DropdownMenuRadioGroupProps & react.RefAttributes<HTMLDivElement>>;
1104
+ type DropdownMenuRadioGroupProps = ComponentPropsWithoutRef<typeof RadixMenu.RadioGroup>;
1105
+ interface DropdownMenuRadioItemProps extends ComponentPropsWithoutRef<typeof RadixMenu.RadioItem> {
1106
+ /** 이 항목을 고르면 RadioGroup 의 value 가 된다 */
1107
+ value: string;
1108
+ }
1109
+ /** 묶음 안에서 하나만 고르는 항목 (role="menuitemradio" + aria-checked) */
1110
+ declare const DropdownMenuRadioItem: react.ForwardRefExoticComponent<DropdownMenuRadioItemProps & react.RefAttributes<HTMLDivElement>>;
1111
+ /** 하위 메뉴 루트. `open`/`defaultOpen`/`onOpenChange` 를 받는다 */
1112
+ declare const DropdownMenuSub: react.FC<RadixMenu.DropdownMenuSubProps>;
1113
+ type DropdownMenuSubProps = ComponentPropsWithoutRef<typeof RadixMenu.Sub>;
1114
+ interface DropdownMenuSubTriggerProps extends ComponentPropsWithoutRef<typeof RadixMenu.SubTrigger> {
1115
+ /** 텍스트 앞 아이콘 (장식용) */
1116
+ icon?: ReactNode;
1117
+ }
1118
+ /** 하위 메뉴를 여는 항목. → 또는 Enter·Space 로 열고 ← 로 닫는다 (오른쪽 화살표 표시는 장식) */
1119
+ declare const DropdownMenuSubTrigger: react.ForwardRefExoticComponent<DropdownMenuSubTriggerProps & react.RefAttributes<HTMLDivElement>>;
1120
+ type DropdownMenuSubContentProps = ComponentPropsWithoutRef<typeof RadixMenu.SubContent>;
1121
+ /** 하위 메뉴 목록. 부모 메뉴처럼 portal 로 그리고 테마를 이어받는다 */
1122
+ declare const DropdownMenuSubContent: react.ForwardRefExoticComponent<Omit<RadixMenu.DropdownMenuSubContentProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
957
1123
 
958
1124
  interface IconButtonProps extends Omit<ButtonProps, 'startIcon' | 'endIcon' | 'fullWidth' | 'children' | 'variant' | 'color' | 'size' | 'loading'> {
959
1125
  /** 시각적 스타일 (기본 ghost) */
@@ -1039,6 +1205,52 @@ declare function Modal({ open, defaultOpen, onOpenChange, trigger, title, descri
1039
1205
  */
1040
1206
  declare const ModalClose: react.ForwardRefExoticComponent<Dialog.DialogCloseProps & react.RefAttributes<HTMLButtonElement>>;
1041
1207
 
1208
+ interface NumberInputProps extends Omit<TextFieldProps, 'value' | 'defaultValue' | 'onChange' | 'type' | 'inputMode' | 'startAdornment' | 'endAdornment' | 'min' | 'max' | 'step' | 'role'> {
1209
+ /** 값 (제어 모드). 비어 있으면 null */
1210
+ value?: number | null;
1211
+ /** 처음 값 (비제어 모드) */
1212
+ defaultValue?: number | null;
1213
+ /** 값이 바뀔 때 호출된다. 비우면 null. 입력 중에는 범위를 벗어난 값도 오고, 포커스가 빠질 때 범위 안으로 맞춘 값이 온다 */
1214
+ onValueChange?: (value: number | null) => void;
1215
+ /** 최솟값. 0 이상이면 "-" 를 입력할 수 없다 */
1216
+ min?: number;
1217
+ /** 최댓값 */
1218
+ max?: number;
1219
+ /** ↑/↓·버튼으로 바꾸는 단위 (기본 1) */
1220
+ step?: number;
1221
+ /** PageUp/PageDown 으로 바꾸는 단위 (기본 step × 10) */
1222
+ largeStep?: number;
1223
+ /** 소수 자릿수 (기본: step 의 소수 자릿수 — step 0.1 이면 1). 0 이면 정수만 */
1224
+ precision?: number;
1225
+ /** 단위 (입력창 뒤에 표시, 스크린리더 값에도 붙는다 — 예: "개", "명") */
1226
+ unit?: string;
1227
+ /** 천 단위 쉼표 (기본 true) */
1228
+ thousandSeparator?: boolean;
1229
+ /** −/+ 버튼을 숨긴다 (키보드 ↑/↓ 는 그대로) */
1230
+ hideStepper?: boolean;
1231
+ /** 입력창 위에 표시할 레이블 */
1232
+ label?: ReactNode;
1233
+ /** 입력창 아래에 표시할 도움말. error 일 때는 에러 메시지로 표시된다 */
1234
+ helperText?: ReactNode;
1235
+ /** 에러 상태 */
1236
+ error?: boolean;
1237
+ /** 필수 입력 (레이블에 * 표시, required 속성) */
1238
+ required?: boolean;
1239
+ disabled?: boolean;
1240
+ /** 크기 */
1241
+ size?: 'sm' | 'md' | 'lg';
1242
+ /** 부모 너비를 꽉 채운다 */
1243
+ fullWidth?: boolean;
1244
+ placeholder?: string;
1245
+ /** form 제출 시 사용할 이름 (쉼표 없는 숫자로 제출된다) */
1246
+ name?: string;
1247
+ }
1248
+ /**
1249
+ * 숫자 입력 (수량·인원·나이 등). −/+ 버튼, ↑/↓·PageUp/PageDown 으로 바꾸고, 천 단위 쉼표를 넣는다.
1250
+ * WAI-ARIA spinbutton 패턴 — 스크린리더가 현재 값·최소·최대를 읽는다. 금액은 AmountInput(한글 금액 읽기)을 쓴다.
1251
+ */
1252
+ declare const NumberInput: react.ForwardRefExoticComponent<NumberInputProps & react.RefAttributes<HTMLInputElement>>;
1253
+
1042
1254
  /** getItemLabel 이 이름을 만드는 버튼 종류 */
1043
1255
  type PaginationItemType = 'previous' | 'next' | 'page';
1044
1256
  interface PaginationProps extends Omit<HTMLAttributes<HTMLElement>, 'onChange'> {
@@ -1068,6 +1280,22 @@ interface PhoneNumberInputProps extends Omit<TextFieldProps, 'value' | 'defaultV
1068
1280
  defaultValue?: string;
1069
1281
  /** 숫자만 있는 값으로 호출된다 (하이픈 없음) */
1070
1282
  onValueChange?: (digits: string) => void;
1283
+ /** 입력창 위에 표시할 레이블 */
1284
+ label?: ReactNode;
1285
+ /** 입력창 아래에 표시할 도움말. error 일 때는 에러 메시지로 표시된다 */
1286
+ helperText?: ReactNode;
1287
+ /** 에러 상태 */
1288
+ error?: boolean;
1289
+ /** 필수 입력 (레이블에 * 표시, required 속성) */
1290
+ required?: boolean;
1291
+ disabled?: boolean;
1292
+ /** 크기 */
1293
+ size?: 'sm' | 'md' | 'lg';
1294
+ /** 부모 너비를 꽉 채운다 */
1295
+ fullWidth?: boolean;
1296
+ placeholder?: string;
1297
+ /** form 제출 시 사용할 이름 */
1298
+ name?: string;
1071
1299
  }
1072
1300
  /**
1073
1301
  * 전화번호 입력. 입력하는 대로 하이픈을 넣고(010-1234-5678, 02-123-4567, 1588-1234), 값은 숫자만 넘긴다.
@@ -1114,26 +1342,6 @@ declare function Popover({ content, children, title, 'aria-label': ariaLabel, sh
1114
1342
  */
1115
1343
  declare const PopoverClose: react.ForwardRefExoticComponent<RadixPopover.PopoverCloseProps & react.RefAttributes<HTMLButtonElement>>;
1116
1344
 
1117
- interface ProgressProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'> {
1118
- /** 현재 값 (0 ~ max). 생략하거나 null 이면 진행률을 모르는 상태(indeterminate)로 움직이는 막대를 보여 준다 */
1119
- value?: number | null;
1120
- /** 최댓값 */
1121
- max?: number;
1122
- /** 막대 위에 보이는 레이블. progressbar 의 이름이 된다 */
1123
- label?: ReactNode;
1124
- /** 레이블이 없을 때 스크린리더용 이름 */
1125
- 'aria-label'?: string;
1126
- /** 오른쪽에 값 텍스트(기본 "42%")를 보여 준다 */
1127
- showValue?: boolean;
1128
- /** 값 텍스트 형식. 화면 표시와 스크린리더(aria-valuetext)에 함께 쓴다 (예: (v, max) => `${v}/${max}개`) */
1129
- formatValue?: (value: number, max: number) => string;
1130
- /** 막대 두께 (sm 4px · md 8px · lg 12px) */
1131
- size?: 'sm' | 'md' | 'lg';
1132
- /** 의미 색상 */
1133
- color?: 'primary' | 'neutral' | 'success' | 'warning' | 'danger';
1134
- }
1135
- declare const Progress: react.ForwardRefExoticComponent<ProgressProps & react.RefAttributes<HTMLDivElement>>;
1136
-
1137
1345
  interface RadioOption {
1138
1346
  value: string;
1139
1347
  label: ReactNode;
@@ -1170,8 +1378,56 @@ interface RadioGroupProps {
1170
1378
  /** 바깥 래퍼 className */
1171
1379
  className?: string;
1172
1380
  }
1381
+ /**
1382
+ * 여러 선택지 중 하나를 고르는 라디오 버튼 묶음.
1383
+ *
1384
+ * 네이티브 `<input type="radio">` 로 만든다 — 화살표 이동·선택, Tab 으로 들어오기, 비활성 건너뛰기, 폼 제출·`required` 검증을
1385
+ * 브라우저가 처리한다. (1.1 까지는 Radix RadioGroup 이었는데, Radix 는 "포커스가 옮겨질 때 화살표 키가 아직 눌려 있는지" 로
1386
+ * 선택을 정해서 키를 바로 떼는 입력(자동화·일부 보조기기)에서는 포커스만 옮겨지고 선택이 빠졌다 — E2E 에서 20회 중 19회.)
1387
+ */
1173
1388
  declare const RadioGroup: react.ForwardRefExoticComponent<RadioGroupProps & react.RefAttributes<HTMLDivElement>>;
1174
1389
 
1390
+ interface SegmentedControlOption {
1391
+ value: string;
1392
+ /** 칸에 보이는 글자 (접근 가능한 이름이 된다) */
1393
+ label: ReactNode;
1394
+ /** 글자 앞 아이콘 (장식용) */
1395
+ icon?: ReactNode;
1396
+ disabled?: boolean;
1397
+ }
1398
+ interface SegmentedControlProps {
1399
+ /** 선택지 (2~5개 권장 — 많으면 Select 를 쓴다) */
1400
+ options: SegmentedControlOption[];
1401
+ /** 선택된 값 (제어 모드) */
1402
+ value?: string;
1403
+ /** 처음 선택된 값 (비제어 모드) */
1404
+ defaultValue?: string;
1405
+ /** 값이 바뀔 때 호출된다 */
1406
+ onValueChange?: (value: string) => void;
1407
+ /** 위에 보이는 레이블. 없으면 aria-label 로 이름을 준다 */
1408
+ label?: ReactNode;
1409
+ /** label 이 없을 때 스크린리더용 이름 (예: "기간") */
1410
+ 'aria-label'?: string;
1411
+ /** 크기 — 전체 높이가 Button·Input 과 같다 (sm 32 / md 40 / lg 48) */
1412
+ size?: 'sm' | 'md' | 'lg';
1413
+ /** 부모 너비를 꽉 채우고 칸을 같은 너비로 나눈다 */
1414
+ fullWidth?: boolean;
1415
+ disabled?: boolean;
1416
+ /** form 제출 시 사용할 이름 */
1417
+ name?: string;
1418
+ id?: string;
1419
+ className?: string;
1420
+ }
1421
+ /**
1422
+ * 여러 값 중 하나를 고르는 칸 묶음 (기간 일/주/월, 보기 방식 등).
1423
+ * 의미는 라디오 그룹과 같다(WAI-ARIA radiogroup): Tab 으로 그룹에 들어가면 선택된 칸, 화살표로 옮기면 바로 선택된다.
1424
+ * 선택에 따라 아래 내용이 바뀌는 "패널" 이 있으면 Tabs 를 쓴다.
1425
+ *
1426
+ * Radix RadioGroup 을 쓰지 않고 직접 구현한다 — Radix 는 "포커스가 옮겨질 때 화살표 키가 아직 눌려 있는지" 로 선택을 정해서
1427
+ * 키를 아주 빨리 떼는 입력(자동화·일부 보조기기)에서는 포커스만 옮겨지고 선택이 안 되는 경우가 있었다(E2E 에서 약 20%).
1428
+ */
1429
+ declare const SegmentedControl: react.ForwardRefExoticComponent<SegmentedControlProps & react.RefAttributes<HTMLDivElement>>;
1430
+
1175
1431
  interface SelectOption {
1176
1432
  value: string;
1177
1433
  label: ReactNode;
@@ -1210,21 +1466,22 @@ interface SelectProps {
1210
1466
  }
1211
1467
  declare const Select: react.ForwardRefExoticComponent<SelectProps & react.RefAttributes<HTMLButtonElement>>;
1212
1468
 
1213
- interface SkeletonProps extends HTMLAttributes<HTMLSpanElement> {
1214
- /** 모양. text 는 글자 높이(1em), circle 은 width 를 지름으로 쓴다 */
1215
- variant?: 'text' | 'rect' | 'circle';
1216
- /** 너비. 숫자는 px (기본: text·rect 100%, circle 40px) */
1217
- width?: number | string;
1218
- /** 높이. 숫자는 px (기본: text 1em, rect 100px, circle 은 width 와 같음) */
1219
- height?: number | string;
1220
- /** text 에서 여러 줄을 그린다. 마지막 줄은 60% 너비 */
1221
- lines?: number;
1469
+ interface SkipLinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
1470
+ /** 건너뛸 곳(본문)의 id 를 가리키는 주소. 기본 "#main" — 본문 요소에 id="main" 을 준다 */
1471
+ href?: string;
1222
1472
  }
1223
1473
  /**
1224
- * 콘텐츠를 불러오는 동안 자리를 표시한다. 장식용이라 스크린리더에서 숨긴다 —
1225
- * 로딩 중인 영역(감싸는 요소)에 `aria-busy="true"` 를 붙여 상태를 알린다.
1474
+ * 본문 바로가기 (KWCAG 2.2 6.4.1 반복 영역 건너뛰기 / WCAG 2.4.1).
1475
+ * 페이지 맨 앞(머리글·메뉴보다 먼저)에 둔다. 평소에는 보이지 않고, 첫 Tab 에 왼쪽 위에 나타난다.
1476
+ * 누르면 본문으로 포커스를 옮긴다 — 본문 요소가 원래 포커스를 받지 못하면 tabindex="-1" 을 붙여 옮긴다
1477
+ * (주소의 #만 바꾸면 일부 브라우저·SPA 라우터에서 포커스가 그대로 남는다).
1478
+ *
1479
+ * @example
1480
+ * <SkipLink /> // "본문 바로가기" → #main
1481
+ * <Header />
1482
+ * <main id="main">…</main>
1226
1483
  */
1227
- declare const Skeleton: react.ForwardRefExoticComponent<SkeletonProps & react.RefAttributes<HTMLSpanElement>>;
1484
+ declare const SkipLink: react.ForwardRefExoticComponent<SkipLinkProps & react.RefAttributes<HTMLAnchorElement>>;
1228
1485
 
1229
1486
  interface SliderProps {
1230
1487
  /** 값 (제어 모드). 손잡이 하나면 `[50]`, 범위면 `[20, 80]` */
@@ -1281,22 +1538,6 @@ interface SpinnerProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'color'> {
1281
1538
  }
1282
1539
  declare const Spinner: react.ForwardRefExoticComponent<SpinnerProps & react.RefAttributes<HTMLSpanElement>>;
1283
1540
 
1284
- interface StackProps extends HTMLAttributes<HTMLElement> {
1285
- /** 렌더링할 요소 */
1286
- as?: ElementType;
1287
- /** 배치 방향 */
1288
- direction?: 'row' | 'column' | 'row-reverse' | 'column-reverse';
1289
- /** 자식 사이 간격 (space 토큰 키) */
1290
- gap?: keyof typeof space;
1291
- /** 교차축 정렬 (align-items) */
1292
- align?: 'start' | 'center' | 'end' | 'stretch' | 'baseline';
1293
- /** 주축 정렬 (justify-content) */
1294
- justify?: 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';
1295
- /** 줄바꿈 허용 */
1296
- wrap?: boolean;
1297
- }
1298
- declare const Stack: react.ForwardRefExoticComponent<StackProps & react.RefAttributes<HTMLElement>>;
1299
-
1300
1541
  interface SwitchProps {
1301
1542
  /** 스위치 옆에 표시할 레이블 */
1302
1543
  label?: ReactNode;
@@ -1371,7 +1612,7 @@ interface TableCellProps extends Omit<TdHTMLAttributes<HTMLTableCellElement>, 'a
1371
1612
  }
1372
1613
  declare const TableCell: react.ForwardRefExoticComponent<TableCellProps & react.RefAttributes<HTMLTableCellElement>>;
1373
1614
 
1374
- interface TabsProps extends Omit<ComponentPropsWithoutRef<typeof RadixTabs.Root>, 'orientation'> {
1615
+ interface TabsProps extends ComponentPropsWithoutRef<typeof RadixTabs.Root> {
1375
1616
  /** 시각적 스타일. line 은 밑줄, soft 는 배경이 있는 세그먼트 */
1376
1617
  variant?: 'line' | 'soft';
1377
1618
  /** 크기 */
@@ -1387,6 +1628,11 @@ interface TabsProps extends Omit<ComponentPropsWithoutRef<typeof RadixTabs.Root>
1387
1628
  * manual: 방향키로 포커스만 옮기고 Enter/Space 로 선택한다 (탭 전환 비용이 클 때).
1388
1629
  */
1389
1630
  activationMode?: 'automatic' | 'manual';
1631
+ /**
1632
+ * horizontal(기본): 탭 목록이 위, ←/→ 로 이동.
1633
+ * vertical: 탭 목록이 왼쪽(내용은 오른쪽), ↑/↓ 로 이동. 탭이 많거나 이름이 길 때(설정 화면 등).
1634
+ */
1635
+ orientation?: 'horizontal' | 'vertical';
1390
1636
  }
1391
1637
  declare const Tabs: react.ForwardRefExoticComponent<TabsProps & react.RefAttributes<HTMLDivElement>>;
1392
1638
  type TabsListProps = ComponentPropsWithoutRef<typeof RadixTabs.List>;
@@ -1482,23 +1728,6 @@ interface TooltipProps {
1482
1728
  }
1483
1729
  declare function Tooltip({ content, children, side, align, delay, open, defaultOpen, onOpenChange, disabled, className, }: TooltipProps): react.JSX.Element;
1484
1730
 
1485
- type TypographyVariant = 'display' | 'h1' | 'h2' | 'h3' | 'h4' | 'body-lg' | 'body' | 'body-sm' | 'caption';
1486
- interface TypographyProps extends Omit<HTMLAttributes<HTMLElement>, 'color'> {
1487
- /** 텍스트 스타일 */
1488
- variant?: TypographyVariant;
1489
- /** 렌더링할 요소. 기본값은 variant 에 따라 결정된다 (h1, p, span 등) */
1490
- as?: ElementType;
1491
- /** 글자 색상 */
1492
- color?: 'default' | 'muted' | 'subtle' | 'primary' | 'danger' | 'success' | 'warning' | 'inherit';
1493
- /** variant 의 기본 굵기를 덮어쓴다 */
1494
- weight?: 'regular' | 'medium' | 'semibold' | 'bold';
1495
- /** 정렬 */
1496
- align?: 'start' | 'center' | 'end';
1497
- /** 한 줄로 자르고 말줄임표를 표시한다 */
1498
- truncate?: boolean;
1499
- }
1500
- declare const Typography: react.ForwardRefExoticComponent<TypographyProps & react.RefAttributes<HTMLElement>>;
1501
-
1502
1731
  interface VerificationCodeInputProps {
1503
1732
  /** 자릿수 */
1504
1733
  length?: number;
@@ -1538,4 +1767,4 @@ interface VerificationCodeInputProps {
1538
1767
  */
1539
1768
  declare const VerificationCodeInput: react.ForwardRefExoticComponent<VerificationCodeInputProps & react.RefAttributes<HTMLInputElement>>;
1540
1769
 
1541
- export { Accordion, AccordionItem, type AccordionItemProps, type AccordionProps, AddressInput, type AddressInputProps, type AddressProvider, type AddressSearchResult, type AddressValue, AgreementGroup, type AgreementGroupProps, type AgreementItem, Alert, type AlertColor, type AlertProps, AmountInput, type AmountInputProps, Avatar, type AvatarProps, Badge, type BadgeProps, type BestowMessages, type BestowTheme, Breadcrumb, type BreadcrumbItemData, type BreadcrumbProps, BusinessNumberInput, type BusinessNumberInputProps, Button, type ButtonProps, Calendar, type CalendarProps, Card, CardBody, CardFooter, CardHeader, type CardProps, type CardSectionProps, Checkbox, type CheckboxProps, Combobox, type ComboboxOption, type ComboboxProps, DatePicker, type DatePickerProps, type DeepPartial, Divider, type DividerProps, Drawer, DrawerClose, type DrawerProps, DropdownMenu, DropdownMenuContent, type DropdownMenuContentProps, DropdownMenuGroup, DropdownMenuItem, type DropdownMenuItemProps, DropdownMenuLabel, type DropdownMenuLabelProps, type DropdownMenuProps, DropdownMenuSeparator, type DropdownMenuSeparatorProps, DropdownMenuTrigger, type DropdownMenuTriggerProps, IconButton, type IconButtonProps, Input, type InputProps, type IntentName, Link, type LinkProps, LocaleProvider, type LocaleProviderProps, type Messages, Modal, ModalClose, type ModalProps, Pagination, type PaginationItemType, type PaginationProps, PhoneNumberInput, type PhoneNumberInputProps, Popover, PopoverClose, type PopoverProps, Progress, type ProgressProps, RadioGroup, type RadioGroupProps, type RadioOption, Select, type SelectOption, type SelectProps, Skeleton, type SkeletonProps, Slider, type SliderProps, Spinner, type SpinnerProps, Stack, type StackProps, Switch, type SwitchProps, Table, type TableAlign, TableBody, TableCell, type TableCellProps, TableFooter, TableHead, type TableHeadProps, TableHeader, type TableProps, TableRow, type TableRowProps, type TableSize, Tabs, TabsContent, type TabsContentProps, TabsList, type TabsListProps, type TabsProps, TabsTrigger, type TabsTriggerProps, TextField, type TextFieldProps, Textarea, type TextareaProps, type ThemeInput, type ThemeName, type ThemeOverrides, ThemeProvider, type ThemeProviderProps, type ThemeTokens, type ToastColor, type ToastContextValue, type ToastOptions, ToastProvider, type ToastProviderProps, Tooltip, type TooltipProps, Typography, type TypographyProps, type TypographyVariant, VerificationCodeInput, type VerificationCodeInputProps, composeExtraAddress, contrastRatio, createIntentColors, createTheme, en, formatBusinessNumber, formatKoreanAmount, formatKoreanDate, formatPhoneNumber, hasAllRequiredAgreements, isValidBusinessNumber, kakaoPostcodeProvider, parseISODate, themeClass, toISODate, useMessages, usePortalProps, useTheme, useToast, vars };
1770
+ export { Accordion, AccordionItem, type AccordionItemProps, type AccordionProps, AddressInput, type AddressInputProps, type AddressProvider, type AddressSearchResult, type AddressValue, AgreementGroup, type AgreementGroupProps, type AgreementItem, Alert, type AlertColor, type AlertProps, AmountInput, type AmountInputProps, Avatar, type AvatarProps, Badge, type BadgeProps, type BestowMessages, type BestowTheme, Breadcrumb, type BreadcrumbItemData, type BreadcrumbProps, BusinessNumberInput, type BusinessNumberInputProps, Button, type ButtonProps, Calendar, type CalendarProps, Card, CardBody, CardFooter, CardHeader, type CardProps, type CardSectionProps, Checkbox, type CheckboxProps, Combobox, type ComboboxOption, type ComboboxProps, DatePicker, type DatePickerProps, type DeepPartial, Divider, type DividerProps, Drawer, DrawerClose, type DrawerProps, DropdownMenu, DropdownMenuCheckboxItem, type DropdownMenuCheckboxItemProps, DropdownMenuContent, type DropdownMenuContentProps, DropdownMenuGroup, DropdownMenuItem, type DropdownMenuItemProps, DropdownMenuLabel, type DropdownMenuLabelProps, type DropdownMenuProps, DropdownMenuRadioGroup, type DropdownMenuRadioGroupProps, DropdownMenuRadioItem, type DropdownMenuRadioItemProps, DropdownMenuSeparator, type DropdownMenuSeparatorProps, DropdownMenuSub, DropdownMenuSubContent, type DropdownMenuSubContentProps, type DropdownMenuSubProps, DropdownMenuSubTrigger, type DropdownMenuSubTriggerProps, DropdownMenuTrigger, type DropdownMenuTriggerProps, IconButton, type IconButtonProps, Input, type InputProps, type IntentName, Link, type LinkProps, LocaleProvider, type LocaleProviderProps, type Messages, Modal, ModalClose, type ModalProps, NumberInput, type NumberInputProps, Pagination, type PaginationItemType, type PaginationProps, PhoneNumberInput, type PhoneNumberInputProps, Popover, PopoverClose, type PopoverProps, Progress, type ProgressProps, RadioGroup, type RadioGroupProps, type RadioOption, SegmentedControl, type SegmentedControlOption, type SegmentedControlProps, Select, type SelectOption, type SelectProps, Skeleton, type SkeletonProps, SkipLink, type SkipLinkProps, Slider, type SliderProps, Spinner, type SpinnerProps, Stack, type StackProps, Switch, type SwitchProps, Table, type TableAlign, TableBody, TableCell, type TableCellProps, TableFooter, TableHead, type TableHeadProps, TableHeader, type TableProps, TableRow, type TableRowProps, type TableSize, Tabs, TabsContent, type TabsContentProps, TabsList, type TabsListProps, type TabsProps, TabsTrigger, type TabsTriggerProps, TextField, type TextFieldProps, Textarea, type TextareaProps, type ThemeInput, type ThemeName, type ThemeOverrides, ThemeProvider, type ThemeProviderProps, type ThemeTokens, type ToastColor, type ToastContextValue, type ToastOptions, ToastProvider, type ToastProviderProps, Tooltip, type TooltipProps, Typography, type TypographyProps, type TypographyVariant, VerificationCodeInput, type VerificationCodeInputProps, composeExtraAddress, contrastRatio, createIntentColors, createTheme, en, formatBusinessNumber, formatKoreanAmount, formatKoreanDate, formatPhoneNumber, hasAllRequiredAgreements, isValidBusinessNumber, kakaoPostcodeProvider, parseISODate, themeClass, toISODate, useMessages, usePortalProps, useTheme, useToast, vars };