@x-plat/design-system 0.8.3 → 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 -0
  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 -0
  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 -31
  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 -31
  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 -0
  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 -31
  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 -31
  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
@@ -875,12 +875,83 @@ import { jsx as jsx253 } from "react/jsx-runtime";
875
875
 
876
876
  // src/tokens/svg/status/ErrorIcon.tsx
877
877
  import { jsx as jsx254, jsxs as jsxs160 } from "react/jsx-runtime";
878
+ var ErrorIcon = () => /* @__PURE__ */ jsxs160(
879
+ "svg",
880
+ {
881
+ xmlns: "http://www.w3.org/2000/svg",
882
+ width: "1em",
883
+ height: "1em",
884
+ viewBox: "0 0 16 16",
885
+ fill: "none",
886
+ children: [
887
+ /* @__PURE__ */ jsxs160("g", { clipPath: "url(#clip0_1196_9603)", children: [
888
+ /* @__PURE__ */ jsx254(
889
+ "path",
890
+ {
891
+ 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",
892
+ fill: "currentColor"
893
+ }
894
+ ),
895
+ /* @__PURE__ */ jsx254(
896
+ "path",
897
+ {
898
+ fillRule: "evenodd",
899
+ clipRule: "evenodd",
900
+ 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",
901
+ fill: "currentColor"
902
+ }
903
+ )
904
+ ] }),
905
+ /* @__PURE__ */ jsx254("defs", { children: /* @__PURE__ */ jsx254("clipPath", { id: "clip0_1196_9603", children: /* @__PURE__ */ jsx254("rect", { width: "16", height: "16", fill: "white" }) }) })
906
+ ]
907
+ }
908
+ );
909
+ var ErrorIcon_default = ErrorIcon;
878
910
 
879
911
  // src/tokens/svg/status/HelpCircleIcon.tsx
880
912
  import { jsx as jsx255, jsxs as jsxs161 } from "react/jsx-runtime";
881
913
 
882
914
  // src/tokens/svg/status/InfoIcon.tsx
883
915
  import { jsx as jsx256, jsxs as jsxs162 } from "react/jsx-runtime";
916
+ var InfoIcon = () => /* @__PURE__ */ jsxs162(
917
+ "svg",
918
+ {
919
+ xmlns: "http://www.w3.org/2000/svg",
920
+ width: "1em",
921
+ height: "1em",
922
+ viewBox: "0 0 16 16",
923
+ fill: "none",
924
+ children: [
925
+ /* @__PURE__ */ jsxs162("g", { clipPath: "url(#clip0_1188_11261)", children: [
926
+ /* @__PURE__ */ jsx256(
927
+ "path",
928
+ {
929
+ 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",
930
+ fill: "currentColor"
931
+ }
932
+ ),
933
+ /* @__PURE__ */ jsx256(
934
+ "path",
935
+ {
936
+ 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",
937
+ fill: "currentColor"
938
+ }
939
+ ),
940
+ /* @__PURE__ */ jsx256(
941
+ "path",
942
+ {
943
+ fillRule: "evenodd",
944
+ clipRule: "evenodd",
945
+ 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",
946
+ fill: "currentColor"
947
+ }
948
+ )
949
+ ] }),
950
+ /* @__PURE__ */ jsx256("defs", { children: /* @__PURE__ */ jsx256("clipPath", { id: "clip0_1188_11261", children: /* @__PURE__ */ jsx256("rect", { width: "16", height: "16", fill: "white" }) }) })
951
+ ]
952
+ }
953
+ );
954
+ var InfoIcon_default = InfoIcon;
884
955
 
885
956
  // src/tokens/svg/status/LoaderIcon.tsx
886
957
  import { jsx as jsx257, jsxs as jsxs163 } from "react/jsx-runtime";
@@ -905,6 +976,24 @@ import { jsx as jsx263, jsxs as jsxs167 } from "react/jsx-runtime";
905
976
 
906
977
  // src/tokens/svg/status/SuccessIcon.tsx
907
978
  import { jsx as jsx264 } from "react/jsx-runtime";
979
+ var SuccessIcon = () => /* @__PURE__ */ jsx264(
980
+ "svg",
981
+ {
982
+ xmlns: "http://www.w3.org/2000/svg",
983
+ width: "1em",
984
+ height: "1em",
985
+ viewBox: "0 0 16 16",
986
+ fill: "none",
987
+ children: /* @__PURE__ */ jsx264(
988
+ "path",
989
+ {
990
+ 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",
991
+ fill: "currentColor"
992
+ }
993
+ )
994
+ }
995
+ );
996
+ var SuccessIcon_default = SuccessIcon;
908
997
 
909
998
  // src/tokens/svg/status/XCircleIcon.tsx
910
999
  import { jsx as jsx265, jsxs as jsxs168 } from "react/jsx-runtime";
@@ -1012,6 +1101,41 @@ function clsx() {
1012
1101
  }
1013
1102
  var clsx_default = clsx;
1014
1103
 
1104
+ // src/components/FieldMessage/FieldMessage.tsx
1105
+ import { Fragment, jsx as jsx295, jsxs as jsxs189 } from "react/jsx-runtime";
1106
+ var ICON = {
1107
+ default: /* @__PURE__ */ jsx295(InfoIcon_default, {}),
1108
+ success: /* @__PURE__ */ jsx295(SuccessIcon_default, {}),
1109
+ warning: /* @__PURE__ */ jsx295(InfoIcon_default, {}),
1110
+ error: /* @__PURE__ */ jsx295(ErrorIcon_default, {})
1111
+ };
1112
+ var FieldMessage = (props) => {
1113
+ const { validations } = props;
1114
+ if (!validations || validations.length === 0) return null;
1115
+ return /* @__PURE__ */ jsx295("div", { className: "lib-xplat-field-message-wrap", children: validations.map((v, idx) => /* @__PURE__ */ jsxs189(
1116
+ "div",
1117
+ {
1118
+ className: clsx_default("lib-xplat-field-message", v.status),
1119
+ children: [
1120
+ /* @__PURE__ */ jsx295("div", { className: "icon", children: ICON[v.status] }),
1121
+ /* @__PURE__ */ jsx295("span", { children: v.message })
1122
+ ]
1123
+ },
1124
+ `${v.message}_${idx}`
1125
+ )) });
1126
+ };
1127
+ FieldMessage.displayName = "FieldMessage";
1128
+ var Field = (props) => {
1129
+ const { validations, children } = props;
1130
+ if (!validations || validations.length === 0) return /* @__PURE__ */ jsx295(Fragment, { children });
1131
+ return /* @__PURE__ */ jsxs189("div", { className: "lib-xplat-field", children: [
1132
+ children,
1133
+ /* @__PURE__ */ jsx295(FieldMessage, { validations })
1134
+ ] });
1135
+ };
1136
+ Field.displayName = "Field";
1137
+ var hasError = (validations) => !!validations?.some((v) => v.status === "error");
1138
+
1015
1139
  // src/components/Select/context.ts
1016
1140
  import React3 from "react";
1017
1141
  var SelectContext = React3.createContext(null);
@@ -1019,7 +1143,7 @@ var context_default = SelectContext;
1019
1143
 
1020
1144
  // src/components/Select/SelectItem.tsx
1021
1145
  import React4 from "react";
1022
- import { jsx as jsx295 } from "react/jsx-runtime";
1146
+ import { jsx as jsx296 } from "react/jsx-runtime";
1023
1147
  var SelectItem = (props) => {
1024
1148
  const { children, value, onClick, disabled = false } = props;
1025
1149
  const ctx = React4.useContext(context_default);
@@ -1032,7 +1156,7 @@ var SelectItem = (props) => {
1032
1156
  onClick?.();
1033
1157
  };
1034
1158
  const isSelected = value !== void 0 ? ctx?.selectedValue === value : ctx?.selectedLabel === children;
1035
- return /* @__PURE__ */ jsx295(
1159
+ return /* @__PURE__ */ jsx296(
1036
1160
  "div",
1037
1161
  {
1038
1162
  className: clsx_default("select-item", disabled && "disabled", isSelected && "is-selected"),
@@ -1053,7 +1177,7 @@ SelectItem.displayName = "Select.Item";
1053
1177
  var SelectItem_default = SelectItem;
1054
1178
 
1055
1179
  // src/components/Select/Select.tsx
1056
- import { jsx as jsx296, jsxs as jsxs189 } from "react/jsx-runtime";
1180
+ import { jsx as jsx297, jsxs as jsxs190 } from "react/jsx-runtime";
1057
1181
  var ANIMATION_DURATION_MS = 200;
1058
1182
  var SelectRoot = (props) => {
1059
1183
  const {
@@ -1063,6 +1187,7 @@ var SelectRoot = (props) => {
1063
1187
  children,
1064
1188
  disabled = false,
1065
1189
  error = false,
1190
+ validations,
1066
1191
  size = "md"
1067
1192
  } = props;
1068
1193
  const itemChildren = React5.Children.toArray(children).filter(
@@ -1133,32 +1258,32 @@ var SelectRoot = (props) => {
1133
1258
  if (disabled) return;
1134
1259
  toggle();
1135
1260
  };
1136
- return /* @__PURE__ */ jsx296(context_default.Provider, { value: ctxValue, children: /* @__PURE__ */ jsxs189(
1261
+ const control = /* @__PURE__ */ jsx297(context_default.Provider, { value: ctxValue, children: /* @__PURE__ */ jsxs190(
1137
1262
  "div",
1138
1263
  {
1139
1264
  className: clsx_default(
1140
1265
  "lib-xplat-select",
1141
1266
  size,
1142
1267
  disabled && "disabled",
1143
- error && "error",
1268
+ (error || hasError(validations)) && "error",
1144
1269
  mounted && "is-open"
1145
1270
  ),
1146
1271
  children: [
1147
- /* @__PURE__ */ jsxs189(
1272
+ /* @__PURE__ */ jsxs190(
1148
1273
  "div",
1149
1274
  {
1150
1275
  ref: triggerRef,
1151
1276
  className: clsx_default(
1152
1277
  "select-trigger",
1153
1278
  disabled && "disabled",
1154
- error && "error"
1279
+ (error || hasError(validations)) && "error"
1155
1280
  ),
1156
1281
  onClick: handleTriggerClick,
1157
1282
  role: "combobox",
1158
1283
  "aria-expanded": isOpen,
1159
1284
  "aria-haspopup": "listbox",
1160
1285
  "aria-disabled": disabled,
1161
- "aria-invalid": error,
1286
+ "aria-invalid": error || hasError(validations) || void 0,
1162
1287
  tabIndex: disabled ? -1 : 0,
1163
1288
  onKeyDown: (e) => {
1164
1289
  if (disabled) return;
@@ -1168,7 +1293,7 @@ var SelectRoot = (props) => {
1168
1293
  }
1169
1294
  },
1170
1295
  children: [
1171
- /* @__PURE__ */ jsx296(
1296
+ /* @__PURE__ */ jsx297(
1172
1297
  "span",
1173
1298
  {
1174
1299
  className: clsx_default(
@@ -1178,30 +1303,31 @@ var SelectRoot = (props) => {
1178
1303
  children: selectedLabel ?? placeholder
1179
1304
  }
1180
1305
  ),
1181
- /* @__PURE__ */ jsx296(
1306
+ /* @__PURE__ */ jsx297(
1182
1307
  "span",
1183
1308
  {
1184
1309
  className: clsx_default("select-trigger-icon", isOpen && "open"),
1185
1310
  "aria-hidden": true,
1186
- children: /* @__PURE__ */ jsx296(ChevronDownIcon_default, {})
1311
+ children: /* @__PURE__ */ jsx297(ChevronDownIcon_default, {})
1187
1312
  }
1188
1313
  )
1189
1314
  ]
1190
1315
  }
1191
1316
  ),
1192
- mounted && /* @__PURE__ */ jsx296(Portal_default, { children: /* @__PURE__ */ jsx296(
1317
+ mounted && /* @__PURE__ */ jsx297(Portal_default, { children: /* @__PURE__ */ jsx297(
1193
1318
  "div",
1194
1319
  {
1195
1320
  className: clsx_default("lib-xplat-select-content", size, position.direction, stateClass),
1196
1321
  ref: contentRef,
1197
1322
  style: { ...position.position, width: triggerRef.current?.offsetWidth },
1198
1323
  role: "listbox",
1199
- children: /* @__PURE__ */ jsx296(context_default.Provider, { value: ctxValue, children: itemChildren })
1324
+ children: /* @__PURE__ */ jsx297(context_default.Provider, { value: ctxValue, children: itemChildren })
1200
1325
  }
1201
1326
  ) })
1202
1327
  ]
1203
1328
  }
1204
1329
  ) });
1330
+ return /* @__PURE__ */ jsx297(Field, { validations, children: control });
1205
1331
  };
1206
1332
  SelectRoot.displayName = "Select";
1207
1333
  var Select = Object.assign(SelectRoot, {
@@ -53,8 +53,141 @@ function clsx() {
53
53
  }
54
54
  var clsx_default = clsx;
55
55
 
56
- // src/components/Switch/Switch.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/Switch/Switch.tsx
190
+ var import_jsx_runtime5 = require("react/jsx-runtime");
58
191
  var KNOB_TRANSITION_MS = 250;
59
192
  var Switch = (props) => {
60
193
  const {
@@ -62,7 +195,8 @@ var Switch = (props) => {
62
195
  size = "md",
63
196
  type = "brand",
64
197
  disabled,
65
- onChange
198
+ onChange,
199
+ validations
66
200
  } = props;
67
201
  const [isAnimating, setIsAnimating] = import_react.default.useState(false);
68
202
  const timeoutRef = import_react.default.useRef(null);
@@ -81,7 +215,7 @@ var Switch = (props) => {
81
215
  timeoutRef.current = null;
82
216
  }, KNOB_TRANSITION_MS);
83
217
  };
84
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
218
+ const control = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
85
219
  "div",
86
220
  {
87
221
  className: clsx_default(
@@ -93,10 +227,12 @@ var Switch = (props) => {
93
227
  isAnimating && "animating"
94
228
  ),
95
229
  onClick: handleClick,
230
+ "aria-invalid": hasError(validations) || void 0,
96
231
  "aria-disabled": disabled || isAnimating,
97
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: clsx_default("knob", value ? "checked" : void 0) })
232
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: clsx_default("knob", value ? "checked" : void 0) })
98
233
  }
99
234
  );
235
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Field, { validations, children: control });
100
236
  };
101
237
  Switch.displayName = "Switch";
102
238
  var Switch_default = Switch;
@@ -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/Switch/switch.scss */
2
40
  .lib-xplat-switch {
3
41
  position: relative;
@@ -1,9 +1,12 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { V as Validation } from '../../validation-Dqo1zqhT.cjs';
2
3
 
3
4
  type SwitchSize = "sm" | "md" | "lg";
4
5
  type SwitchType = "brand" | "success" | "error" | "warning" | "info";
5
6
  interface SwitchProps {
6
7
  value: boolean;
8
+ /** 컨트롤 아래에 표시할 검증 메시지. DS 폼 컴포넌트 공통 */
9
+ validations?: Validation[];
7
10
  size?: SwitchSize;
8
11
  type?: SwitchType;
9
12
  disabled?: boolean;
@@ -1,9 +1,12 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { V as Validation } from '../../validation-Dqo1zqhT.js';
2
3
 
3
4
  type SwitchSize = "sm" | "md" | "lg";
4
5
  type SwitchType = "brand" | "success" | "error" | "warning" | "info";
5
6
  interface SwitchProps {
6
7
  value: boolean;
8
+ /** 컨트롤 아래에 표시할 검증 메시지. DS 폼 컴포넌트 공통 */
9
+ validations?: Validation[];
7
10
  size?: SwitchSize;
8
11
  type?: SwitchType;
9
12
  disabled?: boolean;