@bestow-ui/react 1.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/shared.js CHANGED
@@ -1,6 +1,9 @@
1
1
  import {
2
+ Skeleton,
2
3
  composeExtraAddress,
3
4
  createTheme,
5
+ cx,
6
+ focusField,
4
7
  formatBusinessNumber,
5
8
  formatKoreanAmount,
6
9
  formatKoreanDate,
@@ -10,8 +13,9 @@ import {
10
13
  parseISODate,
11
14
  themeClass,
12
15
  toISODate,
13
- vars
14
- } from "./chunk-PFEZ3D2H.js";
16
+ vars,
17
+ visuallyHidden
18
+ } from "./chunk-VH7JW6N7.js";
15
19
 
16
20
  // src/theme/color.ts
17
21
  import { darkColors, lightColors, palette } from "@bestow-ui/tokens";
@@ -180,6 +184,20 @@ var en = {
180
184
  openList: "Show options",
181
185
  clearSelection: "Clear selection",
182
186
  skipToContent: "Skip to main content",
187
+ decrement: "Decrease",
188
+ increment: "Increase",
189
+ steps: "Progress",
190
+ stepCompleted: "completed",
191
+ fileSelect: "Choose files",
192
+ fileDropHint: "or drag and drop here",
193
+ fileList: "Selected files",
194
+ fileRemove: (name) => `Remove ${name}`,
195
+ filesSelected: (count) => `${count} ${count === 1 ? "file" : "files"} selected`,
196
+ fileRemoved: (name) => `${name} removed`,
197
+ fileTooLarge: (name, maxSize) => `${name}: files must be ${maxSize} or smaller.`,
198
+ fileTypeNotAllowed: (name) => `${name}: this file type is not allowed.`,
199
+ fileTooMany: (maxFiles) => `You can upload up to ${maxFiles} files.`,
200
+ errorSummaryTitle: (count) => `There ${count === 1 ? "is 1 problem" : `are ${count} problems`} with your answers`,
183
201
  rangeStart: "minimum",
184
202
  rangeEnd: "maximum",
185
203
  agreeAll: "Agree to all",
@@ -224,15 +242,238 @@ var en = {
224
242
  };
225
243
 
226
244
  // src/components/AgreementGroup/agreements.ts
227
- function hasAllRequiredAgreements(items, value) {
228
- return items.every((item) => !item.required || value.includes(item.value));
245
+ function hasAllRequiredAgreements(items, value2) {
246
+ return items.every((item2) => !item2.required || value2.includes(item2.value));
229
247
  }
248
+
249
+ // src/components/Badge/Badge.tsx
250
+ import { forwardRef } from "react";
251
+
252
+ // src/components/Badge/Badge.css.ts
253
+ import { createRuntimeFn as _7a468 } from "@vanilla-extract/recipes/createRuntimeFn";
254
+ 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" }, size: { sm: "_1295cfnd", md: "_1295cfne", lg: "_1295cfnf" } }, defaultVariants: { variant: "soft", color: "neutral", size: "md" }, compoundVariants: [] });
255
+ var icon = "_1295cfng";
256
+
257
+ // src/components/Badge/Badge.tsx
258
+ import { jsx, jsxs } from "react/jsx-runtime";
259
+ var Badge = /* @__PURE__ */ forwardRef(function Badge2({ variant, color, size, startIcon, className, children, ...rest }, ref) {
260
+ return /* @__PURE__ */ jsxs("span", { ref, className: cx(badge({ variant, color, size }), className), ...rest, children: [
261
+ startIcon && /* @__PURE__ */ jsx("span", { className: icon, children: startIcon }),
262
+ children
263
+ ] });
264
+ });
265
+
266
+ // src/components/Card/Card.tsx
267
+ import { forwardRef as forwardRef2 } from "react";
268
+
269
+ // src/components/Card/Card.css.ts
270
+ import { createRuntimeFn as _7a4682 } from "@vanilla-extract/recipes/createRuntimeFn";
271
+ var body = "dnuf1u9";
272
+ var card = /* @__PURE__ */ _7a4682({ 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: [] });
273
+ var footer = "dnuf1ua";
274
+ var header = "dnuf1u8";
275
+
276
+ // src/components/Card/Card.tsx
277
+ import { jsx as jsx2 } from "react/jsx-runtime";
278
+ var Card = /* @__PURE__ */ forwardRef2(function Card2({ variant, padding, as: Component = "div", className, ...rest }, ref) {
279
+ return /* @__PURE__ */ jsx2(Component, { ref, className: cx(card({ variant, padding }), className), ...rest });
280
+ });
281
+ var CardHeader = /* @__PURE__ */ forwardRef2(function CardHeader2({ className, ...rest }, ref) {
282
+ return /* @__PURE__ */ jsx2("div", { ref, className: cx(header, className), ...rest });
283
+ });
284
+ var CardBody = /* @__PURE__ */ forwardRef2(function CardBody2({ className, ...rest }, ref) {
285
+ return /* @__PURE__ */ jsx2("div", { ref, className: cx(body, className), ...rest });
286
+ });
287
+ var CardFooter = /* @__PURE__ */ forwardRef2(function CardFooter2({ className, ...rest }, ref) {
288
+ return /* @__PURE__ */ jsx2("div", { ref, className: cx(footer, className), ...rest });
289
+ });
290
+
291
+ // src/components/DescriptionList/DescriptionList.tsx
292
+ import { assignInlineVars } from "@vanilla-extract/dynamic";
293
+ import { forwardRef as forwardRef3 } from "react";
294
+
295
+ // src/components/DescriptionList/DescriptionList.css.ts
296
+ import { createRuntimeFn as _7a4683 } from "@vanilla-extract/recipes/createRuntimeFn";
297
+ var description = "_14g0ot47";
298
+ var item = /* @__PURE__ */ _7a4683({ defaultClassName: "_14g0ot42", variantClassNames: { layout: { horizontal: "_14g0ot43", vertical: "_14g0ot44" }, divided: { true: "_14g0ot45" } }, defaultVariants: { layout: "horizontal" }, compoundVariants: [] });
299
+ var root = "_14g0ot41";
300
+ var term = "_14g0ot46";
301
+ var termWidth = "var(--_14g0ot40)";
302
+
303
+ // src/components/DescriptionList/DescriptionList.tsx
304
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
305
+ var DescriptionList = /* @__PURE__ */ forwardRef3(
306
+ function DescriptionList2({ items, layout = "horizontal", termWidth: termWidth2, divided, className, style, ...rest }, ref) {
307
+ return /* @__PURE__ */ jsx3(
308
+ "dl",
309
+ {
310
+ ref,
311
+ className: cx(root, className),
312
+ style: termWidth2 ? { ...assignInlineVars({ [termWidth]: termWidth2 }), ...style } : style,
313
+ ...rest,
314
+ children: items.map((item2, index) => /* @__PURE__ */ jsxs2("div", { className: item({ layout, divided }), children: [
315
+ /* @__PURE__ */ jsx3("dt", { className: term, children: item2.term }),
316
+ /* @__PURE__ */ jsx3("dd", { className: description, children: item2.description })
317
+ ] }, index))
318
+ }
319
+ );
320
+ }
321
+ );
322
+
323
+ // src/components/Divider/Divider.tsx
324
+ import { forwardRef as forwardRef4 } from "react";
325
+
326
+ // src/components/Divider/Divider.css.ts
327
+ import { createRuntimeFn as _7a4684 } from "@vanilla-extract/recipes/createRuntimeFn";
328
+ var divider = /* @__PURE__ */ _7a4684({ defaultClassName: "_1t3gq8v0", variantClassNames: { orientation: { horizontal: "_1t3gq8v1", vertical: "_1t3gq8v2" } }, defaultVariants: { orientation: "horizontal" }, compoundVariants: [] });
329
+ var labeled = "_1t3gq8v3";
330
+ var line = "_1t3gq8v4";
331
+
332
+ // src/components/Divider/Divider.tsx
333
+ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
334
+ var Divider = /* @__PURE__ */ forwardRef4(function Divider2({ orientation = "horizontal", decorative, className, children, ...rest }, ref) {
335
+ if (children && orientation === "horizontal") {
336
+ return /* @__PURE__ */ jsxs3("div", { ref, className: cx(labeled, className), ...rest, children: [
337
+ /* @__PURE__ */ jsx4("span", { className: line, "aria-hidden": true }),
338
+ children,
339
+ /* @__PURE__ */ jsx4("span", { className: line, "aria-hidden": true })
340
+ ] });
341
+ }
342
+ const a11y = decorative ? { role: "none" } : { role: "separator", "aria-orientation": orientation === "vertical" ? "vertical" : void 0 };
343
+ return /* @__PURE__ */ jsx4("div", { ref, className: cx(divider({ orientation }), className), ...a11y, ...rest });
344
+ });
345
+
346
+ // src/components/Progress/Progress.tsx
347
+ import { forwardRef as forwardRef5, useId } from "react";
348
+
349
+ // src/components/Progress/Progress.css.ts
350
+ import { createRuntimeFn as _7a4685 } from "@vanilla-extract/recipes/createRuntimeFn";
351
+ var header2 = "_1tvkq001";
352
+ var indicator = /* @__PURE__ */ _7a4685({ defaultClassName: "_1tvkq008", variantClassNames: { color: { primary: "_1tvkq009", neutral: "_1tvkq00a", success: "_1tvkq00b", warning: "_1tvkq00c", danger: "_1tvkq00d" } }, defaultVariants: { color: "primary" }, compoundVariants: [] });
353
+ var label = "_1tvkq002";
354
+ var root2 = "_1tvkq000";
355
+ var track = /* @__PURE__ */ _7a4685({ defaultClassName: "_1tvkq004", variantClassNames: { size: { sm: "_1tvkq005", md: "_1tvkq006", lg: "_1tvkq007" } }, defaultVariants: { size: "md" }, compoundVariants: [] });
356
+ var value = "_1tvkq003";
357
+
358
+ // src/components/Progress/Progress.tsx
359
+ import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
360
+ var defaultFormat = (value2, max) => `${Math.round(value2 / max * 100)}%`;
361
+ var Progress = /* @__PURE__ */ forwardRef5(function Progress2({
362
+ value: value2,
363
+ max = 100,
364
+ label: label2,
365
+ "aria-label": ariaLabel,
366
+ showValue,
367
+ formatValue = defaultFormat,
368
+ size,
369
+ color,
370
+ className,
371
+ ...rest
372
+ }, ref) {
373
+ const labelId = useId();
374
+ const isIndeterminate = value2 === void 0 || value2 === null;
375
+ const safeMax = max > 0 ? max : 100;
376
+ const clamped = isIndeterminate ? 0 : Math.min(safeMax, Math.max(0, value2));
377
+ const valueText = isIndeterminate ? void 0 : formatValue(clamped, safeMax);
378
+ return /* @__PURE__ */ jsxs4("div", { ref, className: cx(root2, className), ...rest, children: [
379
+ (label2 || showValue && valueText) && /* @__PURE__ */ jsxs4("div", { className: header2, children: [
380
+ label2 && /* @__PURE__ */ jsx5("span", { id: labelId, className: label, children: label2 }),
381
+ showValue && valueText && /* @__PURE__ */ jsx5("span", { className: value, "aria-hidden": true, children: valueText })
382
+ ] }),
383
+ /* @__PURE__ */ jsx5(
384
+ "div",
385
+ {
386
+ role: "progressbar",
387
+ "aria-labelledby": label2 ? labelId : void 0,
388
+ "aria-label": label2 ? void 0 : ariaLabel,
389
+ "aria-valuemin": 0,
390
+ "aria-valuemax": safeMax,
391
+ "aria-valuenow": isIndeterminate ? void 0 : clamped,
392
+ "aria-valuetext": valueText,
393
+ className: track({ size }),
394
+ children: /* @__PURE__ */ jsx5(
395
+ "div",
396
+ {
397
+ className: indicator({ color }),
398
+ "data-state": isIndeterminate ? "indeterminate" : clamped >= safeMax ? "complete" : "loading",
399
+ style: isIndeterminate ? void 0 : { width: `${clamped / safeMax * 100}%` }
400
+ }
401
+ )
402
+ }
403
+ )
404
+ ] });
405
+ });
406
+
407
+ // src/components/Stack/Stack.tsx
408
+ import { forwardRef as forwardRef6 } from "react";
409
+
410
+ // src/components/Stack/Stack.css.ts
411
+ import { createRuntimeFn as _7a4686 } from "@vanilla-extract/recipes/createRuntimeFn";
412
+ var stack = /* @__PURE__ */ _7a4686({ 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: { direction: "column" }, compoundVariants: [] });
413
+
414
+ // src/components/Stack/Stack.tsx
415
+ import { jsx as jsx6 } from "react/jsx-runtime";
416
+ var Stack = /* @__PURE__ */ forwardRef6(function Stack2({ as: Component = "div", direction, gap, align, justify, wrap, className, ...rest }, ref) {
417
+ return /* @__PURE__ */ jsx6(Component, { ref, className: cx(stack({ direction, gap, align, justify, wrap }), className), ...rest });
418
+ });
419
+
420
+ // src/components/Typography/Typography.tsx
421
+ import { forwardRef as forwardRef7 } from "react";
422
+
423
+ // src/components/Typography/Typography.css.ts
424
+ import { createRuntimeFn as _7a4687 } from "@vanilla-extract/recipes/createRuntimeFn";
425
+ var typography = /* @__PURE__ */ _7a4687({ 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: [] });
426
+
427
+ // src/components/Typography/Typography.tsx
428
+ import { jsx as jsx7 } from "react/jsx-runtime";
429
+ var defaultElement = {
430
+ display: "h1",
431
+ h1: "h1",
432
+ h2: "h2",
433
+ h3: "h3",
434
+ h4: "h4",
435
+ "body-lg": "p",
436
+ body: "p",
437
+ "body-sm": "p",
438
+ caption: "span"
439
+ };
440
+ var Typography = /* @__PURE__ */ forwardRef7(function Typography2({ variant = "body", as, color, weight, align, truncate, className, ...rest }, ref) {
441
+ const Component = as ?? defaultElement[variant];
442
+ return /* @__PURE__ */ jsx7(
443
+ Component,
444
+ {
445
+ ref,
446
+ className: cx(typography({ variant, color, weight, align, truncate }), className),
447
+ ...rest
448
+ }
449
+ );
450
+ });
451
+
452
+ // src/components/VisuallyHidden/VisuallyHidden.tsx
453
+ import { forwardRef as forwardRef8 } from "react";
454
+ import { jsx as jsx8 } from "react/jsx-runtime";
455
+ var VisuallyHidden = /* @__PURE__ */ forwardRef8(function VisuallyHidden2({ as: Component = "span", className, ...rest }, ref) {
456
+ return /* @__PURE__ */ jsx8(Component, { ref, className: cx(visuallyHidden, className), ...rest });
457
+ });
230
458
  export {
459
+ Badge,
460
+ Card,
461
+ CardBody,
462
+ CardFooter,
463
+ CardHeader,
464
+ DescriptionList,
465
+ Divider,
466
+ Progress,
467
+ Skeleton,
468
+ Stack,
469
+ Typography,
470
+ VisuallyHidden,
231
471
  composeExtraAddress,
232
472
  contrastRatio,
233
473
  createIntentColors,
234
474
  createTheme,
235
475
  en,
476
+ focusField,
236
477
  formatBusinessNumber,
237
478
  formatKoreanAmount,
238
479
  formatKoreanDate,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/theme/color.ts","../src/i18n/en.ts","../src/components/AgreementGroup/agreements.ts"],"sourcesContent":["// 대표색 하나로 intent 색 세트를 만드는 색 계산 유틸.\n// OKLCH(사람이 느끼는 밝기에 가까운 색 공간)에서 밝기를 조절하고, WCAG 대비(4.5:1)를 만족하도록 글자색을 찾는다.\nimport { darkColors, lightColors, palette } from '@bestow-ui/tokens';\nimport type { ThemeInput } from './createTheme';\n\ntype Rgb = [number, number, number]; // 0~1, sRGB\ninterface Oklch {\n l: number;\n c: number;\n h: number;\n}\n\nexport function parseHex(hex: string): Rgb {\n const m = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(hex.trim());\n if (!m) throw new Error(`올바른 hex 색이 아니에요: \"${hex}\" (예: \"#7c3aed\")`);\n let h = m[1]!;\n if (h.length === 3) h = h.replace(/./g, (c) => c + c);\n return [0, 2, 4].map((i) => parseInt(h.slice(i, i + 2), 16) / 255) as Rgb;\n}\n\nexport function toHex(rgb: Rgb): string {\n return `#${rgb\n .map((v) =>\n Math.round(Math.min(1, Math.max(0, v)) * 255)\n .toString(16)\n .padStart(2, '0'),\n )\n .join('')}`;\n}\n\nconst toLinear = (c: number) => (c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4);\nconst fromLinear = (c: number) => (c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055);\n\nfunction rgbToOklch([r, g, b]: Rgb): Oklch {\n const [lr, lg, lb] = [toLinear(r), toLinear(g), toLinear(b)];\n const l_ = Math.cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb);\n const m_ = Math.cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb);\n const s_ = Math.cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb);\n const L = 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_;\n const a = 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_;\n const bb = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_;\n return { l: L, c: Math.hypot(a, bb), h: Math.atan2(bb, a) };\n}\n\nfunction oklchToRgbUnclamped({ l, c, h }: Oklch): Rgb {\n const a = c * Math.cos(h);\n const b = c * Math.sin(h);\n const l_ = (l + 0.3963377774 * a + 0.2158037573 * b) ** 3;\n const m_ = (l - 0.1055613458 * a - 0.0638541728 * b) ** 3;\n const s_ = (l - 0.0894841775 * a - 1.291485548 * b) ** 3;\n return [\n fromLinear(4.0767416621 * l_ - 3.3077115913 * m_ + 0.2309699292 * s_),\n fromLinear(-1.2684380046 * l_ + 2.6097574011 * m_ - 0.3413193965 * s_),\n fromLinear(-0.0041960863 * l_ - 0.7034186147 * m_ + 1.707614701 * s_),\n ];\n}\n\nconst inGamut = (rgb: Rgb) => rgb.every((v) => v >= -1e-4 && v <= 1 + 1e-4);\n\n/** sRGB 범위를 벗어나면 채도(c)를 줄여 범위 안으로 맞춘다. */\nfunction oklchToRgb(color: Oklch): Rgb {\n const l = Math.min(1, Math.max(0, color.l));\n let rgb = oklchToRgbUnclamped({ ...color, l });\n if (inGamut(rgb)) return rgb;\n let lo = 0;\n let hi = color.c;\n for (let i = 0; i < 20; i++) {\n const mid = (lo + hi) / 2;\n if (inGamut(oklchToRgbUnclamped({ l, c: mid, h: color.h }))) lo = mid;\n else hi = mid;\n }\n rgb = oklchToRgbUnclamped({ l, c: lo, h: color.h });\n return rgb;\n}\n\nfunction luminance([r, g, b]: Rgb): number {\n return 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n}\n\n/** WCAG 대비율 (1 ~ 21) */\nexport function contrastRatio(a: string, b: string): number {\n const [la, lb] = [luminance(parseHex(a)), luminance(parseHex(b))];\n return (Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05);\n}\n\n/** fg 를 alpha 만큼 bg 위에 겹친 결과 색 */\nfunction blend(fg: string, alpha: number, bg: string): string {\n const [f, b] = [parseHex(fg), parseHex(bg)];\n return toHex(f.map((v, i) => v * alpha + b[i]! * (1 - alpha)) as Rgb);\n}\n\nconst withL = (base: Oklch, l: number, c = base.c) => toHex(oklchToRgb({ l, c, h: base.h }));\n\n/** 대상 배경들 위에서 대비 4.5 를 넘을 때까지 밝기를 step 만큼 옮긴다. */\nfunction findReadable(base: Oklch, startL: number, step: number, backgrounds: string[]): string {\n let l = startL;\n for (let i = 0; i < 40; i++) {\n const hex = withL(base, l);\n if (backgrounds.every((bg) => contrastRatio(hex, bg) >= 4.5)) return hex;\n l = Math.min(1, Math.max(0, l + step));\n }\n return step < 0 ? palette.black : palette.white;\n}\n\n/**\n * solid 의 hover 색: 밝기를 delta 만큼 옮기되, 그 결과에서 글자색(contrast) 대비가 4.5 아래로 떨어지면 반대 방향으로 옮긴다.\n * (예: 다크 모드에서 파란 버튼을 밝게 하면 흰 글자 대비가 떨어지므로 어둡게 한다)\n */\nfunction hoverFor(base: Oklch, delta: number, contrast: string): string {\n const preferred = withL(base, Math.min(1, Math.max(0, base.l + delta)));\n if (contrastRatio(contrast, preferred) >= 4.5) return preferred;\n return withL(base, Math.min(1, Math.max(0, base.l - delta)));\n}\n\n/**\n * solid 배경과 그 위 글자색(contrast). 흰 글자가 4.5 를 넘으면 흰색, 아니면 짙은 글자.\n * 둘 다 4.5 미만인 중간 밝기 색(초록 #059669, 주황 #ea580c 등)은 solid 의 밝기를 가장 적게 옮겨 4.5 를 맞춘다\n * (같은 거리면 어둡게 + 흰 글자를 먼저 고른다).\n */\nfunction solidWithContrast(color: string): { solid: string; contrast: string } {\n const white = palette.white;\n const dark = palette.gray[900];\n if (contrastRatio(white, color) >= 4.5) return { solid: color, contrast: white };\n if (contrastRatio(dark, color) >= 4.5) return { solid: color, contrast: dark };\n const base = rgbToOklch(parseHex(color));\n for (let delta = 0.005; delta <= 1; delta += 0.005) {\n const darker = withL(base, Math.max(0, base.l - delta));\n if (contrastRatio(white, darker) >= 4.5) return { solid: darker, contrast: white };\n const lighter = withL(base, Math.min(1, base.l + delta));\n if (contrastRatio(dark, lighter) >= 4.5) return { solid: lighter, contrast: dark };\n }\n return { solid: palette.black, contrast: white };\n}\n\nconst rgba = (hex: string, alpha: number) => {\n const [r, g, b] = parseHex(hex).map((v) => Math.round(v * 255));\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n};\n\nexport type IntentName = 'primary' | 'neutral' | 'danger' | 'success' | 'warning';\n\n/**\n * 대표색 하나로 intent(primary 등)의 라이트·다크 색 세트를 만든다. 결과는 createTheme 에 넘긴다.\n * - solid 는 넘긴 색을 그대로 쓴다 (다크모드에서 너무 어두우면 조금 밝힌다). 단 흰 글자·짙은 글자 모두\n * 대비 4.5:1 이 안 나오는 중간 밝기 색이면 4.5 가 나올 만큼만 밝기를 옮긴다.\n * - text 와 contrast(solid 위 글자색)는 WCAG AA 대비 4.5:1 을 만족하도록 계산한다.\n * - intent 가 'primary' 면 포커스 링 색(border.focus)도 함께 바꾼다.\n *\n * @example createTheme(createIntentColors('primary', '#7c3aed'))\n */\nexport function createIntentColors(intent: IntentName, color: string): ThemeInput {\n const input = toHex(parseHex(color));\n const base = rgbToOklch(parseHex(input));\n\n // 라이트\n const lightSubtle = withL(base, 0.97, Math.min(base.c, 0.12) * 0.3);\n const lightSubtleHover = withL(base, 0.93, Math.min(base.c, 0.12) * 0.45);\n const { solid, contrast: lightContrast } = solidWithContrast(input);\n const light = {\n solid,\n solidHover: hoverFor(rgbToOklch(parseHex(solid)), -0.06, lightContrast),\n contrast: lightContrast,\n subtle: lightSubtle,\n subtleHover: lightSubtleHover,\n text: findReadable(base, Math.min(base.l, 0.55), -0.02, [lightColors.bg.default, lightSubtle, lightSubtleHover]),\n };\n\n // 다크\n const darkBg = darkColors.bg.default;\n const { solid: darkSolid, contrast: darkContrast } = solidWithContrast(base.l < 0.5 ? withL(base, 0.55) : input);\n const darkBase = rgbToOklch(parseHex(darkSolid));\n const darkSubtleOnBg = blend(darkSolid, 0.16, darkBg);\n const darkSubtleHoverOnBg = blend(darkSolid, 0.26, darkBg);\n const dark = {\n solid: darkSolid,\n solidHover: hoverFor(darkBase, 0.06, darkContrast),\n contrast: darkContrast,\n subtle: rgba(darkSolid, 0.16),\n subtleHover: rgba(darkSolid, 0.26),\n text: findReadable(darkBase, Math.max(darkBase.l, 0.75), 0.02, [darkBg, darkSubtleOnBg, darkSubtleHoverOnBg]),\n };\n\n // primary 는 포커스 링(border.focus)도 브랜드 색을 따라가게 한다. 다크는 어두운 배경에서 잘 보이도록 solid 보다 밝게.\n // 포커스 링은 그래픽이라 배경과 3:1 이상이어야 한다(WCAG 1.4.11). 노랑·하늘색처럼 밝은 색은 라이트에서 미달이므로\n // 그때는 배경 대비 4.5:1 이 보장된 text 색을 쓴다.\n const focusOn = (candidate: string, fallback: string, bg: string) =>\n contrastRatio(candidate, bg) >= 3 ? candidate : fallback;\n const focus =\n intent === 'primary'\n ? {\n light: { border: { focus: focusOn(light.solid, light.text, lightColors.bg.default) } },\n dark: {\n border: { focus: focusOn(withL(darkBase, Math.min(1, darkBase.l + 0.06)), dark.text, darkBg) },\n },\n }\n : undefined;\n\n return {\n light: { color: { [intent]: light, ...focus?.light } },\n dark: { color: { [intent]: dark, ...focus?.dark } },\n } as ThemeInput;\n}\n","import type { BestowMessages } from './LocaleProvider';\n\nconst WEEKDAYS_LONG = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] as const;\nconst MONTHS = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n] as const;\n\n/**\n * 영어 문구. `<LocaleProvider messages={en}>` 로 쓴다. 따로 import 할 때만 번들에 들어간다.\n * 한국 서비스 전용 부품(사업자등록번호 등)의 문구도 영어로 바뀌지만 서식(하이픈 위치 등)은 그대로다.\n */\nexport const en: BestowMessages = {\n close: 'Close',\n loading: 'Loading',\n notifications: 'Notifications',\n breadcrumb: 'Breadcrumb',\n pagination: 'Pagination',\n paginationPrevious: 'Previous page',\n paginationNext: 'Next page',\n paginationPage: (page) => `Page ${page}`,\n newWindow: '(opens in a new window)',\n noResults: 'No results',\n openList: 'Show options',\n clearSelection: 'Clear selection',\n skipToContent: 'Skip to main content',\n rangeStart: 'minimum',\n rangeEnd: 'maximum',\n agreeAll: 'Agree to all',\n required: 'Required',\n optional: 'Optional',\n show: 'View',\n hide: 'Hide',\n verificationCode: 'Verification code',\n verificationCodeHint: (length, type) => `Enter the ${length}-${type === 'numeric' ? 'digit' : 'character'} code.`,\n resend: 'Resend',\n verificationExpired: 'The code has expired. Please request a new one.',\n phoneNumber: 'Phone number',\n businessNumber: 'Business registration number',\n businessNumberInvalid: 'This business registration number is not valid. Please check it again.',\n businessNumberIncomplete: 'Enter all 10 digits.',\n amount: 'Amount',\n currencyUnit: 'KRW',\n address: 'Address',\n addressSearch: 'Find address',\n addressSearchDescription: 'Search by road name, building name, or lot number.',\n postalCode: 'Postal code',\n baseAddress: 'Address',\n baseAddressPlaceholder: 'Select \"Find address\" to choose an address',\n detailAddress: 'Address line 2',\n detailAddressPlaceholder: 'Apartment, suite, unit, etc.',\n addressLoading: 'Loading address search',\n addressLoadError: 'Could not load address search. Please try again later.',\n previousMonth: 'Previous month',\n nextMonth: 'Next month',\n monthTitle: (year, month) => `${MONTHS[month - 1]} ${year}`,\n weekdaysShort: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n weekdaysLong: WEEKDAYS_LONG,\n dayLabel: (date, weekdayLong) =>\n `${date.getDate()}, ${weekdayLong}, ${MONTHS[date.getMonth()]} ${date.getFullYear()}`,\n holiday: 'holiday',\n today: 'today',\n date: 'Date',\n openCalendar: 'Choose date',\n calendar: 'Calendar',\n dateInvalid: 'This date does not exist.',\n dateUnavailable: 'This date is not available.',\n dateIncomplete: 'Enter the date as YYYY-MM-DD.',\n};\n","import type { ReactNode } from 'react';\n\n// 서버 컴포넌트에서도 부를 수 있도록 컴포넌트(hook·Radix) 파일과 분리한 순수 타입·함수\n\nexport interface AgreementItem {\n value: string;\n /** 약관 이름 (예: \"서비스 이용약관 동의\") */\n label: ReactNode;\n /** 필수 동의 여부. 이름 앞에 \"필수\"/\"선택\" 이 붙는다 */\n required?: boolean;\n /** 펼쳐서 보여 줄 약관 내용. 있으면 \"보기\" 버튼이 생긴다 */\n content?: ReactNode;\n}\n\n/** 필수 항목에 모두 동의했는지 */\nexport function hasAllRequiredAgreements(items: AgreementItem[], value: string[]): boolean {\n return items.every((item) => !item.required || value.includes(item.value));\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/theme/color.ts","../src/i18n/en.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/DescriptionList/DescriptionList.tsx","../src/components/DescriptionList/DescriptionList.css.ts","../src/components/Divider/Divider.tsx","../src/components/Divider/Divider.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';\n\n/**\n * 대표색 하나로 intent(primary 등)의 라이트·다크 색 세트를 만든다. 결과는 createTheme 에 넘긴다.\n * - solid 는 넘긴 색을 그대로 쓴다 (다크모드에서 너무 어두우면 조금 밝힌다). 단 흰 글자·짙은 글자 모두\n * 대비 4.5:1 이 안 나오는 중간 밝기 색이면 4.5 가 나올 만큼만 밝기를 옮긴다.\n * - text 와 contrast(solid 위 글자색)는 WCAG AA 대비 4.5:1 을 만족하도록 계산한다.\n * - intent 가 'primary' 면 포커스 링 색(border.focus)도 함께 바꾼다.\n *\n * @example createTheme(createIntentColors('primary', '#7c3aed'))\n */\nexport function createIntentColors(intent: IntentName, color: string): ThemeInput {\n const input = toHex(parseHex(color));\n const base = rgbToOklch(parseHex(input));\n\n // 라이트\n const lightSubtle = withL(base, 0.97, Math.min(base.c, 0.12) * 0.3);\n const lightSubtleHover = withL(base, 0.93, Math.min(base.c, 0.12) * 0.45);\n const { solid, contrast: lightContrast } = solidWithContrast(input);\n const light = {\n solid,\n solidHover: hoverFor(rgbToOklch(parseHex(solid)), -0.06, lightContrast),\n contrast: lightContrast,\n subtle: lightSubtle,\n subtleHover: lightSubtleHover,\n text: findReadable(base, Math.min(base.l, 0.55), -0.02, [lightColors.bg.default, lightSubtle, lightSubtleHover]),\n };\n\n // 다크\n const darkBg = darkColors.bg.default;\n const { solid: darkSolid, contrast: darkContrast } = solidWithContrast(base.l < 0.5 ? withL(base, 0.55) : input);\n const darkBase = rgbToOklch(parseHex(darkSolid));\n const darkSubtleOnBg = blend(darkSolid, 0.16, darkBg);\n const darkSubtleHoverOnBg = blend(darkSolid, 0.26, darkBg);\n const dark = {\n solid: darkSolid,\n solidHover: hoverFor(darkBase, 0.06, darkContrast),\n contrast: darkContrast,\n subtle: rgba(darkSolid, 0.16),\n subtleHover: rgba(darkSolid, 0.26),\n text: findReadable(darkBase, Math.max(darkBase.l, 0.75), 0.02, [darkBg, darkSubtleOnBg, darkSubtleHoverOnBg]),\n };\n\n // primary 는 포커스 링(border.focus)도 브랜드 색을 따라가게 한다. 다크는 어두운 배경에서 잘 보이도록 solid 보다 밝게.\n // 포커스 링은 그래픽이라 배경과 3:1 이상이어야 한다(WCAG 1.4.11). 노랑·하늘색처럼 밝은 색은 라이트에서 미달이므로\n // 그때는 배경 대비 4.5:1 이 보장된 text 색을 쓴다.\n const focusOn = (candidate: string, fallback: string, bg: string) =>\n contrastRatio(candidate, bg) >= 3 ? candidate : fallback;\n const focus =\n intent === 'primary'\n ? {\n light: { border: { focus: focusOn(light.solid, light.text, lightColors.bg.default) } },\n dark: {\n border: { focus: focusOn(withL(darkBase, Math.min(1, darkBase.l + 0.06)), dark.text, darkBg) },\n },\n }\n : undefined;\n\n return {\n light: { color: { [intent]: light, ...focus?.light } },\n dark: { color: { [intent]: dark, ...focus?.dark } },\n } as ThemeInput;\n}\n","import type { BestowMessages } from './LocaleProvider';\n\nconst WEEKDAYS_LONG = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] as const;\nconst MONTHS = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n] as const;\n\n/**\n * 영어 문구. `<LocaleProvider messages={en}>` 로 쓴다. 따로 import 할 때만 번들에 들어간다.\n * 한국 서비스 전용 부품(사업자등록번호 등)의 문구도 영어로 바뀌지만 서식(하이픈 위치 등)은 그대로다.\n */\nexport const en: BestowMessages = {\n close: 'Close',\n loading: 'Loading',\n notifications: 'Notifications',\n breadcrumb: 'Breadcrumb',\n pagination: 'Pagination',\n paginationPrevious: 'Previous page',\n paginationNext: 'Next page',\n paginationPage: (page) => `Page ${page}`,\n newWindow: '(opens in a new window)',\n noResults: 'No results',\n openList: 'Show options',\n clearSelection: 'Clear selection',\n skipToContent: 'Skip to main content',\n 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 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 amount: 'Amount',\n currencyUnit: 'KRW',\n address: 'Address',\n addressSearch: 'Find address',\n addressSearchDescription: 'Search by road name, building name, or lot number.',\n postalCode: 'Postal code',\n baseAddress: 'Address',\n baseAddressPlaceholder: 'Select \"Find address\" to choose an address',\n detailAddress: 'Address line 2',\n detailAddressPlaceholder: 'Apartment, suite, unit, etc.',\n addressLoading: 'Loading address search',\n addressLoadError: 'Could not load address search. Please try again later.',\n previousMonth: 'Previous month',\n nextMonth: 'Next month',\n monthTitle: (year, month) => `${MONTHS[month - 1]} ${year}`,\n weekdaysShort: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n weekdaysLong: WEEKDAYS_LONG,\n dayLabel: (date, weekdayLong) =>\n `${date.getDate()}, ${weekdayLong}, ${MONTHS[date.getMonth()]} ${date.getFullYear()}`,\n holiday: 'holiday',\n today: 'today',\n date: 'Date',\n openCalendar: 'Choose date',\n calendar: 'Calendar',\n dateInvalid: 'This date does not exist.',\n dateUnavailable: 'This date is not available.',\n dateIncomplete: 'Enter the date as YYYY-MM-DD.',\n};\n","import type { ReactNode } from 'react';\n\n// 서버 컴포넌트에서도 부를 수 있도록 컴포넌트(hook·Radix) 파일과 분리한 순수 타입·함수\n\nexport interface AgreementItem {\n value: string;\n /** 약관 이름 (예: \"서비스 이용약관 동의\") */\n label: ReactNode;\n /** 필수 동의 여부. 이름 앞에 \"필수\"/\"선택\" 이 붙는다 */\n required?: boolean;\n /** 펼쳐서 보여 줄 약관 내용. 있으면 \"보기\" 버튼이 생긴다 */\n content?: ReactNode;\n}\n\n/** 필수 항목에 모두 동의했는지 */\nexport function hasAllRequiredAgreements(items: AgreementItem[], value: string[]): boolean {\n return items.every((item) => !item.required || value.includes(item.value));\n}\n","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 /** 의미 색상 */\n color?: 'primary' | 'neutral' | 'danger' | 'success' | 'warning';\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-2XTW_jNhCG7_kVA-fSAJIhUh-2tKcuii3QIotiA_ROSaQjrCQapLRxttj_XlCSZVseKkb30BwUODaseTnkvPwwn0RJ2cA_dwCum3LdyBdX71nGXS8B78P1Y5JAsD8gAZrAFg34CRCKRoIESIRGwgSoh0aiBCg-gG0CPt4P8RII8HSEJhDg4yZRAtG0K8XyotVuLWs-9WcI6eraoSFU5dceDaFyh7g0xA4l4tMQE21ZJhDHcTyJC1k3rmBVUb66mtU6gdVfije8zpnK4W-mCpaWfOXA6akDLtvvS-7qV93wyoGPZVF_fWTZU_f9k6wbB_qY2xYOrH41anj6DX6XzXORwWcuVw6sPstGwhOrNfz5ZeWA6d3VXBXCOsBK1jKB1R-8-ahYUWt4lLVJ1RZdqJsPB54-mcfuF75rS6YceOR1KR0YFdfpdfGduwedgLfehIpXFoWZMm-9nZOYqSP2cDd9a0JnMnSzuJ5T0F4yo_B7xexIA6Ohto5eeLF7blzVe2i2hWcVVTwv2iqBcEajeVWksswTiGZUvWKDKcqi5u5zL2vMe-_SvLCWqmK9WfNCxUt24Gbu1ptLad4q1hSydgXTpk_qVRoXHDujnlWiS_liTp-p4Ltb1Dk_uPIbVyV7TYD4Ew-OikrmXUE-weO5kvtcvtRGQnFJI_tKplN6isuyKfYJkOmEZrKUyk13bs4Fa8smgXvR_eEq3aZNyY1oK2LBcFHVNsb3e0GEL0JcU9TfuNImEyU0pDGuGs1Tu5T94jkwvNZB-IC0EOdlWPOK0wiDOPTCDa4ZS42iiG8iXHQqw-6aVDlXZwPLOaccyzcodaNkvUvgnuVpmOZ2oZBZqxO499NICCzhXhUVU6-ulmVhyqVhGPD0LaH7bGxP4J7kAc23M_JM1o3qVp69_DH10U7ORXCDchxFnvJI8Bl9ww_N3Ghr3jaKlaMLfuCzANsFF8Kxf-s6OspvcWFMPe4f2964VI6j4DHP-FzmwQVrcTmrd2ZxDSbkGY0otmbOdWPvaUwyktnVt1hwTDw6wAUV9C3hOARhds2MfKjfOlLdZhnXejSAhFvPxzbXhfC0F6Io9IMZ-S0WjKlHDzyRi7ms072QiYxj59VRf9wLtuJemKqLeje6IMKYe9iJcCE89R9vNh62ao7yMxes-2ZMPbogRIoeS5fKs6Ug_Axz4agfXIhp4HmXJ4d-Zrn5MLc-IPsD0P3h6sfFix6wRuYe6Jn7fXdbv261RVuZ66HXt_CxZoQ-fLj7cbduvrJdk3oLji04tuDYgmMLji04tuDYgmMLji04tuDYgmMLjv0fOEYWHFtwbMGxBccWHFtwrMcFEpEtwX4dz3FsDqKOsGO9Gl7g2BzYWXEsehvHrHnPcMxKRuc4ZqUicRtVTnHMyoD_FcciL_bQSt8jjnUzGcYOEEIcoEHU3UkibDpxPkMT0NkEx-uZnwYC83MKbG-yz6VPb6LVLZfUKbB1ZdIwdOD0dn3nm0M4PAMJ5jIMTlkrem9Q19foxw5E2_7ftphQyMOa40vpEvpExkKG-fMeoa8r0g8cIPHGgTiwe4RDINYeN2kChduIC4bN909CoUhTQTGXfgYK-6UQhA6QcGsOF7tNOCWiCXCfJtgostwPLhfJTdgYzlCjN7SzHiPOHFrimXuynM9MusR2-jR-_PgXHH1O55cpAAA';\nimport 'src/components/Badge/Badge.css.ts.vanilla.css?source=#H4sIAAAAAAAAA7WWwW6jMBCG7zyFj7sHVwlpd1vyMNVgD8SqsS3blGRXffcVTk0IJJF92AtInvn_n2-MME_v2_LthTXqmfwtCOHCGQmnigglhULaSDzuC0JAilZR4bFzFWGoPNpxuQVTkU-wPyit0Xk9UGeAId3-HKu1thxtRbbmSJyWghNvQTkDFpW_NFALXPRuYXRepE0vZTBrtPK0gU7I06JzVqEOlLu0Dyjag7_Vfq7QDrnouyAIuIe7glmZ-vEaRMNBeDwzV0TpwYIZlz_ResFA0jC2inSCc4n74qt4iuN-CeOugX20VveKU6altjE5dm1Cys3SOOKZ368kv_K-3-7a7_cdv9s7mPvwi7DXEDZTLnYgeFBjRQf2RMOrFLxn03ioYFp5C84vROXjmL72EheS3UOJx6O_JntLIlPYewsygywqssimmHSyKFmTQRIZB9WizQD7FmRxxZB0rG_FmqpOonI9Y-hcBlZUZHFNMelgUbImY0lkA1glVJtBFhVZZFNMOlmUrMl4IOuEmj7f5caEU8sA56PmfJjdPKnKy2nhxJ9lz7ROj-46FNehz_89tFmHviaH7hJDXXcd2j78MRjv1B2sUB8V2eyLr3_qQ3MiUQgAAA';\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'},size:{sm:'_1295cfnd',md:'_1295cfne',lg:'_1295cfnf'}},defaultVariants:{variant:'soft',color:'neutral',size:'md'},compoundVariants:[]});\nexport var icon = '_1295cfng';","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-2XTW_jNhCG7_kVA-fSAJIhUh-2tKcuii3QIotiA_ROSaQjrCQapLRxttj_XlCSZVseKkb30BwUODaseTnkvPwwn0RJ2cA_dwCum3LdyBdX71nGXS8B78P1Y5JAsD8gAZrAFg34CRCKRoIESIRGwgSoh0aiBCg-gG0CPt4P8RII8HSEJhDg4yZRAtG0K8XyotVuLWs-9WcI6eraoSFU5dceDaFyh7g0xA4l4tMQE21ZJhDHcTyJC1k3rmBVUb66mtU6gdVfije8zpnK4W-mCpaWfOXA6akDLtvvS-7qV93wyoGPZVF_fWTZU_f9k6wbB_qY2xYOrH41anj6DX6XzXORwWcuVw6sPstGwhOrNfz5ZeWA6d3VXBXCOsBK1jKB1R-8-ahYUWt4lLVJ1RZdqJsPB54-mcfuF75rS6YceOR1KR0YFdfpdfGduwedgLfehIpXFoWZMm-9nZOYqSP2cDd9a0JnMnSzuJ5T0F4yo_B7xexIA6Ohto5eeLF7blzVe2i2hWcVVTwv2iqBcEajeVWksswTiGZUvWKDKcqi5u5zL2vMe-_SvLCWqmK9WfNCxUt24Gbu1ptLad4q1hSydgXTpk_qVRoXHDujnlWiS_liTp-p4Ltb1Dk_uPIbVyV7TYD4Ew-OikrmXUE-weO5kvtcvtRGQnFJI_tKplN6isuyKfYJkOmEZrKUyk13bs4Fa8smgXvR_eEq3aZNyY1oK2LBcFHVNsb3e0GEL0JcU9TfuNImEyU0pDGuGs1Tu5T94jkwvNZB-IC0EOdlWPOK0wiDOPTCDa4ZS42iiG8iXHQqw-6aVDlXZwPLOaccyzcodaNkvUvgnuVpmOZ2oZBZqxO499NICCzhXhUVU6-ulmVhyqVhGPD0LaH7bGxP4J7kAc23M_JM1o3qVp69_DH10U7ORXCDchxFnvJI8Bl9ww_N3Ghr3jaKlaMLfuCzANsFF8Kxf-s6OspvcWFMPe4f2964VI6j4DHP-FzmwQVrcTmrd2ZxDSbkGY0otmbOdWPvaUwyktnVt1hwTDw6wAUV9C3hOARhds2MfKjfOlLdZhnXejSAhFvPxzbXhfC0F6Io9IMZ-S0WjKlHDzyRi7ms072QiYxj59VRf9wLtuJemKqLeje6IMKYe9iJcCE89R9vNh62ao7yMxes-2ZMPbogRIoeS5fKs6Ug_Axz4agfXIhp4HmXJ4d-Zrn5MLc-IPsD0P3h6sfFix6wRuYe6Jn7fXdbv261RVuZ66HXt_CxZoQ-fLj7cbduvrJdk3oLji04tuDYgmMLji04tuDYgmMLji04tuDYgmMLjv0fOEYWHFtwbMGxBccWHFtwrMcFEpEtwX4dz3FsDqKOsGO9Gl7g2BzYWXEsehvHrHnPcMxKRuc4ZqUicRtVTnHMyoD_FcciL_bQSt8jjnUzGcYOEEIcoEHU3UkibDpxPkMT0NkEx-uZnwYC83MKbG-yz6VPb6LVLZfUKbB1ZdIwdOD0dn3nm0M4PAMJ5jIMTlkrem9Q19foxw5E2_7ftphQyMOa40vpEvpExkKG-fMeoa8r0g8cIPHGgTiwe4RDINYeN2kChduIC4bN909CoUhTQTGXfgYK-6UQhA6QcGsOF7tNOCWiCXCfJtgostwPLhfJTdgYzlCjN7SzHiPOHFrimXuynM9MusR2-jR-_PgXHH1O55cpAAA';\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 { 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-2XTW_jNhCG7_kVA-fSAJIhUh-2tKcuii3QIotiA_ROSaQjrCQapLRxttj_XlCSZVseKkb30BwUODaseTnkvPwwn0RJ2cA_dwCum3LdyBdX71nGXS8B78P1Y5JAsD8gAZrAFg34CRCKRoIESIRGwgSoh0aiBCg-gG0CPt4P8RII8HSEJhDg4yZRAtG0K8XyotVuLWs-9WcI6eraoSFU5dceDaFyh7g0xA4l4tMQE21ZJhDHcTyJC1k3rmBVUb66mtU6gdVfije8zpnK4W-mCpaWfOXA6akDLtvvS-7qV93wyoGPZVF_fWTZU_f9k6wbB_qY2xYOrH41anj6DX6XzXORwWcuVw6sPstGwhOrNfz5ZeWA6d3VXBXCOsBK1jKB1R-8-ahYUWt4lLVJ1RZdqJsPB54-mcfuF75rS6YceOR1KR0YFdfpdfGduwedgLfehIpXFoWZMm-9nZOYqSP2cDd9a0JnMnSzuJ5T0F4yo_B7xexIA6Ohto5eeLF7blzVe2i2hWcVVTwv2iqBcEajeVWksswTiGZUvWKDKcqi5u5zL2vMe-_SvLCWqmK9WfNCxUt24Gbu1ptLad4q1hSydgXTpk_qVRoXHDujnlWiS_liTp-p4Ltb1Dk_uPIbVyV7TYD4Ew-OikrmXUE-weO5kvtcvtRGQnFJI_tKplN6isuyKfYJkOmEZrKUyk13bs4Fa8smgXvR_eEq3aZNyY1oK2LBcFHVNsb3e0GEL0JcU9TfuNImEyU0pDGuGs1Tu5T94jkwvNZB-IC0EOdlWPOK0wiDOPTCDa4ZS42iiG8iXHQqw-6aVDlXZwPLOaccyzcodaNkvUvgnuVpmOZ2oZBZqxO499NICCzhXhUVU6-ulmVhyqVhGPD0LaH7bGxP4J7kAc23M_JM1o3qVp69_DH10U7ORXCDchxFnvJI8Bl9ww_N3Ghr3jaKlaMLfuCzANsFF8Kxf-s6OspvcWFMPe4f2964VI6j4DHP-FzmwQVrcTmrd2ZxDSbkGY0otmbOdWPvaUwyktnVt1hwTDw6wAUV9C3hOARhds2MfKjfOlLdZhnXejSAhFvPxzbXhfC0F6Io9IMZ-S0WjKlHDzyRi7ms072QiYxj59VRf9wLtuJemKqLeje6IMKYe9iJcCE89R9vNh62ao7yMxes-2ZMPbogRIoeS5fKs6Ug_Axz4agfXIhp4HmXJ4d-Zrn5MLc-IPsD0P3h6sfFix6wRuYe6Jn7fXdbv261RVuZ66HXt_CxZoQ-fLj7cbduvrJdk3oLji04tuDYgmMLji04tuDYgmMLji04tuDYgmMLjv0fOEYWHFtwbMGxBccWHFtwrMcFEpEtwX4dz3FsDqKOsGO9Gl7g2BzYWXEsehvHrHnPcMxKRuc4ZqUicRtVTnHMyoD_FcciL_bQSt8jjnUzGcYOEEIcoEHU3UkibDpxPkMT0NkEx-uZnwYC83MKbG-yz6VPb6LVLZfUKbB1ZdIwdOD0dn3nm0M4PAMJ5jIMTlkrem9Q19foxw5E2_7ftphQyMOa40vpEvpExkKG-fMeoa8r0g8cIPHGgTiwe4RDINYeN2kChduIC4bN909CoUhTQTGXfgYK-6UQhA6QcGsOF7tNOCWiCXCfJtgostwPLhfJTdgYzlCjN7SzHiPOHFrimXuynM9MusR2-jR-_PgXHH1O55cpAAA';\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-2XTW_jNhCG7_kVA-fSAJIhUh-2tKcuii3QIotiA_ROSaQjrCQapLRxttj_XlCSZVseKkb30BwUODaseTnkvPwwn0RJ2cA_dwCum3LdyBdX71nGXS8B78P1Y5JAsD8gAZrAFg34CRCKRoIESIRGwgSoh0aiBCg-gG0CPt4P8RII8HSEJhDg4yZRAtG0K8XyotVuLWs-9WcI6eraoSFU5dceDaFyh7g0xA4l4tMQE21ZJhDHcTyJC1k3rmBVUb66mtU6gdVfije8zpnK4W-mCpaWfOXA6akDLtvvS-7qV93wyoGPZVF_fWTZU_f9k6wbB_qY2xYOrH41anj6DX6XzXORwWcuVw6sPstGwhOrNfz5ZeWA6d3VXBXCOsBK1jKB1R-8-ahYUWt4lLVJ1RZdqJsPB54-mcfuF75rS6YceOR1KR0YFdfpdfGduwedgLfehIpXFoWZMm-9nZOYqSP2cDd9a0JnMnSzuJ5T0F4yo_B7xexIA6Ohto5eeLF7blzVe2i2hWcVVTwv2iqBcEajeVWksswTiGZUvWKDKcqi5u5zL2vMe-_SvLCWqmK9WfNCxUt24Gbu1ptLad4q1hSydgXTpk_qVRoXHDujnlWiS_liTp-p4Ltb1Dk_uPIbVyV7TYD4Ew-OikrmXUE-weO5kvtcvtRGQnFJI_tKplN6isuyKfYJkOmEZrKUyk13bs4Fa8smgXvR_eEq3aZNyY1oK2LBcFHVNsb3e0GEL0JcU9TfuNImEyU0pDGuGs1Tu5T94jkwvNZB-IC0EOdlWPOK0wiDOPTCDa4ZS42iiG8iXHQqw-6aVDlXZwPLOaccyzcodaNkvUvgnuVpmOZ2oZBZqxO499NICCzhXhUVU6-ulmVhyqVhGPD0LaH7bGxP4J7kAc23M_JM1o3qVp69_DH10U7ORXCDchxFnvJI8Bl9ww_N3Ghr3jaKlaMLfuCzANsFF8Kxf-s6OspvcWFMPe4f2964VI6j4DHP-FzmwQVrcTmrd2ZxDSbkGY0otmbOdWPvaUwyktnVt1hwTDw6wAUV9C3hOARhds2MfKjfOlLdZhnXejSAhFvPxzbXhfC0F6Io9IMZ-S0WjKlHDzyRi7ms072QiYxj59VRf9wLtuJemKqLeje6IMKYe9iJcCE89R9vNh62ao7yMxes-2ZMPbogRIoeS5fKs6Ug_Axz4agfXIhp4HmXJ4d-Zrn5MLc-IPsD0P3h6sfFix6wRuYe6Jn7fXdbv261RVuZ66HXt_CxZoQ-fLj7cbduvrJdk3oLji04tuDYgmMLji04tuDYgmMLji04tuDYgmMLjv0fOEYWHFtwbMGxBccWHFtwrMcFEpEtwX4dz3FsDqKOsGO9Gl7g2BzYWXEsehvHrHnPcMxKRuc4ZqUicRtVTnHMyoD_FcciL_bQSt8jjnUzGcYOEEIcoEHU3UkibDpxPkMT0NkEx-uZnwYC83MKbG-yz6VPb6LVLZfUKbB1ZdIwdOD0dn3nm0M4PAMJ5jIMTlkrem9Q19foxw5E2_7ftphQyMOa40vpEvpExkKG-fMeoa8r0g8cIPHGgTiwe4RDINYeN2kChduIC4bN909CoUhTQTGXfgYK-6UQhA6QcGsOF7tNOCWiCXCfJtgostwPLhfJTdgYzlCjN7SzHiPOHFrimXuynM9MusR2-jR-_PgXHH1O55cpAAA';\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 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-2XTW_jNhCG7_kVA-fSAJIhUh-2tKcuii3QIotiA_ROSaQjrCQapLRxttj_XlCSZVseKkb30BwUODaseTnkvPwwn0RJ2cA_dwCum3LdyBdX71nGXS8B78P1Y5JAsD8gAZrAFg34CRCKRoIESIRGwgSoh0aiBCg-gG0CPt4P8RII8HSEJhDg4yZRAtG0K8XyotVuLWs-9WcI6eraoSFU5dceDaFyh7g0xA4l4tMQE21ZJhDHcTyJC1k3rmBVUb66mtU6gdVfije8zpnK4W-mCpaWfOXA6akDLtvvS-7qV93wyoGPZVF_fWTZU_f9k6wbB_qY2xYOrH41anj6DX6XzXORwWcuVw6sPstGwhOrNfz5ZeWA6d3VXBXCOsBK1jKB1R-8-ahYUWt4lLVJ1RZdqJsPB54-mcfuF75rS6YceOR1KR0YFdfpdfGduwedgLfehIpXFoWZMm-9nZOYqSP2cDd9a0JnMnSzuJ5T0F4yo_B7xexIA6Ohto5eeLF7blzVe2i2hWcVVTwv2iqBcEajeVWksswTiGZUvWKDKcqi5u5zL2vMe-_SvLCWqmK9WfNCxUt24Gbu1ptLad4q1hSydgXTpk_qVRoXHDujnlWiS_liTp-p4Ltb1Dk_uPIbVyV7TYD4Ew-OikrmXUE-weO5kvtcvtRGQnFJI_tKplN6isuyKfYJkOmEZrKUyk13bs4Fa8smgXvR_eEq3aZNyY1oK2LBcFHVNsb3e0GEL0JcU9TfuNImEyU0pDGuGs1Tu5T94jkwvNZB-IC0EOdlWPOK0wiDOPTCDa4ZS42iiG8iXHQqw-6aVDlXZwPLOaccyzcodaNkvUvgnuVpmOZ2oZBZqxO499NICCzhXhUVU6-ulmVhyqVhGPD0LaH7bGxP4J7kAc23M_JM1o3qVp69_DH10U7ORXCDchxFnvJI8Bl9ww_N3Ghr3jaKlaMLfuCzANsFF8Kxf-s6OspvcWFMPe4f2964VI6j4DHP-FzmwQVrcTmrd2ZxDSbkGY0otmbOdWPvaUwyktnVt1hwTDw6wAUV9C3hOARhds2MfKjfOlLdZhnXejSAhFvPxzbXhfC0F6Io9IMZ-S0WjKlHDzyRi7ms072QiYxj59VRf9wLtuJemKqLeje6IMKYe9iJcCE89R9vNh62ao7yMxes-2ZMPbogRIoeS5fKs6Ug_Axz4agfXIhp4HmXJ4d-Zrn5MLc-IPsD0P3h6sfFix6wRuYe6Jn7fXdbv261RVuZ66HXt_CxZoQ-fLj7cbduvrJdk3oLji04tuDYgmMLji04tuDYgmMLji04tuDYgmMLjv0fOEYWHFtwbMGxBccWHFtwrMcFEpEtwX4dz3FsDqKOsGO9Gl7g2BzYWXEsehvHrHnPcMxKRuc4ZqUicRtVTnHMyoD_FcciL_bQSt8jjnUzGcYOEEIcoEHU3UkibDpxPkMT0NkEx-uZnwYC83MKbG-yz6VPb6LVLZfUKbB1ZdIwdOD0dn3nm0M4PAMJ5jIMTlkrem9Q19foxw5E2_7ftphQyMOa40vpEvpExkKG-fMeoa8r0g8cIPHGgTiwe4RDINYeN2kChduIC4bN909CoUhTQTGXfgYK-6UQhA6QcGsOF7tNOCWiCXCfJtgostwPLhfJTdgYzlCjN7SzHiPOHFrimXuynM9MusR2-jR-_PgXHH1O55cpAAA';\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 ElementType, type HTMLAttributes } from 'react';\nimport { cx } from '../../utils/cx';\nimport * as styles from './Stack.css';\n\nexport interface StackProps extends HTMLAttributes<HTMLElement> {\n /** 렌더링할 요소 */\n as?: ElementType;\n /** 배치 방향 */\n direction?: 'row' | 'column' | 'row-reverse' | 'column-reverse';\n /** 자식 사이 간격 (space 토큰 키) */\n gap?: keyof typeof space;\n /** 교차축 정렬 (align-items) */\n align?: 'start' | 'center' | 'end' | 'stretch' | 'baseline';\n /** 주축 정렬 (justify-content) */\n justify?: 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';\n /** 줄바꿈 허용 */\n wrap?: boolean;\n}\n\nexport const Stack = /* @__PURE__ */ forwardRef<HTMLElement, StackProps>(function Stack(\n { as: Component = 'div', direction, gap, align, justify, wrap, className, ...rest },\n ref,\n) {\n return (\n <Component ref={ref} className={cx(styles.stack({ direction, gap, align, justify, wrap }), className)} {...rest} />\n );\n});\n","import 'src/theme/contract.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XTW_jNhCG7_kVA-fSAJIhUh-2tKcuii3QIotiA_ROSaQjrCQapLRxttj_XlCSZVseKkb30BwUODaseTnkvPwwn0RJ2cA_dwCum3LdyBdX71nGXS8B78P1Y5JAsD8gAZrAFg34CRCKRoIESIRGwgSoh0aiBCg-gG0CPt4P8RII8HSEJhDg4yZRAtG0K8XyotVuLWs-9WcI6eraoSFU5dceDaFyh7g0xA4l4tMQE21ZJhDHcTyJC1k3rmBVUb66mtU6gdVfije8zpnK4W-mCpaWfOXA6akDLtvvS-7qV93wyoGPZVF_fWTZU_f9k6wbB_qY2xYOrH41anj6DX6XzXORwWcuVw6sPstGwhOrNfz5ZeWA6d3VXBXCOsBK1jKB1R-8-ahYUWt4lLVJ1RZdqJsPB54-mcfuF75rS6YceOR1KR0YFdfpdfGduwedgLfehIpXFoWZMm-9nZOYqSP2cDd9a0JnMnSzuJ5T0F4yo_B7xexIA6Ohto5eeLF7blzVe2i2hWcVVTwv2iqBcEajeVWksswTiGZUvWKDKcqi5u5zL2vMe-_SvLCWqmK9WfNCxUt24Gbu1ptLad4q1hSydgXTpk_qVRoXHDujnlWiS_liTp-p4Ltb1Dk_uPIbVyV7TYD4Ew-OikrmXUE-weO5kvtcvtRGQnFJI_tKplN6isuyKfYJkOmEZrKUyk13bs4Fa8smgXvR_eEq3aZNyY1oK2LBcFHVNsb3e0GEL0JcU9TfuNImEyU0pDGuGs1Tu5T94jkwvNZB-IC0EOdlWPOK0wiDOPTCDa4ZS42iiG8iXHQqw-6aVDlXZwPLOaccyzcodaNkvUvgnuVpmOZ2oZBZqxO499NICCzhXhUVU6-ulmVhyqVhGPD0LaH7bGxP4J7kAc23M_JM1o3qVp69_DH10U7ORXCDchxFnvJI8Bl9ww_N3Ghr3jaKlaMLfuCzANsFF8Kxf-s6OspvcWFMPe4f2964VI6j4DHP-FzmwQVrcTmrd2ZxDSbkGY0otmbOdWPvaUwyktnVt1hwTDw6wAUV9C3hOARhds2MfKjfOlLdZhnXejSAhFvPxzbXhfC0F6Io9IMZ-S0WjKlHDzyRi7ms072QiYxj59VRf9wLtuJemKqLeje6IMKYe9iJcCE89R9vNh62ao7yMxes-2ZMPbogRIoeS5fKs6Ug_Axz4agfXIhp4HmXJ4d-Zrn5MLc-IPsD0P3h6sfFix6wRuYe6Jn7fXdbv261RVuZ66HXt_CxZoQ-fLj7cbduvrJdk3oLji04tuDYgmMLji04tuDYgmMLji04tuDYgmMLjv0fOEYWHFtwbMGxBccWHFtwrMcFEpEtwX4dz3FsDqKOsGO9Gl7g2BzYWXEsehvHrHnPcMxKRuc4ZqUicRtVTnHMyoD_FcciL_bQSt8jjnUzGcYOEEIcoEHU3UkibDpxPkMT0NkEx-uZnwYC83MKbG-yz6VPb6LVLZfUKbB1ZdIwdOD0dn3nm0M4PAMJ5jIMTlkrem9Q19foxw5E2_7ftphQyMOa40vpEvpExkKG-fMeoa8r0g8cIPHGgTiwe4RDINYeN2kChduIC4bN909CoUhTQTGXfgYK-6UQhA6QcGsOF7tNOCWiCXCfJtgostwPLhfJTdgYzlCjN7SzHiPOHFrimXuynM9MusR2-jR-_PgXHH1O55cpAAA';\nimport 'src/components/Stack/Stack.css.ts.vanilla.css?source=#H4sIAAAAAAAAA33TzW7DIAwH8HueguN2oOr3mvRhJkLchIxABm6zbOq7T001Tc6HL5x-_oMts3rf1N9pVadr8ZMIUZjYWtVn4mLh65wI0RgnO1NglYn1Obknqz-_GfyDycIE0Gi8y0TwHVHbWaW9vTaOwN1SnAxwgxCB6D0TO1twGApK1WbipsKLlDlE9J2MrdIg168EH1m8ofiNxVuKTyzeUZyyeE-xYvGB4pzFR4o1i08UF_zoRoMGXo-Gd-H16NnloJU1pZMGoYnPnZYRVUAiq6nU4BACUWYhD1xBXD11EQOgrgj7mLJcRbDG0cW1g6uvEc2ll9o7BIeLrTTzeqYdx-SOW_Lz9jn3HLADoJ-55QpU8NfRBZ-chxs42xMf_r9_Fx778DjPyf0X9CUDec0EAAA';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\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:{direction:'column'},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-2XTW_jNhCG7_kVA-fSAJIhUh-2tKcuii3QIotiA_ROSaQjrCQapLRxttj_XlCSZVseKkb30BwUODaseTnkvPwwn0RJ2cA_dwCum3LdyBdX71nGXS8B78P1Y5JAsD8gAZrAFg34CRCKRoIESIRGwgSoh0aiBCg-gG0CPt4P8RII8HSEJhDg4yZRAtG0K8XyotVuLWs-9WcI6eraoSFU5dceDaFyh7g0xA4l4tMQE21ZJhDHcTyJC1k3rmBVUb66mtU6gdVfije8zpnK4W-mCpaWfOXA6akDLtvvS-7qV93wyoGPZVF_fWTZU_f9k6wbB_qY2xYOrH41anj6DX6XzXORwWcuVw6sPstGwhOrNfz5ZeWA6d3VXBXCOsBK1jKB1R-8-ahYUWt4lLVJ1RZdqJsPB54-mcfuF75rS6YceOR1KR0YFdfpdfGduwedgLfehIpXFoWZMm-9nZOYqSP2cDd9a0JnMnSzuJ5T0F4yo_B7xexIA6Ohto5eeLF7blzVe2i2hWcVVTwv2iqBcEajeVWksswTiGZUvWKDKcqi5u5zL2vMe-_SvLCWqmK9WfNCxUt24Gbu1ptLad4q1hSydgXTpk_qVRoXHDujnlWiS_liTp-p4Ltb1Dk_uPIbVyV7TYD4Ew-OikrmXUE-weO5kvtcvtRGQnFJI_tKplN6isuyKfYJkOmEZrKUyk13bs4Fa8smgXvR_eEq3aZNyY1oK2LBcFHVNsb3e0GEL0JcU9TfuNImEyU0pDGuGs1Tu5T94jkwvNZB-IC0EOdlWPOK0wiDOPTCDa4ZS42iiG8iXHQqw-6aVDlXZwPLOaccyzcodaNkvUvgnuVpmOZ2oZBZqxO499NICCzhXhUVU6-ulmVhyqVhGPD0LaH7bGxP4J7kAc23M_JM1o3qVp69_DH10U7ORXCDchxFnvJI8Bl9ww_N3Ghr3jaKlaMLfuCzANsFF8Kxf-s6OspvcWFMPe4f2964VI6j4DHP-FzmwQVrcTmrd2ZxDSbkGY0otmbOdWPvaUwyktnVt1hwTDw6wAUV9C3hOARhds2MfKjfOlLdZhnXejSAhFvPxzbXhfC0F6Io9IMZ-S0WjKlHDzyRi7ms072QiYxj59VRf9wLtuJemKqLeje6IMKYe9iJcCE89R9vNh62ao7yMxes-2ZMPbogRIoeS5fKs6Ug_Axz4agfXIhp4HmXJ4d-Zrn5MLc-IPsD0P3h6sfFix6wRuYe6Jn7fXdbv261RVuZ66HXt_CxZoQ-fLj7cbduvrJdk3oLji04tuDYgmMLji04tuDYgmMLji04tuDYgmMLjv0fOEYWHFtwbMGxBccWHFtwrMcFEpEtwX4dz3FsDqKOsGO9Gl7g2BzYWXEsehvHrHnPcMxKRuc4ZqUicRtVTnHMyoD_FcciL_bQSt8jjnUzGcYOEEIcoEHU3UkibDpxPkMT0NkEx-uZnwYC83MKbG-yz6VPb6LVLZfUKbB1ZdIwdOD0dn3nm0M4PAMJ5jIMTlkrem9Q19foxw5E2_7ftphQyMOa40vpEvpExkKG-fMeoa8r0g8cIPHGgTiwe4RDINYeN2kChduIC4bN909CoUhTQTGXfgYK-6UQhA6QcGsOF7tNOCWiCXCfJtgostwPLhfJTdgYzlCjN7SzHiPOHFrimXuynM9MusR2-jR-_PgXHH1O55cpAAA';\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":";;;;;;;;;;;;;;;;;;;;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;;;ACvMA,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,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,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,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;;;AC7EO,SAAS,yBAAyB,OAAwBA,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,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;AACpY,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;;;ADYX,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;;;AE7CD,SAAS,wBAAwB;AACjC,SAAS,cAAAM,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;;;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,IAAI,QAAQ;AACZ,IAAIE,QAAO;AACX,IAAI,QAAwB,gBAAAF,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,OAAAG,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,UAAU,MAAM;AACtB,QAAM,kBAAkBH,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,GAAUK,OAAM,SAAS,GAAI,GAAG,MACtD;AAAA,KAAAD,UAAU,aAAa,cACvB,gBAAAJ,MAAC,SAAI,WAAkBM,SACpB;AAAA,MAAAF,UACC,gBAAAL,KAAC,UAAK,IAAI,SAAS,WAAkB,OAClC,UAAAK,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,cAAAQ,mBAAyD;;;ACClE,SAAS,mBAAmBC,eAAc;AACnC,IAAI,QAAwB,gBAAAA,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,EAAC,WAAU,SAAQ,GAAE,kBAAiB,CAAC,EAAC,CAAC;;;ADsBvqB,gBAAAC,YAAA;AALG,IAAM,QAAwB,gBAAAC,YAAoC,SAASC,OAChF,EAAE,IAAI,YAAY,OAAO,WAAW,KAAK,OAAO,SAAS,MAAM,WAAW,GAAG,KAAK,GAClF,KACA;AACA,SACE,gBAAAF,KAAC,aAAU,KAAU,WAAW,GAAU,MAAM,EAAE,WAAW,KAAK,OAAO,SAAS,KAAK,CAAC,GAAG,SAAS,GAAI,GAAG,MAAM;AAErH,CAAC;;;AE3BD,SAAS,cAAAG,mBAAyD;;;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;;;ADoC9mB,gBAAAC,YAAA;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,YAAyC,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;;;AE7CD,SAAS,cAAAG,mBAAyD;AAiBzD,gBAAAC,YAAA;AAJF,IAAM,iBAAiC,gBAAAC,YAA6C,SAASC,gBAClG,EAAE,IAAI,YAAY,QAAQ,WAAW,GAAG,KAAK,GAC7C,KACA;AACA,SAAO,gBAAAF,KAAC,aAAU,KAAU,WAAW,GAAG,gBAAgB,SAAS,GAAI,GAAG,MAAM;AAClF,CAAC;","names":["value","item","Badge","forwardRef","_7a468","jsx","forwardRef","Card","CardHeader","CardBody","CardFooter","forwardRef","_7a468","jsx","jsxs","forwardRef","DescriptionList","termWidth","item","forwardRef","_7a468","jsx","jsxs","forwardRef","Divider","forwardRef","_7a468","header","root","jsx","jsxs","value","forwardRef","Progress","label","root","header","forwardRef","_7a468","jsx","forwardRef","Stack","forwardRef","_7a468","jsx","forwardRef","Typography","forwardRef","jsx","forwardRef","VisuallyHidden"]}
package/package.json CHANGED
@@ -1,19 +1,28 @@
1
1
  {
2
2
  "name": "@bestow-ui/react",
3
- "version": "1.1.0",
4
- "description": "React components and theming for BestOW UI — vanilla-extract + Radix, light/dark and brand themes, accessible by default",
3
+ "version": "1.3.0",
4
+ "description": "한국 서비스를 위한 접근성 검증 React 디자인 시스템 — 한국 서비스 키트(약관·인증번호·전화·사업자번호·금액·주소·날짜), KWCAG 2.2 대응, 다크·브랜드 테마, 서버 컴포넌트 지원",
5
5
  "keywords": [
6
- "bestow-ui",
7
- "design-system",
8
6
  "react",
9
- "components",
7
+ "design-system",
10
8
  "ui",
11
- "vanilla-extract",
12
- "radix-ui",
9
+ "components",
10
+ "korean",
11
+ "korea",
12
+ "kwcag",
13
+ "wcag",
14
+ "accessibility",
15
+ "a11y",
16
+ "form",
13
17
  "dark-mode",
14
18
  "theming",
15
- "accessibility",
16
- "nextjs"
19
+ "vanilla-extract",
20
+ "radix-ui",
21
+ "nextjs",
22
+ "react-server-components",
23
+ "bestow-ui",
24
+ "디자인시스템",
25
+ "접근성"
17
26
  ],
18
27
  "license": "MIT",
19
28
  "author": "Dev-BestOW",
@@ -58,14 +67,13 @@
58
67
  "react-dom": "^18.0.0 || ^19.0.0"
59
68
  },
60
69
  "dependencies": {
61
- "@bestow-ui/icons": "^0.1.2",
62
- "@bestow-ui/tokens": "^1.0.0",
70
+ "@bestow-ui/icons": "^0.1.3",
71
+ "@bestow-ui/tokens": "^1.3.0",
63
72
  "@radix-ui/react-accordion": "^1.3.1",
64
73
  "@radix-ui/react-avatar": "^1.3.1",
65
74
  "@radix-ui/react-dialog": "^1.3.1",
66
75
  "@radix-ui/react-dropdown-menu": "^2.2.1",
67
76
  "@radix-ui/react-popover": "^1.3.1",
68
- "@radix-ui/react-radio-group": "^1.5.1",
69
77
  "@radix-ui/react-select": "^2.4.1",
70
78
  "@radix-ui/react-slider": "^1.6.1",
71
79
  "@radix-ui/react-slot": "^1.5.0",
@@ -88,6 +96,7 @@
88
96
  "jsdom": "^27.0.0",
89
97
  "react": "^19.2.0",
90
98
  "react-dom": "^19.2.0",
99
+ "react-hook-form": "^7.90.0",
91
100
  "storybook": "^10.6.2",
92
101
  "tsup": "^8.5.1",
93
102
  "typescript": "~5.9.3",