@patternfly/react-core 5.0.0-alpha.33 → 5.0.0-alpha.35

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 (130) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/components/Dropdown/Dropdown.d.ts +2 -0
  3. package/components/Dropdown/Dropdown.d.ts.map +1 -1
  4. package/components/Dropdown/Dropdown.js +3 -3
  5. package/components/Dropdown/Dropdown.js.map +1 -1
  6. package/components/Dropdown/DropdownWithContext.d.ts.map +1 -1
  7. package/components/Dropdown/DropdownWithContext.js +2 -2
  8. package/components/Dropdown/DropdownWithContext.js.map +1 -1
  9. package/components/Pagination/PaginationOptionsMenu.d.ts +2 -0
  10. package/components/Pagination/PaginationOptionsMenu.d.ts.map +1 -1
  11. package/components/Pagination/PaginationOptionsMenu.js +2 -2
  12. package/components/Pagination/PaginationOptionsMenu.js.map +1 -1
  13. package/components/Popover/Popover.js +1 -1
  14. package/components/Popover/Popover.js.map +1 -1
  15. package/components/Tabs/OverflowTab.js +1 -1
  16. package/components/Tabs/OverflowTab.js.map +1 -1
  17. package/components/Tooltip/Tooltip.d.ts +2 -0
  18. package/components/Tooltip/Tooltip.d.ts.map +1 -1
  19. package/components/Tooltip/Tooltip.js +3 -3
  20. package/components/Tooltip/Tooltip.js.map +1 -1
  21. package/dist/esm/components/Dropdown/Dropdown.d.ts +2 -0
  22. package/dist/esm/components/Dropdown/Dropdown.d.ts.map +1 -1
  23. package/dist/esm/components/Dropdown/Dropdown.js +3 -3
  24. package/dist/esm/components/Dropdown/Dropdown.js.map +1 -1
  25. package/dist/esm/components/Dropdown/DropdownWithContext.d.ts.map +1 -1
  26. package/dist/esm/components/Dropdown/DropdownWithContext.js +2 -2
  27. package/dist/esm/components/Dropdown/DropdownWithContext.js.map +1 -1
  28. package/dist/esm/components/Pagination/PaginationOptionsMenu.d.ts +2 -0
  29. package/dist/esm/components/Pagination/PaginationOptionsMenu.d.ts.map +1 -1
  30. package/dist/esm/components/Pagination/PaginationOptionsMenu.js +2 -2
  31. package/dist/esm/components/Pagination/PaginationOptionsMenu.js.map +1 -1
  32. package/dist/esm/components/Popover/Popover.js +1 -1
  33. package/dist/esm/components/Popover/Popover.js.map +1 -1
  34. package/dist/esm/components/Tabs/OverflowTab.js +1 -1
  35. package/dist/esm/components/Tabs/OverflowTab.js.map +1 -1
  36. package/dist/esm/components/Tooltip/Tooltip.d.ts +2 -0
  37. package/dist/esm/components/Tooltip/Tooltip.d.ts.map +1 -1
  38. package/dist/esm/components/Tooltip/Tooltip.js +3 -3
  39. package/dist/esm/components/Tooltip/Tooltip.js.map +1 -1
  40. package/dist/esm/helpers/Popper/Popper.d.ts +6 -2
  41. package/dist/esm/helpers/Popper/Popper.d.ts.map +1 -1
  42. package/dist/esm/helpers/Popper/Popper.js +26 -8
  43. package/dist/esm/helpers/Popper/Popper.js.map +1 -1
  44. package/dist/esm/next/components/Dropdown/Dropdown.d.ts +1 -3
  45. package/dist/esm/next/components/Dropdown/Dropdown.d.ts.map +1 -1
  46. package/dist/esm/next/components/Dropdown/Dropdown.js +2 -6
  47. package/dist/esm/next/components/Dropdown/Dropdown.js.map +1 -1
  48. package/dist/esm/next/components/Select/Select.d.ts +3 -2
  49. package/dist/esm/next/components/Select/Select.d.ts.map +1 -1
  50. package/dist/esm/next/components/Select/Select.js +3 -7
  51. package/dist/esm/next/components/Select/Select.js.map +1 -1
  52. package/dist/js/components/Dropdown/Dropdown.d.ts +2 -0
  53. package/dist/js/components/Dropdown/Dropdown.d.ts.map +1 -1
  54. package/dist/js/components/Dropdown/Dropdown.js +3 -3
  55. package/dist/js/components/Dropdown/Dropdown.js.map +1 -1
  56. package/dist/js/components/Dropdown/DropdownWithContext.d.ts.map +1 -1
  57. package/dist/js/components/Dropdown/DropdownWithContext.js +2 -2
  58. package/dist/js/components/Dropdown/DropdownWithContext.js.map +1 -1
  59. package/dist/js/components/Pagination/PaginationOptionsMenu.d.ts +2 -0
  60. package/dist/js/components/Pagination/PaginationOptionsMenu.d.ts.map +1 -1
  61. package/dist/js/components/Pagination/PaginationOptionsMenu.js +2 -2
  62. package/dist/js/components/Pagination/PaginationOptionsMenu.js.map +1 -1
  63. package/dist/js/components/Popover/Popover.js +1 -1
  64. package/dist/js/components/Popover/Popover.js.map +1 -1
  65. package/dist/js/components/Tabs/OverflowTab.js +1 -1
  66. package/dist/js/components/Tabs/OverflowTab.js.map +1 -1
  67. package/dist/js/components/Tooltip/Tooltip.d.ts +2 -0
  68. package/dist/js/components/Tooltip/Tooltip.d.ts.map +1 -1
  69. package/dist/js/components/Tooltip/Tooltip.js +3 -3
  70. package/dist/js/components/Tooltip/Tooltip.js.map +1 -1
  71. package/dist/js/helpers/Popper/Popper.d.ts +6 -2
  72. package/dist/js/helpers/Popper/Popper.d.ts.map +1 -1
  73. package/dist/js/helpers/Popper/Popper.js +26 -8
  74. package/dist/js/helpers/Popper/Popper.js.map +1 -1
  75. package/dist/js/next/components/Dropdown/Dropdown.d.ts +1 -3
  76. package/dist/js/next/components/Dropdown/Dropdown.d.ts.map +1 -1
  77. package/dist/js/next/components/Dropdown/Dropdown.js +2 -6
  78. package/dist/js/next/components/Dropdown/Dropdown.js.map +1 -1
  79. package/dist/js/next/components/Select/Select.d.ts +3 -2
  80. package/dist/js/next/components/Select/Select.d.ts.map +1 -1
  81. package/dist/js/next/components/Select/Select.js +3 -7
  82. package/dist/js/next/components/Select/Select.js.map +1 -1
  83. package/dist/umd/react-core.min.js +2 -2
  84. package/helpers/Popper/Popper.d.ts +6 -2
  85. package/helpers/Popper/Popper.d.ts.map +1 -1
  86. package/helpers/Popper/Popper.js +26 -8
  87. package/helpers/Popper/Popper.js.map +1 -1
  88. package/next/components/Dropdown/Dropdown.d.ts +1 -3
  89. package/next/components/Dropdown/Dropdown.d.ts.map +1 -1
  90. package/next/components/Dropdown/Dropdown.js +2 -6
  91. package/next/components/Dropdown/Dropdown.js.map +1 -1
  92. package/next/components/Select/Select.d.ts +3 -2
  93. package/next/components/Select/Select.d.ts.map +1 -1
  94. package/next/components/Select/Select.js +3 -7
  95. package/next/components/Select/Select.js.map +1 -1
  96. package/package.json +2 -2
  97. package/src/components/Dropdown/Dropdown.tsx +5 -1
  98. package/src/components/Dropdown/DropdownWithContext.tsx +2 -1
  99. package/src/components/LabelGroup/examples/LabelGroupEditableAddDropdown.tsx +1 -8
  100. package/src/components/LabelGroup/examples/LabelGroupEditableAddModal.tsx +0 -2
  101. package/src/components/Nav/__tests__/__snapshots__/Nav.test.tsx.snap +1 -1
  102. package/src/components/Pagination/PaginationOptionsMenu.tsx +4 -1
  103. package/src/components/Popover/Popover.tsx +1 -1
  104. package/src/components/SearchInput/__tests__/__snapshots__/SearchInput.test.tsx.snap +1 -1
  105. package/src/components/Tabs/OverflowTab.tsx +1 -1
  106. package/src/components/Tabs/__tests__/OverflowTab.test.tsx +12 -20
  107. package/src/components/Tabs/__tests__/__snapshots__/OverflowTab.test.tsx.snap +0 -6
  108. package/src/components/Tooltip/Tooltip.tsx +4 -1
  109. package/src/demos/Card/Card.md +34 -31
  110. package/src/demos/ComposableMenu/examples/ComposableActionsMenu.tsx +1 -15
  111. package/src/demos/ComposableMenu/examples/ComposableApplicationLauncher.tsx +1 -10
  112. package/src/demos/ComposableMenu/examples/ComposableContextSelector.tsx +2 -21
  113. package/src/demos/ComposableMenu/examples/ComposableDateSelect.tsx +1 -10
  114. package/src/demos/ComposableMenu/examples/ComposableDrilldownMenu.tsx +1 -15
  115. package/src/demos/ComposableMenu/examples/ComposableDropdwnVariants.tsx +1 -8
  116. package/src/demos/ComposableMenu/examples/ComposableFlyout.tsx +1 -10
  117. package/src/demos/ComposableMenu/examples/ComposableTreeViewMenu.tsx +1 -10
  118. package/src/demos/Filters/examples/FilterAttributeSearch.tsx +0 -1
  119. package/src/demos/Filters/examples/FilterCheckboxSelect.tsx +0 -1
  120. package/src/demos/Filters/examples/FilterFaceted.tsx +0 -1
  121. package/src/demos/Filters/examples/FilterMixedSelectGroup.tsx +0 -1
  122. package/src/demos/Filters/examples/FilterSameSelectGroup.tsx +0 -1
  123. package/src/demos/Filters/examples/FilterSearchInput.tsx +0 -1
  124. package/src/demos/Filters/examples/FilterSingleSelect.tsx +0 -1
  125. package/src/helpers/Popper/Popper.tsx +39 -10
  126. package/src/next/components/Dropdown/Dropdown.tsx +1 -9
  127. package/src/next/components/Dropdown/__tests__/Dropdown.test.tsx +18 -38
  128. package/src/next/components/Dropdown/examples/DropdownWithDescriptions.tsx +3 -4
  129. package/src/next/components/Dropdown/examples/DropdownWithKebabToggle.tsx +3 -4
  130. package/src/next/components/Select/Select.tsx +5 -9
@@ -560,36 +560,6 @@ class CardViewBasic extends React.Component {
560
560
  swaggerIcon
561
561
  };
562
562
 
563
- const headerActions = (
564
- <>
565
- <Dropdown
566
- isPlain
567
- position="right"
568
- onSelect={(e) => this.onCardKebabDropdownSelect(key, e)}
569
- toggle={
570
- <KebabToggle
571
- onToggle={(_event, isCardKebabDropdownOpen) =>
572
- this.onCardKebabDropdownToggle(key, isCardKebabDropdownOpen)
573
- }
574
- />
575
- }
576
- isOpen={this.state[key]}
577
- dropdownItems={[
578
- <DropdownItem key="trash" onClick={this.deleteItem(product)} position="right">
579
- <TrashIcon />
580
- Delete
581
- </DropdownItem>
582
- ]}
583
- />
584
- <Checkbox
585
- checked={isChecked}
586
- value={product.id}
587
- isChecked={selectedItems.includes(product.id)}
588
- aria-label="card checkbox example"
589
- id={`check-${product.id}`}
590
- />
591
- </>
592
- );
593
563
  return (
594
564
  <React.Fragment>
595
565
  <DashboardWrapper mainContainerId="main-content-card-view-default-nav" breadcrumb={null}>
@@ -631,7 +601,40 @@ class CardViewBasic extends React.Component {
631
601
  onSelectableInputChange={() => this.onClick(product.id)}
632
602
  isSelected={selectedItems.includes(product.id)}
633
603
  >
634
- <CardHeader actions={{ actions: headerActions }}>
604
+ <CardHeader
605
+ actions={{
606
+ actions: (
607
+ <>
608
+ <Dropdown
609
+ isPlain
610
+ position="right"
611
+ onSelect={(e) => this.onCardKebabDropdownSelect(key, e)}
612
+ toggle={
613
+ <KebabToggle
614
+ onToggle={(_event, isCardKebabDropdownOpen) =>
615
+ this.onCardKebabDropdownToggle(key, isCardKebabDropdownOpen)
616
+ }
617
+ />
618
+ }
619
+ isOpen={this.state[key]}
620
+ dropdownItems={[
621
+ <DropdownItem key="trash" onClick={this.deleteItem(product)} position="right">
622
+ <TrashIcon />
623
+ Delete
624
+ </DropdownItem>
625
+ ]}
626
+ />
627
+ <Checkbox
628
+ checked={isChecked}
629
+ value={product.id}
630
+ isChecked={selectedItems.includes(product.id)}
631
+ aria-label="card checkbox example"
632
+ id={`check-${product.id}`}
633
+ />
634
+ </>
635
+ )
636
+ }}
637
+ >
635
638
  <img src={icons[product.icon]} alt={`${product.name} icon`} style={{ maxWidth: '60px' }} />
636
639
  </CardHeader>
637
640
  <CardTitle>{product.name}</CardTitle>
@@ -69,11 +69,6 @@ export const ComposableActionsMenu: React.FunctionComponent = () => {
69
69
  // eslint-disable-next-line no-console
70
70
  onActionClick={(event, itemId, actionId) => console.log(`clicked on ${itemId} - ${actionId}`)}
71
71
  onSelect={onSelect}
72
- style={
73
- {
74
- '--pf-c-menu--Width': '300px'
75
- } as React.CSSProperties
76
- }
77
72
  >
78
73
  <MenuGroup label="Actions">
79
74
  <MenuList>
@@ -122,14 +117,5 @@ export const ComposableActionsMenu: React.FunctionComponent = () => {
122
117
  </Menu>
123
118
  );
124
119
 
125
- return (
126
- <Popper
127
- trigger={toggle}
128
- triggerRef={toggleRef}
129
- popper={menu}
130
- popperRef={menuRef}
131
- isVisible={isOpen}
132
- popperMatchesTriggerWidth={false}
133
- />
134
- );
120
+ return <Popper trigger={toggle} triggerRef={toggleRef} popper={menu} popperRef={menuRef} isVisible={isOpen} />;
135
121
  };
@@ -265,14 +265,5 @@ export const ComposableApplicationLauncher: React.FunctionComponent = () => {
265
265
  </MenuContent>
266
266
  </Menu>
267
267
  );
268
- return (
269
- <Popper
270
- trigger={toggle}
271
- triggerRef={toggleRef}
272
- popper={menu}
273
- popperRef={menuRef}
274
- isVisible={isOpen}
275
- popperMatchesTriggerWidth={false}
276
- />
277
- );
268
+ return <Popper trigger={toggle} triggerRef={toggleRef} popper={menu} popperRef={menuRef} isVisible={isOpen} />;
278
269
  };
@@ -146,17 +146,7 @@ export const ComposableContextSelector: React.FunctionComponent = () => {
146
146
  };
147
147
 
148
148
  const menu = (
149
- <Menu
150
- ref={menuRef}
151
- id="context-selector"
152
- onSelect={onSelect}
153
- isScrollable
154
- style={
155
- {
156
- '--pf-c-menu--Width': '300px'
157
- } as React.CSSProperties
158
- }
159
- >
149
+ <Menu ref={menuRef} id="context-selector" onSelect={onSelect} isScrollable>
160
150
  <MenuInput>
161
151
  <InputGroup>
162
152
  <SearchInput
@@ -198,14 +188,5 @@ export const ComposableContextSelector: React.FunctionComponent = () => {
198
188
  </MenuFooter>
199
189
  </Menu>
200
190
  );
201
- return (
202
- <Popper
203
- trigger={toggle}
204
- triggerRef={toggleRef}
205
- popper={menu}
206
- popperRef={menuRef}
207
- isVisible={isOpen}
208
- popperMatchesTriggerWidth={false}
209
- />
210
- );
191
+ return <Popper trigger={toggle} triggerRef={toggleRef} popper={menu} popperRef={menuRef} isVisible={isOpen} />;
211
192
  };
@@ -109,14 +109,5 @@ export const ComposableSimpleDropdown: React.FunctionComponent = () => {
109
109
  </MenuContent>
110
110
  </Menu>
111
111
  );
112
- return (
113
- <Popper
114
- trigger={toggle}
115
- triggerRef={toggleRef}
116
- popper={menu}
117
- popperRef={menuRef}
118
- isVisible={isOpen}
119
- popperMatchesTriggerWidth={false}
120
- />
121
- );
112
+ return <Popper trigger={toggle} triggerRef={toggleRef} popper={menu} popperRef={menuRef} isVisible={isOpen} />;
122
113
  };
@@ -107,11 +107,6 @@ export const ComposableDrilldownMenu: React.FunctionComponent = () => {
107
107
  onDrillOut={drillOut}
108
108
  onGetMenuHeight={setHeight}
109
109
  ref={menuRef}
110
- style={
111
- {
112
- '--pf-c-menu--Width': '300px'
113
- } as React.CSSProperties
114
- }
115
110
  >
116
111
  <MenuContent menuHeight={`${menuHeights[activeMenu]}px`}>
117
112
  <MenuList>
@@ -247,14 +242,5 @@ export const ComposableDrilldownMenu: React.FunctionComponent = () => {
247
242
  </MenuContent>
248
243
  </Menu>
249
244
  );
250
- return (
251
- <Popper
252
- trigger={toggle}
253
- triggerRef={toggleRef}
254
- popper={menu}
255
- popperRef={menuRef}
256
- isVisible={isOpen}
257
- popperMatchesTriggerWidth={false}
258
- />
259
- );
245
+ return <Popper trigger={toggle} triggerRef={toggleRef} popper={menu} popperRef={menuRef} isVisible={isOpen} />;
260
246
  };
@@ -226,14 +226,7 @@ export const ComposableDropdwnVariants: React.FunctionComponent = () => {
226
226
  />
227
227
  </ToggleGroup>
228
228
  <br />
229
- <Popper
230
- trigger={buildToggle()}
231
- triggerRef={toggleRef}
232
- popper={menu}
233
- popperRef={menuRef}
234
- isVisible={isOpen}
235
- popperMatchesTriggerWidth={['image', 'checkbox'].includes(toggleSelected)}
236
- />
229
+ <Popper trigger={buildToggle()} triggerRef={toggleRef} popper={menu} popperRef={menuRef} isVisible={isOpen} />
237
230
  </React.Fragment>
238
231
  );
239
232
  };
@@ -100,14 +100,5 @@ export const ComposableFlyout: React.FunctionComponent = () => {
100
100
  </Menu>
101
101
  );
102
102
 
103
- return (
104
- <Popper
105
- trigger={toggle}
106
- triggerRef={toggleRef}
107
- popper={menu}
108
- popperRef={menuRef}
109
- isVisible={isOpen}
110
- popperMatchesTriggerWidth={false}
111
- />
112
- );
103
+ return <Popper trigger={toggle} triggerRef={toggleRef} popper={menu} popperRef={menuRef} isVisible={isOpen} />;
113
104
  };
@@ -267,14 +267,5 @@ export const ComposableTreeViewMenu: React.FunctionComponent = () => {
267
267
  </PanelMain>
268
268
  </Panel>
269
269
  );
270
- return (
271
- <Popper
272
- trigger={toggle}
273
- triggerRef={toggleRef}
274
- popper={menu}
275
- popperRef={menuRef}
276
- isVisible={isOpen}
277
- popperMatchesTriggerWidth={false}
278
- />
279
- );
270
+ return <Popper trigger={toggle} triggerRef={toggleRef} popper={menu} popperRef={menuRef} isVisible={isOpen} />;
280
271
  };
@@ -256,7 +256,6 @@ export const FilterAttributeSearch: React.FunctionComponent = () => {
256
256
  popperRef={bulkSelectMenuRef}
257
257
  appendTo={bulkSelectContainerRef.current || undefined}
258
258
  isVisible={isBulkSelectOpen}
259
- popperMatchesTriggerWidth={false}
260
259
  />
261
260
  </div>
262
261
  );
@@ -231,7 +231,6 @@ export const FilterCheckboxSelect: React.FunctionComponent = () => {
231
231
  popperRef={bulkSelectMenuRef}
232
232
  appendTo={bulkSelectContainerRef.current || undefined}
233
233
  isVisible={isBulkSelectOpen}
234
- popperMatchesTriggerWidth={false}
235
234
  />
236
235
  </div>
237
236
  );
@@ -239,7 +239,6 @@ export const FilterFaceted: React.FunctionComponent = () => {
239
239
  popperRef={bulkSelectMenuRef}
240
240
  appendTo={bulkSelectContainerRef.current || undefined}
241
241
  isVisible={isBulkSelectOpen}
242
- popperMatchesTriggerWidth={false}
243
242
  />
244
243
  </div>
245
244
  );
@@ -236,7 +236,6 @@ export const FilterMixedSelectGroup: React.FunctionComponent = () => {
236
236
  popperRef={bulkSelectMenuRef}
237
237
  appendTo={bulkSelectContainerRef.current || undefined}
238
238
  isVisible={isBulkSelectOpen}
239
- popperMatchesTriggerWidth={false}
240
239
  />
241
240
  </div>
242
241
  );
@@ -237,7 +237,6 @@ export const FilterSameSelectGroup: React.FunctionComponent = () => {
237
237
  popperRef={bulkSelectMenuRef}
238
238
  appendTo={bulkSelectContainerRef.current || undefined}
239
239
  isVisible={isBulkSelectOpen}
240
- popperMatchesTriggerWidth={false}
241
240
  />
242
241
  </div>
243
242
  );
@@ -240,7 +240,6 @@ export const FilterSearchInput: React.FunctionComponent = () => {
240
240
  popperRef={bulkSelectMenuRef}
241
241
  appendTo={bulkSelectContainerRef.current || undefined}
242
242
  isVisible={isBulkSelectOpen}
243
- popperMatchesTriggerWidth={false}
244
243
  />
245
244
  </div>
246
245
  );
@@ -226,7 +226,6 @@ export const FilterSingleSelect: React.FunctionComponent = () => {
226
226
  popperRef={bulkSelectMenuRef}
227
227
  appendTo={bulkSelectContainerRef.current || undefined}
228
228
  isVisible={isBulkSelectOpen}
229
- popperMatchesTriggerWidth={false}
230
229
  />
231
230
  </div>
232
231
  );
@@ -62,14 +62,18 @@ export interface PopperProps {
62
62
  * Passing this prop will remove the wrapper div element from the popper.
63
63
  */
64
64
  popperRef?: HTMLElement | (() => HTMLElement) | React.RefObject<any>;
65
- /** True to set the width of the popper element to the trigger element's width */
66
- popperMatchesTriggerWidth?: boolean;
67
65
  /** popper direction */
68
66
  direction?: 'up' | 'down';
69
67
  /** popper position */
70
68
  position?: 'right' | 'left' | 'center';
71
69
  /** Instead of direction and position can set the placement of the popper */
72
70
  placement?: Placement;
71
+ /** Custsom width of the popper. If the value is "trigger", it will set the width to the trigger element's width */
72
+ width?: string | 'trigger';
73
+ /** Minimum width of the popper. If the value is "trigger", it will set the min width to the trigger element's width */
74
+ minWidth?: string | 'trigger';
75
+ /** Maximum width of the popper. If the value is "trigger", it will set the max width to the trigger element's width */
76
+ maxWidth?: string | 'trigger';
73
77
  /** The container to append the popper to. Defaults to 'inline'. */
74
78
  appendTo?: HTMLElement | (() => HTMLElement) | 'inline';
75
79
  /** z-index of the popper element */
@@ -147,10 +151,12 @@ export interface PopperProps {
147
151
  export const Popper: React.FunctionComponent<PopperProps> = ({
148
152
  trigger,
149
153
  popper,
150
- popperMatchesTriggerWidth = true,
151
154
  direction = 'down',
152
155
  position = 'left',
153
156
  placement,
157
+ width,
158
+ minWidth = 'trigger',
159
+ maxWidth,
154
160
  appendTo = 'inline',
155
161
  zIndex = 9999,
156
162
  isVisible = true,
@@ -279,21 +285,44 @@ export const Popper: React.FunctionComponent<PopperProps> = ({
279
285
  () => getOppositePlacement(getPlacement()),
280
286
  [direction, position, placement]
281
287
  );
282
- const sameWidthMod: Modifier<'sameWidth', {}> = React.useMemo(
288
+
289
+ const widthMods: Modifier<'widthMods', {}> = React.useMemo(
283
290
  () => ({
284
- name: 'sameWidth',
285
- enabled: popperMatchesTriggerWidth,
291
+ name: 'widthMods',
292
+ enabled: width !== undefined || minWidth !== undefined || maxWidth !== undefined,
286
293
  phase: 'beforeWrite',
287
294
  requires: ['computeStyles'],
288
295
  fn: ({ state }) => {
289
- state.styles.popper.width = `${state.rects.reference.width}px`;
296
+ const triggerWidth = state.rects.reference.width;
297
+ if (width) {
298
+ state.styles.popper.width = width === 'trigger' ? `${triggerWidth}px` : width;
299
+ }
300
+
301
+ if (minWidth) {
302
+ state.styles.popper.minWidth = minWidth === 'trigger' ? `${triggerWidth}px` : minWidth;
303
+ }
304
+
305
+ if (maxWidth) {
306
+ state.styles.popper.maxWidth = maxWidth === 'trigger' ? `${triggerWidth}px` : maxWidth;
307
+ }
290
308
  },
291
309
  effect: ({ state }) => {
292
- state.elements.popper.style.width = `${(state.elements.reference as HTMLElement).offsetWidth}px`;
310
+ const triggerWidth = (state.elements.reference as HTMLElement).offsetWidth;
311
+ if (width) {
312
+ state.elements.popper.style.width = width === 'trigger' ? `${triggerWidth}px` : width;
313
+ }
314
+
315
+ if (minWidth) {
316
+ state.elements.popper.style.minWidth = minWidth === 'trigger' ? `${triggerWidth}px` : minWidth;
317
+ }
318
+
319
+ if (maxWidth) {
320
+ state.elements.popper.style.maxWidth = maxWidth === 'trigger' ? `${triggerWidth}px` : maxWidth;
321
+ }
293
322
  return () => {};
294
323
  }
295
324
  }),
296
- [popperMatchesTriggerWidth]
325
+ [width, minWidth, maxWidth]
297
326
  );
298
327
 
299
328
  const {
@@ -326,7 +355,7 @@ export const Popper: React.FunctionComponent<PopperProps> = ({
326
355
  fallbackPlacements: flipBehavior === 'flip' ? [getOppositePlacementMemo] : flipBehavior
327
356
  }
328
357
  },
329
- sameWidthMod
358
+ widthMods
330
359
  ]
331
360
  });
332
361
 
@@ -22,8 +22,6 @@ export interface DropdownProps extends MenuProps, OUIAProps {
22
22
  isPlain?: boolean;
23
23
  /** Indicates if the menu should be scrollable. */
24
24
  isScrollable?: boolean;
25
- /** Min width of the menu. */
26
- minWidth?: string;
27
25
  /** @hide Forwarded ref */
28
26
  innerRef?: React.Ref<any>;
29
27
  /** Value to overwrite the randomly generated data-ouia-component-id.*/
@@ -33,7 +31,7 @@ export interface DropdownProps extends MenuProps, OUIAProps {
33
31
  /** z-index of the dropdown menu */
34
32
  zIndex?: number;
35
33
  /** Additional properties to pass to the Popper */
36
- popperProps?: PopperProps;
34
+ popperProps?: Partial<PopperProps>;
37
35
  }
38
36
 
39
37
  const DropdownBase: React.FunctionComponent<DropdownProps> = ({
@@ -45,7 +43,6 @@ const DropdownBase: React.FunctionComponent<DropdownProps> = ({
45
43
  onOpenChange,
46
44
  isPlain,
47
45
  isScrollable,
48
- minWidth,
49
46
  innerRef,
50
47
  ouiaId,
51
48
  ouiaSafe = true,
@@ -106,11 +103,6 @@ const DropdownBase: React.FunctionComponent<DropdownProps> = ({
106
103
  onSelect={(event, itemId) => onSelect && onSelect(event, itemId)}
107
104
  isPlain={isPlain}
108
105
  isScrollable={isScrollable}
109
- {...(minWidth && {
110
- style: {
111
- '--pf-c-menu--MinWidth': minWidth
112
- } as React.CSSProperties
113
- })}
114
106
  {...props}
115
107
  >
116
108
  <MenuContent>{children}</MenuContent>
@@ -14,7 +14,7 @@ const dropdownChildren = <div>Dropdown children</div>;
14
14
  test('renders dropdown', () => {
15
15
  render(
16
16
  <div data-testid="dropdown">
17
- <Dropdown toggle={toggleRef => toggle(toggleRef)}>{dropdownChildren}</Dropdown>
17
+ <Dropdown toggle={(toggleRef) => toggle(toggleRef)}>{dropdownChildren}</Dropdown>
18
18
  </div>
19
19
  );
20
20
 
@@ -22,20 +22,20 @@ test('renders dropdown', () => {
22
22
  });
23
23
 
24
24
  test('passes children', () => {
25
- render(<Dropdown toggle={toggleRef => toggle(toggleRef)}>{dropdownChildren}</Dropdown>);
25
+ render(<Dropdown toggle={(toggleRef) => toggle(toggleRef)}>{dropdownChildren}</Dropdown>);
26
26
 
27
27
  expect(screen.getByText('Dropdown children')).toBeVisible();
28
28
  });
29
29
 
30
30
  test('renders passed toggle element', () => {
31
- render(<Dropdown toggle={toggleRef => toggle(toggleRef)}>{dropdownChildren}</Dropdown>);
31
+ render(<Dropdown toggle={(toggleRef) => toggle(toggleRef)}>{dropdownChildren}</Dropdown>);
32
32
 
33
33
  expect(screen.getByRole('button', { name: 'Dropdown' })).toBeVisible();
34
34
  });
35
35
 
36
36
  test('passes no class name by default', () => {
37
37
  render(
38
- <Dropdown isOpen={true} toggle={toggleRef => toggle(toggleRef)}>
38
+ <Dropdown isOpen={true} toggle={(toggleRef) => toggle(toggleRef)}>
39
39
  {dropdownChildren}
40
40
  </Dropdown>
41
41
  );
@@ -45,7 +45,7 @@ test('passes no class name by default', () => {
45
45
 
46
46
  test('passes custom class name', () => {
47
47
  render(
48
- <Dropdown className="custom-class" isOpen={true} toggle={toggleRef => toggle(toggleRef)}>
48
+ <Dropdown className="custom-class" isOpen={true} toggle={(toggleRef) => toggle(toggleRef)}>
49
49
  {dropdownChildren}
50
50
  </Dropdown>
51
51
  );
@@ -55,7 +55,7 @@ test('passes custom class name', () => {
55
55
 
56
56
  test('does not pass isPlain to Menu by default', () => {
57
57
  render(
58
- <Dropdown isOpen={true} toggle={toggleRef => toggle(toggleRef)}>
58
+ <Dropdown isOpen={true} toggle={(toggleRef) => toggle(toggleRef)}>
59
59
  {dropdownChildren}
60
60
  </Dropdown>
61
61
  );
@@ -65,7 +65,7 @@ test('does not pass isPlain to Menu by default', () => {
65
65
 
66
66
  test('passes isPlain to Menu', () => {
67
67
  render(
68
- <Dropdown isPlain isOpen={true} toggle={toggleRef => toggle(toggleRef)}>
68
+ <Dropdown isPlain isOpen={true} toggle={(toggleRef) => toggle(toggleRef)}>
69
69
  {dropdownChildren}
70
70
  </Dropdown>
71
71
  );
@@ -75,7 +75,7 @@ test('passes isPlain to Menu', () => {
75
75
 
76
76
  test('does not pass isScrollable to Menu by default', () => {
77
77
  render(
78
- <Dropdown isOpen={true} toggle={toggleRef => toggle(toggleRef)}>
78
+ <Dropdown isOpen={true} toggle={(toggleRef) => toggle(toggleRef)}>
79
79
  {dropdownChildren}
80
80
  </Dropdown>
81
81
  );
@@ -85,7 +85,7 @@ test('does not pass isScrollable to Menu by default', () => {
85
85
 
86
86
  test('passes isScrollable to Menu', () => {
87
87
  render(
88
- <Dropdown isScrollable isOpen={true} toggle={toggleRef => toggle(toggleRef)}>
88
+ <Dropdown isScrollable isOpen={true} toggle={(toggleRef) => toggle(toggleRef)}>
89
89
  {dropdownChildren}
90
90
  </Dropdown>
91
91
  );
@@ -93,35 +93,15 @@ test('passes isScrollable to Menu', () => {
93
93
  expect(screen.getByText('isScrollable: true')).toBeVisible();
94
94
  });
95
95
 
96
- test('does not pass minWidth to Menu by default', () => {
97
- render(
98
- <Dropdown isOpen={true} toggle={toggleRef => toggle(toggleRef)}>
99
- {dropdownChildren}
100
- </Dropdown>
101
- );
102
-
103
- expect(screen.getByText('minWidth: undefined')).toBeVisible();
104
- });
105
-
106
- test('passes minWidth to Menu', () => {
107
- render(
108
- <Dropdown minWidth="100px" isOpen={true} toggle={toggleRef => toggle(toggleRef)}>
109
- {dropdownChildren}
110
- </Dropdown>
111
- );
112
-
113
- expect(screen.getByText('minWidth: 100px')).toBeVisible();
114
- });
115
-
116
96
  test('passes default zIndex to popper', () => {
117
- render(<Dropdown toggle={toggleRef => toggle(toggleRef)}>{dropdownChildren}</Dropdown>);
97
+ render(<Dropdown toggle={(toggleRef) => toggle(toggleRef)}>{dropdownChildren}</Dropdown>);
118
98
 
119
99
  expect(screen.getByText('zIndex: 9999')).toBeVisible();
120
100
  });
121
101
 
122
102
  test('passes zIndex to popper', () => {
123
103
  render(
124
- <Dropdown zIndex={100} toggle={toggleRef => toggle(toggleRef)}>
104
+ <Dropdown zIndex={100} toggle={(toggleRef) => toggle(toggleRef)}>
125
105
  {dropdownChildren}
126
106
  </Dropdown>
127
107
  );
@@ -130,14 +110,14 @@ test('passes zIndex to popper', () => {
130
110
  });
131
111
 
132
112
  test('does not pass isOpen to popper by default', () => {
133
- render(<Dropdown toggle={toggleRef => toggle(toggleRef)}>{dropdownChildren}</Dropdown>);
113
+ render(<Dropdown toggle={(toggleRef) => toggle(toggleRef)}>{dropdownChildren}</Dropdown>);
134
114
 
135
115
  expect(screen.getByText('isOpen: undefined')).toBeVisible();
136
116
  });
137
117
 
138
118
  test('passes isOpen to popper', () => {
139
119
  render(
140
- <Dropdown isOpen toggle={toggleRef => toggle(toggleRef)}>
120
+ <Dropdown isOpen toggle={(toggleRef) => toggle(toggleRef)}>
141
121
  {dropdownChildren}
142
122
  </Dropdown>
143
123
  );
@@ -154,7 +134,7 @@ test('passes onSelect callback', async () => {
154
134
 
155
135
  const onSelect = jest.fn();
156
136
  render(
157
- <Dropdown onSelect={onSelect} toggle={toggleRef => toggle(toggleRef)}>
137
+ <Dropdown onSelect={onSelect} toggle={(toggleRef) => toggle(toggleRef)}>
158
138
  {dropdownChildren}
159
139
  </Dropdown>
160
140
  );
@@ -170,7 +150,7 @@ test('onOpenChange is called when passed and user clicks outside of dropdown', a
170
150
  const onOpenChange = jest.fn();
171
151
 
172
152
  render(
173
- <Dropdown isOpen={true} onOpenChange={onOpenChange} toggle={toggleRef => toggle(toggleRef)}>
153
+ <Dropdown isOpen={true} onOpenChange={onOpenChange} toggle={(toggleRef) => toggle(toggleRef)}>
174
154
  {dropdownChildren}
175
155
  </Dropdown>
176
156
  );
@@ -187,7 +167,7 @@ test('onOpenChange is called when passed and user presses tab key', async () =>
187
167
  const onOpenChange = jest.fn();
188
168
 
189
169
  render(
190
- <Dropdown isOpen={true} onOpenChange={onOpenChange} toggle={toggleRef => toggle(toggleRef)}>
170
+ <Dropdown isOpen={true} onOpenChange={onOpenChange} toggle={(toggleRef) => toggle(toggleRef)}>
191
171
  {dropdownChildren}
192
172
  </Dropdown>
193
173
  );
@@ -205,7 +185,7 @@ test('onOpenChange is called when passed and user presses esc key', async () =>
205
185
  const onOpenChange = jest.fn();
206
186
 
207
187
  render(
208
- <Dropdown isOpen={true} onOpenChange={onOpenChange} toggle={toggleRef => toggle(toggleRef)}>
188
+ <Dropdown isOpen={true} onOpenChange={onOpenChange} toggle={(toggleRef) => toggle(toggleRef)}>
209
189
  {dropdownChildren}
210
190
  </Dropdown>
211
191
  );
@@ -226,7 +206,7 @@ test('match snapshot', () => {
226
206
  isScrollable
227
207
  isPlain
228
208
  className={'customClass'}
229
- toggle={toggleRef => toggle(toggleRef)}
209
+ toggle={(toggleRef) => toggle(toggleRef)}
230
210
  >
231
211
  {dropdownChildren}
232
212
  </Dropdown>
@@ -19,9 +19,8 @@ export const DropdownWithDescriptions: React.FunctionComponent = () => {
19
19
  <Dropdown
20
20
  isOpen={isOpen}
21
21
  onSelect={onSelect}
22
- minWidth="150px"
23
- onOpenChange={isOpen => setIsOpen(isOpen)}
24
- toggle={toggleRef => (
22
+ onOpenChange={(isOpen) => setIsOpen(isOpen)}
23
+ toggle={(toggleRef) => (
25
24
  <MenuToggle ref={toggleRef} isFullWidth onClick={onToggleClick} isExpanded={isOpen}>
26
25
  Dropdown
27
26
  </MenuToggle>
@@ -36,7 +35,7 @@ export const DropdownWithDescriptions: React.FunctionComponent = () => {
36
35
  key="action"
37
36
  description="This is a very long description that describes the menu item"
38
37
  to="#default-link2"
39
- onClick={ev => ev.preventDefault()}
38
+ onClick={(ev) => ev.preventDefault()}
40
39
  >
41
40
  Action
42
41
  </DropdownItem>
@@ -20,9 +20,8 @@ export const DropdownWithKebab: React.FunctionComponent = () => {
20
20
  <Dropdown
21
21
  isOpen={isOpen}
22
22
  onSelect={onSelect}
23
- minWidth="150px"
24
- onOpenChange={isOpen => setIsOpen(isOpen)}
25
- toggle={toggleRef => (
23
+ onOpenChange={(isOpen) => setIsOpen(isOpen)}
24
+ toggle={(toggleRef) => (
26
25
  <MenuToggle
27
26
  ref={toggleRef}
28
27
  aria-label="kebab dropdown toggle"
@@ -38,7 +37,7 @@ export const DropdownWithKebab: React.FunctionComponent = () => {
38
37
  <DropdownItem itemId={0} key="link">
39
38
  Link
40
39
  </DropdownItem>
41
- <DropdownItem itemId={1} key="action" to="#default-link2" onClick={ev => ev.preventDefault()}>
40
+ <DropdownItem itemId={1} key="action" to="#default-link2" onClick={(ev) => ev.preventDefault()}>
42
41
  Action
43
42
  </DropdownItem>
44
43
  <DropdownItem itemId={2} isDisabled key="disabled link">