@bestow-ui/react 1.6.1 → 1.8.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 +8 -6
- package/dist/{chunk-NKLDAXUR.js → chunk-MP5VSIWQ.js} +33 -11
- package/dist/chunk-MP5VSIWQ.js.map +1 -0
- package/dist/client.js +1173 -716
- package/dist/client.js.map +1 -1
- package/dist/index.cjs +1616 -999
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +631 -133
- package/dist/index.css.map +1 -1
- package/dist/index.d.cts +252 -22
- package/dist/index.d.ts +252 -22
- package/dist/shared.js +211 -52
- package/dist/shared.js.map +1 -1
- package/package.json +5 -3
- package/dist/chunk-NKLDAXUR.js.map +0 -1
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
- **대표색 하나로 테마** — 브랜드 색을 넣어도 글자 대비 4.5:1(hover 포함)과 포커스 링 3:1 을 라이트·다크 모두 지켜요.
|
|
20
20
|
[테마 빌더](https://dev-bestow.github.io/BestOW-UI/?path=/story/foundations-theme-builder--builder)에서 바로 해 볼 수 있어요.
|
|
21
21
|
- **가볍고 서버 컴포넌트 친화적** — 런타임 CSS 0, Next.js App Router 지원, 쓰는 컴포넌트만 번들에 들어가요
|
|
22
|
-
(Button 하나 약 1.
|
|
22
|
+
(Button 하나 약 1.8 kB, NativeSelect 로 만든 입력 폼 7종 약 4 kB, 모든 컴포넌트 CSS 를 합쳐도 약 10 kB — minify + brotli).
|
|
23
23
|
- **기본 문구는 한국어** — 닫기·결과 없음·달력 등 기본 문구가 한국어이고, `LocaleProvider` 로 한 번에 바꿀 수 있어요(영어 묶음 포함).
|
|
24
24
|
|
|
25
25
|
⚡ **[StackBlitz 에서 바로 써 보기](https://stackblitz.com/github/Dev-BestOW/BestOW-UI/tree/main/examples/vite-starter?file=src%2FApp.tsx)** (설치 없이 브라우저에서)
|
|
@@ -58,7 +58,7 @@ function SaveButton() {
|
|
|
58
58
|
```
|
|
59
59
|
|
|
60
60
|
Next.js App Router 에서는 Provider 를 `'use client'` 파일로 분리해 `app/layout.tsx` 에서 감싸면 돼요. 컴포넌트는 서버 컴포넌트에서도 바로 쓸 수 있어요.
|
|
61
|
-
상태가 없는 표시용 컴포넌트(`Typography`, `Stack`, `Card`, `Badge`, `Divider`, `Progress`, `Skeleton`, `DescriptionList`, `VisuallyHidden`)는
|
|
61
|
+
상태가 없는 표시용 컴포넌트(`Typography`, `Stack`, `Grid`, `Container`, `Card`, `Badge`, `Divider`, `Progress`, `Skeleton`, `DescriptionList`, `VisuallyHidden`)는
|
|
62
62
|
서버 컴포넌트로 렌더링되고(클라이언트 JS 없음), `createTheme`·`createIntentColors`·`vars`·`formatKoreanAmount` 같은 함수·값도 서버에서 그대로 불러요.
|
|
63
63
|
자세한 설정은 [Storybook 시작하기](https://dev-bestow.github.io/BestOW-UI/)에 있어요.
|
|
64
64
|
|
|
@@ -67,12 +67,14 @@ Next.js App Router 에서는 Provider 를 `'use client'` 파일로 분리해 `ap
|
|
|
67
67
|
## 다크 모드
|
|
68
68
|
|
|
69
69
|
```tsx
|
|
70
|
-
const [mode, setMode] = useState<
|
|
70
|
+
const [mode, setMode] = useState<ThemeMode>('system'); // 'light' | 'dark' | 'system'
|
|
71
71
|
|
|
72
72
|
<ThemeProvider theme={mode}>…</ThemeProvider>;
|
|
73
73
|
```
|
|
74
74
|
|
|
75
75
|
Modal·Tooltip·Select·Toast 처럼 portal 로 띄우는 요소도 테마를 자동으로 따라가요.
|
|
76
|
+
`'system'` 은 OS 설정을 따르고, 서버 렌더링에서도 CSS 미디어쿼리로 그려 첫 화면이 깜빡이지 않아요.
|
|
77
|
+
사용자가 고른 모드를 쿠키로 저장해 서버에서 읽는 방법은 [Storybook 시작하기 › 다크 모드](https://dev-bestow.github.io/BestOW-UI/)에 있어요.
|
|
76
78
|
|
|
77
79
|
## 브랜드 테마
|
|
78
80
|
|
|
@@ -120,15 +122,15 @@ react-hook-form 과 함께 쓸 수 있어요. 입력창은 `register` 를 그대
|
|
|
120
122
|
|
|
121
123
|
| 분류 | 컴포넌트 |
|
|
122
124
|
|---|---|
|
|
123
|
-
| 레이아웃 | `Stack`, `Divider`, `Card`, `VisuallyHidden` |
|
|
125
|
+
| 레이아웃 | `Stack`(구간별 값 `{ base, md }`), `Grid`, `Container`, `Divider`, `Card`, `VisuallyHidden` — 구간 `media`(sm 640 · md 768 · lg 1024 · xl 1280px) |
|
|
124
126
|
| 글자 | `Typography` |
|
|
125
127
|
| 동작 | `Button`, `IconButton`, `Link` |
|
|
126
|
-
| 폼 | `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` |
|
|
127
129
|
| 피드백 | `Alert`, `ErrorSummary`, `Progress`, `ToastProvider` + `useToast`, `Spinner`, `Skeleton`, `Badge` |
|
|
128
130
|
| 오버레이 | `Modal`, `Drawer`, `Popover`, `Tooltip`, `DropdownMenu` |
|
|
129
131
|
| 탐색 | `Tabs`, `SegmentedControl`, `Accordion`, `Pagination`, `Breadcrumb`, `SkipLink`, `Stepper` |
|
|
130
132
|
| 표시 | `Avatar`, `Table`(+ `TableEmpty`, `TableSkeleton`, `useTableSelection`), `DescriptionList` |
|
|
131
|
-
| 한국 서비스 키트 | `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) 에서 다시 내보내요) |
|
|
132
134
|
| 문구 | `LocaleProvider`, `en`(영어 문구 묶음) |
|
|
133
135
|
| 테마 | `ThemeProvider`, `createTheme`, `createIntentColors`, `strongInputBorders`, `vars`, `useTheme`, `usePortalProps` |
|
|
134
136
|
| 도움 함수 | `focusField` |
|
|
@@ -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
|
|
21
|
-
light = deepMerge(deepMerge(light,
|
|
22
|
-
dark = deepMerge(deepMerge(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
|
}
|
|
@@ -52,18 +53,19 @@ function loadKakaoPostcode() {
|
|
|
52
53
|
const existing = w.kakao?.Postcode ?? w.daum?.Postcode;
|
|
53
54
|
if (existing) return Promise.resolve(existing);
|
|
54
55
|
loading ?? (loading = new Promise((resolve, reject) => {
|
|
56
|
+
const fail = (message) => {
|
|
57
|
+
loading = null;
|
|
58
|
+
reject(new Error(message));
|
|
59
|
+
};
|
|
55
60
|
const script = document.createElement("script");
|
|
56
61
|
script.src = KAKAO_POSTCODE_SRC;
|
|
57
62
|
script.async = true;
|
|
58
63
|
script.onload = () => {
|
|
59
64
|
const ctor = w.kakao?.Postcode ?? w.daum?.Postcode;
|
|
60
|
-
if (ctor) resolve(ctor);
|
|
61
|
-
|
|
62
|
-
};
|
|
63
|
-
script.onerror = () => {
|
|
64
|
-
loading = null;
|
|
65
|
-
reject(new Error("\uC6B0\uD3B8\uBC88\uD638 \uC11C\uBE44\uC2A4\uB97C \uBD88\uB7EC\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694"));
|
|
65
|
+
if (ctor) return resolve(ctor);
|
|
66
|
+
fail("\uC6B0\uD3B8\uBC88\uD638 \uC11C\uBE44\uC2A4\uB97C \uCC3E\uC9C0 \uBABB\uD588\uC5B4\uC694");
|
|
66
67
|
};
|
|
68
|
+
script.onerror = () => fail("\uC6B0\uD3B8\uBC88\uD638 \uC11C\uBE44\uC2A4\uB97C \uBD88\uB7EC\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694");
|
|
67
69
|
document.head.appendChild(script);
|
|
68
70
|
}));
|
|
69
71
|
return loading;
|
|
@@ -207,14 +209,34 @@ var Skeleton = /* @__PURE__ */ forwardRef(function Skeleton2({ variant = "text",
|
|
|
207
209
|
// src/styles/visuallyHidden.css.ts
|
|
208
210
|
var visuallyHidden = "_1kdtbw10";
|
|
209
211
|
|
|
212
|
+
// src/components/Input/Input.css.ts
|
|
213
|
+
import { createRuntimeFn as _7a4682 } from "@vanilla-extract/recipes/createRuntimeFn";
|
|
214
|
+
var adornment = "_19p5zvh6";
|
|
215
|
+
var field = "_19p5zvh7";
|
|
216
|
+
var fieldFullWidth = "_19p5zvh8";
|
|
217
|
+
var helperText = /* @__PURE__ */ _7a4682({ defaultClassName: "_19p5zvhb", variantClassNames: { error: { true: "_19p5zvhc" } }, defaultVariants: {}, compoundVariants: [] });
|
|
218
|
+
var input = "_19p5zvh5";
|
|
219
|
+
var label = "_19p5zvh9";
|
|
220
|
+
var requiredMark = "_19p5zvha";
|
|
221
|
+
var root = /* @__PURE__ */ _7a4682({ defaultClassName: "_19p5zvh0", variantClassNames: { size: { sm: "_19p5zvh1", md: "_19p5zvh2", lg: "_19p5zvh3" }, fullWidth: { true: "_19p5zvh4" } }, defaultVariants: { size: "md" }, compoundVariants: [] });
|
|
222
|
+
|
|
210
223
|
export {
|
|
211
224
|
cx,
|
|
225
|
+
systemThemeClass,
|
|
212
226
|
themeClass,
|
|
213
227
|
vars,
|
|
214
228
|
createTheme,
|
|
215
229
|
mergeThemes,
|
|
216
230
|
themeToStyle,
|
|
217
231
|
visuallyHidden,
|
|
232
|
+
adornment,
|
|
233
|
+
field,
|
|
234
|
+
fieldFullWidth,
|
|
235
|
+
helperText,
|
|
236
|
+
input,
|
|
237
|
+
label,
|
|
238
|
+
requiredMark,
|
|
239
|
+
root,
|
|
218
240
|
composeExtraAddress,
|
|
219
241
|
kakaoPostcodeProvider,
|
|
220
242
|
toISODate,
|
|
@@ -230,4 +252,4 @@ export {
|
|
|
230
252
|
focusField,
|
|
231
253
|
Skeleton
|
|
232
254
|
};
|
|
233
|
-
//# sourceMappingURL=chunk-
|
|
255
|
+
//# sourceMappingURL=chunk-MP5VSIWQ.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 fail = (message: string) => {\n loading = null; // 다음에 다시 시도할 수 있게\n reject(new Error(message));\n };\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) return resolve(ctor);\n fail('우편번호 서비스를 찾지 못했어요');\n };\n script.onerror = () => fail('우편번호 서비스를 불러오지 못했어요');\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=#H4sIAAAAAAAAA7VV227bMAx9z1foZUAzVIHT21r1U4ZiYCzZJipLhkQnaYv9-yDZzqwsdZwCQx4CUIc8h-Ixtfq1fmru37dVxj4WjEn0jYY3wdBoNIoXWu2fF4yBxtJwJFV7wXJlSLkQLqERbAvuivON8mR33DeQK36zDKcb66Rygq2bPfNWo0yhudXW8Q7E0TQtXU8ApCqg1bQcVeYOJLb-SEEX5LXskJC_ls62RnblxEmK8lA-5HwOLFIgOTAeCa0Rg6SIS1Nl6yBgeAGeltdsY_fcVyDtbgoXhbTOByWk9vS8-L1YHYYlKrtVThhLVz8lEHCJHjZayZdrVqDS0isSQ4x9X8bhjiWevofRLHhkmJqIJ2dNGQaSKCts3nq-Q6rQXEQbE_vxDjckWBZ_wULnM8c6umtBswWN8mWeEAmmDI0Fr06WO9XkTMlnOSYnuUo_17nurltSMrGUscRBa7tTMoRtAznSm2DZ6iERtY48lcKyIsFub5q4DhqQEk3Juy0xsQIKa4h7fD_GHOLc1-kt3CSEd9lswtsvEt6mhI-zCe9mEtZHc75LN-2wYncoqRJsnWXfEvh9hAeUYOsArNHwHpw9j6R3mQfp_emwhI01Kk66pa6jIfDXQ6JbaA04ZWi0CNFUyiEN3Y4CY5lCNBpyVVktlYuaJ_eobzek1fKoxsHoH595dQR_mHyywj_3lUPz2l_FxXp-nCeQ6FTevQC51W1tpp7FdVr-8TIjPHVGmGfwHrjrvfEvtDvhtZLYdgmxuerThNExN9bVoC95LEd9QOyjBlei6b8v7gkcCdavl7MbOjyIadHNqGg_7vM3tff_q_FTbsrPfBRHvf0BVu1kSJoJAAA';\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"]}
|