@pingux/astro 2.59.0-alpha.0 → 2.59.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.
- package/lib/cjs/components/Loader/Loader.mdx +7 -2
- package/lib/cjs/components/ProgressBar/ProgressBar.d.ts +5 -0
- package/lib/cjs/components/ProgressBar/ProgressBar.js +78 -0
- package/lib/cjs/components/ProgressBar/ProgressBar.mdx +35 -0
- package/lib/cjs/components/ProgressBar/ProgressBar.stories.d.ts +5 -0
- package/lib/cjs/components/ProgressBar/ProgressBar.stories.js +63 -0
- package/lib/cjs/components/ProgressBar/ProgressBar.styles.d.ts +13 -0
- package/lib/cjs/components/ProgressBar/ProgressBar.styles.js +31 -0
- package/lib/cjs/components/ProgressBar/ProgressBar.test.d.ts +1 -0
- package/lib/cjs/components/ProgressBar/ProgressBar.test.js +106 -0
- package/lib/cjs/components/ProgressBar/index.d.ts +2 -0
- package/lib/cjs/components/ProgressBar/index.js +33 -0
- package/lib/cjs/index.d.ts +1 -0
- package/lib/cjs/index.js +8 -0
- package/lib/cjs/styles/variants/variants.js +2 -0
- package/lib/cjs/types/index.d.ts +1 -0
- package/lib/cjs/types/index.js +22 -11
- package/lib/cjs/types/progressBar.d.ts +12 -0
- package/lib/cjs/types/progressBar.js +6 -0
- package/lib/components/Loader/Loader.mdx +7 -2
- package/lib/components/ProgressBar/ProgressBar.js +63 -0
- package/lib/components/ProgressBar/ProgressBar.mdx +35 -0
- package/lib/components/ProgressBar/ProgressBar.stories.js +53 -0
- package/lib/components/ProgressBar/ProgressBar.styles.js +23 -0
- package/lib/components/ProgressBar/ProgressBar.test.js +97 -0
- package/lib/components/ProgressBar/index.js +2 -0
- package/lib/index.js +1 -0
- package/lib/styles/variants/variants.js +2 -0
- package/lib/types/index.js +1 -0
- package/lib/types/progressBar.js +1 -0
- package/package.json +3 -2
@@ -11,7 +11,7 @@ This component should be:
|
|
11
11
|
- Restricted to a single use per view to avoid unnecessary disruption.
|
12
12
|
|
13
13
|
It should not be used:
|
14
|
-
- When the wait time for a process is known.
|
14
|
+
- When the wait time for a process is known. If it is known, use [ProgressBar](./?path=/story/expirimental-progressbar--default) component instead.
|
15
15
|
- When trying to communicate progression in steps.
|
16
16
|
|
17
17
|
The Loader component is based on the [useProgressBar](https://react-spectrum.adobe.com/react-aria/useProgressBar.html) React Aria component.
|
@@ -26,4 +26,9 @@ This component can be used independently and does not require additional compone
|
|
26
26
|
|
27
27
|
This component uses the following attributes to assist screen readers:
|
28
28
|
- The **`aria-label`** attribute is used to provide an accessible name.
|
29
|
-
- The **`aria-live`** attribute is used to announce content changes in a live region.
|
29
|
+
- The **`aria-live`** attribute is used to announce content changes in a live region.
|
30
|
+
|
31
|
+
### Determinate vs Indeterminate usage
|
32
|
+
|
33
|
+
- If the progress to be indicated is determinate, use [ProgressBar](./?path=/story/experimental-progressbar--default) component instead.
|
34
|
+
- If the progress to be indicated is indeterminate, use the Loader Component
|
@@ -0,0 +1,5 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { ProgressBarProps } from '../../types';
|
3
|
+
export declare const calculateBarWidth: (value: number, minValue: number, maxValue: number) => string;
|
4
|
+
declare const ProgressBar: React.ForwardRefExoticComponent<ProgressBarProps & React.RefAttributes<HTMLElement>>;
|
5
|
+
export default ProgressBar;
|
@@ -0,0 +1,78 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _typeof = require("@babel/runtime-corejs3/helpers/typeof");
|
4
|
+
var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");
|
5
|
+
var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
|
6
|
+
var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");
|
7
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
8
|
+
_Object$defineProperty(exports, "__esModule", {
|
9
|
+
value: true
|
10
|
+
});
|
11
|
+
exports["default"] = exports.calculateBarWidth = void 0;
|
12
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
|
13
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));
|
14
|
+
var _react = _interopRequireWildcard(require("react"));
|
15
|
+
var _progress = require("@react-aria/progress");
|
16
|
+
var _ = require("../..");
|
17
|
+
var _hooks = require("../../hooks");
|
18
|
+
var _react2 = require("@emotion/react");
|
19
|
+
var _excluded = ["role"];
|
20
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
21
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
22
|
+
// Calculate the width of the progress bar as a percentage
|
23
|
+
var calculateBarWidth = function calculateBarWidth(value, minValue, maxValue) {
|
24
|
+
if (value < minValue) {
|
25
|
+
throw new Error('Value cannot be less than minValue');
|
26
|
+
}
|
27
|
+
if (value > maxValue) {
|
28
|
+
throw new Error('Value cannot be greater than maxValue');
|
29
|
+
}
|
30
|
+
var percentage = (value - minValue) / (maxValue - minValue);
|
31
|
+
var barWidth = "".concat(Math.round(percentage * 100), "%");
|
32
|
+
return barWidth;
|
33
|
+
};
|
34
|
+
exports.calculateBarWidth = calculateBarWidth;
|
35
|
+
var ProgressBar = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
36
|
+
var _props$label = props.label,
|
37
|
+
label = _props$label === void 0 ? '' : _props$label,
|
38
|
+
_props$showValueLabel = props.showValueLabel,
|
39
|
+
showValueLabel = _props$showValueLabel === void 0 ? true : _props$showValueLabel,
|
40
|
+
value = props.value,
|
41
|
+
_props$minValue = props.minValue,
|
42
|
+
minValue = _props$minValue === void 0 ? 0 : _props$minValue,
|
43
|
+
_props$maxValue = props.maxValue,
|
44
|
+
maxValue = _props$maxValue === void 0 ? 100 : _props$maxValue;
|
45
|
+
var progressBarRef = (0, _hooks.useLocalOrForwardRef)(ref);
|
46
|
+
var _useProgressBar = (0, _progress.useProgressBar)(props),
|
47
|
+
progressBarProps = _useProgressBar.progressBarProps,
|
48
|
+
labelProps = _useProgressBar.labelProps;
|
49
|
+
var role = labelProps.role,
|
50
|
+
restLabelProps = (0, _objectWithoutProperties2["default"])(labelProps, _excluded);
|
51
|
+
var barWidth = calculateBarWidth(value, minValue, maxValue);
|
52
|
+
var ariaLabel = props['aria-label'];
|
53
|
+
return (0, _react2.jsx)(_.Box, (0, _extends2["default"])({}, progressBarProps, {
|
54
|
+
role: "progressbar",
|
55
|
+
"aria-labelledby": labelProps.id,
|
56
|
+
"aria-label": ariaLabel,
|
57
|
+
gap: "2px",
|
58
|
+
ref: progressBarRef
|
59
|
+
}), (0, _react2.jsx)(_.Box, {
|
60
|
+
isRow: true,
|
61
|
+
justifyContent: "space-between"
|
62
|
+
}, label && (0, _react2.jsx)(_.Text, (0, _extends2["default"])({
|
63
|
+
fontSize: "xs",
|
64
|
+
fontWeight: "3"
|
65
|
+
}, restLabelProps), label), showValueLabel && (0, _react2.jsx)(_.Text, {
|
66
|
+
fontSize: "xs",
|
67
|
+
fontWeight: "3"
|
68
|
+
}, progressBarProps['aria-valuetext'])), (0, _react2.jsx)(_.Box, {
|
69
|
+
variant: "progressBar.container"
|
70
|
+
}, (0, _react2.jsx)(_.Box, {
|
71
|
+
variant: "progressBar.percentageBar",
|
72
|
+
style: {
|
73
|
+
width: barWidth
|
74
|
+
}
|
75
|
+
})));
|
76
|
+
});
|
77
|
+
var _default = ProgressBar;
|
78
|
+
exports["default"] = _default;
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import { Meta } from '@storybook/addon-docs';
|
2
|
+
|
3
|
+
<Meta title="Experimental/ProgressBar/ProgressBar" />
|
4
|
+
|
5
|
+
# ProgressBar
|
6
|
+
|
7
|
+
The ProgressBar component shows progression that can be calculated against a certain goal, such as loading or percent completion of a task.
|
8
|
+
|
9
|
+
This component should be:
|
10
|
+
- Used to show a determinate loading state.
|
11
|
+
- When trying to communicate progression in steps.
|
12
|
+
|
13
|
+
It should not be used:
|
14
|
+
- When the wait time for a process is unknown. If it is unknown, use [Loader](./?path=/story/components-loader--default) component instead.
|
15
|
+
|
16
|
+
### Required components
|
17
|
+
|
18
|
+
This component can be used independently and does not require additional components.
|
19
|
+
|
20
|
+
### Accessibility
|
21
|
+
|
22
|
+
This component should adhere to the [WAI-ARIA ProgressBar](https://w3c.github.io/aria/#progressbar) accessibility guidelines.
|
23
|
+
|
24
|
+
#### Screen readers
|
25
|
+
|
26
|
+
This component uses the following attributes to assist screen readers:
|
27
|
+
|
28
|
+
- The progressBar uses the **`aria-valuemin`** and **`aria-valuemax`** to indicate the minimum and maximum progress indicator values. If they are missing, they default to 0 and 100 respectively.
|
29
|
+
- The progressBar uses the **`aria-valuenow`** attribute to indicate the current value of the progressbar.
|
30
|
+
- If the progressbar is describing the loading progress of a particular region of a page, authors SHOULD both use **`aria-describedby`** to reference the progressbar status, and set the **`aria-busy`** attribute to true on the region until it is finished loading. It is not possible for the user to alter the value of a progressbar because it is always read-only
|
31
|
+
|
32
|
+
### Determinate vs Indeterminate usage
|
33
|
+
|
34
|
+
- If the progress to be indicated is determinate, use the ProgressBar component.
|
35
|
+
- If the progress to be indicated is indeterminate, use the [Loader](./?path=/story/components-loader--default) component instead.
|
@@ -0,0 +1,5 @@
|
|
1
|
+
import { StoryFn } from '@storybook/react';
|
2
|
+
import { ProgressBarProps } from '../../index';
|
3
|
+
declare const _default: import("@storybook/types").ComponentAnnotations<import("@storybook/react/dist/types-0a347bb9").R, import("@storybook/types").Args>;
|
4
|
+
export default _default;
|
5
|
+
export declare const Default: StoryFn<ProgressBarProps>;
|
@@ -0,0 +1,63 @@
|
|
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
|
+
exports["default"] = exports.Default = void 0;
|
9
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
|
10
|
+
var _react = _interopRequireDefault(require("react"));
|
11
|
+
var _storybookDocsLayout = _interopRequireDefault(require("../../../.storybook/storybookDocsLayout"));
|
12
|
+
var _index = require("../../index");
|
13
|
+
var _ProgressBar = _interopRequireDefault(require("./ProgressBar.mdx"));
|
14
|
+
var _react2 = require("@emotion/react");
|
15
|
+
var _default = {
|
16
|
+
title: 'Experimental/ProgressBar',
|
17
|
+
component: _index.ProgressBar,
|
18
|
+
parameters: {
|
19
|
+
docs: {
|
20
|
+
page: function page() {
|
21
|
+
return (0, _react2.jsx)(_react["default"].Fragment, null, (0, _react2.jsx)(_ProgressBar["default"], null), (0, _react2.jsx)(_storybookDocsLayout["default"], null));
|
22
|
+
},
|
23
|
+
source: {
|
24
|
+
type: 'code'
|
25
|
+
}
|
26
|
+
}
|
27
|
+
},
|
28
|
+
argTypes: {
|
29
|
+
isIndeterminate: {
|
30
|
+
table: {
|
31
|
+
disable: true
|
32
|
+
}
|
33
|
+
},
|
34
|
+
'data-testid': {
|
35
|
+
table: {
|
36
|
+
disable: true
|
37
|
+
}
|
38
|
+
},
|
39
|
+
label: {
|
40
|
+
table: {
|
41
|
+
disable: true
|
42
|
+
}
|
43
|
+
},
|
44
|
+
showValueLabel: {
|
45
|
+
table: {
|
46
|
+
disable: true
|
47
|
+
}
|
48
|
+
},
|
49
|
+
valueLabel: {
|
50
|
+
table: {
|
51
|
+
disable: true
|
52
|
+
}
|
53
|
+
}
|
54
|
+
}
|
55
|
+
};
|
56
|
+
exports["default"] = _default;
|
57
|
+
var Default = function Default(args) {
|
58
|
+
return (0, _react2.jsx)(_index.ProgressBar, (0, _extends2["default"])({}, args, {
|
59
|
+
value: 25,
|
60
|
+
"aria-label": "Progress Bar"
|
61
|
+
}));
|
62
|
+
};
|
63
|
+
exports.Default = Default;
|
@@ -0,0 +1,31 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");
|
4
|
+
var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");
|
5
|
+
var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");
|
6
|
+
var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");
|
7
|
+
var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");
|
8
|
+
var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");
|
9
|
+
var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");
|
10
|
+
var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
|
11
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
12
|
+
_Object$defineProperty(exports, "__esModule", {
|
13
|
+
value: true
|
14
|
+
});
|
15
|
+
exports["default"] = void 0;
|
16
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
|
17
|
+
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; }
|
18
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context, _context2; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
|
19
|
+
var container = {
|
20
|
+
backgroundColor: 'neutral.90',
|
21
|
+
borderRadius: '3px',
|
22
|
+
height: '7px'
|
23
|
+
};
|
24
|
+
var percentageBar = _objectSpread(_objectSpread({}, container), {}, {
|
25
|
+
backgroundColor: 'active'
|
26
|
+
});
|
27
|
+
var _default = {
|
28
|
+
container: container,
|
29
|
+
percentageBar: percentageBar
|
30
|
+
};
|
31
|
+
exports["default"] = _default;
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,106 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _typeof = require("@babel/runtime-corejs3/helpers/typeof");
|
4
|
+
var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");
|
5
|
+
var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
|
6
|
+
var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");
|
7
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
8
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
|
9
|
+
var _react = _interopRequireDefault(require("react"));
|
10
|
+
var _react2 = require("@testing-library/react");
|
11
|
+
var _universalComponentTest = require("../../utils/testUtils/universalComponentTest");
|
12
|
+
var _ = _interopRequireWildcard(require("."));
|
13
|
+
var _react3 = require("@emotion/react");
|
14
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
15
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
16
|
+
var testId = 'test-progressbar';
|
17
|
+
var defaultProps = {
|
18
|
+
'data-testid': testId,
|
19
|
+
value: 25,
|
20
|
+
minValue: 0,
|
21
|
+
maxValue: 100
|
22
|
+
};
|
23
|
+
var getComponent = function getComponent() {
|
24
|
+
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
25
|
+
return (0, _react2.render)((0, _react3.jsx)(_["default"], (0, _extends2["default"])({}, defaultProps, props, {
|
26
|
+
"aria-label": "Progress Bar"
|
27
|
+
})));
|
28
|
+
};
|
29
|
+
|
30
|
+
// Needs to be added to each components test file
|
31
|
+
(0, _universalComponentTest.universalComponentTests)({
|
32
|
+
renderComponent: function renderComponent(props) {
|
33
|
+
return (0, _react3.jsx)(_["default"], (0, _extends2["default"])({}, defaultProps, props, {
|
34
|
+
"aria-label": "Progress Bar"
|
35
|
+
}));
|
36
|
+
}
|
37
|
+
});
|
38
|
+
test('ProgressBar component does load', function () {
|
39
|
+
getComponent();
|
40
|
+
var progressBar = _react2.screen.getByRole('progressbar', {
|
41
|
+
name: 'Progress Bar'
|
42
|
+
});
|
43
|
+
expect(progressBar).toBeInTheDocument();
|
44
|
+
});
|
45
|
+
test('should render a label', function () {
|
46
|
+
getComponent({
|
47
|
+
label: 'Loading...'
|
48
|
+
});
|
49
|
+
var label = _react2.screen.getByText('Loading...');
|
50
|
+
expect(label).toBeInTheDocument();
|
51
|
+
});
|
52
|
+
test('renders value as a percentage', function () {
|
53
|
+
getComponent({
|
54
|
+
value: 25
|
55
|
+
});
|
56
|
+
var value = _react2.screen.getByText('25%');
|
57
|
+
expect(value).toBeInTheDocument();
|
58
|
+
});
|
59
|
+
test('renders value as custom valueLabel instead of percentage', function () {
|
60
|
+
getComponent({
|
61
|
+
value: 25,
|
62
|
+
valueLabel: '25 of 100 dogs'
|
63
|
+
});
|
64
|
+
var value = _react2.screen.queryByText('25%');
|
65
|
+
var valueLabel = _react2.screen.getByText('25 of 100 dogs');
|
66
|
+
expect(value).not.toBeInTheDocument();
|
67
|
+
expect(valueLabel).toBeInTheDocument();
|
68
|
+
});
|
69
|
+
test('does not render value when showValueLabel is false', function () {
|
70
|
+
getComponent({
|
71
|
+
value: 25,
|
72
|
+
showValueLabel: false
|
73
|
+
});
|
74
|
+
var valueLabel = _react2.screen.queryByText('25%');
|
75
|
+
expect(valueLabel).not.toBeInTheDocument();
|
76
|
+
});
|
77
|
+
test('renders label and custom valueLabel when labe and valueLabel are present', function () {
|
78
|
+
getComponent({
|
79
|
+
value: 25,
|
80
|
+
label: 'Loading...',
|
81
|
+
valueLabel: '25 of 100 dogs'
|
82
|
+
});
|
83
|
+
var label = _react2.screen.getByText('Loading...');
|
84
|
+
var valueLabel = _react2.screen.getByText('25 of 100 dogs');
|
85
|
+
expect(label).toBeInTheDocument();
|
86
|
+
expect(valueLabel).toBeInTheDocument();
|
87
|
+
});
|
88
|
+
test('calculates bar width with default min and max values', function () {
|
89
|
+
expect((0, _.calculateBarWidth)(25, 0, 100)).toBe('25%');
|
90
|
+
});
|
91
|
+
test('calculates bar width when value equals minValue', function () {
|
92
|
+
expect((0, _.calculateBarWidth)(0, 0, 100)).toBe('0%');
|
93
|
+
});
|
94
|
+
test('calculates bar width when value equals maxValue', function () {
|
95
|
+
expect((0, _.calculateBarWidth)(100, 0, 100)).toBe('100%');
|
96
|
+
});
|
97
|
+
test('throws error when value is less than minValue', function () {
|
98
|
+
expect(function () {
|
99
|
+
return (0, _.calculateBarWidth)(-10, 0, 100);
|
100
|
+
}).toThrow('Value cannot be less than minValue');
|
101
|
+
});
|
102
|
+
test('throws error when value is greater than maxValue', function () {
|
103
|
+
expect(function () {
|
104
|
+
return (0, _.calculateBarWidth)(110, 0, 100);
|
105
|
+
}).toThrow('Value cannot be greater than maxValue');
|
106
|
+
});
|
@@ -0,0 +1,33 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _context;
|
4
|
+
var _typeof = require("@babel/runtime-corejs3/helpers/typeof");
|
5
|
+
var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");
|
6
|
+
var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
|
7
|
+
var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");
|
8
|
+
var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");
|
9
|
+
var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");
|
10
|
+
_Object$defineProperty(exports, "__esModule", {
|
11
|
+
value: true
|
12
|
+
});
|
13
|
+
var _exportNames = {};
|
14
|
+
_Object$defineProperty(exports, "default", {
|
15
|
+
enumerable: true,
|
16
|
+
get: function get() {
|
17
|
+
return _ProgressBar["default"];
|
18
|
+
}
|
19
|
+
});
|
20
|
+
var _ProgressBar = _interopRequireWildcard(require("./ProgressBar"));
|
21
|
+
_forEachInstanceProperty(_context = _Object$keys(_ProgressBar)).call(_context, function (key) {
|
22
|
+
if (key === "default" || key === "__esModule") return;
|
23
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
24
|
+
if (key in exports && exports[key] === _ProgressBar[key]) return;
|
25
|
+
_Object$defineProperty(exports, key, {
|
26
|
+
enumerable: true,
|
27
|
+
get: function get() {
|
28
|
+
return _ProgressBar[key];
|
29
|
+
}
|
30
|
+
});
|
31
|
+
});
|
32
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
33
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
package/lib/cjs/index.d.ts
CHANGED
@@ -120,6 +120,7 @@ export * from './components/PasswordField';
|
|
120
120
|
export { default as PopoverContainer } from './components/PopoverContainer';
|
121
121
|
export * from './components/PopoverContainer';
|
122
122
|
export { default as PopoverMenu } from './components/PopoverMenu';
|
123
|
+
export { default as ProgressBar } from './components/ProgressBar';
|
123
124
|
export { default as Radio } from './components/Radio';
|
124
125
|
export * from './components/Radio';
|
125
126
|
export { default as RadioField } from './components/RadioField';
|
package/lib/cjs/index.js
CHANGED
@@ -89,6 +89,7 @@ var _exportNames = {
|
|
89
89
|
PasswordField: true,
|
90
90
|
PopoverContainer: true,
|
91
91
|
PopoverMenu: true,
|
92
|
+
ProgressBar: true,
|
92
93
|
Radio: true,
|
93
94
|
RadioField: true,
|
94
95
|
RadioGroupField: true,
|
@@ -624,6 +625,12 @@ _Object$defineProperty(exports, "PopoverMenu", {
|
|
624
625
|
return _PopoverMenu["default"];
|
625
626
|
}
|
626
627
|
});
|
628
|
+
_Object$defineProperty(exports, "ProgressBar", {
|
629
|
+
enumerable: true,
|
630
|
+
get: function get() {
|
631
|
+
return _ProgressBar["default"];
|
632
|
+
}
|
633
|
+
});
|
627
634
|
_Object$defineProperty(exports, "Radio", {
|
628
635
|
enumerable: true,
|
629
636
|
get: function get() {
|
@@ -1416,6 +1423,7 @@ _forEachInstanceProperty(_context45 = _Object$keys(_PopoverContainer)).call(_con
|
|
1416
1423
|
});
|
1417
1424
|
});
|
1418
1425
|
var _PopoverMenu = _interopRequireDefault(require("./components/PopoverMenu"));
|
1426
|
+
var _ProgressBar = _interopRequireDefault(require("./components/ProgressBar"));
|
1419
1427
|
var _Radio = _interopRequireWildcard(require("./components/Radio"));
|
1420
1428
|
_forEachInstanceProperty(_context46 = _Object$keys(_Radio)).call(_context46, function (key) {
|
1421
1429
|
if (key === "default" || key === "__esModule") return;
|
@@ -45,6 +45,7 @@ var _NavBar = _interopRequireDefault(require("../../components/NavBar/NavBar.sty
|
|
45
45
|
var _OverlayPanel = _interopRequireDefault(require("../../components/OverlayPanel/OverlayPanel.styles"));
|
46
46
|
var _PanelHeader = _interopRequireDefault(require("../../components/PanelHeader/PanelHeader.styles"));
|
47
47
|
var _PopoverMenu = _interopRequireDefault(require("../../components/PopoverMenu/PopoverMenu.styles"));
|
48
|
+
var _ProgressBar = _interopRequireDefault(require("../../components/ProgressBar/ProgressBar.styles"));
|
48
49
|
var _RockerButton = _interopRequireDefault(require("../../components/RockerButton/RockerButton.styles"));
|
49
50
|
var _ScrollBox = _interopRequireDefault(require("../../components/ScrollBox/ScrollBox.styles"));
|
50
51
|
var _Separator = _interopRequireDefault(require("../../components/Separator/Separator.styles"));
|
@@ -88,6 +89,7 @@ var _default = _objectSpread({
|
|
88
89
|
overlayPanel: _OverlayPanel["default"],
|
89
90
|
popoverMenu: _PopoverMenu["default"],
|
90
91
|
panelHeader: _PanelHeader["default"],
|
92
|
+
progressBar: _ProgressBar["default"],
|
91
93
|
rockerButton: _RockerButton["default"],
|
92
94
|
scrollBox: _ScrollBox["default"],
|
93
95
|
separator: _Separator["default"],
|
package/lib/cjs/types/index.d.ts
CHANGED
@@ -29,6 +29,7 @@ export * from './navBar';
|
|
29
29
|
export * from './overlayPanel';
|
30
30
|
export * from './popoverContainer';
|
31
31
|
export * from './popoverMenu';
|
32
|
+
export * from './progressBar';
|
32
33
|
export * from './requirementsList';
|
33
34
|
export * from './rockerButtonGroup';
|
34
35
|
export * from './scrollBox';
|
package/lib/cjs/types/index.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
|
3
|
-
var _context, _context2, _context3, _context4, _context5, _context6, _context7, _context8, _context9, _context10, _context11, _context12, _context13, _context14, _context15, _context16, _context17, _context18, _context19, _context20, _context21, _context22, _context23, _context24, _context25, _context26, _context27, _context28, _context29, _context30, _context31, _context32, _context33, _context34, _context35, _context36, _context37, _context38, _context39, _context40, _context41;
|
3
|
+
var _context, _context2, _context3, _context4, _context5, _context6, _context7, _context8, _context9, _context10, _context11, _context12, _context13, _context14, _context15, _context16, _context17, _context18, _context19, _context20, _context21, _context22, _context23, _context24, _context25, _context26, _context27, _context28, _context29, _context30, _context31, _context32, _context33, _context34, _context35, _context36, _context37, _context38, _context39, _context40, _context41, _context42;
|
4
4
|
var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
|
5
5
|
var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");
|
6
6
|
var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");
|
@@ -348,8 +348,19 @@ _forEachInstanceProperty(_context31 = _Object$keys(_popoverMenu)).call(_context3
|
|
348
348
|
}
|
349
349
|
});
|
350
350
|
});
|
351
|
+
var _progressBar = require("./progressBar");
|
352
|
+
_forEachInstanceProperty(_context32 = _Object$keys(_progressBar)).call(_context32, function (key) {
|
353
|
+
if (key === "default" || key === "__esModule") return;
|
354
|
+
if (key in exports && exports[key] === _progressBar[key]) return;
|
355
|
+
_Object$defineProperty(exports, key, {
|
356
|
+
enumerable: true,
|
357
|
+
get: function get() {
|
358
|
+
return _progressBar[key];
|
359
|
+
}
|
360
|
+
});
|
361
|
+
});
|
351
362
|
var _requirementsList = require("./requirementsList");
|
352
|
-
_forEachInstanceProperty(
|
363
|
+
_forEachInstanceProperty(_context33 = _Object$keys(_requirementsList)).call(_context33, function (key) {
|
353
364
|
if (key === "default" || key === "__esModule") return;
|
354
365
|
if (key in exports && exports[key] === _requirementsList[key]) return;
|
355
366
|
_Object$defineProperty(exports, key, {
|
@@ -360,7 +371,7 @@ _forEachInstanceProperty(_context32 = _Object$keys(_requirementsList)).call(_con
|
|
360
371
|
});
|
361
372
|
});
|
362
373
|
var _rockerButtonGroup = require("./rockerButtonGroup");
|
363
|
-
_forEachInstanceProperty(
|
374
|
+
_forEachInstanceProperty(_context34 = _Object$keys(_rockerButtonGroup)).call(_context34, function (key) {
|
364
375
|
if (key === "default" || key === "__esModule") return;
|
365
376
|
if (key in exports && exports[key] === _rockerButtonGroup[key]) return;
|
366
377
|
_Object$defineProperty(exports, key, {
|
@@ -371,7 +382,7 @@ _forEachInstanceProperty(_context33 = _Object$keys(_rockerButtonGroup)).call(_co
|
|
371
382
|
});
|
372
383
|
});
|
373
384
|
var _scrollBox = require("./scrollBox");
|
374
|
-
_forEachInstanceProperty(
|
385
|
+
_forEachInstanceProperty(_context35 = _Object$keys(_scrollBox)).call(_context35, function (key) {
|
375
386
|
if (key === "default" || key === "__esModule") return;
|
376
387
|
if (key in exports && exports[key] === _scrollBox[key]) return;
|
377
388
|
_Object$defineProperty(exports, key, {
|
@@ -382,7 +393,7 @@ _forEachInstanceProperty(_context34 = _Object$keys(_scrollBox)).call(_context34,
|
|
382
393
|
});
|
383
394
|
});
|
384
395
|
var _separator = require("./separator");
|
385
|
-
_forEachInstanceProperty(
|
396
|
+
_forEachInstanceProperty(_context36 = _Object$keys(_separator)).call(_context36, function (key) {
|
386
397
|
if (key === "default" || key === "__esModule") return;
|
387
398
|
if (key in exports && exports[key] === _separator[key]) return;
|
388
399
|
_Object$defineProperty(exports, key, {
|
@@ -393,7 +404,7 @@ _forEachInstanceProperty(_context35 = _Object$keys(_separator)).call(_context35,
|
|
393
404
|
});
|
394
405
|
});
|
395
406
|
var _shared = require("./shared");
|
396
|
-
_forEachInstanceProperty(
|
407
|
+
_forEachInstanceProperty(_context37 = _Object$keys(_shared)).call(_context37, function (key) {
|
397
408
|
if (key === "default" || key === "__esModule") return;
|
398
409
|
if (key in exports && exports[key] === _shared[key]) return;
|
399
410
|
_Object$defineProperty(exports, key, {
|
@@ -404,7 +415,7 @@ _forEachInstanceProperty(_context36 = _Object$keys(_shared)).call(_context36, fu
|
|
404
415
|
});
|
405
416
|
});
|
406
417
|
var _tab = require("./tab");
|
407
|
-
_forEachInstanceProperty(
|
418
|
+
_forEachInstanceProperty(_context38 = _Object$keys(_tab)).call(_context38, function (key) {
|
408
419
|
if (key === "default" || key === "__esModule") return;
|
409
420
|
if (key in exports && exports[key] === _tab[key]) return;
|
410
421
|
_Object$defineProperty(exports, key, {
|
@@ -415,7 +426,7 @@ _forEachInstanceProperty(_context37 = _Object$keys(_tab)).call(_context37, funct
|
|
415
426
|
});
|
416
427
|
});
|
417
428
|
var _table = require("./table");
|
418
|
-
_forEachInstanceProperty(
|
429
|
+
_forEachInstanceProperty(_context39 = _Object$keys(_table)).call(_context39, function (key) {
|
419
430
|
if (key === "default" || key === "__esModule") return;
|
420
431
|
if (key in exports && exports[key] === _table[key]) return;
|
421
432
|
_Object$defineProperty(exports, key, {
|
@@ -426,7 +437,7 @@ _forEachInstanceProperty(_context38 = _Object$keys(_table)).call(_context38, fun
|
|
426
437
|
});
|
427
438
|
});
|
428
439
|
var _tabs = require("./tabs");
|
429
|
-
_forEachInstanceProperty(
|
440
|
+
_forEachInstanceProperty(_context40 = _Object$keys(_tabs)).call(_context40, function (key) {
|
430
441
|
if (key === "default" || key === "__esModule") return;
|
431
442
|
if (key in exports && exports[key] === _tabs[key]) return;
|
432
443
|
_Object$defineProperty(exports, key, {
|
@@ -437,7 +448,7 @@ _forEachInstanceProperty(_context39 = _Object$keys(_tabs)).call(_context39, func
|
|
437
448
|
});
|
438
449
|
});
|
439
450
|
var _text = require("./text");
|
440
|
-
_forEachInstanceProperty(
|
451
|
+
_forEachInstanceProperty(_context41 = _Object$keys(_text)).call(_context41, function (key) {
|
441
452
|
if (key === "default" || key === "__esModule") return;
|
442
453
|
if (key in exports && exports[key] === _text[key]) return;
|
443
454
|
_Object$defineProperty(exports, key, {
|
@@ -448,7 +459,7 @@ _forEachInstanceProperty(_context40 = _Object$keys(_text)).call(_context40, func
|
|
448
459
|
});
|
449
460
|
});
|
450
461
|
var _tooltipTrigger = require("./tooltipTrigger");
|
451
|
-
_forEachInstanceProperty(
|
462
|
+
_forEachInstanceProperty(_context42 = _Object$keys(_tooltipTrigger)).call(_context42, function (key) {
|
452
463
|
if (key === "default" || key === "__esModule") return;
|
453
464
|
if (key in exports && exports[key] === _tooltipTrigger[key]) return;
|
454
465
|
_Object$defineProperty(exports, key, {
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { TestingAttributes } from './shared/test';
|
3
|
+
export interface ProgressBarProps extends TestingAttributes {
|
4
|
+
isIndeterminate?: boolean;
|
5
|
+
label?: React.ReactNode;
|
6
|
+
formatOptions?: Intl.NumberFormatOptions;
|
7
|
+
valueLabel?: React.ReactNode;
|
8
|
+
value: number;
|
9
|
+
minValue?: number;
|
10
|
+
maxValue?: number;
|
11
|
+
showValueLabel?: boolean;
|
12
|
+
}
|
@@ -11,7 +11,7 @@ This component should be:
|
|
11
11
|
- Restricted to a single use per view to avoid unnecessary disruption.
|
12
12
|
|
13
13
|
It should not be used:
|
14
|
-
- When the wait time for a process is known.
|
14
|
+
- When the wait time for a process is known. If it is known, use [ProgressBar](./?path=/story/expirimental-progressbar--default) component instead.
|
15
15
|
- When trying to communicate progression in steps.
|
16
16
|
|
17
17
|
The Loader component is based on the [useProgressBar](https://react-spectrum.adobe.com/react-aria/useProgressBar.html) React Aria component.
|
@@ -26,4 +26,9 @@ This component can be used independently and does not require additional compone
|
|
26
26
|
|
27
27
|
This component uses the following attributes to assist screen readers:
|
28
28
|
- The **`aria-label`** attribute is used to provide an accessible name.
|
29
|
-
- The **`aria-live`** attribute is used to announce content changes in a live region.
|
29
|
+
- The **`aria-live`** attribute is used to announce content changes in a live region.
|
30
|
+
|
31
|
+
### Determinate vs Indeterminate usage
|
32
|
+
|
33
|
+
- If the progress to be indicated is determinate, use [ProgressBar](./?path=/story/experimental-progressbar--default) component instead.
|
34
|
+
- If the progress to be indicated is indeterminate, use the Loader Component
|
@@ -0,0 +1,63 @@
|
|
1
|
+
import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
|
2
|
+
import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
|
3
|
+
var _excluded = ["role"];
|
4
|
+
import React, { forwardRef } from 'react';
|
5
|
+
import { useProgressBar } from '@react-aria/progress';
|
6
|
+
import { Box, Text } from '../..';
|
7
|
+
import { useLocalOrForwardRef } from '../../hooks';
|
8
|
+
import { jsx as ___EmotionJSX } from "@emotion/react";
|
9
|
+
// Calculate the width of the progress bar as a percentage
|
10
|
+
export var calculateBarWidth = function calculateBarWidth(value, minValue, maxValue) {
|
11
|
+
if (value < minValue) {
|
12
|
+
throw new Error('Value cannot be less than minValue');
|
13
|
+
}
|
14
|
+
if (value > maxValue) {
|
15
|
+
throw new Error('Value cannot be greater than maxValue');
|
16
|
+
}
|
17
|
+
var percentage = (value - minValue) / (maxValue - minValue);
|
18
|
+
var barWidth = "".concat(Math.round(percentage * 100), "%");
|
19
|
+
return barWidth;
|
20
|
+
};
|
21
|
+
var ProgressBar = /*#__PURE__*/forwardRef(function (props, ref) {
|
22
|
+
var _props$label = props.label,
|
23
|
+
label = _props$label === void 0 ? '' : _props$label,
|
24
|
+
_props$showValueLabel = props.showValueLabel,
|
25
|
+
showValueLabel = _props$showValueLabel === void 0 ? true : _props$showValueLabel,
|
26
|
+
value = props.value,
|
27
|
+
_props$minValue = props.minValue,
|
28
|
+
minValue = _props$minValue === void 0 ? 0 : _props$minValue,
|
29
|
+
_props$maxValue = props.maxValue,
|
30
|
+
maxValue = _props$maxValue === void 0 ? 100 : _props$maxValue;
|
31
|
+
var progressBarRef = useLocalOrForwardRef(ref);
|
32
|
+
var _useProgressBar = useProgressBar(props),
|
33
|
+
progressBarProps = _useProgressBar.progressBarProps,
|
34
|
+
labelProps = _useProgressBar.labelProps;
|
35
|
+
var role = labelProps.role,
|
36
|
+
restLabelProps = _objectWithoutProperties(labelProps, _excluded);
|
37
|
+
var barWidth = calculateBarWidth(value, minValue, maxValue);
|
38
|
+
var ariaLabel = props['aria-label'];
|
39
|
+
return ___EmotionJSX(Box, _extends({}, progressBarProps, {
|
40
|
+
role: "progressbar",
|
41
|
+
"aria-labelledby": labelProps.id,
|
42
|
+
"aria-label": ariaLabel,
|
43
|
+
gap: "2px",
|
44
|
+
ref: progressBarRef
|
45
|
+
}), ___EmotionJSX(Box, {
|
46
|
+
isRow: true,
|
47
|
+
justifyContent: "space-between"
|
48
|
+
}, label && ___EmotionJSX(Text, _extends({
|
49
|
+
fontSize: "xs",
|
50
|
+
fontWeight: "3"
|
51
|
+
}, restLabelProps), label), showValueLabel && ___EmotionJSX(Text, {
|
52
|
+
fontSize: "xs",
|
53
|
+
fontWeight: "3"
|
54
|
+
}, progressBarProps['aria-valuetext'])), ___EmotionJSX(Box, {
|
55
|
+
variant: "progressBar.container"
|
56
|
+
}, ___EmotionJSX(Box, {
|
57
|
+
variant: "progressBar.percentageBar",
|
58
|
+
style: {
|
59
|
+
width: barWidth
|
60
|
+
}
|
61
|
+
})));
|
62
|
+
});
|
63
|
+
export default ProgressBar;
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import { Meta } from '@storybook/addon-docs';
|
2
|
+
|
3
|
+
<Meta title="Experimental/ProgressBar/ProgressBar" />
|
4
|
+
|
5
|
+
# ProgressBar
|
6
|
+
|
7
|
+
The ProgressBar component shows progression that can be calculated against a certain goal, such as loading or percent completion of a task.
|
8
|
+
|
9
|
+
This component should be:
|
10
|
+
- Used to show a determinate loading state.
|
11
|
+
- When trying to communicate progression in steps.
|
12
|
+
|
13
|
+
It should not be used:
|
14
|
+
- When the wait time for a process is unknown. If it is unknown, use [Loader](./?path=/story/components-loader--default) component instead.
|
15
|
+
|
16
|
+
### Required components
|
17
|
+
|
18
|
+
This component can be used independently and does not require additional components.
|
19
|
+
|
20
|
+
### Accessibility
|
21
|
+
|
22
|
+
This component should adhere to the [WAI-ARIA ProgressBar](https://w3c.github.io/aria/#progressbar) accessibility guidelines.
|
23
|
+
|
24
|
+
#### Screen readers
|
25
|
+
|
26
|
+
This component uses the following attributes to assist screen readers:
|
27
|
+
|
28
|
+
- The progressBar uses the **`aria-valuemin`** and **`aria-valuemax`** to indicate the minimum and maximum progress indicator values. If they are missing, they default to 0 and 100 respectively.
|
29
|
+
- The progressBar uses the **`aria-valuenow`** attribute to indicate the current value of the progressbar.
|
30
|
+
- If the progressbar is describing the loading progress of a particular region of a page, authors SHOULD both use **`aria-describedby`** to reference the progressbar status, and set the **`aria-busy`** attribute to true on the region until it is finished loading. It is not possible for the user to alter the value of a progressbar because it is always read-only
|
31
|
+
|
32
|
+
### Determinate vs Indeterminate usage
|
33
|
+
|
34
|
+
- If the progress to be indicated is determinate, use the ProgressBar component.
|
35
|
+
- If the progress to be indicated is indeterminate, use the [Loader](./?path=/story/components-loader--default) component instead.
|
@@ -0,0 +1,53 @@
|
|
1
|
+
import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
|
2
|
+
import React from 'react';
|
3
|
+
import DocsLayout from '../../../.storybook/storybookDocsLayout';
|
4
|
+
import { ProgressBar } from '../../index';
|
5
|
+
import ProgressBarReadMe from './ProgressBar.mdx';
|
6
|
+
import { jsx as ___EmotionJSX } from "@emotion/react";
|
7
|
+
export default {
|
8
|
+
title: 'Experimental/ProgressBar',
|
9
|
+
component: ProgressBar,
|
10
|
+
parameters: {
|
11
|
+
docs: {
|
12
|
+
page: function page() {
|
13
|
+
return ___EmotionJSX(React.Fragment, null, ___EmotionJSX(ProgressBarReadMe, null), ___EmotionJSX(DocsLayout, null));
|
14
|
+
},
|
15
|
+
source: {
|
16
|
+
type: 'code'
|
17
|
+
}
|
18
|
+
}
|
19
|
+
},
|
20
|
+
argTypes: {
|
21
|
+
isIndeterminate: {
|
22
|
+
table: {
|
23
|
+
disable: true
|
24
|
+
}
|
25
|
+
},
|
26
|
+
'data-testid': {
|
27
|
+
table: {
|
28
|
+
disable: true
|
29
|
+
}
|
30
|
+
},
|
31
|
+
label: {
|
32
|
+
table: {
|
33
|
+
disable: true
|
34
|
+
}
|
35
|
+
},
|
36
|
+
showValueLabel: {
|
37
|
+
table: {
|
38
|
+
disable: true
|
39
|
+
}
|
40
|
+
},
|
41
|
+
valueLabel: {
|
42
|
+
table: {
|
43
|
+
disable: true
|
44
|
+
}
|
45
|
+
}
|
46
|
+
}
|
47
|
+
};
|
48
|
+
export var Default = function Default(args) {
|
49
|
+
return ___EmotionJSX(ProgressBar, _extends({}, args, {
|
50
|
+
value: 25,
|
51
|
+
"aria-label": "Progress Bar"
|
52
|
+
}));
|
53
|
+
};
|
@@ -0,0 +1,23 @@
|
|
1
|
+
import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
|
2
|
+
import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
|
3
|
+
import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
|
4
|
+
import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor";
|
5
|
+
import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
|
6
|
+
import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
|
7
|
+
import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
|
8
|
+
import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
|
9
|
+
import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
|
10
|
+
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; }
|
11
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context, _context2; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) { _defineProperty(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
|
12
|
+
var container = {
|
13
|
+
backgroundColor: 'neutral.90',
|
14
|
+
borderRadius: '3px',
|
15
|
+
height: '7px'
|
16
|
+
};
|
17
|
+
var percentageBar = _objectSpread(_objectSpread({}, container), {}, {
|
18
|
+
backgroundColor: 'active'
|
19
|
+
});
|
20
|
+
export default {
|
21
|
+
container: container,
|
22
|
+
percentageBar: percentageBar
|
23
|
+
};
|
@@ -0,0 +1,97 @@
|
|
1
|
+
import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
|
2
|
+
import React from 'react';
|
3
|
+
import { render, screen } from '@testing-library/react';
|
4
|
+
import { universalComponentTests } from '../../utils/testUtils/universalComponentTest';
|
5
|
+
import ProgressBar, { calculateBarWidth } from '.';
|
6
|
+
import { jsx as ___EmotionJSX } from "@emotion/react";
|
7
|
+
var testId = 'test-progressbar';
|
8
|
+
var defaultProps = {
|
9
|
+
'data-testid': testId,
|
10
|
+
value: 25,
|
11
|
+
minValue: 0,
|
12
|
+
maxValue: 100
|
13
|
+
};
|
14
|
+
var getComponent = function getComponent() {
|
15
|
+
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
16
|
+
return render(___EmotionJSX(ProgressBar, _extends({}, defaultProps, props, {
|
17
|
+
"aria-label": "Progress Bar"
|
18
|
+
})));
|
19
|
+
};
|
20
|
+
|
21
|
+
// Needs to be added to each components test file
|
22
|
+
universalComponentTests({
|
23
|
+
renderComponent: function renderComponent(props) {
|
24
|
+
return ___EmotionJSX(ProgressBar, _extends({}, defaultProps, props, {
|
25
|
+
"aria-label": "Progress Bar"
|
26
|
+
}));
|
27
|
+
}
|
28
|
+
});
|
29
|
+
test('ProgressBar component does load', function () {
|
30
|
+
getComponent();
|
31
|
+
var progressBar = screen.getByRole('progressbar', {
|
32
|
+
name: 'Progress Bar'
|
33
|
+
});
|
34
|
+
expect(progressBar).toBeInTheDocument();
|
35
|
+
});
|
36
|
+
test('should render a label', function () {
|
37
|
+
getComponent({
|
38
|
+
label: 'Loading...'
|
39
|
+
});
|
40
|
+
var label = screen.getByText('Loading...');
|
41
|
+
expect(label).toBeInTheDocument();
|
42
|
+
});
|
43
|
+
test('renders value as a percentage', function () {
|
44
|
+
getComponent({
|
45
|
+
value: 25
|
46
|
+
});
|
47
|
+
var value = screen.getByText('25%');
|
48
|
+
expect(value).toBeInTheDocument();
|
49
|
+
});
|
50
|
+
test('renders value as custom valueLabel instead of percentage', function () {
|
51
|
+
getComponent({
|
52
|
+
value: 25,
|
53
|
+
valueLabel: '25 of 100 dogs'
|
54
|
+
});
|
55
|
+
var value = screen.queryByText('25%');
|
56
|
+
var valueLabel = screen.getByText('25 of 100 dogs');
|
57
|
+
expect(value).not.toBeInTheDocument();
|
58
|
+
expect(valueLabel).toBeInTheDocument();
|
59
|
+
});
|
60
|
+
test('does not render value when showValueLabel is false', function () {
|
61
|
+
getComponent({
|
62
|
+
value: 25,
|
63
|
+
showValueLabel: false
|
64
|
+
});
|
65
|
+
var valueLabel = screen.queryByText('25%');
|
66
|
+
expect(valueLabel).not.toBeInTheDocument();
|
67
|
+
});
|
68
|
+
test('renders label and custom valueLabel when labe and valueLabel are present', function () {
|
69
|
+
getComponent({
|
70
|
+
value: 25,
|
71
|
+
label: 'Loading...',
|
72
|
+
valueLabel: '25 of 100 dogs'
|
73
|
+
});
|
74
|
+
var label = screen.getByText('Loading...');
|
75
|
+
var valueLabel = screen.getByText('25 of 100 dogs');
|
76
|
+
expect(label).toBeInTheDocument();
|
77
|
+
expect(valueLabel).toBeInTheDocument();
|
78
|
+
});
|
79
|
+
test('calculates bar width with default min and max values', function () {
|
80
|
+
expect(calculateBarWidth(25, 0, 100)).toBe('25%');
|
81
|
+
});
|
82
|
+
test('calculates bar width when value equals minValue', function () {
|
83
|
+
expect(calculateBarWidth(0, 0, 100)).toBe('0%');
|
84
|
+
});
|
85
|
+
test('calculates bar width when value equals maxValue', function () {
|
86
|
+
expect(calculateBarWidth(100, 0, 100)).toBe('100%');
|
87
|
+
});
|
88
|
+
test('throws error when value is less than minValue', function () {
|
89
|
+
expect(function () {
|
90
|
+
return calculateBarWidth(-10, 0, 100);
|
91
|
+
}).toThrow('Value cannot be less than minValue');
|
92
|
+
});
|
93
|
+
test('throws error when value is greater than maxValue', function () {
|
94
|
+
expect(function () {
|
95
|
+
return calculateBarWidth(110, 0, 100);
|
96
|
+
}).toThrow('Value cannot be greater than maxValue');
|
97
|
+
});
|
package/lib/index.js
CHANGED
@@ -124,6 +124,7 @@ export * from './components/PasswordField';
|
|
124
124
|
export { default as PopoverContainer } from './components/PopoverContainer';
|
125
125
|
export * from './components/PopoverContainer';
|
126
126
|
export { default as PopoverMenu } from './components/PopoverMenu';
|
127
|
+
export { default as ProgressBar } from './components/ProgressBar';
|
127
128
|
export { default as Radio } from './components/Radio';
|
128
129
|
export * from './components/Radio';
|
129
130
|
export { default as RadioField } from './components/RadioField';
|
@@ -38,6 +38,7 @@ import navBar from '../../components/NavBar/NavBar.styles';
|
|
38
38
|
import overlayPanel from '../../components/OverlayPanel/OverlayPanel.styles';
|
39
39
|
import panelHeader from '../../components/PanelHeader/PanelHeader.styles';
|
40
40
|
import popoverMenu from '../../components/PopoverMenu/PopoverMenu.styles';
|
41
|
+
import progressBar from '../../components/ProgressBar/ProgressBar.styles';
|
41
42
|
import rockerButton from '../../components/RockerButton/RockerButton.styles';
|
42
43
|
import scrollBox from '../../components/ScrollBox/ScrollBox.styles';
|
43
44
|
import separator from '../../components/Separator/Separator.styles';
|
@@ -77,6 +78,7 @@ export default _objectSpread({
|
|
77
78
|
overlayPanel: overlayPanel,
|
78
79
|
popoverMenu: popoverMenu,
|
79
80
|
panelHeader: panelHeader,
|
81
|
+
progressBar: progressBar,
|
80
82
|
rockerButton: rockerButton,
|
81
83
|
scrollBox: scrollBox,
|
82
84
|
separator: separator,
|
package/lib/types/index.js
CHANGED
@@ -29,6 +29,7 @@ export * from './navBar';
|
|
29
29
|
export * from './overlayPanel';
|
30
30
|
export * from './popoverContainer';
|
31
31
|
export * from './popoverMenu';
|
32
|
+
export * from './progressBar';
|
32
33
|
export * from './requirementsList';
|
33
34
|
export * from './rockerButtonGroup';
|
34
35
|
export * from './scrollBox';
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@pingux/astro",
|
3
|
-
"version": "2.59.0
|
3
|
+
"version": "2.59.0",
|
4
4
|
"description": "React component library for Ping Identity's design system",
|
5
5
|
"repository": {
|
6
6
|
"type": "git",
|
@@ -65,6 +65,7 @@
|
|
65
65
|
"@react-aria/listbox": "~3.10.2",
|
66
66
|
"@react-aria/live-announcer": "~3.1.1",
|
67
67
|
"@react-aria/overlays": "^3.7.0",
|
68
|
+
"@react-aria/progress": "^3.4.9",
|
68
69
|
"@react-aria/selection": "~3.10.1",
|
69
70
|
"@react-aria/table": "^3.9.0",
|
70
71
|
"@react-aria/tabs": "^3.8.3",
|
@@ -73,7 +74,6 @@
|
|
73
74
|
"@react-aria/visually-hidden": "~3.6.0",
|
74
75
|
"@react-spectrum/utils": "~3.6.1",
|
75
76
|
"@react-stately/calendar": "3.0.1",
|
76
|
-
"@react-stately/collections": "^3.10.5",
|
77
77
|
"@react-stately/color": "~3.1.1",
|
78
78
|
"@react-stately/datepicker": "^3.0.1",
|
79
79
|
"@react-stately/dnd": "^3.2.6",
|
@@ -139,6 +139,7 @@
|
|
139
139
|
"@emotion/babel-preset-css-prop": "^11.2.0",
|
140
140
|
"@emotion/cache": "^11.4.0",
|
141
141
|
"@emotion/eslint-plugin": "^11.2.0",
|
142
|
+
"@react-stately/collections": "^3.10.2",
|
142
143
|
"@storybook/addon-a11y": "^7.1.0",
|
143
144
|
"@storybook/addon-console": "^2.0.0",
|
144
145
|
"@storybook/addon-docs": "^7.1.0",
|