@pingux/astro 2.8.1-alpha.0 → 2.8.1-alpha.2

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.
@@ -121,14 +121,16 @@ var Calendar = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
121
121
  },
122
122
  mx: "sm",
123
123
  isDisabled: prevButtonProps.isDisabled,
124
- "aria-label": "previous year navigation"
124
+ "aria-label": "Previous year navigation"
125
125
  }, (0, _react2.jsx)(_index.Icon, {
126
126
  icon: _ChevronDoubleLeftIcon["default"],
127
127
  size: 18,
128
128
  title: {
129
129
  name: 'Chevron Double Left Icon'
130
130
  }
131
- })), (0, _react2.jsx)(_index.IconButton, prevButtonProps, (0, _react2.jsx)(_index.Icon, {
131
+ })), (0, _react2.jsx)(_index.IconButton, (0, _extends2["default"])({}, prevButtonProps, {
132
+ "aria-label": "Previous month navigation"
133
+ }), (0, _react2.jsx)(_index.Icon, {
132
134
  icon: _ChevronLeftIcon["default"],
133
135
  size: 18,
134
136
  title: {
@@ -139,7 +141,9 @@ var Calendar = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
139
141
  role: "heading",
140
142
  "aria-level": "3",
141
143
  fontWeight: 3
142
- }, title), (0, _react2.jsx)(_index.IconButton, nextButtonProps, (0, _react2.jsx)(_index.Icon, {
144
+ }, title), (0, _react2.jsx)(_index.IconButton, (0, _extends2["default"])({}, nextButtonProps, {
145
+ "aria-label": "Next month navigation"
146
+ }), (0, _react2.jsx)(_index.Icon, {
143
147
  icon: _ChevronRightIcon["default"],
144
148
  size: 18,
145
149
  title: {
@@ -151,7 +155,7 @@ var Calendar = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
151
155
  },
152
156
  mx: "sm",
153
157
  isDisabled: nextButtonProps.isDisabled,
154
- "aria-label": "next year navigation"
158
+ "aria-label": "Next year navigation"
155
159
  }, (0, _react2.jsx)(_index.Icon, {
156
160
  icon: _ChevronDoubleRightIcon["default"],
157
161
  size: 18,
@@ -47,8 +47,8 @@ test('renders calendar component', function () {
47
47
  var buttons = _testWrapper.screen.queryAllByRole('button');
48
48
  var previous = buttons[1];
49
49
  var next = buttons[2];
50
- expect(previous).toHaveAttribute('aria-label', 'Previous');
51
- expect(next).toHaveAttribute('aria-label', 'Next');
50
+ expect(previous).toHaveAttribute('aria-label', 'Previous month navigation');
51
+ expect(next).toHaveAttribute('aria-label', 'Next month navigation');
52
52
  expect(_testWrapper.screen.queryByRole('grid')).toHaveAttribute('aria-label', 'August 2022');
53
53
  var weeksInMonth = _testWrapper.screen.getAllByRole('row');
54
54
  expect(weeksInMonth).toHaveLength(5);
@@ -64,7 +64,7 @@ test('renders calendar component', function () {
64
64
  expect(gridCells.length).toBe(31);
65
65
  var hiddenButton = (0, _filter["default"])(_context2 = _testWrapper.screen.queryAllByRole('button')).call(_context2, function (button) {
66
66
  return button.getAttribute('aria-label') === 'Next';
67
- })[1];
67
+ })[0];
68
68
  expect(hiddenButton).toHaveAttribute('tabindex', '-1');
69
69
  _userEvent["default"].click(hiddenButton);
70
70
  expect(heading).toHaveTextContent('September 2022');
@@ -29,6 +29,7 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
29
29
  var _uuid = require("uuid");
30
30
  var _ = require("../..");
31
31
  var _hooks = require("../../hooks");
32
+ var _useHiddenNumberFieldValue = _interopRequireDefault(require("../../hooks/useHiddenNumberFieldValue"));
32
33
  var _ariaAttributes = require("../../utils/docUtils/ariaAttributes");
33
34
  var _fieldAttributes = require("../../utils/docUtils/fieldAttributes");
34
35
  var _statusProp = require("../../utils/docUtils/statusProp");
@@ -48,7 +49,8 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
48
49
 
49
50
  var NumberField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
50
51
  var helperText = props.helperText,
51
- status = props.status;
52
+ status = props.status,
53
+ formatOptions = props.formatOptions;
52
54
  var _useLocale = (0, _i18n.useLocale)(),
53
55
  locale = _useLocale.locale;
54
56
  var state = (0, _reactStately.useNumberFieldState)(_objectSpread(_objectSpread({}, props), {}, {
@@ -135,6 +137,10 @@ var NumberField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
135
137
  inputProps.onChange(trimmedValueEvent);
136
138
  }
137
139
  };
140
+ var hiddenInputValue = (0, _useHiddenNumberFieldValue["default"])({
141
+ numberValue: state.numberValue,
142
+ isCurrency: formatOptions === null || formatOptions === void 0 ? void 0 : formatOptions.currency
143
+ });
138
144
  inputProps['aria-roledescription'] = null;
139
145
  var helperTextId = (0, _react.useMemo)(function () {
140
146
  return (0, _uuid.v4)();
@@ -152,7 +158,9 @@ var NumberField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
152
158
  onChange: onInputChange,
153
159
  "aria-describedby": helperText && helperTextId,
154
160
  role: "textbox"
155
- })), ControlArrows), helperText && (0, _react2.jsx)(_.FieldHelperText, {
161
+ })), ControlArrows), (0, _react2.jsx)(_reactAria.VisuallyHidden, {
162
+ "aria-live": "assertive"
163
+ }, hiddenInputValue), helperText && (0, _react2.jsx)(_.FieldHelperText, {
156
164
  status: status,
157
165
  id: helperTextId
158
166
  }, helperText)));
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
4
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
5
+ _Object$defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ _Object$defineProperty(exports, "default", {
9
+ enumerable: true,
10
+ get: function get() {
11
+ return _useHiddenNumberFieldValue["default"];
12
+ }
13
+ });
14
+ var _useHiddenNumberFieldValue = _interopRequireDefault(require("./useHiddenNumberFieldValue"));
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
4
+ _Object$defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = void 0;
8
+ var _react = require("react");
9
+ /**
10
+ * Returns integer or absolute value for screen reader announcement.
11
+ */
12
+
13
+ var useHiddenNumberFieldValue = function useHiddenNumberFieldValue(_ref) {
14
+ var numberValue = _ref.numberValue,
15
+ isCurrency = _ref.isCurrency;
16
+ return (0, _react.useMemo)(function () {
17
+ if (!numberValue) return '';
18
+ if (!isCurrency) return numberValue;
19
+ return Math.abs(numberValue);
20
+ }, [numberValue, isCurrency]);
21
+ };
22
+ var _default = useHiddenNumberFieldValue;
23
+ exports["default"] = _default;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
4
+ var _reactHooks = require("@testing-library/react-hooks");
5
+ var _useHiddenNumberFieldValue = _interopRequireDefault(require("./useHiddenNumberFieldValue"));
6
+ test('When number is not currency, negative values return negative values', function () {
7
+ var _renderHook = (0, _reactHooks.renderHook)(function () {
8
+ return (0, _useHiddenNumberFieldValue["default"])({
9
+ isCurrency: false,
10
+ numberValue: -1
11
+ });
12
+ }),
13
+ result = _renderHook.result;
14
+ expect(result.current).toBe(-1);
15
+ });
16
+ test('When number is currency, it always returns the absolute value', function () {
17
+ var _renderHook2 = (0, _reactHooks.renderHook)(function () {
18
+ return (0, _useHiddenNumberFieldValue["default"])({
19
+ isCurrency: true,
20
+ numberValue: -1
21
+ });
22
+ }),
23
+ result = _renderHook2.result;
24
+ expect(result.current).toBe(1);
25
+ });
26
+ test('When number is not currency, positive values return positive numbers', function () {
27
+ var _renderHook3 = (0, _reactHooks.renderHook)(function () {
28
+ return (0, _useHiddenNumberFieldValue["default"])({
29
+ isCurrency: false,
30
+ numberValue: 2
31
+ });
32
+ }),
33
+ result = _renderHook3.result;
34
+ expect(result.current).toBe(2);
35
+ });
@@ -110,14 +110,16 @@ var Calendar = /*#__PURE__*/forwardRef(function (props, ref) {
110
110
  },
111
111
  mx: "sm",
112
112
  isDisabled: prevButtonProps.isDisabled,
113
- "aria-label": "previous year navigation"
113
+ "aria-label": "Previous year navigation"
114
114
  }, ___EmotionJSX(Icon, {
115
115
  icon: ChevronDoubleLeftIcon,
116
116
  size: 18,
117
117
  title: {
118
118
  name: 'Chevron Double Left Icon'
119
119
  }
120
- })), ___EmotionJSX(IconButton, prevButtonProps, ___EmotionJSX(Icon, {
120
+ })), ___EmotionJSX(IconButton, _extends({}, prevButtonProps, {
121
+ "aria-label": "Previous month navigation"
122
+ }), ___EmotionJSX(Icon, {
121
123
  icon: ChevronLeftIcon,
122
124
  size: 18,
123
125
  title: {
@@ -128,7 +130,9 @@ var Calendar = /*#__PURE__*/forwardRef(function (props, ref) {
128
130
  role: "heading",
129
131
  "aria-level": "3",
130
132
  fontWeight: 3
131
- }, title), ___EmotionJSX(IconButton, nextButtonProps, ___EmotionJSX(Icon, {
133
+ }, title), ___EmotionJSX(IconButton, _extends({}, nextButtonProps, {
134
+ "aria-label": "Next month navigation"
135
+ }), ___EmotionJSX(Icon, {
132
136
  icon: ChevronRightIcon,
133
137
  size: 18,
134
138
  title: {
@@ -140,7 +144,7 @@ var Calendar = /*#__PURE__*/forwardRef(function (props, ref) {
140
144
  },
141
145
  mx: "sm",
142
146
  isDisabled: nextButtonProps.isDisabled,
143
- "aria-label": "next year navigation"
147
+ "aria-label": "Next year navigation"
144
148
  }, ___EmotionJSX(Icon, {
145
149
  icon: ChevronDoubleRightIcon,
146
150
  size: 18,
@@ -44,8 +44,8 @@ test('renders calendar component', function () {
44
44
  var buttons = screen.queryAllByRole('button');
45
45
  var previous = buttons[1];
46
46
  var next = buttons[2];
47
- expect(previous).toHaveAttribute('aria-label', 'Previous');
48
- expect(next).toHaveAttribute('aria-label', 'Next');
47
+ expect(previous).toHaveAttribute('aria-label', 'Previous month navigation');
48
+ expect(next).toHaveAttribute('aria-label', 'Next month navigation');
49
49
  expect(screen.queryByRole('grid')).toHaveAttribute('aria-label', 'August 2022');
50
50
  var weeksInMonth = screen.getAllByRole('row');
51
51
  expect(weeksInMonth).toHaveLength(5);
@@ -61,7 +61,7 @@ test('renders calendar component', function () {
61
61
  expect(gridCells.length).toBe(31);
62
62
  var hiddenButton = _filterInstanceProperty(_context2 = screen.queryAllByRole('button')).call(_context2, function (button) {
63
63
  return button.getAttribute('aria-label') === 'Next';
64
- })[1];
64
+ })[0];
65
65
  expect(hiddenButton).toHaveAttribute('tabindex', '-1');
66
66
  userEvent.click(hiddenButton);
67
67
  expect(heading).toHaveTextContent('September 2022');
@@ -12,7 +12,7 @@ import _trimInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instanc
12
12
  function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
13
13
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context2, _context3; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context2 = ownKeys(Object(source), !0)).call(_context2, function (key) { _defineProperty(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context3 = ownKeys(Object(source))).call(_context3, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
14
14
  import React, { forwardRef, useCallback, useImperativeHandle, useMemo } from 'react';
15
- import { mergeProps, useNumberField } from 'react-aria';
15
+ import { mergeProps, useNumberField, VisuallyHidden } from 'react-aria';
16
16
  import { useNumberFieldState } from 'react-stately';
17
17
  import MenuDown from '@pingux/mdi-react/MenuDownIcon';
18
18
  import MenuUp from '@pingux/mdi-react/MenuUpIcon';
@@ -22,6 +22,7 @@ import PropTypes from 'prop-types';
22
22
  import { v4 as uuid } from 'uuid';
23
23
  import { Box, FieldHelperText, Icon, IconButton, Input, Label } from '../..';
24
24
  import { useField, usePropWarning } from '../../hooks';
25
+ import useHiddenNumberFieldValue from '../../hooks/useHiddenNumberFieldValue';
25
26
  import { ariaAttributesBasePropTypes } from '../../utils/docUtils/ariaAttributes';
26
27
  import { inputFieldAttributesBasePropTypes } from '../../utils/docUtils/fieldAttributes';
27
28
  import { statusPropTypes } from '../../utils/docUtils/statusProp';
@@ -37,7 +38,8 @@ import { statusPropTypes } from '../../utils/docUtils/statusProp';
37
38
  import { jsx as ___EmotionJSX } from "@emotion/react";
38
39
  var NumberField = /*#__PURE__*/forwardRef(function (props, ref) {
39
40
  var helperText = props.helperText,
40
- status = props.status;
41
+ status = props.status,
42
+ formatOptions = props.formatOptions;
41
43
  var _useLocale = useLocale(),
42
44
  locale = _useLocale.locale;
43
45
  var state = useNumberFieldState(_objectSpread(_objectSpread({}, props), {}, {
@@ -124,6 +126,10 @@ var NumberField = /*#__PURE__*/forwardRef(function (props, ref) {
124
126
  inputProps.onChange(trimmedValueEvent);
125
127
  }
126
128
  };
129
+ var hiddenInputValue = useHiddenNumberFieldValue({
130
+ numberValue: state.numberValue,
131
+ isCurrency: formatOptions === null || formatOptions === void 0 ? void 0 : formatOptions.currency
132
+ });
127
133
  inputProps['aria-roledescription'] = null;
128
134
  var helperTextId = useMemo(function () {
129
135
  return uuid();
@@ -141,7 +147,9 @@ var NumberField = /*#__PURE__*/forwardRef(function (props, ref) {
141
147
  onChange: onInputChange,
142
148
  "aria-describedby": helperText && helperTextId,
143
149
  role: "textbox"
144
- })), ControlArrows), helperText && ___EmotionJSX(FieldHelperText, {
150
+ })), ControlArrows), ___EmotionJSX(VisuallyHidden, {
151
+ "aria-live": "assertive"
152
+ }, hiddenInputValue), helperText && ___EmotionJSX(FieldHelperText, {
145
153
  status: status,
146
154
  id: helperTextId
147
155
  }, helperText)));
@@ -0,0 +1 @@
1
+ export { default } from './useHiddenNumberFieldValue';
@@ -0,0 +1,16 @@
1
+ import { useMemo } from 'react';
2
+
3
+ /**
4
+ * Returns integer or absolute value for screen reader announcement.
5
+ */
6
+
7
+ var useHiddenNumberFieldValue = function useHiddenNumberFieldValue(_ref) {
8
+ var numberValue = _ref.numberValue,
9
+ isCurrency = _ref.isCurrency;
10
+ return useMemo(function () {
11
+ if (!numberValue) return '';
12
+ if (!isCurrency) return numberValue;
13
+ return Math.abs(numberValue);
14
+ }, [numberValue, isCurrency]);
15
+ };
16
+ export default useHiddenNumberFieldValue;
@@ -0,0 +1,32 @@
1
+ import { renderHook } from '@testing-library/react-hooks';
2
+ import useHiddenNumberFieldValue from './useHiddenNumberFieldValue';
3
+ test('When number is not currency, negative values return negative values', function () {
4
+ var _renderHook = renderHook(function () {
5
+ return useHiddenNumberFieldValue({
6
+ isCurrency: false,
7
+ numberValue: -1
8
+ });
9
+ }),
10
+ result = _renderHook.result;
11
+ expect(result.current).toBe(-1);
12
+ });
13
+ test('When number is currency, it always returns the absolute value', function () {
14
+ var _renderHook2 = renderHook(function () {
15
+ return useHiddenNumberFieldValue({
16
+ isCurrency: true,
17
+ numberValue: -1
18
+ });
19
+ }),
20
+ result = _renderHook2.result;
21
+ expect(result.current).toBe(1);
22
+ });
23
+ test('When number is not currency, positive values return positive numbers', function () {
24
+ var _renderHook3 = renderHook(function () {
25
+ return useHiddenNumberFieldValue({
26
+ isCurrency: false,
27
+ numberValue: 2
28
+ });
29
+ }),
30
+ result = _renderHook3.result;
31
+ expect(result.current).toBe(2);
32
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pingux/astro",
3
- "version": "2.8.1-alpha.0",
3
+ "version": "2.8.1-alpha.2",
4
4
  "description": "PingUX themeable React component library",
5
5
  "repository": {
6
6
  "type": "git",