@canonical/react-components 0.34.2 → 0.37.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 (78) hide show
  1. package/dist/components/Accordion/Accordion.js +1 -1
  2. package/dist/components/ActionButton/ActionButton.js +1 -1
  3. package/dist/components/ArticlePagination/ArticlePagination.js +1 -1
  4. package/dist/components/Button/Button.d.ts +1 -0
  5. package/dist/components/Button/Button.js +2 -1
  6. package/dist/components/Card/Card.js +1 -1
  7. package/dist/components/CheckableInput/CheckableInput.js +1 -1
  8. package/dist/components/CheckboxInput/CheckboxInput.js +1 -1
  9. package/dist/components/Chip/Chip.js +1 -1
  10. package/dist/components/Code/Code.js +1 -1
  11. package/dist/components/CodeSnippet/CodeSnippet.js +1 -1
  12. package/dist/components/CodeSnippet/CodeSnippetBlock.js +1 -1
  13. package/dist/components/CodeSnippet/CodeSnippetDropdown.js +1 -1
  14. package/dist/components/Col/Col.js +1 -1
  15. package/dist/components/ContextualMenu/ContextualMenu.js +1 -2
  16. package/dist/components/ContextualMenu/ContextualMenuDropdown/ContextualMenuDropdown.js +1 -1
  17. package/dist/components/Field/Field.d.ts +5 -1
  18. package/dist/components/Field/Field.js +6 -1
  19. package/dist/components/Form/Form.js +1 -1
  20. package/dist/components/Icon/Icon.js +1 -1
  21. package/dist/components/Input/Input.d.ts +5 -1
  22. package/dist/components/Input/Input.js +4 -2
  23. package/dist/components/Label/Label.js +1 -1
  24. package/dist/components/Link/Link.js +1 -1
  25. package/dist/components/List/List.js +28 -17
  26. package/dist/components/MainTable/MainTable.js +98 -79
  27. package/dist/components/Modal/Modal.js +1 -1
  28. package/dist/components/ModularTable/ModularTable.js +1 -1
  29. package/dist/components/Navigation/Navigation.d.ts +57 -0
  30. package/dist/components/Navigation/Navigation.js +266 -0
  31. package/dist/components/Navigation/NavigationLink/NavigationLink.d.ts +11 -0
  32. package/dist/components/Navigation/NavigationLink/NavigationLink.js +57 -0
  33. package/dist/components/Navigation/NavigationLink/index.d.ts +1 -0
  34. package/dist/components/Navigation/NavigationLink/index.js +15 -0
  35. package/dist/components/Navigation/NavigationMenu/NavigationMenu.d.ts +11 -0
  36. package/dist/components/Navigation/NavigationMenu/NavigationMenu.js +97 -0
  37. package/dist/components/Navigation/NavigationMenu/index.d.ts +1 -0
  38. package/dist/components/Navigation/NavigationMenu/index.js +15 -0
  39. package/dist/components/Navigation/index.d.ts +3 -0
  40. package/dist/components/Navigation/index.js +15 -0
  41. package/dist/components/Navigation/types.d.ts +57 -0
  42. package/dist/components/Navigation/types.js +5 -0
  43. package/dist/components/Notification/Notification.js +1 -1
  44. package/dist/components/PasswordToggle/PasswordToggle.js +1 -1
  45. package/dist/components/RadioInput/RadioInput.js +1 -1
  46. package/dist/components/Row/Row.js +1 -1
  47. package/dist/components/SearchAndFilter/SearchAndFilter.js +12 -16
  48. package/dist/components/SearchBox/SearchBox.d.ts +6 -5
  49. package/dist/components/SearchBox/SearchBox.js +22 -8
  50. package/dist/components/Select/Select.js +1 -1
  51. package/dist/components/Slider/Slider.js +1 -1
  52. package/dist/components/Spinner/Spinner.js +1 -1
  53. package/dist/components/StatusLabel/StatusLabel.d.ts +31 -0
  54. package/dist/components/StatusLabel/StatusLabel.js +51 -0
  55. package/dist/components/StatusLabel/index.d.ts +2 -0
  56. package/dist/components/StatusLabel/index.js +25 -0
  57. package/dist/components/Strip/Strip.js +1 -1
  58. package/dist/components/Switch/Switch.js +1 -1
  59. package/dist/components/Table/Table.js +1 -1
  60. package/dist/components/TableCell/TableCell.js +1 -1
  61. package/dist/components/TableHeader/TableHeader.js +1 -1
  62. package/dist/components/TableRow/TableRow.js +1 -1
  63. package/dist/components/Tabs/Tabs.js +1 -1
  64. package/dist/components/Textarea/Textarea.js +1 -1
  65. package/dist/components/Tooltip/Tooltip.js +30 -1
  66. package/dist/hooks/index.d.ts +5 -2
  67. package/dist/hooks/index.js +26 -2
  68. package/dist/hooks/useClickOutside.d.ts +7 -0
  69. package/dist/hooks/useClickOutside.js +41 -0
  70. package/dist/hooks/useOnEscapePressed.d.ts +4 -0
  71. package/dist/hooks/useOnEscapePressed.js +27 -0
  72. package/dist/hooks/usePagination.d.ts +19 -0
  73. package/dist/hooks/usePagination.js +74 -0
  74. package/dist/index.d.ts +6 -2
  75. package/dist/index.js +34 -0
  76. package/dist/types/index.d.ts +13 -0
  77. package/dist/types/index.js +49 -1
  78. package/package.json +44 -42
@@ -19,6 +19,8 @@ var _TableHeader = _interopRequireDefault(require("../TableHeader"));
19
19
 
20
20
  var _TableCell = _interopRequireDefault(require("../TableCell"));
21
21
 
22
+ var _hooks = require("../../hooks");
23
+
22
24
  var _excluded = ["content", "sortKey"],
23
25
  _excluded2 = ["columns", "expanded", "expandedContent", "key", "sortData"],
24
26
  _excluded3 = ["content"],
@@ -52,7 +54,7 @@ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToAr
52
54
 
53
55
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
54
56
 
55
- 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); }
57
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : 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); }
56
58
 
57
59
  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; }
58
60
 
@@ -92,7 +94,7 @@ var generateHeaders = function generateHeaders(currentSortKey, currentSortDirect
92
94
  return /*#__PURE__*/_react.default.createElement(_TableHeader.default, _extends({
93
95
  key: index,
94
96
  sort: sortDirection,
95
- onClick: sortable && updateSort.bind(_this, setSortKey, setSortDirection, sortKey, sortDirection)
97
+ onClick: sortable ? updateSort.bind(_this, setSortKey, setSortDirection, sortKey, sortDirection) : undefined
96
98
  }, props), content);
97
99
  }); // When there is expanding content then provide an extra hidden header to
98
100
  // account for the extra cell in the body rows.
@@ -102,10 +104,59 @@ var generateHeaders = function generateHeaders(currentSortKey, currentSortDirect
102
104
  })));
103
105
  };
104
106
 
105
- var generateRows = function generateRows(currentSortDirection, currentSortKey, emptyStateMsg, expanding, responsive, headers, paginate, rows, currentPage, setCurrentPage, sortable, sortFunction) {
106
- // If the table has no rows, return empty state message
107
- if (Object.entries(rows).length === 0 && emptyStateMsg) {
108
- return /*#__PURE__*/_react.default.createElement("caption", null, emptyStateMsg);
107
+ var generateRows = function generateRows(_ref2) {
108
+ var rows = _ref2.rows,
109
+ headers = _ref2.headers,
110
+ responsive = _ref2.responsive,
111
+ expanding = _ref2.expanding;
112
+ return rows.map(function (_ref3, index) {
113
+ var columns = _ref3.columns,
114
+ expanded = _ref3.expanded,
115
+ expandedContent = _ref3.expandedContent,
116
+ key = _ref3.key,
117
+ sortData = _ref3.sortData,
118
+ rowProps = _objectWithoutProperties(_ref3, _excluded2);
119
+
120
+ var cellItems = columns === null || columns === void 0 ? void 0 : columns.map(function (_ref4, index) {
121
+ var content = _ref4.content,
122
+ cellProps = _objectWithoutProperties(_ref4, _excluded3);
123
+
124
+ var headerContent = headers && headers[index]["content"];
125
+ var headerReplacement = headers && headers[index]["heading"];
126
+
127
+ if (responsive) {
128
+ cellProps["data-heading"] = typeof headerContent === "string" ? headerContent : headerReplacement;
129
+ }
130
+
131
+ return /*#__PURE__*/_react.default.createElement(_TableCell.default, _extends({
132
+ key: index
133
+ }, cellProps), content);
134
+ }); // if key was not provided as a prop, use row's index instead
135
+
136
+ if (key === null || typeof key === "undefined") {
137
+ key = index;
138
+ } // The expanding cell is alway created to match the correct number of
139
+ // table cells in rows that do have expanding content.
140
+
141
+
142
+ return /*#__PURE__*/_react.default.createElement(_TableRow.default, _extends({
143
+ key: key
144
+ }, rowProps), cellItems, expanding && /*#__PURE__*/_react.default.createElement(_TableCell.default, {
145
+ expanding: true,
146
+ hidden: !expanded
147
+ }, expandedContent));
148
+ });
149
+ };
150
+
151
+ var sortRows = function sortRows(_ref5) {
152
+ var currentSortDirection = _ref5.currentSortDirection,
153
+ currentSortKey = _ref5.currentSortKey,
154
+ rows = _ref5.rows,
155
+ sortable = _ref5.sortable,
156
+ sortFunction = _ref5.sortFunction;
157
+
158
+ if (!rows) {
159
+ return [];
109
160
  } // Clone the rows so we can restore the original order.
110
161
 
111
162
 
@@ -133,74 +184,23 @@ var generateRows = function generateRows(currentSortDirection, currentSortKey, e
133
184
  });
134
185
  }
135
186
 
136
- var slicedRows = sortedRows;
137
-
138
- if (paginate) {
139
- var startIndex = (currentPage - 1) * paginate;
140
-
141
- if (startIndex > rows.length) {
142
- // If the rows have changed e.g. when filtering and the user is on a page
143
- // that no longer exists then send them to the start.
144
- setCurrentPage(1);
145
- }
146
-
147
- slicedRows = sortedRows.slice(startIndex, startIndex + paginate);
148
- }
149
-
150
- var rowItems = slicedRows.map(function (_ref2, index) {
151
- var columns = _ref2.columns,
152
- expanded = _ref2.expanded,
153
- expandedContent = _ref2.expandedContent,
154
- key = _ref2.key,
155
- sortData = _ref2.sortData,
156
- rowProps = _objectWithoutProperties(_ref2, _excluded2);
157
-
158
- var cellItems = columns.map(function (_ref3, index) {
159
- var content = _ref3.content,
160
- cellProps = _objectWithoutProperties(_ref3, _excluded3);
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
-
169
- return /*#__PURE__*/_react.default.createElement(_TableCell.default, _extends({
170
- key: index
171
- }, cellProps), content);
172
- }); // if key was not provided as a prop, use row's index instead
173
-
174
- if (key === null || typeof key === "undefined") {
175
- key = index;
176
- } // The expanding cell is alway created to match the correct number of
177
- // table cells in rows that do have expanding content.
178
-
179
-
180
- return /*#__PURE__*/_react.default.createElement(_TableRow.default, _extends({
181
- key: key
182
- }, rowProps), cellItems, expanding && /*#__PURE__*/_react.default.createElement(_TableCell.default, {
183
- expanding: true,
184
- hidden: !expanded
185
- }, expandedContent));
186
- });
187
- return /*#__PURE__*/_react.default.createElement("tbody", null, rowItems);
187
+ return sortedRows;
188
188
  };
189
189
 
190
- var MainTable = function MainTable(_ref4) {
191
- var defaultSort = _ref4.defaultSort,
192
- defaultSortDirection = _ref4.defaultSortDirection,
193
- _ref4$emptyStateMsg = _ref4.emptyStateMsg,
194
- emptyStateMsg = _ref4$emptyStateMsg === void 0 ? "" : _ref4$emptyStateMsg,
195
- expanding = _ref4.expanding,
196
- headers = _ref4.headers,
197
- onUpdateSort = _ref4.onUpdateSort,
198
- paginate = _ref4.paginate,
199
- rows = _ref4.rows,
200
- responsive = _ref4.responsive,
201
- sortable = _ref4.sortable,
202
- sortFunction = _ref4.sortFunction,
203
- props = _objectWithoutProperties(_ref4, _excluded4);
190
+ var MainTable = function MainTable(_ref6) {
191
+ var defaultSort = _ref6.defaultSort,
192
+ defaultSortDirection = _ref6.defaultSortDirection,
193
+ _ref6$emptyStateMsg = _ref6.emptyStateMsg,
194
+ emptyStateMsg = _ref6$emptyStateMsg === void 0 ? "" : _ref6$emptyStateMsg,
195
+ expanding = _ref6.expanding,
196
+ headers = _ref6.headers,
197
+ onUpdateSort = _ref6.onUpdateSort,
198
+ paginate = _ref6.paginate,
199
+ rows = _ref6.rows,
200
+ responsive = _ref6.responsive,
201
+ sortable = _ref6.sortable,
202
+ sortFunction = _ref6.sortFunction,
203
+ props = _objectWithoutProperties(_ref6, _excluded4);
204
204
 
205
205
  var _useState = (0, _react.useState)(defaultSort),
206
206
  _useState2 = _slicedToArray(_useState, 2),
@@ -210,12 +210,7 @@ var MainTable = function MainTable(_ref4) {
210
210
  var _useState3 = (0, _react.useState)(defaultSortDirection),
211
211
  _useState4 = _slicedToArray(_useState3, 2),
212
212
  currentSortDirection = _useState4[0],
213
- setSortDirection = _useState4[1];
214
-
215
- var _useState5 = (0, _react.useState)(1),
216
- _useState6 = _slicedToArray(_useState5, 2),
217
- currentPage = _useState6[0],
218
- setCurrentPage = _useState6[1]; // Update the current sort state if the prop changes.
213
+ setSortDirection = _useState4[1]; // Update the current sort state if the prop changes.
219
214
 
220
215
 
221
216
  (0, _react.useEffect)(function () {
@@ -231,10 +226,34 @@ var MainTable = function MainTable(_ref4) {
231
226
  onUpdateSort && onUpdateSort(newSort);
232
227
  };
233
228
 
229
+ var sortedRows = (0, _react.useMemo)(function () {
230
+ return sortRows({
231
+ currentSortDirection: currentSortDirection,
232
+ currentSortKey: currentSortKey,
233
+ rows: rows,
234
+ sortable: sortable,
235
+ sortFunction: sortFunction
236
+ });
237
+ }, [currentSortDirection, currentSortKey, rows, sortable, sortFunction]);
238
+
239
+ var _usePagination = (0, _hooks.usePagination)(sortedRows, {
240
+ itemsPerPage: paginate,
241
+ autoResetPage: true
242
+ }),
243
+ finalRows = _usePagination.pageData,
244
+ currentPage = _usePagination.currentPage,
245
+ setCurrentPage = _usePagination.paginate;
246
+
234
247
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Table.default, _extends({
235
248
  expanding: expanding,
236
249
  responsive: responsive
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, {
250
+ }, props), !!headers && generateHeaders(currentSortKey, currentSortDirection, expanding, headers, sortable, updateSort, setSortDirection), // If the table has no rows, return empty state message
251
+ Object.entries(finalRows).length === 0 && emptyStateMsg ? /*#__PURE__*/_react.default.createElement("caption", null, emptyStateMsg) : /*#__PURE__*/_react.default.createElement("tbody", null, generateRows({
252
+ rows: finalRows,
253
+ headers: headers,
254
+ responsive: responsive,
255
+ expanding: expanding
256
+ }))), paginate && rows && rows.length > 0 && /*#__PURE__*/_react.default.createElement(_Pagination.default, {
238
257
  currentPage: currentPage,
239
258
  itemsPerPage: paginate,
240
259
  paginate: setCurrentPage,
@@ -21,7 +21,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
21
21
 
22
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
23
 
24
- 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); }
24
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : 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); }
25
25
 
26
26
  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; }
27
27
 
@@ -23,7 +23,7 @@ var _excluded = ["data", "columns", "emptyMsg", "footer", "getHeaderProps", "get
23
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); }
26
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : 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
27
 
28
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
29
 
@@ -0,0 +1,57 @@
1
+ import { ReactNode, HTMLProps } from "react";
2
+ import type { GenerateLink, NavItem, LogoProps } from "./types";
3
+ import { PropsWithSpread, SubComponentProps, Theme } from "../../types";
4
+ import { SearchBoxProps } from "../SearchBox";
5
+ export declare type Props = PropsWithSpread<{
6
+ /**
7
+ * By default the header is constrained to the width of the grid. Use this
8
+ * option to make the header take the full width of the page.
9
+ */
10
+ fullWidth?: boolean;
11
+ /**
12
+ * This function can be used to generate link elements when you don't want to
13
+ * use a standard HTML anchor.
14
+ */
15
+ generateLink?: GenerateLink | null;
16
+ /**
17
+ * The main navigation items that appear on the left hand side next to the logo.
18
+ */
19
+ items?: NavItem[] | null;
20
+ /**
21
+ * Additional navigation items that appear on the right hand side of the
22
+ * navigation banner.
23
+ */
24
+ itemsRight?: NavItem[] | null;
25
+ /**
26
+ * Additional props to be applied to the nav element that wraps the main
27
+ * navigation items on the left hand side.
28
+ */
29
+ leftNavProps?: HTMLProps<HTMLUListElement> | null;
30
+ /**
31
+ * The logo can be defined either by providing props for the standard logo
32
+ * or the full logo markup when a custom logo is needed.
33
+ */
34
+ logo: LogoProps | ReactNode;
35
+ /**
36
+ * Additional props to be applied to the nav element that wraps the
37
+ * left and right nav items.
38
+ */
39
+ navProps?: HTMLProps<HTMLElement> | null;
40
+ /**
41
+ * Additional props to be applied to the nav element that wraps the
42
+ * navigation items on the right hand side.
43
+ */
44
+ rightNavProps?: HTMLProps<HTMLUListElement> | null;
45
+ /**
46
+ * Props to pass to the SearchBox component. When these props are provided the
47
+ * search box will appear.
48
+ */
49
+ searchProps?: SubComponentProps<SearchBoxProps> | null;
50
+ /**
51
+ * The header theme. When this is not provided the header will use the default
52
+ * theme defined in the Vanilla settings.
53
+ */
54
+ theme?: Theme | null;
55
+ }, HTMLProps<HTMLElement>>;
56
+ declare const Navigation: ({ fullWidth, generateLink, items, itemsRight, leftNavProps, logo, navProps, rightNavProps, searchProps, theme, ...headerProps }: Props) => JSX.Element;
57
+ export default Navigation;
@@ -0,0 +1,266 @@
1
+ "use strict";
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
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+
10
+ var _react = _interopRequireWildcard(require("react"));
11
+
12
+ var _classnames = _interopRequireDefault(require("classnames"));
13
+
14
+ var _NavigationLink = _interopRequireDefault(require("./NavigationLink"));
15
+
16
+ var _NavigationMenu = _interopRequireDefault(require("./NavigationMenu"));
17
+
18
+ var _types = require("../../types");
19
+
20
+ var _SearchBox = _interopRequireDefault(require("../SearchBox"));
21
+
22
+ var _hooks = require("../../hooks");
23
+
24
+ var _excluded = ["url", "src", "title", "icon", "aria-current", "aria-label"],
25
+ _excluded2 = ["fullWidth", "generateLink", "items", "itemsRight", "leftNavProps", "logo", "navProps", "rightNavProps", "searchProps", "theme"];
26
+
27
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
28
+
29
+ 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); }
30
+
31
+ 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; }
32
+
33
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
34
+
35
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
36
+
37
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
38
+
39
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
40
+
41
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
42
+
43
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
44
+
45
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : 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); }
46
+
47
+ 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; }
48
+
49
+ 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; }
50
+
51
+ /**
52
+ * Narrow the type of the nav item to a NavMenu.
53
+ */
54
+ var isMenu = function isMenu(item) {
55
+ return "items" in item;
56
+ };
57
+ /**
58
+ * Narrow the type of the logo prop to LogoProps.
59
+ */
60
+
61
+
62
+ var isLogoProps = function isLogoProps(logo) {
63
+ return ! /*#__PURE__*/(0, _react.isValidElement)(logo);
64
+ };
65
+ /**
66
+ * Display the standard logo if the props were provided otherwise display the
67
+ * full element provided.
68
+ */
69
+
70
+
71
+ var generateLogo = function generateLogo(logo, generateLink) {
72
+ if (isLogoProps(logo)) {
73
+ var url = logo.url,
74
+ src = logo.src,
75
+ title = logo.title,
76
+ icon = logo.icon,
77
+ ariaCurrent = logo["aria-current"],
78
+ ariaLabel = logo["aria-label"],
79
+ logoProps = _objectWithoutProperties(logo, _excluded);
80
+
81
+ var content = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
82
+ className: "p-navigation__logo-tag"
83
+ }, icon !== null && icon !== void 0 ? icon : /*#__PURE__*/_react.default.createElement("img", {
84
+ className: "p-navigation__logo-icon",
85
+ src: src,
86
+ alt: ""
87
+ })), /*#__PURE__*/_react.default.createElement("span", {
88
+ className: "p-navigation__logo-title"
89
+ }, title));
90
+
91
+ return /*#__PURE__*/_react.default.createElement("div", _extends({
92
+ className: "p-navigation__tagged-logo"
93
+ }, logoProps), /*#__PURE__*/_react.default.createElement(_NavigationLink.default, {
94
+ className: "p-navigation__link",
95
+ url: url,
96
+ label: content,
97
+ "aria-label": ariaLabel,
98
+ generateLink: generateLink,
99
+ isSelected: !!ariaCurrent
100
+ }));
101
+ }
102
+
103
+ return /*#__PURE__*/_react.default.createElement("div", {
104
+ className: "p-navigation__logo"
105
+ }, logo);
106
+ };
107
+ /**
108
+ * Generate the JSX for a set of nav items. This will map the items to menus,
109
+ * links or generated components.
110
+ * @param items The nav items to map to elements.
111
+ * @param closeMobileMenu A function to close the mobile menu.
112
+ * @param generateLink The optional function used to generate link components.
113
+ * @returns A list of navigation item elements.
114
+ */
115
+
116
+
117
+ var generateItems = function generateItems(items, closeMobileMenu, generateLink) {
118
+ return items.map(function (item, i) {
119
+ return isMenu(item) ? /*#__PURE__*/_react.default.createElement(_NavigationMenu.default, _extends({}, item, {
120
+ generateLink: generateLink,
121
+ key: i
122
+ })) : /*#__PURE__*/_react.default.createElement("li", {
123
+ className: (0, _classnames.default)("p-navigation__item", {
124
+ "is-selected": item.isSelected
125
+ }),
126
+ key: i
127
+ }, /*#__PURE__*/_react.default.createElement(_NavigationLink.default, _extends({}, item, {
128
+ onClick: function onClick(evt) {
129
+ var _item$onClick;
130
+
131
+ (_item$onClick = item.onClick) === null || _item$onClick === void 0 ? void 0 : _item$onClick.call(item, evt);
132
+ closeMobileMenu();
133
+ },
134
+ generateLink: generateLink,
135
+ className: (0, _classnames.default)("p-navigation__link", item.className)
136
+ })));
137
+ });
138
+ };
139
+
140
+ var Navigation = function Navigation(_ref) {
141
+ var fullWidth = _ref.fullWidth,
142
+ generateLink = _ref.generateLink,
143
+ items = _ref.items,
144
+ itemsRight = _ref.itemsRight,
145
+ leftNavProps = _ref.leftNavProps,
146
+ logo = _ref.logo,
147
+ navProps = _ref.navProps,
148
+ rightNavProps = _ref.rightNavProps,
149
+ searchProps = _ref.searchProps,
150
+ theme = _ref.theme,
151
+ headerProps = _objectWithoutProperties(_ref, _excluded2);
152
+
153
+ var searchRef = (0, _react.useRef)();
154
+
155
+ var _useState = (0, _react.useState)(false),
156
+ _useState2 = _slicedToArray(_useState, 2),
157
+ mobileMenuOpen = _useState2[0],
158
+ setMobileMenuOpen = _useState2[1];
159
+
160
+ var _useState3 = (0, _react.useState)(false),
161
+ _useState4 = _slicedToArray(_useState3, 2),
162
+ searchOpen = _useState4[0],
163
+ setSearchOpen = _useState4[1]; // Display the search box if the props have been provided.
164
+
165
+
166
+ var hasSearch = !!searchProps; // Close the mobile menu when the search box is opened.
167
+
168
+ var toggleSearch = function toggleSearch(open) {
169
+ setSearchOpen(open !== null && open !== void 0 ? open : !searchOpen);
170
+ setMobileMenuOpen(false);
171
+ }; // Close the search box when the mobile menu is opened.
172
+
173
+
174
+ var toggleMobileMenu = function toggleMobileMenu() {
175
+ setMobileMenuOpen(!mobileMenuOpen);
176
+ setSearchOpen(false);
177
+ };
178
+
179
+ var closeMobileMenu = function closeMobileMenu() {
180
+ if (mobileMenuOpen) {
181
+ setMobileMenuOpen(false);
182
+ }
183
+ }; // Hide the searchbox when the escape key is pressed.
184
+
185
+
186
+ (0, _hooks.useOnEscapePressed)(function () {
187
+ return toggleSearch(false);
188
+ });
189
+ (0, _react.useEffect)(function () {
190
+ if (searchOpen) {
191
+ var _searchRef$current;
192
+
193
+ // Focus on the searchbox when it appears. This done in a useEffect so
194
+ // that the state change to display the searchbox has already occured and
195
+ // the input has been made visible.
196
+ (_searchRef$current = searchRef.current) === null || _searchRef$current === void 0 ? void 0 : _searchRef$current.focus();
197
+ }
198
+ }, [searchOpen]);
199
+ return /*#__PURE__*/_react.default.createElement("header", _extends({}, headerProps, {
200
+ className: (0, _classnames.default)("p-navigation", headerProps.className, {
201
+ "has-menu-open": mobileMenuOpen,
202
+ "has-search-open": searchOpen,
203
+ "is-dark": theme === _types.Theme.DARK,
204
+ "is-light": theme === _types.Theme.LIGHT
205
+ })
206
+ }), /*#__PURE__*/_react.default.createElement("div", {
207
+ className: fullWidth ? "p-navigation__row--full-width" : "p-navigation__row"
208
+ }, /*#__PURE__*/_react.default.createElement("div", {
209
+ className: "p-navigation__banner"
210
+ }, generateLogo(logo, generateLink), /*#__PURE__*/_react.default.createElement("ul", {
211
+ className: "p-navigation__items"
212
+ }, // When the header has a search box then this button is used to
213
+ // toggle the search box at mobile size.
214
+ hasSearch ? /*#__PURE__*/_react.default.createElement("li", {
215
+ className: "p-navigation__item"
216
+ }, /*#__PURE__*/_react.default.createElement("button", {
217
+ "aria-label": "Search",
218
+ className: "p-navigation__link--search-toggle",
219
+ onClick: function onClick() {
220
+ return toggleSearch();
221
+ }
222
+ }, /*#__PURE__*/_react.default.createElement("span", {
223
+ className: "p-navigation__search-label"
224
+ }, "Search"))) : null, /*#__PURE__*/_react.default.createElement("li", {
225
+ className: "p-navigation__item"
226
+ }, /*#__PURE__*/_react.default.createElement("button", {
227
+ "aria-pressed": mobileMenuOpen,
228
+ className: "p-navigation__link",
229
+ onClick: toggleMobileMenu
230
+ }, mobileMenuOpen ? "Close menu" : "Menu")))), /*#__PURE__*/_react.default.createElement("nav", _extends({
231
+ className: "p-navigation__nav"
232
+ }, navProps), /*#__PURE__*/_react.default.createElement("ul", _extends({
233
+ className: "p-navigation__items"
234
+ }, leftNavProps), items ? generateItems(items, closeMobileMenu, generateLink) : null), itemsRight || hasSearch ? /*#__PURE__*/_react.default.createElement("ul", _extends({
235
+ className: "p-navigation__items"
236
+ }, rightNavProps), itemsRight ? generateItems(itemsRight, closeMobileMenu, generateLink) : null, // When the header has a search box then this button is used to
237
+ // toggle the search box at non-mobile size.
238
+ hasSearch ? /*#__PURE__*/_react.default.createElement("li", {
239
+ className: "p-navigation__item"
240
+ }, /*#__PURE__*/_react.default.createElement("button", {
241
+ "aria-label": "Search",
242
+ className: "p-navigation__link--search-toggle",
243
+ onClick: function onClick() {
244
+ return toggleSearch();
245
+ }
246
+ }, /*#__PURE__*/_react.default.createElement("span", {
247
+ className: "p-navigation__search-label"
248
+ }, "Search"))) : null) : null, // When the header has a search box and the user has opened the search
249
+ // form then this search box is displayed.
250
+ hasSearch ? /*#__PURE__*/_react.default.createElement("div", {
251
+ className: "p-navigation__search",
252
+ "aria-hidden": !searchOpen
253
+ }, /*#__PURE__*/_react.default.createElement(_SearchBox.default, {
254
+ ref: searchRef
255
+ })) : null)), // When the header has a search box and the user has opened the search
256
+ // form then this element is overlayed over the whole page.
257
+ hasSearch ? /*#__PURE__*/_react.default.createElement("div", {
258
+ className: "p-navigation__search-overlay",
259
+ onClick: function onClick() {
260
+ return setSearchOpen(false);
261
+ }
262
+ }) : null);
263
+ };
264
+
265
+ var _default = Navigation;
266
+ exports.default = _default;
@@ -0,0 +1,11 @@
1
+ import type { HTMLProps } from "react";
2
+ import { PropsWithSpread } from "../../../types";
3
+ import type { GenerateLink, NavLink } from "../types";
4
+ declare type Props = PropsWithSpread<NavLink & {
5
+ generateLink?: GenerateLink;
6
+ }, HTMLProps<HTMLAnchorElement>>;
7
+ /**
8
+ * This component is used internally to display links inside the Navigation component.
9
+ */
10
+ declare const NavigationLink: ({ generateLink, isSelected, label, url, ...props }: Props) => JSX.Element;
11
+ export default NavigationLink;
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _excluded = ["generateLink", "isSelected", "label", "url"];
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+
14
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : 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 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; }
17
+
18
+ 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; }
19
+
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; }
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
+
26
+ /**
27
+ * This component is used internally to display links inside the Navigation component.
28
+ */
29
+ var NavigationLink = function NavigationLink(_ref) {
30
+ var generateLink = _ref.generateLink,
31
+ isSelected = _ref.isSelected,
32
+ label = _ref.label,
33
+ url = _ref.url,
34
+ props = _objectWithoutProperties(_ref, _excluded);
35
+
36
+ var ariaCurrent = isSelected ? "page" : undefined;
37
+
38
+ if (generateLink) {
39
+ // If a function has been provided then use it to generate the link element.
40
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, generateLink(_objectSpread({
41
+ isSelected: isSelected,
42
+ label: label,
43
+ url: url,
44
+ "aria-current": ariaCurrent
45
+ }, props)));
46
+ } else {
47
+ // If a function has not been provided then use a standard anchor element.
48
+ return /*#__PURE__*/_react.default.createElement("a", _extends({
49
+ href: url
50
+ }, props, {
51
+ "aria-current": ariaCurrent
52
+ }), label);
53
+ }
54
+ };
55
+
56
+ var _default = NavigationLink;
57
+ exports.default = _default;
@@ -0,0 +1 @@
1
+ export { default } from "./NavigationLink";