@bestow-ui/react 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/client.js +368 -201
- package/dist/client.js.map +1 -1
- package/dist/index.cjs +380 -209
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +119 -9
- package/dist/index.css.map +1 -1
- package/dist/index.d.cts +134 -1
- package/dist/index.d.ts +134 -1
- package/dist/shared.js +2 -0
- package/dist/shared.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -285,6 +285,13 @@ 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;
|
|
288
295
|
/** Slider 범위 손잡이 — "최소", "최대" */
|
|
289
296
|
rangeStart: string;
|
|
290
297
|
rangeEnd: string;
|
|
@@ -601,6 +608,19 @@ interface TextFieldProps extends Omit<InputProps, 'invalid'> {
|
|
|
601
608
|
helperText?: ReactNode;
|
|
602
609
|
/** 에러 상태 */
|
|
603
610
|
error?: boolean;
|
|
611
|
+
/** 필수 입력 (레이블에 * 표시, required 속성) */
|
|
612
|
+
required?: boolean;
|
|
613
|
+
disabled?: boolean;
|
|
614
|
+
/** 크기 */
|
|
615
|
+
size?: 'sm' | 'md' | 'lg';
|
|
616
|
+
/** 부모 너비를 꽉 채운다 */
|
|
617
|
+
fullWidth?: boolean;
|
|
618
|
+
/** 입력창 앞에 표시할 요소 (아이콘, 단위 등) */
|
|
619
|
+
startAdornment?: ReactNode;
|
|
620
|
+
/** 입력창 뒤에 표시할 요소 */
|
|
621
|
+
endAdornment?: ReactNode;
|
|
622
|
+
placeholder?: string;
|
|
623
|
+
type?: InputHTMLAttributes<HTMLInputElement>['type'];
|
|
604
624
|
}
|
|
605
625
|
declare const TextField: react.ForwardRefExoticComponent<TextFieldProps & react.RefAttributes<HTMLInputElement>>;
|
|
606
626
|
|
|
@@ -620,6 +640,22 @@ interface AmountInputProps extends Omit<TextFieldProps, 'value' | 'defaultValue'
|
|
|
620
640
|
* helperText 를 주면 그 아래 줄로 함께 보여 준다.
|
|
621
641
|
*/
|
|
622
642
|
showKoreanAmount?: boolean;
|
|
643
|
+
/** 입력창 위에 표시할 레이블 */
|
|
644
|
+
label?: ReactNode;
|
|
645
|
+
/** 입력창 아래에 표시할 도움말. error 일 때는 에러 메시지로 표시된다 */
|
|
646
|
+
helperText?: ReactNode;
|
|
647
|
+
/** 에러 상태 */
|
|
648
|
+
error?: boolean;
|
|
649
|
+
/** 필수 입력 (레이블에 * 표시, required 속성) */
|
|
650
|
+
required?: boolean;
|
|
651
|
+
disabled?: boolean;
|
|
652
|
+
/** 크기 */
|
|
653
|
+
size?: 'sm' | 'md' | 'lg';
|
|
654
|
+
/** 부모 너비를 꽉 채운다 */
|
|
655
|
+
fullWidth?: boolean;
|
|
656
|
+
placeholder?: string;
|
|
657
|
+
/** form 제출 시 사용할 이름 */
|
|
658
|
+
name?: string;
|
|
623
659
|
}
|
|
624
660
|
/**
|
|
625
661
|
* 금액 입력. 천 단위 쉼표를 넣고 뒤에 단위("원")를 붙이며, 아래에 "12만 5,000원" 처럼 읽기 쉬운 금액을 보여 준다.
|
|
@@ -693,6 +729,22 @@ interface BusinessNumberInputProps extends Omit<TextFieldProps, 'value' | 'defau
|
|
|
693
729
|
validate?: boolean;
|
|
694
730
|
/** 자동 검증 오류 문구 */
|
|
695
731
|
invalidText?: string;
|
|
732
|
+
/** 입력창 위에 표시할 레이블 */
|
|
733
|
+
label?: ReactNode;
|
|
734
|
+
/** 입력창 아래에 표시할 도움말. error 일 때는 에러 메시지로 표시된다 */
|
|
735
|
+
helperText?: ReactNode;
|
|
736
|
+
/** 에러 상태 */
|
|
737
|
+
error?: boolean;
|
|
738
|
+
/** 필수 입력 (레이블에 * 표시, required 속성) */
|
|
739
|
+
required?: boolean;
|
|
740
|
+
disabled?: boolean;
|
|
741
|
+
/** 크기 */
|
|
742
|
+
size?: 'sm' | 'md' | 'lg';
|
|
743
|
+
/** 부모 너비를 꽉 채운다 */
|
|
744
|
+
fullWidth?: boolean;
|
|
745
|
+
placeholder?: string;
|
|
746
|
+
/** form 제출 시 사용할 이름 */
|
|
747
|
+
name?: string;
|
|
696
748
|
}
|
|
697
749
|
/**
|
|
698
750
|
* 사업자등록번호 입력. 123-45-67890 형식으로 하이픈을 넣고, 10자리를 채우면 검증 공식으로 확인한다.
|
|
@@ -823,6 +875,13 @@ interface ComboboxProps {
|
|
|
823
875
|
'aria-label'?: string;
|
|
824
876
|
/** 목록 열기 버튼의 이름 */
|
|
825
877
|
toggleLabel?: string;
|
|
878
|
+
/**
|
|
879
|
+
* 값이 있을 때 "선택 지우기" 버튼을 보여 준다. 버튼이 없어도 입력창 글자를 모두 지우고 닫으면(포커스 이동·Esc·Enter) 선택이 지워진다.
|
|
880
|
+
* 지우면 `onValueChange('')` 가 호출된다.
|
|
881
|
+
*/
|
|
882
|
+
clearable?: boolean;
|
|
883
|
+
/** "선택 지우기" 버튼의 이름 */
|
|
884
|
+
clearLabel?: string;
|
|
826
885
|
/** 입력창 래퍼 className */
|
|
827
886
|
className?: string;
|
|
828
887
|
}
|
|
@@ -1068,6 +1127,22 @@ interface PhoneNumberInputProps extends Omit<TextFieldProps, 'value' | 'defaultV
|
|
|
1068
1127
|
defaultValue?: string;
|
|
1069
1128
|
/** 숫자만 있는 값으로 호출된다 (하이픈 없음) */
|
|
1070
1129
|
onValueChange?: (digits: string) => void;
|
|
1130
|
+
/** 입력창 위에 표시할 레이블 */
|
|
1131
|
+
label?: ReactNode;
|
|
1132
|
+
/** 입력창 아래에 표시할 도움말. error 일 때는 에러 메시지로 표시된다 */
|
|
1133
|
+
helperText?: ReactNode;
|
|
1134
|
+
/** 에러 상태 */
|
|
1135
|
+
error?: boolean;
|
|
1136
|
+
/** 필수 입력 (레이블에 * 표시, required 속성) */
|
|
1137
|
+
required?: boolean;
|
|
1138
|
+
disabled?: boolean;
|
|
1139
|
+
/** 크기 */
|
|
1140
|
+
size?: 'sm' | 'md' | 'lg';
|
|
1141
|
+
/** 부모 너비를 꽉 채운다 */
|
|
1142
|
+
fullWidth?: boolean;
|
|
1143
|
+
placeholder?: string;
|
|
1144
|
+
/** form 제출 시 사용할 이름 */
|
|
1145
|
+
name?: string;
|
|
1071
1146
|
}
|
|
1072
1147
|
/**
|
|
1073
1148
|
* 전화번호 입력. 입력하는 대로 하이픈을 넣고(010-1234-5678, 02-123-4567, 1588-1234), 값은 숫자만 넘긴다.
|
|
@@ -1172,6 +1247,47 @@ interface RadioGroupProps {
|
|
|
1172
1247
|
}
|
|
1173
1248
|
declare const RadioGroup: react.ForwardRefExoticComponent<RadioGroupProps & react.RefAttributes<HTMLDivElement>>;
|
|
1174
1249
|
|
|
1250
|
+
interface SegmentedControlOption {
|
|
1251
|
+
value: string;
|
|
1252
|
+
/** 칸에 보이는 글자 (접근 가능한 이름이 된다) */
|
|
1253
|
+
label: ReactNode;
|
|
1254
|
+
/** 글자 앞 아이콘 (장식용) */
|
|
1255
|
+
icon?: ReactNode;
|
|
1256
|
+
disabled?: boolean;
|
|
1257
|
+
}
|
|
1258
|
+
interface SegmentedControlProps {
|
|
1259
|
+
/** 선택지 (2~5개 권장 — 많으면 Select 를 쓴다) */
|
|
1260
|
+
options: SegmentedControlOption[];
|
|
1261
|
+
/** 선택된 값 (제어 모드) */
|
|
1262
|
+
value?: string;
|
|
1263
|
+
/** 처음 선택된 값 (비제어 모드) */
|
|
1264
|
+
defaultValue?: string;
|
|
1265
|
+
/** 값이 바뀔 때 호출된다 */
|
|
1266
|
+
onValueChange?: (value: string) => void;
|
|
1267
|
+
/** 위에 보이는 레이블. 없으면 aria-label 로 이름을 준다 */
|
|
1268
|
+
label?: ReactNode;
|
|
1269
|
+
/** label 이 없을 때 스크린리더용 이름 (예: "기간") */
|
|
1270
|
+
'aria-label'?: string;
|
|
1271
|
+
/** 크기 — 전체 높이가 Button·Input 과 같다 (sm 32 / md 40 / lg 48) */
|
|
1272
|
+
size?: 'sm' | 'md' | 'lg';
|
|
1273
|
+
/** 부모 너비를 꽉 채우고 칸을 같은 너비로 나눈다 */
|
|
1274
|
+
fullWidth?: boolean;
|
|
1275
|
+
disabled?: boolean;
|
|
1276
|
+
/** form 제출 시 사용할 이름 */
|
|
1277
|
+
name?: string;
|
|
1278
|
+
id?: string;
|
|
1279
|
+
className?: string;
|
|
1280
|
+
}
|
|
1281
|
+
/**
|
|
1282
|
+
* 여러 값 중 하나를 고르는 칸 묶음 (기간 일/주/월, 보기 방식 등).
|
|
1283
|
+
* 의미는 라디오 그룹과 같다(WAI-ARIA radiogroup): Tab 으로 그룹에 들어가면 선택된 칸, 화살표로 옮기면 바로 선택된다.
|
|
1284
|
+
* 선택에 따라 아래 내용이 바뀌는 "패널" 이 있으면 Tabs 를 쓴다.
|
|
1285
|
+
*
|
|
1286
|
+
* Radix RadioGroup 을 쓰지 않고 직접 구현한다 — Radix 는 "포커스가 옮겨질 때 화살표 키가 아직 눌려 있는지" 로 선택을 정해서
|
|
1287
|
+
* 키를 아주 빨리 떼는 입력(자동화·일부 보조기기)에서는 포커스만 옮겨지고 선택이 안 되는 경우가 있었다(E2E 에서 약 20%).
|
|
1288
|
+
*/
|
|
1289
|
+
declare const SegmentedControl: react.ForwardRefExoticComponent<SegmentedControlProps & react.RefAttributes<HTMLDivElement>>;
|
|
1290
|
+
|
|
1175
1291
|
interface SelectOption {
|
|
1176
1292
|
value: string;
|
|
1177
1293
|
label: ReactNode;
|
|
@@ -1226,6 +1342,23 @@ interface SkeletonProps extends HTMLAttributes<HTMLSpanElement> {
|
|
|
1226
1342
|
*/
|
|
1227
1343
|
declare const Skeleton: react.ForwardRefExoticComponent<SkeletonProps & react.RefAttributes<HTMLSpanElement>>;
|
|
1228
1344
|
|
|
1345
|
+
interface SkipLinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
|
|
1346
|
+
/** 건너뛸 곳(본문)의 id 를 가리키는 주소. 기본 "#main" — 본문 요소에 id="main" 을 준다 */
|
|
1347
|
+
href?: string;
|
|
1348
|
+
}
|
|
1349
|
+
/**
|
|
1350
|
+
* 본문 바로가기 (KWCAG 2.2 6.4.1 반복 영역 건너뛰기 / WCAG 2.4.1).
|
|
1351
|
+
* 페이지 맨 앞(머리글·메뉴보다 먼저)에 둔다. 평소에는 보이지 않고, 첫 Tab 에 왼쪽 위에 나타난다.
|
|
1352
|
+
* 누르면 본문으로 포커스를 옮긴다 — 본문 요소가 원래 포커스를 받지 못하면 tabindex="-1" 을 붙여 옮긴다
|
|
1353
|
+
* (주소의 #만 바꾸면 일부 브라우저·SPA 라우터에서 포커스가 그대로 남는다).
|
|
1354
|
+
*
|
|
1355
|
+
* @example
|
|
1356
|
+
* <SkipLink /> // "본문 바로가기" → #main
|
|
1357
|
+
* <Header />
|
|
1358
|
+
* <main id="main">…</main>
|
|
1359
|
+
*/
|
|
1360
|
+
declare const SkipLink: react.ForwardRefExoticComponent<SkipLinkProps & react.RefAttributes<HTMLAnchorElement>>;
|
|
1361
|
+
|
|
1229
1362
|
interface SliderProps {
|
|
1230
1363
|
/** 값 (제어 모드). 손잡이 하나면 `[50]`, 범위면 `[20, 80]` */
|
|
1231
1364
|
value?: number[];
|
|
@@ -1538,4 +1671,4 @@ interface VerificationCodeInputProps {
|
|
|
1538
1671
|
*/
|
|
1539
1672
|
declare const VerificationCodeInput: react.ForwardRefExoticComponent<VerificationCodeInputProps & react.RefAttributes<HTMLInputElement>>;
|
|
1540
1673
|
|
|
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 };
|
|
1674
|
+
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, 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 };
|
package/dist/index.d.ts
CHANGED
|
@@ -285,6 +285,13 @@ 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;
|
|
288
295
|
/** Slider 범위 손잡이 — "최소", "최대" */
|
|
289
296
|
rangeStart: string;
|
|
290
297
|
rangeEnd: string;
|
|
@@ -601,6 +608,19 @@ interface TextFieldProps extends Omit<InputProps, 'invalid'> {
|
|
|
601
608
|
helperText?: ReactNode;
|
|
602
609
|
/** 에러 상태 */
|
|
603
610
|
error?: boolean;
|
|
611
|
+
/** 필수 입력 (레이블에 * 표시, required 속성) */
|
|
612
|
+
required?: boolean;
|
|
613
|
+
disabled?: boolean;
|
|
614
|
+
/** 크기 */
|
|
615
|
+
size?: 'sm' | 'md' | 'lg';
|
|
616
|
+
/** 부모 너비를 꽉 채운다 */
|
|
617
|
+
fullWidth?: boolean;
|
|
618
|
+
/** 입력창 앞에 표시할 요소 (아이콘, 단위 등) */
|
|
619
|
+
startAdornment?: ReactNode;
|
|
620
|
+
/** 입력창 뒤에 표시할 요소 */
|
|
621
|
+
endAdornment?: ReactNode;
|
|
622
|
+
placeholder?: string;
|
|
623
|
+
type?: InputHTMLAttributes<HTMLInputElement>['type'];
|
|
604
624
|
}
|
|
605
625
|
declare const TextField: react.ForwardRefExoticComponent<TextFieldProps & react.RefAttributes<HTMLInputElement>>;
|
|
606
626
|
|
|
@@ -620,6 +640,22 @@ interface AmountInputProps extends Omit<TextFieldProps, 'value' | 'defaultValue'
|
|
|
620
640
|
* helperText 를 주면 그 아래 줄로 함께 보여 준다.
|
|
621
641
|
*/
|
|
622
642
|
showKoreanAmount?: boolean;
|
|
643
|
+
/** 입력창 위에 표시할 레이블 */
|
|
644
|
+
label?: ReactNode;
|
|
645
|
+
/** 입력창 아래에 표시할 도움말. error 일 때는 에러 메시지로 표시된다 */
|
|
646
|
+
helperText?: ReactNode;
|
|
647
|
+
/** 에러 상태 */
|
|
648
|
+
error?: boolean;
|
|
649
|
+
/** 필수 입력 (레이블에 * 표시, required 속성) */
|
|
650
|
+
required?: boolean;
|
|
651
|
+
disabled?: boolean;
|
|
652
|
+
/** 크기 */
|
|
653
|
+
size?: 'sm' | 'md' | 'lg';
|
|
654
|
+
/** 부모 너비를 꽉 채운다 */
|
|
655
|
+
fullWidth?: boolean;
|
|
656
|
+
placeholder?: string;
|
|
657
|
+
/** form 제출 시 사용할 이름 */
|
|
658
|
+
name?: string;
|
|
623
659
|
}
|
|
624
660
|
/**
|
|
625
661
|
* 금액 입력. 천 단위 쉼표를 넣고 뒤에 단위("원")를 붙이며, 아래에 "12만 5,000원" 처럼 읽기 쉬운 금액을 보여 준다.
|
|
@@ -693,6 +729,22 @@ interface BusinessNumberInputProps extends Omit<TextFieldProps, 'value' | 'defau
|
|
|
693
729
|
validate?: boolean;
|
|
694
730
|
/** 자동 검증 오류 문구 */
|
|
695
731
|
invalidText?: string;
|
|
732
|
+
/** 입력창 위에 표시할 레이블 */
|
|
733
|
+
label?: ReactNode;
|
|
734
|
+
/** 입력창 아래에 표시할 도움말. error 일 때는 에러 메시지로 표시된다 */
|
|
735
|
+
helperText?: ReactNode;
|
|
736
|
+
/** 에러 상태 */
|
|
737
|
+
error?: boolean;
|
|
738
|
+
/** 필수 입력 (레이블에 * 표시, required 속성) */
|
|
739
|
+
required?: boolean;
|
|
740
|
+
disabled?: boolean;
|
|
741
|
+
/** 크기 */
|
|
742
|
+
size?: 'sm' | 'md' | 'lg';
|
|
743
|
+
/** 부모 너비를 꽉 채운다 */
|
|
744
|
+
fullWidth?: boolean;
|
|
745
|
+
placeholder?: string;
|
|
746
|
+
/** form 제출 시 사용할 이름 */
|
|
747
|
+
name?: string;
|
|
696
748
|
}
|
|
697
749
|
/**
|
|
698
750
|
* 사업자등록번호 입력. 123-45-67890 형식으로 하이픈을 넣고, 10자리를 채우면 검증 공식으로 확인한다.
|
|
@@ -823,6 +875,13 @@ interface ComboboxProps {
|
|
|
823
875
|
'aria-label'?: string;
|
|
824
876
|
/** 목록 열기 버튼의 이름 */
|
|
825
877
|
toggleLabel?: string;
|
|
878
|
+
/**
|
|
879
|
+
* 값이 있을 때 "선택 지우기" 버튼을 보여 준다. 버튼이 없어도 입력창 글자를 모두 지우고 닫으면(포커스 이동·Esc·Enter) 선택이 지워진다.
|
|
880
|
+
* 지우면 `onValueChange('')` 가 호출된다.
|
|
881
|
+
*/
|
|
882
|
+
clearable?: boolean;
|
|
883
|
+
/** "선택 지우기" 버튼의 이름 */
|
|
884
|
+
clearLabel?: string;
|
|
826
885
|
/** 입력창 래퍼 className */
|
|
827
886
|
className?: string;
|
|
828
887
|
}
|
|
@@ -1068,6 +1127,22 @@ interface PhoneNumberInputProps extends Omit<TextFieldProps, 'value' | 'defaultV
|
|
|
1068
1127
|
defaultValue?: string;
|
|
1069
1128
|
/** 숫자만 있는 값으로 호출된다 (하이픈 없음) */
|
|
1070
1129
|
onValueChange?: (digits: string) => void;
|
|
1130
|
+
/** 입력창 위에 표시할 레이블 */
|
|
1131
|
+
label?: ReactNode;
|
|
1132
|
+
/** 입력창 아래에 표시할 도움말. error 일 때는 에러 메시지로 표시된다 */
|
|
1133
|
+
helperText?: ReactNode;
|
|
1134
|
+
/** 에러 상태 */
|
|
1135
|
+
error?: boolean;
|
|
1136
|
+
/** 필수 입력 (레이블에 * 표시, required 속성) */
|
|
1137
|
+
required?: boolean;
|
|
1138
|
+
disabled?: boolean;
|
|
1139
|
+
/** 크기 */
|
|
1140
|
+
size?: 'sm' | 'md' | 'lg';
|
|
1141
|
+
/** 부모 너비를 꽉 채운다 */
|
|
1142
|
+
fullWidth?: boolean;
|
|
1143
|
+
placeholder?: string;
|
|
1144
|
+
/** form 제출 시 사용할 이름 */
|
|
1145
|
+
name?: string;
|
|
1071
1146
|
}
|
|
1072
1147
|
/**
|
|
1073
1148
|
* 전화번호 입력. 입력하는 대로 하이픈을 넣고(010-1234-5678, 02-123-4567, 1588-1234), 값은 숫자만 넘긴다.
|
|
@@ -1172,6 +1247,47 @@ interface RadioGroupProps {
|
|
|
1172
1247
|
}
|
|
1173
1248
|
declare const RadioGroup: react.ForwardRefExoticComponent<RadioGroupProps & react.RefAttributes<HTMLDivElement>>;
|
|
1174
1249
|
|
|
1250
|
+
interface SegmentedControlOption {
|
|
1251
|
+
value: string;
|
|
1252
|
+
/** 칸에 보이는 글자 (접근 가능한 이름이 된다) */
|
|
1253
|
+
label: ReactNode;
|
|
1254
|
+
/** 글자 앞 아이콘 (장식용) */
|
|
1255
|
+
icon?: ReactNode;
|
|
1256
|
+
disabled?: boolean;
|
|
1257
|
+
}
|
|
1258
|
+
interface SegmentedControlProps {
|
|
1259
|
+
/** 선택지 (2~5개 권장 — 많으면 Select 를 쓴다) */
|
|
1260
|
+
options: SegmentedControlOption[];
|
|
1261
|
+
/** 선택된 값 (제어 모드) */
|
|
1262
|
+
value?: string;
|
|
1263
|
+
/** 처음 선택된 값 (비제어 모드) */
|
|
1264
|
+
defaultValue?: string;
|
|
1265
|
+
/** 값이 바뀔 때 호출된다 */
|
|
1266
|
+
onValueChange?: (value: string) => void;
|
|
1267
|
+
/** 위에 보이는 레이블. 없으면 aria-label 로 이름을 준다 */
|
|
1268
|
+
label?: ReactNode;
|
|
1269
|
+
/** label 이 없을 때 스크린리더용 이름 (예: "기간") */
|
|
1270
|
+
'aria-label'?: string;
|
|
1271
|
+
/** 크기 — 전체 높이가 Button·Input 과 같다 (sm 32 / md 40 / lg 48) */
|
|
1272
|
+
size?: 'sm' | 'md' | 'lg';
|
|
1273
|
+
/** 부모 너비를 꽉 채우고 칸을 같은 너비로 나눈다 */
|
|
1274
|
+
fullWidth?: boolean;
|
|
1275
|
+
disabled?: boolean;
|
|
1276
|
+
/** form 제출 시 사용할 이름 */
|
|
1277
|
+
name?: string;
|
|
1278
|
+
id?: string;
|
|
1279
|
+
className?: string;
|
|
1280
|
+
}
|
|
1281
|
+
/**
|
|
1282
|
+
* 여러 값 중 하나를 고르는 칸 묶음 (기간 일/주/월, 보기 방식 등).
|
|
1283
|
+
* 의미는 라디오 그룹과 같다(WAI-ARIA radiogroup): Tab 으로 그룹에 들어가면 선택된 칸, 화살표로 옮기면 바로 선택된다.
|
|
1284
|
+
* 선택에 따라 아래 내용이 바뀌는 "패널" 이 있으면 Tabs 를 쓴다.
|
|
1285
|
+
*
|
|
1286
|
+
* Radix RadioGroup 을 쓰지 않고 직접 구현한다 — Radix 는 "포커스가 옮겨질 때 화살표 키가 아직 눌려 있는지" 로 선택을 정해서
|
|
1287
|
+
* 키를 아주 빨리 떼는 입력(자동화·일부 보조기기)에서는 포커스만 옮겨지고 선택이 안 되는 경우가 있었다(E2E 에서 약 20%).
|
|
1288
|
+
*/
|
|
1289
|
+
declare const SegmentedControl: react.ForwardRefExoticComponent<SegmentedControlProps & react.RefAttributes<HTMLDivElement>>;
|
|
1290
|
+
|
|
1175
1291
|
interface SelectOption {
|
|
1176
1292
|
value: string;
|
|
1177
1293
|
label: ReactNode;
|
|
@@ -1226,6 +1342,23 @@ interface SkeletonProps extends HTMLAttributes<HTMLSpanElement> {
|
|
|
1226
1342
|
*/
|
|
1227
1343
|
declare const Skeleton: react.ForwardRefExoticComponent<SkeletonProps & react.RefAttributes<HTMLSpanElement>>;
|
|
1228
1344
|
|
|
1345
|
+
interface SkipLinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
|
|
1346
|
+
/** 건너뛸 곳(본문)의 id 를 가리키는 주소. 기본 "#main" — 본문 요소에 id="main" 을 준다 */
|
|
1347
|
+
href?: string;
|
|
1348
|
+
}
|
|
1349
|
+
/**
|
|
1350
|
+
* 본문 바로가기 (KWCAG 2.2 6.4.1 반복 영역 건너뛰기 / WCAG 2.4.1).
|
|
1351
|
+
* 페이지 맨 앞(머리글·메뉴보다 먼저)에 둔다. 평소에는 보이지 않고, 첫 Tab 에 왼쪽 위에 나타난다.
|
|
1352
|
+
* 누르면 본문으로 포커스를 옮긴다 — 본문 요소가 원래 포커스를 받지 못하면 tabindex="-1" 을 붙여 옮긴다
|
|
1353
|
+
* (주소의 #만 바꾸면 일부 브라우저·SPA 라우터에서 포커스가 그대로 남는다).
|
|
1354
|
+
*
|
|
1355
|
+
* @example
|
|
1356
|
+
* <SkipLink /> // "본문 바로가기" → #main
|
|
1357
|
+
* <Header />
|
|
1358
|
+
* <main id="main">…</main>
|
|
1359
|
+
*/
|
|
1360
|
+
declare const SkipLink: react.ForwardRefExoticComponent<SkipLinkProps & react.RefAttributes<HTMLAnchorElement>>;
|
|
1361
|
+
|
|
1229
1362
|
interface SliderProps {
|
|
1230
1363
|
/** 값 (제어 모드). 손잡이 하나면 `[50]`, 범위면 `[20, 80]` */
|
|
1231
1364
|
value?: number[];
|
|
@@ -1538,4 +1671,4 @@ interface VerificationCodeInputProps {
|
|
|
1538
1671
|
*/
|
|
1539
1672
|
declare const VerificationCodeInput: react.ForwardRefExoticComponent<VerificationCodeInputProps & react.RefAttributes<HTMLInputElement>>;
|
|
1540
1673
|
|
|
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 };
|
|
1674
|
+
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, 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 };
|
package/dist/shared.js
CHANGED
|
@@ -178,6 +178,8 @@ var en = {
|
|
|
178
178
|
newWindow: "(opens in a new window)",
|
|
179
179
|
noResults: "No results",
|
|
180
180
|
openList: "Show options",
|
|
181
|
+
clearSelection: "Clear selection",
|
|
182
|
+
skipToContent: "Skip to main content",
|
|
181
183
|
rangeStart: "minimum",
|
|
182
184
|
rangeEnd: "maximum",
|
|
183
185
|
agreeAll: "Agree to all",
|
package/dist/shared.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/theme/color.ts","../src/i18n/en.ts","../src/components/AgreementGroup/agreements.ts"],"sourcesContent":["// 대표색 하나로 intent 색 세트를 만드는 색 계산 유틸.\n// OKLCH(사람이 느끼는 밝기에 가까운 색 공간)에서 밝기를 조절하고, WCAG 대비(4.5:1)를 만족하도록 글자색을 찾는다.\nimport { darkColors, lightColors, palette } from '@bestow-ui/tokens';\nimport type { ThemeInput } from './createTheme';\n\ntype Rgb = [number, number, number]; // 0~1, sRGB\ninterface Oklch {\n l: number;\n c: number;\n h: number;\n}\n\nexport function parseHex(hex: string): Rgb {\n const m = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(hex.trim());\n if (!m) throw new Error(`올바른 hex 색이 아니에요: \"${hex}\" (예: \"#7c3aed\")`);\n let h = m[1]!;\n if (h.length === 3) h = h.replace(/./g, (c) => c + c);\n return [0, 2, 4].map((i) => parseInt(h.slice(i, i + 2), 16) / 255) as Rgb;\n}\n\nexport function toHex(rgb: Rgb): string {\n return `#${rgb\n .map((v) =>\n Math.round(Math.min(1, Math.max(0, v)) * 255)\n .toString(16)\n .padStart(2, '0'),\n )\n .join('')}`;\n}\n\nconst toLinear = (c: number) => (c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4);\nconst fromLinear = (c: number) => (c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055);\n\nfunction rgbToOklch([r, g, b]: Rgb): Oklch {\n const [lr, lg, lb] = [toLinear(r), toLinear(g), toLinear(b)];\n const l_ = Math.cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb);\n const m_ = Math.cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb);\n const s_ = Math.cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb);\n const L = 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_;\n const a = 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_;\n const bb = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_;\n return { l: L, c: Math.hypot(a, bb), h: Math.atan2(bb, a) };\n}\n\nfunction oklchToRgbUnclamped({ l, c, h }: Oklch): Rgb {\n const a = c * Math.cos(h);\n const b = c * Math.sin(h);\n const l_ = (l + 0.3963377774 * a + 0.2158037573 * b) ** 3;\n const m_ = (l - 0.1055613458 * a - 0.0638541728 * b) ** 3;\n const s_ = (l - 0.0894841775 * a - 1.291485548 * b) ** 3;\n return [\n fromLinear(4.0767416621 * l_ - 3.3077115913 * m_ + 0.2309699292 * s_),\n fromLinear(-1.2684380046 * l_ + 2.6097574011 * m_ - 0.3413193965 * s_),\n fromLinear(-0.0041960863 * l_ - 0.7034186147 * m_ + 1.707614701 * s_),\n ];\n}\n\nconst inGamut = (rgb: Rgb) => rgb.every((v) => v >= -1e-4 && v <= 1 + 1e-4);\n\n/** sRGB 범위를 벗어나면 채도(c)를 줄여 범위 안으로 맞춘다. */\nfunction oklchToRgb(color: Oklch): Rgb {\n const l = Math.min(1, Math.max(0, color.l));\n let rgb = oklchToRgbUnclamped({ ...color, l });\n if (inGamut(rgb)) return rgb;\n let lo = 0;\n let hi = color.c;\n for (let i = 0; i < 20; i++) {\n const mid = (lo + hi) / 2;\n if (inGamut(oklchToRgbUnclamped({ l, c: mid, h: color.h }))) lo = mid;\n else hi = mid;\n }\n rgb = oklchToRgbUnclamped({ l, c: lo, h: color.h });\n return rgb;\n}\n\nfunction luminance([r, g, b]: Rgb): number {\n return 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n}\n\n/** WCAG 대비율 (1 ~ 21) */\nexport function contrastRatio(a: string, b: string): number {\n const [la, lb] = [luminance(parseHex(a)), luminance(parseHex(b))];\n return (Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05);\n}\n\n/** fg 를 alpha 만큼 bg 위에 겹친 결과 색 */\nfunction blend(fg: string, alpha: number, bg: string): string {\n const [f, b] = [parseHex(fg), parseHex(bg)];\n return toHex(f.map((v, i) => v * alpha + b[i]! * (1 - alpha)) as Rgb);\n}\n\nconst withL = (base: Oklch, l: number, c = base.c) => toHex(oklchToRgb({ l, c, h: base.h }));\n\n/** 대상 배경들 위에서 대비 4.5 를 넘을 때까지 밝기를 step 만큼 옮긴다. */\nfunction findReadable(base: Oklch, startL: number, step: number, backgrounds: string[]): string {\n let l = startL;\n for (let i = 0; i < 40; i++) {\n const hex = withL(base, l);\n if (backgrounds.every((bg) => contrastRatio(hex, bg) >= 4.5)) return hex;\n l = Math.min(1, Math.max(0, l + step));\n }\n return step < 0 ? palette.black : palette.white;\n}\n\n/**\n * solid 의 hover 색: 밝기를 delta 만큼 옮기되, 그 결과에서 글자색(contrast) 대비가 4.5 아래로 떨어지면 반대 방향으로 옮긴다.\n * (예: 다크 모드에서 파란 버튼을 밝게 하면 흰 글자 대비가 떨어지므로 어둡게 한다)\n */\nfunction hoverFor(base: Oklch, delta: number, contrast: string): string {\n const preferred = withL(base, Math.min(1, Math.max(0, base.l + delta)));\n if (contrastRatio(contrast, preferred) >= 4.5) return preferred;\n return withL(base, Math.min(1, Math.max(0, base.l - delta)));\n}\n\n/**\n * solid 배경과 그 위 글자색(contrast). 흰 글자가 4.5 를 넘으면 흰색, 아니면 짙은 글자.\n * 둘 다 4.5 미만인 중간 밝기 색(초록 #059669, 주황 #ea580c 등)은 solid 의 밝기를 가장 적게 옮겨 4.5 를 맞춘다\n * (같은 거리면 어둡게 + 흰 글자를 먼저 고른다).\n */\nfunction solidWithContrast(color: string): { solid: string; contrast: string } {\n const white = palette.white;\n const dark = palette.gray[900];\n if (contrastRatio(white, color) >= 4.5) return { solid: color, contrast: white };\n if (contrastRatio(dark, color) >= 4.5) return { solid: color, contrast: dark };\n const base = rgbToOklch(parseHex(color));\n for (let delta = 0.005; delta <= 1; delta += 0.005) {\n const darker = withL(base, Math.max(0, base.l - delta));\n if (contrastRatio(white, darker) >= 4.5) return { solid: darker, contrast: white };\n const lighter = withL(base, Math.min(1, base.l + delta));\n if (contrastRatio(dark, lighter) >= 4.5) return { solid: lighter, contrast: dark };\n }\n return { solid: palette.black, contrast: white };\n}\n\nconst rgba = (hex: string, alpha: number) => {\n const [r, g, b] = parseHex(hex).map((v) => Math.round(v * 255));\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n};\n\nexport type IntentName = 'primary' | 'neutral' | 'danger' | 'success' | 'warning';\n\n/**\n * 대표색 하나로 intent(primary 등)의 라이트·다크 색 세트를 만든다. 결과는 createTheme 에 넘긴다.\n * - solid 는 넘긴 색을 그대로 쓴다 (다크모드에서 너무 어두우면 조금 밝힌다). 단 흰 글자·짙은 글자 모두\n * 대비 4.5:1 이 안 나오는 중간 밝기 색이면 4.5 가 나올 만큼만 밝기를 옮긴다.\n * - text 와 contrast(solid 위 글자색)는 WCAG AA 대비 4.5:1 을 만족하도록 계산한다.\n * - intent 가 'primary' 면 포커스 링 색(border.focus)도 함께 바꾼다.\n *\n * @example createTheme(createIntentColors('primary', '#7c3aed'))\n */\nexport function createIntentColors(intent: IntentName, color: string): ThemeInput {\n const input = toHex(parseHex(color));\n const base = rgbToOklch(parseHex(input));\n\n // 라이트\n const lightSubtle = withL(base, 0.97, Math.min(base.c, 0.12) * 0.3);\n const lightSubtleHover = withL(base, 0.93, Math.min(base.c, 0.12) * 0.45);\n const { solid, contrast: lightContrast } = solidWithContrast(input);\n const light = {\n solid,\n solidHover: hoverFor(rgbToOklch(parseHex(solid)), -0.06, lightContrast),\n contrast: lightContrast,\n subtle: lightSubtle,\n subtleHover: lightSubtleHover,\n text: findReadable(base, Math.min(base.l, 0.55), -0.02, [lightColors.bg.default, lightSubtle, lightSubtleHover]),\n };\n\n // 다크\n const darkBg = darkColors.bg.default;\n const { solid: darkSolid, contrast: darkContrast } = solidWithContrast(base.l < 0.5 ? withL(base, 0.55) : input);\n const darkBase = rgbToOklch(parseHex(darkSolid));\n const darkSubtleOnBg = blend(darkSolid, 0.16, darkBg);\n const darkSubtleHoverOnBg = blend(darkSolid, 0.26, darkBg);\n const dark = {\n solid: darkSolid,\n solidHover: hoverFor(darkBase, 0.06, darkContrast),\n contrast: darkContrast,\n subtle: rgba(darkSolid, 0.16),\n subtleHover: rgba(darkSolid, 0.26),\n text: findReadable(darkBase, Math.max(darkBase.l, 0.75), 0.02, [darkBg, darkSubtleOnBg, darkSubtleHoverOnBg]),\n };\n\n // primary 는 포커스 링(border.focus)도 브랜드 색을 따라가게 한다. 다크는 어두운 배경에서 잘 보이도록 solid 보다 밝게.\n // 포커스 링은 그래픽이라 배경과 3:1 이상이어야 한다(WCAG 1.4.11). 노랑·하늘색처럼 밝은 색은 라이트에서 미달이므로\n // 그때는 배경 대비 4.5:1 이 보장된 text 색을 쓴다.\n const focusOn = (candidate: string, fallback: string, bg: string) =>\n contrastRatio(candidate, bg) >= 3 ? candidate : fallback;\n const focus =\n intent === 'primary'\n ? {\n light: { border: { focus: focusOn(light.solid, light.text, lightColors.bg.default) } },\n dark: {\n border: { focus: focusOn(withL(darkBase, Math.min(1, darkBase.l + 0.06)), dark.text, darkBg) },\n },\n }\n : undefined;\n\n return {\n light: { color: { [intent]: light, ...focus?.light } },\n dark: { color: { [intent]: dark, ...focus?.dark } },\n } as ThemeInput;\n}\n","import type { BestowMessages } from './LocaleProvider';\n\nconst WEEKDAYS_LONG = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] as const;\nconst MONTHS = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n] as const;\n\n/**\n * 영어 문구. `<LocaleProvider messages={en}>` 로 쓴다. 따로 import 할 때만 번들에 들어간다.\n * 한국 서비스 전용 부품(사업자등록번호 등)의 문구도 영어로 바뀌지만 서식(하이픈 위치 등)은 그대로다.\n */\nexport const en: BestowMessages = {\n close: 'Close',\n loading: 'Loading',\n notifications: 'Notifications',\n breadcrumb: 'Breadcrumb',\n pagination: 'Pagination',\n paginationPrevious: 'Previous page',\n paginationNext: 'Next page',\n paginationPage: (page) => `Page ${page}`,\n newWindow: '(opens in a new window)',\n noResults: 'No results',\n openList: 'Show options',\n rangeStart: 'minimum',\n rangeEnd: 'maximum',\n agreeAll: 'Agree to all',\n required: 'Required',\n optional: 'Optional',\n show: 'View',\n hide: 'Hide',\n verificationCode: 'Verification code',\n verificationCodeHint: (length, type) => `Enter the ${length}-${type === 'numeric' ? 'digit' : 'character'} code.`,\n resend: 'Resend',\n verificationExpired: 'The code has expired. Please request a new one.',\n phoneNumber: 'Phone number',\n businessNumber: 'Business registration number',\n businessNumberInvalid: 'This business registration number is not valid. Please check it again.',\n businessNumberIncomplete: 'Enter all 10 digits.',\n amount: 'Amount',\n currencyUnit: 'KRW',\n address: 'Address',\n addressSearch: 'Find address',\n addressSearchDescription: 'Search by road name, building name, or lot number.',\n postalCode: 'Postal code',\n baseAddress: 'Address',\n baseAddressPlaceholder: 'Select \"Find address\" to choose an address',\n detailAddress: 'Address line 2',\n detailAddressPlaceholder: 'Apartment, suite, unit, etc.',\n addressLoading: 'Loading address search',\n addressLoadError: 'Could not load address search. Please try again later.',\n previousMonth: 'Previous month',\n nextMonth: 'Next month',\n monthTitle: (year, month) => `${MONTHS[month - 1]} ${year}`,\n weekdaysShort: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n weekdaysLong: WEEKDAYS_LONG,\n dayLabel: (date, weekdayLong) =>\n `${date.getDate()}, ${weekdayLong}, ${MONTHS[date.getMonth()]} ${date.getFullYear()}`,\n holiday: 'holiday',\n today: 'today',\n date: 'Date',\n openCalendar: 'Choose date',\n calendar: 'Calendar',\n dateInvalid: 'This date does not exist.',\n dateUnavailable: 'This date is not available.',\n dateIncomplete: 'Enter the date as YYYY-MM-DD.',\n};\n","import type { ReactNode } from 'react';\n\n// 서버 컴포넌트에서도 부를 수 있도록 컴포넌트(hook·Radix) 파일과 분리한 순수 타입·함수\n\nexport interface AgreementItem {\n value: string;\n /** 약관 이름 (예: \"서비스 이용약관 동의\") */\n label: ReactNode;\n /** 필수 동의 여부. 이름 앞에 \"필수\"/\"선택\" 이 붙는다 */\n required?: boolean;\n /** 펼쳐서 보여 줄 약관 내용. 있으면 \"보기\" 버튼이 생긴다 */\n content?: ReactNode;\n}\n\n/** 필수 항목에 모두 동의했는지 */\nexport function hasAllRequiredAgreements(items: AgreementItem[], value: string[]): boolean {\n return items.every((item) => !item.required || value.includes(item.value));\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/theme/color.ts","../src/i18n/en.ts","../src/components/AgreementGroup/agreements.ts"],"sourcesContent":["// 대표색 하나로 intent 색 세트를 만드는 색 계산 유틸.\n// OKLCH(사람이 느끼는 밝기에 가까운 색 공간)에서 밝기를 조절하고, WCAG 대비(4.5:1)를 만족하도록 글자색을 찾는다.\nimport { darkColors, lightColors, palette } from '@bestow-ui/tokens';\nimport type { ThemeInput } from './createTheme';\n\ntype Rgb = [number, number, number]; // 0~1, sRGB\ninterface Oklch {\n l: number;\n c: number;\n h: number;\n}\n\nexport function parseHex(hex: string): Rgb {\n const m = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(hex.trim());\n if (!m) throw new Error(`올바른 hex 색이 아니에요: \"${hex}\" (예: \"#7c3aed\")`);\n let h = m[1]!;\n if (h.length === 3) h = h.replace(/./g, (c) => c + c);\n return [0, 2, 4].map((i) => parseInt(h.slice(i, i + 2), 16) / 255) as Rgb;\n}\n\nexport function toHex(rgb: Rgb): string {\n return `#${rgb\n .map((v) =>\n Math.round(Math.min(1, Math.max(0, v)) * 255)\n .toString(16)\n .padStart(2, '0'),\n )\n .join('')}`;\n}\n\nconst toLinear = (c: number) => (c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4);\nconst fromLinear = (c: number) => (c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055);\n\nfunction rgbToOklch([r, g, b]: Rgb): Oklch {\n const [lr, lg, lb] = [toLinear(r), toLinear(g), toLinear(b)];\n const l_ = Math.cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb);\n const m_ = Math.cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb);\n const s_ = Math.cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb);\n const L = 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_;\n const a = 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_;\n const bb = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_;\n return { l: L, c: Math.hypot(a, bb), h: Math.atan2(bb, a) };\n}\n\nfunction oklchToRgbUnclamped({ l, c, h }: Oklch): Rgb {\n const a = c * Math.cos(h);\n const b = c * Math.sin(h);\n const l_ = (l + 0.3963377774 * a + 0.2158037573 * b) ** 3;\n const m_ = (l - 0.1055613458 * a - 0.0638541728 * b) ** 3;\n const s_ = (l - 0.0894841775 * a - 1.291485548 * b) ** 3;\n return [\n fromLinear(4.0767416621 * l_ - 3.3077115913 * m_ + 0.2309699292 * s_),\n fromLinear(-1.2684380046 * l_ + 2.6097574011 * m_ - 0.3413193965 * s_),\n fromLinear(-0.0041960863 * l_ - 0.7034186147 * m_ + 1.707614701 * s_),\n ];\n}\n\nconst inGamut = (rgb: Rgb) => rgb.every((v) => v >= -1e-4 && v <= 1 + 1e-4);\n\n/** sRGB 범위를 벗어나면 채도(c)를 줄여 범위 안으로 맞춘다. */\nfunction oklchToRgb(color: Oklch): Rgb {\n const l = Math.min(1, Math.max(0, color.l));\n let rgb = oklchToRgbUnclamped({ ...color, l });\n if (inGamut(rgb)) return rgb;\n let lo = 0;\n let hi = color.c;\n for (let i = 0; i < 20; i++) {\n const mid = (lo + hi) / 2;\n if (inGamut(oklchToRgbUnclamped({ l, c: mid, h: color.h }))) lo = mid;\n else hi = mid;\n }\n rgb = oklchToRgbUnclamped({ l, c: lo, h: color.h });\n return rgb;\n}\n\nfunction luminance([r, g, b]: Rgb): number {\n return 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n}\n\n/** WCAG 대비율 (1 ~ 21) */\nexport function contrastRatio(a: string, b: string): number {\n const [la, lb] = [luminance(parseHex(a)), luminance(parseHex(b))];\n return (Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05);\n}\n\n/** fg 를 alpha 만큼 bg 위에 겹친 결과 색 */\nfunction blend(fg: string, alpha: number, bg: string): string {\n const [f, b] = [parseHex(fg), parseHex(bg)];\n return toHex(f.map((v, i) => v * alpha + b[i]! * (1 - alpha)) as Rgb);\n}\n\nconst withL = (base: Oklch, l: number, c = base.c) => toHex(oklchToRgb({ l, c, h: base.h }));\n\n/** 대상 배경들 위에서 대비 4.5 를 넘을 때까지 밝기를 step 만큼 옮긴다. */\nfunction findReadable(base: Oklch, startL: number, step: number, backgrounds: string[]): string {\n let l = startL;\n for (let i = 0; i < 40; i++) {\n const hex = withL(base, l);\n if (backgrounds.every((bg) => contrastRatio(hex, bg) >= 4.5)) return hex;\n l = Math.min(1, Math.max(0, l + step));\n }\n return step < 0 ? palette.black : palette.white;\n}\n\n/**\n * solid 의 hover 색: 밝기를 delta 만큼 옮기되, 그 결과에서 글자색(contrast) 대비가 4.5 아래로 떨어지면 반대 방향으로 옮긴다.\n * (예: 다크 모드에서 파란 버튼을 밝게 하면 흰 글자 대비가 떨어지므로 어둡게 한다)\n */\nfunction hoverFor(base: Oklch, delta: number, contrast: string): string {\n const preferred = withL(base, Math.min(1, Math.max(0, base.l + delta)));\n if (contrastRatio(contrast, preferred) >= 4.5) return preferred;\n return withL(base, Math.min(1, Math.max(0, base.l - delta)));\n}\n\n/**\n * solid 배경과 그 위 글자색(contrast). 흰 글자가 4.5 를 넘으면 흰색, 아니면 짙은 글자.\n * 둘 다 4.5 미만인 중간 밝기 색(초록 #059669, 주황 #ea580c 등)은 solid 의 밝기를 가장 적게 옮겨 4.5 를 맞춘다\n * (같은 거리면 어둡게 + 흰 글자를 먼저 고른다).\n */\nfunction solidWithContrast(color: string): { solid: string; contrast: string } {\n const white = palette.white;\n const dark = palette.gray[900];\n if (contrastRatio(white, color) >= 4.5) return { solid: color, contrast: white };\n if (contrastRatio(dark, color) >= 4.5) return { solid: color, contrast: dark };\n const base = rgbToOklch(parseHex(color));\n for (let delta = 0.005; delta <= 1; delta += 0.005) {\n const darker = withL(base, Math.max(0, base.l - delta));\n if (contrastRatio(white, darker) >= 4.5) return { solid: darker, contrast: white };\n const lighter = withL(base, Math.min(1, base.l + delta));\n if (contrastRatio(dark, lighter) >= 4.5) return { solid: lighter, contrast: dark };\n }\n return { solid: palette.black, contrast: white };\n}\n\nconst rgba = (hex: string, alpha: number) => {\n const [r, g, b] = parseHex(hex).map((v) => Math.round(v * 255));\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n};\n\nexport type IntentName = 'primary' | 'neutral' | 'danger' | 'success' | 'warning';\n\n/**\n * 대표색 하나로 intent(primary 등)의 라이트·다크 색 세트를 만든다. 결과는 createTheme 에 넘긴다.\n * - solid 는 넘긴 색을 그대로 쓴다 (다크모드에서 너무 어두우면 조금 밝힌다). 단 흰 글자·짙은 글자 모두\n * 대비 4.5:1 이 안 나오는 중간 밝기 색이면 4.5 가 나올 만큼만 밝기를 옮긴다.\n * - text 와 contrast(solid 위 글자색)는 WCAG AA 대비 4.5:1 을 만족하도록 계산한다.\n * - intent 가 'primary' 면 포커스 링 색(border.focus)도 함께 바꾼다.\n *\n * @example createTheme(createIntentColors('primary', '#7c3aed'))\n */\nexport function createIntentColors(intent: IntentName, color: string): ThemeInput {\n const input = toHex(parseHex(color));\n const base = rgbToOklch(parseHex(input));\n\n // 라이트\n const lightSubtle = withL(base, 0.97, Math.min(base.c, 0.12) * 0.3);\n const lightSubtleHover = withL(base, 0.93, Math.min(base.c, 0.12) * 0.45);\n const { solid, contrast: lightContrast } = solidWithContrast(input);\n const light = {\n solid,\n solidHover: hoverFor(rgbToOklch(parseHex(solid)), -0.06, lightContrast),\n contrast: lightContrast,\n subtle: lightSubtle,\n subtleHover: lightSubtleHover,\n text: findReadable(base, Math.min(base.l, 0.55), -0.02, [lightColors.bg.default, lightSubtle, lightSubtleHover]),\n };\n\n // 다크\n const darkBg = darkColors.bg.default;\n const { solid: darkSolid, contrast: darkContrast } = solidWithContrast(base.l < 0.5 ? withL(base, 0.55) : input);\n const darkBase = rgbToOklch(parseHex(darkSolid));\n const darkSubtleOnBg = blend(darkSolid, 0.16, darkBg);\n const darkSubtleHoverOnBg = blend(darkSolid, 0.26, darkBg);\n const dark = {\n solid: darkSolid,\n solidHover: hoverFor(darkBase, 0.06, darkContrast),\n contrast: darkContrast,\n subtle: rgba(darkSolid, 0.16),\n subtleHover: rgba(darkSolid, 0.26),\n text: findReadable(darkBase, Math.max(darkBase.l, 0.75), 0.02, [darkBg, darkSubtleOnBg, darkSubtleHoverOnBg]),\n };\n\n // primary 는 포커스 링(border.focus)도 브랜드 색을 따라가게 한다. 다크는 어두운 배경에서 잘 보이도록 solid 보다 밝게.\n // 포커스 링은 그래픽이라 배경과 3:1 이상이어야 한다(WCAG 1.4.11). 노랑·하늘색처럼 밝은 색은 라이트에서 미달이므로\n // 그때는 배경 대비 4.5:1 이 보장된 text 색을 쓴다.\n const focusOn = (candidate: string, fallback: string, bg: string) =>\n contrastRatio(candidate, bg) >= 3 ? candidate : fallback;\n const focus =\n intent === 'primary'\n ? {\n light: { border: { focus: focusOn(light.solid, light.text, lightColors.bg.default) } },\n dark: {\n border: { focus: focusOn(withL(darkBase, Math.min(1, darkBase.l + 0.06)), dark.text, darkBg) },\n },\n }\n : undefined;\n\n return {\n light: { color: { [intent]: light, ...focus?.light } },\n dark: { color: { [intent]: dark, ...focus?.dark } },\n } as ThemeInput;\n}\n","import type { BestowMessages } from './LocaleProvider';\n\nconst WEEKDAYS_LONG = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] as const;\nconst MONTHS = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n] as const;\n\n/**\n * 영어 문구. `<LocaleProvider messages={en}>` 로 쓴다. 따로 import 할 때만 번들에 들어간다.\n * 한국 서비스 전용 부품(사업자등록번호 등)의 문구도 영어로 바뀌지만 서식(하이픈 위치 등)은 그대로다.\n */\nexport const en: BestowMessages = {\n close: 'Close',\n loading: 'Loading',\n notifications: 'Notifications',\n breadcrumb: 'Breadcrumb',\n pagination: 'Pagination',\n paginationPrevious: 'Previous page',\n paginationNext: 'Next page',\n paginationPage: (page) => `Page ${page}`,\n newWindow: '(opens in a new window)',\n noResults: 'No results',\n openList: 'Show options',\n clearSelection: 'Clear selection',\n skipToContent: 'Skip to main content',\n rangeStart: 'minimum',\n rangeEnd: 'maximum',\n agreeAll: 'Agree to all',\n required: 'Required',\n optional: 'Optional',\n show: 'View',\n hide: 'Hide',\n verificationCode: 'Verification code',\n verificationCodeHint: (length, type) => `Enter the ${length}-${type === 'numeric' ? 'digit' : 'character'} code.`,\n resend: 'Resend',\n verificationExpired: 'The code has expired. Please request a new one.',\n phoneNumber: 'Phone number',\n businessNumber: 'Business registration number',\n businessNumberInvalid: 'This business registration number is not valid. Please check it again.',\n businessNumberIncomplete: 'Enter all 10 digits.',\n amount: 'Amount',\n currencyUnit: 'KRW',\n address: 'Address',\n addressSearch: 'Find address',\n addressSearchDescription: 'Search by road name, building name, or lot number.',\n postalCode: 'Postal code',\n baseAddress: 'Address',\n baseAddressPlaceholder: 'Select \"Find address\" to choose an address',\n detailAddress: 'Address line 2',\n detailAddressPlaceholder: 'Apartment, suite, unit, etc.',\n addressLoading: 'Loading address search',\n addressLoadError: 'Could not load address search. Please try again later.',\n previousMonth: 'Previous month',\n nextMonth: 'Next month',\n monthTitle: (year, month) => `${MONTHS[month - 1]} ${year}`,\n weekdaysShort: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n weekdaysLong: WEEKDAYS_LONG,\n dayLabel: (date, weekdayLong) =>\n `${date.getDate()}, ${weekdayLong}, ${MONTHS[date.getMonth()]} ${date.getFullYear()}`,\n holiday: 'holiday',\n today: 'today',\n date: 'Date',\n openCalendar: 'Choose date',\n calendar: 'Calendar',\n dateInvalid: 'This date does not exist.',\n dateUnavailable: 'This date is not available.',\n dateIncomplete: 'Enter the date as YYYY-MM-DD.',\n};\n","import type { ReactNode } from 'react';\n\n// 서버 컴포넌트에서도 부를 수 있도록 컴포넌트(hook·Radix) 파일과 분리한 순수 타입·함수\n\nexport interface AgreementItem {\n value: string;\n /** 약관 이름 (예: \"서비스 이용약관 동의\") */\n label: ReactNode;\n /** 필수 동의 여부. 이름 앞에 \"필수\"/\"선택\" 이 붙는다 */\n required?: boolean;\n /** 펼쳐서 보여 줄 약관 내용. 있으면 \"보기\" 버튼이 생긴다 */\n content?: ReactNode;\n}\n\n/** 필수 항목에 모두 동의했는지 */\nexport function hasAllRequiredAgreements(items: AgreementItem[], value: string[]): boolean {\n return items.every((item) => !item.required || value.includes(item.value));\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED