@canonical/react-components 0.31.0 → 0.32.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.
@@ -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
 
@@ -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,
@@ -49,31 +49,35 @@ var Input = function Input(_ref) {
49
49
 
50
50
  var inputRef = (0, _react.useRef)(null);
51
51
  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),
55
- id: id,
56
- ref: inputRef,
57
- required: required,
58
- type: type,
59
- "aria-invalid": !!error
60
- }, inputProps));
61
-
62
52
  (0, _react.useEffect)(function () {
63
53
  if (takeFocus) {
64
54
  inputRef.current.focus();
65
55
  }
66
56
  }, [takeFocus]);
57
+ var input;
67
58
 
68
59
  if (type === "checkbox") {
69
60
  input = /*#__PURE__*/_react.default.createElement(_CheckboxInput.default, _extends({
61
+ id: id,
70
62
  label: label,
71
- id: id
63
+ labelClassName: labelClassName,
64
+ required: required
72
65
  }, inputProps));
73
66
  } else if (type === "radio") {
74
67
  input = /*#__PURE__*/_react.default.createElement(_RadioInput.default, _extends({
68
+ id: id,
75
69
  label: label,
76
- id: id
70
+ labelClassName: labelClassName,
71
+ required: required
72
+ }, inputProps));
73
+ } else {
74
+ input = /*#__PURE__*/_react.default.createElement("input", _extends({
75
+ className: (0, _classnames.default)("p-form-validation__input", className),
76
+ id: id,
77
+ ref: inputRef,
78
+ required: required,
79
+ type: type,
80
+ "aria-invalid": !!error
77
81
  }, inputProps));
78
82
  }
79
83
 
@@ -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)));
@@ -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 ? 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 }; }
@@ -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";
package/dist/index.js CHANGED
@@ -233,6 +233,12 @@ Object.defineProperty(exports, "SummaryButton", {
233
233
  return _SummaryButton.default;
234
234
  }
235
235
  });
236
+ Object.defineProperty(exports, "Switch", {
237
+ enumerable: true,
238
+ get: function get() {
239
+ return _Switch.default;
240
+ }
241
+ });
236
242
  Object.defineProperty(exports, "Table", {
237
243
  enumerable: true,
238
244
  get: function get() {
@@ -275,6 +281,36 @@ Object.defineProperty(exports, "Tooltip", {
275
281
  return _Tooltip.default;
276
282
  }
277
283
  });
284
+ Object.defineProperty(exports, "useId", {
285
+ enumerable: true,
286
+ get: function get() {
287
+ return _hooks.useId;
288
+ }
289
+ });
290
+ Object.defineProperty(exports, "useListener", {
291
+ enumerable: true,
292
+ get: function get() {
293
+ return _hooks.useListener;
294
+ }
295
+ });
296
+ Object.defineProperty(exports, "usePrevious", {
297
+ enumerable: true,
298
+ get: function get() {
299
+ return _hooks.usePrevious;
300
+ }
301
+ });
302
+ Object.defineProperty(exports, "useThrottle", {
303
+ enumerable: true,
304
+ get: function get() {
305
+ return _hooks.useThrottle;
306
+ }
307
+ });
308
+ Object.defineProperty(exports, "useWindowFitment", {
309
+ enumerable: true,
310
+ get: function get() {
311
+ return _hooks.useWindowFitment;
312
+ }
313
+ });
278
314
 
279
315
  var _Accordion = _interopRequireDefault(require("./components/Accordion"));
280
316
 
@@ -338,6 +374,8 @@ var _Select = _interopRequireDefault(require("./components/Select"));
338
374
 
339
375
  var _Slider = _interopRequireDefault(require("./components/Slider"));
340
376
 
377
+ var _Switch = _interopRequireDefault(require("./components/Switch"));
378
+
341
379
  var _Spinner = _interopRequireDefault(require("./components/Spinner"));
342
380
 
343
381
  var _Strip = _interopRequireDefault(require("./components/Strip"));
@@ -358,6 +396,8 @@ var _Textarea = _interopRequireDefault(require("./components/Textarea"));
358
396
 
359
397
  var _Tooltip = _interopRequireDefault(require("./components/Tooltip"));
360
398
 
399
+ var _hooks = require("./hooks");
400
+
361
401
  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); }
362
402
 
363
403
  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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canonical/react-components",
3
- "version": "0.31.0",
3
+ "version": "0.32.0",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.js",
6
6
  "author": "Huw Wilkins <huw.wilkins@canonical.com>",
@@ -35,6 +35,8 @@
35
35
  "@storybook/theming": "6.4.18",
36
36
  "@testing-library/cypress": "8.0.2",
37
37
  "@testing-library/dom": "8.11.3",
38
+ "@testing-library/jest-dom": "5.16.2",
39
+ "@testing-library/react": "12.1.2",
38
40
  "@testing-library/react-hooks": "7.0.2",
39
41
  "@testing-library/user-event": "13.5.0",
40
42
  "@typescript-eslint/eslint-plugin": "5.10.2",
@@ -61,6 +63,7 @@
61
63
  "eslint-plugin-prettier": "4.0.0",
62
64
  "eslint-plugin-react": "7.28.0",
63
65
  "eslint-plugin-react-hooks": "4.3.0",
66
+ "eslint-plugin-testing-library": "5.0.5",
64
67
  "jest": "27.4.7",
65
68
  "npm-package-json-lint": "5.4.2",
66
69
  "prettier": "2.5.1",
@@ -78,7 +81,7 @@
78
81
  "ts-jest": "27.1.3",
79
82
  "tsc-alias": "1.5.0",
80
83
  "typescript": "4.5.5",
81
- "vanilla-framework": "3.1.0",
84
+ "vanilla-framework": "3.1.1",
82
85
  "wait-on": "5.3.0"
83
86
  },
84
87
  "dependencies": {
@@ -99,7 +102,7 @@
99
102
  "peerDependencies": {
100
103
  "react": "17.0.2",
101
104
  "react-dom": "17.0.2",
102
- "vanilla-framework": "3.1.0"
105
+ "vanilla-framework": "3.1.1"
103
106
  },
104
107
  "scripts": {
105
108
  "build": "rm -rf dist && yarn build-local; yarn build-declaration",
@@ -151,10 +154,10 @@
151
154
  "snapshotSerializers": [
152
155
  "enzyme-to-json/serializer"
153
156
  ],
154
- "setupFiles": [
157
+ "setupFilesAfterEnv": [
155
158
  "<rootDir>/src/setupTests.js"
156
159
  ],
157
- "testEnvironment": "jsdom",
160
+ "testEnvironment": "jest-environment-jsdom",
158
161
  "moduleDirectories": [
159
162
  "node_modules",
160
163
  "src"