Antler Tour - Vaadin Add-on Directory
Antler Tour provides a unified Java API to drive two of the most popular JavaScript tour engines such as Shepherd.js and Driver.js# Antler Tour
This project provides a flexible and powerful guided tour (onboarding) integration for Vaadin Flow. Unlike simple wrappers, this add-on provides a unified Java API to drive two of the most popular JavaScript tour engines: `Shepherd.js` and `Driver.js`.
## Features
- Dual Engine Support: Choose between `Shepherd.js` (rich, highly customizable) and `Driver.js` (lightweight, powerful focus features).
- Unified Java API: Switch engines without rewriting your tour logic.
- Server-side Control: Define steps, content, and logic entirely in Java.
- Event Handling: Listen for tour completion or cancellation on the server side.
- Auto-Focus & Scrolling: Intelligent handling of element positioning and smooth scrolling.
## Dependencies
- driver.js@1.4.0
- shepherd.js@13.0.3
## Installation
### Prerequisites
- Java 17+
- Vaadin 24+
Add the following dependency to your `pom.xml`:
```xml
org.vaadin.addons.antlerflow
antler-tour
1.1.0
```
## Quick start
### Define your Tour
Below is a sample code snippet that shows you have to define a sample tour with two steps.
```java
List steps =
List.of(
TourStep.builder()
.id("step-filter-panel")
.title("Filter & Search Data")
.content(
"Use this panel to filter records by date, status, or keyword. "
+ "Filters help you narrow down large datasets and find information faster.")
.attachTo("#filter-panel")
.buttons(
List.of(
TourButton.builder()
.label("Next")
.type(TourButtonType.NEXT)
.build())
)
.build(),
TourStep.builder()
.id("step-dashboard-overview")
.title("Dashboard Overview")
.content(
"This dashboard gives you a real-time overview of key metrics, system status, and recent activity. "
+ "Use it to quickly understand what’s happening in your application.")
.attachTo(".dashboard-summary")
.position("right")
.buttons(
List.of(
TourButton.builder()
.label("Back")
.secondary(true)
.type(TourButtonType.PREVIOUS)
.build(),
TourButton.builder()
.label("Finish")
.type(TourButtonType.NEXT)
.build())
)
.build()
);
Tour tour =
Tour.builder()
.engineType(EngineType.SHEPHERD)
.showCancelButton(true)
.allowClose(false)
.steps(steps)
.options(
Map.of(
"keyboardNavigation", "false"))
.build();
```
### Handle Tour Events
```java
tour.addTourCompletedListener(event -> {
Notification.show("User finished the tour!");
});
tour.addTourCanceledListener(event -> {
Notification.show("Tour skipped.");
});
```
## Styling
Below is a sample CSS snippet that customizes the default styles of the Shepherd.js and Driver.js.
```css
.shepherd-title, .driver-popover-title {
font-size: var(--lumo-font-size-l) !important;
font-weight: var(--font-weight-bold) !important;
font-family: var(--lumo-font-family), serif !important;
}
.shepherd-text, .driver-popover-description {
padding-top: var(--lumo-space-m) !important;
padding-bottom: var(--lumo-space-m) !important;
font-size: var(--lumo-font-size-m) !important;
font-family: var(--lumo-font-family), serif !important;
}
.shepherd-button, .driver-button {
display: flex !important;
align-items: center !important;
background-color: var(--vaadin-button-primary-background) !important;
font-size: var(--vaadin-button-font-size) !important;
font-weight: var(--vaadin-button-font-weight) !important;
font-family: var(--vaadin-button-font-family), serif !important;
color: var(--lumo-body-text-color) !important;
}
.shepherd-button.shepherd-button-secondary, .driver-button.secondary {
background-color: var(--vaadin-button-background) !important;
}
```
## Engine Comparison
| Feature | Shepherd.js | Driver.js |
|----------|-------------------------------|----------------------------------|
| Best for | Highly styled, complex tours | Fast, performant, focused tours |
| Visuals | Floating cards with arrows | High-contrast overlays |
View on GitHubAntler Tour version 1.1.0
## [1.1.0] - 2026-01-21
### Fixed
- Fixed issue that is some typescript files could not get compiled when built integrated app with production mode.