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