@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.
Files changed (134) hide show
  1. package/dist/cjs/AutoComplete/AutoComplete.d.ts +1 -1
  2. package/dist/cjs/AutoComplete/AutoComplete.js +49 -26
  3. package/dist/cjs/AutoComplete/AutoComplete.tailwind.js +9 -1
  4. package/dist/cjs/AutoComplete/types.d.ts +1 -0
  5. package/dist/cjs/Checkbox/Checkbox.d.ts +1 -1
  6. package/dist/cjs/Checkbox/Checkbox.js +21 -13
  7. package/dist/cjs/Checkbox/Checkbox.tailwind.js +8 -2
  8. package/dist/cjs/DatePicker/DatePicker/DatePicker.d.ts +4 -2
  9. package/dist/cjs/DatePicker/DatePicker/DatePicker.js +18 -7
  10. package/dist/cjs/DatePicker/components/Display.d.ts +3 -3
  11. package/dist/cjs/DatePicker/components/Display.js +16 -5
  12. package/dist/cjs/Dropzone/Dropzone.d.ts +4 -2
  13. package/dist/cjs/Dropzone/Dropzone.js +23 -12
  14. package/dist/cjs/Field/Field.d.ts +1 -0
  15. package/dist/cjs/Field/Field.js +63 -11
  16. package/dist/cjs/Field/FieldContext.d.ts +3 -0
  17. package/dist/cjs/Field/useField.d.ts +4 -1
  18. package/dist/cjs/Field/useField.js +17 -1
  19. package/dist/cjs/Form/Form.d.ts +16 -0
  20. package/dist/cjs/Form/Form.js +140 -0
  21. package/dist/cjs/Form/FormContext.d.ts +13 -0
  22. package/dist/cjs/Form/FormContext.js +8 -0
  23. package/dist/cjs/Form/index.d.ts +3 -0
  24. package/dist/cjs/Form/index.js +27 -0
  25. package/dist/cjs/Form/stories/AsynchronousValidation.js +396 -0
  26. package/dist/cjs/Form/stories/Complex.js +928 -0
  27. package/dist/cjs/Form/stories/DependentFieldsValidation.js +249 -0
  28. package/dist/cjs/Form/stories/DirtyFields.js +339 -0
  29. package/dist/cjs/Form/stories/DynamicFieldsValidation.js +425 -0
  30. package/dist/cjs/Form/stories/FieldArrays.js +549 -0
  31. package/dist/cjs/Form/stories/ValidationStrategies.js +455 -0
  32. package/dist/cjs/Form/stories/utils/useFormikAutoFocusOnError.js +22 -0
  33. package/dist/cjs/Form/useForm.d.ts +1 -0
  34. package/dist/cjs/Form/useForm.js +11 -0
  35. package/dist/cjs/Input/Input.js +22 -9
  36. package/dist/cjs/Input/Input.tailwind.js +7 -2
  37. package/dist/cjs/Pagination/DotPagination/DotPagination.d.ts +1 -1
  38. package/dist/cjs/RadioGroup/RadioButton.d.ts +1 -1
  39. package/dist/cjs/RadioGroup/RadioButton.js +16 -3
  40. package/dist/cjs/RadioGroup/RadioButton.tailwind.js +23 -0
  41. package/dist/cjs/RadioGroup/RadioGroup.d.ts +7 -5
  42. package/dist/cjs/RadioGroup/RadioGroup.js +78 -16
  43. package/dist/cjs/RadioGroup/{RadiogroupContext.d.ts → RadioGroupContext.d.ts} +8 -1
  44. package/dist/cjs/RangeSlider/RangeSlider.d.ts +2 -3
  45. package/dist/cjs/RangeSlider/RangeSlider.js +27 -10
  46. package/dist/cjs/Satellite/locale.d.ts +2 -0
  47. package/dist/cjs/Select/Select.js +39 -6
  48. package/dist/cjs/Select/Select.tailwind.js +19 -0
  49. package/dist/cjs/Stepper/Step.js +2 -2
  50. package/dist/cjs/Switch/Switch.js +2 -2
  51. package/dist/cjs/Switch/SwitchOption.js +3 -3
  52. package/dist/cjs/Tables/DataTable/DataTable.d.ts +1 -1
  53. package/dist/cjs/Tag/Tag.d.ts +1 -1
  54. package/dist/cjs/TextArea/TextArea.d.ts +1 -0
  55. package/dist/cjs/TextArea/TextArea.js +47 -8
  56. package/dist/cjs/TextArea/TextArea.tailwind.js +41 -4
  57. package/dist/cjs/Toggle/Toggle.d.ts +1 -1
  58. package/dist/cjs/Toggle/Toggle.js +23 -6
  59. package/dist/cjs/Toggle/Toggle.tailwind.js +9 -0
  60. package/dist/cjs/Tooltip/Tooltip.d.ts +1 -1
  61. package/dist/cjs/index.d.ts +1 -0
  62. package/dist/cjs/index.js +12 -0
  63. package/dist/cjs/utils/isCssPropertySupported.d.ts +1 -1
  64. package/dist/cjs/utils/mergeRefs.d.ts +2 -0
  65. package/dist/cjs/utils/mergeRefs.js +17 -0
  66. package/dist/esm/AutoComplete/AutoComplete.d.ts +1 -1
  67. package/dist/esm/AutoComplete/AutoComplete.js +52 -27
  68. package/dist/esm/AutoComplete/AutoComplete.tailwind.js +9 -1
  69. package/dist/esm/AutoComplete/types.d.ts +1 -0
  70. package/dist/esm/Checkbox/Checkbox.d.ts +1 -1
  71. package/dist/esm/Checkbox/Checkbox.js +21 -13
  72. package/dist/esm/Checkbox/Checkbox.tailwind.js +8 -2
  73. package/dist/esm/DatePicker/DatePicker/DatePicker.d.ts +4 -2
  74. package/dist/esm/DatePicker/DatePicker/DatePicker.js +19 -8
  75. package/dist/esm/DatePicker/components/Display.d.ts +3 -3
  76. package/dist/esm/DatePicker/components/Display.js +15 -5
  77. package/dist/esm/Dropzone/Dropzone.d.ts +4 -2
  78. package/dist/esm/Dropzone/Dropzone.js +24 -13
  79. package/dist/esm/Field/Field.d.ts +1 -0
  80. package/dist/esm/Field/Field.js +64 -12
  81. package/dist/esm/Field/FieldContext.d.ts +3 -0
  82. package/dist/esm/Field/useField.d.ts +4 -1
  83. package/dist/esm/Field/useField.js +17 -2
  84. package/dist/esm/Form/Form.d.ts +16 -0
  85. package/dist/esm/Form/Form.js +135 -0
  86. package/dist/esm/Form/FormContext.d.ts +13 -0
  87. package/dist/esm/Form/FormContext.js +2 -0
  88. package/dist/esm/Form/index.d.ts +3 -0
  89. package/dist/esm/Form/index.js +3 -0
  90. package/dist/esm/Form/stories/AsynchronousValidation.js +387 -0
  91. package/dist/esm/Form/stories/Complex.js +919 -0
  92. package/dist/esm/Form/stories/DependentFieldsValidation.js +240 -0
  93. package/dist/esm/Form/stories/DirtyFields.js +330 -0
  94. package/dist/esm/Form/stories/DynamicFieldsValidation.js +416 -0
  95. package/dist/esm/Form/stories/FieldArrays.js +544 -0
  96. package/dist/esm/Form/stories/ValidationStrategies.js +446 -0
  97. package/dist/esm/Form/stories/utils/useFormikAutoFocusOnError.js +16 -0
  98. package/dist/esm/Form/useForm.d.ts +1 -0
  99. package/dist/esm/Form/useForm.js +5 -0
  100. package/dist/esm/Input/Input.js +22 -9
  101. package/dist/esm/Input/Input.tailwind.js +7 -2
  102. package/dist/esm/Pagination/DotPagination/DotPagination.d.ts +1 -1
  103. package/dist/esm/RadioGroup/RadioButton.d.ts +1 -1
  104. package/dist/esm/RadioGroup/RadioButton.js +16 -3
  105. package/dist/esm/RadioGroup/RadioButton.tailwind.js +23 -0
  106. package/dist/esm/RadioGroup/RadioGroup.d.ts +7 -5
  107. package/dist/esm/RadioGroup/RadioGroup.js +77 -15
  108. package/dist/esm/RadioGroup/{RadiogroupContext.d.ts → RadioGroupContext.d.ts} +8 -1
  109. package/dist/esm/RangeSlider/RangeSlider.d.ts +2 -3
  110. package/dist/esm/RangeSlider/RangeSlider.js +27 -10
  111. package/dist/esm/Satellite/locale.d.ts +2 -0
  112. package/dist/esm/Select/Select.js +41 -7
  113. package/dist/esm/Select/Select.tailwind.js +19 -0
  114. package/dist/esm/Stepper/Step.js +2 -2
  115. package/dist/esm/Switch/Switch.js +1 -1
  116. package/dist/esm/Switch/SwitchOption.js +2 -2
  117. package/dist/esm/Tables/DataTable/DataTable.d.ts +1 -1
  118. package/dist/esm/Tag/Tag.d.ts +1 -1
  119. package/dist/esm/TextArea/TextArea.d.ts +1 -0
  120. package/dist/esm/TextArea/TextArea.js +49 -9
  121. package/dist/esm/TextArea/TextArea.tailwind.js +41 -4
  122. package/dist/esm/Toggle/Toggle.d.ts +1 -1
  123. package/dist/esm/Toggle/Toggle.js +23 -6
  124. package/dist/esm/Toggle/Toggle.tailwind.js +9 -0
  125. package/dist/esm/Tooltip/Tooltip.d.ts +1 -1
  126. package/dist/esm/index.d.ts +1 -0
  127. package/dist/esm/index.js +1 -0
  128. package/dist/esm/utils/isCssPropertySupported.d.ts +1 -1
  129. package/dist/esm/utils/mergeRefs.d.ts +2 -0
  130. package/dist/esm/utils/mergeRefs.js +11 -0
  131. package/dist/satellite.min.css +1 -1
  132. package/package.json +13 -7
  133. /package/dist/cjs/RadioGroup/{RadiogroupContext.js → RadioGroupContext.js} +0 -0
  134. /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, _templateObject10;
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 Dropzone(_ref2) {
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
- return id !== null && id !== void 0 ? id : uniqueId("dropzone");
98
- }, [id]);
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
- className: cx(stl(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n relative flex items-center group/dropzone\n border border-grey-500 rounded\n shadow-field\n overflow-hidden transition-all ease-in-out delay-100\n focus-within:border-accent-600 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" : "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" : "bg-white hover:bg-grey-50"), className),
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
- "aria-labelledby": labelId,
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(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["mr-2 ", ""])), focused ? "visible" : "invisible group-hover/dropzone:visible"),
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";
@@ -14,6 +14,7 @@ export interface FieldProps {
14
14
  */
15
15
  state?: FieldState;
16
16
  inline?: boolean;
17
+ required?: boolean;
17
18
  children: ReactNode;
18
19
  }
19
20
  /**
@@ -1,10 +1,13 @@
1
1
  import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
2
- var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9;
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
- labelFor = _ref.labelFor,
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__*/_jsx("div", {
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(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["ml-auto mt-1"])))),
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
- className: stl(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["mb-1 mt-2 display-caption"]))),
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(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["flex items-center"]))),
104
+ className: stl(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["flex items-center text-red-700"]))),
56
105
  children: [/*#__PURE__*/_jsx(AlertCircleIcon, {
57
- className: stl(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["text-red-700 mr-1"]))),
58
- size: "1rem"
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
- className: cx(stl(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["display-caption text-grey-600"]))), inline ? stl(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["mt-1"]))) : stl(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["mt-2"])))),
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,2 +1,5 @@
1
1
  import type { FieldContextValue } from "./FieldContext";
2
- export declare const useField: () => FieldContextValue;
2
+ export declare type UseFieldProps = {
3
+ required?: boolean;
4
+ };
5
+ export declare const useField: ({ required }?: UseFieldProps) => FieldContextValue;
@@ -1,5 +1,20 @@
1
- import { useContext } from "react";
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
- return useContext(FieldContext);
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>;
@@ -0,0 +1,2 @@
1
+ import { createContext } from "react";
2
+ export var ExperimentalFormContext = /*#__PURE__*/createContext(null);
@@ -0,0 +1,3 @@
1
+ export * from "./Form";
2
+ export type { ExperimentalFormContextField, ExperimentalFormContextValue } from "./FormContext";
3
+ export * from "./useForm";
@@ -0,0 +1,3 @@
1
+ export * from "./Form";
2
+ export * from "./useForm";
3
+ export {};