@deque/cauldron-react 6.7.0-canary.8f770f32 → 6.7.0-canary.8ff3885e

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,7 +4,23 @@ export interface ClickOutsideListenerProps<T extends HTMLElement = HTMLElement>
4
4
  onClickOutside: (e: MouseEvent | TouchEvent) => void;
5
5
  mouseEvent?: 'mousedown' | 'click' | 'mouseup' | false;
6
6
  touchEvent?: 'touchstart' | 'touchend' | false;
7
- target?: T | React.RefObject<T> | React.MutableRefObject<T>;
7
+ target?: T;
8
+ }
9
+ export default class ClickOutsideListener extends React.Component<ClickOutsideListenerProps> {
10
+ static displayName: string;
11
+ static defaultProps: {
12
+ mouseEvent: string;
13
+ touchEvent: string;
14
+ };
15
+ private nodeRef;
16
+ handleEvent: (event: MouseEvent | TouchEvent) => void;
17
+ componentDidMount(): void;
18
+ componentDidUpdate(prevProps: ClickOutsideListenerProps): void;
19
+ componentWillUnmount(): void;
20
+ private attachEventListeners;
21
+ private removeEventListeners;
22
+ resolveRef: (node: HTMLElement) => void;
23
+ render(): React.FunctionComponentElement<{
24
+ ref: (node: HTMLElement) => void;
25
+ }> | null;
8
26
  }
9
- declare const _default: React.ForwardRefExoticComponent<ClickOutsideListenerProps<HTMLElement> & React.RefAttributes<HTMLElement>>;
10
- export default _default;
package/lib/index.js CHANGED
@@ -791,55 +791,74 @@ var OptionsMenuWrapper = function (_a) {
791
791
  return (React__default["default"].createElement("div", tslib.__assign({ className: classNames__default["default"]('OptionsMenu', menuAlignment(align), className) }, other)));
792
792
  };
793
793
 
794
- function ClickOutsideListener(_a, ref) {
795
- var children = _a.children, _b = _a.mouseEvent, mouseEvent = _b === void 0 ? 'click' : _b, _c = _a.touchEvent, touchEvent = _c === void 0 ? 'touchend' : _c, target = _a.target, _d = _a.onClickOutside, onClickOutside = _d === void 0 ? function () { return null; } : _d;
796
- var childElementRef = React.useRef();
797
- var handleEvent = function (event) {
798
- if (event.defaultPrevented) {
799
- return;
800
- }
801
- var eventTarget = event.target;
802
- if (target && (target instanceof HTMLElement || 'current' in target)) {
803
- var elementTarget = target instanceof HTMLElement ? target : target.current;
804
- if (!(elementTarget === null || elementTarget === void 0 ? void 0 : elementTarget.contains(eventTarget))) {
794
+ var ClickOutsideListener = /** @class */ (function (_super) {
795
+ tslib.__extends(ClickOutsideListener, _super);
796
+ function ClickOutsideListener() {
797
+ var _this = _super !== null && _super.apply(this, arguments) || this;
798
+ _this.handleEvent = function (event) {
799
+ var _a = _this, nodeRef = _a.nodeRef, props = _a.props;
800
+ var onClickOutside = props.onClickOutside, target = props.target;
801
+ if (event.defaultPrevented) {
802
+ return;
803
+ }
804
+ var eventTarget = event.target;
805
+ if ((target && !target.contains(eventTarget)) ||
806
+ (nodeRef && !nodeRef.contains(eventTarget))) {
805
807
  onClickOutside(event);
806
808
  }
807
- // If a target is passed in via a prop, we defer to utilizing that
808
- // target instead of a child element target
809
- return;
810
- }
811
- if (childElementRef.current &&
812
- !childElementRef.current.contains(eventTarget)) {
813
- onClickOutside(event);
814
- }
815
- };
816
- var resolveRef = function (node) {
817
- childElementRef.current = node;
818
- // Ref for this component should pass-through to the child node
819
- setRef(ref, node);
820
- // If child has its own ref, we want to update
821
- // its ref with the newly cloned node
822
- var childRef = children.ref;
823
- setRef(childRef, node);
824
- };
825
- React.useEffect(function () {
826
- typeof mouseEvent === 'string' &&
827
- document.addEventListener(mouseEvent, handleEvent);
828
- typeof touchEvent === 'string' &&
829
- document.addEventListener(touchEvent, handleEvent);
830
- return function () {
809
+ };
810
+ _this.attachEventListeners = function () {
811
+ var _a = _this.props, mouseEvent = _a.mouseEvent, touchEvent = _a.touchEvent;
831
812
  typeof mouseEvent === 'string' &&
832
- document.removeEventListener(mouseEvent, handleEvent);
813
+ document.addEventListener(mouseEvent, _this.handleEvent);
833
814
  typeof touchEvent === 'string' &&
834
- document.removeEventListener(touchEvent, handleEvent);
815
+ document.addEventListener(touchEvent, _this.handleEvent);
835
816
  };
836
- }, [mouseEvent, touchEvent]);
837
- return !children
838
- ? null
839
- : React__default["default"].cloneElement(children, { ref: resolveRef });
840
- }
841
- ClickOutsideListener.displayName = 'ClickOutsideListener';
842
- var ClickOutsideListener$1 = React__default["default"].forwardRef(ClickOutsideListener);
817
+ _this.removeEventListeners = function (mouseEvent, touchEvent) {
818
+ typeof mouseEvent === 'string' &&
819
+ document.removeEventListener(mouseEvent, _this.handleEvent);
820
+ typeof touchEvent === 'string' &&
821
+ document.removeEventListener(touchEvent, _this.handleEvent);
822
+ };
823
+ _this.resolveRef = function (node) {
824
+ _this.nodeRef = node;
825
+ // If child has its own ref, we want to update
826
+ // its ref with the newly cloned node
827
+ var ref = _this.props.children.ref;
828
+ setRef(ref, node);
829
+ };
830
+ return _this;
831
+ }
832
+ ClickOutsideListener.prototype.componentDidMount = function () {
833
+ this.attachEventListeners();
834
+ };
835
+ ClickOutsideListener.prototype.componentDidUpdate = function (prevProps) {
836
+ var _a = this.props, mouseEvent = _a.mouseEvent, touchEvent = _a.touchEvent;
837
+ if (prevProps.mouseEvent !== mouseEvent ||
838
+ prevProps.touchEvent !== touchEvent) {
839
+ this.removeEventListeners(prevProps.mouseEvent, prevProps.touchEvent);
840
+ this.attachEventListeners();
841
+ }
842
+ };
843
+ ClickOutsideListener.prototype.componentWillUnmount = function () {
844
+ var _a = this.props, mouseEvent = _a.mouseEvent, touchEvent = _a.touchEvent;
845
+ this.removeEventListeners(mouseEvent, touchEvent);
846
+ };
847
+ ClickOutsideListener.prototype.render = function () {
848
+ var _a = this, props = _a.props, resolveRef = _a.resolveRef;
849
+ return !props.children
850
+ ? null
851
+ : React__default["default"].cloneElement(props.children, {
852
+ ref: resolveRef
853
+ });
854
+ };
855
+ ClickOutsideListener.displayName = 'ClickOutsideListener';
856
+ ClickOutsideListener.defaultProps = {
857
+ mouseEvent: 'click',
858
+ touchEvent: 'touchend'
859
+ };
860
+ return ClickOutsideListener;
861
+ }(React__default["default"].Component));
843
862
 
844
863
  var _a$2 = tslib.__read([38, 40, 9, 13, 32, 27], 6), up = _a$2[0], down$1 = _a$2[1], tab = _a$2[2], enter = _a$2[3], space = _a$2[4], esc = _a$2[5];
845
864
  var OptionsMenuList = /** @class */ (function (_super) {
@@ -945,7 +964,7 @@ var OptionsMenuList = /** @class */ (function (_super) {
945
964
  // Key event is being handled in componentDidMount
946
965
  /* eslint-disable jsx-a11y/click-events-have-key-events */
947
966
  /* eslint-disable jsx-a11y/role-supports-aria-props */
948
- return (React__default["default"].createElement(ClickOutsideListener$1, { onClickOutside: this.handleClickOutside, mouseEvent: clickOutsideEventActive, touchEvent: clickOutsideEventActive },
967
+ return (React__default["default"].createElement(ClickOutsideListener, { onClickOutside: this.handleClickOutside, mouseEvent: clickOutsideEventActive, touchEvent: clickOutsideEventActive },
949
968
  React__default["default"].createElement("ul", tslib.__assign({}, other, { className: classNames__default["default"]('OptionsMenu__list', className), "aria-expanded": show, role: "menu", onClick: handleClick, ref: function (el) {
950
969
  _this.menuRef = el;
951
970
  if (menuRef) {
@@ -1293,7 +1312,7 @@ var SideBar = /** @class */ (function (_super) {
1293
1312
  var _b = this.props, children = _b.children, className = _b.className, show = _b.show; _b.onDismiss; var navProps = _b.navProps, other = tslib.__rest(_b, ["children", "className", "show", "onDismiss", "navProps"]);
1294
1313
  /* eslint-disable jsx-a11y/no-noninteractive-element-interactions */
1295
1314
  return (React__default["default"].createElement(React.Fragment, null,
1296
- React__default["default"].createElement(ClickOutsideListener$1, { onClickOutside: this.handleClickOutside },
1315
+ React__default["default"].createElement(ClickOutsideListener, { onClickOutside: this.handleClickOutside },
1297
1316
  React__default["default"].createElement("nav", tslib.__assign({}, navProps),
1298
1317
  React__default["default"].createElement("ul", tslib.__assign({ className: classNames__default["default"]('SideBar', className, animateClass) }, other, { ref: this.navList, onKeyDown: this.onKeyDown }), children))),
1299
1318
  React__default["default"].createElement(Scrim, { show: !wide && show })));
@@ -1432,7 +1451,7 @@ var Dialog = /** @class */ (function (_super) {
1432
1451
  escapeDeactivates: false,
1433
1452
  fallbackFocus: '.Dialog__heading'
1434
1453
  } },
1435
- React__default["default"].createElement(ClickOutsideListener$1, { onClickOutside: this.handleClickOutside },
1454
+ React__default["default"].createElement(ClickOutsideListener, { onClickOutside: this.handleClickOutside },
1436
1455
  React__default["default"].createElement("div", tslib.__assign({ role: "dialog", className: classNames__default["default"]('Dialog', className, {
1437
1456
  'Dialog--show': show
1438
1457
  }), ref: function (el) {
@@ -3309,7 +3328,7 @@ var TwoColumnPanel = React.forwardRef(function (_a, ref) {
3309
3328
  allowOutsideClick: true,
3310
3329
  fallbackFocus: columnLeftRef.current
3311
3330
  }, containerElements: [columnLeftRef.current] }),
3312
- React__default["default"].createElement(ClickOutsideListener$1, { onClickOutside: handleClickOutside, target: columnLeftRef.current }),
3331
+ React__default["default"].createElement(ClickOutsideListener, { onClickOutside: handleClickOutside, target: columnLeftRef.current }),
3313
3332
  isCollapsed ? null : skipLink,
3314
3333
  showPanel ? ColumnLeftComponent : null,
3315
3334
  ColumnRightComponent)));
@@ -4126,7 +4145,7 @@ var Popover = React.forwardRef(function (_a, ref) {
4126
4145
  allowOutsideClick: true,
4127
4146
  fallbackFocus: '.Popover__borderLeft'
4128
4147
  } },
4129
- React__default["default"].createElement(ClickOutsideListener$1, { onClickOutside: handleClickOutside },
4148
+ React__default["default"].createElement(ClickOutsideListener, { onClickOutside: handleClickOutside },
4130
4149
  React__default["default"].createElement("div", tslib.__assign({ id: id, className: classNames__default["default"]('Popover', "Popover--".concat(placement), className, {
4131
4150
  'Popover--hidden': !show,
4132
4151
  'Popover--prompt': variant === 'prompt'
@@ -4281,7 +4300,7 @@ exports.BreadcrumbItem = BreadcrumbItem;
4281
4300
  exports.BreadcrumbLink = BreadcrumbLink;
4282
4301
  exports.Button = Button;
4283
4302
  exports.Checkbox = Checkbox;
4284
- exports.ClickOutsideListener = ClickOutsideListener$1;
4303
+ exports.ClickOutsideListener = ClickOutsideListener;
4285
4304
  exports.Code = Code;
4286
4305
  exports.ColumnGroupHeader = ColumnGroupHeader;
4287
4306
  exports.ColumnHeader = ColumnHeader;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deque/cauldron-react",
3
- "version": "6.7.0-canary.8f770f32",
3
+ "version": "6.7.0-canary.8ff3885e",
4
4
  "license": "MPL-2.0",
5
5
  "description": "Fully accessible react components library for Deque Cauldron",
6
6
  "homepage": "https://cauldron.dequelabs.com/",