@x-plat/design-system 0.8.2 → 0.9.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 (72) hide show
  1. package/dist/components/AutoResizeTextArea/index.cjs +140 -4
  2. package/dist/components/AutoResizeTextArea/index.css +38 -3
  3. package/dist/components/AutoResizeTextArea/index.d.cts +3 -0
  4. package/dist/components/AutoResizeTextArea/index.d.ts +3 -0
  5. package/dist/components/AutoResizeTextArea/index.js +140 -4
  6. package/dist/components/ChatInput/index.cjs +150 -9
  7. package/dist/components/ChatInput/index.css +38 -3
  8. package/dist/components/ChatInput/index.d.cts +3 -0
  9. package/dist/components/ChatInput/index.d.ts +3 -0
  10. package/dist/components/ChatInput/index.js +151 -10
  11. package/dist/components/CheckBox/index.cjs +132 -5
  12. package/dist/components/CheckBox/index.css +38 -0
  13. package/dist/components/CheckBox/index.d.cts +3 -0
  14. package/dist/components/CheckBox/index.d.ts +3 -0
  15. package/dist/components/CheckBox/index.js +132 -5
  16. package/dist/components/DatePicker/index.cjs +72 -59
  17. package/dist/components/DatePicker/index.css +38 -34
  18. package/dist/components/DatePicker/index.js +38 -25
  19. package/dist/components/FieldMessage/index.cjs +183 -0
  20. package/dist/components/FieldMessage/index.css +37 -0
  21. package/dist/components/FieldMessage/index.d.cts +37 -0
  22. package/dist/components/FieldMessage/index.d.ts +37 -0
  23. package/dist/components/FieldMessage/index.js +154 -0
  24. package/dist/components/FileUpload/index.cjs +135 -8
  25. package/dist/components/FileUpload/index.css +38 -0
  26. package/dist/components/FileUpload/index.d.cts +3 -0
  27. package/dist/components/FileUpload/index.d.ts +3 -0
  28. package/dist/components/FileUpload/index.js +135 -8
  29. package/dist/components/ImageSelector/index.cjs +153 -11
  30. package/dist/components/ImageSelector/index.css +38 -0
  31. package/dist/components/ImageSelector/index.d.cts +3 -0
  32. package/dist/components/ImageSelector/index.d.ts +3 -0
  33. package/dist/components/ImageSelector/index.js +153 -11
  34. package/dist/components/Input/index.cjs +38 -25
  35. package/dist/components/Input/index.css +38 -34
  36. package/dist/components/Input/index.d.cts +3 -8
  37. package/dist/components/Input/index.d.ts +3 -8
  38. package/dist/components/Input/index.js +36 -23
  39. package/dist/components/Radio/index.cjs +152 -8
  40. package/dist/components/Radio/index.css +38 -0
  41. package/dist/components/Radio/index.d.cts +3 -0
  42. package/dist/components/Radio/index.d.ts +3 -0
  43. package/dist/components/Radio/index.js +152 -8
  44. package/dist/components/Select/index.cjs +139 -13
  45. package/dist/components/Select/index.css +38 -0
  46. package/dist/components/Select/index.d.cts +3 -0
  47. package/dist/components/Select/index.d.ts +3 -0
  48. package/dist/components/Select/index.js +139 -13
  49. package/dist/components/Switch/index.cjs +140 -4
  50. package/dist/components/Switch/index.css +38 -0
  51. package/dist/components/Switch/index.d.cts +3 -0
  52. package/dist/components/Switch/index.d.ts +3 -0
  53. package/dist/components/Switch/index.js +140 -4
  54. package/dist/components/TextArea/index.cjs +138 -2
  55. package/dist/components/TextArea/index.css +38 -3
  56. package/dist/components/TextArea/index.d.cts +3 -0
  57. package/dist/components/TextArea/index.d.ts +3 -0
  58. package/dist/components/TextArea/index.js +138 -2
  59. package/dist/components/index.cjs +439 -385
  60. package/dist/components/index.css +38 -40
  61. package/dist/components/index.d.cts +2 -0
  62. package/dist/components/index.d.ts +2 -0
  63. package/dist/components/index.js +222 -171
  64. package/dist/index.cjs +444 -390
  65. package/dist/index.css +38 -40
  66. package/dist/index.d.cts +2 -0
  67. package/dist/index.d.ts +2 -0
  68. package/dist/index.js +224 -173
  69. package/dist/validation-Dqo1zqhT.d.cts +13 -0
  70. package/dist/validation-Dqo1zqhT.d.ts +13 -0
  71. package/guidelines/components/form.md +26 -0
  72. package/package.json +1 -1
@@ -17,8 +17,141 @@ 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/Switch/Switch.tsx
21
- import { jsx } from "react/jsx-runtime";
154
+ import { jsx as jsx5 } from "react/jsx-runtime";
22
155
  var KNOB_TRANSITION_MS = 250;
23
156
  var Switch = (props) => {
24
157
  const {
@@ -26,7 +159,8 @@ var Switch = (props) => {
26
159
  size = "md",
27
160
  type = "brand",
28
161
  disabled,
29
- onChange
162
+ onChange,
163
+ validations
30
164
  } = props;
31
165
  const [isAnimating, setIsAnimating] = React.useState(false);
32
166
  const timeoutRef = React.useRef(null);
@@ -45,7 +179,7 @@ var Switch = (props) => {
45
179
  timeoutRef.current = null;
46
180
  }, KNOB_TRANSITION_MS);
47
181
  };
48
- return /* @__PURE__ */ jsx(
182
+ const control = /* @__PURE__ */ jsx5(
49
183
  "div",
50
184
  {
51
185
  className: clsx_default(
@@ -57,10 +191,12 @@ var Switch = (props) => {
57
191
  isAnimating && "animating"
58
192
  ),
59
193
  onClick: handleClick,
194
+ "aria-invalid": hasError(validations) || void 0,
60
195
  "aria-disabled": disabled || isAnimating,
61
- children: /* @__PURE__ */ jsx("div", { className: clsx_default("knob", value ? "checked" : void 0) })
196
+ children: /* @__PURE__ */ jsx5("div", { className: clsx_default("knob", value ? "checked" : void 0) })
62
197
  }
63
198
  );
199
+ return /* @__PURE__ */ jsx5(Field, { validations, children: control });
64
200
  };
65
201
  Switch.displayName = "Switch";
66
202
  var Switch_default = Switch;
@@ -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;
@@ -47,9 +85,6 @@
47
85
  outline: 2px solid transparent;
48
86
  outline-offset: 2px;
49
87
  }
50
- .lib-xplat-textarea-wrap .lib-xplat-textarea:not(:placeholder-shown):not(:focus) {
51
- border-color: var(--semantic-border-tertiary);
52
- }
53
88
  .lib-xplat-textarea-wrap .lib-xplat-textarea.disabled {
54
89
  background-color: var(--semantic-surface-neutral-disabled);
55
90
  cursor: not-allowed;
@@ -1,10 +1,13 @@
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"> {
7
8
  size?: TextAreaSize;
9
+ /** 컨트롤 아래에 표시할 검증 메시지. DS 폼 컴포넌트 공통 */
10
+ validations?: Validation[];
8
11
  resize?: TextAreaResize;
9
12
  rows?: number;
10
13
  }
@@ -1,10 +1,13 @@
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"> {
7
8
  size?: TextAreaSize;
9
+ /** 컨트롤 아래에 표시할 검증 메시지. DS 폼 컴포넌트 공통 */
10
+ validations?: Validation[];
8
11
  resize?: TextAreaResize;
9
12
  rows?: number;
10
13
  }
@@ -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";