UNPKG

@x-nivo/bullet

Version:

[![version](https://img.shields.io/npm/v/@nivo/bullet.svg?style=flat-square)](https://www.npmjs.com/package/@nivo/bullet)

1,371 lines 61.6 kB
import React, { Fragment, Component, PureComponent } from 'react';
import { scaleLinear } from 'd3-scale';
import setDisplayName from 'recompose/setDisplayName';
import { motionPropTypes, colorMotionSpring, getInterpolatedColor, themePropType, noop, withMotion, getColorScale, BasicTooltip, Axis, withDimensions, withTheme, Container, SvgWrapper, ResponsiveWrapper } from '@nivo/core';
import PropTypes from 'prop-types';
import isString from 'lodash/isString';
import { TransitionMotion, spring, Motion } from 'react-motion';
import partial from 'lodash/partial';
import compose from 'recompose/compose';
import defaultProps from 'recompose/defaultProps';
import withPropsOnChange from 'recompose/withPropsOnChange';
import pure from 'recompose/pure';
import last from 'lodash/last';

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }

function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
var stackValues = function stackValues(values, colorScale) {
  var useAverage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;

  var normalized = _toConsumableArray(values).filter(function (v) {
    return v !== 0;
  }).sort(function (a, b) {
    return a - b;
  });

  return normalized.reduce(function (acc, v1, index) {
    var v0 = last(acc) !== undefined ? last(acc).v1 : 0;
    var sequentialValue = useAverage === true ? v0 + (v1 - v0) / 2 : v1;
    return [].concat(_toConsumableArray(acc), [{
      index: index,
      v0: v0,
      v1: v1,
      color: colorScale(colorScale.type === 'sequential' ? sequentialValue : index)
    }]);
  }, []);
};
var getComputeRect = function getComputeRect(_ref) {
  var layout = _ref.layout,
      reverse = _ref.reverse,
      scale = _ref.scale,
      height = _ref.height;

  if (layout === 'horizontal') {
    if (reverse === true) {
      return function (d) {
        var x = scale(d.v1);
        var w = scale(d.v0) - x;
        return {
          x: x,
          y: 0,
          width: w,
          height: height
        };
      };
    }

    return function (d) {
      var x = scale(d.v0);
      var w = scale(d.v1) - x;
      return {
        x: x,
        y: 0,
        width: w,
        height: height
      };
    };
  }

  if (reverse === true) {
    return function (d) {
      var y = scale(d.v0);
      var h = scale(d.v1) - y;
      return {
        x: 0,
        y: y,
        width: height,
        height: h
      };
    };
  }

  return function (d) {
    var y = scale(d.v1);
    var h = scale(d.v0) - y;
    return {
      x: 0,
      y: y,
      width: height,
      height: h
    };
  };
};
var computeRects = function computeRects(_ref2) {
  var data = _ref2.data,
      layout = _ref2.layout,
      reverse = _ref2.reverse,
      scale = _ref2.scale,
      height = _ref2.height;
  var computeRect = getComputeRect({
    layout: layout,
    reverse: reverse,
    scale: scale,
    height: height
  });
  return data.map(function (d) {
    return _objectSpread({
      data: d
    }, computeRect(d));
  });
};

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty$1(target, key, source[key]); }); } return target; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

function _defineProperty$1(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

var getPositionGenerator = function getPositionGenerator(_ref) {
  var layout = _ref.layout,
      reverse = _ref.reverse,
      scale = _ref.scale,
      height = _ref.height,
      markerSize = _ref.markerSize;

  if (layout === 'horizontal') {
    return function (marker) {
      var x = scale(marker.value);
      var y = height / 2;
      var rotation = reverse === true ? 180 : 0;
      return {
        x: x,
        y: y,
        size: markerSize,
        rotation: rotation
      };
    };
  }

  return function (marker) {
    var x = height / 2;
    var y = scale(marker.value);
    var rotation = reverse === true ? 270 : 90;
    return {
      x: x,
      y: y,
      size: markerSize,
      rotation: rotation
    };
  };
};

var BulletMarkers =
/*#__PURE__*/
function (_Component) {
  _inherits(BulletMarkers, _Component);

  function BulletMarkers() {
    var _getPrototypeOf2;

    var _this;

    _classCallCheck(this, BulletMarkers);

    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(BulletMarkers)).call.apply(_getPrototypeOf2, [this].concat(args)));

    _defineProperty$1(_assertThisInitialized(_this), "handleMouseEnter", function (data, event) {
      _this.props.onMouseEnter(data, event);
    });

    _defineProperty$1(_assertThisInitialized(_this), "handleMouseLeave", function (data, event) {
      _this.props.onMouseLeave(data, event);
    });

    _defineProperty$1(_assertThisInitialized(_this), "handleClick", function (data, event) {
      _this.props.onClick(data, event);
    });

    return _this;
  }

  _createClass(BulletMarkers, [{
    key: "render",
    value: function render() {
      var _this2 = this;

      var _this$props = this.props,
          scale = _this$props.scale,
          layout = _this$props.layout,
          reverse = _this$props.reverse,
          markers = _this$props.markers,
          height = _this$props.height,
          markerSize = _this$props.markerSize,
          component = _this$props.component,
          animate = _this$props.animate,
          motionStiffness = _this$props.motionStiffness,
          motionDamping = _this$props.motionDamping;
      var getPosition = getPositionGenerator({
        layout: layout,
        reverse: reverse,
        scale: scale,
        height: height,
        markerSize: markerSize
      });

      if (animate !== true) {
        return React.createElement(Fragment, null, markers.map(function (marker) {
          return React.createElement(component, _objectSpread$1({
            key: marker.index
          }, marker, getPosition(marker), {
            data: marker,
            onMouseEnter: partial(_this2.handleMouseEnter, marker),
            onMouseMove: partial(_this2.handleMouseEnter, marker),
            onMouseLeave: partial(_this2.handleMouseLeave, marker),
            onClick: partial(_this2.handleClick, marker)
          }));
        }));
      }

      var springConfig = {
        damping: motionDamping,
        stiffness: motionStiffness
      };
      return React.createElement(TransitionMotion, {
        styles: markers.map(function (marker, i) {
          var position = getPosition(marker);
          return {
            key: "".concat(i),
            data: marker,
            style: _objectSpread$1({
              x: spring(position.x, springConfig),
              y: spring(position.y, springConfig),
              size: spring(position.size, springConfig),
              rotation: spring(position.rotation, springConfig)
            }, colorMotionSpring(marker.color, springConfig))
          };
        })
      }, function (interpolatedStyles) {
        return React.createElement(Fragment, null, interpolatedStyles.map(function (_ref2) {
          var key = _ref2.key,
              style = _ref2.style,
              marker = _ref2.data;
          var color = getInterpolatedColor(style);
          return React.createElement(component, _objectSpread$1({
            key: key
          }, marker, style, {
            color: color,
            data: marker,
            onMouseEnter: partial(_this2.handleMouseEnter, marker),
            onMouseMove: partial(_this2.handleMouseEnter, marker),
            onMouseLeave: partial(_this2.handleMouseLeave, marker),
            onClick: partial(_this2.handleClick, marker)
          }));
        }));
      });
    }
  }]);

  return BulletMarkers;
}(Component);

_defineProperty$1(BulletMarkers, "propTypes", _objectSpread$1({
  scale: PropTypes.func.isRequired,
  layout: PropTypes.oneOf(['horizontal', 'vertical']).isRequired,
  reverse: PropTypes.bool.isRequired,
  markers: PropTypes.arrayOf(PropTypes.shape({
    value: PropTypes.number.isRequired,
    index: PropTypes.number.isRequired,
    color: PropTypes.string.isRequired
  })).isRequired,
  height: PropTypes.number.isRequired,
  markerSize: PropTypes.number.isRequired,
  component: PropTypes.func.isRequired,
  onMouseEnter: PropTypes.func.isRequired,
  onMouseLeave: PropTypes.func.isRequired,
  onClick: PropTypes.func.isRequired
}, motionPropTypes));

function _typeof$1(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$1 = function _typeof(obj) { return typeof obj; }; } else { _typeof$1 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$1(obj); }

function _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty$2(target, key, source[key]); }); } return target; }

function _classCallCheck$1(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties$1(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass$1(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$1(Constructor.prototype, protoProps); if (staticProps) _defineProperties$1(Constructor, staticProps); return Constructor; }

function _possibleConstructorReturn$1(self, call) { if (call && (_typeof$1(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized$1(self); }

function _getPrototypeOf$1(o) { _getPrototypeOf$1 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf$1(o); }

function _assertThisInitialized$1(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _inherits$1(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf$1(subClass, superClass); }

function _setPrototypeOf$1(o, p) { _setPrototypeOf$1 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf$1(o, p); }

function _defineProperty$2(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

var BulletRects =
/*#__PURE__*/
function (_Component) {
  _inherits$1(BulletRects, _Component);

  function BulletRects() {
    var _getPrototypeOf2;

    var _this;

    _classCallCheck$1(this, BulletRects);

    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    _this = _possibleConstructorReturn$1(this, (_getPrototypeOf2 = _getPrototypeOf$1(BulletRects)).call.apply(_getPrototypeOf2, [this].concat(args)));

    _defineProperty$2(_assertThisInitialized$1(_this), "handleMouseEnter", function (data, event) {
      _this.props.onMouseEnter(data, event);
    });

    _defineProperty$2(_assertThisInitialized$1(_this), "handleMouseLeave", function (data, event) {
      _this.props.onMouseLeave(data, event);
    });

    _defineProperty$2(_assertThisInitialized$1(_this), "handleClick", function (data, event) {
      _this.props.onClick(data, event);
    });

    return _this;
  }

  _createClass$1(BulletRects, [{
    key: "render",
    value: function render() {
      var _this2 = this;

      var _this$props = this.props,
          rects = _this$props.rects,
          layout = _this$props.layout,
          y = _this$props.y,
          component = _this$props.component,
          animate = _this$props.animate,
          motionStiffness = _this$props.motionStiffness,
          motionDamping = _this$props.motionDamping;
      var transform = "translate(".concat(layout === 'horizontal' ? 0 : y, ",").concat(layout === 'horizontal' ? y : 0, ")");

      if (animate !== true) {
        return React.createElement("g", {
          transform: transform
        }, rects.map(function (rect) {
          return React.createElement(component, _objectSpread$2({
            key: rect.data.index,
            index: rect.data.index,
            color: rect.data.color
          }, rect, {
            onMouseEnter: partial(_this2.handleMouseEnter, rect.data),
            onMouseMove: partial(_this2.handleMouseEnter, rect.data),
            onMouseLeave: partial(_this2.handleMouseLeave, rect.data),
            onClick: partial(_this2.handleClick, rect.data)
          }));
        }));
      }

      var springConfig = {
        damping: motionDamping,
        stiffness: motionStiffness
      };
      return React.createElement("g", {
        transform: transform
      }, React.createElement(TransitionMotion, {
        styles: rects.map(function (rect) {
          return {
            key: "".concat(rect.data.index),
            data: rect.data,
            style: _objectSpread$2({
              x: spring(rect.x, springConfig),
              y: spring(rect.y, springConfig),
              width: spring(rect.width, springConfig),
              height: spring(rect.height, springConfig)
            }, colorMotionSpring(rect.data.color, springConfig))
          };
        })
      }, function (interpolatedStyles) {
        return React.createElement(Fragment, null, interpolatedStyles.map(function (_ref) {
          var key = _ref.key,
              style = _ref.style,
              data = _ref.data;
          var color = getInterpolatedColor(style);
          return React.createElement(component, {
            key: key,
            index: Number(key),
            data: data,
            x: style.x,
            y: style.y,
            width: Math.max(style.width, 0),
            height: Math.max(style.height, 0),
            color: color,
            onMouseEnter: partial(_this2.handleMouseEnter, data),
            onMouseMove: partial(_this2.handleMouseEnter, data),
            onMouseLeave: partial(_this2.handleMouseLeave, data),
            onClick: partial(_this2.handleClick, data)
          });
        }));
      }));
    }
  }]);

  return BulletRects;
}(Component);

_defineProperty$2(BulletRects, "propTypes", _objectSpread$2({
  scale: PropTypes.func.isRequired,
  data: PropTypes.arrayOf(PropTypes.shape({
    v0: PropTypes.number.isRequired,
    v1: PropTypes.number.isRequired
  })).isRequired,
  layout: PropTypes.oneOf(['horizontal', 'vertical']).isRequired,
  reverse: PropTypes.bool.isRequired,
  x: PropTypes.number.isRequired,
  y: PropTypes.number.isRequired,
  width: PropTypes.number.isRequired,
  height: PropTypes.number.isRequired,
  rects: PropTypes.arrayOf(PropTypes.shape({
    x: PropTypes.number.isRequired,
    y: PropTypes.number.isRequired,
    width: PropTypes.number.isRequired,
    height: PropTypes.number.isRequired,
    data: PropTypes.shape({
      index: PropTypes.number.isRequired,
      v0: PropTypes.number.isRequired,
      v1: PropTypes.number.isRequired,
      color: PropTypes.string.isRequired
    }).isRequired
  })).isRequired,
  component: PropTypes.func.isRequired,
  onMouseEnter: PropTypes.func.isRequired,
  onMouseLeave: PropTypes.func.isRequired,
  onClick: PropTypes.func.isRequired
}, motionPropTypes));

var EnhancedBulletRects = compose(withPropsOnChange(['data', 'layout', 'reverse', 'scale', 'height'], function (_ref2) {
  var data = _ref2.data,
      layout = _ref2.layout,
      reverse = _ref2.reverse,
      scale = _ref2.scale,
      height = _ref2.height;
  return {
    rects: computeRects({
      data: data,
      layout: layout,
      reverse: reverse,
      scale: scale,
      height: height
    })
  };
}), pure)(BulletRects);
EnhancedBulletRects.displayName = 'BulletRects';

function _typeof$2(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$2 = function _typeof(obj) { return typeof obj; }; } else { _typeof$2 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$2(obj); }

function _classCallCheck$2(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties$2(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass$2(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$2(Constructor.prototype, protoProps); if (staticProps) _defineProperties$2(Constructor, staticProps); return Constructor; }

function _possibleConstructorReturn$2(self, call) { if (call && (_typeof$2(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized$2(self); }

function _assertThisInitialized$2(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _getPrototypeOf$2(o) { _getPrototypeOf$2 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf$2(o); }

function _inherits$2(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf$2(subClass, superClass); }

function _setPrototypeOf$2(o, p) { _setPrototypeOf$2 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf$2(o, p); }

function _defineProperty$3(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

var BulletRectsItem =
/*#__PURE__*/
function (_PureComponent) {
  _inherits$2(BulletRectsItem, _PureComponent);

  function BulletRectsItem() {
    _classCallCheck$2(this, BulletRectsItem);

    return _possibleConstructorReturn$2(this, _getPrototypeOf$2(BulletRectsItem).apply(this, arguments));
  }

  _createClass$2(BulletRectsItem, [{
    key: "render",
    value: function render() {
      var _this$props = this.props,
          x = _this$props.x,
          y = _this$props.y,
          width = _this$props.width,
          height = _this$props.height,
          color = _this$props.color,
          onMouseEnter = _this$props.onMouseEnter,
          onMouseMove = _this$props.onMouseMove,
          onMouseLeave = _this$props.onMouseLeave,
          onClick = _this$props.onClick;
      return React.createElement("rect", {
        x: x,
        y: y,
        width: width,
        height: height,
        fill: color,
        onMouseMove: onMouseMove,
        onMouseEnter: onMouseEnter,
        onMouseLeave: onMouseLeave,
        onClick: onClick
      });
    }
  }]);

  return BulletRectsItem;
}(PureComponent);

_defineProperty$3(BulletRectsItem, "propTypes", {
  index: PropTypes.number.isRequired,
  x: PropTypes.number.isRequired,
  y: PropTypes.number.isRequired,
  width: PropTypes.number.isRequired,
  height: PropTypes.number.isRequired,
  color: PropTypes.string.isRequired,
  data: PropTypes.shape({
    v0: PropTypes.number.isRequired,
    v1: PropTypes.number.isRequired
  }).isRequired,
  onMouseEnter: PropTypes.func.isRequired,
  onMouseMove: PropTypes.func.isRequired,
  onMouseLeave: PropTypes.func.isRequired,
  onClick: PropTypes.func.isRequired
});

function _typeof$3(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$3 = function _typeof(obj) { return typeof obj; }; } else { _typeof$3 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$3(obj); }

function _classCallCheck$3(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties$3(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass$3(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$3(Constructor.prototype, protoProps); if (staticProps) _defineProperties$3(Constructor, staticProps); return Constructor; }

function _possibleConstructorReturn$3(self, call) { if (call && (_typeof$3(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized$3(self); }

function _assertThisInitialized$3(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _getPrototypeOf$3(o) { _getPrototypeOf$3 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf$3(o); }

function _inherits$3(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf$3(subClass, superClass); }

function _setPrototypeOf$3(o, p) { _setPrototypeOf$3 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf$3(o, p); }

function _defineProperty$4(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

var BulletMarkersItem =
/*#__PURE__*/
function (_PureComponent) {
  _inherits$3(BulletMarkersItem, _PureComponent);

  function BulletMarkersItem() {
    _classCallCheck$3(this, BulletMarkersItem);

    return _possibleConstructorReturn$3(this, _getPrototypeOf$3(BulletMarkersItem).apply(this, arguments));
  }

  _createClass$3(BulletMarkersItem, [{
    key: "render",
    value: function render() {
      var _this$props = this.props,
          x = _this$props.x,
          y = _this$props.y,
          size = _this$props.size,
          rotation = _this$props.rotation,
          color = _this$props.color,
          onMouseEnter = _this$props.onMouseEnter,
          onMouseMove = _this$props.onMouseMove,
          onMouseLeave = _this$props.onMouseLeave,
          onClick = _this$props.onClick;
      return React.createElement("line", {
        transform: "rotate(".concat(rotation, ", ").concat(x, ", ").concat(y, ")"),
        x1: x,
        x2: x,
        y1: y - size / 2,
        y2: y + size / 2,
        fill: "none",
        stroke: color,
        strokeWidth: "5",
        onMouseMove: onMouseMove,
        onMouseEnter: onMouseEnter,
        onMouseLeave: onMouseLeave,
        onClick: onClick
      });
    }
  }]);

  return BulletMarkersItem;
}(PureComponent);

_defineProperty$4(BulletMarkersItem, "propTypes", {
  x: PropTypes.number.isRequired,
  y: PropTypes.number.isRequired,
  size: PropTypes.number.isRequired,
  rotation: PropTypes.number.isRequired,
  color: PropTypes.string.isRequired,
  data: PropTypes.shape({
    index: PropTypes.number.isRequired,
    value: PropTypes.number.isRequired,
    color: PropTypes.string.isRequired
  }).isRequired,
  onMouseEnter: PropTypes.func.isRequired,
  onMouseMove: PropTypes.func.isRequired,
  onMouseLeave: PropTypes.func.isRequired,
  onClick: PropTypes.func.isRequired
});

function _typeof$4(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$4 = function _typeof(obj) { return typeof obj; }; } else { _typeof$4 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$4(obj); }

function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }

function _objectSpread$3(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty$5(target, key, source[key]); }); } return target; }

function _classCallCheck$4(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties$4(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass$4(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$4(Constructor.prototype, protoProps); if (staticProps) _defineProperties$4(Constructor, staticProps); return Constructor; }

function _possibleConstructorReturn$4(self, call) { if (call && (_typeof$4(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized$4(self); }

function _getPrototypeOf$4(o) { _getPrototypeOf$4 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf$4(o); }

function _assertThisInitialized$4(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _inherits$4(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf$4(subClass, superClass); }

function _setPrototypeOf$4(o, p) { _setPrototypeOf$4 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf$4(o, p); }

function _defineProperty$5(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

var BulletItem =
/*#__PURE__*/
function (_Component) {
  _inherits$4(BulletItem, _Component);

  function BulletItem() {
    var _getPrototypeOf2;

    var _this;

    _classCallCheck$4(this, BulletItem);

    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    _this = _possibleConstructorReturn$4(this, (_getPrototypeOf2 = _getPrototypeOf$4(BulletItem)).call.apply(_getPrototypeOf2, [this].concat(args)));

    _defineProperty$5(_assertThisInitialized$4(_this), "handleMouseEnter", function (data, event) {
      _this.props.onMouseEnter(data, event);
    });

    _defineProperty$5(_assertThisInitialized$4(_this), "handleMouseLeave", function (data, event) {
      _this.props.onMouseLeave(data, event);
    });

    _defineProperty$5(_assertThisInitialized$4(_this), "handleRangeTooltip", function (showTooltip, range, event) {
      var _this$props = _this.props,
          rangeTooltip = _this$props.rangeTooltip,
          theme = _this$props.theme;
      showTooltip(React.createElement(BasicTooltip, {
        id: React.createElement("span", null, React.createElement("strong", null, range.v0), " to ", React.createElement("strong", null, range.v1)),
        enableChip: true,
        color: range.color,
        theme: theme //format={format}
        ,
        renderContent: typeof rangeTooltip === 'function' ? rangeTooltip.bind(null, _objectSpread$3({}, range)) : null
      }), event);
    });

    _defineProperty$5(_assertThisInitialized$4(_this), "handleMeasureTooltip", function (showTooltip, measure, event) {
      var _this$props2 = _this.props,
          measureTooltip = _this$props2.measureTooltip,
          theme = _this$props2.theme;
      showTooltip(React.createElement(BasicTooltip, {
        id: React.createElement("strong", null, measure.v1),
        enableChip: true,
        color: measure.color,
        theme: theme //format={format}
        ,
        renderContent: typeof measureTooltip === 'function' ? measureTooltip.bind(null, _objectSpread$3({}, measure)) : null
      }), event);
    });

    _defineProperty$5(_assertThisInitialized$4(_this), "handleMarkerTooltip", function (showTooltip, marker, event) {
      var _this$props3 = _this.props,
          markerTooltip = _this$props3.markerTooltip,
          theme = _this$props3.theme;
      showTooltip(React.createElement(BasicTooltip, {
        id: React.createElement("strong", null, marker.value),
        enableChip: true,
        color: marker.color,
        theme: theme //format={format}
        ,
        renderContent: typeof markerTooltip === 'function' ? markerTooltip.bind(null, _objectSpread$3({}, marker)) : null
      }), event);
    });

    _defineProperty$5(_assertThisInitialized$4(_this), "handleRangeClick", function (range, event) {
      var _this$props4 = _this.props,
          id = _this$props4.id,
          onRangeClick = _this$props4.onRangeClick;
      onRangeClick(_objectSpread$3({
        id: id
      }, range), event);
    });

    _defineProperty$5(_assertThisInitialized$4(_this), "handleMeasureClick", function (measure, event) {
      var _this$props5 = _this.props,
          id = _this$props5.id,
          onMeasureClick = _this$props5.onMeasureClick;
      onMeasureClick(_objectSpread$3({
        id: id
      }, measure), event);
    });

    _defineProperty$5(_assertThisInitialized$4(_this), "handleMarkerClick", function (marker, event) {
      var _this$props6 = _this.props,
          id = _this$props6.id,
          onMarkerClick = _this$props6.onMarkerClick;
      onMarkerClick(_objectSpread$3({
        id: id
      }, marker), event);
    });

    return _this;
  }

  _createClass$4(BulletItem, [{
    key: "render",
    value: function render() {
      var _this2 = this;

      var _this$props7 = this.props,
          id = _this$props7.id,
          data = _this$props7.data,
          scale = _this$props7.scale,
          layout = _this$props7.layout,
          reverse = _this$props7.reverse,
          _axisPosition = _this$props7.axisPosition,
          axisValueFormat = _this$props7.axisValueFormat,
          x = _this$props7.x,
          y = _this$props7.y,
          width = _this$props7.width,
          height = _this$props7.height,
          _title = _this$props7.title,
          titlePosition = _this$props7.titlePosition,
          titleAlign = _this$props7.titleAlign,
          titleOffsetX = _this$props7.titleOffsetX,
          titleOffsetY = _this$props7.titleOffsetY,
          titleRotation = _this$props7.titleRotation,
          computedRanges = _this$props7.computedRanges,
          rangeComponent = _this$props7.rangeComponent,
          computedMeasures = _this$props7.computedMeasures,
          measureComponent = _this$props7.measureComponent,
          measureHeight = _this$props7.measureHeight,
          computedMarkers = _this$props7.computedMarkers,
          markerComponent = _this$props7.markerComponent,
          markerHeight = _this$props7.markerHeight,
          theme = _this$props7.theme,
          showTooltip = _this$props7.showTooltip,
          hideTooltip = _this$props7.hideTooltip,
          measureTooltip = _this$props7.measureTooltip,
          rangeTooltip = _this$props7.rangeTooltip,
          markerTooltip = _this$props7.markerTooltip,
          animate = _this$props7.animate,
          motionStiffness = _this$props7.motionStiffness,
          motionDamping = _this$props7.motionDamping;
      var motionProps = {
        animate: animate,
        motionStiffness: motionStiffness,
        motionDamping: motionDamping
      };
      var axisPosition;

      if (layout === 'horizontal') {
        axisPosition = _axisPosition === 'before' ? 'top' : 'bottom';
      } else {
        axisPosition = _axisPosition === 'before' ? 'left' : 'right';
      }

      var rangeNodes = React.createElement(EnhancedBulletRects, _extends({
        data: computedRanges,
        scale: scale,
        layout: layout,
        reverse: reverse,
        x: 0,
        y: 0,
        width: width,
        height: height,
        component: rangeComponent,
        onMouseEnter: partial(this.handleRangeTooltip, showTooltip),
        onMouseLeave: hideTooltip,
        onClick: this.handleRangeClick
      }, motionProps));
      var markerNodes = React.createElement(BulletMarkers, _extends({
        markers: computedMarkers,
        scale: scale,
        layout: layout,
        reverse: reverse,
        height: height,
        markerSize: markerHeight,
        component: markerComponent,
        onMouseEnter: partial(this.handleMarkerTooltip, showTooltip),
        onMouseLeave: hideTooltip,
        onClick: this.handleMarkerClick
      }, motionProps));
      var axis = React.createElement(Axis, _extends({
        width: layout === 'horizontal' ? width : height,
        height: layout === 'horizontal' ? height : width,
        scale: scale,
        position: axisPosition,
        theme: theme,
        format: axisValueFormat
      }, motionProps));
      var title = _title || id;
      var titleX;
      var titleY;

      if (layout === 'horizontal') {
        titleX = titlePosition === 'before' ? titleOffsetX : width + titleOffsetX;
        titleY = height / 2 + titleOffsetY;
      } else {
        titleX = height / 2 + titleOffsetX;
        titleY = titlePosition === 'before' ? titleOffsetY : width + titleOffsetY;
      }

      var titleNode = React.createElement("g", {
        transform: "translate(".concat(titleX, ",").concat(titleY, ") rotate(").concat(titleRotation, ")")
      }, isString(title) ? React.createElement("text", {
        style: _objectSpread$3({}, theme.labels.text, {
          alignmentBaseline: 'central',
          textAnchor: titleAlign
        })
      }, title) : title);

      if (animate !== true) {
        return React.createElement("g", {
          transform: "translate(".concat(x, ",").concat(y, ")"),
          onMouseEnter: partial(this.handleMouseEnter, data),
          onMouseMove: partial(this.handleMouseEnter, data),
          onMouseLeave: partial(this.handleMouseLeave, data)
        }, rangeNodes, React.createElement(EnhancedBulletRects, _extends({
          data: computedMeasures,
          scale: scale,
          layout: layout,
          reverse: reverse,
          x: 0,
          y: (height - measureHeight) / 2,
          width: width,
          height: measureHeight,
          component: measureComponent,
          onMouseEnter: partial(this.handleMeasureTooltip, showTooltip),
          onMouseLeave: hideTooltip,
          onClick: this.handleMeasureClick
        }, motionProps)), axis, markerNodes, titleNode);
      }

      var springConfig = {
        damping: motionDamping,
        stiffness: motionStiffness
      };
      return React.createElement(Motion, {
        style: {
          x: spring(x, springConfig),
          y: spring(y, springConfig),
          measuresY: spring((height - measureHeight) / 2, springConfig)
        }
      }, function (values) {
        return React.createElement("g", {
          transform: "translate(".concat(values.x, ",").concat(values.y, ")"),
          onMouseEnter: partial(_this2.handleMouseEnter, data),
          onMouseMove: partial(_this2.handleMouseEnter, data),
          onMouseLeave: partial(_this2.handleMouseLeave, data)
        }, rangeNodes, React.createElement(EnhancedBulletRects, _extends({
          data: computedMeasures,
          scale: scale,
          layout: layout,
          reverse: reverse,
          x: 0,
          y: values.measuresY,
          width: width,
          height: measureHeight,
          component: measureComponent,
          onMouseEnter: partial(_this2.handleMeasureTooltip, showTooltip),
          onMouseLeave: hideTooltip,
          onClick: _this2.handleMeasureClick
        }, motionProps)), axis, markerNodes, titleNode);
      });
    }
  }]);

  return BulletItem;
}(Component);

_defineProperty$5(BulletItem, "propTypes", {
  id: PropTypes.string.isRequired,
  scale: PropTypes.func.isRequired,
  ranges: PropTypes.arrayOf(PropTypes.number).isRequired,
  computedRanges: PropTypes.arrayOf(PropTypes.shape({
    index: PropTypes.number.isRequired,
    v0: PropTypes.number.isRequired,
    v1: PropTypes.number.isRequired,
    color: PropTypes.string.isRequired
  })).isRequired,
  measures: PropTypes.arrayOf(PropTypes.number).isRequired,
  computedMeasures: PropTypes.arrayOf(PropTypes.shape({
    index: PropTypes.number.isRequired,
    v0: PropTypes.number.isRequired,
    v1: PropTypes.number.isRequired,
    color: PropTypes.string.isRequired
  })).isRequired,
  markers: PropTypes.arrayOf(PropTypes.number).isRequired,
  computedMarkers: PropTypes.arrayOf(PropTypes.shape({
    value: PropTypes.number.isRequired,
    index: PropTypes.number.isRequired,
    color: PropTypes.string.isRequired
  })).isRequired,
  layout: PropTypes.oneOf(['horizontal', 'vertical']).isRequired,
  reverse: PropTypes.bool.isRequired,
  axisPosition: PropTypes.oneOf(['before', 'after']).isRequired,
  axisValueFormat: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),
  x: PropTypes.number.isRequired,
  y: PropTypes.number.isRequired,
  width: PropTypes.number.isRequired,
  height: PropTypes.number.isRequired,
  title: PropTypes.node,
  titlePosition: PropTypes.oneOf(['before', 'after']).isRequired,
  titleAlign: PropTypes.oneOf(['start', 'middle', 'end']).isRequired,
  titleOffsetX: PropTypes.number.isRequired,
  titleOffsetY: PropTypes.number.isRequired,
  titleRotation: PropTypes.number.isRequired,
  rangeComponent: PropTypes.func.isRequired,
  rangeColors: PropTypes.any.isRequired,
  rangeColorScale: PropTypes.func.isRequired,
  onRangeClick: PropTypes.func.isRequired,
  measureHeight: PropTypes.number.isRequired,
  measureComponent: PropTypes.func.isRequired,
  measureColors: PropTypes.any.isRequired,
  measureColorScale: PropTypes.func.isRequired,
  onMeasureClick: PropTypes.func.isRequired,
  markerHeight: PropTypes.number.isRequired,
  markerComponent: PropTypes.func.isRequired,
  markerColors: PropTypes.any.isRequired,
  markerColorScale: PropTypes.func.isRequired,
  onMarkerClick: PropTypes.func.isRequired,
  markerTooltip: PropTypes.func,
  measureTooltip: PropTypes.func,
  rangeTooltip: PropTypes.func,
  theme: themePropType.isRequired,
  showTooltip: PropTypes.func.isRequired,
  hideTooltip: PropTypes.func.isRequired,
  onMouseEnter: PropTypes.func.isRequired,
  onMouseLeave: PropTypes.func.isRequired
});

var EnhancedBulletItem = compose(defaultProps({
  layout: 'horizontal',
  reverse: false,
  axisPosition: 'after',
  titlePosition: 'before',
  titleAlign: 'middle',
  titleRotation: 0,
  titleOffsetX: 0,
  titleOffsetY: 0,
  rangeComponent: BulletRectsItem,
  rangeColors: 'seq:cool',
  onRangeClick: noop,
  measureComponent: BulletRectsItem,
  measureColors: 'seq:red_purple',
  onMeasureClick: noop,
  markers: [],
  markerComponent: BulletMarkersItem,
  markerColors: 'seq:red_purple',
  onMarkerClick: noop,
  showTooltip: noop,
  hideTooltip: noop
}), withMotion(), withPropsOnChange(['rangeColors', 'scale'], function (_ref) {
  var rangeColors = _ref.rangeColors,
      scale = _ref.scale;
  return {
    rangeColorScale: getColorScale(rangeColors, scale, true)
  };
}), withPropsOnChange(['ranges', 'rangeColorScale'], function (_ref2) {
  var ranges = _ref2.ranges,
      rangeColorScale = _ref2.rangeColorScale;
  return {
    computedRanges: stackValues(ranges, rangeColorScale)
  };
}), withPropsOnChange(['measureColors', 'scale'], function (_ref3) {
  var measureColors = _ref3.measureColors,
      scale = _ref3.scale;
  return {
    measureColorScale: getColorScale(measureColors, scale)
  };
}), withPropsOnChange(['measures', 'measureColorScale'], function (_ref4) {
  var measures = _ref4.measures,
      measureColorScale = _ref4.measureColorScale;
  return {
    computedMeasures: stackValues(measures, measureColorScale)
  };
}), withPropsOnChange(['markerColors', 'scale'], function (_ref5) {
  var markerColors = _ref5.markerColors,
      scale = _ref5.scale;
  return {
    markerColorScale: getColorScale(markerColors, scale)
  };
}), withPropsOnChange(['markers', 'markerColorScale'], function (_ref6) {
  var markers = _ref6.markers,
      markerColorScale = _ref6.markerColorScale;
  return {
    computedMarkers: markers.map(function (marker, index) {
      return {
        value: marker,
        index: index,
        color: markerColorScale(markerColorScale.type === 'sequential' ? marker : index)
      };
    })
  };
}), pure)(BulletItem);
EnhancedBulletItem.displayName = 'BulletItem';

function _objectSpread$4(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty$6(target, key, source[key]); }); } return target; }

function _defineProperty$6(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var commonPropTypes = {
  data: PropTypes.arrayOf(PropTypes.shape({
    id: PropTypes.string.isRequired,
    title: PropTypes.node,
    ranges: PropTypes.arrayOf(PropTypes.number).isRequired,
    measures: PropTypes.arrayOf(PropTypes.number).isRequired,
    markers: PropTypes.arrayOf(PropTypes.number)
  })).isRequired,
  layout: PropTypes.oneOf(['horizontal', 'vertical']).isRequired,
  reverse: PropTypes.bool.isRequired,
  spacing: PropTypes.number.isRequired,
  titlePosition: PropTypes.oneOf(['before', 'after']).isRequired,
  titleAlign: PropTypes.oneOf(['start', 'middle', 'end']).isRequired,
  titleOffsetX: PropTypes.number.isRequired,
  titleOffsetY: PropTypes.number.isRequired,
  titleRotation: PropTypes.number.isRequired,
  rangeColors: PropTypes.any.isRequired,
  rangeBorderWidth: PropTypes.number.isRequired,
  rangeBorderColor: PropTypes.any.isRequired,
  onRangeClick: PropTypes.func,
  measureColors: PropTypes.any.isRequired,
  measureSize: PropTypes.number.isRequired,
  measureBorderWidth: PropTypes.number.isRequired,
  measureBorderColor: PropTypes.any.isRequired,
  onMeasureClick: PropTypes.func,
  markerColors: PropTypes.any.isRequired,
  markerSize: PropTypes.number.isRequired,
  onMarkerClick: PropTypes.func,
  axisPosition: PropTypes.oneOf(['before', 'after']).isRequired,
  theme: themePropType.isRequired,
  overrides: PropTypes.arrayOf(PropTypes.shape({
    id: PropTypes.string.isRequired,
    reverse: PropTypes.bool,
    rangeColors: PropTypes.any,
    rangeBorderWidth: PropTypes.number,
    rangeBorderColor: PropTypes.any,
    measureColors: PropTypes.any,
    measureBorderWidth: PropTypes.number,
    measureBorderColor: PropTypes.any,
    axis: PropTypes.shape({
      position: PropTypes.oneOf(['before', 'after']),
      min: PropTypes.number,
      max: PropTypes.number
    })
  })).isRequired
};
var BulletPropTypes = _objectSpread$4({}, commonPropTypes);
var commonDefaultProps = {
  layout: EnhancedBulletItem.defaultProps.layout,
  reverse: EnhancedBulletItem.defaultProps.reverse,
  spacing: 30,
  titlePosition: EnhancedBulletItem.defaultProps.titlePosition,
  titleAlign: EnhancedBulletItem.defaultProps.titleAlign,
  titleOffsetX: EnhancedBulletItem.defaultProps.titleOffsetX,
  titleOffsetY: EnhancedBulletItem.defaultProps.titleOffsetY,
  titleRotation: EnhancedBulletItem.defaultProps.titleRotation,
  rangeBorderWidth: 0,
  rangeBorderColor: 'inherit',
  measureSize: 0.4,
  measureBorderWidth: 0,
  measureBorderColor: 'inherit',
  markerSize: 0.6,
  markerColors: EnhancedBulletItem.defaultProps.markerColors,
  axisPosition: EnhancedBulletItem.defaultProps.axisPosition,
  rangeColors: EnhancedBulletItem.defaultProps.rangeColors,
  measureColors: EnhancedBulletItem.defaultProps.measureColors,
  isInteractive: true,
  onClick: noop,
  overrides: []
};
var BulletDefaultProps = _objectSpread$4({}, commonDefaultProps);

var props = /*#__PURE__*/Object.freeze({
    BulletPropTypes: BulletPropTypes,
    BulletDefaultProps: BulletDefaultProps
});

var commonEnhancers = [withDimensions(), withTheme()];
var enhance = (function (Component) {
  var implDefaultProps = props["".concat(Component.displayName, "DefaultProps")];

  switch (Component.displayName) {
    case 'Bullet':
      return compose.apply(void 0, [defaultProps(implDefaultProps)].concat(commonEnhancers, [withMotion(), pure]))(Component);
  }

  return Component;
});

function _typeof$5(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$5 = function _typeof(obj) { return typeof obj; }; } else { _typeof$5 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$5(obj); }

function _extends$1() { _extends$1 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$1.apply(this, arguments); }

function _toConsumableArray$1(arr) { return _arrayWithoutHoles$1(arr) || _iterableToArray$1(arr) || _nonIterableSpread$1(); }

function _nonIterableSpread$1() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray$1(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles$1(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _objectSpread$5(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty$7(target, key, source[key]); }); } return target; }

function _classCallCheck$5(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties$5(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass$5(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$5(Constructor.prototype, protoProps); if (staticProps) _defineProperties$5(Constructor, staticProps); return Constructor; }

function _possibleConstructorReturn$5(self, call) { if (call && (_typeof$5(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized$5(self); }

function _getPrototypeOf$5(o) { _getPrototypeOf$5 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf$5(o); }

function _assertThisInitialized$5(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _inherits$5(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf$5(subClass, superClass); }

function _setPrototypeOf$5(o, p) { _setPrototypeOf$5 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf$5(o, p); }

function _defineProperty$7(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var Bullet =
/*#__PURE__*/
function (_Component) {
  _inherits$5(Bullet, _Component);

  function Bullet() {
    var _getPrototypeOf2;

    var _this;

    _classCallCheck$5(this, Bullet);

    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    _this = _possibleConstructorReturn$5(this, (_getPrototypeOf2 = _getPrototypeOf$5(Bullet)).call.apply(_getPrototypeOf2, [this].concat(args)));

    _defineProperty$7(_assertThisInitialized$5(_this), "handleBulletTooltip", function (showTooltip, bullet, event) {
      var _this$props = _this.props,
          bulletTooltip = _this$props.bulletTooltip,
          theme = _this$props.theme;
      showTooltip(React.createElement(BasicTooltip, {
        id: bullet.id,
        enableChip: true,
        color: bullet.color,
        theme: theme //format={format}
        ,
        renderContent: typeof bulletTooltip === 'function' ? bulletTooltip.bind(null, _objectSpread$5({}, bullet)) : null
      }), event);
    });

    return _this;
  }

  _createClass$5(Bullet, [{
    key: "render",
    value: function render() {
      var _this2 = this;

      var _this$props2 = this.props,
          data = _this$props2.data,
          layout = _this$props2.layout,
          spacing = _this$props2.spacing,
          measureSize = _this$props2.measureSize,
          markerSize = _this$props2.markerSize,
          reverse = _this$props2.reverse,
          axisPosition = _this$props2.axisPosition,
          axisValueFormat = _this$props2.axisValueFormat,
          margin = _this$props2.margin,
          width = _this$props2.width,
          height = _this$props2.height,
          outerWidth = _this$props2.outerWidth,
          outerHeight = _this$props2.outerHeight,
          titlePosition = _this$props2.titlePosition,
          titleAlign = _this$props2.titleAlign,
          titleOffsetX = _this$props2.titleOffsetX,
          titleOffsetY = _this$props2.titleOffsetY,
          titleRotation = _this$props2.titleRotation,
          rangeComponent = _this$props2.rangeComponent,
          rangeColors = _this$props2.rangeColors,
          measureComponent = _this$props2.measureComponent,
          measureColors = _this$props2.measureColors,
          markerComponent = _this$props2.markerComponent,
          markerColors = _this$props2.markerColors,
          theme = _this$props2.theme,
          measureTooltip = _this$props2.measureTooltip,
          rangeTooltip = _this$props2.rangeTooltip,
          markerTooltip = _this$props2.markerTooltip,
          bulletTooltip = _this$props2.bulletTooltip,
          animate = _this$props2.animate,
          motionStiffness = _this$props2.motionStiffness,
          motionDamping = _this$props2.motionDamping,
          isInteractive = _this$props2.isInteractive,
          onRangeClick = _this$props2.onRangeClick,
          onMeasureClick = _this$props2.onMeasureClick,
          onMarkerClick = _this$props2.onMarkerClick;
      var itemHeight;

      if (layout === 'horizontal') {
        itemHeight = (height - spacing * (data.length - 1)) / data.length;
      } else {
        itemHeight = (width - spacing * (data.length - 1)) / data.length;
      }

      var measureHeight = itemHeight * measureSize;
      var markerHeight = itemHeight * markerSize;
      var enhancedData = data.map(function (d) {
        var all = [].concat(_toConsumableArray$1(d.ranges), _toConsumableArray$1(d.measures), _toConsumableArray$1(d.markers));
        var max = Math.max.apply(Math, _toConsumableArray$1(all));
        var scale = scaleLinear().domain([0, max]);

        if (layout === 'horizontal') {
          scale.range(reverse === true ? [width, 0] : [0, width]);
        } else {
          scale.range(reverse === true ? [0, height] : [height, 0]);
        }

        return _objectSpread$5({}, d, {
          scale: scale
        });
      });
      var motionProps = {
        animate: animate,
        motionDamping: motionDamping,
        motionStiffness: motionStiffness
      };
      return React.createElement(Container, {
        isInteractive: isInteractive,
        theme: theme
      }, function (_ref) {
        var showTooltip = _ref.showTooltip,
            hideTooltip = _ref.hideTooltip;
        return React.createElement(SvgWrapper, {
          width: outerWidth,
          height: outerHeight,
          margin: margin,
          theme: theme
        }, enhancedData.map(function (d, i) {
          return React.createElement(EnhancedBulletItem, _extends$1({
            key: d.id,
            data: d
          }, d, {
            layout: layout,
            reverse: reverse,
            x: layout === 'vertical' ? itemHeight * i + spacing * i : 0,
            y: layout === 'horizontal' ? itemHeight * i + spacing * i : 0,
            width: width,
            height: itemHeight,
            titlePosition: titlePosition,
            titleAlign: titleAlign,
            titleOffsetX: titleOffsetX,
            titleOffsetY: titleOffsetY,
            titleRotation: titleRotation,
            measureHeight: measureHeight,
            markerHeight: markerHeight,
            rangeComponent: rangeComponent,
            rangeColors: rangeColors,
            measureComponent: measureComponent,
            measureColors: measureColors,
            markerComponent: markerComponent,
            markerColors: markerColors,
            theme: theme,
            axisPosition: axisPosition,
            axisValueFormat: axisValueFormat
          }, motionProps, {
            showTooltip: showTooltip,
            hideTooltip: hideTooltip,
            onRangeClick: onRangeClick,
            onMeasureClick: onMeasureClick,
            onMarkerClick: onMarkerClick,
            onMouseEnter: partial(_this2.handleBulletTooltip, showTooltip),
            onMouseLeave: hideTooltip,
            measureTooltip: measureTooltip,
            rangeTooltip: rangeTooltip,
            markerTooltip: markerTooltip
          }));
        }));
      });
    }
  }]);

  return Bullet;
}(Component);

_defineProperty$7(Bullet, "propTypes", BulletPropTypes);

Bullet.displayName = 'Bullet';
var Bullet$1 = setDisplayName(Bullet.displayName)(enhance(Bullet));

function _extends$2() { _extends$2 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$2.apply(this, arguments); }

var ResponsiveBullet = function ResponsiveBullet(props) {
  return React.createElement(ResponsiveWrapper, null, function (_ref) {
    var width = _ref.width,
        height = _ref.height;
    return React.createElement(Bullet$1, _extends$2({
      width: width,
      height: height
    }, props));
  });
};

export { Bullet$1 as Bullet, BulletDefaultProps, EnhancedBulletItem as BulletItem, BulletPropTypes, ResponsiveBullet };