@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
@@ -111,11 +111,146 @@ var import_jsx_runtime8 = require("react/jsx-runtime");
111
111
 
112
112
  // src/components/AutoResizeTextArea/AutoResizeTextArea.tsx
113
113
  var import_react = __toESM(require("react"), 1);
114
+
115
+ // src/tokens/svg/status/ErrorIcon.tsx
114
116
  var import_jsx_runtime9 = require("react/jsx-runtime");
117
+ var ErrorIcon = () => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
118
+ "svg",
119
+ {
120
+ xmlns: "http://www.w3.org/2000/svg",
121
+ width: "1em",
122
+ height: "1em",
123
+ viewBox: "0 0 16 16",
124
+ fill: "none",
125
+ children: [
126
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("g", { clipPath: "url(#clip0_1196_9603)", children: [
127
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
128
+ "path",
129
+ {
130
+ 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",
131
+ fill: "currentColor"
132
+ }
133
+ ),
134
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
135
+ "path",
136
+ {
137
+ fillRule: "evenodd",
138
+ clipRule: "evenodd",
139
+ 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",
140
+ fill: "currentColor"
141
+ }
142
+ )
143
+ ] }),
144
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("defs", { children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("clipPath", { id: "clip0_1196_9603", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("rect", { width: "16", height: "16", fill: "white" }) }) })
145
+ ]
146
+ }
147
+ );
148
+ var ErrorIcon_default = ErrorIcon;
149
+
150
+ // src/tokens/svg/status/InfoIcon.tsx
151
+ var import_jsx_runtime10 = require("react/jsx-runtime");
152
+ var InfoIcon = () => /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
153
+ "svg",
154
+ {
155
+ xmlns: "http://www.w3.org/2000/svg",
156
+ width: "1em",
157
+ height: "1em",
158
+ viewBox: "0 0 16 16",
159
+ fill: "none",
160
+ children: [
161
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("g", { clipPath: "url(#clip0_1188_11261)", children: [
162
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
163
+ "path",
164
+ {
165
+ 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",
166
+ fill: "currentColor"
167
+ }
168
+ ),
169
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
170
+ "path",
171
+ {
172
+ 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",
173
+ fill: "currentColor"
174
+ }
175
+ ),
176
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
177
+ "path",
178
+ {
179
+ fillRule: "evenodd",
180
+ clipRule: "evenodd",
181
+ 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",
182
+ fill: "currentColor"
183
+ }
184
+ )
185
+ ] }),
186
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("defs", { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("clipPath", { id: "clip0_1188_11261", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("rect", { width: "16", height: "16", fill: "white" }) }) })
187
+ ]
188
+ }
189
+ );
190
+ var InfoIcon_default = InfoIcon;
191
+
192
+ // src/tokens/svg/status/SuccessIcon.tsx
193
+ var import_jsx_runtime11 = require("react/jsx-runtime");
194
+ var SuccessIcon = () => /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
195
+ "svg",
196
+ {
197
+ xmlns: "http://www.w3.org/2000/svg",
198
+ width: "1em",
199
+ height: "1em",
200
+ viewBox: "0 0 16 16",
201
+ fill: "none",
202
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
203
+ "path",
204
+ {
205
+ 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",
206
+ fill: "currentColor"
207
+ }
208
+ )
209
+ }
210
+ );
211
+ var SuccessIcon_default = SuccessIcon;
212
+
213
+ // src/components/FieldMessage/FieldMessage.tsx
214
+ var import_jsx_runtime12 = require("react/jsx-runtime");
215
+ var ICON = {
216
+ default: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(InfoIcon_default, {}),
217
+ success: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(SuccessIcon_default, {}),
218
+ warning: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(InfoIcon_default, {}),
219
+ error: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(ErrorIcon_default, {})
220
+ };
221
+ var FieldMessage = (props) => {
222
+ const { validations } = props;
223
+ if (!validations || validations.length === 0) return null;
224
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "lib-xplat-field-message-wrap", children: validations.map((v, idx) => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
225
+ "div",
226
+ {
227
+ className: clsx_default("lib-xplat-field-message", v.status),
228
+ children: [
229
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "icon", children: ICON[v.status] }),
230
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: v.message })
231
+ ]
232
+ },
233
+ `${v.message}_${idx}`
234
+ )) });
235
+ };
236
+ FieldMessage.displayName = "FieldMessage";
237
+ var Field = (props) => {
238
+ const { validations, children } = props;
239
+ if (!validations || validations.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_jsx_runtime12.Fragment, { children });
240
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "lib-xplat-field", children: [
241
+ children,
242
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(FieldMessage, { validations })
243
+ ] });
244
+ };
245
+ Field.displayName = "Field";
246
+ var hasError = (validations) => !!validations?.some((v) => v.status === "error");
247
+
248
+ // src/components/AutoResizeTextArea/AutoResizeTextArea.tsx
249
+ var import_jsx_runtime13 = require("react/jsx-runtime");
115
250
  var MAX_HEIGHT = 400;
116
251
  var AutoResizeTextArea = import_react.default.forwardRef(
117
252
  (props, ref) => {
118
- const { value, className, onChange, disabled, bare = false, ...textareaProps } = props;
253
+ const { value, className, onChange, disabled, bare = false, validations, ...textareaProps } = props;
119
254
  const localRef = import_react.default.useRef(null);
120
255
  const setRefs = (el) => {
121
256
  localRef.current = el;
@@ -143,9 +278,10 @@ var AutoResizeTextArea = import_react.default.forwardRef(
143
278
  updateHeight();
144
279
  }, [value]);
145
280
  if (bare) {
146
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
281
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
147
282
  "textarea",
148
283
  {
284
+ "aria-invalid": hasError(validations) || void 0,
149
285
  ...textareaProps,
150
286
  ref: setRefs,
151
287
  className,
@@ -155,9 +291,10 @@ var AutoResizeTextArea = import_react.default.forwardRef(
155
291
  }
156
292
  );
157
293
  }
158
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: clsx_default("lib-xplat-auto-resize-textarea-wrapper", className), children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: clsx_default("lib-xplat-auto-resize-textarea", disabled && "disabled"), children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
294
+ const control = /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: clsx_default("lib-xplat-auto-resize-textarea-wrapper", className), children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: clsx_default("lib-xplat-auto-resize-textarea", disabled && "disabled"), children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
159
295
  "textarea",
160
296
  {
297
+ "aria-invalid": hasError(validations) || void 0,
161
298
  ...textareaProps,
162
299
  ref: setRefs,
163
300
  disabled,
@@ -165,13 +302,14 @@ var AutoResizeTextArea = import_react.default.forwardRef(
165
302
  onChange: handleChange
166
303
  }
167
304
  ) }) });
305
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Field, { validations, children: control });
168
306
  }
169
307
  );
170
308
  AutoResizeTextArea.displayName = "AutoResizeTextArea";
171
309
  var AutoResizeTextArea_default = AutoResizeTextArea;
172
310
 
173
311
  // src/components/ChatInput/ChatInput.tsx
174
- var import_jsx_runtime10 = require("react/jsx-runtime");
312
+ var import_jsx_runtime14 = require("react/jsx-runtime");
175
313
  var ChatInput = import_react2.default.forwardRef(
176
314
  (props, ref) => {
177
315
  const {
@@ -180,7 +318,8 @@ var ChatInput = import_react2.default.forwardRef(
180
318
  disabled = false,
181
319
  buttonType = "primary",
182
320
  onSubmit,
183
- onChange
321
+ onChange,
322
+ validations
184
323
  } = props;
185
324
  const isControlled = valueProp !== void 0;
186
325
  const [internalValue, setInternalValue] = import_react2.default.useState("");
@@ -202,8 +341,8 @@ var ChatInput = import_react2.default.forwardRef(
202
341
  handleSubmit();
203
342
  }
204
343
  };
205
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: clsx_default("lib-xplat-chat-input", disabled && "disabled"), children: [
206
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
344
+ const control = /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: clsx_default("lib-xplat-chat-input", disabled && "disabled"), children: [
345
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
207
346
  AutoResizeTextArea_default,
208
347
  {
209
348
  ref,
@@ -214,13 +353,14 @@ var ChatInput = import_react2.default.forwardRef(
214
353
  disabled,
215
354
  rows: 1,
216
355
  onChange: handleChange,
356
+ "aria-invalid": hasError(validations) || void 0,
217
357
  onKeyDown: handleKeyDown
218
358
  }
219
359
  ),
220
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
360
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
221
361
  IconButton_default,
222
362
  {
223
- icon: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(MessageSquareIcon_default, {}),
363
+ icon: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(MessageSquareIcon_default, {}),
224
364
  type: buttonType,
225
365
  size: "sm",
226
366
  disabled: !hasText || disabled,
@@ -229,6 +369,7 @@ var ChatInput = import_react2.default.forwardRef(
229
369
  }
230
370
  )
231
371
  ] });
372
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Field, { validations, children: control });
232
373
  }
233
374
  );
234
375
  ChatInput.displayName = "ChatInput";
@@ -76,6 +76,44 @@
76
76
  outline-offset: 2px;
77
77
  }
78
78
 
79
+ /* src/components/FieldMessage/fieldMessage.scss */
80
+ .lib-xplat-field {
81
+ display: flex;
82
+ flex-direction: column;
83
+ gap: var(--spacing-space-2);
84
+ }
85
+ .lib-xplat-field-message-wrap {
86
+ display: flex;
87
+ gap: var(--spacing-space-2);
88
+ margin-left: var(--spacing-space-1);
89
+ }
90
+ .lib-xplat-field-message-wrap > .lib-xplat-field-message {
91
+ display: flex;
92
+ gap: var(--spacing-space-1);
93
+ font-family: var(--semantic-typo-caption-2-r-font);
94
+ font-size: var(--semantic-typo-caption-2-r-size);
95
+ line-height: var(--semantic-typo-caption-2-r-lh);
96
+ font-weight: var(--semantic-typo-caption-2-r-weight);
97
+ letter-spacing: var(--semantic-typo-caption-2-r-ls);
98
+ align-items: center;
99
+ user-select: none;
100
+ }
101
+ .lib-xplat-field-message-wrap > .lib-xplat-field-message.default {
102
+ color: var(--semantic-icon-secondary);
103
+ }
104
+ .lib-xplat-field-message-wrap > .lib-xplat-field-message.success {
105
+ color: var(--semantic-text-success);
106
+ }
107
+ .lib-xplat-field-message-wrap > .lib-xplat-field-message.warning {
108
+ color: var(--semantic-text-warning);
109
+ }
110
+ .lib-xplat-field-message-wrap > .lib-xplat-field-message.error {
111
+ color: var(--semantic-text-error);
112
+ }
113
+ .lib-xplat-field-message-wrap > .lib-xplat-field-message > .icon {
114
+ font-size: var(--semantic-typo-label-2-m-size);
115
+ }
116
+
79
117
  /* src/components/AutoResizeTextArea/autoResizeTextArea.scss */
80
118
  .lib-xplat-auto-resize-textarea-wrapper {
81
119
  display: flex;
@@ -1,12 +1,21 @@
1
1
  import React from 'react';
2
+ import { V as Validation } from '../../validation-Dqo1zqhT.cjs';
2
3
 
3
4
  type ButtonType = "primary" | "secondary" | "ghost";
4
5
  interface ChatInputProps {
6
+ /** 비어 있을 때 표시할 안내 글자 */
5
7
  placeholder?: string;
8
+ /** 입력값. 주면 controlled 가 된다 */
6
9
  value?: string;
10
+ /** 입력과 전송을 막는다 */
7
11
  disabled?: boolean;
12
+ /** 컨트롤 아래에 표시할 검증 메시지. DS 폼 컴포넌트 공통 */
13
+ validations?: Validation[];
14
+ /** 전송 버튼 색 */
8
15
  buttonType?: ButtonType;
16
+ /** Enter 또는 전송 버튼을 누르면 현재 값을 준다 */
9
17
  onSubmit?: (value: string) => void;
18
+ /** 입력할 때마다 값을 준다 */
10
19
  onChange?: (value: string) => void;
11
20
  }
12
21
  declare const ChatInput: React.ForwardRefExoticComponent<ChatInputProps & React.RefAttributes<HTMLTextAreaElement>>;
@@ -1,12 +1,21 @@
1
1
  import React from 'react';
2
+ import { V as Validation } from '../../validation-Dqo1zqhT.js';
2
3
 
3
4
  type ButtonType = "primary" | "secondary" | "ghost";
4
5
  interface ChatInputProps {
6
+ /** 비어 있을 때 표시할 안내 글자 */
5
7
  placeholder?: string;
8
+ /** 입력값. 주면 controlled 가 된다 */
6
9
  value?: string;
10
+ /** 입력과 전송을 막는다 */
7
11
  disabled?: boolean;
12
+ /** 컨트롤 아래에 표시할 검증 메시지. DS 폼 컴포넌트 공통 */
13
+ validations?: Validation[];
14
+ /** 전송 버튼 색 */
8
15
  buttonType?: ButtonType;
16
+ /** Enter 또는 전송 버튼을 누르면 현재 값을 준다 */
9
17
  onSubmit?: (value: string) => void;
18
+ /** 입력할 때마다 값을 준다 */
10
19
  onChange?: (value: string) => void;
11
20
  }
12
21
  declare const ChatInput: React.ForwardRefExoticComponent<ChatInputProps & React.RefAttributes<HTMLTextAreaElement>>;
@@ -75,11 +75,146 @@ import { jsx as jsx8, jsxs as jsxs3 } from "react/jsx-runtime";
75
75
 
76
76
  // src/components/AutoResizeTextArea/AutoResizeTextArea.tsx
77
77
  import React from "react";
78
- import { jsx as jsx9 } from "react/jsx-runtime";
78
+
79
+ // src/tokens/svg/status/ErrorIcon.tsx
80
+ import { jsx as jsx9, jsxs as jsxs4 } from "react/jsx-runtime";
81
+ var ErrorIcon = () => /* @__PURE__ */ jsxs4(
82
+ "svg",
83
+ {
84
+ xmlns: "http://www.w3.org/2000/svg",
85
+ width: "1em",
86
+ height: "1em",
87
+ viewBox: "0 0 16 16",
88
+ fill: "none",
89
+ children: [
90
+ /* @__PURE__ */ jsxs4("g", { clipPath: "url(#clip0_1196_9603)", children: [
91
+ /* @__PURE__ */ jsx9(
92
+ "path",
93
+ {
94
+ 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",
95
+ fill: "currentColor"
96
+ }
97
+ ),
98
+ /* @__PURE__ */ jsx9(
99
+ "path",
100
+ {
101
+ fillRule: "evenodd",
102
+ clipRule: "evenodd",
103
+ 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",
104
+ fill: "currentColor"
105
+ }
106
+ )
107
+ ] }),
108
+ /* @__PURE__ */ jsx9("defs", { children: /* @__PURE__ */ jsx9("clipPath", { id: "clip0_1196_9603", children: /* @__PURE__ */ jsx9("rect", { width: "16", height: "16", fill: "white" }) }) })
109
+ ]
110
+ }
111
+ );
112
+ var ErrorIcon_default = ErrorIcon;
113
+
114
+ // src/tokens/svg/status/InfoIcon.tsx
115
+ import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
116
+ var InfoIcon = () => /* @__PURE__ */ jsxs5(
117
+ "svg",
118
+ {
119
+ xmlns: "http://www.w3.org/2000/svg",
120
+ width: "1em",
121
+ height: "1em",
122
+ viewBox: "0 0 16 16",
123
+ fill: "none",
124
+ children: [
125
+ /* @__PURE__ */ jsxs5("g", { clipPath: "url(#clip0_1188_11261)", children: [
126
+ /* @__PURE__ */ jsx10(
127
+ "path",
128
+ {
129
+ 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",
130
+ fill: "currentColor"
131
+ }
132
+ ),
133
+ /* @__PURE__ */ jsx10(
134
+ "path",
135
+ {
136
+ 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",
137
+ fill: "currentColor"
138
+ }
139
+ ),
140
+ /* @__PURE__ */ jsx10(
141
+ "path",
142
+ {
143
+ fillRule: "evenodd",
144
+ clipRule: "evenodd",
145
+ 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",
146
+ fill: "currentColor"
147
+ }
148
+ )
149
+ ] }),
150
+ /* @__PURE__ */ jsx10("defs", { children: /* @__PURE__ */ jsx10("clipPath", { id: "clip0_1188_11261", children: /* @__PURE__ */ jsx10("rect", { width: "16", height: "16", fill: "white" }) }) })
151
+ ]
152
+ }
153
+ );
154
+ var InfoIcon_default = InfoIcon;
155
+
156
+ // src/tokens/svg/status/SuccessIcon.tsx
157
+ import { jsx as jsx11 } from "react/jsx-runtime";
158
+ var SuccessIcon = () => /* @__PURE__ */ jsx11(
159
+ "svg",
160
+ {
161
+ xmlns: "http://www.w3.org/2000/svg",
162
+ width: "1em",
163
+ height: "1em",
164
+ viewBox: "0 0 16 16",
165
+ fill: "none",
166
+ children: /* @__PURE__ */ jsx11(
167
+ "path",
168
+ {
169
+ 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",
170
+ fill: "currentColor"
171
+ }
172
+ )
173
+ }
174
+ );
175
+ var SuccessIcon_default = SuccessIcon;
176
+
177
+ // src/components/FieldMessage/FieldMessage.tsx
178
+ import { Fragment, jsx as jsx12, jsxs as jsxs6 } from "react/jsx-runtime";
179
+ var ICON = {
180
+ default: /* @__PURE__ */ jsx12(InfoIcon_default, {}),
181
+ success: /* @__PURE__ */ jsx12(SuccessIcon_default, {}),
182
+ warning: /* @__PURE__ */ jsx12(InfoIcon_default, {}),
183
+ error: /* @__PURE__ */ jsx12(ErrorIcon_default, {})
184
+ };
185
+ var FieldMessage = (props) => {
186
+ const { validations } = props;
187
+ if (!validations || validations.length === 0) return null;
188
+ return /* @__PURE__ */ jsx12("div", { className: "lib-xplat-field-message-wrap", children: validations.map((v, idx) => /* @__PURE__ */ jsxs6(
189
+ "div",
190
+ {
191
+ className: clsx_default("lib-xplat-field-message", v.status),
192
+ children: [
193
+ /* @__PURE__ */ jsx12("div", { className: "icon", children: ICON[v.status] }),
194
+ /* @__PURE__ */ jsx12("span", { children: v.message })
195
+ ]
196
+ },
197
+ `${v.message}_${idx}`
198
+ )) });
199
+ };
200
+ FieldMessage.displayName = "FieldMessage";
201
+ var Field = (props) => {
202
+ const { validations, children } = props;
203
+ if (!validations || validations.length === 0) return /* @__PURE__ */ jsx12(Fragment, { children });
204
+ return /* @__PURE__ */ jsxs6("div", { className: "lib-xplat-field", children: [
205
+ children,
206
+ /* @__PURE__ */ jsx12(FieldMessage, { validations })
207
+ ] });
208
+ };
209
+ Field.displayName = "Field";
210
+ var hasError = (validations) => !!validations?.some((v) => v.status === "error");
211
+
212
+ // src/components/AutoResizeTextArea/AutoResizeTextArea.tsx
213
+ import { jsx as jsx13 } from "react/jsx-runtime";
79
214
  var MAX_HEIGHT = 400;
80
215
  var AutoResizeTextArea = React.forwardRef(
81
216
  (props, ref) => {
82
- const { value, className, onChange, disabled, bare = false, ...textareaProps } = props;
217
+ const { value, className, onChange, disabled, bare = false, validations, ...textareaProps } = props;
83
218
  const localRef = React.useRef(null);
84
219
  const setRefs = (el) => {
85
220
  localRef.current = el;
@@ -107,9 +242,10 @@ var AutoResizeTextArea = React.forwardRef(
107
242
  updateHeight();
108
243
  }, [value]);
109
244
  if (bare) {
110
- return /* @__PURE__ */ jsx9(
245
+ return /* @__PURE__ */ jsx13(
111
246
  "textarea",
112
247
  {
248
+ "aria-invalid": hasError(validations) || void 0,
113
249
  ...textareaProps,
114
250
  ref: setRefs,
115
251
  className,
@@ -119,9 +255,10 @@ var AutoResizeTextArea = React.forwardRef(
119
255
  }
120
256
  );
121
257
  }
122
- return /* @__PURE__ */ jsx9("div", { className: clsx_default("lib-xplat-auto-resize-textarea-wrapper", className), children: /* @__PURE__ */ jsx9("div", { className: clsx_default("lib-xplat-auto-resize-textarea", disabled && "disabled"), children: /* @__PURE__ */ jsx9(
258
+ const control = /* @__PURE__ */ jsx13("div", { className: clsx_default("lib-xplat-auto-resize-textarea-wrapper", className), children: /* @__PURE__ */ jsx13("div", { className: clsx_default("lib-xplat-auto-resize-textarea", disabled && "disabled"), children: /* @__PURE__ */ jsx13(
123
259
  "textarea",
124
260
  {
261
+ "aria-invalid": hasError(validations) || void 0,
125
262
  ...textareaProps,
126
263
  ref: setRefs,
127
264
  disabled,
@@ -129,13 +266,14 @@ var AutoResizeTextArea = React.forwardRef(
129
266
  onChange: handleChange
130
267
  }
131
268
  ) }) });
269
+ return /* @__PURE__ */ jsx13(Field, { validations, children: control });
132
270
  }
133
271
  );
134
272
  AutoResizeTextArea.displayName = "AutoResizeTextArea";
135
273
  var AutoResizeTextArea_default = AutoResizeTextArea;
136
274
 
137
275
  // src/components/ChatInput/ChatInput.tsx
138
- import { jsx as jsx10, jsxs as jsxs4 } from "react/jsx-runtime";
276
+ import { jsx as jsx14, jsxs as jsxs7 } from "react/jsx-runtime";
139
277
  var ChatInput = React2.forwardRef(
140
278
  (props, ref) => {
141
279
  const {
@@ -144,7 +282,8 @@ var ChatInput = React2.forwardRef(
144
282
  disabled = false,
145
283
  buttonType = "primary",
146
284
  onSubmit,
147
- onChange
285
+ onChange,
286
+ validations
148
287
  } = props;
149
288
  const isControlled = valueProp !== void 0;
150
289
  const [internalValue, setInternalValue] = React2.useState("");
@@ -166,8 +305,8 @@ var ChatInput = React2.forwardRef(
166
305
  handleSubmit();
167
306
  }
168
307
  };
169
- return /* @__PURE__ */ jsxs4("div", { className: clsx_default("lib-xplat-chat-input", disabled && "disabled"), children: [
170
- /* @__PURE__ */ jsx10(
308
+ const control = /* @__PURE__ */ jsxs7("div", { className: clsx_default("lib-xplat-chat-input", disabled && "disabled"), children: [
309
+ /* @__PURE__ */ jsx14(
171
310
  AutoResizeTextArea_default,
172
311
  {
173
312
  ref,
@@ -178,13 +317,14 @@ var ChatInput = React2.forwardRef(
178
317
  disabled,
179
318
  rows: 1,
180
319
  onChange: handleChange,
320
+ "aria-invalid": hasError(validations) || void 0,
181
321
  onKeyDown: handleKeyDown
182
322
  }
183
323
  ),
184
- /* @__PURE__ */ jsx10(
324
+ /* @__PURE__ */ jsx14(
185
325
  IconButton_default,
186
326
  {
187
- icon: /* @__PURE__ */ jsx10(MessageSquareIcon_default, {}),
327
+ icon: /* @__PURE__ */ jsx14(MessageSquareIcon_default, {}),
188
328
  type: buttonType,
189
329
  size: "sm",
190
330
  disabled: !hasText || disabled,
@@ -193,6 +333,7 @@ var ChatInput = React2.forwardRef(
193
333
  }
194
334
  )
195
335
  ] });
336
+ return /* @__PURE__ */ jsx14(Field, { validations, children: control });
196
337
  }
197
338
  );
198
339
  ChatInput.displayName = "ChatInput";