kamrify commited on
Commit
aafd6df
·
1 Parent(s): 6aa2828

Add tour control using keyboard keys

Browse files
Files changed (5) hide show
  1. index.html +14 -0
  2. src/driver.ts +32 -0
  3. src/emitter.ts +8 -1
  4. src/events.ts +4 -0
  5. src/state.ts +2 -0
index.html CHANGED
@@ -370,6 +370,20 @@ npm install driver.js</pre
370
  description: "You can now have popovers without elements as well",
371
  },
372
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
373
  ],
374
  });
375
 
 
370
  description: "You can now have popovers without elements as well",
371
  },
372
  },
373
+ {
374
+ element: "#scrollable-area",
375
+ popover: {
376
+ title: "Scrollable Areas",
377
+ description: "There are no issues with scrollable element tours as well."
378
+ }
379
+ },
380
+ {
381
+ element: "#third-scroll-paragraph",
382
+ popover: {
383
+ title: "Nested Scrolls",
384
+ description: "Even the nested scrollable elements work now."
385
+ }
386
+ }
387
  ],
388
  });
389
 
src/driver.ts CHANGED
@@ -24,6 +24,34 @@ export function driver(options: Config = {}) {
24
  destroy();
25
  }
26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  function init() {
28
  if (getState("isInitialized")) {
29
  return;
@@ -36,6 +64,8 @@ export function driver(options: Config = {}) {
36
 
37
  listen("overlayClick", handleClose);
38
  listen("escapePress", handleClose);
 
 
39
  }
40
 
41
  function drive(stepIndex: number = 0) {
@@ -51,6 +81,8 @@ export function driver(options: Config = {}) {
51
  destroy();
52
  }
53
 
 
 
54
  const currentStep = steps[stepIndex];
55
  const hasNextStep = steps[stepIndex + 1];
56
  const hasPreviousStep = steps[stepIndex - 1];
 
24
  destroy();
25
  }
26
 
27
+ function handleArrowLeft() {
28
+ const steps = getConfig("steps") || [];
29
+ const currentStepIndex = getState("currentStepIndex");
30
+ if (typeof currentStepIndex === "undefined") {
31
+ return;
32
+ }
33
+
34
+ const previousStepIndex = currentStepIndex - 1;
35
+ if (steps[previousStepIndex]) {
36
+ drive(previousStepIndex);
37
+ }
38
+ }
39
+
40
+ function handleArrowRight() {
41
+ const steps = getConfig("steps") || [];
42
+ const currentStepIndex = getState("currentStepIndex");
43
+ if (typeof currentStepIndex === "undefined") {
44
+ return;
45
+ }
46
+
47
+ const nextStepIndex = currentStepIndex + 1;
48
+ if (steps[nextStepIndex]) {
49
+ drive(nextStepIndex);
50
+ } else {
51
+ destroy();
52
+ }
53
+ }
54
+
55
  function init() {
56
  if (getState("isInitialized")) {
57
  return;
 
64
 
65
  listen("overlayClick", handleClose);
66
  listen("escapePress", handleClose);
67
+ listen("arrowLeftPress", handleArrowLeft);
68
+ listen("arrowRightPress", handleArrowRight);
69
  }
70
 
71
  function drive(stepIndex: number = 0) {
 
81
  destroy();
82
  }
83
 
84
+ setState("currentStepIndex", stepIndex);
85
+
86
  const currentStep = steps[stepIndex];
87
  const hasNextStep = steps[stepIndex + 1];
88
  const hasPreviousStep = steps[stepIndex - 1];
src/emitter.ts CHANGED
@@ -1,4 +1,11 @@
1
- type allowedEvents = "overlayClick" | "escapePress" | "nextClick" | "prevClick" | "closeClick";
 
 
 
 
 
 
 
2
 
3
  let registeredListeners: Partial<{ [key in allowedEvents]: () => void }> = {};
4
 
 
1
+ type allowedEvents =
2
+ | "overlayClick"
3
+ | "escapePress"
4
+ | "nextClick"
5
+ | "prevClick"
6
+ | "closeClick"
7
+ | "arrowRightPress"
8
+ | "arrowLeftPress";
9
 
10
  let registeredListeners: Partial<{ [key in allowedEvents]: () => void }> = {};
11
 
src/events.ts CHANGED
@@ -20,6 +20,10 @@ function onKeyup(e: KeyboardEvent) {
20
 
21
  if (e.key === "Escape") {
22
  emit("escapePress");
 
 
 
 
23
  }
24
  }
25
 
 
20
 
21
  if (e.key === "Escape") {
22
  emit("escapePress");
23
+ } else if (e.key === "ArrowRight") {
24
+ emit("arrowRightPress");
25
+ } else if (e.key === "ArrowLeft") {
26
+ emit("arrowLeftPress");
27
  }
28
  }
29
 
src/state.ts CHANGED
@@ -5,6 +5,8 @@ import { DriveStep } from "./driver";
5
  export type State = {
6
  // Whether driver is initialized or not
7
  isInitialized?: boolean;
 
 
8
 
9
  // Used to bounce the resize event
10
  resizeTimeout?: number;
 
5
  export type State = {
6
  // Whether driver is initialized or not
7
  isInitialized?: boolean;
8
+ // Index of the currently active step in driver tour
9
+ currentStepIndex?: number;
10
 
11
  // Used to bounce the resize event
12
  resizeTimeout?: number;