@itwin/itwinui-react 3.20.0 → 3.20.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.
Files changed (38) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/DEV-cjs/core/Menu/Menu.js +3 -3
  3. package/DEV-cjs/core/Popover/Popover.js +25 -4
  4. package/DEV-cjs/core/Table/TableCell.js +1 -1
  5. package/DEV-cjs/core/Tooltip/Tooltip.js +23 -5
  6. package/DEV-cjs/styles.js +1 -1
  7. package/DEV-cjs/utils/hooks/index.js +1 -0
  8. package/DEV-cjs/utils/hooks/useStableCallback.js +20 -0
  9. package/DEV-esm/core/Menu/Menu.js +3 -3
  10. package/DEV-esm/core/Popover/Popover.js +26 -4
  11. package/DEV-esm/core/Table/TableCell.js +1 -1
  12. package/DEV-esm/core/Tooltip/Tooltip.js +24 -5
  13. package/DEV-esm/styles.js +1 -1
  14. package/DEV-esm/utils/hooks/index.js +1 -0
  15. package/DEV-esm/utils/hooks/useStableCallback.js +9 -0
  16. package/LICENSE.md +1 -1
  17. package/cjs/core/Menu/Menu.js +3 -3
  18. package/cjs/core/Popover/Popover.d.ts +8 -6
  19. package/cjs/core/Popover/Popover.js +25 -4
  20. package/cjs/core/Table/TableCell.js +1 -1
  21. package/cjs/core/Tooltip/Tooltip.js +23 -5
  22. package/cjs/styles.js +1 -1
  23. package/cjs/utils/hooks/index.d.ts +1 -0
  24. package/cjs/utils/hooks/index.js +1 -0
  25. package/cjs/utils/hooks/useStableCallback.d.ts +12 -0
  26. package/cjs/utils/hooks/useStableCallback.js +20 -0
  27. package/esm/core/Menu/Menu.js +3 -3
  28. package/esm/core/Popover/Popover.d.ts +8 -6
  29. package/esm/core/Popover/Popover.js +26 -4
  30. package/esm/core/Table/TableCell.js +1 -1
  31. package/esm/core/Tooltip/Tooltip.js +24 -5
  32. package/esm/styles.js +1 -1
  33. package/esm/utils/hooks/index.d.ts +1 -0
  34. package/esm/utils/hooks/index.js +1 -0
  35. package/esm/utils/hooks/useStableCallback.d.ts +12 -0
  36. package/esm/utils/hooks/useStableCallback.js +9 -0
  37. package/package.json +1 -1
  38. package/styles.css +10 -10
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.20.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [#2674](https://github.com/iTwin/iTwinUI/pull/2674): Components that depend on floating-ui will now use stable references to its setter functions in order to prevent a potential infinite re-render loop. Affected components include: `Tooltip`, `Popover`, `ComboBox`, `Select`, `DropdownMenu`, `DropdownButton`, `SplitButton`.
8
+ - [#2670](https://github.com/iTwin/iTwinUI/pull/2670): Updated the inner `border-radius` of `Tile` to be concentric with the outer one.
9
+
10
+ ## 3.20.1
11
+
12
+ ### Patch Changes
13
+
14
+ - 1398d25dfe5ad68a4fe500c38fec9f02a9970bd5: Fixed a `Table` issue where the sub-row expander could appear after the cell content in certain cases.
15
+
3
16
  ## 3.20.0
4
17
 
5
18
  ### Minor Changes
@@ -104,9 +104,9 @@ const Menu = _react.forwardRef((props, ref) => {
104
104
  }),
105
105
  ]);
106
106
  _react.useEffect(() => {
107
- if (void 0 !== positionReference)
108
- popover.refs.setPositionReference(positionReference);
109
- }, [popover.refs, positionReference]);
107
+ let setPositionReference = popover.refs.setPositionReference;
108
+ if (void 0 !== positionReference) setPositionReference(positionReference);
109
+ }, [popover.refs.setPositionReference, positionReference]);
110
110
  let refs = (0, _index.useMergedRefs)(
111
111
  setMenuElement,
112
112
  ref,
@@ -203,6 +203,11 @@ const usePopover = (options) => {
203
203
  }),
204
204
  [interactions, mergedInteractions.click, visible, onOpenChange],
205
205
  );
206
+ let setFloating = (0, _index.useStableCallback)(floating.refs.setFloating);
207
+ let setReference = (0, _index.useStableCallback)(floating.refs.setReference);
208
+ let setPositionReference = (0, _index.useStableCallback)(
209
+ floating.refs.setPositionReference,
210
+ );
206
211
  return _react.useMemo(
207
212
  () => ({
208
213
  open,
@@ -210,8 +215,23 @@ const usePopover = (options) => {
210
215
  getReferenceProps,
211
216
  getFloatingProps,
212
217
  ...floating,
218
+ refs: {
219
+ ...floating.refs,
220
+ setFloating,
221
+ setReference,
222
+ setPositionReference,
223
+ },
213
224
  }),
214
- [open, onOpenChange, getFloatingProps, floating, getReferenceProps],
225
+ [
226
+ open,
227
+ onOpenChange,
228
+ getFloatingProps,
229
+ floating,
230
+ getReferenceProps,
231
+ setFloating,
232
+ setReference,
233
+ setPositionReference,
234
+ ],
215
235
  );
216
236
  };
217
237
  const Popover = _react.forwardRef((props, forwardedRef) => {
@@ -248,9 +268,10 @@ const Popover = _react.forwardRef((props, forwardedRef) => {
248
268
  let hasAriaLabel = !!props['aria-labelledby'] || !!props['aria-label'];
249
269
  (0, _index.useLayoutEffect)(() => {
250
270
  if (!positionReference) return;
251
- popover.refs.setPositionReference(positionReference);
252
- return () => void popover.refs.setPositionReference(null);
253
- }, [popover.refs, positionReference]);
271
+ let setPositionReference = popover.refs.setPositionReference;
272
+ setPositionReference(positionReference);
273
+ return () => void setPositionReference(null);
274
+ }, [popover.refs.setPositionReference, positionReference]);
254
275
  let [initialFocus, setInitialFocus] = _react.useState();
255
276
  let initialFocusContextValue = _react.useMemo(
256
277
  () => ({
@@ -117,8 +117,8 @@ const TableCell = (props) => {
117
117
  _react.createElement(
118
118
  _react.Fragment,
119
119
  null,
120
- cellContent,
121
120
  expander,
121
+ cellContent,
122
122
  shadows,
123
123
  ),
124
124
  [cellContent, expander, shadows],
@@ -189,6 +189,18 @@ const useTooltip = (options = {}) => {
189
189
  }),
190
190
  [interactions, props, id, open],
191
191
  );
192
+ let _setFloating = (0, _index.useStableCallback)(floating.refs.setFloating);
193
+ let setFloating = _react.useCallback(
194
+ (element) => {
195
+ _setFloating(element);
196
+ syncWithControlledState(element);
197
+ },
198
+ [_setFloating, syncWithControlledState],
199
+ );
200
+ let setReference = (0, _index.useStableCallback)(floating.refs.setReference);
201
+ let setPositionReference = (0, _index.useStableCallback)(
202
+ floating.refs.setPositionReference,
203
+ );
192
204
  return _react.useMemo(
193
205
  () => ({
194
206
  getReferenceProps,
@@ -196,14 +208,20 @@ const useTooltip = (options = {}) => {
196
208
  ...floating,
197
209
  refs: {
198
210
  ...floating.refs,
199
- setFloating: (element) => {
200
- floating.refs.setFloating(element);
201
- syncWithControlledState(element);
202
- },
211
+ setFloating,
212
+ setReference,
213
+ setPositionReference,
203
214
  },
204
215
  floatingStyles: floating.context.open ? floating.floatingStyles : {},
205
216
  }),
206
- [getReferenceProps, floatingProps, floating, syncWithControlledState],
217
+ [
218
+ getReferenceProps,
219
+ floatingProps,
220
+ floating,
221
+ setFloating,
222
+ setReference,
223
+ setPositionReference,
224
+ ],
207
225
  );
208
226
  };
209
227
  const Tooltip = _react.forwardRef((props, forwardedRef) => {
package/DEV-cjs/styles.js CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
3
- const e = '3.20.0';
3
+ const e = '3.20.2';
4
4
  const u = new Proxy(
5
5
  {},
6
6
  {
@@ -20,3 +20,4 @@ _export_star._(require('./useSyncExternalStore.js'), exports);
20
20
  _export_star._(require('./useVirtualScroll.js'), exports);
21
21
  _export_star._(require('./useInstance.js'), exports);
22
22
  _export_star._(require('./useWarningLogger.js'), exports);
23
+ _export_star._(require('./useStableCallback.js'), exports);
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+ Object.defineProperty(exports, '__esModule', {
3
+ value: true,
4
+ });
5
+ Object.defineProperty(exports, 'useStableCallback', {
6
+ enumerable: true,
7
+ get: function () {
8
+ return useStableCallback;
9
+ },
10
+ });
11
+ const _interop_require_wildcard = require('@swc/helpers/_/_interop_require_wildcard');
12
+ const _react = /*#__PURE__*/ _interop_require_wildcard._(require('react'));
13
+ const _useLatestRef = require('./useLatestRef.js');
14
+ function useStableCallback(callback) {
15
+ let latestCallback = (0, _useLatestRef.useLatestRef)(callback);
16
+ return _react.useCallback(
17
+ (...args) => latestCallback.current?.(...args),
18
+ [latestCallback],
19
+ );
20
+ }
@@ -96,9 +96,9 @@ export const Menu = React.forwardRef((props, ref) => {
96
96
  }),
97
97
  ]);
98
98
  React.useEffect(() => {
99
- if (void 0 !== positionReference)
100
- popover.refs.setPositionReference(positionReference);
101
- }, [popover.refs, positionReference]);
99
+ let setPositionReference = popover.refs.setPositionReference;
100
+ if (void 0 !== positionReference) setPositionReference(positionReference);
101
+ }, [popover.refs.setPositionReference, positionReference]);
102
102
  let refs = useMergedRefs(setMenuElement, ref, popover.refs.setFloating);
103
103
  let triggerRef = React.useRef(null);
104
104
  let close = React.useCallback(() => {
@@ -29,6 +29,7 @@ import {
29
29
  mergeEventHandlers,
30
30
  useControlledState,
31
31
  useId,
32
+ useStableCallback,
32
33
  useLayoutEffect,
33
34
  useMergedRefs,
34
35
  } from '../../utils/index.js';
@@ -204,6 +205,11 @@ export const usePopover = (options) => {
204
205
  }),
205
206
  [interactions, mergedInteractions.click, visible, onOpenChange],
206
207
  );
208
+ let setFloating = useStableCallback(floating.refs.setFloating);
209
+ let setReference = useStableCallback(floating.refs.setReference);
210
+ let setPositionReference = useStableCallback(
211
+ floating.refs.setPositionReference,
212
+ );
207
213
  return React.useMemo(
208
214
  () => ({
209
215
  open,
@@ -211,8 +217,23 @@ export const usePopover = (options) => {
211
217
  getReferenceProps,
212
218
  getFloatingProps,
213
219
  ...floating,
220
+ refs: {
221
+ ...floating.refs,
222
+ setFloating,
223
+ setReference,
224
+ setPositionReference,
225
+ },
214
226
  }),
215
- [open, onOpenChange, getFloatingProps, floating, getReferenceProps],
227
+ [
228
+ open,
229
+ onOpenChange,
230
+ getFloatingProps,
231
+ floating,
232
+ getReferenceProps,
233
+ setFloating,
234
+ setReference,
235
+ setPositionReference,
236
+ ],
216
237
  );
217
238
  };
218
239
  export const Popover = React.forwardRef((props, forwardedRef) => {
@@ -249,9 +270,10 @@ export const Popover = React.forwardRef((props, forwardedRef) => {
249
270
  let hasAriaLabel = !!props['aria-labelledby'] || !!props['aria-label'];
250
271
  useLayoutEffect(() => {
251
272
  if (!positionReference) return;
252
- popover.refs.setPositionReference(positionReference);
253
- return () => void popover.refs.setPositionReference(null);
254
- }, [popover.refs, positionReference]);
273
+ let setPositionReference = popover.refs.setPositionReference;
274
+ setPositionReference(positionReference);
275
+ return () => void setPositionReference(null);
276
+ }, [popover.refs.setPositionReference, positionReference]);
255
277
  let [initialFocus, setInitialFocus] = React.useState();
256
278
  let initialFocusContextValue = React.useMemo(
257
279
  () => ({
@@ -93,7 +93,7 @@ export const TableCell = (props) => {
93
93
  );
94
94
  let defaultCellRendererChildren = React.useMemo(
95
95
  () =>
96
- React.createElement(React.Fragment, null, cellContent, expander, shadows),
96
+ React.createElement(React.Fragment, null, expander, cellContent, shadows),
97
97
  [cellContent, expander, shadows],
98
98
  );
99
99
  let cellRendererProps = React.useMemo(
@@ -23,6 +23,7 @@ import {
23
23
  cloneElementWithRef,
24
24
  useControlledState,
25
25
  useId,
26
+ useStableCallback,
26
27
  useMergedRefs,
27
28
  } from '../../utils/index.js';
28
29
  export const defaultTooltipDelay = {
@@ -185,6 +186,18 @@ let useTooltip = (options = {}) => {
185
186
  }),
186
187
  [interactions, props, id, open],
187
188
  );
189
+ let _setFloating = useStableCallback(floating.refs.setFloating);
190
+ let setFloating = React.useCallback(
191
+ (element) => {
192
+ _setFloating(element);
193
+ syncWithControlledState(element);
194
+ },
195
+ [_setFloating, syncWithControlledState],
196
+ );
197
+ let setReference = useStableCallback(floating.refs.setReference);
198
+ let setPositionReference = useStableCallback(
199
+ floating.refs.setPositionReference,
200
+ );
188
201
  return React.useMemo(
189
202
  () => ({
190
203
  getReferenceProps,
@@ -192,14 +205,20 @@ let useTooltip = (options = {}) => {
192
205
  ...floating,
193
206
  refs: {
194
207
  ...floating.refs,
195
- setFloating: (element) => {
196
- floating.refs.setFloating(element);
197
- syncWithControlledState(element);
198
- },
208
+ setFloating,
209
+ setReference,
210
+ setPositionReference,
199
211
  },
200
212
  floatingStyles: floating.context.open ? floating.floatingStyles : {},
201
213
  }),
202
- [getReferenceProps, floatingProps, floating, syncWithControlledState],
214
+ [
215
+ getReferenceProps,
216
+ floatingProps,
217
+ floating,
218
+ setFloating,
219
+ setReference,
220
+ setPositionReference,
221
+ ],
203
222
  );
204
223
  };
205
224
  export const Tooltip = React.forwardRef((props, forwardedRef) => {
package/DEV-esm/styles.js CHANGED
@@ -1,4 +1,4 @@
1
- const t = '3.20.0';
1
+ const t = '3.20.2';
2
2
  const u = new Proxy(
3
3
  {},
4
4
  {
@@ -15,3 +15,4 @@ export * from './useSyncExternalStore.js';
15
15
  export * from './useVirtualScroll.js';
16
16
  export * from './useInstance.js';
17
17
  export * from './useWarningLogger.js';
18
+ export * from './useStableCallback.js';
@@ -0,0 +1,9 @@
1
+ import * as React from 'react';
2
+ import { useLatestRef } from './useLatestRef.js';
3
+ export function useStableCallback(callback) {
4
+ let latestCallback = useLatestRef(callback);
5
+ return React.useCallback(
6
+ (...args) => latestCallback.current?.(...args),
7
+ [latestCallback],
8
+ );
9
+ }
package/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # MIT License
2
2
 
3
- Copyright © 2021-2025 Bentley Systems, Incorporated. All rights reserved.
3
+ Copyright © 2021-2026 Bentley Systems, Incorporated. All rights reserved.
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
6
 
@@ -104,9 +104,9 @@ const Menu = _react.forwardRef((props, ref) => {
104
104
  }),
105
105
  ]);
106
106
  _react.useEffect(() => {
107
- if (void 0 !== positionReference)
108
- popover.refs.setPositionReference(positionReference);
109
- }, [popover.refs, positionReference]);
107
+ let setPositionReference = popover.refs.setPositionReference;
108
+ if (void 0 !== positionReference) setPositionReference(positionReference);
109
+ }, [popover.refs.setPositionReference, positionReference]);
110
110
  let refs = (0, _index.useMergedRefs)(
111
111
  setMenuElement,
112
112
  ref,
@@ -112,6 +112,14 @@ export declare const PopoverInitialFocusContext: React.Context<{
112
112
  setInitialFocus: React.Dispatch<React.SetStateAction<InitialFocus>>;
113
113
  } | undefined>;
114
114
  export declare const usePopover: (options: PopoverOptions & PopoverInternalProps) => {
115
+ refs: {
116
+ setFloating: ((node: HTMLElement | null) => void) & ((node: HTMLElement | null) => void);
117
+ setReference: ((node: import("@floating-ui/react-dom").ReferenceType | null) => void) & ((node: import("@floating-ui/react").ReferenceType | null) => void);
118
+ setPositionReference: (node: import("@floating-ui/react").ReferenceType | null) => void;
119
+ reference: React.MutableRefObject<import("@floating-ui/react-dom").ReferenceType | null> & React.MutableRefObject<import("@floating-ui/react").ReferenceType | null>;
120
+ floating: React.MutableRefObject<HTMLElement | null>;
121
+ domReference: React.MutableRefObject<Element | null>;
122
+ };
115
123
  placement: Placement;
116
124
  strategy: import("@floating-ui/utils").Strategy;
117
125
  middlewareData: import("@floating-ui/core").MiddlewareData;
@@ -120,12 +128,6 @@ export declare const usePopover: (options: PopoverOptions & PopoverInternalProps
120
128
  isPositioned: boolean;
121
129
  update: () => void;
122
130
  floatingStyles: React.CSSProperties;
123
- refs: {
124
- reference: React.MutableRefObject<import("@floating-ui/react-dom").ReferenceType | null>;
125
- floating: React.MutableRefObject<HTMLElement | null>;
126
- setReference: (node: import("@floating-ui/react-dom").ReferenceType | null) => void;
127
- setFloating: (node: HTMLElement | null) => void;
128
- } & import("@floating-ui/react").ExtendedRefs<import("@floating-ui/react").ReferenceType>;
129
131
  elements: {
130
132
  reference: import("@floating-ui/react-dom").ReferenceType | null;
131
133
  floating: HTMLElement | null;
@@ -203,6 +203,11 @@ const usePopover = (options) => {
203
203
  }),
204
204
  [interactions, mergedInteractions.click, visible, onOpenChange],
205
205
  );
206
+ let setFloating = (0, _index.useStableCallback)(floating.refs.setFloating);
207
+ let setReference = (0, _index.useStableCallback)(floating.refs.setReference);
208
+ let setPositionReference = (0, _index.useStableCallback)(
209
+ floating.refs.setPositionReference,
210
+ );
206
211
  return _react.useMemo(
207
212
  () => ({
208
213
  open,
@@ -210,8 +215,23 @@ const usePopover = (options) => {
210
215
  getReferenceProps,
211
216
  getFloatingProps,
212
217
  ...floating,
218
+ refs: {
219
+ ...floating.refs,
220
+ setFloating,
221
+ setReference,
222
+ setPositionReference,
223
+ },
213
224
  }),
214
- [open, onOpenChange, getFloatingProps, floating, getReferenceProps],
225
+ [
226
+ open,
227
+ onOpenChange,
228
+ getFloatingProps,
229
+ floating,
230
+ getReferenceProps,
231
+ setFloating,
232
+ setReference,
233
+ setPositionReference,
234
+ ],
215
235
  );
216
236
  };
217
237
  const Popover = _react.forwardRef((props, forwardedRef) => {
@@ -248,9 +268,10 @@ const Popover = _react.forwardRef((props, forwardedRef) => {
248
268
  let hasAriaLabel = !!props['aria-labelledby'] || !!props['aria-label'];
249
269
  (0, _index.useLayoutEffect)(() => {
250
270
  if (!positionReference) return;
251
- popover.refs.setPositionReference(positionReference);
252
- return () => void popover.refs.setPositionReference(null);
253
- }, [popover.refs, positionReference]);
271
+ let setPositionReference = popover.refs.setPositionReference;
272
+ setPositionReference(positionReference);
273
+ return () => void setPositionReference(null);
274
+ }, [popover.refs.setPositionReference, positionReference]);
254
275
  let [initialFocus, setInitialFocus] = _react.useState();
255
276
  let initialFocusContextValue = _react.useMemo(
256
277
  () => ({
@@ -117,8 +117,8 @@ const TableCell = (props) => {
117
117
  _react.createElement(
118
118
  _react.Fragment,
119
119
  null,
120
- cellContent,
121
120
  expander,
121
+ cellContent,
122
122
  shadows,
123
123
  ),
124
124
  [cellContent, expander, shadows],
@@ -189,6 +189,18 @@ const useTooltip = (options = {}) => {
189
189
  }),
190
190
  [interactions, props, id, open],
191
191
  );
192
+ let _setFloating = (0, _index.useStableCallback)(floating.refs.setFloating);
193
+ let setFloating = _react.useCallback(
194
+ (element) => {
195
+ _setFloating(element);
196
+ syncWithControlledState(element);
197
+ },
198
+ [_setFloating, syncWithControlledState],
199
+ );
200
+ let setReference = (0, _index.useStableCallback)(floating.refs.setReference);
201
+ let setPositionReference = (0, _index.useStableCallback)(
202
+ floating.refs.setPositionReference,
203
+ );
192
204
  return _react.useMemo(
193
205
  () => ({
194
206
  getReferenceProps,
@@ -196,14 +208,20 @@ const useTooltip = (options = {}) => {
196
208
  ...floating,
197
209
  refs: {
198
210
  ...floating.refs,
199
- setFloating: (element) => {
200
- floating.refs.setFloating(element);
201
- syncWithControlledState(element);
202
- },
211
+ setFloating,
212
+ setReference,
213
+ setPositionReference,
203
214
  },
204
215
  floatingStyles: floating.context.open ? floating.floatingStyles : {},
205
216
  }),
206
- [getReferenceProps, floatingProps, floating, syncWithControlledState],
217
+ [
218
+ getReferenceProps,
219
+ floatingProps,
220
+ floating,
221
+ setFloating,
222
+ setReference,
223
+ setPositionReference,
224
+ ],
207
225
  );
208
226
  };
209
227
  const Tooltip = _react.forwardRef((props, forwardedRef) => {
package/cjs/styles.js CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
3
- const e = '3.20.0';
3
+ const e = '3.20.2';
4
4
  const u = new Proxy(
5
5
  {},
6
6
  {
@@ -15,3 +15,4 @@ export * from './useSyncExternalStore.js';
15
15
  export * from './useVirtualScroll.js';
16
16
  export * from './useInstance.js';
17
17
  export * from './useWarningLogger.js';
18
+ export * from './useStableCallback.js';
@@ -20,3 +20,4 @@ _export_star._(require('./useSyncExternalStore.js'), exports);
20
20
  _export_star._(require('./useVirtualScroll.js'), exports);
21
21
  _export_star._(require('./useInstance.js'), exports);
22
22
  _export_star._(require('./useWarningLogger.js'), exports);
23
+ _export_star._(require('./useStableCallback.js'), exports);
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Hook that "memoizes" a function by skipping reactivity, similar to `React.useEffectEvent`,
3
+ * except it returns a stable reference. Under the hood, it combines `useLatestRef` and `React.useCallback`.
4
+ *
5
+ * @private
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const onClick = useStableCallback(props.onClick);
10
+ * ```
11
+ */
12
+ export declare function useStableCallback<T extends (...args: any) => any>(callback: T | undefined): T;
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+ Object.defineProperty(exports, '__esModule', {
3
+ value: true,
4
+ });
5
+ Object.defineProperty(exports, 'useStableCallback', {
6
+ enumerable: true,
7
+ get: function () {
8
+ return useStableCallback;
9
+ },
10
+ });
11
+ const _interop_require_wildcard = require('@swc/helpers/_/_interop_require_wildcard');
12
+ const _react = /*#__PURE__*/ _interop_require_wildcard._(require('react'));
13
+ const _useLatestRef = require('./useLatestRef.js');
14
+ function useStableCallback(callback) {
15
+ let latestCallback = (0, _useLatestRef.useLatestRef)(callback);
16
+ return _react.useCallback(
17
+ (...args) => latestCallback.current?.(...args),
18
+ [latestCallback],
19
+ );
20
+ }
@@ -96,9 +96,9 @@ export const Menu = React.forwardRef((props, ref) => {
96
96
  }),
97
97
  ]);
98
98
  React.useEffect(() => {
99
- if (void 0 !== positionReference)
100
- popover.refs.setPositionReference(positionReference);
101
- }, [popover.refs, positionReference]);
99
+ let setPositionReference = popover.refs.setPositionReference;
100
+ if (void 0 !== positionReference) setPositionReference(positionReference);
101
+ }, [popover.refs.setPositionReference, positionReference]);
102
102
  let refs = useMergedRefs(setMenuElement, ref, popover.refs.setFloating);
103
103
  let triggerRef = React.useRef(null);
104
104
  let close = React.useCallback(() => {
@@ -112,6 +112,14 @@ export declare const PopoverInitialFocusContext: React.Context<{
112
112
  setInitialFocus: React.Dispatch<React.SetStateAction<InitialFocus>>;
113
113
  } | undefined>;
114
114
  export declare const usePopover: (options: PopoverOptions & PopoverInternalProps) => {
115
+ refs: {
116
+ setFloating: ((node: HTMLElement | null) => void) & ((node: HTMLElement | null) => void);
117
+ setReference: ((node: import("@floating-ui/react-dom").ReferenceType | null) => void) & ((node: import("@floating-ui/react").ReferenceType | null) => void);
118
+ setPositionReference: (node: import("@floating-ui/react").ReferenceType | null) => void;
119
+ reference: React.MutableRefObject<import("@floating-ui/react-dom").ReferenceType | null> & React.MutableRefObject<import("@floating-ui/react").ReferenceType | null>;
120
+ floating: React.MutableRefObject<HTMLElement | null>;
121
+ domReference: React.MutableRefObject<Element | null>;
122
+ };
115
123
  placement: Placement;
116
124
  strategy: import("@floating-ui/utils").Strategy;
117
125
  middlewareData: import("@floating-ui/core").MiddlewareData;
@@ -120,12 +128,6 @@ export declare const usePopover: (options: PopoverOptions & PopoverInternalProps
120
128
  isPositioned: boolean;
121
129
  update: () => void;
122
130
  floatingStyles: React.CSSProperties;
123
- refs: {
124
- reference: React.MutableRefObject<import("@floating-ui/react-dom").ReferenceType | null>;
125
- floating: React.MutableRefObject<HTMLElement | null>;
126
- setReference: (node: import("@floating-ui/react-dom").ReferenceType | null) => void;
127
- setFloating: (node: HTMLElement | null) => void;
128
- } & import("@floating-ui/react").ExtendedRefs<import("@floating-ui/react").ReferenceType>;
129
131
  elements: {
130
132
  reference: import("@floating-ui/react-dom").ReferenceType | null;
131
133
  floating: HTMLElement | null;
@@ -29,6 +29,7 @@ import {
29
29
  mergeEventHandlers,
30
30
  useControlledState,
31
31
  useId,
32
+ useStableCallback,
32
33
  useLayoutEffect,
33
34
  useMergedRefs,
34
35
  } from '../../utils/index.js';
@@ -204,6 +205,11 @@ export const usePopover = (options) => {
204
205
  }),
205
206
  [interactions, mergedInteractions.click, visible, onOpenChange],
206
207
  );
208
+ let setFloating = useStableCallback(floating.refs.setFloating);
209
+ let setReference = useStableCallback(floating.refs.setReference);
210
+ let setPositionReference = useStableCallback(
211
+ floating.refs.setPositionReference,
212
+ );
207
213
  return React.useMemo(
208
214
  () => ({
209
215
  open,
@@ -211,8 +217,23 @@ export const usePopover = (options) => {
211
217
  getReferenceProps,
212
218
  getFloatingProps,
213
219
  ...floating,
220
+ refs: {
221
+ ...floating.refs,
222
+ setFloating,
223
+ setReference,
224
+ setPositionReference,
225
+ },
214
226
  }),
215
- [open, onOpenChange, getFloatingProps, floating, getReferenceProps],
227
+ [
228
+ open,
229
+ onOpenChange,
230
+ getFloatingProps,
231
+ floating,
232
+ getReferenceProps,
233
+ setFloating,
234
+ setReference,
235
+ setPositionReference,
236
+ ],
216
237
  );
217
238
  };
218
239
  export const Popover = React.forwardRef((props, forwardedRef) => {
@@ -249,9 +270,10 @@ export const Popover = React.forwardRef((props, forwardedRef) => {
249
270
  let hasAriaLabel = !!props['aria-labelledby'] || !!props['aria-label'];
250
271
  useLayoutEffect(() => {
251
272
  if (!positionReference) return;
252
- popover.refs.setPositionReference(positionReference);
253
- return () => void popover.refs.setPositionReference(null);
254
- }, [popover.refs, positionReference]);
273
+ let setPositionReference = popover.refs.setPositionReference;
274
+ setPositionReference(positionReference);
275
+ return () => void setPositionReference(null);
276
+ }, [popover.refs.setPositionReference, positionReference]);
255
277
  let [initialFocus, setInitialFocus] = React.useState();
256
278
  let initialFocusContextValue = React.useMemo(
257
279
  () => ({