@x-plat/design-system 0.8.3 → 0.10.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.
Files changed (133) hide show
  1. package/dist/components/AutoResizeTextArea/index.cjs +140 -4
  2. package/dist/components/AutoResizeTextArea/index.css +38 -0
  3. package/dist/components/AutoResizeTextArea/index.d.cts +4 -0
  4. package/dist/components/AutoResizeTextArea/index.d.ts +4 -0
  5. package/dist/components/AutoResizeTextArea/index.js +140 -4
  6. package/dist/components/Badge/index.cjs +5 -1
  7. package/dist/components/Badge/index.css +1 -0
  8. package/dist/components/Badge/index.d.cts +1 -0
  9. package/dist/components/Badge/index.d.ts +1 -0
  10. package/dist/components/Badge/index.js +5 -1
  11. package/dist/components/Box/index.d.cts +3 -0
  12. package/dist/components/Box/index.d.ts +3 -0
  13. package/dist/components/Chart/index.cjs +7 -6
  14. package/dist/components/Chart/index.d.cts +12 -1
  15. package/dist/components/Chart/index.d.ts +12 -1
  16. package/dist/components/Chart/index.js +7 -6
  17. package/dist/components/ChatInput/index.cjs +150 -9
  18. package/dist/components/ChatInput/index.css +38 -0
  19. package/dist/components/ChatInput/index.d.cts +9 -0
  20. package/dist/components/ChatInput/index.d.ts +9 -0
  21. package/dist/components/ChatInput/index.js +151 -10
  22. package/dist/components/CheckBox/index.cjs +137 -6
  23. package/dist/components/CheckBox/index.css +40 -0
  24. package/dist/components/CheckBox/index.d.cts +13 -2
  25. package/dist/components/CheckBox/index.d.ts +13 -2
  26. package/dist/components/CheckBox/index.js +137 -6
  27. package/dist/components/Chip/index.d.cts +2 -0
  28. package/dist/components/Chip/index.d.ts +2 -0
  29. package/dist/components/DatePicker/index.cjs +76 -62
  30. package/dist/components/DatePicker/index.css +38 -31
  31. package/dist/components/DatePicker/index.js +42 -28
  32. package/dist/components/Drawer/index.d.cts +1 -0
  33. package/dist/components/Drawer/index.d.ts +1 -0
  34. package/dist/components/FieldMessage/index.cjs +183 -0
  35. package/dist/components/FieldMessage/index.css +37 -0
  36. package/dist/components/FieldMessage/index.d.cts +37 -0
  37. package/dist/components/FieldMessage/index.d.ts +37 -0
  38. package/dist/components/FieldMessage/index.js +154 -0
  39. package/dist/components/FileUpload/index.cjs +135 -8
  40. package/dist/components/FileUpload/index.css +38 -0
  41. package/dist/components/FileUpload/index.d.cts +9 -0
  42. package/dist/components/FileUpload/index.d.ts +9 -0
  43. package/dist/components/FileUpload/index.js +135 -8
  44. package/dist/components/ImageSelector/index.cjs +153 -11
  45. package/dist/components/ImageSelector/index.css +38 -0
  46. package/dist/components/ImageSelector/index.d.cts +6 -0
  47. package/dist/components/ImageSelector/index.d.ts +6 -0
  48. package/dist/components/ImageSelector/index.js +153 -11
  49. package/dist/components/Input/index.cjs +38 -25
  50. package/dist/components/Input/index.css +38 -31
  51. package/dist/components/Input/index.d.cts +7 -8
  52. package/dist/components/Input/index.d.ts +7 -8
  53. package/dist/components/Input/index.js +36 -23
  54. package/dist/components/NotificationBadge/index.cjs +5 -1
  55. package/dist/components/NotificationBadge/index.css +1 -0
  56. package/dist/components/NotificationBadge/index.d.cts +6 -2
  57. package/dist/components/NotificationBadge/index.d.ts +6 -2
  58. package/dist/components/NotificationBadge/index.js +5 -1
  59. package/dist/components/Pagination/index.cjs +6 -2
  60. package/dist/components/Pagination/index.css +1 -0
  61. package/dist/components/Pagination/index.d.cts +13 -2
  62. package/dist/components/Pagination/index.d.ts +13 -2
  63. package/dist/components/Pagination/index.js +6 -2
  64. package/dist/components/Progress/index.cjs +6 -2
  65. package/dist/components/Progress/index.css +1 -0
  66. package/dist/components/Progress/index.d.cts +11 -2
  67. package/dist/components/Progress/index.d.ts +11 -2
  68. package/dist/components/Progress/index.js +6 -2
  69. package/dist/components/Radio/index.cjs +158 -10
  70. package/dist/components/Radio/index.css +40 -0
  71. package/dist/components/Radio/index.d.cts +14 -2
  72. package/dist/components/Radio/index.d.ts +14 -2
  73. package/dist/components/Radio/index.js +158 -10
  74. package/dist/components/Select/index.cjs +139 -13
  75. package/dist/components/Select/index.css +38 -0
  76. package/dist/components/Select/index.d.cts +8 -1
  77. package/dist/components/Select/index.d.ts +8 -1
  78. package/dist/components/Select/index.js +139 -13
  79. package/dist/components/Skeleton/index.d.cts +3 -0
  80. package/dist/components/Skeleton/index.d.ts +3 -0
  81. package/dist/components/Spinner/index.cjs +6 -2
  82. package/dist/components/Spinner/index.css +1 -0
  83. package/dist/components/Spinner/index.d.cts +8 -2
  84. package/dist/components/Spinner/index.d.ts +8 -2
  85. package/dist/components/Spinner/index.js +6 -2
  86. package/dist/components/Steps/index.cjs +6 -2
  87. package/dist/components/Steps/index.css +11 -0
  88. package/dist/components/Steps/index.d.cts +9 -2
  89. package/dist/components/Steps/index.d.ts +9 -2
  90. package/dist/components/Steps/index.js +6 -2
  91. package/dist/components/Switch/index.cjs +146 -6
  92. package/dist/components/Switch/index.css +40 -0
  93. package/dist/components/Switch/index.d.cts +13 -2
  94. package/dist/components/Switch/index.d.ts +13 -2
  95. package/dist/components/Switch/index.js +146 -6
  96. package/dist/components/Tab/index.cjs +4 -3
  97. package/dist/components/Tab/index.d.cts +12 -1
  98. package/dist/components/Tab/index.d.ts +12 -1
  99. package/dist/components/Tab/index.js +4 -3
  100. package/dist/components/Tag/index.cjs +5 -3
  101. package/dist/components/Tag/index.d.cts +12 -2
  102. package/dist/components/Tag/index.d.ts +12 -2
  103. package/dist/components/Tag/index.js +5 -3
  104. package/dist/components/TextArea/index.cjs +138 -2
  105. package/dist/components/TextArea/index.css +38 -0
  106. package/dist/components/TextArea/index.d.cts +6 -0
  107. package/dist/components/TextArea/index.d.ts +6 -0
  108. package/dist/components/TextArea/index.js +138 -2
  109. package/dist/components/Tooltip/index.cjs +4 -2
  110. package/dist/components/Tooltip/index.d.cts +11 -1
  111. package/dist/components/Tooltip/index.d.ts +11 -1
  112. package/dist/components/Tooltip/index.js +4 -2
  113. package/dist/components/index.cjs +479 -408
  114. package/dist/components/index.css +59 -31
  115. package/dist/components/index.d.cts +3 -0
  116. package/dist/components/index.d.ts +3 -0
  117. package/dist/components/index.js +262 -194
  118. package/dist/index.cjs +484 -413
  119. package/dist/index.css +59 -31
  120. package/dist/index.d.cts +3 -0
  121. package/dist/index.d.ts +3 -0
  122. package/dist/index.js +264 -196
  123. package/dist/status-g_KP3qT6.d.cts +8 -0
  124. package/dist/status-g_KP3qT6.d.ts +8 -0
  125. package/dist/validation-Dqo1zqhT.d.cts +13 -0
  126. package/dist/validation-Dqo1zqhT.d.ts +13 -0
  127. package/guidelines/AGENT_PROMPT.md +15 -0
  128. package/guidelines/components/card.md +3 -3
  129. package/guidelines/components/feedback.md +1 -1
  130. package/guidelines/components/form.md +26 -0
  131. package/guidelines/components/navigation.md +16 -15
  132. package/guidelines/components/overlay.md +43 -4
  133. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -5595,11 +5595,49 @@ var Alert_default = Alert;
5595
5595
 
5596
5596
  // src/components/AutoResizeTextArea/AutoResizeTextArea.tsx
5597
5597
  import React2 from "react";
5598
- import { jsx as jsx297 } from "react/jsx-runtime";
5598
+
5599
+ // src/components/FieldMessage/FieldMessage.tsx
5600
+ import { Fragment, jsx as jsx297, jsxs as jsxs191 } from "react/jsx-runtime";
5601
+ var ICON = {
5602
+ default: /* @__PURE__ */ jsx297(InfoIcon_default, {}),
5603
+ success: /* @__PURE__ */ jsx297(SuccessIcon_default, {}),
5604
+ warning: /* @__PURE__ */ jsx297(InfoIcon_default, {}),
5605
+ error: /* @__PURE__ */ jsx297(ErrorIcon_default, {})
5606
+ };
5607
+ var FieldMessage = (props) => {
5608
+ const { validations } = props;
5609
+ if (!validations || validations.length === 0) return null;
5610
+ return /* @__PURE__ */ jsx297("div", { className: "lib-xplat-field-message-wrap", children: validations.map((v, idx) => /* @__PURE__ */ jsxs191(
5611
+ "div",
5612
+ {
5613
+ className: clsx_default("lib-xplat-field-message", v.status),
5614
+ children: [
5615
+ /* @__PURE__ */ jsx297("div", { className: "icon", children: ICON[v.status] }),
5616
+ /* @__PURE__ */ jsx297("span", { children: v.message })
5617
+ ]
5618
+ },
5619
+ `${v.message}_${idx}`
5620
+ )) });
5621
+ };
5622
+ FieldMessage.displayName = "FieldMessage";
5623
+ var FieldMessage_default = FieldMessage;
5624
+ var Field = (props) => {
5625
+ const { validations, children } = props;
5626
+ if (!validations || validations.length === 0) return /* @__PURE__ */ jsx297(Fragment, { children });
5627
+ return /* @__PURE__ */ jsxs191("div", { className: "lib-xplat-field", children: [
5628
+ children,
5629
+ /* @__PURE__ */ jsx297(FieldMessage, { validations })
5630
+ ] });
5631
+ };
5632
+ Field.displayName = "Field";
5633
+ var hasError = (validations) => !!validations?.some((v) => v.status === "error");
5634
+
5635
+ // src/components/AutoResizeTextArea/AutoResizeTextArea.tsx
5636
+ import { jsx as jsx298 } from "react/jsx-runtime";
5599
5637
  var MAX_HEIGHT = 400;
5600
5638
  var AutoResizeTextArea = React2.forwardRef(
5601
5639
  (props, ref) => {
5602
- const { value, className, onChange, disabled, bare = false, ...textareaProps } = props;
5640
+ const { value, className, onChange, disabled, bare = false, validations, ...textareaProps } = props;
5603
5641
  const localRef = React2.useRef(null);
5604
5642
  const setRefs = (el) => {
5605
5643
  localRef.current = el;
@@ -5627,9 +5665,10 @@ var AutoResizeTextArea = React2.forwardRef(
5627
5665
  updateHeight();
5628
5666
  }, [value]);
5629
5667
  if (bare) {
5630
- return /* @__PURE__ */ jsx297(
5668
+ return /* @__PURE__ */ jsx298(
5631
5669
  "textarea",
5632
5670
  {
5671
+ "aria-invalid": hasError(validations) || void 0,
5633
5672
  ...textareaProps,
5634
5673
  ref: setRefs,
5635
5674
  className,
@@ -5639,9 +5678,10 @@ var AutoResizeTextArea = React2.forwardRef(
5639
5678
  }
5640
5679
  );
5641
5680
  }
5642
- return /* @__PURE__ */ jsx297("div", { className: clsx_default("lib-xplat-auto-resize-textarea-wrapper", className), children: /* @__PURE__ */ jsx297("div", { className: clsx_default("lib-xplat-auto-resize-textarea", disabled && "disabled"), children: /* @__PURE__ */ jsx297(
5681
+ const control = /* @__PURE__ */ jsx298("div", { className: clsx_default("lib-xplat-auto-resize-textarea-wrapper", className), children: /* @__PURE__ */ jsx298("div", { className: clsx_default("lib-xplat-auto-resize-textarea", disabled && "disabled"), children: /* @__PURE__ */ jsx298(
5643
5682
  "textarea",
5644
5683
  {
5684
+ "aria-invalid": hasError(validations) || void 0,
5645
5685
  ...textareaProps,
5646
5686
  ref: setRefs,
5647
5687
  disabled,
@@ -5649,13 +5689,14 @@ var AutoResizeTextArea = React2.forwardRef(
5649
5689
  onChange: handleChange
5650
5690
  }
5651
5691
  ) }) });
5692
+ return /* @__PURE__ */ jsx298(Field, { validations, children: control });
5652
5693
  }
5653
5694
  );
5654
5695
  AutoResizeTextArea.displayName = "AutoResizeTextArea";
5655
5696
  var AutoResizeTextArea_default = AutoResizeTextArea;
5656
5697
 
5657
5698
  // src/components/Avatar/Avatar.tsx
5658
- import { jsx as jsx298 } from "react/jsx-runtime";
5699
+ import { jsx as jsx299 } from "react/jsx-runtime";
5659
5700
  var CATEGORICAL_COUNT = 8;
5660
5701
  var getColorIndex = (name) => {
5661
5702
  if (!name) return 1;
@@ -5672,36 +5713,36 @@ var Avatar = (props) => {
5672
5713
  const fullInitials = name ? name.split(" ").map((s) => s[0]).join("").slice(0, 2).toUpperCase() : "";
5673
5714
  const initials = size === "sm" ? fullInitials.slice(0, 1) : fullInitials;
5674
5715
  const catIndex = getColorIndex(name || "");
5675
- return /* @__PURE__ */ jsx298("div", { className: clsx_default("lib-xplat-avatar", size), children: src ? /* @__PURE__ */ jsx298("img", { src, alt: alt || name || "avatar" }) : /* @__PURE__ */ jsx298("div", { className: clsx_default("fallback", `cat-${catIndex}`), children: initials || /* @__PURE__ */ jsx298("svg", { viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx298("path", { d: "M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z" }) }) }) });
5716
+ return /* @__PURE__ */ jsx299("div", { className: clsx_default("lib-xplat-avatar", size), children: src ? /* @__PURE__ */ jsx299("img", { src, alt: alt || name || "avatar" }) : /* @__PURE__ */ jsx299("div", { className: clsx_default("fallback", `cat-${catIndex}`), children: initials || /* @__PURE__ */ jsx299("svg", { viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx299("path", { d: "M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z" }) }) }) });
5676
5717
  };
5677
5718
  Avatar.displayName = "Avatar";
5678
5719
  var Avatar_default = Avatar;
5679
5720
 
5680
5721
  // src/components/Box/Box.tsx
5681
- import { jsx as jsx299, jsxs as jsxs191 } from "react/jsx-runtime";
5722
+ import { jsx as jsx300, jsxs as jsxs192 } from "react/jsx-runtime";
5682
5723
  var Box = ({
5683
5724
  children,
5684
5725
  title,
5685
5726
  variant = "outlined",
5686
5727
  padding = "md"
5687
5728
  }) => {
5688
- return /* @__PURE__ */ jsxs191("div", { className: clsx_default("lib-xplat-box", variant, `pad-${padding}`), children: [
5689
- title && /* @__PURE__ */ jsx299("div", { className: "box-title", children: title }),
5690
- /* @__PURE__ */ jsx299("div", { className: "box-content", children })
5729
+ return /* @__PURE__ */ jsxs192("div", { className: clsx_default("lib-xplat-box", variant, `pad-${padding}`), children: [
5730
+ title && /* @__PURE__ */ jsx300("div", { className: "box-title", children: title }),
5731
+ /* @__PURE__ */ jsx300("div", { className: "box-content", children })
5691
5732
  ] });
5692
5733
  };
5693
5734
  Box.displayName = "Box";
5694
5735
  var Box_default = Box;
5695
5736
 
5696
5737
  // src/components/Breadcrumb/Breadcrumb.tsx
5697
- import { jsx as jsx300, jsxs as jsxs192 } from "react/jsx-runtime";
5738
+ import { jsx as jsx301, jsxs as jsxs193 } from "react/jsx-runtime";
5698
5739
  var Breadcrumb = (props) => {
5699
5740
  const { items, separator = "/" } = props;
5700
- return /* @__PURE__ */ jsx300("nav", { className: "lib-xplat-breadcrumb", "aria-label": "\uACBD\uB85C", children: /* @__PURE__ */ jsx300("ol", { children: items.map((item, index) => {
5741
+ return /* @__PURE__ */ jsx301("nav", { className: "lib-xplat-breadcrumb", "aria-label": "\uACBD\uB85C", children: /* @__PURE__ */ jsx301("ol", { children: items.map((item, index) => {
5701
5742
  const isLast = index === items.length - 1;
5702
- return /* @__PURE__ */ jsxs192("li", { children: [
5703
- isLast ? /* @__PURE__ */ jsx300("span", { className: "current", "aria-current": "page", children: item.label }) : item.href ? /* @__PURE__ */ jsx300("a", { href: item.href, className: "link", children: item.label }) : /* @__PURE__ */ jsx300("button", { className: "link", onClick: item.onClick, children: item.label }),
5704
- !isLast && /* @__PURE__ */ jsx300("span", { className: "separator", children: separator })
5743
+ return /* @__PURE__ */ jsxs193("li", { children: [
5744
+ isLast ? /* @__PURE__ */ jsx301("span", { className: "current", "aria-current": "page", children: item.label }) : item.href ? /* @__PURE__ */ jsx301("a", { href: item.href, className: "link", children: item.label }) : /* @__PURE__ */ jsx301("button", { className: "link", onClick: item.onClick, children: item.label }),
5745
+ !isLast && /* @__PURE__ */ jsx301("span", { className: "separator", children: separator })
5705
5746
  ] }, index);
5706
5747
  }) }) });
5707
5748
  };
@@ -5709,7 +5750,7 @@ Breadcrumb.displayName = "Breadcrumb";
5709
5750
  var Breadcrumb_default = Breadcrumb;
5710
5751
 
5711
5752
  // src/components/Button/Button.tsx
5712
- import { jsx as jsx301 } from "react/jsx-runtime";
5753
+ import { jsx as jsx302 } from "react/jsx-runtime";
5713
5754
  var Button = (props) => {
5714
5755
  const {
5715
5756
  children,
@@ -5718,7 +5759,7 @@ var Button = (props) => {
5718
5759
  disabled,
5719
5760
  ...rest
5720
5761
  } = props;
5721
- return /* @__PURE__ */ jsx301(
5762
+ return /* @__PURE__ */ jsx302(
5722
5763
  "button",
5723
5764
  {
5724
5765
  className: clsx_default("lib-xplat-button", type, size),
@@ -5835,7 +5876,7 @@ var MONTH_LABELS = {
5835
5876
  };
5836
5877
 
5837
5878
  // src/components/Calendar/Calendar.tsx
5838
- import { Fragment, jsx as jsx302, jsxs as jsxs193 } from "react/jsx-runtime";
5879
+ import { Fragment as Fragment2, jsx as jsx303, jsxs as jsxs194 } from "react/jsx-runtime";
5839
5880
  var DayCell = React4.memo(
5840
5881
  ({
5841
5882
  day,
@@ -5847,7 +5888,7 @@ var DayCell = React4.memo(
5847
5888
  onEventClick
5848
5889
  }) => {
5849
5890
  if (renderDay) {
5850
- return /* @__PURE__ */ jsx302(
5891
+ return /* @__PURE__ */ jsx303(
5851
5892
  "div",
5852
5893
  {
5853
5894
  className: clsx_default(
@@ -5864,7 +5905,7 @@ var DayCell = React4.memo(
5864
5905
  }
5865
5906
  );
5866
5907
  }
5867
- return /* @__PURE__ */ jsxs193(
5908
+ return /* @__PURE__ */ jsxs194(
5868
5909
  "div",
5869
5910
  {
5870
5911
  className: clsx_default(
@@ -5880,9 +5921,9 @@ var DayCell = React4.memo(
5880
5921
  if (!disabled && day.isCurrentMonth) onSelect?.(day.date);
5881
5922
  },
5882
5923
  children: [
5883
- /* @__PURE__ */ jsx302("span", { className: "calendar-day-number", children: day.day }),
5884
- dayEvents.length > 0 && /* @__PURE__ */ jsxs193("div", { className: "calendar-day-events", children: [
5885
- dayEvents.slice(0, 3).map((event, ei) => /* @__PURE__ */ jsx302(
5924
+ /* @__PURE__ */ jsx303("span", { className: "calendar-day-number", children: day.day }),
5925
+ dayEvents.length > 0 && /* @__PURE__ */ jsxs194("div", { className: "calendar-day-events", children: [
5926
+ dayEvents.slice(0, 3).map((event, ei) => /* @__PURE__ */ jsx303(
5886
5927
  "span",
5887
5928
  {
5888
5929
  className: "calendar-event-dot",
@@ -5895,7 +5936,7 @@ var DayCell = React4.memo(
5895
5936
  },
5896
5937
  ei
5897
5938
  )),
5898
- dayEvents.length > 3 && /* @__PURE__ */ jsxs193("span", { className: "calendar-event-more", children: [
5939
+ dayEvents.length > 3 && /* @__PURE__ */ jsxs194("span", { className: "calendar-event-more", children: [
5899
5940
  "+",
5900
5941
  dayEvents.length - 3
5901
5942
  ] })
@@ -6016,21 +6057,21 @@ var Calendar = (props) => {
6016
6057
  const weekdays = WEEKDAY_LABELS[locale];
6017
6058
  const monthLabels = MONTH_LABELS[locale];
6018
6059
  const titleText = pickerMode === "days" ? locale === "ko" ? `${year}\uB144 ${monthLabels[month]}` : `${monthLabels[month]} ${year}` : pickerMode === "months" ? `${year}` : `${yearRangeStart} - ${yearRangeStart + 11}`;
6019
- return /* @__PURE__ */ jsxs193(
6060
+ return /* @__PURE__ */ jsxs194(
6020
6061
  "div",
6021
6062
  {
6022
6063
  className: "lib-xplat-calendar",
6023
6064
  style: selectedColor ? { "--calendar-selected-color": `var(--${selectedColor})` } : void 0,
6024
6065
  children: [
6025
- /* @__PURE__ */ jsxs193("div", { className: "calendar-header", children: [
6026
- /* @__PURE__ */ jsx302("button", { className: "calendar-nav", onClick: handlePrev, "aria-label": "\uC774\uC804", children: /* @__PURE__ */ jsx302(ChevronLeftIcon_default, {}) }),
6027
- /* @__PURE__ */ jsx302("button", { className: "calendar-title", onClick: handleTitleClick, type: "button", children: titleText }),
6028
- /* @__PURE__ */ jsx302("button", { className: "calendar-nav", onClick: handleNext, "aria-label": "\uB2E4\uC74C", children: /* @__PURE__ */ jsx302(ChevronRightIcon_default, {}) }),
6029
- showToday && /* @__PURE__ */ jsx302("button", { className: "calendar-today-btn", onClick: handleToday, children: locale === "ko" ? "\uC624\uB298" : "Today" })
6066
+ /* @__PURE__ */ jsxs194("div", { className: "calendar-header", children: [
6067
+ /* @__PURE__ */ jsx303("button", { className: "calendar-nav", onClick: handlePrev, "aria-label": "\uC774\uC804", children: /* @__PURE__ */ jsx303(ChevronLeftIcon_default, {}) }),
6068
+ /* @__PURE__ */ jsx303("button", { className: "calendar-title", onClick: handleTitleClick, type: "button", children: titleText }),
6069
+ /* @__PURE__ */ jsx303("button", { className: "calendar-nav", onClick: handleNext, "aria-label": "\uB2E4\uC74C", children: /* @__PURE__ */ jsx303(ChevronRightIcon_default, {}) }),
6070
+ showToday && /* @__PURE__ */ jsx303("button", { className: "calendar-today-btn", onClick: handleToday, children: locale === "ko" ? "\uC624\uB298" : "Today" })
6030
6071
  ] }),
6031
- pickerMode === "years" && /* @__PURE__ */ jsx302("div", { className: "calendar-picker-grid", children: Array.from({ length: 12 }, (_, i) => {
6072
+ pickerMode === "years" && /* @__PURE__ */ jsx303("div", { className: "calendar-picker-grid", children: Array.from({ length: 12 }, (_, i) => {
6032
6073
  const y = yearRangeStart + i;
6033
- return /* @__PURE__ */ jsx302(
6074
+ return /* @__PURE__ */ jsx303(
6034
6075
  "button",
6035
6076
  {
6036
6077
  type: "button",
@@ -6041,7 +6082,7 @@ var Calendar = (props) => {
6041
6082
  y
6042
6083
  );
6043
6084
  }) }),
6044
- pickerMode === "months" && /* @__PURE__ */ jsx302("div", { className: "calendar-picker-grid", children: monthLabels.map((label, i) => /* @__PURE__ */ jsx302(
6085
+ pickerMode === "months" && /* @__PURE__ */ jsx303("div", { className: "calendar-picker-grid", children: monthLabels.map((label, i) => /* @__PURE__ */ jsx303(
6045
6086
  "button",
6046
6087
  {
6047
6088
  type: "button",
@@ -6051,8 +6092,8 @@ var Calendar = (props) => {
6051
6092
  },
6052
6093
  i
6053
6094
  )) }),
6054
- pickerMode === "days" && /* @__PURE__ */ jsxs193(Fragment, { children: [
6055
- /* @__PURE__ */ jsx302("div", { className: "calendar-weekdays", children: weekdays.map((label, i) => /* @__PURE__ */ jsx302(
6095
+ pickerMode === "days" && /* @__PURE__ */ jsxs194(Fragment2, { children: [
6096
+ /* @__PURE__ */ jsx303("div", { className: "calendar-weekdays", children: weekdays.map((label, i) => /* @__PURE__ */ jsx303(
6056
6097
  "div",
6057
6098
  {
6058
6099
  className: clsx_default(
@@ -6064,12 +6105,12 @@ var Calendar = (props) => {
6064
6105
  },
6065
6106
  label
6066
6107
  )) }),
6067
- /* @__PURE__ */ jsx302("div", { className: "calendar-grid", children: days.map((day, idx) => {
6108
+ /* @__PURE__ */ jsx303("div", { className: "calendar-grid", children: days.map((day, idx) => {
6068
6109
  const dayEvents = getEventsForDay(day.date);
6069
6110
  const t = day.date.getTime();
6070
6111
  const disabled = t < minTime || t > maxTime;
6071
6112
  const isSelected = selectedDate ? isSameDay(day.date, selectedDate) : false;
6072
- return /* @__PURE__ */ jsx302(
6113
+ return /* @__PURE__ */ jsx303(
6073
6114
  DayCell,
6074
6115
  {
6075
6116
  day,
@@ -6095,10 +6136,10 @@ var Calendar_default = Calendar;
6095
6136
  import React5 from "react";
6096
6137
 
6097
6138
  // src/components/CardTab/CardTabPanel.tsx
6098
- import { jsx as jsx303 } from "react/jsx-runtime";
6139
+ import { jsx as jsx304 } from "react/jsx-runtime";
6099
6140
  var CardTabPanel = (props) => {
6100
6141
  const { children, columns = 3 } = props;
6101
- return /* @__PURE__ */ jsx303(
6142
+ return /* @__PURE__ */ jsx304(
6102
6143
  "div",
6103
6144
  {
6104
6145
  className: "card-tab-panel",
@@ -6111,7 +6152,7 @@ CardTabPanel.displayName = "CardTab.Panel";
6111
6152
  var CardTabPanel_default = CardTabPanel;
6112
6153
 
6113
6154
  // src/components/CardTab/CardTab.tsx
6114
- import { jsx as jsx304, jsxs as jsxs194 } from "react/jsx-runtime";
6155
+ import { jsx as jsx305, jsxs as jsxs195 } from "react/jsx-runtime";
6115
6156
  var CardTabRoot = (props) => {
6116
6157
  const {
6117
6158
  tabs,
@@ -6135,10 +6176,10 @@ var CardTabRoot = (props) => {
6135
6176
  const activePanel = panels.find(
6136
6177
  (panel) => panel.props.value === activeValue
6137
6178
  );
6138
- return /* @__PURE__ */ jsxs194("div", { className: clsx_default("lib-xplat-card-tab", size), children: [
6139
- /* @__PURE__ */ jsx304("div", { className: "card-tab-bar", children: tabs.map((tab) => {
6179
+ return /* @__PURE__ */ jsxs195("div", { className: clsx_default("lib-xplat-card-tab", size), children: [
6180
+ /* @__PURE__ */ jsx305("div", { className: "card-tab-bar", children: tabs.map((tab) => {
6140
6181
  const isActive2 = tab.value === activeValue;
6141
- return /* @__PURE__ */ jsx304(
6182
+ return /* @__PURE__ */ jsx305(
6142
6183
  "button",
6143
6184
  {
6144
6185
  className: clsx_default("card-tab-trigger", isActive2 && "active"),
@@ -6150,7 +6191,7 @@ var CardTabRoot = (props) => {
6150
6191
  tab.value
6151
6192
  );
6152
6193
  }) }),
6153
- /* @__PURE__ */ jsx304("div", { className: "card-tab-body", children: activePanel })
6194
+ /* @__PURE__ */ jsx305("div", { className: "card-tab-body", children: activePanel })
6154
6195
  ] });
6155
6196
  };
6156
6197
  CardTabRoot.displayName = "CardTab";
@@ -6161,7 +6202,7 @@ var CardTab_default = CardTab;
6161
6202
 
6162
6203
  // src/components/Chart/Chart.tsx
6163
6204
  import React6 from "react";
6164
- import { Fragment as Fragment2, jsx as jsx305, jsxs as jsxs195 } from "react/jsx-runtime";
6205
+ import { Fragment as Fragment3, jsx as jsx306, jsxs as jsxs196 } from "react/jsx-runtime";
6165
6206
  var CATEGORICAL_COUNT2 = 8;
6166
6207
  var LINE_BAR_PALETTES = Array.from({ length: CATEGORICAL_COUNT2 }, (_, i) => {
6167
6208
  const n = i + 1;
@@ -6304,12 +6345,12 @@ var formatTick = (value, maxVal) => {
6304
6345
  const fixed = value.toFixed(decimals);
6305
6346
  return decimals === 0 ? Number(fixed).toLocaleString("en-US") : fixed;
6306
6347
  };
6307
- var GridLines = React6.memo(({ width, height, chartH, maxVal }) => /* @__PURE__ */ jsx305(Fragment2, { children: [0, 0.25, 0.5, 0.75, 1].map((ratio) => {
6348
+ var GridLines = React6.memo(({ width, height, chartH, maxVal }) => /* @__PURE__ */ jsx306(Fragment3, { children: [0, 0.25, 0.5, 0.75, 1].map((ratio) => {
6308
6349
  const y = PADDING.top + (1 - ratio) * chartH;
6309
6350
  const val = formatTick(maxVal * ratio, maxVal);
6310
- return /* @__PURE__ */ jsxs195("g", { children: [
6311
- /* @__PURE__ */ jsx305("line", { x1: PADDING.left, y1: y, x2: width - PADDING.right, y2: y, className: "chart-grid" }),
6312
- /* @__PURE__ */ jsx305("text", { x: PADDING.left - 8, y: y + 4, className: "chart-axis-label", textAnchor: "end", children: val })
6351
+ return /* @__PURE__ */ jsxs196("g", { children: [
6352
+ /* @__PURE__ */ jsx306("line", { x1: PADDING.left, y1: y, x2: width - PADDING.right, y2: y, className: "chart-grid" }),
6353
+ /* @__PURE__ */ jsx306("text", { x: PADDING.left - 8, y: y + 4, className: "chart-axis-label", textAnchor: "end", children: val })
6313
6354
  ] }, ratio);
6314
6355
  }) }));
6315
6356
  GridLines.displayName = "GridLines";
@@ -6321,10 +6362,10 @@ var getLabelStep = (count, chartW) => {
6321
6362
  };
6322
6363
  var AxisLabels = React6.memo(({ labels, count, chartW, height }) => {
6323
6364
  const step = getLabelStep(count, chartW);
6324
- return /* @__PURE__ */ jsx305(Fragment2, { children: labels.map((label, i) => {
6365
+ return /* @__PURE__ */ jsx306(Fragment3, { children: labels.map((label, i) => {
6325
6366
  if (i % step !== 0) return null;
6326
6367
  const x = PADDING.left + i / (count - 1 || 1) * chartW;
6327
- return /* @__PURE__ */ jsx305("text", { x, y: height - 8, className: "chart-axis-label", textAnchor: "middle", children: label }, i);
6368
+ return /* @__PURE__ */ jsx306("text", { x, y: height - 8, className: "chart-axis-label", textAnchor: "middle", children: label }, i);
6328
6369
  }) });
6329
6370
  });
6330
6371
  AxisLabels.displayName = "AxisLabels";
@@ -6400,7 +6441,7 @@ var LineChart = React6.memo(({ data, labels, width, height, animate, onHover, on
6400
6441
  }, [animate, width]);
6401
6442
  const activeX = activeIndex !== null ? seriesPoints[0]?.[activeIndex]?.x ?? null : null;
6402
6443
  const lineClipId = "line-area-clip";
6403
- return /* @__PURE__ */ jsxs195(
6444
+ return /* @__PURE__ */ jsxs196(
6404
6445
  "svg",
6405
6446
  {
6406
6447
  viewBox: `0 0 ${width} ${height}`,
@@ -6418,9 +6459,9 @@ var LineChart = React6.memo(({ data, labels, width, height, animate, onHover, on
6418
6459
  onLeave();
6419
6460
  },
6420
6461
  children: [
6421
- animate && /* @__PURE__ */ jsx305("defs", { children: /* @__PURE__ */ jsx305("clipPath", { id: lineClipId, children: /* @__PURE__ */ jsx305("rect", { ref: clipRef, x: "0", y: "0", width: animate ? 0 : width, height }) }) }),
6422
- /* @__PURE__ */ jsx305(GridLines, { width, height, chartH, maxVal }),
6423
- /* @__PURE__ */ jsx305(AxisLabels, { labels, count, chartW, height }),
6462
+ animate && /* @__PURE__ */ jsx306("defs", { children: /* @__PURE__ */ jsx306("clipPath", { id: lineClipId, children: /* @__PURE__ */ jsx306("rect", { ref: clipRef, x: "0", y: "0", width: animate ? 0 : width, height }) }) }),
6463
+ /* @__PURE__ */ jsx306(GridLines, { width, height, chartH, maxVal }),
6464
+ /* @__PURE__ */ jsx306(AxisLabels, { labels, count, chartW, height }),
6424
6465
  entries.map(([key], di) => {
6425
6466
  const palette = getPalette(LINE_BAR_PALETTES, di, key);
6426
6467
  const color = palette[2];
@@ -6429,16 +6470,16 @@ var LineChart = React6.memo(({ data, labels, width, height, animate, onHover, on
6429
6470
  const gradientId = `line-gradient-${di}`;
6430
6471
  const polyPoints = points.map((p) => `${p.x},${p.y}`).join(" ");
6431
6472
  const areaD = `M ${points[0].x},${points[0].y} ${points.map((p) => `L ${p.x},${p.y}`).join(" ")} L ${points[points.length - 1].x},${PADDING.top + chartH} L ${points[0].x},${PADDING.top + chartH} Z`;
6432
- return /* @__PURE__ */ jsxs195("g", { children: [
6433
- /* @__PURE__ */ jsx305("defs", { children: /* @__PURE__ */ jsxs195("linearGradient", { id: gradientId, x1: "0", y1: "0", x2: "0", y2: "1", children: [
6434
- /* @__PURE__ */ jsx305("stop", { offset: "0%", stopColor: areaColor, stopOpacity: "0.2" }),
6435
- /* @__PURE__ */ jsx305("stop", { offset: "100%", stopColor: areaColor, stopOpacity: "0" })
6473
+ return /* @__PURE__ */ jsxs196("g", { children: [
6474
+ /* @__PURE__ */ jsx306("defs", { children: /* @__PURE__ */ jsxs196("linearGradient", { id: gradientId, x1: "0", y1: "0", x2: "0", y2: "1", children: [
6475
+ /* @__PURE__ */ jsx306("stop", { offset: "0%", stopColor: areaColor, stopOpacity: "0.2" }),
6476
+ /* @__PURE__ */ jsx306("stop", { offset: "100%", stopColor: areaColor, stopOpacity: "0" })
6436
6477
  ] }) }),
6437
- /* @__PURE__ */ jsxs195("g", { clipPath: animate ? `url(#${lineClipId})` : void 0, children: [
6438
- /* @__PURE__ */ jsx305("path", { d: areaD, fill: `url(#${gradientId})` }),
6439
- /* @__PURE__ */ jsx305("polyline", { points: polyPoints, fill: "none", stroke: color, strokeWidth: "2" })
6478
+ /* @__PURE__ */ jsxs196("g", { clipPath: animate ? `url(#${lineClipId})` : void 0, children: [
6479
+ /* @__PURE__ */ jsx306("path", { d: areaD, fill: `url(#${gradientId})` }),
6480
+ /* @__PURE__ */ jsx306("polyline", { points: polyPoints, fill: "none", stroke: color, strokeWidth: "2" })
6440
6481
  ] }),
6441
- activeIndex !== null && points[activeIndex] && /* @__PURE__ */ jsx305(
6482
+ activeIndex !== null && points[activeIndex] && /* @__PURE__ */ jsx306(
6442
6483
  "circle",
6443
6484
  {
6444
6485
  cx: points[activeIndex].x,
@@ -6450,7 +6491,7 @@ var LineChart = React6.memo(({ data, labels, width, height, animate, onHover, on
6450
6491
  )
6451
6492
  ] }, di);
6452
6493
  }),
6453
- activeX !== null && /* @__PURE__ */ jsx305(
6494
+ activeX !== null && /* @__PURE__ */ jsx306(
6454
6495
  "line",
6455
6496
  {
6456
6497
  x1: activeX,
@@ -6460,7 +6501,7 @@ var LineChart = React6.memo(({ data, labels, width, height, animate, onHover, on
6460
6501
  className: "chart-crosshair"
6461
6502
  }
6462
6503
  ),
6463
- /* @__PURE__ */ jsx305(
6504
+ /* @__PURE__ */ jsx306(
6464
6505
  "rect",
6465
6506
  {
6466
6507
  x: PADDING.left,
@@ -6509,7 +6550,7 @@ var CurveChart = React6.memo(({ data, labels, width, height, animate, onHover, o
6509
6550
  }, [animate, width]);
6510
6551
  const activeX = activeIndex !== null ? seriesPoints[0]?.[activeIndex]?.x ?? null : null;
6511
6552
  const curveClipId = "curve-area-clip";
6512
- return /* @__PURE__ */ jsxs195(
6553
+ return /* @__PURE__ */ jsxs196(
6513
6554
  "svg",
6514
6555
  {
6515
6556
  viewBox: `0 0 ${width} ${height}`,
@@ -6528,9 +6569,9 @@ var CurveChart = React6.memo(({ data, labels, width, height, animate, onHover, o
6528
6569
  onLeave();
6529
6570
  },
6530
6571
  children: [
6531
- animate && /* @__PURE__ */ jsx305("defs", { children: /* @__PURE__ */ jsx305("clipPath", { id: curveClipId, children: /* @__PURE__ */ jsx305("rect", { ref: curveClipRef, x: "0", y: "0", width: animate ? 0 : width, height }) }) }),
6532
- /* @__PURE__ */ jsx305(GridLines, { width, height, chartH, maxVal }),
6533
- /* @__PURE__ */ jsx305(AxisLabels, { labels, count, chartW, height }),
6572
+ animate && /* @__PURE__ */ jsx306("defs", { children: /* @__PURE__ */ jsx306("clipPath", { id: curveClipId, children: /* @__PURE__ */ jsx306("rect", { ref: curveClipRef, x: "0", y: "0", width: animate ? 0 : width, height }) }) }),
6573
+ /* @__PURE__ */ jsx306(GridLines, { width, height, chartH, maxVal }),
6574
+ /* @__PURE__ */ jsx306(AxisLabels, { labels, count, chartW, height }),
6534
6575
  entries.map(([key], di) => {
6535
6576
  const palette = getPalette(LINE_BAR_PALETTES, di, key);
6536
6577
  const color = palette[2];
@@ -6539,16 +6580,16 @@ var CurveChart = React6.memo(({ data, labels, width, height, animate, onHover, o
6539
6580
  const gradientId = `curve-gradient-${di}`;
6540
6581
  const linePath = toSmoothPath(points);
6541
6582
  const areaPath = linePath + ` L ${points[points.length - 1].x} ${PADDING.top + chartH} L ${points[0].x} ${PADDING.top + chartH} Z`;
6542
- return /* @__PURE__ */ jsxs195("g", { children: [
6543
- /* @__PURE__ */ jsx305("defs", { children: /* @__PURE__ */ jsxs195("linearGradient", { id: gradientId, x1: "0", y1: "0", x2: "0", y2: "1", children: [
6544
- /* @__PURE__ */ jsx305("stop", { offset: "0%", stopColor: areaColor, stopOpacity: "0.4" }),
6545
- /* @__PURE__ */ jsx305("stop", { offset: "100%", stopColor: areaColor, stopOpacity: "0.02" })
6583
+ return /* @__PURE__ */ jsxs196("g", { children: [
6584
+ /* @__PURE__ */ jsx306("defs", { children: /* @__PURE__ */ jsxs196("linearGradient", { id: gradientId, x1: "0", y1: "0", x2: "0", y2: "1", children: [
6585
+ /* @__PURE__ */ jsx306("stop", { offset: "0%", stopColor: areaColor, stopOpacity: "0.4" }),
6586
+ /* @__PURE__ */ jsx306("stop", { offset: "100%", stopColor: areaColor, stopOpacity: "0.02" })
6546
6587
  ] }) }),
6547
- /* @__PURE__ */ jsxs195("g", { clipPath: animate ? `url(#${curveClipId})` : void 0, children: [
6548
- /* @__PURE__ */ jsx305("path", { d: areaPath, fill: `url(#${gradientId})` }),
6549
- /* @__PURE__ */ jsx305("path", { d: linePath, fill: "none", stroke: color, strokeWidth: "2" })
6588
+ /* @__PURE__ */ jsxs196("g", { clipPath: animate ? `url(#${curveClipId})` : void 0, children: [
6589
+ /* @__PURE__ */ jsx306("path", { d: areaPath, fill: `url(#${gradientId})` }),
6590
+ /* @__PURE__ */ jsx306("path", { d: linePath, fill: "none", stroke: color, strokeWidth: "2" })
6550
6591
  ] }),
6551
- activeIndex !== null && points[activeIndex] && /* @__PURE__ */ jsx305(
6592
+ activeIndex !== null && points[activeIndex] && /* @__PURE__ */ jsx306(
6552
6593
  "circle",
6553
6594
  {
6554
6595
  cx: points[activeIndex].x,
@@ -6560,7 +6601,7 @@ var CurveChart = React6.memo(({ data, labels, width, height, animate, onHover, o
6560
6601
  )
6561
6602
  ] }, di);
6562
6603
  }),
6563
- activeX !== null && /* @__PURE__ */ jsx305(
6604
+ activeX !== null && /* @__PURE__ */ jsx306(
6564
6605
  "line",
6565
6606
  {
6566
6607
  x1: activeX,
@@ -6570,7 +6611,7 @@ var CurveChart = React6.memo(({ data, labels, width, height, animate, onHover, o
6570
6611
  className: "chart-crosshair"
6571
6612
  }
6572
6613
  ),
6573
- /* @__PURE__ */ jsx305(
6614
+ /* @__PURE__ */ jsx306(
6574
6615
  "rect",
6575
6616
  {
6576
6617
  x: PADDING.left,
@@ -6613,11 +6654,11 @@ var BarChart = React6.memo(({ data, labels, width, height, animate, onHover, onM
6613
6654
  [entries, maxVal, chartH, groupW, barW, barGap, groupCount]
6614
6655
  );
6615
6656
  const barLabelStep = getLabelStep(count, chartW);
6616
- return /* @__PURE__ */ jsxs195("svg", { viewBox: `0 0 ${width} ${height}`, className: "chart-svg", children: [
6617
- /* @__PURE__ */ jsx305(GridLines, { width, height, chartH, maxVal }),
6657
+ return /* @__PURE__ */ jsxs196("svg", { viewBox: `0 0 ${width} ${height}`, className: "chart-svg", children: [
6658
+ /* @__PURE__ */ jsx306(GridLines, { width, height, chartH, maxVal }),
6618
6659
  labels.map((label, i) => {
6619
6660
  if (i % barLabelStep !== 0) return null;
6620
- return /* @__PURE__ */ jsx305("text", { x: PADDING.left + groupW * i + groupW / 2, y: height - 8, className: "chart-axis-label", textAnchor: "middle", children: label }, i);
6661
+ return /* @__PURE__ */ jsx306("text", { x: PADDING.left + groupW * i + groupW / 2, y: height - 8, className: "chart-axis-label", textAnchor: "middle", children: label }, i);
6621
6662
  }),
6622
6663
  entries.map(([key], di) => {
6623
6664
  const palette = getPalette(LINE_BAR_PALETTES, di, key);
@@ -6626,7 +6667,7 @@ var BarChart = React6.memo(({ data, labels, width, height, animate, onHover, onM
6626
6667
  const r2 = Math.min(4, b.w / 2);
6627
6668
  const d = b.h <= r2 ? `M ${b.x} ${b.y + b.h} V ${b.y} H ${b.x + b.w} V ${b.y + b.h} Z` : `M ${b.x} ${b.y + b.h} V ${b.y + r2} Q ${b.x} ${b.y} ${b.x + r2} ${b.y} H ${b.x + b.w - r2} Q ${b.x + b.w} ${b.y} ${b.x + b.w} ${b.y + r2} V ${b.y + b.h} Z`;
6628
6669
  const delay = 100 + i * 80;
6629
- return /* @__PURE__ */ jsx305(
6670
+ return /* @__PURE__ */ jsx306(
6630
6671
  "path",
6631
6672
  {
6632
6673
  d,
@@ -6706,8 +6747,8 @@ var PieDonutChart = React6.memo(
6706
6747
  });
6707
6748
  }, [values, total, cx, cy, r2, innerR, labels]);
6708
6749
  const maskId = `pie-mask-${isDoughnut ? "d" : "p"}`;
6709
- return /* @__PURE__ */ jsxs195("svg", { viewBox: `0 0 ${size} ${size}`, className: "chart-svg chart-pie", children: [
6710
- animate && /* @__PURE__ */ jsx305("defs", { children: /* @__PURE__ */ jsx305("mask", { id: maskId, children: /* @__PURE__ */ jsx305(
6750
+ return /* @__PURE__ */ jsxs196("svg", { viewBox: `0 0 ${size} ${size}`, className: "chart-svg chart-pie", children: [
6751
+ animate && /* @__PURE__ */ jsx306("defs", { children: /* @__PURE__ */ jsx306("mask", { id: maskId, children: /* @__PURE__ */ jsx306(
6711
6752
  "circle",
6712
6753
  {
6713
6754
  ref: maskRef,
@@ -6720,7 +6761,7 @@ var PieDonutChart = React6.memo(
6720
6761
  transform: `rotate(-90 ${cx} ${cy})`
6721
6762
  }
6722
6763
  ) }) }),
6723
- /* @__PURE__ */ jsx305("g", { mask: animate ? `url(#${maskId})` : void 0, children: sliceData.map((s, i) => /* @__PURE__ */ jsx305("g", { children: /* @__PURE__ */ jsx305(
6764
+ /* @__PURE__ */ jsx306("g", { mask: animate ? `url(#${maskId})` : void 0, children: sliceData.map((s, i) => /* @__PURE__ */ jsx306("g", { children: /* @__PURE__ */ jsx306(
6724
6765
  "path",
6725
6766
  {
6726
6767
  d: s.d,
@@ -6755,15 +6796,15 @@ var ChartTooltip = ({ x, y, containerWidth, containerHeight, tooltipType, childr
6755
6796
  const sepIdx = content.indexOf(" \u2014 ");
6756
6797
  const title = sepIdx >= 0 ? content.slice(0, sepIdx) : content;
6757
6798
  const desc = sepIdx >= 0 ? content.slice(sepIdx + 3) : "";
6758
- return /* @__PURE__ */ jsxs195(
6799
+ return /* @__PURE__ */ jsxs196(
6759
6800
  "div",
6760
6801
  {
6761
6802
  ref,
6762
6803
  className: `lib-xplat-tooltip ${tooltipType} chart-tooltip-pos`,
6763
6804
  style: { left: pos.left, top: pos.top },
6764
6805
  children: [
6765
- title && /* @__PURE__ */ jsx305("div", { className: "tooltip-title", children: title }),
6766
- desc && /* @__PURE__ */ jsx305("div", { className: "tooltip-desc", children: desc })
6806
+ title && /* @__PURE__ */ jsx306("div", { className: "tooltip-title", children: title }),
6807
+ desc && /* @__PURE__ */ jsx306("div", { className: "tooltip-desc", children: desc })
6767
6808
  ]
6768
6809
  }
6769
6810
  );
@@ -6775,14 +6816,14 @@ var ChartLegend = ({ data, labels, type }) => {
6775
6816
  const total = values.reduce((a, b) => a + b, 0) || 1;
6776
6817
  const firstKey = entries[0]?.[0] ?? "";
6777
6818
  const colorOffset = hashString(firstKey);
6778
- return /* @__PURE__ */ jsx305("div", { className: "chart-legend", children: values.map((v, i) => {
6819
+ return /* @__PURE__ */ jsx306("div", { className: "chart-legend", children: values.map((v, i) => {
6779
6820
  const pct = Math.round(v / total * 100);
6780
6821
  const color = PIE_COLORS[(i + colorOffset) % PIE_COLORS.length];
6781
- return /* @__PURE__ */ jsxs195("div", { className: "chart-legend-item", children: [
6782
- /* @__PURE__ */ jsx305("span", { className: "chart-legend-dot", style: { backgroundColor: color } }),
6783
- /* @__PURE__ */ jsxs195("div", { className: "chart-legend-text", children: [
6784
- /* @__PURE__ */ jsx305("span", { className: "chart-legend-label", children: labels[i] || `${i + 1}` }),
6785
- /* @__PURE__ */ jsxs195("span", { className: "chart-legend-value", children: [
6822
+ return /* @__PURE__ */ jsxs196("div", { className: "chart-legend-item", children: [
6823
+ /* @__PURE__ */ jsx306("span", { className: "chart-legend-dot", style: { backgroundColor: color } }),
6824
+ /* @__PURE__ */ jsxs196("div", { className: "chart-legend-text", children: [
6825
+ /* @__PURE__ */ jsx306("span", { className: "chart-legend-label", children: labels[i] || `${i + 1}` }),
6826
+ /* @__PURE__ */ jsxs196("span", { className: "chart-legend-value", children: [
6786
6827
  v.toLocaleString(),
6787
6828
  "(",
6788
6829
  pct,
@@ -6792,22 +6833,23 @@ var ChartLegend = ({ data, labels, type }) => {
6792
6833
  ] }, i);
6793
6834
  }) });
6794
6835
  }
6795
- return /* @__PURE__ */ jsx305("div", { className: "chart-legend", children: entries.map(([key], di) => {
6836
+ return /* @__PURE__ */ jsx306("div", { className: "chart-legend", children: entries.map(([key], di) => {
6796
6837
  const palette = getPalette(LINE_BAR_PALETTES, di, key);
6797
6838
  const color = palette[2];
6798
6839
  const values = entries[di][1];
6799
6840
  const sum = values.reduce((a, b) => a + b, 0);
6800
- return /* @__PURE__ */ jsxs195("div", { className: "chart-legend-item", children: [
6801
- /* @__PURE__ */ jsx305("span", { className: "chart-legend-dot", style: { backgroundColor: color } }),
6802
- /* @__PURE__ */ jsxs195("div", { className: "chart-legend-text", children: [
6803
- /* @__PURE__ */ jsx305("span", { className: "chart-legend-label", children: key }),
6804
- /* @__PURE__ */ jsx305("span", { className: "chart-legend-value", children: sum.toLocaleString() })
6841
+ return /* @__PURE__ */ jsxs196("div", { className: "chart-legend-item", children: [
6842
+ /* @__PURE__ */ jsx306("span", { className: "chart-legend-dot", style: { backgroundColor: color } }),
6843
+ /* @__PURE__ */ jsxs196("div", { className: "chart-legend-text", children: [
6844
+ /* @__PURE__ */ jsx306("span", { className: "chart-legend-label", children: key }),
6845
+ /* @__PURE__ */ jsx306("span", { className: "chart-legend-value", children: sum.toLocaleString() })
6805
6846
  ] })
6806
6847
  ] }, di);
6807
6848
  }) });
6808
6849
  };
6809
6850
  var Chart = React6.memo((props) => {
6810
- const { type, data, labels, tooltip: showTooltip = true, tooltipType = "light" } = props;
6851
+ const { variant, type, data, labels, tooltip: showTooltip = true, tooltipType = "light" } = props;
6852
+ const shape = variant ?? type ?? "line";
6811
6853
  const { tooltip, show, hide, move, containerRef } = useChartTooltip(showTooltip);
6812
6854
  const { width, height } = useChartSize(containerRef);
6813
6855
  const stableData = React6.useMemo(() => data, [JSON.stringify(data)]);
@@ -6815,14 +6857,14 @@ var Chart = React6.memo((props) => {
6815
6857
  const dataKey = React6.useMemo(() => JSON.stringify(labels), [labels]);
6816
6858
  const animate = useChartAnimation(containerRef, dataKey);
6817
6859
  const ready = width > 0 && height > 0;
6818
- return /* @__PURE__ */ jsxs195("div", { className: "lib-xplat-chart", ref: containerRef, children: [
6819
- ready && type === "line" && /* @__PURE__ */ jsx305(LineChart, { data: stableData, labels: stableLabels, width, height, animate, onHover: show, onMove: move, onLeave: hide }),
6820
- ready && type === "curve" && /* @__PURE__ */ jsx305(CurveChart, { data: stableData, labels: stableLabels, width, height, animate, onHover: show, onMove: move, onLeave: hide }),
6821
- ready && type === "bar" && /* @__PURE__ */ jsx305(BarChart, { data: stableData, labels: stableLabels, width, height, animate, onHover: show, onMove: move, onLeave: hide }),
6822
- ready && type === "pie" && /* @__PURE__ */ jsx305(PieDonutChart, { data: stableData, labels: stableLabels, width, height, animate, onHover: show, onMove: move, onLeave: hide }),
6823
- ready && type === "doughnut" && /* @__PURE__ */ jsx305(PieDonutChart, { data: stableData, labels: stableLabels, width, height, animate, isDoughnut: true, onHover: show, onMove: move, onLeave: hide }),
6824
- ready && (type === "pie" || type === "doughnut") && /* @__PURE__ */ jsx305(ChartLegend, { data: stableData, labels: stableLabels, type }),
6825
- tooltip.visible && tooltip.content && /* @__PURE__ */ jsx305(ChartTooltip, { x: tooltip.x, y: tooltip.y, containerWidth: width, containerHeight: height, tooltipType, children: tooltip.content })
6860
+ return /* @__PURE__ */ jsxs196("div", { className: "lib-xplat-chart", ref: containerRef, children: [
6861
+ ready && shape === "line" && /* @__PURE__ */ jsx306(LineChart, { data: stableData, labels: stableLabels, width, height, animate, onHover: show, onMove: move, onLeave: hide }),
6862
+ ready && shape === "curve" && /* @__PURE__ */ jsx306(CurveChart, { data: stableData, labels: stableLabels, width, height, animate, onHover: show, onMove: move, onLeave: hide }),
6863
+ ready && shape === "bar" && /* @__PURE__ */ jsx306(BarChart, { data: stableData, labels: stableLabels, width, height, animate, onHover: show, onMove: move, onLeave: hide }),
6864
+ ready && shape === "pie" && /* @__PURE__ */ jsx306(PieDonutChart, { data: stableData, labels: stableLabels, width, height, animate, onHover: show, onMove: move, onLeave: hide }),
6865
+ ready && shape === "doughnut" && /* @__PURE__ */ jsx306(PieDonutChart, { data: stableData, labels: stableLabels, width, height, animate, isDoughnut: true, onHover: show, onMove: move, onLeave: hide }),
6866
+ ready && (type === "pie" || type === "doughnut") && /* @__PURE__ */ jsx306(ChartLegend, { data: stableData, labels: stableLabels, type }),
6867
+ tooltip.visible && tooltip.content && /* @__PURE__ */ jsx306(ChartTooltip, { x: tooltip.x, y: tooltip.y, containerWidth: width, containerHeight: height, tooltipType, children: tooltip.content })
6826
6868
  ] });
6827
6869
  });
6828
6870
  Chart.displayName = "Chart";
@@ -6832,7 +6874,7 @@ var Chart_default = Chart;
6832
6874
  import React7 from "react";
6833
6875
 
6834
6876
  // src/components/IconButton/IconButton.tsx
6835
- import { jsx as jsx306 } from "react/jsx-runtime";
6877
+ import { jsx as jsx307 } from "react/jsx-runtime";
6836
6878
  var IconButton = (props) => {
6837
6879
  const {
6838
6880
  icon,
@@ -6841,7 +6883,7 @@ var IconButton = (props) => {
6841
6883
  disabled,
6842
6884
  ...rest
6843
6885
  } = props;
6844
- return /* @__PURE__ */ jsx306(
6886
+ return /* @__PURE__ */ jsx307(
6845
6887
  "button",
6846
6888
  {
6847
6889
  className: clsx_default("lib-xplat-icon-button", type, size),
@@ -6855,7 +6897,7 @@ IconButton.displayName = "IconButton";
6855
6897
  var IconButton_default = IconButton;
6856
6898
 
6857
6899
  // src/components/ChatInput/ChatInput.tsx
6858
- import { jsx as jsx307, jsxs as jsxs196 } from "react/jsx-runtime";
6900
+ import { jsx as jsx308, jsxs as jsxs197 } from "react/jsx-runtime";
6859
6901
  var ChatInput = React7.forwardRef(
6860
6902
  (props, ref) => {
6861
6903
  const {
@@ -6864,7 +6906,8 @@ var ChatInput = React7.forwardRef(
6864
6906
  disabled = false,
6865
6907
  buttonType = "primary",
6866
6908
  onSubmit,
6867
- onChange
6909
+ onChange,
6910
+ validations
6868
6911
  } = props;
6869
6912
  const isControlled = valueProp !== void 0;
6870
6913
  const [internalValue, setInternalValue] = React7.useState("");
@@ -6886,8 +6929,8 @@ var ChatInput = React7.forwardRef(
6886
6929
  handleSubmit();
6887
6930
  }
6888
6931
  };
6889
- return /* @__PURE__ */ jsxs196("div", { className: clsx_default("lib-xplat-chat-input", disabled && "disabled"), children: [
6890
- /* @__PURE__ */ jsx307(
6932
+ const control = /* @__PURE__ */ jsxs197("div", { className: clsx_default("lib-xplat-chat-input", disabled && "disabled"), children: [
6933
+ /* @__PURE__ */ jsx308(
6891
6934
  AutoResizeTextArea_default,
6892
6935
  {
6893
6936
  ref,
@@ -6898,13 +6941,14 @@ var ChatInput = React7.forwardRef(
6898
6941
  disabled,
6899
6942
  rows: 1,
6900
6943
  onChange: handleChange,
6944
+ "aria-invalid": hasError(validations) || void 0,
6901
6945
  onKeyDown: handleKeyDown
6902
6946
  }
6903
6947
  ),
6904
- /* @__PURE__ */ jsx307(
6948
+ /* @__PURE__ */ jsx308(
6905
6949
  IconButton_default,
6906
6950
  {
6907
- icon: /* @__PURE__ */ jsx307(MessageSquareIcon_default, {}),
6951
+ icon: /* @__PURE__ */ jsx308(MessageSquareIcon_default, {}),
6908
6952
  type: buttonType,
6909
6953
  size: "sm",
6910
6954
  disabled: !hasText || disabled,
@@ -6913,6 +6957,7 @@ var ChatInput = React7.forwardRef(
6913
6957
  }
6914
6958
  )
6915
6959
  ] });
6960
+ return /* @__PURE__ */ jsx308(Field, { validations, children: control });
6916
6961
  }
6917
6962
  );
6918
6963
  ChatInput.displayName = "ChatInput";
@@ -6937,8 +6982,11 @@ import { semantic } from "@x-plat/tokens-core";
6937
6982
  // src/tokens/index.ts
6938
6983
  import { cssVar } from "@x-plat/tokens-core";
6939
6984
 
6985
+ // src/tokens/interface/status.ts
6986
+ var normalizeStatus = (value) => value === "brand" ? "primary" : value;
6987
+
6940
6988
  // src/components/CheckBox/CheckBox.tsx
6941
- import { jsx as jsx308, jsxs as jsxs197 } from "react/jsx-runtime";
6989
+ import { jsx as jsx309, jsxs as jsxs198 } from "react/jsx-runtime";
6942
6990
  var CheckBox = (props) => {
6943
6991
  const {
6944
6992
  checked,
@@ -6947,9 +6995,11 @@ var CheckBox = (props) => {
6947
6995
  onChange,
6948
6996
  disabled,
6949
6997
  size = "md",
6950
- type = "brand",
6998
+ type = "primary",
6999
+ validations,
6951
7000
  ...rest
6952
7001
  } = props;
7002
+ const statusType = normalizeStatus(type);
6953
7003
  const handleChange = (e) => {
6954
7004
  if (onChange) onChange(e);
6955
7005
  };
@@ -6957,33 +7007,35 @@ var CheckBox = (props) => {
6957
7007
  const checkedClasses = `checked`;
6958
7008
  const disabledClasses = "disabled";
6959
7009
  const boxClasses = disabled ? disabledClasses : checked ? checkedClasses : uncheckedClasses;
6960
- return /* @__PURE__ */ jsxs197("label", { className: clsx_default("lib-xplat-checkbox", size, type, className), children: [
6961
- /* @__PURE__ */ jsx308(
7010
+ const control = /* @__PURE__ */ jsxs198("label", { className: clsx_default("lib-xplat-checkbox", size, statusType, className), children: [
7011
+ /* @__PURE__ */ jsx309(
6962
7012
  "input",
6963
7013
  {
6964
7014
  type: "checkbox",
6965
7015
  checked,
6966
7016
  onChange: handleChange,
6967
7017
  disabled,
7018
+ "aria-invalid": hasError(validations) || void 0,
6968
7019
  ...rest
6969
7020
  }
6970
7021
  ),
6971
- /* @__PURE__ */ jsx308("span", { className: clsx_default("checkbox", boxClasses), children: /* @__PURE__ */ jsx308("span", { className: clsx_default("check-icon", { visible: checked }), children: /* @__PURE__ */ jsx308(CheckIcon_default, {}) }) }),
6972
- label && /* @__PURE__ */ jsx308("span", { className: "label", children: label })
7022
+ /* @__PURE__ */ jsx309("span", { className: clsx_default("checkbox", boxClasses), children: /* @__PURE__ */ jsx309("span", { className: clsx_default("check-icon", { visible: checked }), children: /* @__PURE__ */ jsx309(CheckIcon_default, {}) }) }),
7023
+ label && /* @__PURE__ */ jsx309("span", { className: "label", children: label })
6973
7024
  ] });
7025
+ return /* @__PURE__ */ jsx309(Field, { validations, children: control });
6974
7026
  };
6975
7027
  CheckBox.displayName = "CheckBox";
6976
7028
  var CheckBox_default = CheckBox;
6977
7029
 
6978
7030
  // src/components/Chip/Chip.tsx
6979
- import { jsx as jsx309 } from "react/jsx-runtime";
7031
+ import { jsx as jsx310 } from "react/jsx-runtime";
6980
7032
  var Chip = (props) => {
6981
7033
  const {
6982
7034
  children,
6983
7035
  type = "primary",
6984
7036
  size = "md"
6985
7037
  } = props;
6986
- return /* @__PURE__ */ jsx309("div", { className: clsx_default("lib-xplat-chip", type, size), children });
7038
+ return /* @__PURE__ */ jsx310("div", { className: clsx_default("lib-xplat-chip", type, size), children });
6987
7039
  };
6988
7040
  Chip.displayName = "Chip";
6989
7041
  var Chip_default = Chip;
@@ -6994,23 +7046,6 @@ import React12 from "react";
6994
7046
  // src/components/Input/Input.tsx
6995
7047
  import React8 from "react";
6996
7048
 
6997
- // src/components/Input/InputValidations.tsx
6998
- import { jsx as jsx310, jsxs as jsxs198 } from "react/jsx-runtime";
6999
- var InputValidations = (props) => {
7000
- const { message, status = "default" } = props;
7001
- return /* @__PURE__ */ jsxs198("div", { className: clsx_default("lib-xplat-input-validation", status), children: [
7002
- /* @__PURE__ */ jsxs198("div", { className: "icon", children: [
7003
- status === "default" && /* @__PURE__ */ jsx310(InfoIcon_default, {}),
7004
- status === "success" && /* @__PURE__ */ jsx310(SuccessIcon_default, {}),
7005
- status === "warning" && /* @__PURE__ */ jsx310(InfoIcon_default, {}),
7006
- status === "error" && /* @__PURE__ */ jsx310(ErrorIcon_default, {})
7007
- ] }),
7008
- /* @__PURE__ */ jsx310("div", { className: "message", children: message })
7009
- ] });
7010
- };
7011
- InputValidations.displayName = "InputValidations";
7012
- var InputValidations_default = InputValidations;
7013
-
7014
7049
  // src/components/Input/reg.ts
7015
7050
  var numberAndCommaReg = /^[0-9,]+$/;
7016
7051
  var phoneNumberMaxLengthReg = /^.{0,13}$/;
@@ -7047,7 +7082,6 @@ var handleTelBackspace = (prevValue, currValue) => {
7047
7082
 
7048
7083
  // src/components/Input/Input.tsx
7049
7084
  import { jsx as jsx311, jsxs as jsxs199 } from "react/jsx-runtime";
7050
- import { createElement } from "react";
7051
7085
  var formatValue = (type, value) => {
7052
7086
  if (value === null || value === void 0) return "";
7053
7087
  const strValue = Array.isArray(value) ? String(value[0] ?? "") : String(value);
@@ -7136,20 +7170,15 @@ var Input = React8.forwardRef((props, ref) => {
7136
7170
  disabled,
7137
7171
  type: type === "number" ? "text" : type,
7138
7172
  value: localValue,
7139
- onChange: handleChange
7173
+ onChange: handleChange,
7174
+ "aria-invalid": hasError(validations) || void 0
7140
7175
  }
7141
7176
  ),
7142
7177
  suffix && /* @__PURE__ */ jsx311("div", { className: "suffix", children: suffix })
7143
7178
  ]
7144
7179
  }
7145
7180
  ),
7146
- validations && /* @__PURE__ */ jsx311("div", { className: "lib-xplat-input-validation-wrap", children: validations?.map((validation, idx) => /* @__PURE__ */ createElement(
7147
- InputValidations_default,
7148
- {
7149
- ...validation,
7150
- key: `${validation.message}_${idx}`
7151
- }
7152
- )) })
7181
+ /* @__PURE__ */ jsx311(FieldMessage_default, { validations })
7153
7182
  ] });
7154
7183
  });
7155
7184
  Input.displayName = "Input";
@@ -7233,7 +7262,7 @@ var Modal_default = Modal;
7233
7262
 
7234
7263
  // src/components/DatePicker/SingleDatePicker/index.tsx
7235
7264
  import React11 from "react";
7236
- import { Fragment as Fragment3, jsx as jsx314, jsxs as jsxs200 } from "react/jsx-runtime";
7265
+ import { Fragment as Fragment4, jsx as jsx314, jsxs as jsxs200 } from "react/jsx-runtime";
7237
7266
  var DayCell2 = React11.memo(
7238
7267
  ({
7239
7268
  day,
@@ -7376,7 +7405,7 @@ var SingleDatePicker = (props) => {
7376
7405
  },
7377
7406
  i
7378
7407
  )) }),
7379
- pickerMode === "days" && /* @__PURE__ */ jsxs200(Fragment3, { children: [
7408
+ pickerMode === "days" && /* @__PURE__ */ jsxs200(Fragment4, { children: [
7380
7409
  /* @__PURE__ */ jsx314("div", { className: "datepicker-weekdays", children: weekdays.map((label, i) => /* @__PURE__ */ jsx314(
7381
7410
  "div",
7382
7411
  {
@@ -7513,7 +7542,8 @@ var TabItem_default = TabItem;
7513
7542
  // src/components/Tab/Tab.tsx
7514
7543
  import { jsx as jsx317, jsxs as jsxs202 } from "react/jsx-runtime";
7515
7544
  var Tab = (props) => {
7516
- const { activeIndex, onChange, tabs, type, size = "md" } = props;
7545
+ const { activeIndex, onChange, tabs, variant, type, size = "md" } = props;
7546
+ const shape = variant ?? type ?? "default";
7517
7547
  const [underlineStyle, setUnderlineStyle] = React14.useState({
7518
7548
  left: 0,
7519
7549
  width: 0
@@ -7528,7 +7558,7 @@ var Tab = (props) => {
7528
7558
  setUnderlineStyle({ left: el.offsetLeft, width: el.offsetWidth });
7529
7559
  }
7530
7560
  }, [activeIndex, tabs.length]);
7531
- return /* @__PURE__ */ jsxs202("div", { className: clsx_default("lib-xplat-tab", `type-${type}`, size), children: [
7561
+ return /* @__PURE__ */ jsxs202("div", { className: clsx_default("lib-xplat-tab", `type-${shape}`, size), children: [
7532
7562
  tabs.map((tab, idx) => /* @__PURE__ */ jsx317(
7533
7563
  TabItem_default,
7534
7564
  {
@@ -7541,7 +7571,7 @@ var Tab = (props) => {
7541
7571
  },
7542
7572
  `${tab.value}_${idx}`
7543
7573
  )),
7544
- type === "toggle" && /* @__PURE__ */ jsx317(
7574
+ shape === "toggle" && /* @__PURE__ */ jsx317(
7545
7575
  "div",
7546
7576
  {
7547
7577
  className: "tab-toggle-underline",
@@ -8665,7 +8695,8 @@ var FileUpload = (props) => {
8665
8695
  maxSize,
8666
8696
  onChange,
8667
8697
  label = "\uD30C\uC77C\uC744 \uB4DC\uB798\uADF8\uD558\uAC70\uB098 \uD074\uB9AD\uD558\uC5EC \uC5C5\uB85C\uB4DC",
8668
- description
8698
+ description,
8699
+ validations
8669
8700
  } = props;
8670
8701
  const [isDragOver, setIsDragOver] = React22.useState(false);
8671
8702
  const inputRef = React22.useRef(null);
@@ -8698,7 +8729,7 @@ var FileUpload = (props) => {
8698
8729
  handleFiles(e.target.files);
8699
8730
  }
8700
8731
  };
8701
- return /* @__PURE__ */ jsxs209(
8732
+ const control = /* @__PURE__ */ jsxs209(
8702
8733
  "div",
8703
8734
  {
8704
8735
  className: clsx_default("lib-xplat-file-upload", { "drag-over": isDragOver }),
@@ -8714,7 +8745,8 @@ var FileUpload = (props) => {
8714
8745
  type: "file",
8715
8746
  accept,
8716
8747
  multiple,
8717
- onChange: handleChange
8748
+ onChange: handleChange,
8749
+ "aria-invalid": hasError(validations) || void 0
8718
8750
  }
8719
8751
  ),
8720
8752
  /* @__PURE__ */ jsx325("div", { className: "upload-icon", children: /* @__PURE__ */ jsx325(UploadIcon_default, {}) }),
@@ -8723,6 +8755,7 @@ var FileUpload = (props) => {
8723
8755
  ]
8724
8756
  }
8725
8757
  );
8758
+ return /* @__PURE__ */ jsx325(Field, { validations, children: control });
8726
8759
  };
8727
8760
  FileUpload.displayName = "FileUpload";
8728
8761
  var FileUpload_default = FileUpload;
@@ -8865,7 +8898,7 @@ var HtmlTypeWriter_default = HtmlTypeWriter;
8865
8898
  import React25 from "react";
8866
8899
  import { jsx as jsx327, jsxs as jsxs210 } from "react/jsx-runtime";
8867
8900
  var ImageSelector = (props) => {
8868
- const { value, label, onChange } = props;
8901
+ const { value, label, onChange, validations } = props;
8869
8902
  const [previewUrl, setPreviewUrl] = React25.useState();
8870
8903
  React25.useEffect(() => {
8871
8904
  if (!value) {
@@ -8889,7 +8922,7 @@ var ImageSelector = (props) => {
8889
8922
  const handleOpenFileDialog = () => {
8890
8923
  inputRef.current?.click();
8891
8924
  };
8892
- return /* @__PURE__ */ jsxs210("div", { className: `lib-xplat-imageselector${value ? "" : " none-value"}`, children: [
8925
+ const control = /* @__PURE__ */ jsxs210("div", { className: `lib-xplat-imageselector${value ? "" : " none-value"}`, children: [
8893
8926
  /* @__PURE__ */ jsx327(
8894
8927
  "input",
8895
8928
  {
@@ -8897,7 +8930,8 @@ var ImageSelector = (props) => {
8897
8930
  accept: "image/*",
8898
8931
  id: "image-input",
8899
8932
  onChange: handleFileChange,
8900
- ref: inputRef
8933
+ ref: inputRef,
8934
+ "aria-invalid": hasError(validations) || void 0
8901
8935
  }
8902
8936
  ),
8903
8937
  value && /* @__PURE__ */ jsxs210("div", { className: "action-bar", children: [
@@ -8909,6 +8943,7 @@ var ImageSelector = (props) => {
8909
8943
  /* @__PURE__ */ jsx327("div", { className: "label", children: label || "\uC774\uBBF8\uC9C0 \uCD94\uAC00\uD558\uAE30" })
8910
8944
  ] }) })
8911
8945
  ] });
8946
+ return /* @__PURE__ */ jsx327(Field, { validations, children: control });
8912
8947
  };
8913
8948
  ImageSelector.displayName = "ImageSelector";
8914
8949
  var ImageSelector_default = ImageSelector;
@@ -8962,11 +8997,12 @@ var NotificationBadge = (props) => {
8962
8997
  dot = false,
8963
8998
  size = "md"
8964
8999
  } = props;
9000
+ const statusType = normalizeStatus(type);
8965
9001
  const showBadge = dot || count !== void 0 && count > 0;
8966
9002
  const displayCount = count !== void 0 && count > maxCount ? `${maxCount}+` : count;
8967
9003
  return /* @__PURE__ */ jsxs211("div", { className: clsx_default("lib-xplat-notification-badge", size), children: [
8968
9004
  children,
8969
- showBadge && /* @__PURE__ */ jsx330("span", { className: clsx_default("badge-indicator", type, { dot }), children: !dot && displayCount })
9005
+ showBadge && /* @__PURE__ */ jsx330("span", { className: clsx_default("badge-indicator", statusType, { dot }), children: !dot && displayCount })
8970
9006
  ] });
8971
9007
  };
8972
9008
  NotificationBadge.displayName = "NotificationBadge";
@@ -9007,8 +9043,9 @@ var Pagination = (props) => {
9007
9043
  siblingCount = 1,
9008
9044
  onChange,
9009
9045
  size = "md",
9010
- type = "brand"
9046
+ type = "primary"
9011
9047
  } = props;
9048
+ const statusType = normalizeStatus(type);
9012
9049
  const totalPages = Math.max(1, Math.ceil(total / pageSize));
9013
9050
  const pages = getPageRange(current, totalPages, siblingCount);
9014
9051
  const handleClick = (page) => {
@@ -9016,7 +9053,7 @@ var Pagination = (props) => {
9016
9053
  onChange?.(page);
9017
9054
  }
9018
9055
  };
9019
- return /* @__PURE__ */ jsxs212("nav", { className: clsx_default("lib-xplat-pagination", size, type), "aria-label": "\uD398\uC774\uC9C0 \uB124\uBE44\uAC8C\uC774\uC158", children: [
9056
+ return /* @__PURE__ */ jsxs212("nav", { className: clsx_default("lib-xplat-pagination", size, statusType), "aria-label": "\uD398\uC774\uC9C0 \uB124\uBE44\uAC8C\uC774\uC158", children: [
9020
9057
  /* @__PURE__ */ jsx331(
9021
9058
  "button",
9022
9059
  {
@@ -9117,11 +9154,12 @@ var Progress = (props) => {
9117
9154
  value,
9118
9155
  max = 100,
9119
9156
  size = "md",
9120
- type = "brand",
9157
+ type = "primary",
9121
9158
  showLabel = false
9122
9159
  } = props;
9160
+ const statusType = normalizeStatus(type);
9123
9161
  const percentage = Math.min(100, Math.max(0, value / max * 100));
9124
- return /* @__PURE__ */ jsxs214("div", { className: clsx_default("lib-xplat-progress", size, type), children: [
9162
+ return /* @__PURE__ */ jsxs214("div", { className: clsx_default("lib-xplat-progress", size, statusType), children: [
9125
9163
  /* @__PURE__ */ jsx333(
9126
9164
  "div",
9127
9165
  {
@@ -9166,9 +9204,11 @@ var Radio = (props) => {
9166
9204
  className,
9167
9205
  value,
9168
9206
  size: sizeProp,
9169
- type = "brand",
9207
+ type = "primary",
9208
+ validations,
9170
9209
  ...rest
9171
9210
  } = props;
9211
+ const statusType = normalizeStatus(type);
9172
9212
  const context = useRadioGroupContext();
9173
9213
  const size = sizeProp ?? context?.size ?? "md";
9174
9214
  const isGroup = !!context;
@@ -9178,18 +9218,27 @@ var Radio = (props) => {
9178
9218
  value,
9179
9219
  onChange: rest.onChange
9180
9220
  };
9181
- return /* @__PURE__ */ jsxs215(
9221
+ const control = /* @__PURE__ */ jsxs215(
9182
9222
  "label",
9183
9223
  {
9184
9224
  className: clsx_default(
9185
9225
  "lib-xplat-radio",
9186
9226
  size,
9187
- type,
9227
+ statusType,
9188
9228
  localChecked ? "checked" : void 0,
9189
9229
  className
9190
9230
  ),
9191
9231
  children: [
9192
- /* @__PURE__ */ jsx334("input", { ...rest, ...inputProps, checked: localChecked, type: "radio" }),
9232
+ /* @__PURE__ */ jsx334(
9233
+ "input",
9234
+ {
9235
+ ...rest,
9236
+ ...inputProps,
9237
+ checked: localChecked,
9238
+ type: "radio",
9239
+ "aria-invalid": hasError(validations) || void 0
9240
+ }
9241
+ ),
9193
9242
  /* @__PURE__ */ jsx334(
9194
9243
  "div",
9195
9244
  {
@@ -9204,15 +9253,16 @@ var Radio = (props) => {
9204
9253
  ]
9205
9254
  }
9206
9255
  );
9256
+ return /* @__PURE__ */ jsx334(Field, { validations, children: control });
9207
9257
  };
9208
9258
  Radio.displayName = "Radio";
9209
9259
  var Radio_default = Radio;
9210
9260
 
9211
9261
  // src/components/Radio/RadioGroup.tsx
9212
- import { Fragment as Fragment4, jsx as jsx335 } from "react/jsx-runtime";
9262
+ import { Fragment as Fragment5, jsx as jsx335 } from "react/jsx-runtime";
9213
9263
  var RadioGroup = (props) => {
9214
9264
  const { children, ...rest } = props;
9215
- return /* @__PURE__ */ jsx335(Fragment4, { children: /* @__PURE__ */ jsx335(RadioGroupContext_default.Provider, { value: rest, children }) });
9265
+ return /* @__PURE__ */ jsx335(Fragment5, { children: /* @__PURE__ */ jsx335(RadioGroupContext_default.Provider, { value: rest, children }) });
9216
9266
  };
9217
9267
  RadioGroup.displayName = "RadioGroup";
9218
9268
  var RadioGroup_default = RadioGroup;
@@ -9271,6 +9321,7 @@ var SelectRoot = (props) => {
9271
9321
  children,
9272
9322
  disabled = false,
9273
9323
  error = false,
9324
+ validations,
9274
9325
  size = "md"
9275
9326
  } = props;
9276
9327
  const itemChildren = React30.Children.toArray(children).filter(
@@ -9341,14 +9392,14 @@ var SelectRoot = (props) => {
9341
9392
  if (disabled) return;
9342
9393
  toggle();
9343
9394
  };
9344
- return /* @__PURE__ */ jsx337(context_default.Provider, { value: ctxValue, children: /* @__PURE__ */ jsxs216(
9395
+ const control = /* @__PURE__ */ jsx337(context_default.Provider, { value: ctxValue, children: /* @__PURE__ */ jsxs216(
9345
9396
  "div",
9346
9397
  {
9347
9398
  className: clsx_default(
9348
9399
  "lib-xplat-select",
9349
9400
  size,
9350
9401
  disabled && "disabled",
9351
- error && "error",
9402
+ (error || hasError(validations)) && "error",
9352
9403
  mounted && "is-open"
9353
9404
  ),
9354
9405
  children: [
@@ -9359,14 +9410,14 @@ var SelectRoot = (props) => {
9359
9410
  className: clsx_default(
9360
9411
  "select-trigger",
9361
9412
  disabled && "disabled",
9362
- error && "error"
9413
+ (error || hasError(validations)) && "error"
9363
9414
  ),
9364
9415
  onClick: handleTriggerClick,
9365
9416
  role: "combobox",
9366
9417
  "aria-expanded": isOpen,
9367
9418
  "aria-haspopup": "listbox",
9368
9419
  "aria-disabled": disabled,
9369
- "aria-invalid": error,
9420
+ "aria-invalid": error || hasError(validations) || void 0,
9370
9421
  tabIndex: disabled ? -1 : 0,
9371
9422
  onKeyDown: (e) => {
9372
9423
  if (disabled) return;
@@ -9410,6 +9461,7 @@ var SelectRoot = (props) => {
9410
9461
  ]
9411
9462
  }
9412
9463
  ) });
9464
+ return /* @__PURE__ */ jsx337(Field, { validations, children: control });
9413
9465
  };
9414
9466
  SelectRoot.displayName = "Select";
9415
9467
  var Select = Object.assign(SelectRoot, {
@@ -9451,12 +9503,13 @@ import { jsx as jsx339, jsxs as jsxs217 } from "react/jsx-runtime";
9451
9503
  var Spinner = (props) => {
9452
9504
  const {
9453
9505
  size = "md",
9454
- type = "brand"
9506
+ type = "primary"
9455
9507
  } = props;
9508
+ const statusType = normalizeStatus(type);
9456
9509
  return /* @__PURE__ */ jsx339(
9457
9510
  "div",
9458
9511
  {
9459
- className: clsx_default("lib-xplat-spinner", size, type),
9512
+ className: clsx_default("lib-xplat-spinner", size, statusType),
9460
9513
  role: "status",
9461
9514
  "aria-label": "\uB85C\uB529 \uC911",
9462
9515
  children: /* @__PURE__ */ jsxs217("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
@@ -9494,9 +9547,10 @@ var Steps = (props) => {
9494
9547
  const {
9495
9548
  items,
9496
9549
  current,
9497
- type = "brand"
9550
+ type = "primary"
9498
9551
  } = props;
9499
- return /* @__PURE__ */ jsx340("div", { className: clsx_default("lib-xplat-steps", type), children: items.map((item, index) => {
9552
+ const statusType = normalizeStatus(type);
9553
+ return /* @__PURE__ */ jsx340("div", { className: clsx_default("lib-xplat-steps", statusType), children: items.map((item, index) => {
9500
9554
  const status = index < current ? "completed" : index === current ? "active" : "pending";
9501
9555
  return /* @__PURE__ */ jsxs218("div", { className: clsx_default("step-item", status), children: [
9502
9556
  /* @__PURE__ */ jsx340("div", { className: "step-circle", children: status === "completed" ? /* @__PURE__ */ jsx340(CheckIcon_default, {}) : /* @__PURE__ */ jsx340("span", { children: index + 1 }) }),
@@ -9821,10 +9875,12 @@ var Switch = (props) => {
9821
9875
  const {
9822
9876
  value,
9823
9877
  size = "md",
9824
- type = "brand",
9878
+ type = "primary",
9825
9879
  disabled,
9826
- onChange
9880
+ onChange,
9881
+ validations
9827
9882
  } = props;
9883
+ const statusType = normalizeStatus(type);
9828
9884
  const [isAnimating, setIsAnimating] = React32.useState(false);
9829
9885
  const timeoutRef = React32.useRef(null);
9830
9886
  React32.useEffect(() => {
@@ -9842,22 +9898,24 @@ var Switch = (props) => {
9842
9898
  timeoutRef.current = null;
9843
9899
  }, KNOB_TRANSITION_MS);
9844
9900
  };
9845
- return /* @__PURE__ */ jsx342(
9901
+ const control = /* @__PURE__ */ jsx342(
9846
9902
  "div",
9847
9903
  {
9848
9904
  className: clsx_default(
9849
9905
  "lib-xplat-switch",
9850
9906
  size,
9851
- type,
9907
+ statusType,
9852
9908
  value ? "checked" : void 0,
9853
9909
  disabled && "disabled",
9854
9910
  isAnimating && "animating"
9855
9911
  ),
9856
9912
  onClick: handleClick,
9913
+ "aria-invalid": hasError(validations) || void 0,
9857
9914
  "aria-disabled": disabled || isAnimating,
9858
9915
  children: /* @__PURE__ */ jsx342("div", { className: clsx_default("knob", value ? "checked" : void 0) })
9859
9916
  }
9860
9917
  );
9918
+ return /* @__PURE__ */ jsx342(Field, { validations, children: control });
9861
9919
  };
9862
9920
  Switch.displayName = "Switch";
9863
9921
  var Switch_default = Switch;
@@ -10063,20 +10121,22 @@ import { jsx as jsx348, jsxs as jsxs220 } from "react/jsx-runtime";
10063
10121
  var Tag = (props) => {
10064
10122
  const {
10065
10123
  children,
10066
- type = "neutral",
10124
+ variant,
10125
+ type,
10067
10126
  onClose,
10068
10127
  size = "md",
10069
10128
  disabled = false,
10070
10129
  colorIndex
10071
10130
  } = props;
10131
+ const shape = variant ?? type ?? "neutral";
10072
10132
  return /* @__PURE__ */ jsxs220(
10073
10133
  "span",
10074
10134
  {
10075
10135
  className: clsx_default(
10076
10136
  "lib-xplat-tag",
10077
- type,
10137
+ shape,
10078
10138
  size,
10079
- type === "categorical" && colorIndex !== void 0 && `cat-${colorIndex}`,
10139
+ shape === "categorical" && colorIndex !== void 0 && `cat-${colorIndex}`,
10080
10140
  disabled && "disabled"
10081
10141
  ),
10082
10142
  children: [
@@ -10097,22 +10157,25 @@ var TextArea = React38.forwardRef(
10097
10157
  const {
10098
10158
  className,
10099
10159
  size = "md",
10160
+ validations,
10100
10161
  resize = "vertical",
10101
10162
  rows = 3,
10102
10163
  disabled,
10103
10164
  ...textareaProps
10104
10165
  } = props;
10105
- return /* @__PURE__ */ jsx349("div", { className: clsx_default("lib-xplat-textarea-wrap", className), children: /* @__PURE__ */ jsx349(
10166
+ const control = /* @__PURE__ */ jsx349("div", { className: clsx_default("lib-xplat-textarea-wrap", className), children: /* @__PURE__ */ jsx349(
10106
10167
  "textarea",
10107
10168
  {
10108
10169
  ...textareaProps,
10109
10170
  ref,
10110
10171
  rows,
10111
10172
  disabled,
10173
+ "aria-invalid": hasError(validations) || void 0,
10112
10174
  className: clsx_default("lib-xplat-textarea", size, disabled && "disabled"),
10113
10175
  style: { resize }
10114
10176
  }
10115
10177
  ) });
10178
+ return /* @__PURE__ */ jsx349(Field, { validations, children: control });
10116
10179
  }
10117
10180
  );
10118
10181
  TextArea.displayName = "TextArea";
@@ -10211,7 +10274,7 @@ ToastProvider.displayName = "ToastProvider";
10211
10274
 
10212
10275
  // src/components/Tooltip/Tooltip.tsx
10213
10276
  import React40 from "react";
10214
- import { Fragment as Fragment5, jsx as jsx351, jsxs as jsxs222 } from "react/jsx-runtime";
10277
+ import { Fragment as Fragment6, jsx as jsx351, jsxs as jsxs222 } from "react/jsx-runtime";
10215
10278
  var OFFSET = 12;
10216
10279
  var GAP = 8;
10217
10280
  var SHOW_DELAY = 300;
@@ -10220,10 +10283,12 @@ var Tooltip = (props) => {
10220
10283
  children,
10221
10284
  title,
10222
10285
  description,
10223
- type = "dark",
10286
+ variant,
10287
+ type,
10224
10288
  follow = false,
10225
10289
  disabled = false
10226
10290
  } = props;
10291
+ const shape = variant ?? type ?? "dark";
10227
10292
  const triggerRef = React40.useRef(null);
10228
10293
  const tooltipRef = React40.useRef(null);
10229
10294
  const [visible, setVisible] = React40.useState(false);
@@ -10314,7 +10379,7 @@ var Tooltip = (props) => {
10314
10379
  window.clearTimeout(delayTimer.current);
10315
10380
  cancelAnimationFrame(rafRef.current);
10316
10381
  }, []);
10317
- if (!title && !description) return /* @__PURE__ */ jsx351(Fragment5, { children });
10382
+ if (!title && !description) return /* @__PURE__ */ jsx351(Fragment6, { children });
10318
10383
  return /* @__PURE__ */ jsxs222(
10319
10384
  "div",
10320
10385
  {
@@ -10333,7 +10398,7 @@ var Tooltip = (props) => {
10333
10398
  {
10334
10399
  ref: tooltipRef,
10335
10400
  role: "tooltip",
10336
- className: clsx_default("lib-xplat-tooltip", type),
10401
+ className: clsx_default("lib-xplat-tooltip", shape),
10337
10402
  style: { position: "fixed", left: pos.left, top: pos.top },
10338
10403
  children: [
10339
10404
  title && /* @__PURE__ */ jsx351("div", { className: "tooltip-title", children: title }),
@@ -10788,11 +10853,11 @@ Header.displayName = "Header";
10788
10853
  var Header_default = Header;
10789
10854
 
10790
10855
  // src/layout/Layout/Layout.tsx
10791
- import { Fragment as Fragment6, jsx as jsx357, jsxs as jsxs225 } from "react/jsx-runtime";
10856
+ import { Fragment as Fragment7, jsx as jsx357, jsxs as jsxs225 } from "react/jsx-runtime";
10792
10857
  var Layout = (props) => {
10793
10858
  const { header, sideBar, children } = props;
10794
10859
  return /* @__PURE__ */ jsx357("div", { className: "lib-xplat-layout", children: /* @__PURE__ */ jsxs225("div", { className: "lib-xplat-layout-content-wrapper", children: [
10795
- sideBar && /* @__PURE__ */ jsx357(Fragment6, { children: sideBar }),
10860
+ sideBar && /* @__PURE__ */ jsx357(Fragment7, { children: sideBar }),
10796
10861
  /* @__PURE__ */ jsxs225("div", { className: "lib-xplat-layout-content", children: [
10797
10862
  header && /* @__PURE__ */ jsx357("div", { className: "lib-xplat-layout-conent-header", children: header }),
10798
10863
  children
@@ -10979,6 +11044,8 @@ export {
10979
11044
  FacebookIcon_default as FacebookIcon,
10980
11045
  FastForwardIcon_default as FastForwardIcon,
10981
11046
  FeatherIcon_default as FeatherIcon,
11047
+ Field,
11048
+ FieldMessage_default as FieldMessage,
10982
11049
  FigmaIcon_default as FigmaIcon,
10983
11050
  FileIcon_default as FileIcon,
10984
11051
  FileMinusIcon_default as FileMinusIcon,
@@ -11207,6 +11274,7 @@ export {
11207
11274
  breakpoints,
11208
11275
  cssVar,
11209
11276
  gridColumns,
11277
+ hasError,
11210
11278
  isInRange,
11211
11279
  isSameDay,
11212
11280
  semantic,