@bestow-ui/react 1.7.0 → 2.0.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/theme/color.ts","../src/theme/presets.ts","../src/i18n/en.ts","../src/shared.ts","../src/utils/responsive.ts","../src/components/AgreementGroup/agreements.ts","../src/components/Badge/Badge.tsx","../src/components/Badge/Badge.css.ts","../src/components/Card/Card.tsx","../src/components/Card/Card.css.ts","../src/components/Container/Container.tsx","../src/components/Container/Container.css.ts","../src/components/DescriptionList/DescriptionList.tsx","../src/components/DescriptionList/DescriptionList.css.ts","../src/components/Divider/Divider.tsx","../src/components/Divider/Divider.css.ts","../src/components/FormField/FormField.tsx","../src/components/Grid/Grid.tsx","../src/components/Grid/Grid.css.ts","../src/components/Progress/Progress.tsx","../src/components/Progress/Progress.css.ts","../src/components/Stack/Stack.tsx","../src/components/Stack/Stack.css.ts","../src/components/Typography/Typography.tsx","../src/components/Typography/Typography.css.ts","../src/components/VisuallyHidden/VisuallyHidden.tsx"],"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' | 'info';\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 { ThemeInput } from './createTheme';\n\n/**\n * 입력 칸·체크 컨트롤 테두리를 배경과 3:1 이상으로 올리는 테마 입력 (WCAG 1.4.11 비텍스트 대비) — 2.0 에서 기본값이 될 예정.\n * - 입력 칸(border.input): 기본 border.default 는 흰 배경과 1.3:1. hover 는 테두리보다 더 진하게(다크는 더 밝게).\n * - Checkbox·Radio 테두리, 꺼진 Switch, Stepper 예정 단계(border.control): 기본 border.strong 은 라이트 흰 배경과 2.07:1.\n *\n * @example\n * <ThemeProvider overrides={createTheme(strongInputBorders)}>…</ThemeProvider>\n * createTheme(createIntentColors('primary', '#7c3aed'), strongInputBorders) // 브랜드 테마와 함께\n */\n// 색은 palette 를 import 하지 않고 값으로 적는다 — `palette.gray[600]` 같은 속성 읽기는 번들러가 지우지 못해,\n// 이 값을 쓰지 않는 앱에도 tokens 전체가 딸려 왔다(\"앱 기본\" +460 B). palette 와 같은지는 presets.test.ts 가 확인한다.\nexport const strongInputBorders: ThemeInput = /* @__PURE__ */ Object.freeze({\n // 라이트: gray600 / gray700 — 흰 배경 5.18:1, bg.subtle(gray50) 4.91:1\n // 체크 컨트롤: gray600 — 흰 배경 5.18:1\n light: { color: { border: { input: '#666e76', inputHover: '#495057', control: '#666e76' } } },\n // 다크: gray500 / gray300 — gray600 은 bg.subtle(gray900) 위에서 2.98:1 이라 한 단계 밝게. bg.default 8.57:1, bg.subtle 7.43:1\n // 체크 컨트롤: gray500 — 다크 기본값(border.strong)과 같다(이미 8.57:1)\n dark: { color: { border: { input: '#adb5bd', inputHover: '#dee2e6', control: '#adb5bd' } } },\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 decrement: 'Decrease',\n increment: 'Increase',\n steps: 'Progress',\n stepCompleted: 'completed',\n fileSelect: 'Choose files',\n fileDropHint: 'or drag and drop here',\n fileList: 'Selected files',\n fileRemove: (name) => `Remove ${name}`,\n filesSelected: (count) => `${count} ${count === 1 ? 'file' : 'files'} selected`,\n fileRemoved: (name) => `${name} removed`,\n fileTooLarge: (name, maxSize) => `${name}: files must be ${maxSize} or smaller.`,\n fileTypeNotAllowed: (name) => `${name}: this file type is not allowed.`,\n fileTooMany: (maxFiles) => `You can upload up to ${maxFiles} files.`,\n dateRangeStart: 'Start date',\n dateRangeEnd: 'End date',\n dateRangePresets: 'Quick select',\n errorSummaryTitle: (count) => `There ${count === 1 ? 'is 1 problem' : `are ${count} problems`} with your answers`,\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 residentNumber: 'Resident registration number',\n residentNumberFront: 'First 6 digits',\n residentNumberBack: 'Last 7 digits',\n residentNumberBackFirst: 'First digit of the second part',\n residentNumberInvalid: 'This number is not valid. Check the date of birth and the first digit of the second part.',\n residentNumberIncomplete: (digits) => `Enter all ${digits} 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","/**\n * 서버 컴포넌트에서도 부를 수 있는 함수·값·컴포넌트 (hook·Context·Radix 를 쓰지 않는 모듈만).\n * 빌드(ESM)에서 \"use client\" 가 붙지 않는 파일로 나가, Next.js 서버 컴포넌트에서 createTheme() 등을 바로 호출할 수 있다.\n * 여기에 넣는 모듈은 React hook(서버에서도 되는 useId 제외)·createContext·Radix·이벤트 핸들러·useMessages 를 쓰면 안 된다\n * (서버에서 실행됨). 컴포넌트에 이런 것을 더하게 되면 client.ts 로 옮긴다 — 같은 이름을 양쪽에서 export 하면 안 된다.\n */\nexport { vars, themeClass, type ThemeMode, type ThemeName, type ThemeTokens } from './theme/contract.css';\nexport { createIntentColors, contrastRatio, type IntentName } from './theme/color';\nexport {\n createTheme,\n type BestowTheme,\n type DeepPartial,\n type ThemeInput,\n type ThemeOverrides,\n} from './theme/createTheme';\nexport { strongInputBorders } from './theme/presets';\nexport { en } from './i18n/en';\n// 한국 서비스 서식·검증 함수는 @bestow-ui/korean-utils 로 옮겼다(1.6). 예전처럼 여기서도 같은 이름으로 쓸 수 있게 다시 export 한다.\nexport {\n formatBusinessNumber,\n formatKoreanAmount,\n formatKoreanDate,\n formatPhoneNumber,\n isValidBusinessNumber,\n} from '@bestow-ui/korean-utils';\n// 1.7 에 korean-utils 에 추가한 주민번호·마스킹 함수 — react 만 설치한 사용자도 같은 이름으로 쓴다\nexport {\n formatResidentNumber,\n isValidResidentNumber,\n maskCardNumber,\n maskDigits,\n maskName,\n maskPhoneNumber,\n maskResidentNumber,\n parseResidentNumber,\n type ResidentNumberInfo,\n} from '@bestow-ui/korean-utils';\nexport { parseISODate, toISODate } from './utils/date';\nexport { media, type Breakpoint, type Responsive } from './utils/responsive';\nexport {\n composeExtraAddress,\n kakaoPostcodeProvider,\n type AddressProvider,\n type AddressSearchResult,\n} from './components/AddressInput/addressProviders';\nexport { hasAllRequiredAgreements, type AgreementItem } from './components/AgreementGroup/agreements';\n\n// hook·이벤트 핸들러가 없는 표시용 컴포넌트 — 서버 컴포넌트로 렌더링된다(클라이언트 JS 없음, `as` 에 서버 컴포넌트도 넘길 수 있음).\n// playground 첫 페이지가 `as` 에 서버 함수를 넘겨 빌드로 확인한다(클라이언트 컴포넌트면 \"Functions cannot be passed\" 로 실패).\nexport * from './components/Badge';\nexport * from './components/Card';\nexport * from './components/Container';\nexport * from './components/DescriptionList';\nexport {\n dateRangePresets,\n presetRange,\n type DateRange,\n type DateRangePreset,\n} from './components/DateRangePicker/presets';\nexport * from './components/Divider';\nexport * from './components/FormField';\nexport * from './components/Grid';\nexport * from './components/Progress';\nexport * from './components/Skeleton';\nexport * from './components/Stack';\nexport * from './components/Typography';\nexport * from './components/VisuallyHidden';\nexport { focusField } from './utils/focusField';\n","/**\n * 반응형 구간 미디어쿼리(모바일 우선 min-width). `@bestow-ui/tokens` 의 breakpoint(px)를 em 으로 바꾼 값 —\n * em 이라 브라우저 기본 글꼴 크기를 키우면 구간도 따라 바뀐다. 값을 직접 적는다(최상위에서 tokens 객체 속성을 읽으면\n * tokens 전체가 번들에 딸려 온다 — responsive.test.ts 가 tokens 와 같은지 확인).\n *\n * @example style({ flexDirection: 'column', '@media': { [media.md]: { flexDirection: 'row' } } }) // vanilla-extract\n */\nexport const media = {\n sm: '(min-width: 40em)',\n md: '(min-width: 48em)',\n lg: '(min-width: 64em)',\n xl: '(min-width: 80em)',\n} as const;\n\nexport type Breakpoint = keyof typeof media;\n\n/**\n * 한 값 또는 구간별 값. 구간 값은 그 폭 이상에서 쓰이고, 주지 않은 구간은 앞(좁은) 구간 값을 이어받는다.\n *\n * @example direction={{ base: 'column', md: 'row' }} // 768px 미만은 세로, 이상은 가로\n */\nexport type Responsive<T> = T | ({ base?: T } & { [K in Breakpoint]?: T });\n\nconst keys = ['base', 'sm', 'md', 'lg', 'xl'] as const;\n\nexport const isResponsiveObject = <T>(value: Responsive<T> | undefined): value is Exclude<Responsive<T>, T> =>\n typeof value === 'object' && value !== null;\n\n/**\n * 각 구간의 실제 값(앞 구간을 이어받음)을 CSS 변수 `--bestow-<name>-<구간>` 으로 out 에 넣는다.\n * styles/responsive.css.ts 의 responsiveProperty 가 이 변수를 미디어쿼리로 읽는다.\n */\nexport function responsiveVars<T>(\n out: Record<string, string>,\n name: string,\n value: Responsive<T> | undefined,\n toCss: (value: T) => string,\n) {\n if (value === undefined) return;\n const values = (isResponsiveObject(value) ? value : { base: value }) as Partial<Record<(typeof keys)[number], T>>;\n let current: T | undefined;\n for (const key of keys) {\n current = values[key] ?? current;\n if (current !== undefined) out[`--bestow-${name}-${key}`] = toCss(current);\n }\n}\n\n/** space 토큰 키 → 테마 CSS 변수. 변수 이름(--bestow-space-*)이 공개 API 로 고정이라 vars 를 import 하지 않고 적는다 */\nexport const spaceVar = (key: string | number) => `var(--bestow-space-${key})`;\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","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport * as styles from './Badge.css';\n\nexport interface BadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'color'> {\n /** 시각적 스타일 */\n variant?: 'solid' | 'soft' | 'outline';\n /** 의미 색상. 일반 안내는 info (브랜드 색과 따로 파랑) */\n color?: 'primary' | 'neutral' | 'danger' | 'success' | 'warning' | 'info';\n /** 크기 */\n size?: 'sm' | 'md' | 'lg';\n /** 텍스트 앞에 표시할 아이콘 (장식용 — 의미는 텍스트로 전달한다) */\n startIcon?: ReactNode;\n}\n\nexport const Badge = /* @__PURE__ */ forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n { variant, color, size, startIcon, className, children, ...rest },\n ref,\n) {\n return (\n <span ref={ref} className={cx(styles.badge({ variant, color, size }), className)} {...rest}>\n {startIcon && <span className={styles.icon}>{startIcon}</span>}\n {children}\n </span>\n );\n});\n","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/Badge/Badge.css.ts.vanilla.css?source=#H4sIAAAAAAAAA7WWwW6jMBCG7zyFj7sHVwlpd1vyMNVgD2DV2Mg2JdlV332FqQmBJLIPewHJM___8w1Iw9P7Pn97YZV6Jn8zQriwnYRzQYSSQiGtJJ6OGSEgRa2ocNjagjBUDs14XENXkE8wPygt0To9UNsBQ7r_OVZLbTiaguy7E7FaCk6cAWU7MKjcpYEa4KK3K6PpkFa9lN6s0srRClohz6vORYVaUPbSPqCoG3erfarQFrnoWy_wuM1dwaJM3Xj1oqERDifmgig9GOjG4080TjCQ1I-tIK3gXOIx-8qewrhf_LhLYB-10b3ilGmpTUgOXTufcrM0jnjh9yvKL7_vd7j2-33H7_YbTH34VdirD1soV2_Ae9DOiBbMmfpPyXsvpvFQwbRyBqxbifLHMX3pJK4kh4cShyd3TfYWRaawdwZkAllQJJHNMfFkQbIlgygyDqpGkwD2LUjiCiHxWN-KLVUZRWV7xtDaBKygSOKaY-LBgmRLxqLIBjBKqDqBLCiSyOaYeLIg2ZLxKDKhKp2A5duTmKaAeCDfv6VBT9MKNS-jfNf5HdwB5-MEptV8c-_ml91nxZ91z3xOT_Y6tNqGPv_30Hob-hodeogMte11aPPwN2e8U9sYoT4KsjtmX_8Ai2Cozx8JAAA';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var badge = /* @__PURE__ */ _7a468({defaultClassName:'_1295cfn4',variantClassNames:{variant:{solid:'_1295cfn5',soft:'_1295cfn6',outline:'_1295cfn7'},color:{primary:'_1295cfn8',neutral:'_1295cfn9',danger:'_1295cfna',success:'_1295cfnb',warning:'_1295cfnc',info:'_1295cfnd'},size:{sm:'_1295cfne',md:'_1295cfnf',lg:'_1295cfng'}},defaultVariants:{variant:'soft',color:'neutral',size:'md'},compoundVariants:[]});\nexport var icon = '_1295cfnh';","import { forwardRef, type ElementType, type HTMLAttributes } from 'react';\nimport { cx } from '../../utils/cx';\nimport * as styles from './Card.css';\n\nexport interface CardProps extends HTMLAttributes<HTMLElement> {\n /** 시각적 스타일. outline 은 테두리, elevated 는 그림자(다크 모드는 가장자리 ring 포함), soft 는 옅은 배경 */\n variant?: 'outline' | 'elevated' | 'soft';\n /** 안쪽 여백 (sm 16px, md 24px, lg 32px). 이미지를 가장자리까지 붙이려면 none */\n padding?: 'none' | 'sm' | 'md' | 'lg';\n /** 렌더링할 요소 (기본 div). 목록이면 li, 독립된 콘텐츠면 article 등 */\n as?: ElementType;\n}\n\n/** 배경·테두리·radius·padding 을 가진 컨테이너. 자식 사이 간격은 16px. */\nexport const Card = /* @__PURE__ */ forwardRef<HTMLElement, CardProps>(function Card(\n { variant, padding, as: Component = 'div', className, ...rest },\n ref,\n) {\n return <Component ref={ref} className={cx(styles.card({ variant, padding }), className)} {...rest} />;\n});\n\nexport type CardSectionProps = HTMLAttributes<HTMLDivElement>;\n\n/** 제목·설명 영역. Typography 와 함께 쓴다. */\nexport const CardHeader = /* @__PURE__ */ forwardRef<HTMLDivElement, CardSectionProps>(function CardHeader(\n { className, ...rest },\n ref,\n) {\n return <div ref={ref} className={cx(styles.header, className)} {...rest} />;\n});\n\n/** 본문 영역 */\nexport const CardBody = /* @__PURE__ */ forwardRef<HTMLDivElement, CardSectionProps>(function CardBody(\n { className, ...rest },\n ref,\n) {\n return <div ref={ref} className={cx(styles.body, className)} {...rest} />;\n});\n\n/** 버튼 등 동작 영역. 오른쪽 정렬 */\nexport const CardFooter = /* @__PURE__ */ forwardRef<HTMLDivElement, CardSectionProps>(function CardFooter(\n { className, ...rest },\n ref,\n) {\n return <div ref={ref} className={cx(styles.footer, className)} {...rest} />;\n});\n","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/Card/Card.css.ts.vanilla.css?source=LmRudWYxdTAgewogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBnYXA6IHZhcigtLWJlc3Rvdy1zcGFjZS00KTsKICBtaW4td2lkdGg6IDA7CiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tYmVzdG93LXJhZGl1cy1sZyk7CiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmVzdG93LWNvbG9yLWJnLWRlZmF1bHQpOwogIGNvbG9yOiB2YXIoLS1iZXN0b3ctY29sb3ItZmctZGVmYXVsdCk7CiAgZm9udC1mYW1pbHk6IHZhcigtLWJlc3Rvdy1mb250LWZhbWlseS1zYW5zKTsKfQouZG51ZjF1MSB7CiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1iZXN0b3ctY29sb3ItYm9yZGVyLWRlZmF1bHQpOwp9Ci5kbnVmMXUyIHsKICBib3gtc2hhZG93OiB2YXIoLS1iZXN0b3ctc2hhZG93LW1kKTsKfQouZG51ZjF1MyB7CiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmVzdG93LWNvbG9yLWJnLXN1YnRsZSk7Cn0KLmRudWYxdTQgewogIHBhZGRpbmc6IDA7Cn0KLmRudWYxdTUgewogIHBhZGRpbmc6IHZhcigtLWJlc3Rvdy1zcGFjZS00KTsKfQouZG51ZjF1NiB7CiAgcGFkZGluZzogdmFyKC0tYmVzdG93LXNwYWNlLTYpOwp9Ci5kbnVmMXU3IHsKICBwYWRkaW5nOiB2YXIoLS1iZXN0b3ctc3BhY2UtOCk7Cn0KLmRudWYxdTggewogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBnYXA6IHZhcigtLWJlc3Rvdy1zcGFjZS0xKTsKfQouZG51ZjF1OSB7CiAgZm9udC1zaXplOiB2YXIoLS1iZXN0b3ctZm9udC1zaXplLXNtKTsKICBsaW5lLWhlaWdodDogdmFyKC0tYmVzdG93LWZvbnQtbGluZS1oZWlnaHQtbm9ybWFsKTsKfQouZG51ZjF1YSB7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgZ2FwOiB2YXIoLS1iZXN0b3ctc3BhY2UtMik7Cn0';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var body = 'dnuf1u9';\nexport var card = /* @__PURE__ */ _7a468({defaultClassName:'dnuf1u0',variantClassNames:{variant:{outline:'dnuf1u1',elevated:'dnuf1u2',soft:'dnuf1u3'},padding:{none:'dnuf1u4',sm:'dnuf1u5',md:'dnuf1u6',lg:'dnuf1u7'}},defaultVariants:{variant:'outline',padding:'md'},compoundVariants:[]});\nexport var footer = 'dnuf1ua';\nexport var header = 'dnuf1u8';","import { forwardRef, type ElementType, type HTMLAttributes } from 'react';\nimport { cx } from '../../utils/cx';\nimport * as styles from './Container.css';\n\nexport interface ContainerProps extends HTMLAttributes<HTMLElement> {\n /** 렌더링할 요소 (페이지 본문이면 'main') */\n as?: ElementType;\n /** 최대 폭 — sm 640 · md 768 · lg 1024(기본) · xl 1280px(구간 폭과 같음, 기본 글꼴 크기를 따름), full 은 제한 없음 */\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n /** 좌우 여백을 없앤다 (기본은 좁은 화면 16px, md 구간부터 24px) */\n flush?: boolean;\n}\n\n/** 내용을 가운데에 두고 최대 폭과 좌우 여백을 정하는 페이지 틀 */\nexport const Container = /* @__PURE__ */ forwardRef<HTMLElement, ContainerProps>(function Container(\n { as: Component = 'div', size, flush, className, ...rest },\n ref,\n) {\n return <Component ref={ref} className={cx(styles.container({ size, flush }), className)} {...rest} />;\n});\n","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/Container/Container.css.ts.vanilla.css?source=LmI0MDRubjAgewogIHdpZHRoOiAxMDAlOwogIG1hcmdpbi1pbmxpbmU6IGF1dG87CiAgcGFkZGluZy1pbmxpbmU6IHZhcigtLWJlc3Rvdy1zcGFjZS00KTsKfQouYjQwNG5uMSB7CiAgbWF4LXdpZHRoOiA0MHJlbTsKfQouYjQwNG5uMiB7CiAgbWF4LXdpZHRoOiA0OHJlbTsKfQouYjQwNG5uMyB7CiAgbWF4LXdpZHRoOiA2NHJlbTsKfQouYjQwNG5uNCB7CiAgbWF4LXdpZHRoOiA4MHJlbTsKfQouYjQwNG5uNSB7CiAgbWF4LXdpZHRoOiBub25lOwp9Ci5iNDA0bm42IHsKICBwYWRkaW5nLWlubGluZTogMDsKfQpAbWVkaWEgKG1pbi13aWR0aDogNDhlbSkgewogIC5iNDA0bm4wIHsKICAgIHBhZGRpbmctaW5saW5lOiB2YXIoLS1iZXN0b3ctc3BhY2UtNik7CiAgfQogIC5iNDA0bm42IHsKICAgIHBhZGRpbmctaW5saW5lOiAwOwogIH0KfQ';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var container = /* @__PURE__ */ _7a468({defaultClassName:'b404nn0',variantClassNames:{size:{sm:'b404nn1',md:'b404nn2',lg:'b404nn3',xl:'b404nn4',full:'b404nn5'},flush:{true:'b404nn6'}},defaultVariants:{size:'lg'},compoundVariants:[]});","import { assignInlineVars } from '@vanilla-extract/dynamic';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport * as styles from './DescriptionList.css';\n\nexport interface DescriptionListItem {\n /** 이름 (dt) */\n term: ReactNode;\n /** 값 (dd) */\n description: ReactNode;\n}\n\nexport interface DescriptionListProps extends HTMLAttributes<HTMLDListElement> {\n /** 이름–값 목록 */\n items: DescriptionListItem[];\n /** horizontal(기본): 이름 왼쪽·값 오른쪽. vertical: 이름 위·값 아래(좁은 곳·긴 값) */\n layout?: 'horizontal' | 'vertical';\n /** horizontal 일 때 이름 열의 폭 (기본 30%) — 예: \"8rem\" */\n termWidth?: string;\n /** 항목 사이에 구분선 */\n divided?: boolean;\n}\n\n/**\n * 이름–값 목록(주문 상세의 고객·연락처·금액 등). `<dl>` 안에 항목마다 `<div><dt/><dd/></div>` 로 그려 스크린리더가 쌍으로 읽는다.\n * hook 이 없어 서버 컴포넌트로도 렌더링된다.\n */\nexport const DescriptionList = /* @__PURE__ */ forwardRef<HTMLDListElement, DescriptionListProps>(\n function DescriptionList({ items, layout = 'horizontal', termWidth, divided, className, style, ...rest }, ref) {\n return (\n <dl\n ref={ref}\n className={cx(styles.root, className)}\n style={termWidth ? { ...assignInlineVars({ [styles.termWidth]: termWidth }), ...style } : style}\n {...rest}\n >\n {items.map((item, index) => (\n <div key={index} className={styles.item({ layout, divided })}>\n <dt className={styles.term}>{item.term}</dt>\n <dd className={styles.description}>{item.description}</dd>\n </div>\n ))}\n </dl>\n );\n },\n);\n","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/DescriptionList/DescriptionList.css.ts.vanilla.css?source=Ll8xNGcwb3Q0MSB7CiAgLS1fMTRnMG90NDA6IDMwJTsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgbWFyZ2luOiAwOwogIGZvbnQtZmFtaWx5OiB2YXIoLS1iZXN0b3ctZm9udC1mYW1pbHktc2Fucyk7CiAgZm9udC1zaXplOiB2YXIoLS1iZXN0b3ctZm9udC1zaXplLXNtKTsKICBsaW5lLWhlaWdodDogdmFyKC0tYmVzdG93LWZvbnQtbGluZS1oZWlnaHQtbm9ybWFsKTsKfQouXzE0ZzBvdDQyIHsKICBtaW4td2lkdGg6IDA7Cn0KLl8xNGcwb3Q0MyB7CiAgZGlzcGxheTogZ3JpZDsKICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLV8xNGcwb3Q0MCkgbWlubWF4KDAsIDFmcik7CiAgY29sdW1uLWdhcDogdmFyKC0tYmVzdG93LXNwYWNlLTQpOwogIHBhZGRpbmctYmxvY2s6IHZhcigtLWJlc3Rvdy1zcGFjZS0yKTsKfQouXzE0ZzBvdDQ0IHsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgZ2FwOiB2YXIoLS1iZXN0b3ctc3BhY2UtMSk7CiAgcGFkZGluZy1ibG9jazogdmFyKC0tYmVzdG93LXNwYWNlLTIpOwp9Ci5fMTRnMG90NDU6bm90KDpsYXN0LWNoaWxkKSB7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJlc3Rvdy1jb2xvci1ib3JkZXItZGVmYXVsdCk7Cn0KLl8xNGcwb3Q0NiB7CiAgbWFyZ2luOiAwOwogIGZvbnQtd2VpZ2h0OiB2YXIoLS1iZXN0b3ctZm9udC13ZWlnaHQtbWVkaXVtKTsKICBjb2xvcjogdmFyKC0tYmVzdG93LWNvbG9yLWZnLW11dGVkKTsKICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKfQouXzE0ZzBvdDQ3IHsKICBtYXJnaW46IDA7CiAgY29sb3I6IHZhcigtLWJlc3Rvdy1jb2xvci1mZy1kZWZhdWx0KTsKICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKfQ';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var description = '_14g0ot47';\nexport var item = /* @__PURE__ */ _7a468({defaultClassName:'_14g0ot42',variantClassNames:{layout:{horizontal:'_14g0ot43',vertical:'_14g0ot44'},divided:{true:'_14g0ot45'}},defaultVariants:{layout:'horizontal'},compoundVariants:[]});\nexport var root = '_14g0ot41';\nexport var term = '_14g0ot46';\nexport var termWidth = 'var(--_14g0ot40)';","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport * as styles from './Divider.css';\n\nexport interface DividerProps extends HTMLAttributes<HTMLDivElement> {\n /** 방향. vertical 은 flex 행 안에서 부모 높이를 채운다 */\n orientation?: 'horizontal' | 'vertical';\n /** 시각적 구분만 하고 의미가 없으면 true — 스크린리더에서 숨긴다 */\n decorative?: boolean;\n /**\n * 가운데에 표시할 텍스트 (예: \"또는\"). horizontal 에서만 쓴다.\n * separator 역할의 자식은 스크린리더가 읽지 않으므로, 텍스트가 있으면 선만 숨기고 텍스트는 읽히게 둔다.\n */\n children?: ReactNode;\n}\n\nexport const Divider = /* @__PURE__ */ forwardRef<HTMLDivElement, DividerProps>(function Divider(\n { orientation = 'horizontal', decorative, className, children, ...rest },\n ref,\n) {\n if (children && orientation === 'horizontal') {\n return (\n <div ref={ref} className={cx(styles.labeled, className)} {...rest}>\n <span className={styles.line} aria-hidden />\n {children}\n <span className={styles.line} aria-hidden />\n </div>\n );\n }\n\n const a11y = decorative\n ? { role: 'none' }\n : { role: 'separator', 'aria-orientation': orientation === 'vertical' ? ('vertical' as const) : undefined };\n return <div ref={ref} className={cx(styles.divider({ orientation }), className)} {...a11y} {...rest} />;\n});\n","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/Divider/Divider.css.ts.vanilla.css?source=Ll8xdDNncTh2MCB7CiAgZmxleC1zaHJpbms6IDA7CiAgYm9yZGVyOiBub25lOwogIG1hcmdpbjogMDsKICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZXN0b3ctY29sb3ItYm9yZGVyLWRlZmF1bHQpOwp9Ci5fMXQzZ3E4djEgewogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMXB4Owp9Ci5fMXQzZ3E4djIgewogIHdpZHRoOiAxcHg7CiAgYWxpZ24tc2VsZjogc3RyZXRjaDsKICBtaW4taGVpZ2h0OiAxZW07Cn0KLl8xdDNncTh2MyB7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGdhcDogdmFyKC0tYmVzdG93LXNwYWNlLTMpOwogIHdpZHRoOiAxMDAlOwogIGZvbnQtZmFtaWx5OiB2YXIoLS1iZXN0b3ctZm9udC1mYW1pbHktc2Fucyk7CiAgZm9udC1zaXplOiB2YXIoLS1iZXN0b3ctZm9udC1zaXplLXhzKTsKICBsaW5lLWhlaWdodDogdmFyKC0tYmVzdG93LWZvbnQtbGluZS1oZWlnaHQtdGlnaHQpOwogIGNvbG9yOiB2YXIoLS1iZXN0b3ctY29sb3ItZmctc3VidGxlKTsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Ci5fMXQzZ3E4djQgewogIGZsZXg6IDE7CiAgaGVpZ2h0OiAxcHg7CiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmVzdG93LWNvbG9yLWJvcmRlci1kZWZhdWx0KTsKfQ';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var divider = /* @__PURE__ */ _7a468({defaultClassName:'_1t3gq8v0',variantClassNames:{orientation:{horizontal:'_1t3gq8v1',vertical:'_1t3gq8v2'}},defaultVariants:{orientation:'horizontal'},compoundVariants:[]});\nexport var labeled = '_1t3gq8v3';\nexport var line = '_1t3gq8v4';","import { forwardRef, useId, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport * as fieldStyles from '../Input/Input.css';\n\n/**\n * FormField 가 자식에게 넘기는 연결 속성. 입력 요소(또는 입력 역할을 하는 요소)에 그대로 펼쳐 넣는다.\n * role=\"group\" 처럼 aria-invalid·aria-required 를 받지 못하는 역할이면 그 둘은 빼고 안의 컨트롤에 준다(axe aria-allowed-attr).\n */\nexport interface FormFieldControlProps {\n id: string;\n 'aria-describedby'?: string;\n 'aria-invalid'?: true;\n 'aria-required'?: true;\n}\n\n/** render 함수의 둘째 인자 — 입력에 펼치지 않는 정보 */\nexport interface FormFieldMeta {\n /** 레이블 요소의 id — label 로 이름을 받을 수 없는 요소(div role=\"combobox\" 등)는 aria-labelledby 에 넣는다 */\n labelId?: string;\n /** 도움말 요소의 id */\n helperId?: string;\n}\n\nexport interface FormFieldProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'id'> {\n /** 입력 위에 표시할 레이블 (짧게 — 보조 설명은 helperText) */\n label?: ReactNode;\n /** 입력 아래 도움말. error 일 때는 오류 메시지로 표시된다 */\n helperText?: ReactNode;\n /** 오류 상태 — 자식에 aria-invalid 를 넘기고 helperText 를 오류 색으로 */\n error?: boolean;\n /** 필수 — 레이블에 * 를 붙이고 자식에 aria-required 를 넘긴다(네이티브 검증이 필요하면 입력에 required 를 직접) */\n required?: boolean;\n /** 입력 요소의 id. 생략하면 만든다 (ErrorSummary 링크·focusField 가 이 id 로 찾아간다) */\n id?: string;\n /** 부모 너비를 꽉 채운다 */\n fullWidth?: boolean;\n /**\n * 입력을 그리는 함수. 첫째 인자를 입력 요소에 그대로 펼쳐 넣는다.\n * @example {(field) => <input {...field} />}\n * @example {(field, { labelId }) => <CustomSelect {...field} aria-labelledby={labelId} />}\n */\n children: (control: FormFieldControlProps, meta: FormFieldMeta) => ReactNode;\n}\n\n/**\n * 직접 만든 입력·다른 라이브러리 입력에 TextField 와 같은 레이블·도움말·오류 연결을 붙인다.\n * hook 은 useId 뿐이라 서버 컴포넌트에서도 쓸 수 있다.\n */\nexport const FormField = /* @__PURE__ */ forwardRef<HTMLDivElement, FormFieldProps>(function FormField(\n { label, helperText, error, required, id, fullWidth, className, children, ...rest },\n ref,\n) {\n const generatedId = useId();\n const controlId = id ?? generatedId;\n const labelId = label ? `${controlId}-label` : undefined;\n const helperId = helperText ? `${controlId}-helper` : undefined;\n\n return (\n <div ref={ref} className={cx(fieldStyles.field, fullWidth && fieldStyles.fieldFullWidth, className)} {...rest}>\n {label && (\n <label id={labelId} htmlFor={controlId} className={fieldStyles.label}>\n {label}\n {required && (\n <span className={fieldStyles.requiredMark} aria-hidden>\n *\n </span>\n )}\n </label>\n )}\n {children(\n {\n id: controlId,\n 'aria-describedby': helperId,\n 'aria-invalid': error || undefined,\n 'aria-required': required || undefined,\n },\n { labelId, helperId },\n )}\n {helperText && (\n <p id={helperId} className={fieldStyles.helperText({ error })}>\n {helperText}\n </p>\n )}\n </div>\n );\n});\n","import type { space } from '@bestow-ui/tokens';\nimport { forwardRef, type CSSProperties, type ElementType, type HTMLAttributes } from 'react';\nimport { cx } from '../../utils/cx';\nimport { responsiveVars, spaceVar, type Responsive } from '../../utils/responsive';\nimport * as styles from './Grid.css';\n\nexport interface GridProps extends HTMLAttributes<HTMLElement> {\n /** 렌더링할 요소 (목록이면 'ul') */\n as?: ElementType;\n /** 열 개수 (같은 폭). 구간별로: `{ base: 1, md: 2, lg: 3 }`. 생략하면 한 열 */\n columns?: Responsive<number>;\n /**\n * 칸의 최소 폭(CSS 길이, 예: '220px'·'14rem'). 주면 화면 폭에 맞춰 열 개수를 자동으로 정한다(columns 대신).\n * 화면이 이 폭보다 좁으면 칸이 화면 폭으로 줄어든다(가로 스크롤 없음).\n */\n minItemWidth?: string;\n /** 칸 사이 간격 (space 토큰 키). 구간별 값도 받는다 */\n gap?: Responsive<keyof typeof space>;\n}\n\nconst repeatColumns = (count: number) => `repeat(${count}, minmax(0, 1fr))`;\n\nexport const Grid = /* @__PURE__ */ forwardRef<HTMLElement, GridProps>(function Grid(\n { as: Component = 'div', columns, minItemWidth, gap, className, style, ...rest },\n ref,\n) {\n const responsive: Record<string, string> = {};\n if (minItemWidth)\n responsive['--bestow-grid-columns-base'] = `repeat(auto-fill, minmax(min(100%, ${minItemWidth}), 1fr))`;\n else responsiveVars(responsive, 'grid-columns', columns, repeatColumns);\n responsiveVars(responsive, 'gap', gap, spaceVar);\n\n return (\n <Component\n ref={ref}\n className={cx(styles.grid, styles.columns, gap !== undefined && styles.responsiveGap, className)}\n style={{ ...responsive, ...style } as CSSProperties}\n {...rest}\n />\n );\n});\n","import 'src/styles/responsive.css.ts.vanilla.css?source=LmlhcmJsYTAgewogIC0tYmVzdG93LWdhcC1iYXNlOiBpbml0aWFsOwogIC0tYmVzdG93LWdhcC1zbTogaW5pdGlhbDsKICAtLWJlc3Rvdy1nYXAtbWQ6IGluaXRpYWw7CiAgLS1iZXN0b3ctZ2FwLWxnOiBpbml0aWFsOwogIC0tYmVzdG93LWdhcC14bDogaW5pdGlhbDsKICBnYXA6IHZhcigtLWJlc3Rvdy1nYXAtYmFzZSk7Cn0KQG1lZGlhIChtaW4td2lkdGg6IDQwZW0pIHsKICAuaWFyYmxhMCB7CiAgICBnYXA6IHZhcigtLWJlc3Rvdy1nYXAtc20pOwogIH0KfQpAbWVkaWEgKG1pbi13aWR0aDogNDhlbSkgewogIC5pYXJibGEwIHsKICAgIGdhcDogdmFyKC0tYmVzdG93LWdhcC1tZCk7CiAgfQp9CkBtZWRpYSAobWluLXdpZHRoOiA2NGVtKSB7CiAgLmlhcmJsYTAgewogICAgZ2FwOiB2YXIoLS1iZXN0b3ctZ2FwLWxnKTsKICB9Cn0KQG1lZGlhIChtaW4td2lkdGg6IDgwZW0pIHsKICAuaWFyYmxhMCB7CiAgICBnYXA6IHZhcigtLWJlc3Rvdy1nYXAteGwpOwogIH0KfQ';\nimport 'src/components/Grid/Grid.css.ts.vanilla.css?source=Ll8xdHlsdjltMCB7CiAgZGlzcGxheTogZ3JpZDsKICBtaW4td2lkdGg6IDA7Cn0KLl8xdHlsdjltMSB7CiAgLS1iZXN0b3ctZ3JpZC1jb2x1bW5zLWJhc2U6IGluaXRpYWw7CiAgLS1iZXN0b3ctZ3JpZC1jb2x1bW5zLXNtOiBpbml0aWFsOwogIC0tYmVzdG93LWdyaWQtY29sdW1ucy1tZDogaW5pdGlhbDsKICAtLWJlc3Rvdy1ncmlkLWNvbHVtbnMtbGc6IGluaXRpYWw7CiAgLS1iZXN0b3ctZ3JpZC1jb2x1bW5zLXhsOiBpbml0aWFsOwogIGdyaWQtdGVtcGxhdGUtY29sdW1uczogdmFyKC0tYmVzdG93LWdyaWQtY29sdW1ucy1iYXNlKTsKfQpAbWVkaWEgKG1pbi13aWR0aDogNDBlbSkgewogIC5fMXR5bHY5bTEgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiB2YXIoLS1iZXN0b3ctZ3JpZC1jb2x1bW5zLXNtKTsKICB9Cn0KQG1lZGlhIChtaW4td2lkdGg6IDQ4ZW0pIHsKICAuXzF0eWx2OW0xIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogdmFyKC0tYmVzdG93LWdyaWQtY29sdW1ucy1tZCk7CiAgfQp9CkBtZWRpYSAobWluLXdpZHRoOiA2NGVtKSB7CiAgLl8xdHlsdjltMSB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLWJlc3Rvdy1ncmlkLWNvbHVtbnMtbGcpOwogIH0KfQpAbWVkaWEgKG1pbi13aWR0aDogODBlbSkgewogIC5fMXR5bHY5bTEgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiB2YXIoLS1iZXN0b3ctZ3JpZC1jb2x1bW5zLXhsKTsKICB9Cn0';\nexport var columns = '_1tylv9m1';\nexport var grid = '_1tylv9m0';\nexport var responsiveGap = 'iarbla0';","import { forwardRef, useId, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport * as styles from './Progress.css';\n\nexport interface ProgressProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'> {\n /** 현재 값 (0 ~ max). 생략하거나 null 이면 진행률을 모르는 상태(indeterminate)로 움직이는 막대를 보여 준다 */\n value?: number | null;\n /** 최댓값 */\n max?: number;\n /** 막대 위에 보이는 레이블. progressbar 의 이름이 된다 */\n label?: ReactNode;\n /** 레이블이 없을 때 스크린리더용 이름 */\n 'aria-label'?: string;\n /** 오른쪽에 값 텍스트(기본 \"42%\")를 보여 준다 */\n showValue?: boolean;\n /** 값 텍스트 형식. 화면 표시와 스크린리더(aria-valuetext)에 함께 쓴다 (예: (v, max) => `${v}/${max}개`) */\n formatValue?: (value: number, max: number) => string;\n /** 막대 두께 (sm 4px · md 8px · lg 12px) */\n size?: 'sm' | 'md' | 'lg';\n /** 의미 색상 */\n color?: 'primary' | 'neutral' | 'success' | 'warning' | 'danger';\n}\n\nconst defaultFormat = (value: number, max: number) => `${Math.round((value / max) * 100)}%`;\n\nexport const Progress = /* @__PURE__ */ forwardRef<HTMLDivElement, ProgressProps>(function Progress(\n {\n value,\n max = 100,\n label,\n 'aria-label': ariaLabel,\n showValue,\n formatValue = defaultFormat,\n size,\n color,\n className,\n ...rest\n },\n ref,\n) {\n const labelId = useId();\n const isIndeterminate = value === undefined || value === null;\n const safeMax = max > 0 ? max : 100;\n const clamped = isIndeterminate ? 0 : Math.min(safeMax, Math.max(0, value));\n const valueText = isIndeterminate ? undefined : formatValue(clamped, safeMax);\n\n return (\n <div ref={ref} className={cx(styles.root, className)} {...rest}>\n {(label || (showValue && valueText)) && (\n <div className={styles.header}>\n {label && (\n <span id={labelId} className={styles.label}>\n {label}\n </span>\n )}\n {/* 스크린리더는 progressbar 의 aria-valuetext 로 읽으므로 화면용 텍스트는 숨긴다 */}\n {showValue && valueText && (\n <span className={styles.value} aria-hidden>\n {valueText}\n </span>\n )}\n </div>\n )}\n <div\n role=\"progressbar\"\n aria-labelledby={label ? labelId : undefined}\n aria-label={label ? undefined : ariaLabel}\n aria-valuemin={0}\n aria-valuemax={safeMax}\n aria-valuenow={isIndeterminate ? undefined : clamped}\n aria-valuetext={valueText}\n className={styles.track({ size })}\n >\n <div\n className={styles.indicator({ color })}\n data-state={isIndeterminate ? 'indeterminate' : clamped >= safeMax ? 'complete' : 'loading'}\n style={isIndeterminate ? undefined : { width: `${(clamped / safeMax) * 100}%` }}\n />\n </div>\n </div>\n );\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/Progress/Progress.css.ts.vanilla.css?source=#H4sIAAAAAAAAA41Vy27bMBC8-yuIAgXiAw05cZpUQYECvfQDeiuKYCWu5G0oUl0u_WiRfy9IxY2lOI1hwIY5q5nZ5ZBa3C9l8_CrKAr1Z6aUodBb2Jeqsbi7m6n8qw0x1kLelar2NnYuIS30pdoAX2hdYRC_1aGHGvXlPKFbMrIu1bIo3mca70Q30JHdTx46QnQAF-Z3s8fZ4uBqedoVWGqdJsEulKqCgJYcJuBnDELNXtfeCTop1eCpQtki_tf21fyfz0C_8ZTLtK5DlwuToF4jtWs5VXoEa0nf47Yuc1u5cvsqx4DoDg3FQbT21vOkNK_pptUGG4h2InSVhTrglpwml20FAZZSQRT_JmkXBc3zZDbABE60ix0y1aUSqKIFTgthJLzKwr0PNOSG0YLQJm-S3yA31m9LtSZjhm2Z5KXybJA1g6EYJuaGRd1Ea7OzCuqHln10Rr_eS3XcS-V3OqzBJAvkAooq8mfZ716ZQ4iVWBzP9jq3eMjAqt-N0A8j9HaC3ozQ5eUEvh3Dp4dCbo1MkhBhcIdJ50mO2zCRIYHaee7AzhVCQO2jjEW_GxBI8RD89I6cQUHuyIHgux_Z0NMmrQY74KiDQfN-2XJf3RSglotVGOjJJQVFriFHgiOpj5nurI3rmTrgvRbcTbIN55M4jMJgT5BU55OEWNcYwgmS-nySLbAj154gMeeTGHAt8jPH53RHgLroGRvkoBlNrNHozh8OX_o_zwKTjI2z4_xwjT6OCt_MxYvjOwrHgVQp30NNsi9VsbgeZJ69N56T5dxgKBXU6baYWF49qfko6SYr84EN3pJRX8BtIHzDnbz0__TUsYIGk14Vx-ZeTv4rtWubjuCT178Elo90LAcAAA';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var header = '_1tvkq001';\nexport var indicator = /* @__PURE__ */ _7a468({defaultClassName:'_1tvkq008',variantClassNames:{color:{primary:'_1tvkq009',neutral:'_1tvkq00a',success:'_1tvkq00b',warning:'_1tvkq00c',danger:'_1tvkq00d'}},defaultVariants:{color:'primary'},compoundVariants:[]});\nexport var label = '_1tvkq002';\nexport var root = '_1tvkq000';\nexport var track = /* @__PURE__ */ _7a468({defaultClassName:'_1tvkq004',variantClassNames:{size:{sm:'_1tvkq005',md:'_1tvkq006',lg:'_1tvkq007'}},defaultVariants:{size:'md'},compoundVariants:[]});\nexport var value = '_1tvkq003';","import type { space } from '@bestow-ui/tokens';\nimport { forwardRef, type CSSProperties, type ElementType, type HTMLAttributes } from 'react';\nimport { cx } from '../../utils/cx';\nimport { isResponsiveObject, responsiveVars, spaceVar, type Responsive } from '../../utils/responsive';\nimport * as styles from './Stack.css';\n\ntype Direction = 'row' | 'column' | 'row-reverse' | 'column-reverse';\ntype Align = 'start' | 'center' | 'end' | 'stretch' | 'baseline';\ntype Justify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';\ntype SpaceKey = keyof typeof space;\n\nexport interface StackProps extends HTMLAttributes<HTMLElement> {\n /** 렌더링할 요소 */\n as?: ElementType;\n /** 배치 방향 (기본 column). 구간별로: `{ base: 'column', md: 'row' }` */\n direction?: Responsive<Direction>;\n /** 자식 사이 간격 (space 토큰 키). 구간별로: `{ base: 3, lg: 6 }` */\n gap?: Responsive<SpaceKey>;\n /** 교차축 정렬 (align-items). 구간별 값도 받는다 */\n align?: Responsive<Align>;\n /** 주축 정렬 (justify-content). 구간별 값도 받는다 */\n justify?: Responsive<Justify>;\n /** 줄바꿈 허용 */\n wrap?: boolean;\n}\n\nconst flexValues: Record<string, string> = {\n start: 'flex-start',\n end: 'flex-end',\n between: 'space-between',\n around: 'space-around',\n evenly: 'space-evenly',\n};\nconst flexValue = (value: string) => flexValues[value] ?? value;\n\n// 구간별 값을 받는 속성: [prop, CSS 변수 이름, 값 → CSS, 반응형 클래스]\nconst responsiveProps = [\n ['direction', 'stack-direction', String, styles.responsiveDirection],\n ['gap', 'gap', spaceVar, styles.responsiveGap],\n ['align', 'stack-align', flexValue, styles.responsiveAlign],\n ['justify', 'stack-justify', flexValue, styles.responsiveJustify],\n] as const;\n\nexport const Stack = /* @__PURE__ */ forwardRef<HTMLElement, StackProps>(function Stack(\n { as: Component = 'div', direction, gap, align, justify, wrap, className, style, ...rest },\n ref,\n) {\n // 한 값이면 지금처럼 recipe 클래스, 구간별 값이면 반응형 클래스 + 인라인 CSS 변수(그 속성은 recipe 에 넘기지 않음)\n const props: Record<string, unknown> = { direction: direction ?? 'column', gap, align, justify };\n const variants: Record<string, unknown> = { wrap };\n const classes: string[] = [];\n const cssVars: Record<string, string> = {};\n for (const [key, name, toCss, responsiveClass] of responsiveProps) {\n const value = props[key] as Responsive<string>;\n if (!isResponsiveObject(value)) variants[key] = value;\n else {\n // 방향은 base 를 주지 않아도 기본 column 에서 시작한다\n responsiveVars(cssVars, name, key === 'direction' ? { base: 'column', ...value } : value, toCss);\n classes.push(responsiveClass);\n }\n }\n\n return (\n <Component\n ref={ref}\n className={cx(styles.stack(variants), ...classes, className)}\n style={classes.length ? ({ ...cssVars, ...style } as CSSProperties) : style}\n {...rest}\n />\n );\n});\n","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/styles/responsive.css.ts.vanilla.css?source=LmlhcmJsYTAgewogIC0tYmVzdG93LWdhcC1iYXNlOiBpbml0aWFsOwogIC0tYmVzdG93LWdhcC1zbTogaW5pdGlhbDsKICAtLWJlc3Rvdy1nYXAtbWQ6IGluaXRpYWw7CiAgLS1iZXN0b3ctZ2FwLWxnOiBpbml0aWFsOwogIC0tYmVzdG93LWdhcC14bDogaW5pdGlhbDsKICBnYXA6IHZhcigtLWJlc3Rvdy1nYXAtYmFzZSk7Cn0KQG1lZGlhIChtaW4td2lkdGg6IDQwZW0pIHsKICAuaWFyYmxhMCB7CiAgICBnYXA6IHZhcigtLWJlc3Rvdy1nYXAtc20pOwogIH0KfQpAbWVkaWEgKG1pbi13aWR0aDogNDhlbSkgewogIC5pYXJibGEwIHsKICAgIGdhcDogdmFyKC0tYmVzdG93LWdhcC1tZCk7CiAgfQp9CkBtZWRpYSAobWluLXdpZHRoOiA2NGVtKSB7CiAgLmlhcmJsYTAgewogICAgZ2FwOiB2YXIoLS1iZXN0b3ctZ2FwLWxnKTsKICB9Cn0KQG1lZGlhIChtaW4td2lkdGg6IDgwZW0pIHsKICAuaWFyYmxhMCB7CiAgICBnYXA6IHZhcigtLWJlc3Rvdy1nYXAteGwpOwogIH0KfQ';\nimport 'src/components/Stack/Stack.css.ts.vanilla.css?source=#H4sIAAAAAAAAA63VQXLiMBAF0D2n0DIslIKEMGA2c5MpYTdGRJKJJGNIirtP2Y6BFqJDgA2rp49_0zLP_4arz-lyNR2wrx5jmXRrJXYJWyjYznqMaWl4JTO_TNhg1tv3njs_bHzNeCYtpF4WJmG2qJB6iaq0UKU2CL5eiuMWNmAdID0iYqMH3poDuVgnbCPsE-dzcL6ouFuLFPigj_CYxEOM_5D4BeMJiV8xnpJ4hLEg8RvGcxKPMU5JPME4o0cXDBpoHQxvQevgsfNGCyVzw6UH7dqd5s4L65FcnssUjAeLlLyQByZDbnXunLfg0yVi7-dsLhwoafDiqsatSuflYsfTwngw_mIVHdeROobIDSsVcdvOfQ6-AsCXeU0dELYogy_4oDxswKgd8vZ4_Stb70P9iYRrxHFFvEjfj68KXo86YdJIL4WaUdLp65zOrnMqv85tFXLhqw5fgEg7fBl8bBzt8v00ilbRY2gNPYLW0PVbE1RHdyTS-1gDdy5jnbsd-6l15-jenaKbd4ru3qmg_dmliEzgtFQzg78aMinY08mf92gAut9MJLgjv9wtp_v1Y-1Pg_x30HW_VCyh_E74TdtDTrzv5DF9dXZv31jCLX0POdG-49Fj-qr83r6xhFv6HnKifScP2ueturdvLOGWvoec_X_feleolAsAAA';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var responsiveAlign = '_1jz9hj9t';\nexport var responsiveDirection = '_1jz9hj9s';\nexport var responsiveGap = 'iarbla0';\nexport var responsiveJustify = '_1jz9hj9u';\nexport var stack = /* @__PURE__ */ _7a468({defaultClassName:'_1jz9hj90',variantClassNames:{direction:{row:'_1jz9hj91',column:'_1jz9hj92','row-reverse':'_1jz9hj93','column-reverse':'_1jz9hj94'},gap:{'0':'_1jz9hj95','1':'_1jz9hj96','2':'_1jz9hj97','3':'_1jz9hj98','4':'_1jz9hj99','5':'_1jz9hj9a','6':'_1jz9hj9b','8':'_1jz9hj9c','10':'_1jz9hj9d','12':'_1jz9hj9e','16':'_1jz9hj9f'},align:{start:'_1jz9hj9g',center:'_1jz9hj9h',end:'_1jz9hj9i',stretch:'_1jz9hj9j',baseline:'_1jz9hj9k'},justify:{start:'_1jz9hj9l',center:'_1jz9hj9m',end:'_1jz9hj9n',between:'_1jz9hj9o',around:'_1jz9hj9p',evenly:'_1jz9hj9q'},wrap:{true:'_1jz9hj9r'}},defaultVariants:{},compoundVariants:[]});","import { forwardRef, type ElementType, type HTMLAttributes } from 'react';\nimport { cx } from '../../utils/cx';\nimport * as styles from './Typography.css';\n\nexport type TypographyVariant = 'display' | 'h1' | 'h2' | 'h3' | 'h4' | 'body-lg' | 'body' | 'body-sm' | 'caption';\n\nconst defaultElement: Record<TypographyVariant, ElementType> = {\n display: 'h1',\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n 'body-lg': 'p',\n body: 'p',\n 'body-sm': 'p',\n caption: 'span',\n};\n\nexport interface TypographyProps extends Omit<HTMLAttributes<HTMLElement>, 'color'> {\n /** 텍스트 스타일 */\n variant?: TypographyVariant;\n /** 렌더링할 요소. 기본값은 variant 에 따라 결정된다 (h1, p, span 등) */\n as?: ElementType;\n /** 글자 색상 */\n color?: 'default' | 'muted' | 'subtle' | 'primary' | 'danger' | 'success' | 'warning' | 'inherit';\n /** variant 의 기본 굵기를 덮어쓴다 */\n weight?: 'regular' | 'medium' | 'semibold' | 'bold';\n /** 정렬 */\n align?: 'start' | 'center' | 'end';\n /** 한 줄로 자르고 말줄임표를 표시한다 */\n truncate?: boolean;\n}\n\nexport const Typography = /* @__PURE__ */ forwardRef<HTMLElement, TypographyProps>(function Typography(\n { variant = 'body', as, color, weight, align, truncate, className, ...rest },\n ref,\n) {\n const Component = as ?? defaultElement[variant];\n return (\n <Component\n ref={ref}\n className={cx(styles.typography({ variant, color, weight, align, truncate }), className)}\n {...rest}\n />\n );\n});\n","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/Typography/Typography.css.ts.vanilla.css?source=#H4sIAAAAAAAAA82Vy26DMBBF93yFl83CUZK-ydc4eDDTjm00NiVt1X-vQtTUCakAVVW6YeF7jzmyxjB_Rk_oF-I9E8IqNuhysVhnQpTeRVkqi_SaixfFV1JuIETfyiSRQbkwW2cf2Xy_0bLbqGsEfINz5G5d3mxpdnhLC2iqeK67T-TGk-7qhA5k9WM9iWXcPfcQxAgsQ60KdCYXcjFfrMAm1quR1tf_yvp6pPXqwtbLI-ubkdaTpANY_I34we52pB2ZS9jd_YUdg2lI8VQ5BlJb0Kne_Ug9q_9ez3m2ilK7h5F2wV7C7nHstQiXsFOdXeHJ8wncrcnSSA2lauhoXDfDlG3i8QwVw0xoNpEghfQAVDNaxa8ywvZIEAY4rZwB7mHlABaaooAQepwZ4FrFDp3pcVXKoauAMSYxfo_OhIk44E8TcAsaG5vSzxPo5Dt44GkCf8rajt2dllSExuUiRMXp0bheowAXgZOK71XA6SSvu9y_AJfk21xUqDW49RfzHQAR1gHDLmorjND9BSEXzres6nX28Ql_7_cqbQkAAA';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var typography = /* @__PURE__ */ _7a468({defaultClassName:'kiolio0',variantClassNames:{variant:{display:'kiolio1',h1:'kiolio2',h2:'kiolio3',h3:'kiolio4',h4:'kiolio5','body-lg':'kiolio6',body:'kiolio7','body-sm':'kiolio8',caption:'kiolio9'},color:{'default':'kiolioa',muted:'kioliob',subtle:'kiolioc',primary:'kioliod',danger:'kiolioe',success:'kioliof',warning:'kioliog',inherit:'kiolioh'},weight:{regular:'kiolioi',medium:'kiolioj',semibold:'kioliok',bold:'kioliol'},align:{start:'kioliom',center:'kiolion',end:'kiolioo'},truncate:{true:'kioliop'}},defaultVariants:{variant:'body',color:'default'},compoundVariants:[]});","import { forwardRef, type ElementType, type HTMLAttributes } from 'react';\nimport { visuallyHidden } from '../../styles/visuallyHidden.css';\nimport { cx } from '../../utils/cx';\n\nexport interface VisuallyHiddenProps extends HTMLAttributes<HTMLElement> {\n /** 렌더링할 요소 (기본 span) */\n as?: ElementType;\n}\n\n/**\n * 화면에는 보이지 않고 스크린리더만 읽는 글자. 아이콘만 있는 열 머리글(\"작업\"), 보이는 글자에 붙는 보충 설명 등에 쓴다.\n * `display: none`·`hidden` 과 달리 보조기술이 읽는다. hook 이 없어 서버 컴포넌트로도 렌더링된다.\n */\nexport const VisuallyHidden = /* @__PURE__ */ forwardRef<HTMLElement, VisuallyHiddenProps>(function VisuallyHidden(\n { as: Component = 'span', className, ...rest },\n ref,\n) {\n return <Component ref={ref} className={cx(visuallyHidden, className)} {...rest} />;\n});\n"],"mappings":"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","names":["value","value","item","Badge","forwardRef","_7a468","jsx","forwardRef","Card","CardHeader","CardBody","CardFooter","forwardRef","_7a468","jsx","forwardRef","Container","forwardRef","_7a468","jsx","jsxs","forwardRef","DescriptionList","termWidth","item","forwardRef","_7a468","jsx","jsxs","forwardRef","Divider","forwardRef","jsx","jsxs","forwardRef","FormField","label","helperText","forwardRef","jsx","forwardRef","Grid","columns","forwardRef","useId","_7a468","header","label","root","jsx","jsxs","value","forwardRef","Progress","label","useId","root","header","forwardRef","_7a468","responsiveGap","jsx","value","responsiveGap","forwardRef","Stack","forwardRef","_7a468","jsx","forwardRef","Typography","forwardRef","jsx","forwardRef","VisuallyHidden"]}
1
+ {"version":3,"sources":["../src/theme/color.ts","../src/theme/presets.ts","../src/i18n/en.ts","../src/shared.ts","../src/utils/responsive.ts","../src/components/AgreementGroup/agreements.ts","../src/components/Badge/Badge.tsx","../src/components/Badge/Badge.css.ts","../src/components/Card/Card.tsx","../src/components/Card/Card.css.ts","../src/components/Container/Container.tsx","../src/components/Container/Container.css.ts","../src/components/DescriptionList/DescriptionList.tsx","../src/components/DescriptionList/DescriptionList.css.ts","../src/components/Divider/Divider.tsx","../src/components/Divider/Divider.css.ts","../src/components/FormField/FormField.tsx","../src/components/Grid/Grid.tsx","../src/components/Grid/Grid.css.ts","../src/components/Progress/Progress.tsx","../src/components/Progress/Progress.css.ts","../src/components/Stack/Stack.tsx","../src/components/Stack/Stack.css.ts","../src/components/Typography/Typography.tsx","../src/components/Typography/Typography.css.ts","../src/components/VisuallyHidden/VisuallyHidden.tsx"],"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' | 'info';\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 { ThemeInput } from './createTheme';\n\n/**\n * 입력 칸·체크 컨트롤 테두리를 배경과 3:1 이상으로 올리는 테마 입력 (WCAG 1.4.11 비텍스트 대비).\n * 1.x 에서 2.0 기본값을 미리 켜던 묶음이다 — 2.0 부터 기본 테두리(border.input·inputHover·control)가 이 값과 같다.\n *\n * @deprecated 2.0 부터 기본값과 같아 넣지 않아도 된다. 3.0 에서 제거한다(docs/MIGRATION-2.0.md).\n * 객체 값이라 개발 모드 경고(warnOnce)는 내지 않는다 — 읽을 때 경고하려면 getter 가 필요해 tree-shaking 이 깨진다.\n */\n// 색은 palette 를 import 하지 않고 값으로 적는다 — `palette.gray[600]` 같은 속성 읽기는 번들러가 지우지 못해,\n// 이 값을 쓰지 않는 앱에도 tokens 전체가 딸려 왔다(\"앱 기본\" +460 B). palette 와 같은지는 presets.test.ts 가 확인한다.\nexport const strongInputBorders: ThemeInput = /* @__PURE__ */ Object.freeze({\n // 라이트: gray600 / gray700 — 흰 배경 5.18:1, bg.subtle(gray50) 4.91:1\n // 체크 컨트롤: gray600 — 흰 배경 5.18:1\n light: { color: { border: { input: '#666e76', inputHover: '#495057', control: '#666e76' } } },\n // 다크: gray500 / gray300 — gray600 은 bg.subtle(gray900) 위에서 2.98:1 이라 한 단계 밝게. bg.default 8.57:1, bg.subtle 7.43:1\n // 체크 컨트롤: gray500 — 다크 기본값(border.strong)과 같다(이미 8.57:1)\n dark: { color: { border: { input: '#adb5bd', inputHover: '#dee2e6', control: '#adb5bd' } } },\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 decrement: 'Decrease',\n increment: 'Increase',\n steps: 'Progress',\n stepCompleted: 'completed',\n stepInProgress: 'in progress',\n fileSelect: 'Choose files',\n fileDropHint: 'or drag and drop here',\n fileList: 'Selected files',\n fileRemove: (name) => `Remove ${name}`,\n filesSelected: (count) => `${count} ${count === 1 ? 'file' : 'files'} selected`,\n fileRemoved: (name) => `${name} removed`,\n fileTooLarge: (name, maxSize) => `${name}: files must be ${maxSize} or smaller.`,\n fileTypeNotAllowed: (name) => `${name}: this file type is not allowed.`,\n fileTooMany: (maxFiles) => `You can upload up to ${maxFiles} files.`,\n dateRangeStart: 'Start date',\n dateRangeEnd: 'End date',\n dateRangePresets: 'Quick select',\n errorSummaryTitle: (count) => `There ${count === 1 ? 'is 1 problem' : `are ${count} problems`} with your answers`,\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 residentNumber: 'Resident registration number',\n residentNumberFront: 'First 6 digits',\n residentNumberBack: 'Last 7 digits',\n residentNumberBackFirst: 'First digit of the second part',\n residentNumberInvalid: 'This number is not valid. Check the date of birth and the first digit of the second part.',\n residentNumberIncomplete: (digits) => `Enter all ${digits} 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","/**\n * 서버 컴포넌트에서도 부를 수 있는 함수·값·컴포넌트 (hook·Context·Radix 를 쓰지 않는 모듈만).\n * 빌드(ESM)에서 \"use client\" 가 붙지 않는 파일로 나가, Next.js 서버 컴포넌트에서 createTheme() 등을 바로 호출할 수 있다.\n * 여기에 넣는 모듈은 React hook(서버에서도 되는 useId 제외)·createContext·Radix·이벤트 핸들러·useMessages 를 쓰면 안 된다\n * (서버에서 실행됨). 컴포넌트에 이런 것을 더하게 되면 client.ts 로 옮긴다 — 같은 이름을 양쪽에서 export 하면 안 된다.\n */\nexport { vars, themeClass, type ThemeMode, type ThemeName, type ThemeTokens } from './theme/contract.css';\nexport { createIntentColors, contrastRatio, type IntentName } from './theme/color';\nexport {\n createTheme,\n type BestowTheme,\n type DeepPartial,\n type ThemeInput,\n type ThemeOverrides,\n} from './theme/createTheme';\nexport { strongInputBorders } from './theme/presets';\nexport { en } from './i18n/en';\n// 한국 서비스 서식·검증 함수는 @bestow-ui/korean-utils 로 옮겼다(1.6). 예전처럼 여기서도 같은 이름으로 쓸 수 있게 다시 export 한다.\nexport {\n formatBusinessNumber,\n formatKoreanAmount,\n formatKoreanDate,\n formatPhoneNumber,\n isValidBusinessNumber,\n} from '@bestow-ui/korean-utils';\n// 1.7 에 korean-utils 에 추가한 주민번호·마스킹 함수 — react 만 설치한 사용자도 같은 이름으로 쓴다\nexport {\n formatResidentNumber,\n isValidResidentNumber,\n maskCardNumber,\n maskDigits,\n maskName,\n maskPhoneNumber,\n maskResidentNumber,\n parseResidentNumber,\n type ResidentNumberInfo,\n} from '@bestow-ui/korean-utils';\nexport { parseISODate, toISODate } from './utils/date';\nexport { media, type Breakpoint, type Responsive } from './utils/responsive';\nexport {\n composeExtraAddress,\n kakaoPostcodeProvider,\n type AddressProvider,\n type AddressSearchResult,\n} from './components/AddressInput/addressProviders';\nexport { hasAllRequiredAgreements, type AgreementItem } from './components/AgreementGroup/agreements';\n\n// hook·이벤트 핸들러가 없는 표시용 컴포넌트 — 서버 컴포넌트로 렌더링된다(클라이언트 JS 없음, `as` 에 서버 컴포넌트도 넘길 수 있음).\n// playground 첫 페이지가 `as` 에 서버 함수를 넘겨 빌드로 확인한다(클라이언트 컴포넌트면 \"Functions cannot be passed\" 로 실패).\nexport * from './components/Badge';\nexport * from './components/Card';\nexport * from './components/Container';\nexport * from './components/DescriptionList';\nexport {\n dateRangePresets,\n presetRange,\n type DateRange,\n type DateRangePreset,\n} from './components/DateRangePicker/presets';\nexport * from './components/Divider';\nexport * from './components/FormField';\nexport * from './components/Grid';\nexport * from './components/Progress';\nexport * from './components/Skeleton';\nexport * from './components/Stack';\nexport * from './components/Typography';\nexport * from './components/VisuallyHidden';\nexport { focusField } from './utils/focusField';\n","/**\n * 반응형 구간 미디어쿼리(모바일 우선 min-width). `@bestow-ui/tokens` 의 breakpoint(px)를 em 으로 바꾼 값 —\n * em 이라 브라우저 기본 글꼴 크기를 키우면 구간도 따라 바뀐다. 값을 직접 적는다(최상위에서 tokens 객체 속성을 읽으면\n * tokens 전체가 번들에 딸려 온다 — responsive.test.ts 가 tokens 와 같은지 확인).\n *\n * @example style({ flexDirection: 'column', '@media': { [media.md]: { flexDirection: 'row' } } }) // vanilla-extract\n */\nexport const media = {\n sm: '(min-width: 40em)',\n md: '(min-width: 48em)',\n lg: '(min-width: 64em)',\n xl: '(min-width: 80em)',\n} as const;\n\nexport type Breakpoint = keyof typeof media;\n\n/**\n * 한 값 또는 구간별 값. 구간 값은 그 폭 이상에서 쓰이고, 주지 않은 구간은 앞(좁은) 구간 값을 이어받는다.\n *\n * @example direction={{ base: 'column', md: 'row' }} // 768px 미만은 세로, 이상은 가로\n */\nexport type Responsive<T> = T | ({ base?: T } & { [K in Breakpoint]?: T });\n\nconst keys = ['base', 'sm', 'md', 'lg', 'xl'] as const;\n\nexport const isResponsiveObject = <T>(value: Responsive<T> | undefined): value is Exclude<Responsive<T>, T> =>\n typeof value === 'object' && value !== null;\n\n/**\n * 각 구간의 실제 값(앞 구간을 이어받음)을 CSS 변수 `--bestow-<name>-<구간>` 으로 out 에 넣는다.\n * styles/responsive.css.ts 의 responsiveProperty 가 이 변수를 미디어쿼리로 읽는다.\n */\nexport function responsiveVars<T>(\n out: Record<string, string>,\n name: string,\n value: Responsive<T> | undefined,\n toCss: (value: T) => string,\n) {\n if (value === undefined) return;\n const values = (isResponsiveObject(value) ? value : { base: value }) as Partial<Record<(typeof keys)[number], T>>;\n let current: T | undefined;\n for (const key of keys) {\n current = values[key] ?? current;\n if (current !== undefined) out[`--bestow-${name}-${key}`] = toCss(current);\n }\n}\n\n/** space 토큰 키 → 테마 CSS 변수. 변수 이름(--bestow-space-*)이 공개 API 로 고정이라 vars 를 import 하지 않고 적는다 */\nexport const spaceVar = (key: string | number) => `var(--bestow-space-${key})`;\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","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport * as styles from './Badge.css';\n\nexport interface BadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'color'> {\n /** 시각적 스타일 */\n variant?: 'solid' | 'soft' | 'outline';\n /** 의미 색상. 일반 안내는 info (브랜드 색과 따로 파랑) */\n color?: 'primary' | 'neutral' | 'danger' | 'success' | 'warning' | 'info';\n /** 크기 */\n size?: 'sm' | 'md' | 'lg';\n /** 텍스트 앞에 표시할 아이콘 (장식용 — 의미는 텍스트로 전달한다) */\n startIcon?: ReactNode;\n}\n\nexport const Badge = /* @__PURE__ */ forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n { variant, color, size, startIcon, className, children, ...rest },\n ref,\n) {\n return (\n <span ref={ref} className={cx(styles.badge({ variant, color, size }), className)} {...rest}>\n {startIcon && <span className={styles.icon}>{startIcon}</span>}\n {children}\n </span>\n );\n});\n","import 'src/theme/contract.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2aXW_bNhSG7_sriOSmAaRA1Jct9WYrhg7Y0GJogN1TEukIlURDkhunQ__7oA9LtnN4RKEbkGEs0gQxXx2RLz_C55BxLWVL_npDiG0nvGnlk93sWcptJybOu5cf05j4-yNQ4MZkCxZ4MaEuWOLHhIZgSRAT1wFLwpi4cAW2MfHg91AnJj4cjrox8eF60zAm4fWrapblh8auZMWv_RmLmvKlQ2NRmb30aCwqdoBLY9mxAHway8ShKGISRVF0VS5k1dqClXnxbDesamJy80fNW15lrM7In6zOWVLwG4vMn1rEZvt9we3muWl5aZH3RV59-cjSh_73D7JqLTKU2YfcIjc_d2ry8Av5VbaPeUo-cXljkZtPspXkgVUN-f3zjUW6t9sNr3OhrGApKxmTm994-75medWQj7LqQh3yvqjvD4s8fOg-tj_z3aFgtUU-8qqQFpkUL8M3-TduH5uYOPeboOalQtF1mXO_xSRd11F1cd9999RFIvS9eI8p3EGCKLxBgdbU7zSu6kVPPN89tnY9eNhNC0cpKnmWH8qYBIim4WWeyCKLSYioBsUGUhR5xe3HQdZ23weXcGEl65INZuHCmhfsyLu-u99cSrNDzdpcVrZgTfdO1ykbWHB6mesoJU0hn7rV51og9yzN22c7y5tutmXdMLusxjc7rzJ-tOVXXhfsOSbUu3LppChl1jfZo3B5Vst9Jp-qTuLCklYObb3u9LlcFm2-jwm97vJUFrK2k52dccEORRuTW9H_g1XNIWkL3om2IhIMFpWHtnPkVlDhiQDW5NVXXjddJJe6gRvBqsm8epewt45Fxq97P7gDnhDnzVDGFXMN_Shwgg2smZoahiHfhLBobobaNVlnvD6rWMa5y6F4o7Jpa1ntYnLLsiRIMrVQyPTQxOTWS0IhkIB5tT-0WEPOdfZjZzrmzahOZdXWssDi7uu8ZPWz3cgi7-x2g8DnyZJwqgHNfDfbIvK-Cv3IV9s_hT51J-fC11BOtcgSHgqO6Ft-bLHaVvzQ1qyYXPB8j_nQLLwQTu9XjuOTXMeFKfQ0f1Vz81I51YJHPOVY5NEFZeMyVu26wT2akKVu6EJj5lw3vT2JaEpTtVrHglPgyQEuXOEuCacqiG7WIvKx_cqaNoc05U0zGUCDreNBk_tCOM-FMAw8H5HrWDCFnjxwRCawqNdzIRUph9aEk_40F1SNe2J1lVe7yQURRNyBVoQL4fz-aLNxoFFzkp-5oJw3U-jJBSEScFm6VJ4NBeGlkAsn_ehC5PqOA60ceSXk8qI4q5ZXxF6rMwSGoItr4ZlseSHsxepVsHlkWfej24sTuj8Sd3988QfdCe-gh7rdudNRV89QL5_agk91m3ZneMKDHqPu3bs339_ct1_Yrk0cA8kGkg0kG0g2kGwg2UCygWQDyQaSDSQbSDaQbCDZQPIAydRAsoFkA8kGkg0kG0jWhWQa0i2F_mqfQzKGticEVW6YLyAZw20lJIfLkKyMewbJSl49h2Qlqwo91r-G5CX6XA3JoRM5sIOXkLwU7xKSl1h-hmRl3NcIyf1ICiKLUEot4vphv2sKoeEEUzMYwEUDnDbNXuILyKdrjF4k0kufFoFXBx2uMbpvphsEFpm_vdyVYmANR6A-FmF0Stmi14baQxu9yCLhdvivGkwgekOPw0PpEsVFygIG-fMaUbxvpOdbhEYbi0S-2iMYzaHnYZOuUH0bcsGg_v5BVBdJIlzIpR9B9WEo-IFFaLDtFhe1TTC7gwFgn65gXqSZ50OD5LXA_Io1G6D7FQv2Oe4Dq7UW7gcI7Tvjc8rF1cJSAnDkISOAR6Z9YHXWIDxPGrgmaWCSBiZpYJIGJmlgkgbmZN2crJuTdXOybk7Wzcm6OVk3J-v_-5P1n7p9MCNv9zUXvG5OQzl95CWPScbqL3c9P1_AtBKnEaBGkBqDagyrMbDG0BqDaxSvUcBGERuFbBSzUdDGURuH7WXc_g8A97-O3DrQrYXdi-Cthd468K2D33oAroXgmhCuh-G6IK6D4itgfAWOrwJyDSTXgnINLNcBcx00X4ZzLTxfBnQdRMchfT7ZRzF93gRhoD5v2nFUn6F_FayPJ_w4riOxwVN-FNlncsahHbNHfda_AtyX0H0-71-C9-WYqjP_ZYBHYqsRfjXEr8P4RZDHTpI02R47TlrC_flMaRH4Z3bWRP4ZznWgHxnEq24CaKYC0LsAS-kBpGXKBMHaFMGqJMFSmgC5FaCXOEDuBSykEuabASuSCavTCesSCospBeSGgGaSAbkjsJR2mG8JrEg8aKYe5psC65IPi-kH7LaAZkYCuy-wlKSYbwzopinWJSpWpCrwZMWq9X7l3QE0pQGu9CvuD6iyGv_EDQJV7uPH7xAQ8v3N978BBpyHHsNOAAA';\nimport 'src/components/Badge/Badge.css.ts.vanilla.css?source=#H4sIAAAAAAAAA7WWwW6jMBCG7zyFj7sHVwlpd1vyMNVgD2DV2Mg2JdlV332FqQmBJLIPewHJM___8w1Iw9P7Pn97YZV6Jn8zQriwnYRzQYSSQiGtJJ6OGSEgRa2ocNjagjBUDs14XENXkE8wPygt0To9UNsBQ7r_OVZLbTiaguy7E7FaCk6cAWU7MKjcpYEa4KK3K6PpkFa9lN6s0srRClohz6vORYVaUPbSPqCoG3erfarQFrnoWy_wuM1dwaJM3Xj1oqERDifmgig9GOjG4080TjCQ1I-tIK3gXOIx-8qewrhf_LhLYB-10b3ilGmpTUgOXTufcrM0jnjh9yvKL7_vd7j2-33H7_YbTH34VdirD1soV2_Ae9DOiBbMmfpPyXsvpvFQwbRyBqxbifLHMX3pJK4kh4cShyd3TfYWRaawdwZkAllQJJHNMfFkQbIlgygyDqpGkwD2LUjiCiHxWN-KLVUZRWV7xtDaBKygSOKaY-LBgmRLxqLIBjBKqDqBLCiSyOaYeLIg2ZLxKDKhKp2A5duTmKaAeCDfv6VBT9MKNS-jfNf5HdwB5-MEptV8c-_ml91nxZ91z3xOT_Y6tNqGPv_30Hob-hodeogMte11aPPwN2e8U9sYoT4KsjtmX_8Ai2Cozx8JAAA';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var badge = /* @__PURE__ */ _7a468({defaultClassName:'_1295cfn4',variantClassNames:{variant:{solid:'_1295cfn5',soft:'_1295cfn6',outline:'_1295cfn7'},color:{primary:'_1295cfn8',neutral:'_1295cfn9',danger:'_1295cfna',success:'_1295cfnb',warning:'_1295cfnc',info:'_1295cfnd'},size:{sm:'_1295cfne',md:'_1295cfnf',lg:'_1295cfng'}},defaultVariants:{variant:'soft',color:'neutral',size:'md'},compoundVariants:[]});\nexport var icon = '_1295cfnh';","import { forwardRef, type ElementType, type HTMLAttributes } from 'react';\nimport type { PolymorphicComponent } from '../../utils/polymorphic';\nimport { cx } from '../../utils/cx';\nimport * as styles from './Card.css';\n\nexport interface CardProps extends HTMLAttributes<HTMLElement> {\n /** 시각적 스타일. outline 은 테두리, elevated 는 그림자(다크 모드는 가장자리 ring 포함), soft 는 옅은 배경 */\n variant?: 'outline' | 'elevated' | 'soft';\n /** 안쪽 여백 (sm 16px, md 24px, lg 32px). 이미지를 가장자리까지 붙이려면 none */\n padding?: 'none' | 'sm' | 'md' | 'lg';\n /** 렌더링할 요소 (기본 div). 목록이면 li, 독립된 콘텐츠면 article 등 */\n as?: ElementType;\n}\n\n/** 배경·테두리·radius·padding 을 가진 컨테이너. 자식 사이 간격은 16px. */\nexport const Card = /* @__PURE__ */ forwardRef<HTMLElement, CardProps>(function Card(\n { variant, padding, as: Component = 'div', className, ...rest },\n ref,\n) {\n return <Component ref={ref} className={cx(styles.card({ variant, padding }), className)} {...rest} />;\n}) as PolymorphicComponent<CardProps, HTMLElement>;\n\nexport type CardSectionProps = HTMLAttributes<HTMLDivElement>;\n\n/** 제목·설명 영역. Typography 와 함께 쓴다. */\nexport const CardHeader = /* @__PURE__ */ forwardRef<HTMLDivElement, CardSectionProps>(function CardHeader(\n { className, ...rest },\n ref,\n) {\n return <div ref={ref} className={cx(styles.header, className)} {...rest} />;\n});\n\n/** 본문 영역 */\nexport const CardBody = /* @__PURE__ */ forwardRef<HTMLDivElement, CardSectionProps>(function CardBody(\n { className, ...rest },\n ref,\n) {\n return <div ref={ref} className={cx(styles.body, className)} {...rest} />;\n});\n\n/** 버튼 등 동작 영역. 오른쪽 정렬 */\nexport const CardFooter = /* @__PURE__ */ forwardRef<HTMLDivElement, CardSectionProps>(function CardFooter(\n { className, ...rest },\n ref,\n) {\n return <div ref={ref} className={cx(styles.footer, className)} {...rest} />;\n});\n","import 'src/theme/contract.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2aXW_bNhSG7_sriOSmAaRA1Jct9WYrhg7Y0GJogN1TEukIlURDkhunQ__7oA9LtnN4RKEbkGEs0gQxXx2RLz_C55BxLWVL_npDiG0nvGnlk93sWcptJybOu5cf05j4-yNQ4MZkCxZ4MaEuWOLHhIZgSRAT1wFLwpi4cAW2MfHg91AnJj4cjrox8eF60zAm4fWrapblh8auZMWv_RmLmvKlQ2NRmb30aCwqdoBLY9mxAHway8ShKGISRVF0VS5k1dqClXnxbDesamJy80fNW15lrM7In6zOWVLwG4vMn1rEZvt9we3muWl5aZH3RV59-cjSh_73D7JqLTKU2YfcIjc_d2ry8Av5VbaPeUo-cXljkZtPspXkgVUN-f3zjUW6t9sNr3OhrGApKxmTm994-75medWQj7LqQh3yvqjvD4s8fOg-tj_z3aFgtUU-8qqQFpkUL8M3-TduH5uYOPeboOalQtF1mXO_xSRd11F1cd9999RFIvS9eI8p3EGCKLxBgdbU7zSu6kVPPN89tnY9eNhNC0cpKnmWH8qYBIim4WWeyCKLSYioBsUGUhR5xe3HQdZ23weXcGEl65INZuHCmhfsyLu-u99cSrNDzdpcVrZgTfdO1ykbWHB6mesoJU0hn7rV51og9yzN22c7y5tutmXdMLusxjc7rzJ-tOVXXhfsOSbUu3LppChl1jfZo3B5Vst9Jp-qTuLCklYObb3u9LlcFm2-jwm97vJUFrK2k52dccEORRuTW9H_g1XNIWkL3om2IhIMFpWHtnPkVlDhiQDW5NVXXjddJJe6gRvBqsm8epewt45Fxq97P7gDnhDnzVDGFXMN_Shwgg2smZoahiHfhLBobobaNVlnvD6rWMa5y6F4o7Jpa1ntYnLLsiRIMrVQyPTQxOTWS0IhkIB5tT-0WEPOdfZjZzrmzahOZdXWssDi7uu8ZPWz3cgi7-x2g8DnyZJwqgHNfDfbIvK-Cv3IV9s_hT51J-fC11BOtcgSHgqO6Ft-bLHaVvzQ1qyYXPB8j_nQLLwQTu9XjuOTXMeFKfQ0f1Vz81I51YJHPOVY5NEFZeMyVu26wT2akKVu6EJj5lw3vT2JaEpTtVrHglPgyQEuXOEuCacqiG7WIvKx_cqaNoc05U0zGUCDreNBk_tCOM-FMAw8H5HrWDCFnjxwRCawqNdzIRUph9aEk_40F1SNe2J1lVe7yQURRNyBVoQL4fz-aLNxoFFzkp-5oJw3U-jJBSEScFm6VJ4NBeGlkAsn_ehC5PqOA60ceSXk8qI4q5ZXxF6rMwSGoItr4ZlseSHsxepVsHlkWfej24sTuj8Sd3988QfdCe-gh7rdudNRV89QL5_agk91m3ZneMKDHqPu3bs339_ct1_Yrk0cA8kGkg0kG0g2kGwg2UCygWQDyQaSDSQbSDaQbCDZQPIAydRAsoFkA8kGkg0kG0jWhWQa0i2F_mqfQzKGticEVW6YLyAZw20lJIfLkKyMewbJSl49h2Qlqwo91r-G5CX6XA3JoRM5sIOXkLwU7xKSl1h-hmRl3NcIyf1ICiKLUEot4vphv2sKoeEEUzMYwEUDnDbNXuILyKdrjF4k0kufFoFXBx2uMbpvphsEFpm_vdyVYmANR6A-FmF0Stmi14baQxu9yCLhdvivGkwgekOPw0PpEsVFygIG-fMaUbxvpOdbhEYbi0S-2iMYzaHnYZOuUH0bcsGg_v5BVBdJIlzIpR9B9WEo-IFFaLDtFhe1TTC7gwFgn65gXqSZ50OD5LXA_Io1G6D7FQv2Oe4Dq7UW7gcI7Tvjc8rF1cJSAnDkISOAR6Z9YHXWIDxPGrgmaWCSBiZpYJIGJmlgkgbmZN2crJuTdXOybk7Wzcm6OVk3J-v_-5P1n7p9MCNv9zUXvG5OQzl95CWPScbqL3c9P1_AtBKnEaBGkBqDagyrMbDG0BqDaxSvUcBGERuFbBSzUdDGURuH7WXc_g8A97-O3DrQrYXdi-Cthd468K2D33oAroXgmhCuh-G6IK6D4itgfAWOrwJyDSTXgnINLNcBcx00X4ZzLTxfBnQdRMchfT7ZRzF93gRhoD5v2nFUn6F_FayPJ_w4riOxwVN-FNlncsahHbNHfda_AtyX0H0-71-C9-WYqjP_ZYBHYqsRfjXEr8P4RZDHTpI02R47TlrC_flMaRH4Z3bWRP4ZznWgHxnEq24CaKYC0LsAS-kBpGXKBMHaFMGqJMFSmgC5FaCXOEDuBSykEuabASuSCavTCesSCospBeSGgGaSAbkjsJR2mG8JrEg8aKYe5psC65IPi-kH7LaAZkYCuy-wlKSYbwzopinWJSpWpCrwZMWq9X7l3QE0pQGu9CvuD6iyGv_EDQJV7uPH7xAQ8v3N978BBpyHHsNOAAA';\nimport 'src/components/Card/Card.css.ts.vanilla.css?source=LmRudWYxdTAgewogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBnYXA6IHZhcigtLWJlc3Rvdy1zcGFjZS00KTsKICBtaW4td2lkdGg6IDA7CiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tYmVzdG93LXJhZGl1cy1sZyk7CiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmVzdG93LWNvbG9yLWJnLWRlZmF1bHQpOwogIGNvbG9yOiB2YXIoLS1iZXN0b3ctY29sb3ItZmctZGVmYXVsdCk7CiAgZm9udC1mYW1pbHk6IHZhcigtLWJlc3Rvdy1mb250LWZhbWlseS1zYW5zKTsKfQouZG51ZjF1MSB7CiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1iZXN0b3ctY29sb3ItYm9yZGVyLWRlZmF1bHQpOwp9Ci5kbnVmMXUyIHsKICBib3gtc2hhZG93OiB2YXIoLS1iZXN0b3ctc2hhZG93LW1kKTsKfQouZG51ZjF1MyB7CiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmVzdG93LWNvbG9yLWJnLXN1YnRsZSk7Cn0KLmRudWYxdTQgewogIHBhZGRpbmc6IDA7Cn0KLmRudWYxdTUgewogIHBhZGRpbmc6IHZhcigtLWJlc3Rvdy1zcGFjZS00KTsKfQouZG51ZjF1NiB7CiAgcGFkZGluZzogdmFyKC0tYmVzdG93LXNwYWNlLTYpOwp9Ci5kbnVmMXU3IHsKICBwYWRkaW5nOiB2YXIoLS1iZXN0b3ctc3BhY2UtOCk7Cn0KLmRudWYxdTggewogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBnYXA6IHZhcigtLWJlc3Rvdy1zcGFjZS0xKTsKfQouZG51ZjF1OSB7CiAgZm9udC1zaXplOiB2YXIoLS1iZXN0b3ctZm9udC1zaXplLXNtKTsKICBsaW5lLWhlaWdodDogdmFyKC0tYmVzdG93LWZvbnQtbGluZS1oZWlnaHQtbm9ybWFsKTsKfQouZG51ZjF1YSB7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgZ2FwOiB2YXIoLS1iZXN0b3ctc3BhY2UtMik7Cn0';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var body = 'dnuf1u9';\nexport var card = /* @__PURE__ */ _7a468({defaultClassName:'dnuf1u0',variantClassNames:{variant:{outline:'dnuf1u1',elevated:'dnuf1u2',soft:'dnuf1u3'},padding:{none:'dnuf1u4',sm:'dnuf1u5',md:'dnuf1u6',lg:'dnuf1u7'}},defaultVariants:{variant:'outline',padding:'md'},compoundVariants:[]});\nexport var footer = 'dnuf1ua';\nexport var header = 'dnuf1u8';","import { forwardRef, type ElementType, type HTMLAttributes } from 'react';\nimport type { PolymorphicComponent } from '../../utils/polymorphic';\nimport { cx } from '../../utils/cx';\nimport * as styles from './Container.css';\n\nexport interface ContainerProps extends HTMLAttributes<HTMLElement> {\n /** 렌더링할 요소 (페이지 본문이면 'main') */\n as?: ElementType;\n /** 최대 폭 — sm 640 · md 768 · lg 1024(기본) · xl 1280px(구간 폭과 같음, 기본 글꼴 크기를 따름), full 은 제한 없음 */\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n /** 좌우 여백을 없앤다 (기본은 좁은 화면 16px, md 구간부터 24px) */\n flush?: boolean;\n}\n\n/** 내용을 가운데에 두고 최대 폭과 좌우 여백을 정하는 페이지 틀 */\nexport const Container = /* @__PURE__ */ forwardRef<HTMLElement, ContainerProps>(function Container(\n { as: Component = 'div', size, flush, className, ...rest },\n ref,\n) {\n return <Component ref={ref} className={cx(styles.container({ size, flush }), className)} {...rest} />;\n}) as PolymorphicComponent<ContainerProps, HTMLElement>;\n","import 'src/theme/contract.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2aXW_bNhSG7_sriOSmAaRA1Jct9WYrhg7Y0GJogN1TEukIlURDkhunQ__7oA9LtnN4RKEbkGEs0gQxXx2RLz_C55BxLWVL_npDiG0nvGnlk93sWcptJybOu5cf05j4-yNQ4MZkCxZ4MaEuWOLHhIZgSRAT1wFLwpi4cAW2MfHg91AnJj4cjrox8eF60zAm4fWrapblh8auZMWv_RmLmvKlQ2NRmb30aCwqdoBLY9mxAHway8ShKGISRVF0VS5k1dqClXnxbDesamJy80fNW15lrM7In6zOWVLwG4vMn1rEZvt9we3muWl5aZH3RV59-cjSh_73D7JqLTKU2YfcIjc_d2ry8Av5VbaPeUo-cXljkZtPspXkgVUN-f3zjUW6t9sNr3OhrGApKxmTm994-75medWQj7LqQh3yvqjvD4s8fOg-tj_z3aFgtUU-8qqQFpkUL8M3-TduH5uYOPeboOalQtF1mXO_xSRd11F1cd9999RFIvS9eI8p3EGCKLxBgdbU7zSu6kVPPN89tnY9eNhNC0cpKnmWH8qYBIim4WWeyCKLSYioBsUGUhR5xe3HQdZ23weXcGEl65INZuHCmhfsyLu-u99cSrNDzdpcVrZgTfdO1ykbWHB6mesoJU0hn7rV51og9yzN22c7y5tutmXdMLusxjc7rzJ-tOVXXhfsOSbUu3LppChl1jfZo3B5Vst9Jp-qTuLCklYObb3u9LlcFm2-jwm97vJUFrK2k52dccEORRuTW9H_g1XNIWkL3om2IhIMFpWHtnPkVlDhiQDW5NVXXjddJJe6gRvBqsm8epewt45Fxq97P7gDnhDnzVDGFXMN_Shwgg2smZoahiHfhLBobobaNVlnvD6rWMa5y6F4o7Jpa1ntYnLLsiRIMrVQyPTQxOTWS0IhkIB5tT-0WEPOdfZjZzrmzahOZdXWssDi7uu8ZPWz3cgi7-x2g8DnyZJwqgHNfDfbIvK-Cv3IV9s_hT51J-fC11BOtcgSHgqO6Ft-bLHaVvzQ1qyYXPB8j_nQLLwQTu9XjuOTXMeFKfQ0f1Vz81I51YJHPOVY5NEFZeMyVu26wT2akKVu6EJj5lw3vT2JaEpTtVrHglPgyQEuXOEuCacqiG7WIvKx_cqaNoc05U0zGUCDreNBk_tCOM-FMAw8H5HrWDCFnjxwRCawqNdzIRUph9aEk_40F1SNe2J1lVe7yQURRNyBVoQL4fz-aLNxoFFzkp-5oJw3U-jJBSEScFm6VJ4NBeGlkAsn_ehC5PqOA60ceSXk8qI4q5ZXxF6rMwSGoItr4ZlseSHsxepVsHlkWfej24sTuj8Sd3988QfdCe-gh7rdudNRV89QL5_agk91m3ZneMKDHqPu3bs339_ct1_Yrk0cA8kGkg0kG0g2kGwg2UCygWQDyQaSDSQbSDaQbCDZQPIAydRAsoFkA8kGkg0kG0jWhWQa0i2F_mqfQzKGticEVW6YLyAZw20lJIfLkKyMewbJSl49h2Qlqwo91r-G5CX6XA3JoRM5sIOXkLwU7xKSl1h-hmRl3NcIyf1ICiKLUEot4vphv2sKoeEEUzMYwEUDnDbNXuILyKdrjF4k0kufFoFXBx2uMbpvphsEFpm_vdyVYmANR6A-FmF0Stmi14baQxu9yCLhdvivGkwgekOPw0PpEsVFygIG-fMaUbxvpOdbhEYbi0S-2iMYzaHnYZOuUH0bcsGg_v5BVBdJIlzIpR9B9WEo-IFFaLDtFhe1TTC7gwFgn65gXqSZ50OD5LXA_Io1G6D7FQv2Oe4Dq7UW7gcI7Tvjc8rF1cJSAnDkISOAR6Z9YHXWIDxPGrgmaWCSBiZpYJIGJmlgkgbmZN2crJuTdXOybk7Wzcm6OVk3J-v_-5P1n7p9MCNv9zUXvG5OQzl95CWPScbqL3c9P1_AtBKnEaBGkBqDagyrMbDG0BqDaxSvUcBGERuFbBSzUdDGURuH7WXc_g8A97-O3DrQrYXdi-Cthd468K2D33oAroXgmhCuh-G6IK6D4itgfAWOrwJyDSTXgnINLNcBcx00X4ZzLTxfBnQdRMchfT7ZRzF93gRhoD5v2nFUn6F_FayPJ_w4riOxwVN-FNlncsahHbNHfda_AtyX0H0-71-C9-WYqjP_ZYBHYqsRfjXEr8P4RZDHTpI02R47TlrC_flMaRH4Z3bWRP4ZznWgHxnEq24CaKYC0LsAS-kBpGXKBMHaFMGqJMFSmgC5FaCXOEDuBSykEuabASuSCavTCesSCospBeSGgGaSAbkjsJR2mG8JrEg8aKYe5psC65IPi-kH7LaAZkYCuy-wlKSYbwzopinWJSpWpCrwZMWq9X7l3QE0pQGu9CvuD6iyGv_EDQJV7uPH7xAQ8v3N978BBpyHHsNOAAA';\nimport 'src/components/Container/Container.css.ts.vanilla.css?source=LmI0MDRubjAgewogIHdpZHRoOiAxMDAlOwogIG1hcmdpbi1pbmxpbmU6IGF1dG87CiAgcGFkZGluZy1pbmxpbmU6IHZhcigtLWJlc3Rvdy1zcGFjZS00KTsKfQouYjQwNG5uMSB7CiAgbWF4LXdpZHRoOiA0MHJlbTsKfQouYjQwNG5uMiB7CiAgbWF4LXdpZHRoOiA0OHJlbTsKfQouYjQwNG5uMyB7CiAgbWF4LXdpZHRoOiA2NHJlbTsKfQouYjQwNG5uNCB7CiAgbWF4LXdpZHRoOiA4MHJlbTsKfQouYjQwNG5uNSB7CiAgbWF4LXdpZHRoOiBub25lOwp9Ci5iNDA0bm42IHsKICBwYWRkaW5nLWlubGluZTogMDsKfQpAbWVkaWEgKG1pbi13aWR0aDogNDhlbSkgewogIC5iNDA0bm4wIHsKICAgIHBhZGRpbmctaW5saW5lOiB2YXIoLS1iZXN0b3ctc3BhY2UtNik7CiAgfQogIC5iNDA0bm42IHsKICAgIHBhZGRpbmctaW5saW5lOiAwOwogIH0KfQ';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var container = /* @__PURE__ */ _7a468({defaultClassName:'b404nn0',variantClassNames:{size:{sm:'b404nn1',md:'b404nn2',lg:'b404nn3',xl:'b404nn4',full:'b404nn5'},flush:{true:'b404nn6'}},defaultVariants:{size:'lg'},compoundVariants:[]});","import { assignInlineVars } from '@vanilla-extract/dynamic';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport * as styles from './DescriptionList.css';\n\nexport interface DescriptionListItem {\n /** 이름 (dt) */\n term: ReactNode;\n /** 값 (dd) */\n description: ReactNode;\n}\n\nexport interface DescriptionListProps extends HTMLAttributes<HTMLDListElement> {\n /** 이름–값 목록 */\n items: DescriptionListItem[];\n /** horizontal(기본): 이름 왼쪽·값 오른쪽. vertical: 이름 위·값 아래(좁은 곳·긴 값) */\n layout?: 'horizontal' | 'vertical';\n /** horizontal 일 때 이름 열의 폭 (기본 30%) — 예: \"8rem\" */\n termWidth?: string;\n /** 항목 사이에 구분선 */\n divided?: boolean;\n}\n\n/**\n * 이름–값 목록(주문 상세의 고객·연락처·금액 등). `<dl>` 안에 항목마다 `<div><dt/><dd/></div>` 로 그려 스크린리더가 쌍으로 읽는다.\n * hook 이 없어 서버 컴포넌트로도 렌더링된다.\n */\nexport const DescriptionList = /* @__PURE__ */ forwardRef<HTMLDListElement, DescriptionListProps>(\n function DescriptionList({ items, layout = 'horizontal', termWidth, divided, className, style, ...rest }, ref) {\n return (\n <dl\n ref={ref}\n className={cx(styles.root, className)}\n style={termWidth ? { ...assignInlineVars({ [styles.termWidth]: termWidth }), ...style } : style}\n {...rest}\n >\n {items.map((item, index) => (\n <div key={index} className={styles.item({ layout, divided })}>\n <dt className={styles.term}>{item.term}</dt>\n <dd className={styles.description}>{item.description}</dd>\n </div>\n ))}\n </dl>\n );\n },\n);\n","import 'src/theme/contract.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2aXW_bNhSG7_sriOSmAaRA1Jct9WYrhg7Y0GJogN1TEukIlURDkhunQ__7oA9LtnN4RKEbkGEs0gQxXx2RLz_C55BxLWVL_npDiG0nvGnlk93sWcptJybOu5cf05j4-yNQ4MZkCxZ4MaEuWOLHhIZgSRAT1wFLwpi4cAW2MfHg91AnJj4cjrox8eF60zAm4fWrapblh8auZMWv_RmLmvKlQ2NRmb30aCwqdoBLY9mxAHway8ShKGISRVF0VS5k1dqClXnxbDesamJy80fNW15lrM7In6zOWVLwG4vMn1rEZvt9we3muWl5aZH3RV59-cjSh_73D7JqLTKU2YfcIjc_d2ry8Av5VbaPeUo-cXljkZtPspXkgVUN-f3zjUW6t9sNr3OhrGApKxmTm994-75medWQj7LqQh3yvqjvD4s8fOg-tj_z3aFgtUU-8qqQFpkUL8M3-TduH5uYOPeboOalQtF1mXO_xSRd11F1cd9999RFIvS9eI8p3EGCKLxBgdbU7zSu6kVPPN89tnY9eNhNC0cpKnmWH8qYBIim4WWeyCKLSYioBsUGUhR5xe3HQdZ23weXcGEl65INZuHCmhfsyLu-u99cSrNDzdpcVrZgTfdO1ykbWHB6mesoJU0hn7rV51og9yzN22c7y5tutmXdMLusxjc7rzJ-tOVXXhfsOSbUu3LppChl1jfZo3B5Vst9Jp-qTuLCklYObb3u9LlcFm2-jwm97vJUFrK2k52dccEORRuTW9H_g1XNIWkL3om2IhIMFpWHtnPkVlDhiQDW5NVXXjddJJe6gRvBqsm8epewt45Fxq97P7gDnhDnzVDGFXMN_Shwgg2smZoahiHfhLBobobaNVlnvD6rWMa5y6F4o7Jpa1ntYnLLsiRIMrVQyPTQxOTWS0IhkIB5tT-0WEPOdfZjZzrmzahOZdXWssDi7uu8ZPWz3cgi7-x2g8DnyZJwqgHNfDfbIvK-Cv3IV9s_hT51J-fC11BOtcgSHgqO6Ft-bLHaVvzQ1qyYXPB8j_nQLLwQTu9XjuOTXMeFKfQ0f1Vz81I51YJHPOVY5NEFZeMyVu26wT2akKVu6EJj5lw3vT2JaEpTtVrHglPgyQEuXOEuCacqiG7WIvKx_cqaNoc05U0zGUCDreNBk_tCOM-FMAw8H5HrWDCFnjxwRCawqNdzIRUph9aEk_40F1SNe2J1lVe7yQURRNyBVoQL4fz-aLNxoFFzkp-5oJw3U-jJBSEScFm6VJ4NBeGlkAsn_ehC5PqOA60ceSXk8qI4q5ZXxF6rMwSGoItr4ZlseSHsxepVsHlkWfej24sTuj8Sd3988QfdCe-gh7rdudNRV89QL5_agk91m3ZneMKDHqPu3bs339_ct1_Yrk0cA8kGkg0kG0g2kGwg2UCygWQDyQaSDSQbSDaQbCDZQPIAydRAsoFkA8kGkg0kG0jWhWQa0i2F_mqfQzKGticEVW6YLyAZw20lJIfLkKyMewbJSl49h2Qlqwo91r-G5CX6XA3JoRM5sIOXkLwU7xKSl1h-hmRl3NcIyf1ICiKLUEot4vphv2sKoeEEUzMYwEUDnDbNXuILyKdrjF4k0kufFoFXBx2uMbpvphsEFpm_vdyVYmANR6A-FmF0Stmi14baQxu9yCLhdvivGkwgekOPw0PpEsVFygIG-fMaUbxvpOdbhEYbi0S-2iMYzaHnYZOuUH0bcsGg_v5BVBdJIlzIpR9B9WEo-IFFaLDtFhe1TTC7gwFgn65gXqSZ50OD5LXA_Io1G6D7FQv2Oe4Dq7UW7gcI7Tvjc8rF1cJSAnDkISOAR6Z9YHXWIDxPGrgmaWCSBiZpYJIGJmlgkgbmZN2crJuTdXOybk7Wzcm6OVk3J-v_-5P1n7p9MCNv9zUXvG5OQzl95CWPScbqL3c9P1_AtBKnEaBGkBqDagyrMbDG0BqDaxSvUcBGERuFbBSzUdDGURuH7WXc_g8A97-O3DrQrYXdi-Cthd468K2D33oAroXgmhCuh-G6IK6D4itgfAWOrwJyDSTXgnINLNcBcx00X4ZzLTxfBnQdRMchfT7ZRzF93gRhoD5v2nFUn6F_FayPJ_w4riOxwVN-FNlncsahHbNHfda_AtyX0H0-71-C9-WYqjP_ZYBHYqsRfjXEr8P4RZDHTpI02R47TlrC_flMaRH4Z3bWRP4ZznWgHxnEq24CaKYC0LsAS-kBpGXKBMHaFMGqJMFSmgC5FaCXOEDuBSykEuabASuSCavTCesSCospBeSGgGaSAbkjsJR2mG8JrEg8aKYe5psC65IPi-kH7LaAZkYCuy-wlKSYbwzopinWJSpWpCrwZMWq9X7l3QE0pQGu9CvuD6iyGv_EDQJV7uPH7xAQ8v3N978BBpyHHsNOAAA';\nimport 'src/components/DescriptionList/DescriptionList.css.ts.vanilla.css?source=Ll8xNGcwb3Q0MSB7CiAgLS1fMTRnMG90NDA6IDMwJTsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgbWFyZ2luOiAwOwogIGZvbnQtZmFtaWx5OiB2YXIoLS1iZXN0b3ctZm9udC1mYW1pbHktc2Fucyk7CiAgZm9udC1zaXplOiB2YXIoLS1iZXN0b3ctZm9udC1zaXplLXNtKTsKICBsaW5lLWhlaWdodDogdmFyKC0tYmVzdG93LWZvbnQtbGluZS1oZWlnaHQtbm9ybWFsKTsKfQouXzE0ZzBvdDQyIHsKICBtaW4td2lkdGg6IDA7Cn0KLl8xNGcwb3Q0MyB7CiAgZGlzcGxheTogZ3JpZDsKICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLV8xNGcwb3Q0MCkgbWlubWF4KDAsIDFmcik7CiAgY29sdW1uLWdhcDogdmFyKC0tYmVzdG93LXNwYWNlLTQpOwogIHBhZGRpbmctYmxvY2s6IHZhcigtLWJlc3Rvdy1zcGFjZS0yKTsKfQouXzE0ZzBvdDQ0IHsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgZ2FwOiB2YXIoLS1iZXN0b3ctc3BhY2UtMSk7CiAgcGFkZGluZy1ibG9jazogdmFyKC0tYmVzdG93LXNwYWNlLTIpOwp9Ci5fMTRnMG90NDU6bm90KDpsYXN0LWNoaWxkKSB7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJlc3Rvdy1jb2xvci1ib3JkZXItZGVmYXVsdCk7Cn0KLl8xNGcwb3Q0NiB7CiAgbWFyZ2luOiAwOwogIGZvbnQtd2VpZ2h0OiB2YXIoLS1iZXN0b3ctZm9udC13ZWlnaHQtbWVkaXVtKTsKICBjb2xvcjogdmFyKC0tYmVzdG93LWNvbG9yLWZnLW11dGVkKTsKICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKfQouXzE0ZzBvdDQ3IHsKICBtYXJnaW46IDA7CiAgY29sb3I6IHZhcigtLWJlc3Rvdy1jb2xvci1mZy1kZWZhdWx0KTsKICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKfQ';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var description = '_14g0ot47';\nexport var item = /* @__PURE__ */ _7a468({defaultClassName:'_14g0ot42',variantClassNames:{layout:{horizontal:'_14g0ot43',vertical:'_14g0ot44'},divided:{true:'_14g0ot45'}},defaultVariants:{layout:'horizontal'},compoundVariants:[]});\nexport var root = '_14g0ot41';\nexport var term = '_14g0ot46';\nexport var termWidth = 'var(--_14g0ot40)';","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport * as styles from './Divider.css';\n\nexport interface DividerProps extends HTMLAttributes<HTMLDivElement> {\n /** 방향. vertical 은 flex 행 안에서 부모 높이를 채운다 */\n orientation?: 'horizontal' | 'vertical';\n /** 시각적 구분만 하고 의미가 없으면 true — 스크린리더에서 숨긴다 */\n decorative?: boolean;\n /**\n * 가운데에 표시할 텍스트 (예: \"또는\"). horizontal 에서만 쓴다.\n * separator 역할의 자식은 스크린리더가 읽지 않으므로, 텍스트가 있으면 선만 숨기고 텍스트는 읽히게 둔다.\n */\n children?: ReactNode;\n}\n\nexport const Divider = /* @__PURE__ */ forwardRef<HTMLDivElement, DividerProps>(function Divider(\n { orientation = 'horizontal', decorative, className, children, ...rest },\n ref,\n) {\n if (children && orientation === 'horizontal') {\n return (\n <div ref={ref} className={cx(styles.labeled, className)} {...rest}>\n <span className={styles.line} aria-hidden />\n {children}\n <span className={styles.line} aria-hidden />\n </div>\n );\n }\n\n const a11y = decorative\n ? { role: 'none' }\n : { role: 'separator', 'aria-orientation': orientation === 'vertical' ? ('vertical' as const) : undefined };\n return <div ref={ref} className={cx(styles.divider({ orientation }), className)} {...a11y} {...rest} />;\n});\n","import 'src/theme/contract.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2aXW_bNhSG7_sriOSmAaRA1Jct9WYrhg7Y0GJogN1TEukIlURDkhunQ__7oA9LtnN4RKEbkGEs0gQxXx2RLz_C55BxLWVL_npDiG0nvGnlk93sWcptJybOu5cf05j4-yNQ4MZkCxZ4MaEuWOLHhIZgSRAT1wFLwpi4cAW2MfHg91AnJj4cjrox8eF60zAm4fWrapblh8auZMWv_RmLmvKlQ2NRmb30aCwqdoBLY9mxAHway8ShKGISRVF0VS5k1dqClXnxbDesamJy80fNW15lrM7In6zOWVLwG4vMn1rEZvt9we3muWl5aZH3RV59-cjSh_73D7JqLTKU2YfcIjc_d2ry8Av5VbaPeUo-cXljkZtPspXkgVUN-f3zjUW6t9sNr3OhrGApKxmTm994-75medWQj7LqQh3yvqjvD4s8fOg-tj_z3aFgtUU-8qqQFpkUL8M3-TduH5uYOPeboOalQtF1mXO_xSRd11F1cd9999RFIvS9eI8p3EGCKLxBgdbU7zSu6kVPPN89tnY9eNhNC0cpKnmWH8qYBIim4WWeyCKLSYioBsUGUhR5xe3HQdZ23weXcGEl65INZuHCmhfsyLu-u99cSrNDzdpcVrZgTfdO1ykbWHB6mesoJU0hn7rV51og9yzN22c7y5tutmXdMLusxjc7rzJ-tOVXXhfsOSbUu3LppChl1jfZo3B5Vst9Jp-qTuLCklYObb3u9LlcFm2-jwm97vJUFrK2k52dccEORRuTW9H_g1XNIWkL3om2IhIMFpWHtnPkVlDhiQDW5NVXXjddJJe6gRvBqsm8epewt45Fxq97P7gDnhDnzVDGFXMN_Shwgg2smZoahiHfhLBobobaNVlnvD6rWMa5y6F4o7Jpa1ntYnLLsiRIMrVQyPTQxOTWS0IhkIB5tT-0WEPOdfZjZzrmzahOZdXWssDi7uu8ZPWz3cgi7-x2g8DnyZJwqgHNfDfbIvK-Cv3IV9s_hT51J-fC11BOtcgSHgqO6Ft-bLHaVvzQ1qyYXPB8j_nQLLwQTu9XjuOTXMeFKfQ0f1Vz81I51YJHPOVY5NEFZeMyVu26wT2akKVu6EJj5lw3vT2JaEpTtVrHglPgyQEuXOEuCacqiG7WIvKx_cqaNoc05U0zGUCDreNBk_tCOM-FMAw8H5HrWDCFnjxwRCawqNdzIRUph9aEk_40F1SNe2J1lVe7yQURRNyBVoQL4fz-aLNxoFFzkp-5oJw3U-jJBSEScFm6VJ4NBeGlkAsn_ehC5PqOA60ceSXk8qI4q5ZXxF6rMwSGoItr4ZlseSHsxepVsHlkWfej24sTuj8Sd3988QfdCe-gh7rdudNRV89QL5_agk91m3ZneMKDHqPu3bs339_ct1_Yrk0cA8kGkg0kG0g2kGwg2UCygWQDyQaSDSQbSDaQbCDZQPIAydRAsoFkA8kGkg0kG0jWhWQa0i2F_mqfQzKGticEVW6YLyAZw20lJIfLkKyMewbJSl49h2Qlqwo91r-G5CX6XA3JoRM5sIOXkLwU7xKSl1h-hmRl3NcIyf1ICiKLUEot4vphv2sKoeEEUzMYwEUDnDbNXuILyKdrjF4k0kufFoFXBx2uMbpvphsEFpm_vdyVYmANR6A-FmF0Stmi14baQxu9yCLhdvivGkwgekOPw0PpEsVFygIG-fMaUbxvpOdbhEYbi0S-2iMYzaHnYZOuUH0bcsGg_v5BVBdJIlzIpR9B9WEo-IFFaLDtFhe1TTC7gwFgn65gXqSZ50OD5LXA_Io1G6D7FQv2Oe4Dq7UW7gcI7Tvjc8rF1cJSAnDkISOAR6Z9YHXWIDxPGrgmaWCSBiZpYJIGJmlgkgbmZN2crJuTdXOybk7Wzcm6OVk3J-v_-5P1n7p9MCNv9zUXvG5OQzl95CWPScbqL3c9P1_AtBKnEaBGkBqDagyrMbDG0BqDaxSvUcBGERuFbBSzUdDGURuH7WXc_g8A97-O3DrQrYXdi-Cthd468K2D33oAroXgmhCuh-G6IK6D4itgfAWOrwJyDSTXgnINLNcBcx00X4ZzLTxfBnQdRMchfT7ZRzF93gRhoD5v2nFUn6F_FayPJ_w4riOxwVN-FNlncsahHbNHfda_AtyX0H0-71-C9-WYqjP_ZYBHYqsRfjXEr8P4RZDHTpI02R47TlrC_flMaRH4Z3bWRP4ZznWgHxnEq24CaKYC0LsAS-kBpGXKBMHaFMGqJMFSmgC5FaCXOEDuBSykEuabASuSCavTCesSCospBeSGgGaSAbkjsJR2mG8JrEg8aKYe5psC65IPi-kH7LaAZkYCuy-wlKSYbwzopinWJSpWpCrwZMWq9X7l3QE0pQGu9CvuD6iyGv_EDQJV7uPH7xAQ8v3N978BBpyHHsNOAAA';\nimport 'src/components/Divider/Divider.css.ts.vanilla.css?source=Ll8xdDNncTh2MCB7CiAgZmxleC1zaHJpbms6IDA7CiAgYm9yZGVyOiBub25lOwogIG1hcmdpbjogMDsKICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZXN0b3ctY29sb3ItYm9yZGVyLWRlZmF1bHQpOwp9Ci5fMXQzZ3E4djEgewogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMXB4Owp9Ci5fMXQzZ3E4djIgewogIHdpZHRoOiAxcHg7CiAgYWxpZ24tc2VsZjogc3RyZXRjaDsKICBtaW4taGVpZ2h0OiAxZW07Cn0KLl8xdDNncTh2MyB7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGdhcDogdmFyKC0tYmVzdG93LXNwYWNlLTMpOwogIHdpZHRoOiAxMDAlOwogIGZvbnQtZmFtaWx5OiB2YXIoLS1iZXN0b3ctZm9udC1mYW1pbHktc2Fucyk7CiAgZm9udC1zaXplOiB2YXIoLS1iZXN0b3ctZm9udC1zaXplLXhzKTsKICBsaW5lLWhlaWdodDogdmFyKC0tYmVzdG93LWZvbnQtbGluZS1oZWlnaHQtdGlnaHQpOwogIGNvbG9yOiB2YXIoLS1iZXN0b3ctY29sb3ItZmctc3VidGxlKTsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Ci5fMXQzZ3E4djQgewogIGZsZXg6IDE7CiAgaGVpZ2h0OiAxcHg7CiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmVzdG93LWNvbG9yLWJvcmRlci1kZWZhdWx0KTsKfQ';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var divider = /* @__PURE__ */ _7a468({defaultClassName:'_1t3gq8v0',variantClassNames:{orientation:{horizontal:'_1t3gq8v1',vertical:'_1t3gq8v2'}},defaultVariants:{orientation:'horizontal'},compoundVariants:[]});\nexport var labeled = '_1t3gq8v3';\nexport var line = '_1t3gq8v4';","import { forwardRef, useId, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport * as fieldStyles from '../Input/Input.css';\n\n/**\n * FormField 가 자식에게 넘기는 연결 속성. 입력 요소(또는 입력 역할을 하는 요소)에 그대로 펼쳐 넣는다.\n * role=\"group\" 처럼 aria-invalid·aria-required 를 받지 못하는 역할이면 그 둘은 빼고 안의 컨트롤에 준다(axe aria-allowed-attr).\n */\nexport interface FormFieldControlProps {\n id: string;\n 'aria-describedby'?: string;\n 'aria-invalid'?: true;\n 'aria-required'?: true;\n}\n\n/** render 함수의 둘째 인자 — 입력에 펼치지 않는 정보 */\nexport interface FormFieldMeta {\n /** 레이블 요소의 id — label 로 이름을 받을 수 없는 요소(div role=\"combobox\" 등)는 aria-labelledby 에 넣는다 */\n labelId?: string;\n /** 도움말 요소의 id */\n helperId?: string;\n}\n\nexport interface FormFieldProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'id'> {\n /** 입력 위에 표시할 레이블 (짧게 — 보조 설명은 helperText) */\n label?: ReactNode;\n /** 입력 아래 도움말. error 일 때는 오류 메시지로 표시된다 */\n helperText?: ReactNode;\n /** 오류 상태 — 자식에 aria-invalid 를 넘기고 helperText 를 오류 색으로 */\n error?: boolean;\n /** 필수 — 레이블에 * 를 붙이고 자식에 aria-required 를 넘긴다(네이티브 검증이 필요하면 입력에 required 를 직접) */\n required?: boolean;\n /** 입력 요소의 id. 생략하면 만든다 (ErrorSummary 링크·focusField 가 이 id 로 찾아간다) */\n id?: string;\n /** 부모 너비를 꽉 채운다 */\n fullWidth?: boolean;\n /**\n * 입력을 그리는 함수. 첫째 인자를 입력 요소에 그대로 펼쳐 넣는다.\n * @example {(field) => <input {...field} />}\n * @example {(field, { labelId }) => <CustomSelect {...field} aria-labelledby={labelId} />}\n */\n children: (control: FormFieldControlProps, meta: FormFieldMeta) => ReactNode;\n}\n\n/**\n * 직접 만든 입력·다른 라이브러리 입력에 TextField 와 같은 레이블·도움말·오류 연결을 붙인다.\n * hook 은 useId 뿐이라 서버 컴포넌트에서도 쓸 수 있다.\n */\nexport const FormField = /* @__PURE__ */ forwardRef<HTMLDivElement, FormFieldProps>(function FormField(\n { label, helperText, error, required, id, fullWidth, className, children, ...rest },\n ref,\n) {\n const generatedId = useId();\n const controlId = id ?? generatedId;\n const labelId = label ? `${controlId}-label` : undefined;\n const helperId = helperText ? `${controlId}-helper` : undefined;\n\n return (\n <div ref={ref} className={cx(fieldStyles.field, fullWidth && fieldStyles.fieldFullWidth, className)} {...rest}>\n {label && (\n <label id={labelId} htmlFor={controlId} className={fieldStyles.label}>\n {label}\n {required && (\n <span className={fieldStyles.requiredMark} aria-hidden>\n *\n </span>\n )}\n </label>\n )}\n {children(\n {\n id: controlId,\n 'aria-describedby': helperId,\n 'aria-invalid': error || undefined,\n 'aria-required': required || undefined,\n },\n { labelId, helperId },\n )}\n {helperText && (\n <p id={helperId} className={fieldStyles.helperText({ error })}>\n {helperText}\n </p>\n )}\n </div>\n );\n});\n","import type { space } from '@bestow-ui/tokens';\nimport { forwardRef, type CSSProperties, type ElementType, type HTMLAttributes } from 'react';\nimport type { PolymorphicComponent } from '../../utils/polymorphic';\nimport { cx } from '../../utils/cx';\nimport { responsiveVars, spaceVar, type Responsive } from '../../utils/responsive';\nimport * as styles from './Grid.css';\n\nexport interface GridProps extends HTMLAttributes<HTMLElement> {\n /** 렌더링할 요소 (목록이면 'ul') */\n as?: ElementType;\n /** 열 개수 (같은 폭). 구간별로: `{ base: 1, md: 2, lg: 3 }`. 생략하면 한 열 */\n columns?: Responsive<number>;\n /**\n * 칸의 최소 폭(CSS 길이, 예: '220px'·'14rem'). 주면 화면 폭에 맞춰 열 개수를 자동으로 정한다(columns 대신).\n * 화면이 이 폭보다 좁으면 칸이 화면 폭으로 줄어든다(가로 스크롤 없음).\n */\n minItemWidth?: string;\n /** 칸 사이 간격 (space 토큰 키). 구간별 값도 받는다 */\n gap?: Responsive<keyof typeof space>;\n}\n\nconst repeatColumns = (count: number) => `repeat(${count}, minmax(0, 1fr))`;\n\nexport const Grid = /* @__PURE__ */ forwardRef<HTMLElement, GridProps>(function Grid(\n { as: Component = 'div', columns, minItemWidth, gap, className, style, ...rest },\n ref,\n) {\n const responsive: Record<string, string> = {};\n if (minItemWidth)\n responsive['--bestow-grid-columns-base'] = `repeat(auto-fill, minmax(min(100%, ${minItemWidth}), 1fr))`;\n else responsiveVars(responsive, 'grid-columns', columns, repeatColumns);\n responsiveVars(responsive, 'gap', gap, spaceVar);\n\n return (\n <Component\n ref={ref}\n className={cx(styles.grid, styles.columns, gap !== undefined && styles.responsiveGap, className)}\n style={{ ...responsive, ...style } as CSSProperties}\n {...rest}\n />\n );\n}) as PolymorphicComponent<GridProps, HTMLElement>;\n","import 'src/styles/responsive.css.ts.vanilla.css?source=LmlhcmJsYTAgewogIC0tYmVzdG93LWdhcC1iYXNlOiBpbml0aWFsOwogIC0tYmVzdG93LWdhcC1zbTogaW5pdGlhbDsKICAtLWJlc3Rvdy1nYXAtbWQ6IGluaXRpYWw7CiAgLS1iZXN0b3ctZ2FwLWxnOiBpbml0aWFsOwogIC0tYmVzdG93LWdhcC14bDogaW5pdGlhbDsKICBnYXA6IHZhcigtLWJlc3Rvdy1nYXAtYmFzZSk7Cn0KQG1lZGlhIChtaW4td2lkdGg6IDQwZW0pIHsKICAuaWFyYmxhMCB7CiAgICBnYXA6IHZhcigtLWJlc3Rvdy1nYXAtc20pOwogIH0KfQpAbWVkaWEgKG1pbi13aWR0aDogNDhlbSkgewogIC5pYXJibGEwIHsKICAgIGdhcDogdmFyKC0tYmVzdG93LWdhcC1tZCk7CiAgfQp9CkBtZWRpYSAobWluLXdpZHRoOiA2NGVtKSB7CiAgLmlhcmJsYTAgewogICAgZ2FwOiB2YXIoLS1iZXN0b3ctZ2FwLWxnKTsKICB9Cn0KQG1lZGlhIChtaW4td2lkdGg6IDgwZW0pIHsKICAuaWFyYmxhMCB7CiAgICBnYXA6IHZhcigtLWJlc3Rvdy1nYXAteGwpOwogIH0KfQ';\nimport 'src/components/Grid/Grid.css.ts.vanilla.css?source=Ll8xdHlsdjltMCB7CiAgZGlzcGxheTogZ3JpZDsKICBtaW4td2lkdGg6IDA7Cn0KLl8xdHlsdjltMSB7CiAgLS1iZXN0b3ctZ3JpZC1jb2x1bW5zLWJhc2U6IGluaXRpYWw7CiAgLS1iZXN0b3ctZ3JpZC1jb2x1bW5zLXNtOiBpbml0aWFsOwogIC0tYmVzdG93LWdyaWQtY29sdW1ucy1tZDogaW5pdGlhbDsKICAtLWJlc3Rvdy1ncmlkLWNvbHVtbnMtbGc6IGluaXRpYWw7CiAgLS1iZXN0b3ctZ3JpZC1jb2x1bW5zLXhsOiBpbml0aWFsOwogIGdyaWQtdGVtcGxhdGUtY29sdW1uczogdmFyKC0tYmVzdG93LWdyaWQtY29sdW1ucy1iYXNlKTsKfQpAbWVkaWEgKG1pbi13aWR0aDogNDBlbSkgewogIC5fMXR5bHY5bTEgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiB2YXIoLS1iZXN0b3ctZ3JpZC1jb2x1bW5zLXNtKTsKICB9Cn0KQG1lZGlhIChtaW4td2lkdGg6IDQ4ZW0pIHsKICAuXzF0eWx2OW0xIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogdmFyKC0tYmVzdG93LWdyaWQtY29sdW1ucy1tZCk7CiAgfQp9CkBtZWRpYSAobWluLXdpZHRoOiA2NGVtKSB7CiAgLl8xdHlsdjltMSB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLWJlc3Rvdy1ncmlkLWNvbHVtbnMtbGcpOwogIH0KfQpAbWVkaWEgKG1pbi13aWR0aDogODBlbSkgewogIC5fMXR5bHY5bTEgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiB2YXIoLS1iZXN0b3ctZ3JpZC1jb2x1bW5zLXhsKTsKICB9Cn0';\nexport var columns = '_1tylv9m1';\nexport var grid = '_1tylv9m0';\nexport var responsiveGap = 'iarbla0';","import { forwardRef, useId, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport * as styles from './Progress.css';\n\nexport interface ProgressProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'> {\n /** 현재 값 (0 ~ max). 생략하거나 null 이면 진행률을 모르는 상태(indeterminate)로 움직이는 막대를 보여 준다 */\n value?: number | null;\n /** 최댓값 */\n max?: number;\n /** 막대 위에 보이는 레이블. progressbar 의 이름이 된다 */\n label?: ReactNode;\n /** 레이블이 없을 때 스크린리더용 이름 */\n 'aria-label'?: string;\n /** 오른쪽에 값 텍스트(기본 \"42%\")를 보여 준다 */\n showValue?: boolean;\n /** 값 텍스트 형식. 화면 표시와 스크린리더(aria-valuetext)에 함께 쓴다 (예: (v, max) => `${v}/${max}개`) */\n formatValue?: (value: number, max: number) => string;\n /** 막대 두께 (sm 4px · md 8px · lg 12px) */\n size?: 'sm' | 'md' | 'lg';\n /** 의미 색상 */\n color?: 'primary' | 'neutral' | 'success' | 'warning' | 'danger';\n}\n\nconst defaultFormat = (value: number, max: number) => `${Math.round((value / max) * 100)}%`;\n\nexport const Progress = /* @__PURE__ */ forwardRef<HTMLDivElement, ProgressProps>(function Progress(\n {\n value,\n max = 100,\n label,\n 'aria-label': ariaLabel,\n showValue,\n formatValue = defaultFormat,\n size,\n color,\n className,\n ...rest\n },\n ref,\n) {\n const labelId = useId();\n const isIndeterminate = value === undefined || value === null;\n const safeMax = max > 0 ? max : 100;\n const clamped = isIndeterminate ? 0 : Math.min(safeMax, Math.max(0, value));\n const valueText = isIndeterminate ? undefined : formatValue(clamped, safeMax);\n\n return (\n <div ref={ref} className={cx(styles.root, className)} {...rest}>\n {(label || (showValue && valueText)) && (\n <div className={styles.header}>\n {label && (\n <span id={labelId} className={styles.label}>\n {label}\n </span>\n )}\n {/* 스크린리더는 progressbar 의 aria-valuetext 로 읽으므로 화면용 텍스트는 숨긴다 */}\n {showValue && valueText && (\n <span className={styles.value} aria-hidden>\n {valueText}\n </span>\n )}\n </div>\n )}\n <div\n role=\"progressbar\"\n aria-labelledby={label ? labelId : undefined}\n aria-label={label ? undefined : ariaLabel}\n aria-valuemin={0}\n aria-valuemax={safeMax}\n aria-valuenow={isIndeterminate ? undefined : clamped}\n aria-valuetext={valueText}\n className={styles.track({ size })}\n >\n <div\n className={styles.indicator({ color })}\n data-state={isIndeterminate ? 'indeterminate' : clamped >= safeMax ? 'complete' : 'loading'}\n style={isIndeterminate ? undefined : { width: `${(clamped / safeMax) * 100}%` }}\n />\n </div>\n </div>\n );\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-2aXW_bNhSG7_sriOSmAaRA1Jct9WYrhg7Y0GJogN1TEukIlURDkhunQ__7oA9LtnN4RKEbkGEs0gQxXx2RLz_C55BxLWVL_npDiG0nvGnlk93sWcptJybOu5cf05j4-yNQ4MZkCxZ4MaEuWOLHhIZgSRAT1wFLwpi4cAW2MfHg91AnJj4cjrox8eF60zAm4fWrapblh8auZMWv_RmLmvKlQ2NRmb30aCwqdoBLY9mxAHway8ShKGISRVF0VS5k1dqClXnxbDesamJy80fNW15lrM7In6zOWVLwG4vMn1rEZvt9we3muWl5aZH3RV59-cjSh_73D7JqLTKU2YfcIjc_d2ry8Av5VbaPeUo-cXljkZtPspXkgVUN-f3zjUW6t9sNr3OhrGApKxmTm994-75medWQj7LqQh3yvqjvD4s8fOg-tj_z3aFgtUU-8qqQFpkUL8M3-TduH5uYOPeboOalQtF1mXO_xSRd11F1cd9999RFIvS9eI8p3EGCKLxBgdbU7zSu6kVPPN89tnY9eNhNC0cpKnmWH8qYBIim4WWeyCKLSYioBsUGUhR5xe3HQdZ23weXcGEl65INZuHCmhfsyLu-u99cSrNDzdpcVrZgTfdO1ykbWHB6mesoJU0hn7rV51og9yzN22c7y5tutmXdMLusxjc7rzJ-tOVXXhfsOSbUu3LppChl1jfZo3B5Vst9Jp-qTuLCklYObb3u9LlcFm2-jwm97vJUFrK2k52dccEORRuTW9H_g1XNIWkL3om2IhIMFpWHtnPkVlDhiQDW5NVXXjddJJe6gRvBqsm8epewt45Fxq97P7gDnhDnzVDGFXMN_Shwgg2smZoahiHfhLBobobaNVlnvD6rWMa5y6F4o7Jpa1ntYnLLsiRIMrVQyPTQxOTWS0IhkIB5tT-0WEPOdfZjZzrmzahOZdXWssDi7uu8ZPWz3cgi7-x2g8DnyZJwqgHNfDfbIvK-Cv3IV9s_hT51J-fC11BOtcgSHgqO6Ft-bLHaVvzQ1qyYXPB8j_nQLLwQTu9XjuOTXMeFKfQ0f1Vz81I51YJHPOVY5NEFZeMyVu26wT2akKVu6EJj5lw3vT2JaEpTtVrHglPgyQEuXOEuCacqiG7WIvKx_cqaNoc05U0zGUCDreNBk_tCOM-FMAw8H5HrWDCFnjxwRCawqNdzIRUph9aEk_40F1SNe2J1lVe7yQURRNyBVoQL4fz-aLNxoFFzkp-5oJw3U-jJBSEScFm6VJ4NBeGlkAsn_ehC5PqOA60ceSXk8qI4q5ZXxF6rMwSGoItr4ZlseSHsxepVsHlkWfej24sTuj8Sd3988QfdCe-gh7rdudNRV89QL5_agk91m3ZneMKDHqPu3bs339_ct1_Yrk0cA8kGkg0kG0g2kGwg2UCygWQDyQaSDSQbSDaQbCDZQPIAydRAsoFkA8kGkg0kG0jWhWQa0i2F_mqfQzKGticEVW6YLyAZw20lJIfLkKyMewbJSl49h2Qlqwo91r-G5CX6XA3JoRM5sIOXkLwU7xKSl1h-hmRl3NcIyf1ICiKLUEot4vphv2sKoeEEUzMYwEUDnDbNXuILyKdrjF4k0kufFoFXBx2uMbpvphsEFpm_vdyVYmANR6A-FmF0Stmi14baQxu9yCLhdvivGkwgekOPw0PpEsVFygIG-fMaUbxvpOdbhEYbi0S-2iMYzaHnYZOuUH0bcsGg_v5BVBdJIlzIpR9B9WEo-IFFaLDtFhe1TTC7gwFgn65gXqSZ50OD5LXA_Io1G6D7FQv2Oe4Dq7UW7gcI7Tvjc8rF1cJSAnDkISOAR6Z9YHXWIDxPGrgmaWCSBiZpYJIGJmlgkgbmZN2crJuTdXOybk7Wzcm6OVk3J-v_-5P1n7p9MCNv9zUXvG5OQzl95CWPScbqL3c9P1_AtBKnEaBGkBqDagyrMbDG0BqDaxSvUcBGERuFbBSzUdDGURuH7WXc_g8A97-O3DrQrYXdi-Cthd468K2D33oAroXgmhCuh-G6IK6D4itgfAWOrwJyDSTXgnINLNcBcx00X4ZzLTxfBnQdRMchfT7ZRzF93gRhoD5v2nFUn6F_FayPJ_w4riOxwVN-FNlncsahHbNHfda_AtyX0H0-71-C9-WYqjP_ZYBHYqsRfjXEr8P4RZDHTpI02R47TlrC_flMaRH4Z3bWRP4ZznWgHxnEq24CaKYC0LsAS-kBpGXKBMHaFMGqJMFSmgC5FaCXOEDuBSykEuabASuSCavTCesSCospBeSGgGaSAbkjsJR2mG8JrEg8aKYe5psC65IPi-kH7LaAZkYCuy-wlKSYbwzopinWJSpWpCrwZMWq9X7l3QE0pQGu9CvuD6iyGv_EDQJV7uPH7xAQ8v3N978BBpyHHsNOAAA';\nimport 'src/components/Progress/Progress.css.ts.vanilla.css?source=#H4sIAAAAAAAAA41Vy27bMBC8-yuIAgXiAw05cZpUQYECvfQDeiuKYCWu5G0oUl0u_WiRfy9IxY2lOI1hwIY5q5nZ5ZBa3C9l8_CrKAr1Z6aUodBb2Jeqsbi7m6n8qw0x1kLelar2NnYuIS30pdoAX2hdYRC_1aGHGvXlPKFbMrIu1bIo3mca70Q30JHdTx46QnQAF-Z3s8fZ4uBqedoVWGqdJsEulKqCgJYcJuBnDELNXtfeCTop1eCpQtki_tf21fyfz0C_8ZTLtK5DlwuToF4jtWs5VXoEa0nf47Yuc1u5cvsqx4DoDg3FQbT21vOkNK_pptUGG4h2InSVhTrglpwml20FAZZSQRT_JmkXBc3zZDbABE60ix0y1aUSqKIFTgthJLzKwr0PNOSG0YLQJm-S3yA31m9LtSZjhm2Z5KXybJA1g6EYJuaGRd1Ea7OzCuqHln10Rr_eS3XcS-V3OqzBJAvkAooq8mfZ716ZQ4iVWBzP9jq3eMjAqt-N0A8j9HaC3ozQ5eUEvh3Dp4dCbo1MkhBhcIdJ50mO2zCRIYHaee7AzhVCQO2jjEW_GxBI8RD89I6cQUHuyIHgux_Z0NMmrQY74KiDQfN-2XJf3RSglotVGOjJJQVFriFHgiOpj5nurI3rmTrgvRbcTbIN55M4jMJgT5BU55OEWNcYwgmS-nySLbAj154gMeeTGHAt8jPH53RHgLroGRvkoBlNrNHozh8OX_o_zwKTjI2z4_xwjT6OCt_MxYvjOwrHgVQp30NNsi9VsbgeZJ69N56T5dxgKBXU6baYWF49qfko6SYr84EN3pJRX8BtIHzDnbz0__TUsYIGk14Vx-ZeTv4rtWubjuCT178Elo90LAcAAA';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var header = '_1tvkq001';\nexport var indicator = /* @__PURE__ */ _7a468({defaultClassName:'_1tvkq008',variantClassNames:{color:{primary:'_1tvkq009',neutral:'_1tvkq00a',success:'_1tvkq00b',warning:'_1tvkq00c',danger:'_1tvkq00d'}},defaultVariants:{color:'primary'},compoundVariants:[]});\nexport var label = '_1tvkq002';\nexport var root = '_1tvkq000';\nexport var track = /* @__PURE__ */ _7a468({defaultClassName:'_1tvkq004',variantClassNames:{size:{sm:'_1tvkq005',md:'_1tvkq006',lg:'_1tvkq007'}},defaultVariants:{size:'md'},compoundVariants:[]});\nexport var value = '_1tvkq003';","import type { space } from '@bestow-ui/tokens';\nimport { forwardRef, type CSSProperties, type ElementType, type HTMLAttributes } from 'react';\nimport type { PolymorphicComponent } from '../../utils/polymorphic';\nimport { cx } from '../../utils/cx';\nimport { isResponsiveObject, responsiveVars, spaceVar, type Responsive } from '../../utils/responsive';\nimport * as styles from './Stack.css';\n\ntype Direction = 'row' | 'column' | 'row-reverse' | 'column-reverse';\ntype Align = 'start' | 'center' | 'end' | 'stretch' | 'baseline';\ntype Justify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';\ntype SpaceKey = keyof typeof space;\n\nexport interface StackProps extends HTMLAttributes<HTMLElement> {\n /** 렌더링할 요소 */\n as?: ElementType;\n /** 배치 방향 (기본 column). 구간별로: `{ base: 'column', md: 'row' }` */\n direction?: Responsive<Direction>;\n /** 자식 사이 간격 (space 토큰 키). 구간별로: `{ base: 3, lg: 6 }` */\n gap?: Responsive<SpaceKey>;\n /** 교차축 정렬 (align-items). 구간별 값도 받는다 */\n align?: Responsive<Align>;\n /** 주축 정렬 (justify-content). 구간별 값도 받는다 */\n justify?: Responsive<Justify>;\n /** 줄바꿈 허용 */\n wrap?: boolean;\n}\n\nconst flexValues: Record<string, string> = {\n start: 'flex-start',\n end: 'flex-end',\n between: 'space-between',\n around: 'space-around',\n evenly: 'space-evenly',\n};\nconst flexValue = (value: string) => flexValues[value] ?? value;\n\n// 구간별 값을 받는 속성: [prop, CSS 변수 이름, 값 → CSS, 반응형 클래스]\nconst responsiveProps = [\n ['direction', 'stack-direction', String, styles.responsiveDirection],\n ['gap', 'gap', spaceVar, styles.responsiveGap],\n ['align', 'stack-align', flexValue, styles.responsiveAlign],\n ['justify', 'stack-justify', flexValue, styles.responsiveJustify],\n] as const;\n\nexport const Stack = /* @__PURE__ */ forwardRef<HTMLElement, StackProps>(function Stack(\n { as: Component = 'div', direction, gap, align, justify, wrap, className, style, ...rest },\n ref,\n) {\n // 한 값이면 지금처럼 recipe 클래스, 구간별 값이면 반응형 클래스 + 인라인 CSS 변수(그 속성은 recipe 에 넘기지 않음)\n const props: Record<string, unknown> = { direction: direction ?? 'column', gap, align, justify };\n const variants: Record<string, unknown> = { wrap };\n const classes: string[] = [];\n const cssVars: Record<string, string> = {};\n for (const [key, name, toCss, responsiveClass] of responsiveProps) {\n const value = props[key] as Responsive<string>;\n if (!isResponsiveObject(value)) variants[key] = value;\n else {\n // 방향은 base 를 주지 않아도 기본 column 에서 시작한다\n responsiveVars(cssVars, name, key === 'direction' ? { base: 'column', ...value } : value, toCss);\n classes.push(responsiveClass);\n }\n }\n\n return (\n <Component\n ref={ref}\n className={cx(styles.stack(variants), ...classes, className)}\n style={classes.length ? ({ ...cssVars, ...style } as CSSProperties) : style}\n {...rest}\n />\n );\n}) as PolymorphicComponent<StackProps, HTMLElement>;\n","import 'src/theme/contract.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2aXW_bNhSG7_sriOSmAaRA1Jct9WYrhg7Y0GJogN1TEukIlURDkhunQ__7oA9LtnN4RKEbkGEs0gQxXx2RLz_C55BxLWVL_npDiG0nvGnlk93sWcptJybOu5cf05j4-yNQ4MZkCxZ4MaEuWOLHhIZgSRAT1wFLwpi4cAW2MfHg91AnJj4cjrox8eF60zAm4fWrapblh8auZMWv_RmLmvKlQ2NRmb30aCwqdoBLY9mxAHway8ShKGISRVF0VS5k1dqClXnxbDesamJy80fNW15lrM7In6zOWVLwG4vMn1rEZvt9we3muWl5aZH3RV59-cjSh_73D7JqLTKU2YfcIjc_d2ry8Av5VbaPeUo-cXljkZtPspXkgVUN-f3zjUW6t9sNr3OhrGApKxmTm994-75medWQj7LqQh3yvqjvD4s8fOg-tj_z3aFgtUU-8qqQFpkUL8M3-TduH5uYOPeboOalQtF1mXO_xSRd11F1cd9999RFIvS9eI8p3EGCKLxBgdbU7zSu6kVPPN89tnY9eNhNC0cpKnmWH8qYBIim4WWeyCKLSYioBsUGUhR5xe3HQdZ23weXcGEl65INZuHCmhfsyLu-u99cSrNDzdpcVrZgTfdO1ykbWHB6mesoJU0hn7rV51og9yzN22c7y5tutmXdMLusxjc7rzJ-tOVXXhfsOSbUu3LppChl1jfZo3B5Vst9Jp-qTuLCklYObb3u9LlcFm2-jwm97vJUFrK2k52dccEORRuTW9H_g1XNIWkL3om2IhIMFpWHtnPkVlDhiQDW5NVXXjddJJe6gRvBqsm8epewt45Fxq97P7gDnhDnzVDGFXMN_Shwgg2smZoahiHfhLBobobaNVlnvD6rWMa5y6F4o7Jpa1ntYnLLsiRIMrVQyPTQxOTWS0IhkIB5tT-0WEPOdfZjZzrmzahOZdXWssDi7uu8ZPWz3cgi7-x2g8DnyZJwqgHNfDfbIvK-Cv3IV9s_hT51J-fC11BOtcgSHgqO6Ft-bLHaVvzQ1qyYXPB8j_nQLLwQTu9XjuOTXMeFKfQ0f1Vz81I51YJHPOVY5NEFZeMyVu26wT2akKVu6EJj5lw3vT2JaEpTtVrHglPgyQEuXOEuCacqiG7WIvKx_cqaNoc05U0zGUCDreNBk_tCOM-FMAw8H5HrWDCFnjxwRCawqNdzIRUph9aEk_40F1SNe2J1lVe7yQURRNyBVoQL4fz-aLNxoFFzkp-5oJw3U-jJBSEScFm6VJ4NBeGlkAsn_ehC5PqOA60ceSXk8qI4q5ZXxF6rMwSGoItr4ZlseSHsxepVsHlkWfej24sTuj8Sd3988QfdCe-gh7rdudNRV89QL5_agk91m3ZneMKDHqPu3bs339_ct1_Yrk0cA8kGkg0kG0g2kGwg2UCygWQDyQaSDSQbSDaQbCDZQPIAydRAsoFkA8kGkg0kG0jWhWQa0i2F_mqfQzKGticEVW6YLyAZw20lJIfLkKyMewbJSl49h2Qlqwo91r-G5CX6XA3JoRM5sIOXkLwU7xKSl1h-hmRl3NcIyf1ICiKLUEot4vphv2sKoeEEUzMYwEUDnDbNXuILyKdrjF4k0kufFoFXBx2uMbpvphsEFpm_vdyVYmANR6A-FmF0Stmi14baQxu9yCLhdvivGkwgekOPw0PpEsVFygIG-fMaUbxvpOdbhEYbi0S-2iMYzaHnYZOuUH0bcsGg_v5BVBdJIlzIpR9B9WEo-IFFaLDtFhe1TTC7gwFgn65gXqSZ50OD5LXA_Io1G6D7FQv2Oe4Dq7UW7gcI7Tvjc8rF1cJSAnDkISOAR6Z9YHXWIDxPGrgmaWCSBiZpYJIGJmlgkgbmZN2crJuTdXOybk7Wzcm6OVk3J-v_-5P1n7p9MCNv9zUXvG5OQzl95CWPScbqL3c9P1_AtBKnEaBGkBqDagyrMbDG0BqDaxSvUcBGERuFbBSzUdDGURuH7WXc_g8A97-O3DrQrYXdi-Cthd468K2D33oAroXgmhCuh-G6IK6D4itgfAWOrwJyDSTXgnINLNcBcx00X4ZzLTxfBnQdRMchfT7ZRzF93gRhoD5v2nFUn6F_FayPJ_w4riOxwVN-FNlncsahHbNHfda_AtyX0H0-71-C9-WYqjP_ZYBHYqsRfjXEr8P4RZDHTpI02R47TlrC_flMaRH4Z3bWRP4ZznWgHxnEq24CaKYC0LsAS-kBpGXKBMHaFMGqJMFSmgC5FaCXOEDuBSykEuabASuSCavTCesSCospBeSGgGaSAbkjsJR2mG8JrEg8aKYe5psC65IPi-kH7LaAZkYCuy-wlKSYbwzopinWJSpWpCrwZMWq9X7l3QE0pQGu9CvuD6iyGv_EDQJV7uPH7xAQ8v3N978BBpyHHsNOAAA';\nimport 'src/styles/responsive.css.ts.vanilla.css?source=LmlhcmJsYTAgewogIC0tYmVzdG93LWdhcC1iYXNlOiBpbml0aWFsOwogIC0tYmVzdG93LWdhcC1zbTogaW5pdGlhbDsKICAtLWJlc3Rvdy1nYXAtbWQ6IGluaXRpYWw7CiAgLS1iZXN0b3ctZ2FwLWxnOiBpbml0aWFsOwogIC0tYmVzdG93LWdhcC14bDogaW5pdGlhbDsKICBnYXA6IHZhcigtLWJlc3Rvdy1nYXAtYmFzZSk7Cn0KQG1lZGlhIChtaW4td2lkdGg6IDQwZW0pIHsKICAuaWFyYmxhMCB7CiAgICBnYXA6IHZhcigtLWJlc3Rvdy1nYXAtc20pOwogIH0KfQpAbWVkaWEgKG1pbi13aWR0aDogNDhlbSkgewogIC5pYXJibGEwIHsKICAgIGdhcDogdmFyKC0tYmVzdG93LWdhcC1tZCk7CiAgfQp9CkBtZWRpYSAobWluLXdpZHRoOiA2NGVtKSB7CiAgLmlhcmJsYTAgewogICAgZ2FwOiB2YXIoLS1iZXN0b3ctZ2FwLWxnKTsKICB9Cn0KQG1lZGlhIChtaW4td2lkdGg6IDgwZW0pIHsKICAuaWFyYmxhMCB7CiAgICBnYXA6IHZhcigtLWJlc3Rvdy1nYXAteGwpOwogIH0KfQ';\nimport 'src/components/Stack/Stack.css.ts.vanilla.css?source=#H4sIAAAAAAAAA63VQXLiMBAF0D2n0DIslIKEMGA2c5MpYTdGRJKJJGNIirtP2Y6BFqJDgA2rp49_0zLP_4arz-lyNR2wrx5jmXRrJXYJWyjYznqMaWl4JTO_TNhg1tv3njs_bHzNeCYtpF4WJmG2qJB6iaq0UKU2CL5eiuMWNmAdID0iYqMH3poDuVgnbCPsE-dzcL6ouFuLFPigj_CYxEOM_5D4BeMJiV8xnpJ4hLEg8RvGcxKPMU5JPME4o0cXDBpoHQxvQevgsfNGCyVzw6UH7dqd5s4L65FcnssUjAeLlLyQByZDbnXunLfg0yVi7-dsLhwoafDiqsatSuflYsfTwngw_mIVHdeROobIDSsVcdvOfQ6-AsCXeU0dELYogy_4oDxswKgd8vZ4_Stb70P9iYRrxHFFvEjfj68KXo86YdJIL4WaUdLp65zOrnMqv85tFXLhqw5fgEg7fBl8bBzt8v00ilbRY2gNPYLW0PVbE1RHdyTS-1gDdy5jnbsd-6l15-jenaKbd4ru3qmg_dmliEzgtFQzg78aMinY08mf92gAut9MJLgjv9wtp_v1Y-1Pg_x30HW_VCyh_E74TdtDTrzv5DF9dXZv31jCLX0POdG-49Fj-qr83r6xhFv6HnKifScP2ueturdvLOGWvoec_X_feleolAsAAA';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var responsiveAlign = '_1jz9hj9t';\nexport var responsiveDirection = '_1jz9hj9s';\nexport var responsiveGap = 'iarbla0';\nexport var responsiveJustify = '_1jz9hj9u';\nexport var stack = /* @__PURE__ */ _7a468({defaultClassName:'_1jz9hj90',variantClassNames:{direction:{row:'_1jz9hj91',column:'_1jz9hj92','row-reverse':'_1jz9hj93','column-reverse':'_1jz9hj94'},gap:{'0':'_1jz9hj95','1':'_1jz9hj96','2':'_1jz9hj97','3':'_1jz9hj98','4':'_1jz9hj99','5':'_1jz9hj9a','6':'_1jz9hj9b','8':'_1jz9hj9c','10':'_1jz9hj9d','12':'_1jz9hj9e','16':'_1jz9hj9f'},align:{start:'_1jz9hj9g',center:'_1jz9hj9h',end:'_1jz9hj9i',stretch:'_1jz9hj9j',baseline:'_1jz9hj9k'},justify:{start:'_1jz9hj9l',center:'_1jz9hj9m',end:'_1jz9hj9n',between:'_1jz9hj9o',around:'_1jz9hj9p',evenly:'_1jz9hj9q'},wrap:{true:'_1jz9hj9r'}},defaultVariants:{},compoundVariants:[]});","import { forwardRef, type ElementType, type HTMLAttributes } from 'react';\nimport type { PolymorphicComponent } from '../../utils/polymorphic';\nimport { cx } from '../../utils/cx';\nimport * as styles from './Typography.css';\n\nexport type TypographyVariant = 'display' | 'h1' | 'h2' | 'h3' | 'h4' | 'body-lg' | 'body' | 'body-sm' | 'caption';\n\nconst defaultElement: Record<TypographyVariant, ElementType> = {\n display: 'h1',\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n 'body-lg': 'p',\n body: 'p',\n 'body-sm': 'p',\n caption: 'span',\n};\n\nexport interface TypographyProps extends Omit<HTMLAttributes<HTMLElement>, 'color'> {\n /** 텍스트 스타일 */\n variant?: TypographyVariant;\n /** 렌더링할 요소. 기본값은 variant 에 따라 결정된다 (h1, p, span 등) */\n as?: ElementType;\n /** 글자 색상 */\n color?: 'default' | 'muted' | 'subtle' | 'primary' | 'danger' | 'success' | 'warning' | 'inherit';\n /** variant 의 기본 굵기를 덮어쓴다 */\n weight?: 'regular' | 'medium' | 'semibold' | 'bold';\n /** 정렬 */\n align?: 'start' | 'center' | 'end';\n /** 한 줄로 자르고 말줄임표를 표시한다 */\n truncate?: boolean;\n}\n\nexport const Typography = /* @__PURE__ */ forwardRef<HTMLElement, TypographyProps>(function Typography(\n { variant = 'body', as, color, weight, align, truncate, className, ...rest },\n ref,\n) {\n const Component = as ?? defaultElement[variant];\n return (\n <Component\n ref={ref}\n className={cx(styles.typography({ variant, color, weight, align, truncate }), className)}\n {...rest}\n />\n );\n}) as PolymorphicComponent<TypographyProps, HTMLElement, Omit<HTMLAttributes<HTMLElement>, 'color'>>;\n","import 'src/theme/contract.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2aXW_bNhSG7_sriOSmAaRA1Jct9WYrhg7Y0GJogN1TEukIlURDkhunQ__7oA9LtnN4RKEbkGEs0gQxXx2RLz_C55BxLWVL_npDiG0nvGnlk93sWcptJybOu5cf05j4-yNQ4MZkCxZ4MaEuWOLHhIZgSRAT1wFLwpi4cAW2MfHg91AnJj4cjrox8eF60zAm4fWrapblh8auZMWv_RmLmvKlQ2NRmb30aCwqdoBLY9mxAHway8ShKGISRVF0VS5k1dqClXnxbDesamJy80fNW15lrM7In6zOWVLwG4vMn1rEZvt9we3muWl5aZH3RV59-cjSh_73D7JqLTKU2YfcIjc_d2ry8Av5VbaPeUo-cXljkZtPspXkgVUN-f3zjUW6t9sNr3OhrGApKxmTm994-75medWQj7LqQh3yvqjvD4s8fOg-tj_z3aFgtUU-8qqQFpkUL8M3-TduH5uYOPeboOalQtF1mXO_xSRd11F1cd9999RFIvS9eI8p3EGCKLxBgdbU7zSu6kVPPN89tnY9eNhNC0cpKnmWH8qYBIim4WWeyCKLSYioBsUGUhR5xe3HQdZ23weXcGEl65INZuHCmhfsyLu-u99cSrNDzdpcVrZgTfdO1ykbWHB6mesoJU0hn7rV51og9yzN22c7y5tutmXdMLusxjc7rzJ-tOVXXhfsOSbUu3LppChl1jfZo3B5Vst9Jp-qTuLCklYObb3u9LlcFm2-jwm97vJUFrK2k52dccEORRuTW9H_g1XNIWkL3om2IhIMFpWHtnPkVlDhiQDW5NVXXjddJJe6gRvBqsm8epewt45Fxq97P7gDnhDnzVDGFXMN_Shwgg2smZoahiHfhLBobobaNVlnvD6rWMa5y6F4o7Jpa1ntYnLLsiRIMrVQyPTQxOTWS0IhkIB5tT-0WEPOdfZjZzrmzahOZdXWssDi7uu8ZPWz3cgi7-x2g8DnyZJwqgHNfDfbIvK-Cv3IV9s_hT51J-fC11BOtcgSHgqO6Ft-bLHaVvzQ1qyYXPB8j_nQLLwQTu9XjuOTXMeFKfQ0f1Vz81I51YJHPOVY5NEFZeMyVu26wT2akKVu6EJj5lw3vT2JaEpTtVrHglPgyQEuXOEuCacqiG7WIvKx_cqaNoc05U0zGUCDreNBk_tCOM-FMAw8H5HrWDCFnjxwRCawqNdzIRUph9aEk_40F1SNe2J1lVe7yQURRNyBVoQL4fz-aLNxoFFzkp-5oJw3U-jJBSEScFm6VJ4NBeGlkAsn_ehC5PqOA60ceSXk8qI4q5ZXxF6rMwSGoItr4ZlseSHsxepVsHlkWfej24sTuj8Sd3988QfdCe-gh7rdudNRV89QL5_agk91m3ZneMKDHqPu3bs339_ct1_Yrk0cA8kGkg0kG0g2kGwg2UCygWQDyQaSDSQbSDaQbCDZQPIAydRAsoFkA8kGkg0kG0jWhWQa0i2F_mqfQzKGticEVW6YLyAZw20lJIfLkKyMewbJSl49h2Qlqwo91r-G5CX6XA3JoRM5sIOXkLwU7xKSl1h-hmRl3NcIyf1ICiKLUEot4vphv2sKoeEEUzMYwEUDnDbNXuILyKdrjF4k0kufFoFXBx2uMbpvphsEFpm_vdyVYmANR6A-FmF0Stmi14baQxu9yCLhdvivGkwgekOPw0PpEsVFygIG-fMaUbxvpOdbhEYbi0S-2iMYzaHnYZOuUH0bcsGg_v5BVBdJIlzIpR9B9WEo-IFFaLDtFhe1TTC7gwFgn65gXqSZ50OD5LXA_Io1G6D7FQv2Oe4Dq7UW7gcI7Tvjc8rF1cJSAnDkISOAR6Z9YHXWIDxPGrgmaWCSBiZpYJIGJmlgkgbmZN2crJuTdXOybk7Wzcm6OVk3J-v_-5P1n7p9MCNv9zUXvG5OQzl95CWPScbqL3c9P1_AtBKnEaBGkBqDagyrMbDG0BqDaxSvUcBGERuFbBSzUdDGURuH7WXc_g8A97-O3DrQrYXdi-Cthd468K2D33oAroXgmhCuh-G6IK6D4itgfAWOrwJyDSTXgnINLNcBcx00X4ZzLTxfBnQdRMchfT7ZRzF93gRhoD5v2nFUn6F_FayPJ_w4riOxwVN-FNlncsahHbNHfda_AtyX0H0-71-C9-WYqjP_ZYBHYqsRfjXEr8P4RZDHTpI02R47TlrC_flMaRH4Z3bWRP4ZznWgHxnEq24CaKYC0LsAS-kBpGXKBMHaFMGqJMFSmgC5FaCXOEDuBSykEuabASuSCavTCesSCospBeSGgGaSAbkjsJR2mG8JrEg8aKYe5psC65IPi-kH7LaAZkYCuy-wlKSYbwzopinWJSpWpCrwZMWq9X7l3QE0pQGu9CvuD6iyGv_EDQJV7uPH7xAQ8v3N978BBpyHHsNOAAA';\nimport 'src/components/Typography/Typography.css.ts.vanilla.css?source=#H4sIAAAAAAAAA82Vy26DMBBF93yFl83CUZK-ydc4eDDTjm00NiVt1X-vQtTUCakAVVW6YeF7jzmyxjB_Rk_oF-I9E8IqNuhysVhnQpTeRVkqi_SaixfFV1JuIETfyiSRQbkwW2cf2Xy_0bLbqGsEfINz5G5d3mxpdnhLC2iqeK67T-TGk-7qhA5k9WM9iWXcPfcQxAgsQ60KdCYXcjFfrMAm1quR1tf_yvp6pPXqwtbLI-ubkdaTpANY_I34we52pB2ZS9jd_YUdg2lI8VQ5BlJb0Kne_Ug9q_9ez3m2ilK7h5F2wV7C7nHstQiXsFOdXeHJ8wncrcnSSA2lauhoXDfDlG3i8QwVw0xoNpEghfQAVDNaxa8ywvZIEAY4rZwB7mHlABaaooAQepwZ4FrFDp3pcVXKoauAMSYxfo_OhIk44E8TcAsaG5vSzxPo5Dt44GkCf8rajt2dllSExuUiRMXp0bheowAXgZOK71XA6SSvu9y_AJfk21xUqDW49RfzHQAR1gHDLmorjND9BSEXzres6nX28Ql_7_cqbQkAAA';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var typography = /* @__PURE__ */ _7a468({defaultClassName:'kiolio0',variantClassNames:{variant:{display:'kiolio1',h1:'kiolio2',h2:'kiolio3',h3:'kiolio4',h4:'kiolio5','body-lg':'kiolio6',body:'kiolio7','body-sm':'kiolio8',caption:'kiolio9'},color:{'default':'kiolioa',muted:'kioliob',subtle:'kiolioc',primary:'kioliod',danger:'kiolioe',success:'kioliof',warning:'kioliog',inherit:'kiolioh'},weight:{regular:'kiolioi',medium:'kiolioj',semibold:'kioliok',bold:'kioliol'},align:{start:'kioliom',center:'kiolion',end:'kiolioo'},truncate:{true:'kioliop'}},defaultVariants:{variant:'body',color:'default'},compoundVariants:[]});","import { forwardRef, type ElementType, type HTMLAttributes } from 'react';\nimport { visuallyHidden } from '../../styles/visuallyHidden.css';\nimport type { PolymorphicComponent } from '../../utils/polymorphic';\nimport { cx } from '../../utils/cx';\n\nexport interface VisuallyHiddenProps extends HTMLAttributes<HTMLElement> {\n /** 렌더링할 요소 (기본 span) */\n as?: ElementType;\n}\n\n/**\n * 화면에는 보이지 않고 스크린리더만 읽는 글자. 아이콘만 있는 열 머리글(\"작업\"), 보이는 글자에 붙는 보충 설명 등에 쓴다.\n * `display: none`·`hidden` 과 달리 보조기술이 읽는다. hook 이 없어 서버 컴포넌트로도 렌더링된다.\n */\nexport const VisuallyHidden = /* @__PURE__ */ forwardRef<HTMLElement, VisuallyHiddenProps>(function VisuallyHidden(\n { as: Component = 'span', className, ...rest },\n ref,\n) {\n return <Component ref={ref} className={cx(visuallyHidden, className)} {...rest} />;\n}) as PolymorphicComponent<VisuallyHiddenProps, HTMLElement>;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAEA,SAAS,YAAY,aAAa,eAAe;AAU1C,SAAS,SAAS,KAAkB;AACzC,QAAM,IAAI,iCAAiC,KAAK,IAAI,KAAK,CAAC;AAC1D,MAAI,CAAC,EAAG,OAAM,IAAI,MAAM,kEAAqB,GAAG,uBAAkB;AAClE,MAAI,IAAI,EAAE,CAAC;AACX,MAAI,EAAE,WAAW,EAAG,KAAI,EAAE,QAAQ,MAAM,CAAC,MAAM,IAAI,CAAC;AACpD,SAAO,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG;AACnE;AAEO,SAAS,MAAM,KAAkB;AACtC,SAAO,IAAI,IACR;AAAA,IAAI,CAAC,MACJ,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,EACzC,SAAS,EAAE,EACX,SAAS,GAAG,GAAG;AAAA,EACpB,EACC,KAAK,EAAE,CAAC;AACb;AAEA,IAAM,WAAW,CAAC,MAAe,KAAK,UAAU,IAAI,UAAU,IAAI,SAAS,UAAU;AACrF,IAAM,aAAa,CAAC,MAAe,KAAK,WAAY,QAAQ,IAAI,QAAQ,MAAM,IAAI,OAAO;AAEzF,SAAS,WAAW,CAAC,GAAG,GAAG,CAAC,GAAe;AACzC,QAAM,CAAC,IAAI,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,CAAC;AAC3D,QAAM,KAAK,KAAK,KAAK,eAAe,KAAK,eAAe,KAAK,eAAe,EAAE;AAC9E,QAAM,KAAK,KAAK,KAAK,eAAe,KAAK,eAAe,KAAK,eAAe,EAAE;AAC9E,QAAM,KAAK,KAAK,KAAK,eAAe,KAAK,eAAe,KAAK,eAAe,EAAE;AAC9E,QAAM,IAAI,eAAe,KAAK,cAAc,KAAK,eAAe;AAChE,QAAM,IAAI,eAAe,KAAK,cAAc,KAAK,eAAe;AAChE,QAAM,KAAK,eAAe,KAAK,eAAe,KAAK,cAAc;AACjE,SAAO,EAAE,GAAG,GAAG,GAAG,KAAK,MAAM,GAAG,EAAE,GAAG,GAAG,KAAK,MAAM,IAAI,CAAC,EAAE;AAC5D;AAEA,SAAS,oBAAoB,EAAE,GAAG,GAAG,EAAE,GAAe;AACpD,QAAM,IAAI,IAAI,KAAK,IAAI,CAAC;AACxB,QAAM,IAAI,IAAI,KAAK,IAAI,CAAC;AACxB,QAAM,MAAM,IAAI,eAAe,IAAI,eAAe,MAAM;AACxD,QAAM,MAAM,IAAI,eAAe,IAAI,eAAe,MAAM;AACxD,QAAM,MAAM,IAAI,eAAe,IAAI,cAAc,MAAM;AACvD,SAAO;AAAA,IACL,WAAW,eAAe,KAAK,eAAe,KAAK,eAAe,EAAE;AAAA,IACpE,WAAW,gBAAgB,KAAK,eAAe,KAAK,eAAe,EAAE;AAAA,IACrE,WAAW,gBAAgB,KAAK,eAAe,KAAK,cAAc,EAAE;AAAA,EACtE;AACF;AAEA,IAAM,UAAU,CAAC,QAAa,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,KAAK,IAAI,IAAI;AAG1E,SAAS,WAAW,OAAmB;AACrC,QAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC,CAAC;AAC1C,MAAI,MAAM,oBAAoB,EAAE,GAAG,OAAO,EAAE,CAAC;AAC7C,MAAI,QAAQ,GAAG,EAAG,QAAO;AACzB,MAAI,KAAK;AACT,MAAI,KAAK,MAAM;AACf,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,UAAM,OAAO,KAAK,MAAM;AACxB,QAAI,QAAQ,oBAAoB,EAAE,GAAG,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC,CAAC,EAAG,MAAK;AAAA,QAC7D,MAAK;AAAA,EACZ;AACA,QAAM,oBAAoB,EAAE,GAAG,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC;AAClD,SAAO;AACT;AAEA,SAAS,UAAU,CAAC,GAAG,GAAG,CAAC,GAAgB;AACzC,SAAO,SAAS,SAAS,CAAC,IAAI,SAAS,SAAS,CAAC,IAAI,SAAS,SAAS,CAAC;AAC1E;AAGO,SAAS,cAAc,GAAW,GAAmB;AAC1D,QAAM,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,SAAS,CAAC,CAAC,GAAG,UAAU,SAAS,CAAC,CAAC,CAAC;AAChE,UAAQ,KAAK,IAAI,IAAI,EAAE,IAAI,SAAS,KAAK,IAAI,IAAI,EAAE,IAAI;AACzD;AAGA,SAAS,MAAM,IAAY,OAAe,IAAoB;AAC5D,QAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,SAAS,EAAE,CAAC;AAC1C,SAAO,MAAM,EAAE,IAAI,CAAC,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC,KAAM,IAAI,MAAM,CAAQ;AACtE;AAEA,IAAM,QAAQ,CAAC,MAAa,GAAW,IAAI,KAAK,MAAM,MAAM,WAAW,EAAE,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC;AAG3F,SAAS,aAAa,MAAa,QAAgB,MAAc,aAA+B;AAC9F,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,UAAM,MAAM,MAAM,MAAM,CAAC;AACzB,QAAI,YAAY,MAAM,CAAC,OAAO,cAAc,KAAK,EAAE,KAAK,GAAG,EAAG,QAAO;AACrE,QAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC;AAAA,EACvC;AACA,SAAO,OAAO,IAAI,QAAQ,QAAQ,QAAQ;AAC5C;AAMA,SAAS,SAAS,MAAa,OAAe,UAA0B;AACtE,QAAM,YAAY,MAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC;AACtE,MAAI,cAAc,UAAU,SAAS,KAAK,IAAK,QAAO;AACtD,SAAO,MAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC;AAC7D;AAOA,SAAS,kBAAkB,OAAoD;AAC7E,QAAM,QAAQ,QAAQ;AACtB,QAAM,OAAO,QAAQ,KAAK,GAAG;AAC7B,MAAI,cAAc,OAAO,KAAK,KAAK,IAAK,QAAO,EAAE,OAAO,OAAO,UAAU,MAAM;AAC/E,MAAI,cAAc,MAAM,KAAK,KAAK,IAAK,QAAO,EAAE,OAAO,OAAO,UAAU,KAAK;AAC7E,QAAM,OAAO,WAAW,SAAS,KAAK,CAAC;AACvC,WAAS,QAAQ,MAAO,SAAS,GAAG,SAAS,MAAO;AAClD,UAAM,SAAS,MAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,CAAC;AACtD,QAAI,cAAc,OAAO,MAAM,KAAK,IAAK,QAAO,EAAE,OAAO,QAAQ,UAAU,MAAM;AACjF,UAAM,UAAU,MAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,CAAC;AACvD,QAAI,cAAc,MAAM,OAAO,KAAK,IAAK,QAAO,EAAE,OAAO,SAAS,UAAU,KAAK;AAAA,EACnF;AACA,SAAO,EAAE,OAAO,QAAQ,OAAO,UAAU,MAAM;AACjD;AAEA,IAAM,OAAO,CAAC,KAAa,UAAkB;AAC3C,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI,SAAS,GAAG,EAAE,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC;AAC9D,SAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK;AACxC;AAaO,SAAS,mBAAmB,QAAoB,OAA2B;AAChF,QAAM,QAAQ,MAAM,SAAS,KAAK,CAAC;AACnC,QAAM,OAAO,WAAW,SAAS,KAAK,CAAC;AAGvC,QAAM,cAAc,MAAM,MAAM,MAAM,KAAK,IAAI,KAAK,GAAG,IAAI,IAAI,GAAG;AAClE,QAAM,mBAAmB,MAAM,MAAM,MAAM,KAAK,IAAI,KAAK,GAAG,IAAI,IAAI,IAAI;AACxE,QAAM,EAAE,OAAO,UAAU,cAAc,IAAI,kBAAkB,KAAK;AAClE,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,YAAY,SAAS,WAAW,SAAS,KAAK,CAAC,GAAG,OAAO,aAAa;AAAA,IACtE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,MAAM,aAAa,MAAM,KAAK,IAAI,KAAK,GAAG,IAAI,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,aAAa,gBAAgB,CAAC;AAAA,EACjH;AAGA,QAAM,SAAS,WAAW,GAAG;AAC7B,QAAM,EAAE,OAAO,WAAW,UAAU,aAAa,IAAI,kBAAkB,KAAK,IAAI,MAAM,MAAM,MAAM,IAAI,IAAI,KAAK;AAC/G,QAAM,WAAW,WAAW,SAAS,SAAS,CAAC;AAC/C,QAAM,iBAAiB,MAAM,WAAW,MAAM,MAAM;AACpD,QAAM,sBAAsB,MAAM,WAAW,MAAM,MAAM;AACzD,QAAM,OAAO;AAAA,IACX,OAAO;AAAA,IACP,YAAY,SAAS,UAAU,MAAM,YAAY;AAAA,IACjD,UAAU;AAAA,IACV,QAAQ,KAAK,WAAW,IAAI;AAAA,IAC5B,aAAa,KAAK,WAAW,IAAI;AAAA,IACjC,MAAM,aAAa,UAAU,KAAK,IAAI,SAAS,GAAG,IAAI,GAAG,MAAM,CAAC,QAAQ,gBAAgB,mBAAmB,CAAC;AAAA,EAC9G;AAKA,QAAM,UAAU,CAAC,WAAmB,UAAkB,OACpD,cAAc,WAAW,EAAE,KAAK,IAAI,YAAY;AAClD,QAAM,QACJ,WAAW,YACP;AAAA,IACE,OAAO,EAAE,QAAQ,EAAE,OAAO,QAAQ,MAAM,OAAO,MAAM,MAAM,YAAY,GAAG,OAAO,EAAE,EAAE;AAAA,IACrF,MAAM;AAAA,MACJ,QAAQ,EAAE,OAAO,QAAQ,MAAM,UAAU,KAAK,IAAI,GAAG,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM,MAAM,EAAE;AAAA,IAC/F;AAAA,EACF,IACA;AAEN,SAAO;AAAA,IACL,OAAO,EAAE,OAAO,EAAE,CAAC,MAAM,GAAG,OAAO,GAAG,OAAO,MAAM,EAAE;AAAA,IACrD,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,KAAK,EAAE;AAAA,EACpD;AACF;;;AC9LO,IAAM,qBAAiD,uBAAO,OAAO;AAAA;AAAA;AAAA,EAG1E,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,WAAW,YAAY,WAAW,SAAS,UAAU,EAAE,EAAE;AAAA;AAAA;AAAA,EAG5F,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,WAAW,YAAY,WAAW,SAAS,UAAU,EAAE,EAAE;AAC7F,CAAC;;;AChBD,IAAM,gBAAgB,CAAC,UAAU,UAAU,WAAW,aAAa,YAAY,UAAU,UAAU;AACnG,IAAM,SAAS;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,IAAM,KAAqB;AAAA,EAChC,OAAO;AAAA,EACP,SAAS;AAAA,EACT,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,gBAAgB,CAAC,SAAS,QAAQ,IAAI;AAAA,EACtC,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,WAAW;AAAA,EACX,WAAW;AAAA,EACX,OAAO;AAAA,EACP,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,UAAU;AAAA,EACV,YAAY,CAAC,SAAS,UAAU,IAAI;AAAA,EACpC,eAAe,CAAC,UAAU,GAAG,KAAK,IAAI,UAAU,IAAI,SAAS,OAAO;AAAA,EACpE,aAAa,CAAC,SAAS,GAAG,IAAI;AAAA,EAC9B,cAAc,CAAC,MAAM,YAAY,GAAG,IAAI,mBAAmB,OAAO;AAAA,EAClE,oBAAoB,CAAC,SAAS,GAAG,IAAI;AAAA,EACrC,aAAa,CAAC,aAAa,wBAAwB,QAAQ;AAAA,EAC3D,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,mBAAmB,CAAC,UAAU,SAAS,UAAU,IAAI,iBAAiB,OAAO,KAAK,WAAW;AAAA,EAC7F,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,MAAM;AAAA,EACN,MAAM;AAAA,EACN,kBAAkB;AAAA,EAClB,sBAAsB,CAAC,QAAQ,SAAS,aAAa,MAAM,IAAI,SAAS,YAAY,UAAU,WAAW;AAAA,EACzG,QAAQ;AAAA,EACR,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,0BAA0B;AAAA,EAC1B,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,0BAA0B,CAAC,WAAW,aAAa,MAAM;AAAA,EACzD,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,SAAS;AAAA,EACT,eAAe;AAAA,EACf,0BAA0B;AAAA,EAC1B,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,eAAe;AAAA,EACf,0BAA0B;AAAA,EAC1B,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,WAAW;AAAA,EACX,YAAY,CAAC,MAAM,UAAU,GAAG,OAAO,QAAQ,CAAC,CAAC,IAAI,IAAI;AAAA,EACzD,eAAe,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,EACxD,cAAc;AAAA,EACd,UAAU,CAAC,MAAM,gBACf,GAAG,KAAK,QAAQ,CAAC,KAAK,WAAW,KAAK,OAAO,KAAK,SAAS,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC;AAAA,EACrF,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,cAAc;AAAA,EACd,UAAU;AAAA,EACV,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,gBAAgB;AAClB;;;ACpFA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;;;AC7BA,IAAM,QAAQ;AAAA,EACnB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAWA,IAAM,OAAO,CAAC,QAAQ,MAAM,MAAM,MAAM,IAAI;AAErC,IAAM,qBAAqB,CAAIA,WACpC,OAAOA,WAAU,YAAYA,WAAU;AAMlC,SAAS,eACd,KACA,MACAA,QACA,OACA;AACA,MAAIA,WAAU,OAAW;AACzB,QAAM,SAAU,mBAAmBA,MAAK,IAAIA,SAAQ,EAAE,MAAMA,OAAM;AAClE,MAAI;AACJ,aAAW,OAAO,MAAM;AACtB,cAAU,OAAO,GAAG,KAAK;AACzB,QAAI,YAAY,OAAW,KAAI,YAAY,IAAI,IAAI,GAAG,EAAE,IAAI,MAAM,OAAO;AAAA,EAC3E;AACF;AAGO,IAAM,WAAW,CAAC,QAAyB,sBAAsB,GAAG;;;ACjCpE,SAAS,yBAAyB,OAAwBC,QAA0B;AACzF,SAAO,MAAM,MAAM,CAACC,UAAS,CAACA,MAAK,YAAYD,OAAM,SAASC,MAAK,KAAK,CAAC;AAC3E;;;ACjBA,SAAS,kBAAuD;;;ACEhE,SAAS,mBAAmB,cAAc;AACnC,IAAI,QAAwB,uBAAO,EAAC,kBAAiB,aAAY,mBAAkB,EAAC,SAAQ,EAAC,OAAM,aAAY,MAAK,aAAY,SAAQ,YAAW,GAAE,OAAM,EAAC,SAAQ,aAAY,SAAQ,aAAY,QAAO,aAAY,SAAQ,aAAY,SAAQ,aAAY,MAAK,YAAW,GAAE,MAAK,EAAC,IAAG,aAAY,IAAG,aAAY,IAAG,YAAW,EAAC,GAAE,iBAAgB,EAAC,SAAQ,QAAO,OAAM,WAAU,MAAK,KAAI,GAAE,kBAAiB,CAAC,EAAC,CAAC;AACrZ,IAAI,OAAO;;;ADgBd,SACgB,KADhB;AALG,IAAM,QAAwB,2BAAwC,SAASC,OACpF,EAAE,SAAS,OAAO,MAAM,WAAW,WAAW,UAAU,GAAG,KAAK,GAChE,KACA;AACA,SACE,qBAAC,UAAK,KAAU,WAAW,GAAU,MAAM,EAAE,SAAS,OAAO,KAAK,CAAC,GAAG,SAAS,GAAI,GAAG,MACnF;AAAA,iBAAa,oBAAC,UAAK,WAAkB,MAAO,qBAAU;AAAA,IACtD;AAAA,KACH;AAEJ,CAAC;;;AEzBD,SAAS,cAAAC,mBAAyD;;;ACElE,SAAS,mBAAmBC,eAAc;AACnC,IAAI,OAAO;AACX,IAAI,OAAuB,gBAAAA,QAAO,EAAC,kBAAiB,WAAU,mBAAkB,EAAC,SAAQ,EAAC,SAAQ,WAAU,UAAS,WAAU,MAAK,UAAS,GAAE,SAAQ,EAAC,MAAK,WAAU,IAAG,WAAU,IAAG,WAAU,IAAG,UAAS,EAAC,GAAE,iBAAgB,EAAC,SAAQ,WAAU,SAAQ,KAAI,GAAE,kBAAiB,CAAC,EAAC,CAAC;AACrR,IAAI,SAAS;AACb,IAAI,SAAS;;;ADaX,gBAAAC,YAAA;AAJF,IAAM,OAAuB,gBAAAC,YAAmC,SAASC,MAC9E,EAAE,SAAS,SAAS,IAAI,YAAY,OAAO,WAAW,GAAG,KAAK,GAC9D,KACA;AACA,SAAO,gBAAAF,KAAC,aAAU,KAAU,WAAW,GAAU,KAAK,EAAE,SAAS,QAAQ,CAAC,GAAG,SAAS,GAAI,GAAG,MAAM;AACrG,CAAC;AAKM,IAAM,aAA6B,gBAAAC,YAA6C,SAASE,YAC9F,EAAE,WAAW,GAAG,KAAK,GACrB,KACA;AACA,SAAO,gBAAAH,KAAC,SAAI,KAAU,WAAW,GAAU,QAAQ,SAAS,GAAI,GAAG,MAAM;AAC3E,CAAC;AAGM,IAAM,WAA2B,gBAAAC,YAA6C,SAASG,UAC5F,EAAE,WAAW,GAAG,KAAK,GACrB,KACA;AACA,SAAO,gBAAAJ,KAAC,SAAI,KAAU,WAAW,GAAU,MAAM,SAAS,GAAI,GAAG,MAAM;AACzE,CAAC;AAGM,IAAM,aAA6B,gBAAAC,YAA6C,SAASI,YAC9F,EAAE,WAAW,GAAG,KAAK,GACrB,KACA;AACA,SAAO,gBAAAL,KAAC,SAAI,KAAU,WAAW,GAAU,QAAQ,SAAS,GAAI,GAAG,MAAM;AAC3E,CAAC;;;AE9CD,SAAS,cAAAM,mBAAyD;;;ACElE,SAAS,mBAAmBC,eAAc;AACnC,IAAI,YAA4B,gBAAAA,QAAO,EAAC,kBAAiB,WAAU,mBAAkB,EAAC,MAAK,EAAC,IAAG,WAAU,IAAG,WAAU,IAAG,WAAU,IAAG,WAAU,MAAK,UAAS,GAAE,OAAM,EAAC,MAAK,UAAS,EAAC,GAAE,iBAAgB,EAAC,MAAK,KAAI,GAAE,kBAAiB,CAAC,EAAC,CAAC;;;ADgBtO,gBAAAC,YAAA;AAJF,IAAM,YAA4B,gBAAAC,YAAwC,SAASC,WACxF,EAAE,IAAI,YAAY,OAAO,MAAM,OAAO,WAAW,GAAG,KAAK,GACzD,KACA;AACA,SAAO,gBAAAF,KAAC,aAAU,KAAU,WAAW,GAAU,UAAU,EAAE,MAAM,MAAM,CAAC,GAAG,SAAS,GAAI,GAAG,MAAM;AACrG,CAAC;;;AEpBD,SAAS,wBAAwB;AACjC,SAAS,cAAAG,mBAAuD;;;ACChE,SAAS,mBAAmBC,eAAc;AACnC,IAAI,cAAc;AAClB,IAAI,OAAuB,gBAAAA,QAAO,EAAC,kBAAiB,aAAY,mBAAkB,EAAC,QAAO,EAAC,YAAW,aAAY,UAAS,YAAW,GAAE,SAAQ,EAAC,MAAK,YAAW,EAAC,GAAE,iBAAgB,EAAC,QAAO,aAAY,GAAE,kBAAiB,CAAC,EAAC,CAAC;AAC9N,IAAI,OAAO;AACX,IAAI,OAAO;AACX,IAAI,YAAY;;;AD8Bb,SACE,OAAAC,MADF,QAAAC,aAAA;AAVH,IAAM,kBAAkC,gBAAAC;AAAA,EAC7C,SAASC,iBAAgB,EAAE,OAAO,SAAS,cAAc,WAAAC,YAAW,SAAS,WAAW,OAAO,GAAG,KAAK,GAAG,KAAK;AAC7G,WACE,gBAAAJ;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,GAAU,MAAM,SAAS;AAAA,QACpC,OAAOI,aAAY,EAAE,GAAG,iBAAiB,EAAE,CAAQ,SAAS,GAAGA,WAAU,CAAC,GAAG,GAAG,MAAM,IAAI;AAAA,QACzF,GAAG;AAAA,QAEH,gBAAM,IAAI,CAACC,OAAM,UAChB,gBAAAJ,MAAC,SAAgB,WAAkB,KAAK,EAAE,QAAQ,QAAQ,CAAC,GACzD;AAAA,0BAAAD,KAAC,QAAG,WAAkB,MAAO,UAAAK,MAAK,MAAK;AAAA,UACvC,gBAAAL,KAAC,QAAG,WAAkB,aAAc,UAAAK,MAAK,aAAY;AAAA,aAF7C,KAGV,CACD;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;;;AE7CA,SAAS,cAAAC,mBAAuD;;;ACEhE,SAAS,mBAAmBC,eAAc;AACnC,IAAI,UAA0B,gBAAAA,QAAO,EAAC,kBAAiB,aAAY,mBAAkB,EAAC,aAAY,EAAC,YAAW,aAAY,UAAS,YAAW,EAAC,GAAE,iBAAgB,EAAC,aAAY,aAAY,GAAE,kBAAiB,CAAC,EAAC,CAAC;AAChN,IAAI,UAAU;AACd,IAAI,OAAO;;;ADiBZ,SACE,OAAAC,MADF,QAAAC,aAAA;AANC,IAAM,UAA0B,gBAAAC,YAAyC,SAASC,SACvF,EAAE,cAAc,cAAc,YAAY,WAAW,UAAU,GAAG,KAAK,GACvE,KACA;AACA,MAAI,YAAY,gBAAgB,cAAc;AAC5C,WACE,gBAAAF,MAAC,SAAI,KAAU,WAAW,GAAU,SAAS,SAAS,GAAI,GAAG,MAC3D;AAAA,sBAAAD,KAAC,UAAK,WAAkB,MAAM,eAAW,MAAC;AAAA,MACzC;AAAA,MACD,gBAAAA,KAAC,UAAK,WAAkB,MAAM,eAAW,MAAC;AAAA,OAC5C;AAAA,EAEJ;AAEA,QAAM,OAAO,aACT,EAAE,MAAM,OAAO,IACf,EAAE,MAAM,aAAa,oBAAoB,gBAAgB,aAAc,aAAuB,OAAU;AAC5G,SAAO,gBAAAA,KAAC,SAAI,KAAU,WAAW,GAAU,QAAQ,EAAE,YAAY,CAAC,GAAG,SAAS,GAAI,GAAG,MAAO,GAAG,MAAM;AACvG,CAAC;;;AElCD,SAAS,cAAAI,aAAY,aAAkD;AA4D/D,SAGI,OAAAC,MAHJ,QAAAC,aAAA;AAZD,IAAM,YAA4B,gBAAAC,YAA2C,SAASC,WAC3F,EAAE,OAAAC,QAAO,YAAAC,aAAY,OAAO,UAAU,IAAI,WAAW,WAAW,UAAU,GAAG,KAAK,GAClF,KACA;AACA,QAAM,cAAc,MAAM;AAC1B,QAAM,YAAY,MAAM;AACxB,QAAM,UAAUD,SAAQ,GAAG,SAAS,WAAW;AAC/C,QAAM,WAAWC,cAAa,GAAG,SAAS,YAAY;AAEtD,SACE,gBAAAJ,MAAC,SAAI,KAAU,WAAW,GAAe,OAAO,aAAyB,gBAAgB,SAAS,GAAI,GAAG,MACtG;AAAA,IAAAG,UACC,gBAAAH,MAAC,WAAM,IAAI,SAAS,SAAS,WAAW,WAAuB,OAC5D;AAAA,MAAAG;AAAA,MACA,YACC,gBAAAJ,KAAC,UAAK,WAAuB,cAAc,eAAW,MAAC,eAEvD;AAAA,OAEJ;AAAA,IAED;AAAA,MACC;AAAA,QACE,IAAI;AAAA,QACJ,oBAAoB;AAAA,QACpB,gBAAgB,SAAS;AAAA,QACzB,iBAAiB,YAAY;AAAA,MAC/B;AAAA,MACA,EAAE,SAAS,SAAS;AAAA,IACtB;AAAA,IACCK,eACC,gBAAAL,KAAC,OAAE,IAAI,UAAU,WAAuB,WAAW,EAAE,MAAM,CAAC,GACzD,UAAAK,aACH;AAAA,KAEJ;AAEJ,CAAC;;;ACpFD,SAAS,cAAAC,mBAA6E;;;ACC/E,IAAI,UAAU;AACd,IAAI,OAAO;AACX,IAAI,gBAAgB;;;AD8BvB,gBAAAC,YAAA;AAbJ,IAAM,gBAAgB,CAAC,UAAkB,UAAU,KAAK;AAEjD,IAAM,OAAuB,gBAAAC,YAAmC,SAASC,MAC9E,EAAE,IAAI,YAAY,OAAO,SAAAC,UAAS,cAAc,KAAK,WAAW,OAAO,GAAG,KAAK,GAC/E,KACA;AACA,QAAM,aAAqC,CAAC;AAC5C,MAAI;AACF,eAAW,4BAA4B,IAAI,sCAAsC,YAAY;AAAA,MAC1F,gBAAe,YAAY,gBAAgBA,UAAS,aAAa;AACtE,iBAAe,YAAY,OAAO,KAAK,QAAQ;AAE/C,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAU,MAAa,SAAS,QAAQ,UAAoB,eAAe,SAAS;AAAA,MAC/F,OAAO,EAAE,GAAG,YAAY,GAAG,MAAM;AAAA,MAChC,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;;;AEzCD,SAAS,cAAAI,aAAY,SAAAC,cAAkD;;;ACGvE,SAAS,mBAAmBC,eAAc;AACnC,IAAIC,UAAS;AACb,IAAI,YAA4B,gBAAAD,QAAO,EAAC,kBAAiB,aAAY,mBAAkB,EAAC,OAAM,EAAC,SAAQ,aAAY,SAAQ,aAAY,SAAQ,aAAY,SAAQ,aAAY,QAAO,YAAW,EAAC,GAAE,iBAAgB,EAAC,OAAM,UAAS,GAAE,kBAAiB,CAAC,EAAC,CAAC;AAC1P,IAAIE,SAAQ;AACZ,IAAIC,QAAO;AACX,IAAI,QAAwB,gBAAAH,QAAO,EAAC,kBAAiB,aAAY,mBAAkB,EAAC,MAAK,EAAC,IAAG,aAAY,IAAG,aAAY,IAAG,YAAW,EAAC,GAAE,iBAAgB,EAAC,MAAK,KAAI,GAAE,kBAAiB,CAAC,EAAC,CAAC;AACzL,IAAI,QAAQ;;;ADwCX,SAEI,OAAAI,MAFJ,QAAAC,aAAA;AA1BR,IAAM,gBAAgB,CAACC,QAAe,QAAgB,GAAG,KAAK,MAAOA,SAAQ,MAAO,GAAG,CAAC;AAEjF,IAAM,WAA2B,gBAAAC,YAA0C,SAASC,UACzF;AAAA,EACE,OAAAF;AAAA,EACA,MAAM;AAAA,EACN,OAAAG;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,UAAUC,OAAM;AACtB,QAAM,kBAAkBJ,WAAU,UAAaA,WAAU;AACzD,QAAM,UAAU,MAAM,IAAI,MAAM;AAChC,QAAM,UAAU,kBAAkB,IAAI,KAAK,IAAI,SAAS,KAAK,IAAI,GAAGA,MAAK,CAAC;AAC1E,QAAM,YAAY,kBAAkB,SAAY,YAAY,SAAS,OAAO;AAE5E,SACE,gBAAAD,MAAC,SAAI,KAAU,WAAW,GAAUM,OAAM,SAAS,GAAI,GAAG,MACtD;AAAA,KAAAF,UAAU,aAAa,cACvB,gBAAAJ,MAAC,SAAI,WAAkBO,SACpB;AAAA,MAAAH,UACC,gBAAAL,KAAC,UAAK,IAAI,SAAS,WAAkBK,QAClC,UAAAA,QACH;AAAA,MAGD,aAAa,aACZ,gBAAAL,KAAC,UAAK,WAAkB,OAAO,eAAW,MACvC,qBACH;AAAA,OAEJ;AAAA,IAEF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,mBAAiBK,SAAQ,UAAU;AAAA,QACnC,cAAYA,SAAQ,SAAY;AAAA,QAChC,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,iBAAe,kBAAkB,SAAY;AAAA,QAC7C,kBAAgB;AAAA,QAChB,WAAkB,MAAM,EAAE,KAAK,CAAC;AAAA,QAEhC,0BAAAL;AAAA,UAAC;AAAA;AAAA,YACC,WAAkB,UAAU,EAAE,MAAM,CAAC;AAAA,YACrC,cAAY,kBAAkB,kBAAkB,WAAW,UAAU,aAAa;AAAA,YAClF,OAAO,kBAAkB,SAAY,EAAE,OAAO,GAAI,UAAU,UAAW,GAAG,IAAI;AAAA;AAAA,QAChF;AAAA;AAAA,IACF;AAAA,KACF;AAEJ,CAAC;;;AEhFD,SAAS,cAAAS,mBAA6E;;;ACEtF,SAAS,mBAAmBC,eAAc;AACnC,IAAI,kBAAkB;AACtB,IAAI,sBAAsB;AAC1B,IAAIC,iBAAgB;AACpB,IAAI,oBAAoB;AACxB,IAAI,QAAwB,gBAAAD,QAAO,EAAC,kBAAiB,aAAY,mBAAkB,EAAC,WAAU,EAAC,KAAI,aAAY,QAAO,aAAY,eAAc,aAAY,kBAAiB,YAAW,GAAE,KAAI,EAAC,KAAI,aAAY,KAAI,aAAY,KAAI,aAAY,KAAI,aAAY,KAAI,aAAY,KAAI,aAAY,KAAI,aAAY,KAAI,aAAY,MAAK,aAAY,MAAK,aAAY,MAAK,YAAW,GAAE,OAAM,EAAC,OAAM,aAAY,QAAO,aAAY,KAAI,aAAY,SAAQ,aAAY,UAAS,YAAW,GAAE,SAAQ,EAAC,OAAM,aAAY,QAAO,aAAY,KAAI,aAAY,SAAQ,aAAY,QAAO,aAAY,QAAO,YAAW,GAAE,MAAK,EAAC,MAAK,YAAW,EAAC,GAAE,iBAAgB,CAAC,GAAE,kBAAiB,CAAC,EAAC,CAAC;;;ADwDrpB,gBAAAE,YAAA;AArCJ,IAAM,aAAqC;AAAA,EACzC,OAAO;AAAA,EACP,KAAK;AAAA,EACL,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AACV;AACA,IAAM,YAAY,CAACC,WAAkB,WAAWA,MAAK,KAAKA;AAG1D,IAAM,kBAAkB;AAAA,EACtB,CAAC,aAAa,mBAAmB,QAAe,mBAAmB;AAAA,EACnE,CAAC,OAAO,OAAO,UAAiBC,cAAa;AAAA,EAC7C,CAAC,SAAS,eAAe,WAAkB,eAAe;AAAA,EAC1D,CAAC,WAAW,iBAAiB,WAAkB,iBAAiB;AAClE;AAEO,IAAM,QAAwB,gBAAAC,YAAoC,SAASC,OAChF,EAAE,IAAI,YAAY,OAAO,WAAW,KAAK,OAAO,SAAS,MAAM,WAAW,OAAO,GAAG,KAAK,GACzF,KACA;AAEA,QAAM,QAAiC,EAAE,WAAW,aAAa,UAAU,KAAK,OAAO,QAAQ;AAC/F,QAAM,WAAoC,EAAE,KAAK;AACjD,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAkC,CAAC;AACzC,aAAW,CAAC,KAAK,MAAM,OAAO,eAAe,KAAK,iBAAiB;AACjE,UAAMH,SAAQ,MAAM,GAAG;AACvB,QAAI,CAAC,mBAAmBA,MAAK,EAAG,UAAS,GAAG,IAAIA;AAAA,SAC3C;AAEH,qBAAe,SAAS,MAAM,QAAQ,cAAc,EAAE,MAAM,UAAU,GAAGA,OAAM,IAAIA,QAAO,KAAK;AAC/F,cAAQ,KAAK,eAAe;AAAA,IAC9B;AAAA,EACF;AAEA,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAU,MAAM,QAAQ,GAAG,GAAG,SAAS,SAAS;AAAA,MAC3D,OAAO,QAAQ,SAAU,EAAE,GAAG,SAAS,GAAG,MAAM,IAAsB;AAAA,MACrE,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;;;AEvED,SAAS,cAAAK,oBAAyD;;;ACElE,SAAS,mBAAmBC,eAAc;AACnC,IAAI,aAA6B,gBAAAA,QAAO,EAAC,kBAAiB,WAAU,mBAAkB,EAAC,SAAQ,EAAC,SAAQ,WAAU,IAAG,WAAU,IAAG,WAAU,IAAG,WAAU,IAAG,WAAU,WAAU,WAAU,MAAK,WAAU,WAAU,WAAU,SAAQ,UAAS,GAAE,OAAM,EAAC,WAAU,WAAU,OAAM,WAAU,QAAO,WAAU,SAAQ,WAAU,QAAO,WAAU,SAAQ,WAAU,SAAQ,WAAU,SAAQ,UAAS,GAAE,QAAO,EAAC,SAAQ,WAAU,QAAO,WAAU,UAAS,WAAU,MAAK,UAAS,GAAE,OAAM,EAAC,OAAM,WAAU,QAAO,WAAU,KAAI,UAAS,GAAE,UAAS,EAAC,MAAK,UAAS,EAAC,GAAE,iBAAgB,EAAC,SAAQ,QAAO,OAAM,UAAS,GAAE,kBAAiB,CAAC,EAAC,CAAC;;;ADqC9mB,gBAAAC,aAAA;AAjCJ,IAAM,iBAAyD;AAAA,EAC7D,SAAS;AAAA,EACT,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,WAAW;AAAA,EACX,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AACX;AAiBO,IAAM,aAA6B,gBAAAC,aAAyC,SAASC,YAC1F,EAAE,UAAU,QAAQ,IAAI,OAAO,QAAQ,OAAO,UAAU,WAAW,GAAG,KAAK,GAC3E,KACA;AACA,QAAM,YAAY,MAAM,eAAe,OAAO;AAC9C,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAU,WAAW,EAAE,SAAS,OAAO,QAAQ,OAAO,SAAS,CAAC,GAAG,SAAS;AAAA,MACtF,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;;;AE9CD,SAAS,cAAAG,oBAAyD;AAkBzD,gBAAAC,aAAA;AAJF,IAAM,iBAAiC,gBAAAC,aAA6C,SAASC,gBAClG,EAAE,IAAI,YAAY,QAAQ,WAAW,GAAG,KAAK,GAC7C,KACA;AACA,SAAO,gBAAAF,MAAC,aAAU,KAAU,WAAW,GAAG,gBAAgB,SAAS,GAAI,GAAG,MAAM;AAClF,CAAC;","names":["value","value","item","Badge","forwardRef","_7a468","jsx","forwardRef","Card","CardHeader","CardBody","CardFooter","forwardRef","_7a468","jsx","forwardRef","Container","forwardRef","_7a468","jsx","jsxs","forwardRef","DescriptionList","termWidth","item","forwardRef","_7a468","jsx","jsxs","forwardRef","Divider","forwardRef","jsx","jsxs","forwardRef","FormField","label","helperText","forwardRef","jsx","forwardRef","Grid","columns","forwardRef","useId","_7a468","header","label","root","jsx","jsxs","value","forwardRef","Progress","label","useId","root","header","forwardRef","_7a468","responsiveGap","jsx","value","responsiveGap","forwardRef","Stack","forwardRef","_7a468","jsx","forwardRef","Typography","forwardRef","jsx","forwardRef","VisuallyHidden"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bestow-ui/react",
3
- "version": "1.7.0",
3
+ "version": "2.0.0",
4
4
  "description": "한국 서비스를 위한 접근성 검증 React 디자인 시스템 — 한국 서비스 키트(약관·인증번호·전화·사업자번호·금액·주소·날짜), KWCAG 2.2 대응, 다크·브랜드 테마, 서버 컴포넌트 지원",
5
5
  "keywords": [
6
6
  "react",
@@ -68,8 +68,8 @@
68
68
  },
69
69
  "dependencies": {
70
70
  "@bestow-ui/icons": "^0.1.3",
71
- "@bestow-ui/korean-utils": "^0.2.0",
72
- "@bestow-ui/tokens": "^1.7.0",
71
+ "@bestow-ui/korean-utils": "^0.3.0",
72
+ "@bestow-ui/tokens": "^2.0.0",
73
73
  "@radix-ui/react-accordion": "^1.3.1",
74
74
  "@radix-ui/react-avatar": "^1.3.1",
75
75
  "@radix-ui/react-dialog": "^1.3.1",
@@ -93,6 +93,7 @@
93
93
  "@types/react-dom": "^19.2.0",
94
94
  "@vanilla-extract/esbuild-plugin": "^2.3.22",
95
95
  "@vanilla-extract/vite-plugin": "^5.2.6",
96
+ "@vitest/coverage-v8": "^5.0.5",
96
97
  "jsdom": "^27.0.0",
97
98
  "react": "^19.2.0",
98
99
  "react-dom": "^19.2.0",
@@ -107,6 +108,7 @@
107
108
  "build": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsup",
108
109
  "dev": "tsup --watch",
109
110
  "test": "vitest run",
111
+ "test:coverage": "vitest run --coverage",
110
112
  "test:watch": "vitest",
111
113
  "typecheck": "tsc --noEmit"
112
114
  }