react-bootstrap
Version:
Bootstrap 3 components build with React
69 lines (59 loc) • 1.83 kB
JavaScript
import React from 'react';
import classNames from 'classnames';
import BootstrapMixin from './BootstrapMixin';
import FadeMixin from './FadeMixin';
const Popover = React.createClass({
mixins: [BootstrapMixin, FadeMixin],
propTypes: {
placement: React.PropTypes.oneOf(['top', 'right', 'bottom', 'left']),
positionLeft: React.PropTypes.number,
positionTop: React.PropTypes.number,
arrowOffsetLeft: React.PropTypes.oneOfType([
React.PropTypes.number, React.PropTypes.string
]),
arrowOffsetTop: React.PropTypes.oneOfType([
React.PropTypes.number, React.PropTypes.string
]),
title: React.PropTypes.node,
animation: React.PropTypes.bool
},
getDefaultProps() {
return {
placement: 'right',
animation: true
};
},
render() {
const classes = {
'popover': true,
[this.props.placement]: true,
// in class will be added by the FadeMixin when the animation property is true
'in': !this.props.animation && (this.props.positionLeft != null || this.props.positionTop != null),
'fade': this.props.animation
};
const style = {
'left': this.props.positionLeft,
'top': this.props.positionTop,
'display': 'block'
};
const arrowStyle = {
'left': this.props.arrowOffsetLeft,
'top': this.props.arrowOffsetTop
};
return (
<div {...this.props} className={classNames(this.props.className, classes)} style={style} title={null}>
<div className="arrow" style={arrowStyle} />
{this.props.title ? this.renderTitle() : null}
<div className="popover-content">
{this.props.children}
</div>
</div>
);
},
renderTitle() {
return (
<h3 className="popover-title">{this.props.title}</h3>
);
}
});
export default Popover;