@react-fabric/form 1.0.0-beta.9 → 1.0.2

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 (215) hide show
  1. package/{src/input/ArrayInput.module.css → css/_arrayInput.css} +8 -8
  2. package/css/_colorPicker.css +95 -0
  3. package/{src/internal/Field.module.css → css/_field.css} +94 -33
  4. package/{src/input/File.module.css → css/_file.css} +21 -6
  5. package/css/styles.css +27 -0
  6. package/dist/cjs/builder/FileField.js +107 -78
  7. package/dist/cjs/builder/FormField.js +60 -39
  8. package/dist/cjs/builder/SchemaEditor.js +72 -0
  9. package/dist/cjs/builder/components/AddSchemaFields.js +64 -0
  10. package/dist/cjs/builder/components/SchemaArrayForm.js +146 -0
  11. package/dist/cjs/builder/components/SchemaField.js +423 -0
  12. package/dist/cjs/form/Controller.js +66 -19
  13. package/dist/cjs/form/Form.js +97 -39
  14. package/dist/cjs/form/useForm.js +32 -0
  15. package/dist/cjs/hooks/useFileUploader.js +74 -45
  16. package/dist/cjs/hooks/useFormBuilder.js +85 -31
  17. package/dist/cjs/i18n/{ar.json.js → ar/form.json.js} +5 -4
  18. package/dist/cjs/i18n/{en.json.js → en/form.json.js} +5 -5
  19. package/dist/cjs/i18n/index.js +4 -4
  20. package/dist/cjs/index.js +41 -2
  21. package/dist/cjs/input/ArrayInput.js +259 -135
  22. package/dist/cjs/input/AvatarInput.js +99 -63
  23. package/dist/cjs/input/Checkbox.js +24 -25
  24. package/dist/cjs/input/ColorInput.js +138 -81
  25. package/dist/cjs/input/ColorPicker.js +78 -95
  26. package/dist/cjs/input/DateInput.js +192 -0
  27. package/dist/cjs/input/Field.js +21 -20
  28. package/dist/cjs/input/File.js +85 -80
  29. package/dist/cjs/input/Hidden.js +27 -13
  30. package/dist/cjs/input/Input.js +49 -48
  31. package/dist/cjs/input/Number.js +46 -44
  32. package/dist/cjs/input/Password.js +51 -49
  33. package/dist/cjs/input/Radio.js +26 -16
  34. package/dist/cjs/input/RadioGroup.js +26 -11
  35. package/dist/cjs/input/{Range.js → RangeSlider.js} +61 -66
  36. package/dist/cjs/input/Search.js +58 -64
  37. package/dist/cjs/input/Slider.js +57 -66
  38. package/dist/cjs/input/Switch.js +29 -27
  39. package/dist/cjs/input/Textarea.js +65 -53
  40. package/dist/cjs/internal/ErrorIcon.js +9 -9
  41. package/dist/cjs/internal/FieldWrapper.js +23 -13
  42. package/dist/cjs/internal/InputWrapper.js +85 -87
  43. package/dist/cjs/ranger/index.js +7 -7
  44. package/dist/cjs/ranger/utils.js +9 -4
  45. package/dist/cjs/select/AutoComplete.js +93 -76
  46. package/dist/cjs/select/DualList.js +235 -154
  47. package/dist/cjs/select/List.js +122 -89
  48. package/dist/cjs/select/Options.js +58 -54
  49. package/dist/cjs/select/Select.js +119 -89
  50. package/dist/cjs/select/helpers.js +5 -5
  51. package/dist/cjs/select/useSelect.js +83 -58
  52. package/dist/cjs/types/schema.js +43 -0
  53. package/dist/cjs/utils/eventHandlers.js +16 -6
  54. package/dist/cjs/utils/getColor.js +6 -6
  55. package/dist/cjs/utils/getProps.js +49 -0
  56. package/dist/esm/builder/FileField.js +109 -80
  57. package/dist/esm/builder/FormField.js +60 -39
  58. package/dist/esm/builder/SchemaEditor.js +72 -0
  59. package/dist/esm/builder/components/AddSchemaFields.js +64 -0
  60. package/dist/esm/builder/components/SchemaArrayForm.js +146 -0
  61. package/dist/esm/builder/components/SchemaField.js +423 -0
  62. package/dist/esm/form/Controller.js +66 -19
  63. package/dist/esm/form/Form.js +97 -39
  64. package/dist/esm/form/useForm.js +32 -0
  65. package/dist/esm/hooks/useFileUploader.js +75 -46
  66. package/dist/esm/hooks/useFormBuilder.js +84 -30
  67. package/dist/esm/i18n/{ar.json.js → ar/form.json.js} +5 -4
  68. package/dist/esm/i18n/{en.json.js → en/form.json.js} +5 -5
  69. package/dist/esm/i18n/index.js +2 -2
  70. package/dist/esm/index.js +36 -1
  71. package/dist/esm/input/ArrayInput.js +260 -136
  72. package/dist/esm/input/AvatarInput.js +99 -63
  73. package/dist/esm/input/Checkbox.js +26 -27
  74. package/dist/esm/input/ColorInput.js +141 -84
  75. package/dist/esm/input/ColorPicker.js +80 -97
  76. package/dist/esm/input/DateInput.js +192 -0
  77. package/dist/esm/input/Field.js +21 -20
  78. package/dist/esm/input/File.js +89 -84
  79. package/dist/esm/input/Hidden.js +28 -14
  80. package/dist/esm/input/Input.js +51 -50
  81. package/dist/esm/input/Number.js +48 -46
  82. package/dist/esm/input/Password.js +54 -52
  83. package/dist/esm/input/Radio.js +27 -17
  84. package/dist/esm/input/RadioGroup.js +27 -12
  85. package/dist/esm/input/{Range.js → RangeSlider.js} +62 -67
  86. package/dist/esm/input/Search.js +61 -67
  87. package/dist/esm/input/Slider.js +58 -67
  88. package/dist/esm/input/Switch.js +31 -29
  89. package/dist/esm/input/Textarea.js +67 -55
  90. package/dist/esm/internal/ErrorIcon.js +11 -11
  91. package/dist/esm/internal/FieldWrapper.js +23 -13
  92. package/dist/esm/internal/InputWrapper.js +88 -90
  93. package/dist/esm/ranger/index.js +7 -7
  94. package/dist/esm/ranger/utils.js +9 -4
  95. package/dist/esm/select/AutoComplete.js +95 -78
  96. package/dist/esm/select/DualList.js +233 -152
  97. package/dist/esm/select/List.js +125 -92
  98. package/dist/esm/select/Options.js +58 -54
  99. package/dist/esm/select/Select.js +122 -92
  100. package/dist/esm/select/helpers.js +5 -5
  101. package/dist/esm/select/useSelect.js +84 -59
  102. package/{src/input/ColorPicker.module.css → dist/esm/types/schema.js} +18 -27
  103. package/dist/esm/utils/eventHandlers.js +16 -6
  104. package/dist/esm/utils/getColor.js +6 -6
  105. package/dist/esm/utils/getProps.js +49 -0
  106. package/dist/types/builder/FileField.d.ts +7 -4
  107. package/dist/types/builder/FormField.d.ts +4 -2
  108. package/dist/types/builder/SchemaEditor.d.ts +6 -0
  109. package/dist/types/builder/components/AddSchemaFields.d.ts +2 -0
  110. package/dist/types/builder/components/SchemaArrayForm.d.ts +2 -0
  111. package/dist/types/builder/components/SchemaField.d.ts +12 -0
  112. package/dist/types/form/Controller.d.ts +45 -3
  113. package/dist/types/form/Form.d.ts +38 -7
  114. package/dist/types/form/useForm.d.ts +6 -0
  115. package/dist/types/hooks/useFileUploader.d.ts +24 -3
  116. package/dist/types/hooks/useFormBuilder.d.ts +41 -3
  117. package/dist/types/index.d.ts +32 -2
  118. package/dist/types/input/ArrayInput.d.ts +68 -13
  119. package/dist/types/input/AvatarInput.d.ts +23 -6
  120. package/dist/types/input/Checkbox.d.ts +12 -10
  121. package/dist/types/input/ColorInput.d.ts +15 -5
  122. package/dist/types/input/ColorPicker.d.ts +10 -2
  123. package/dist/types/input/DateInput.d.ts +21 -0
  124. package/dist/types/input/Field.d.ts +9 -36
  125. package/dist/types/input/File.d.ts +16 -4
  126. package/dist/types/input/Hidden.d.ts +7 -6
  127. package/dist/types/input/Input.d.ts +11 -4
  128. package/dist/types/input/Number.d.ts +9 -4
  129. package/dist/types/input/Password.d.ts +9 -4
  130. package/dist/types/input/Radio.d.ts +9 -4
  131. package/dist/types/input/RadioGroup.d.ts +14 -6
  132. package/dist/types/input/{Range.d.ts → RangeSlider.d.ts} +11 -6
  133. package/dist/types/input/Search.d.ts +14 -4
  134. package/dist/types/input/Slider.d.ts +9 -6
  135. package/dist/types/input/Switch.d.ts +13 -8
  136. package/dist/types/input/Textarea.d.ts +15 -4
  137. package/dist/types/internal/ErrorIcon.d.ts +4 -1
  138. package/dist/types/internal/FieldWrapper.d.ts +10 -1
  139. package/dist/types/internal/InputWrapper.d.ts +19 -1
  140. package/dist/types/ranger/index.d.ts +7 -3
  141. package/dist/types/ranger/utils.d.ts +2 -2
  142. package/dist/types/select/AutoComplete.d.ts +7 -2
  143. package/dist/types/select/DualList.d.ts +11 -37
  144. package/dist/types/select/List.d.ts +7 -2
  145. package/dist/types/select/Options.d.ts +8 -7
  146. package/dist/types/select/Select.d.ts +7 -2
  147. package/dist/types/select/helpers.d.ts +2 -2
  148. package/dist/types/select/useSelect.d.ts +10 -28
  149. package/dist/types/types/index.d.ts +73 -39
  150. package/dist/types/types/schema.d.ts +78 -32
  151. package/dist/types/utils/eventHandlers.d.ts +4 -4
  152. package/dist/types/utils/getColor.d.ts +4 -4
  153. package/dist/types/utils/getProps.d.ts +26 -0
  154. package/dist/types/utils/index.d.ts +1 -0
  155. package/package.json +25 -25
  156. package/src/builder/FileField.tsx +73 -56
  157. package/src/builder/FormField.tsx +66 -58
  158. package/src/builder/SchemaEditor.tsx +78 -0
  159. package/src/builder/components/AddSchemaFields.tsx +64 -0
  160. package/src/builder/components/SchemaArrayForm.tsx +146 -0
  161. package/src/builder/components/SchemaField.tsx +405 -0
  162. package/src/form/Controller.tsx +61 -24
  163. package/src/form/Form.tsx +74 -50
  164. package/src/form/useForm.ts +53 -0
  165. package/src/hooks/useFileUploader.ts +115 -84
  166. package/src/hooks/useFormBuilder.tsx +80 -41
  167. package/src/i18n/{ar.json → ar/form.json} +5 -4
  168. package/src/i18n/{en.json → en/form.json} +5 -5
  169. package/src/i18n/index.ts +2 -2
  170. package/src/index.ts +34 -20
  171. package/src/input/ArrayInput.tsx +255 -173
  172. package/src/input/AvatarInput.tsx +82 -39
  173. package/src/input/Checkbox.tsx +30 -54
  174. package/src/input/ColorInput.tsx +146 -105
  175. package/src/input/ColorPicker.tsx +76 -102
  176. package/src/input/DateInput.tsx +225 -0
  177. package/src/input/Field.tsx +23 -65
  178. package/src/input/File.tsx +76 -98
  179. package/src/input/Hidden.tsx +36 -24
  180. package/src/input/Input.tsx +55 -53
  181. package/src/input/Number.tsx +49 -54
  182. package/src/input/Password.tsx +61 -66
  183. package/src/input/Radio.tsx +28 -37
  184. package/src/input/RadioGroup.tsx +30 -25
  185. package/src/input/{Range.tsx → RangeSlider.tsx} +81 -109
  186. package/src/input/Search.tsx +64 -77
  187. package/src/input/Slider.tsx +80 -109
  188. package/src/input/Switch.tsx +39 -53
  189. package/src/input/Textarea.tsx +72 -59
  190. package/src/internal/ErrorIcon.tsx +22 -21
  191. package/src/internal/FieldWrapper.tsx +33 -23
  192. package/src/internal/InputWrapper.tsx +132 -143
  193. package/src/ranger/index.tsx +37 -117
  194. package/src/ranger/utils.ts +12 -11
  195. package/src/select/AutoComplete.tsx +113 -123
  196. package/src/select/DualList.tsx +218 -204
  197. package/src/select/List.tsx +130 -97
  198. package/src/select/Options.tsx +59 -57
  199. package/src/select/Select.tsx +148 -122
  200. package/src/select/helpers.ts +13 -8
  201. package/src/select/useSelect.tsx +110 -127
  202. package/src/types/index.ts +76 -45
  203. package/src/types/schema.ts +97 -40
  204. package/src/utils/eventHandlers.ts +24 -26
  205. package/src/utils/getColor.ts +9 -8
  206. package/src/utils/getProps.ts +47 -0
  207. package/src/utils/index.ts +1 -0
  208. package/dist/cjs/input/ArrayInput.module.css +0 -1
  209. package/dist/cjs/input/ColorPicker.module.css +0 -1
  210. package/dist/cjs/input/File.module.css +0 -1
  211. package/dist/cjs/internal/Field.module.css +0 -1
  212. package/dist/esm/input/ArrayInput.module.css +0 -1
  213. package/dist/esm/input/ColorPicker.module.css +0 -1
  214. package/dist/esm/input/File.module.css +0 -1
  215. package/dist/esm/internal/Field.module.css +0 -1
@@ -1,71 +1,72 @@
1
1
  'use strict';
2
2
 
3
3
  var _defineProperty = require('@babel/runtime/helpers/defineProperty');
4
- var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
5
4
  var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
6
5
  var core = require('@react-fabric/core');
7
6
  var utilities = require('@react-fabric/utilities');
8
- var classNames = require('classnames');
9
7
  var react = require('react');
10
8
  var InputWrapper = require('../internal/InputWrapper.js');
11
9
  var eventHandlers = require('../utils/eventHandlers.js');
12
- var File_module = require('./File.module.css');
10
+ var getProps = require('../utils/getProps.js');
13
11
  var jsxRuntime = require('react/jsx-runtime');
14
12
 
15
- var _excluded = ["ref", "value", "invalid", "readOnly", "disabled", "required", "placeholder", "autoFocus", "error", "name", "accept", "showList", "multiple", "onChange", "onEnterPressed"];
16
13
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
17
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
18
- var FileExists = function FileExists(prop) {
14
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
15
+ function FileExists(prop) {
19
16
  var _useState = react.useState(false),
20
17
  _useState2 = _slicedToArray(_useState, 2),
21
18
  kill = _useState2[0],
22
19
  setKill = _useState2[1];
23
20
  react.useEffect(function () {
24
- setTimeout(function () {
21
+ var tmr = setTimeout(function () {
25
22
  setKill(true);
26
23
  }, 2000);
27
- });
24
+ return function () {
25
+ clearTimeout(tmr);
26
+ };
27
+ }, []);
28
28
  return kill ? null : /*#__PURE__*/jsxRuntime.jsxs("div", {
29
29
  className: "bg-danger-500 text-white px-2 rounded text-xs",
30
30
  children: ["File [", prop.name, "] already added to list"]
31
31
  });
32
- };
33
- var FileInput = function FileInput(_ref) {
34
- var _actualValue$map;
35
- var ref = _ref.ref,
36
- value = _ref.value,
37
- invalid = _ref.invalid,
38
- readOnly = _ref.readOnly,
39
- disabled = _ref.disabled,
40
- required = _ref.required,
41
- placeholder = _ref.placeholder,
42
- autoFocus = _ref.autoFocus,
43
- error = _ref.error,
44
- name = _ref.name,
45
- accept = _ref.accept,
46
- _ref$showList = _ref.showList,
47
- showList = _ref$showList === void 0 ? true : _ref$showList,
48
- multiple = _ref.multiple,
49
- onChange = _ref.onChange,
50
- onEnterPressed = _ref.onEnterPressed,
51
- rest = _objectWithoutProperties(_ref, _excluded);
32
+ }
33
+
34
+ /**
35
+ * File input component that allows users to select files from their system.
36
+ * It supports multiple file selection and displays a list of selected files.
37
+ * The component also provides functionality to remove files from the list.
38
+ * It handles file changes, invalid states, and read-only or disabled states.
39
+ */
40
+ function FileInput(props) {
41
+ var _currentValue$map;
42
+ var ref = props.ref,
43
+ value = props.value,
44
+ invalid = props.invalid,
45
+ readOnly = props.readOnly,
46
+ disabled = props.disabled,
47
+ placeholder = props.placeholder,
48
+ autoFocus = props.autoFocus,
49
+ error = props.error,
50
+ name = props.name,
51
+ accept = props.accept,
52
+ _props$showList = props.showList,
53
+ showList = _props$showList === void 0 ? true : _props$showList,
54
+ multiple = props.multiple,
55
+ onChange = props.onChange,
56
+ onEnterPressed = props.onEnterPressed;
52
57
  var listRef = react.useRef([]);
53
58
  var inputRef = react.useRef(null);
54
- var _useState3 = react.useState([]),
59
+ var _useState3 = react.useState(function () {
60
+ return [];
61
+ }),
55
62
  _useState4 = _slicedToArray(_useState3, 2),
56
63
  exists = _useState4[0],
57
64
  setExists = _useState4[1];
58
- var _useState5 = react.useState(),
59
- _useState6 = _slicedToArray(_useState5, 2),
60
- actualValue = _useState6[0],
61
- setActualValue = _useState6[1];
62
- var deferred = react.useDeferredValue(value);
63
- var handleEnterPressed = react.useMemo(function () {
64
- return eventHandlers.handleEnter(onEnterPressed);
65
- }, [onEnterPressed]);
66
- react.useEffect(function () {
67
- setActualValue(deferred);
68
- }, [deferred]);
65
+ var id = react.useId();
66
+ var _useControlledValue = core.useControlledValue(value, null),
67
+ currentValue = _useControlledValue.currentValue,
68
+ updateValue = _useControlledValue.updateValue;
69
+ var handleEnterPressed = eventHandlers.useHandleEnter(onEnterPressed);
69
70
  var handleChange = react.useCallback(function (e) {
70
71
  setExists([]);
71
72
  if (multiple) {
@@ -73,73 +74,77 @@ var FileInput = function FileInput(_ref) {
73
74
  if (showList) {
74
75
  var _exists = [];
75
76
  Array.from(e.target.files).forEach(function (file) {
76
- listRef.current.find(function (ef) {
77
+ if (listRef.current.find(function (ef) {
77
78
  return ef.name === file.name;
78
- }) ? _exists.push(file.name) : listRef.current.push(file);
79
+ })) _exists.push(file.name);else listRef.current.push(file);
79
80
  });
80
- setActualValue(listRef.current.slice());
81
+ updateValue(listRef.current.slice());
81
82
  setExists(_exists);
82
83
  }
83
84
  e.target.value = "";
84
85
  onChange === null || onChange === void 0 || onChange(listRef.current);
85
86
  } else {
86
87
  listRef.current = [];
87
- setActualValue(listRef.current);
88
+ updateValue(listRef.current);
88
89
  onChange === null || onChange === void 0 || onChange(listRef.current);
89
90
  }
90
91
  } else {
91
92
  var _e$target$files, _e$target$files$item, _e$target$files2;
92
- setActualValue(e === null || e === void 0 || (_e$target$files = e.target.files) === null || _e$target$files === void 0 ? void 0 : _e$target$files.item(0));
93
+ updateValue(e === null || e === void 0 || (_e$target$files = e.target.files) === null || _e$target$files === void 0 ? void 0 : _e$target$files.item(0));
93
94
  onChange === null || onChange === void 0 || onChange((_e$target$files$item = e === null || e === void 0 || (_e$target$files2 = e.target.files) === null || _e$target$files2 === void 0 ? void 0 : _e$target$files2.item(0)) !== null && _e$target$files$item !== void 0 ? _e$target$files$item : undefined);
94
95
  if (!e && inputRef.current) inputRef.current.value = "";
95
96
  }
96
- }, [onChange, multiple, showList]);
97
+ }, [multiple, showList, onChange, updateValue]);
97
98
  var removeFile = react.useCallback(function (idx) {
98
99
  listRef.current.splice(idx, 1);
99
- setActualValue(listRef.current);
100
+ updateValue(listRef.current);
100
101
  onChange === null || onChange === void 0 || onChange(listRef.current);
101
- }, [onChange]);
102
+ }, [onChange, updateValue]);
102
103
  return /*#__PURE__*/jsxRuntime.jsx(InputWrapper.InputWrapper, _objectSpread(_objectSpread({
103
- showClear: !utilities.isEmpty(actualValue),
104
- onClear: handleChange,
105
- invalid: invalid,
106
- readOnly: readOnly,
107
- disabled: disabled,
108
- required: required,
109
- error: error,
104
+ id: id,
105
+ showClear: !utilities.isEmpty(currentValue) && !disabled && !readOnly,
106
+ onClear: handleChange
107
+ }, getProps.getWrapperProps(props)), {}, {
110
108
  listing: showList && /*#__PURE__*/jsxRuntime.jsxs(react.Fragment, {
111
- children: [utilities.isArray(actualValue) && (actualValue === null || actualValue === void 0 || (_actualValue$map = actualValue.map) === null || _actualValue$map === void 0 ? void 0 : _actualValue$map.call(actualValue, function (file, idx) {
112
- return /*#__PURE__*/jsxRuntime.jsxs("div", {
113
- className: "flex gap-1 items-center text-sm text-dimmed py-1 px-2",
114
- children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
115
- className: "flex-1 truncate",
116
- children: [/*#__PURE__*/jsxRuntime.jsx("div", {
117
- className: "font-medium",
118
- children: file.name
109
+ children: [utilities.isArray(currentValue) && (currentValue === null || currentValue === void 0 || (_currentValue$map = currentValue.map) === null || _currentValue$map === void 0 ? void 0 : _currentValue$map.call(currentValue, function (file, idx) {
110
+ return (
111
+ /*#__PURE__*/
112
+ // eslint-disable-next-line @eslint-react/no-array-index-key
113
+ jsxRuntime.jsxs("div", {
114
+ className: "flex gap-1 items-center text-sm text-dimmed py-1 px-2",
115
+ children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
116
+ className: "flex-1 truncate",
117
+ children: [/*#__PURE__*/jsxRuntime.jsx("div", {
118
+ className: "font-medium",
119
+ children: file.name
120
+ }), /*#__PURE__*/jsxRuntime.jsx("span", {
121
+ className: "text-xs",
122
+ children: utilities.FileUtil.mime(file.type)
123
+ })]
119
124
  }), /*#__PURE__*/jsxRuntime.jsx("span", {
120
- className: "text-xs",
121
- children: utilities.FileUtil.mime(file.type)
125
+ className: "flex-content text-end w-24",
126
+ children: utilities.Format.bytes(file.size)
127
+ }), /*#__PURE__*/jsxRuntime.jsx("button", {
128
+ type: "button",
129
+ className: utilities.cn("size-fit leading-0 cursor-pointer"),
130
+ onClick: function onClick() {
131
+ removeFile(idx);
132
+ },
133
+ children: /*#__PURE__*/jsxRuntime.jsx(core.Icon, {
134
+ className: "cursor-pointer opacity-30 hover:opacity-80",
135
+ icon: "icon-[mdi--close]"
136
+ })
122
137
  })]
123
- }), /*#__PURE__*/jsxRuntime.jsx("span", {
124
- className: "flex-content text-end w-24",
125
- children: utilities.Format.bytes(file.size)
126
- }), /*#__PURE__*/jsxRuntime.jsx(core.Icon, {
127
- className: "cursor-pointer opacity-30 hover:opacity-80",
128
- icon: core.CoreIcons.close,
129
- onClick: function onClick() {
130
- removeFile(idx);
131
- }
132
- })]
133
- }, idx);
138
+ }, idx)
139
+ );
134
140
  })), exists.map(function (name) {
135
141
  return /*#__PURE__*/jsxRuntime.jsx(FileExists, {
136
142
  name: name
137
143
  }, new Date().getTime());
138
144
  })]
139
- })
140
- }, rest), {}, {
145
+ }),
141
146
  children: /*#__PURE__*/jsxRuntime.jsx("input", {
142
- className: classNames("appearance-none bg-transparent py-1 px-2 flex-1 border-none outline-none ring-0", File_module.fileInput, utilities.isArray(actualValue) && (actualValue === null || actualValue === void 0 ? void 0 : actualValue.length) && "text-[var(--fabric-bg)]"),
147
+ className: utilities.cn("fabric-fileInput", "appearance-none bg-transparent py-1 px-2 flex-1 border-none outline-none ring-0 peer", utilities.isArray(currentValue) && (currentValue === null || currentValue === void 0 ? void 0 : currentValue.length) && "text-(--fabric-bg)"),
143
148
  "aria-invalid": invalid,
144
149
  "aria-disabled": disabled,
145
150
  "aria-readonly": readOnly,
@@ -160,6 +165,6 @@ var FileInput = function FileInput(_ref) {
160
165
  onKeyDown: handleEnterPressed
161
166
  })
162
167
  }));
163
- };
168
+ }
164
169
 
165
170
  exports.FileInput = FileInput;
@@ -1,5 +1,6 @@
1
1
  'use strict';
2
2
 
3
+ var utilities = require('@react-fabric/utilities');
3
4
  var react = require('react');
4
5
  var ErrorIcon = require('../internal/ErrorIcon.js');
5
6
  var jsxRuntime = require('react/jsx-runtime');
@@ -27,28 +28,41 @@ var jsxRuntime = require('react/jsx-runtime');
27
28
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28
29
  */
29
30
 
30
- var HiddenInput = function HiddenInput(_ref) {
31
- var hiddenValue = _ref.hiddenValue,
32
- onChange = _ref.onChange,
33
- invalid = _ref.invalid,
34
- error = _ref.error,
35
- _ref$value = _ref.value,
36
- value = _ref$value === void 0 ? "" : _ref$value,
37
- name = _ref.name;
31
+ /**
32
+ * Hidden input component to handle hidden values in forms.
33
+ * It will trigger the onChange handler with the hidden value after a short delay.
34
+ * This is useful for cases where you need to update the form state without user interaction.
35
+ */
36
+ function HiddenInput(props) {
37
+ var _props$invalid = props.invalid,
38
+ invalid = _props$invalid === void 0 ? false : _props$invalid,
39
+ _props$error = props.error,
40
+ error = _props$error === void 0 ? "" : _props$error,
41
+ onChange = props.onChange,
42
+ value = props.value,
43
+ hiddenValue = props.hiddenValue,
44
+ name = props.name;
45
+ var valueRef = react.useRef(value);
46
+ var deferred = react.useDeferredValue(hiddenValue);
47
+ react.useEffect(function () {
48
+ valueRef.current = value;
49
+ }, [value]);
38
50
  react.useEffect(function () {
39
- onChange === null || onChange === void 0 || onChange(hiddenValue);
40
- }, [hiddenValue]);
51
+ if (!utilities.isEqual(valueRef.current, deferred)) {
52
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
53
+ onChange === null || onChange === void 0 || onChange(deferred);
54
+ }
55
+ }, [deferred, onChange]);
41
56
  return /*#__PURE__*/jsxRuntime.jsxs(react.Fragment, {
42
57
  children: [/*#__PURE__*/jsxRuntime.jsx("input", {
43
58
  type: "hidden",
44
- onChange: onChange,
45
- value: value,
59
+ value: value !== null && value !== void 0 ? value : "",
46
60
  name: name
47
61
  }), /*#__PURE__*/jsxRuntime.jsx(ErrorIcon.ErrorIcon, {
48
62
  invalid: invalid,
49
63
  error: error
50
64
  })]
51
65
  });
52
- };
66
+ }
53
67
 
54
68
  exports.HiddenInput = HiddenInput;
@@ -1,60 +1,59 @@
1
1
  'use strict';
2
2
 
3
3
  var _defineProperty = require('@babel/runtime/helpers/defineProperty');
4
- var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
5
- var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
4
+ var core = require('@react-fabric/core');
5
+ var utilities = require('@react-fabric/utilities');
6
6
  var react = require('react');
7
7
  var InputWrapper = require('../internal/InputWrapper.js');
8
8
  var eventHandlers = require('../utils/eventHandlers.js');
9
- require('@react-fabric/utilities');
9
+ var getProps = require('../utils/getProps.js');
10
10
  var jsxRuntime = require('react/jsx-runtime');
11
11
 
12
- var _excluded = ["ref", "name", "value", "invalid", "readOnly", "disabled", "required", "placeholder", "autoFocus", "error", "type", "onChange", "onEnterPressed"];
13
12
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
14
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
15
- var Input = function Input(_ref) {
16
- var ref = _ref.ref,
17
- name = _ref.name,
18
- value = _ref.value,
19
- invalid = _ref.invalid,
20
- readOnly = _ref.readOnly,
21
- disabled = _ref.disabled,
22
- required = _ref.required,
23
- placeholder = _ref.placeholder,
24
- autoFocus = _ref.autoFocus,
25
- error = _ref.error,
26
- _ref$type = _ref.type,
27
- type = _ref$type === void 0 ? "text" : _ref$type,
28
- onChange = _ref.onChange,
29
- onEnterPressed = _ref.onEnterPressed,
30
- rest = _objectWithoutProperties(_ref, _excluded);
31
- var _useState = react.useState(""),
32
- _useState2 = _slicedToArray(_useState, 2),
33
- actualValue = _useState2[0],
34
- setActualValue = _useState2[1];
35
- var deferred = react.useDeferredValue(value);
36
- var handleEnterPressed = react.useMemo(function () {
37
- return eventHandlers.handleEnter(onEnterPressed);
38
- }, [onEnterPressed]);
39
- react.useEffect(function () {
40
- setActualValue(deferred !== null && deferred !== void 0 ? deferred : "");
41
- }, [deferred]);
13
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
14
+ /**
15
+ * This component is used to render a text input field with various properties such as name, value, invalid state, read-only, disabled, required, placeholder, autoFocus, error message, monospace font option, and event handlers for blur, focus, change, and enter key press.
16
+ * It also includes a clear button that appears when there is a value in the input field, allowing users to clear the input easily.
17
+ * The component uses a wrapper to handle the clear button and styling, and it supports deferred value updates to optimize performance.
18
+ */
19
+ function Input(props) {
20
+ var value = props.value,
21
+ defaultValue = props.defaultValue,
22
+ onEnterPressed = props.onEnterPressed,
23
+ onChange = props.onChange,
24
+ onBlur = props.onBlur,
25
+ onFocus = props.onFocus,
26
+ disabled = props.disabled,
27
+ readOnly = props.readOnly,
28
+ invalid = props.invalid,
29
+ error = props.error,
30
+ placeholder = props.placeholder,
31
+ name = props.name,
32
+ type = props.type,
33
+ autoFocus = props.autoFocus,
34
+ allowClear = props.allowClear,
35
+ _props$autoComplete = props.autoComplete,
36
+ autoComplete = _props$autoComplete === void 0 ? "off" : _props$autoComplete,
37
+ ref = props.ref;
38
+ var id = react.useId();
39
+ var _useControlledValue = core.useControlledValue(value, defaultValue),
40
+ currentValue = _useControlledValue.currentValue,
41
+ updateValue = _useControlledValue.updateValue;
42
+ var handleEnterPressed = eventHandlers.useHandleEnter(onEnterPressed);
42
43
  var handleChange = react.useCallback(function (e) {
43
- var value = e === null || e === void 0 ? void 0 : e.target.value;
44
- setActualValue(value !== null && value !== void 0 ? value : "");
45
- onChange === null || onChange === void 0 || onChange(value !== null && value !== void 0 ? value : undefined);
46
- }, [onchange]);
44
+ var _e$target$value;
45
+ var value = (_e$target$value = e === null || e === void 0 ? void 0 : e.target.value) !== null && _e$target$value !== void 0 ? _e$target$value : defaultValue;
46
+ updateValue(value);
47
+ onChange === null || onChange === void 0 || onChange(value);
48
+ }, [defaultValue, updateValue, onChange]);
47
49
  return /*#__PURE__*/jsxRuntime.jsx(InputWrapper.InputWrapper, _objectSpread(_objectSpread({
48
- showClear: !!actualValue,
49
- onClear: handleChange,
50
- invalid: invalid,
51
- readOnly: readOnly,
52
- disabled: disabled,
53
- required: required,
54
- error: error
55
- }, rest), {}, {
50
+ id: id,
51
+ showClear: allowClear && (currentValue !== null && currentValue !== void 0 ? currentValue : "") !== (defaultValue !== null && defaultValue !== void 0 ? defaultValue : "") && !disabled && !readOnly,
52
+ onClear: handleChange
53
+ }, getProps.getWrapperProps(props)), {}, {
56
54
  children: /*#__PURE__*/jsxRuntime.jsx("input", {
57
- className: "appearance-none bg-transparent py-1 px-2 flex-1 border-none outline-none ring-0 peer",
55
+ id: id,
56
+ className: utilities.cn("appearance-none bg-transparent py-1 px-4 not-first:ps-2 not-last:pe-2 flex-1 border-none outline-none ring-0 peer"),
58
57
  "aria-invalid": invalid,
59
58
  "aria-disabled": disabled,
60
59
  "aria-readonly": readOnly,
@@ -67,13 +66,15 @@ var Input = function Input(_ref) {
67
66
  size: 1,
68
67
  type: type,
69
68
  ref: ref,
70
- autoComplete: "off",
69
+ autoComplete: autoComplete,
71
70
  autoFocus: autoFocus,
72
- value: actualValue,
71
+ value: currentValue !== null && currentValue !== void 0 ? currentValue : "",
72
+ onBlur: onBlur,
73
+ onFocus: onFocus,
73
74
  onChange: handleChange,
74
75
  onKeyDown: handleEnterPressed
75
76
  })
76
77
  }));
77
- };
78
+ }
78
79
 
79
80
  exports.Input = Input;
@@ -1,59 +1,59 @@
1
1
  'use strict';
2
2
 
3
3
  var _defineProperty = require('@babel/runtime/helpers/defineProperty');
4
- var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
5
- var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
4
+ var core = require('@react-fabric/core');
6
5
  var react = require('react');
7
6
  var InputWrapper = require('../internal/InputWrapper.js');
8
7
  var eventHandlers = require('../utils/eventHandlers.js');
9
8
  require('@react-fabric/utilities');
9
+ var getProps = require('../utils/getProps.js');
10
10
  var jsxRuntime = require('react/jsx-runtime');
11
11
 
12
- var _excluded = ["ref", "value", "invalid", "readOnly", "disabled", "required", "placeholder", "autoFocus", "name", "min", "max", "step", "onChange", "onEnterPressed"];
13
12
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
14
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
15
- var Number = function Number(_ref) {
16
- var ref = _ref.ref,
17
- value = _ref.value,
18
- invalid = _ref.invalid,
19
- readOnly = _ref.readOnly,
20
- disabled = _ref.disabled,
21
- required = _ref.required,
22
- placeholder = _ref.placeholder,
23
- autoFocus = _ref.autoFocus,
24
- name = _ref.name,
25
- min = _ref.min,
26
- max = _ref.max,
27
- step = _ref.step,
28
- onChange = _ref.onChange,
29
- onEnterPressed = _ref.onEnterPressed,
30
- rest = _objectWithoutProperties(_ref, _excluded);
31
- var _useState = react.useState(""),
32
- _useState2 = _slicedToArray(_useState, 2),
33
- actualValue = _useState2[0],
34
- setActualValue = _useState2[1];
35
- var deferred = react.useDeferredValue(value);
36
- var handleEnterPressed = react.useMemo(function () {
37
- return eventHandlers.handleEnter(onEnterPressed);
38
- }, [onEnterPressed]);
39
- react.useEffect(function () {
40
- setActualValue(deferred !== null && deferred !== void 0 ? deferred : "");
41
- }, [deferred]);
13
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
14
+ /**
15
+ * This component allows users to input numeric values with optional minimum, maximum, and step constraints.
16
+ * It provides a clear interface for entering numbers, with support for validation and accessibility features.
17
+ * It also includes a clear button to reset the input value.
18
+ */
19
+ function Number(props) {
20
+ var value = props.value,
21
+ defaultValue = props.defaultValue,
22
+ onEnterPressed = props.onEnterPressed,
23
+ onChange = props.onChange,
24
+ onBlur = props.onBlur,
25
+ onFocus = props.onFocus,
26
+ disabled = props.disabled,
27
+ readOnly = props.readOnly,
28
+ invalid = props.invalid,
29
+ min = props.min,
30
+ max = props.max,
31
+ step = props.step,
32
+ placeholder = props.placeholder,
33
+ name = props.name,
34
+ autoFocus = props.autoFocus,
35
+ allowClear = props.allowClear,
36
+ ref = props.ref;
37
+ var id = react.useId();
38
+ var _useControlledValue = core.useControlledValue(value, defaultValue),
39
+ currentValue = _useControlledValue.currentValue,
40
+ updateValue = _useControlledValue.updateValue;
41
+ var handleEnterPressed = eventHandlers.useHandleEnter(onEnterPressed);
42
42
  var handleChange = react.useCallback(function (e) {
43
- var number = e === null || e === void 0 ? void 0 : e.target.valueAsNumber;
44
- setActualValue(number !== null && number !== void 0 ? number : "");
45
- onChange === null || onChange === void 0 || onChange(number !== null && number !== void 0 ? number : undefined);
46
- }, [onChange]);
43
+ var _e$target$valueAsNumb;
44
+ var number = (_e$target$valueAsNumb = e === null || e === void 0 ? void 0 : e.target.valueAsNumber) !== null && _e$target$valueAsNumb !== void 0 ? _e$target$valueAsNumb : defaultValue;
45
+ updateValue(number);
46
+ onChange === null || onChange === void 0 || onChange(number);
47
+ }, [defaultValue, updateValue, onChange]);
47
48
  return /*#__PURE__*/jsxRuntime.jsx(InputWrapper.InputWrapper, _objectSpread(_objectSpread({
48
- showClear: !!actualValue,
49
+ id: id,
50
+ showClear: allowClear && (currentValue !== null && currentValue !== void 0 ? currentValue : "") !== (defaultValue !== null && defaultValue !== void 0 ? defaultValue : "") && !disabled && !readOnly,
49
51
  onClear: handleChange,
50
- invalid: invalid,
51
- readOnly: readOnly,
52
- disabled: disabled,
53
- required: required
54
- }, rest), {}, {
52
+ hasStepper: true
53
+ }, getProps.getWrapperProps(props)), {}, {
55
54
  children: /*#__PURE__*/jsxRuntime.jsx("input", {
56
- className: "appearance-none bg-transparent py-1 px-2 flex-1 border-none outline-none ring-0",
55
+ id: id,
56
+ className: "appearance-none bg-transparent py-1 ps-4 pe-2 not-first:ps-2 flex-1 border-none outline-none ring-0 peer",
57
57
  "aria-invalid": invalid,
58
58
  "aria-disabled": disabled,
59
59
  "aria-readonly": readOnly,
@@ -70,11 +70,13 @@ var Number = function Number(_ref) {
70
70
  ref: ref,
71
71
  autoComplete: "off",
72
72
  autoFocus: autoFocus,
73
- value: actualValue,
73
+ value: currentValue !== null && currentValue !== void 0 ? currentValue : "",
74
+ onBlur: onBlur,
75
+ onFocus: onFocus,
74
76
  onChange: handleChange,
75
77
  onKeyDown: handleEnterPressed
76
78
  })
77
79
  }));
78
- };
80
+ }
79
81
 
80
82
  exports.Number = Number;