@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
@@ -0,0 +1,446 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
4
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
5
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15, _templateObject16, _templateObject17, _templateObject18, _templateObject19, _templateObject20;
6
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
7
+ 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; }
8
+ 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; }
9
+ import { zodResolver } from "@hookform/resolvers/zod";
10
+ import { useFormik } from "formik";
11
+ import { useState } from "react";
12
+ import { Controller, useForm } from "react-hook-form";
13
+ import * as yup from "yup";
14
+ import { z } from "zod";
15
+ import { Field } from "../../Field";
16
+ import { CalendarIcon, CreditCardIcon, LockIcon } from "../../Icons";
17
+ import { Input } from "../../Input";
18
+ import stl from "../../styles/helpers/satellitePrefixer";
19
+ import { ExperimentalForm, ExperimentalFormErrorMessage, ExperimentalFormReset, ExperimentalFormSubmit } from "../Form";
20
+ import { useFormikAutoFocusOnError } from "./utils/useFormikAutoFocusOnError";
21
+ import { jsx as _jsx } from "react/jsx-runtime";
22
+ import { jsxs as _jsxs } from "react/jsx-runtime";
23
+ var initialFormData = {
24
+ cardOwner: "",
25
+ cardNumber: "",
26
+ cardExpirationDate: "",
27
+ cardCVC: ""
28
+ };
29
+
30
+ // From: https://stackoverflow.com/a/30727110/19351131
31
+ var validateCardNumber = function validateCardNumber(cardNumber) {
32
+ var sum = 0;
33
+ var isEven = false;
34
+ for (var i = cardNumber.length - 1; i >= 0; i--) {
35
+ var digit = parseInt(cardNumber.charAt(i), 10);
36
+ if (isEven) {
37
+ digit *= 2;
38
+ if (digit > 9) {
39
+ digit -= 9;
40
+ }
41
+ }
42
+ sum += digit;
43
+ isEven = !isEven;
44
+ }
45
+ return sum % 10 === 0;
46
+ };
47
+ var validateExpirationDate = function validateExpirationDate(expirationMonth, expirationYear) {
48
+ var currentDate = new Date();
49
+ var currentYear = parseInt(currentDate.getFullYear().toString().slice(-2));
50
+ var currentMonth = currentDate.getMonth() + 1;
51
+ return expirationYear > currentYear || expirationYear === currentYear && expirationMonth >= currentMonth;
52
+ };
53
+ var validateCVC = function validateCVC(cvc) {
54
+ var cvcPattern = /^[0-9]{3,4}$/;
55
+ return cvcPattern.test(cvc);
56
+ };
57
+ function formatInputValue(event, digits, separator) {
58
+ var input = event.target.value.replace(/\D/g, "");
59
+ var formatted = [];
60
+ var index = 0;
61
+ while (index < input.length) {
62
+ var group = input.substring(index, index + digits);
63
+ formatted.push(group);
64
+ index += digits;
65
+ }
66
+ return formatted.join(separator);
67
+ }
68
+ var zodSchema = z.object({
69
+ cardOwner: z.string().min(1, {
70
+ message: "You must specify a card owner"
71
+ }),
72
+ cardNumber: z.string().min(1, {
73
+ message: "You must specify a card number"
74
+ }).transform(function (value) {
75
+ return value.replace(/\s/g, "");
76
+ }).refine(validateCardNumber, {
77
+ message: "Invalid card number (try: 5555555555554444)"
78
+ }),
79
+ cardExpirationDate: z.string().min(1, {
80
+ message: "You must specify a card expiration date"
81
+ }).refine(function (value) {
82
+ var _value$split = value.split("/"),
83
+ _value$split2 = _slicedToArray(_value$split, 2),
84
+ expirationMonth = _value$split2[0],
85
+ expirationYear = _value$split2[1];
86
+ return validateExpirationDate(parseInt(expirationMonth), parseInt(expirationYear));
87
+ }, {
88
+ message: "Invalid card expiration date"
89
+ }),
90
+ cardCVC: z.string().min(1, {
91
+ message: "You must specify a card security code"
92
+ }).refine(validateCVC, {
93
+ message: "Invalid card security code (must be 3 or 4 digits)"
94
+ })
95
+ });
96
+ export var RHFValidationStrategiesComponent = function RHFValidationStrategiesComponent() {
97
+ var _useState = useState(initialFormData),
98
+ _useState2 = _slicedToArray(_useState, 2),
99
+ formData = _useState2[0],
100
+ setFormData = _useState2[1];
101
+ var _useForm = useForm({
102
+ defaultValues: initialFormData,
103
+ reValidateMode: "onChange",
104
+ resolver: zodResolver(zodSchema)
105
+ }),
106
+ control = _useForm.control,
107
+ handleSubmit = _useForm.handleSubmit,
108
+ getFieldStateFromReactHookForm = _useForm.getFieldState,
109
+ formState = _useForm.formState,
110
+ reset = _useForm.reset,
111
+ trigger = _useForm.trigger;
112
+ var getFieldState = function getFieldState(fieldName) {
113
+ var _fieldState$error;
114
+ var fieldState = getFieldStateFromReactHookForm(fieldName, formState);
115
+ if ((_fieldState$error = fieldState.error) !== null && _fieldState$error !== void 0 && _fieldState$error.message) {
116
+ return {
117
+ status: "invalid",
118
+ errors: [fieldState.error.message]
119
+ };
120
+ } else if (!fieldState.invalid && formState.isSubmitted) {
121
+ return {
122
+ status: "validated"
123
+ };
124
+ } else {
125
+ return {
126
+ status: "default"
127
+ };
128
+ }
129
+ };
130
+ return /*#__PURE__*/_jsxs("div", {
131
+ className: stl(_templateObject || (_templateObject = _taggedTemplateLiteral(["flex flex-col gap-8 w-4/6"]))),
132
+ children: [/*#__PURE__*/_jsxs(ExperimentalForm, {
133
+ onSubmit: handleSubmit(function (data) {
134
+ return setFormData(data);
135
+ }),
136
+ onReset: function onReset() {
137
+ return setFormData(initialFormData);
138
+ },
139
+ className: stl(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["flex flex-col items-start gap-4 min-w-72"]))),
140
+ children: [/*#__PURE__*/_jsx(ExperimentalFormErrorMessage, {}), /*#__PURE__*/_jsx(Controller, {
141
+ name: "cardOwner",
142
+ control: control,
143
+ render: function render(_ref) {
144
+ var field = _ref.field;
145
+ return /*#__PURE__*/_jsx(Field, {
146
+ label: "Card Owner",
147
+ labelFor: "cardOwner",
148
+ description: "Please enter the card owner",
149
+ state: getFieldState("cardOwner"),
150
+ className: stl(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["w-full"]))),
151
+ children: /*#__PURE__*/_jsx(Input, _objectSpread({
152
+ id: "cardOwner",
153
+ placeholder: "John Doe",
154
+ required: true
155
+ }, field))
156
+ });
157
+ }
158
+ }), /*#__PURE__*/_jsx(Controller, {
159
+ name: "cardNumber",
160
+ control: control,
161
+ render: function render(_ref2) {
162
+ var field = _ref2.field;
163
+ return /*#__PURE__*/_jsx(Field, {
164
+ label: "Card Number",
165
+ labelFor: "cardNumber",
166
+ description: "Please enter the card number",
167
+ state: getFieldState("cardNumber"),
168
+ className: stl(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["w-full"]))),
169
+ children: /*#__PURE__*/_jsx(Input, _objectSpread(_objectSpread({
170
+ id: "cardNumber",
171
+ placeholder: "Card number",
172
+ maxLength: 16 + 3 // 3 spaces
173
+ ,
174
+ startIcon: CreditCardIcon,
175
+ required: true
176
+ }, field), {}, {
177
+ onChange: function onChange(e) {
178
+ e.target.value = formatInputValue(e, 4, " ");
179
+ field.onChange(e);
180
+ if (e.target.value.length === 19) {
181
+ trigger("cardNumber");
182
+ }
183
+ }
184
+ }))
185
+ });
186
+ }
187
+ }), /*#__PURE__*/_jsxs("div", {
188
+ className: stl(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["w-full flex gap-4"]))),
189
+ children: [/*#__PURE__*/_jsx(Controller, {
190
+ name: "cardExpirationDate",
191
+ control: control,
192
+ render: function render(_ref3) {
193
+ var field = _ref3.field;
194
+ return /*#__PURE__*/_jsx(Field, {
195
+ label: "Card Expiration Date",
196
+ labelFor: "cardExpirationDate",
197
+ description: "Please enter the card expiration date",
198
+ state: getFieldState("cardExpirationDate"),
199
+ className: stl(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["w-full"]))),
200
+ children: /*#__PURE__*/_jsx(Input, _objectSpread(_objectSpread({
201
+ id: "cardExpirationDate",
202
+ placeholder: "MM/YY",
203
+ maxLength: 4 + 1 // 1 slash
204
+ ,
205
+ startIcon: CalendarIcon,
206
+ required: true
207
+ }, field), {}, {
208
+ onChange: function onChange(e) {
209
+ e.target.value = formatInputValue(e, 2, "/");
210
+ field.onChange(e);
211
+ },
212
+ onBlur: function onBlur() {
213
+ trigger("cardExpirationDate");
214
+ field.onBlur();
215
+ }
216
+ }))
217
+ });
218
+ }
219
+ }), /*#__PURE__*/_jsx(Controller, {
220
+ name: "cardCVC",
221
+ control: control,
222
+ render: function render(_ref4) {
223
+ var field = _ref4.field;
224
+ return /*#__PURE__*/_jsx(Field, {
225
+ label: "Card CVC",
226
+ labelFor: "cardCVC",
227
+ description: "Please enter the card security code",
228
+ state: getFieldState("cardCVC"),
229
+ className: stl(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["w-full"]))),
230
+ children: /*#__PURE__*/_jsx(Input, _objectSpread(_objectSpread({
231
+ id: "cardCVC",
232
+ placeholder: "CVC",
233
+ maxLength: 4,
234
+ startIcon: LockIcon,
235
+ required: true
236
+ }, field), {}, {
237
+ onBlur: function onBlur() {
238
+ trigger("cardCVC");
239
+ field.onBlur();
240
+ }
241
+ }))
242
+ });
243
+ }
244
+ })]
245
+ }), /*#__PURE__*/_jsxs("div", {
246
+ className: stl(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["flex gap-2"]))),
247
+ children: [/*#__PURE__*/_jsx(ExperimentalFormSubmit, {
248
+ variant: "primary",
249
+ "aria-label": "Save the form",
250
+ children: "Save"
251
+ }), /*#__PURE__*/_jsx(ExperimentalFormReset, {
252
+ "aria-label": "Reset the form",
253
+ onClick: function onClick() {
254
+ return reset();
255
+ },
256
+ children: "Reset"
257
+ })]
258
+ })]
259
+ }), /*#__PURE__*/_jsx("hr", {
260
+ className: stl(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["text-grey-500"])))
261
+ }), /*#__PURE__*/_jsx("code", {
262
+ className: stl(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["whitespace-pre"]))),
263
+ children: JSON.stringify(formData, null, 2)
264
+ })]
265
+ });
266
+ };
267
+ var yupSchema = yup.object({
268
+ cardOwner: yup.string().required("You must specify a card owner"),
269
+ cardNumber: yup.string().required("You must specify a card number").transform(function (value) {
270
+ return value.replace(/\s/g, "");
271
+ }).test("cardNumber", "Invalid card number (try: 5555555555554444)", validateCardNumber),
272
+ cardExpirationDate: yup.string().required("You must specify a card expiration date").test("cardExpirationDate", "Invalid card expiration date", function (value) {
273
+ var _value$split3 = value.split("/"),
274
+ _value$split4 = _slicedToArray(_value$split3, 2),
275
+ expirationMonth = _value$split4[0],
276
+ expirationYear = _value$split4[1];
277
+ return validateExpirationDate(parseInt(expirationMonth), parseInt(expirationYear));
278
+ }),
279
+ cardCVC: yup.string().required("You must specify a card security code").test("cardCVC", "Invalid card security code (must be 3 or 4 digits)", validateCVC)
280
+ });
281
+ export var FormikValidationStrategiesComponent = function FormikValidationStrategiesComponent() {
282
+ var _useState3 = useState(initialFormData),
283
+ _useState4 = _slicedToArray(_useState3, 2),
284
+ formData = _useState4[0],
285
+ setFormData = _useState4[1];
286
+ var _useState5 = useState(false),
287
+ _useState6 = _slicedToArray(_useState5, 2),
288
+ revalidationEnabled = _useState6[0],
289
+ setRevalidationEnabled = _useState6[1];
290
+ var formik = useFormik({
291
+ initialValues: initialFormData,
292
+ validateOnChange: revalidationEnabled,
293
+ validateOnBlur: revalidationEnabled,
294
+ validationSchema: yupSchema,
295
+ onSubmit: function onSubmit(values) {
296
+ return setFormData(values);
297
+ },
298
+ onReset: function onReset() {
299
+ return setFormData(initialFormData);
300
+ }
301
+ });
302
+ var getFieldState = function getFieldState(fieldName) {
303
+ var fieldMeta = formik.getFieldMeta(fieldName);
304
+ if (fieldMeta.error) {
305
+ return {
306
+ status: "invalid",
307
+ errors: [fieldMeta.error]
308
+ };
309
+ } else if (formik.isSubmitting && fieldMeta.touched) {
310
+ return {
311
+ status: "validated"
312
+ };
313
+ } else {
314
+ return {
315
+ status: "default"
316
+ };
317
+ }
318
+ };
319
+ useFormikAutoFocusOnError(formik);
320
+ return /*#__PURE__*/_jsxs("div", {
321
+ className: stl(_templateObject11 || (_templateObject11 = _taggedTemplateLiteral(["flex flex-col gap-8 w-4/6"]))),
322
+ children: [/*#__PURE__*/_jsxs(ExperimentalForm, {
323
+ onSubmit: function onSubmit(e) {
324
+ setRevalidationEnabled(true);
325
+ formik.handleSubmit(e);
326
+ },
327
+ onReset: function onReset(e) {
328
+ setRevalidationEnabled(false);
329
+ formik.handleReset(e);
330
+ },
331
+ className: stl(_templateObject12 || (_templateObject12 = _taggedTemplateLiteral(["flex flex-col items-start gap-4 min-w-72"]))),
332
+ children: [/*#__PURE__*/_jsx(ExperimentalFormErrorMessage, {}), /*#__PURE__*/_jsx(Field, {
333
+ label: "Card Owner",
334
+ labelFor: "cardOwner",
335
+ description: "Please enter the card owner",
336
+ state: getFieldState("cardOwner"),
337
+ className: stl(_templateObject13 || (_templateObject13 = _taggedTemplateLiteral(["w-full"]))),
338
+ children: /*#__PURE__*/_jsx(Input, _objectSpread({
339
+ id: "cardOwner",
340
+ placeholder: "John Doe",
341
+ required: true
342
+ }, formik.getFieldProps("cardOwner")))
343
+ }), /*#__PURE__*/_jsx(Field, {
344
+ label: "Card Number",
345
+ labelFor: "cardNumber",
346
+ description: "Please enter the card number",
347
+ state: getFieldState("cardNumber"),
348
+ className: stl(_templateObject14 || (_templateObject14 = _taggedTemplateLiteral(["w-full"]))),
349
+ children: /*#__PURE__*/_jsx(Input, _objectSpread(_objectSpread({
350
+ id: "cardNumber",
351
+ placeholder: "Card number",
352
+ maxLength: 16 + 3 // 3 spaces
353
+ ,
354
+ startIcon: CreditCardIcon,
355
+ required: true
356
+ }, formik.getFieldProps("cardNumber")), {}, {
357
+ onChange: /*#__PURE__*/function () {
358
+ var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(e) {
359
+ var value;
360
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
361
+ while (1) switch (_context.prev = _context.next) {
362
+ case 0:
363
+ value = formatInputValue(e, 4, " ");
364
+ _context.next = 3;
365
+ return formik.setFieldValue("cardNumber", value);
366
+ case 3:
367
+ if (value.length === 19) {
368
+ formik.validateField("cardNumber");
369
+ }
370
+ case 4:
371
+ case "end":
372
+ return _context.stop();
373
+ }
374
+ }, _callee);
375
+ }));
376
+ return function (_x) {
377
+ return _ref5.apply(this, arguments);
378
+ };
379
+ }()
380
+ }))
381
+ }), /*#__PURE__*/_jsxs("div", {
382
+ className: stl(_templateObject15 || (_templateObject15 = _taggedTemplateLiteral(["w-full flex gap-4"]))),
383
+ children: [/*#__PURE__*/_jsx(Field, {
384
+ label: "Card Expiration Date",
385
+ labelFor: "cardExpirationDate",
386
+ description: "Please enter the card expiration date",
387
+ state: getFieldState("cardExpirationDate"),
388
+ className: stl(_templateObject16 || (_templateObject16 = _taggedTemplateLiteral(["w-full"]))),
389
+ children: /*#__PURE__*/_jsx(Input, _objectSpread(_objectSpread({
390
+ id: "cardExpirationDate",
391
+ placeholder: "MM/YY",
392
+ maxLength: 4 + 1 // 1 slash
393
+ ,
394
+ startIcon: CalendarIcon,
395
+ required: true
396
+ }, formik.getFieldProps("cardExpirationDate")), {}, {
397
+ onChange: function onChange(e) {
398
+ e.target.value = formatInputValue(e, 2, "/");
399
+ formik.getFieldProps("cardExpirationDate").onChange(e);
400
+ },
401
+ onBlur: function onBlur(e) {
402
+ formik.validateField("cardExpirationDate");
403
+ formik.getFieldProps("cardExpirationDate").onBlur(e);
404
+ }
405
+ }))
406
+ }), /*#__PURE__*/_jsx(Field, {
407
+ label: "Card CVC",
408
+ labelFor: "cardCVC",
409
+ description: "Please enter the card security code",
410
+ state: getFieldState("cardCVC"),
411
+ className: stl(_templateObject17 || (_templateObject17 = _taggedTemplateLiteral(["w-full"]))),
412
+ children: /*#__PURE__*/_jsx(Input, _objectSpread(_objectSpread({
413
+ id: "cardCVC",
414
+ placeholder: "CVC",
415
+ maxLength: 4,
416
+ startIcon: LockIcon,
417
+ required: true
418
+ }, formik.getFieldProps("cardCVC")), {}, {
419
+ onBlur: function onBlur(e) {
420
+ formik.validateField("cardCVC");
421
+ formik.getFieldProps("cardCVC").onBlur(e);
422
+ }
423
+ }))
424
+ })]
425
+ }), /*#__PURE__*/_jsxs("div", {
426
+ className: stl(_templateObject18 || (_templateObject18 = _taggedTemplateLiteral(["flex gap-2"]))),
427
+ children: [/*#__PURE__*/_jsx(ExperimentalFormSubmit, {
428
+ variant: "primary",
429
+ "aria-label": "Save the form",
430
+ children: "Save"
431
+ }), /*#__PURE__*/_jsx(ExperimentalFormReset, {
432
+ "aria-label": "Reset the form",
433
+ onClick: function onClick() {
434
+ return formik.resetForm();
435
+ },
436
+ children: "Reset"
437
+ })]
438
+ })]
439
+ }), /*#__PURE__*/_jsx("hr", {
440
+ className: stl(_templateObject19 || (_templateObject19 = _taggedTemplateLiteral(["text-grey-500"])))
441
+ }), /*#__PURE__*/_jsx("code", {
442
+ className: stl(_templateObject20 || (_templateObject20 = _taggedTemplateLiteral(["whitespace-pre"]))),
443
+ children: JSON.stringify(formData, null, 2)
444
+ })]
445
+ });
446
+ };
@@ -0,0 +1,16 @@
1
+ import { useEffect, useRef } from "react";
2
+ export var useFormikAutoFocusOnError = function useFormikAutoFocusOnError(formik) {
3
+ var lastSubmitCount = useRef(formik.submitCount);
4
+ useEffect(function () {
5
+ var errorKeys = Object.keys(formik.errors);
6
+
7
+ // This prevents the focus from being moved to the first error field when the field is validated on change.
8
+ if (lastSubmitCount.current !== formik.submitCount && errorKeys.length > 0) {
9
+ lastSubmitCount.current = formik.submitCount;
10
+ var firstElement = document.querySelector("[id^=\"".concat(errorKeys[0], "\"][aria-invalid=\"true\"]"));
11
+ if (firstElement !== document.activeElement) {
12
+ firstElement === null || firstElement === void 0 || firstElement.focus();
13
+ }
14
+ }
15
+ }, [formik.errors, formik.submitCount, formik.isSubmitting]);
16
+ };
@@ -0,0 +1 @@
1
+ export declare const useExperimentalForm: () => import("./FormContext").ExperimentalFormContextValue | null;
@@ -0,0 +1,5 @@
1
+ import { useContext } from "react";
2
+ import { ExperimentalFormContext } from "./FormContext";
3
+ export var useExperimentalForm = function useExperimentalForm() {
4
+ return useContext(ExperimentalFormContext);
5
+ };
@@ -2,8 +2,8 @@ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
2
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
3
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
4
4
  import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
5
- var _excluded = ["className", "style", "startIcon", "endItem", "disabled", "readOnly", "clearable", "type", "variant", "locale"];
6
- var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14;
5
+ var _excluded = ["className", "style", "startIcon", "endItem", "disabled", "readOnly", "clearable", "type", "variant", "locale", "required"];
6
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15, _templateObject16;
7
7
  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; }
8
8
  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; }
9
9
  import cx from "clsx";
@@ -56,6 +56,7 @@ var ValidatedIcon = function ValidatedIcon() {
56
56
  * See the [Input documentation page](https://satellite.algolia.com/components/forms/input) for more information.
57
57
  */
58
58
  export var Input = /*#__PURE__*/forwardRef(function (_ref, externalRef) {
59
+ var _inputProps$id;
59
60
  var className = _ref.className,
60
61
  style = _ref.style,
61
62
  startIcon = _ref.startIcon,
@@ -68,6 +69,7 @@ export var Input = /*#__PURE__*/forwardRef(function (_ref, externalRef) {
68
69
  _ref$variant = _ref.variant,
69
70
  variant = _ref$variant === void 0 ? "medium" : _ref$variant,
70
71
  propsLocale = _ref.locale,
72
+ required = _ref.required,
71
73
  inputProps = _objectWithoutProperties(_ref, _excluded);
72
74
  var contextLocale = useLocale("input");
73
75
  var locale = _objectSpread(_objectSpread(_objectSpread({}, DEFAULT_INPUT_LOCALE), contextLocale), propsLocale);
@@ -80,9 +82,13 @@ export var Input = /*#__PURE__*/forwardRef(function (_ref, externalRef) {
80
82
  inputRefCallback = _useForwardedRef2[0],
81
83
  inputRef = _useForwardedRef2[1];
82
84
  var triggerInputChange = useTriggerInputChange(inputRef);
83
- var _useField = useField(),
85
+ var _useField = useField({
86
+ required: required
87
+ }),
84
88
  status = _useField.state.status,
85
- labelId = _useField.labelId;
89
+ labelId = _useField.labelId,
90
+ descriptionId = _useField.descriptionId,
91
+ inputId = _useField.inputId;
86
92
  var isControlled = ("value" in inputProps);
87
93
  var _useState3 = useState(function () {
88
94
  return isControlled ? inputProps.value : inputProps.defaultValue;
@@ -98,7 +104,8 @@ export var Input = /*#__PURE__*/forwardRef(function (_ref, externalRef) {
98
104
  }, [inputProps.value, isControlled]);
99
105
  var Icon = startIcon ? startIcon : type === "search" ? SearchIcon : undefined;
100
106
  var iconSize = variant === "small" ? "1rem" : "1.5rem";
101
- var StatusIcon = status === "invalid" ? InvalidIcon : status === "validated" ? ValidatedIcon : Fragment;
107
+ var isInvalid = status === "invalid";
108
+ var StatusIcon = isInvalid ? InvalidIcon : status === "validated" ? ValidatedIcon : Fragment;
102
109
  var clearable = typeof clearableProp === "boolean" ? clearableProp : type === "search";
103
110
  return /*#__PURE__*/_jsxs("div", {
104
111
  className: cx(stl(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n input group\n ", "\n ", "\n "])), focused && "input-focused", disabled && "input-disabled"), VARIANT_CLASSNAMES[variant], STATUS_CLASSNAMES[status], className),
@@ -115,8 +122,12 @@ export var Input = /*#__PURE__*/forwardRef(function (_ref, externalRef) {
115
122
  className: stl(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["mx-4 no-search-input-decoration"]))),
116
123
  ref: inputRefCallback,
117
124
  type: type,
118
- "aria-labelledby": labelId
125
+ "aria-labelledby": labelId,
126
+ "aria-describedby": descriptionId
119
127
  }, inputProps), {}, {
128
+ id: (_inputProps$id = inputProps.id) !== null && _inputProps$id !== void 0 ? _inputProps$id : inputId,
129
+ required: required,
130
+ "aria-invalid": isInvalid,
120
131
  readOnly: readOnly,
121
132
  disabled: disabled,
122
133
  onChange: function onChange(evt) {
@@ -174,13 +185,14 @@ export var Input = /*#__PURE__*/forwardRef(function (_ref, externalRef) {
174
185
  }
175
186
  },
176
187
  children: /*#__PURE__*/_jsx(ChevronUpIcon, {
177
- size: 12
188
+ size: 12,
189
+ className: cx(isInvalid && stl(_templateObject14 || (_templateObject14 = _taggedTemplateLiteral(["text-red-700"]))))
178
190
  })
179
191
  }), /*#__PURE__*/_jsx("button", {
180
192
  tabIndex: -1,
181
193
  type: "button",
182
194
  disabled: readOnly,
183
- className: stl(_templateObject14 || (_templateObject14 = _taggedTemplateLiteral(["input-spinner-button ", ""])), readOnly && "cursor-not-allowed"),
195
+ className: stl(_templateObject15 || (_templateObject15 = _taggedTemplateLiteral(["input-spinner-button ", ""])), readOnly && "cursor-not-allowed"),
184
196
  "aria-label": locale.decrement,
185
197
  onClick: function onClick() {
186
198
  var _inputRef$current$val2, _inputRef$current3;
@@ -197,7 +209,8 @@ export var Input = /*#__PURE__*/forwardRef(function (_ref, externalRef) {
197
209
  }
198
210
  },
199
211
  children: /*#__PURE__*/_jsx(ChevronDownIcon, {
200
- size: 12
212
+ size: 12,
213
+ className: cx(isInvalid && stl(_templateObject16 || (_templateObject16 = _taggedTemplateLiteral(["text-red-700"]))))
201
214
  })
202
215
  })]
203
216
  })]
@@ -18,6 +18,7 @@ var inputPlugin = plugin(function (_ref) {
18
18
  lineHeight: theme("lineHeight.base"),
19
19
  backgroundColor: theme("colors.white"),
20
20
  border: "1px solid ".concat(theme("colors.grey.500")),
21
+ outline: "1px solid transparent",
21
22
  borderRadius: theme("borderRadius.DEFAULT"),
22
23
  boxShadow: "inset 0px 1px 4px 0px ".concat(rgba(theme("colors.grey.500"), 0.3)),
23
24
  overflow: "hidden",
@@ -83,10 +84,14 @@ var inputPlugin = plugin(function (_ref) {
83
84
  borderColor: theme("colors.red.700")
84
85
  },
85
86
  "&:hover": {
86
- borderColor: theme("colors.red.800"),
87
+ background: theme("colors.red.50"),
88
+ borderColor: theme("colors.red.700"),
87
89
  ".input-spinner-button": {
88
- borderColor: theme("colors.red.800")
90
+ borderColor: theme("colors.red.700")
89
91
  }
92
+ },
93
+ "&.input-focused, &.input:focus-within": {
94
+ outlineColor: theme("colors.red.700")
90
95
  }
91
96
  }
92
97
  });
@@ -16,4 +16,4 @@ export declare type DotPaginationProps<T extends number> = {
16
16
  *
17
17
  * See the [Dot Pagination documentation page](https://satellite.algolia.com/components/navigation/dot-pagination) for more information.
18
18
  */
19
- export declare const DotPagination: <T extends number>({ currentPage, onChange, nbPages, size, locale: propsLocale, }: DotPaginationProps<T>) => JSX.Element;
19
+ export declare const DotPagination: <T extends number>({ currentPage, onChange, nbPages, size, locale, }: DotPaginationProps<T>) => JSX.Element;
@@ -1,3 +1,3 @@
1
1
  import type { HTMLAttributes, InputHTMLAttributes } from "react";
2
2
  export declare type RadioButtonProps = HTMLAttributes<HTMLInputElement> & Pick<InputHTMLAttributes<HTMLInputElement>, "value" | "name" | "checked" | "defaultChecked" | "onChange" | "required" | "autoFocus" | "disabled">;
3
- export declare const RadioButton: import("react").ForwardRefExoticComponent<HTMLAttributes<HTMLInputElement> & Pick<InputHTMLAttributes<HTMLInputElement>, "value" | "defaultChecked" | "onChange" | "name" | "autoFocus" | "disabled" | "checked" | "required"> & import("react").RefAttributes<HTMLInputElement>>;
3
+ export declare const RadioButton: import("react").ForwardRefExoticComponent<HTMLAttributes<HTMLInputElement> & Pick<InputHTMLAttributes<HTMLInputElement>, "value" | "defaultChecked" | "onChange" | "name" | "required" | "autoFocus" | "disabled" | "checked"> & import("react").RefAttributes<HTMLInputElement>>;
@@ -2,18 +2,31 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
3
3
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
4
4
  var _templateObject;
5
- var _excluded = ["className"];
5
+ var _excluded = ["className", "required"];
6
6
  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; }
7
7
  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; }
8
8
  import cx from "clsx";
9
9
  import { forwardRef } from "react";
10
+ import { useField } from "../Field";
10
11
  import stl from "../styles/helpers/satellitePrefixer";
11
12
  import { jsx as _jsx } from "react/jsx-runtime";
12
13
  export var RadioButton = /*#__PURE__*/forwardRef(function (_ref, ref) {
13
14
  var className = _ref.className,
15
+ _ref$required = _ref.required,
16
+ required = _ref$required === void 0 ? false : _ref$required,
14
17
  props = _objectWithoutProperties(_ref, _excluded);
15
- return /*#__PURE__*/_jsx("input", _objectSpread(_objectSpread({}, props), {}, {
16
- className: cx(stl(_templateObject || (_templateObject = _taggedTemplateLiteral(["radio-button"]))), className),
18
+ var _useField = useField({
19
+ required: required
20
+ }),
21
+ state = _useField.state,
22
+ descriptionId = _useField.descriptionId;
23
+ var isInvalid = state.status === "invalid";
24
+ return /*#__PURE__*/_jsx("input", _objectSpread(_objectSpread({
25
+ "aria-describedby": descriptionId
26
+ }, props), {}, {
27
+ required: required,
28
+ "aria-invalid": isInvalid,
29
+ className: cx(stl(_templateObject || (_templateObject = _taggedTemplateLiteral(["radio-button ", ""])), isInvalid && "radio-button-invalid"), className),
17
30
  type: "radio",
18
31
  ref: ref
19
32
  }));