text: import { createNamespace, isDef } from '../utils';
  import { BindEventMixin } from '../mixins/bind-event';
  import { getScrollTop, getElementTop, getScroller } from '../utils/dom/scroll';
  
  var _createNamespace = createNamespace('sticky'),
      createComponent = _createNamespace[0],
      bem = _createNamespace[1];
  
  export default createComponent({
    mixins: [BindEventMixin(function (bind) {
      if (!this.scroller) {
        this.scroller = getScroller(this.$el);
      }
  
      bind(this.scroller, 'scroll', this.onScroll, true);
      this.onScroll();
    })],
    props: {
      zIndex: [Number, String],
      container: null,
      offsetTop: {
        type: [Number, String],
        default: 0
      }
    },
    data: function data() {
      return {
        fixed: false,
        height: 0,
        transform: 0
      };
    },
    computed: {
      style: function style() {
        if (!this.fixed) {
          return;
        }
  
        var style = {};
  
        if (isDef(this.zIndex)) {
          style.zIndex = this.zIndex;
        }
  
        if (this.offsetTop && this.fixed) {
          style.top = this.offsetTop + "px";
        }
  
        if (this.transform) {
          style.transform = "translate3d(0, " + this.transform + "px, 0)";
        }
  
        return style;
      }
    },
    methods: {
      onScroll: function onScroll() {
        var _this = this;
  
        this.height = this.$el.offsetHeight;
        var container = this.container;
        var offsetTop = +this.offsetTop;
        var scrollTop = getScrollTop(window);
        var topToPageTop = getElementTop(this.$el);
  
        var emitScrollEvent = function emitScrollEvent() {
          _this.$emit('scroll', {
            scrollTop: scrollTop,
            isFixed: _this.fixed
          });
        }; // The sticky component should be kept inside the container element
  
  
        if (container) {
          var bottomToPageTop = topToPageTop + container.offsetHeight;
  
          if (scrollTop + offsetTop + this.height > bottomToPageTop) {
            var distanceToBottom = this.height + scrollTop - bottomToPageTop;
  
            if (distanceToBottom < this.height) {
              this.fixed = true;
              this.transform = -(distanceToBottom + offsetTop);
            } else {
              this.fixed = false;
            }
  
            emitScrollEvent();
            return;
          }
        }
  
        if (scrollTop + offsetTop > topToPageTop) {
          this.fixed = true;
          this.transform = 0;
        } else {
          this.fixed = false;
        }
  
        emitScrollEvent();
      }
    },
    render: function render() {
      var h = arguments[0];
      var fixed = this.fixed;
      var style = {
        height: fixed ? this.height + "px" : null
      };
      return h("div", {
        "style": style
      }, [h("div", {
        "class": bem({
          fixed: fixed
        }),
        "style": this.style
      }, [this.slots()])]);
    }
  });