@gympass/yoga 7.70.2 → 7.72.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.
@@ -15,7 +15,7 @@ var _yogaIcons = require("@gympass/yoga-icons");
15
15
 
16
16
  var _Input = _interopRequireDefault(require("../../Input/web/Input"));
17
17
 
18
- var _excluded = ["className", "style", "full", "options", "onChange", "onClean", "onSelect", "value", "error", "openSuggestionsAriaLabel", "closeSuggestionsAriaLabel"];
18
+ var _excluded = ["className", "style", "full", "options", "onChange", "onClean", "onSelect", "value", "error", "openSuggestionsAriaLabel", "closeSuggestionsAriaLabel", "shouldFilterOptions"];
19
19
 
20
20
  var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
21
21
 
@@ -78,6 +78,7 @@ var AutoComplete = /*#__PURE__*/_react["default"].forwardRef(function (_ref6, re
78
78
  error = _ref6.error,
79
79
  openSuggestionsAriaLabel = _ref6.openSuggestionsAriaLabel,
80
80
  closeSuggestionsAriaLabel = _ref6.closeSuggestionsAriaLabel,
81
+ shouldFilterOptions = _ref6.shouldFilterOptions,
81
82
  props = _objectWithoutPropertiesLoose(_ref6, _excluded);
82
83
 
83
84
  var _useState = (0, _react.useState)(value),
@@ -136,11 +137,11 @@ var AutoComplete = /*#__PURE__*/_react["default"].forwardRef(function (_ref6, re
136
137
  openMenu = _ref8.openMenu,
137
138
  inputValue = _ref8.inputValue;
138
139
  var reg = new RegExp("(" + escapeRegExp(inputValue || '').trim() + ")", 'gi');
139
- var suggestionList = options.filter(function (option) {
140
+ var suggestionList = shouldFilterOptions ? options.filter(function (option) {
140
141
  return option.match(reg);
141
142
  }).sort(function (first, second) {
142
143
  return first.toLowerCase().indexOf(inputValue) < second.toLowerCase().indexOf(inputValue) ? -1 : 1;
143
- });
144
+ }) : options;
144
145
 
145
146
  if (!!inputValue && isOpen) {
146
147
  setIsSuggestionsOpen(true);
@@ -175,7 +176,8 @@ var AutoComplete = /*#__PURE__*/_react["default"].forwardRef(function (_ref6, re
175
176
  onClick: handleOpenSuggestions,
176
177
  "aria-label": openSuggestionsAriaLabel
177
178
  }),
178
- ref: inputRef
179
+ ref: inputRef,
180
+ includeAriaAttributes: false
179
181
  })), isSuggestionsOpen && /*#__PURE__*/_react["default"].createElement(List, _extends({}, getMenuProps(), {
180
182
  full: full,
181
183
  error: !!error
@@ -217,7 +219,10 @@ AutoComplete.propTypes = {
217
219
  openSuggestionsAriaLabel: _propTypes.string,
218
220
 
219
221
  /** an aria label for the close suggestions icon */
220
- closeSuggestionsAriaLabel: _propTypes.string
222
+ closeSuggestionsAriaLabel: _propTypes.string,
223
+
224
+ /** flag to enable options filtering */
225
+ shouldFilterOptions: _propTypes.bool
221
226
  };
222
227
  AutoComplete.defaultProps = {
223
228
  className: undefined,
@@ -230,7 +235,8 @@ AutoComplete.defaultProps = {
230
235
  value: undefined,
231
236
  error: undefined,
232
237
  openSuggestionsAriaLabel: 'Open suggestions',
233
- closeSuggestionsAriaLabel: 'Close suggestions'
238
+ closeSuggestionsAriaLabel: 'Close suggestions',
239
+ shouldFilterOptions: true
234
240
  };
235
241
  var _default = AutoComplete;
236
242
  exports["default"] = _default;
@@ -155,7 +155,8 @@ var Dropdown = /*#__PURE__*/_react["default"].forwardRef(function (_ref10, ref)
155
155
  isOpen: isOpen,
156
156
  label: label,
157
157
  full: full,
158
- ref: inputRef
158
+ ref: inputRef,
159
+ includeAriaAttributes: false
159
160
  }, getInputProps())), /*#__PURE__*/_react["default"].createElement(Button, _extends({
160
161
  isOpen: isOpen,
161
162
  disabled: disabled
@@ -15,6 +15,8 @@ var _templateObject, _templateObject2;
15
15
 
16
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
17
17
 
18
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
19
+
18
20
  function _taggedTemplateLiteralLoose(strings, raw) { if (!raw) { raw = strings.slice(0); } strings.raw = raw; return strings; }
19
21
 
20
22
  var Wrapper = _styledComponents["default"].div(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["\n display: flex;\n justify-content: space-between;\n ", "\n"])), function (_ref) {
@@ -39,13 +41,17 @@ var Helper = function Helper(_ref3) {
39
41
  helper = _ref3.helper,
40
42
  maxLength = _ref3.maxLength,
41
43
  length = _ref3.length,
42
- hideMaxLength = _ref3.hideMaxLength;
44
+ hideMaxLength = _ref3.hideMaxLength,
45
+ a11yId = _ref3.a11yId;
43
46
  return /*#__PURE__*/_react["default"].createElement(Wrapper, {
44
47
  disabled: disabled,
45
48
  error: error
46
- }, (error || helper) && /*#__PURE__*/_react["default"].createElement(Info, {
47
- as: "span"
48
- }, error || helper), maxLength && !hideMaxLength && /*#__PURE__*/_react["default"].createElement(Info, {
49
+ }, (error || helper) && /*#__PURE__*/_react["default"].createElement(Info, _extends({
50
+ as: "span",
51
+ "aria-live": "polite"
52
+ }, a11yId && {
53
+ id: a11yId
54
+ }), error || helper), maxLength && !hideMaxLength && /*#__PURE__*/_react["default"].createElement(Info, {
49
55
  as: "span"
50
56
  }, length, "/", maxLength));
51
57
  };
@@ -56,7 +62,8 @@ Helper.propTypes = {
56
62
  helper: _propTypes.string,
57
63
  maxLength: _propTypes.number,
58
64
  length: _propTypes.number,
59
- hideMaxLength: _propTypes.bool
65
+ hideMaxLength: _propTypes.bool,
66
+ a11yId: _propTypes.string
60
67
  };
61
68
  Helper.defaultProps = {
62
69
  disabled: undefined,
@@ -64,7 +71,8 @@ Helper.defaultProps = {
64
71
  helper: undefined,
65
72
  maxLength: undefined,
66
73
  length: undefined,
67
- hideMaxLength: undefined
74
+ hideMaxLength: undefined,
75
+ a11yId: undefined
68
76
  };
69
77
  var _default = Helper;
70
78
  exports["default"] = _default;
@@ -23,7 +23,7 @@ var _Legend = _interopRequireDefault(require("./Legend"));
23
23
 
24
24
  var _Label = _interopRequireDefault(require("./Label"));
25
25
 
26
- var _excluded = ["cleanable", "children", "disabled", "error", "full", "helper", "label", "maxLength", "readOnly", "style", "value", "onChange", "onClean", "hideMaxLength", "rightIcon"];
26
+ var _excluded = ["cleanable", "children", "disabled", "error", "full", "helper", "label", "maxLength", "readOnly", "style", "value", "onChange", "onClean", "hideMaxLength", "rightIcon", "a11yId", "includeAriaAttributes"];
27
27
 
28
28
  var _templateObject, _templateObject2, _templateObject3, _templateObject4;
29
29
 
@@ -71,6 +71,8 @@ var Input = /*#__PURE__*/_react["default"].forwardRef(function (_ref3, ref) {
71
71
  onClean = _ref3.onClean,
72
72
  hideMaxLength = _ref3.hideMaxLength,
73
73
  rightIcon = _ref3.rightIcon,
74
+ a11yId = _ref3.a11yId,
75
+ includeAriaAttributes = _ref3.includeAriaAttributes,
74
76
  props = _objectWithoutPropertiesLoose(_ref3, _excluded);
75
77
 
76
78
  var inputRef = ref || (0, _react.useRef)(null);
@@ -83,6 +85,24 @@ var Input = /*#__PURE__*/_react["default"].forwardRef(function (_ref3, ref) {
83
85
  }
84
86
  };
85
87
 
88
+ var hasHelper = helper || maxLength || error;
89
+ var helperA11yId = includeAriaAttributes && a11yId && a11yId + "-helper";
90
+ var labelA11yId = includeAriaAttributes && a11yId && a11yId + "-label";
91
+ var a11yFieldProps;
92
+
93
+ if (includeAriaAttributes) {
94
+ a11yFieldProps = a11yId ? _extends({}, hasHelper && {
95
+ 'aria-describedby': helperA11yId
96
+ }, label && {
97
+ 'aria-labelledby': labelA11yId
98
+ }) : _extends({}, label && {
99
+ 'aria-label': label
100
+ });
101
+ a11yFieldProps['aria-invalid'] = !!error;
102
+ } else {
103
+ a11yFieldProps = {};
104
+ }
105
+
86
106
  return /*#__PURE__*/_react["default"].createElement(Control, {
87
107
  full: full
88
108
  }, /*#__PURE__*/_react["default"].createElement(_Fieldset["default"], {
@@ -103,10 +123,12 @@ var Input = /*#__PURE__*/_react["default"].forwardRef(function (_ref3, ref) {
103
123
  ref: inputRef,
104
124
  value: value,
105
125
  onChange: onChange
106
- })) : children, /*#__PURE__*/_react["default"].createElement(_Label["default"], {
126
+ }, a11yFieldProps)) : children, /*#__PURE__*/_react["default"].createElement(_Label["default"], _extends({
107
127
  error: error,
108
128
  disabled: disabled
109
- }, label), label && /*#__PURE__*/_react["default"].createElement(_Legend["default"], null, label), cleanable && !readOnly && value && /*#__PURE__*/_react["default"].createElement(IconWrapper, {
129
+ }, labelA11yId && {
130
+ id: labelA11yId
131
+ }), label), label && /*#__PURE__*/_react["default"].createElement(_Legend["default"], null, label), cleanable && !readOnly && value && /*#__PURE__*/_react["default"].createElement(IconWrapper, {
110
132
  tabIndex: 0,
111
133
  disabled: disabled,
112
134
  onClick: cleanField,
@@ -123,13 +145,14 @@ var Input = /*#__PURE__*/_react["default"].forwardRef(function (_ref3, ref) {
123
145
  width: 20,
124
146
  height: 20,
125
147
  role: "button"
126
- }, rightIcon)), (helper || maxLength || error) && /*#__PURE__*/_react["default"].createElement(_Helper["default"], {
148
+ }, rightIcon)), hasHelper && /*#__PURE__*/_react["default"].createElement(_Helper["default"], {
127
149
  error: error,
128
150
  helper: helper,
129
151
  maxLength: maxLength,
130
152
  length: value.length,
131
153
  disabled: disabled,
132
- hideMaxLength: hideMaxLength
154
+ hideMaxLength: hideMaxLength,
155
+ a11yId: helperA11yId
133
156
  }));
134
157
  });
135
158
 
@@ -162,7 +185,13 @@ Input.propTypes = {
162
185
  /** when max length helper is unnecessary to appear */
163
186
  hideMaxLength: _propTypes.bool,
164
187
  placeholder: _propTypes.string,
165
- rightIcon: _propTypes.node
188
+ rightIcon: _propTypes.node,
189
+
190
+ /** a unique prefix to generate HTML IDs to be used for aria-labelledby and aria-describedby */
191
+ a11yId: _propTypes.string,
192
+
193
+ /** useful for components that extend the Input component and have their own ARIA attributes implementation (e.g. Dropdown) */
194
+ includeAriaAttributes: _propTypes.bool
166
195
  };
167
196
  Input.defaultProps = {
168
197
  className: undefined,
@@ -181,7 +210,9 @@ Input.defaultProps = {
181
210
  onClean: function onClean() {},
182
211
  hideMaxLength: false,
183
212
  placeholder: undefined,
184
- rightIcon: undefined
213
+ rightIcon: undefined,
214
+ a11yId: undefined,
215
+ includeAriaAttributes: true
185
216
  };
186
217
  var _default = Input;
187
218
  exports["default"] = _default;
@@ -1,4 +1,4 @@
1
- var _excluded = ["className", "style", "full", "options", "onChange", "onClean", "onSelect", "value", "error", "openSuggestionsAriaLabel", "closeSuggestionsAriaLabel"];
1
+ var _excluded = ["className", "style", "full", "options", "onChange", "onClean", "onSelect", "value", "error", "openSuggestionsAriaLabel", "closeSuggestionsAriaLabel", "shouldFilterOptions"];
2
2
 
3
3
  var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
4
4
 
@@ -59,6 +59,7 @@ var AutoComplete = /*#__PURE__*/React.forwardRef(function (_ref6, ref) {
59
59
  error = _ref6.error,
60
60
  openSuggestionsAriaLabel = _ref6.openSuggestionsAriaLabel,
61
61
  closeSuggestionsAriaLabel = _ref6.closeSuggestionsAriaLabel,
62
+ shouldFilterOptions = _ref6.shouldFilterOptions,
62
63
  props = _objectWithoutPropertiesLoose(_ref6, _excluded);
63
64
 
64
65
  var _useState = useState(value),
@@ -117,11 +118,11 @@ var AutoComplete = /*#__PURE__*/React.forwardRef(function (_ref6, ref) {
117
118
  openMenu = _ref8.openMenu,
118
119
  inputValue = _ref8.inputValue;
119
120
  var reg = new RegExp("(" + escapeRegExp(inputValue || '').trim() + ")", 'gi');
120
- var suggestionList = options.filter(function (option) {
121
+ var suggestionList = shouldFilterOptions ? options.filter(function (option) {
121
122
  return option.match(reg);
122
123
  }).sort(function (first, second) {
123
124
  return first.toLowerCase().indexOf(inputValue) < second.toLowerCase().indexOf(inputValue) ? -1 : 1;
124
- });
125
+ }) : options;
125
126
 
126
127
  if (!!inputValue && isOpen) {
127
128
  setIsSuggestionsOpen(true);
@@ -156,7 +157,8 @@ var AutoComplete = /*#__PURE__*/React.forwardRef(function (_ref6, ref) {
156
157
  onClick: handleOpenSuggestions,
157
158
  "aria-label": openSuggestionsAriaLabel
158
159
  }),
159
- ref: inputRef
160
+ ref: inputRef,
161
+ includeAriaAttributes: false
160
162
  })), isSuggestionsOpen && /*#__PURE__*/React.createElement(List, _extends({}, getMenuProps(), {
161
163
  full: full,
162
164
  error: !!error
@@ -197,7 +199,10 @@ AutoComplete.propTypes = {
197
199
  openSuggestionsAriaLabel: string,
198
200
 
199
201
  /** an aria label for the close suggestions icon */
200
- closeSuggestionsAriaLabel: string
202
+ closeSuggestionsAriaLabel: string,
203
+
204
+ /** flag to enable options filtering */
205
+ shouldFilterOptions: bool
201
206
  };
202
207
  AutoComplete.defaultProps = {
203
208
  className: undefined,
@@ -210,6 +215,7 @@ AutoComplete.defaultProps = {
210
215
  value: undefined,
211
216
  error: undefined,
212
217
  openSuggestionsAriaLabel: 'Open suggestions',
213
- closeSuggestionsAriaLabel: 'Close suggestions'
218
+ closeSuggestionsAriaLabel: 'Close suggestions',
219
+ shouldFilterOptions: true
214
220
  };
215
221
  export default AutoComplete;
@@ -53,14 +53,27 @@ describe('<AutoComplete />', function () {
53
53
  fireEvent.focus(getByDisplayValue('secon'));
54
54
  expect(container.querySelector('ul').firstChild.textContent).toBe('second');
55
55
  });
56
- it('should close options list when clean button is clicked', function () {
56
+ it('should not filter the options', function () {
57
57
  var _render6 = render( /*#__PURE__*/React.createElement(ThemeProvider, null, /*#__PURE__*/React.createElement(AutoComplete, {
58
58
  value: "secon",
59
- options: ['first', 'second', 'third']
59
+ options: ['first', 'second', 'third'],
60
+ shouldFilterOptions: false
60
61
  }))),
61
62
  container = _render6.container,
62
- getByDisplayValue = _render6.getByDisplayValue,
63
- getByRole = _render6.getByRole;
63
+ getByDisplayValue = _render6.getByDisplayValue;
64
+
65
+ fireEvent.focus(getByDisplayValue('secon'));
66
+ expect(container.querySelector('ul').firstChild.textContent).toBe('first');
67
+ expect(container.querySelector('ul').childNodes.length).toBe(3);
68
+ });
69
+ it('should close options list when clean button is clicked', function () {
70
+ var _render7 = render( /*#__PURE__*/React.createElement(ThemeProvider, null, /*#__PURE__*/React.createElement(AutoComplete, {
71
+ value: "secon",
72
+ options: ['first', 'second', 'third']
73
+ }))),
74
+ container = _render7.container,
75
+ getByDisplayValue = _render7.getByDisplayValue,
76
+ getByRole = _render7.getByRole;
64
77
 
65
78
  fireEvent.focus(getByDisplayValue('secon'));
66
79
  fireEvent.click(getByRole('button', {
@@ -75,12 +88,12 @@ describe('<AutoComplete />', function () {
75
88
  var onCleanMock = jest.fn();
76
89
  var onSelectMock = jest.fn();
77
90
 
78
- var _render7 = render( /*#__PURE__*/React.createElement(ThemeProvider, null, /*#__PURE__*/React.createElement(AutoComplete, {
91
+ var _render8 = render( /*#__PURE__*/React.createElement(ThemeProvider, null, /*#__PURE__*/React.createElement(AutoComplete, {
79
92
  value: "New",
80
93
  options: ['New York'],
81
94
  onChange: onChangeMock
82
95
  }))),
83
- getByDisplayValue = _render7.getByDisplayValue;
96
+ getByDisplayValue = _render8.getByDisplayValue;
84
97
 
85
98
  fireEvent.change(getByDisplayValue('New'), {
86
99
  target: {
@@ -96,15 +109,15 @@ describe('<AutoComplete />', function () {
96
109
  var onSelectMock = jest.fn();
97
110
  var onChangeMock = jest.fn();
98
111
 
99
- var _render8 = render( /*#__PURE__*/React.createElement(ThemeProvider, null, /*#__PURE__*/React.createElement(AutoComplete, {
112
+ var _render9 = render( /*#__PURE__*/React.createElement(ThemeProvider, null, /*#__PURE__*/React.createElement(AutoComplete, {
100
113
  value: "New",
101
114
  options: ['New York'],
102
115
  onClean: onCleanMock,
103
116
  onSelect: onSelectMock,
104
117
  onChange: onChangeMock
105
118
  }))),
106
- getByDisplayValue = _render8.getByDisplayValue,
107
- getByRole = _render8.getByRole;
119
+ getByDisplayValue = _render9.getByDisplayValue,
120
+ getByRole = _render9.getByRole;
108
121
 
109
122
  fireEvent.focus(getByDisplayValue('New'));
110
123
  fireEvent.click(getByRole('button', {
@@ -119,15 +132,15 @@ describe('<AutoComplete />', function () {
119
132
  var onCleanMock = jest.fn();
120
133
  var onChangeMock = jest.fn();
121
134
 
122
- var _render9 = render( /*#__PURE__*/React.createElement(ThemeProvider, null, /*#__PURE__*/React.createElement(AutoComplete, {
135
+ var _render10 = render( /*#__PURE__*/React.createElement(ThemeProvider, null, /*#__PURE__*/React.createElement(AutoComplete, {
123
136
  value: "New",
124
137
  options: ['New York'],
125
138
  onSelect: onSelectMock,
126
139
  onClean: onCleanMock,
127
140
  onChange: onChangeMock
128
141
  }))),
129
- getByDisplayValue = _render9.getByDisplayValue,
130
- getByRole = _render9.getByRole;
142
+ getByDisplayValue = _render10.getByDisplayValue,
143
+ getByRole = _render10.getByRole;
131
144
 
132
145
  fireEvent.focus(getByDisplayValue('New'));
133
146
  fireEvent.click(getByRole('option'));
@@ -129,7 +129,8 @@ var Dropdown = /*#__PURE__*/React.forwardRef(function (_ref10, ref) {
129
129
  isOpen: isOpen,
130
130
  label: label,
131
131
  full: full,
132
- ref: inputRef
132
+ ref: inputRef,
133
+ includeAriaAttributes: false
133
134
  }, getInputProps())), /*#__PURE__*/React.createElement(Button, _extends({
134
135
  isOpen: isOpen,
135
136
  disabled: disabled
@@ -1,5 +1,7 @@
1
1
  var _templateObject, _templateObject2;
2
2
 
3
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
4
+
3
5
  function _taggedTemplateLiteralLoose(strings, raw) { if (!raw) { raw = strings.slice(0); } strings.raw = raw; return strings; }
4
6
 
5
7
  import React from 'react';
@@ -26,13 +28,17 @@ var Helper = function Helper(_ref3) {
26
28
  helper = _ref3.helper,
27
29
  maxLength = _ref3.maxLength,
28
30
  length = _ref3.length,
29
- hideMaxLength = _ref3.hideMaxLength;
31
+ hideMaxLength = _ref3.hideMaxLength,
32
+ a11yId = _ref3.a11yId;
30
33
  return /*#__PURE__*/React.createElement(Wrapper, {
31
34
  disabled: disabled,
32
35
  error: error
33
- }, (error || helper) && /*#__PURE__*/React.createElement(Info, {
34
- as: "span"
35
- }, error || helper), maxLength && !hideMaxLength && /*#__PURE__*/React.createElement(Info, {
36
+ }, (error || helper) && /*#__PURE__*/React.createElement(Info, _extends({
37
+ as: "span",
38
+ "aria-live": "polite"
39
+ }, a11yId && {
40
+ id: a11yId
41
+ }), error || helper), maxLength && !hideMaxLength && /*#__PURE__*/React.createElement(Info, {
36
42
  as: "span"
37
43
  }, length, "/", maxLength));
38
44
  };
@@ -43,7 +49,8 @@ Helper.propTypes = {
43
49
  helper: string,
44
50
  maxLength: number,
45
51
  length: number,
46
- hideMaxLength: bool
52
+ hideMaxLength: bool,
53
+ a11yId: string
47
54
  };
48
55
  Helper.defaultProps = {
49
56
  disabled: undefined,
@@ -51,6 +58,7 @@ Helper.defaultProps = {
51
58
  helper: undefined,
52
59
  maxLength: undefined,
53
60
  length: undefined,
54
- hideMaxLength: undefined
61
+ hideMaxLength: undefined,
62
+ a11yId: undefined
55
63
  };
56
64
  export default Helper;
@@ -1,4 +1,4 @@
1
- var _excluded = ["cleanable", "children", "disabled", "error", "full", "helper", "label", "maxLength", "readOnly", "style", "value", "onChange", "onClean", "hideMaxLength", "rightIcon"];
1
+ var _excluded = ["cleanable", "children", "disabled", "error", "full", "helper", "label", "maxLength", "readOnly", "style", "value", "onChange", "onClean", "hideMaxLength", "rightIcon", "a11yId", "includeAriaAttributes"];
2
2
 
3
3
  var _templateObject, _templateObject2, _templateObject3, _templateObject4;
4
4
 
@@ -48,6 +48,8 @@ var Input = /*#__PURE__*/React.forwardRef(function (_ref3, ref) {
48
48
  onClean = _ref3.onClean,
49
49
  hideMaxLength = _ref3.hideMaxLength,
50
50
  rightIcon = _ref3.rightIcon,
51
+ a11yId = _ref3.a11yId,
52
+ includeAriaAttributes = _ref3.includeAriaAttributes,
51
53
  props = _objectWithoutPropertiesLoose(_ref3, _excluded);
52
54
 
53
55
  var inputRef = ref || useRef(null);
@@ -60,6 +62,24 @@ var Input = /*#__PURE__*/React.forwardRef(function (_ref3, ref) {
60
62
  }
61
63
  };
62
64
 
65
+ var hasHelper = helper || maxLength || error;
66
+ var helperA11yId = includeAriaAttributes && a11yId && a11yId + "-helper";
67
+ var labelA11yId = includeAriaAttributes && a11yId && a11yId + "-label";
68
+ var a11yFieldProps;
69
+
70
+ if (includeAriaAttributes) {
71
+ a11yFieldProps = a11yId ? _extends({}, hasHelper && {
72
+ 'aria-describedby': helperA11yId
73
+ }, label && {
74
+ 'aria-labelledby': labelA11yId
75
+ }) : _extends({}, label && {
76
+ 'aria-label': label
77
+ });
78
+ a11yFieldProps['aria-invalid'] = !!error;
79
+ } else {
80
+ a11yFieldProps = {};
81
+ }
82
+
63
83
  return /*#__PURE__*/React.createElement(Control, {
64
84
  full: full
65
85
  }, /*#__PURE__*/React.createElement(Fieldset, {
@@ -80,10 +100,12 @@ var Input = /*#__PURE__*/React.forwardRef(function (_ref3, ref) {
80
100
  ref: inputRef,
81
101
  value: value,
82
102
  onChange: onChange
83
- })) : children, /*#__PURE__*/React.createElement(Label, {
103
+ }, a11yFieldProps)) : children, /*#__PURE__*/React.createElement(Label, _extends({
84
104
  error: error,
85
105
  disabled: disabled
86
- }, label), label && /*#__PURE__*/React.createElement(Legend, null, label), cleanable && !readOnly && value && /*#__PURE__*/React.createElement(IconWrapper, {
106
+ }, labelA11yId && {
107
+ id: labelA11yId
108
+ }), label), label && /*#__PURE__*/React.createElement(Legend, null, label), cleanable && !readOnly && value && /*#__PURE__*/React.createElement(IconWrapper, {
87
109
  tabIndex: 0,
88
110
  disabled: disabled,
89
111
  onClick: cleanField,
@@ -100,13 +122,14 @@ var Input = /*#__PURE__*/React.forwardRef(function (_ref3, ref) {
100
122
  width: 20,
101
123
  height: 20,
102
124
  role: "button"
103
- }, rightIcon)), (helper || maxLength || error) && /*#__PURE__*/React.createElement(Helper, {
125
+ }, rightIcon)), hasHelper && /*#__PURE__*/React.createElement(Helper, {
104
126
  error: error,
105
127
  helper: helper,
106
128
  maxLength: maxLength,
107
129
  length: value.length,
108
130
  disabled: disabled,
109
- hideMaxLength: hideMaxLength
131
+ hideMaxLength: hideMaxLength,
132
+ a11yId: helperA11yId
110
133
  }));
111
134
  });
112
135
  Input.propTypes = {
@@ -138,7 +161,13 @@ Input.propTypes = {
138
161
  /** when max length helper is unnecessary to appear */
139
162
  hideMaxLength: bool,
140
163
  placeholder: string,
141
- rightIcon: node
164
+ rightIcon: node,
165
+
166
+ /** a unique prefix to generate HTML IDs to be used for aria-labelledby and aria-describedby */
167
+ a11yId: string,
168
+
169
+ /** useful for components that extend the Input component and have their own ARIA attributes implementation (e.g. Dropdown) */
170
+ includeAriaAttributes: bool
142
171
  };
143
172
  Input.defaultProps = {
144
173
  className: undefined,
@@ -157,6 +186,8 @@ Input.defaultProps = {
157
186
  onClean: function onClean() {},
158
187
  hideMaxLength: false,
159
188
  placeholder: undefined,
160
- rightIcon: undefined
189
+ rightIcon: undefined,
190
+ a11yId: undefined,
191
+ includeAriaAttributes: true
161
192
  };
162
193
  export default Input;
@@ -61,6 +61,34 @@ describe('<Input />', function () {
61
61
 
62
62
  expect(container).toMatchSnapshot();
63
63
  });
64
+ it('should match with a11yId', function () {
65
+ var _render8 = render( /*#__PURE__*/React.createElement(ThemeProvider, null, /*#__PURE__*/React.createElement(Input, {
66
+ label: "Label",
67
+ a11yId: "id"
68
+ }))),
69
+ container = _render8.container;
70
+
71
+ expect(container).toMatchSnapshot();
72
+ });
73
+ it('should match with a11yId and error', function () {
74
+ var _render9 = render( /*#__PURE__*/React.createElement(ThemeProvider, null, /*#__PURE__*/React.createElement(Input, {
75
+ label: "Label",
76
+ a11yId: "id",
77
+ error: "Error message"
78
+ }))),
79
+ container = _render9.container;
80
+
81
+ expect(container).toMatchSnapshot();
82
+ });
83
+ it('should match with includeAriaAttributes set to false', function () {
84
+ var _render10 = render( /*#__PURE__*/React.createElement(ThemeProvider, null, /*#__PURE__*/React.createElement(Input, {
85
+ label: "Label",
86
+ includeAriaAttributes: false
87
+ }))),
88
+ container = _render10.container;
89
+
90
+ expect(container).toMatchSnapshot();
91
+ });
64
92
  });
65
93
  describe('Events', function () {
66
94
  it('should call onChange', function () {
@@ -101,11 +129,11 @@ describe('<Input />', function () {
101
129
  });
102
130
  describe('maxLength', function () {
103
131
  it('should update maxLength counter when add character', function () {
104
- var _render8 = render( /*#__PURE__*/React.createElement(ThemeProvider, null, /*#__PURE__*/React.createElement(Input, {
132
+ var _render11 = render( /*#__PURE__*/React.createElement(ThemeProvider, null, /*#__PURE__*/React.createElement(Input, {
105
133
  label: "Input",
106
134
  maxLength: 10
107
135
  }))),
108
- rerender = _render8.rerender;
136
+ rerender = _render11.rerender;
109
137
 
110
138
  expect(screen.getByText('0/10').textContent).toBe('0/10');
111
139
  rerender( /*#__PURE__*/React.createElement(ThemeProvider, null, /*#__PURE__*/React.createElement(Input, {
@@ -128,10 +156,10 @@ describe('<Input />', function () {
128
156
  expect(onClean).toHaveBeenCalled();
129
157
  });
130
158
  it('should test if clean button is present', function () {
131
- var _render9 = render( /*#__PURE__*/React.createElement(ThemeProvider, null, /*#__PURE__*/React.createElement(Input, {
159
+ var _render12 = render( /*#__PURE__*/React.createElement(ThemeProvider, null, /*#__PURE__*/React.createElement(Input, {
132
160
  label: "Input"
133
161
  }))),
134
- rerender = _render9.rerender; // closeButton
162
+ rerender = _render12.rerender; // closeButton
135
163
 
136
164
 
137
165
  expect(screen.queryByRole('button')).toBeNull();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gympass/yoga",
3
- "version": "7.70.2",
3
+ "version": "7.72.0",
4
4
  "description": "Gympass component library",
5
5
  "main": "./cjs",
6
6
  "sideEffects": false,
@@ -53,7 +53,7 @@
53
53
  "react": ">=16",
54
54
  "styled-components": "^4.4.0"
55
55
  },
56
- "gitHead": "3fd071545c51cdd16c351f4b680ce495191e61d2",
56
+ "gitHead": "9231980c252bc0f14c5c37da6cec98d6070ba14f",
57
57
  "module": "./esm",
58
58
  "private": false,
59
59
  "react-native": "./cjs/index.native.js"