Repository: kamranahmedse/driver.js Branch: master Commit: 4e4d07d481ae Files: 67 Total size: 224.4 KB Directory structure: gitextract_tn0sokzd/ ├── .github/ │ └── FUNDING.yml ├── .gitignore ├── .prettierignore ├── .prettierrc ├── docs/ │ ├── .gitignore │ ├── astro.config.mjs │ ├── package.json │ ├── src/ │ │ ├── components/ │ │ │ ├── Analytics/ │ │ │ │ ├── Analytics.astro │ │ │ │ └── analytics.ts │ │ │ ├── CodeSample.tsx │ │ │ ├── Container.astro │ │ │ ├── DocsHeader.tsx │ │ │ ├── ExampleButton.tsx │ │ │ ├── Examples.astro │ │ │ ├── FeatureMarquee.tsx │ │ │ ├── Features.astro │ │ │ ├── FormHelp.tsx │ │ │ ├── HeroSection.astro │ │ │ ├── OpenSourceLove.astro │ │ │ ├── Sidebar.astro │ │ │ ├── UsecaseItem.astro │ │ │ └── UsecaseList.astro │ │ ├── content/ │ │ │ ├── config.ts │ │ │ └── guides/ │ │ │ ├── animated-tour.mdx │ │ │ ├── api.mdx │ │ │ ├── async-tour.mdx │ │ │ ├── basic-usage.mdx │ │ │ ├── buttons.mdx │ │ │ ├── configuration.mdx │ │ │ ├── confirm-on-exit.mdx │ │ │ ├── installation.mdx │ │ │ ├── migrating-from-0x.mdx │ │ │ ├── popover-position.mdx │ │ │ ├── prevent-destroy.mdx │ │ │ ├── simple-highlight.mdx │ │ │ ├── static-tour.mdx │ │ │ ├── styling-overlay.mdx │ │ │ ├── styling-popover.mdx │ │ │ ├── theming.mdx │ │ │ └── tour-progress.mdx │ │ ├── env.d.ts │ │ ├── layouts/ │ │ │ ├── BaseLayout.astro │ │ │ └── DocsLayout.astro │ │ ├── lib/ │ │ │ ├── github.ts │ │ │ └── guide.ts │ │ └── pages/ │ │ ├── docs/ │ │ │ └── [guideId].astro │ │ └── index.astro │ ├── tailwind.config.cjs │ └── tsconfig.json ├── dts-bundle-generator.config.ts ├── index.html ├── license ├── package.json ├── readme.md ├── src/ │ ├── config.ts │ ├── driver.css │ ├── driver.ts │ ├── emitter.ts │ ├── events.ts │ ├── highlight.ts │ ├── overlay.ts │ ├── popover.ts │ ├── state.ts │ └── utils.ts ├── tests/ │ └── sum.test.ts ├── tsconfig.json └── vite.config.ts ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/FUNDING.yml ================================================ # These are supported funding model platforms github: [kamranahmedse] ================================================ FILE: .gitignore ================================================ # Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* lerna-debug.log* node_modules dist dist-ssr *.local coverage # Editor directories and files .vscode/* .history/* !.vscode/extensions.json .idea .DS_Store *.suo *.ntvs* *.njsproj *.sln *.sw? ================================================ FILE: .prettierignore ================================================ .history .vscode coverage dist node_modules ================================================ FILE: .prettierrc ================================================ { "printWidth": 120, "tabWidth": 2, "singleQuote": false, "trailingComma": "es5", "arrowParens": "avoid", "bracketSpacing": true, "useTabs": false, "endOfLine": "auto", "singleAttributePerLine": false, "bracketSameLine": false, "jsxSingleQuote": false, "quoteProps": "as-needed", "semi": true } ================================================ FILE: docs/.gitignore ================================================ # build output dist/ # generated types .astro/ # dependencies node_modules/ # logs npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* # environment variables .env .env.production # macOS-specific files .DS_Store ================================================ FILE: docs/astro.config.mjs ================================================ import { defineConfig } from "astro/config"; import tailwind from "@astrojs/tailwind"; import react from "@astrojs/react"; import mdx from "@astrojs/mdx"; import compress from "astro-compress"; // https://astro.build/config export default defineConfig({ build: { format: "file", }, markdown: { shikiConfig: { // theme: "material-theme" theme: "monokai", // theme: 'poimandres' }, }, integrations: [ tailwind(), react(), mdx(), compress({ CSS: false, JS: false, }), ], }); ================================================ FILE: docs/package.json ================================================ { "name": "driver-docs", "type": "module", "version": "0.0.1", "scripts": { "dev": "astro dev", "start": "astro dev", "build": "astro build", "preview": "astro preview", "astro": "astro" }, "dependencies": { "@astrojs/mdx": "^1.0.0", "@astrojs/react": "^3.0.0", "@astrojs/tailwind": "^5.0.0", "@types/react": "^18.2.21", "@types/react-dom": "^18.2.7", "astro": "^3.0.8", "astro-compress": "^2.0.15", "driver.js": "1.3.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-fast-marquee": "^1.6.0", "tailwindcss": "^3.3.3" }, "devDependencies": { "@tailwindcss/typography": "^0.5.9" } } ================================================ FILE: docs/src/components/Analytics/Analytics.astro ================================================ --- --- ================================================ FILE: docs/src/components/Analytics/analytics.ts ================================================ declare global { interface Window { gtag: any; fireEvent: (props: { action: string; category: string; label?: string; value?: string; }) => void; } } /** * Tracks the event on google analytics * @see https://developers.google.com/analytics/devguides/collection/gtagjs/events * @param props Event properties * @returns void */ window.fireEvent = (props) => { const { action, category, label, value } = props; if (!window.gtag) { console.warn('Missing GTAG - Analytics disabled'); return; } if (import.meta.env.DEV) { console.log('Analytics event fired', props); } window.gtag('event', action, { event_category: category, event_label: label, value: value, }); }; ================================================ FILE: docs/src/components/CodeSample.tsx ================================================ import type { Config, DriveStep, PopoverDOM } from "driver.js"; import { driver } from "driver.js"; import "driver.js/dist/driver.css"; type CodeSampleProps = { heading?: string; config?: Config; highlight?: DriveStep; tour?: DriveStep[]; id?: string; className?: string; children?: any; buttonText?: string; }; export function removeDummyElement() { const el = document.querySelector(".dynamic-el"); if (el) { el.remove(); } } export function mountDummyElement() { const newDiv = (document.querySelector(".dynamic-el") || document.createElement("div")) as HTMLElement; newDiv.innerHTML = "This is a new Element"; newDiv.style.display = "block"; newDiv.style.padding = "20px"; newDiv.style.backgroundColor = "black"; newDiv.style.color = "white"; newDiv.style.fontSize = "14px"; newDiv.style.position = "fixed"; newDiv.style.top = `${Math.random() * (500 - 30) + 30}px`; newDiv.style.left = `${Math.random() * (500 - 30) + 30}px`; newDiv.className = "dynamic-el"; document.body.appendChild(newDiv); } function attachFirstButton(popover: PopoverDOM) { const firstButton = document.createElement("button"); firstButton.innerText = "Go to First"; popover.footerButtons.appendChild(firstButton); firstButton.addEventListener("click", () => { window.driverObj.drive(0); }); } export function CodeSample(props: CodeSampleProps) { const { heading, id, children, buttonText = "Show me an Example", className, config, highlight, tour } = props; if (id === "demo-hook-theme") { config!.onPopoverRender = attachFirstButton; } function onClick() { if (highlight) { const driverObj = driver({ ...config, }); window.driverObj = driverObj; driverObj.highlight(highlight); } else if (tour) { if (id === "confirm-destroy") { config!.onDestroyStarted = () => { if (!driverObj.hasNextStep() || confirm("Are you sure?")) { driverObj.destroy(); } }; } if (id === "logger-events") { config!.onNextClick = () => { console.log("next clicked"); }; config!.onNextClick = () => { console.log("Next Button Clicked"); // Implement your own functionality here driverObj.moveNext(); }; config!.onPrevClick = () => { console.log("Previous Button Clicked"); // Implement your own functionality here driverObj.movePrevious(); }; config!.onCloseClick = () => { console.log("Close Button Clicked"); // Implement your own functionality here driverObj.destroy(); }; } if (tour?.[2]?.popover?.title === "Next Step is Async") { tour[2].popover.onNextClick = () => { mountDummyElement(); driverObj.moveNext(); }; if (tour?.[3]?.element === ".dynamic-el") { tour[3].onDeselected = () => { removeDummyElement(); }; // @ts-ignore tour[4].popover.onPrevClick = () => { mountDummyElement(); driverObj.movePrevious(); }; // @ts-ignore tour[3].popover.onPrevClick = () => { removeDummyElement(); driverObj.movePrevious(); }; } } const driverObj = driver({ ...config, steps: tour, }); window.driverObj = driverObj; driverObj.drive(); } } return (
{heading}
} {children &&Here are just a few examples; find more in the documentation.
================================================ FILE: docs/src/components/FeatureMarquee.tsx ================================================ import React from "react"; import Marquee from "react-fast-marquee"; const featureList = [ "Supports all Major Browsers", "Works on Mobile Devices", "Highly Customizable", "Light-weight", "No dependencies", "Feature Rich", "MIT Licensed", "Written in TypeScript", "Vanilla JavaScript", "Easy to use", "Accessible", "Frameworks Ready", ]; export function FeatureMarquee() { return ( ); } ================================================ FILE: docs/src/components/Features.astro ================================================ --- import { Earth, Smartphone, Settings, Feather, Code2, Layers, Keyboard } from "lucide-react"; import Container from "./Container.astro"; ---Lightweight with no external dependencies, supports all major browsers and is highly customizable.
Works in all modern browsers including Chrome, IE9+, Safari, Firefox and Opera
Works on desktop, tablets and mobile devices
Powerful API that allows you to customize it to your needs
Only 5KB minified, compared to other libraries which are typically >12KB minified
Simple to use with absolutely no external dependencies
Create powerful feature introductions for your web applications
Free for both personal and commercial use
All actions can be controlled via keyboard
Highlight any element on the page
Lightweight JavaScript library for product tours, highlights, and contextual help to guide users through your product.
With millions of downloads, Driver.js is an MIT licensed opensource project and is used by thousands of companies around the world.
{ description }
Due to its extensive API, driver.js can be used for a wide range of use cases.
Use the buttons below to show the popover.
Yet another highlight example.",
}
})
```
Focus on the input below and see how the popover is shown.
Rewritten and enhanced version of driver.js
given below are the examples of simple `highlight`
given below are the examples of simple `highlight`
You can modify the popover as well with custom CSS and JS.
Examples below show the tour usage of driver.js.
No, it is not. Tours are just one of the many use-cases. Driver.js can be used wherever you need some sort of overlay for the page; some common usecases could be: e.g. dimming the background when user is interacting with some component, using it as a focus shifter to bring user's attention to some component on page, or using it to simulate those "Turn off the Lights" widgets that you might have seen on video players online, etc.
Driver.js is written in Vanilla JS, has zero dependencies and is highly customizable. It has several options allowing you to manipulate how it behaves and also provides you the hooks to manipulate the elements as they are highlighted, about to be highlighted, or deselected.
You can install it using yarn or npm, whatever you prefer.
yarn add driver.js npm install driver.js
Or include it using CDN — put the version as driver.js@0.5 in the name
https://unpkg.com/driver.js/dist/driver.min.js
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Animi blanditiis consectetur ea eligendi id in inventore ipsa iure laudantium libero, minus molestias necessitatibus nesciunt non omnis, quasi recusandae tempore voluptates! Lorem ipsum dolor sit amet, consectetur adipisicing elit. Animi blanditiis consectetur ea eligendi id in inventore ipsa iure laudantium libero, minus molestias necessitatibus nesciunt non omnis, quasi recusandae tempore voluptates!
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Animi blanditiis consectetur ea eligendi id in inventore ipsa iure laudantium libero, minus molestias necessitatibus nesciunt non omnis, quasi recusandae tempore voluptates!
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Animi blanditiis consectetur ea eligendi id in inventore ipsa iure laudantium libero, minus molestias necessitatibus nesciunt non omnis, quasi recusandae tempore voluptates!
First -> Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequuntur dicta ipsum labore quod tempora ullam? Alias consequatur doloremque laborum maxime necessitatibus nostrum odio, officiis quibusdam veniam! Doloribus eos id quaerat.
Second -> Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequuntur dicta ipsum labore quod tempora ullam? Alias consequatur doloremque laborum maxime necessitatibus nostrum odio, officiis quibusdam veniam! Doloribus eos id quaerat.
Third -> Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequuntur dicta ipsum labore quod tempora ullam? Alias consequatur doloremque laborum maxime necessitatibus nostrum odio, officiis quibusdam veniam! Doloribus eos id quaerat.
Fourth -> Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequuntur dicta ipsum labore quod tempora ullam? Alias consequatur doloremque laborum maxime necessitatibus nostrum odio, officiis quibusdam veniam! Doloribus eos id quaerat.
Fifth -> Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequuntur dicta ipsum labore quod tempora ullam? Alias consequatur doloremque laborum maxime necessitatibus nostrum odio, officiis quibusdam veniam! Doloribus eos id quaerat.
Sixth -> Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequuntur dicta ipsum labore quod tempora ullam? Alias consequatur doloremque laborum maxime necessitatibus nostrum odio, officiis quibusdam veniam! Doloribus eos id quaerat.
Seventh -> Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequuntur dicta ipsum labore quod tempora ullam? Alias consequatur doloremque laborum maxime necessitatibus nostrum odio, officiis quibusdam veniam! Doloribus eos id quaerat.
Eighth -> Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequuntur dicta ipsum labore quod tempora ullam? Alias consequatur doloremque laborum maxime necessitatibus nostrum odio, officiis quibusdam veniam! Doloribus eos id quaerat.
Ninth -> Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequuntur dicta ipsum labore quod tempora ullam? Alias consequatur doloremque laborum maxime necessitatibus nostrum odio, officiis quibusdam veniam! Doloribus eos id quaerat.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Animi blanditiis consectetur ea eligendi id in inventore ipsa iure laudantium libero, minus molestias necessitatibus nesciunt non omnis, quasi recusandae tempore voluptates!
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Animi blanditiis consectetur ea eligendi id in inventore ipsa iure laudantium libero, minus molestias necessitatibus nesciunt non omnis, quasi recusandae tempore voluptates!
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Animi blanditiis consectetur ea eligendi id in inventore ipsa iure laudantium libero, minus molestias necessitatibus nesciunt non omnis, quasi recusandae tempore voluptates!
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Animi blanditiis consectetur ea eligendi id in inventore ipsa iure laudantium libero, minus molestias necessitatibus nesciunt non omnis, quasi recusandae tempore voluptates!
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Animi blanditiis consectetur ea eligendi id in inventore ipsa iure laudantium libero, minus molestias necessitatibus nesciunt non omnis, quasi recusandae tempore voluptates!
Powerful, highly customizable vanilla JavaScript engine to drive user's focus on the page
No external dependencies, light-weight, supports all major browsers and highly customizable