@react-fabric/form 1.0.0-beta.4 → 1.0.0-beta.40

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 (152) hide show
  1. package/{src/input/ArrayInput.module.css → css/_arrayInput.css} +8 -8
  2. package/css/_colorPicker.css +65 -0
  3. package/{src/internal/Field.module.css → css/_field.css} +26 -15
  4. package/{src/input/File.module.css → css/_file.css} +20 -6
  5. package/css/styles.css +27 -0
  6. package/dist/cjs/builder/FileField.js +37 -25
  7. package/dist/cjs/builder/FormField.js +44 -34
  8. package/dist/cjs/builder/SchemaEditor.js +72 -0
  9. package/dist/cjs/builder/components/AddSchemaFields.js +62 -0
  10. package/dist/cjs/builder/components/SchemaArrayForm.js +143 -0
  11. package/dist/cjs/builder/components/SchemaField.js +413 -0
  12. package/dist/cjs/form/Controller.js +1 -1
  13. package/dist/cjs/form/Form.js +19 -10
  14. package/dist/cjs/hooks/useFormBuilder.js +27 -15
  15. package/dist/cjs/index.js +9 -2
  16. package/dist/cjs/input/ArrayInput.js +36 -25
  17. package/dist/cjs/input/AvatarInput.js +1 -1
  18. package/dist/cjs/input/Checkbox.js +5 -4
  19. package/dist/cjs/input/ColorInput.js +70 -28
  20. package/dist/cjs/input/ColorPicker.js +1 -35
  21. package/dist/cjs/input/DateInput.js +183 -0
  22. package/dist/cjs/input/Field.js +4 -4
  23. package/dist/cjs/input/File.js +2 -3
  24. package/dist/cjs/input/Hidden.js +3 -1
  25. package/dist/cjs/input/Input.js +1 -1
  26. package/dist/cjs/input/Number.js +1 -1
  27. package/dist/cjs/input/Password.js +1 -1
  28. package/dist/cjs/input/Radio.js +1 -1
  29. package/dist/cjs/input/RadioGroup.js +6 -3
  30. package/dist/cjs/input/{Range.js → RangeSlider.js} +3 -3
  31. package/dist/cjs/input/Search.js +1 -1
  32. package/dist/cjs/input/Slider.js +1 -1
  33. package/dist/cjs/input/Switch.js +27 -5
  34. package/dist/cjs/input/Textarea.js +7 -3
  35. package/dist/cjs/internal/ErrorIcon.js +1 -1
  36. package/dist/cjs/internal/FieldWrapper.js +4 -3
  37. package/dist/cjs/internal/InputWrapper.js +14 -16
  38. package/dist/cjs/select/AutoComplete.js +1 -1
  39. package/dist/cjs/select/List.js +41 -20
  40. package/dist/cjs/select/Options.js +2 -2
  41. package/dist/cjs/select/Select.js +11 -8
  42. package/dist/cjs/select/useSelect.js +12 -7
  43. package/{src/input/ColorPicker.module.css → dist/cjs/types/schema.js} +18 -27
  44. package/dist/cjs/utils/getColor.js +6 -0
  45. package/dist/esm/builder/FileField.js +39 -27
  46. package/dist/esm/builder/FormField.js +44 -34
  47. package/dist/esm/builder/SchemaEditor.js +72 -0
  48. package/dist/esm/builder/components/AddSchemaFields.js +62 -0
  49. package/dist/esm/builder/components/SchemaArrayForm.js +143 -0
  50. package/dist/esm/builder/components/SchemaField.js +413 -0
  51. package/dist/esm/form/Controller.js +1 -1
  52. package/dist/esm/form/Form.js +19 -10
  53. package/dist/esm/hooks/useFormBuilder.js +25 -13
  54. package/dist/esm/index.js +4 -1
  55. package/dist/esm/input/ArrayInput.js +38 -27
  56. package/dist/esm/input/AvatarInput.js +1 -1
  57. package/dist/esm/input/Checkbox.js +5 -4
  58. package/dist/esm/input/ColorInput.js +72 -30
  59. package/dist/esm/input/ColorPicker.js +1 -35
  60. package/dist/esm/input/DateInput.js +183 -0
  61. package/dist/esm/input/Field.js +5 -5
  62. package/dist/esm/input/File.js +2 -3
  63. package/dist/esm/input/Hidden.js +3 -1
  64. package/dist/esm/input/Input.js +1 -1
  65. package/dist/esm/input/Number.js +1 -1
  66. package/dist/esm/input/Password.js +1 -1
  67. package/dist/esm/input/Radio.js +1 -1
  68. package/dist/esm/input/RadioGroup.js +7 -4
  69. package/dist/esm/input/{Range.js → RangeSlider.js} +3 -3
  70. package/dist/esm/input/Search.js +1 -1
  71. package/dist/esm/input/Slider.js +1 -1
  72. package/dist/esm/input/Switch.js +29 -7
  73. package/dist/esm/input/Textarea.js +7 -3
  74. package/dist/esm/internal/ErrorIcon.js +1 -1
  75. package/dist/esm/internal/FieldWrapper.js +4 -3
  76. package/dist/esm/internal/InputWrapper.js +14 -16
  77. package/dist/esm/select/AutoComplete.js +1 -1
  78. package/dist/esm/select/List.js +42 -21
  79. package/dist/esm/select/Options.js +2 -2
  80. package/dist/esm/select/Select.js +11 -8
  81. package/dist/esm/select/useSelect.js +13 -8
  82. package/dist/esm/types/schema.js +41 -0
  83. package/dist/esm/utils/getColor.js +6 -1
  84. package/dist/types/builder/FileField.d.ts +4 -2
  85. package/dist/types/builder/FormField.d.ts +3 -1
  86. package/dist/types/builder/SchemaEditor.d.ts +2 -0
  87. package/dist/types/builder/components/AddSchemaFields.d.ts +2 -0
  88. package/dist/types/builder/components/SchemaArrayForm.d.ts +2 -0
  89. package/dist/types/builder/components/SchemaField.d.ts +10 -0
  90. package/dist/types/form/Controller.d.ts +1 -1
  91. package/dist/types/hooks/useFormBuilder.d.ts +3 -1
  92. package/dist/types/index.d.ts +4 -2
  93. package/dist/types/input/ArrayInput.d.ts +20 -3
  94. package/dist/types/input/Checkbox.d.ts +4 -3
  95. package/dist/types/input/ColorInput.d.ts +1 -1
  96. package/dist/types/input/DateInput.d.ts +19 -0
  97. package/dist/types/input/RadioGroup.d.ts +18 -2
  98. package/dist/types/input/{Range.d.ts → RangeSlider.d.ts} +1 -1
  99. package/dist/types/input/Switch.d.ts +7 -3
  100. package/dist/types/input/Textarea.d.ts +5 -1
  101. package/dist/types/internal/InputWrapper.d.ts +1 -1
  102. package/dist/types/select/List.d.ts +1 -1
  103. package/dist/types/types/index.d.ts +9 -5
  104. package/dist/types/types/schema.d.ts +79 -33
  105. package/package.json +10 -7
  106. package/src/builder/FileField.tsx +53 -27
  107. package/src/builder/FormField.tsx +45 -32
  108. package/src/builder/SchemaEditor.tsx +72 -0
  109. package/src/builder/components/AddSchemaFields.tsx +74 -0
  110. package/src/builder/components/SchemaArrayForm.tsx +158 -0
  111. package/src/builder/components/SchemaField.tsx +435 -0
  112. package/src/form/Controller.tsx +2 -2
  113. package/src/form/Form.tsx +15 -8
  114. package/src/hooks/useFormBuilder.tsx +29 -15
  115. package/src/index.ts +10 -2
  116. package/src/input/ArrayInput.tsx +80 -42
  117. package/src/input/AvatarInput.tsx +1 -1
  118. package/src/input/Checkbox.tsx +5 -4
  119. package/src/input/ColorInput.tsx +102 -34
  120. package/src/input/ColorPicker.tsx +1 -35
  121. package/src/input/DateInput.tsx +248 -0
  122. package/src/input/Field.tsx +9 -11
  123. package/src/input/File.tsx +3 -6
  124. package/src/input/Hidden.tsx +4 -1
  125. package/src/input/Input.tsx +2 -2
  126. package/src/input/Number.tsx +2 -2
  127. package/src/input/Password.tsx +2 -2
  128. package/src/input/Radio.tsx +1 -1
  129. package/src/input/RadioGroup.tsx +27 -4
  130. package/src/input/{Range.tsx → RangeSlider.tsx} +2 -2
  131. package/src/input/Search.tsx +2 -2
  132. package/src/input/Slider.tsx +1 -1
  133. package/src/input/Switch.tsx +42 -6
  134. package/src/input/Textarea.tsx +11 -3
  135. package/src/internal/ErrorIcon.tsx +1 -1
  136. package/src/internal/FieldWrapper.tsx +3 -3
  137. package/src/internal/InputWrapper.tsx +21 -20
  138. package/src/select/AutoComplete.tsx +1 -1
  139. package/src/select/List.tsx +34 -7
  140. package/src/select/Options.tsx +1 -1
  141. package/src/select/Select.tsx +5 -2
  142. package/src/select/useSelect.tsx +27 -18
  143. package/src/types/index.ts +14 -7
  144. package/src/types/schema.ts +96 -41
  145. package/dist/cjs/input/ArrayInput.module.css +0 -1
  146. package/dist/cjs/input/ColorPicker.module.css +0 -1
  147. package/dist/cjs/input/File.module.css +0 -1
  148. package/dist/cjs/internal/Field.module.css +0 -1
  149. package/dist/esm/input/ArrayInput.module.css +0 -1
  150. package/dist/esm/input/ColorPicker.module.css +0 -1
  151. package/dist/esm/input/File.module.css +0 -1
  152. package/dist/esm/internal/Field.module.css +0 -1
@@ -46,7 +46,7 @@ var Controller = function Controller(_ref) {
46
46
  (_children$props$onCha = (_children$props = children.props).onChange) === null || _children$props$onCha === void 0 || _children$props$onCha.call(_children$props, v);
47
47
  }
48
48
  })) : children(_objectSpread(_objectSpread(_objectSpread({}, field), rest), {}, {
49
- inputRef: function inputRef(el) {
49
+ ref: function ref(el) {
50
50
  el && _ref3(el);
51
51
  },
52
52
  readOnly: isSubmitting,
@@ -7,6 +7,7 @@ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProper
7
7
  import _regeneratorRuntime from '@babel/runtime/regenerator';
8
8
  import { yupResolver } from '@hookform/resolvers/yup';
9
9
  import { useDebounce } from '@react-fabric/core';
10
+ import { EMPTY_OBJECT } from '@react-fabric/utilities';
10
11
  import { useRef, useTransition, useEffect, useCallback, useImperativeHandle } from 'react';
11
12
  import { useForm, FormProvider } from 'react-hook-form';
12
13
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -21,9 +22,10 @@ var Form = function Form(_ref) {
21
22
  var formRef = _ref.formRef,
22
23
  schema = _ref.schema,
23
24
  children = _ref.children,
24
- defaultValues = _ref.defaultValues,
25
+ _ref$defaultValues = _ref.defaultValues,
26
+ defaultValues = _ref$defaultValues === void 0 ? EMPTY_OBJECT : _ref$defaultValues,
25
27
  _ref$onSubmit = _ref.onSubmit,
26
- onSubmit = _ref$onSubmit === void 0 ? DEFAULT_SUBMIT : _ref$onSubmit,
28
+ _onSubmit = _ref$onSubmit === void 0 ? DEFAULT_SUBMIT : _ref$onSubmit,
27
29
  onChange = _ref.onChange,
28
30
  rest = _objectWithoutProperties(_ref, _excluded);
29
31
  var ref = useRef(null);
@@ -63,7 +65,7 @@ var Form = function Form(_ref) {
63
65
  return handleReset();
64
66
  },
65
67
  submit: function submit() {
66
- return form.handleSubmit(onSubmit);
68
+ return form.handleSubmit(_onSubmit);
67
69
  },
68
70
  validate: function () {
69
71
  var _validate = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
@@ -89,16 +91,20 @@ var Form = function Form(_ref) {
89
91
  return form.getValues();
90
92
  },
91
93
  setValues: function setValues(v) {
92
- return form.reset(v);
94
+ return setTimeout(function () {
95
+ return form.reset(v);
96
+ }, 50);
93
97
  },
94
98
  setValue: function setValue(k, v) {
95
- return form.setValue(k, v, {
96
- shouldDirty: false,
97
- shouldTouch: false
98
- });
99
+ return setTimeout(function () {
100
+ return form.setValue(k, v, {
101
+ shouldDirty: false,
102
+ shouldTouch: false
103
+ });
104
+ }, 50);
99
105
  }
100
106
  };
101
- }, [onSubmit, form, form.formState, defaultValues]);
107
+ }, [_onSubmit, form, form.formState, defaultValues]);
102
108
  var onInvalid = useCallback(function (_, e) {
103
109
  var el = e.target;
104
110
  setTimeout(function () {
@@ -112,7 +118,10 @@ var Form = function Form(_ref) {
112
118
  onReset: function onReset() {
113
119
  return handleReset(defaultValues);
114
120
  },
115
- onSubmit: form.handleSubmit(onSubmit, onInvalid),
121
+ onSubmit: function onSubmit(e) {
122
+ e.stopPropagation();
123
+ void form.handleSubmit(_onSubmit, onInvalid)(e);
124
+ },
116
125
  "data-loading": form.formState.isSubmitting,
117
126
  className: "contents",
118
127
  autoComplete: "off"
@@ -1,33 +1,42 @@
1
1
  'use client';
2
2
 
3
3
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
+ import { EmptyContent } from '@react-fabric/core';
4
5
  import { yup, isNil, isEmpty } from '@react-fabric/utilities';
5
6
  import { useMemo, Fragment } from 'react';
6
7
  import { FormField } from '../builder/FormField.js';
7
- import { jsx } from 'react/jsx-runtime';
8
+ import { DATA_TYPES } from '../types/schema.js';
9
+ import { jsxs, jsx } from 'react/jsx-runtime';
8
10
 
9
11
  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; }
10
12
  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; }
11
13
  var makeYupField = function makeYupField(field) {
12
- var yupField = yup.string();
13
- if (field.datatype === "schema") {
14
+ var yupField = yup.string().trim();
15
+ if (field.datatype === DATA_TYPES.SCHEMA) {
14
16
  var child = Object.fromEntries(field.schema.map(function (field) {
15
17
  return [field.id, makeYupField(field)];
16
18
  }));
17
19
  yupField = yup.object(child);
18
20
  }
19
- if (field.datatype === "boolean") yupField = yup["boolean"]();
20
- if (field.datatype === "decimal" || field.datatype === "number" || field.datatype === "range") {
21
+ if (field.datatype === DATA_TYPES.BOOL) {
22
+ yupField = yup["boolean"]();
23
+ if (field.required) yupField = yupField.test({
24
+ test: function test(value) {
25
+ return !!value;
26
+ }
27
+ });
28
+ }
29
+ if (field.datatype === DATA_TYPES.NUMBER || field.datatype === DATA_TYPES.RANGE) {
21
30
  yupField = yup.number();
22
31
  !isNil(field.min) && (yupField = yupField.min(field.min));
23
32
  !isNil(field.max) && (yupField = yupField.max(field.max));
24
- if (field.datatype === "range") yupField = yup.array(yupField);
33
+ if (field.datatype === DATA_TYPES.RANGE) yupField = yup.array(yupField);
25
34
  }
26
- if (field.datatype === "string") {
27
- field.options && (yupField = yupField.oneOf(field.options));
35
+ if (field.datatype === DATA_TYPES.STRING) {
36
+ field.options && !field.allowCustom && (yupField = yupField.oneOf(field.options));
28
37
  field.regex && (yupField = yupField.matches(new RegExp(field.regex)));
29
38
  }
30
- if (field.datatype === "file") {
39
+ if (field.datatype === DATA_TYPES.FILE) {
31
40
  yupField = yup.object({
32
41
  filename: yup.string().required(),
33
42
  path: yup.string().required()
@@ -64,19 +73,22 @@ var useFormBuilder = function useFormBuilder(schema) {
64
73
  var schemaDef = yup.object(Object.fromEntries(filteredSchema.map(function (field) {
65
74
  return [field.id, makeYupField(field)];
66
75
  })));
67
- var formDef = /*#__PURE__*/jsx(Fragment, {
68
- children: filteredSchema.map(function (field, idx) {
76
+ var formDef = /*#__PURE__*/jsxs(Fragment, {
77
+ children: [filteredSchema.map(function (field, idx) {
69
78
  return /*#__PURE__*/jsx("div", {
70
79
  className: "mb-4",
71
- children: field.datatype === "schema" ? null : /*#__PURE__*/jsx(FormField, _objectSpread(_objectSpread({}, field), {}, {
80
+ children: field.datatype === DATA_TYPES.SCHEMA ? null : /*#__PURE__*/jsx(FormField, _objectSpread(_objectSpread({}, field), {}, {
72
81
  autoFocus: idx === 0,
73
82
  fileUrl: options.fileUrl,
83
+ optionLists: options.optionLists,
74
84
  uploadHandler: options.uploadHandler,
75
85
  inline: options.inline,
76
86
  prefix: options.prefix
77
87
  }))
78
88
  }, field.id);
79
- })
89
+ }), filteredSchema.length === 0 && /*#__PURE__*/jsx(EmptyContent, {
90
+ message: "No schema defined"
91
+ })]
80
92
  });
81
93
  return {
82
94
  formDef: formDef,
package/dist/esm/index.js CHANGED
@@ -3,12 +3,15 @@
3
3
  import './i18n/index.js';
4
4
  export { Controller } from './form/Controller.js';
5
5
  export { Form } from './form/Form.js';
6
+ export { SchemaEditor } from './builder/SchemaEditor.js';
6
7
  export { useFileUploader } from './hooks/useFileUploader.js';
7
8
  export { useFormBuilder } from './hooks/useFormBuilder.js';
9
+ export { DATA_TYPES, SCHEMA_CUSTOM_LIST } from './types/schema.js';
8
10
  export { ArrayInput } from './input/ArrayInput.js';
9
11
  export { Checkbox } from './input/Checkbox.js';
10
12
  export { ColorInput } from './input/ColorInput.js';
11
13
  export { ColorPicker } from './input/ColorPicker.js';
14
+ export { DateInput } from './input/DateInput.js';
12
15
  export { Field } from './input/Field.js';
13
16
  export { FileInput } from './input/File.js';
14
17
  export { HiddenInput } from './input/Hidden.js';
@@ -17,7 +20,7 @@ export { Number } from './input/Number.js';
17
20
  export { Password } from './input/Password.js';
18
21
  export { Radio } from './input/Radio.js';
19
22
  export { RadioGroup } from './input/RadioGroup.js';
20
- export { Range } from './input/Range.js';
23
+ export { RangeSlider } from './input/RangeSlider.js';
21
24
  export { Search } from './input/Search.js';
22
25
  export { Slider } from './input/Slider.js';
23
26
  export { Switch } from './input/Switch.js';
@@ -4,29 +4,29 @@ import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
4
  import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
5
5
  import { DndContext } from '@dnd-kit/core';
6
6
  import { SortableContext, useSortable } from '@dnd-kit/sortable';
7
- import { Icon, CoreIcons, Button, Tooltip } from '@react-fabric/core';
7
+ import { Icon, CoreIcons, Tooltip, Button, cloneChildren } from '@react-fabric/core';
8
8
  import { isString } from '@react-fabric/utilities';
9
9
  import classNames from 'classnames';
10
- import { useMemo, useCallback, useImperativeHandle, Children, cloneElement } from 'react';
10
+ import { useMemo, useCallback, useImperativeHandle, cloneElement } from 'react';
11
11
  import { useFormContext, useFieldArray } from 'react-hook-form';
12
12
  import { useTranslation } from 'react-i18next';
13
13
  import { FieldWrapper } from '../internal/FieldWrapper.js';
14
- import classes from './ArrayInput.module.css';
15
14
  import { restrictToVerticalAxis } from '@dnd-kit/modifiers';
16
15
  import { CSS } from '@dnd-kit/utilities';
17
16
  import { jsx, jsxs } from 'react/jsx-runtime';
18
17
 
19
- var _excluded = ["name", "children", "addLabel", "fixedList", "focusName", "onAdd", "arrayRef", "enableSorting", "disabled", "readOnly", "minItems"];
18
+ var _excluded = ["name", "children", "addLabel", "fixedList", "focusName", "buttonPosition", "onAdd", "arrayRef", "enableSorting", "disabled", "readOnly", "minItems", "maxItems"];
20
19
  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; }
21
20
  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; }
22
21
  var ArrayInput = function ArrayInput(_ref) {
23
- var _error$values$label, _error$values, _error$values2;
24
22
  var name = _ref.name,
25
23
  children = _ref.children,
26
24
  addLabel = _ref.addLabel,
27
25
  fixedList = _ref.fixedList,
28
26
  _ref$focusName = _ref.focusName,
29
27
  focusName = _ref$focusName === void 0 ? "" : _ref$focusName,
28
+ _ref$buttonPosition = _ref.buttonPosition,
29
+ buttonPosition = _ref$buttonPosition === void 0 ? "bottom" : _ref$buttonPosition,
30
30
  onAdd = _ref.onAdd,
31
31
  arrayRef = _ref.arrayRef,
32
32
  enableSorting = _ref.enableSorting,
@@ -36,6 +36,8 @@ var ArrayInput = function ArrayInput(_ref) {
36
36
  readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
37
37
  _ref$minItems = _ref.minItems,
38
38
  minItems = _ref$minItems === void 0 ? 0 : _ref$minItems,
39
+ _ref$maxItems = _ref.maxItems,
40
+ maxItems = _ref$maxItems === void 0 ? Number.MAX_SAFE_INTEGER : _ref$maxItems,
39
41
  rest = _objectWithoutProperties(_ref, _excluded);
40
42
  var _useTranslation = useTranslation("form"),
41
43
  t = _useTranslation.t;
@@ -127,9 +129,37 @@ var ArrayInput = function ArrayInput(_ref) {
127
129
  }, [enableSorting]);
128
130
  // @ts-expect-error ignore
129
131
  SortableItem.displayName = "SortableItem";
132
+ var addButton = useMemo(function () {
133
+ var _error$values$label, _error$values, _error$values2;
134
+ return /*#__PURE__*/jsx("div", {
135
+ className: "flex justify-end",
136
+ children: /*#__PURE__*/jsx(Tooltip, {
137
+ color: "danger-200",
138
+ content: isString(error) ? "".concat(error) : t(error === null || error === void 0 ? void 0 : error.key, error !== null && error !== void 0 && error.values ? _objectSpread(_objectSpread({}, error === null || error === void 0 ? void 0 : error.values), {}, {
139
+ label: t((_error$values$label = (_error$values = error.values) === null || _error$values === void 0 ? void 0 : _error$values.label) !== null && _error$values$label !== void 0 ? _error$values$label : "form:badkey", (_error$values2 = error.values) === null || _error$values2 === void 0 ? void 0 : _error$values2.path)
140
+ }) : {}),
141
+ children: /*#__PURE__*/jsx(Button, {
142
+ size: "sm",
143
+ "aria-label": "Add item",
144
+ icon: CoreIcons.insert,
145
+ onClick: function onClick() {
146
+ return handleAdd(onAdd === null || onAdd === void 0 ? void 0 : onAdd());
147
+ },
148
+ "data-invalid": !!error,
149
+ disabled: !!disabled || readOnly || fields.length > maxItems,
150
+ className: classNames("fabric-addButton", "me-10"),
151
+ children: addLabel !== null && addLabel !== void 0 ? addLabel : t("addArray")
152
+ })
153
+ })
154
+ });
155
+ }, [error, fields, handleAdd, disabled, readOnly, addLabel, maxItems]);
130
156
  return /*#__PURE__*/jsxs("div", {
131
- className: classes.arrayInput,
157
+ className: "fabric-arrayInput",
132
158
  children: [/*#__PURE__*/jsx(FieldWrapper, _objectSpread(_objectSpread({}, rest), {}, {
159
+ appendLabel: /*#__PURE__*/jsx("div", {
160
+ className: "-me-2",
161
+ children: !fixedList && onAdd && buttonPosition !== "bottom" && addButton
162
+ }),
133
163
  children: /*#__PURE__*/jsx(Wrapper, {
134
164
  children: fields.map(function (item, index) {
135
165
  return /*#__PURE__*/jsxs(SortableItem, {
@@ -138,7 +168,7 @@ var ArrayInput = function ArrayInput(_ref) {
138
168
  children: [typeof children === "function" ? children({
139
169
  index: index,
140
170
  name: "".concat(name, ".").concat(index)
141
- }) : Children.map(children, function (child) {
171
+ }) : cloneChildren(children, function (child) {
142
172
  return /*#__PURE__*/cloneElement(child, Object.assign({
143
173
  disabled: disabled,
144
174
  readOnly: readOnly,
@@ -163,26 +193,7 @@ var ArrayInput = function ArrayInput(_ref) {
163
193
  }, item.id);
164
194
  })
165
195
  })
166
- })), !fixedList && onAdd && /*#__PURE__*/jsx("div", {
167
- className: "flex justify-end",
168
- children: /*#__PURE__*/jsx(Tooltip, {
169
- color: "danger",
170
- content: isString(error) ? "".concat(error) : t(error === null || error === void 0 ? void 0 : error.key, error !== null && error !== void 0 && error.values ? _objectSpread(_objectSpread({}, error === null || error === void 0 ? void 0 : error.values), {}, {
171
- label: t((_error$values$label = (_error$values = error.values) === null || _error$values === void 0 ? void 0 : _error$values.label) !== null && _error$values$label !== void 0 ? _error$values$label : "form:badkey", (_error$values2 = error.values) === null || _error$values2 === void 0 ? void 0 : _error$values2.path)
172
- }) : {}),
173
- children: /*#__PURE__*/jsx(Button, {
174
- "aria-label": "Add item",
175
- icon: CoreIcons.insert,
176
- onClick: function onClick() {
177
- return handleAdd(onAdd());
178
- },
179
- "data-invalid": !!error,
180
- disabled: !!disabled || readOnly,
181
- className: classNames(classes.addButton, "me-10"),
182
- children: addLabel !== null && addLabel !== void 0 ? addLabel : t("addArray")
183
- })
184
- })
185
- })]
196
+ })), !fixedList && onAdd && buttonPosition !== "top" && addButton]
186
197
  });
187
198
  };
188
199
 
@@ -80,7 +80,7 @@ var AvatarInput = function AvatarInput(_ref) {
80
80
  size: size,
81
81
  avatar: base64
82
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",
83
+ className: "absolute inset-x-0 bottom-0 cursor-pointer bg-black/20 hover:bg-black/50 text-white text-xs text-center py-1",
84
84
  children: [/*#__PURE__*/jsx("span", {
85
85
  children: "Edit"
86
86
  }), /*#__PURE__*/jsx("input", {
@@ -9,7 +9,7 @@ import { useState, useDeferredValue, useMemo, useEffect, useCallback } from 'rea
9
9
  import { ErrorIcon } from '../internal/ErrorIcon.js';
10
10
  import { jsxs, jsx } from 'react/jsx-runtime';
11
11
 
12
- var _excluded = ["ref", "label", "value", "name", "checked", "invalid", "disabled", "error", "width", "icon", "iconChecked", "onChange"];
12
+ var _excluded = ["ref", "label", "value", "name", "checked", "invalid", "disabled", "error", "width", "icon", "iconChecked", "required", "onChange"];
13
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
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
15
  var Checkbox = function Checkbox(_ref) {
@@ -23,8 +23,9 @@ var Checkbox = function Checkbox(_ref) {
23
23
  error = _ref.error,
24
24
  width = _ref.width,
25
25
  icon = _ref.icon,
26
- iconChecked = _ref.iconChecked,
27
- onChange = _ref.onChange,
26
+ iconChecked = _ref.iconChecked;
27
+ _ref.required;
28
+ var onChange = _ref.onChange,
28
29
  rest = _objectWithoutProperties(_ref, _excluded);
29
30
  var _useState = useState(false),
30
31
  _useState2 = _slicedToArray(_useState, 2),
@@ -66,7 +67,7 @@ var Checkbox = function Checkbox(_ref) {
66
67
  checked: actualValue,
67
68
  onChange: handleChange
68
69
  }, rest)), /*#__PURE__*/jsx(Icon, {
69
- className: classNames("p-0.5", actualValue && icon && !iconChecked && "bg-primary-500 text-white"),
70
+ className: classNames("p-0.5", actualValue && icon && !iconChecked && "bg-primary-500 text-white!"),
70
71
  size: "1.25em",
71
72
  color: invalid ? "danger" : "primary",
72
73
  icon: actualValue ? iconOn : iconOff
@@ -3,10 +3,11 @@
3
3
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
4
  import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
5
5
  import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
6
- import { Dropdown, Icon, CoreIcons } from '@react-fabric/core';
6
+ import { useFloating, autoUpdate, shift, flip, offset, arrow, useClick, useDismiss, useInteractions, FloatingArrow } from '@floating-ui/react';
7
+ import { Icon, CoreIcons } from '@react-fabric/core';
7
8
  import { isString } from '@react-fabric/utilities';
8
9
  import classNames from 'classnames';
9
- import { useState, useDeferredValue, useEffect, useCallback, startTransition } from 'react';
10
+ import { useState, useDeferredValue, useEffect, useCallback, startTransition, useRef } from 'react';
10
11
  import { ColorPicker } from './ColorPicker.js';
11
12
  import { jsxs, jsx } from 'react/jsx-runtime';
12
13
 
@@ -40,44 +41,85 @@ var ColorInput = function ColorInput(_ref) {
40
41
  var handleChange = useCallback(function (e) {
41
42
  setActualValue(e !== null && e !== void 0 ? e : defaultColor);
42
43
  onChange != null && startTransition(function () {
43
- return onChange(e);
44
+ return onChange(e !== null && e !== void 0 ? e : null);
44
45
  });
45
46
  }, [onChange]);
47
+ var arrowRef = useRef(null);
48
+ var _useState3 = useState(false),
49
+ _useState4 = _slicedToArray(_useState3, 2),
50
+ isOpen = _useState4[0],
51
+ setIsOpen = _useState4[1];
52
+ var _useFloating = useFloating({
53
+ open: isOpen,
54
+ onOpenChange: function onOpenChange(open, _, reason) {
55
+ if (reason === "reference-press") return;
56
+ setIsOpen(open);
57
+ },
58
+ strategy: "fixed",
59
+ placement: "bottom",
60
+ whileElementsMounted: autoUpdate,
61
+ middleware: [shift({
62
+ padding: 8
63
+ }), flip(), offset(9), arrow({
64
+ element: arrowRef
65
+ })]
66
+ }),
67
+ refs = _useFloating.refs,
68
+ floatingStyles = _useFloating.floatingStyles,
69
+ context = _useFloating.context;
70
+ var click = useClick(context, {
71
+ enabled: !disabled
72
+ });
73
+ var dismiss = useDismiss(context, {
74
+ referencePress: true
75
+ });
76
+ var _useInteractions = useInteractions([dismiss, click]),
77
+ getReferenceProps = _useInteractions.getReferenceProps,
78
+ getFloatingProps = _useInteractions.getFloatingProps;
46
79
  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"),
80
+ 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-(--fabric-input) outline overflow-hidden"),
48
81
  children: [decorateStart && /*#__PURE__*/jsx("div", {
49
82
  className: classNames("text-muted leading-none flex-content", isString(decorateStart) && "px-2"),
50
83
  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
- })
84
+ }), /*#__PURE__*/jsx("button", _objectSpread(_objectSpread({
85
+ "data-ref": "button",
86
+ className: "flex-1 flex items-center",
87
+ ref: refs.setReference
88
+ }, getReferenceProps()), {}, {
89
+ "data-inner-clickable": "true",
90
+ "data-dropdown-open": isOpen ? true : undefined,
91
+ children: /*#__PURE__*/jsx("div", {
92
+ role: "none",
93
+ 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",
94
+ style: {
95
+ backgroundColor: actualValue,
96
+ opacity: disabled ? 0.65 : 1,
97
+ pointerEvents: disabled ? "none" : undefined
98
+ },
99
+ children: !actualValue && /*#__PURE__*/jsx(Icon, {
100
+ size: "md",
101
+ className: "text-muted",
102
+ icon: CoreIcons.colorSwatch
74
103
  })
75
- }), /*#__PURE__*/jsx(ColorPicker, _objectSpread(_objectSpread({}, rest), {}, {
104
+ })
105
+ })), isOpen && /*#__PURE__*/jsxs("div", _objectSpread(_objectSpread({
106
+ ref: refs.setFloating,
107
+ style: _objectSpread({
108
+ zIndex: "var(--z-popover)"
109
+ }, floatingStyles),
110
+ "data-ref": "dropdownBody"
111
+ }, getFloatingProps()), {}, {
112
+ children: [/*#__PURE__*/jsx(ColorPicker, _objectSpread(_objectSpread({}, rest), {}, {
76
113
  onChange: handleChange,
77
114
  defaultColor: defaultColor,
78
115
  value: actualValue
79
- }))]
80
- }), !disabled && showPicker && /*#__PURE__*/jsx(Icon, {
116
+ })), /*#__PURE__*/jsx(FloatingArrow, {
117
+ ref: arrowRef,
118
+ context: context,
119
+ strokeWidth: 0.5,
120
+ className: "fill-base stroke-muted"
121
+ })]
122
+ })), !disabled && showPicker && /*#__PURE__*/jsx(Icon, {
81
123
  icon: CoreIcons.colorPicker,
82
124
  onClick: function onClick() {
83
125
  return window.EyeDropper && new window.EyeDropper().open().then(function (resp) {
@@ -5,7 +5,6 @@ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
5
5
  import Color from 'color';
6
6
  import { memo, useState, useDeferredValue, useEffect, useCallback, startTransition } from 'react';
7
7
  import { SketchPicker } from 'react-color';
8
- import classes from './ColorPicker.module.css';
9
8
  import { jsx } from 'react/jsx-runtime';
10
9
 
11
10
  var _excluded = ["a"],
@@ -37,16 +36,13 @@ var ColorPicker = /*#__PURE__*/memo(function (_ref) {
37
36
  }, [onChange]);
38
37
  return /*#__PURE__*/jsx(SketchPicker, {
39
38
  width: "16rem",
40
- className: classes.colorPicker,
39
+ className: "fabric-colorPicker",
41
40
  styles: {
42
41
  "default": {
43
42
  hue: {
44
- borderRadius: "99px",
45
43
  boxShadow: "0 0 1px 1px var(--color-shadow)"
46
44
  },
47
45
  alpha: {
48
- height: "1rem",
49
- borderRadius: "99px",
50
46
  backgroundColor: "var(--fabric-bg)",
51
47
  boxShadow: "0 0 1px 1px var(--color-shadow)"
52
48
  },
@@ -63,36 +59,6 @@ var ColorPicker = /*#__PURE__*/memo(function (_ref) {
63
59
  backgroundColor: "var(--fabric-bg)",
64
60
  boxShadow: "0 0 0 1px var(--color-shadow), 0 0 8px var(--fabric-shadow)"
65
61
  },
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
62
  checkboard: {
97
63
  white: "transparent",
98
64
  black: "red"