kamrify commited on
Commit
4b04f2c
·
1 Parent(s): 1f05ebf

Fix custom button clicks not working

Browse files
docs/src/components/CodeSample.tsx CHANGED
@@ -1,7 +1,8 @@
1
- import type { Config, DriveStep } from "driver.js";
2
  import { driver } from "driver.js";
3
  import "driver.js/dist/driver.css";
4
  import { useState } from "react";
 
5
 
6
  type CodeSampleProps = {
7
  heading?: string;
@@ -40,18 +41,32 @@ function mountDummyElement() {
40
  document.body.appendChild(newDiv);
41
  }
42
 
 
 
 
 
 
 
 
 
 
 
 
43
  export function CodeSample(props: CodeSampleProps) {
44
- const [driverObj, setDriverObj] = useState<any>(null);
45
  const { heading, id, children, buttonText = "Show me an Example", className, config, highlight, tour } = props;
46
 
 
 
 
 
47
  function onClick() {
48
  if (highlight) {
49
  const driverObj = driver({
50
  ...config,
51
  });
52
- driverObj.highlight(highlight);
53
 
54
- setDriverObj(driverObj);
 
55
  } else if (tour) {
56
  if (id === "confirm-destroy") {
57
  config!.onDestroyStarted = () => {
@@ -113,8 +128,8 @@ export function CodeSample(props: CodeSampleProps) {
113
  steps: tour,
114
  });
115
 
 
116
  driverObj.drive();
117
- setDriverObj(driverObj);
118
  }
119
  }
120
 
 
1
+ import type { Config, DriveStep, PopoverDOM } from "driver.js";
2
  import { driver } from "driver.js";
3
  import "driver.js/dist/driver.css";
4
  import { useState } from "react";
5
+ import { onDriverClick } from "../../../src/events";
6
 
7
  type CodeSampleProps = {
8
  heading?: string;
 
41
  document.body.appendChild(newDiv);
42
  }
43
 
44
+ function attachFirstButton(popover: PopoverDOM) {
45
+ const firstButton = document.createElement("button");
46
+ firstButton.innerText = "First";
47
+ popover.footerButtons.appendChild(firstButton);
48
+
49
+ console.log(firstButton);
50
+ firstButton.addEventListener("click", () => {
51
+ console.log('clicked');
52
+ });
53
+ }
54
+
55
  export function CodeSample(props: CodeSampleProps) {
 
56
  const { heading, id, children, buttonText = "Show me an Example", className, config, highlight, tour } = props;
57
 
58
+ if (id === "demo-hook-theme") {
59
+ config!.onPopoverRendered = attachFirstButton;
60
+ }
61
+
62
  function onClick() {
63
  if (highlight) {
64
  const driverObj = driver({
65
  ...config,
66
  });
 
67
 
68
+ window.driverObj = driverObj;
69
+ driverObj.highlight(highlight);
70
  } else if (tour) {
71
  if (id === "confirm-destroy") {
72
  config!.onDestroyStarted = () => {
 
128
  steps: tour,
129
  });
130
 
131
+ window.driverObj = driverObj;
132
  driverObj.drive();
 
133
  }
134
  }
135
 
docs/src/content/guides/styling-popover.mdx CHANGED
@@ -12,38 +12,123 @@ Alternatively, if want to modify the Popover DOM, you can use the `onPopoverRend
12
 
13
  We have added a few examples below but have a look at the [theming section](/docs/theming#styling-popover) for detailed guide including class names to target etc.
14
 
15
- ## Using CSS
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
 
17
- Here are some driver.js examples with different overlay colors.
 
 
18
 
19
- ```js
20
- import { driver } from "driver.js";
21
- import "driver.js/dist/driver.css";
 
 
 
 
 
 
22
 
23
- const driverObj = driver();
24
 
25
- driverObj.highlight({
26
- popover: {
27
- title: 'Pass any RGB Color',
28
- description: 'Here we have set the overlay color to be blue. You can pass any RGB color to overlayColor option.'
29
- }
30
- });
31
- ```
32
-
33
- <div className='flex flex-col gap-1 -mt-5'>
34
- <CodeSample
35
- buttonText={"Red Color"}
36
- config={{
37
- overlayColor: 'red',
38
- overlayOpacity: 0.3
39
- }}
40
- highlight={{
41
  popover: {
42
- title: 'Pass any RGB Color',
43
- description: 'Here we have set the overlay color to be blue. You can pass any RGB color to overlayColor option.',
 
 
44
  }
45
- }}
46
- id={"left-start"}
47
- client:load
48
- />
49
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
  We have added a few examples below but have a look at the [theming section](/docs/theming#styling-popover) for detailed guide including class names to target etc.
14
 
15
+ <CodeSample
16
+ heading="Using CSS"
17
+ buttonText={"Driver.js Website Theme"}
18
+ config={{
19
+ prevBtnText: '&larr; Previous',
20
+ nextBtnText: 'Next &rarr;',
21
+ doneBtnText: 'Done',
22
+ showButtons: ['next', 'previous'],
23
+ popoverClass: 'driverjs-theme'
24
+ }}
25
+ tour={[
26
+ {
27
+ element: '#demo-theme',
28
+ popover: {
29
+ align: 'start',
30
+ side: 'left',
31
+ title: 'Style However You Want',
32
+ description: 'You can use the default class names and override the styles or you can pass a custom class name to the popoverClass option either globally or per step.'
33
+ }
34
+ },
35
+ {
36
+ element: 'h1',
37
+ popover: {
38
+ align: 'start',
39
+ side: 'bottom',
40
+ title: 'Style However You Want',
41
+ description: 'You can use the default class names and override the styles or you can pass a custom class name to the popoverClass option either globally or per step.'
42
+ }
43
+ },
44
+ {
45
+ element: 'p a',
46
+ popover: {
47
+ align: 'start',
48
+ side: 'left',
49
+ title: 'Style However You Want',
50
+ description: 'You can use the default class names and override the styles or you can pass a custom class name to the popoverClass option either globally or per step.'
51
+ }
52
+ }
53
+ ]}
54
+ id={"demo-theme"}
55
+ client:load
56
+ >
57
+ ```js
58
+ import { driver } from "driver.js";
59
+ import "driver.js/dist/driver.css";
60
 
61
+ const driverObj = driver({
62
+ popoverClass: 'driverjs-theme'
63
+ });
64
 
65
+ driverObj.highlight({
66
+ element: '#demo-theme',
67
+ popover: {
68
+ title: 'Style However You Want',
69
+ description: 'You can use the default class names and override the styles or you can pass a custom class name to the popoverClass option either globally or per step.'
70
+ }
71
+ });
72
+ ```
73
+ </CodeSample>
74
 
75
+ <br/>
76
 
77
+ <CodeSample
78
+ heading="Using Hook"
79
+ buttonText={"Driver.js Website Theme"}
80
+ config={{
81
+ prevBtnText: '&larr; Previous',
82
+ nextBtnText: 'Next &rarr;',
83
+ doneBtnText: 'Done',
84
+ showButtons: ['next', 'previous'],
85
+ }}
86
+ tour={[
87
+ {
88
+ element: '#demo-hook-theme',
 
 
 
 
89
  popover: {
90
+ align: 'start',
91
+ side: 'left',
92
+ title: 'Style However You Want',
93
+ description: 'You can use the default class names and override the styles or you can pass a custom class name to the popoverClass option either globally or per step.'
94
  }
95
+ },
96
+ {
97
+ element: 'h1',
98
+ popover: {
99
+ align: 'start',
100
+ side: 'bottom',
101
+ title: 'Style However You Want',
102
+ description: 'You can use the default class names and override the styles or you can pass a custom class name to the popoverClass option either globally or per step.'
103
+ }
104
+ },
105
+ {
106
+ element: 'p a',
107
+ popover: {
108
+ align: 'start',
109
+ side: 'left',
110
+ title: 'Style However You Want',
111
+ description: 'You can use the default class names and override the styles or you can pass a custom class name to the popoverClass option either globally or per step.'
112
+ }
113
+ }
114
+ ]}
115
+ id={"demo-hook-theme"}
116
+ client:load
117
+ >
118
+ ```js
119
+ import { driver } from "driver.js";
120
+ import "driver.js/dist/driver.css";
121
+
122
+ const driverObj = driver({
123
+ popoverClass: 'driverjs-theme'
124
+ });
125
+
126
+ driverObj.highlight({
127
+ element: '#demo-theme',
128
+ popover: {
129
+ title: 'Style However You Want',
130
+ description: 'You can use the default class names and override the styles or you can pass a custom class name to the popoverClass option either globally or per step.'
131
+ }
132
+ });
133
+ ```
134
+ </CodeSample>
docs/src/layouts/BaseLayout.astro CHANGED
@@ -17,6 +17,69 @@ const { title } = Astro.props;
17
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
18
  <meta name="generator" content={Astro.generator} />
19
  <title>{title}</title>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  </head>
21
  <body>
22
  <slot />
 
17
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
18
  <meta name="generator" content={Astro.generator} />
19
  <title>{title}</title>
20
+
21
+ <style is:global>
22
+ .driver-popover.driverjs-theme {
23
+ background-color: #fde047;
24
+ color: #000;
25
+ }
26
+
27
+ .driver-popover.driverjs-theme .driver-popover-title {
28
+ font-size: 20px;
29
+ }
30
+
31
+ .driver-popover.driverjs-theme .driver-popover-title,
32
+ .driver-popover.driverjs-theme .driver-popover-description,
33
+ .driver-popover.driverjs-theme .driver-popover-progress-text {
34
+ color: #000;
35
+ }
36
+
37
+ .driver-popover.driverjs-theme button {
38
+ flex: 1;
39
+ text-align: center;
40
+ background-color: #000;
41
+ color: #ffffff;
42
+ border: 2px solid #000;
43
+ text-shadow: none;
44
+ font-size: 14px;
45
+ padding: 5px 8px;
46
+ border-radius: 6px;
47
+ }
48
+
49
+ .driver-popover.driverjs-theme button:hover {
50
+ background-color: #000;
51
+ color: #ffffff;
52
+ }
53
+
54
+ .driver-popover.driverjs-theme .driver-popover-navigation-btns {
55
+ justify-content: space-between;
56
+ gap: 3px;
57
+ }
58
+
59
+ .driver-popover.driverjs-theme .driver-popover-close-btn {
60
+ color: #9b9b9b;
61
+ }
62
+
63
+ .driver-popover.driverjs-theme .driver-popover-close-btn:hover {
64
+ color: #000;
65
+ }
66
+
67
+ .driver-popover.driverjs-theme .driver-popover-arrow-side-left.driver-popover-arrow {
68
+ border-left-color: #fde047;
69
+ }
70
+
71
+ .driver-popover.driverjs-theme .driver-popover-arrow-side-right.driver-popover-arrow {
72
+ border-right-color: #fde047;
73
+ }
74
+
75
+ .driver-popover.driverjs-theme .driver-popover-arrow-side-top.driver-popover-arrow {
76
+ border-top-color: #fde047;
77
+ }
78
+
79
+ .driver-popover.driverjs-theme .driver-popover-arrow-side-bottom.driver-popover-arrow {
80
+ border-bottom-color: #fde047;
81
+ }
82
+ </style>
83
  </head>
84
  <body>
85
  <slot />
index.html CHANGED
@@ -188,6 +188,7 @@
188
  <button id="disabled-buttons">Disabled Buttons</button>
189
  <button id="button-config-events">Button Listeners</button>
190
  <button id="button-tour-events">Tour Button Listeners</button>
 
191
  </div>
192
 
193
  <br />
@@ -757,6 +758,27 @@ npm install driver.js</pre
757
  driverObj.drive();
758
  });
759
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
760
  document.getElementById("is-active-btn").addEventListener("click", () => {
761
  alert(driver().isActive());
762
  });
 
188
  <button id="disabled-buttons">Disabled Buttons</button>
189
  <button id="button-config-events">Button Listeners</button>
190
  <button id="button-tour-events">Tour Button Listeners</button>
191
+ <button id="popover-hook-config">Popover Modified in Hook</button>
192
  </div>
193
 
194
  <br />
 
758
  driverObj.drive();
759
  });
760
 
761
+ document.getElementById("popover-hook-config").addEventListener("click", () => {
762
+ const driverObj = driver({
763
+ onPopoverRendered: popover => {
764
+ const firstButton = document.createElement("button");
765
+ firstButton.innerText = "First";
766
+ popover.footerButtons.appendChild(firstButton);
767
+
768
+ firstButton.addEventListener("click", () => {
769
+ console.log("First Button Clicked");
770
+ });
771
+ },
772
+ steps: [
773
+ { popover: { title: "Some title", description: "Some description" }},
774
+ { popover: { title: "Another title", description: "Some description" }},
775
+ { popover: { title: "Yet another title", description: "Some description" }},
776
+ ]
777
+ });
778
+
779
+ driverObj.drive();
780
+ });
781
+
782
  document.getElementById("is-active-btn").addEventListener("click", () => {
783
  alert(driver().isActive());
784
  });
src/events.ts CHANGED
@@ -50,11 +50,10 @@ export function onDriverClick(
50
 
51
  if (!shouldPreventDefault || shouldPreventDefault(target)) {
52
  e.preventDefault();
 
 
53
  }
54
 
55
- e.stopPropagation();
56
- e.stopImmediatePropagation();
57
-
58
  listener?.(e);
59
  };
60
 
@@ -84,6 +83,7 @@ export function initEvents() {
84
  }
85
 
86
  export function destroyEvents() {
 
87
  window.removeEventListener("resize", requireRefresh);
88
  window.removeEventListener("scroll", requireRefresh);
89
  }
 
50
 
51
  if (!shouldPreventDefault || shouldPreventDefault(target)) {
52
  e.preventDefault();
53
+ e.stopPropagation();
54
+ e.stopImmediatePropagation();
55
  }
56
 
 
 
 
57
  listener?.(e);
58
  };
59
 
 
83
  }
84
 
85
  export function destroyEvents() {
86
+ window.removeEventListener("keyup", onKeyup);
87
  window.removeEventListener("resize", requireRefresh);
88
  window.removeEventListener("scroll", requireRefresh);
89
  }
src/popover.ts CHANGED
@@ -193,9 +193,11 @@ export function renderPopover(element: Element, step: DriveStep) {
193
  return undefined;
194
  },
195
  target => {
196
- // Only prevent the default action if we're clicking on a button
197
  // This allows us to have links inside the popover title and description
198
- return !popover?.description.contains(target) && !popover?.title.contains(target);
 
 
199
  }
200
  );
201
 
 
193
  return undefined;
194
  },
195
  target => {
196
+ // Only prevent the default action if we're clicking on a driver button
197
  // This allows us to have links inside the popover title and description
198
+ return !popover?.description.contains(target)
199
+ && !popover?.title.contains(target)
200
+ && target.className.includes("driver-popover");
201
  }
202
  );
203