@sproutsocial/seeds-react-menu 1.8.5 → 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.
@@ -26,6 +26,17 @@ interface BaseSelectProps<T extends DataWithId> {
26
26
  onIsOpenChange?: (isOpen: boolean) => void;
27
27
  stateReducer?: any;
28
28
  menuProps?: React.HTMLAttributes<HTMLDivElement>;
29
+ onPointerDownOutside?: (event: CustomEvent<{
30
+ originalEvent: PointerEvent;
31
+ }>) => void;
32
+ onInteractOutside?: (event: CustomEvent<{
33
+ originalEvent: Event;
34
+ }>) => void;
35
+ /**
36
+ * Controls which side the popout appears relative to the trigger.
37
+ * @default "bottom"
38
+ */
39
+ popoutPlacement?: "top" | "bottom";
29
40
  }
30
41
  /**
31
42
  * Props common to all single-select components
@@ -75,22 +86,22 @@ interface SingleSelectProps<T extends DataWithId> extends BaseSingleSelectProps<
75
86
  renderSelection?: (item: T | null) => ReactNode;
76
87
  triggerButtonProps?: any;
77
88
  }
78
- 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, }: 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;
79
90
 
80
91
  interface MultiSelectProps<T extends DataWithId> extends BaseMultiSelectProps<T> {
81
92
  renderSelections?: (items: T[]) => ReactNode;
82
93
  triggerButtonProps?: any;
83
94
  shouldOverflow?: boolean;
84
95
  }
85
- 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, }: 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;
86
97
 
87
98
  interface SingleAutocompleteProps<T extends DataWithId> extends BaseSingleAutocompleteProps<T> {
88
99
  includePlaceholderItem?: boolean;
89
100
  }
90
- 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, }: 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;
91
102
 
92
103
  interface MultiAutocompleteProps<T extends DataWithId> extends BaseMultiAutocompleteProps<T> {
93
104
  }
94
- 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, }: 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;
95
106
 
96
107
  export { MultiAutocomplete, type MultiAutocompleteProps, MultiSelect, type MultiSelectProps, SingleAutocomplete, type SingleAutocompleteProps, SingleSelect, type SingleSelectProps };
@@ -26,6 +26,17 @@ interface BaseSelectProps<T extends DataWithId> {
26
26
  onIsOpenChange?: (isOpen: boolean) => void;
27
27
  stateReducer?: any;
28
28
  menuProps?: React.HTMLAttributes<HTMLDivElement>;
29
+ onPointerDownOutside?: (event: CustomEvent<{
30
+ originalEvent: PointerEvent;
31
+ }>) => void;
32
+ onInteractOutside?: (event: CustomEvent<{
33
+ originalEvent: Event;
34
+ }>) => void;
35
+ /**
36
+ * Controls which side the popout appears relative to the trigger.
37
+ * @default "bottom"
38
+ */
39
+ popoutPlacement?: "top" | "bottom";
29
40
  }
30
41
  /**
31
42
  * Props common to all single-select components
@@ -75,22 +86,22 @@ interface SingleSelectProps<T extends DataWithId> extends BaseSingleSelectProps<
75
86
  renderSelection?: (item: T | null) => ReactNode;
76
87
  triggerButtonProps?: any;
77
88
  }
78
- 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, }: 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;
79
90
 
80
91
  interface MultiSelectProps<T extends DataWithId> extends BaseMultiSelectProps<T> {
81
92
  renderSelections?: (items: T[]) => ReactNode;
82
93
  triggerButtonProps?: any;
83
94
  shouldOverflow?: boolean;
84
95
  }
85
- 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, }: 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;
86
97
 
87
98
  interface SingleAutocompleteProps<T extends DataWithId> extends BaseSingleAutocompleteProps<T> {
88
99
  includePlaceholderItem?: boolean;
89
100
  }
90
- 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, }: 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;
91
102
 
92
103
  interface MultiAutocompleteProps<T extends DataWithId> extends BaseMultiAutocompleteProps<T> {
93
104
  }
94
- 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, }: 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;
95
106
 
96
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",
@@ -1126,7 +1140,10 @@ function SingleSelect({
1126
1140
  triggerButtonProps,
1127
1141
  menuProps,
1128
1142
  inputType = "icon",
1129
- removePlaceholderItem = false
1143
+ removePlaceholderItem = false,
1144
+ onPointerDownOutside,
1145
+ onInteractOutside,
1146
+ popoutPlacement
1130
1147
  }) {
1131
1148
  const [uncontrolledSelectedItemId, setUncontrolledSelectedItemId] = (0, import_react8.useState)(null);
1132
1149
  const [uncontrolledIsOpen, setUncontrolledIsOpen] = (0, import_react8.useState)(false);
@@ -1225,6 +1242,7 @@ function SingleSelect({
1225
1242
  {
1226
1243
  open: selectIsOpen,
1227
1244
  onOpenChange: updateIsOpen,
1245
+ side: popoutPlacement,
1228
1246
  animationConfig: menuAnimationConfig,
1229
1247
  onOpenAutoFocus: (e) => {
1230
1248
  e.preventDefault();
@@ -1232,6 +1250,8 @@ function SingleSelect({
1232
1250
  onCloseAutoFocus: (e) => {
1233
1251
  e.preventDefault();
1234
1252
  },
1253
+ onPointerDownOutside,
1254
+ onInteractOutside,
1235
1255
  content: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1236
1256
  ComboboxContent,
1237
1257
  {
@@ -1337,7 +1357,10 @@ function MultiSelect({
1337
1357
  triggerButtonProps,
1338
1358
  menuProps,
1339
1359
  inputType = "checkbox",
1340
- shouldOverflow
1360
+ shouldOverflow,
1361
+ onPointerDownOutside,
1362
+ onInteractOutside,
1363
+ popoutPlacement
1341
1364
  }) {
1342
1365
  const [uncontrolledSelectedItemIds, setUncontrolledSelectedItemIds] = (0, import_react9.useState)([]);
1343
1366
  const [uncontrolledIsOpen, setUncontrolledIsOpen] = (0, import_react9.useState)(false);
@@ -1512,12 +1535,15 @@ function MultiSelect({
1512
1535
  {
1513
1536
  open: selectIsOpen,
1514
1537
  onOpenChange: updateIsOpen,
1538
+ side: popoutPlacement,
1515
1539
  onOpenAutoFocus: (e) => {
1516
1540
  e.preventDefault();
1517
1541
  },
1518
1542
  onCloseAutoFocus: (e) => {
1519
1543
  e.preventDefault();
1520
1544
  },
1545
+ onPointerDownOutside,
1546
+ onInteractOutside,
1521
1547
  animationConfig: menuAnimationConfig,
1522
1548
  content: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1523
1549
  ComboboxContent,
@@ -1623,7 +1649,10 @@ function SingleAutocomplete({
1623
1649
  stateReducer = defaultReducer3,
1624
1650
  menuProps,
1625
1651
  inputType = "icon",
1626
- includePlaceholderItem = false
1652
+ includePlaceholderItem = false,
1653
+ onPointerDownOutside,
1654
+ onInteractOutside,
1655
+ popoutPlacement
1627
1656
  }) {
1628
1657
  const [uncontrolledInputValue, setUncontrolledInputValue] = (0, import_react10.useState)("");
1629
1658
  const [uncontrolledSelectedItemId, setUncontrolledSelectedItemId] = (0, import_react10.useState)(null);
@@ -1793,6 +1822,7 @@ function SingleAutocomplete({
1793
1822
  {
1794
1823
  open: comboboxIsOpen,
1795
1824
  onOpenChange: updateIsOpen,
1825
+ side: popoutPlacement,
1796
1826
  animationConfig: menuAnimationConfig,
1797
1827
  onOpenAutoFocus: (e) => {
1798
1828
  e.preventDefault();
@@ -1800,6 +1830,8 @@ function SingleAutocomplete({
1800
1830
  onCloseAutoFocus: (e) => {
1801
1831
  e.preventDefault();
1802
1832
  },
1833
+ onPointerDownOutside,
1834
+ onInteractOutside,
1803
1835
  content: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1804
1836
  ComboboxContent,
1805
1837
  {
@@ -1905,8 +1937,12 @@ function MultiAutocomplete({
1905
1937
  onIsOpenChange,
1906
1938
  stateReducer = defaultReducer4,
1907
1939
  menuProps,
1908
- inputType = "checkbox"
1940
+ inputType = "checkbox",
1941
+ onPointerDownOutside,
1942
+ onInteractOutside,
1943
+ popoutPlacement
1909
1944
  }) {
1945
+ const mousedownInPopoverRef = (0, import_react11.useRef)(false);
1910
1946
  const [uncontrolledInputValue, setUncontrolledInputValue] = (0, import_react11.useState)("");
1911
1947
  const [uncontrolledSelectedItemIds, setUncontrolledSelectedItemIds] = (0, import_react11.useState)([]);
1912
1948
  const [uncontrolledIsOpen, setUncontrolledIsOpen] = (0, import_react11.useState)(false);
@@ -1933,6 +1969,9 @@ function MultiAutocomplete({
1933
1969
  onInputValueChange?.(newInputValue);
1934
1970
  };
1935
1971
  const updateIsOpen = (newIsOpen) => {
1972
+ if (!newIsOpen) {
1973
+ updateInputValue("");
1974
+ }
1936
1975
  if (!isIsOpenControlled) {
1937
1976
  setUncontrolledIsOpen(newIsOpen);
1938
1977
  }
@@ -2109,6 +2148,11 @@ function MultiAutocomplete({
2109
2148
  if (inputProps.onBlur) {
2110
2149
  inputProps.onBlur(e);
2111
2150
  }
2151
+ if (mousedownInPopoverRef.current) {
2152
+ mousedownInPopoverRef.current = false;
2153
+ e.target.focus();
2154
+ return;
2155
+ }
2112
2156
  updateIsOpen(false);
2113
2157
  };
2114
2158
  const inputPropsToSpread = { ...inputProps };
@@ -2118,13 +2162,22 @@ function MultiAutocomplete({
2118
2162
  {
2119
2163
  open: comboboxIsOpen,
2120
2164
  onOpenChange: updateIsOpen,
2165
+ side: popoutPlacement,
2121
2166
  onOpenAutoFocus: (e) => {
2122
2167
  e.preventDefault();
2123
2168
  },
2124
2169
  onCloseAutoFocus: (e) => {
2125
2170
  e.preventDefault();
2126
2171
  },
2172
+ onPointerDownOutside,
2173
+ onInteractOutside,
2127
2174
  animationConfig: menuAnimationConfig,
2175
+ onMouseDown: () => {
2176
+ mousedownInPopoverRef.current = true;
2177
+ },
2178
+ onMouseUp: () => {
2179
+ mousedownInPopoverRef.current = false;
2180
+ },
2128
2181
  content: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2129
2182
  ComboboxContent,
2130
2183
  {