@canonical/react-components 0.31.0 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/__mocks__/nanoid.d.ts +1 -0
  2. package/dist/__mocks__/nanoid.js +17 -0
  3. package/dist/components/AccordionSection/AccordionSection.js +8 -12
  4. package/dist/components/CheckableInput/CheckableInput.d.ts +9 -1
  5. package/dist/components/CheckableInput/CheckableInput.js +8 -7
  6. package/dist/components/Chip/Chip.d.ts +5 -5
  7. package/dist/components/Chip/Chip.js +21 -13
  8. package/dist/components/CodeSnippet/CodeSnippet.d.ts +5 -4
  9. package/dist/components/CodeSnippet/CodeSnippet.js +13 -11
  10. package/dist/components/ContextualMenu/ContextualMenu.js +5 -5
  11. package/dist/components/Field/Field.d.ts +9 -1
  12. package/dist/components/Field/Field.js +12 -8
  13. package/dist/components/Input/Input.js +33 -13
  14. package/dist/components/MainTable/MainTable.d.ts +4 -0
  15. package/dist/components/MainTable/MainTable.js +9 -2
  16. package/dist/components/Modal/Modal.js +8 -8
  17. package/dist/components/ModularTable/ModularTable.d.ts +20 -5
  18. package/dist/components/ModularTable/ModularTable.js +30 -16
  19. package/dist/components/PaginationItem/PaginationItem.js +2 -1
  20. package/dist/components/PasswordToggle/PasswordToggle.js +14 -3
  21. package/dist/components/SearchBox/SearchBox.d.ts +5 -4
  22. package/dist/components/SearchBox/SearchBox.js +12 -14
  23. package/dist/components/Select/Select.js +11 -1
  24. package/dist/components/Slider/Slider.js +14 -1
  25. package/dist/components/Spinner/Spinner.d.ts +9 -1
  26. package/dist/components/Spinner/Spinner.js +12 -4
  27. package/dist/components/Switch/Switch.d.ts +14 -0
  28. package/dist/components/Switch/Switch.js +42 -0
  29. package/dist/components/Switch/index.d.ts +2 -0
  30. package/dist/components/Switch/index.js +15 -0
  31. package/dist/components/Textarea/Textarea.js +11 -1
  32. package/dist/hooks/index.d.ts +1 -0
  33. package/dist/hooks/index.js +9 -1
  34. package/dist/hooks/useId.d.ts +6 -0
  35. package/dist/hooks/useId.js +21 -0
  36. package/dist/index.d.ts +3 -0
  37. package/dist/index.js +40 -0
  38. package/package.json +32 -29
@@ -1,6 +1,8 @@
1
- import { ReactNode } from "react";
2
- import type { Column } from "react-table";
3
- export declare type Props<D extends Record<string, unknown>> = {
1
+ import { ReactNode, HTMLProps } from "react";
2
+ import { TableCellProps, TableHeaderProps, TableRowProps } from "react-table";
3
+ import type { Column, UseTableOptions, Cell, Row, HeaderGroup } from "react-table";
4
+ import { PropsWithSpread } from "../../types";
5
+ export declare type Props<D extends Record<string, unknown>> = PropsWithSpread<{
4
6
  /**
5
7
  * The columns of the table.
6
8
  */
@@ -17,6 +19,19 @@ export declare type Props<D extends Record<string, unknown>> = {
17
19
  * Optional extra row to display underneath the main table content.
18
20
  */
19
21
  footer?: ReactNode;
20
- };
21
- declare function ModularTable({ data, columns, emptyMsg, footer, }: Props<Record<string, unknown>>): JSX.Element;
22
+ /**
23
+ * This function is used to resolve any props needed for a particular column's header cell.
24
+ */
25
+ getHeaderProps?: (header: HeaderGroup<D>) => Partial<TableHeaderProps & HTMLProps<HTMLTableHeaderCellElement>>;
26
+ /**
27
+ * This function is used to resolve any props needed for a particular row.
28
+ */
29
+ getRowProps?: (row: Row<D>) => Partial<TableRowProps & HTMLProps<HTMLTableRowElement>>;
30
+ /**
31
+ * This function is used to resolve any props needed for a particular cell.
32
+ */
33
+ getCellProps?: (cell: Cell<D>) => Partial<TableCellProps & HTMLProps<HTMLTableCellElement>>;
34
+ getRowId?: UseTableOptions<D>["getRowId"];
35
+ }, HTMLProps<HTMLTableElement>>;
36
+ declare function ModularTable({ data, columns, emptyMsg, footer, getHeaderProps, getRowProps, getCellProps, getRowId, ...props }: Props<Record<string, unknown>>): JSX.Element;
22
37
  export default ModularTable;
@@ -5,8 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _propTypes = _interopRequireDefault(require("prop-types"));
9
-
10
8
  var _react = _interopRequireDefault(require("react"));
11
9
 
12
10
  var _reactTable = require("react-table");
@@ -21,17 +19,37 @@ var _TableCell = _interopRequireDefault(require("../TableCell"));
21
19
 
22
20
  var _Icon = _interopRequireDefault(require("../Icon"));
23
21
 
22
+ var _excluded = ["data", "columns", "emptyMsg", "footer", "getHeaderProps", "getRowProps", "getCellProps", "getRowId"];
23
+
24
24
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
25
 
26
+ function _extends() { _extends = Object.assign || 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); }
27
+
28
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
29
+
30
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
31
+
32
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
33
+
34
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
35
+
36
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
37
+
26
38
  function ModularTable(_ref) {
27
39
  var data = _ref.data,
28
40
  columns = _ref.columns,
29
41
  emptyMsg = _ref.emptyMsg,
30
- footer = _ref.footer;
42
+ footer = _ref.footer,
43
+ getHeaderProps = _ref.getHeaderProps,
44
+ getRowProps = _ref.getRowProps,
45
+ getCellProps = _ref.getCellProps,
46
+ getRowId = _ref.getRowId,
47
+ props = _objectWithoutProperties(_ref, _excluded);
31
48
 
32
49
  var _useTable = (0, _reactTable.useTable)({
33
50
  columns: columns,
34
- data: data
51
+ data: data,
52
+ getRowId: getRowId || undefined
35
53
  }),
36
54
  getTableProps = _useTable.getTableProps,
37
55
  getTableBodyProps = _useTable.getTableBodyProps,
@@ -39,28 +57,30 @@ function ModularTable(_ref) {
39
57
  rows = _useTable.rows,
40
58
  prepareRow = _useTable.prepareRow;
41
59
 
42
- var showEmpty = emptyMsg && (!rows || rows.length === 0);
43
- return /*#__PURE__*/_react.default.createElement(_Table.default, getTableProps(), /*#__PURE__*/_react.default.createElement("thead", null, headerGroups.map(function (headerGroup) {
60
+ var showEmpty = !!emptyMsg && (!rows || rows.length === 0);
61
+ return /*#__PURE__*/_react.default.createElement(_Table.default, _extends({}, getTableProps(), props), /*#__PURE__*/_react.default.createElement("thead", null, headerGroups.map(function (headerGroup) {
44
62
  return /*#__PURE__*/_react.default.createElement(_TableRow.default, headerGroup.getHeaderGroupProps(), headerGroup.headers.map(function (column) {
45
63
  return /*#__PURE__*/_react.default.createElement(_TableHeader.default, column.getHeaderProps([{
46
64
  className: column.className
47
65
  }, {
48
66
  className: column.getCellIcon ? "p-table__cell--icon-placeholder" : ""
49
- }]), column.render("Header"));
67
+ }, _objectSpread({}, getHeaderProps === null || getHeaderProps === void 0 ? void 0 : getHeaderProps(column))]), column.render("Header"));
50
68
  }));
51
69
  })), /*#__PURE__*/_react.default.createElement("tbody", getTableBodyProps(), rows.map(function (row) {
52
70
  // This function is responsible for lazily preparing a row for rendering.
53
71
  // Any row that you intend to render in your table needs to be passed to this function before every render.
54
72
  // see: https://react-table.tanstack.com/docs/api/useTable#instance-properties
55
73
  prepareRow(row);
56
- return /*#__PURE__*/_react.default.createElement(_TableRow.default, row.getRowProps(), row.cells.map(function (cell) {
74
+ return /*#__PURE__*/_react.default.createElement(_TableRow.default, row.getRowProps(getRowProps === null || getRowProps === void 0 ? void 0 : getRowProps(row)), row.cells.map(function (cell) {
75
+ var _cell$column$getCellI, _cell$column;
76
+
57
77
  var hasColumnIcon = cell.column.getCellIcon;
58
- var iconName = hasColumnIcon && cell.column.getCellIcon(cell);
78
+ var iconName = hasColumnIcon && ((_cell$column$getCellI = (_cell$column = cell.column).getCellIcon) === null || _cell$column$getCellI === void 0 ? void 0 : _cell$column$getCellI.call(_cell$column, cell));
59
79
  return /*#__PURE__*/_react.default.createElement(_TableCell.default, cell.getCellProps([{
60
80
  className: cell.column.className
61
81
  }, {
62
82
  className: hasColumnIcon ? "p-table__cell--icon-placeholder" : ""
63
- }]), iconName && /*#__PURE__*/_react.default.createElement(_Icon.default, {
83
+ }, _objectSpread({}, getCellProps === null || getCellProps === void 0 ? void 0 : getCellProps(cell))]), iconName && /*#__PURE__*/_react.default.createElement(_Icon.default, {
64
84
  name: iconName
65
85
  }), cell.render("Cell"));
66
86
  }));
@@ -71,11 +91,5 @@ function ModularTable(_ref) {
71
91
  }, footer))));
72
92
  }
73
93
 
74
- ModularTable.propTypes = {
75
- columns: _propTypes.default.array.isRequired,
76
- data: _propTypes.default.array.isRequired,
77
- emptyMsg: _propTypes.default.string,
78
- footer: _propTypes.default.node
79
- };
80
94
  var _default = ModularTable;
81
95
  exports.default = _default;
@@ -22,7 +22,8 @@ var PaginationItem = function PaginationItem(_ref) {
22
22
  className: (0, _classnames.default)("p-pagination__link", {
23
23
  "is-active": isActive
24
24
  }),
25
- onClick: onClick
25
+ onClick: onClick,
26
+ "aria-current": isActive ? "page" : undefined
26
27
  }, number));
27
28
  };
28
29
 
@@ -17,6 +17,8 @@ var _Field = _interopRequireDefault(require("../Field"));
17
17
 
18
18
  var _Label = _interopRequireDefault(require("../Label"));
19
19
 
20
+ var _hooks = require("../../hooks");
21
+
20
22
  var _excluded = ["caution", "className", "error", "help", "id", "label", "readOnly", "required", "success", "type", "wrapperClassName"];
21
23
 
22
24
  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); }
@@ -62,6 +64,10 @@ var PasswordToggle = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref)
62
64
  isPassword = _useState2[0],
63
65
  setIsPassword = _useState2[1];
64
66
 
67
+ var validationId = (0, _hooks.useId)();
68
+ var helpId = (0, _hooks.useId)();
69
+ var hasError = !!error;
70
+
65
71
  var togglePassword = function togglePassword() {
66
72
  if (isPassword) {
67
73
  setIsPassword(false);
@@ -75,8 +81,10 @@ var PasswordToggle = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref)
75
81
  className: wrapperClassName,
76
82
  error: error,
77
83
  help: help,
84
+ helpId: helpId,
78
85
  required: required,
79
- success: success
86
+ success: success,
87
+ validationId: validationId
80
88
  }, /*#__PURE__*/_react.default.createElement("div", {
81
89
  className: "p-form-password-toggle"
82
90
  }, /*#__PURE__*/_react.default.createElement(_Label.default, {
@@ -97,11 +105,14 @@ var PasswordToggle = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref)
97
105
  }, isPassword ? "Show" : "Hide"), /*#__PURE__*/_react.default.createElement("i", {
98
106
  className: isPassword ? "p-icon--show" : "p-icon--hide"
99
107
  }))), /*#__PURE__*/_react.default.createElement("input", _extends({
108
+ "aria-describedby": help ? helpId : null,
109
+ "aria-errormessage": hasError ? validationId : null,
110
+ "aria-invalid": hasError,
100
111
  className: (0, _classnames.default)("p-form-validation__input", className),
101
112
  id: id,
113
+ readOnly: readOnly,
102
114
  ref: ref,
103
- type: isPassword ? "password" : "text",
104
- readOnly: readOnly
115
+ type: isPassword ? "password" : "text"
105
116
  }, inputProps)));
106
117
  });
107
118
 
@@ -1,5 +1,6 @@
1
- import type { ClassName } from "../../types";
2
- export declare type Props = {
1
+ import { HTMLProps } from "react";
2
+ import type { ClassName, PropsWithSpread } from "../../types";
3
+ export declare type Props = PropsWithSpread<{
3
4
  /**
4
5
  * Whether autocomplete should be enabled for the search input.
5
6
  */
@@ -32,9 +33,9 @@ export declare type Props = {
32
33
  * The value of the search input when the state is externally controlled.
33
34
  */
34
35
  value?: string;
35
- };
36
+ }, HTMLProps<HTMLInputElement>>;
36
37
  declare const SearchBox: {
37
- ({ autocomplete, className, disabled, externallyControlled, onChange, onSearch, placeholder, value, }: Props): JSX.Element;
38
+ ({ autocomplete, className, disabled, externallyControlled, onChange, onSearch, placeholder, value, ...props }: Props): JSX.Element;
38
39
  displayName: string;
39
40
  };
40
41
  export default SearchBox;
@@ -5,16 +5,22 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _propTypes = _interopRequireDefault(require("prop-types"));
9
-
10
8
  var _classnames = _interopRequireDefault(require("classnames"));
11
9
 
12
10
  var _react = _interopRequireDefault(require("react"));
13
11
 
14
12
  var _Icon = _interopRequireDefault(require("../Icon"));
15
13
 
14
+ var _excluded = ["autocomplete", "className", "disabled", "externallyControlled", "onChange", "onSearch", "placeholder", "value"];
15
+
16
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
17
 
18
+ function _extends() { _extends = Object.assign || 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
+
20
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
21
+
22
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
23
+
18
24
  var SearchBox = function SearchBox(_ref) {
19
25
  var _ref$autocomplete = _ref.autocomplete,
20
26
  autocomplete = _ref$autocomplete === void 0 ? "on" : _ref$autocomplete,
@@ -25,7 +31,8 @@ var SearchBox = function SearchBox(_ref) {
25
31
  onSearch = _ref.onSearch,
26
32
  _ref$placeholder = _ref.placeholder,
27
33
  placeholder = _ref$placeholder === void 0 ? "Search" : _ref$placeholder,
28
- value = _ref.value;
34
+ value = _ref.value,
35
+ props = _objectWithoutProperties(_ref, _excluded);
29
36
 
30
37
  var input = /*#__PURE__*/_react.default.createRef();
31
38
 
@@ -46,7 +53,7 @@ var SearchBox = function SearchBox(_ref) {
46
53
  }, /*#__PURE__*/_react.default.createElement("label", {
47
54
  className: "u-off-screen",
48
55
  htmlFor: "search"
49
- }, placeholder || "Search"), /*#__PURE__*/_react.default.createElement("input", {
56
+ }, placeholder || "Search"), /*#__PURE__*/_react.default.createElement("input", _extends({
50
57
  autoComplete: autocomplete,
51
58
  className: "p-search-box__input",
52
59
  disabled: disabled,
@@ -60,7 +67,7 @@ var SearchBox = function SearchBox(_ref) {
60
67
  type: "search",
61
68
  defaultValue: externallyControlled ? undefined : value,
62
69
  value: externallyControlled ? value : undefined
63
- }), value && /*#__PURE__*/_react.default.createElement("button", {
70
+ }, props)), value && /*#__PURE__*/_react.default.createElement("button", {
64
71
  className: "p-search-box__reset",
65
72
  disabled: disabled,
66
73
  onClick: resetInput,
@@ -76,15 +83,6 @@ var SearchBox = function SearchBox(_ref) {
76
83
  }, "Search")));
77
84
  };
78
85
 
79
- SearchBox.propTypes = {
80
- autocomplete: _propTypes.default.oneOf(["on", "off"]),
81
- disabled: _propTypes.default.bool,
82
- externallyControlled: _propTypes.default.bool,
83
- onChange: _propTypes.default.func,
84
- onSearch: _propTypes.default.func,
85
- placeholder: _propTypes.default.string,
86
- value: _propTypes.default.string
87
- };
88
86
  SearchBox.displayName = "SearchBox";
89
87
  var _default = SearchBox;
90
88
  exports.default = _default;
@@ -13,6 +13,8 @@ var _react = _interopRequireWildcard(require("react"));
13
13
 
14
14
  var _Field = _interopRequireDefault(require("../Field"));
15
15
 
16
+ var _hooks = require("../../hooks");
17
+
16
18
  var _excluded = ["label", "value"],
17
19
  _excluded2 = ["caution", "className", "error", "help", "id", "label", "labelClassName", "onChange", "options", "required", "stacked", "success", "takeFocus", "wrapperClassName"];
18
20
 
@@ -59,6 +61,9 @@ var Select = function Select(_ref2) {
59
61
  selectProps = _objectWithoutProperties(_ref2, _excluded2);
60
62
 
61
63
  var selectRef = (0, _react.useRef)(null);
64
+ var validationId = (0, _hooks.useId)();
65
+ var helpId = (0, _hooks.useId)();
66
+ var hasError = !!error;
62
67
  (0, _react.useEffect)(function () {
63
68
  if (takeFocus) {
64
69
  selectRef.current.focus();
@@ -70,13 +75,18 @@ var Select = function Select(_ref2) {
70
75
  error: error,
71
76
  forId: id,
72
77
  help: help,
78
+ helpId: helpId,
73
79
  isSelect: true,
74
80
  label: label,
75
81
  labelClassName: labelClassName,
76
82
  required: required,
77
83
  stacked: stacked,
78
- success: success
84
+ success: success,
85
+ validationId: validationId
79
86
  }, /*#__PURE__*/_react.default.createElement("select", _extends({
87
+ "aria-describedby": help ? helpId : null,
88
+ "aria-errormessage": hasError ? validationId : null,
89
+ "aria-invalid": hasError,
80
90
  className: (0, _classnames.default)("p-form-validation__input", className),
81
91
  id: id,
82
92
  onChange: function onChange(evt) {
@@ -9,6 +9,8 @@ var _react = _interopRequireDefault(require("react"));
9
9
 
10
10
  var _Field = _interopRequireDefault(require("../Field"));
11
11
 
12
+ var _hooks = require("../../hooks");
13
+
12
14
  var _excluded = ["caution", "disabled", "error", "help", "id", "inputDisabled", "label", "max", "min", "onChange", "required", "showInput"];
13
15
 
14
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -45,6 +47,9 @@ var Slider = function Slider(_ref) {
45
47
  showInput = _ref$showInput === void 0 ? false : _ref$showInput,
46
48
  inputProps = _objectWithoutProperties(_ref, _excluded);
47
49
 
50
+ var validationId = (0, _hooks.useId)();
51
+ var helpId = (0, _hooks.useId)();
52
+ var hasError = !!error;
48
53
  var style = {};
49
54
 
50
55
  if ((_navigator = navigator) !== null && _navigator !== void 0 && (_navigator$userAgent = _navigator.userAgent) !== null && _navigator$userAgent !== void 0 && _navigator$userAgent.includes("AppleWebKit")) {
@@ -61,11 +66,16 @@ var Slider = function Slider(_ref) {
61
66
  caution: caution,
62
67
  error: error,
63
68
  help: help,
69
+ helpId: helpId,
64
70
  label: label,
65
- required: required
71
+ required: required,
72
+ validationId: validationId
66
73
  }, /*#__PURE__*/_react.default.createElement("div", {
67
74
  className: "p-slider__wrapper"
68
75
  }, /*#__PURE__*/_react.default.createElement("input", _extends({
76
+ "aria-describedby": help ? helpId : null,
77
+ "aria-errormessage": hasError ? validationId : null,
78
+ "aria-invalid": hasError,
69
79
  disabled: disabled,
70
80
  id: id,
71
81
  max: max,
@@ -75,6 +85,9 @@ var Slider = function Slider(_ref) {
75
85
  style: style,
76
86
  type: "range"
77
87
  }, inputProps)), showInput && /*#__PURE__*/_react.default.createElement("input", _extends({
88
+ "aria-describedby": help ? helpId : null,
89
+ "aria-errormessage": hasError ? validationId : null,
90
+ "aria-invalid": hasError,
78
91
  className: "p-slider__input",
79
92
  disabled: disabled || inputDisabled,
80
93
  max: max,
@@ -13,6 +13,14 @@ export declare type Props = {
13
13
  * Text to display next to the spinner.
14
14
  */
15
15
  text?: string;
16
+ /**
17
+ * What the role of the spinner should be.
18
+ */
19
+ role?: string;
20
+ /**
21
+ * The politeness setting of the spinner alert.
22
+ */
23
+ ariaLive?: "assertive" | "off" | "polite";
16
24
  } & HTMLProps<HTMLSpanElement>;
17
- declare const Spinner: ({ className, text, isLight, ...props }: Props) => JSX.Element;
25
+ declare const Spinner: ({ className, text, isLight, ariaLive, role, ...props }: Props) => JSX.Element;
18
26
  export default Spinner;
@@ -11,7 +11,7 @@ var _react = _interopRequireDefault(require("react"));
11
11
 
12
12
  var _classnames = _interopRequireDefault(require("classnames"));
13
13
 
14
- var _excluded = ["className", "text", "isLight"];
14
+ var _excluded = ["className", "text", "isLight", "ariaLive", "role"];
15
15
 
16
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
17
 
@@ -26,20 +26,28 @@ var Spinner = function Spinner(_ref) {
26
26
  text = _ref.text,
27
27
  _ref$isLight = _ref.isLight,
28
28
  isLight = _ref$isLight === void 0 ? false : _ref$isLight,
29
+ _ref$ariaLive = _ref.ariaLive,
30
+ ariaLive = _ref$ariaLive === void 0 ? "polite" : _ref$ariaLive,
31
+ _ref$role = _ref.role,
32
+ role = _ref$role === void 0 ? "alert" : _ref$role,
29
33
  props = _objectWithoutProperties(_ref, _excluded);
30
34
 
31
35
  return /*#__PURE__*/_react.default.createElement("span", _extends({}, props, {
32
- className: (0, _classnames.default)(className, "p-text--default")
36
+ className: (0, _classnames.default)(className, "p-text--default"),
37
+ role: role,
38
+ "aria-live": ariaLive
33
39
  }), /*#__PURE__*/_react.default.createElement("i", {
34
40
  className: (0, _classnames.default)("p-icon--spinner", "u-animation--spin", {
35
41
  "is-light": isLight
36
42
  })
37
- }), text && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "\u2002", /*#__PURE__*/_react.default.createElement("span", null, text)));
43
+ }, text ? "" : "Loading"), text && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "\u2002", /*#__PURE__*/_react.default.createElement("span", null, text)));
38
44
  };
39
45
 
40
46
  Spinner.propTypes = {
41
47
  isLight: _propTypes.default.bool,
42
- text: _propTypes.default.string
48
+ text: _propTypes.default.string,
49
+ role: _propTypes.default.string,
50
+ ariaLive: _propTypes.default.oneOf(["assertive", "off", "polite"])
43
51
  };
44
52
  var _default = Spinner;
45
53
  exports.default = _default;
@@ -0,0 +1,14 @@
1
+ import type { HTMLProps, ReactNode } from "react";
2
+ import type { PropsWithSpread } from "../../types";
3
+ export declare type Props = PropsWithSpread<{
4
+ /**
5
+ * The label name for the switch
6
+ */
7
+ label: ReactNode;
8
+ /**
9
+ * Whether the switch is disabled or not
10
+ */
11
+ disabled?: boolean;
12
+ }, HTMLProps<HTMLInputElement>>;
13
+ export declare const Switch: ({ label, disabled, ...inputProps }: Props) => JSX.Element;
14
+ export default Switch;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.Switch = void 0;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _excluded = ["label", "disabled"];
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+
14
+ function _extends() { _extends = Object.assign || 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); }
15
+
16
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
17
+
18
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
19
+
20
+ var Switch = function Switch(_ref) {
21
+ var label = _ref.label,
22
+ _ref$disabled = _ref.disabled,
23
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
24
+ inputProps = _objectWithoutProperties(_ref, _excluded);
25
+
26
+ return /*#__PURE__*/_react.default.createElement("label", {
27
+ className: "p-switch"
28
+ }, /*#__PURE__*/_react.default.createElement("input", _extends({
29
+ type: "checkbox",
30
+ className: "p-switch__input",
31
+ role: "switch",
32
+ disabled: disabled
33
+ }, inputProps)), /*#__PURE__*/_react.default.createElement("span", {
34
+ className: "p-switch__slider"
35
+ }), /*#__PURE__*/_react.default.createElement("span", {
36
+ className: "p-switch__label"
37
+ }, label));
38
+ };
39
+
40
+ exports.Switch = Switch;
41
+ var _default = Switch;
42
+ exports.default = _default;
@@ -0,0 +1,2 @@
1
+ export { default } from "./Switch";
2
+ export type { Props as SwitchProps } from "./Switch";
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "default", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _Switch.default;
10
+ }
11
+ });
12
+
13
+ var _Switch = _interopRequireDefault(require("./Switch"));
14
+
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -13,6 +13,8 @@ var _react = _interopRequireWildcard(require("react"));
13
13
 
14
14
  var _Field = _interopRequireDefault(require("../Field"));
15
15
 
16
+ var _hooks = require("../../hooks");
17
+
16
18
  var _excluded = ["caution", "className", "error", "grow", "help", "id", "label", "labelClassName", "onKeyUp", "required", "stacked", "style", "success", "takeFocus", "wrapperClassName"];
17
19
 
18
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); }
@@ -54,6 +56,9 @@ var Textarea = function Textarea(_ref) {
54
56
  props = _objectWithoutProperties(_ref, _excluded);
55
57
 
56
58
  var textareaRef = (0, _react.useRef)(null);
59
+ var validationId = (0, _hooks.useId)();
60
+ var helpId = (0, _hooks.useId)();
61
+ var hasError = !!error;
57
62
  (0, _react.useEffect)(function () {
58
63
  if (takeFocus) {
59
64
  textareaRef.current.focus();
@@ -65,12 +70,17 @@ var Textarea = function Textarea(_ref) {
65
70
  error: error,
66
71
  forId: id,
67
72
  help: help,
73
+ helpId: helpId,
68
74
  label: label,
69
75
  labelClassName: labelClassName,
70
76
  required: required,
71
77
  stacked: stacked,
72
- success: success
78
+ success: success,
79
+ validationId: validationId
73
80
  }, /*#__PURE__*/_react.default.createElement("textarea", _extends({
81
+ "aria-describedby": help ? helpId : null,
82
+ "aria-errormessage": hasError ? validationId : null,
83
+ "aria-invalid": hasError,
74
84
  className: (0, _classnames.default)("p-form-validation__input", className),
75
85
  id: id,
76
86
  onKeyUp: function onKeyUp(evt) {
@@ -2,4 +2,5 @@ export { useWindowFitment } from "./useWindowFitment";
2
2
  export { useListener } from "./useListener";
3
3
  export { usePrevious } from "./usePrevious";
4
4
  export { useThrottle } from "./useThrottle";
5
+ export { useId } from "./useId";
5
6
  export type { WindowFitment } from "./useWindowFitment";
@@ -3,6 +3,12 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ Object.defineProperty(exports, "useId", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _useId.useId;
10
+ }
11
+ });
6
12
  Object.defineProperty(exports, "useListener", {
7
13
  enumerable: true,
8
14
  get: function get() {
@@ -34,4 +40,6 @@ var _useListener = require("./useListener");
34
40
 
35
41
  var _usePrevious = require("./usePrevious");
36
42
 
37
- var _useThrottle = require("./useThrottle");
43
+ var _useThrottle = require("./useThrottle");
44
+
45
+ var _useId = require("./useId");
@@ -0,0 +1,6 @@
1
+ /**
2
+ * A hook that returns the same random ID string on every render.
3
+ * Can be used as a value for HTML "id" attributes.
4
+ * @returns random ID string
5
+ */
6
+ export declare const useId: () => string;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useId = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ var _nanoid = require("nanoid");
11
+
12
+ /**
13
+ * A hook that returns the same random ID string on every render.
14
+ * Can be used as a value for HTML "id" attributes.
15
+ * @returns random ID string
16
+ */
17
+ var useId = function useId() {
18
+ return (0, _react.useRef)((0, _nanoid.nanoid)()).current;
19
+ };
20
+
21
+ exports.useId = useId;
package/dist/index.d.ts CHANGED
@@ -29,6 +29,7 @@ export { default as SearchAndFilter } from "./components/SearchAndFilter";
29
29
  export { default as SearchBox } from "./components/SearchBox";
30
30
  export { default as Select } from "./components/Select";
31
31
  export { default as Slider } from "./components/Slider";
32
+ export { default as Switch } from "./components/Switch";
32
33
  export { default as Spinner } from "./components/Spinner";
33
34
  export { default as Strip } from "./components/Strip";
34
35
  export { default as SummaryButton } from "./components/SummaryButton";
@@ -80,4 +81,6 @@ export type { TableRowProps } from "./components/TableRow";
80
81
  export type { TabsProps } from "./components/Tabs";
81
82
  export type { TextareaProps } from "./components/Textarea";
82
83
  export type { TooltipProps } from "./components/Tooltip";
84
+ export { useWindowFitment, useListener, usePrevious, useThrottle, useId, } from "./hooks";
85
+ export type { WindowFitment } from "./hooks";
83
86
  export type { ClassName, Headings, PropsWithSpread, SortDirection, SubComponentProps, TSFixMe, ValueOf, } from "./types";