Well https://github.com/ember-addons/bootstrap-for-ember is the place to start. And for your specific asks about popovers and tooltips you want to use components and the {{yeild}} helper. This allows your component to wrap around template content and add popover functionality to it.
I actually wrote a popover component and kept meaning to submit a request to the repo. It’s something like this:
App.BsPopoverComponent = Ember.Component.extend({
direction: 'right',
isPopoverVisible: false,
spacer: 15,
title: "Popover Title",
top: 200,
left: 100,
inlineStyle: function () {
return "top: %@px; left: %@px; display: block;".fmt(this.get("top"), this.get("left"));
}.property("top", "left"),
click: function () {
Ember.Logger.log("clicked: %@".fmt(this.get("title")));
this.toggleProperty("isPopoverVisible");
Ember.Logger.log("isPopoverVisible: ", this.get("isPopoverVisible"));
},
didInsertElement: function () {
Ember.run.scheduleOnce('afterRender', this, 'processYieldedContent');
},
processYieldedContent: function () {
var direction = this.get("direction");
var yieldedContent = this.$("div.popover ~ *");
var contentWidth = yieldedContent.width();
var contentHeight = yieldedContent.height();
var contentPosition = yieldedContent.position();
var popover = this.$(".popover");
var popoverWidth = popover.width();
var popoverHeight = popover.height();
var spacer = this.get("spacer");
var positionFunctionMapping = {
'right': this.getPositionRight,
'left': this.getPositionLeft,
'top': this.getPositionRight,
'bottom': this.getPositionRight
};
var popoverPosition = positionFunctionMapping[direction](
contentWidth,
contentHeight,
contentPosition,
popoverWidth,
popoverHeight,
spacer
);
this.set("top", popoverPosition.top);
this.set("left", popoverPosition.left);
},
getPositionRight: function(contentWidth, contentHeight, contentPosition, popoverWidth, popoverHeight, spacer) {
var left = contentPosition.left + contentWidth + spacer;
var top = contentPosition.top + Math.round((contentHeight/2) - (popoverHeight/2));
var absPosition = {
top: top,
left: left
};
Ember.Logger.log("right position: ", absPosition);
return absPosition;
},
getPositionLeft: function(contentWidth, contentHeight, contentPosition, popoverWidth, popoverHeight, spacer) {
var left = contentPosition.left - spacer - popoverWidth;
var top = contentPosition.top + Math.round((contentHeight/2) - (popoverHeight/2));
var absPosition = {
top: top,
left: left
};
Ember.Logger.log("right position: ", absPosition);
return absPosition;
}});
and the template could look like:
<div {{bind-attr class=":popover :fade direction isPopoverVisible:in:out" style="inlineStyle"}}>
<div class="arrow"></div>
<h3 class="popover-title">{{title}}</h3>
<div class="popover-content">{{{content}}}</div>
</div>{{yield}}
Which is essentially yields the original content of the parent view adjacent to the popover in the DOM, and the pop over is just absolutely position in reference to it with inline styles.
And finally you have the declaration of the popover like so:
{{#bs-popover
title="Title Of Popover"
content="Content on first line of popover<br />second line..."
}}
<button type="button" class="btn btn-default btn-xs" title="">
<span class="glyphicon glyphicon-globe"></span>
</button>
{{/bs-popover}}
And of course you would click the button to toggle the popover. The only problem I found with this method is that since each popover is independent, they get a z-index based on the position in the DOM and if two popups are close to one another the second on will always go on top even if you clicked it second, where as if there was a centralized popover manager, it could do cool things like close all the popovers, ensure the last clicked popover is a highest level of z index, etc… but this should at least be a start.