@algolia/satellite 1.0.0 → 1.1.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.
- package/dist/cjs/AutoComplete/AutoComplete.d.ts +1 -1
- package/dist/cjs/AutoComplete/AutoComplete.js +49 -26
- package/dist/cjs/AutoComplete/AutoComplete.tailwind.js +9 -1
- package/dist/cjs/AutoComplete/types.d.ts +1 -0
- package/dist/cjs/Checkbox/Checkbox.d.ts +1 -1
- package/dist/cjs/Checkbox/Checkbox.js +21 -13
- package/dist/cjs/Checkbox/Checkbox.tailwind.js +8 -2
- package/dist/cjs/DatePicker/DatePicker/DatePicker.d.ts +4 -2
- package/dist/cjs/DatePicker/DatePicker/DatePicker.js +18 -7
- package/dist/cjs/DatePicker/components/Display.d.ts +3 -3
- package/dist/cjs/DatePicker/components/Display.js +16 -5
- package/dist/cjs/Dropzone/Dropzone.d.ts +4 -2
- package/dist/cjs/Dropzone/Dropzone.js +23 -12
- package/dist/cjs/Field/Field.d.ts +1 -0
- package/dist/cjs/Field/Field.js +63 -11
- package/dist/cjs/Field/FieldContext.d.ts +3 -0
- package/dist/cjs/Field/useField.d.ts +4 -1
- package/dist/cjs/Field/useField.js +17 -1
- package/dist/cjs/Form/Form.d.ts +16 -0
- package/dist/cjs/Form/Form.js +140 -0
- package/dist/cjs/Form/FormContext.d.ts +13 -0
- package/dist/cjs/Form/FormContext.js +8 -0
- package/dist/cjs/Form/index.d.ts +3 -0
- package/dist/cjs/Form/index.js +27 -0
- package/dist/cjs/Form/stories/AsynchronousValidation.js +396 -0
- package/dist/cjs/Form/stories/Complex.js +928 -0
- package/dist/cjs/Form/stories/DependentFieldsValidation.js +249 -0
- package/dist/cjs/Form/stories/DirtyFields.js +339 -0
- package/dist/cjs/Form/stories/DynamicFieldsValidation.js +425 -0
- package/dist/cjs/Form/stories/FieldArrays.js +549 -0
- package/dist/cjs/Form/stories/ValidationStrategies.js +455 -0
- package/dist/cjs/Form/stories/utils/useFormikAutoFocusOnError.js +22 -0
- package/dist/cjs/Form/useForm.d.ts +1 -0
- package/dist/cjs/Form/useForm.js +11 -0
- package/dist/cjs/Input/Input.js +22 -9
- package/dist/cjs/Input/Input.tailwind.js +7 -2
- package/dist/cjs/Pagination/DotPagination/DotPagination.d.ts +1 -1
- package/dist/cjs/RadioGroup/RadioButton.d.ts +1 -1
- package/dist/cjs/RadioGroup/RadioButton.js +16 -3
- package/dist/cjs/RadioGroup/RadioButton.tailwind.js +23 -0
- package/dist/cjs/RadioGroup/RadioGroup.d.ts +7 -5
- package/dist/cjs/RadioGroup/RadioGroup.js +78 -16
- package/dist/cjs/RadioGroup/{RadiogroupContext.d.ts → RadioGroupContext.d.ts} +8 -1
- package/dist/cjs/RangeSlider/RangeSlider.d.ts +2 -3
- package/dist/cjs/RangeSlider/RangeSlider.js +27 -10
- package/dist/cjs/Satellite/locale.d.ts +2 -0
- package/dist/cjs/Select/Select.js +39 -6
- package/dist/cjs/Select/Select.tailwind.js +19 -0
- package/dist/cjs/Stepper/Step.js +2 -2
- package/dist/cjs/Switch/Switch.js +2 -2
- package/dist/cjs/Switch/SwitchOption.js +3 -3
- package/dist/cjs/Tables/DataTable/DataTable.d.ts +1 -1
- package/dist/cjs/Tag/Tag.d.ts +1 -1
- package/dist/cjs/TextArea/TextArea.d.ts +1 -0
- package/dist/cjs/TextArea/TextArea.js +47 -8
- package/dist/cjs/TextArea/TextArea.tailwind.js +41 -4
- package/dist/cjs/Toggle/Toggle.d.ts +1 -1
- package/dist/cjs/Toggle/Toggle.js +23 -6
- package/dist/cjs/Toggle/Toggle.tailwind.js +9 -0
- package/dist/cjs/Tooltip/Tooltip.d.ts +1 -1
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +12 -0
- package/dist/cjs/utils/isCssPropertySupported.d.ts +1 -1
- package/dist/cjs/utils/mergeRefs.d.ts +2 -0
- package/dist/cjs/utils/mergeRefs.js +17 -0
- package/dist/esm/AutoComplete/AutoComplete.d.ts +1 -1
- package/dist/esm/AutoComplete/AutoComplete.js +52 -27
- package/dist/esm/AutoComplete/AutoComplete.tailwind.js +9 -1
- package/dist/esm/AutoComplete/types.d.ts +1 -0
- package/dist/esm/Checkbox/Checkbox.d.ts +1 -1
- package/dist/esm/Checkbox/Checkbox.js +21 -13
- package/dist/esm/Checkbox/Checkbox.tailwind.js +8 -2
- package/dist/esm/DatePicker/DatePicker/DatePicker.d.ts +4 -2
- package/dist/esm/DatePicker/DatePicker/DatePicker.js +19 -8
- package/dist/esm/DatePicker/components/Display.d.ts +3 -3
- package/dist/esm/DatePicker/components/Display.js +15 -5
- package/dist/esm/Dropzone/Dropzone.d.ts +4 -2
- package/dist/esm/Dropzone/Dropzone.js +24 -13
- package/dist/esm/Field/Field.d.ts +1 -0
- package/dist/esm/Field/Field.js +64 -12
- package/dist/esm/Field/FieldContext.d.ts +3 -0
- package/dist/esm/Field/useField.d.ts +4 -1
- package/dist/esm/Field/useField.js +17 -2
- package/dist/esm/Form/Form.d.ts +16 -0
- package/dist/esm/Form/Form.js +135 -0
- package/dist/esm/Form/FormContext.d.ts +13 -0
- package/dist/esm/Form/FormContext.js +2 -0
- package/dist/esm/Form/index.d.ts +3 -0
- package/dist/esm/Form/index.js +3 -0
- package/dist/esm/Form/stories/AsynchronousValidation.js +387 -0
- package/dist/esm/Form/stories/Complex.js +919 -0
- package/dist/esm/Form/stories/DependentFieldsValidation.js +240 -0
- package/dist/esm/Form/stories/DirtyFields.js +330 -0
- package/dist/esm/Form/stories/DynamicFieldsValidation.js +416 -0
- package/dist/esm/Form/stories/FieldArrays.js +544 -0
- package/dist/esm/Form/stories/ValidationStrategies.js +446 -0
- package/dist/esm/Form/stories/utils/useFormikAutoFocusOnError.js +16 -0
- package/dist/esm/Form/useForm.d.ts +1 -0
- package/dist/esm/Form/useForm.js +5 -0
- package/dist/esm/Input/Input.js +22 -9
- package/dist/esm/Input/Input.tailwind.js +7 -2
- package/dist/esm/Pagination/DotPagination/DotPagination.d.ts +1 -1
- package/dist/esm/RadioGroup/RadioButton.d.ts +1 -1
- package/dist/esm/RadioGroup/RadioButton.js +16 -3
- package/dist/esm/RadioGroup/RadioButton.tailwind.js +23 -0
- package/dist/esm/RadioGroup/RadioGroup.d.ts +7 -5
- package/dist/esm/RadioGroup/RadioGroup.js +77 -15
- package/dist/esm/RadioGroup/{RadiogroupContext.d.ts → RadioGroupContext.d.ts} +8 -1
- package/dist/esm/RangeSlider/RangeSlider.d.ts +2 -3
- package/dist/esm/RangeSlider/RangeSlider.js +27 -10
- package/dist/esm/Satellite/locale.d.ts +2 -0
- package/dist/esm/Select/Select.js +41 -7
- package/dist/esm/Select/Select.tailwind.js +19 -0
- package/dist/esm/Stepper/Step.js +2 -2
- package/dist/esm/Switch/Switch.js +1 -1
- package/dist/esm/Switch/SwitchOption.js +2 -2
- package/dist/esm/Tables/DataTable/DataTable.d.ts +1 -1
- package/dist/esm/Tag/Tag.d.ts +1 -1
- package/dist/esm/TextArea/TextArea.d.ts +1 -0
- package/dist/esm/TextArea/TextArea.js +49 -9
- package/dist/esm/TextArea/TextArea.tailwind.js +41 -4
- package/dist/esm/Toggle/Toggle.d.ts +1 -1
- package/dist/esm/Toggle/Toggle.js +23 -6
- package/dist/esm/Toggle/Toggle.tailwind.js +9 -0
- package/dist/esm/Tooltip/Tooltip.d.ts +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/utils/isCssPropertySupported.d.ts +1 -1
- package/dist/esm/utils/mergeRefs.d.ts +2 -0
- package/dist/esm/utils/mergeRefs.js +11 -0
- package/dist/satellite.min.css +1 -1
- package/package.json +13 -7
- /package/dist/cjs/RadioGroup/{RadiogroupContext.js → RadioGroupContext.js} +0 -0
- /package/dist/esm/RadioGroup/{RadiogroupContext.js → RadioGroupContext.js} +0 -0
@@ -3,12 +3,12 @@ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
3
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
4
4
|
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
5
5
|
import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
|
6
|
-
var _excluded = ["id", "placeholder", "disabled", "multiple", "clearable", "onChange", "className", "locale"];
|
7
|
-
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9
|
6
|
+
var _excluded = ["id", "placeholder", "disabled", "multiple", "clearable", "onChange", "className", "locale", "required"];
|
7
|
+
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9;
|
8
8
|
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; }
|
9
9
|
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; }
|
10
10
|
import cx from "clsx";
|
11
|
-
import { Fragment, useCallback, useMemo, useState } from "react";
|
11
|
+
import { forwardRef, Fragment, useCallback, useMemo, useState } from "react";
|
12
12
|
import { useDropzone } from "react-dropzone";
|
13
13
|
import { IconButton } from "../Button";
|
14
14
|
import { useField } from "../Field";
|
@@ -48,7 +48,7 @@ var ValidatedIcon = function ValidatedIcon() {
|
|
48
48
|
*
|
49
49
|
* See the [Dropzone documentation page](https://satellite.algolia.com/components/forms/dropzone) for more information.
|
50
50
|
*/
|
51
|
-
export var Dropzone = function
|
51
|
+
export var Dropzone = /*#__PURE__*/forwardRef(function (_ref2, ref) {
|
52
52
|
var id = _ref2.id,
|
53
53
|
placeholder = _ref2.placeholder,
|
54
54
|
disabled = _ref2.disabled,
|
@@ -59,6 +59,8 @@ export var Dropzone = function Dropzone(_ref2) {
|
|
59
59
|
onChange = _ref2.onChange,
|
60
60
|
className = _ref2.className,
|
61
61
|
propsLocale = _ref2.locale,
|
62
|
+
_ref2$required = _ref2.required,
|
63
|
+
required = _ref2$required === void 0 ? false : _ref2$required,
|
62
64
|
props = _objectWithoutProperties(_ref2, _excluded);
|
63
65
|
var contextLocale = useLocale("dropzone");
|
64
66
|
var locale = _objectSpread(_objectSpread(_objectSpread({}, DEFAULT_DROPZONE_LOCALE), contextLocale), propsLocale);
|
@@ -70,9 +72,13 @@ export var Dropzone = function Dropzone(_ref2) {
|
|
70
72
|
_useState4 = _slicedToArray(_useState3, 2),
|
71
73
|
focused = _useState4[0],
|
72
74
|
setFocused = _useState4[1];
|
73
|
-
var _useField = useField(
|
75
|
+
var _useField = useField({
|
76
|
+
required: required
|
77
|
+
}),
|
74
78
|
status = _useField.state.status,
|
75
|
-
labelId = _useField.labelId
|
79
|
+
labelId = _useField.labelId,
|
80
|
+
descriptionId = _useField.descriptionId,
|
81
|
+
inputId = _useField.inputId;
|
76
82
|
var onDrop = useCallback(function (acceptedFiles, fileRejections) {
|
77
83
|
var updatedFiles = multiple ? [].concat(_toConsumableArray(files), _toConsumableArray(acceptedFiles)) : acceptedFiles;
|
78
84
|
setFiles(updatedFiles);
|
@@ -94,14 +100,19 @@ export var Dropzone = function Dropzone(_ref2) {
|
|
94
100
|
isDragActive = _useDropzone.isDragActive,
|
95
101
|
isDragReject = _useDropzone.isDragReject;
|
96
102
|
var dropzoneId = useMemo(function () {
|
97
|
-
|
98
|
-
|
103
|
+
var _ref3;
|
104
|
+
return (_ref3 = id !== null && id !== void 0 ? id : inputId) !== null && _ref3 !== void 0 ? _ref3 : uniqueId("dropzone");
|
105
|
+
}, [id, inputId]);
|
99
106
|
var isValueEmpty = files.length === 0;
|
100
107
|
var isInvalid = status === "invalid";
|
101
108
|
var StatusIcon = isInvalid ? InvalidIcon : status === "validated" ? ValidatedIcon : Fragment;
|
102
109
|
return /*#__PURE__*/_jsxs("div", _objectSpread(_objectSpread({}, getRootProps({
|
110
|
+
ref: ref,
|
103
111
|
"aria-controls": dropzoneId,
|
104
|
-
|
112
|
+
"aria-labelledby": labelId,
|
113
|
+
"aria-describedby": descriptionId,
|
114
|
+
"aria-invalid": isInvalid,
|
115
|
+
className: cx(stl(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n relative flex items-center group/dropzone\n border rounded\n overflow-hidden transition-all ease-in-out delay-100\n focus-within:shadow-field-focused\n min-h-16\n ", "\n ", "\n ", "\n ", ""])), focused && "border-accent-600 shadow-field-focused", disabled ? "cursor-not-allowed border-grey-200/30 shadow-none bg-gradient-to-b from-white to-grey-100" : "shadow-field cursor-pointer", isDragReject && !disabled ? "border-red-200 cursor-not-allowed" : isDragActive ? "border-accent-500 cursor-pointer" : null, isInvalid ? "bg-red-100 border-red-700 hover:bg-red-50 focus-within:outline focus-within:outline-red-700 focus-within:outline-1" : "border-grey-500 bg-white focus-within:border-accent-600 hover:bg-grey-50"), className),
|
105
116
|
onClick: function onClick(evt) {
|
106
117
|
// Helps with https://github.com/react-dropzone/react-dropzone/issues/182
|
107
118
|
if (evt.target.closest("label")) {
|
@@ -111,7 +122,7 @@ export var Dropzone = function Dropzone(_ref2) {
|
|
111
122
|
})), {}, {
|
112
123
|
children: [/*#__PURE__*/_jsx("input", _objectSpread({}, getInputProps({
|
113
124
|
id: dropzoneId,
|
114
|
-
|
125
|
+
required: required,
|
115
126
|
onFocus: function onFocus() {
|
116
127
|
return setFocused(true);
|
117
128
|
},
|
@@ -141,9 +152,8 @@ export var Dropzone = function Dropzone(_ref2) {
|
|
141
152
|
})]
|
142
153
|
})
|
143
154
|
}), clearable && !disabled && !isValueEmpty && /*#__PURE__*/_jsx("span", {
|
144
|
-
className: stl(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral([""]))),
|
145
155
|
children: /*#__PURE__*/_jsx(IconButton, {
|
146
|
-
className: stl(
|
156
|
+
className: stl(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["mr-2 ", ""])), focused ? "visible" : "invisible group-hover/dropzone:visible"),
|
147
157
|
title: locale.clearInput,
|
148
158
|
icon: XIcon,
|
149
159
|
variant: "subtle",
|
@@ -154,4 +164,5 @@ export var Dropzone = function Dropzone(_ref2) {
|
|
154
164
|
})
|
155
165
|
}), /*#__PURE__*/_jsx(StatusIcon, {})]
|
156
166
|
}));
|
157
|
-
};
|
167
|
+
});
|
168
|
+
Dropzone.displayName = "Dropzone";
|
package/dist/esm/Field/Field.js
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
|
2
|
-
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
3
|
+
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10;
|
3
4
|
import cx from "clsx";
|
4
|
-
import { useMemo } from "react";
|
5
|
+
import { useEffect, useMemo, useState } from "react";
|
6
|
+
import { useExperimentalForm } from "../Form/useForm";
|
5
7
|
import { AlertCircleIcon } from "../Icons";
|
6
8
|
import stl from "../styles/helpers/satellitePrefixer";
|
7
9
|
import { uniqueId } from "../utils";
|
10
|
+
import { getTextFromReactNode } from "../utils/getTextFromReactNode";
|
8
11
|
import { DEFAULT_FIELD_STATE, FieldContext } from "./FieldContext";
|
9
12
|
import { jsx as _jsx } from "react/jsx-runtime";
|
10
13
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
@@ -16,13 +19,14 @@ import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
16
19
|
export var Field = function Field(_ref) {
|
17
20
|
var className = _ref.className,
|
18
21
|
label = _ref.label,
|
19
|
-
|
22
|
+
labelForProp = _ref.labelFor,
|
20
23
|
labelIdProp = _ref.labelId,
|
21
24
|
description = _ref.description,
|
22
25
|
_ref$state = _ref.state,
|
23
26
|
state = _ref$state === void 0 ? DEFAULT_FIELD_STATE : _ref$state,
|
24
27
|
_ref$inline = _ref.inline,
|
25
28
|
inline = _ref$inline === void 0 ? false : _ref$inline,
|
29
|
+
requiredProp = _ref.required,
|
26
30
|
children = _ref.children;
|
27
31
|
var hasLabel = !!label;
|
28
32
|
var labelId = useMemo(
|
@@ -30,37 +34,85 @@ export var Field = function Field(_ref) {
|
|
30
34
|
function () {
|
31
35
|
return hasLabel ? labelIdProp !== null && labelIdProp !== void 0 ? labelIdProp : uniqueId("stl-field-label-") : undefined;
|
32
36
|
}, [labelIdProp, hasLabel]);
|
37
|
+
var hasLabelFor = !!labelForProp;
|
38
|
+
var labelFor = useMemo(
|
39
|
+
// eslint-disable-next-line @algolia/stl/prefer-stl-helper
|
40
|
+
function () {
|
41
|
+
return hasLabelFor ? labelForProp : uniqueId("stl-field-input-");
|
42
|
+
}, [labelForProp, hasLabelFor]);
|
43
|
+
var descriptionId = useMemo(
|
44
|
+
// eslint-disable-next-line @algolia/stl/prefer-stl-helper
|
45
|
+
function () {
|
46
|
+
return description || state.status === "invalid" ? uniqueId("stl-field-description-") : undefined;
|
47
|
+
}, [description, state.status]);
|
48
|
+
var _useState = useState(undefined),
|
49
|
+
_useState2 = _slicedToArray(_useState, 2),
|
50
|
+
requiredContext = _useState2[0],
|
51
|
+
setRequiredContext = _useState2[1];
|
52
|
+
if (process.env.NODE_ENV !== "production") {
|
53
|
+
if (typeof requiredProp !== "undefined" && typeof requiredContext !== "undefined" && requiredProp !== requiredContext) {
|
54
|
+
console.warn("The `required` prop is set to different values on both the Field (`required=".concat(requiredProp, "`) and the underlying input component (`required=").concat(requiredContext, "`)."));
|
55
|
+
}
|
56
|
+
}
|
57
|
+
var form = useExperimentalForm();
|
58
|
+
var addField = form === null || form === void 0 ? void 0 : form.addField;
|
59
|
+
var removeField = form === null || form === void 0 ? void 0 : form.removeField;
|
60
|
+
useEffect(function () {
|
61
|
+
addField === null || addField === void 0 || addField({
|
62
|
+
state: state,
|
63
|
+
label: getTextFromReactNode(label),
|
64
|
+
labelFor: labelFor
|
65
|
+
});
|
66
|
+
return function () {
|
67
|
+
removeField === null || removeField === void 0 || removeField({
|
68
|
+
state: state,
|
69
|
+
label: getTextFromReactNode(label),
|
70
|
+
labelFor: labelFor
|
71
|
+
});
|
72
|
+
};
|
73
|
+
}, [addField, removeField, state, labelFor, label]);
|
33
74
|
return /*#__PURE__*/_jsx(FieldContext.Provider, {
|
34
75
|
value: {
|
35
76
|
state: state,
|
36
|
-
labelId: labelId
|
77
|
+
labelId: labelId,
|
78
|
+
descriptionId: descriptionId,
|
79
|
+
inputId: labelFor,
|
80
|
+
setRequired: setRequiredContext
|
37
81
|
},
|
38
82
|
children: /*#__PURE__*/_jsxs("div", {
|
39
83
|
className: className,
|
40
84
|
children: [/*#__PURE__*/_jsxs("label", {
|
41
85
|
className: stl(_templateObject || (_templateObject = _taggedTemplateLiteral(["cursor-pointer flex ", ""])), inline ? "items-center" : "flex-col"),
|
42
86
|
htmlFor: labelFor,
|
43
|
-
children: [hasLabel && /*#__PURE__*/
|
87
|
+
children: [hasLabel && /*#__PURE__*/_jsxs("div", {
|
44
88
|
id: labelId,
|
45
89
|
className: stl(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["truncate ", ""])), inline ? "mr-2" : "mb-1"),
|
46
|
-
children: label
|
90
|
+
children: [label, (requiredProp || requiredContext) && /*#__PURE__*/_jsx("span", {
|
91
|
+
className: stl(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["text-red-700 ml-0.5"]))),
|
92
|
+
"aria-hidden": true,
|
93
|
+
children: "*"
|
94
|
+
})]
|
47
95
|
}), /*#__PURE__*/_jsx("div", {
|
48
|
-
className: cx(inline && stl(
|
96
|
+
className: cx(inline && stl(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["ml-auto mt-1"])))),
|
49
97
|
children: children
|
50
98
|
})]
|
51
99
|
}), state.status === "invalid" && state.errors.length > 0 ? /*#__PURE__*/_jsx("ul", {
|
52
|
-
|
100
|
+
id: descriptionId,
|
101
|
+
className: stl(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["mb-1 mt-2 display-caption flex flex-col gap-0.5"]))),
|
53
102
|
children: state.errors.map(function (error) {
|
54
103
|
return /*#__PURE__*/_jsxs("li", {
|
55
|
-
className: stl(
|
104
|
+
className: stl(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["flex items-center text-red-700"]))),
|
56
105
|
children: [/*#__PURE__*/_jsx(AlertCircleIcon, {
|
57
|
-
className: stl(
|
58
|
-
|
106
|
+
className: stl(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["mr-1 shrink-0"]))),
|
107
|
+
width: "1rem",
|
108
|
+
height: "1rem",
|
109
|
+
"aria-hidden": true
|
59
110
|
}), error]
|
60
111
|
}, error);
|
61
112
|
})
|
62
113
|
}) : description ? /*#__PURE__*/_jsx("p", {
|
63
|
-
|
114
|
+
id: descriptionId,
|
115
|
+
className: cx(stl(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["display-caption text-grey-600"]))), inline ? stl(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["mt-1"]))) : stl(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["mt-2"])))),
|
64
116
|
children: description
|
65
117
|
}) : null]
|
66
118
|
})
|
@@ -10,6 +10,9 @@ export declare type FieldState = {
|
|
10
10
|
export declare type FieldContextValue = {
|
11
11
|
state: FieldState;
|
12
12
|
labelId?: string;
|
13
|
+
descriptionId?: string;
|
14
|
+
inputId?: string;
|
15
|
+
setRequired?: (required?: boolean) => void;
|
13
16
|
};
|
14
17
|
export declare const DEFAULT_FIELD_STATE: FieldState;
|
15
18
|
export declare const DEFAULT_CONTEXT_VALUE: FieldContextValue;
|
@@ -1,5 +1,20 @@
|
|
1
|
-
import
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
2
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
3
|
+
var _excluded = ["setRequired"];
|
4
|
+
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; }
|
5
|
+
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; }
|
6
|
+
import { useContext, useEffect } from "react";
|
2
7
|
import { FieldContext } from "./FieldContext";
|
3
8
|
export var useField = function useField() {
|
4
|
-
|
9
|
+
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
10
|
+
required = _ref.required;
|
11
|
+
var _useContext = useContext(FieldContext),
|
12
|
+
setRequired = _useContext.setRequired,
|
13
|
+
contextValue = _objectWithoutProperties(_useContext, _excluded);
|
14
|
+
useEffect(function () {
|
15
|
+
return setRequired === null || setRequired === void 0 ? void 0 : setRequired(required);
|
16
|
+
}, [setRequired, required]);
|
17
|
+
return _objectSpread({
|
18
|
+
setRequired: setRequired
|
19
|
+
}, contextValue);
|
5
20
|
};
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import type { FC, HTMLAttributes, ReactNode, VFC } from "react";
|
2
|
+
import type { AlertProps } from "../Banners";
|
3
|
+
import type { ButtonProps } from "../Button";
|
4
|
+
import type { ExperimentalFormContextField } from "./FormContext";
|
5
|
+
export interface ExperimentalFormProps extends HTMLAttributes<HTMLFormElement> {
|
6
|
+
}
|
7
|
+
export declare type ExperimentalFormLocale = {
|
8
|
+
errorText?: (invalidFields: ExperimentalFormContextField[]) => ReactNode;
|
9
|
+
};
|
10
|
+
export interface ExperimentalFormErrorMessageProps extends Omit<AlertProps, "children"> {
|
11
|
+
locale?: ExperimentalFormLocale;
|
12
|
+
}
|
13
|
+
export declare const ExperimentalFormErrorMessage: VFC<ExperimentalFormErrorMessageProps>;
|
14
|
+
export declare const ExperimentalForm: FC<ExperimentalFormProps>;
|
15
|
+
export declare const ExperimentalFormSubmit: FC<ButtonProps>;
|
16
|
+
export declare const ExperimentalFormReset: FC<ButtonProps>;
|
@@ -0,0 +1,135 @@
|
|
1
|
+
import _typeof from "@babel/runtime/helpers/typeof";
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
3
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
4
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
5
|
+
import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
|
6
|
+
var _excluded = ["className", "locale"],
|
7
|
+
_excluded2 = ["children"],
|
8
|
+
_excluded3 = ["children"],
|
9
|
+
_excluded4 = ["children"];
|
10
|
+
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
|
11
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
12
|
+
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
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
|
+
import cx from "clsx";
|
16
|
+
import { useCallback, useState } from "react";
|
17
|
+
import { Alert } from "../Banners";
|
18
|
+
import { Button } from "../Button";
|
19
|
+
import { XOctagonIcon } from "../Icons";
|
20
|
+
import { useLocale } from "../Satellite";
|
21
|
+
import stl from "../styles/helpers/satellitePrefixer";
|
22
|
+
import { ExperimentalFormContext } from "./FormContext";
|
23
|
+
import { useExperimentalForm } from "./useForm";
|
24
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
25
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
26
|
+
import { Fragment as _Fragment } from "react/jsx-runtime";
|
27
|
+
var DEFAULT_ERROR_MESSAGE_LOCALE = {
|
28
|
+
errorText: function errorText(invalidFields) {
|
29
|
+
var firstInvalidField = invalidFields[0];
|
30
|
+
return /*#__PURE__*/_jsxs(_Fragment, {
|
31
|
+
children: [/*#__PURE__*/_jsxs("div", {
|
32
|
+
className: stl(_templateObject || (_templateObject = _taggedTemplateLiteral(["display-heading mb-2"]))),
|
33
|
+
children: ["Please fix ", invalidFields.length, " error", invalidFields.length > 1 ? "s" : "", " below and try again."]
|
34
|
+
}), /*#__PURE__*/_jsx("div", {
|
35
|
+
className: stl(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["flex flex-col"]))),
|
36
|
+
children: /*#__PURE__*/_jsx("a", {
|
37
|
+
href: "#",
|
38
|
+
className: stl(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["text-black underline hover:text-grey-800"]))),
|
39
|
+
onClick: function onClick(e) {
|
40
|
+
e.preventDefault();
|
41
|
+
var label = document.querySelector("label[for=\"".concat(firstInvalidField.labelFor, "\"]"));
|
42
|
+
label === null || label === void 0 || label.scrollIntoView({
|
43
|
+
behavior: "smooth",
|
44
|
+
block: "start"
|
45
|
+
});
|
46
|
+
label === null || label === void 0 || label.focus({
|
47
|
+
preventScroll: true
|
48
|
+
});
|
49
|
+
},
|
50
|
+
children: "Go to first error"
|
51
|
+
})
|
52
|
+
})]
|
53
|
+
});
|
54
|
+
}
|
55
|
+
};
|
56
|
+
export var ExperimentalFormErrorMessage = function ExperimentalFormErrorMessage(_ref) {
|
57
|
+
var className = _ref.className,
|
58
|
+
propsLocale = _ref.locale,
|
59
|
+
props = _objectWithoutProperties(_ref, _excluded);
|
60
|
+
var contextLocale = useLocale("form");
|
61
|
+
var locale = _objectSpread(_objectSpread(_objectSpread({}, DEFAULT_ERROR_MESSAGE_LOCALE), contextLocale), propsLocale);
|
62
|
+
var form = useExperimentalForm();
|
63
|
+
if (!form) return null;
|
64
|
+
var invalidFields = Object.entries(form.fields).filter(function (_ref2) {
|
65
|
+
var _ref3 = _slicedToArray(_ref2, 2),
|
66
|
+
_ = _ref3[0],
|
67
|
+
value = _ref3[1];
|
68
|
+
return value.state.status === "invalid";
|
69
|
+
}).map(function (_ref4) {
|
70
|
+
var _ref5 = _slicedToArray(_ref4, 2),
|
71
|
+
_ = _ref5[0],
|
72
|
+
value = _ref5[1];
|
73
|
+
return value;
|
74
|
+
});
|
75
|
+
return invalidFields.length > 0 ? /*#__PURE__*/_jsx(Alert, _objectSpread(_objectSpread({
|
76
|
+
variant: "red",
|
77
|
+
icon: XOctagonIcon
|
78
|
+
}, props), {}, {
|
79
|
+
className: cx(stl(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["w-full"]))), className),
|
80
|
+
children: /*#__PURE__*/_jsx("span", {
|
81
|
+
"aria-live": "assertive",
|
82
|
+
className: stl(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["whitespace-break-spaces"]))),
|
83
|
+
children: locale.errorText(invalidFields)
|
84
|
+
})
|
85
|
+
})) : null;
|
86
|
+
};
|
87
|
+
export var ExperimentalForm = function ExperimentalForm(_ref6) {
|
88
|
+
var children = _ref6.children,
|
89
|
+
props = _objectWithoutProperties(_ref6, _excluded2);
|
90
|
+
var _useState = useState({}),
|
91
|
+
_useState2 = _slicedToArray(_useState, 2),
|
92
|
+
fields = _useState2[0],
|
93
|
+
setFields = _useState2[1];
|
94
|
+
var addField = useCallback(function (field) {
|
95
|
+
setFields(function (fields) {
|
96
|
+
return _objectSpread(_objectSpread({}, fields), {}, _defineProperty({}, field.labelFor, field));
|
97
|
+
});
|
98
|
+
}, []);
|
99
|
+
var removeField = useCallback(function (field) {
|
100
|
+
setFields(function (fields) {
|
101
|
+
var _field$labelFor = field.labelFor,
|
102
|
+
_ = fields[_field$labelFor],
|
103
|
+
rest = _objectWithoutProperties(fields, [_field$labelFor].map(_toPropertyKey));
|
104
|
+
return rest;
|
105
|
+
});
|
106
|
+
}, []);
|
107
|
+
return /*#__PURE__*/_jsx(ExperimentalFormContext.Provider, {
|
108
|
+
value: {
|
109
|
+
fields: fields,
|
110
|
+
addField: addField,
|
111
|
+
removeField: removeField
|
112
|
+
},
|
113
|
+
children: /*#__PURE__*/_jsx("form", _objectSpread(_objectSpread({
|
114
|
+
noValidate: true
|
115
|
+
}, props), {}, {
|
116
|
+
children: children
|
117
|
+
}))
|
118
|
+
});
|
119
|
+
};
|
120
|
+
export var ExperimentalFormSubmit = function ExperimentalFormSubmit(_ref7) {
|
121
|
+
var children = _ref7.children,
|
122
|
+
props = _objectWithoutProperties(_ref7, _excluded3);
|
123
|
+
return /*#__PURE__*/_jsx(Button, _objectSpread(_objectSpread({}, props), {}, {
|
124
|
+
type: "submit",
|
125
|
+
children: children
|
126
|
+
}));
|
127
|
+
};
|
128
|
+
export var ExperimentalFormReset = function ExperimentalFormReset(_ref8) {
|
129
|
+
var children = _ref8.children,
|
130
|
+
props = _objectWithoutProperties(_ref8, _excluded4);
|
131
|
+
return /*#__PURE__*/_jsx(Button, _objectSpread(_objectSpread({}, props), {}, {
|
132
|
+
type: "reset",
|
133
|
+
children: children
|
134
|
+
}));
|
135
|
+
};
|
@@ -0,0 +1,13 @@
|
|
1
|
+
/// <reference types="react" />
|
2
|
+
import type { FieldState } from "../Field";
|
3
|
+
export declare type ExperimentalFormContextField = {
|
4
|
+
state: FieldState;
|
5
|
+
label: string;
|
6
|
+
labelFor: string;
|
7
|
+
};
|
8
|
+
export declare type ExperimentalFormContextValue = {
|
9
|
+
fields: Record<string, ExperimentalFormContextField>;
|
10
|
+
addField: (field: ExperimentalFormContextField) => void;
|
11
|
+
removeField: (field: ExperimentalFormContextField) => void;
|
12
|
+
};
|
13
|
+
export declare const ExperimentalFormContext: import("react").Context<ExperimentalFormContextValue | null>;
|