@react-fabric/form 1.0.0-beta.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 (187) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -0
  3. package/dist/cjs/builder/FileField.js +131 -0
  4. package/dist/cjs/builder/FormField.js +119 -0
  5. package/dist/cjs/form/Controller.js +64 -0
  6. package/dist/cjs/form/Form.js +128 -0
  7. package/dist/cjs/hooks/useFileUploader.js +204 -0
  8. package/dist/cjs/hooks/useFormBuilder.js +87 -0
  9. package/dist/cjs/i18n/ar.json.js +37 -0
  10. package/dist/cjs/i18n/en.json.js +38 -0
  11. package/dist/cjs/i18n/index.js +33 -0
  12. package/dist/cjs/index.js +56 -0
  13. package/dist/cjs/input/ArrayInput.js +189 -0
  14. package/dist/cjs/input/ArrayInput.module.css +1 -0
  15. package/dist/cjs/input/AvatarInput.js +141 -0
  16. package/dist/cjs/input/Checkbox.js +83 -0
  17. package/dist/cjs/input/ColorInput.js +100 -0
  18. package/dist/cjs/input/ColorPicker.js +122 -0
  19. package/dist/cjs/input/ColorPicker.module.css +1 -0
  20. package/dist/cjs/input/Field.js +31 -0
  21. package/dist/cjs/input/File.js +165 -0
  22. package/dist/cjs/input/File.module.css +1 -0
  23. package/dist/cjs/input/Hidden.js +54 -0
  24. package/dist/cjs/input/Input.js +79 -0
  25. package/dist/cjs/input/Number.js +80 -0
  26. package/dist/cjs/input/Password.js +104 -0
  27. package/dist/cjs/input/Radio.js +70 -0
  28. package/dist/cjs/input/RadioGroup.js +31 -0
  29. package/dist/cjs/input/Range.js +169 -0
  30. package/dist/cjs/input/Search.js +109 -0
  31. package/dist/cjs/input/Slider.js +172 -0
  32. package/dist/cjs/input/Switch.js +79 -0
  33. package/dist/cjs/input/Textarea.js +87 -0
  34. package/dist/cjs/internal/ErrorIcon.js +32 -0
  35. package/dist/cjs/internal/Field.module.css +1 -0
  36. package/dist/cjs/internal/FieldWrapper.js +78 -0
  37. package/dist/cjs/internal/InputWrapper.js +113 -0
  38. package/dist/cjs/ranger/index.js +352 -0
  39. package/dist/cjs/ranger/utils.js +49 -0
  40. package/dist/cjs/select/AutoComplete.js +268 -0
  41. package/dist/cjs/select/DualList.js +238 -0
  42. package/dist/cjs/select/List.js +241 -0
  43. package/dist/cjs/select/Options.js +76 -0
  44. package/dist/cjs/select/Select.js +283 -0
  45. package/dist/cjs/select/helpers.js +41 -0
  46. package/dist/cjs/select/useSelect.js +337 -0
  47. package/dist/cjs/utils/eventHandlers.js +50 -0
  48. package/dist/cjs/utils/getColor.js +40 -0
  49. package/dist/esm/builder/FileField.js +131 -0
  50. package/dist/esm/builder/FormField.js +119 -0
  51. package/dist/esm/form/Controller.js +64 -0
  52. package/dist/esm/form/Form.js +128 -0
  53. package/dist/esm/hooks/useFileUploader.js +204 -0
  54. package/dist/esm/hooks/useFormBuilder.js +87 -0
  55. package/dist/esm/i18n/ar.json.js +31 -0
  56. package/dist/esm/i18n/en.json.js +32 -0
  57. package/dist/esm/i18n/index.js +33 -0
  58. package/dist/esm/index.js +28 -0
  59. package/dist/esm/input/ArrayInput.js +189 -0
  60. package/dist/esm/input/ArrayInput.module.css +1 -0
  61. package/dist/esm/input/AvatarInput.js +141 -0
  62. package/dist/esm/input/Checkbox.js +83 -0
  63. package/dist/esm/input/ColorInput.js +100 -0
  64. package/dist/esm/input/ColorPicker.js +122 -0
  65. package/dist/esm/input/ColorPicker.module.css +1 -0
  66. package/dist/esm/input/Field.js +31 -0
  67. package/dist/esm/input/File.js +165 -0
  68. package/dist/esm/input/File.module.css +1 -0
  69. package/dist/esm/input/Hidden.js +54 -0
  70. package/dist/esm/input/Input.js +79 -0
  71. package/dist/esm/input/Number.js +80 -0
  72. package/dist/esm/input/Password.js +104 -0
  73. package/dist/esm/input/Radio.js +70 -0
  74. package/dist/esm/input/RadioGroup.js +31 -0
  75. package/dist/esm/input/Range.js +169 -0
  76. package/dist/esm/input/Search.js +109 -0
  77. package/dist/esm/input/Slider.js +172 -0
  78. package/dist/esm/input/Switch.js +79 -0
  79. package/dist/esm/input/Textarea.js +87 -0
  80. package/dist/esm/internal/ErrorIcon.js +32 -0
  81. package/dist/esm/internal/Field.module.css +1 -0
  82. package/dist/esm/internal/FieldWrapper.js +78 -0
  83. package/dist/esm/internal/InputWrapper.js +113 -0
  84. package/dist/esm/ranger/index.js +352 -0
  85. package/dist/esm/ranger/utils.js +47 -0
  86. package/dist/esm/select/AutoComplete.js +268 -0
  87. package/dist/esm/select/DualList.js +238 -0
  88. package/dist/esm/select/List.js +241 -0
  89. package/dist/esm/select/Options.js +76 -0
  90. package/dist/esm/select/Select.js +283 -0
  91. package/dist/esm/select/helpers.js +40 -0
  92. package/dist/esm/select/useSelect.js +337 -0
  93. package/dist/esm/utils/eventHandlers.js +50 -0
  94. package/dist/esm/utils/getColor.js +39 -0
  95. package/dist/types/builder/FileField.d.ts +8 -0
  96. package/dist/types/builder/FormField.d.ts +9 -0
  97. package/dist/types/form/Controller.d.ts +20 -0
  98. package/dist/types/form/Form.d.ts +33 -0
  99. package/dist/types/hooks/useFileUploader.d.ts +23 -0
  100. package/dist/types/hooks/useFormBuilder.d.ts +16 -0
  101. package/dist/types/i18n/index.d.ts +1 -0
  102. package/dist/types/index.d.ts +27 -0
  103. package/dist/types/input/ArrayInput.d.ts +64 -0
  104. package/dist/types/input/AvatarInput.d.ts +31 -0
  105. package/dist/types/input/Checkbox.d.ts +46 -0
  106. package/dist/types/input/ColorInput.d.ts +10 -0
  107. package/dist/types/input/ColorPicker.d.ts +24 -0
  108. package/dist/types/input/Field.d.ts +41 -0
  109. package/dist/types/input/File.d.ts +17 -0
  110. package/dist/types/input/Hidden.d.ts +16 -0
  111. package/dist/types/input/Input.d.ts +9 -0
  112. package/dist/types/input/Number.d.ts +17 -0
  113. package/dist/types/input/Password.d.ts +13 -0
  114. package/dist/types/input/Radio.d.ts +42 -0
  115. package/dist/types/input/RadioGroup.d.ts +30 -0
  116. package/dist/types/input/Range.d.ts +59 -0
  117. package/dist/types/input/Search.d.ts +17 -0
  118. package/dist/types/input/Slider.d.ts +63 -0
  119. package/dist/types/input/Switch.d.ts +42 -0
  120. package/dist/types/input/Textarea.d.ts +17 -0
  121. package/dist/types/internal/ErrorIcon.d.ts +1 -0
  122. package/dist/types/internal/FieldWrapper.d.ts +1 -0
  123. package/dist/types/internal/InputWrapper.d.ts +1 -0
  124. package/dist/types/ranger/index.d.ts +70 -0
  125. package/dist/types/ranger/utils.d.ts +25 -0
  126. package/dist/types/select/AutoComplete.d.ts +17 -0
  127. package/dist/types/select/DualList.d.ts +38 -0
  128. package/dist/types/select/List.d.ts +4 -0
  129. package/dist/types/select/Options.d.ts +14 -0
  130. package/dist/types/select/Select.d.ts +2 -0
  131. package/dist/types/select/helpers.d.ts +2 -0
  132. package/dist/types/select/useSelect.d.ts +50 -0
  133. package/dist/types/types/index.d.ts +169 -0
  134. package/dist/types/types/schema.d.ts +59 -0
  135. package/dist/types/utils/eventHandlers.d.ts +11 -0
  136. package/dist/types/utils/getColor.d.ts +4 -0
  137. package/dist/types/utils/index.d.ts +2 -0
  138. package/package.json +64 -0
  139. package/src/builder/FileField.tsx +122 -0
  140. package/src/builder/FormField.tsx +161 -0
  141. package/src/form/Controller.tsx +103 -0
  142. package/src/form/Form.tsx +160 -0
  143. package/src/hooks/useFileUploader.ts +234 -0
  144. package/src/hooks/useFormBuilder.tsx +128 -0
  145. package/src/i18n/ar.json +23 -0
  146. package/src/i18n/en.json +24 -0
  147. package/src/i18n/index.ts +28 -0
  148. package/src/index.ts +54 -0
  149. package/src/input/ArrayInput.module.css +41 -0
  150. package/src/input/ArrayInput.tsx +318 -0
  151. package/src/input/AvatarInput.tsx +150 -0
  152. package/src/input/Checkbox.tsx +165 -0
  153. package/src/input/ColorInput.tsx +157 -0
  154. package/src/input/ColorPicker.module.css +51 -0
  155. package/src/input/ColorPicker.tsx +210 -0
  156. package/src/input/Field.tsx +96 -0
  157. package/src/input/File.module.css +42 -0
  158. package/src/input/File.tsx +224 -0
  159. package/src/input/Hidden.tsx +65 -0
  160. package/src/input/Input.tsx +114 -0
  161. package/src/input/Number.tsx +126 -0
  162. package/src/input/Password.tsx +150 -0
  163. package/src/input/Radio.tsx +146 -0
  164. package/src/input/RadioGroup.tsx +75 -0
  165. package/src/input/Range.tsx +276 -0
  166. package/src/input/Search.tsx +160 -0
  167. package/src/input/Slider.tsx +282 -0
  168. package/src/input/Switch.tsx +168 -0
  169. package/src/input/Textarea.tsx +127 -0
  170. package/src/internal/ErrorIcon.tsx +61 -0
  171. package/src/internal/Field.module.css +139 -0
  172. package/src/internal/FieldWrapper.tsx +84 -0
  173. package/src/internal/InputWrapper.tsx +187 -0
  174. package/src/ranger/index.tsx +514 -0
  175. package/src/ranger/utils.ts +48 -0
  176. package/src/select/AutoComplete.tsx +354 -0
  177. package/src/select/DualList.tsx +286 -0
  178. package/src/select/List.tsx +288 -0
  179. package/src/select/Options.tsx +121 -0
  180. package/src/select/Select.tsx +350 -0
  181. package/src/select/helpers.ts +36 -0
  182. package/src/select/useSelect.tsx +413 -0
  183. package/src/types/index.ts +203 -0
  184. package/src/types/schema.ts +100 -0
  185. package/src/utils/eventHandlers.ts +72 -0
  186. package/src/utils/getColor.ts +47 -0
  187. package/src/utils/index.ts +25 -0
@@ -0,0 +1,141 @@
1
+ 'use client';
2
+
3
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
5
+ import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
6
+ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
7
+ import _regeneratorRuntime from '@babel/runtime/regenerator';
8
+ import { Avatar, Icon, ProgressBar } from '@react-fabric/core';
9
+ import { useState, useEffect } from 'react';
10
+ import { useFileUploader } from '../hooks/useFileUploader.js';
11
+ import { HiddenInput } from './Hidden.js';
12
+ import { jsxs, jsx } from 'react/jsx-runtime';
13
+
14
+ var _excluded = ["src", "size", "fileUrl", "uploadHandler"];
15
+ 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; }
16
+ 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; }
17
+ var AvatarInput = function AvatarInput(_ref) {
18
+ var _list$;
19
+ var src = _ref.src,
20
+ _ref$size = _ref.size,
21
+ size = _ref$size === void 0 ? "6rem" : _ref$size,
22
+ fileUrl = _ref.fileUrl,
23
+ uploadHandler = _ref.uploadHandler,
24
+ rest = _objectWithoutProperties(_ref, _excluded);
25
+ var _useFileUploader = useFileUploader( /*#__PURE__*/function () {
26
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(data, config) {
27
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
28
+ while (1) switch (_context.prev = _context.next) {
29
+ case 0:
30
+ _context.next = 2;
31
+ return uploadHandler === null || uploadHandler === void 0 ? void 0 : uploadHandler(data, config);
32
+ case 2:
33
+ return _context.abrupt("return", _context.sent);
34
+ case 3:
35
+ case "end":
36
+ return _context.stop();
37
+ }
38
+ }, _callee);
39
+ }));
40
+ return function (_x, _x2) {
41
+ return _ref2.apply(this, arguments);
42
+ };
43
+ }(), rest.value, false),
44
+ files = _useFileUploader.files,
45
+ list = _useFileUploader.list,
46
+ upload = _useFileUploader.upload,
47
+ remove = _useFileUploader.remove;
48
+ var _useState = useState(""),
49
+ _useState2 = _slicedToArray(_useState, 2),
50
+ base64 = _useState2[0],
51
+ setBase64 = _useState2[1];
52
+ useEffect(function () {
53
+ if (list !== null && list !== void 0 && list.length) {
54
+ var _files$;
55
+ var file = files === null || files === void 0 || (_files$ = files[0]) === null || _files$ === void 0 ? void 0 : _files$.file;
56
+ void (file && new Response(file).blob().then(function (blob) {
57
+ var reader = new FileReader();
58
+ reader.onload = function () {
59
+ setBase64(reader.result);
60
+ };
61
+ reader.onerror = function (e) {
62
+ console.error("ERROR", e);
63
+ };
64
+ reader.readAsDataURL(blob);
65
+ }));
66
+ } else {
67
+ setBase64("");
68
+ }
69
+ }, [files, list]);
70
+ useEffect(function () {
71
+ var _fileUrl;
72
+ src && setBase64((_fileUrl = fileUrl === null || fileUrl === void 0 ? void 0 : fileUrl(src)) !== null && _fileUrl !== void 0 ? _fileUrl : src);
73
+ }, [src]);
74
+ return /*#__PURE__*/jsxs("div", {
75
+ className: "flex flex-nowrap items-end",
76
+ children: [/*#__PURE__*/jsxs("div", {
77
+ className: "inline-block leading-none rounded-full relative outline overflow-hidden",
78
+ children: [/*#__PURE__*/jsx(Avatar, {
79
+ name: "temp",
80
+ size: size,
81
+ avatar: base64
82
+ }), /*#__PURE__*/jsxs("div", {
83
+ className: "absolute inset-x-0 bottom-0 cursor-pointer bg-opacity-20 hover:bg-opacity-50 bg-black text-white text-xs text-center py-1",
84
+ children: [/*#__PURE__*/jsx("span", {
85
+ children: "Edit"
86
+ }), /*#__PURE__*/jsx("input", {
87
+ type: "file",
88
+ accept: "image/*",
89
+ className: "absolute inset-0 opacity-0 z-5 cursor-pointer",
90
+ onChange: function onChange(e) {
91
+ return [upload(e.target.files), e.target.value = ""];
92
+ }
93
+ })]
94
+ })]
95
+ }), /*#__PURE__*/jsx(HiddenInput, _objectSpread({
96
+ hiddenValue: list === null || list === void 0 || (_list$ = list[0]) === null || _list$ === void 0 ? void 0 : _list$.path
97
+ }, rest)), files.map(function (file, idx) {
98
+ return /*#__PURE__*/jsxs("div", {
99
+ className: "px-2 py-1 flex-1",
100
+ children: [/*#__PURE__*/jsxs("div", {
101
+ className: "flex flex-nowrap gap-1 items-center",
102
+ children: [/*#__PURE__*/jsx("div", {
103
+ className: "flex-initial truncate pe-2",
104
+ children: file.filename
105
+ }), file.error && /*#__PURE__*/jsx("div", {
106
+ className: "flex-1 truncate px-2",
107
+ children: /*#__PURE__*/jsx("span", {
108
+ className: "text-danger-600",
109
+ children: file.error
110
+ })
111
+ }), file.progress && /*#__PURE__*/jsx(Icon, {
112
+ icon: "mdi mdi-stop-circle",
113
+ bg: "danger",
114
+ color: "white",
115
+ size: "sm",
116
+ className: "p-[2px]",
117
+ "aria-label": "abort",
118
+ onClick: function onClick() {
119
+ var _file$abort;
120
+ return (_file$abort = file.abort) === null || _file$abort === void 0 ? void 0 : _file$abort.call(file);
121
+ }
122
+ }), !file.progress && /*#__PURE__*/jsx(Icon, {
123
+ icon: "mdi mdi-trash-can",
124
+ color: "danger",
125
+ size: "sm",
126
+ "aria-label": "remove",
127
+ onClick: function onClick() {
128
+ return remove(file.key);
129
+ }
130
+ })]
131
+ }), file.progress && /*#__PURE__*/jsx(ProgressBar, {
132
+ animate: true,
133
+ value: file.progress * 100,
134
+ size: "xxs"
135
+ })]
136
+ }, idx);
137
+ })]
138
+ });
139
+ };
140
+
141
+ export { AvatarInput };
@@ -0,0 +1,83 @@
1
+ 'use client';
2
+
3
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
5
+ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
6
+ import { CoreIcons, Icon } from '@react-fabric/core';
7
+ import classNames from 'classnames';
8
+ import { useState, useDeferredValue, useMemo, useEffect, useCallback } from 'react';
9
+ import { ErrorIcon } from '../internal/ErrorIcon.js';
10
+ import { jsxs, jsx } from 'react/jsx-runtime';
11
+
12
+ var _excluded = ["ref", "label", "value", "name", "checked", "invalid", "disabled", "error", "width", "icon", "iconChecked", "onChange"];
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; }
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 Checkbox = function Checkbox(_ref) {
16
+ var ref = _ref.ref,
17
+ label = _ref.label,
18
+ value = _ref.value,
19
+ name = _ref.name,
20
+ checked = _ref.checked,
21
+ invalid = _ref.invalid,
22
+ disabled = _ref.disabled,
23
+ error = _ref.error,
24
+ width = _ref.width,
25
+ icon = _ref.icon,
26
+ iconChecked = _ref.iconChecked,
27
+ onChange = _ref.onChange,
28
+ rest = _objectWithoutProperties(_ref, _excluded);
29
+ var _useState = useState(false),
30
+ _useState2 = _slicedToArray(_useState, 2),
31
+ actualValue = _useState2[0],
32
+ setActualValue = _useState2[1];
33
+ var deferred = useDeferredValue(!!checked);
34
+ var iconOn = useMemo(function () {
35
+ var _ref2;
36
+ return (_ref2 = iconChecked !== null && iconChecked !== void 0 ? iconChecked : icon) !== null && _ref2 !== void 0 ? _ref2 : CoreIcons.checkboxOn;
37
+ }, [icon, iconChecked]);
38
+ var iconOff = useMemo(function () {
39
+ return icon !== null && icon !== void 0 ? icon : CoreIcons.checkboxOff;
40
+ }, [icon]);
41
+ useEffect(function () {
42
+ setActualValue(deferred);
43
+ }, [deferred]);
44
+ var handleChange = useCallback(function (e) {
45
+ var _e$target$checked, _e$target$checked2;
46
+ setActualValue((_e$target$checked = e === null || e === void 0 ? void 0 : e.target.checked) !== null && _e$target$checked !== void 0 ? _e$target$checked : false);
47
+ onChange === null || onChange === void 0 || onChange((_e$target$checked2 = e === null || e === void 0 ? void 0 : e.target.checked) !== null && _e$target$checked2 !== void 0 ? _e$target$checked2 : false);
48
+ }, [onChange, value]);
49
+ return /*#__PURE__*/jsxs("label", {
50
+ className: classNames(invalid ? "ring-danger-500" : "ring-primary-500", disabled ? "opacity-50 cursor-not-allowed" : " opacity-85 hover:opacity-100 cursor-pointer", "inline-flex gap-1 py-1 items-center relative rounded ring-offset-2 has-[:focus-visible]:ring-1"),
51
+ style: {
52
+ width: width
53
+ },
54
+ children: [/*#__PURE__*/jsx("input", _objectSpread({
55
+ className: classNames("appearance-none absolute opacity-0 inset-0 bg-transparent border-none outline-none ring-0"),
56
+ "aria-invalid": invalid,
57
+ "aria-disabled": disabled,
58
+ disabled: disabled,
59
+ "aria-errormessage": error,
60
+ type: "checkbox",
61
+ ref: ref,
62
+ size: 1,
63
+ tabIndex: 0,
64
+ name: name,
65
+ autoComplete: "off",
66
+ checked: actualValue,
67
+ onChange: handleChange
68
+ }, rest)), /*#__PURE__*/jsx(Icon, {
69
+ className: classNames("p-0.5", actualValue && icon && !iconChecked && "bg-primary-500 text-white"),
70
+ size: "1.25em",
71
+ color: invalid ? "danger" : "primary",
72
+ icon: actualValue ? iconOn : iconOff
73
+ }), /*#__PURE__*/jsx(ErrorIcon, {
74
+ invalid: invalid,
75
+ error: error
76
+ }), label && /*#__PURE__*/jsx("span", {
77
+ className: "flex-initial leading-none truncate",
78
+ children: label
79
+ })]
80
+ });
81
+ };
82
+
83
+ export { Checkbox };
@@ -0,0 +1,100 @@
1
+ 'use client';
2
+
3
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
5
+ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
6
+ import { Dropdown, Icon, CoreIcons } from '@react-fabric/core';
7
+ import { isString } from '@react-fabric/utilities';
8
+ import classNames from 'classnames';
9
+ import { useState, useDeferredValue, useEffect, useCallback, startTransition } from 'react';
10
+ import { ColorPicker } from './ColorPicker.js';
11
+ import { jsxs, jsx } from 'react/jsx-runtime';
12
+
13
+ var _excluded = ["ref", "required", "disabled", "allowClear", "invalid", "error", "value", "showPicker", "defaultColor", "decorateEnd", "decorateStart", "onChange", "noOutline"];
14
+ 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; }
15
+ 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; }
16
+ var ColorInput = function ColorInput(_ref) {
17
+ _ref.ref;
18
+ _ref.required;
19
+ var disabled = _ref.disabled,
20
+ allowClear = _ref.allowClear;
21
+ _ref.invalid;
22
+ _ref.error;
23
+ var value = _ref.value,
24
+ showPicker = _ref.showPicker,
25
+ _ref$defaultColor = _ref.defaultColor,
26
+ defaultColor = _ref$defaultColor === void 0 ? "" : _ref$defaultColor,
27
+ decorateEnd = _ref.decorateEnd,
28
+ decorateStart = _ref.decorateStart,
29
+ onChange = _ref.onChange,
30
+ noOutline = _ref.noOutline,
31
+ rest = _objectWithoutProperties(_ref, _excluded);
32
+ var _useState = useState(""),
33
+ _useState2 = _slicedToArray(_useState, 2),
34
+ actualValue = _useState2[0],
35
+ setActualValue = _useState2[1];
36
+ var deferred = useDeferredValue(value !== null && value !== void 0 ? value : defaultColor);
37
+ useEffect(function () {
38
+ setActualValue(deferred !== null && deferred !== void 0 ? deferred : "");
39
+ }, [deferred]);
40
+ var handleChange = useCallback(function (e) {
41
+ setActualValue(e !== null && e !== void 0 ? e : defaultColor);
42
+ onChange != null && startTransition(function () {
43
+ return onChange(e);
44
+ });
45
+ }, [onChange]);
46
+ return /*#__PURE__*/jsxs("div", {
47
+ className: classNames("flex-content min-h-[1.5em] min-w-[3.5em] self-stretch flex items-center outline-tint-200 rounded", !disabled && "bg-base", !noOutline && "bg-[var(--fabric-input)] outline overflow-hidden"),
48
+ children: [decorateStart && /*#__PURE__*/jsx("div", {
49
+ className: classNames("text-muted leading-none flex-content", isString(decorateStart) && "px-2"),
50
+ children: decorateStart
51
+ }), /*#__PURE__*/jsxs(Dropdown, {
52
+ showArrow: true,
53
+ disabled: disabled,
54
+ children: [/*#__PURE__*/jsx("button", {
55
+ "data-ref": "button",
56
+ className: "flex-1 flex items-center",
57
+ children: /*#__PURE__*/jsx("div", {
58
+ role: "none",
59
+ className: "h-[1.5em] min-w-[1.5em] flex-1 flex items-center justify-center self-stretch cursor-pointer m-[0.25em] rounded outline outline-tint-100",
60
+ style: {
61
+ backgroundColor: actualValue,
62
+ opacity: disabled ? 0.65 : 1,
63
+ pointerEvents: disabled ? "none" : undefined
64
+ },
65
+ onClick: function onClick(e) {
66
+ var _e$currentTarget$next;
67
+ return (_e$currentTarget$next = e.currentTarget.nextElementSibling) === null || _e$currentTarget$next === void 0 ? void 0 : _e$currentTarget$next.focus();
68
+ },
69
+ children: !actualValue && /*#__PURE__*/jsx(Icon, {
70
+ size: "md",
71
+ className: "text-muted",
72
+ icon: CoreIcons.colorSwatch
73
+ })
74
+ })
75
+ }), /*#__PURE__*/jsx(ColorPicker, _objectSpread(_objectSpread({}, rest), {}, {
76
+ onChange: handleChange,
77
+ defaultColor: defaultColor,
78
+ value: actualValue
79
+ }))]
80
+ }), !disabled && showPicker && /*#__PURE__*/jsx(Icon, {
81
+ icon: CoreIcons.colorPicker,
82
+ onClick: function onClick() {
83
+ return window.EyeDropper && new window.EyeDropper().open().then(function (resp) {
84
+ return handleChange(resp.sRGBHex);
85
+ });
86
+ }
87
+ }), decorateEnd && /*#__PURE__*/jsx("div", {
88
+ className: classNames("text-muted leading-none flex-content", isString(decorateEnd) && "px-2"),
89
+ children: decorateEnd
90
+ }), !disabled && allowClear && actualValue !== defaultColor && /*#__PURE__*/jsx(Icon, {
91
+ icon: CoreIcons.close,
92
+ onClick: function onClick() {
93
+ return handleChange();
94
+ },
95
+ className: classNames("text-tint-500 hover:text-tint-700 p-[0.25em] flex-content")
96
+ })]
97
+ });
98
+ };
99
+
100
+ export { ColorInput };
@@ -0,0 +1,122 @@
1
+ 'use client';
2
+
3
+ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
4
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
5
+ import Color from 'color';
6
+ import { memo, useState, useDeferredValue, useEffect, useCallback, startTransition } from 'react';
7
+ import { SketchPicker } from 'react-color';
8
+ import classes from './ColorPicker.module.css';
9
+ import { jsx } from 'react/jsx-runtime';
10
+
11
+ var _excluded = ["a"],
12
+ _excluded2 = ["a"];
13
+ var DEFAULT_SWATCHES = [Color("#d7323a").mix(Color("#171a1c"), 0.5).hex(), Color("#ff781c").mix(Color("#171a1c"), 0.5).hex(), Color("#f7b731").mix(Color("#171a1c"), 0.5).hex(), Color("#88ab1b").mix(Color("#171a1c"), 0.5).hex(), Color("#22aa85").mix(Color("#171a1c"), 0.5).hex(), Color("#399bec").mix(Color("#171a1c"), 0.5).hex(), Color("#4862c8").mix(Color("#171a1c"), 0.5).hex(), Color("#aa66cf").mix(Color("#171a1c"), 0.5).hex(), Color("#f43f7b").mix(Color("#171a1c"), 0.5).hex(), Color("#a37f4f").mix(Color("#171a1c"), 0.5).hex(), "#d7323a", "#ff781c", "#f7b731", "#88ab1b", "#22aa85", "#399bec", "#4862c8", "#aa66cf", "#f43f7b", "#a37f4f", Color("#d7323a").mix(Color("#f1f3f4"), 0.5).hex(), Color("#ff781c").mix(Color("#f1f3f4"), 0.5).hex(), Color("#f7b731").mix(Color("#f1f3f4"), 0.5).hex(), Color("#88ab1b").mix(Color("#f1f3f4"), 0.5).hex(), Color("#22aa85").mix(Color("#f1f3f4"), 0.5).hex(), Color("#399bec").mix(Color("#f1f3f4"), 0.5).hex(), Color("#4862c8").mix(Color("#f1f3f4"), 0.5).hex(), Color("#aa66cf").mix(Color("#f1f3f4"), 0.5).hex(), Color("#f43f7b").mix(Color("#f1f3f4"), 0.5).hex(), Color("#a37f4f").mix(Color("#f1f3f4"), 0.5).hex(), "#171a1c", "#2d3439", "#444e55", "#5b6971", "#71838e", "#86959e", "#9ca8b0", "#b8c1c6", "#d5dadd", "#f1f3f4"];
14
+
15
+ // eslint-disable-next-line react/display-name
16
+ var ColorPicker = /*#__PURE__*/memo(function (_ref) {
17
+ var value = _ref.value,
18
+ onChange = _ref.onChange,
19
+ hideAlpha = _ref.hideAlpha,
20
+ _ref$defaultColor = _ref.defaultColor,
21
+ defaultColor = _ref$defaultColor === void 0 ? "#fff" : _ref$defaultColor,
22
+ _ref$swatches = _ref.swatches,
23
+ swatches = _ref$swatches === void 0 ? DEFAULT_SWATCHES : _ref$swatches;
24
+ var _useState = useState(""),
25
+ _useState2 = _slicedToArray(_useState, 2),
26
+ actualValue = _useState2[0],
27
+ setActualValue = _useState2[1];
28
+ var deferred = useDeferredValue(value !== null && value !== void 0 ? value : defaultColor);
29
+ useEffect(function () {
30
+ setActualValue(deferred !== null && deferred !== void 0 ? deferred : "");
31
+ }, [deferred]);
32
+ var handleChange = useCallback(function (e) {
33
+ setActualValue(e !== null && e !== void 0 ? e : defaultColor);
34
+ onChange != null && startTransition(function () {
35
+ return onChange(e);
36
+ });
37
+ }, [onChange]);
38
+ return /*#__PURE__*/jsx(SketchPicker, {
39
+ width: "16rem",
40
+ className: classes.colorPicker,
41
+ styles: {
42
+ "default": {
43
+ hue: {
44
+ borderRadius: "99px",
45
+ boxShadow: "0 0 1px 1px var(--color-shadow)"
46
+ },
47
+ alpha: {
48
+ height: "1rem",
49
+ borderRadius: "99px",
50
+ backgroundColor: "var(--fabric-bg)",
51
+ boxShadow: "0 0 1px 1px var(--color-shadow)"
52
+ },
53
+ color: {
54
+ boxShadow: "0 0 1px 1px var(--color-shadow)"
55
+ },
56
+ saturation: {
57
+ boxShadow: "0 0 1px 1px var(--color-shadow)"
58
+ },
59
+ activeColor: {
60
+ boxShadow: "0 0 1px 1px var(--color-shadow)"
61
+ },
62
+ picker: {
63
+ backgroundColor: "var(--fabric-bg)",
64
+ boxShadow: "0 0 0 1px var(--color-shadow), 0 0 8px var(--fabric-shadow)"
65
+ },
66
+ Alpha: {
67
+ alpha: {
68
+ paddingRight: "calc(1rem - 2px)"
69
+ },
70
+ slider: {
71
+ width: "calc(1rem - 2px)",
72
+ borderRadius: "99px",
73
+ height: "calc(1rem - 2px)",
74
+ transform: "none"
75
+ }
76
+ },
77
+ Hue: {
78
+ hue: {
79
+ paddingRight: "calc(1rem - 2px)"
80
+ },
81
+ slider: {
82
+ width: "calc(1rem - 2px)",
83
+ borderRadius: "99px",
84
+ height: "calc(1rem - 2px)",
85
+ transform: "none"
86
+ }
87
+ },
88
+ Saturation: {
89
+ circle: {
90
+ width: "0.5rem",
91
+ borderRadius: "99px",
92
+ height: "0.5rem",
93
+ transform: "translate(-0.25rem, -0.25rem)"
94
+ }
95
+ },
96
+ checkboard: {
97
+ white: "transparent",
98
+ black: "red"
99
+ }
100
+ }
101
+ },
102
+ color: actualValue,
103
+ presetColors: swatches,
104
+ disableAlpha: hideAlpha,
105
+ onChange: function onChange(_ref2) {
106
+ var _ref2$rgb = _ref2.rgb,
107
+ _ref2$rgb$a = _ref2$rgb.a,
108
+ a = _ref2$rgb$a === void 0 ? 1 : _ref2$rgb$a,
109
+ rgb = _objectWithoutProperties(_ref2$rgb, _excluded);
110
+ return setActualValue(Color(rgb).alpha(a)[a < 1 ? "hexa" : "hex"]());
111
+ },
112
+ onChangeComplete: function onChangeComplete(_ref3) {
113
+ var _ref3$rgb = _ref3.rgb,
114
+ _ref3$rgb$a = _ref3$rgb.a,
115
+ a = _ref3$rgb$a === void 0 ? 1 : _ref3$rgb$a,
116
+ rgb = _objectWithoutProperties(_ref3$rgb, _excluded2);
117
+ return handleChange(Color(rgb).alpha(a)[a < 1 ? "hexa" : "hex"]());
118
+ }
119
+ });
120
+ });
121
+
122
+ export { ColorPicker };
@@ -0,0 +1 @@
1
+ @layer comp{.colorPicker{--color-shadow:theme(borderColor.base);& input{@apply bg-base text-base !border !border-solid !rounded-sm !border-base focus:!border-primary !shadow-none;line-height:2;padding:0 4px!important}& label{@apply !text-base}& :global(.flexbox-fix){@apply !border-t-muted justify-center;&>div>div{@apply text-center}& span>div{box-shadow:inset 0 0 1px 1px theme(borderColor.base)!important}}}}
@@ -0,0 +1,31 @@
1
+ 'use client';
2
+
3
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
+ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
5
+ import classNames from 'classnames';
6
+ import { Children, cloneElement } from 'react';
7
+ import classes from '../internal/Field.module.css';
8
+ import { FieldWrapper } from '../internal/FieldWrapper.js';
9
+ import { jsx } from 'react/jsx-runtime';
10
+
11
+ var _excluded = ["children", "noOutline", "plain"];
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; }
13
+ 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; }
14
+ var Field = function Field(_ref) {
15
+ var children = _ref.children,
16
+ noOutline = _ref.noOutline,
17
+ plain = _ref.plain,
18
+ rest = _objectWithoutProperties(_ref, _excluded);
19
+ return /*#__PURE__*/jsx(FieldWrapper, _objectSpread(_objectSpread({}, rest), {}, {
20
+ children: /*#__PURE__*/jsx("div", {
21
+ className: classNames(classes.fieldGroup, !plain && !noOutline && "outline", !plain && "bg-base", "flex flex-nowrap flex-1 rounded"),
22
+ children: Children.map(children, function (child) {
23
+ return child && /*#__PURE__*/cloneElement(child, {
24
+ "data-inner": true
25
+ });
26
+ })
27
+ })
28
+ }));
29
+ };
30
+
31
+ export { Field };
@@ -0,0 +1,165 @@
1
+ 'use client';
2
+
3
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
+ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
5
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
6
+ import { Icon, CoreIcons } from '@react-fabric/core';
7
+ import { isArray, mergeRefs, isEmpty, FileUtil, Format } from '@react-fabric/utilities';
8
+ import classNames from 'classnames';
9
+ import { useRef, useState, useDeferredValue, useMemo, useEffect, useCallback, Fragment } from 'react';
10
+ import { InputWrapper } from '../internal/InputWrapper.js';
11
+ import { handleEnter } from '../utils/eventHandlers.js';
12
+ import classes from './File.module.css';
13
+ import { jsx, jsxs } from 'react/jsx-runtime';
14
+
15
+ var _excluded = ["ref", "value", "invalid", "readOnly", "disabled", "required", "placeholder", "autoFocus", "error", "name", "accept", "showList", "multiple", "onChange", "onEnterPressed"];
16
+ 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) {
19
+ var _useState = useState(false),
20
+ _useState2 = _slicedToArray(_useState, 2),
21
+ kill = _useState2[0],
22
+ setKill = _useState2[1];
23
+ useEffect(function () {
24
+ setTimeout(function () {
25
+ setKill(true);
26
+ }, 2000);
27
+ });
28
+ return kill ? null : /*#__PURE__*/jsxs("div", {
29
+ className: "bg-danger-500 text-white px-2 rounded text-xs",
30
+ children: ["File [", prop.name, "] already added to list"]
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);
52
+ var listRef = useRef([]);
53
+ var inputRef = useRef(null);
54
+ var _useState3 = useState([]),
55
+ _useState4 = _slicedToArray(_useState3, 2),
56
+ exists = _useState4[0],
57
+ setExists = _useState4[1];
58
+ var _useState5 = useState(),
59
+ _useState6 = _slicedToArray(_useState5, 2),
60
+ actualValue = _useState6[0],
61
+ setActualValue = _useState6[1];
62
+ var deferred = useDeferredValue(value);
63
+ var handleEnterPressed = useMemo(function () {
64
+ return handleEnter(onEnterPressed);
65
+ }, [onEnterPressed]);
66
+ useEffect(function () {
67
+ setActualValue(deferred);
68
+ }, [deferred]);
69
+ var handleChange = useCallback(function (e) {
70
+ setExists([]);
71
+ if (multiple) {
72
+ if (e !== null && e !== void 0 && e.target.files) {
73
+ if (showList) {
74
+ var _exists = [];
75
+ Array.from(e.target.files).forEach(function (file) {
76
+ listRef.current.find(function (ef) {
77
+ return ef.name === file.name;
78
+ }) ? _exists.push(file.name) : listRef.current.push(file);
79
+ });
80
+ setActualValue(listRef.current.slice());
81
+ setExists(_exists);
82
+ }
83
+ e.target.value = "";
84
+ onChange === null || onChange === void 0 || onChange(listRef.current);
85
+ } else {
86
+ listRef.current = [];
87
+ setActualValue(listRef.current);
88
+ onChange === null || onChange === void 0 || onChange(listRef.current);
89
+ }
90
+ } else {
91
+ 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
+ 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
+ if (!e && inputRef.current) inputRef.current.value = "";
95
+ }
96
+ }, [onChange, multiple, showList]);
97
+ var removeFile = useCallback(function (idx) {
98
+ listRef.current.splice(idx, 1);
99
+ setActualValue(listRef.current);
100
+ onChange === null || onChange === void 0 || onChange(listRef.current);
101
+ }, [onChange]);
102
+ return /*#__PURE__*/jsx(InputWrapper, _objectSpread(_objectSpread({
103
+ showClear: !isEmpty(actualValue),
104
+ onClear: handleChange,
105
+ invalid: invalid,
106
+ readOnly: readOnly,
107
+ disabled: disabled,
108
+ required: required,
109
+ error: error,
110
+ listing: showList && /*#__PURE__*/jsxs(Fragment, {
111
+ children: [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__*/jsxs("div", {
113
+ className: "flex gap-1 items-center text-sm text-dimmed py-1 px-2",
114
+ children: [/*#__PURE__*/jsxs("div", {
115
+ className: "flex-1 truncate",
116
+ children: [/*#__PURE__*/jsx("div", {
117
+ className: "font-medium",
118
+ children: file.name
119
+ }), /*#__PURE__*/jsx("span", {
120
+ className: "text-xs",
121
+ children: FileUtil.mime(file.type)
122
+ })]
123
+ }), /*#__PURE__*/jsx("span", {
124
+ className: "flex-content text-end w-24",
125
+ children: Format.bytes(file.size)
126
+ }), /*#__PURE__*/jsx(Icon, {
127
+ className: "cursor-pointer opacity-30 hover:opacity-80",
128
+ icon: CoreIcons.close,
129
+ onClick: function onClick() {
130
+ removeFile(idx);
131
+ }
132
+ })]
133
+ }, idx);
134
+ })), exists.map(function (name) {
135
+ return /*#__PURE__*/jsx(FileExists, {
136
+ name: name
137
+ }, new Date().getTime());
138
+ })]
139
+ })
140
+ }, rest), {}, {
141
+ children: /*#__PURE__*/jsx("input", {
142
+ className: classNames("appearance-none bg-transparent py-1 px-2 flex-1 border-none outline-none ring-0", classes.fileInput, isArray(actualValue) && (actualValue === null || actualValue === void 0 ? void 0 : actualValue.length) && "text-[var(--fabric-bg)]"),
143
+ "aria-invalid": invalid,
144
+ "aria-disabled": disabled,
145
+ "aria-readonly": readOnly,
146
+ "aria-errormessage": error,
147
+ placeholder: placeholder,
148
+ disabled: disabled,
149
+ readOnly: readOnly,
150
+ size: 1,
151
+ type: "file",
152
+ multiple: multiple,
153
+ "data-testid": name,
154
+ name: name,
155
+ accept: accept,
156
+ ref: mergeRefs(ref, inputRef),
157
+ autoComplete: "off",
158
+ autoFocus: autoFocus,
159
+ onChange: handleChange,
160
+ onKeyDown: handleEnterPressed
161
+ })
162
+ }));
163
+ };
164
+
165
+ export { FileInput };
@@ -0,0 +1 @@
1
+ @layer comp{.fileInput{&::-webkit-file-upload-button{@apply bg-primary-500 opacity-80 hover:opacity-90 text-white rounded border-none py-0 cursor-pointer}&[aria-invalid=true]::-webkit-file-upload-button{@apply bg-danger-500}&:disabled::-webkit-file-upload-button{@apply bg-muted pointer-events-none}&[readOnly]{@apply pointer-events-none}}}