@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
@@ -1,14 +1,24 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import React from 'react';
3
3
 
4
- type TagType = "neutral" | "categorical";
4
+ type TagVariant = "neutral" | "categorical";
5
5
  type TagSize = "sm" | "md" | "lg";
6
6
  interface TagProps {
7
7
  children: React.ReactNode;
8
- type?: TagType;
8
+ /** 태그 배색. `categorical` 은 `colorIndex` 로 계열 색을 고른다 */
9
+ variant?: TagVariant;
10
+ /**
11
+ * @deprecated 모양 변형은 `variant` 로 받는다. `type` 은 상태 색 전용이다.
12
+ * 기존 사용처가 깨지지 않도록 계속 받는다 — 둘 다 주면 `variant` 가 이긴다.
13
+ */
14
+ type?: TagVariant;
15
+ /** 주면 오른쪽에 닫기 버튼이 생긴다. 제거 가능한 태그로 쓸 때 */
9
16
  onClose?: () => void;
17
+ /** 태그 크기 */
10
18
  size?: TagSize;
19
+ /** 흐리게 표시하고 닫기 버튼을 막는다 */
11
20
  disabled?: boolean;
21
+ /** variant 가 categorical 일 때 쓸 계열 색 번호 (1~8) */
12
22
  colorIndex?: number;
13
23
  }
14
24
  declare const Tag: {
@@ -913,20 +913,22 @@ import { jsx as jsx295, jsxs as jsxs189 } from "react/jsx-runtime";
913
913
  var Tag = (props) => {
914
914
  const {
915
915
  children,
916
- type = "neutral",
916
+ variant,
917
+ type,
917
918
  onClose,
918
919
  size = "md",
919
920
  disabled = false,
920
921
  colorIndex
921
922
  } = props;
923
+ const shape = variant ?? type ?? "neutral";
922
924
  return /* @__PURE__ */ jsxs189(
923
925
  "span",
924
926
  {
925
927
  className: clsx_default(
926
928
  "lib-xplat-tag",
927
- type,
929
+ shape,
928
930
  size,
929
- type === "categorical" && colorIndex !== void 0 && `cat-${colorIndex}`,
931
+ shape === "categorical" && colorIndex !== void 0 && `cat-${colorIndex}`,
930
932
  disabled && "disabled"
931
933
  ),
932
934
  children: [
@@ -53,29 +53,165 @@ function clsx() {
53
53
  }
54
54
  var clsx_default = clsx;
55
55
 
56
- // src/components/TextArea/TextArea.tsx
56
+ // src/tokens/svg/status/ErrorIcon.tsx
57
57
  var import_jsx_runtime = require("react/jsx-runtime");
58
+ var ErrorIcon = () => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
59
+ "svg",
60
+ {
61
+ xmlns: "http://www.w3.org/2000/svg",
62
+ width: "1em",
63
+ height: "1em",
64
+ viewBox: "0 0 16 16",
65
+ fill: "none",
66
+ children: [
67
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("g", { clipPath: "url(#clip0_1196_9603)", children: [
68
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
69
+ "path",
70
+ {
71
+ d: "M9.57588 5.57559C9.81019 5.34127 10.19 5.34127 10.4243 5.57559C10.6586 5.8099 10.6586 6.18971 10.4243 6.42402L8.84854 7.9998L10.4243 9.57559C10.6586 9.8099 10.6586 10.1897 10.4243 10.424C10.19 10.6583 9.81019 10.6583 9.57588 10.424L8.0001 8.84824L6.42432 10.424C6.19 10.6583 5.81019 10.6583 5.57588 10.424C5.34156 10.1897 5.34156 9.8099 5.57588 9.57559L7.15166 7.9998L5.57588 6.42402C5.34156 6.18971 5.34156 5.8099 5.57588 5.57559C5.81019 5.34127 6.19 5.34127 6.42432 5.57559L8.0001 7.15137L9.57588 5.57559Z",
72
+ fill: "currentColor"
73
+ }
74
+ ),
75
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
76
+ "path",
77
+ {
78
+ fillRule: "evenodd",
79
+ clipRule: "evenodd",
80
+ d: "M8.0001 0.733398C12.0131 0.73361 15.2671 3.98679 15.2673 7.9998C15.2672 12.0129 12.0131 15.2668 8.0001 15.267C3.98701 15.2669 0.733016 12.0129 0.73291 7.9998C0.733051 3.98674 3.98704 0.733539 8.0001 0.733398ZM8.0001 1.9334C4.64978 1.93354 1.93383 4.64948 1.93369 7.9998C1.9338 11.3502 4.64975 14.0669 8.0001 14.067C11.3504 14.0668 14.0672 11.3501 14.0673 7.9998C14.0671 4.64953 11.3504 1.93361 8.0001 1.9334Z",
81
+ fill: "currentColor"
82
+ }
83
+ )
84
+ ] }),
85
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("defs", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("clipPath", { id: "clip0_1196_9603", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { width: "16", height: "16", fill: "white" }) }) })
86
+ ]
87
+ }
88
+ );
89
+ var ErrorIcon_default = ErrorIcon;
90
+
91
+ // src/tokens/svg/status/InfoIcon.tsx
92
+ var import_jsx_runtime2 = require("react/jsx-runtime");
93
+ var InfoIcon = () => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
94
+ "svg",
95
+ {
96
+ xmlns: "http://www.w3.org/2000/svg",
97
+ width: "1em",
98
+ height: "1em",
99
+ viewBox: "0 0 16 16",
100
+ fill: "none",
101
+ children: [
102
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("g", { clipPath: "url(#clip0_1188_11261)", children: [
103
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
104
+ "path",
105
+ {
106
+ d: "M8.00156 7.39999C8.33293 7.39999 8.60156 7.66862 8.60156 7.99999V10.6664C8.60156 10.9978 8.33293 11.2664 8.00156 11.2664C7.67019 11.2664 7.40156 10.9978 7.40156 10.6664V7.99999C7.40156 7.66862 7.67019 7.39999 8.00156 7.39999Z",
107
+ fill: "currentColor"
108
+ }
109
+ ),
110
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
111
+ "path",
112
+ {
113
+ d: "M8.00859 4.73358C8.3398 4.73378 8.60859 5.00233 8.60859 5.33358C8.60849 5.66474 8.33973 5.93338 8.00859 5.93358H8.00156C7.67026 5.93358 7.40167 5.66486 7.40156 5.33358C7.40156 5.00221 7.67019 4.73358 8.00156 4.73358H8.00859Z",
114
+ fill: "currentColor"
115
+ }
116
+ ),
117
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
118
+ "path",
119
+ {
120
+ fillRule: "evenodd",
121
+ clipRule: "evenodd",
122
+ d: "M8.00156 0.733582C12.0146 0.733793 15.2686 3.98697 15.2688 7.99999C15.2686 12.013 12.0146 15.267 8.00156 15.2672C3.98848 15.267 0.734481 12.0131 0.734375 7.99999C0.734516 3.98693 3.9885 0.733722 8.00156 0.733582ZM8.00156 1.93358C4.65124 1.93372 1.9353 4.64967 1.93516 7.99999C1.93526 11.3503 4.65122 14.067 8.00156 14.0672C11.3518 14.067 14.0686 11.3503 14.0688 7.99999C14.0686 4.64971 11.3518 1.93379 8.00156 1.93358Z",
123
+ fill: "currentColor"
124
+ }
125
+ )
126
+ ] }),
127
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("defs", { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("clipPath", { id: "clip0_1188_11261", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("rect", { width: "16", height: "16", fill: "white" }) }) })
128
+ ]
129
+ }
130
+ );
131
+ var InfoIcon_default = InfoIcon;
132
+
133
+ // src/tokens/svg/status/SuccessIcon.tsx
134
+ var import_jsx_runtime3 = require("react/jsx-runtime");
135
+ var SuccessIcon = () => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
136
+ "svg",
137
+ {
138
+ xmlns: "http://www.w3.org/2000/svg",
139
+ width: "1em",
140
+ height: "1em",
141
+ viewBox: "0 0 16 16",
142
+ fill: "none",
143
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
144
+ "path",
145
+ {
146
+ d: "M12.9084 3.57597C13.1426 3.34172 13.5225 3.34185 13.7568 3.57597C13.9911 3.81028 13.9911 4.19009 13.7568 4.4244L6.424 11.758C6.31157 11.8703 6.15869 11.9337 5.99978 11.9338C5.8409 11.9337 5.68798 11.8703 5.57556 11.758L2.24197 8.4244C2.00782 8.19018 2.00795 7.81028 2.24197 7.57597C2.47626 7.34167 2.85609 7.34172 3.09041 7.57597L5.999 10.4846L12.9084 3.57597Z",
147
+ fill: "currentColor"
148
+ }
149
+ )
150
+ }
151
+ );
152
+ var SuccessIcon_default = SuccessIcon;
153
+
154
+ // src/components/FieldMessage/FieldMessage.tsx
155
+ var import_jsx_runtime4 = require("react/jsx-runtime");
156
+ var ICON = {
157
+ default: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(InfoIcon_default, {}),
158
+ success: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(SuccessIcon_default, {}),
159
+ warning: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(InfoIcon_default, {}),
160
+ error: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ErrorIcon_default, {})
161
+ };
162
+ var FieldMessage = (props) => {
163
+ const { validations } = props;
164
+ if (!validations || validations.length === 0) return null;
165
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "lib-xplat-field-message-wrap", children: validations.map((v, idx) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
166
+ "div",
167
+ {
168
+ className: clsx_default("lib-xplat-field-message", v.status),
169
+ children: [
170
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "icon", children: ICON[v.status] }),
171
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: v.message })
172
+ ]
173
+ },
174
+ `${v.message}_${idx}`
175
+ )) });
176
+ };
177
+ FieldMessage.displayName = "FieldMessage";
178
+ var Field = (props) => {
179
+ const { validations, children } = props;
180
+ if (!validations || validations.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_jsx_runtime4.Fragment, { children });
181
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "lib-xplat-field", children: [
182
+ children,
183
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(FieldMessage, { validations })
184
+ ] });
185
+ };
186
+ Field.displayName = "Field";
187
+ var hasError = (validations) => !!validations?.some((v) => v.status === "error");
188
+
189
+ // src/components/TextArea/TextArea.tsx
190
+ var import_jsx_runtime5 = require("react/jsx-runtime");
58
191
  var TextArea = import_react.default.forwardRef(
59
192
  (props, ref) => {
60
193
  const {
61
194
  className,
62
195
  size = "md",
196
+ validations,
63
197
  resize = "vertical",
64
198
  rows = 3,
65
199
  disabled,
66
200
  ...textareaProps
67
201
  } = props;
68
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: clsx_default("lib-xplat-textarea-wrap", className), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
202
+ const control = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: clsx_default("lib-xplat-textarea-wrap", className), children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
69
203
  "textarea",
70
204
  {
71
205
  ...textareaProps,
72
206
  ref,
73
207
  rows,
74
208
  disabled,
209
+ "aria-invalid": hasError(validations) || void 0,
75
210
  className: clsx_default("lib-xplat-textarea", size, disabled && "disabled"),
76
211
  style: { resize }
77
212
  }
78
213
  ) });
214
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Field, { validations, children: control });
79
215
  }
80
216
  );
81
217
  TextArea.displayName = "TextArea";
@@ -1,3 +1,41 @@
1
+ /* src/components/FieldMessage/fieldMessage.scss */
2
+ .lib-xplat-field {
3
+ display: flex;
4
+ flex-direction: column;
5
+ gap: var(--spacing-space-2);
6
+ }
7
+ .lib-xplat-field-message-wrap {
8
+ display: flex;
9
+ gap: var(--spacing-space-2);
10
+ margin-left: var(--spacing-space-1);
11
+ }
12
+ .lib-xplat-field-message-wrap > .lib-xplat-field-message {
13
+ display: flex;
14
+ gap: var(--spacing-space-1);
15
+ font-family: var(--semantic-typo-caption-2-r-font);
16
+ font-size: var(--semantic-typo-caption-2-r-size);
17
+ line-height: var(--semantic-typo-caption-2-r-lh);
18
+ font-weight: var(--semantic-typo-caption-2-r-weight);
19
+ letter-spacing: var(--semantic-typo-caption-2-r-ls);
20
+ align-items: center;
21
+ user-select: none;
22
+ }
23
+ .lib-xplat-field-message-wrap > .lib-xplat-field-message.default {
24
+ color: var(--semantic-icon-secondary);
25
+ }
26
+ .lib-xplat-field-message-wrap > .lib-xplat-field-message.success {
27
+ color: var(--semantic-text-success);
28
+ }
29
+ .lib-xplat-field-message-wrap > .lib-xplat-field-message.warning {
30
+ color: var(--semantic-text-warning);
31
+ }
32
+ .lib-xplat-field-message-wrap > .lib-xplat-field-message.error {
33
+ color: var(--semantic-text-error);
34
+ }
35
+ .lib-xplat-field-message-wrap > .lib-xplat-field-message > .icon {
36
+ font-size: var(--semantic-typo-label-2-m-size);
37
+ }
38
+
1
39
  /* src/components/TextArea/textArea.scss */
2
40
  .lib-xplat-textarea-wrap {
3
41
  display: flex;
@@ -1,11 +1,17 @@
1
1
  import React from 'react';
2
2
  import { T as TextareaAttributes } from '../../attributes-DJIWir_0.cjs';
3
+ import { V as Validation } from '../../validation-Dqo1zqhT.cjs';
3
4
 
4
5
  type TextAreaSize = "sm" | "md" | "lg";
5
6
  type TextAreaResize = "none" | "vertical" | "horizontal" | "both";
6
7
  interface TextAreaProps extends Omit<TextareaAttributes, "size"> {
8
+ /** 안쪽 여백과 글자 크기 */
7
9
  size?: TextAreaSize;
10
+ /** 컨트롤 아래에 표시할 검증 메시지. DS 폼 컴포넌트 공통 */
11
+ validations?: Validation[];
12
+ /** 사용자가 크기를 조절할 방향 */
8
13
  resize?: TextAreaResize;
14
+ /** 기본으로 보일 줄 수 */
9
15
  rows?: number;
10
16
  }
11
17
  declare const TextArea: React.ForwardRefExoticComponent<TextAreaProps & React.RefAttributes<HTMLTextAreaElement>>;
@@ -1,11 +1,17 @@
1
1
  import React from 'react';
2
2
  import { T as TextareaAttributes } from '../../attributes-DJIWir_0.js';
3
+ import { V as Validation } from '../../validation-Dqo1zqhT.js';
3
4
 
4
5
  type TextAreaSize = "sm" | "md" | "lg";
5
6
  type TextAreaResize = "none" | "vertical" | "horizontal" | "both";
6
7
  interface TextAreaProps extends Omit<TextareaAttributes, "size"> {
8
+ /** 안쪽 여백과 글자 크기 */
7
9
  size?: TextAreaSize;
10
+ /** 컨트롤 아래에 표시할 검증 메시지. DS 폼 컴포넌트 공통 */
11
+ validations?: Validation[];
12
+ /** 사용자가 크기를 조절할 방향 */
8
13
  resize?: TextAreaResize;
14
+ /** 기본으로 보일 줄 수 */
9
15
  rows?: number;
10
16
  }
11
17
  declare const TextArea: React.ForwardRefExoticComponent<TextAreaProps & React.RefAttributes<HTMLTextAreaElement>>;
@@ -17,29 +17,165 @@ function clsx() {
17
17
  }
18
18
  var clsx_default = clsx;
19
19
 
20
+ // src/tokens/svg/status/ErrorIcon.tsx
21
+ import { jsx, jsxs } from "react/jsx-runtime";
22
+ var ErrorIcon = () => /* @__PURE__ */ jsxs(
23
+ "svg",
24
+ {
25
+ xmlns: "http://www.w3.org/2000/svg",
26
+ width: "1em",
27
+ height: "1em",
28
+ viewBox: "0 0 16 16",
29
+ fill: "none",
30
+ children: [
31
+ /* @__PURE__ */ jsxs("g", { clipPath: "url(#clip0_1196_9603)", children: [
32
+ /* @__PURE__ */ jsx(
33
+ "path",
34
+ {
35
+ d: "M9.57588 5.57559C9.81019 5.34127 10.19 5.34127 10.4243 5.57559C10.6586 5.8099 10.6586 6.18971 10.4243 6.42402L8.84854 7.9998L10.4243 9.57559C10.6586 9.8099 10.6586 10.1897 10.4243 10.424C10.19 10.6583 9.81019 10.6583 9.57588 10.424L8.0001 8.84824L6.42432 10.424C6.19 10.6583 5.81019 10.6583 5.57588 10.424C5.34156 10.1897 5.34156 9.8099 5.57588 9.57559L7.15166 7.9998L5.57588 6.42402C5.34156 6.18971 5.34156 5.8099 5.57588 5.57559C5.81019 5.34127 6.19 5.34127 6.42432 5.57559L8.0001 7.15137L9.57588 5.57559Z",
36
+ fill: "currentColor"
37
+ }
38
+ ),
39
+ /* @__PURE__ */ jsx(
40
+ "path",
41
+ {
42
+ fillRule: "evenodd",
43
+ clipRule: "evenodd",
44
+ d: "M8.0001 0.733398C12.0131 0.73361 15.2671 3.98679 15.2673 7.9998C15.2672 12.0129 12.0131 15.2668 8.0001 15.267C3.98701 15.2669 0.733016 12.0129 0.73291 7.9998C0.733051 3.98674 3.98704 0.733539 8.0001 0.733398ZM8.0001 1.9334C4.64978 1.93354 1.93383 4.64948 1.93369 7.9998C1.9338 11.3502 4.64975 14.0669 8.0001 14.067C11.3504 14.0668 14.0672 11.3501 14.0673 7.9998C14.0671 4.64953 11.3504 1.93361 8.0001 1.9334Z",
45
+ fill: "currentColor"
46
+ }
47
+ )
48
+ ] }),
49
+ /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx("clipPath", { id: "clip0_1196_9603", children: /* @__PURE__ */ jsx("rect", { width: "16", height: "16", fill: "white" }) }) })
50
+ ]
51
+ }
52
+ );
53
+ var ErrorIcon_default = ErrorIcon;
54
+
55
+ // src/tokens/svg/status/InfoIcon.tsx
56
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
57
+ var InfoIcon = () => /* @__PURE__ */ jsxs2(
58
+ "svg",
59
+ {
60
+ xmlns: "http://www.w3.org/2000/svg",
61
+ width: "1em",
62
+ height: "1em",
63
+ viewBox: "0 0 16 16",
64
+ fill: "none",
65
+ children: [
66
+ /* @__PURE__ */ jsxs2("g", { clipPath: "url(#clip0_1188_11261)", children: [
67
+ /* @__PURE__ */ jsx2(
68
+ "path",
69
+ {
70
+ d: "M8.00156 7.39999C8.33293 7.39999 8.60156 7.66862 8.60156 7.99999V10.6664C8.60156 10.9978 8.33293 11.2664 8.00156 11.2664C7.67019 11.2664 7.40156 10.9978 7.40156 10.6664V7.99999C7.40156 7.66862 7.67019 7.39999 8.00156 7.39999Z",
71
+ fill: "currentColor"
72
+ }
73
+ ),
74
+ /* @__PURE__ */ jsx2(
75
+ "path",
76
+ {
77
+ d: "M8.00859 4.73358C8.3398 4.73378 8.60859 5.00233 8.60859 5.33358C8.60849 5.66474 8.33973 5.93338 8.00859 5.93358H8.00156C7.67026 5.93358 7.40167 5.66486 7.40156 5.33358C7.40156 5.00221 7.67019 4.73358 8.00156 4.73358H8.00859Z",
78
+ fill: "currentColor"
79
+ }
80
+ ),
81
+ /* @__PURE__ */ jsx2(
82
+ "path",
83
+ {
84
+ fillRule: "evenodd",
85
+ clipRule: "evenodd",
86
+ d: "M8.00156 0.733582C12.0146 0.733793 15.2686 3.98697 15.2688 7.99999C15.2686 12.013 12.0146 15.267 8.00156 15.2672C3.98848 15.267 0.734481 12.0131 0.734375 7.99999C0.734516 3.98693 3.9885 0.733722 8.00156 0.733582ZM8.00156 1.93358C4.65124 1.93372 1.9353 4.64967 1.93516 7.99999C1.93526 11.3503 4.65122 14.067 8.00156 14.0672C11.3518 14.067 14.0686 11.3503 14.0688 7.99999C14.0686 4.64971 11.3518 1.93379 8.00156 1.93358Z",
87
+ fill: "currentColor"
88
+ }
89
+ )
90
+ ] }),
91
+ /* @__PURE__ */ jsx2("defs", { children: /* @__PURE__ */ jsx2("clipPath", { id: "clip0_1188_11261", children: /* @__PURE__ */ jsx2("rect", { width: "16", height: "16", fill: "white" }) }) })
92
+ ]
93
+ }
94
+ );
95
+ var InfoIcon_default = InfoIcon;
96
+
97
+ // src/tokens/svg/status/SuccessIcon.tsx
98
+ import { jsx as jsx3 } from "react/jsx-runtime";
99
+ var SuccessIcon = () => /* @__PURE__ */ jsx3(
100
+ "svg",
101
+ {
102
+ xmlns: "http://www.w3.org/2000/svg",
103
+ width: "1em",
104
+ height: "1em",
105
+ viewBox: "0 0 16 16",
106
+ fill: "none",
107
+ children: /* @__PURE__ */ jsx3(
108
+ "path",
109
+ {
110
+ d: "M12.9084 3.57597C13.1426 3.34172 13.5225 3.34185 13.7568 3.57597C13.9911 3.81028 13.9911 4.19009 13.7568 4.4244L6.424 11.758C6.31157 11.8703 6.15869 11.9337 5.99978 11.9338C5.8409 11.9337 5.68798 11.8703 5.57556 11.758L2.24197 8.4244C2.00782 8.19018 2.00795 7.81028 2.24197 7.57597C2.47626 7.34167 2.85609 7.34172 3.09041 7.57597L5.999 10.4846L12.9084 3.57597Z",
111
+ fill: "currentColor"
112
+ }
113
+ )
114
+ }
115
+ );
116
+ var SuccessIcon_default = SuccessIcon;
117
+
118
+ // src/components/FieldMessage/FieldMessage.tsx
119
+ import { Fragment, jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
120
+ var ICON = {
121
+ default: /* @__PURE__ */ jsx4(InfoIcon_default, {}),
122
+ success: /* @__PURE__ */ jsx4(SuccessIcon_default, {}),
123
+ warning: /* @__PURE__ */ jsx4(InfoIcon_default, {}),
124
+ error: /* @__PURE__ */ jsx4(ErrorIcon_default, {})
125
+ };
126
+ var FieldMessage = (props) => {
127
+ const { validations } = props;
128
+ if (!validations || validations.length === 0) return null;
129
+ return /* @__PURE__ */ jsx4("div", { className: "lib-xplat-field-message-wrap", children: validations.map((v, idx) => /* @__PURE__ */ jsxs3(
130
+ "div",
131
+ {
132
+ className: clsx_default("lib-xplat-field-message", v.status),
133
+ children: [
134
+ /* @__PURE__ */ jsx4("div", { className: "icon", children: ICON[v.status] }),
135
+ /* @__PURE__ */ jsx4("span", { children: v.message })
136
+ ]
137
+ },
138
+ `${v.message}_${idx}`
139
+ )) });
140
+ };
141
+ FieldMessage.displayName = "FieldMessage";
142
+ var Field = (props) => {
143
+ const { validations, children } = props;
144
+ if (!validations || validations.length === 0) return /* @__PURE__ */ jsx4(Fragment, { children });
145
+ return /* @__PURE__ */ jsxs3("div", { className: "lib-xplat-field", children: [
146
+ children,
147
+ /* @__PURE__ */ jsx4(FieldMessage, { validations })
148
+ ] });
149
+ };
150
+ Field.displayName = "Field";
151
+ var hasError = (validations) => !!validations?.some((v) => v.status === "error");
152
+
20
153
  // src/components/TextArea/TextArea.tsx
21
- import { jsx } from "react/jsx-runtime";
154
+ import { jsx as jsx5 } from "react/jsx-runtime";
22
155
  var TextArea = React.forwardRef(
23
156
  (props, ref) => {
24
157
  const {
25
158
  className,
26
159
  size = "md",
160
+ validations,
27
161
  resize = "vertical",
28
162
  rows = 3,
29
163
  disabled,
30
164
  ...textareaProps
31
165
  } = props;
32
- return /* @__PURE__ */ jsx("div", { className: clsx_default("lib-xplat-textarea-wrap", className), children: /* @__PURE__ */ jsx(
166
+ const control = /* @__PURE__ */ jsx5("div", { className: clsx_default("lib-xplat-textarea-wrap", className), children: /* @__PURE__ */ jsx5(
33
167
  "textarea",
34
168
  {
35
169
  ...textareaProps,
36
170
  ref,
37
171
  rows,
38
172
  disabled,
173
+ "aria-invalid": hasError(validations) || void 0,
39
174
  className: clsx_default("lib-xplat-textarea", size, disabled && "disabled"),
40
175
  style: { resize }
41
176
  }
42
177
  ) });
178
+ return /* @__PURE__ */ jsx5(Field, { validations, children: control });
43
179
  }
44
180
  );
45
181
  TextArea.displayName = "TextArea";
@@ -72,10 +72,12 @@ var Tooltip = (props) => {
72
72
  children,
73
73
  title,
74
74
  description,
75
- type = "dark",
75
+ variant,
76
+ type,
76
77
  follow = false,
77
78
  disabled = false
78
79
  } = props;
80
+ const shape = variant ?? type ?? "dark";
79
81
  const triggerRef = import_react.default.useRef(null);
80
82
  const tooltipRef = import_react.default.useRef(null);
81
83
  const [visible, setVisible] = import_react.default.useState(false);
@@ -185,7 +187,7 @@ var Tooltip = (props) => {
185
187
  {
186
188
  ref: tooltipRef,
187
189
  role: "tooltip",
188
- className: clsx_default("lib-xplat-tooltip", type),
190
+ className: clsx_default("lib-xplat-tooltip", shape),
189
191
  style: { position: "fixed", left: pos.left, top: pos.top },
190
192
  children: [
191
193
  title && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "tooltip-title", children: title }),
@@ -1,10 +1,19 @@
1
1
  import React from 'react';
2
2
 
3
+ type TooltipVariant = "dark" | "light";
3
4
  interface TooltipProps {
4
5
  children: React.ReactNode;
6
+ /** 말풍선 첫 줄. 굵게 표시된다 */
5
7
  title?: React.ReactNode;
8
+ /** 말풍선 본문. title 과 둘 중 하나는 있어야 뜬다 */
6
9
  description?: React.ReactNode;
7
- type?: "dark" | "light";
10
+ /** 말풍선 배색 */
11
+ variant?: TooltipVariant;
12
+ /**
13
+ * @deprecated 모양 변형은 `variant` 로 받는다. `type` 은 상태 색 전용이다.
14
+ * 기존 사용처가 깨지지 않도록 계속 받는다 — 둘 다 주면 `variant` 가 이긴다.
15
+ */
16
+ type?: TooltipVariant;
8
17
  /**
9
18
  * 커서를 따라다닌다. 기본값은 `false` — 트리거 요소 기준으로 고정된다
10
19
  * (PopOver/Dropdown/Select 와 같은 방식).
@@ -13,6 +22,7 @@ interface TooltipProps {
13
22
  * 아이콘처럼 대상이 작은 경우는 고정이 읽기 편하다.
14
23
  */
15
24
  follow?: boolean;
25
+ /** 말풍선을 띄우지 않는다 */
16
26
  disabled?: boolean;
17
27
  }
18
28
  declare const Tooltip: React.FC<TooltipProps>;
@@ -1,10 +1,19 @@
1
1
  import React from 'react';
2
2
 
3
+ type TooltipVariant = "dark" | "light";
3
4
  interface TooltipProps {
4
5
  children: React.ReactNode;
6
+ /** 말풍선 첫 줄. 굵게 표시된다 */
5
7
  title?: React.ReactNode;
8
+ /** 말풍선 본문. title 과 둘 중 하나는 있어야 뜬다 */
6
9
  description?: React.ReactNode;
7
- type?: "dark" | "light";
10
+ /** 말풍선 배색 */
11
+ variant?: TooltipVariant;
12
+ /**
13
+ * @deprecated 모양 변형은 `variant` 로 받는다. `type` 은 상태 색 전용이다.
14
+ * 기존 사용처가 깨지지 않도록 계속 받는다 — 둘 다 주면 `variant` 가 이긴다.
15
+ */
16
+ type?: TooltipVariant;
8
17
  /**
9
18
  * 커서를 따라다닌다. 기본값은 `false` — 트리거 요소 기준으로 고정된다
10
19
  * (PopOver/Dropdown/Select 와 같은 방식).
@@ -13,6 +22,7 @@ interface TooltipProps {
13
22
  * 아이콘처럼 대상이 작은 경우는 고정이 읽기 편하다.
14
23
  */
15
24
  follow?: boolean;
25
+ /** 말풍선을 띄우지 않는다 */
16
26
  disabled?: boolean;
17
27
  }
18
28
  declare const Tooltip: React.FC<TooltipProps>;
@@ -36,10 +36,12 @@ var Tooltip = (props) => {
36
36
  children,
37
37
  title,
38
38
  description,
39
- type = "dark",
39
+ variant,
40
+ type,
40
41
  follow = false,
41
42
  disabled = false
42
43
  } = props;
44
+ const shape = variant ?? type ?? "dark";
43
45
  const triggerRef = React.useRef(null);
44
46
  const tooltipRef = React.useRef(null);
45
47
  const [visible, setVisible] = React.useState(false);
@@ -149,7 +151,7 @@ var Tooltip = (props) => {
149
151
  {
150
152
  ref: tooltipRef,
151
153
  role: "tooltip",
152
- className: clsx_default("lib-xplat-tooltip", type),
154
+ className: clsx_default("lib-xplat-tooltip", shape),
153
155
  style: { position: "fixed", left: pos.left, top: pos.top },
154
156
  children: [
155
157
  title && /* @__PURE__ */ jsx("div", { className: "tooltip-title", children: title }),