@bestow-ui/react 1.6.0 → 1.7.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 CHANGED
@@ -15,6 +15,7 @@
15
15
  금액("12만 5,000원" 읽기)·주소(카카오 우편번호)·날짜(일요일 시작·공휴일)·기간(빠른 선택) 입력.
16
16
  - **검사로 증명하는 접근성** — 모든 스토리를 실제 브라우저(Chromium·WebKit·Firefox)에서 라이트·다크 두 테마로 axe 검사해요.
17
17
  고대비 모드·320px 리플로·기본 글꼴 2배도 CI 로 확인하고, [KWCAG 2.2 항목별 대응 근거](https://dev-bestow.github.io/BestOW-UI/?path=/docs/accessibility-kwcag-2-2-%EB%8C%80%EC%9D%91--docs)를 문서로 정리했어요.
18
+ 주요 컴포넌트는 스크린리더(VoiceOver·NVDA)로 직접 들어 보고 [점검 기록](https://github.com/Dev-BestOW/BestOW-UI/blob/main/docs/SCREEN-READER-CHECKLIST.md)을 남겼어요.
18
19
  - **대표색 하나로 테마** — 브랜드 색을 넣어도 글자 대비 4.5:1(hover 포함)과 포커스 링 3:1 을 라이트·다크 모두 지켜요.
19
20
  [테마 빌더](https://dev-bestow.github.io/BestOW-UI/?path=/story/foundations-theme-builder--builder)에서 바로 해 볼 수 있어요.
20
21
  - **가볍고 서버 컴포넌트 친화적** — 런타임 CSS 0, Next.js App Router 지원, 쓰는 컴포넌트만 번들에 들어가요
@@ -57,7 +58,7 @@ function SaveButton() {
57
58
  ```
58
59
 
59
60
  Next.js App Router 에서는 Provider 를 `'use client'` 파일로 분리해 `app/layout.tsx` 에서 감싸면 돼요. 컴포넌트는 서버 컴포넌트에서도 바로 쓸 수 있어요.
60
- 상태가 없는 표시용 컴포넌트(`Typography`, `Stack`, `Card`, `Badge`, `Divider`, `Progress`, `Skeleton`, `DescriptionList`, `VisuallyHidden`)는
61
+ 상태가 없는 표시용 컴포넌트(`Typography`, `Stack`, `Grid`, `Container`, `Card`, `Badge`, `Divider`, `Progress`, `Skeleton`, `DescriptionList`, `VisuallyHidden`)는
61
62
  서버 컴포넌트로 렌더링되고(클라이언트 JS 없음), `createTheme`·`createIntentColors`·`vars`·`formatKoreanAmount` 같은 함수·값도 서버에서 그대로 불러요.
62
63
  자세한 설정은 [Storybook 시작하기](https://dev-bestow.github.io/BestOW-UI/)에 있어요.
63
64
 
@@ -66,12 +67,14 @@ Next.js App Router 에서는 Provider 를 `'use client'` 파일로 분리해 `ap
66
67
  ## 다크 모드
67
68
 
68
69
  ```tsx
69
- const [mode, setMode] = useState<ThemeName>('light');
70
+ const [mode, setMode] = useState<ThemeMode>('system'); // 'light' | 'dark' | 'system'
70
71
 
71
72
  <ThemeProvider theme={mode}>…</ThemeProvider>;
72
73
  ```
73
74
 
74
75
  Modal·Tooltip·Select·Toast 처럼 portal 로 띄우는 요소도 테마를 자동으로 따라가요.
76
+ `'system'` 은 OS 설정을 따르고, 서버 렌더링에서도 CSS 미디어쿼리로 그려 첫 화면이 깜빡이지 않아요.
77
+ 사용자가 고른 모드를 쿠키로 저장해 서버에서 읽는 방법은 [Storybook 시작하기 › 다크 모드](https://dev-bestow.github.io/BestOW-UI/)에 있어요.
75
78
 
76
79
  ## 브랜드 테마
77
80
 
@@ -119,15 +122,15 @@ react-hook-form 과 함께 쓸 수 있어요. 입력창은 `register` 를 그대
119
122
 
120
123
  | 분류 | 컴포넌트 |
121
124
  |---|---|
122
- | 레이아웃 | `Stack`, `Divider`, `Card`, `VisuallyHidden` |
125
+ | 레이아웃 | `Stack`(구간별 값 `{ base, md }`), `Grid`, `Container`, `Divider`, `Card`, `VisuallyHidden` — 구간 `media`(sm 640 · md 768 · lg 1024 · xl 1280px) |
123
126
  | 글자 | `Typography` |
124
127
  | 동작 | `Button`, `IconButton`, `Link` |
125
- | 폼 | `Input`, `TextField`, `Textarea`, `Select`, `NativeSelect`, `Combobox`, `NumberInput`, `FileUpload`, `Checkbox`, `RadioGroup`, `Switch`, `Slider` |
128
+ | 폼 | `Input`, `TextField`, `FormField`(직접 만든 입력에 레이블·오류 연결), `Textarea`, `Select`, `NativeSelect`, `Combobox`, `NumberInput`, `FileUpload`, `Checkbox`, `CheckboxGroup`, `RadioGroup`, `Switch`, `Slider` |
126
129
  | 피드백 | `Alert`, `ErrorSummary`, `Progress`, `ToastProvider` + `useToast`, `Spinner`, `Skeleton`, `Badge` |
127
130
  | 오버레이 | `Modal`, `Drawer`, `Popover`, `Tooltip`, `DropdownMenu` |
128
131
  | 탐색 | `Tabs`, `SegmentedControl`, `Accordion`, `Pagination`, `Breadcrumb`, `SkipLink`, `Stepper` |
129
132
  | 표시 | `Avatar`, `Table`(+ `TableEmpty`, `TableSkeleton`, `useTableSelection`), `DescriptionList` |
130
- | 한국 서비스 키트 | `AgreementGroup`(약관 동의), `VerificationCodeInput`(인증번호), `PhoneNumberInput`, `BusinessNumberInput`, `AmountInput`, `AddressInput`, `DatePicker`, `DateRangePicker`(+ `dateRangePresets`), `Calendar` (+ `formatPhoneNumber`, `formatBusinessNumber`, `isValidBusinessNumber`, `formatKoreanAmount`, `formatKoreanDate`, `parseISODate`, `toISODate` — 서식 함수는 React 없이도 쓰는 [`@bestow-ui/korean-utils`](https://www.npmjs.com/package/@bestow-ui/korean-utils) 에서 다시 내보내요) |
133
+ | 한국 서비스 키트 | `AgreementGroup`(약관 동의), `VerificationCodeInput`(인증번호), `PhoneNumberInput`, `BusinessNumberInput`, `ResidentNumberInput`(주민·외국인등록번호, 뒷자리 가림), `AmountInput`, `AddressInput`, `DatePicker`, `DateRangePicker`(+ `dateRangePresets`), `Calendar` (+ `formatPhoneNumber`, `formatBusinessNumber`, `isValidBusinessNumber`, `formatKoreanAmount`, `formatKoreanDate`, 주민번호 `formatResidentNumber`·`isValidResidentNumber`·`parseResidentNumber`, 마스킹 `maskName`·`maskPhoneNumber`·`maskResidentNumber`·`maskCardNumber`·`maskDigits`, `parseISODate`, `toISODate` — 서식 함수는 React 없이도 쓰는 [`@bestow-ui/korean-utils`](https://www.npmjs.com/package/@bestow-ui/korean-utils) 에서 다시 내보내요) |
131
134
  | 문구 | `LocaleProvider`, `en`(영어 문구 묶음) |
132
135
  | 테마 | `ThemeProvider`, `createTheme`, `createIntentColors`, `strongInputBorders`, `vars`, `useTheme`, `usePortalProps` |
133
136
  | 도움 함수 | `focusField` |
@@ -137,6 +140,8 @@ react-hook-form 과 함께 쓸 수 있어요. 입력창은 `register` 를 그대
137
140
  ## 지원 범위
138
141
 
139
142
  Chrome·Edge·Firefox·Safari 최근 2개 메이저 버전(모바일 포함), React 18·19, Next.js App Router 를 CI 로 확인해요.
143
+ **실서비스(프로덕션)에 써도 돼요** — 세 브라우저 엔진·모바일 E2E, React 18·19 CI, 스크린리더 수동 점검(VoiceOver·NVDA),
144
+ 실제 화면 파일럿, 지원·보안 정책까지 갖췄어요.
140
145
  버전 정책(semver·deprecated 절차)과 배포 주기는 [SUPPORT.md](https://github.com/Dev-BestOW/BestOW-UI/blob/main/SUPPORT.md),
141
146
  보안 문제는 공개 이슈 대신 [SECURITY.md](https://github.com/Dev-BestOW/BestOW-UI/blob/main/SECURITY.md) 의 방법으로 알려 주세요.
142
147
 
@@ -1,6 +1,7 @@
1
1
  // src/theme/contract.css.ts
2
+ var systemThemeClass = "tkagtb2";
2
3
  var themeClass = { light: "tkagtb0", dark: "tkagtb1" };
3
- var vars = { space: { "0": "var(--bestow-space-0)", "1": "var(--bestow-space-1)", "2": "var(--bestow-space-2)", "3": "var(--bestow-space-3)", "4": "var(--bestow-space-4)", "5": "var(--bestow-space-5)", "6": "var(--bestow-space-6)", "8": "var(--bestow-space-8)", "10": "var(--bestow-space-10)", "12": "var(--bestow-space-12)", "16": "var(--bestow-space-16)" }, radius: { none: "var(--bestow-radius-none)", sm: "var(--bestow-radius-sm)", md: "var(--bestow-radius-md)", lg: "var(--bestow-radius-lg)", xl: "var(--bestow-radius-xl)", full: "var(--bestow-radius-full)" }, font: { family: { sans: "var(--bestow-font-family-sans)", mono: "var(--bestow-font-family-mono)" }, size: { xs: "var(--bestow-font-size-xs)", sm: "var(--bestow-font-size-sm)", md: "var(--bestow-font-size-md)", lg: "var(--bestow-font-size-lg)", xl: "var(--bestow-font-size-xl)", "2xl": "var(--bestow-font-size-2xl)", "3xl": "var(--bestow-font-size-3xl)", "4xl": "var(--bestow-font-size-4xl)" }, weight: { regular: "var(--bestow-font-weight-regular)", medium: "var(--bestow-font-weight-medium)", semibold: "var(--bestow-font-weight-semibold)", bold: "var(--bestow-font-weight-bold)" }, lineHeight: { tight: "var(--bestow-font-line-height-tight)", normal: "var(--bestow-font-line-height-normal)", relaxed: "var(--bestow-font-line-height-relaxed)" } }, duration: { fast: "var(--bestow-duration-fast)", normal: "var(--bestow-duration-normal)", slow: "var(--bestow-duration-slow)" }, zIndex: { overlay: "var(--bestow-z-index-overlay)", modal: "var(--bestow-z-index-modal)", dropdown: "var(--bestow-z-index-dropdown)", toast: "var(--bestow-z-index-toast)", tooltip: "var(--bestow-z-index-tooltip)" }, color: { bg: { "default": "var(--bestow-color-bg-default)", subtle: "var(--bestow-color-bg-subtle)", muted: "var(--bestow-color-bg-muted)", inverse: "var(--bestow-color-bg-inverse)", overlay: "var(--bestow-color-bg-overlay)" }, fg: { "default": "var(--bestow-color-fg-default)", muted: "var(--bestow-color-fg-muted)", subtle: "var(--bestow-color-fg-subtle)", inverse: "var(--bestow-color-fg-inverse)" }, border: { "default": "var(--bestow-color-border-default)", strong: "var(--bestow-color-border-strong)", focus: "var(--bestow-color-border-focus)", input: "var(--bestow-color-border-input)", inputHover: "var(--bestow-color-border-input-hover)", control: "var(--bestow-color-border-control)" }, primary: { solid: "var(--bestow-color-primary-solid)", solidHover: "var(--bestow-color-primary-solid-hover)", contrast: "var(--bestow-color-primary-contrast)", subtle: "var(--bestow-color-primary-subtle)", subtleHover: "var(--bestow-color-primary-subtle-hover)", text: "var(--bestow-color-primary-text)" }, neutral: { solid: "var(--bestow-color-neutral-solid)", solidHover: "var(--bestow-color-neutral-solid-hover)", contrast: "var(--bestow-color-neutral-contrast)", subtle: "var(--bestow-color-neutral-subtle)", subtleHover: "var(--bestow-color-neutral-subtle-hover)", text: "var(--bestow-color-neutral-text)" }, danger: { solid: "var(--bestow-color-danger-solid)", solidHover: "var(--bestow-color-danger-solid-hover)", contrast: "var(--bestow-color-danger-contrast)", subtle: "var(--bestow-color-danger-subtle)", subtleHover: "var(--bestow-color-danger-subtle-hover)", text: "var(--bestow-color-danger-text)" }, success: { solid: "var(--bestow-color-success-solid)", solidHover: "var(--bestow-color-success-solid-hover)", contrast: "var(--bestow-color-success-contrast)", subtle: "var(--bestow-color-success-subtle)", subtleHover: "var(--bestow-color-success-subtle-hover)", text: "var(--bestow-color-success-text)" }, warning: { solid: "var(--bestow-color-warning-solid)", solidHover: "var(--bestow-color-warning-solid-hover)", contrast: "var(--bestow-color-warning-contrast)", subtle: "var(--bestow-color-warning-subtle)", subtleHover: "var(--bestow-color-warning-subtle-hover)", text: "var(--bestow-color-warning-text)" } }, shadow: { sm: "var(--bestow-shadow-sm)", md: "var(--bestow-shadow-md)", lg: "var(--bestow-shadow-lg)" } };
4
+ var vars = { space: { "0": "var(--bestow-space-0)", "1": "var(--bestow-space-1)", "2": "var(--bestow-space-2)", "3": "var(--bestow-space-3)", "4": "var(--bestow-space-4)", "5": "var(--bestow-space-5)", "6": "var(--bestow-space-6)", "8": "var(--bestow-space-8)", "10": "var(--bestow-space-10)", "12": "var(--bestow-space-12)", "16": "var(--bestow-space-16)" }, radius: { none: "var(--bestow-radius-none)", sm: "var(--bestow-radius-sm)", md: "var(--bestow-radius-md)", lg: "var(--bestow-radius-lg)", xl: "var(--bestow-radius-xl)", full: "var(--bestow-radius-full)" }, font: { family: { sans: "var(--bestow-font-family-sans)", mono: "var(--bestow-font-family-mono)" }, size: { xs: "var(--bestow-font-size-xs)", sm: "var(--bestow-font-size-sm)", md: "var(--bestow-font-size-md)", lg: "var(--bestow-font-size-lg)", xl: "var(--bestow-font-size-xl)", "2xl": "var(--bestow-font-size-2xl)", "3xl": "var(--bestow-font-size-3xl)", "4xl": "var(--bestow-font-size-4xl)" }, weight: { regular: "var(--bestow-font-weight-regular)", medium: "var(--bestow-font-weight-medium)", semibold: "var(--bestow-font-weight-semibold)", bold: "var(--bestow-font-weight-bold)" }, lineHeight: { tight: "var(--bestow-font-line-height-tight)", normal: "var(--bestow-font-line-height-normal)", relaxed: "var(--bestow-font-line-height-relaxed)" } }, duration: { fast: "var(--bestow-duration-fast)", normal: "var(--bestow-duration-normal)", slow: "var(--bestow-duration-slow)" }, zIndex: { overlay: "var(--bestow-z-index-overlay)", modal: "var(--bestow-z-index-modal)", dropdown: "var(--bestow-z-index-dropdown)", toast: "var(--bestow-z-index-toast)", tooltip: "var(--bestow-z-index-tooltip)" }, color: { bg: { "default": "var(--bestow-color-bg-default)", subtle: "var(--bestow-color-bg-subtle)", muted: "var(--bestow-color-bg-muted)", inverse: "var(--bestow-color-bg-inverse)", overlay: "var(--bestow-color-bg-overlay)" }, fg: { "default": "var(--bestow-color-fg-default)", muted: "var(--bestow-color-fg-muted)", subtle: "var(--bestow-color-fg-subtle)", inverse: "var(--bestow-color-fg-inverse)" }, border: { "default": "var(--bestow-color-border-default)", strong: "var(--bestow-color-border-strong)", focus: "var(--bestow-color-border-focus)", input: "var(--bestow-color-border-input)", inputHover: "var(--bestow-color-border-input-hover)", control: "var(--bestow-color-border-control)" }, primary: { solid: "var(--bestow-color-primary-solid)", solidHover: "var(--bestow-color-primary-solid-hover)", contrast: "var(--bestow-color-primary-contrast)", subtle: "var(--bestow-color-primary-subtle)", subtleHover: "var(--bestow-color-primary-subtle-hover)", text: "var(--bestow-color-primary-text)" }, neutral: { solid: "var(--bestow-color-neutral-solid)", solidHover: "var(--bestow-color-neutral-solid-hover)", contrast: "var(--bestow-color-neutral-contrast)", subtle: "var(--bestow-color-neutral-subtle)", subtleHover: "var(--bestow-color-neutral-subtle-hover)", text: "var(--bestow-color-neutral-text)" }, danger: { solid: "var(--bestow-color-danger-solid)", solidHover: "var(--bestow-color-danger-solid-hover)", contrast: "var(--bestow-color-danger-contrast)", subtle: "var(--bestow-color-danger-subtle)", subtleHover: "var(--bestow-color-danger-subtle-hover)", text: "var(--bestow-color-danger-text)" }, success: { solid: "var(--bestow-color-success-solid)", solidHover: "var(--bestow-color-success-solid-hover)", contrast: "var(--bestow-color-success-contrast)", subtle: "var(--bestow-color-success-subtle)", subtleHover: "var(--bestow-color-success-subtle-hover)", text: "var(--bestow-color-success-text)" }, warning: { solid: "var(--bestow-color-warning-solid)", solidHover: "var(--bestow-color-warning-solid-hover)", contrast: "var(--bestow-color-warning-contrast)", subtle: "var(--bestow-color-warning-subtle)", subtleHover: "var(--bestow-color-warning-subtle-hover)", text: "var(--bestow-color-warning-text)" }, info: { solid: "var(--bestow-color-info-solid)", solidHover: "var(--bestow-color-info-solid-hover)", contrast: "var(--bestow-color-info-contrast)", subtle: "var(--bestow-color-info-subtle)", subtleHover: "var(--bestow-color-info-subtle-hover)", text: "var(--bestow-color-info-text)" } }, shadow: { sm: "var(--bestow-shadow-sm)", md: "var(--bestow-shadow-md)", lg: "var(--bestow-shadow-lg)" } };
4
5
 
5
6
  // src/theme/createTheme.ts
6
7
  import { assignInlineVars } from "@vanilla-extract/dynamic";
@@ -17,9 +18,9 @@ function deepMerge(target, source) {
17
18
  function createTheme(...inputs) {
18
19
  let light = {};
19
20
  let dark = {};
20
- for (const input of inputs) {
21
- light = deepMerge(deepMerge(light, input.common), input.light);
22
- dark = deepMerge(deepMerge(dark, input.common), input.dark);
21
+ for (const input2 of inputs) {
22
+ light = deepMerge(deepMerge(light, input2.common), input2.light);
23
+ dark = deepMerge(deepMerge(dark, input2.common), input2.dark);
23
24
  }
24
25
  return Object.freeze({ light, dark });
25
26
  }
@@ -207,14 +208,34 @@ var Skeleton = /* @__PURE__ */ forwardRef(function Skeleton2({ variant = "text",
207
208
  // src/styles/visuallyHidden.css.ts
208
209
  var visuallyHidden = "_1kdtbw10";
209
210
 
211
+ // src/components/Input/Input.css.ts
212
+ import { createRuntimeFn as _7a4682 } from "@vanilla-extract/recipes/createRuntimeFn";
213
+ var adornment = "_19p5zvh6";
214
+ var field = "_19p5zvh7";
215
+ var fieldFullWidth = "_19p5zvh8";
216
+ var helperText = /* @__PURE__ */ _7a4682({ defaultClassName: "_19p5zvhb", variantClassNames: { error: { true: "_19p5zvhc" } }, defaultVariants: {}, compoundVariants: [] });
217
+ var input = "_19p5zvh5";
218
+ var label = "_19p5zvh9";
219
+ var requiredMark = "_19p5zvha";
220
+ var root = /* @__PURE__ */ _7a4682({ defaultClassName: "_19p5zvh0", variantClassNames: { size: { sm: "_19p5zvh1", md: "_19p5zvh2", lg: "_19p5zvh3" }, fullWidth: { true: "_19p5zvh4" } }, defaultVariants: { size: "md" }, compoundVariants: [] });
221
+
210
222
  export {
211
223
  cx,
224
+ systemThemeClass,
212
225
  themeClass,
213
226
  vars,
214
227
  createTheme,
215
228
  mergeThemes,
216
229
  themeToStyle,
217
230
  visuallyHidden,
231
+ adornment,
232
+ field,
233
+ fieldFullWidth,
234
+ helperText,
235
+ input,
236
+ label,
237
+ requiredMark,
238
+ root,
218
239
  composeExtraAddress,
219
240
  kakaoPostcodeProvider,
220
241
  toISODate,
@@ -230,4 +251,4 @@ export {
230
251
  focusField,
231
252
  Skeleton
232
253
  };
233
- //# sourceMappingURL=chunk-NKLDAXUR.js.map
254
+ //# sourceMappingURL=chunk-YYLDXZWR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/theme/contract.css.ts","../src/theme/createTheme.ts","../src/components/AddressInput/addressProviders.ts","../src/utils/date.ts","../src/components/DateRangePicker/presets.ts","../src/utils/focusField.ts","../src/components/Skeleton/Skeleton.tsx","../src/utils/cx.ts","../src/components/Skeleton/Skeleton.css.ts","../src/styles/visuallyHidden.css.ts","../src/components/Input/Input.css.ts"],"sourcesContent":["import 'src/theme/contract.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2ZXW-cOBSG7_MrrOSmkSDCfM1Ab3arVVfaVatVI-29AXuCCngETDPpqv99BczAfBwfzHa7ykqu0kQZvz7Yr-0TP5y4lrIlf90QYtsJb1r5bDdblnLbiYnz9vpjGhN_uwca3JiswQYvJtQFW_yY0BBsCWLiOmBLGBMXHsA6Jh78HOrExIfDUTcmPjxuGsYkvHxUzbJ819iVrPilP4emprx26NBUZtceHZqKDeDSoW1fAD4d2sSuKGISRVF00S5k1dqClXnxYjesamJy-0fNW15lrM7In6zOWVLwW4tMn1rEZtttwe3mpWl5aZF3RV59_sDSx_7397JqLTK02bvcIrc_d2ry-Av5VbZPeUo-cnlrkduPspXkkVUN-f3TrUW6p9sNr3OhHGApKxmT2994-65medWQD7LqQu3yvqlfD4s8vu8-tj_xza5gtUU-8KqQFhkV1-Gb_Cu3901MnIdVUPNSoeiWzHlYY5Ju6ai6uV--B-oiEfpVfMAU7iBBFN6gQEfqdxpX9aBnnm-eWrsePOyOhaMUlTzLd2VMAkTT8DJPZJHFJERUg2IFKYq84vbTIGu774NLuLCSdckGs3BhzQu2593aPazOpdmuZm0uK1uwpnum65QNLDg-zHWUkqaQz132uRR8tfMq43tbfuF1wV5iQr0LD46KUmb9hDwKt2e13GbyueokLixp5TCTyyWd2mXR5tuY0MsFTWUhazvZ2BkXbFe0MbkT_T9Y1eyStuCdaC0iwWBRuWs73-8EFZ4IYE1efeF100VyqRu4Eawazas3CXvjWOTw9eAH90APcToNZVwxjdCPAidYwZpxqmEY8lUIi6ZpqF2Tdcbrk4FlnLscindQNm0tq01M7liWBEmmFgqZ7pqY3HlJKAQUcFvnJatf7EYWeTddNwh8nswJ7afO9pjc0cx3szUiT2XV1v3OU09_DH20k3PhayjHUWQJDwVH9C3ft9hoK75ra1aMLni-x3zoFJwJx-cr99FRruPCGHo8P6qzca4cR8EjnnIs8sEF5eQyVm26zXUwIUvd0IX2zKlufHoS0ZSmarWOBcfAowNcuMKdE45DEN2pQeSH-StH2uzSlDfNaAAN1o4HHa4z4XQWwjDwfESuY8EYevTAEZnAol6ehVSkHMpXR_3xLKgm98zqKq82owsiiLgDZYQz4fT8aLVyoF1zlJ-4oDw3Y-jRBSESMC2dK0-2gvBSyIWj_uBC5PqOA2WOvBJyPilOqvmM2Gt1tsAQdDYXnsjmE2EvVmfB5oll3Y_upkvodk_c7f7qD6oT3kOduruv0zFNTyjXvdZgr-5K7Aw9PKgbde_f3ny7eWg_s02bOAZBDYIaBDUIahDUIKhBUIOgBkENghoENQhqENQg6H-DoNQgqEFQg6AGQQ2CGgQdEImGdE2hv8mnCIqB4xHwlNfhMwTFYFaJoOE8girjniCokgZPEVRJgkKPpC8RVMm9_xRBQydywJm-RgTtVzKILEIptYjrh_2dJISWE2ZSMICLBjheSb3EF5Cfl5A6y3vnPs3ipM7F_BJS-2m6QWCR6dv1nQ_DVjgC9bEIB6eUM3ptIDvM0YssEq6H_6rNBIIt1B3eSuegK1IWMMif1wi6_SQ93yI0Wlkk8tUeweAL9YdNugDhdcgFg9b7O0FYJIlwIZe-B4SHreAHFqHBuksuaptgMgYDwD5doLJIM8-HNslrQeUFORtg5wUJ-xSmgWytBdMBwtLOoZ8yuVoYcMORB97GI9M-sJrJw1Mkdw2SGyQ3SG6Q3CC5QXJTFTZVYVMVNlVhUxU2VWFTFTZV4R9cFf6pu2Uy8mZbc8Hr5riV0yde8phkrP5839PpGaoqYRXBVQRYMWTFoBXDVgxcMXRF4RXFVxRgUYRFIRbFWBxkcZSdh9n_Ac7-cKDVQVotqJ3FWi2w1UFbHbjVw1stwNVEXD3I1cVcHdBdgLoLYHcR7moArxbyakCvDvbOg68W-s7Drw7-4gA81aRRBJ4uOBgETxdyHIMnoF4EwofaNI7CSGywPo3i8ESlOBBj9qir1AugeA6Lp0r1AjBejMbL4HgWj7HqhyYxYyWQOYie6iCzGD0RqSZIT8irg9LI9llUvdYEbLR-PQfdyMyU2L0UvBeh9xx8I5VsPRxHatkzgD5Vsxcg-mJIX4bps6COVLU10R2pa8_B_FTZXoDzmkA_VbeXIf0s1GMVbk3Ox2rcc-g_Vbl14X8Z_i94AYC_AliU7xfWu9EXBWCmX1DzVr0r-Deq3qo3Ct9f9ybk2823vwE1-y5GkUsAAA';\nexport var systemThemeClass = 'tkagtb2';\nexport var themeClass = {light:'tkagtb0',dark:'tkagtb1'};\nexport var vars = {space:{'0':'var(--bestow-space-0)','1':'var(--bestow-space-1)','2':'var(--bestow-space-2)','3':'var(--bestow-space-3)','4':'var(--bestow-space-4)','5':'var(--bestow-space-5)','6':'var(--bestow-space-6)','8':'var(--bestow-space-8)','10':'var(--bestow-space-10)','12':'var(--bestow-space-12)','16':'var(--bestow-space-16)'},radius:{none:'var(--bestow-radius-none)',sm:'var(--bestow-radius-sm)',md:'var(--bestow-radius-md)',lg:'var(--bestow-radius-lg)',xl:'var(--bestow-radius-xl)',full:'var(--bestow-radius-full)'},font:{family:{sans:'var(--bestow-font-family-sans)',mono:'var(--bestow-font-family-mono)'},size:{xs:'var(--bestow-font-size-xs)',sm:'var(--bestow-font-size-sm)',md:'var(--bestow-font-size-md)',lg:'var(--bestow-font-size-lg)',xl:'var(--bestow-font-size-xl)','2xl':'var(--bestow-font-size-2xl)','3xl':'var(--bestow-font-size-3xl)','4xl':'var(--bestow-font-size-4xl)'},weight:{regular:'var(--bestow-font-weight-regular)',medium:'var(--bestow-font-weight-medium)',semibold:'var(--bestow-font-weight-semibold)',bold:'var(--bestow-font-weight-bold)'},lineHeight:{tight:'var(--bestow-font-line-height-tight)',normal:'var(--bestow-font-line-height-normal)',relaxed:'var(--bestow-font-line-height-relaxed)'}},duration:{fast:'var(--bestow-duration-fast)',normal:'var(--bestow-duration-normal)',slow:'var(--bestow-duration-slow)'},zIndex:{overlay:'var(--bestow-z-index-overlay)',modal:'var(--bestow-z-index-modal)',dropdown:'var(--bestow-z-index-dropdown)',toast:'var(--bestow-z-index-toast)',tooltip:'var(--bestow-z-index-tooltip)'},color:{bg:{'default':'var(--bestow-color-bg-default)',subtle:'var(--bestow-color-bg-subtle)',muted:'var(--bestow-color-bg-muted)',inverse:'var(--bestow-color-bg-inverse)',overlay:'var(--bestow-color-bg-overlay)'},fg:{'default':'var(--bestow-color-fg-default)',muted:'var(--bestow-color-fg-muted)',subtle:'var(--bestow-color-fg-subtle)',inverse:'var(--bestow-color-fg-inverse)'},border:{'default':'var(--bestow-color-border-default)',strong:'var(--bestow-color-border-strong)',focus:'var(--bestow-color-border-focus)',input:'var(--bestow-color-border-input)',inputHover:'var(--bestow-color-border-input-hover)',control:'var(--bestow-color-border-control)'},primary:{solid:'var(--bestow-color-primary-solid)',solidHover:'var(--bestow-color-primary-solid-hover)',contrast:'var(--bestow-color-primary-contrast)',subtle:'var(--bestow-color-primary-subtle)',subtleHover:'var(--bestow-color-primary-subtle-hover)',text:'var(--bestow-color-primary-text)'},neutral:{solid:'var(--bestow-color-neutral-solid)',solidHover:'var(--bestow-color-neutral-solid-hover)',contrast:'var(--bestow-color-neutral-contrast)',subtle:'var(--bestow-color-neutral-subtle)',subtleHover:'var(--bestow-color-neutral-subtle-hover)',text:'var(--bestow-color-neutral-text)'},danger:{solid:'var(--bestow-color-danger-solid)',solidHover:'var(--bestow-color-danger-solid-hover)',contrast:'var(--bestow-color-danger-contrast)',subtle:'var(--bestow-color-danger-subtle)',subtleHover:'var(--bestow-color-danger-subtle-hover)',text:'var(--bestow-color-danger-text)'},success:{solid:'var(--bestow-color-success-solid)',solidHover:'var(--bestow-color-success-solid-hover)',contrast:'var(--bestow-color-success-contrast)',subtle:'var(--bestow-color-success-subtle)',subtleHover:'var(--bestow-color-success-subtle-hover)',text:'var(--bestow-color-success-text)'},warning:{solid:'var(--bestow-color-warning-solid)',solidHover:'var(--bestow-color-warning-solid-hover)',contrast:'var(--bestow-color-warning-contrast)',subtle:'var(--bestow-color-warning-subtle)',subtleHover:'var(--bestow-color-warning-subtle-hover)',text:'var(--bestow-color-warning-text)'},info:{solid:'var(--bestow-color-info-solid)',solidHover:'var(--bestow-color-info-solid-hover)',contrast:'var(--bestow-color-info-contrast)',subtle:'var(--bestow-color-info-subtle)',subtleHover:'var(--bestow-color-info-subtle-hover)',text:'var(--bestow-color-info-text)'}},shadow:{sm:'var(--bestow-shadow-sm)',md:'var(--bestow-shadow-md)',lg:'var(--bestow-shadow-lg)'}};","import { assignInlineVars } from '@vanilla-extract/dynamic';\nimport { vars, type ThemeName, type ThemeTokens } from './contract.css';\n\nexport type DeepPartial<T> = { [K in keyof T]?: T[K] extends string ? string : DeepPartial<T[K]> };\n\nexport type ThemeOverrides = DeepPartial<ThemeTokens>;\n\n/** createTheme 에 넘기는 입력. common 은 라이트·다크 공통, light/dark 는 모드별 값 (common 보다 우선). */\nexport interface ThemeInput {\n common?: ThemeOverrides;\n light?: ThemeOverrides;\n dark?: ThemeOverrides;\n}\n\n/** createTheme 의 결과. ThemeProvider 의 overrides 로 넘긴다. */\nexport interface BestowTheme {\n readonly light: ThemeOverrides;\n readonly dark: ThemeOverrides;\n}\n\ntype Tree = { [key: string]: string | Tree };\n\nfunction deepMerge(target: Tree, source: Tree | undefined): Tree {\n if (!source) return target;\n const out: Tree = { ...target };\n for (const [key, value] of Object.entries(source)) {\n if (value === undefined) continue;\n const prev = out[key];\n out[key] = typeof value === 'object' && typeof prev === 'object' ? deepMerge(prev, value) : value;\n }\n return out;\n}\n\n/**\n * 브랜드 테마를 만든다. 여러 입력을 넘기면 순서대로 깊게 병합한다 (뒤가 우선).\n *\n * @example\n * const brand = createTheme(\n * createIntentColors('primary', '#7c3aed'),\n * { common: { radius: { md: '6px' }, font: { family: { sans: 'Inter, sans-serif' } } } },\n * );\n * <ThemeProvider theme=\"dark\" overrides={brand}>…</ThemeProvider>\n */\nexport function createTheme(...inputs: ThemeInput[]): BestowTheme {\n let light: Tree = {};\n let dark: Tree = {};\n for (const input of inputs) {\n light = deepMerge(deepMerge(light, input.common as Tree), input.light as Tree);\n dark = deepMerge(deepMerge(dark, input.common as Tree), input.dark as Tree);\n }\n return Object.freeze({ light, dark }) as BestowTheme;\n}\n\n/** 두 테마를 병합한다 (b 가 우선). 중첩 ThemeProvider 가 바깥 테마를 이어받을 때 쓴다. */\nexport function mergeThemes(a: BestowTheme | undefined, b: BestowTheme | undefined): BestowTheme | undefined {\n if (!a) return b;\n if (!b) return a;\n return createTheme(a, b);\n}\n\n/** 부분 토큰을 { 'var(--bestow-…)': 값 } 으로 펼친다. 알 수 없는 키는 무시한다. */\nfunction flatten(partial: Tree, contract: Tree, out: Record<string, string>) {\n for (const [key, value] of Object.entries(partial)) {\n const target = contract[key];\n if (target === undefined) continue;\n if (typeof target === 'string' && typeof value === 'string') out[target] = value;\n else if (typeof target === 'object' && typeof value === 'object') flatten(value, target, out);\n }\n return out;\n}\n\n/** 현재 모드의 오버라이드를 인라인 style 로 바꾼다. */\nexport function themeToStyle(theme: BestowTheme | undefined, mode: ThemeName): Record<string, string> | undefined {\n if (!theme) return undefined;\n const map = flatten(theme[mode] as Tree, vars as unknown as Tree, {});\n return Object.keys(map).length ? assignInlineVars(map) : undefined;\n}\n","import { composeExtraAddress } from '@bestow-ui/korean-utils';\n\n/** 주소 검색 결과 */\nexport interface AddressSearchResult {\n /** 우편번호 (5자리 국가기초구역번호) */\n zonecode: string;\n /** 기본 주소 (도로명 또는 지번) */\n address: string;\n /** 참고 항목 (도로명 주소일 때 법정동·건물명, 예: \" (역삼동, 래미안아파트)\") */\n extraAddress?: string;\n}\n\n/**\n * 주소 검색 공급자. container 안에 검색 화면을 그리고, 사용자가 고르면 onSelect 를 부른다.\n * 정리 함수를 돌려주면 검색 창이 닫힐 때 부른다. 다른 주소 서비스(행정안전부 도로명주소 API 등)로 바꿔 끼울 수 있다.\n */\nexport type AddressProvider = (\n container: HTMLElement,\n onSelect: (result: AddressSearchResult) => void,\n) => void | (() => void) | Promise<void | (() => void)>;\n\n// 참고 항목 함수는 @bestow-ui/korean-utils 로 옮겼다(1.6) — 예전 import 경로도 되게 다시 export\nexport { composeExtraAddress };\n\n// 카카오 우편번호 서비스 (https://postcode.map.kakao.com/guide)\nconst KAKAO_POSTCODE_SRC = 'https://t1.kakaocdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js';\n\ninterface KakaoPostcodeData {\n zonecode: string;\n userSelectedType: 'R' | 'J';\n roadAddress: string;\n jibunAddress: string;\n autoJibunAddress?: string;\n bname: string;\n buildingName: string;\n apartment: 'Y' | 'N';\n}\n\ntype PostcodeConstructor = new (options: {\n oncomplete: (data: KakaoPostcodeData) => void;\n width?: string | number;\n height?: string | number;\n}) => { embed: (element: HTMLElement) => void };\n\ninterface PostcodeWindow {\n kakao?: { Postcode?: PostcodeConstructor };\n daum?: { Postcode?: PostcodeConstructor };\n}\n\nlet loading: Promise<PostcodeConstructor> | null = null;\n\nfunction loadKakaoPostcode(): Promise<PostcodeConstructor> {\n const w = window as unknown as PostcodeWindow;\n const existing = w.kakao?.Postcode ?? w.daum?.Postcode;\n if (existing) return Promise.resolve(existing);\n loading ??= new Promise<PostcodeConstructor>((resolve, reject) => {\n const script = document.createElement('script');\n script.src = KAKAO_POSTCODE_SRC;\n script.async = true;\n script.onload = () => {\n const ctor = w.kakao?.Postcode ?? w.daum?.Postcode;\n if (ctor) resolve(ctor);\n else reject(new Error('우편번호 서비스를 찾지 못했어요'));\n };\n script.onerror = () => {\n loading = null; // 다음에 다시 시도할 수 있게\n reject(new Error('우편번호 서비스를 불러오지 못했어요'));\n };\n document.head.appendChild(script);\n });\n return loading;\n}\n\n/**\n * 기본 공급자: 카카오(다음) 우편번호 서비스. 처음 쓸 때 스크립트를 불러오므로 코어 번들 크기에 영향이 없다.\n * 사용 조건은 서비스 가이드를 따른다.\n */\nexport const kakaoPostcodeProvider: AddressProvider = async (container, onSelect) => {\n const Postcode = await loadKakaoPostcode();\n new Postcode({\n width: '100%',\n height: '100%',\n oncomplete: (data) => {\n const address =\n data.userSelectedType === 'R' ? data.roadAddress : data.jibunAddress || data.autoJibunAddress || '';\n onSelect({ zonecode: data.zonecode, address, extraAddress: composeExtraAddress(data) });\n },\n }).embed(container);\n};\n","// 날짜 계산 유틸. 값은 시간대 문제가 없도록 'YYYY-MM-DD' 문자열로 다루고, 계산할 때만 로컬 Date 로 바꾼다.\n\nconst pad = (n: number) => String(n).padStart(2, '0');\n\n/** Date → 'YYYY-MM-DD' (로컬 기준) */\nexport function toISODate(date: Date): string {\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\n}\n\n/** 'YYYY-MM-DD' → Date (로컬 자정). 형식이 틀리거나 없는 날짜(2월 30일 등)면 null */\nexport function parseISODate(value: string | null | undefined): Date | null {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value ?? '');\n if (!m) return null;\n const [y, mo, d] = [Number(m[1]), Number(m[2]), Number(m[3])];\n const date = new Date(y, mo - 1, d);\n return date.getFullYear() === y && date.getMonth() === mo - 1 && date.getDate() === d ? date : null;\n}\n\nexport function addDays(date: Date, days: number): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days);\n}\n\n/** 달을 옮긴다. 옮긴 달에 같은 날이 없으면 그 달의 마지막 날 (1월 31일 + 1달 → 2월 28/29일) */\nexport function addMonths(date: Date, months: number): Date {\n const target = new Date(date.getFullYear(), date.getMonth() + months, 1);\n const lastDay = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();\n return new Date(target.getFullYear(), target.getMonth(), Math.min(date.getDate(), lastDay));\n}\n\nexport function isSameDay(a: Date | null, b: Date | null): boolean {\n return !!a && !!b && toISODate(a) === toISODate(b);\n}\n\nexport function isSameMonth(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();\n}\n\n/** 날짜만 비교 (-1, 0, 1) */\nexport function compareDays(a: Date, b: Date): number {\n const x = toISODate(a);\n const y = toISODate(b);\n return x < y ? -1 : x > y ? 1 : 0;\n}\n\n/** 일요일부터 시작하는 달력의 주 목록 (앞뒤 달 날짜 포함, 항상 6주) */\nexport function getCalendarWeeks(year: number, month: number): Date[][] {\n const first = new Date(year, month, 1);\n const start = addDays(first, -first.getDay());\n return Array.from({ length: 6 }, (_, week) => Array.from({ length: 7 }, (_, day) => addDays(start, week * 7 + day)));\n}\n","import { addDays, addMonths, parseISODate, toISODate } from '../../utils/date';\n\nexport interface DateRange {\n /** 시작일 'YYYY-MM-DD' (없으면 '') */\n start: string;\n /** 종료일 'YYYY-MM-DD' (없으면 '') */\n end: string;\n}\n\n/** 빠른 선택 — 오늘에서 거슬러 올라간 기간. `days: 0` 은 오늘 하루 */\nexport interface DateRangePreset {\n label: string;\n days?: number;\n months?: number;\n}\n\n/** 조회 화면에서 흔한 빠른 선택(오늘·1주일·1개월·3개월). 그대로 넘기거나 골라 쓴다 */\nexport const dateRangePresets: DateRangePreset[] = [\n { label: '오늘', days: 0 },\n { label: '1주일', days: 7 },\n { label: '1개월', months: 1 },\n { label: '3개월', months: 3 },\n];\n\n/** 빠른 선택이 가리키는 기간 (오늘 'YYYY-MM-DD' 기준) */\nexport function presetRange(preset: DateRangePreset, today: string): DateRange {\n const end = parseISODate(today);\n if (!end) return { start: '', end: '' };\n const start = preset.months !== undefined ? addMonths(end, -preset.months) : addDays(end, -(preset.days ?? 0));\n return { start: toISODate(start), end: today };\n}\n","const FOCUSABLE =\n 'input:not([type=\"hidden\"]):not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), a[href], [tabindex]:not([tabindex=\"-1\"])';\n\n/** 화면에 보이고 보조기술에서 숨기지 않은, Tab 으로 갈 수 있는 요소 */\nfunction isUsable(element: Element): element is HTMLElement {\n return (\n element instanceof HTMLElement &&\n element.matches(FOCUSABLE) &&\n element.tabIndex >= 0 &&\n !element.closest('[aria-hidden=\"true\"], [inert], [hidden]')\n );\n}\n\nfunction firstUsableIn(container: Element | null): HTMLElement | null {\n if (!container) return null;\n // 라디오·세그먼트처럼 하나를 고르는 묶음은 지금 선택된 항목으로 간다\n const checked = Array.from(container.querySelectorAll(':checked, [aria-checked=\"true\"]')).find(isUsable);\n return checked ?? Array.from(container.querySelectorAll(FOCUSABLE)).find(isUsable) ?? null;\n}\n\n/**\n * 폼 칸으로 포커스를 옮긴다(오류 요약의 링크, 제출 실패 뒤 등). `target` 은 칸의 id 나 요소.\n * id 가 포커스할 수 없는 요소를 가리켜도 알맞은 곳을 찾는다 — RadioGroup·AgreementGroup 처럼 묶음이면 선택된(없으면 첫) 항목,\n * FileUpload 처럼 숨긴 input 이면 같은 묶음(role=\"group\")의 버튼. 옮겼으면 true.\n */\nexport function focusField(target: string | HTMLElement | null | undefined): boolean {\n const element = typeof target === 'string' ? document.getElementById(target) : (target ?? null);\n if (!element) return false;\n const destination =\n (isUsable(element) ? element : null) ??\n firstUsableIn(element) ??\n firstUsableIn(element.closest('[role=\"group\"], [role=\"radiogroup\"], fieldset'));\n if (!destination) return false;\n destination.focus();\n return document.activeElement === destination;\n}\n","import { assignInlineVars } from '@vanilla-extract/dynamic';\nimport { forwardRef, type HTMLAttributes } from 'react';\nimport { cx } from '../../utils/cx';\nimport * as styles from './Skeleton.css';\n\nexport interface SkeletonProps extends HTMLAttributes<HTMLSpanElement> {\n /** 모양. text 는 글자 높이(1em), circle 은 width 를 지름으로 쓴다 */\n variant?: 'text' | 'rect' | 'circle';\n /** 너비. 숫자는 px (기본: text·rect 100%, circle 40px) */\n width?: number | string;\n /** 높이. 숫자는 px (기본: text 1em, rect 100px, circle 은 width 와 같음) */\n height?: number | string;\n /** text 에서 여러 줄을 그린다. 마지막 줄은 60% 너비 */\n lines?: number;\n}\n\nconst toCss = (value: number | string) => (typeof value === 'number' ? `${value}px` : value);\n\n/**\n * 콘텐츠를 불러오는 동안 자리를 표시한다. 장식용이라 스크린리더에서 숨긴다 —\n * 로딩 중인 영역(감싸는 요소)에 `aria-busy=\"true\"` 를 붙여 상태를 알린다.\n */\nexport const Skeleton = /* @__PURE__ */ forwardRef<HTMLSpanElement, SkeletonProps>(function Skeleton(\n { variant = 'text', width, height, lines = 1, className, style, ...rest },\n ref,\n) {\n const w = toCss(width ?? (variant === 'circle' ? 40 : '100%'));\n const h = toCss(height ?? (variant === 'circle' ? w : variant === 'rect' ? 100 : '1em'));\n\n if (variant === 'text' && lines > 1) {\n return (\n <span\n ref={ref}\n aria-hidden\n className={cx(styles.lines, className)}\n style={{ ...assignInlineVars({ [styles.width]: w }), ...style }}\n {...rest}\n >\n {Array.from({ length: lines }, (_, i) => (\n <span\n key={i}\n className={styles.skeleton({ variant })}\n style={assignInlineVars({ [styles.width]: i === lines - 1 ? '60%' : '100%', [styles.height]: h })}\n />\n ))}\n </span>\n );\n }\n\n return (\n <span\n ref={ref}\n aria-hidden\n className={cx(styles.skeleton({ variant }), className)}\n style={{ ...assignInlineVars({ [styles.width]: w, [styles.height]: h }), ...style }}\n {...rest}\n />\n );\n});\n","export function cx(...classNames: Array<string | false | null | undefined>): string {\n return classNames.filter(Boolean).join(' ');\n}\n","import 'src/styles/animations.css.ts.vanilla.css?source=#H4sIAAAAAAAAA51T3WqDMBS-9ynOjaBsGYlV27qbPsbuRhqjDdVEYjZahu8-plspGjPtXeB8-f4453Dm10LTmrfwTkrdHLcYw5cHUGhV9w8A1VAmzDUD_OoBdB6AUeMRGUadd5gSkllCMk-IHYSR2yGA0VS2hdJ1NjwraniAEuw_A4p3fggtoxUP8Ms-Df_J5CZL8I2MhA7HG3cFq0VmG3sku9VxvKLjB9tc0FsydmFL9xYwWrGAYOzDE0RxcwmnPuwfsUs8dYhrZX56xTkvnVq_uE16h7SKbcdiR8rOpVYfMkeNaoURSmbQZ5yeoRWL7sFWzd1Y88RFeTK2Q_-bfFIdIKRpLi6IMqZ0LpRETEnDpUEDyhVzPye5gthiy5WSLtuhvq6lexMlN2z3DVsBqiZDBQAA';\nimport 'src/theme/contract.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2ZXW-cOBSG7_MrrOSmkSDCfM1Ab3arVVfaVatVI-29AXuCCngETDPpqv99BczAfBwfzHa7ykqu0kQZvz7Yr-0TP5y4lrIlf90QYtsJb1r5bDdblnLbiYnz9vpjGhN_uwca3JiswQYvJtQFW_yY0BBsCWLiOmBLGBMXHsA6Jh78HOrExIfDUTcmPjxuGsYkvHxUzbJ819iVrPilP4emprx26NBUZtceHZqKDeDSoW1fAD4d2sSuKGISRVF00S5k1dqClXnxYjesamJy-0fNW15lrM7In6zOWVLwW4tMn1rEZtttwe3mpWl5aZF3RV59_sDSx_7397JqLTK02bvcIrc_d2ry-Av5VbZPeUo-cnlrkduPspXkkVUN-f3TrUW6p9sNr3OhHGApKxmT2994-65medWQD7LqQu3yvqlfD4s8vu8-tj_xza5gtUU-8KqQFhkV1-Gb_Cu3901MnIdVUPNSoeiWzHlYY5Ju6ai6uV--B-oiEfpVfMAU7iBBFN6gQEfqdxpX9aBnnm-eWrsePOyOhaMUlTzLd2VMAkTT8DJPZJHFJERUg2IFKYq84vbTIGu774NLuLCSdckGs3BhzQu2593aPazOpdmuZm0uK1uwpnum65QNLDg-zHWUkqaQz132uRR8tfMq43tbfuF1wV5iQr0LD46KUmb9hDwKt2e13GbyueokLixp5TCTyyWd2mXR5tuY0MsFTWUhazvZ2BkXbFe0MbkT_T9Y1eyStuCdaC0iwWBRuWs73-8EFZ4IYE1efeF100VyqRu4Eawazas3CXvjWOTw9eAH90APcToNZVwxjdCPAidYwZpxqmEY8lUIi6ZpqF2Tdcbrk4FlnLscindQNm0tq01M7liWBEmmFgqZ7pqY3HlJKAQUcFvnJatf7EYWeTddNwh8nswJ7afO9pjc0cx3szUiT2XV1v3OU09_DH20k3PhayjHUWQJDwVH9C3ft9hoK75ra1aMLni-x3zoFJwJx-cr99FRruPCGHo8P6qzca4cR8EjnnIs8sEF5eQyVm26zXUwIUvd0IX2zKlufHoS0ZSmarWOBcfAowNcuMKdE45DEN2pQeSH-StH2uzSlDfNaAAN1o4HHa4z4XQWwjDwfESuY8EYevTAEZnAol6ehVSkHMpXR_3xLKgm98zqKq82owsiiLgDZYQz4fT8aLVyoF1zlJ-4oDw3Y-jRBSESMC2dK0-2gvBSyIWj_uBC5PqOA2WOvBJyPilOqvmM2Gt1tsAQdDYXnsjmE2EvVmfB5oll3Y_upkvodk_c7f7qD6oT3kOduruv0zFNTyjXvdZgr-5K7Aw9PKgbde_f3ny7eWg_s02bOAZBDYIaBDUIahDUIKhBUIOgBkENghoENQhqENQg6H-DoNQgqEFQg6AGQQ2CGgQdEImGdE2hv8mnCIqB4xHwlNfhMwTFYFaJoOE8girjniCokgZPEVRJgkKPpC8RVMm9_xRBQydywJm-RgTtVzKILEIptYjrh_2dJISWE2ZSMICLBjheSb3EF5Cfl5A6y3vnPs3ipM7F_BJS-2m6QWCR6dv1nQ_DVjgC9bEIB6eUM3ptIDvM0YssEq6H_6rNBIIt1B3eSuegK1IWMMif1wi6_SQ93yI0Wlkk8tUeweAL9YdNugDhdcgFg9b7O0FYJIlwIZe-B4SHreAHFqHBuksuaptgMgYDwD5doLJIM8-HNslrQeUFORtg5wUJ-xSmgWytBdMBwtLOoZ8yuVoYcMORB97GI9M-sJrJw1Mkdw2SGyQ3SG6Q3CC5QXJTFTZVYVMVNlVhUxU2VWFTFTZV4R9cFf6pu2Uy8mZbc8Hr5riV0yde8phkrP5839PpGaoqYRXBVQRYMWTFoBXDVgxcMXRF4RXFVxRgUYRFIRbFWBxkcZSdh9n_Ac7-cKDVQVotqJ3FWi2w1UFbHbjVw1stwNVEXD3I1cVcHdBdgLoLYHcR7moArxbyakCvDvbOg68W-s7Drw7-4gA81aRRBJ4uOBgETxdyHIMnoF4EwofaNI7CSGywPo3i8ESlOBBj9qir1AugeA6Lp0r1AjBejMbL4HgWj7HqhyYxYyWQOYie6iCzGD0RqSZIT8irg9LI9llUvdYEbLR-PQfdyMyU2L0UvBeh9xx8I5VsPRxHatkzgD5Vsxcg-mJIX4bps6COVLU10R2pa8_B_FTZXoDzmkA_VbeXIf0s1GMVbk3Ox2rcc-g_Vbl14X8Z_i94AYC_AliU7xfWu9EXBWCmX1DzVr0r-Deq3qo3Ct9f9ybk2823vwE1-y5GkUsAAA';\nimport 'src/components/Skeleton/Skeleton.css.ts.vanilla.css?source=Ll8xczhkYXRkMiB7CiAgZGlzcGxheTogYmxvY2s7CiAgZmxleC1zaHJpbms6IDA7CiAgd2lkdGg6IHZhcigtLV8xczhkYXRkMCk7CiAgaGVpZ2h0OiB2YXIoLS1fMXM4ZGF0ZDEpOwogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJlc3Rvdy1jb2xvci1uZXV0cmFsLXN1YnRsZSk7CiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB0cmFuc3BhcmVudCAyNSUsIHZhcigtLWJlc3Rvdy1jb2xvci1uZXV0cmFsLXN1YnRsZS1ob3ZlcikgNTAlLCB0cmFuc3BhcmVudCA3NSUpOwogIGJhY2tncm91bmQtc2l6ZTogMjAwJSAxMDAlOwogIGFuaW1hdGlvbjogXzFncnBiNzA3IDEuNnMgZWFzZS1pbi1vdXQgaW5maW5pdGU7Cn0KLl8xczhkYXRkMyB7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tYmVzdG93LXJhZGl1cy1zbSk7Cn0KLl8xczhkYXRkNCB7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tYmVzdG93LXJhZGl1cy1tZCk7Cn0KLl8xczhkYXRkNSB7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tYmVzdG93LXJhZGl1cy1mdWxsKTsKfQouXzFzOGRhdGQ2IHsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgZ2FwOiB2YXIoLS1iZXN0b3ctc3BhY2UtMik7CiAgd2lkdGg6IHZhcigtLV8xczhkYXRkMCk7Cn0KQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsKICAuXzFzOGRhdGQyIHsKICAgIGFuaW1hdGlvbjogbm9uZTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7CiAgfQp9';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var height = 'var(--_1s8datd1)';\nexport var lines = '_1s8datd6';\nexport var skeleton = /* @__PURE__ */ _7a468({defaultClassName:'_1s8datd2',variantClassNames:{variant:{text:'_1s8datd3',rect:'_1s8datd4',circle:'_1s8datd5'}},defaultVariants:{variant:'text'},compoundVariants:[]});\nexport var width = 'var(--_1s8datd0)';","import 'src/styles/visuallyHidden.css.ts.vanilla.css?source=Ll8xa2R0YncxMCB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHdpZHRoOiAxcHg7CiAgaGVpZ2h0OiAxcHg7CiAgcGFkZGluZzogMDsKICBtYXJnaW46IC0xcHg7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBjbGlwOiByZWN0KDAsIDAsIDAsIDApOwogIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgYm9yZGVyOiAwOwp9';\nexport var visuallyHidden = '_1kdtbw10';","import 'src/theme/contract.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2ZXW-cOBSG7_MrrOSmkSDCfM1Ab3arVVfaVatVI-29AXuCCngETDPpqv99BczAfBwfzHa7ykqu0kQZvz7Yr-0TP5y4lrIlf90QYtsJb1r5bDdblnLbiYnz9vpjGhN_uwca3JiswQYvJtQFW_yY0BBsCWLiOmBLGBMXHsA6Jh78HOrExIfDUTcmPjxuGsYkvHxUzbJ819iVrPilP4emprx26NBUZtceHZqKDeDSoW1fAD4d2sSuKGISRVF00S5k1dqClXnxYjesamJy-0fNW15lrM7In6zOWVLwW4tMn1rEZtttwe3mpWl5aZF3RV59_sDSx_7397JqLTK02bvcIrc_d2ry-Av5VbZPeUo-cnlrkduPspXkkVUN-f3TrUW6p9sNr3OhHGApKxmT2994-65medWQD7LqQu3yvqlfD4s8vu8-tj_xza5gtUU-8KqQFhkV1-Gb_Cu3901MnIdVUPNSoeiWzHlYY5Ju6ai6uV--B-oiEfpVfMAU7iBBFN6gQEfqdxpX9aBnnm-eWrsePOyOhaMUlTzLd2VMAkTT8DJPZJHFJERUg2IFKYq84vbTIGu774NLuLCSdckGs3BhzQu2593aPazOpdmuZm0uK1uwpnum65QNLDg-zHWUkqaQz132uRR8tfMq43tbfuF1wV5iQr0LD46KUmb9hDwKt2e13GbyueokLixp5TCTyyWd2mXR5tuY0MsFTWUhazvZ2BkXbFe0MbkT_T9Y1eyStuCdaC0iwWBRuWs73-8EFZ4IYE1efeF100VyqRu4Eawazas3CXvjWOTw9eAH90APcToNZVwxjdCPAidYwZpxqmEY8lUIi6ZpqF2Tdcbrk4FlnLscindQNm0tq01M7liWBEmmFgqZ7pqY3HlJKAQUcFvnJatf7EYWeTddNwh8nswJ7afO9pjc0cx3szUiT2XV1v3OU09_DH20k3PhayjHUWQJDwVH9C3ft9hoK75ra1aMLni-x3zoFJwJx-cr99FRruPCGHo8P6qzca4cR8EjnnIs8sEF5eQyVm26zXUwIUvd0IX2zKlufHoS0ZSmarWOBcfAowNcuMKdE45DEN2pQeSH-StH2uzSlDfNaAAN1o4HHa4z4XQWwjDwfESuY8EYevTAEZnAol6ehVSkHMpXR_3xLKgm98zqKq82owsiiLgDZYQz4fT8aLVyoF1zlJ-4oDw3Y-jRBSESMC2dK0-2gvBSyIWj_uBC5PqOA2WOvBJyPilOqvmM2Gt1tsAQdDYXnsjmE2EvVmfB5oll3Y_upkvodk_c7f7qD6oT3kOduruv0zFNTyjXvdZgr-5K7Aw9PKgbde_f3ny7eWg_s02bOAZBDYIaBDUIahDUIKhBUIOgBkENghoENQhqENQg6H-DoNQgqEFQg6AGQQ2CGgQdEImGdE2hv8mnCIqB4xHwlNfhMwTFYFaJoOE8girjniCokgZPEVRJgkKPpC8RVMm9_xRBQydywJm-RgTtVzKILEIptYjrh_2dJISWE2ZSMICLBjheSb3EF5Cfl5A6y3vnPs3ipM7F_BJS-2m6QWCR6dv1nQ_DVjgC9bEIB6eUM3ptIDvM0YssEq6H_6rNBIIt1B3eSuegK1IWMMif1wi6_SQ93yI0Wlkk8tUeweAL9YdNugDhdcgFg9b7O0FYJIlwIZe-B4SHreAHFqHBuksuaptgMgYDwD5doLJIM8-HNslrQeUFORtg5wUJ-xSmgWytBdMBwtLOoZ8yuVoYcMORB97GI9M-sJrJw1Mkdw2SGyQ3SG6Q3CC5QXJTFTZVYVMVNlVhUxU2VWFTFTZV4R9cFf6pu2Uy8mZbc8Hr5riV0yde8phkrP5839PpGaoqYRXBVQRYMWTFoBXDVgxcMXRF4RXFVxRgUYRFIRbFWBxkcZSdh9n_Ac7-cKDVQVotqJ3FWi2w1UFbHbjVw1stwNVEXD3I1cVcHdBdgLoLYHcR7moArxbyakCvDvbOg68W-s7Drw7-4gA81aRRBJ4uOBgETxdyHIMnoF4EwofaNI7CSGywPo3i8ESlOBBj9qir1AugeA6Lp0r1AjBejMbL4HgWj7HqhyYxYyWQOYie6iCzGD0RqSZIT8irg9LI9llUvdYEbLR-PQfdyMyU2L0UvBeh9xx8I5VsPRxHatkzgD5Vsxcg-mJIX4bps6COVLU10R2pa8_B_FTZXoDzmkA_VbeXIf0s1GMVbk3Ox2rcc-g_Vbl14X8Z_i94AYC_AliU7xfWu9EXBWCmX1DzVr0r-Deq3qo3Ct9f9ybk2823vwE1-y5GkUsAAA';\nimport 'src/components/Input/Input.css.ts.vanilla.css?source=#H4sIAAAAAAAAA7VV227bMAx9z1foZUADVIXTe9VPGYqBsRSbqCwZEp2kHfbvgyQ7s7LUcQYMfjBAHfIcXkTd_Fi9tA-f27pgPxeMSfSthg_B0Gg0im-02r8uGAONleFIqvGClcqQcsFcQSvYFtwV52vlye64b6FU_HYZTtfWSeUEW7V75q1GmUNLq63jCcTRtB1dTwCk2kCnaTmKzB1I7PyRgmTkjUxIKN8rZzsjUzhxkqI6hA8-XwM3OZAcGI-E1ohBUsTlrrJzEDB8A56W12xt99zXIO1uCheFdM4HJaT29Lr4tbg5NEvUdqucMJauvksg4BI9rLWSb8vYx7Ga0ymPys5jsKnie3LWVKH2mYiNLTvPd0g1motoo2PfyaEYghXxC9Ny3nOsI1UAzRY0yrd5QiSYKiQWxnIy3KkkZ0o-y3FoWoo7c1SbjpTM5sNY4qC13SkZzLaFEulDsOLmMaNdRZ5aYVWTYHe3bbzbLUiJpuLpyk_c5401xD1-HmMOdu6bPM_bjPC-mE1494-Edznh82zC-5mEzVEn7_O1OezLHUqqBVsVxbcM_hDhASXYKgAbNLwHF68j6cnzIL0_HTaqsUbFTneUMhoMf2ZIpO3UglOGRlsNTa0c0pDtyDCWKUSroVS11VK5qHlyKfpuTVotj2IM4538T83qCP44-f6EP_e1Q_Pel-JiPU_nCSQ6VaZ1XlrdNWbqjVvl4Z8vG4SXNAjzBrwH7vrZ-BuaTnijJHbJISZXf-kwOubGugb0JS_fKA-IeTTgKjT9_eKewJFg_Xo5u4PD65YHXY-C9u0-X6m9_1-Jn5qm8sylOMrtN5KjQb9nCQAA';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var adornment = '_19p5zvh6';\nexport var field = '_19p5zvh7';\nexport var fieldFullWidth = '_19p5zvh8';\nexport var helperText = /* @__PURE__ */ _7a468({defaultClassName:'_19p5zvhb',variantClassNames:{error:{true:'_19p5zvhc'}},defaultVariants:{},compoundVariants:[]});\nexport var input = '_19p5zvh5';\nexport var label = '_19p5zvh9';\nexport var requiredMark = '_19p5zvha';\nexport var root = /* @__PURE__ */ _7a468({defaultClassName:'_19p5zvh0',variantClassNames:{size:{sm:'_19p5zvh1',md:'_19p5zvh2',lg:'_19p5zvh3'},fullWidth:{true:'_19p5zvh4'}},defaultVariants:{size:'md'},compoundVariants:[]});"],"mappings":"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","names":["input","_","assignInlineVars","Skeleton","width","height","lines","assignInlineVars","_7a468"]}