@bestow-ui/react 1.4.0 → 1.6.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,8 @@
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, ElementType, CSSProperties, ComponentPropsWithoutRef, InputHTMLAttributes, ButtonHTMLAttributes, AnchorHTMLAttributes, ReactElement, OlHTMLAttributes, TdHTMLAttributes, ThHTMLAttributes, ChangeEvent, TextareaHTMLAttributes } from 'react';
4
+ import { ReactNode, HTMLAttributes, ElementType, CSSProperties, ComponentPropsWithoutRef, InputHTMLAttributes, ButtonHTMLAttributes, AnchorHTMLAttributes, ReactElement, SelectHTMLAttributes, OlHTMLAttributes, TdHTMLAttributes, ThHTMLAttributes, ChangeEvent, TextareaHTMLAttributes } from 'react';
5
+ export { composeExtraAddress, formatBusinessNumber, formatKoreanAmount, formatKoreanDate, formatPhoneNumber, isValidBusinessNumber } from '@bestow-ui/korean-utils';
5
6
  import * as RadixAccordion from '@radix-ui/react-accordion';
6
7
  import * as Dialog from '@radix-ui/react-dialog';
7
8
  import * as RadixMenu from '@radix-ui/react-dropdown-menu';
@@ -85,12 +86,14 @@ type Widen<T> = {
85
86
  * 그래서 넣지 않으면 화면이 그대로이고, 기존 토큰(border.default 등)을 덮어쓴 사용자 설정도 계속 따른다(하위 영역의 CSS 덮어쓰기 포함).
86
87
  * - `color.border.input`·`inputHover` (1.x 추가): 입력 칸(Input·Select·Combobox·Textarea·인증번호 칸 등) 테두리. 기본은 border.default·border.strong.
87
88
  * 흰 배경과 1.3:1 인 기본 테두리를 3:1 이상으로 올리려면 `strongInputBorders` 를 쓴다(2.0 에서 기본값이 될 예정).
89
+ * - `color.border.control` (1.x 추가): Checkbox·Radio 테두리, 꺼진 Switch 트랙, Stepper 의 예정 단계. 기본은 border.strong(라이트 2.07:1).
88
90
  */
89
91
  declare const optionalTokens: {
90
92
  color: {
91
93
  border: {
92
94
  input: string;
93
95
  inputHover: string;
96
+ control: string;
94
97
  };
95
98
  };
96
99
  };
@@ -100,6 +103,7 @@ declare const vars: {
100
103
  border: {
101
104
  input: `var(--${string})`;
102
105
  inputHover: `var(--${string})`;
106
+ control: `var(--${string})`;
103
107
  default: `var(--${string})`;
104
108
  strong: `var(--${string})`;
105
109
  focus: `var(--${string})`;
@@ -272,9 +276,9 @@ type IntentName = 'primary' | 'neutral' | 'danger' | 'success' | 'warning';
272
276
  declare function createIntentColors(intent: IntentName, color: string): ThemeInput;
273
277
 
274
278
  /**
275
- * 입력 칸 테두리를 배경과 3:1 이상으로 올리는 테마 입력 (WCAG 1.4.11 비텍스트 대비).
276
- * 기본 테두리(border.default)는 흰 배경과 1.3:1 이라 칸의 경계가 잘 보이지 않는다 — 2.0 에서 기본값이 될 예정.
277
- * hover 는 테두리보다 더 진하게(다크는 더 밝게) 바뀐다.
279
+ * 입력 칸·체크 컨트롤 테두리를 배경과 3:1 이상으로 올리는 테마 입력 (WCAG 1.4.11 비텍스트 대비) — 2.0 에서 기본값이 될 예정.
280
+ * - 입력 칸(border.input): 기본 border.default 는 흰 배경과 1.3:1. hover 는 테두리보다 더 진하게(다크는 더 밝게).
281
+ * - Checkbox·Radio 테두리, 꺼진 Switch, Stepper 예정 단계(border.control): 기본 border.strong 은 라이트 흰 배경과 2.07:1.
278
282
  *
279
283
  * @example
280
284
  * <ThemeProvider overrides={createTheme(strongInputBorders)}>…</ThemeProvider>
@@ -416,40 +420,10 @@ declare function useMessages(): Messages;
416
420
  */
417
421
  declare const en: BestowMessages;
418
422
 
419
- /**
420
- * 숫자만 있는 전화번호에 하이픈을 넣는다. 입력 중인 값도 자연스럽게 나눈다.
421
- * @example formatPhoneNumber('01012345678') // '010-1234-5678'
422
- * @example formatPhoneNumber('021234567') // '02-123-4567'
423
- * @example formatPhoneNumber('15881234') // '1588-1234'
424
- */
425
- declare function formatPhoneNumber(input: string): string;
426
- /**
427
- * 사업자등록번호(10자리)에 하이픈을 넣는다.
428
- * @example formatBusinessNumber('1234567890') // '123-45-67890'
429
- */
430
- declare function formatBusinessNumber(input: string): string;
431
- /**
432
- * 사업자등록번호 검증 공식(가중치 1,3,7,1,3,7,1,3,5)으로 확인한다. 실제로 등록된 번호인지는 국세청 조회가 필요하다.
433
- * @example isValidBusinessNumber('124-81-00998') // true
434
- */
435
- declare function isValidBusinessNumber(input: string): boolean;
436
- /**
437
- * 금액을 만·억·조 단위로 읽기 쉽게 쓴다.
438
- * @example formatKoreanAmount(125000) // '12만 5,000원'
439
- * @example formatKoreanAmount(150000000) // '1억 5,000만원'
440
- * @example formatKoreanAmount(0) // '0원'
441
- */
442
- declare function formatKoreanAmount(amount: number, unit?: string): string;
443
-
444
423
  /** Date → 'YYYY-MM-DD' (로컬 기준) */
445
424
  declare function toISODate(date: Date): string;
446
425
  /** 'YYYY-MM-DD' → Date (로컬 자정). 형식이 틀리거나 없는 날짜(2월 30일 등)면 null */
447
426
  declare function parseISODate(value: string | null | undefined): Date | null;
448
- /**
449
- * 한국어 날짜. 스크린리더용 날짜 이름 등에 쓴다.
450
- * @example formatKoreanDate(new Date(2026, 9, 15)) // '2026년 10월 15일 목요일'
451
- */
452
- declare function formatKoreanDate(date: Date, withWeekday?: boolean): string;
453
427
 
454
428
  /** 주소 검색 결과 */
455
429
  interface AddressSearchResult {
@@ -465,18 +439,7 @@ interface AddressSearchResult {
465
439
  * 정리 함수를 돌려주면 검색 창이 닫힐 때 부른다. 다른 주소 서비스(행정안전부 도로명주소 API 등)로 바꿔 끼울 수 있다.
466
440
  */
467
441
  type AddressProvider = (container: HTMLElement, onSelect: (result: AddressSearchResult) => void) => void | (() => void) | Promise<void | (() => void)>;
468
- interface KakaoPostcodeData {
469
- zonecode: string;
470
- userSelectedType: 'R' | 'J';
471
- roadAddress: string;
472
- jibunAddress: string;
473
- autoJibunAddress?: string;
474
- bname: string;
475
- buildingName: string;
476
- apartment: 'Y' | 'N';
477
- }
478
- /** 카카오 가이드의 방식으로 도로명 주소의 참고 항목(법정동, 공동주택 건물명)을 만든다 */
479
- declare function composeExtraAddress(data: Pick<KakaoPostcodeData, 'userSelectedType' | 'bname' | 'buildingName' | 'apartment'>): string;
442
+
480
443
  /**
481
444
  * 기본 공급자: 카카오(다음) 우편번호 서비스. 처음 쓸 때 스크립트를 불러오므로 코어 번들 크기에 영향이 없다.
482
445
  * 사용 조건은 서비스 가이드를 따른다.
@@ -1639,6 +1602,37 @@ interface SegmentedControlProps {
1639
1602
  */
1640
1603
  declare const SegmentedControl: react.ForwardRefExoticComponent<SegmentedControlProps & react.RefAttributes<HTMLDivElement>>;
1641
1604
 
1605
+ interface NativeSelectOption {
1606
+ value: string;
1607
+ /** `<option>` 은 글자만 담을 수 있어 문자열 */
1608
+ label: string;
1609
+ disabled?: boolean;
1610
+ }
1611
+ interface NativeSelectProps extends Omit<SelectHTMLAttributes<HTMLSelectElement>, 'size' | 'multiple'> {
1612
+ /** 선택지 목록. 없으면 children 의 `<option>`·`<optgroup>` 을 그대로 쓴다 */
1613
+ options?: NativeSelectOption[];
1614
+ /** 값이 바뀔 때 새 값으로 호출된다 (Select 와 같은 이름). 네이티브 onChange 도 함께 쓸 수 있다 */
1615
+ onValueChange?: (value: string) => void;
1616
+ /** 선택 전 표시할 문구 — 값이 '' 인 고를 수 없는 첫 항목으로 들어간다 */
1617
+ placeholder?: string;
1618
+ /** 위에 표시할 레이블 */
1619
+ label?: ReactNode;
1620
+ /** 아래에 표시할 도움말. error 일 때는 에러 메시지로 표시된다 */
1621
+ helperText?: ReactNode;
1622
+ /** 에러 상태 */
1623
+ error?: boolean;
1624
+ /** 크기 */
1625
+ size?: 'sm' | 'md' | 'lg';
1626
+ /** 부모 너비를 꽉 채운다 */
1627
+ fullWidth?: boolean;
1628
+ }
1629
+ /**
1630
+ * 브라우저 기본 `<select>` 에 Select 와 같은 모양을 입힌 것. Radix 가 없어 가볍고(폼 세트 번들이 크게 준다),
1631
+ * 모바일에서는 운영체제의 선택 화면이 열린다. `register(...)` 를 그대로 펼칠 수 있다.
1632
+ * 목록 모양을 꾸미거나 항목에 아이콘을 넣어야 하면 Select 를 쓴다.
1633
+ */
1634
+ declare const NativeSelect: react.ForwardRefExoticComponent<NativeSelectProps & react.RefAttributes<HTMLSelectElement>>;
1635
+
1642
1636
  interface SelectOption {
1643
1637
  value: string;
1644
1638
  label: ReactNode;
@@ -1795,6 +1789,10 @@ interface SwitchProps {
1795
1789
  /** 바깥 래퍼 className */
1796
1790
  className?: string;
1797
1791
  }
1792
+ /**
1793
+ * 켜고 끄는 스위치. `<button role="switch">` 로 그리고, form 안에서는 숨긴 checkbox 로 값 제출·required 검증·reset 을 처리한다
1794
+ * (1.5 까지 쓰던 Radix Switch 와 같은 동작 — 번들을 줄이려고 직접 구현).
1795
+ */
1798
1796
  declare const Switch: react.ForwardRefExoticComponent<SwitchProps & react.RefAttributes<HTMLButtonElement>>;
1799
1797
 
1800
1798
  type TableSize = 'sm' | 'md';
@@ -2050,5 +2048,5 @@ interface VerificationCodeInputProps {
2050
2048
  */
2051
2049
  declare const VerificationCodeInput: react.ForwardRefExoticComponent<VerificationCodeInputProps & react.RefAttributes<HTMLInputElement>>;
2052
2050
 
2053
- export { Accordion, AccordionItem, AddressInput, AgreementGroup, Alert, AmountInput, Avatar, Badge, Breadcrumb, BusinessNumberInput, Button, Calendar, Card, CardBody, CardFooter, CardHeader, Checkbox, Combobox, DatePicker, DateRangePicker, DescriptionList, Divider, Drawer, DrawerClose, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, ErrorSummary, FileUpload, IconButton, Input, Link, LocaleProvider, Modal, ModalClose, NumberInput, Pagination, PhoneNumberInput, Popover, PopoverClose, Progress, RadioGroup, SegmentedControl, Select, Skeleton, SkipLink, Slider, Spinner, Stack, Stepper, Switch, Table, TableBody, TableCell, TableEmpty, TableFooter, TableHead, TableHeader, TableRow, TableSkeleton, Tabs, TabsContent, TabsList, TabsTrigger, TextField, Textarea, ThemeProvider, ToastProvider, Tooltip, Typography, VerificationCodeInput, VisuallyHidden, composeExtraAddress, contrastRatio, createIntentColors, createTheme, dateRangePresets, en, focusField, formatBusinessNumber, formatKoreanAmount, formatKoreanDate, formatPhoneNumber, hasAllRequiredAgreements, isValidBusinessNumber, kakaoPostcodeProvider, parseISODate, presetRange, strongInputBorders, themeClass, toISODate, useMessages, usePortalProps, useTableSelection, useTheme, useToast, vars };
2054
- export type { AccordionItemProps, AccordionProps, AddressInputProps, AddressProvider, AddressSearchResult, AddressValue, AgreementGroupProps, AgreementItem, AlertColor, AlertProps, AmountInputProps, AvatarProps, BadgeProps, BestowMessages, BestowTheme, BreadcrumbItemData, BreadcrumbProps, BusinessNumberInputProps, ButtonProps, CalendarProps, CardProps, CardSectionProps, CheckboxProps, ComboboxOption, ComboboxProps, DatePickerProps, DateRange, DateRangePickerProps, DateRangePreset, DeepPartial, DescriptionListItem, DescriptionListProps, DividerProps, DrawerProps, DropdownMenuCheckboxItemProps, DropdownMenuContentProps, DropdownMenuItemProps, DropdownMenuLabelProps, DropdownMenuProps, DropdownMenuRadioGroupProps, DropdownMenuRadioItemProps, DropdownMenuSeparatorProps, DropdownMenuSubContentProps, DropdownMenuSubProps, DropdownMenuSubTriggerProps, DropdownMenuTriggerProps, ErrorSummaryItem, ErrorSummaryProps, FileRejection, FileRejectionReason, FileUploadProps, IconButtonProps, InputProps, IntentName, LinkProps, LocaleProviderProps, Messages, ModalProps, NumberInputProps, PaginationItemType, PaginationProps, PhoneNumberInputProps, PopoverProps, ProgressProps, RadioGroupProps, RadioOption, SegmentedControlOption, SegmentedControlProps, SelectOption, SelectProps, SkeletonProps, SkipLinkProps, SliderProps, SpinnerProps, StackProps, StepperProps, StepperStep, SwitchProps, TableAlign, TableCellProps, TableEmptyProps, TableHeadProps, TableProps, TableRowProps, TableSize, TableSkeletonProps, TabsContentProps, TabsListProps, TabsProps, TabsTriggerProps, TextFieldProps, TextareaProps, ThemeInput, ThemeName, ThemeOverrides, ThemeProviderProps, ThemeTokens, ToastColor, ToastContextValue, ToastOptions, ToastProviderProps, TooltipProps, TypographyProps, TypographyVariant, VerificationCodeInputProps, VisuallyHiddenProps };
2051
+ export { Accordion, AccordionItem, AddressInput, AgreementGroup, Alert, AmountInput, Avatar, Badge, Breadcrumb, BusinessNumberInput, Button, Calendar, Card, CardBody, CardFooter, CardHeader, Checkbox, Combobox, DatePicker, DateRangePicker, DescriptionList, Divider, Drawer, DrawerClose, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, ErrorSummary, FileUpload, IconButton, Input, Link, LocaleProvider, Modal, ModalClose, NativeSelect, NumberInput, Pagination, PhoneNumberInput, Popover, PopoverClose, Progress, RadioGroup, SegmentedControl, Select, Skeleton, SkipLink, Slider, Spinner, Stack, Stepper, Switch, Table, TableBody, TableCell, TableEmpty, TableFooter, TableHead, TableHeader, TableRow, TableSkeleton, Tabs, TabsContent, TabsList, TabsTrigger, TextField, Textarea, ThemeProvider, ToastProvider, Tooltip, Typography, VerificationCodeInput, VisuallyHidden, contrastRatio, createIntentColors, createTheme, dateRangePresets, en, focusField, hasAllRequiredAgreements, kakaoPostcodeProvider, parseISODate, presetRange, strongInputBorders, themeClass, toISODate, useMessages, usePortalProps, useTableSelection, useTheme, useToast, vars };
2052
+ export type { AccordionItemProps, AccordionProps, AddressInputProps, AddressProvider, AddressSearchResult, AddressValue, AgreementGroupProps, AgreementItem, AlertColor, AlertProps, AmountInputProps, AvatarProps, BadgeProps, BestowMessages, BestowTheme, BreadcrumbItemData, BreadcrumbProps, BusinessNumberInputProps, ButtonProps, CalendarProps, CardProps, CardSectionProps, CheckboxProps, ComboboxOption, ComboboxProps, DatePickerProps, DateRange, DateRangePickerProps, DateRangePreset, DeepPartial, DescriptionListItem, DescriptionListProps, DividerProps, DrawerProps, DropdownMenuCheckboxItemProps, DropdownMenuContentProps, DropdownMenuItemProps, DropdownMenuLabelProps, DropdownMenuProps, DropdownMenuRadioGroupProps, DropdownMenuRadioItemProps, DropdownMenuSeparatorProps, DropdownMenuSubContentProps, DropdownMenuSubProps, DropdownMenuSubTriggerProps, DropdownMenuTriggerProps, ErrorSummaryItem, ErrorSummaryProps, FileRejection, FileRejectionReason, FileUploadProps, IconButtonProps, InputProps, IntentName, LinkProps, LocaleProviderProps, Messages, ModalProps, NativeSelectOption, NativeSelectProps, NumberInputProps, PaginationItemType, PaginationProps, PhoneNumberInputProps, PopoverProps, ProgressProps, RadioGroupProps, RadioOption, SegmentedControlOption, SegmentedControlProps, SelectOption, SelectProps, SkeletonProps, SkipLinkProps, SliderProps, SpinnerProps, StackProps, StepperProps, StepperStep, SwitchProps, TableAlign, TableCellProps, TableEmptyProps, TableHeadProps, TableProps, TableRowProps, TableSize, TableSkeletonProps, TabsContentProps, TabsListProps, TabsProps, TabsTriggerProps, TextFieldProps, TextareaProps, ThemeInput, ThemeName, ThemeOverrides, ThemeProviderProps, ThemeTokens, ToastColor, ToastContextValue, ToastOptions, ToastProviderProps, TooltipProps, TypographyProps, TypographyVariant, VerificationCodeInputProps, VisuallyHiddenProps };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,8 @@
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, ElementType, CSSProperties, ComponentPropsWithoutRef, InputHTMLAttributes, ButtonHTMLAttributes, AnchorHTMLAttributes, ReactElement, OlHTMLAttributes, TdHTMLAttributes, ThHTMLAttributes, ChangeEvent, TextareaHTMLAttributes } from 'react';
4
+ import { ReactNode, HTMLAttributes, ElementType, CSSProperties, ComponentPropsWithoutRef, InputHTMLAttributes, ButtonHTMLAttributes, AnchorHTMLAttributes, ReactElement, SelectHTMLAttributes, OlHTMLAttributes, TdHTMLAttributes, ThHTMLAttributes, ChangeEvent, TextareaHTMLAttributes } from 'react';
5
+ export { composeExtraAddress, formatBusinessNumber, formatKoreanAmount, formatKoreanDate, formatPhoneNumber, isValidBusinessNumber } from '@bestow-ui/korean-utils';
5
6
  import * as RadixAccordion from '@radix-ui/react-accordion';
6
7
  import * as Dialog from '@radix-ui/react-dialog';
7
8
  import * as RadixMenu from '@radix-ui/react-dropdown-menu';
@@ -85,12 +86,14 @@ type Widen<T> = {
85
86
  * 그래서 넣지 않으면 화면이 그대로이고, 기존 토큰(border.default 등)을 덮어쓴 사용자 설정도 계속 따른다(하위 영역의 CSS 덮어쓰기 포함).
86
87
  * - `color.border.input`·`inputHover` (1.x 추가): 입력 칸(Input·Select·Combobox·Textarea·인증번호 칸 등) 테두리. 기본은 border.default·border.strong.
87
88
  * 흰 배경과 1.3:1 인 기본 테두리를 3:1 이상으로 올리려면 `strongInputBorders` 를 쓴다(2.0 에서 기본값이 될 예정).
89
+ * - `color.border.control` (1.x 추가): Checkbox·Radio 테두리, 꺼진 Switch 트랙, Stepper 의 예정 단계. 기본은 border.strong(라이트 2.07:1).
88
90
  */
89
91
  declare const optionalTokens: {
90
92
  color: {
91
93
  border: {
92
94
  input: string;
93
95
  inputHover: string;
96
+ control: string;
94
97
  };
95
98
  };
96
99
  };
@@ -100,6 +103,7 @@ declare const vars: {
100
103
  border: {
101
104
  input: `var(--${string})`;
102
105
  inputHover: `var(--${string})`;
106
+ control: `var(--${string})`;
103
107
  default: `var(--${string})`;
104
108
  strong: `var(--${string})`;
105
109
  focus: `var(--${string})`;
@@ -272,9 +276,9 @@ type IntentName = 'primary' | 'neutral' | 'danger' | 'success' | 'warning';
272
276
  declare function createIntentColors(intent: IntentName, color: string): ThemeInput;
273
277
 
274
278
  /**
275
- * 입력 칸 테두리를 배경과 3:1 이상으로 올리는 테마 입력 (WCAG 1.4.11 비텍스트 대비).
276
- * 기본 테두리(border.default)는 흰 배경과 1.3:1 이라 칸의 경계가 잘 보이지 않는다 — 2.0 에서 기본값이 될 예정.
277
- * hover 는 테두리보다 더 진하게(다크는 더 밝게) 바뀐다.
279
+ * 입력 칸·체크 컨트롤 테두리를 배경과 3:1 이상으로 올리는 테마 입력 (WCAG 1.4.11 비텍스트 대비) — 2.0 에서 기본값이 될 예정.
280
+ * - 입력 칸(border.input): 기본 border.default 는 흰 배경과 1.3:1. hover 는 테두리보다 더 진하게(다크는 더 밝게).
281
+ * - Checkbox·Radio 테두리, 꺼진 Switch, Stepper 예정 단계(border.control): 기본 border.strong 은 라이트 흰 배경과 2.07:1.
278
282
  *
279
283
  * @example
280
284
  * <ThemeProvider overrides={createTheme(strongInputBorders)}>…</ThemeProvider>
@@ -416,40 +420,10 @@ declare function useMessages(): Messages;
416
420
  */
417
421
  declare const en: BestowMessages;
418
422
 
419
- /**
420
- * 숫자만 있는 전화번호에 하이픈을 넣는다. 입력 중인 값도 자연스럽게 나눈다.
421
- * @example formatPhoneNumber('01012345678') // '010-1234-5678'
422
- * @example formatPhoneNumber('021234567') // '02-123-4567'
423
- * @example formatPhoneNumber('15881234') // '1588-1234'
424
- */
425
- declare function formatPhoneNumber(input: string): string;
426
- /**
427
- * 사업자등록번호(10자리)에 하이픈을 넣는다.
428
- * @example formatBusinessNumber('1234567890') // '123-45-67890'
429
- */
430
- declare function formatBusinessNumber(input: string): string;
431
- /**
432
- * 사업자등록번호 검증 공식(가중치 1,3,7,1,3,7,1,3,5)으로 확인한다. 실제로 등록된 번호인지는 국세청 조회가 필요하다.
433
- * @example isValidBusinessNumber('124-81-00998') // true
434
- */
435
- declare function isValidBusinessNumber(input: string): boolean;
436
- /**
437
- * 금액을 만·억·조 단위로 읽기 쉽게 쓴다.
438
- * @example formatKoreanAmount(125000) // '12만 5,000원'
439
- * @example formatKoreanAmount(150000000) // '1억 5,000만원'
440
- * @example formatKoreanAmount(0) // '0원'
441
- */
442
- declare function formatKoreanAmount(amount: number, unit?: string): string;
443
-
444
423
  /** Date → 'YYYY-MM-DD' (로컬 기준) */
445
424
  declare function toISODate(date: Date): string;
446
425
  /** 'YYYY-MM-DD' → Date (로컬 자정). 형식이 틀리거나 없는 날짜(2월 30일 등)면 null */
447
426
  declare function parseISODate(value: string | null | undefined): Date | null;
448
- /**
449
- * 한국어 날짜. 스크린리더용 날짜 이름 등에 쓴다.
450
- * @example formatKoreanDate(new Date(2026, 9, 15)) // '2026년 10월 15일 목요일'
451
- */
452
- declare function formatKoreanDate(date: Date, withWeekday?: boolean): string;
453
427
 
454
428
  /** 주소 검색 결과 */
455
429
  interface AddressSearchResult {
@@ -465,18 +439,7 @@ interface AddressSearchResult {
465
439
  * 정리 함수를 돌려주면 검색 창이 닫힐 때 부른다. 다른 주소 서비스(행정안전부 도로명주소 API 등)로 바꿔 끼울 수 있다.
466
440
  */
467
441
  type AddressProvider = (container: HTMLElement, onSelect: (result: AddressSearchResult) => void) => void | (() => void) | Promise<void | (() => void)>;
468
- interface KakaoPostcodeData {
469
- zonecode: string;
470
- userSelectedType: 'R' | 'J';
471
- roadAddress: string;
472
- jibunAddress: string;
473
- autoJibunAddress?: string;
474
- bname: string;
475
- buildingName: string;
476
- apartment: 'Y' | 'N';
477
- }
478
- /** 카카오 가이드의 방식으로 도로명 주소의 참고 항목(법정동, 공동주택 건물명)을 만든다 */
479
- declare function composeExtraAddress(data: Pick<KakaoPostcodeData, 'userSelectedType' | 'bname' | 'buildingName' | 'apartment'>): string;
442
+
480
443
  /**
481
444
  * 기본 공급자: 카카오(다음) 우편번호 서비스. 처음 쓸 때 스크립트를 불러오므로 코어 번들 크기에 영향이 없다.
482
445
  * 사용 조건은 서비스 가이드를 따른다.
@@ -1639,6 +1602,37 @@ interface SegmentedControlProps {
1639
1602
  */
1640
1603
  declare const SegmentedControl: react.ForwardRefExoticComponent<SegmentedControlProps & react.RefAttributes<HTMLDivElement>>;
1641
1604
 
1605
+ interface NativeSelectOption {
1606
+ value: string;
1607
+ /** `<option>` 은 글자만 담을 수 있어 문자열 */
1608
+ label: string;
1609
+ disabled?: boolean;
1610
+ }
1611
+ interface NativeSelectProps extends Omit<SelectHTMLAttributes<HTMLSelectElement>, 'size' | 'multiple'> {
1612
+ /** 선택지 목록. 없으면 children 의 `<option>`·`<optgroup>` 을 그대로 쓴다 */
1613
+ options?: NativeSelectOption[];
1614
+ /** 값이 바뀔 때 새 값으로 호출된다 (Select 와 같은 이름). 네이티브 onChange 도 함께 쓸 수 있다 */
1615
+ onValueChange?: (value: string) => void;
1616
+ /** 선택 전 표시할 문구 — 값이 '' 인 고를 수 없는 첫 항목으로 들어간다 */
1617
+ placeholder?: string;
1618
+ /** 위에 표시할 레이블 */
1619
+ label?: ReactNode;
1620
+ /** 아래에 표시할 도움말. error 일 때는 에러 메시지로 표시된다 */
1621
+ helperText?: ReactNode;
1622
+ /** 에러 상태 */
1623
+ error?: boolean;
1624
+ /** 크기 */
1625
+ size?: 'sm' | 'md' | 'lg';
1626
+ /** 부모 너비를 꽉 채운다 */
1627
+ fullWidth?: boolean;
1628
+ }
1629
+ /**
1630
+ * 브라우저 기본 `<select>` 에 Select 와 같은 모양을 입힌 것. Radix 가 없어 가볍고(폼 세트 번들이 크게 준다),
1631
+ * 모바일에서는 운영체제의 선택 화면이 열린다. `register(...)` 를 그대로 펼칠 수 있다.
1632
+ * 목록 모양을 꾸미거나 항목에 아이콘을 넣어야 하면 Select 를 쓴다.
1633
+ */
1634
+ declare const NativeSelect: react.ForwardRefExoticComponent<NativeSelectProps & react.RefAttributes<HTMLSelectElement>>;
1635
+
1642
1636
  interface SelectOption {
1643
1637
  value: string;
1644
1638
  label: ReactNode;
@@ -1795,6 +1789,10 @@ interface SwitchProps {
1795
1789
  /** 바깥 래퍼 className */
1796
1790
  className?: string;
1797
1791
  }
1792
+ /**
1793
+ * 켜고 끄는 스위치. `<button role="switch">` 로 그리고, form 안에서는 숨긴 checkbox 로 값 제출·required 검증·reset 을 처리한다
1794
+ * (1.5 까지 쓰던 Radix Switch 와 같은 동작 — 번들을 줄이려고 직접 구현).
1795
+ */
1798
1796
  declare const Switch: react.ForwardRefExoticComponent<SwitchProps & react.RefAttributes<HTMLButtonElement>>;
1799
1797
 
1800
1798
  type TableSize = 'sm' | 'md';
@@ -2050,5 +2048,5 @@ interface VerificationCodeInputProps {
2050
2048
  */
2051
2049
  declare const VerificationCodeInput: react.ForwardRefExoticComponent<VerificationCodeInputProps & react.RefAttributes<HTMLInputElement>>;
2052
2050
 
2053
- export { Accordion, AccordionItem, AddressInput, AgreementGroup, Alert, AmountInput, Avatar, Badge, Breadcrumb, BusinessNumberInput, Button, Calendar, Card, CardBody, CardFooter, CardHeader, Checkbox, Combobox, DatePicker, DateRangePicker, DescriptionList, Divider, Drawer, DrawerClose, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, ErrorSummary, FileUpload, IconButton, Input, Link, LocaleProvider, Modal, ModalClose, NumberInput, Pagination, PhoneNumberInput, Popover, PopoverClose, Progress, RadioGroup, SegmentedControl, Select, Skeleton, SkipLink, Slider, Spinner, Stack, Stepper, Switch, Table, TableBody, TableCell, TableEmpty, TableFooter, TableHead, TableHeader, TableRow, TableSkeleton, Tabs, TabsContent, TabsList, TabsTrigger, TextField, Textarea, ThemeProvider, ToastProvider, Tooltip, Typography, VerificationCodeInput, VisuallyHidden, composeExtraAddress, contrastRatio, createIntentColors, createTheme, dateRangePresets, en, focusField, formatBusinessNumber, formatKoreanAmount, formatKoreanDate, formatPhoneNumber, hasAllRequiredAgreements, isValidBusinessNumber, kakaoPostcodeProvider, parseISODate, presetRange, strongInputBorders, themeClass, toISODate, useMessages, usePortalProps, useTableSelection, useTheme, useToast, vars };
2054
- export type { AccordionItemProps, AccordionProps, AddressInputProps, AddressProvider, AddressSearchResult, AddressValue, AgreementGroupProps, AgreementItem, AlertColor, AlertProps, AmountInputProps, AvatarProps, BadgeProps, BestowMessages, BestowTheme, BreadcrumbItemData, BreadcrumbProps, BusinessNumberInputProps, ButtonProps, CalendarProps, CardProps, CardSectionProps, CheckboxProps, ComboboxOption, ComboboxProps, DatePickerProps, DateRange, DateRangePickerProps, DateRangePreset, DeepPartial, DescriptionListItem, DescriptionListProps, DividerProps, DrawerProps, DropdownMenuCheckboxItemProps, DropdownMenuContentProps, DropdownMenuItemProps, DropdownMenuLabelProps, DropdownMenuProps, DropdownMenuRadioGroupProps, DropdownMenuRadioItemProps, DropdownMenuSeparatorProps, DropdownMenuSubContentProps, DropdownMenuSubProps, DropdownMenuSubTriggerProps, DropdownMenuTriggerProps, ErrorSummaryItem, ErrorSummaryProps, FileRejection, FileRejectionReason, FileUploadProps, IconButtonProps, InputProps, IntentName, LinkProps, LocaleProviderProps, Messages, ModalProps, NumberInputProps, PaginationItemType, PaginationProps, PhoneNumberInputProps, PopoverProps, ProgressProps, RadioGroupProps, RadioOption, SegmentedControlOption, SegmentedControlProps, SelectOption, SelectProps, SkeletonProps, SkipLinkProps, SliderProps, SpinnerProps, StackProps, StepperProps, StepperStep, SwitchProps, TableAlign, TableCellProps, TableEmptyProps, TableHeadProps, TableProps, TableRowProps, TableSize, TableSkeletonProps, TabsContentProps, TabsListProps, TabsProps, TabsTriggerProps, TextFieldProps, TextareaProps, ThemeInput, ThemeName, ThemeOverrides, ThemeProviderProps, ThemeTokens, ToastColor, ToastContextValue, ToastOptions, ToastProviderProps, TooltipProps, TypographyProps, TypographyVariant, VerificationCodeInputProps, VisuallyHiddenProps };
2051
+ export { Accordion, AccordionItem, AddressInput, AgreementGroup, Alert, AmountInput, Avatar, Badge, Breadcrumb, BusinessNumberInput, Button, Calendar, Card, CardBody, CardFooter, CardHeader, Checkbox, Combobox, DatePicker, DateRangePicker, DescriptionList, Divider, Drawer, DrawerClose, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, ErrorSummary, FileUpload, IconButton, Input, Link, LocaleProvider, Modal, ModalClose, NativeSelect, NumberInput, Pagination, PhoneNumberInput, Popover, PopoverClose, Progress, RadioGroup, SegmentedControl, Select, Skeleton, SkipLink, Slider, Spinner, Stack, Stepper, Switch, Table, TableBody, TableCell, TableEmpty, TableFooter, TableHead, TableHeader, TableRow, TableSkeleton, Tabs, TabsContent, TabsList, TabsTrigger, TextField, Textarea, ThemeProvider, ToastProvider, Tooltip, Typography, VerificationCodeInput, VisuallyHidden, contrastRatio, createIntentColors, createTheme, dateRangePresets, en, focusField, hasAllRequiredAgreements, kakaoPostcodeProvider, parseISODate, presetRange, strongInputBorders, themeClass, toISODate, useMessages, usePortalProps, useTableSelection, useTheme, useToast, vars };
2052
+ export type { AccordionItemProps, AccordionProps, AddressInputProps, AddressProvider, AddressSearchResult, AddressValue, AgreementGroupProps, AgreementItem, AlertColor, AlertProps, AmountInputProps, AvatarProps, BadgeProps, BestowMessages, BestowTheme, BreadcrumbItemData, BreadcrumbProps, BusinessNumberInputProps, ButtonProps, CalendarProps, CardProps, CardSectionProps, CheckboxProps, ComboboxOption, ComboboxProps, DatePickerProps, DateRange, DateRangePickerProps, DateRangePreset, DeepPartial, DescriptionListItem, DescriptionListProps, DividerProps, DrawerProps, DropdownMenuCheckboxItemProps, DropdownMenuContentProps, DropdownMenuItemProps, DropdownMenuLabelProps, DropdownMenuProps, DropdownMenuRadioGroupProps, DropdownMenuRadioItemProps, DropdownMenuSeparatorProps, DropdownMenuSubContentProps, DropdownMenuSubProps, DropdownMenuSubTriggerProps, DropdownMenuTriggerProps, ErrorSummaryItem, ErrorSummaryProps, FileRejection, FileRejectionReason, FileUploadProps, IconButtonProps, InputProps, IntentName, LinkProps, LocaleProviderProps, Messages, ModalProps, NativeSelectOption, NativeSelectProps, NumberInputProps, PaginationItemType, PaginationProps, PhoneNumberInputProps, PopoverProps, ProgressProps, RadioGroupProps, RadioOption, SegmentedControlOption, SegmentedControlProps, SelectOption, SelectProps, SkeletonProps, SkipLinkProps, SliderProps, SpinnerProps, StackProps, StepperProps, StepperStep, SwitchProps, TableAlign, TableCellProps, TableEmptyProps, TableHeadProps, TableProps, TableRowProps, TableSize, TableSkeletonProps, TabsContentProps, TabsListProps, TabsProps, TabsTriggerProps, TextFieldProps, TextareaProps, ThemeInput, ThemeName, ThemeOverrides, ThemeProviderProps, ThemeTokens, ToastColor, ToastContextValue, ToastOptions, ToastProviderProps, TooltipProps, TypographyProps, TypographyVariant, VerificationCodeInputProps, VisuallyHiddenProps };
package/dist/shared.js CHANGED
@@ -5,11 +5,6 @@ import {
5
5
  cx,
6
6
  dateRangePresets,
7
7
  focusField,
8
- formatBusinessNumber,
9
- formatKoreanAmount,
10
- formatKoreanDate,
11
- formatPhoneNumber,
12
- isValidBusinessNumber,
13
8
  kakaoPostcodeProvider,
14
9
  parseISODate,
15
10
  presetRange,
@@ -17,7 +12,7 @@ import {
17
12
  toISODate,
18
13
  vars,
19
14
  visuallyHidden
20
- } from "./chunk-TIFI6ZQU.js";
15
+ } from "./chunk-NKLDAXUR.js";
21
16
 
22
17
  // src/theme/color.ts
23
18
  import { darkColors, lightColors, palette } from "@bestow-ui/tokens";
@@ -159,9 +154,11 @@ function createIntentColors(intent, color) {
159
154
  // src/theme/presets.ts
160
155
  var strongInputBorders = /* @__PURE__ */ Object.freeze({
161
156
  // 라이트: gray600 / gray700 — 흰 배경 5.18:1, bg.subtle(gray50) 4.91:1
162
- light: { color: { border: { input: "#666e76", inputHover: "#495057" } } },
157
+ // 체크 컨트롤: gray600 — 흰 배경 5.18:1
158
+ light: { color: { border: { input: "#666e76", inputHover: "#495057", control: "#666e76" } } },
163
159
  // 다크: gray500 / gray300 — gray600 은 bg.subtle(gray900) 위에서 2.98:1 이라 한 단계 밝게. bg.default 8.57:1, bg.subtle 7.43:1
164
- dark: { color: { border: { input: "#adb5bd", inputHover: "#dee2e6" } } }
160
+ // 체크 컨트롤: gray500 — 다크 기본값(border.strong)과 같다(이미 8.57:1)
161
+ dark: { color: { border: { input: "#adb5bd", inputHover: "#dee2e6", control: "#adb5bd" } } }
165
162
  });
166
163
 
167
164
  // src/i18n/en.ts
@@ -254,6 +251,15 @@ var en = {
254
251
  dateIncomplete: "Enter the date as YYYY-MM-DD."
255
252
  };
256
253
 
254
+ // src/shared.ts
255
+ import {
256
+ formatBusinessNumber,
257
+ formatKoreanAmount,
258
+ formatKoreanDate,
259
+ formatPhoneNumber,
260
+ isValidBusinessNumber
261
+ } from "@bestow-ui/korean-utils";
262
+
257
263
  // src/components/AgreementGroup/agreements.ts
258
264
  function hasAllRequiredAgreements(items, value2) {
259
265
  return items.every((item2) => !item2.required || value2.includes(item2.value));