UNPKG

@kontent-ai/smart-link

Version:

Kontent.ai Smart Link SDK allowing to automatically inject [smart links](https://docs.kontent.ai/tutorials/develop-apps/build-strong-foundation/set-up-editing-from-preview#a-using-smart-links) to Kontent.ai according to manually specified [HTML data attri

233 lines (214 loc) 10.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.KSLPopUpElement = void 0; const KSLPositionedElement_1 = require("./KSLPositionedElement"); const domElement_1 = require("../../utils/domElement"); const colors_1 = require("../tokens/colors"); const shadows_1 = require("../tokens/shadows"); const zIndex_1 = require("../tokens/zIndex"); const templateHTML = ` <style> :host { --arrow-size: var(--ksl-pop-up-arrow-size, 12px); --background-color: var(--ksl-pop-up-background-color, ${colors_1.Colors.BackgroundDefault}); --border-radius: var(--ksl-pop-up-border-radius, 4px); --box-shadow: var(--ksl-pop-up-box-shadow, ${shadows_1.Shadows.Default}); --color: var(--ksl-pop-up-color, ${colors_1.Colors.TextDefault}); --padding: var(--ksl-pop-up-padding, 8px 8px); display: block; position: absolute; opacity: 0; z-index: calc(var(--ksl-z-index, ${zIndex_1.BaseZIndex}) + 1000); transition: opacity 250ms ease-in-out; } :host([visible]) { opacity: 1; } :host(:focus) { outline: none; } .ksl-pop-up__content { display: flex; flex-direction: row; justify-content: space-around; align-items: center; box-shadow: var(--box-shadow); background-color: var(--background-color); padding: var(--padding); border-radius: var(--border-radius); font-size: 12px; line-height: 16px; font-weight: normal; color: var(--color); } :host([position="${KSLPositionedElement_1.ElementPositionOffset.RightStart}"]) .ksl-pop-up__content, :host([position="${KSLPositionedElement_1.ElementPositionOffset.Right}"]) .ksl-pop-up__content, :host([position="${KSLPositionedElement_1.ElementPositionOffset.RightEnd}"]) .ksl-pop-up__content { margin-left: var(--arrow-size); } :host([position="${KSLPositionedElement_1.ElementPositionOffset.LeftStart}"]) .ksl-pop-up__content, :host([position="${KSLPositionedElement_1.ElementPositionOffset.Left}"]) .ksl-pop-up__content, :host([position="${KSLPositionedElement_1.ElementPositionOffset.LeftEnd}"]) .ksl-pop-up__content { margin-right: var(--arrow-size); } :host([position="${KSLPositionedElement_1.ElementPositionOffset.BottomStart}"]) .ksl-pop-up__content, :host([position="${KSLPositionedElement_1.ElementPositionOffset.Bottom}"]) .ksl-pop-up__content, :host([position="${KSLPositionedElement_1.ElementPositionOffset.BottomEnd}"]) .ksl-pop-up__content { margin-top: var(--arrow-size); } :host([position="${KSLPositionedElement_1.ElementPositionOffset.TopStart}"]) .ksl-pop-up__content, :host([position="${KSLPositionedElement_1.ElementPositionOffset.Top}"]) .ksl-pop-up__content, :host([position="${KSLPositionedElement_1.ElementPositionOffset.TopEnd}"]) .ksl-pop-up__content { margin-bottom: var(--arrow-size); } .ksl-pop-up__arrow { position: absolute; width: 0; height: 0; margin: 0 .25rem; } :host([position="${KSLPositionedElement_1.ElementPositionOffset.RightStart}"]) .ksl-pop-up__arrow, :host([position="${KSLPositionedElement_1.ElementPositionOffset.Right}"]) .ksl-pop-up__arrow, :host([position="${KSLPositionedElement_1.ElementPositionOffset.RightEnd}"]) .ksl-pop-up__arrow { left: -(var(--arrow-size)); border-right: var(--arrow-size) solid var(--background-color); border-top: var(--arrow-size) solid transparent; border-bottom: var(--arrow-size) solid transparent; } :host([position="${KSLPositionedElement_1.ElementPositionOffset.LeftStart}"]) .ksl-pop-up__arrow, :host([position="${KSLPositionedElement_1.ElementPositionOffset.Left}"]) .ksl-pop-up__arrow, :host([position="${KSLPositionedElement_1.ElementPositionOffset.LeftEnd}"]) .ksl-pop-up__arrow { right: -(var(--arrow-size)); border-top: var(--arrow-size) solid transparent; border-left: var(--arrow-size) solid var(--background-color); border-bottom: var(--arrow-size) solid transparent; } :host([position="${KSLPositionedElement_1.ElementPositionOffset.BottomStart}"]) .ksl-pop-up__arrow, :host([position="${KSLPositionedElement_1.ElementPositionOffset.Bottom}"]) .ksl-pop-up__arrow, :host([position="${KSLPositionedElement_1.ElementPositionOffset.BottomEnd}"]) .ksl-pop-up__arrow { top: 0; border-left: var(--arrow-size) solid transparent; border-right: var(--arrow-size) solid transparent; border-bottom: var(--arrow-size) solid var(--background-color); } :host([position="${KSLPositionedElement_1.ElementPositionOffset.TopStart}"]) .ksl-pop-up__arrow, :host([position="${KSLPositionedElement_1.ElementPositionOffset.Top}"]) .ksl-pop-up__arrow, :host([position="${KSLPositionedElement_1.ElementPositionOffset.TopEnd}"]) .ksl-pop-up__arrow { bottom: 0; border-top: var(--arrow-size) solid var(--background-color); border-left: var(--arrow-size) solid transparent; border-right: var(--arrow-size) solid transparent; } :host([position="${KSLPositionedElement_1.ElementPositionOffset.Top}"]) .ksl-pop-up__arrow, :host([position="${KSLPositionedElement_1.ElementPositionOffset.Bottom}"]) .ksl-pop-up__arrow { left: calc(50% - var(--arrow-size) - 0.25rem); } :host([position="${KSLPositionedElement_1.ElementPositionOffset.TopEnd}"]) .ksl-pop-up__arrow, :host([position="${KSLPositionedElement_1.ElementPositionOffset.BottomEnd}"]) .ksl-pop-up__arrow { right: 0; } :host([position="${KSLPositionedElement_1.ElementPositionOffset.TopStart}"]) .ksl-pop-up__arrow, :host([position="${KSLPositionedElement_1.ElementPositionOffset.BottomStart}"]) .ksl-pop-up__arrow { left: 0; } :host([position="${KSLPositionedElement_1.ElementPositionOffset.Left}"]) .ksl-pop-up__arrow, :host([position="${KSLPositionedElement_1.ElementPositionOffset.Right}"]) .ksl-pop-up__arrow { top: 8px; } :host([position="${KSLPositionedElement_1.ElementPositionOffset.LeftEnd}"]) .ksl-pop-up__arrow, :host([position="${KSLPositionedElement_1.ElementPositionOffset.RightEnd}"]) .ksl-pop-up__arrow { bottom: 0; } :host([position="${KSLPositionedElement_1.ElementPositionOffset.LeftStart}"]) .ksl-pop-up__arrow, :host([position="${KSLPositionedElement_1.ElementPositionOffset.RightStart}"]) .ksl-pop-up__arrow { top: 0; } </style> <div class="ksl-pop-up__content"> <slot></slot> </div> <div class="ksl-pop-up__arrow"/> `; class KSLPopUpElement extends KSLPositionedElement_1.KSLPositionedElement { get position() { return this.getAttribute('position') ?? KSLPositionedElement_1.ElementPositionOffset.Bottom; } set position(value) { this.updateAttribute('position', value); } get visible() { return this.hasAttribute('visible'); } set visible(value) { this.updateAttribute('visible', value); } static initializeTemplate() { return (0, domElement_1.createTemplateForCustomElement)(templateHTML); } connectedCallback() { super.connectedCallback(); if (!this.hasAttribute('role')) { this.setAttribute('role', 'tooltip'); } window.addEventListener('resize', this.adjustPosition, { capture: true }); window.addEventListener('scroll', this.adjustPosition, { capture: true }); } disconnectedCallback() { super.disconnectedCallback(); window.removeEventListener('resize', this.adjustPosition, { capture: true }); window.removeEventListener('scroll', this.adjustPosition, { capture: true }); } attachTo = (element) => { super.attachTo(element); this.adjustPosition(); }; adjustPosition = () => { if (!this.targetRef || !this.offsetParent) { return; // Can't position without target reference or when not mounted to DOM. } const thisRect = this.getBoundingClientRect(); const targetRect = this.targetRef.getBoundingClientRect(); const parentRect = this.offsetParent.getBoundingClientRect(); const isOffsetToBody = this.offsetParent.isSameNode(document.body); const isOffsetToTarget = this.offsetParent.isSameNode(this.targetRef); const topOffset = this.calculateTopOffset(thisRect, targetRect); const leftOffset = this.calculateLeftOffset(thisRect, targetRect); let thisTop; let thisLeft; if (isOffsetToTarget) { thisTop = topOffset; thisLeft = leftOffset; } else { const [scrollOffsetTop, scrollOffsetLeft] = (0, domElement_1.getTotalScrollOffset)(this.parentElement); thisTop = targetRect.top + topOffset + (isOffsetToBody ? window.pageYOffset : scrollOffsetTop); thisLeft = targetRect.left + leftOffset + (isOffsetToBody ? window.pageXOffset : scrollOffsetLeft); } if (isOffsetToBody) { if (parentRect.top + thisTop + thisRect.height > window.innerHeight) { this.style.bottom = parentRect.height + 'px'; this.style.top = 'auto'; } else { this.style.bottom = 'auto'; this.style.top = Math.max(-parentRect.top, thisTop) + 'px'; } if (parentRect.left + thisLeft + thisRect.width > window.innerWidth) { this.style.right = '0px'; this.style.left = 'auto'; } else { this.style.right = 'auto'; this.style.left = Math.max(-parentRect.left, thisLeft) + 'px'; } } else { this.style.right = 'auto'; this.style.left = `${thisLeft}px`; this.style.bottom = 'auto'; this.style.top = `${thisTop}px`; } }; } exports.KSLPopUpElement = KSLPopUpElement; //# sourceMappingURL=KSLPopUpElement.js.map