@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
@@ -21,8 +21,8 @@ var _satellitePrefixer = _interopRequireDefault(require("../styles/helpers/satel
21
21
  var _formatters = require("../utils/formatters");
22
22
  var _uniqueId = require("../utils/uniqueId");
23
23
  var _jsxRuntime = require("react/jsx-runtime");
24
- var _excluded = ["id", "placeholder", "disabled", "multiple", "clearable", "onChange", "className", "locale"];
25
- var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10;
24
+ var _excluded = ["id", "placeholder", "disabled", "multiple", "clearable", "onChange", "className", "locale", "required"];
25
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9;
26
26
  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; }
27
27
  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) { (0, _defineProperty2["default"])(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; }
28
28
  var DropzoneFileItem = function DropzoneFileItem(_ref) {
@@ -54,7 +54,7 @@ var ValidatedIcon = function ValidatedIcon() {
54
54
  *
55
55
  * See the [Dropzone documentation page](https://satellite.algolia.com/components/forms/dropzone) for more information.
56
56
  */
57
- var Dropzone = exports.Dropzone = function Dropzone(_ref2) {
57
+ var Dropzone = exports.Dropzone = /*#__PURE__*/(0, _react.forwardRef)(function (_ref2, ref) {
58
58
  var id = _ref2.id,
59
59
  placeholder = _ref2.placeholder,
60
60
  disabled = _ref2.disabled,
@@ -65,6 +65,8 @@ var Dropzone = exports.Dropzone = function Dropzone(_ref2) {
65
65
  onChange = _ref2.onChange,
66
66
  className = _ref2.className,
67
67
  propsLocale = _ref2.locale,
68
+ _ref2$required = _ref2.required,
69
+ required = _ref2$required === void 0 ? false : _ref2$required,
68
70
  props = (0, _objectWithoutProperties2["default"])(_ref2, _excluded);
69
71
  var contextLocale = (0, _Satellite.useLocale)("dropzone");
70
72
  var locale = _objectSpread(_objectSpread(_objectSpread({}, DEFAULT_DROPZONE_LOCALE), contextLocale), propsLocale);
@@ -76,9 +78,13 @@ var Dropzone = exports.Dropzone = function Dropzone(_ref2) {
76
78
  _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
77
79
  focused = _useState4[0],
78
80
  setFocused = _useState4[1];
79
- var _useField = (0, _Field.useField)(),
81
+ var _useField = (0, _Field.useField)({
82
+ required: required
83
+ }),
80
84
  status = _useField.state.status,
81
- labelId = _useField.labelId;
85
+ labelId = _useField.labelId,
86
+ descriptionId = _useField.descriptionId,
87
+ inputId = _useField.inputId;
82
88
  var onDrop = (0, _react.useCallback)(function (acceptedFiles, fileRejections) {
83
89
  var updatedFiles = multiple ? [].concat((0, _toConsumableArray2["default"])(files), (0, _toConsumableArray2["default"])(acceptedFiles)) : acceptedFiles;
84
90
  setFiles(updatedFiles);
@@ -100,14 +106,19 @@ var Dropzone = exports.Dropzone = function Dropzone(_ref2) {
100
106
  isDragActive = _useDropzone.isDragActive,
101
107
  isDragReject = _useDropzone.isDragReject;
102
108
  var dropzoneId = (0, _react.useMemo)(function () {
103
- return id !== null && id !== void 0 ? id : (0, _uniqueId.uniqueId)("dropzone");
104
- }, [id]);
109
+ var _ref3;
110
+ return (_ref3 = id !== null && id !== void 0 ? id : inputId) !== null && _ref3 !== void 0 ? _ref3 : (0, _uniqueId.uniqueId)("dropzone");
111
+ }, [id, inputId]);
105
112
  var isValueEmpty = files.length === 0;
106
113
  var isInvalid = status === "invalid";
107
114
  var StatusIcon = isInvalid ? InvalidIcon : status === "validated" ? ValidatedIcon : _react.Fragment;
108
115
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", _objectSpread(_objectSpread({}, getRootProps({
116
+ ref: ref,
109
117
  "aria-controls": dropzoneId,
110
- className: (0, _clsx["default"])((0, _satellitePrefixer["default"])(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\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),
118
+ "aria-labelledby": labelId,
119
+ "aria-describedby": descriptionId,
120
+ "aria-invalid": isInvalid,
121
+ className: (0, _clsx["default"])((0, _satellitePrefixer["default"])(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\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),
111
122
  onClick: function onClick(evt) {
112
123
  // Helps with https://github.com/react-dropzone/react-dropzone/issues/182
113
124
  if (evt.target.closest("label")) {
@@ -117,7 +128,7 @@ var Dropzone = exports.Dropzone = function Dropzone(_ref2) {
117
128
  })), {}, {
118
129
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("input", _objectSpread({}, getInputProps({
119
130
  id: dropzoneId,
120
- "aria-labelledby": labelId,
131
+ required: required,
121
132
  onFocus: function onFocus() {
122
133
  return setFocused(true);
123
134
  },
@@ -147,9 +158,8 @@ var Dropzone = exports.Dropzone = function Dropzone(_ref2) {
147
158
  })]
148
159
  })
149
160
  }), clearable && !disabled && !isValueEmpty && /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
150
- className: (0, _satellitePrefixer["default"])(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteral2["default"])([""]))),
151
161
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.IconButton, {
152
- className: (0, _satellitePrefixer["default"])(_templateObject10 || (_templateObject10 = (0, _taggedTemplateLiteral2["default"])(["mr-2 ", ""])), focused ? "visible" : "invisible group-hover/dropzone:visible"),
162
+ className: (0, _satellitePrefixer["default"])(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteral2["default"])(["mr-2 ", ""])), focused ? "visible" : "invisible group-hover/dropzone:visible"),
153
163
  title: locale.clearInput,
154
164
  icon: _Icons.XIcon,
155
165
  variant: "subtle",
@@ -160,4 +170,5 @@ var Dropzone = exports.Dropzone = function Dropzone(_ref2) {
160
170
  })
161
171
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(StatusIcon, {})]
162
172
  }));
163
- };
173
+ });
174
+ 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
  /**
@@ -6,14 +6,17 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.Field = void 0;
8
8
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
10
  var _clsx = _interopRequireDefault(require("clsx"));
10
11
  var _react = require("react");
12
+ var _useForm = require("../Form/useForm");
11
13
  var _Icons = require("../Icons");
12
14
  var _satellitePrefixer = _interopRequireDefault(require("../styles/helpers/satellitePrefixer"));
13
15
  var _utils = require("../utils");
16
+ var _getTextFromReactNode = require("../utils/getTextFromReactNode");
14
17
  var _FieldContext = require("./FieldContext");
15
18
  var _jsxRuntime = require("react/jsx-runtime");
16
- var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9;
19
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10;
17
20
  /**
18
21
  * The `Field` component is a helper that wraps inputs to streamline labeling, validation, integration into a form.
19
22
  *
@@ -22,13 +25,14 @@ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _temp
22
25
  var Field = exports.Field = function Field(_ref) {
23
26
  var className = _ref.className,
24
27
  label = _ref.label,
25
- labelFor = _ref.labelFor,
28
+ labelForProp = _ref.labelFor,
26
29
  labelIdProp = _ref.labelId,
27
30
  description = _ref.description,
28
31
  _ref$state = _ref.state,
29
32
  state = _ref$state === void 0 ? _FieldContext.DEFAULT_FIELD_STATE : _ref$state,
30
33
  _ref$inline = _ref.inline,
31
34
  inline = _ref$inline === void 0 ? false : _ref$inline,
35
+ requiredProp = _ref.required,
32
36
  children = _ref.children;
33
37
  var hasLabel = !!label;
34
38
  var labelId = (0, _react.useMemo)(
@@ -36,37 +40,85 @@ var Field = exports.Field = function Field(_ref) {
36
40
  function () {
37
41
  return hasLabel ? labelIdProp !== null && labelIdProp !== void 0 ? labelIdProp : (0, _utils.uniqueId)("stl-field-label-") : undefined;
38
42
  }, [labelIdProp, hasLabel]);
43
+ var hasLabelFor = !!labelForProp;
44
+ var labelFor = (0, _react.useMemo)(
45
+ // eslint-disable-next-line @algolia/stl/prefer-stl-helper
46
+ function () {
47
+ return hasLabelFor ? labelForProp : (0, _utils.uniqueId)("stl-field-input-");
48
+ }, [labelForProp, hasLabelFor]);
49
+ var descriptionId = (0, _react.useMemo)(
50
+ // eslint-disable-next-line @algolia/stl/prefer-stl-helper
51
+ function () {
52
+ return description || state.status === "invalid" ? (0, _utils.uniqueId)("stl-field-description-") : undefined;
53
+ }, [description, state.status]);
54
+ var _useState = (0, _react.useState)(undefined),
55
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
56
+ requiredContext = _useState2[0],
57
+ setRequiredContext = _useState2[1];
58
+ if (process.env.NODE_ENV !== "production") {
59
+ if (typeof requiredProp !== "undefined" && typeof requiredContext !== "undefined" && requiredProp !== requiredContext) {
60
+ 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, "`)."));
61
+ }
62
+ }
63
+ var form = (0, _useForm.useExperimentalForm)();
64
+ var addField = form === null || form === void 0 ? void 0 : form.addField;
65
+ var removeField = form === null || form === void 0 ? void 0 : form.removeField;
66
+ (0, _react.useEffect)(function () {
67
+ addField === null || addField === void 0 || addField({
68
+ state: state,
69
+ label: (0, _getTextFromReactNode.getTextFromReactNode)(label),
70
+ labelFor: labelFor
71
+ });
72
+ return function () {
73
+ removeField === null || removeField === void 0 || removeField({
74
+ state: state,
75
+ label: (0, _getTextFromReactNode.getTextFromReactNode)(label),
76
+ labelFor: labelFor
77
+ });
78
+ };
79
+ }, [addField, removeField, state, labelFor, label]);
39
80
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_FieldContext.FieldContext.Provider, {
40
81
  value: {
41
82
  state: state,
42
- labelId: labelId
83
+ labelId: labelId,
84
+ descriptionId: descriptionId,
85
+ inputId: labelFor,
86
+ setRequired: setRequiredContext
43
87
  },
44
88
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
45
89
  className: className,
46
90
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("label", {
47
91
  className: (0, _satellitePrefixer["default"])(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["cursor-pointer flex ", ""])), inline ? "items-center" : "flex-col"),
48
92
  htmlFor: labelFor,
49
- children: [hasLabel && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
93
+ children: [hasLabel && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
50
94
  id: labelId,
51
95
  className: (0, _satellitePrefixer["default"])(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["truncate ", ""])), inline ? "mr-2" : "mb-1"),
52
- children: label
96
+ children: [label, (requiredProp || requiredContext) && /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
97
+ className: (0, _satellitePrefixer["default"])(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["text-red-700 ml-0.5"]))),
98
+ "aria-hidden": true,
99
+ children: "*"
100
+ })]
53
101
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
54
- className: (0, _clsx["default"])(inline && (0, _satellitePrefixer["default"])(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["ml-auto mt-1"])))),
102
+ className: (0, _clsx["default"])(inline && (0, _satellitePrefixer["default"])(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["ml-auto mt-1"])))),
55
103
  children: children
56
104
  })]
57
105
  }), state.status === "invalid" && state.errors.length > 0 ? /*#__PURE__*/(0, _jsxRuntime.jsx)("ul", {
58
- className: (0, _satellitePrefixer["default"])(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["mb-1 mt-2 display-caption"]))),
106
+ id: descriptionId,
107
+ className: (0, _satellitePrefixer["default"])(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["mb-1 mt-2 display-caption flex flex-col gap-0.5"]))),
59
108
  children: state.errors.map(function (error) {
60
109
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("li", {
61
- className: (0, _satellitePrefixer["default"])(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["flex items-center"]))),
110
+ className: (0, _satellitePrefixer["default"])(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["flex items-center text-red-700"]))),
62
111
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Icons.AlertCircleIcon, {
63
- className: (0, _satellitePrefixer["default"])(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["text-red-700 mr-1"]))),
64
- size: "1rem"
112
+ className: (0, _satellitePrefixer["default"])(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["mr-1 shrink-0"]))),
113
+ width: "1rem",
114
+ height: "1rem",
115
+ "aria-hidden": true
65
116
  }), error]
66
117
  }, error);
67
118
  })
68
119
  }) : description ? /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
69
- className: (0, _clsx["default"])((0, _satellitePrefixer["default"])(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["display-caption text-grey-600"]))), inline ? (0, _satellitePrefixer["default"])(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2["default"])(["mt-1"]))) : (0, _satellitePrefixer["default"])(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteral2["default"])(["mt-2"])))),
120
+ id: descriptionId,
121
+ className: (0, _clsx["default"])((0, _satellitePrefixer["default"])(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2["default"])(["display-caption text-grey-600"]))), inline ? (0, _satellitePrefixer["default"])(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteral2["default"])(["mt-1"]))) : (0, _satellitePrefixer["default"])(_templateObject10 || (_templateObject10 = (0, _taggedTemplateLiteral2["default"])(["mt-2"])))),
70
122
  children: description
71
123
  }) : null]
72
124
  })
@@ -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,11 +1,27 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.useField = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
7
10
  var _react = require("react");
8
11
  var _FieldContext = require("./FieldContext");
12
+ var _excluded = ["setRequired"];
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) { (0, _defineProperty2["default"])(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; }
9
15
  var useField = exports.useField = function useField() {
10
- return (0, _react.useContext)(_FieldContext.FieldContext);
16
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
17
+ required = _ref.required;
18
+ var _useContext = (0, _react.useContext)(_FieldContext.FieldContext),
19
+ setRequired = _useContext.setRequired,
20
+ contextValue = (0, _objectWithoutProperties2["default"])(_useContext, _excluded);
21
+ (0, _react.useEffect)(function () {
22
+ return setRequired === null || setRequired === void 0 ? void 0 : setRequired(required);
23
+ }, [setRequired, required]);
24
+ return _objectSpread({
25
+ setRequired: setRequired
26
+ }, contextValue);
11
27
  };
@@ -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,140 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.ExperimentalFormSubmit = exports.ExperimentalFormReset = exports.ExperimentalFormErrorMessage = exports.ExperimentalForm = void 0;
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
12
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
13
+ var _clsx = _interopRequireDefault(require("clsx"));
14
+ var _react = require("react");
15
+ var _Banners = require("../Banners");
16
+ var _Button = require("../Button");
17
+ var _Icons = require("../Icons");
18
+ var _Satellite = require("../Satellite");
19
+ var _satellitePrefixer = _interopRequireDefault(require("../styles/helpers/satellitePrefixer"));
20
+ var _FormContext = require("./FormContext");
21
+ var _useForm = require("./useForm");
22
+ var _jsxRuntime = require("react/jsx-runtime");
23
+ var _excluded = ["className", "locale"],
24
+ _excluded2 = ["children"],
25
+ _excluded3 = ["children"],
26
+ _excluded4 = ["children"];
27
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
28
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
29
+ 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); }
30
+ 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; }
31
+ 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) { (0, _defineProperty2["default"])(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; }
32
+ var DEFAULT_ERROR_MESSAGE_LOCALE = {
33
+ errorText: function errorText(invalidFields) {
34
+ var firstInvalidField = invalidFields[0];
35
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
36
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
37
+ className: (0, _satellitePrefixer["default"])(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["display-heading mb-2"]))),
38
+ children: ["Please fix ", invalidFields.length, " error", invalidFields.length > 1 ? "s" : "", " below and try again."]
39
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
40
+ className: (0, _satellitePrefixer["default"])(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["flex flex-col"]))),
41
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
42
+ href: "#",
43
+ className: (0, _satellitePrefixer["default"])(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["text-black underline hover:text-grey-800"]))),
44
+ onClick: function onClick(e) {
45
+ e.preventDefault();
46
+ var label = document.querySelector("label[for=\"".concat(firstInvalidField.labelFor, "\"]"));
47
+ label === null || label === void 0 || label.scrollIntoView({
48
+ behavior: "smooth",
49
+ block: "start"
50
+ });
51
+ label === null || label === void 0 || label.focus({
52
+ preventScroll: true
53
+ });
54
+ },
55
+ children: "Go to first error"
56
+ })
57
+ })]
58
+ });
59
+ }
60
+ };
61
+ var ExperimentalFormErrorMessage = exports.ExperimentalFormErrorMessage = function ExperimentalFormErrorMessage(_ref) {
62
+ var className = _ref.className,
63
+ propsLocale = _ref.locale,
64
+ props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
65
+ var contextLocale = (0, _Satellite.useLocale)("form");
66
+ var locale = _objectSpread(_objectSpread(_objectSpread({}, DEFAULT_ERROR_MESSAGE_LOCALE), contextLocale), propsLocale);
67
+ var form = (0, _useForm.useExperimentalForm)();
68
+ if (!form) return null;
69
+ var invalidFields = Object.entries(form.fields).filter(function (_ref2) {
70
+ var _ref3 = (0, _slicedToArray2["default"])(_ref2, 2),
71
+ _ = _ref3[0],
72
+ value = _ref3[1];
73
+ return value.state.status === "invalid";
74
+ }).map(function (_ref4) {
75
+ var _ref5 = (0, _slicedToArray2["default"])(_ref4, 2),
76
+ _ = _ref5[0],
77
+ value = _ref5[1];
78
+ return value;
79
+ });
80
+ return invalidFields.length > 0 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Banners.Alert, _objectSpread(_objectSpread({
81
+ variant: "red",
82
+ icon: _Icons.XOctagonIcon
83
+ }, props), {}, {
84
+ className: (0, _clsx["default"])((0, _satellitePrefixer["default"])(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["w-full"]))), className),
85
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
86
+ "aria-live": "assertive",
87
+ className: (0, _satellitePrefixer["default"])(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["whitespace-break-spaces"]))),
88
+ children: locale.errorText(invalidFields)
89
+ })
90
+ })) : null;
91
+ };
92
+ var ExperimentalForm = exports.ExperimentalForm = function ExperimentalForm(_ref6) {
93
+ var children = _ref6.children,
94
+ props = (0, _objectWithoutProperties2["default"])(_ref6, _excluded2);
95
+ var _useState = (0, _react.useState)({}),
96
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
97
+ fields = _useState2[0],
98
+ setFields = _useState2[1];
99
+ var addField = (0, _react.useCallback)(function (field) {
100
+ setFields(function (fields) {
101
+ return _objectSpread(_objectSpread({}, fields), {}, (0, _defineProperty2["default"])({}, field.labelFor, field));
102
+ });
103
+ }, []);
104
+ var removeField = (0, _react.useCallback)(function (field) {
105
+ setFields(function (fields) {
106
+ var _field$labelFor = field.labelFor,
107
+ _ = fields[_field$labelFor],
108
+ rest = (0, _objectWithoutProperties2["default"])(fields, [_field$labelFor].map(_toPropertyKey));
109
+ return rest;
110
+ });
111
+ }, []);
112
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_FormContext.ExperimentalFormContext.Provider, {
113
+ value: {
114
+ fields: fields,
115
+ addField: addField,
116
+ removeField: removeField
117
+ },
118
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("form", _objectSpread(_objectSpread({
119
+ noValidate: true
120
+ }, props), {}, {
121
+ children: children
122
+ }))
123
+ });
124
+ };
125
+ var ExperimentalFormSubmit = exports.ExperimentalFormSubmit = function ExperimentalFormSubmit(_ref7) {
126
+ var children = _ref7.children,
127
+ props = (0, _objectWithoutProperties2["default"])(_ref7, _excluded3);
128
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.Button, _objectSpread(_objectSpread({}, props), {}, {
129
+ type: "submit",
130
+ children: children
131
+ }));
132
+ };
133
+ var ExperimentalFormReset = exports.ExperimentalFormReset = function ExperimentalFormReset(_ref8) {
134
+ var children = _ref8.children,
135
+ props = (0, _objectWithoutProperties2["default"])(_ref8, _excluded4);
136
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.Button, _objectSpread(_objectSpread({}, props), {}, {
137
+ type: "reset",
138
+ children: children
139
+ }));
140
+ };
@@ -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,8 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ExperimentalFormContext = void 0;
7
+ var _react = require("react");
8
+ var ExperimentalFormContext = exports.ExperimentalFormContext = /*#__PURE__*/(0, _react.createContext)(null);
@@ -0,0 +1,3 @@
1
+ export * from "./Form";
2
+ export type { ExperimentalFormContextField, ExperimentalFormContextValue } from "./FormContext";
3
+ export * from "./useForm";
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _Form = require("./Form");
7
+ Object.keys(_Form).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _Form[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function get() {
13
+ return _Form[key];
14
+ }
15
+ });
16
+ });
17
+ var _useForm = require("./useForm");
18
+ Object.keys(_useForm).forEach(function (key) {
19
+ if (key === "default" || key === "__esModule") return;
20
+ if (key in exports && exports[key] === _useForm[key]) return;
21
+ Object.defineProperty(exports, key, {
22
+ enumerable: true,
23
+ get: function get() {
24
+ return _useForm[key];
25
+ }
26
+ });
27
+ });