@claromentis/design-system
Version:
Claromentis Design System Component Library
86 lines (85 loc) • 2.52 kB
JavaScript
import { h } from '@stencil/core';
import { isInViewport } from "../../utils/utils";
/**
* @slot - This is where the item the popover wraps goes
* @slot content - Allows content to be added to the popover.
*/
export class Popover {
constructor() {
/**
* offsets the Popover if it is outside the bounds of the left of the viewport
*/
this.offestPopover = () => {
const shadowPopover = this.element.shadowRoot.querySelector('.popover');
const shadowPopoverRect = shadowPopover.getBoundingClientRect();
if (!isInViewport(shadowPopover) && shadowPopoverRect.left < 0) {
const currentLeftPosition = shadowPopover.offsetLeft;
let leftOffset = currentLeftPosition - shadowPopoverRect.left;
String(leftOffset);
shadowPopover.setAttribute('style', 'left:' + leftOffset + 'px');
}
};
this.toggle = false;
}
// Close the popover if the page is clicked
clickOff(event) {
if (!this.toggle)
return;
if (event.composedPath().indexOf(this.element) === -1)
this.toggle = false;
}
togglePopover() {
this.toggle = !this.toggle;
}
componentDidLoad() {
this.offestPopover();
}
render() {
return (h("div", { class: this.toggle ? 'popover-wrapper in' : 'popover-wrapper' }, h("span", { onMouseDown: () => this.togglePopover(), class: "inner" }, h("slot", null)), h("div", { class: "popover bs-popover-bottom", role: "tooltip" }, h("div", { class: "popover-body" }, h("slot", { name: "content" })))));
}
static get is() { return "cla-popover"; }
static get encapsulation() { return "shadow"; }
static get originalStyleUrls() {
return {
"$": ["cla-popover.scss"]
};
}
static get styleUrls() {
return {
"$": ["cla-popover.css"]
};
}
static get states() {
return {
"toggle": {}
};
}
static get events() {
return [{
"method": "toggleEvent",
"name": "toggleEvent",
"bubbles": true,
"cancelable": true,
"composed": true,
"docs": {
"tags": [],
"text": "Emitted when the menu is toggled."
},
"complexType": {
"original": "any",
"resolved": "any",
"references": {}
}
}];
}
static get elementRef() { return "element"; }
static get listeners() {
return [{
"name": "mousedown",
"method": "clickOff",
"target": "window",
"capture": false,
"passive": true
}];
}
}