@telus-uds/components-web 1.10.0 → 1.12.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 (110) hide show
  1. package/CHANGELOG.md +47 -2
  2. package/lib/Breadcrumbs/Item/Item.js +31 -6
  3. package/lib/Callout/Callout.js +24 -3
  4. package/lib/DatePicker/CalendarContainer.js +60 -71
  5. package/lib/DatePicker/DatePicker.js +66 -22
  6. package/lib/Disclaimer/Disclaimer.js +72 -0
  7. package/lib/Disclaimer/index.js +15 -0
  8. package/lib/Footnote/Footnote.js +3 -4
  9. package/lib/Footnote/FootnoteLink.js +11 -13
  10. package/lib/List/List.js +11 -0
  11. package/lib/List/ListItem.js +48 -0
  12. package/lib/List/index.js +16 -0
  13. package/lib/NavigationBar/NavigationBar.js +231 -0
  14. package/lib/NavigationBar/NavigationItem.js +111 -0
  15. package/lib/NavigationBar/NavigationSubMenu.js +179 -0
  16. package/lib/NavigationBar/collapseItems.js +51 -0
  17. package/lib/NavigationBar/index.js +13 -0
  18. package/lib/PriceLockup/PriceLockup.js +60 -23
  19. package/lib/PriceLockup/tokens.js +49 -116
  20. package/lib/Progress/ProgressBar.js +100 -0
  21. package/lib/Progress/index.js +16 -0
  22. package/lib/Ribbon/Ribbon.js +53 -32
  23. package/lib/SkeletonProvider/SkeletonImage.js +55 -0
  24. package/lib/SkeletonProvider/SkeletonProvider.js +84 -0
  25. package/lib/SkeletonProvider/SkeletonTypography.js +54 -0
  26. package/lib/SkeletonProvider/index.js +13 -0
  27. package/lib/Spinner/Spinner.js +18 -14
  28. package/lib/Table/Cell.js +15 -1
  29. package/lib/Table/Table.js +14 -5
  30. package/lib/Toast/Toast.js +1 -1
  31. package/lib/VideoPicker/VideoPicker.js +177 -0
  32. package/lib/VideoPicker/VideoPickerPlayer.js +54 -0
  33. package/lib/VideoPicker/VideoPickerThumbnail.js +201 -0
  34. package/lib/VideoPicker/VideoSlider.js +100 -0
  35. package/lib/VideoPicker/index.js +13 -0
  36. package/lib/VideoPicker/videoPropType.js +25 -0
  37. package/lib/index.js +55 -1
  38. package/lib-module/Breadcrumbs/Item/Item.js +32 -7
  39. package/lib-module/Callout/Callout.js +24 -3
  40. package/lib-module/DatePicker/CalendarContainer.js +61 -72
  41. package/lib-module/DatePicker/DatePicker.js +67 -23
  42. package/lib-module/Disclaimer/Disclaimer.js +54 -0
  43. package/lib-module/Disclaimer/index.js +1 -0
  44. package/lib-module/Footnote/Footnote.js +3 -3
  45. package/lib-module/Footnote/FootnoteLink.js +12 -14
  46. package/lib-module/List/List.js +2 -0
  47. package/lib-module/List/ListItem.js +31 -0
  48. package/lib-module/List/index.js +4 -0
  49. package/lib-module/NavigationBar/NavigationBar.js +207 -0
  50. package/lib-module/NavigationBar/NavigationItem.js +87 -0
  51. package/lib-module/NavigationBar/NavigationSubMenu.js +161 -0
  52. package/lib-module/NavigationBar/collapseItems.js +43 -0
  53. package/lib-module/NavigationBar/index.js +2 -0
  54. package/lib-module/PriceLockup/PriceLockup.js +62 -25
  55. package/lib-module/PriceLockup/tokens.js +54 -119
  56. package/lib-module/Progress/ProgressBar.js +83 -0
  57. package/lib-module/Progress/index.js +4 -0
  58. package/lib-module/Ribbon/Ribbon.js +53 -32
  59. package/lib-module/SkeletonProvider/SkeletonImage.js +42 -0
  60. package/lib-module/SkeletonProvider/SkeletonProvider.js +65 -0
  61. package/lib-module/SkeletonProvider/SkeletonTypography.js +41 -0
  62. package/lib-module/SkeletonProvider/index.js +2 -0
  63. package/lib-module/Spinner/Spinner.js +17 -14
  64. package/lib-module/Table/Cell.js +15 -1
  65. package/lib-module/Table/Table.js +14 -5
  66. package/lib-module/Toast/Toast.js +1 -1
  67. package/lib-module/VideoPicker/VideoPicker.js +151 -0
  68. package/lib-module/VideoPicker/VideoPickerPlayer.js +41 -0
  69. package/lib-module/VideoPicker/VideoPickerThumbnail.js +180 -0
  70. package/lib-module/VideoPicker/VideoSlider.js +83 -0
  71. package/lib-module/VideoPicker/index.js +2 -0
  72. package/lib-module/VideoPicker/videoPropType.js +9 -0
  73. package/lib-module/index.js +6 -0
  74. package/package.json +3 -3
  75. package/src/Breadcrumbs/Item/Item.jsx +18 -4
  76. package/src/Callout/Callout.jsx +27 -3
  77. package/src/DatePicker/CalendarContainer.jsx +61 -71
  78. package/src/DatePicker/DatePicker.jsx +47 -19
  79. package/src/Disclaimer/Disclaimer.jsx +39 -0
  80. package/src/Disclaimer/index.js +1 -0
  81. package/src/Footnote/Footnote.jsx +3 -3
  82. package/src/Footnote/FootnoteLink.jsx +28 -18
  83. package/src/List/List.jsx +3 -0
  84. package/src/List/ListItem.jsx +21 -0
  85. package/src/List/index.js +6 -0
  86. package/src/NavigationBar/NavigationBar.jsx +217 -0
  87. package/src/NavigationBar/NavigationItem.jsx +83 -0
  88. package/src/NavigationBar/NavigationSubMenu.jsx +121 -0
  89. package/src/NavigationBar/collapseItems.js +29 -0
  90. package/src/NavigationBar/index.js +3 -0
  91. package/src/PriceLockup/PriceLockup.jsx +58 -26
  92. package/src/PriceLockup/tokens.js +34 -54
  93. package/src/Progress/ProgressBar.jsx +67 -0
  94. package/src/Progress/index.js +6 -0
  95. package/src/Ribbon/Ribbon.jsx +21 -9
  96. package/src/SkeletonProvider/SkeletonImage.jsx +33 -0
  97. package/src/SkeletonProvider/SkeletonProvider.jsx +62 -0
  98. package/src/SkeletonProvider/SkeletonTypography.jsx +31 -0
  99. package/src/SkeletonProvider/index.js +3 -0
  100. package/src/Spinner/Spinner.jsx +20 -17
  101. package/src/Table/Cell.jsx +22 -5
  102. package/src/Table/Table.jsx +7 -4
  103. package/src/Toast/Toast.jsx +1 -0
  104. package/src/VideoPicker/VideoPicker.jsx +144 -0
  105. package/src/VideoPicker/VideoPickerPlayer.jsx +21 -0
  106. package/src/VideoPicker/VideoPickerThumbnail.jsx +182 -0
  107. package/src/VideoPicker/VideoSlider.jsx +85 -0
  108. package/src/VideoPicker/index.js +3 -0
  109. package/src/VideoPicker/videoPropType.js +12 -0
  110. package/src/index.js +6 -0
@@ -13,8 +13,6 @@ var _styledComponents = _interopRequireWildcard(require("styled-components"));
13
13
 
14
14
  var _componentsBase = require("@telus-uds/components-base");
15
15
 
16
- var _Close = _interopRequireDefault(require("../../__fixtures__/icons/Close"));
17
-
18
16
  var _OrderedListBase = _interopRequireDefault(require("../OrderedList/OrderedListBase"));
19
17
 
20
18
  var _utils = require("../utils");
@@ -312,7 +310,8 @@ const Footnote = props => {
312
310
  closeButtonMarginRight,
313
311
  closeButtonMarginBottom,
314
312
  closeButtonWidth,
315
- closeButtonIconSize
313
+ closeButtonIconSize,
314
+ closeIcon
316
315
  } = (0, _componentsBase.useThemeTokens)('Footnote', tokens, variant);
317
316
  const footnoteRef = (0, _react.useRef)(null);
318
317
  const headerRef = (0, _react.useRef)(null);
@@ -528,7 +527,7 @@ const Footnote = props => {
528
527
  },
529
528
  "aria-label": getCopy('close'),
530
529
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_componentsBase.Icon, {
531
- icon: _Close.default,
530
+ icon: closeIcon,
532
531
  tokens: {
533
532
  size: `${closeButtonIconSize}px`
534
533
  }
@@ -28,22 +28,26 @@ const StyledSup = /*#__PURE__*/_styledComponents.default.sup.withConfig({
28
28
  componentId: "components-web__sc-17nd7xo-0"
29
29
  })(_ref => {
30
30
  let {
31
- fontSize = 'smaller',
31
+ fontSize,
32
32
  lineHeight,
33
33
  paddingLeft,
34
- paddingRight
34
+ paddingRight,
35
+ ...fontNameAndWeight
35
36
  } = _ref;
36
37
  return {
37
38
  border: 0,
38
39
  color: 'inherit',
39
40
  cursor: 'pointer',
40
- fontSize,
41
+ // we want to fallback on 'smaller' but have a valid size when a custom font size is provided.
42
+ fontSize: fontSize ? `${fontSize}px` : 'smaller',
41
43
  lineHeight,
42
44
  margin: 0,
43
45
  paddingVertical: 0,
44
46
  paddingLeft,
45
47
  paddingRight,
46
- textDecoration: 'underline'
48
+ textDecoration: 'underline',
49
+ // apply font family
50
+ ...(0, _componentsBase.applyTextStyles)(fontNameAndWeight)
47
51
  };
48
52
  });
49
53
  /**
@@ -67,11 +71,7 @@ const FootnoteLink = _ref2 => {
67
71
  variant = {},
68
72
  ...rest
69
73
  } = _ref2;
70
- const {
71
- lineHeight,
72
- paddingLeft,
73
- paddingRight
74
- } = (0, _componentsBase.useThemeTokens)('FootnoteLink', tokens, variant);
74
+ const themeTokens = (0, _componentsBase.useThemeTokens)('FootnoteLink', tokens, variant);
75
75
  const numbers = Array.isArray(number) ? number : [number];
76
76
  const refs = numbers.map(() => /*#__PURE__*/_react.default.createRef());
77
77
 
@@ -103,11 +103,9 @@ const FootnoteLink = _ref2 => {
103
103
  "aria-label": getCopy('a11yLabel'),
104
104
  ref: refs[index],
105
105
  onClick: event => handleOnClick(event, index),
106
- fontSize: fontSize,
107
- lineHeight: lineHeight,
108
- paddingLeft: paddingLeft,
109
- paddingRight: paddingRight,
110
106
  ...selectProps(rest),
107
+ ...themeTokens,
108
+ fontSize: fontSize,
111
109
  children: `${num}${index !== numbers.length - 1 ? ',' : ''}`
112
110
  }, num))
113
111
  });
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _componentsBase = require("@telus-uds/components-base");
9
+
10
+ var _default = _componentsBase.ListBase;
11
+ exports.default = _default;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+
12
+ var _componentsBase = require("@telus-uds/components-base");
13
+
14
+ var _jsxRuntime = require("react/jsx-runtime");
15
+
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+
18
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
19
+
20
+ 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; }
21
+
22
+ const ListItem = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
23
+ let {
24
+ children,
25
+ title,
26
+ ...rest
27
+ } = _ref;
28
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_componentsBase.ListItem, {
29
+ ref: ref,
30
+ ...rest,
31
+ children: [Boolean(title) && /*#__PURE__*/(0, _jsxRuntime.jsx)(_componentsBase.Typography, {
32
+ variant: {
33
+ size: 'h4'
34
+ },
35
+ children: title
36
+ }), children]
37
+ });
38
+ });
39
+ ListItem.displayName = 'ListItem';
40
+ ListItem.propTypes = {
41
+ children: _propTypes.default.node.isRequired,
42
+ title: _propTypes.default.string
43
+ };
44
+ ListItem.defaultProps = {
45
+ title: undefined
46
+ };
47
+ var _default = ListItem;
48
+ exports.default = _default;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _List = _interopRequireDefault(require("./List"));
9
+
10
+ var _ListItem = _interopRequireDefault(require("./ListItem"));
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+
14
+ _List.default.Item = _ListItem.default;
15
+ var _default = _List.default;
16
+ exports.default = _default;
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+
12
+ var _componentsBase = require("@telus-uds/components-base");
13
+
14
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
15
+
16
+ var _utils = require("../utils");
17
+
18
+ var _NavigationItem = _interopRequireDefault(require("./NavigationItem"));
19
+
20
+ var _NavigationSubMenu = _interopRequireDefault(require("./NavigationSubMenu"));
21
+
22
+ var _collapseItems = _interopRequireDefault(require("./collapseItems"));
23
+
24
+ var _jsxRuntime = require("react/jsx-runtime");
25
+
26
+ var _withLinkRouter$propT, _withLinkRouter$propT2, _withLinkRouter$propT3, _withLinkRouter$propT4;
27
+
28
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
+
30
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
31
+
32
+ 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; }
33
+
34
+ const [selectProps, selectedSystemPropTypes] = (0, _componentsBase.selectSystemProps)([_utils.htmlAttrs]);
35
+
36
+ const Heading = /*#__PURE__*/_styledComponents.default.div.withConfig({
37
+ displayName: "NavigationBar__Heading",
38
+ componentId: "components-web__sc-1vis1gt-0"
39
+ })({
40
+ alignItems: 'center',
41
+ display: 'flex',
42
+ flex: 1,
43
+ justifyContent: 'flex-start',
44
+ '> *': {
45
+ display: 'contents',
46
+ letterSpacing: 0
47
+ }
48
+ });
49
+ /**
50
+ * NavigationBar can be used to allow customers to consistently navigate across
51
+ * key pages within a specific product line
52
+ */
53
+
54
+
55
+ const NavigationBar = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
56
+ let {
57
+ accessibilityRole = 'navigation',
58
+ heading,
59
+ headingLevel = 'h1',
60
+ items,
61
+ onChange = () => {},
62
+ selectedId,
63
+ LinkRouter,
64
+ linkRouterProps,
65
+ ...rest
66
+ } = _ref;
67
+ const direction = (0, _componentsBase.useResponsiveProp)({
68
+ xs: 'column',
69
+ sm: 'row'
70
+ });
71
+ const itemsForViewport = (0, _componentsBase.useResponsiveProp)({
72
+ xs: (0, _collapseItems.default)(items, selectedId),
73
+ lg: items
74
+ });
75
+ const openOverlayRef = (0, _react.useRef)(null);
76
+ const [openSubMenuId, setOpenSubMenuId] = (0, _react.useState)(null);
77
+
78
+ const handleSubMenuClose = event => {
79
+ var _openOverlayRef$curre, _openOverlayRef$curre2;
80
+
81
+ if (event.type === 'keydown') {
82
+ if (event.key === 'Escape' || event.key === 27) {
83
+ setOpenSubMenuId(null);
84
+ }
85
+ } else if (event.type === 'click' && openOverlayRef !== null && openOverlayRef !== void 0 && openOverlayRef.current && event.target && !(openOverlayRef !== null && openOverlayRef !== void 0 && (_openOverlayRef$curre = openOverlayRef.current) !== null && _openOverlayRef$curre !== void 0 && _openOverlayRef$curre.contains(event.target))) {
86
+ setOpenSubMenuId(null);
87
+ } else if (event.type === 'touchstart' && openOverlayRef !== null && openOverlayRef !== void 0 && openOverlayRef.current && event.touches[0].target && !(openOverlayRef !== null && openOverlayRef !== void 0 && (_openOverlayRef$curre2 = openOverlayRef.current) !== null && _openOverlayRef$curre2 !== void 0 && _openOverlayRef$curre2.contains(event.touches[0].target))) {
88
+ setOpenSubMenuId(null);
89
+ }
90
+ }; // Add listeners for mouse clicks outside and for ESCAPE key presses
91
+ // TODO: create a custom hook for that and use here and in the Footnote
92
+
93
+
94
+ (0, _react.useEffect)(() => {
95
+ if (openSubMenuId !== null) {
96
+ window.addEventListener('click', handleSubMenuClose);
97
+ window.addEventListener('keydown', handleSubMenuClose);
98
+ window.addEventListener('touchstart', handleSubMenuClose);
99
+ }
100
+
101
+ return () => {
102
+ if (openSubMenuId !== null) {
103
+ window.removeEventListener('click', handleSubMenuClose);
104
+ window.removeEventListener('keydown', handleSubMenuClose);
105
+ window.removeEventListener('touchstart', handleSubMenuClose);
106
+ }
107
+ };
108
+ }, [openSubMenuId]);
109
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_componentsBase.StackView, {
110
+ accessibilityRole: accessibilityRole,
111
+ direction: direction,
112
+ ref: ref,
113
+ space: 2,
114
+ tokens: {
115
+ alignItems: direction === 'column' ? 'flex-start' : 'center',
116
+ justifyContent: 'flex-end'
117
+ },
118
+ ...selectProps(rest),
119
+ children: [heading && /*#__PURE__*/(0, _jsxRuntime.jsx)(Heading, {
120
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_componentsBase.Typography, {
121
+ variant: {
122
+ size: 'h5'
123
+ },
124
+ heading: headingLevel,
125
+ children: heading
126
+ })
127
+ }), itemsForViewport === null || itemsForViewport === void 0 ? void 0 : itemsForViewport.map((_ref2, index) => {
128
+ let {
129
+ href,
130
+ label,
131
+ id,
132
+ onClick,
133
+ ref: itemRef,
134
+ LinkRouter: ItemLinkRouter = LinkRouter,
135
+ linkRouterProps: itemLinkRouterProps,
136
+ items: nestedItems,
137
+ ...itemRest
138
+ } = _ref2;
139
+ const itemId = id ?? label;
140
+
141
+ const handleClick = event => {
142
+ if (nestedItems) {
143
+ setOpenSubMenuId(openSubMenuId !== itemId ? itemId : null);
144
+ }
145
+
146
+ onClick === null || onClick === void 0 ? void 0 : onClick(event);
147
+ onChange === null || onChange === void 0 ? void 0 : onChange(itemId, event);
148
+ };
149
+
150
+ const ItemComponent = nestedItems ? _NavigationSubMenu.default : _NavigationItem.default;
151
+ const isOpen = itemId === openSubMenuId;
152
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(ItemComponent, {
153
+ ref: itemRef,
154
+ href: href,
155
+ onClick: handleClick // TODO: refactor to pass selected ID via context
156
+ ,
157
+ selectedId: selectedId,
158
+ index: index,
159
+ LinkRouter: ItemLinkRouter,
160
+ linkRouterProps: { ...linkRouterProps,
161
+ ...itemLinkRouterProps
162
+ },
163
+ items: nestedItems,
164
+ selected: itemId === selectedId,
165
+ ...itemRest,
166
+ ...(nestedItems && {
167
+ isOpen
168
+ }),
169
+ ...(nestedItems && isOpen && {
170
+ openOverlayRef
171
+ }),
172
+ children: label
173
+ }, itemId);
174
+ })]
175
+ });
176
+ });
177
+ NavigationBar.displayName = 'NavigationBar';
178
+ NavigationBar.propTypes = { ...selectedSystemPropTypes,
179
+ ..._componentsBase.withLinkRouter.propTypes,
180
+
181
+ /**
182
+ * NavigationBar pages
183
+ *
184
+ * Each `item` object must contain:
185
+ * - `heading` - user-facing text in the tab link
186
+ * - `href` - the URL of the page linked to. Do not use hash links, for content within a page, use `Tabs`.
187
+ * - `id` - a stable, unique identifier of the page within the set. Not written into the HTML.
188
+ */
189
+ items: _propTypes.default.arrayOf(_propTypes.default.shape({
190
+ label: _propTypes.default.string.isRequired,
191
+ href: _propTypes.default.string,
192
+ id: _propTypes.default.string.isRequired,
193
+ onClick: _propTypes.default.func,
194
+ selected: _propTypes.default.bool,
195
+ LinkRouter: (_withLinkRouter$propT = _componentsBase.withLinkRouter.propTypes) === null || _withLinkRouter$propT === void 0 ? void 0 : _withLinkRouter$propT.LinkRouter,
196
+ linkRouterProps: (_withLinkRouter$propT2 = _componentsBase.withLinkRouter.propTypes) === null || _withLinkRouter$propT2 === void 0 ? void 0 : _withLinkRouter$propT2.linkRouterProps,
197
+ // One layer of nested links is allowed
198
+ items: _propTypes.default.arrayOf(_propTypes.default.shape({
199
+ label: _propTypes.default.string.isRequired,
200
+ href: _propTypes.default.string,
201
+ id: _propTypes.default.string.isRequired,
202
+ onClick: _propTypes.default.func,
203
+ selected: _propTypes.default.bool,
204
+ LinkRouter: (_withLinkRouter$propT3 = _componentsBase.withLinkRouter.propTypes) === null || _withLinkRouter$propT3 === void 0 ? void 0 : _withLinkRouter$propT3.LinkRouter,
205
+ linkRouterProps: (_withLinkRouter$propT4 = _componentsBase.withLinkRouter.propTypes) === null || _withLinkRouter$propT4 === void 0 ? void 0 : _withLinkRouter$propT4.linkRouterProps
206
+ }))
207
+ })).isRequired,
208
+
209
+ /**
210
+ * Common navigation bar heading.
211
+ */
212
+ heading: _propTypes.default.string,
213
+ headingLevel: _propTypes.default.oneOf(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']),
214
+
215
+ /**
216
+ * Matches the `id` property of the item in `items` corresponding to the current page
217
+ */
218
+ selectedId: _propTypes.default.string.isRequired,
219
+
220
+ /**
221
+ * Optional function to be called on pressing a link
222
+ */
223
+ onChange: _propTypes.default.func
224
+ };
225
+ NavigationBar.defaultProps = {
226
+ heading: undefined,
227
+ headingLevel: 'h1',
228
+ onChange: () => {}
229
+ };
230
+ var _default = NavigationBar;
231
+ exports.default = _default;
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+
12
+ var _componentsBase = require("@telus-uds/components-base");
13
+
14
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
15
+
16
+ var _utils = require("../utils");
17
+
18
+ var _jsxRuntime = require("react/jsx-runtime");
19
+
20
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
+
22
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
23
+
24
+ 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; }
25
+
26
+ const [selectProps, selectedSystemPropTypes] = (0, _componentsBase.selectSystemProps)([_utils.htmlAttrs]);
27
+ const defaultMaxWidth = 192;
28
+
29
+ const ItemContainer = /*#__PURE__*/_styledComponents.default.div.withConfig({
30
+ displayName: "NavigationItem__ItemContainer",
31
+ componentId: "components-web__sc-ql9x7c-0"
32
+ })(_ref => {
33
+ let {
34
+ targetWidth
35
+ } = _ref;
36
+ return {
37
+ display: 'flex',
38
+ flexDirection: 'column',
39
+ justifyContent: 'center',
40
+ maxWidth: `${Math.max(defaultMaxWidth, targetWidth ?? 0)}px`,
41
+ flexGrow: targetWidth ? 1 : 0,
42
+ flexShrink: 1
43
+ };
44
+ });
45
+ /**
46
+ * NavigationItem within a NavigationBar component.
47
+ *
48
+ * This is rendered automatically by `NavigationBar` and isn't intended be used directly.
49
+ */
50
+
51
+
52
+ const NavigationItem = /*#__PURE__*/(0, _react.forwardRef)((_ref2, ref) => {
53
+ let {
54
+ accessibilityRole = 'link',
55
+ // @todo switch to 'button' for dropdowns
56
+ children,
57
+ id,
58
+ onClick: handleClick = () => {},
59
+ selected,
60
+ accessibilityState = {
61
+ current: selected ? 'page' : false
62
+ },
63
+ href,
64
+ tokens,
65
+ variant = {},
66
+ ...rest
67
+ } = _ref2;
68
+ const selectedProps = selectProps(rest);
69
+ const targetWidth = (0, _componentsBase.useResponsiveProp)({
70
+ xs: 288,
71
+ lg: null
72
+ });
73
+ const viewport = (0, _componentsBase.useViewport)();
74
+ const getTokens = (0, _componentsBase.useThemeTokensCallback)('NavigationBar', tokens, variant);
75
+
76
+ const getStateTokens = state => getTokens({ ...state,
77
+ viewport
78
+ });
79
+
80
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(ItemContainer, {
81
+ targetWidth: targetWidth,
82
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_componentsBase.Button, {
83
+ accessibilityRole: accessibilityRole,
84
+ accessibilityState: accessibilityState,
85
+ onPress: handleClick,
86
+ ref: ref,
87
+ tokens: getStateTokens,
88
+ variant: {
89
+ selected
90
+ },
91
+ href: href,
92
+ ...selectedProps,
93
+ children: children
94
+ })
95
+ });
96
+ });
97
+ NavigationItem.displayName = 'NavigationItem';
98
+ NavigationItem.propTypes = { ...selectedSystemPropTypes,
99
+ ..._componentsBase.withLinkRouter.propTypes,
100
+ onClick: _propTypes.default.func,
101
+ selected: _propTypes.default.bool,
102
+ children: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.func]).isRequired
103
+ };
104
+ NavigationItem.defaultProps = {
105
+ onClick: () => {},
106
+ selected: false
107
+ };
108
+
109
+ var _default = (0, _componentsBase.withLinkRouter)(NavigationItem);
110
+
111
+ exports.default = _default;
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+
12
+ var _componentsBase = require("@telus-uds/components-base");
13
+
14
+ var _NavigationItem = _interopRequireDefault(require("./NavigationItem"));
15
+
16
+ var _Listbox = _interopRequireDefault(require("../Listbox"));
17
+
18
+ var _useOverlaidPosition = _interopRequireDefault(require("../utils/useOverlaidPosition"));
19
+
20
+ var _resolveItemSelection = _interopRequireDefault(require("./resolveItemSelection"));
21
+
22
+ var _jsxRuntime = require("react/jsx-runtime");
23
+
24
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
+
26
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
+
28
+ 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; }
29
+
30
+ /**
31
+ * A NavigationItem that opens or closes a Listbox of other NavigationItems.
32
+ *
33
+ * This is rendered automatically by `NavigationBar` and isn't intended be used directly.
34
+ */
35
+ const NavigationSubMenu = _ref => {
36
+ let {
37
+ children,
38
+ id,
39
+ isOpen = false,
40
+ label,
41
+ onClick,
42
+ selectedId,
43
+ items = [],
44
+ openOverlayRef,
45
+ LinkRouter,
46
+ linkRouterProps
47
+ } = _ref;
48
+ const focusTrapRef = (0, _react.useRef)();
49
+ const maxWidth = 289; // Slightly over 288 of nav item to account for subpixel rounding
50
+
51
+ const {
52
+ align,
53
+ offsets,
54
+ minWidth
55
+ } = (0, _componentsBase.useResponsiveProp)({
56
+ xs: {
57
+ align: {
58
+ top: 'top',
59
+ left: 'left'
60
+ },
61
+ minWidth: maxWidth
62
+ },
63
+ sm: {
64
+ align: {
65
+ top: 'top',
66
+ right: 'right'
67
+ },
68
+ minWidth: maxWidth
69
+ },
70
+ lg: {
71
+ align: {
72
+ top: 'bottom',
73
+ center: 'center'
74
+ },
75
+ offsets: {
76
+ vertical: 4
77
+ },
78
+ minWidth: 192
79
+ }
80
+ });
81
+ const {
82
+ overlaidPosition,
83
+ sourceRef,
84
+ targetRef,
85
+ onTargetLayout,
86
+ isReady
87
+ } = (0, _useOverlaidPosition.default)({
88
+ isShown: isOpen,
89
+ offsets,
90
+ align
91
+ });
92
+ const {
93
+ selected
94
+ } = (0, _resolveItemSelection.default)({
95
+ id,
96
+ label,
97
+ items
98
+ }, selectedId);
99
+
100
+ const handleClick = event => {
101
+ if (typeof onClick === 'function') onClick(event);
102
+ };
103
+
104
+ const {
105
+ icoMenu
106
+ } = (0, _componentsBase.useThemeTokens)('NavigationBar', {}, {}, {
107
+ expanded: isOpen
108
+ });
109
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
110
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_NavigationItem.default, {
111
+ ref: sourceRef,
112
+ accessibilityRole: "button",
113
+ id: id,
114
+ selected: selected,
115
+ onClick: handleClick,
116
+ icon: icoMenu,
117
+ children: _ref2 => {
118
+ var _textStyles$, _textStyles$2;
119
+
120
+ let {
121
+ textStyles
122
+ } = _ref2;
123
+ return [children, /*#__PURE__*/(0, _jsxRuntime.jsx)(_componentsBase.Spacer, {
124
+ space: 1,
125
+ direction: "row"
126
+ }, `${id}_spacer`), /*#__PURE__*/(0, _jsxRuntime.jsx)(_componentsBase.Icon, {
127
+ icon: icoMenu,
128
+ variant: {
129
+ size: 'small'
130
+ },
131
+ tokens: {
132
+ color: (_textStyles$ = textStyles[0]) === null || _textStyles$ === void 0 ? void 0 : _textStyles$.color,
133
+ size: (_textStyles$2 = textStyles[0]) === null || _textStyles$2 === void 0 ? void 0 : _textStyles$2.fontSize
134
+ }
135
+ }, `${id}_icon`)];
136
+ }
137
+ }), isOpen && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
138
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Listbox.default.Overlay, {
139
+ overlaidPosition: overlaidPosition,
140
+ maxWidth: maxWidth,
141
+ minWidth: minWidth,
142
+ isReady: isReady,
143
+ onLayout: onTargetLayout,
144
+ ref: openOverlayRef,
145
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Listbox.default, {
146
+ items: items,
147
+ firstItemRef: targetRef,
148
+ parentRef: sourceRef,
149
+ selectedId: selectedId,
150
+ LinkRouter: LinkRouter,
151
+ linkRouterProps: linkRouterProps
152
+ })
153
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
154
+ // This catches and shifts focus to other interactive elements.
155
+ // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex
156
+ tabIndex: 0,
157
+ ref: focusTrapRef,
158
+ onFocus: () => targetRef.current.focus()
159
+ })]
160
+ })]
161
+ });
162
+ };
163
+
164
+ NavigationSubMenu.displayName = 'NavigationSubMenu'; // @TODO - proper prop types and comments
165
+
166
+ NavigationSubMenu.propTypes = {
167
+ children: _propTypes.default.node,
168
+ id: _propTypes.default.string,
169
+ isOpen: _propTypes.default.bool,
170
+ label: _propTypes.default.string,
171
+ onClick: _propTypes.default.func,
172
+ selectedId: _propTypes.default.string,
173
+ items: _propTypes.default.array,
174
+ openOverlayRef: _propTypes.default.object,
175
+ LinkRouter: _propTypes.default.elementType,
176
+ linkRouterProps: _propTypes.default.object
177
+ };
178
+ var _default = NavigationSubMenu;
179
+ exports.default = _default;