sellmate-design-system-react 0.1.3 → 0.1.4

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 (165) hide show
  1. package/dist/components/SActionModal/SActionModal.cjs +129 -1
  2. package/dist/components/SActionModal/SActionModal.cjs.map +1 -1
  3. package/dist/components/SActionModal/SActionModal.js +129 -1
  4. package/dist/components/SActionModal/SActionModal.js.map +1 -1
  5. package/dist/components/SBarcodeInput/SBarcodeInput.cjs +156 -3
  6. package/dist/components/SBarcodeInput/SBarcodeInput.cjs.map +1 -1
  7. package/dist/components/SBarcodeInput/SBarcodeInput.js +157 -4
  8. package/dist/components/SBarcodeInput/SBarcodeInput.js.map +1 -1
  9. package/dist/components/SButton/SButton.cjs +129 -1
  10. package/dist/components/SButton/SButton.cjs.map +1 -1
  11. package/dist/components/SButton/SButton.js +129 -1
  12. package/dist/components/SButton/SButton.js.map +1 -1
  13. package/dist/components/SCalendar/SCalendar.cjs +131 -3
  14. package/dist/components/SCalendar/SCalendar.cjs.map +1 -1
  15. package/dist/components/SCalendar/SCalendar.d.ts +3 -1
  16. package/dist/components/SCalendar/SCalendar.js +131 -3
  17. package/dist/components/SCalendar/SCalendar.js.map +1 -1
  18. package/dist/components/SCallout/SCallout.cjs +129 -1
  19. package/dist/components/SCallout/SCallout.cjs.map +1 -1
  20. package/dist/components/SCallout/SCallout.js +129 -1
  21. package/dist/components/SCallout/SCallout.js.map +1 -1
  22. package/dist/components/SCheckbox/SCheckbox.cjs +129 -1
  23. package/dist/components/SCheckbox/SCheckbox.cjs.map +1 -1
  24. package/dist/components/SCheckbox/SCheckbox.js +129 -1
  25. package/dist/components/SCheckbox/SCheckbox.js.map +1 -1
  26. package/dist/components/SChip/SChip.cjs +130 -3
  27. package/dist/components/SChip/SChip.cjs.map +1 -1
  28. package/dist/components/SChip/SChip.js +130 -3
  29. package/dist/components/SChip/SChip.js.map +1 -1
  30. package/dist/components/SChipInput/SChipInput.cjs +153 -3
  31. package/dist/components/SChipInput/SChipInput.cjs.map +1 -1
  32. package/dist/components/SChipInput/SChipInput.js +153 -3
  33. package/dist/components/SChipInput/SChipInput.js.map +1 -1
  34. package/dist/components/SConfirmModal/SConfirmModal.cjs +129 -1
  35. package/dist/components/SConfirmModal/SConfirmModal.cjs.map +1 -1
  36. package/dist/components/SConfirmModal/SConfirmModal.js +129 -1
  37. package/dist/components/SConfirmModal/SConfirmModal.js.map +1 -1
  38. package/dist/components/SDatePicker/SDatePicker.cjs +158 -5
  39. package/dist/components/SDatePicker/SDatePicker.cjs.map +1 -1
  40. package/dist/components/SDatePicker/SDatePicker.js +158 -5
  41. package/dist/components/SDatePicker/SDatePicker.js.map +1 -1
  42. package/dist/components/SDateRangePicker/SDateRangePicker.cjs +156 -3
  43. package/dist/components/SDateRangePicker/SDateRangePicker.cjs.map +1 -1
  44. package/dist/components/SDateRangePicker/SDateRangePicker.js +156 -3
  45. package/dist/components/SDateRangePicker/SDateRangePicker.js.map +1 -1
  46. package/dist/components/SDropdownButton/SDropdownButton.cjs +129 -1
  47. package/dist/components/SDropdownButton/SDropdownButton.cjs.map +1 -1
  48. package/dist/components/SDropdownButton/SDropdownButton.js +129 -1
  49. package/dist/components/SDropdownButton/SDropdownButton.js.map +1 -1
  50. package/dist/components/SField/SField.cjs +129 -1
  51. package/dist/components/SField/SField.cjs.map +1 -1
  52. package/dist/components/SField/SField.js +129 -1
  53. package/dist/components/SField/SField.js.map +1 -1
  54. package/dist/components/SFilePicker/SFilePicker.cjs +156 -3
  55. package/dist/components/SFilePicker/SFilePicker.cjs.map +1 -1
  56. package/dist/components/SFilePicker/SFilePicker.js +156 -3
  57. package/dist/components/SFilePicker/SFilePicker.js.map +1 -1
  58. package/dist/components/SForm/SForm.cjs +91 -0
  59. package/dist/components/SForm/SForm.cjs.map +1 -0
  60. package/dist/components/SForm/SForm.d.ts +33 -0
  61. package/dist/components/SForm/SForm.js +89 -0
  62. package/dist/components/SForm/SForm.js.map +1 -0
  63. package/dist/components/SForm/index.d.ts +1 -0
  64. package/dist/components/SGhostButton/SGhostButton.cjs +129 -1
  65. package/dist/components/SGhostButton/SGhostButton.cjs.map +1 -1
  66. package/dist/components/SGhostButton/SGhostButton.js +129 -1
  67. package/dist/components/SGhostButton/SGhostButton.js.map +1 -1
  68. package/dist/components/SGuide/SGuide.cjs +129 -1
  69. package/dist/components/SGuide/SGuide.cjs.map +1 -1
  70. package/dist/components/SGuide/SGuide.js +129 -1
  71. package/dist/components/SGuide/SGuide.js.map +1 -1
  72. package/dist/components/SIcon/SIcon.cjs +129 -1
  73. package/dist/components/SIcon/SIcon.cjs.map +1 -1
  74. package/dist/components/SIcon/SIcon.d.ts +3 -2
  75. package/dist/components/SIcon/SIcon.js +129 -1
  76. package/dist/components/SIcon/SIcon.js.map +1 -1
  77. package/dist/components/SInput/SInput.cjs +156 -3
  78. package/dist/components/SInput/SInput.cjs.map +1 -1
  79. package/dist/components/SInput/SInput.js +157 -4
  80. package/dist/components/SInput/SInput.js.map +1 -1
  81. package/dist/components/SKeyValueTable/SKeyValueTable.cjs +212 -5
  82. package/dist/components/SKeyValueTable/SKeyValueTable.cjs.map +1 -1
  83. package/dist/components/SKeyValueTable/SKeyValueTable.js +212 -5
  84. package/dist/components/SKeyValueTable/SKeyValueTable.js.map +1 -1
  85. package/dist/components/SLoadingModal/SLoadingModal.cjs +129 -1
  86. package/dist/components/SLoadingModal/SLoadingModal.cjs.map +1 -1
  87. package/dist/components/SLoadingModal/SLoadingModal.js +129 -1
  88. package/dist/components/SLoadingModal/SLoadingModal.js.map +1 -1
  89. package/dist/components/SModalContainer/SModalContainer.cjs +129 -1
  90. package/dist/components/SModalContainer/SModalContainer.cjs.map +1 -1
  91. package/dist/components/SModalContainer/SModalContainer.js +129 -1
  92. package/dist/components/SModalContainer/SModalContainer.js.map +1 -1
  93. package/dist/components/SNumberInput/SNumberInput.cjs +156 -3
  94. package/dist/components/SNumberInput/SNumberInput.cjs.map +1 -1
  95. package/dist/components/SNumberInput/SNumberInput.js +156 -3
  96. package/dist/components/SNumberInput/SNumberInput.js.map +1 -1
  97. package/dist/components/SPagination/SPagination.cjs +129 -1
  98. package/dist/components/SPagination/SPagination.cjs.map +1 -1
  99. package/dist/components/SPagination/SPagination.js +129 -1
  100. package/dist/components/SPagination/SPagination.js.map +1 -1
  101. package/dist/components/SPopover/SPopover.cjs +129 -1
  102. package/dist/components/SPopover/SPopover.cjs.map +1 -1
  103. package/dist/components/SPopover/SPopover.d.ts +3 -1
  104. package/dist/components/SPopover/SPopover.js +129 -1
  105. package/dist/components/SPopover/SPopover.js.map +1 -1
  106. package/dist/components/SPopup/SPopup.cjs +129 -1
  107. package/dist/components/SPopup/SPopup.cjs.map +1 -1
  108. package/dist/components/SPopup/SPopup.js +129 -1
  109. package/dist/components/SPopup/SPopup.js.map +1 -1
  110. package/dist/components/SSelect/SSelect.cjs +156 -3
  111. package/dist/components/SSelect/SSelect.cjs.map +1 -1
  112. package/dist/components/SSelect/SSelect.js +157 -4
  113. package/dist/components/SSelect/SSelect.js.map +1 -1
  114. package/dist/components/STable/STable.cjs +156 -3
  115. package/dist/components/STable/STable.cjs.map +1 -1
  116. package/dist/components/STable/STable.d.ts +3 -1
  117. package/dist/components/STable/STable.js +156 -3
  118. package/dist/components/STable/STable.js.map +1 -1
  119. package/dist/components/STabs/STabs.cjs +129 -1
  120. package/dist/components/STabs/STabs.cjs.map +1 -1
  121. package/dist/components/STabs/STabs.js +129 -1
  122. package/dist/components/STabs/STabs.js.map +1 -1
  123. package/dist/components/STag/STag.cjs +129 -1
  124. package/dist/components/STag/STag.cjs.map +1 -1
  125. package/dist/components/STag/STag.js +129 -1
  126. package/dist/components/STag/STag.js.map +1 -1
  127. package/dist/components/STextLink/STextLink.cjs +129 -1
  128. package/dist/components/STextLink/STextLink.cjs.map +1 -1
  129. package/dist/components/STextLink/STextLink.d.ts +3 -2
  130. package/dist/components/STextLink/STextLink.js +129 -1
  131. package/dist/components/STextLink/STextLink.js.map +1 -1
  132. package/dist/components/STextarea/STextarea.cjs +156 -3
  133. package/dist/components/STextarea/STextarea.cjs.map +1 -1
  134. package/dist/components/STextarea/STextarea.js +157 -4
  135. package/dist/components/STextarea/STextarea.js.map +1 -1
  136. package/dist/components/SToast/SToast.cjs +129 -1
  137. package/dist/components/SToast/SToast.cjs.map +1 -1
  138. package/dist/components/SToast/SToast.js +129 -1
  139. package/dist/components/SToast/SToast.js.map +1 -1
  140. package/dist/components/SToast/SToastContainer.cjs +129 -1
  141. package/dist/components/SToast/SToastContainer.cjs.map +1 -1
  142. package/dist/components/SToast/SToastContainer.js +129 -1
  143. package/dist/components/SToast/SToastContainer.js.map +1 -1
  144. package/dist/components/STooltip/STooltip.cjs +129 -1
  145. package/dist/components/STooltip/STooltip.cjs.map +1 -1
  146. package/dist/components/STooltip/STooltip.d.ts +3 -1
  147. package/dist/components/STooltip/STooltip.js +129 -1
  148. package/dist/components/STooltip/STooltip.js.map +1 -1
  149. package/dist/index.cjs +306 -5
  150. package/dist/index.cjs.map +1 -1
  151. package/dist/index.d.ts +2 -0
  152. package/dist/index.js +303 -6
  153. package/dist/index.js.map +1 -1
  154. package/dist/lib/color.cjs +135 -0
  155. package/dist/lib/color.cjs.map +1 -0
  156. package/dist/lib/color.d.ts +28 -0
  157. package/dist/lib/color.js +131 -0
  158. package/dist/lib/color.js.map +1 -0
  159. package/dist/lib/form.cjs +23 -0
  160. package/dist/lib/form.cjs.map +1 -1
  161. package/dist/lib/form.d.ts +25 -0
  162. package/dist/lib/form.js +21 -1
  163. package/dist/lib/form.js.map +1 -1
  164. package/dist/styles.css +25 -0
  165. package/package.json +1 -1
@@ -36,6 +36,134 @@ var RTooltip__namespace = /*#__PURE__*/_interopNamespace(RTooltip);
36
36
  function cn(...inputs) {
37
37
  return tailwindMerge.twMerge(clsx.clsx(inputs));
38
38
  }
39
+
40
+ // src/lib/color.ts
41
+ var COLOR_KEYS = [
42
+ "white",
43
+ "black",
44
+ "grey_10",
45
+ "grey_20",
46
+ "grey_25",
47
+ "grey_30",
48
+ "grey_35",
49
+ "grey_45",
50
+ "grey_50",
51
+ "grey_55",
52
+ "grey_60",
53
+ "grey_65",
54
+ "grey_70",
55
+ "grey_80",
56
+ "grey_85",
57
+ "grey_90",
58
+ "grey_95",
59
+ "grey_05",
60
+ "red_15",
61
+ "red_20",
62
+ "red_30",
63
+ "red_45",
64
+ "red_60",
65
+ "red_70",
66
+ "red_75",
67
+ "red_80",
68
+ "red_85",
69
+ "red_90",
70
+ "red_95",
71
+ "red_99",
72
+ "orange_10",
73
+ "orange_20",
74
+ "orange_35",
75
+ "orange_45",
76
+ "orange_55",
77
+ "orange_60",
78
+ "orange_65",
79
+ "orange_75",
80
+ "orange_85",
81
+ "orange_90",
82
+ "orange_95",
83
+ "orange_99",
84
+ "yellow_10",
85
+ "yellow_20",
86
+ "yellow_25",
87
+ "yellow_30",
88
+ "yellow_40",
89
+ "yellow_45",
90
+ "yellow_50",
91
+ "yellow_60",
92
+ "yellow_70",
93
+ "yellow_80",
94
+ "yellow_90",
95
+ "yellow_95",
96
+ "olive_10",
97
+ "olive_15",
98
+ "olive_20",
99
+ "olive_30",
100
+ "olive_45",
101
+ "olive_55",
102
+ "olive_65",
103
+ "olive_70",
104
+ "olive_80",
105
+ "olive_90",
106
+ "olive_95",
107
+ "olive_05",
108
+ "green_15",
109
+ "green_25",
110
+ "green_45",
111
+ "green_55",
112
+ "green_65",
113
+ "green_70",
114
+ "green_75",
115
+ "green_80",
116
+ "green_85",
117
+ "green_90",
118
+ "green_95",
119
+ "green_99",
120
+ "steelblue_10",
121
+ "steelblue_25",
122
+ "steelblue_45",
123
+ "steelblue_60",
124
+ "steelblue_65",
125
+ "steelblue_70",
126
+ "steelblue_75",
127
+ "steelblue_80",
128
+ "steelblue_85",
129
+ "steelblue_90",
130
+ "steelblue_95",
131
+ "steelblue_99",
132
+ "oceanblue_15",
133
+ "oceanblue_25",
134
+ "oceanblue_50",
135
+ "oceanblue_60",
136
+ "oceanblue_65",
137
+ "oceanblue_70",
138
+ "oceanblue_75",
139
+ "oceanblue_80",
140
+ "oceanblue_85",
141
+ "oceanblue_90",
142
+ "oceanblue_95",
143
+ "oceanblue_99",
144
+ "brilliantblue_10",
145
+ "brilliantblue_20",
146
+ "brilliantblue_25",
147
+ "brilliantblue_40",
148
+ "brilliantblue_50",
149
+ "brilliantblue_60",
150
+ "brilliantblue_70",
151
+ "brilliantblue_75",
152
+ "brilliantblue_80",
153
+ "brilliantblue_85",
154
+ "brilliantblue_90",
155
+ "brilliantblue_95",
156
+ "brilliantblue_99",
157
+ "brilliantblue_05"
158
+ ];
159
+ var KEY_SET = new Set(COLOR_KEYS);
160
+ function isColorKey(input) {
161
+ return KEY_SET.has(input);
162
+ }
163
+ function resolveColor(input, fallback) {
164
+ if (input === null || input === void 0 || input === "") return fallback;
165
+ return isColorKey(input) ? `var(--color-${input.replace(/_/g, "-")})` : input;
166
+ }
39
167
  var Icon_add = (p) => {
40
168
  const { size = 24, ...rest } = p;
41
169
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -2735,7 +2863,7 @@ var SIcon = react.forwardRef(function SIcon2({ name, size = 24, color, rotate, l
2735
2863
  {
2736
2864
  ref,
2737
2865
  className: cn("inline-flex items-center justify-center", rotateClass, className),
2738
- style: { color, ...style },
2866
+ style: { color: resolveColor(color), ...style },
2739
2867
  role: label ? "img" : void 0,
2740
2868
  "aria-label": label,
2741
2869
  "aria-hidden": label ? void 0 : true,
@@ -3048,8 +3176,6 @@ var SButton = react.forwardRef(function SButton2({
3048
3176
  }
3049
3177
  );
3050
3178
  });
3051
-
3052
- // src/lib/form.ts
3053
3179
  function runRules(value, rules) {
3054
3180
  if (!rules || rules.length === 0) return "";
3055
3181
  for (const rule of rules) {
@@ -3058,6 +3184,24 @@ function runRules(value, rules) {
3058
3184
  }
3059
3185
  return "";
3060
3186
  }
3187
+ var FormContext = react.createContext(null);
3188
+ function useFormContext() {
3189
+ return react.useContext(FormContext);
3190
+ }
3191
+ function useFormField(field) {
3192
+ const ctx = useFormContext();
3193
+ const cbRef = react.useRef(field);
3194
+ cbRef.current = field;
3195
+ const name = field.name ?? "";
3196
+ react.useEffect(() => {
3197
+ if (!ctx) return;
3198
+ return ctx.register({
3199
+ name,
3200
+ validate: () => cbRef.current.validate(),
3201
+ resetValidation: () => cbRef.current.resetValidation()
3202
+ });
3203
+ }, [ctx, name]);
3204
+ }
3061
3205
  var FIELD_SIZE = {
3062
3206
  sm: { height: 28, radius: 4, fieldGap: 12, labelGap: 6, fontSize: 12, lineHeight: 20, icon: 12 },
3063
3207
  md: { height: 36, radius: 6, fieldGap: 16, labelGap: 8, fontSize: 14, lineHeight: 24, icon: 12 }
@@ -3242,6 +3386,15 @@ var SInput = react.forwardRef(function SInput2({
3242
3386
  const isPassword = type === "password";
3243
3387
  const inputType = isPassword ? visible ? "text" : "password" : type;
3244
3388
  const hasValue = value !== void 0 && value !== null && String(value) !== "";
3389
+ useFormField({
3390
+ name: rest.name,
3391
+ validate: () => {
3392
+ const msg = runRules(value, rules);
3393
+ setRuleError(msg);
3394
+ return msg === "";
3395
+ },
3396
+ resetValidation: () => setRuleError("")
3397
+ });
3245
3398
  const resolvedError = error || ruleError !== "";
3246
3399
  const resolvedErrorMessage = ruleError !== "" ? ruleError : errorMessage;
3247
3400
  const resolvedStatus = status ?? (rules && rules.length > 0 ? ruleError !== "" ? "error" : void 0 : void 0);
@@ -3372,6 +3525,15 @@ var STextarea = react.forwardRef(function STextarea2({
3372
3525
  }, ref) {
3373
3526
  const p = PAD;
3374
3527
  const [ruleError, setRuleError] = react.useState("");
3528
+ useFormField({
3529
+ name: rest.name,
3530
+ validate: () => {
3531
+ const msg = runRules(value, rules);
3532
+ setRuleError(msg);
3533
+ return msg === "";
3534
+ },
3535
+ resetValidation: () => setRuleError("")
3536
+ });
3375
3537
  const resolvedError = error || ruleError !== "";
3376
3538
  const resolvedErrorMessage = ruleError !== "" ? ruleError : errorMessage;
3377
3539
  const resolvedStatus = status ?? (rules && rules.length > 0 ? ruleError !== "" ? "error" : void 0 : void 0);
@@ -3505,6 +3667,15 @@ var SNumberInput = react.forwardRef(function SNumberInput2({
3505
3667
  react.useEffect(() => {
3506
3668
  setDisplay(formatWithCommas(toNumber(value)));
3507
3669
  }, [value]);
3670
+ useFormField({
3671
+ name,
3672
+ validate: () => {
3673
+ const msg = runRules(numValue, rules);
3674
+ setRuleError(msg);
3675
+ return msg === "";
3676
+ },
3677
+ resetValidation: () => setRuleError("")
3678
+ });
3508
3679
  const resolvedError = error || ruleError !== "";
3509
3680
  const resolvedStatus = status ?? (rules && rules.length > 0 ? ruleError !== "" ? "error" : void 0 : void 0);
3510
3681
  const emit = (n) => {
@@ -3816,6 +3987,15 @@ var SSelect = react.forwardRef(function SSelect2({
3816
3987
  const arr = Array.isArray(value) ? value : [value];
3817
3988
  return arr.map((v) => v != null && typeof v === "object" ? v.value : v).filter((v) => v != null && v !== "").map(String);
3818
3989
  }, [value]);
3990
+ useFormField({
3991
+ name,
3992
+ validate: () => {
3993
+ const msg = runRules(multi ? selected : selected[0] ?? "", rules);
3994
+ setRuleError(msg);
3995
+ return msg === "";
3996
+ },
3997
+ resetValidation: () => setRuleError("")
3998
+ });
3819
3999
  const emit = (next) => {
3820
4000
  if (!onValueChange) return;
3821
4001
  const mapped = next.map(
@@ -4593,7 +4773,7 @@ function SCalendar({
4593
4773
  "span",
4594
4774
  {
4595
4775
  className: "h-[var(--cmp-datepicker-calendar-day-dot-size)] w-[var(--cmp-datepicker-calendar-day-dot-size)] rounded-full",
4596
- style: { backgroundColor: ev.color }
4776
+ style: { backgroundColor: resolveColor(ev.color) }
4597
4777
  },
4598
4778
  i
4599
4779
  ))
@@ -4621,7 +4801,7 @@ function SCalendar({
4621
4801
  "span",
4622
4802
  {
4623
4803
  className: "h-[var(--cmp-datepicker-calendar-day-dot-size)] w-[var(--cmp-datepicker-calendar-day-dot-size)] rounded-full",
4624
- style: { backgroundColor: item.color },
4804
+ style: { backgroundColor: resolveColor(item.color) },
4625
4805
  "aria-hidden": true
4626
4806
  }
4627
4807
  ),
@@ -4665,6 +4845,15 @@ function SDatePicker({
4665
4845
  const [focused, setFocused] = react.useState(false);
4666
4846
  const [ruleError, setRuleError] = react.useState("");
4667
4847
  const hasValue = value != null && value !== "";
4848
+ useFormField({
4849
+ name,
4850
+ validate: () => {
4851
+ const msg = runRules(value, rules);
4852
+ setRuleError(msg);
4853
+ return msg === "";
4854
+ },
4855
+ resetValidation: () => setRuleError("")
4856
+ });
4668
4857
  const resolvedError = error || ruleError !== "";
4669
4858
  const resolvedStatus = status ?? (rules && rules.length > 0 ? ruleError !== "" ? "error" : void 0 : void 0);
4670
4859
  const dims = size === "md" ? { padX: 16, gap: 12, icon: 20, minW: 104, fontSize: 14, lineHeight: 24, radius: 6 } : { padX: 12, gap: 8, icon: 16, minW: 80, fontSize: 12, lineHeight: 20, radius: 4 };
@@ -4950,6 +5139,15 @@ function SDateRangePicker({
4950
5139
  const [ruleError, setRuleError] = react.useState("");
4951
5140
  const hasValue = value != null && value[0] !== "" && value[1] !== "";
4952
5141
  const display = hasValue ? `${value[0]} ~ ${value[1]}` : placeholder;
5142
+ useFormField({
5143
+ name,
5144
+ validate: () => {
5145
+ const msg = runRules(value, rules);
5146
+ setRuleError(msg);
5147
+ return msg === "";
5148
+ },
5149
+ resetValidation: () => setRuleError("")
5150
+ });
4953
5151
  const resolvedError = error || ruleError !== "";
4954
5152
  const resolvedStatus = status ?? (rules && rules.length > 0 ? ruleError !== "" ? "error" : void 0 : void 0);
4955
5153
  const dims = size === "md" ? { padX: 16, gap: 12, icon: 20, minW: 104, fontSize: 14, lineHeight: 24, radius: 6 } : { padX: 12, gap: 8, icon: 16, minW: 80, fontSize: 12, lineHeight: 20, radius: 4 };
@@ -5214,6 +5412,15 @@ function SFilePicker({
5214
5412
  const files = multiple ? Array.isArray(value) ? value : [] : value && !Array.isArray(value) ? value : null;
5215
5413
  const hasSingle = !multiple && !!files;
5216
5414
  const displayText = hasSingle ? files.name : placeholder;
5415
+ useFormField({
5416
+ name,
5417
+ validate: () => {
5418
+ const msg = runRules(files, rules);
5419
+ setRuleError(msg);
5420
+ return msg === "";
5421
+ },
5422
+ resetValidation: () => setRuleError("")
5423
+ });
5217
5424
  const validate = (arr, existing = 0) => {
5218
5425
  const mfs = toBytes(maxFileSize), mts = toBytes(maxTotalSize), mf = maxFiles != null ? Number(maxFiles) : void 0;
5219
5426
  if (mf != null && existing + arr.length > mf)