Skip to content

Commit 88eeb96

Browse files
committed
Add functionality to position the popover on mid center
1 parent ee16eca commit 88eeb96

File tree

4 files changed

+38
-0
lines changed

4 files changed

+38
-0
lines changed

demo/scripts/demo.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ document.addEventListener('DOMContentLoaded', function () {
1010
title: 'Before we start',
1111
description: 'This is just one use-case, make sure to check out the rest of the docs below.',
1212
nextBtnText: 'Okay, Start!',
13+
position: 'mid-center',
1314
},
1415
}, {
1516
element: '#logo_img',

src/core/popover.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,9 @@ export default class Popover extends Element {
167167
case 'bottom-right':
168168
this.positionOnBottomRight(position);
169169
break;
170+
case 'mid-center':
171+
this.positionOnMidCenter(position);
172+
break;
170173
case 'auto':
171174
default:
172175
this.autoPosition(position);
@@ -434,6 +437,30 @@ export default class Popover extends Element {
434437
this.tipNode.classList.add('top', 'position-right');
435438
}
436439

440+
/**
441+
* Shows the popover on the mid-center of the given position
442+
* @param {Position} elementPosition
443+
* @private
444+
*/
445+
positionOnMidCenter(elementPosition) {
446+
const popoverDimensions = this.getSize();
447+
const popoverHeight = popoverDimensions.height;
448+
const popoverWidth = popoverDimensions.width / 2;
449+
const popoverCenter = popoverHeight / 2;
450+
451+
const elementCenter = (elementPosition.bottom - elementPosition.top) / 2;
452+
const topCenterPosition = (elementPosition.top - popoverCenter) + elementCenter + this.options.offset;
453+
const nodeCenter = this.options.offset + elementPosition.left + ((elementPosition.right - elementPosition.left) / 2);
454+
455+
this.node.style.top = `${topCenterPosition}px`;
456+
this.node.style.left = `${nodeCenter - popoverWidth - this.options.padding}px`;
457+
this.node.style.right = '';
458+
this.node.style.bottom = '';
459+
460+
// Add the tip at the top center
461+
this.tipNode.classList.add('mid-center');
462+
}
463+
437464
/**
438465
* Automatically positions the popover around the given position
439466
* such that the element and popover remain in view

src/driver.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@ div#driver-popover-item {
9999
right: 20px;
100100
}
101101
}
102+
103+
&.mid-center {
104+
display: none;
105+
}
102106
}
103107

104108
.driver-popover-footer {

types/index.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,12 @@ declare module 'driver.js' {
555555
*/
556556
private positionOnBottomRight(position: Driver.Position): void;
557557

558+
/**
559+
* Positions the popover to the middle center of the given element position
560+
* @param {Driver.Position} position
561+
*/
562+
private positionOnMidCenter(position: Driver.Position): void;
563+
558564
/**
559565
* Positions the popover automatically around the element position
560566
* @param {Driver.Position} position

0 commit comments

Comments
 (0)