text: define(["require", "exports", "tslib", "react", "../../Utilities", "./HoverCard.types", "./ExpandingCard", "./ExpandingCard.types", "./PlainCard/PlainCard"], function (require, exports, tslib_1, React, Utilities_1, HoverCard_types_1, ExpandingCard_1, ExpandingCard_types_1, PlainCard_1) {
      "use strict";
      Object.defineProperty(exports, "__esModule", { value: true });
      var getClassNames = Utilities_1.classNamesFunction();
      var HoverCardBase = /** @class */ (function (_super) {
          tslib_1.__extends(HoverCardBase, _super);
          // Constructor
          function HoverCardBase(props) {
              var _this = _super.call(this, props) || this;
              // The wrapping div that gets the hover events
              _this._hoverCard = Utilities_1.createRef();
              // Show HoverCard
              _this._cardOpen = function (ev) {
                  if (_this._shouldBlockHoverCard() || (ev.type === 'keydown' && !(ev.which === _this.props.openHotKey))) {
                      return;
                  }
                  _this._async.clearTimeout(_this._dismissTimerId);
                  if (ev.type === 'mouseenter') {
                      _this._currentMouseTarget = ev.currentTarget;
                  }
                  _this._executeCardOpen(ev);
              };
              _this._executeCardOpen = function (ev) {
                  _this._async.clearTimeout(_this._openTimerId);
                  _this._openTimerId = _this._async.setTimeout(function () {
                      _this.setState(function (prevState) {
                          if (!prevState.isHoverCardVisible) {
                              return {
                                  isHoverCardVisible: true,
                                  mode: ExpandingCard_types_1.ExpandingCardMode.compact,
                                  openMode: ev.type === 'keydown' ? HoverCard_types_1.OpenCardMode.hotKey : HoverCard_types_1.OpenCardMode.hover
                              };
                          }
                          return prevState;
                      });
                  }, _this.props.cardOpenDelay);
              };
              // Hide HoverCard
              _this._cardDismiss = function (ev) {
                  if (ev.type === 'keydown' && ev.which !== 27 /* escape */) {
                      return;
                  }
                  // Dismiss if not sticky and currentTarget is the same element that mouse last entered
                  if (!_this.props.sticky && (_this._currentMouseTarget === ev.currentTarget || ev.which === 27 /* escape */)) {
                      _this._executeCardDismiss();
                  }
              };
              _this._executeCardDismiss = function () {
                  _this._async.clearTimeout(_this._openTimerId);
                  _this._async.clearTimeout(_this._dismissTimerId);
                  _this._dismissTimerId = _this._async.setTimeout(function () {
                      _this.setState({
                          isHoverCardVisible: false,
                          mode: ExpandingCard_types_1.ExpandingCardMode.compact,
                          openMode: HoverCard_types_1.OpenCardMode.hover
                      });
                  }, _this.props.cardDismissDelay);
              };
              _this._instantOpenAsExpanded = function (ev) {
                  _this._async.clearTimeout(_this._dismissTimerId);
                  _this.setState(function (prevState) {
                      if (!prevState.isHoverCardVisible) {
                          return {
                              isHoverCardVisible: true,
                              mode: ExpandingCard_types_1.ExpandingCardMode.expanded
                          };
                      }
                      return prevState;
                  });
              };
              _this.state = {
                  isHoverCardVisible: false,
                  mode: ExpandingCard_types_1.ExpandingCardMode.compact,
                  openMode: HoverCard_types_1.OpenCardMode.hover
              };
              return _this;
          }
          HoverCardBase.prototype.componentDidMount = function () {
              var target = this._getTargetElement();
              this._events.on(target, 'mouseenter', this._cardOpen);
              this._events.on(target, 'mouseleave', this._cardDismiss);
              if (this.props.trapFocus) {
                  this._events.on(target, 'keydown', this._cardOpen);
              }
              else {
                  this._events.on(target, 'focus', this._cardOpen);
                  this._events.on(target, 'blur', this._cardDismiss);
              }
              if (this.props.instantOpenOnClick) {
                  this._events.on(target, 'click', this._instantOpenAsExpanded);
              }
              else {
                  this._events.on(target, 'mousedown', this._cardDismiss);
                  this._events.on(target, 'keydown', this._cardDismiss);
              }
          };
          HoverCardBase.prototype.componentDidUpdate = function (prevProps, prevState) {
              var _this = this;
              if (prevState.isHoverCardVisible !== this.state.isHoverCardVisible) {
                  if (this.state.isHoverCardVisible) {
                      this._async.setTimeout(function () {
                          _this.setState({
                              mode: ExpandingCard_types_1.ExpandingCardMode.expanded
                          });
                      }, this.props.expandedCardOpenDelay);
                      this.props.onCardVisible && this.props.onCardVisible();
                  }
                  else {
                      this.setState({
                          mode: ExpandingCard_types_1.ExpandingCardMode.compact
                      });
                      this.props.onCardHide && this.props.onCardHide();
                  }
              }
          };
          // Render
          HoverCardBase.prototype.render = function () {
              var _a = this.props, expandingCardProps = _a.expandingCardProps, children = _a.children, id = _a.id, _b = _a.setAriaDescribedBy, setAriaDescribedBy = _b === void 0 ? true : _b, customStyles = _a.styles, theme = _a.theme, className = _a.className, type = _a.type, plainCardProps = _a.plainCardProps, trapFocus = _a.trapFocus, setInitialFocus = _a.setInitialFocus;
              var _c = this.state, isHoverCardVisible = _c.isHoverCardVisible, mode = _c.mode, openMode = _c.openMode;
              var hoverCardId = id || Utilities_1.getId('hoverCard');
              this._classNames = getClassNames(customStyles, {
                  theme: theme,
                  className: className
              });
              // Common props for both card types.
              var commonCardProps = tslib_1.__assign({}, Utilities_1.getNativeProps(this.props, Utilities_1.divProperties), { id: hoverCardId, trapFocus: !!trapFocus, firstFocus: setInitialFocus || openMode === HoverCard_types_1.OpenCardMode.hotKey, targetElement: this._getTargetElement(), onEnter: this._cardOpen, onLeave: this._executeCardDismiss });
              var finalExpandedCardProps = tslib_1.__assign({}, expandingCardProps, commonCardProps, { mode: mode });
              var finalPlainCardProps = tslib_1.__assign({}, plainCardProps, commonCardProps);
              return (React.createElement("div", { className: this._classNames.host, ref: this._hoverCard, "aria-describedby": setAriaDescribedBy && isHoverCardVisible ? hoverCardId : undefined, "data-is-focusable": !Boolean(this.props.target) },
                  children,
                  isHoverCardVisible &&
                      (type === HoverCard_types_1.HoverCardType.expanding ? React.createElement(ExpandingCard_1.ExpandingCard, tslib_1.__assign({}, finalExpandedCardProps)) : React.createElement(PlainCard_1.PlainCard, tslib_1.__assign({}, finalPlainCardProps)))));
          };
          HoverCardBase.prototype._getTargetElement = function () {
              var target = this.props.target;
              switch (typeof target) {
                  case 'string':
                      return Utilities_1.getDocument().querySelector(target);
                  case 'object':
                      return target;
                  default:
                      return this._hoverCard.current || undefined;
              }
          };
          HoverCardBase.prototype._shouldBlockHoverCard = function () {
              return !!(this.props.shouldBlockHoverCard && this.props.shouldBlockHoverCard());
          };
          HoverCardBase.defaultProps = {
              cardOpenDelay: 500,
              cardDismissDelay: 100,
              expandedCardOpenDelay: 1500,
              instantOpenOnClick: false,
              setInitialFocus: false,
              openHotKey: 67 /* c */,
              type: HoverCard_types_1.HoverCardType.expanding
          };
          return HoverCardBase;
      }(Utilities_1.BaseComponent));
      exports.HoverCardBase = HoverCardBase;
  });
  //# sourceMappingURL=HoverCard.base.js.map