@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
@@ -0,0 +1 @@
1
+ export declare const nanoid: () => string;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.nanoid = void 0;
7
+ var id = 0;
8
+ beforeEach(function () {
9
+ id = 0;
10
+ });
11
+
12
+ var nanoid = function nanoid() {
13
+ id++;
14
+ return "mock-nanoid-".concat(id);
15
+ };
16
+
17
+ exports.nanoid = nanoid;
@@ -1,19 +1,15 @@
1
1
  "use strict";
2
2
 
3
- function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
-
5
3
  Object.defineProperty(exports, "__esModule", {
6
4
  value: true
7
5
  });
8
6
  exports.default = void 0;
9
7
 
10
- var _nanoid = require("nanoid");
11
-
12
- var _react = _interopRequireWildcard(require("react"));
8
+ var _react = _interopRequireDefault(require("react"));
13
9
 
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); }
10
+ var _useId = require("../../hooks/useId");
15
11
 
16
- 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; }
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
13
 
18
14
  var AccordionSection = function AccordionSection(_ref) {
19
15
  var content = _ref.content,
@@ -25,8 +21,8 @@ var AccordionSection = function AccordionSection(_ref) {
25
21
  titleElement = _ref.titleElement,
26
22
  _ref$headingLevel = _ref.headingLevel,
27
23
  headingLevel = _ref$headingLevel === void 0 ? 3 : _ref$headingLevel;
28
- var sectionId = (0, _react.useRef)((0, _nanoid.nanoid)());
29
- var key = sectionKey || sectionId.current;
24
+ var sectionId = (0, _useId.useId)();
25
+ var key = sectionKey || sectionId;
30
26
  var isExpanded = expanded === key;
31
27
  var Title = titleElement || "div";
32
28
  return /*#__PURE__*/_react.default.createElement("li", {
@@ -36,7 +32,7 @@ var AccordionSection = function AccordionSection(_ref) {
36
32
  "aria-level": titleElement ? null : headingLevel,
37
33
  className: "p-accordion__heading"
38
34
  }, /*#__PURE__*/_react.default.createElement("button", {
39
- "aria-controls": "#".concat(sectionId.current),
35
+ "aria-controls": "#".concat(sectionId),
40
36
  "aria-expanded": isExpanded ? "true" : "false",
41
37
  className: "p-accordion__tab",
42
38
  onClick: function onClick() {
@@ -52,9 +48,9 @@ var AccordionSection = function AccordionSection(_ref) {
52
48
  type: "button"
53
49
  }, title)), /*#__PURE__*/_react.default.createElement("section", {
54
50
  "aria-hidden": isExpanded ? "false" : "true",
55
- "aria-labelledby": sectionId.current,
51
+ "aria-labelledby": sectionId,
56
52
  className: "p-accordion__panel",
57
- id: sectionId.current,
53
+ id: sectionId,
58
54
  role: "tabpanel"
59
55
  }, content));
60
56
  };
@@ -10,10 +10,18 @@ export declare type Props = PropsWithSpread<{
10
10
  * The label for the input element.
11
11
  */
12
12
  label: ReactNode;
13
+ /**
14
+ * Optional class(es) to pass to the label element.
15
+ */
16
+ labelClassName?: string;
13
17
  /**
14
18
  * Whether the input element should display in indeterminate state.
15
19
  */
16
20
  indeterminate?: boolean;
21
+ /**
22
+ * Ensures the input and the label text are properly aligned with other inline text.
23
+ */
24
+ inline?: boolean;
17
25
  }, Omit<HTMLProps<HTMLInputElement>, "type">>;
18
- declare const CheckableInput: ({ inputType, label, indeterminate, ...checkboxProps }: Props) => JSX.Element;
26
+ declare const CheckableInput: ({ inputType, label, labelClassName, indeterminate, ...checkboxProps }: Props) => JSX.Element;
19
27
  export default CheckableInput;
@@ -9,11 +9,11 @@ exports.default = void 0;
9
9
 
10
10
  var _classnames = _interopRequireDefault(require("classnames"));
11
11
 
12
- var _nanoid = require("nanoid");
13
-
14
12
  var _react = _interopRequireWildcard(require("react"));
15
13
 
16
- var _excluded = ["inputType", "label", "indeterminate"];
14
+ var _useId = require("../../hooks/useId");
15
+
16
+ var _excluded = ["inputType", "label", "labelClassName", "indeterminate"];
17
17
 
18
18
  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); }
19
19
 
@@ -30,27 +30,28 @@ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) r
30
30
  var CheckableInput = function CheckableInput(_ref) {
31
31
  var inputType = _ref.inputType,
32
32
  label = _ref.label,
33
+ labelClassName = _ref.labelClassName,
33
34
  _ref$indeterminate = _ref.indeterminate,
34
35
  indeterminate = _ref$indeterminate === void 0 ? false : _ref$indeterminate,
35
36
  checkboxProps = _objectWithoutProperties(_ref, _excluded);
36
37
 
37
- var inputId = (0, _react.useRef)((0, _nanoid.nanoid)());
38
+ var inputId = (0, _useId.useId)();
38
39
  var inputRef = (0, _react.useRef)(null);
39
40
  (0, _react.useEffect)(function () {
40
41
  inputRef.current.indeterminate = indeterminate;
41
42
  }, [indeterminate]);
42
43
  return /*#__PURE__*/_react.default.createElement("label", {
43
- className: (0, _classnames.default)("p-".concat(inputType), {
44
+ className: (0, _classnames.default)(labelClassName, "p-".concat(inputType).concat(checkboxProps.inline ? "--inline" : ""), {
44
45
  "is-required": checkboxProps.required
45
46
  })
46
47
  }, /*#__PURE__*/_react.default.createElement("input", _extends({
47
- "aria-labelledby": inputId.current,
48
+ "aria-labelledby": inputId,
48
49
  className: "p-".concat(inputType, "__input"),
49
50
  ref: inputRef,
50
51
  type: inputType
51
52
  }, checkboxProps)), /*#__PURE__*/_react.default.createElement("span", {
52
53
  className: "p-".concat(inputType, "__label"),
53
- id: inputId.current
54
+ id: inputId
54
55
  }, label));
55
56
  };
56
57
 
@@ -1,12 +1,12 @@
1
- import type { MouseEvent } from "react";
2
- import { ValueOf } from "../../types";
1
+ import type { MouseEvent, HTMLProps } from "react";
2
+ import { ValueOf, PropsWithSpread } from "../../types";
3
3
  export declare const ChipType: {
4
4
  readonly CAUTION: "caution";
5
5
  readonly INFORMATION: "information";
6
6
  readonly NEGATIVE: "negative";
7
7
  readonly POSITIVE: "positive";
8
8
  };
9
- export declare type Props = {
9
+ export declare type Props = PropsWithSpread<{
10
10
  /**
11
11
  * The appearance of the chip.
12
12
  */
@@ -43,6 +43,6 @@ export declare type Props = {
43
43
  * The value of the chip.
44
44
  */
45
45
  value: string;
46
- };
47
- declare const Chip: ({ appearance, lead, onClick, onDismiss, quoteValue, selected, subString, value, }: Props) => JSX.Element;
46
+ }, HTMLProps<HTMLButtonElement>>;
47
+ declare const Chip: ({ appearance, lead, onClick, onDismiss, quoteValue, selected, subString, value, ...props }: Props) => JSX.Element;
48
48
  export default Chip;
@@ -11,10 +11,18 @@ var _utils = require("../../utils");
11
11
 
12
12
  var _classnames = _interopRequireDefault(require("classnames"));
13
13
 
14
+ var _excluded = ["appearance", "lead", "onClick", "onDismiss", "quoteValue", "selected", "subString", "value"];
15
+
14
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
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
+
16
20
  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; }
17
21
 
22
+ 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; }
23
+
24
+ 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; }
25
+
18
26
  var ChipType = {
19
27
  CAUTION: "caution",
20
28
  INFORMATION: "information",
@@ -35,7 +43,8 @@ var Chip = function Chip(_ref) {
35
43
  selected = _ref.selected,
36
44
  _ref$subString = _ref.subString,
37
45
  subString = _ref$subString === void 0 ? "" : _ref$subString,
38
- value = _ref.value;
46
+ value = _ref.value,
47
+ props = _objectWithoutProperties(_ref, _excluded);
39
48
 
40
49
  // When user tabs over chip and presses Enter or Space key, chip will trigger
41
50
  // click functionality
@@ -62,29 +71,28 @@ var Chip = function Chip(_ref) {
62
71
  }
63
72
  }));
64
73
 
65
- var chipClassName = (0, _classnames.default)((_classNames = {}, _defineProperty(_classNames, "p-chip--".concat(appearance), !!appearance), _defineProperty(_classNames, "p-chip", !appearance), _classNames));
74
+ var chipClassName = (0, _classnames.default)((_classNames = {}, _defineProperty(_classNames, "p-chip--".concat(appearance), !!appearance), _defineProperty(_classNames, "p-chip", !appearance), _classNames), props.className);
66
75
 
67
76
  if (onDismiss) {
68
- return /*#__PURE__*/_react.default.createElement("span", {
69
- className: chipClassName,
70
- "aria-pressed": selected
71
- }, chipContent, /*#__PURE__*/_react.default.createElement("button", {
77
+ return /*#__PURE__*/_react.default.createElement("span", _extends({}, props, {
78
+ className: chipClassName
79
+ }), chipContent, /*#__PURE__*/_react.default.createElement("button", {
72
80
  className: "p-chip__dismiss",
73
- onClick: function onClick() {
74
- return onDismiss();
75
- }
81
+ onClick: onDismiss,
82
+ type: "button"
76
83
  }, /*#__PURE__*/_react.default.createElement("i", {
77
84
  className: "p-icon--close"
78
85
  }, "Dismiss")));
79
86
  } else {
80
- return /*#__PURE__*/_react.default.createElement("button", {
81
- className: chipClassName,
87
+ return /*#__PURE__*/_react.default.createElement("button", _extends({}, props, {
82
88
  "aria-pressed": selected,
89
+ className: chipClassName,
83
90
  onClick: onClick,
84
91
  onKeyDown: function onKeyDown(e) {
85
92
  return _onKeyDown(e);
86
- }
87
- }, chipContent);
93
+ },
94
+ type: "button"
95
+ }), chipContent);
88
96
  }
89
97
  };
90
98
 
@@ -1,6 +1,7 @@
1
+ import { HTMLProps } from "react";
1
2
  import type { Props as CodeSnippetBlockProps } from "./CodeSnippetBlock";
2
- import type { ClassName } from "../../types";
3
- export declare type Props = {
3
+ import type { ClassName, PropsWithSpread } from "../../types";
4
+ export declare type Props = PropsWithSpread<{
4
5
  /**
5
6
  * Optional class(es) to pass to the wrapping div element.
6
7
  */
@@ -9,5 +10,5 @@ export declare type Props = {
9
10
  * A list of code blocks to display.
10
11
  */
11
12
  blocks: CodeSnippetBlockProps[];
12
- };
13
- export default function CodeSnippet({ className, blocks }: Props): JSX.Element;
13
+ }, HTMLProps<HTMLDivElement>>;
14
+ export default function CodeSnippet({ className, blocks, ...props }: Props): JSX.Element;
@@ -5,34 +5,36 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = CodeSnippet;
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 _CodeSnippetBlock = _interopRequireDefault(require("./CodeSnippetBlock"));
15
13
 
14
+ var _excluded = ["className", "blocks"];
15
+
16
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
17
 
18
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
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
+
20
24
  function CodeSnippet(_ref) {
21
25
  var className = _ref.className,
22
- blocks = _ref.blocks;
23
- return /*#__PURE__*/_react.default.createElement("div", {
26
+ blocks = _ref.blocks,
27
+ props = _objectWithoutProperties(_ref, _excluded);
28
+
29
+ return /*#__PURE__*/_react.default.createElement("div", _extends({
24
30
  className: (0, _classnames.default)("p-code-snippet", {
25
31
  "is-bordered": blocks.some(function (block) {
26
32
  return block.content;
27
33
  })
28
34
  }, className)
29
- }, blocks.map(function (props, i) {
35
+ }, props), blocks.map(function (blockProps, i) {
30
36
  return /*#__PURE__*/_react.default.createElement(_CodeSnippetBlock.default, _extends({
31
37
  key: "code-snippet-block-".concat(i)
32
- }, props));
38
+ }, blockProps));
33
39
  }));
34
- }
35
-
36
- CodeSnippet.propTypes = {
37
- blocks: _propTypes.default.array.isRequired
38
- };
40
+ }
@@ -7,8 +7,6 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = void 0;
9
9
 
10
- var _nanoid = require("nanoid");
11
-
12
10
  var _classnames = _interopRequireDefault(require("classnames"));
13
11
 
14
12
  var _react = _interopRequireWildcard(require("react"));
@@ -21,6 +19,8 @@ var _Button = _interopRequireDefault(require("../Button"));
21
19
 
22
20
  var _ContextualMenuDropdown = _interopRequireDefault(require("./ContextualMenuDropdown"));
23
21
 
22
+ var _useId = require("../../hooks/useId");
23
+
24
24
  var _excluded = ["autoAdjust", "children", "className", "closeOnEsc", "closeOnOutsideClick", "constrainPanelWidth", "dropdownClassName", "dropdownProps", "hasToggleIcon", "links", "onToggleMenu", "position", "positionNode", "toggleAppearance", "toggleClassName", "toggleDisabled", "toggleLabel", "toggleLabelFirst", "toggleProps", "visible"];
25
25
 
26
26
  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); }
@@ -129,7 +129,7 @@ var ContextualMenu = function ContextualMenu(_ref) {
129
129
  visible = _ref$visible === void 0 ? false : _ref$visible,
130
130
  wrapperProps = _objectWithoutProperties(_ref, _excluded);
131
131
 
132
- var id = (0, _react.useRef)((0, _nanoid.nanoid)());
132
+ var id = (0, _useId.useId)();
133
133
  var wrapper = (0, _react.useRef)();
134
134
 
135
135
  var _useState = (0, _react.useState)(),
@@ -223,7 +223,7 @@ var ContextualMenu = function ContextualMenu(_ref) {
223
223
  }
224
224
  }, wrapperProps), hasToggle ? /*#__PURE__*/_react.default.createElement(_Button.default, _extends({
225
225
  appearance: toggleAppearance,
226
- "aria-controls": id.current,
226
+ "aria-controls": id,
227
227
  "aria-expanded": isOpen ? "true" : "false",
228
228
  "aria-pressed": isOpen ? "true" : "false",
229
229
  "aria-haspopup": "true",
@@ -254,7 +254,7 @@ var ContextualMenu = function ContextualMenu(_ref) {
254
254
  constrainPanelWidth: constrainPanelWidth,
255
255
  dropdownClassName: dropdownClassName,
256
256
  dropdownContent: children,
257
- id: id.current,
257
+ id: id,
258
258
  isOpen: isOpen,
259
259
  links: links,
260
260
  position: position,
@@ -28,6 +28,10 @@ export declare type Props = {
28
28
  * Help text to show below the field.
29
29
  */
30
30
  help?: ReactNode;
31
+ /**
32
+ * An id to give to the help element.
33
+ */
34
+ helpId?: string;
31
35
  /**
32
36
  * Whether the component is wrapping a select element.
33
37
  */
@@ -56,6 +60,10 @@ export declare type Props = {
56
60
  * The content for success validation.
57
61
  */
58
62
  success?: ReactNode;
63
+ /**
64
+ * An id to give to the caution, error or success element.
65
+ */
66
+ validationId?: string;
59
67
  };
60
- declare const Field: ({ caution, children, className, error, forId, help, isSelect, label, labelClassName, labelFirst, required, stacked, success, }: Props) => JSX.Element;
68
+ declare const Field: ({ caution, children, className, error, forId, help, helpId, isSelect, label, labelClassName, labelFirst, required, stacked, success, validationId, }: Props) => JSX.Element;
61
69
  export default Field;
@@ -15,20 +15,22 @@ var _Col = _interopRequireDefault(require("../Col"));
15
15
 
16
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
17
 
18
- var generateHelp = function generateHelp(help) {
18
+ var generateHelp = function generateHelp(help, helpId) {
19
19
  return help && /*#__PURE__*/_react.default.createElement("p", {
20
- className: "p-form-help-text"
20
+ className: "p-form-help-text",
21
+ id: helpId
21
22
  }, help);
22
23
  };
23
24
 
24
- var generateError = function generateError(error, caution, success) {
25
+ var generateError = function generateError(error, caution, success, validationId) {
25
26
  if (!error && !caution && !success) {
26
27
  return null;
27
28
  }
28
29
 
29
30
  var messageType = error && "Error" || caution && "Caution" || success && "Success";
30
31
  return /*#__PURE__*/_react.default.createElement("p", {
31
- className: "p-form-validation__message"
32
+ className: "p-form-validation__message",
33
+ id: validationId
32
34
  }, /*#__PURE__*/_react.default.createElement("strong", null, messageType, ":"), " ", error || caution || success);
33
35
  };
34
36
 
@@ -52,12 +54,12 @@ var generateLabel = function generateLabel(forId, required, label, labelClassNam
52
54
  return labelNode;
53
55
  };
54
56
 
55
- var generateContent = function generateContent(isSelect, children, labelFirst, labelNode, help, error, caution, success) {
57
+ var generateContent = function generateContent(isSelect, children, labelFirst, labelNode, help, error, caution, success, validationId, helpId) {
56
58
  return /*#__PURE__*/_react.default.createElement("div", {
57
59
  className: "p-form__control u-clearfix"
58
60
  }, isSelect ? /*#__PURE__*/_react.default.createElement("div", {
59
61
  className: "p-form-validation__select-wrapper"
60
- }, children) : children, !labelFirst && labelNode, generateHelp(help), generateError(error, caution, success));
62
+ }, children) : children, !labelFirst && labelNode, generateHelp(help, helpId), generateError(error, caution, success, validationId));
61
63
  };
62
64
 
63
65
  var Field = function Field(_ref) {
@@ -67,6 +69,7 @@ var Field = function Field(_ref) {
67
69
  error = _ref.error,
68
70
  forId = _ref.forId,
69
71
  help = _ref.help,
72
+ helpId = _ref.helpId,
70
73
  isSelect = _ref.isSelect,
71
74
  label = _ref.label,
72
75
  labelClassName = _ref.labelClassName,
@@ -74,9 +77,10 @@ var Field = function Field(_ref) {
74
77
  labelFirst = _ref$labelFirst === void 0 ? true : _ref$labelFirst,
75
78
  required = _ref.required,
76
79
  stacked = _ref.stacked,
77
- success = _ref.success;
80
+ success = _ref.success,
81
+ validationId = _ref.validationId;
78
82
  var labelNode = generateLabel(forId, required, label, labelClassName, stacked);
79
- var content = generateContent(isSelect, children, labelFirst, labelNode, help, error, caution, success);
83
+ var content = generateContent(isSelect, children, labelFirst, labelNode, help, error, caution, success, validationId, helpId);
80
84
  return /*#__PURE__*/_react.default.createElement("div", {
81
85
  className: (0, _classnames.default)("p-form__group", "p-form-validation", className, {
82
86
  "is-error": error,
@@ -17,6 +17,8 @@ var _CheckboxInput = _interopRequireDefault(require("../CheckboxInput"));
17
17
 
18
18
  var _RadioInput = _interopRequireDefault(require("../RadioInput"));
19
19
 
20
+ var _hooks = require("../../hooks");
21
+
20
22
  var _excluded = ["caution", "className", "error", "help", "id", "label", "labelClassName", "required", "stacked", "success", "takeFocus", "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); }
@@ -27,6 +29,12 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
27
29
 
28
30
  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); }
29
31
 
32
+ 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; }
33
+
34
+ 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; }
35
+
36
+ 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; }
37
+
30
38
  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; }
31
39
 
32
40
  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; }
@@ -49,32 +57,42 @@ var Input = function Input(_ref) {
49
57
 
50
58
  var inputRef = (0, _react.useRef)(null);
51
59
  var fieldLabel = !["checkbox", "radio"].includes(type) ? label : "";
52
-
53
- var input = /*#__PURE__*/_react.default.createElement("input", _extends({
54
- className: (0, _classnames.default)("p-form-validation__input", className),
60
+ var validationId = (0, _hooks.useId)();
61
+ var helpId = (0, _hooks.useId)();
62
+ var hasError = !!error;
63
+
64
+ var commonProps = _objectSpread({
65
+ "aria-describedby": help ? helpId : null,
66
+ "aria-errormessage": hasError ? validationId : null,
67
+ "aria-invalid": hasError,
55
68
  id: id,
56
- ref: inputRef,
57
- required: required,
58
- type: type,
59
- "aria-invalid": !!error
60
- }, inputProps));
69
+ label: label,
70
+ required: required
71
+ }, inputProps);
61
72
 
62
73
  (0, _react.useEffect)(function () {
63
74
  if (takeFocus) {
64
75
  inputRef.current.focus();
65
76
  }
66
77
  }, [takeFocus]);
78
+ var input;
67
79
 
68
80
  if (type === "checkbox") {
69
81
  input = /*#__PURE__*/_react.default.createElement(_CheckboxInput.default, _extends({
70
82
  label: label,
71
- id: id
72
- }, inputProps));
83
+ labelClassName: labelClassName
84
+ }, commonProps));
73
85
  } else if (type === "radio") {
74
86
  input = /*#__PURE__*/_react.default.createElement(_RadioInput.default, _extends({
75
87
  label: label,
76
- id: id
77
- }, inputProps));
88
+ labelClassName: labelClassName
89
+ }, commonProps));
90
+ } else {
91
+ input = /*#__PURE__*/_react.default.createElement("input", _extends({
92
+ className: (0, _classnames.default)("p-form-validation__input", className),
93
+ ref: inputRef,
94
+ type: type
95
+ }, commonProps));
78
96
  }
79
97
 
80
98
  return /*#__PURE__*/_react.default.createElement(_Field.default, {
@@ -83,11 +101,13 @@ var Input = function Input(_ref) {
83
101
  error: error,
84
102
  forId: id,
85
103
  help: help,
104
+ helpId: helpId,
86
105
  label: fieldLabel,
87
106
  labelClassName: labelClassName,
88
107
  required: required,
89
108
  stacked: stacked,
90
- success: success
109
+ success: success,
110
+ validationId: validationId
91
111
  }, input);
92
112
  };
93
113
 
@@ -15,6 +15,10 @@ export declare type MainTableHeader = PropsWithSpread<{
15
15
  * A key to sort the rows by. It should match a key given to the row `sortData`.
16
16
  */
17
17
  sortKey?: string | null;
18
+ /**
19
+ * Replacement value for data-heading if content is not a string.
20
+ */
21
+ heading?: string;
18
22
  }, HTMLProps<HTMLTableHeaderCellElement>>;
19
23
  export declare type MainTableCell = PropsWithSpread<{
20
24
  /**
@@ -102,7 +102,7 @@ var generateHeaders = function generateHeaders(currentSortKey, currentSortDirect
102
102
  })));
103
103
  };
104
104
 
105
- var generateRows = function generateRows(currentSortDirection, currentSortKey, emptyStateMsg, expanding, paginate, rows, currentPage, setCurrentPage, sortable, sortFunction) {
105
+ var generateRows = function generateRows(currentSortDirection, currentSortKey, emptyStateMsg, expanding, responsive, headers, paginate, rows, currentPage, setCurrentPage, sortable, sortFunction) {
106
106
  // If the table has no rows, return empty state message
107
107
  if (Object.entries(rows).length === 0 && emptyStateMsg) {
108
108
  return /*#__PURE__*/_react.default.createElement("caption", null, emptyStateMsg);
@@ -159,6 +159,13 @@ var generateRows = function generateRows(currentSortDirection, currentSortKey, e
159
159
  var content = _ref3.content,
160
160
  cellProps = _objectWithoutProperties(_ref3, _excluded3);
161
161
 
162
+ var headerContent = headers && headers[index]["content"];
163
+ var headerReplacement = headers && headers[index]["heading"];
164
+
165
+ if (responsive) {
166
+ cellProps["data-heading"] = typeof headerContent === "string" ? headerContent : headerReplacement;
167
+ }
168
+
162
169
  return /*#__PURE__*/_react.default.createElement(_TableCell.default, _extends({
163
170
  key: index
164
171
  }, cellProps), content);
@@ -227,7 +234,7 @@ var MainTable = function MainTable(_ref4) {
227
234
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Table.default, _extends({
228
235
  expanding: expanding,
229
236
  responsive: responsive
230
- }, props), !!headers && generateHeaders(currentSortKey, currentSortDirection, expanding, headers, sortable, updateSort, setSortDirection), !!rows && generateRows(currentSortDirection, currentSortKey, emptyStateMsg, expanding, paginate, rows, currentPage, setCurrentPage, sortable, sortFunction)), paginate && rows && rows.length > 0 && /*#__PURE__*/_react.default.createElement(_Pagination.default, {
237
+ }, props), !!headers && generateHeaders(currentSortKey, currentSortDirection, expanding, headers, sortable, updateSort, setSortDirection), !!rows && generateRows(currentSortDirection, currentSortKey, emptyStateMsg, expanding, responsive, headers, paginate, rows, currentPage, setCurrentPage, sortable, sortFunction)), paginate && rows && rows.length > 0 && /*#__PURE__*/_react.default.createElement(_Pagination.default, {
231
238
  currentPage: currentPage,
232
239
  itemsPerPage: paginate,
233
240
  paginate: setCurrentPage,
@@ -9,10 +9,10 @@ exports.default = exports.Modal = void 0;
9
9
 
10
10
  var _classnames = _interopRequireDefault(require("classnames"));
11
11
 
12
- var _nanoid = require("nanoid");
13
-
14
12
  var _react = _interopRequireWildcard(require("react"));
15
13
 
14
+ var _useId = require("../../hooks/useId");
15
+
16
16
  var _excluded = ["buttonRow", "children", "className", "close", "title"];
17
17
 
18
18
  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); }
@@ -38,8 +38,8 @@ var Modal = function Modal(_ref) {
38
38
  // list of focusable selectors is based on this Stack Overflow answer:
39
39
  // https://stackoverflow.com/a/30753870/3732840
40
40
  var focusableElementSelectors = 'a[href]:not([tabindex="-1"]), button:not([disabled]), textarea:not([disabled]):not([tabindex="-1"]), input:not([disabled]):not([tabindex="-1"]), select:not([disabled]):not([tabindex="-1"]), area[href]:not([tabindex="-1"]), iframe:not([tabindex="-1"]), [tabindex]:not([tabindex="-1"]), [contentEditable=true]:not([tabindex="-1"])';
41
- var descriptionId = (0, _react.useRef)((0, _nanoid.nanoid)());
42
- var titleId = (0, _react.useRef)((0, _nanoid.nanoid)());
41
+ var descriptionId = (0, _useId.useId)();
42
+ var titleId = (0, _useId.useId)();
43
43
  var shouldClose = (0, _react.useRef)(false);
44
44
  var modalRef = (0, _react.useRef)(null);
45
45
  var focusableModalElements = (0, _react.useRef)(null);
@@ -113,21 +113,21 @@ var Modal = function Modal(_ref) {
113
113
  className: "p-modal__dialog",
114
114
  role: "dialog",
115
115
  "aria-modal": "true",
116
- "aria-labelledby": titleId.current,
117
- "aria-describedby": descriptionId.current,
116
+ "aria-labelledby": titleId,
117
+ "aria-describedby": descriptionId,
118
118
  onMouseDown: handleContentOnMouseDown,
119
119
  onMouseUp: handleContentOnMouseUp
120
120
  }, !!title && /*#__PURE__*/_react.default.createElement("header", {
121
121
  className: "p-modal__header"
122
122
  }, /*#__PURE__*/_react.default.createElement("h2", {
123
123
  className: "p-modal__title",
124
- id: titleId.current
124
+ id: titleId
125
125
  }, title), !!close && /*#__PURE__*/_react.default.createElement("button", {
126
126
  className: "p-modal__close",
127
127
  "aria-label": "Close active modal",
128
128
  onClick: close
129
129
  }, "Close")), /*#__PURE__*/_react.default.createElement("div", {
130
- id: descriptionId.current
130
+ id: descriptionId
131
131
  }, children), !!buttonRow && /*#__PURE__*/_react.default.createElement("footer", {
132
132
  className: "p-modal__footer"
133
133
  }, buttonRow)));