@deque/cauldron-react 6.17.1 → 6.18.0

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.
@@ -4,6 +4,8 @@ type ActionMenuTriggerFunction = (props: ActionMenuTriggerProps, open: boolean)
4
4
  declare const ActionMenu: React.ForwardRefExoticComponent<{
5
5
  children: React.ReactElement;
6
6
  trigger: React.ReactElement | ActionMenuTriggerFunction;
7
+ /** Render the action menu in a different location in the dom. */
8
+ portal?: HTMLElement | React.RefObject<HTMLElement> | undefined;
7
9
  } & Pick<{
8
10
  target: HTMLElement | React.RefObject<HTMLElement> | React.MutableRefObject<HTMLElement>;
9
11
  placement?: "auto" | import("@floating-ui/utils").Placement | "auto-start" | "auto-end" | undefined;
@@ -19,6 +21,7 @@ declare const ActionMenu: React.ForwardRefExoticComponent<{
19
21
  returnFocus?: boolean | undefined;
20
22
  returnFocusElement?: import("../../types").ElementOrRef<HTMLElement> | undefined;
21
23
  } | undefined;
24
+ portal?: HTMLElement | React.RefObject<HTMLElement> | undefined;
22
25
  children?: React.ReactNode;
23
26
  } & React.HTMLAttributes<HTMLElement> & {
24
27
  as?: React.ElementType<any, keyof React.JSX.IntrinsicElements> | undefined;
@@ -20,6 +20,8 @@ declare const AnchoredOverlay: React.ForwardRefExoticComponent<{
20
20
  focusTrap?: boolean | undefined;
21
21
  /** When `focusTrap` is true, optional arguments to configure the focus trap. */
22
22
  focusTrapOptions?: Parameters<typeof useFocusTrap>[1];
23
+ /** Render the anchored overlay in a different location in the dom. */
24
+ portal?: HTMLElement | React.RefObject<HTMLElement> | undefined;
23
25
  children?: React.ReactNode;
24
26
  } & React.HTMLAttributes<HTMLElement> & {
25
27
  as?: React.ElementType<any, keyof React.JSX.IntrinsicElements> | undefined;
@@ -8,6 +8,7 @@ type BaseProps = React.HTMLAttributes<HTMLDivElement> & {
8
8
  show: boolean;
9
9
  onClose: () => void;
10
10
  placement?: React.ComponentProps<typeof AnchoredOverlay>['placement'];
11
+ /** Render the popover in a different location in the dom. */
11
12
  portal?: React.RefObject<HTMLElement> | HTMLElement;
12
13
  };
13
14
  type CustomProps = BaseProps & {
@@ -10,6 +10,7 @@ interface TextEllipsisBaseProps extends PolymorphicProps<React.HTMLAttributes<HT
10
10
  * Only use this prop if you have an alternative way to make the full text accessible.
11
11
  */
12
12
  hideTooltip?: boolean;
13
+ onOverflowChange?: (hasOverflow: boolean) => void;
13
14
  }
14
15
  interface TextEllipsisWithTooltipProps extends TextEllipsisBaseProps {
15
16
  tooltipProps?: Omit<TooltipProps, 'target' | 'association' | 'children'>;
@@ -9,6 +9,7 @@ export interface TooltipProps extends React.HTMLAttributes<HTMLDivElement> {
9
9
  show?: boolean | undefined;
10
10
  defaultShow?: boolean;
11
11
  placement?: React.ComponentProps<typeof AnchoredOverlay>['placement'];
12
+ /** Render the tooltip in a different location in the dom. */
12
13
  portal?: React.RefObject<HTMLElement> | HTMLElement;
13
14
  hideElementOnHidden?: boolean;
14
15
  }
package/lib/index.js CHANGED
@@ -826,7 +826,8 @@ function ClickOutsideListener(_a, ref) {
826
826
  // target instead of a child element target
827
827
  return;
828
828
  }
829
- if (childElementRef.current &&
829
+ if (!target &&
830
+ childElementRef.current &&
830
831
  !childElementRef.current.contains(eventTarget)) {
831
832
  onClickOutside(event);
832
833
  }
@@ -1783,7 +1784,7 @@ function getAutoAlignment(placement) {
1783
1784
  }
1784
1785
  var AnchoredOverlay = React.forwardRef(function (_a, refProp) {
1785
1786
  var _b, _c;
1786
- var as = _a.as, _d = _a.placement, initialPlacement = _d === void 0 ? 'auto' : _d, target = _a.target, children = _a.children, style = _a.style, _e = _a.open, open = _e === void 0 ? false : _e, offset = _a.offset, focusTrap = _a.focusTrap, focusTrapOptions = _a.focusTrapOptions, onOpenChange = _a.onOpenChange, onPlacementChange = _a.onPlacementChange, onShiftChange = _a.onShiftChange, props = tslib.__rest(_a, ["as", "placement", "target", "children", "style", "open", "offset", "focusTrap", "focusTrapOptions", "onOpenChange", "onPlacementChange", "onShiftChange"]);
1787
+ var as = _a.as, _d = _a.placement, initialPlacement = _d === void 0 ? 'auto' : _d, target = _a.target, children = _a.children, style = _a.style, _e = _a.open, open = _e === void 0 ? false : _e, offset = _a.offset, focusTrap = _a.focusTrap, focusTrapOptions = _a.focusTrapOptions, onOpenChange = _a.onOpenChange, onPlacementChange = _a.onPlacementChange, onShiftChange = _a.onShiftChange, portal = _a.portal, props = tslib.__rest(_a, ["as", "placement", "target", "children", "style", "open", "offset", "focusTrap", "focusTrapOptions", "onOpenChange", "onPlacementChange", "onShiftChange", "portal"]);
1787
1788
  var ref = useSharedRef(refProp);
1788
1789
  var Component = as || 'div';
1789
1790
  var _f = reactDom$1.useFloating({
@@ -1835,7 +1836,18 @@ var AnchoredOverlay = React.forwardRef(function (_a, refProp) {
1835
1836
  });
1836
1837
  }
1837
1838
  }, [onShiftChange, (_b = middlewareData.shift) === null || _b === void 0 ? void 0 : _b.x, (_c = middlewareData.shift) === null || _c === void 0 ? void 0 : _c.y]);
1838
- return (React__default["default"].createElement(Component, tslib.__assign({ ref: ref }, props, { style: tslib.__assign(tslib.__assign({}, floatingStyles), style) }), children));
1839
+ var AnchoredOverlayComponent = (React__default["default"].createElement(Component, tslib.__assign({ ref: ref }, props, { style: tslib.__assign(tslib.__assign({}, floatingStyles), style) }), children));
1840
+ if (portal && !isBrowser()) {
1841
+ return null;
1842
+ }
1843
+ if (portal && typeof portal !== 'undefined') {
1844
+ var portalElement = (portal && 'current' in portal ? portal.current : portal) ||
1845
+ (
1846
+ // eslint-disable-next-line ssr-friendly/no-dom-globals-in-react-fc
1847
+ document === null || document === void 0 ? void 0 : document.body);
1848
+ return reactDom.createPortal(AnchoredOverlayComponent, portalElement);
1849
+ }
1850
+ return AnchoredOverlayComponent;
1839
1851
  });
1840
1852
  AnchoredOverlay.displayName = 'AnchoredOverlay';
1841
1853
 
@@ -1985,18 +1997,18 @@ function Tooltip(_a) {
1985
1997
  // that the arrow needs to shift
1986
1998
  setArrowShift(x * -1);
1987
1999
  }, [variant]);
1988
- return (React__default["default"].createElement(React__default["default"].Fragment, null, (showTooltip || hideElementOnHidden) && isBrowser()
1989
- ? reactDom.createPortal(React__default["default"].createElement(AnchoredOverlay, tslib.__assign({ id: id, target: target, placement: initialPlacement, onPlacementChange: setPlacement, open: showTooltip && typeof showProp !== 'boolean', onOpenChange: setShowTooltip, onShiftChange: updateArrowShiftPosition, className: classNames__default["default"]('Tooltip', "Tooltip--".concat(placement), className, {
1990
- TooltipInfo: variant === 'info',
1991
- 'Tooltip--hidden': !showTooltip && hideElementOnHidden,
1992
- 'Tooltip--big': variant === 'big'
1993
- }), ref: setTooltipElement, role: "tooltip", offset: 8 }, props),
1994
- variant !== 'big' && React__default["default"].createElement("div", { className: "TooltipArrow", style: arrowShift ? { transform: "translateX(".concat(arrowShift, "px)") } : undefined }),
1995
- children), (portal && 'current' in portal ? portal.current : portal) ||
1996
- (
1997
- // eslint-disable-next-line ssr-friendly/no-dom-globals-in-react-fc
1998
- document === null || document === void 0 ? void 0 : document.body))
1999
- : null));
2000
+ return (React__default["default"].createElement(React__default["default"].Fragment, null, (showTooltip || hideElementOnHidden) && isBrowser() ? (React__default["default"].createElement(AnchoredOverlay, tslib.__assign({ id: id, target: target, placement: initialPlacement, onPlacementChange: setPlacement, open: showTooltip && typeof showProp !== 'boolean', onOpenChange: setShowTooltip, onShiftChange: updateArrowShiftPosition, className: classNames__default["default"]('Tooltip', "Tooltip--".concat(placement), className, {
2001
+ TooltipInfo: variant === 'info',
2002
+ 'Tooltip--hidden': !showTooltip && hideElementOnHidden,
2003
+ 'Tooltip--big': variant === 'big'
2004
+ }), ref: setTooltipElement, role: "tooltip", offset: 8,
2005
+ // guarded by isBrowser() check
2006
+ // eslint-disable-next-line ssr-friendly/no-dom-globals-in-react-fc
2007
+ portal: portal || (document === null || document === void 0 ? void 0 : document.body) }, props),
2008
+ variant !== 'big' && (React__default["default"].createElement("div", { className: "TooltipArrow", style: arrowShift
2009
+ ? { transform: "translateX(".concat(arrowShift, "px)") }
2010
+ : undefined })),
2011
+ children)) : null));
2000
2012
  }
2001
2013
  Tooltip.displayName = 'Tooltip';
2002
2014
  var TooltipHead = function (_a) {
@@ -4643,19 +4655,20 @@ var Popover = React.forwardRef(function (_a, ref) {
4643
4655
  active: show
4644
4656
  }, [show]);
4645
4657
  useFocusTrap(popoverRef, { disabled: !show, returnFocus: true });
4646
- if (!show || !isBrowser())
4658
+ if (!show || !isBrowser()) {
4647
4659
  return null;
4648
- return reactDom.createPortal(React__default["default"].createElement(ClickOutsideListener$1, { onClickOutside: handleClickOutside },
4660
+ }
4661
+ return (React__default["default"].createElement(ClickOutsideListener$1, { onClickOutside: handleClickOutside },
4649
4662
  React__default["default"].createElement(AnchoredOverlay, tslib.__assign({ id: id, className: classNames__default["default"]('Popover', "Popover--".concat(placement), className, {
4650
4663
  'Popover--hidden': !show,
4651
4664
  'Popover--prompt': variant === 'prompt'
4652
- }), ref: popoverRef, role: "dialog", target: target, open: show, placement: initialPlacement, onPlacementChange: setPlacement, offset: 8 }, additionalProps, props),
4665
+ }), ref: popoverRef, role: "dialog", target: target, open: show, placement: initialPlacement, onPlacementChange: setPlacement, offset: 8,
4666
+ // guarded by isBrowser() check
4667
+ // eslint-disable-next-line ssr-friendly/no-dom-globals-in-react-fc
4668
+ portal: portal || (document === null || document === void 0 ? void 0 : document.body) }, additionalProps, props),
4653
4669
  React__default["default"].createElement("div", { className: "Popover__popoverArrow" }),
4654
4670
  React__default["default"].createElement("div", { className: "Popover__borderLeft" }),
4655
- variant === 'prompt' ? (React__default["default"].createElement(PromptPopoverContent, { applyButtonText: applyButtonText, onApply: onApply, closeButtonText: closeButtonText, infoText: infoText || '', onClose: handleClosePopover, infoTextId: "".concat(id, "-label") })) : (children))), (portal && 'current' in portal ? portal.current : portal) ||
4656
- // Dependent on "isBrowser" check above:
4657
- // eslint-disable-next-line ssr-friendly/no-dom-globals-in-react-fc
4658
- document.body);
4671
+ variant === 'prompt' ? (React__default["default"].createElement(PromptPopoverContent, { applyButtonText: applyButtonText, onApply: onApply, closeButtonText: closeButtonText, infoText: infoText || '', onClose: handleClosePopover, infoTextId: "".concat(id, "-label") })) : (children))));
4659
4672
  });
4660
4673
  Popover.displayName = 'Popover';
4661
4674
 
@@ -4672,7 +4685,7 @@ function TimelineItem(_a) {
4672
4685
  }
4673
4686
 
4674
4687
  var TextEllipsis = React__default["default"].forwardRef(function (_a, ref) {
4675
- var className = _a.className, children = _a.children, maxLines = _a.maxLines, as = _a.as, tooltipProps = _a.tooltipProps, hideTooltip = _a.hideTooltip, props = tslib.__rest(_a, ["className", "children", "maxLines", "as", "tooltipProps", "hideTooltip"]);
4688
+ var className = _a.className, children = _a.children, maxLines = _a.maxLines, as = _a.as, tooltipProps = _a.tooltipProps, hideTooltip = _a.hideTooltip, onOverflowChange = _a.onOverflowChange, props = tslib.__rest(_a, ["className", "children", "maxLines", "as", "tooltipProps", "hideTooltip", "onOverflowChange"]);
4676
4689
  var Element = 'div';
4677
4690
  var sharedRef = useSharedRef(ref);
4678
4691
  var _b = tslib.__read(React.useState(false), 2), hasOverflow = _b[0], setHasOverflow = _b[1];
@@ -4711,6 +4724,11 @@ var TextEllipsis = React__default["default"].forwardRef(function (_a, ref) {
4711
4724
  observer === null || observer === void 0 ? void 0 : observer.disconnect();
4712
4725
  };
4713
4726
  }, [hideTooltip]);
4727
+ React.useEffect(function () {
4728
+ if (typeof onOverflowChange === 'function') {
4729
+ onOverflowChange(hasOverflow);
4730
+ }
4731
+ }, [hasOverflow]);
4714
4732
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
4715
4733
  React__default["default"].createElement(Element, tslib.__assign({ className: classNames__default["default"]('TextEllipsis', className, {
4716
4734
  'TextEllipsis--multiline': !!maxLines
@@ -5070,7 +5088,7 @@ ActionListLinkItem.displayName = 'ActionListLinkItem';
5070
5088
 
5071
5089
  var _a = tslib.__read(['ArrowDown', 'ArrowUp'], 2), ArrowDown = _a[0], ArrowUp = _a[1];
5072
5090
  var ActionMenu = React.forwardRef(function (_a, ref) {
5073
- var className = _a.className, style = _a.style, trigger = _a.trigger, _b = _a.placement, placement = _b === void 0 ? 'bottom-start' : _b, actionMenuList = _a.children, props = tslib.__rest(_a, ["className", "style", "trigger", "placement", "children"]);
5091
+ var className = _a.className, style = _a.style, trigger = _a.trigger, _b = _a.placement, placement = _b === void 0 ? 'bottom-start' : _b, actionMenuList = _a.children, portal = _a.portal, props = tslib.__rest(_a, ["className", "style", "trigger", "placement", "children", "portal"]);
5074
5092
  var _c = tslib.__read(React.useState(false), 2), open = _c[0], setOpen = _c[1];
5075
5093
  var _d = tslib.__read(React.useState('first'), 2), focusStrategy = _d[0], setFocusStrategy = _d[1];
5076
5094
  var triggerRef = React.useRef(null);
@@ -5138,7 +5156,7 @@ var ActionMenu = React.forwardRef(function (_a, ref) {
5138
5156
  }, [open]);
5139
5157
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
5140
5158
  React__default["default"].createElement(ClickOutsideListener$1, { onClickOutside: handleClickOutside, mouseEvent: open ? undefined : false, touchEvent: open ? undefined : false }, actionMenuTrigger),
5141
- React__default["default"].createElement(AnchoredOverlay, tslib.__assign({ ref: actionMenuRef, role: "presentation", className: classNames__default["default"]('ActionMenu', className), open: open, onOpenChange: setOpen, target: triggerRef, placement: placement, offset: 4, style: tslib.__assign({ display: !open ? 'none' : undefined }, style) }, props), React__default["default"].cloneElement(actionMenuList, {
5159
+ React__default["default"].createElement(AnchoredOverlay, tslib.__assign({ ref: actionMenuRef, role: "presentation", className: classNames__default["default"]('ActionMenu', className), open: open, onOpenChange: setOpen, target: triggerRef, placement: placement, offset: 4, portal: portal, style: tslib.__assign({ display: !open ? 'none' : undefined }, style) }, props), React__default["default"].cloneElement(actionMenuList, {
5142
5160
  ref: actionMenuListRef,
5143
5161
  role: 'menu',
5144
5162
  onAction: handleAction,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deque/cauldron-react",
3
- "version": "6.17.1",
3
+ "version": "6.18.0",
4
4
  "license": "MPL-2.0",
5
5
  "description": "Fully accessible react components library for Deque Cauldron",
6
6
  "homepage": "https://cauldron.dequelabs.com/",