@sproutsocial/seeds-react-menu 1.8.6 → 1.9.2

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.
@@ -32,6 +32,11 @@ interface BaseSelectProps<T extends DataWithId> {
32
32
  onInteractOutside?: (event: CustomEvent<{
33
33
  originalEvent: Event;
34
34
  }>) => void;
35
+ /**
36
+ * Controls which side the popout appears relative to the trigger.
37
+ * @default "bottom"
38
+ */
39
+ popoutPlacement?: "top" | "bottom";
35
40
  }
36
41
  /**
37
42
  * Props common to all single-select components
@@ -81,22 +86,22 @@ interface SingleSelectProps<T extends DataWithId> extends BaseSingleSelectProps<
81
86
  renderSelection?: (item: T | null) => ReactNode;
82
87
  triggerButtonProps?: any;
83
88
  }
84
- declare function SingleSelect<T extends DataWithId>({ id, data, selectedItemId: controlledSelectedItemId, isOpen: controlledIsOpen, itemToKey, itemToString, itemToSelection, renderSelection, renderItem, groupBy, renderGroupHeading, isVirtualized, placeholder, onSelectedItemIdChange, onIsOpenChange, stateReducer, triggerButtonProps, menuProps, inputType, removePlaceholderItem, onPointerDownOutside, onInteractOutside, }: SingleSelectProps<T>): react_jsx_runtime.JSX.Element;
89
+ declare function SingleSelect<T extends DataWithId>({ id, data, selectedItemId: controlledSelectedItemId, isOpen: controlledIsOpen, itemToKey, itemToString, itemToSelection, renderSelection, renderItem, groupBy, renderGroupHeading, isVirtualized, placeholder, onSelectedItemIdChange, onIsOpenChange, stateReducer, triggerButtonProps, menuProps, inputType, removePlaceholderItem, onPointerDownOutside, onInteractOutside, popoutPlacement, }: SingleSelectProps<T>): react_jsx_runtime.JSX.Element;
85
90
 
86
91
  interface MultiSelectProps<T extends DataWithId> extends BaseMultiSelectProps<T> {
87
92
  renderSelections?: (items: T[]) => ReactNode;
88
93
  triggerButtonProps?: any;
89
94
  shouldOverflow?: boolean;
90
95
  }
91
- declare function MultiSelect<T extends DataWithId>({ id, data, selectedItemIds: controlledSelectedItemIds, isOpen: controlledIsOpen, itemToKey, itemToString, renderSelections, renderItem, groupBy, renderGroupHeading, isVirtualized, showSelectedItems, selectHeadings, selectAllItem, placeholder, onSelectedItemIdsChange, onIsOpenChange, stateReducer, triggerButtonProps, menuProps, inputType, shouldOverflow, onPointerDownOutside, onInteractOutside, }: MultiSelectProps<T>): react_jsx_runtime.JSX.Element;
96
+ declare function MultiSelect<T extends DataWithId>({ id, data, selectedItemIds: controlledSelectedItemIds, isOpen: controlledIsOpen, itemToKey, itemToString, renderSelections, renderItem, groupBy, renderGroupHeading, isVirtualized, showSelectedItems, selectHeadings, selectAllItem, placeholder, onSelectedItemIdsChange, onIsOpenChange, stateReducer, triggerButtonProps, menuProps, inputType, shouldOverflow, onPointerDownOutside, onInteractOutside, popoutPlacement, }: MultiSelectProps<T>): react_jsx_runtime.JSX.Element;
92
97
 
93
98
  interface SingleAutocompleteProps<T extends DataWithId> extends BaseSingleAutocompleteProps<T> {
94
99
  includePlaceholderItem?: boolean;
95
100
  }
96
- declare function SingleAutocomplete<T extends DataWithId>({ id, data, selectedItemId: controlledSelectedItemId, inputValue: controlledInputValue, isOpen: controlledIsOpen, itemToKey, itemToString, itemToSearchString, renderItem, groupBy, renderGroupHeading, isVirtualized, EmptyState, placeholder, onSelectedItemIdChange, onInputValueChange, onIsOpenChange, stateReducer, menuProps, inputType, includePlaceholderItem, onPointerDownOutside, onInteractOutside, }: SingleAutocompleteProps<T>): react_jsx_runtime.JSX.Element;
101
+ declare function SingleAutocomplete<T extends DataWithId>({ id, data, selectedItemId: controlledSelectedItemId, inputValue: controlledInputValue, isOpen: controlledIsOpen, itemToKey, itemToString, itemToSearchString, renderItem, groupBy, renderGroupHeading, isVirtualized, EmptyState, placeholder, onSelectedItemIdChange, onInputValueChange, onIsOpenChange, stateReducer, menuProps, inputType, includePlaceholderItem, onPointerDownOutside, onInteractOutside, popoutPlacement, }: SingleAutocompleteProps<T>): react_jsx_runtime.JSX.Element;
97
102
 
98
103
  interface MultiAutocompleteProps<T extends DataWithId> extends BaseMultiAutocompleteProps<T> {
99
104
  }
100
- declare function MultiAutocomplete<T extends DataWithId>({ id, data, selectedItemIds: controlledSelectedItemIds, inputValue: controlledInputValue, isOpen: controlledIsOpen, itemToKey, itemToString, itemToSearchString, renderItem, groupBy, renderGroupHeading, isVirtualized, showSelectedItems, selectHeadings, selectAllItem, EmptyState, placeholder, onSelectedItemIdsChange, onInputValueChange, onIsOpenChange, stateReducer, menuProps, inputType, onPointerDownOutside, onInteractOutside, }: MultiAutocompleteProps<T>): react_jsx_runtime.JSX.Element;
105
+ declare function MultiAutocomplete<T extends DataWithId>({ id, data, selectedItemIds: controlledSelectedItemIds, inputValue: controlledInputValue, isOpen: controlledIsOpen, itemToKey, itemToString, itemToSearchString, renderItem, groupBy, renderGroupHeading, isVirtualized, showSelectedItems, selectHeadings, selectAllItem, EmptyState, placeholder, onSelectedItemIdsChange, onInputValueChange, onIsOpenChange, stateReducer, menuProps, inputType, onPointerDownOutside, onInteractOutside, popoutPlacement, }: MultiAutocompleteProps<T>): react_jsx_runtime.JSX.Element;
101
106
 
102
107
  export { MultiAutocomplete, type MultiAutocompleteProps, MultiSelect, type MultiSelectProps, SingleAutocomplete, type SingleAutocompleteProps, SingleSelect, type SingleSelectProps };
@@ -32,6 +32,11 @@ interface BaseSelectProps<T extends DataWithId> {
32
32
  onInteractOutside?: (event: CustomEvent<{
33
33
  originalEvent: Event;
34
34
  }>) => void;
35
+ /**
36
+ * Controls which side the popout appears relative to the trigger.
37
+ * @default "bottom"
38
+ */
39
+ popoutPlacement?: "top" | "bottom";
35
40
  }
36
41
  /**
37
42
  * Props common to all single-select components
@@ -81,22 +86,22 @@ interface SingleSelectProps<T extends DataWithId> extends BaseSingleSelectProps<
81
86
  renderSelection?: (item: T | null) => ReactNode;
82
87
  triggerButtonProps?: any;
83
88
  }
84
- declare function SingleSelect<T extends DataWithId>({ id, data, selectedItemId: controlledSelectedItemId, isOpen: controlledIsOpen, itemToKey, itemToString, itemToSelection, renderSelection, renderItem, groupBy, renderGroupHeading, isVirtualized, placeholder, onSelectedItemIdChange, onIsOpenChange, stateReducer, triggerButtonProps, menuProps, inputType, removePlaceholderItem, onPointerDownOutside, onInteractOutside, }: SingleSelectProps<T>): react_jsx_runtime.JSX.Element;
89
+ declare function SingleSelect<T extends DataWithId>({ id, data, selectedItemId: controlledSelectedItemId, isOpen: controlledIsOpen, itemToKey, itemToString, itemToSelection, renderSelection, renderItem, groupBy, renderGroupHeading, isVirtualized, placeholder, onSelectedItemIdChange, onIsOpenChange, stateReducer, triggerButtonProps, menuProps, inputType, removePlaceholderItem, onPointerDownOutside, onInteractOutside, popoutPlacement, }: SingleSelectProps<T>): react_jsx_runtime.JSX.Element;
85
90
 
86
91
  interface MultiSelectProps<T extends DataWithId> extends BaseMultiSelectProps<T> {
87
92
  renderSelections?: (items: T[]) => ReactNode;
88
93
  triggerButtonProps?: any;
89
94
  shouldOverflow?: boolean;
90
95
  }
91
- declare function MultiSelect<T extends DataWithId>({ id, data, selectedItemIds: controlledSelectedItemIds, isOpen: controlledIsOpen, itemToKey, itemToString, renderSelections, renderItem, groupBy, renderGroupHeading, isVirtualized, showSelectedItems, selectHeadings, selectAllItem, placeholder, onSelectedItemIdsChange, onIsOpenChange, stateReducer, triggerButtonProps, menuProps, inputType, shouldOverflow, onPointerDownOutside, onInteractOutside, }: MultiSelectProps<T>): react_jsx_runtime.JSX.Element;
96
+ declare function MultiSelect<T extends DataWithId>({ id, data, selectedItemIds: controlledSelectedItemIds, isOpen: controlledIsOpen, itemToKey, itemToString, renderSelections, renderItem, groupBy, renderGroupHeading, isVirtualized, showSelectedItems, selectHeadings, selectAllItem, placeholder, onSelectedItemIdsChange, onIsOpenChange, stateReducer, triggerButtonProps, menuProps, inputType, shouldOverflow, onPointerDownOutside, onInteractOutside, popoutPlacement, }: MultiSelectProps<T>): react_jsx_runtime.JSX.Element;
92
97
 
93
98
  interface SingleAutocompleteProps<T extends DataWithId> extends BaseSingleAutocompleteProps<T> {
94
99
  includePlaceholderItem?: boolean;
95
100
  }
96
- declare function SingleAutocomplete<T extends DataWithId>({ id, data, selectedItemId: controlledSelectedItemId, inputValue: controlledInputValue, isOpen: controlledIsOpen, itemToKey, itemToString, itemToSearchString, renderItem, groupBy, renderGroupHeading, isVirtualized, EmptyState, placeholder, onSelectedItemIdChange, onInputValueChange, onIsOpenChange, stateReducer, menuProps, inputType, includePlaceholderItem, onPointerDownOutside, onInteractOutside, }: SingleAutocompleteProps<T>): react_jsx_runtime.JSX.Element;
101
+ declare function SingleAutocomplete<T extends DataWithId>({ id, data, selectedItemId: controlledSelectedItemId, inputValue: controlledInputValue, isOpen: controlledIsOpen, itemToKey, itemToString, itemToSearchString, renderItem, groupBy, renderGroupHeading, isVirtualized, EmptyState, placeholder, onSelectedItemIdChange, onInputValueChange, onIsOpenChange, stateReducer, menuProps, inputType, includePlaceholderItem, onPointerDownOutside, onInteractOutside, popoutPlacement, }: SingleAutocompleteProps<T>): react_jsx_runtime.JSX.Element;
97
102
 
98
103
  interface MultiAutocompleteProps<T extends DataWithId> extends BaseMultiAutocompleteProps<T> {
99
104
  }
100
- declare function MultiAutocomplete<T extends DataWithId>({ id, data, selectedItemIds: controlledSelectedItemIds, inputValue: controlledInputValue, isOpen: controlledIsOpen, itemToKey, itemToString, itemToSearchString, renderItem, groupBy, renderGroupHeading, isVirtualized, showSelectedItems, selectHeadings, selectAllItem, EmptyState, placeholder, onSelectedItemIdsChange, onInputValueChange, onIsOpenChange, stateReducer, menuProps, inputType, onPointerDownOutside, onInteractOutside, }: MultiAutocompleteProps<T>): react_jsx_runtime.JSX.Element;
105
+ declare function MultiAutocomplete<T extends DataWithId>({ id, data, selectedItemIds: controlledSelectedItemIds, inputValue: controlledInputValue, isOpen: controlledIsOpen, itemToKey, itemToString, itemToSearchString, renderItem, groupBy, renderGroupHeading, isVirtualized, showSelectedItems, selectHeadings, selectAllItem, EmptyState, placeholder, onSelectedItemIdsChange, onInputValueChange, onIsOpenChange, stateReducer, menuProps, inputType, onPointerDownOutside, onInteractOutside, popoutPlacement, }: MultiAutocompleteProps<T>): react_jsx_runtime.JSX.Element;
101
106
 
102
107
  export { MultiAutocomplete, type MultiAutocompleteProps, MultiSelect, type MultiSelectProps, SingleAutocomplete, type SingleAutocompleteProps, SingleSelect, type SingleSelectProps };
package/dist/v2/index.js CHANGED
@@ -248,8 +248,21 @@ function Popout({
248
248
  const popoverOnOpenChange = isControlled ? onOpenChange : handleOpenChange;
249
249
  const radixRef = React2.useRef(null);
250
250
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Popover.Root, { open: popoverOpen, onOpenChange: popoverOnOpenChange, children: [
251
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Popover.Trigger, { ref: radixRef, asChild: true, children }),
252
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Popover.Anchor, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { height: "1px" }, children: "\xA0" }) }),
251
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { position: "relative" }, children: [
252
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Popover.Trigger, { ref: radixRef, asChild: true, children }),
253
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
254
+ Popover.Anchor,
255
+ {
256
+ style: {
257
+ position: "absolute",
258
+ top: side === "top" ? 0 : "100%",
259
+ left: 0,
260
+ right: 0,
261
+ height: "1px"
262
+ }
263
+ }
264
+ )
265
+ ] }),
253
266
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Popover.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
254
267
  StyledContent,
255
268
  {
@@ -798,7 +811,8 @@ var VirtualizedComboboxContent = ({
798
811
  {
799
812
  style: {
800
813
  height: `${rowVirtualizer.getTotalSize()}px`,
801
- position: "relative"
814
+ position: "relative",
815
+ overflow: "hidden"
802
816
  },
803
817
  children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
804
818
  "div",
@@ -1128,7 +1142,8 @@ function SingleSelect({
1128
1142
  inputType = "icon",
1129
1143
  removePlaceholderItem = false,
1130
1144
  onPointerDownOutside,
1131
- onInteractOutside
1145
+ onInteractOutside,
1146
+ popoutPlacement
1132
1147
  }) {
1133
1148
  const [uncontrolledSelectedItemId, setUncontrolledSelectedItemId] = (0, import_react8.useState)(null);
1134
1149
  const [uncontrolledIsOpen, setUncontrolledIsOpen] = (0, import_react8.useState)(false);
@@ -1227,6 +1242,7 @@ function SingleSelect({
1227
1242
  {
1228
1243
  open: selectIsOpen,
1229
1244
  onOpenChange: updateIsOpen,
1245
+ side: popoutPlacement,
1230
1246
  animationConfig: menuAnimationConfig,
1231
1247
  onOpenAutoFocus: (e) => {
1232
1248
  e.preventDefault();
@@ -1343,7 +1359,8 @@ function MultiSelect({
1343
1359
  inputType = "checkbox",
1344
1360
  shouldOverflow,
1345
1361
  onPointerDownOutside,
1346
- onInteractOutside
1362
+ onInteractOutside,
1363
+ popoutPlacement
1347
1364
  }) {
1348
1365
  const [uncontrolledSelectedItemIds, setUncontrolledSelectedItemIds] = (0, import_react9.useState)([]);
1349
1366
  const [uncontrolledIsOpen, setUncontrolledIsOpen] = (0, import_react9.useState)(false);
@@ -1518,6 +1535,7 @@ function MultiSelect({
1518
1535
  {
1519
1536
  open: selectIsOpen,
1520
1537
  onOpenChange: updateIsOpen,
1538
+ side: popoutPlacement,
1521
1539
  onOpenAutoFocus: (e) => {
1522
1540
  e.preventDefault();
1523
1541
  },
@@ -1633,7 +1651,8 @@ function SingleAutocomplete({
1633
1651
  inputType = "icon",
1634
1652
  includePlaceholderItem = false,
1635
1653
  onPointerDownOutside,
1636
- onInteractOutside
1654
+ onInteractOutside,
1655
+ popoutPlacement
1637
1656
  }) {
1638
1657
  const [uncontrolledInputValue, setUncontrolledInputValue] = (0, import_react10.useState)("");
1639
1658
  const [uncontrolledSelectedItemId, setUncontrolledSelectedItemId] = (0, import_react10.useState)(null);
@@ -1803,6 +1822,7 @@ function SingleAutocomplete({
1803
1822
  {
1804
1823
  open: comboboxIsOpen,
1805
1824
  onOpenChange: updateIsOpen,
1825
+ side: popoutPlacement,
1806
1826
  animationConfig: menuAnimationConfig,
1807
1827
  onOpenAutoFocus: (e) => {
1808
1828
  e.preventDefault();
@@ -1919,8 +1939,10 @@ function MultiAutocomplete({
1919
1939
  menuProps,
1920
1940
  inputType = "checkbox",
1921
1941
  onPointerDownOutside,
1922
- onInteractOutside
1942
+ onInteractOutside,
1943
+ popoutPlacement
1923
1944
  }) {
1945
+ const mousedownInPopoverRef = (0, import_react11.useRef)(false);
1924
1946
  const [uncontrolledInputValue, setUncontrolledInputValue] = (0, import_react11.useState)("");
1925
1947
  const [uncontrolledSelectedItemIds, setUncontrolledSelectedItemIds] = (0, import_react11.useState)([]);
1926
1948
  const [uncontrolledIsOpen, setUncontrolledIsOpen] = (0, import_react11.useState)(false);
@@ -1947,6 +1969,9 @@ function MultiAutocomplete({
1947
1969
  onInputValueChange?.(newInputValue);
1948
1970
  };
1949
1971
  const updateIsOpen = (newIsOpen) => {
1972
+ if (!newIsOpen) {
1973
+ updateInputValue("");
1974
+ }
1950
1975
  if (!isIsOpenControlled) {
1951
1976
  setUncontrolledIsOpen(newIsOpen);
1952
1977
  }
@@ -2123,6 +2148,11 @@ function MultiAutocomplete({
2123
2148
  if (inputProps.onBlur) {
2124
2149
  inputProps.onBlur(e);
2125
2150
  }
2151
+ if (mousedownInPopoverRef.current) {
2152
+ mousedownInPopoverRef.current = false;
2153
+ e.target.focus();
2154
+ return;
2155
+ }
2126
2156
  updateIsOpen(false);
2127
2157
  };
2128
2158
  const inputPropsToSpread = { ...inputProps };
@@ -2132,6 +2162,7 @@ function MultiAutocomplete({
2132
2162
  {
2133
2163
  open: comboboxIsOpen,
2134
2164
  onOpenChange: updateIsOpen,
2165
+ side: popoutPlacement,
2135
2166
  onOpenAutoFocus: (e) => {
2136
2167
  e.preventDefault();
2137
2168
  },
@@ -2141,6 +2172,12 @@ function MultiAutocomplete({
2141
2172
  onPointerDownOutside,
2142
2173
  onInteractOutside,
2143
2174
  animationConfig: menuAnimationConfig,
2175
+ onMouseDown: () => {
2176
+ mousedownInPopoverRef.current = true;
2177
+ },
2178
+ onMouseUp: () => {
2179
+ mousedownInPopoverRef.current = false;
2180
+ },
2144
2181
  content: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2145
2182
  ComboboxContent,
2146
2183
  {