@enact/limestone 1.3.0 → 1.10.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 (200) hide show
  1. package/.github/workflows/ci-branch.yml +21 -0
  2. package/.github/workflows/ci-pull-request.yml +16 -0
  3. package/.github/workflows/ci-reusable.yml +73 -0
  4. package/ActionGuide/ActionGuide.d.ts +5 -4
  5. package/ActionGuide/ActionGuide.module.css +1 -1
  6. package/Alert/Alert.d.ts +13 -2
  7. package/Alert/Alert.js +39 -5
  8. package/Alert/Alert.module.css +48 -1
  9. package/Alert/tests/Alert-specs.js +91 -0
  10. package/BodyText/BodyText.d.ts +5 -4
  11. package/BodyText/BodyText.module.css +7 -7
  12. package/Button/Button.d.ts +17 -12
  13. package/Button/Button.js +1 -1
  14. package/Button/Button.module.css +195 -268
  15. package/Button/tests/Button-specs.js +26 -0
  16. package/CHANGELOG.md +254 -0
  17. package/Card/Card.d.ts +40 -12
  18. package/Card/Card.js +164 -28
  19. package/Card/Card.module.css +277 -58
  20. package/Card/tests/Card-specs.js +67 -3
  21. package/Checkbox/Checkbox.d.ts +8 -7
  22. package/Checkbox/Checkbox.js +3 -1
  23. package/Checkbox/Checkbox.module.css +213 -120
  24. package/Checkbox/tests/Checkbox-specs.js +1 -1
  25. package/CheckboxItem/CheckboxItem.d.ts +22 -7
  26. package/CheckboxItem/CheckboxItem.js +71 -4
  27. package/Chips/Chip.js +72 -13
  28. package/Chips/Chip.module.css +3 -3
  29. package/Chips/Chips.js +37 -17
  30. package/Chips/Chips.module.css +1 -1
  31. package/Chips/tests/Chip-specs.js +43 -13
  32. package/Chips/tests/Chips-specs.js +31 -21
  33. package/ColorPicker/ColorPicker.js +27 -25
  34. package/ContextualMenuDecorator/ContextualMenuDecorator.d.ts +4 -5
  35. package/ContextualPopupDecorator/ContextualPopup.module.css +34 -34
  36. package/ContextualPopupDecorator/ContextualPopupDecorator.js +567 -549
  37. package/DatePicker/DatePicker.d.ts +4 -5
  38. package/DayPicker/DayPicker.d.ts +8 -7
  39. package/DayPicker/DaySelectorDecorator.js +12 -7
  40. package/Dropdown/Dropdown.d.ts +11 -13
  41. package/Dropdown/Dropdown.module.css +13 -9
  42. package/Dropdown/DropdownList.js +80 -54
  43. package/FixedPopupPanels/FixedPopupPanels.d.ts +4 -2
  44. package/FixedPopupPanels/FixedPopupPanels.module.css +18 -18
  45. package/FlexiblePopupPanels/FlexiblePopupPanels.module.css +23 -23
  46. package/FlexiblePopupPanels/useNavButtonFocus.js +7 -10
  47. package/FormCheckboxItem/FormCheckboxItem.d.ts +5 -4
  48. package/Heading/Heading.d.ts +9 -8
  49. package/Heading/Heading.js +2 -2
  50. package/Heading/Heading.module.css +5 -5
  51. package/Icon/Icon.d.ts +15 -4
  52. package/Icon/Icon.js +49 -2
  53. package/Icon/Icon.module.css +1 -1
  54. package/Icon/IconList.js +27 -1
  55. package/IconItem/IconItem.d.ts +13 -12
  56. package/IconItem/IconItem.js +15 -0
  57. package/IconItem/IconItem.module.css +107 -1
  58. package/IconItem/tests/IconItem-specs.js +30 -1
  59. package/Image/Image.d.ts +5 -4
  60. package/Image/Image.js +6 -4
  61. package/ImageItem/ImageItem.d.ts +11 -10
  62. package/ImageItem/ImageItem.js +37 -31
  63. package/ImageItem/ImageItem.module.css +30 -30
  64. package/ImageItem/tests/ImageItem-specs.js +3 -10
  65. package/Input/Input.js +21 -3
  66. package/Input/Input.module.css +37 -8
  67. package/Input/InputField.js +79 -24
  68. package/Input/InputField.module.css +273 -41
  69. package/Input/InputFieldDecoratorIcon.js +1 -0
  70. package/Input/InputFieldSpotlightDecorator.js +257 -228
  71. package/Input/index.d.ts +120 -111
  72. package/Input/tests/Input-specs.js +26 -0
  73. package/Input/tests/InputField-specs.js +170 -3
  74. package/Input/tests/InputPopup-specs.js +1 -1
  75. package/Item/Item.d.ts +16 -9
  76. package/Item/Item.js +20 -2
  77. package/Item/Item.module.css +1 -1
  78. package/KeyGuide/KeyGuide.d.ts +8 -7
  79. package/KeyGuide/KeyGuide.js +29 -27
  80. package/KeyGuide/KeyGuide.module.css +25 -1
  81. package/Marquee/Marquee.d.ts +2 -4
  82. package/MediaOverlay/MediaOverlay.d.ts +12 -11
  83. package/MediaOverlay/MediaOverlay.js +43 -21
  84. package/MediaOverlay/MediaOverlay.module.css +114 -15
  85. package/MediaOverlay/tests/MediaOverlay-specs.js +29 -0
  86. package/MediaPlayer/MediaControls.js +195 -13
  87. package/MediaPlayer/MediaControls.module.css +3 -2
  88. package/MediaPlayer/MediaSlider.module.css +7 -20
  89. package/MediaPlayer/index.d.ts +59 -7
  90. package/MediaPlayer/tests/util-specs.js +4 -1
  91. package/PageViews/PageViews.js +232 -82
  92. package/PageViews/PageViews.module.css +3 -0
  93. package/PageViews/PageViewsRouter.js +100 -42
  94. package/PageViews/tests/PageViews-specs.js +171 -0
  95. package/Panels/Header.js +54 -34
  96. package/Panels/Header.module.css +83 -31
  97. package/Panels/Panel.module.css +1 -1
  98. package/Panels/index.d.ts +7 -8
  99. package/Picker/Picker.d.ts +4 -5
  100. package/Picker/Picker.module.css +2 -2
  101. package/Popup/Popup.js +245 -242
  102. package/Popup/Popup.module.css +24 -24
  103. package/PopupTabLayout/PopupTabLayout.d.ts +5 -7
  104. package/PopupTabLayout/PopupTabLayout.js +26 -18
  105. package/PopupTabLayout/PopupTabLayout.module.css +53 -16
  106. package/PopupTabLayout/PopupTabLayoutStateContext.js +8 -0
  107. package/ProgressBar/ProgressBar.d.ts +5 -4
  108. package/ProgressBar/ProgressBarTooltip.module.css +12 -12
  109. package/ProgressButton/ProgressButton.d.ts +4 -5
  110. package/QuickGuidePanels/QuickGuidePanels.module.css +2 -2
  111. package/RadioItem/RadioItem.d.ts +18 -5
  112. package/RadioItem/RadioItem.js +69 -2
  113. package/RadioItem/RadioItem.module.css +36 -36
  114. package/RangePicker/RangePicker.module.css +2 -2
  115. package/Scroller/EditableWrapper.js +28 -18
  116. package/Scroller/Scroller.d.ts +20 -16
  117. package/Scroller/Scroller.js +20 -13
  118. package/Scroller/Scroller.module.css +4 -4
  119. package/Scroller/useThemeScroller.js +3 -3
  120. package/Slider/Slider.d.ts +20 -14
  121. package/Slider/Slider.js +71 -14
  122. package/Slider/Slider.module.css +464 -91
  123. package/Slider/SliderBehaviorDecorator.js +16 -14
  124. package/Slider/tests/Slider-specs.js +53 -1
  125. package/Slider/utils.js +23 -7
  126. package/Spinner/Spinner.d.ts +5 -4
  127. package/Spinner/Spinner.js +10 -8
  128. package/Spinner/Spinner.module.css +9 -9
  129. package/Steps/Steps.d.ts +5 -4
  130. package/Steps/Steps.js +9 -5
  131. package/Switch/Switch.d.ts +8 -7
  132. package/Switch/Switch.module.css +100 -13
  133. package/SwitchItem/SwitchItem.d.ts +9 -6
  134. package/TabLayout/RefocusDecorator.js +26 -18
  135. package/TabLayout/TabGroup.js +3 -2
  136. package/TabLayout/TabGroup.module.css +2 -2
  137. package/TabLayout/TabLayout.d.ts +6 -0
  138. package/TabLayout/TabLayout.js +11 -1
  139. package/TabLayout/TabLayout.module.css +18 -0
  140. package/TabLayout/tests/TabGroup-specs.js +1 -1
  141. package/TabLayout/tests/TabLayout-specs.js +52 -0
  142. package/ThemeDecorator/AccessibilityDecorator.js +12 -11
  143. package/ThemeDecorator/I18nFontDecorator.js +6 -4
  144. package/ThemeDecorator/ThemeDecorator.d.ts +16 -10
  145. package/ThemeDecorator/ThemeDecorator.js +24 -9
  146. package/ThemeDecorator/fontGenerator.js +1 -1
  147. package/ThemeDecorator/screenTypes.json +1 -0
  148. package/TimePicker/TimePicker.module.css +1 -1
  149. package/TimePicker/TimePickerBase.js +5 -3
  150. package/TooltipDecorator/Tooltip.module.css +1 -2
  151. package/TooltipDecorator/TooltipDecorator.js +12 -7
  152. package/TooltipDecorator/tests/useTooltip-specs.js +5 -2
  153. package/TooltipDecorator/tests/util-specs.js +12 -0
  154. package/TooltipDecorator/useTooltip.js +1 -1
  155. package/TooltipDecorator/util.js +18 -11
  156. package/VideoPlayer/Feedback.js +3 -0
  157. package/VideoPlayer/Feedback.module.css +5 -9
  158. package/VideoPlayer/FeedbackIcons.js +1 -1
  159. package/VideoPlayer/FeedbackTooltip.module.css +55 -11
  160. package/VideoPlayer/VideoPlayer.d.ts +44 -18
  161. package/VideoPlayer/VideoPlayer.js +153 -47
  162. package/VideoPlayer/VideoPlayer.module.css +28 -11
  163. package/VirtualList/VirtualList.d.ts +9 -2
  164. package/VirtualList/VirtualList.js +51 -24
  165. package/VirtualList/tests/VirtualGridList-translate-specs.js +3 -0
  166. package/VirtualList/tests/VirtualList-specs.js +28 -1
  167. package/VirtualList/tests/VirtualList-translate-specs.js +4 -1
  168. package/VirtualList/useSpotlight.js +1 -1
  169. package/WizardPanels/WizardPanels.module.css +2 -2
  170. package/WizardPanels/index.d.ts +4 -2
  171. package/fonts/Limestone_Icons.ttf +0 -0
  172. package/internal/$L/$L.js +3 -3
  173. package/internal/AsyncRenderChildren/AsyncRenderChildren.js +9 -5
  174. package/internal/AsyncRenderChildren/tests/AsyncRenderChildren-specs.js +4 -1
  175. package/internal/DateComponentPicker/DateComponentPicker.module.css +2 -2
  176. package/internal/DateTime/DateTime.module.css +1 -0
  177. package/internal/DateTime/DateTimeDecorator.js +5 -4
  178. package/internal/Panels/PanelsRouter.js +48 -31
  179. package/internal/Panels/useAutoFocus.js +10 -6
  180. package/internal/Panels/useFocusOnTransition.js +4 -3
  181. package/internal/Picker/Picker.js +7 -5
  182. package/internal/Picker/Picker.module.css +2 -2
  183. package/internal/Picker/SpottablePicker.js +15 -13
  184. package/internal/SharedStateDecorator/SharedStateDecorator.js +78 -99
  185. package/internal/validators/validators.js +21 -2
  186. package/package.json +18 -15
  187. package/styles/colors-highcontrast.less +9 -1
  188. package/styles/colors.less +12 -7
  189. package/styles/motion-mixins.less +66 -0
  190. package/styles/motions.less +78 -0
  191. package/styles/variables.less +176 -150
  192. package/useScroll/HoverToScroll.js +23 -17
  193. package/useScroll/Scrollbar.js +14 -10
  194. package/useScroll/ScrollbarPlaceholder.js +3 -5
  195. package/useScroll/ScrollbarTrack.js +7 -5
  196. package/useScroll/ScrollbarTrack.module.css +8 -8
  197. package/useScroll/useEvent.js +14 -3
  198. package/useScroll/useScroll.js +12 -2
  199. package/useScroll/useScroll.module.css +6 -6
  200. package/.travis.yml +0 -40
@@ -7,11 +7,13 @@ exports.PageViewsRouter = PageViewsRouter;
7
7
  exports["default"] = void 0;
8
8
  var _propTypes = _interopRequireDefault(require("@enact/core/internal/prop-types"));
9
9
  var _useChainRefs = _interopRequireDefault(require("@enact/core/useChainRefs"));
10
+ var _util = require("@enact/core/util");
11
+ var _spotlight = _interopRequireDefault(require("@enact/spotlight"));
10
12
  var _propTypes2 = _interopRequireDefault(require("prop-types"));
11
13
  var _react = require("react");
12
14
  var _Panels = require("../internal/Panels");
13
15
  var _jsxRuntime = require("react/jsx-runtime");
14
- var _excluded = ["autoFocus", "children", "componentRef", "data-spotlight-id", "index", "onTransition", "onWillTransition", "rtl"],
16
+ var _excluded = ["autoFocus", "bannerMode", "children", "componentRef", "data-spotlight-id", "index", "onFooterCloseClick", "onFooterNextClick", "onNextClick", "onPrevClick", "onTransition", "onWillTransition", "rtl", "showFooterButtons"],
15
17
  _excluded2 = ["onWillTransition"]; // single-index ViewManagers need some help knowing when the transition direction needs to change
16
18
  // because the index is always 0 from its perspective.
17
19
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
@@ -23,36 +25,45 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
23
25
  function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
24
26
  function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
25
27
  function useReverseTransition(index, rtl) {
26
- var prevIndex = (0, _react.useRef)(index);
28
+ var prevIndex = (0, _util.usePrevious)(index);
27
29
  var reverse = false;
28
- if (prevIndex.current !== index) {
29
- reverse = rtl ? index > prevIndex.current : index < prevIndex.current;
30
+ if (prevIndex !== index) {
31
+ reverse = rtl ? index > prevIndex : index < prevIndex;
30
32
  }
31
- prevIndex.current = index;
32
33
  return {
33
34
  reverseTransition: reverse
34
35
  };
35
36
  }
36
37
 
37
38
  /**
38
- * PageViewsRouter passes children, index and transition handlers
39
+ * PageViewsRouter passes children, index and transition handlers.
39
40
  *
40
41
  * @class PageViewsRouter
41
42
  * @memberof limestone/PageViews
42
43
  * @private
43
44
  */
44
45
  function PageViewsRouter(Wrapped) {
45
- var PageViewsProvider = function PageViewsProvider(_ref) {
46
- var autoFocus = _ref.autoFocus,
47
- children = _ref.children,
48
- componentRef = _ref.componentRef,
49
- spotlightId = _ref['data-spotlight-id'],
50
- _ref$index = _ref.index,
51
- index = _ref$index === void 0 ? 0 : _ref$index,
52
- onTransition = _ref.onTransition,
53
- onWillTransition = _ref.onWillTransition,
54
- rtl = _ref.rtl,
55
- rest = _objectWithoutProperties(_ref, _excluded);
46
+ var _PageViewsProvider = function PageViewsProvider(props) {
47
+ var pageViewsProviderProps = (0, _util.setDefaultProps)(props, {
48
+ index: 0
49
+ });
50
+ (0, _util.checkPropTypes)(_PageViewsProvider, pageViewsProviderProps);
51
+ var autoFocus = pageViewsProviderProps.autoFocus,
52
+ bannerMode = pageViewsProviderProps.bannerMode,
53
+ children = pageViewsProviderProps.children,
54
+ componentRef = pageViewsProviderProps.componentRef,
55
+ spotlightId = pageViewsProviderProps['data-spotlight-id'],
56
+ index = pageViewsProviderProps.index,
57
+ onFooterCloseClick = pageViewsProviderProps.onFooterCloseClick,
58
+ onFooterNextClick = pageViewsProviderProps.onFooterNextClick,
59
+ onNextClick = pageViewsProviderProps.onNextClick,
60
+ onPrevClick = pageViewsProviderProps.onPrevClick,
61
+ onTransition = pageViewsProviderProps.onTransition,
62
+ onWillTransition = pageViewsProviderProps.onWillTransition,
63
+ rtl = pageViewsProviderProps.rtl,
64
+ showFooterButtons = pageViewsProviderProps.showFooterButtons,
65
+ rest = _objectWithoutProperties(pageViewsProviderProps, _excluded);
66
+ var uniqueId = (0, _react.useId)();
56
67
  var totalIndex = _react.Children.count(children);
57
68
  var _useToggleRole = (0, _Panels.useToggleRole)(),
58
69
  a11yRef = _useToggleRole.ref,
@@ -63,8 +74,42 @@ function PageViewsRouter(Wrapped) {
63
74
  var ref = (0, _useChainRefs["default"])(autoFocusRef, a11yRef, componentRef);
64
75
  var _useReverseTransition = useReverseTransition(index, rtl),
65
76
  reverseTransition = _useReverseTransition.reverseTransition;
77
+ var navigationSource = (0, _react.useRef)(null); // 'internal-next' | 'internal-prev' | 'footer' | null
78
+
79
+ (0, _react.useEffect)(function () {
80
+ if (showFooterButtons && !bannerMode) {
81
+ _spotlight["default"].focus(spotlightId, {
82
+ enterTo: 'default-element'
83
+ });
84
+ }
85
+ }, [bannerMode, showFooterButtons, spotlightId]);
86
+ var handleNextClick = (0, _react.useCallback)(function (ev) {
87
+ navigationSource.current = 'internal-next';
88
+ onNextClick === null || onNextClick === void 0 || onNextClick(ev);
89
+ }, [onNextClick]);
90
+ var handlePrevClick = (0, _react.useCallback)(function (ev) {
91
+ navigationSource.current = 'internal-prev';
92
+ onPrevClick === null || onPrevClick === void 0 || onPrevClick(ev);
93
+ }, [onPrevClick]);
94
+ var handleFooterNextClick = (0, _react.useCallback)(function (ev) {
95
+ navigationSource.current = 'footer';
96
+ onFooterNextClick === null || onFooterNextClick === void 0 || onFooterNextClick(ev);
97
+ }, [onFooterNextClick]);
98
+ var handleTransition = (0, _react.useCallback)(function (ev) {
99
+ if (showFooterButtons && !bannerMode) {
100
+ var source = navigationSource.current;
101
+ var newIndex = ev.index;
102
+ if (source === 'footer' || source === 'internal-next' && newIndex === totalIndex - 1 || source === 'internal-prev' && newIndex === 0) {
103
+ _spotlight["default"].focus(spotlightId, {
104
+ enterTo: 'default-element'
105
+ });
106
+ }
107
+ }
108
+ navigationSource.current = null;
109
+ onTransition === null || onTransition === void 0 || onTransition(ev);
110
+ }, [bannerMode, onTransition, showFooterButtons, spotlightId, totalIndex]);
66
111
  var _useFocusOnTransition = (0, _Panels.useFocusOnTransition)({
67
- onTransition: onTransition,
112
+ onTransition: handleTransition,
68
113
  onWillTransition: onWillTransition,
69
114
  spotlightId: spotlightId
70
115
  }),
@@ -74,17 +119,30 @@ function PageViewsRouter(Wrapped) {
74
119
  focusOnWillTransition(ev);
75
120
  a11yOnWillTransition(ev);
76
121
  }, [a11yOnWillTransition, focusOnWillTransition]);
122
+ (0, _react.useEffect)(function () {
123
+ return function () {
124
+ _spotlight["default"].resume();
125
+ };
126
+ }, []);
77
127
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(Wrapped, _objectSpread(_objectSpread(_objectSpread({}, rest), transition), {}, {
128
+ bannerMode: bannerMode,
78
129
  componentRef: ref,
79
130
  "data-spotlight-id": spotlightId,
80
131
  index: index,
81
- totalIndex: totalIndex,
132
+ onFooterCloseClick: onFooterCloseClick,
133
+ onFooterNextClick: handleFooterNextClick,
134
+ onNextClick: handleNextClick,
135
+ onPrevClick: handlePrevClick,
82
136
  onWillTransition: handleWillTransition,
83
137
  reverseTransition: reverseTransition,
138
+ rtl: rtl,
139
+ showFooterButtons: showFooterButtons,
140
+ totalIndex: totalIndex,
141
+ uniqueId: uniqueId,
84
142
  children: children
85
143
  }));
86
144
  };
87
- PageViewsProvider.propTypes = /** @lends limestone/PageViews.PageViewsRouter.prototype */{
145
+ _PageViewsProvider.propTypes = /** @lends limestone/PageViews.PageViewsRouter.prototype */{
88
146
  /**
89
147
  * Sets the strategy used to automatically focus an element within the PageViews upon render.
90
148
  * When set to 'none', focus is not set only on the first render.
@@ -102,19 +160,19 @@ function PageViewsRouter(Wrapped) {
102
160
  */
103
161
  componentRef: _propTypes["default"].ref,
104
162
  /**
105
- * The spotlight id for the panel.
106
- *
107
- * @type {String}
108
- * @private
109
- */
163
+ * The spotlight id for the panel.
164
+ *
165
+ * @type {String}
166
+ * @private
167
+ */
110
168
  'data-spotlight-id': _propTypes2["default"].string,
111
169
  /**
112
- * The currently selected step.
113
- *
114
- * @type {Number}
115
- * @default 0
116
- * @private
117
- */
170
+ * The currently selected step.
171
+ *
172
+ * @type {Number}
173
+ * @default 0
174
+ * @private
175
+ */
118
176
  index: _propTypes2["default"].number,
119
177
  /**
120
178
  * Disables panel transitions.
@@ -124,18 +182,18 @@ function PageViewsRouter(Wrapped) {
124
182
  */
125
183
  noAnimation: _propTypes2["default"].bool,
126
184
  /**
127
- * Called when a transition completes.
128
- *
129
- * @type {Function}
130
- * @private
131
- */
185
+ * Called when a transition completes.
186
+ *
187
+ * @type {Function}
188
+ * @private
189
+ */
132
190
  onTransition: _propTypes2["default"].func,
133
191
  /**
134
- * Called when a transition begins.
135
- *
136
- * @type {Function}
137
- * @private
138
- */
192
+ * Called when a transition begins.
193
+ *
194
+ * @type {Function}
195
+ * @private
196
+ */
139
197
  onWillTransition: _propTypes2["default"].func,
140
198
  /**
141
199
  * Used to determine the transition direction.
@@ -145,6 +203,6 @@ function PageViewsRouter(Wrapped) {
145
203
  */
146
204
  rtl: _propTypes2["default"].bool
147
205
  };
148
- return PageViewsProvider;
206
+ return _PageViewsProvider;
149
207
  }
150
208
  var _default = exports["default"] = PageViewsRouter;
@@ -189,4 +189,175 @@ describe('PageViews Specs', function () {
189
189
  expect(actual).toMatchObject(expected);
190
190
  });
191
191
  }));
192
+ test('should render accept `fullContents` prop', function () {
193
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsxs)(_.PageViews, {
194
+ fullContents: true,
195
+ pageIndicatorType: "number",
196
+ index: 1,
197
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {
198
+ children: "I got contents"
199
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {
200
+ children: "I got contents"
201
+ })]
202
+ }));
203
+ var panel = _react.screen.getByRole('region');
204
+ var expected = 'fullContents';
205
+ expect(panel).toHaveClass(expected);
206
+ });
207
+ test('should navigate on Page Indicator click when `bannerMode` is true', /*#__PURE__*/_asyncToGenerator(function* () {
208
+ var handleChange = jest.fn();
209
+ var handleStepsClick = jest.fn();
210
+ var user = _userEvent["default"].setup();
211
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsxs)(_.PageViews, {
212
+ bannerMode: true,
213
+ index: 2,
214
+ onChange: handleChange,
215
+ onStepsClick: handleStepsClick,
216
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {})]
217
+ }));
218
+ var indicatorDot = _react.screen.getByRole('list').children[1];
219
+ var expected = {
220
+ type: 'onStepsClick'
221
+ };
222
+ yield user.click(indicatorDot);
223
+ yield (0, _react.waitFor)(function () {
224
+ expect(handleChange).toHaveBeenCalledWith({
225
+ index: 1,
226
+ type: 'onChange'
227
+ });
228
+ });
229
+ yield (0, _react.waitFor)(function () {
230
+ var actual = handleStepsClick.mock.calls.length && handleStepsClick.mock.calls[0][0];
231
+ expect(actual).toMatchObject(expected);
232
+ });
233
+ }));
234
+ test('should navigate via 5-way left key when `bannerMode` is true', /*#__PURE__*/_asyncToGenerator(function* () {
235
+ var handleChange = jest.fn();
236
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsxs)(_.PageViews, {
237
+ bannerMode: true,
238
+ index: 1,
239
+ onChange: handleChange,
240
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {})]
241
+ }));
242
+ var pageViews = _react.screen.getByRole('region').children[0];
243
+ yield _react.fireEvent.keyDown(pageViews, {
244
+ which: 37,
245
+ keyCode: 37,
246
+ code: 37
247
+ });
248
+ yield (0, _react.waitFor)(function () {
249
+ expect(handleChange).toHaveBeenCalledWith({
250
+ index: 0,
251
+ type: 'onChange'
252
+ });
253
+ });
254
+ }));
255
+ test('should navigate via 5-way right key when `bannerMode` is true', /*#__PURE__*/_asyncToGenerator(function* () {
256
+ var handleChange = jest.fn();
257
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsxs)(_.PageViews, {
258
+ bannerMode: true,
259
+ index: 1,
260
+ onChange: handleChange,
261
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {})]
262
+ }));
263
+ var pageViews = _react.screen.getByRole('region').children[0];
264
+ yield _react.fireEvent.keyDown(pageViews, {
265
+ which: 39,
266
+ keyCode: 39,
267
+ code: 39
268
+ });
269
+ yield (0, _react.waitFor)(function () {
270
+ expect(handleChange).toHaveBeenCalledWith({
271
+ index: 2,
272
+ type: 'onChange'
273
+ });
274
+ });
275
+ }));
276
+ test('should render footer Close and Next buttons when `showFooterButtons` is true', function () {
277
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsxs)(_.PageViews, {
278
+ showFooterButtons: true,
279
+ index: 0,
280
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {})]
281
+ }));
282
+ expect(_react.screen.getByText('Close')).toBeInTheDocument();
283
+ expect(_react.screen.getByText('Next')).toBeInTheDocument();
284
+ });
285
+ test('should not render footer Next button on the last page', function () {
286
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsxs)(_.PageViews, {
287
+ showFooterButtons: true,
288
+ index: 1,
289
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {})]
290
+ }));
291
+ expect(_react.screen.getByText('Close')).toBeInTheDocument();
292
+ expect(_react.screen.queryByText('Next')).toBeNull();
293
+ });
294
+ test('should not render footer buttons when `bannerMode` is true', function () {
295
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsxs)(_.PageViews, {
296
+ showFooterButtons: true,
297
+ bannerMode: true,
298
+ index: 0,
299
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {})]
300
+ }));
301
+ expect(_react.screen.queryByText('Close')).toBeNull();
302
+ });
303
+ test('should fire `onFooterNextClick`, `onChange`, and `onTransition` when footer Next button is clicked', /*#__PURE__*/_asyncToGenerator(function* () {
304
+ var handleChange = jest.fn();
305
+ var handleFooterNextClick = jest.fn();
306
+ var spy = jest.fn();
307
+ var user = _userEvent["default"].setup();
308
+ var index = 0;
309
+ var _render3 = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsxs)(_.PageViews, {
310
+ showFooterButtons: true,
311
+ index: index,
312
+ onChange: handleChange,
313
+ onFooterNextClick: handleFooterNextClick,
314
+ onTransition: spy,
315
+ noAnimation: true,
316
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {})]
317
+ })),
318
+ rerender = _render3.rerender;
319
+ yield user.click(_react.screen.getByText('Next'));
320
+ yield (0, _react.waitFor)(function () {
321
+ expect(handleChange).toHaveBeenCalledWith({
322
+ index: 1,
323
+ type: 'onChange'
324
+ });
325
+ });
326
+ yield (0, _react.waitFor)(function () {
327
+ expect(handleFooterNextClick).toHaveBeenCalled();
328
+ });
329
+ spy.mockClear();
330
+ index++;
331
+ rerender(/*#__PURE__*/(0, _jsxRuntime.jsxs)(_.PageViews, {
332
+ showFooterButtons: true,
333
+ index: index,
334
+ onChange: handleChange,
335
+ onFooterNextClick: handleFooterNextClick,
336
+ onTransition: spy,
337
+ noAnimation: true,
338
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {})]
339
+ }));
340
+ var expected = {
341
+ index: index,
342
+ type: 'onTransition'
343
+ };
344
+ var actual = spy.mock.calls.length && spy.mock.calls[0][0];
345
+ yield (0, _react.waitFor)(function () {
346
+ expect(actual).toMatchObject(expected);
347
+ });
348
+ }));
349
+ test('should fire `onFooterCloseClick` when footer Close button is clicked', /*#__PURE__*/_asyncToGenerator(function* () {
350
+ var handleFooterCloseClick = jest.fn();
351
+ var user = _userEvent["default"].setup();
352
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsxs)(_.PageViews, {
353
+ showFooterButtons: true,
354
+ index: 0,
355
+ onFooterCloseClick: handleFooterCloseClick,
356
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_.Page, {})]
357
+ }));
358
+ yield user.click(_react.screen.getByText('Close'));
359
+ yield (0, _react.waitFor)(function () {
360
+ expect(handleFooterCloseClick).toHaveBeenCalled();
361
+ });
362
+ }));
192
363
  });
package/Panels/Header.js CHANGED
@@ -7,22 +7,23 @@ exports["default"] = exports.HeaderBase = exports.Header = void 0;
7
7
  var _handle = require("@enact/core/handle");
8
8
  var _propTypes = _interopRequireDefault(require("@enact/core/internal/prop-types"));
9
9
  var _kind = _interopRequireDefault(require("@enact/core/kind"));
10
- var _util = require("@enact/i18n/util");
10
+ var _util = require("@enact/core/util");
11
+ var _util2 = require("@enact/i18n/util");
11
12
  var _SpotlightContainerDecorator = _interopRequireDefault(require("@enact/spotlight/SpotlightContainerDecorator"));
12
13
  var _Layout = require("@enact/ui/Layout");
13
- var _Measurable = require("@enact/ui/Measurable");
14
14
  var _resolution = require("@enact/ui/resolution");
15
15
  var _Slottable = _interopRequireDefault(require("@enact/ui/Slottable"));
16
16
  var _ViewManager = _interopRequireWildcard(require("@enact/ui/ViewManager"));
17
17
  var _propTypes2 = _interopRequireDefault(require("prop-types"));
18
18
  var _compose = _interopRequireDefault(require("ramda/src/compose"));
19
19
  var _react = require("react");
20
- var _$L = _interopRequireDefault(require("../internal/$L"));
21
20
  var _Button = _interopRequireDefault(require("../Button"));
22
21
  var _Heading = _interopRequireDefault(require("../Heading"));
23
- var _Skinnable = _interopRequireDefault(require("../Skinnable"));
22
+ var _$L = _interopRequireDefault(require("../internal/$L"));
24
23
  var _Panels = require("../internal/Panels");
25
- var _util2 = require("../internal/Panels/util");
24
+ var _util3 = require("../internal/Panels/util");
25
+ var _PopupTabLayoutStateContext = require("../PopupTabLayout/PopupTabLayoutStateContext");
26
+ var _Skinnable = _interopRequireDefault(require("../Skinnable"));
26
27
  var _HeaderModule = _interopRequireDefault(require("./Header.module.css"));
27
28
  var _jsxRuntime = require("react/jsx-runtime");
28
29
  var _excluded = ["backButtonAriaLabel", "backButtonAvailable", "backButtonBackgroundOpacity", "centered", "children", "closeButtonAriaLabel", "closeButtonBackgroundOpacity", "css", "noBackButton", "noCloseButton", "onBack", "onClose", "shadowed", "slotAbove", "slotAfter", "slotAfterRef", "slotBefore", "slotBeforeRef", "slotSize", "titleCell", "type"];
@@ -138,6 +139,13 @@ var HeaderBase = exports.HeaderBase = (0, _kind["default"])({
138
139
  * @public
139
140
  */
140
141
  css: _propTypes2["default"].object,
142
+ /**
143
+ * Informs Header that it is part of a Popup.
144
+ *
145
+ * @type {Boolean}
146
+ * @private
147
+ */
148
+ isPopupHeader: _propTypes2["default"].bool,
141
149
  /**
142
150
  * Determines what triggers the header content to start its animation.
143
151
  *
@@ -334,6 +342,7 @@ var HeaderBase = exports.HeaderBase = (0, _kind["default"])({
334
342
  var backButtonAvailable = _ref.backButtonAvailable,
335
343
  centered = _ref.centered,
336
344
  children = _ref.children,
345
+ isPopupHeader = _ref.isPopupHeader,
337
346
  noBackButton = _ref.noBackButton,
338
347
  noCloseButton = _ref.noCloseButton,
339
348
  noSubtitle = _ref.noSubtitle,
@@ -345,6 +354,7 @@ var HeaderBase = exports.HeaderBase = (0, _kind["default"])({
345
354
  subtitle = _ref.subtitle;
346
355
  return styler.append({
347
356
  centered: centered,
357
+ isPopupHeader: isPopupHeader,
348
358
  noSubtitle: noSubtitle,
349
359
  shadowed: shadowed,
350
360
  slotAfter: slotAfter || !noCloseButton,
@@ -366,7 +376,7 @@ var HeaderBase = exports.HeaderBase = (0, _kind["default"])({
366
376
  title = _ref2.title,
367
377
  titleId = _ref2.titleId,
368
378
  type = _ref2.type;
369
- var direction = (0, _util.isRtlText)(title) || (0, _util.isRtlText)(subtitle) ? 'rtl' : 'ltr';
379
+ var direction = (0, _util2.isRtlText)(title) || (0, _util2.isRtlText)(subtitle) ? 'rtl' : 'ltr';
370
380
  var titleHeading = /*#__PURE__*/(0, _jsxRuntime.jsx)(_Heading["default"], _objectSpread(_objectSpread({}, centered ? {
371
381
  slotSize: slotSize
372
382
  } : {}), {}, {
@@ -441,6 +451,7 @@ var HeaderBase = exports.HeaderBase = (0, _kind["default"])({
441
451
  type = _ref3.type,
442
452
  rest = _objectWithoutProperties(_ref3, _excluded);
443
453
  delete rest.arranger;
454
+ delete rest.isPopupHeader;
444
455
  delete rest.marqueeOn;
445
456
  delete rest.noSubtitle;
446
457
  delete rest.subtitle;
@@ -486,7 +497,6 @@ var HeaderBase = exports.HeaderBase = (0, _kind["default"])({
486
497
  children: slotAbove
487
498
  }) : null, /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Layout.Row, {
488
499
  className: css.titlesRow,
489
- align: "center",
490
500
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Layout.Cell, {
491
501
  className: css.slotBefore,
492
502
  shrink: !syncCellSize,
@@ -520,15 +530,21 @@ var HeaderBase = exports.HeaderBase = (0, _kind["default"])({
520
530
  var ContextAsDefaultsHeader = function ContextAsDefaultsHeader(Wrapped) {
521
531
  // eslint-disable-next-line no-shadow
522
532
  function ContextAsDefaultsHeader(props) {
523
- var _useContextAsDefaults = (0, _util2.useContextAsDefaults)(props),
533
+ var _ref4;
534
+ (0, _util.checkPropTypes)(ContextAsDefaultsHeader, props);
535
+ var _useContextAsDefaults = (0, _util3.useContextAsDefaults)(props),
524
536
  contextProps = _useContextAsDefaults.contextProps,
525
537
  provideContextAsDefaults = _useContextAsDefaults.provideContextAsDefaults;
526
538
  var _use = (0, _react.use)(_Panels.PanelsStateContext),
527
539
  panelsType = _use.type;
540
+ var _use2 = (0, _react.use)(_PopupTabLayoutStateContext.PopupTabLayoutStateContext),
541
+ tabLayoutType = _use2.type;
528
542
  var index = props['data-index'];
529
543
  var backButtonAvailable = index > 0 && panelsType !== 'wizard' || panelsType === 'flexiblePopup';
544
+ var isPopupHeader = (_ref4 = panelsType || tabLayoutType) === null || _ref4 === void 0 ? void 0 : _ref4.toLowerCase().includes('popup');
530
545
  return provideContextAsDefaults(/*#__PURE__*/(0, _jsxRuntime.jsx)(Wrapped, _objectSpread(_objectSpread(_objectSpread({}, contextProps), props), {}, {
531
- backButtonAvailable: backButtonAvailable
546
+ backButtonAvailable: backButtonAvailable,
547
+ isPopupHeader: isPopupHeader
532
548
  })));
533
549
  }
534
550
  ContextAsDefaultsHeader.propTypes = {
@@ -545,18 +561,9 @@ var ContextAsDefaultsHeader = function ContextAsDefaultsHeader(Wrapped) {
545
561
  var HeaderMeasurementDecorator = function HeaderMeasurementDecorator(Wrapped) {
546
562
  return function HeaderMeasurementDecorator(props) {
547
563
  // eslint-disable-line no-shadow
548
- var _ref4 = (0, _Measurable.useMeasurable)() || {},
549
- slotBeforeRef = _ref4.ref,
550
- _ref4$measurement = _ref4.measurement,
551
- _ref4$measurement2 = _ref4$measurement === void 0 ? {} : _ref4$measurement,
552
- _ref4$measurement2$wi = _ref4$measurement2.width,
553
- slotBeforeWidth = _ref4$measurement2$wi === void 0 ? 0 : _ref4$measurement2$wi;
554
- var _ref5 = (0, _Measurable.useMeasurable)() || {},
555
- slotAfterRef = _ref5.ref,
556
- _ref5$measurement = _ref5.measurement,
557
- _ref5$measurement2 = _ref5$measurement === void 0 ? {} : _ref5$measurement,
558
- _ref5$measurement2$wi = _ref5$measurement2.width,
559
- slotAfterWidth = _ref5$measurement2$wi === void 0 ? 0 : _ref5$measurement2$wi;
564
+ var slotBeforeRef = (0, _react.useRef)(null);
565
+ var slotAfterRef = (0, _react.useRef)(null);
566
+ var lastSlotSizeRef = (0, _react.useRef)(null);
560
567
  var _useState = (0, _react.useState)({}),
561
568
  _useState2 = _slicedToArray(_useState, 2),
562
569
  _useState2$ = _useState2[0],
@@ -564,24 +571,37 @@ var HeaderMeasurementDecorator = function HeaderMeasurementDecorator(Wrapped) {
564
571
  prevSlotBeforeWidth = _useState2$.prevSlotBeforeWidth,
565
572
  prevSlotAfterWidth = _useState2$.prevSlotAfterWidth,
566
573
  setSlotSize = _useState2[1];
574
+ (0, _react.useEffect)(function () {
575
+ var slotBeforeElement = slotBeforeRef.current;
576
+ var slotAfterElement = slotAfterRef.current;
577
+ var slotBeforeWidth = slotBeforeElement && slotBeforeElement.getBoundingClientRect ? slotBeforeElement.getBoundingClientRect().width : 0;
578
+ var slotAfterWidth = slotAfterElement && slotAfterElement.getBoundingClientRect ? slotAfterElement.getBoundingClientRect().width : 0;
567
579
 
568
- // If the slot width has changed, re-run this.
569
- if (slotBeforeWidth !== prevSlotBeforeWidth || slotAfterWidth !== prevSlotAfterWidth) {
570
- var largestSlotSize = Math.max(slotBeforeWidth, slotAfterWidth);
571
-
572
- // And only do this the largest slot is a different value this time around.
573
- if (slotSize !== largestSlotSize) {
574
- setSlotSize({
575
- slotSize: largestSlotSize,
576
- prevSlotBeforeWidth: slotBeforeWidth,
577
- prevSlotAfterWidth: slotAfterWidth
578
- });
580
+ // If the slot width has changed, re-run this.
581
+ if (slotBeforeWidth !== prevSlotBeforeWidth || slotAfterWidth !== prevSlotAfterWidth) {
582
+ var largestSlotSize = Math.max(slotBeforeWidth, slotAfterWidth);
583
+ // And only do this the largest slot is a different value this time around.
584
+ if (slotSize !== largestSlotSize) {
585
+ lastSlotSizeRef.current = largestSlotSize;
586
+ setSlotSize({
587
+ slotSize: largestSlotSize,
588
+ prevSlotBeforeWidth: slotBeforeWidth,
589
+ prevSlotAfterWidth: slotAfterWidth
590
+ });
591
+ } else {
592
+ setSlotSize(function (s) {
593
+ return _objectSpread(_objectSpread({}, s), {}, {
594
+ prevSlotBeforeWidth: slotBeforeWidth,
595
+ prevSlotAfterWidth: slotAfterWidth
596
+ });
597
+ });
598
+ }
579
599
  }
580
- }
600
+ }, [props.slotBefore, props.slotAfter, prevSlotBeforeWidth, prevSlotAfterWidth, slotSize]);
581
601
  var measurableProps = {
582
602
  slotBeforeRef: slotBeforeRef,
583
603
  slotAfterRef: slotAfterRef,
584
- slotSize: (0, _resolution.unit)(slotSize, 'rem')
604
+ slotSize: typeof slotSize === 'number' ? (0, _resolution.unit)(slotSize, 'rem') : '0rem'
585
605
  };
586
606
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(Wrapped, _objectSpread(_objectSpread({}, props), measurableProps));
587
607
  };