kamrify commited on
Commit
b8874fd
·
1 Parent(s): d622e68

Add popover rendering

Browse files
Files changed (5) hide show
  1. index.html +6 -0
  2. src/driver.ts +2 -1
  3. src/highlight.ts +3 -3
  4. src/popover.ts +88 -2
  5. src/style.css +15 -0
index.html CHANGED
@@ -285,6 +285,12 @@ npm install driver.js</pre
285
  .addEventListener("click", () => {
286
  driver({ animate: false }).highlight({
287
  element: "#large-paragraph-text",
 
 
 
 
 
 
288
  });
289
  });
290
 
 
285
  .addEventListener("click", () => {
286
  driver({ animate: false }).highlight({
287
  element: "#large-paragraph-text",
288
+ popover: {
289
+ title: "driver.js",
290
+ description: "Highlight anything, anywhere on the page",
291
+ align: "end",
292
+ preferredPosition: "top",
293
+ },
294
  });
295
  });
296
 
src/driver.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Popover } from "./popover";
2
  import { destroyStage } from "./stage";
3
  import { destroyEvents, initEvents } from "./events";
4
  import { Config, configure, getConfig } from "./config";
@@ -52,6 +52,7 @@ export function driver(options: Config = {}) {
52
  );
53
 
54
  destroyEvents();
 
55
  destroyHighlight();
56
  destroyStage();
57
  destroyEmitter();
 
1
+ import { destroyPopover, Popover } from "./popover";
2
  import { destroyStage } from "./stage";
3
  import { destroyEvents, initEvents } from "./events";
4
  import { Config, configure, getConfig } from "./config";
 
52
  );
53
 
54
  destroyEvents();
55
+ destroyPopover();
56
  destroyHighlight();
57
  destroyStage();
58
  destroyEmitter();
src/highlight.ts CHANGED
@@ -50,13 +50,12 @@ function transferHighlight(from: Element, to: Element) {
50
  transitionStage(elapsed, duration, from, to);
51
  } else {
52
  trackActiveElement(to);
53
- renderPopover(to);
54
 
55
  currentTransitionCallback = undefined;
56
  }
57
 
58
- refreshStage();
59
- refreshPopover();
60
  window.requestAnimationFrame(animate);
61
  };
62
 
@@ -64,6 +63,7 @@ function transferHighlight(from: Element, to: Element) {
64
  window.requestAnimationFrame(animate);
65
 
66
  bringInView(to);
 
67
 
68
  from.classList.remove("driver-active-element");
69
  to.classList.add("driver-active-element");
 
50
  transitionStage(elapsed, duration, from, to);
51
  } else {
52
  trackActiveElement(to);
 
53
 
54
  currentTransitionCallback = undefined;
55
  }
56
 
57
+ // refreshStage();
58
+ // refreshPopover();
59
  window.requestAnimationFrame(animate);
60
  };
61
 
 
63
  window.requestAnimationFrame(animate);
64
 
65
  bringInView(to);
66
+ renderPopover(to);
67
 
68
  from.classList.remove("driver-active-element");
69
  to.classList.add("driver-active-element");
src/popover.ts CHANGED
@@ -1,3 +1,5 @@
 
 
1
  export type Popover = {
2
  title?: string;
3
  description: string;
@@ -5,8 +7,92 @@ export type Popover = {
5
  align?: "start" | "center" | "end";
6
  };
7
 
 
 
8
  export function renderPopover(element: Element) {
9
- console.log("rendering", element);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  }
11
 
12
- export function refreshPopover() {}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { bringInView } from "./utils";
2
+
3
  export type Popover = {
4
  title?: string;
5
  description: string;
 
7
  align?: "start" | "center" | "end";
8
  };
9
 
10
+ let popoverEl: HTMLElement | undefined;
11
+
12
  export function renderPopover(element: Element) {
13
+ if (!popoverEl) {
14
+ const popover = createPopover();
15
+ document.body.appendChild(popover.popoverWrapper);
16
+
17
+ popoverEl = popover.popoverWrapper;
18
+ }
19
+
20
+ popoverEl.style.display = "block";
21
+ popoverEl.style.left = "0";
22
+ popoverEl.style.top = "0";
23
+ popoverEl.style.bottom = "";
24
+ popoverEl.style.right = "";
25
+
26
+ refreshPopover();
27
+ bringInView(popoverEl);
28
+ }
29
+
30
+ export function refreshPopover() {
31
+ console.log("rendering popover");
32
  }
33
 
34
+ function createPopover() {
35
+ const popoverWrapper = document.createElement("div");
36
+ popoverWrapper.classList.add("driver-popover");
37
+
38
+ const popoverTip = document.createElement("div");
39
+ popoverTip.classList.add("driver-popover-tip");
40
+
41
+ const popoverTitle = document.createElement("div");
42
+ popoverTitle.classList.add("driver-popover-title");
43
+ popoverTitle.innerText = "Popover Title";
44
+
45
+ const popoverDescription = document.createElement("div");
46
+ popoverDescription.classList.add("driver-popover-description");
47
+ popoverDescription.innerText = "Popover Description";
48
+
49
+ const popoverFooter = document.createElement("div");
50
+ popoverFooter.classList.add("driver-popover-footer");
51
+
52
+ const popoverCloseBtn = document.createElement("button");
53
+ popoverCloseBtn.classList.add("driver-popover-close-btn");
54
+ popoverCloseBtn.innerText = "Close";
55
+
56
+ const popoverFooterBtnGroup = document.createElement("span");
57
+ popoverFooterBtnGroup.classList.add("driver-popover-footer-btns");
58
+
59
+ const popoverPrevBtn = document.createElement("button");
60
+ popoverPrevBtn.classList.add("driver-popover-prev-btn");
61
+ popoverPrevBtn.innerHTML = "&larr; Previous";
62
+
63
+ const popoverNextBtn = document.createElement("button");
64
+ popoverNextBtn.classList.add("driver-popover-next-btn");
65
+ popoverNextBtn.innerHTML = "Next &rarr;";
66
+
67
+ popoverFooterBtnGroup.appendChild(popoverPrevBtn);
68
+ popoverFooterBtnGroup.appendChild(popoverNextBtn);
69
+
70
+ popoverFooter.appendChild(popoverCloseBtn);
71
+ popoverFooter.appendChild(popoverFooterBtnGroup);
72
+
73
+ popoverWrapper.appendChild(popoverTip);
74
+ popoverWrapper.appendChild(popoverTitle);
75
+ popoverWrapper.appendChild(popoverDescription);
76
+ popoverWrapper.appendChild(popoverFooter);
77
+
78
+ return {
79
+ popoverWrapper,
80
+ popoverTip,
81
+ popoverTitle,
82
+ popoverDescription,
83
+ popoverFooter,
84
+ popoverPrevBtn,
85
+ popoverNextBtn,
86
+ popoverCloseBtn,
87
+ popoverFooterBtnGroup,
88
+ };
89
+ }
90
+
91
+ export function destroyPopover() {
92
+ if (!popoverEl) {
93
+ return;
94
+ }
95
+
96
+ popoverEl.parentElement?.removeChild(popoverEl);
97
+ popoverEl = undefined;
98
+ }
src/style.css CHANGED
@@ -24,3 +24,18 @@
24
  .driver-fade .driver-stage {
25
  animation: animate-fade-in 100ms ease-in-out;
26
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  .driver-fade .driver-stage {
25
  animation: animate-fade-in 100ms ease-in-out;
26
  }
27
+
28
+ /* Popover styles */
29
+ .driver-popover {
30
+ color: #2d2d2d;
31
+ margin: 0;
32
+ border-radius: 5px;
33
+ min-width: 250px;
34
+ max-width: 300px;
35
+ box-shadow: 0 1px 10px #0006;
36
+ z-index: 1000000000;
37
+ position: fixed;
38
+ top: 0;
39
+ right: 0;
40
+ background-color: #fff;
41
+ }