@patternfly/react-core 6.0.0-alpha.71 → 6.0.0-alpha.72

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 (179) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/components/package.json +8 -1
  3. package/deprecated/package.json +8 -1
  4. package/dist/dynamic/components/AboutModal/package.json +8 -1
  5. package/dist/dynamic/components/Accordion/package.json +8 -1
  6. package/dist/dynamic/components/ActionList/package.json +8 -1
  7. package/dist/dynamic/components/Alert/package.json +8 -1
  8. package/dist/dynamic/components/Avatar/package.json +8 -1
  9. package/dist/dynamic/components/BackToTop/package.json +8 -1
  10. package/dist/dynamic/components/Backdrop/package.json +8 -1
  11. package/dist/dynamic/components/BackgroundImage/package.json +8 -1
  12. package/dist/dynamic/components/Badge/package.json +8 -1
  13. package/dist/dynamic/components/Banner/package.json +8 -1
  14. package/dist/dynamic/components/Brand/package.json +8 -1
  15. package/dist/dynamic/components/Breadcrumb/package.json +8 -1
  16. package/dist/dynamic/components/Button/package.json +8 -1
  17. package/dist/dynamic/components/CalendarMonth/package.json +8 -1
  18. package/dist/dynamic/components/Card/package.json +8 -1
  19. package/dist/dynamic/components/Checkbox/package.json +8 -1
  20. package/dist/dynamic/components/ClipboardCopy/package.json +8 -1
  21. package/dist/dynamic/components/CodeBlock/package.json +8 -1
  22. package/dist/dynamic/components/DataList/package.json +8 -1
  23. package/dist/dynamic/components/DatePicker/package.json +8 -1
  24. package/dist/dynamic/components/DescriptionList/package.json +8 -1
  25. package/dist/dynamic/components/Divider/package.json +8 -1
  26. package/dist/dynamic/components/Drawer/package.json +8 -1
  27. package/dist/dynamic/components/Dropdown/package.json +8 -1
  28. package/dist/dynamic/components/DualListSelector/package.json +8 -1
  29. package/dist/dynamic/components/EmptyState/package.json +8 -1
  30. package/dist/dynamic/components/ExpandableSection/package.json +8 -1
  31. package/dist/dynamic/components/FileUpload/package.json +8 -1
  32. package/dist/dynamic/components/Form/package.json +8 -1
  33. package/dist/dynamic/components/FormSelect/package.json +8 -1
  34. package/dist/dynamic/components/HelperText/package.json +8 -1
  35. package/dist/dynamic/components/Hint/package.json +8 -1
  36. package/dist/dynamic/components/Icon/package.json +8 -1
  37. package/dist/dynamic/components/InputGroup/package.json +8 -1
  38. package/dist/dynamic/components/JumpLinks/package.json +8 -1
  39. package/dist/dynamic/components/Label/package.json +8 -1
  40. package/dist/dynamic/components/List/package.json +8 -1
  41. package/dist/dynamic/components/LoginPage/package.json +8 -1
  42. package/dist/dynamic/components/Masthead/package.json +8 -1
  43. package/dist/dynamic/components/Menu/package.json +8 -1
  44. package/dist/dynamic/components/MenuToggle/package.json +8 -1
  45. package/dist/dynamic/components/Modal/package.json +8 -1
  46. package/dist/dynamic/components/MultipleFileUpload/package.json +8 -1
  47. package/dist/dynamic/components/Nav/package.json +8 -1
  48. package/dist/dynamic/components/NotificationBadge/package.json +8 -1
  49. package/dist/dynamic/components/NotificationDrawer/package.json +8 -1
  50. package/dist/dynamic/components/NumberInput/package.json +8 -1
  51. package/dist/dynamic/components/OverflowMenu/package.json +8 -1
  52. package/dist/dynamic/components/Page/package.json +8 -1
  53. package/dist/dynamic/components/Pagination/package.json +8 -1
  54. package/dist/dynamic/components/Panel/package.json +8 -1
  55. package/dist/dynamic/components/Popover/package.json +8 -1
  56. package/dist/dynamic/components/Progress/package.json +8 -1
  57. package/dist/dynamic/components/ProgressStepper/package.json +8 -1
  58. package/dist/dynamic/components/Radio/package.json +8 -1
  59. package/dist/dynamic/components/SearchInput/package.json +8 -1
  60. package/dist/dynamic/components/Select/package.json +8 -1
  61. package/dist/dynamic/components/Sidebar/package.json +8 -1
  62. package/dist/dynamic/components/SimpleList/package.json +8 -1
  63. package/dist/dynamic/components/Skeleton/package.json +8 -1
  64. package/dist/dynamic/components/SkipToContent/package.json +8 -1
  65. package/dist/dynamic/components/Slider/package.json +8 -1
  66. package/dist/dynamic/components/Spinner/package.json +8 -1
  67. package/dist/dynamic/components/Switch/package.json +8 -1
  68. package/dist/dynamic/components/Tabs/package.json +8 -1
  69. package/dist/dynamic/components/Text/package.json +8 -1
  70. package/dist/dynamic/components/TextArea/package.json +8 -1
  71. package/dist/dynamic/components/TextInput/package.json +8 -1
  72. package/dist/dynamic/components/TextInputGroup/package.json +8 -1
  73. package/dist/dynamic/components/Tile/package.json +8 -1
  74. package/dist/dynamic/components/TimePicker/package.json +8 -1
  75. package/dist/dynamic/components/Timestamp/package.json +8 -1
  76. package/dist/dynamic/components/Title/package.json +8 -1
  77. package/dist/dynamic/components/ToggleGroup/package.json +8 -1
  78. package/dist/dynamic/components/Toolbar/package.json +8 -1
  79. package/dist/dynamic/components/Tooltip/package.json +8 -1
  80. package/dist/dynamic/components/TreeView/package.json +8 -1
  81. package/dist/dynamic/components/Truncate/package.json +8 -1
  82. package/dist/dynamic/components/Wizard/hooks/package.json +8 -1
  83. package/dist/dynamic/components/Wizard/package.json +8 -1
  84. package/dist/dynamic/deprecated/components/Chip/package.json +8 -1
  85. package/dist/dynamic/deprecated/components/DragDrop/package.json +8 -1
  86. package/dist/dynamic/deprecated/components/DualListSelector/package.json +8 -1
  87. package/dist/dynamic/deprecated/components/Modal/package.json +8 -1
  88. package/dist/dynamic/deprecated/components/Wizard/package.json +8 -1
  89. package/dist/dynamic/deprecated/components/package.json +8 -1
  90. package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +8 -1
  91. package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +8 -1
  92. package/dist/dynamic/helpers/KeyboardHandler/package.json +8 -1
  93. package/dist/dynamic/helpers/OUIA/ouia/package.json +8 -1
  94. package/dist/dynamic/helpers/Popper/Popper/package.json +8 -1
  95. package/dist/dynamic/helpers/constants/package.json +8 -1
  96. package/dist/dynamic/helpers/datetimeUtils/package.json +8 -1
  97. package/dist/dynamic/helpers/fileUtils/package.json +8 -1
  98. package/dist/dynamic/helpers/htmlConstants/package.json +8 -1
  99. package/dist/dynamic/helpers/package.json +8 -1
  100. package/dist/dynamic/helpers/resizeObserver/package.json +8 -1
  101. package/dist/dynamic/helpers/typeUtils/package.json +8 -1
  102. package/dist/dynamic/helpers/useInterval/package.json +8 -1
  103. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +8 -1
  104. package/dist/dynamic/helpers/useUnmountEffect/package.json +8 -1
  105. package/dist/dynamic/helpers/util/package.json +8 -1
  106. package/dist/dynamic/layouts/Bullseye/package.json +8 -1
  107. package/dist/dynamic/layouts/Flex/package.json +8 -1
  108. package/dist/dynamic/layouts/Gallery/package.json +8 -1
  109. package/dist/dynamic/layouts/Grid/package.json +8 -1
  110. package/dist/dynamic/layouts/Level/package.json +8 -1
  111. package/dist/dynamic/layouts/Split/package.json +8 -1
  112. package/dist/dynamic/layouts/Stack/package.json +8 -1
  113. package/dist/dynamic/styles/package.json +8 -1
  114. package/dist/esm/components/CalendarMonth/CalendarMonth.js +16 -19
  115. package/dist/esm/components/CalendarMonth/CalendarMonth.js.map +1 -1
  116. package/dist/esm/components/DatePicker/DatePicker.d.ts.map +1 -1
  117. package/dist/esm/components/DatePicker/DatePicker.js +16 -1
  118. package/dist/esm/components/DatePicker/DatePicker.js.map +1 -1
  119. package/dist/esm/components/Drawer/__tests__/DrawerPanelDescription.d.ts +1 -1
  120. package/dist/esm/components/Drawer/__tests__/DrawerPanelDescription.d.ts.map +1 -1
  121. package/dist/esm/components/Drawer/__tests__/DrawerPanelDescription.js +1 -0
  122. package/dist/esm/components/Drawer/__tests__/DrawerPanelDescription.js.map +1 -1
  123. package/dist/esm/components/MenuToggle/MenuToggle.d.ts +6 -1
  124. package/dist/esm/components/MenuToggle/MenuToggle.d.ts.map +1 -1
  125. package/dist/esm/components/MenuToggle/MenuToggle.js +11 -5
  126. package/dist/esm/components/MenuToggle/MenuToggle.js.map +1 -1
  127. package/dist/esm/deprecated/components/Modal/Modal.d.ts +3 -3
  128. package/dist/esm/deprecated/components/Modal/Modal.d.ts.map +1 -1
  129. package/dist/esm/deprecated/components/Modal/Modal.js +1 -1
  130. package/dist/esm/deprecated/components/Modal/Modal.js.map +1 -1
  131. package/dist/esm/deprecated/components/Modal/ModalContent.d.ts +2 -2
  132. package/dist/esm/deprecated/components/Modal/ModalContent.d.ts.map +1 -1
  133. package/dist/js/components/CalendarMonth/CalendarMonth.js +16 -19
  134. package/dist/js/components/CalendarMonth/CalendarMonth.js.map +1 -1
  135. package/dist/js/components/DatePicker/DatePicker.d.ts.map +1 -1
  136. package/dist/js/components/DatePicker/DatePicker.js +16 -1
  137. package/dist/js/components/DatePicker/DatePicker.js.map +1 -1
  138. package/dist/js/components/Drawer/__tests__/DrawerPanelDescription.d.ts +1 -1
  139. package/dist/js/components/Drawer/__tests__/DrawerPanelDescription.d.ts.map +1 -1
  140. package/dist/js/components/Drawer/__tests__/DrawerPanelDescription.js +1 -0
  141. package/dist/js/components/Drawer/__tests__/DrawerPanelDescription.js.map +1 -1
  142. package/dist/js/components/MenuToggle/MenuToggle.d.ts +6 -1
  143. package/dist/js/components/MenuToggle/MenuToggle.d.ts.map +1 -1
  144. package/dist/js/components/MenuToggle/MenuToggle.js +11 -5
  145. package/dist/js/components/MenuToggle/MenuToggle.js.map +1 -1
  146. package/dist/js/deprecated/components/Modal/Modal.d.ts +3 -3
  147. package/dist/js/deprecated/components/Modal/Modal.d.ts.map +1 -1
  148. package/dist/js/deprecated/components/Modal/Modal.js +1 -1
  149. package/dist/js/deprecated/components/Modal/Modal.js.map +1 -1
  150. package/dist/js/deprecated/components/Modal/ModalContent.d.ts +2 -2
  151. package/dist/js/deprecated/components/Modal/ModalContent.d.ts.map +1 -1
  152. package/dist/umd/assets/{output-C1Tl2GQc.css → output-CdTxonRl.css} +7114 -7114
  153. package/dist/umd/react-core.min.js +1 -1
  154. package/helpers/package.json +8 -1
  155. package/layouts/package.json +8 -1
  156. package/next/package.json +8 -1
  157. package/package.json +7 -8
  158. package/src/components/CalendarMonth/CalendarMonth.tsx +19 -19
  159. package/src/components/DatePicker/DatePicker.tsx +19 -1
  160. package/src/components/DatePicker/__tests__/__snapshots__/DatePicker.test.tsx.snap +3 -0
  161. package/src/components/Drawer/__tests__/DrawerPanelDescription.tsx +1 -0
  162. package/src/components/MenuToggle/MenuToggle.tsx +29 -7
  163. package/src/components/MenuToggle/__tests__/__snapshots__/MenuToggle.test.tsx.snap +27 -0
  164. package/src/components/MenuToggle/examples/MenuToggle.md +12 -10
  165. package/src/components/Nav/__tests__/Generated/NavList.test.tsx +1 -1
  166. package/src/components/Nav/__tests__/__snapshots__/Nav.test.tsx.snap +1 -1
  167. package/src/components/Page/examples/Page.md +8 -0
  168. package/src/components/Page/examples/PageMainSectionVariations.tsx +84 -0
  169. package/src/components/Pagination/__tests__/Generated/__snapshots__/PaginationOptionsMenu.test.tsx.snap +3 -0
  170. package/src/components/Pagination/__tests__/__snapshots__/Pagination.test.tsx.snap +60 -0
  171. package/src/components/SearchInput/__tests__/__snapshots__/SearchInput.test.tsx.snap +2 -2
  172. package/src/components/SimpleList/__tests__/SimpleList.test.tsx +3 -3
  173. package/src/components/TextInput/__tests__/TextInput.test.tsx +1 -1
  174. package/src/demos/DescriptionList/DescriptionList.md +14 -0
  175. package/src/demos/DescriptionList/examples/DescriptionListBasic.tsx +86 -0
  176. package/src/demos/Masthead.md +5 -3
  177. package/src/demos/examples/Masthead/MastheadWithHorizontalNav.tsx +322 -0
  178. package/src/deprecated/components/Modal/Modal.tsx +4 -4
  179. package/src/deprecated/components/Modal/ModalContent.tsx +2 -2
@@ -1 +1,8 @@
1
- {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"6.0.0-alpha.70","private":true}
1
+ {
2
+ "name": "@patternfly/react-core-helpers",
3
+ "main": "../dist/js/helpers/index.js",
4
+ "module": "../dist/esm/helpers/index.js",
5
+ "typings": "../dist/esm/helpers/index.d.ts",
6
+ "version": "6.0.0-alpha.71",
7
+ "private": true
8
+ }
@@ -1 +1,8 @@
1
- {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"6.0.0-alpha.70","private":true}
1
+ {
2
+ "name": "@patternfly/react-core-layouts",
3
+ "main": "../dist/js/layouts/index.js",
4
+ "module": "../dist/esm/layouts/index.js",
5
+ "typings": "../dist/esm/layouts/index.d.ts",
6
+ "version": "6.0.0-alpha.71",
7
+ "private": true
8
+ }
package/next/package.json CHANGED
@@ -1 +1,8 @@
1
- {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"6.0.0-alpha.70","private":true}
1
+ {
2
+ "name": "@patternfly/react-core-next",
3
+ "main": "../dist/js/next/index.js",
4
+ "module": "../dist/esm/next/index.js",
5
+ "typings": "../dist/esm/next/index.d.ts",
6
+ "version": "6.0.0-alpha.71",
7
+ "private": true
8
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/react-core",
3
- "version": "6.0.0-alpha.71",
3
+ "version": "6.0.0-alpha.72",
4
4
  "description": "This library provides a set of common React components for use with the PatternFly reference implementation.",
5
5
  "main": "dist/js/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -47,9 +47,9 @@
47
47
  "clean:exports": "node scripts/cleanDistExports.js"
48
48
  },
49
49
  "dependencies": {
50
- "@patternfly/react-icons": "^6.0.0-alpha.25",
51
- "@patternfly/react-styles": "^6.0.0-alpha.24",
52
- "@patternfly/react-tokens": "^6.0.0-alpha.24",
50
+ "@patternfly/react-icons": "^6.0.0-alpha.26",
51
+ "@patternfly/react-styles": "^6.0.0-alpha.25",
52
+ "@patternfly/react-tokens": "^6.0.0-alpha.25",
53
53
  "focus-trap": "7.5.4",
54
54
  "react-dropzone": "^14.2.3",
55
55
  "tslib": "^2.6.2"
@@ -57,13 +57,12 @@
57
57
  "devDependencies": {
58
58
  "@patternfly/patternfly": "6.0.0-alpha.150",
59
59
  "case-anything": "^2.1.13",
60
- "css": "^2.2.3",
61
- "fs-extra": "^11.1.1",
62
- "glob": "^7.1.2"
60
+ "css": "^3.0.0",
61
+ "fs-extra": "^11.2.0"
63
62
  },
64
63
  "peerDependencies": {
65
64
  "react": "^17 || ^18",
66
65
  "react-dom": "^17 || ^18"
67
66
  },
68
- "gitHead": "74b0b00a5b489551ae02aef64d22e6f3fb3557e0"
67
+ "gitHead": "0df6094898bc94f9b0881e1ab97e6d0941df90af"
69
68
  }
@@ -168,7 +168,7 @@ export const CalendarMonth = ({
168
168
  const yearFormatted = yearFormat(focusedDate);
169
169
  const [yearInput, setYearInput] = React.useState(yearFormatted.toString());
170
170
 
171
- const [hoveredDate, setHoveredDate] = React.useState(new Date(focusedDate));
171
+ const [hoveredDate, setHoveredDate] = React.useState<Date>(undefined);
172
172
  const focusRef = React.useRef<HTMLButtonElement>();
173
173
  const [hiddenMonthId] = React.useState(getUniqueId('hidden-month-span'));
174
174
  const [shouldFocus, setShouldFocus] = React.useState(false);
@@ -192,7 +192,6 @@ export const CalendarMonth = ({
192
192
 
193
193
  const onMonthClick = (ev: React.MouseEvent, newDate: Date) => {
194
194
  setFocusedDate(newDate);
195
- setHoveredDate(newDate);
196
195
  setShouldFocus(false);
197
196
  onMonthChange(ev, newDate);
198
197
  setYearInput(yearFormat(newDate).toString());
@@ -212,7 +211,6 @@ export const CalendarMonth = ({
212
211
  if (newDate.getTime() !== focusedDate.getTime() && isValidated(newDate)) {
213
212
  ev.preventDefault();
214
213
  setFocusedDate(newDate);
215
- setHoveredDate(newDate);
216
214
  setShouldFocus(true);
217
215
  }
218
216
  };
@@ -238,7 +236,6 @@ export const CalendarMonth = ({
238
236
  if (yearNum >= MIN_YEAR && yearNum <= MAX_YEAR) {
239
237
  const newDate = changeYear(yearNum);
240
238
  setFocusedDate(newDate);
241
- setHoveredDate(newDate);
242
239
  setShouldFocus(false);
243
240
 
244
241
  // We need to manually focus the year input in FireFox when the scroll buttons are clicked, as FireFox doesn't place focus automatically
@@ -282,10 +279,9 @@ export const CalendarMonth = ({
282
279
  .map(({ date }) => date)[0];
283
280
  if (toFocus) {
284
281
  setFocusedDate(toFocus);
285
- setHoveredDate(toFocus);
286
282
  }
287
283
  }
288
- const isHoveredDateValid = isValidated(hoveredDate);
284
+ const isHoveredDateValid = hoveredDate && isValidated(hoveredDate);
289
285
  const monthFormatted = monthFormat(focusedDate);
290
286
 
291
287
  const calendarToRender = (
@@ -331,7 +327,6 @@ export const CalendarMonth = ({
331
327
  onSelectToggle(false);
332
328
  const newDate = changeMonth(Number(monthNum as string));
333
329
  setFocusedDate(newDate);
334
- setHoveredDate(newDate);
335
330
  setShouldFocus(false);
336
331
  onMonthChange(ev, newDate);
337
332
  }, 0);
@@ -369,7 +364,7 @@ export const CalendarMonth = ({
369
364
  </Button>
370
365
  </div>
371
366
  </div>
372
- <table className={styles.calendarMonthCalendar}>
367
+ <table className={styles.calendarMonthCalendar} onMouseLeave={() => setHoveredDate(undefined)}>
373
368
  <thead className={styles.calendarMonthDays}>
374
369
  <tr>
375
370
  {calendar[0].map(({ date }, index) => (
@@ -392,16 +387,21 @@ export const CalendarMonth = ({
392
387
  const isRangeStart = isValidDate(rangeStart) && isSameDate(date, rangeStart);
393
388
  let isInRange = false;
394
389
  let isRangeEnd = false;
395
- if (isValidDate(rangeStart) && isValidDate(dateProp)) {
396
- isInRange = date > rangeStart && date < dateProp;
397
- isRangeEnd = isSameDate(date, dateProp);
398
- } else if (isValidDate(rangeStart) && isHoveredDateValid) {
399
- if (hoveredDate > rangeStart || isSameDate(hoveredDate, rangeStart)) {
400
- isInRange = date > rangeStart && date < hoveredDate;
401
- isRangeEnd = isSameDate(date, hoveredDate);
390
+ if (isValidDate(rangeStart)) {
391
+ let rangeEndDate: Date;
392
+
393
+ if (isValidDate(dateProp)) {
394
+ rangeEndDate = dateProp;
395
+ }
396
+ if (isHoveredDateValid && (!isValidDate(dateProp) || hoveredDate > dateProp)) {
397
+ rangeEndDate = hoveredDate;
398
+ }
399
+
400
+ if (rangeEndDate) {
401
+ isInRange = date >= rangeStart && date <= rangeEndDate;
402
+ isRangeEnd = isSameDate(date, rangeEndDate);
402
403
  }
403
- // Don't handle focused dates before start dates for now.
404
- // Core would likely need new styles
404
+ // Core would likely need new styles for "is selected but disabled"
405
405
  }
406
406
 
407
407
  return (
@@ -412,8 +412,8 @@ export const CalendarMonth = ({
412
412
  isAdjacentMonth && styles.modifiers.adjacentMonth,
413
413
  isToday && styles.modifiers.current,
414
414
  (isSelected || isRangeStart) && styles.modifiers.selected,
415
- !isValid && styles.modifiers.disabled,
416
- (isInRange || isRangeStart || isRangeEnd) && styles.modifiers.inRange,
415
+ !isValid && !(isInRange || isRangeStart || isRangeEnd || isSelected) && styles.modifiers.disabled,
416
+ isInRange && styles.modifiers.inRange,
417
417
  isRangeStart && styles.modifiers.startRange,
418
418
  isRangeEnd && styles.modifiers.endRange
419
419
  )}
@@ -231,12 +231,30 @@ const DatePickerBase = (
231
231
  const createFocusSelectorString = (modifierClass: string) =>
232
232
  `.${calendarMonthStyles.calendarMonthDatesCell}.${modifierClass} .${calendarMonthStyles.calendarMonthDate}`;
233
233
  const focusSelectorForSelectedDate = createFocusSelectorString(calendarMonthStyles.modifiers.selected);
234
+ const focusSelectorForSelectedEndRangeDate = createFocusSelectorString(
235
+ `${calendarMonthStyles.modifiers.selected}.${calendarMonthStyles.modifiers.endRange}`
236
+ );
234
237
  const focusSelectorForUnselectedDate = createFocusSelectorString(calendarMonthStyles.modifiers.current);
235
238
 
239
+ /**
240
+ * Returns a CSS selector for a date button element which will receive initial focus after opening calendar popover.
241
+ * In case of a range picker it returns the end date, if it is selected, start date otherwise.
242
+ * In case of a normal datepicker it returns the selected date, if present, today otherwise.
243
+ */
244
+ const getElementSelectorToFocus = () => {
245
+ if (isValidDate(valueDate) && isValidDate(rangeStart)) {
246
+ return focusSelectorForSelectedEndRangeDate;
247
+ }
248
+ if (isValidDate(valueDate) || isValidDate(rangeStart)) {
249
+ return focusSelectorForSelectedDate;
250
+ }
251
+ return focusSelectorForUnselectedDate;
252
+ };
253
+
236
254
  return (
237
255
  <div className={css(styles.datePicker, className)} ref={datePickerWrapperRef} style={style} {...props}>
238
256
  <Popover
239
- elementToFocus={isValidDate(valueDate) ? focusSelectorForSelectedDate : focusSelectorForUnselectedDate}
257
+ elementToFocus={getElementSelectorToFocus()}
240
258
  position="bottom"
241
259
  bodyContent={
242
260
  <CalendarMonth
@@ -127,6 +127,9 @@ exports[`With popover opened 1`] = `
127
127
  <button
128
128
  aria-expanded="false"
129
129
  class="pf-v6-c-menu-toggle"
130
+ data-ouia-component-id="OUIA-Generated-MenuToggle-1"
131
+ data-ouia-component-type="PF6/MenuToggle"
132
+ data-ouia-safe="true"
130
133
  style="width: 140px;"
131
134
  type="button"
132
135
  >
@@ -2,6 +2,7 @@ import React from 'react';
2
2
  import { render, screen } from '@testing-library/react';
3
3
  import { DrawerPanelDescription } from '../DrawerPanelDescription';
4
4
  import styles from '@patternfly/react-styles/css/components/Drawer/drawer';
5
+ import '@testing-library/jest-dom';
5
6
 
6
7
  test(`Renders with only class ${styles.drawerDescription} by default`, () => {
7
8
  render(<DrawerPanelDescription>description content</DrawerPanelDescription>);
@@ -6,6 +6,7 @@ import { BadgeProps } from '../Badge';
6
6
  import CheckCircleIcon from '@patternfly/react-icons/dist/esm/icons/check-circle-icon';
7
7
  import ExclamationCircleIcon from '@patternfly/react-icons/dist/esm/icons/exclamation-circle-icon';
8
8
  import ExclamationTriangleIcon from '@patternfly/react-icons/dist/esm/icons/exclamation-triangle-icon';
9
+ import { OUIAProps, getDefaultOUIAId, getOUIAProps } from '../../helpers';
9
10
 
10
11
  export enum MenuToggleStatus {
11
12
  success = 'success',
@@ -24,12 +25,13 @@ export interface SplitButtonOptions {
24
25
 
25
26
  export interface MenuToggleProps
26
27
  extends Omit<
27
- React.DetailedHTMLProps<
28
- React.ButtonHTMLAttributes<HTMLButtonElement> & React.HTMLAttributes<HTMLDivElement>,
29
- MenuToggleElement
28
+ React.DetailedHTMLProps<
29
+ React.ButtonHTMLAttributes<HTMLButtonElement> & React.HTMLAttributes<HTMLDivElement>,
30
+ MenuToggleElement
31
+ >,
32
+ 'ref'
30
33
  >,
31
- 'ref'
32
- > {
34
+ OUIAProps {
33
35
  /** Content rendered inside the toggle */
34
36
  children?: React.ReactNode;
35
37
  /** Additional classes added to the toggle */
@@ -58,16 +60,29 @@ export interface MenuToggleProps
58
60
  badge?: BadgeProps | React.ReactNode;
59
61
  /** @hide Forwarded ref */
60
62
  innerRef?: React.Ref<MenuToggleElement>;
63
+ /** Value to overwrite the randomly generated data-ouia-component-id. It will always target the toggle button. */
64
+ ouiaId?: number | string;
65
+ /** Set the value of data-ouia-safe. Only set to true when the component is in a static state, i.e. no animations are occurring. At all other times, this value must be false. */
66
+ ouiaSafe?: boolean;
61
67
  }
62
68
 
63
- class MenuToggleBase extends React.Component<MenuToggleProps> {
69
+ interface MenuToggleState {
70
+ ouiaStateId: string;
71
+ }
72
+
73
+ class MenuToggleBase extends React.Component<MenuToggleProps, MenuToggleState> {
64
74
  displayName = 'MenuToggleBase';
65
75
  static defaultProps: MenuToggleProps = {
66
76
  className: '',
67
77
  isExpanded: false,
68
78
  isDisabled: false,
69
79
  isFullWidth: false,
70
- isFullHeight: false
80
+ isFullHeight: false,
81
+ ouiaSafe: true
82
+ };
83
+
84
+ state: MenuToggleState = {
85
+ ouiaStateId: getDefaultOUIAId(MenuToggle.displayName, this.props.variant)
71
86
  };
72
87
 
73
88
  render() {
@@ -87,12 +102,16 @@ class MenuToggleBase extends React.Component<MenuToggleProps> {
87
102
  innerRef,
88
103
  onClick,
89
104
  'aria-label': ariaLabel,
105
+ ouiaId,
106
+ ouiaSafe,
90
107
  ...otherProps
91
108
  } = this.props;
92
109
  const isPlain = variant === 'plain';
93
110
  const isPlainText = variant === 'plainText';
94
111
  const isTypeahead = variant === 'typeahead';
95
112
 
113
+ const ouiaProps = getOUIAProps(MenuToggle.displayName, ouiaId ?? this.state.ouiaStateId, ouiaSafe);
114
+
96
115
  let _statusIcon = statusIcon;
97
116
  if (!statusIcon) {
98
117
  switch (status) {
@@ -130,6 +149,7 @@ class MenuToggleBase extends React.Component<MenuToggleProps> {
130
149
  onClick={onClick}
131
150
  aria-label={ariaLabel || 'Menu toggle'}
132
151
  tabIndex={-1}
152
+ {...ouiaProps}
133
153
  >
134
154
  {toggleControls}
135
155
  </button>
@@ -189,6 +209,7 @@ class MenuToggleBase extends React.Component<MenuToggleProps> {
189
209
  onClick={onClick}
190
210
  {...(children && { style: { display: 'flex', paddingLeft: 'var(--pf-v5-global--spacer--sm)' } })}
191
211
  {...otherProps}
212
+ {...ouiaProps}
192
213
  >
193
214
  {children && <span className={css(styles.menuToggleText)}>{children}</span>}
194
215
  {toggleControls}
@@ -207,6 +228,7 @@ class MenuToggleBase extends React.Component<MenuToggleProps> {
207
228
  disabled={isDisabled}
208
229
  onClick={onClick}
209
230
  {...componentProps}
231
+ {...ouiaProps}
210
232
  />
211
233
  );
212
234
  }
@@ -5,6 +5,9 @@ exports[`menu toggle passes additional classes 1`] = `
5
5
  <button
6
6
  aria-expanded="false"
7
7
  class="pf-v6-c-menu-toggle test-class"
8
+ data-ouia-component-id="OUIA-Generated-MenuToggle-2"
9
+ data-ouia-component-type="PF6/MenuToggle"
10
+ data-ouia-safe="true"
8
11
  type="button"
9
12
  >
10
13
  <span
@@ -42,6 +45,9 @@ exports[`menu toggle renders successfully 1`] = `
42
45
  <button
43
46
  aria-expanded="false"
44
47
  class="pf-v6-c-menu-toggle"
48
+ data-ouia-component-id="OUIA-Generated-MenuToggle-1"
49
+ data-ouia-component-type="PF6/MenuToggle"
50
+ data-ouia-safe="true"
45
51
  type="button"
46
52
  >
47
53
  <span
@@ -79,6 +85,9 @@ exports[`menu toggle shows badge 1`] = `
79
85
  <button
80
86
  aria-expanded="false"
81
87
  class="pf-v6-c-menu-toggle"
88
+ data-ouia-component-id="OUIA-Generated-MenuToggle-6"
89
+ data-ouia-component-type="PF6/MenuToggle"
90
+ data-ouia-safe="true"
82
91
  type="button"
83
92
  >
84
93
  <span
@@ -125,6 +134,9 @@ exports[`menu toggle shows icon 1`] = `
125
134
  <button
126
135
  aria-expanded="false"
127
136
  class="pf-v6-c-menu-toggle"
137
+ data-ouia-component-id="OUIA-Generated-MenuToggle-5"
138
+ data-ouia-component-type="PF6/MenuToggle"
139
+ data-ouia-safe="true"
128
140
  type="button"
129
141
  >
130
142
  <span
@@ -179,6 +191,9 @@ exports[`menu toggle shows isDisabled 1`] = `
179
191
  <button
180
192
  aria-expanded="false"
181
193
  class="pf-v6-c-menu-toggle pf-m-disabled"
194
+ data-ouia-component-id="OUIA-Generated-MenuToggle-4"
195
+ data-ouia-component-type="PF6/MenuToggle"
196
+ data-ouia-safe="true"
182
197
  disabled=""
183
198
  type="button"
184
199
  >
@@ -217,6 +232,9 @@ exports[`menu toggle shows isExpanded 1`] = `
217
232
  <button
218
233
  aria-expanded="true"
219
234
  class="pf-v6-c-menu-toggle pf-m-expanded"
235
+ data-ouia-component-id="OUIA-Generated-MenuToggle-3"
236
+ data-ouia-component-type="PF6/MenuToggle"
237
+ data-ouia-safe="true"
220
238
  type="button"
221
239
  >
222
240
  <span
@@ -254,6 +272,9 @@ exports[`menu toggle shows isPlain 1`] = `
254
272
  <button
255
273
  aria-expanded="false"
256
274
  class="pf-v6-c-menu-toggle pf-m-plain"
275
+ data-ouia-component-id="OUIA-Generated-MenuToggle-plain-1"
276
+ data-ouia-component-type="PF6/MenuToggle"
277
+ data-ouia-safe="true"
257
278
  type="button"
258
279
  >
259
280
  <span
@@ -282,6 +303,9 @@ exports[`menu toggle shows isPrimary 1`] = `
282
303
  <button
283
304
  aria-expanded="false"
284
305
  class="pf-v6-c-menu-toggle pf-m-primary"
306
+ data-ouia-component-id="OUIA-Generated-MenuToggle-primary-1"
307
+ data-ouia-component-type="PF6/MenuToggle"
308
+ data-ouia-safe="true"
285
309
  type="button"
286
310
  >
287
311
  <span
@@ -319,6 +343,9 @@ exports[`menu toggle shows plain text 1`] = `
319
343
  <button
320
344
  aria-expanded="false"
321
345
  class="pf-v6-c-menu-toggle pf-m-plain pf-m-text"
346
+ data-ouia-component-id="OUIA-Generated-MenuToggle-plainText-1"
347
+ data-ouia-component-type="PF6/MenuToggle"
348
+ data-ouia-safe="true"
322
349
  type="button"
323
350
  >
324
351
  <span
@@ -191,9 +191,11 @@ import { MenuToggle } from '@patternfly/react-core';
191
191
  </React.Fragment>
192
192
  ```
193
193
 
194
- ### Split button toggle with checkbox
194
+ ### Split toggle with checkbox
195
195
 
196
- To add an action button or other control to a menu toggle, use a split button. A `<MenuToggle>` can be rendered as a split button by adding a `splitButtonOptions` object. Elements to be displayed before the toggle button must be included in the `items` property of `splitButtonOptions`.
196
+ To add a checkbox (or other action/control) to a menu toggle, use a split button.
197
+
198
+ A `<MenuToggle>` can be rendered as a split button by adding a `splitButtonOptions` object. Elements to be displayed before the toggle button must be included in the `items` property of `splitButtonOptions`.
197
199
 
198
200
  The following example shows a split button with a `<MenuToggleCheckbox>`.
199
201
 
@@ -203,25 +205,25 @@ Variant styling can be applied to split button toggles to adjust their appearanc
203
205
 
204
206
  ```
205
207
 
206
- ### Split button toggle with checkbox label
208
+ ### Split toggle with labeled checkbox
207
209
 
208
- To display text in a split button menu toggle, add a label to the `items` property of `splitButtonOptions`.
210
+ To add a text label to a split button toggle, pass `children` to the `<MenuToggle>` component.
209
211
 
210
- ```ts file='MenuToggleSplitButtonCheckboxWithText.tsx'
212
+ ```ts file='MenuToggleSplitButtonCheckboxWithToggleText.tsx'
211
213
 
212
214
  ```
213
215
 
214
- ### Split button toggle with checkbox and toggle button text
216
+ ### Split toggle with checkbox and toggle text label
215
217
 
216
- For split button toggles that should still contain text which will trigger the toggle's `onClick`, pass `children` to the `MenuToggle`.
218
+ You can allow users to select a toggle checkbox by clicking either the checkbox or the text label.
217
219
 
218
- The following example shows a split button with a `<MenuToggleCheckbox>` and toggle button text.
220
+ To do so, pass `children` to the `<MenuToggleCheckbox>` component. When the menu toggle text is clicked, the checkbox's `onChange` callback will be triggered.
219
221
 
220
- ```ts file='MenuToggleSplitButtonCheckboxWithToggleText.tsx'
222
+ ```ts file='MenuToggleSplitButtonCheckboxWithText.tsx'
221
223
 
222
224
  ```
223
225
 
224
- ### Split button toggle with action
226
+ ### Split toggle with action
225
227
 
226
228
  To add an action to a split button, pass `variant='action'` into `splitButtonOptions` and add a `<MenuToggleAction>` to the `items` property of `splitButtonOptions`.
227
229
 
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
 
3
3
  import { render } from '@testing-library/react';
4
- import * as ReactCoreUtils from '@patternfly/react-core/src/helpers/util';
4
+ import * as ReactCoreUtils from '../../../../helpers/util';
5
5
 
6
6
  import { NavList } from '../../NavList';
7
7
  import { NavContext } from '../../Nav';
@@ -874,7 +874,7 @@ exports[`Nav Nav List with flyout 1`] = `
874
874
  data-popper-escaped="true"
875
875
  data-popper-placement="right-start"
876
876
  data-popper-reference-hidden="true"
877
- style="position: absolute; left: 0px; top: 0px; z-index: 9999; opacity: 0; transition: opacity 0ms cubic-bezier(.54, 1.5, .38, 1.11); min-width: 0px; transform: translate(0px, 0px);"
877
+ style="position: absolute; left: 0px; top: 0px; z-index: 9999; opacity: 1; transition: opacity 0ms cubic-bezier(.54, 1.5, .38, 1.11); min-width: 0px; transform: translate(0px, 0px);"
878
878
  >
879
879
  <div>
880
880
  Flyout test
@@ -95,6 +95,14 @@ To remove padding at specific breakpoints, pass in 'noPadding' at those breakpoi
95
95
 
96
96
  ```
97
97
 
98
+ ### Main section variations
99
+
100
+ This example shows all types of page sections.
101
+
102
+ ```ts file="./PageMainSectionVariations.tsx"
103
+
104
+ ```
105
+
98
106
  ### Group section
99
107
 
100
108
  To group page content sections, add 1 or more `<PageGroup>` components to a `<Page>`.
@@ -0,0 +1,84 @@
1
+ import React from 'react';
2
+ import {
3
+ Page,
4
+ Masthead,
5
+ MastheadToggle,
6
+ MastheadMain,
7
+ MastheadBrand,
8
+ MastheadContent,
9
+ PageSidebar,
10
+ PageSidebarBody,
11
+ PageSection,
12
+ PageToggleButton,
13
+ Toolbar,
14
+ ToolbarContent,
15
+ ToolbarItem
16
+ } from '@patternfly/react-core';
17
+ import BarsIcon from '@patternfly/react-icons/dist/esm/icons/bars-icon';
18
+
19
+ export const PageMainSectionPadding: React.FunctionComponent = () => {
20
+ const [isSidebarOpen, setIsSidebarOpen] = React.useState(true);
21
+
22
+ const onSidebarToggle = () => {
23
+ setIsSidebarOpen(!isSidebarOpen);
24
+ };
25
+
26
+ const headerToolbar = (
27
+ <Toolbar id="main-variations-toolbar">
28
+ <ToolbarContent>
29
+ <ToolbarItem>header-tools</ToolbarItem>
30
+ </ToolbarContent>
31
+ </Toolbar>
32
+ );
33
+
34
+ const header = (
35
+ <Masthead>
36
+ <MastheadToggle>
37
+ <PageToggleButton
38
+ variant="plain"
39
+ aria-label="Global navigation"
40
+ isSidebarOpen={isSidebarOpen}
41
+ onSidebarToggle={onSidebarToggle}
42
+ id="main-variations-nav-toggle"
43
+ >
44
+ <BarsIcon />
45
+ </PageToggleButton>
46
+ </MastheadToggle>
47
+ <MastheadMain>
48
+ <MastheadBrand href="https://patternfly.org" target="_blank">
49
+ Logo
50
+ </MastheadBrand>
51
+ </MastheadMain>
52
+ <MastheadContent>{headerToolbar}</MastheadContent>
53
+ </Masthead>
54
+ );
55
+
56
+ const sidebar = (
57
+ <PageSidebar isSidebarOpen={isSidebarOpen} id="main-variations-sidebar">
58
+ <PageSidebarBody>Navigation</PageSidebarBody>
59
+ </PageSidebar>
60
+ );
61
+
62
+ return (
63
+ <Page header={header} sidebar={sidebar}>
64
+ <PageSection type="subnav">
65
+ Section with <code>type="subnav"</code> for horizontal subnav navigation
66
+ </PageSection>
67
+ <PageSection type="nav">
68
+ Section with <code>type="nav"</code> for tertiary navigation
69
+ </PageSection>
70
+ <PageSection type="tabs">
71
+ Section with <code>type="tabs"</code> for tabs
72
+ </PageSection>
73
+ <PageSection type="breadcrumb">
74
+ Section with <code>type="breadcrumb"</code> for breadcrumbs
75
+ </PageSection>
76
+ <PageSection>
77
+ Section without <code>type</code> prop or <code>type="default"</code> for main sections
78
+ </PageSection>
79
+ <PageSection type="wizard">
80
+ Section with <code>type="wizard"</code> for wizards
81
+ </PageSection>
82
+ </Page>
83
+ );
84
+ };
@@ -6,6 +6,9 @@ exports[`PaginationOptionsMenu should match snapshot (auto-generated) 1`] = `
6
6
  aria-expanded="false"
7
7
  aria-haspopup="listbox"
8
8
  class="pf-v6-c-menu-toggle pf-m-plain pf-m-text"
9
+ data-ouia-component-id="OUIA-Generated-MenuToggle-plainText-1"
10
+ data-ouia-component-type="PF6/MenuToggle"
11
+ data-ouia-safe="true"
9
12
  id="''-toggle"
10
13
  type="button"
11
14
  >