Skip to content

Lightweight onboarding library with spotlight highlighting and smooth animations

License

Notifications You must be signed in to change notification settings

ervan0707/guida.js

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Guida.js

npm version npm downloads Bundle Size GitHub Workflow Status TypeScript MIT License Test Coverage Dependencies

A modern, lightweight onboarding library with spotlight highlighting and smooth animations. Perfect for guiding users through your application with style.

Guida.js Demo

Features

  • Spotlight Highlighting - Elegantly highlight elements with a smooth clip-path effect
  • Streamlined UI Design - Clean, single-row button layout with Previous, Next, Skip, and Close controls
  • Dynamic Positioning - Accurate vertical centering for left/right positioned tooltips
  • Customizable Border Radius - Create rounded spotlight effects with configurable corner radius
  • Responsive Design - Works perfectly on desktop, tablet, and mobile devices
  • Beautiful Animations - Smooth transitions and hover effects
  • Dark Mode Support - Automatically adapts to user's theme preference
  • Accessibility - Support for high contrast mode and reduced motion
  • TypeScript - Fully typed for better developer experience
  • Lightweight - Minimal bundle size with zero dependencies
  • Easy to Use - Simple API with sensible defaults

Installation

npm install guida.js

Quick Start

import { Guida } from "guida.js";

const onboarding = new Guida({
  steps: [
    {
      target: "#welcome-button",
      title: "Welcome!",
      description: "Click here to get started with our app.",
      position: "bottom",
      action: "click",
      highlight: true,
      skipable: false,
      spotlight: {
        borderRadius: 12,
        padding: 8,
      },
    },
    {
      target: "#settings-panel",
      title: "Settings",
      description: "Customize your experience here.",
      position: "left",
      action: "observe",
      highlight: true,
      skipable: true,
      spotlight: {
        borderRadius: 16,
        padding: 12,
      },
    },
  ],
  // Global spotlight defaults
  spotlight: {
    borderRadius: 8,
    padding: 8,
    backdropOpacity: 50,
  },
});

// The onboarding will start automatically for new users
// You can also start it manually:
onboarding.start();

API Reference

Constructor Options

interface OnboardingConfig {
  steps: OnboardingStep[];
  storageKey?: string; // Default: 'guida.js-completed'
  autoStart?: boolean; // Default: true
  startDelay?: number; // Default: 1000ms
  spotlight?: {
    borderRadius?: number; // Default: 8px
    padding?: number; // Default: 8px
    backdropOpacity?: number; // Default: 50 (0-100%)
  };
  customClasses?: {
    overlay?: string;
    backdrop?: string;
    tooltip?: string;
    highlight?: string;
  };
  callbacks?: {
    onStart?: () => void;
    onComplete?: () => void;
    onClose?: () => void;
    onStepChange?: (stepIndex: number, step: OnboardingStep) => void;
  };
}

Step Configuration

interface OnboardingStep {
  target: string; // CSS selector
  title: string;
  description: string;
  position: "top" | "bottom" | "left" | "right";
  action: "click" | "observe";
  highlight: boolean;
  skipable: boolean;
  spotlight?: {
    borderRadius?: number; // Custom border radius for this step
    padding?: number; // Custom padding for this step
  };
}

Methods

// Control the onboarding flow
onboarding.start(); // Start the onboarding
onboarding.nextStep(); // Go to next step
onboarding.previousStep(); // Go to previous step
onboarding.goToStep(index); // Go to specific step
onboarding.complete(); // Complete the onboarding
onboarding.close(); // Close the onboarding
onboarding.restart(); // Restart from beginning

// State management
onboarding.isActive(); // Check if currently active
onboarding.isCompleted(); // Check if completed
onboarding.reset(); // Reset completion status
onboarding.getCurrentStep(); // Get current step info

// Event handling
onboarding.on("start", callback);
onboarding.on("complete", callback);
onboarding.on("close", callback);
onboarding.on("stepChange", callback);

Customization

Tooltip Design

Guida.js features a clean, minimalist tooltip design with a streamlined button layout:

  • Single-row controls: All navigation buttons (Previous, Next, Skip, Close) are arranged in a single row at the bottom
  • Smart button visibility: Previous button only appears on non-first steps, Next button only appears for observation steps
  • Compact progress indicator: Small pill-shaped step counter (e.g., "2 of 5") in the header
  • Dynamic positioning: Tooltips automatically measure their content height for perfect vertical centering
// The tooltip automatically adapts its button layout based on step configuration
const steps = [
  {
    target: "#first-element",
    title: "Welcome",
    description: "This is the first step.",
    position: "bottom",
    action: "observe", // Shows "Next" button
    skipable: true, // Shows "Skip" button
    // Result: Shows [Next] [Skip] [Close] buttons
  },
  {
    target: "#interactive-element",
    title: "Click Here",
    description: "Click this button to continue.",
    position: "left",
    action: "click", // No "Next" button (waits for user click)
    skipable: false, // No "Skip" button
    // Result: Shows [Previous] [Close] buttons only
  },
];

Positioning Notes:

  • left and right positioned tooltips are automatically vertically centered relative to the target element
  • top and bottom positioned tooltips are horizontally centered
  • All tooltips include arrows pointing to their target elements

Spotlight Effects

Customize the spotlight highlighting with border radius and padding options:

// Global spotlight configuration
const onboarding = new Guida({
  steps: [...],
  spotlight: {
    borderRadius: 16, // Rounded corners for all spotlights
    padding: 12,      // Extra space around highlighted elements
    backdropOpacity: 60 // 60% dark backdrop (applies to all steps)
  }
});

// Per-step spotlight customization (border radius and padding only)
const steps = [
  {
    target: "#rounded-card",
    title: "Rounded Card",
    description: "This card gets a custom rounded spotlight.",
    position: "bottom",
    action: "observe",
    highlight: true,
    skipable: false,
    spotlight: {
      borderRadius: 20, // Overrides global setting
      padding: 16       // Overrides global setting
    }
  },
  {
    target: "#sharp-button",
    title: "Sharp Button",
    description: "This button gets a sharp spotlight.",
    position: "top",
    action: "click",
    highlight: true,
    skipable: true,
    spotlight: {
      borderRadius: 0, // Sharp corners
      padding: 8       // Minimal padding
    }
  }
];

Spotlight Options:

  • borderRadius: Corner radius in pixels (0 for sharp corners, higher values for more rounded)
  • padding: Extra space around the highlighted element in pixels
  • backdropOpacity: Background darkness as a percentage (0-100, global setting only)

Visual Examples:

// Light, pill-shaped spotlight
spotlight: { borderRadius: 50, padding: 6 }
// Note: backdropOpacity is set globally

// Standard card-like spotlight
spotlight: { borderRadius: 12, padding: 16 }

// Sharp, minimal spotlight
spotlight: { borderRadius: 0, padding: 4 }

// Highly rounded, spacious spotlight
spotlight: { borderRadius: 24, padding: 20 }

Custom Styling

You can customize the appearance by adding your own CSS classes:

const onboarding = new Guida({
  steps: [...],
  customClasses: {
    tooltip: 'my-custom-tooltip',
    highlight: 'my-custom-highlight'
  }
})
.my-custom-tooltip {
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  color: white;
}

.my-custom-highlight::before {
  border-color: #ff6b6b;
  box-shadow: 0 0 0 2px rgba(255, 107, 107, 0.3);
}

Event Handling

const onboarding = new Guida({
  steps: [...],
  callbacks: {
    onStart: () => console.log('Onboarding started'),
    onStepChange: (index, step) => {
      console.log(`Now on step ${index + 1}: ${step.title}`)
      // Track analytics
      analytics.track('onboarding_step_viewed', {
        step_index: index,
        step_title: step.title
      })
    },
    onComplete: () => {
      console.log('Onboarding completed!')
      // Show celebration or redirect user
    }
  }
})

// Or use event listeners
onboarding.on('stepChange', ({ stepIndex, step }) => {
  updateProgressBar(stepIndex / steps.length)
})

Advanced Usage

Conditional Steps

const steps = [
  {
    target: "#basic-feature",
    title: "Basic Feature",
    description: "Everyone sees this step.",
    position: "bottom",
    action: "observe",
    highlight: true,
    skipable: false,
  },
];

// Add advanced steps for premium users
if (user.isPremium) {
  steps.push({
    target: "#premium-feature",
    title: "Premium Feature",
    description: "Only premium users see this!",
    position: "top",
    action: "click",
    highlight: true,
    skipable: true,
  });
}

const onboarding = new Guida({ steps });

Multiple Onboarding Flows

// Different flows for different user types
const adminOnboarding = new Guida({
  steps: adminSteps,
  storageKey: "admin-guida-completed",
});

const userOnboarding = new Guida({
  steps: userSteps,
  storageKey: "user-guida-completed",
});

// Start appropriate flow based on user role
if (user.role === "admin") {
  adminOnboarding.start();
} else {
  userOnboarding.start();
}

Integration with Router

// React Router example
const onboarding = new Guida({
  steps: [...],
  callbacks: {
    onStepChange: (index, step) => {
      // Navigate to appropriate page for each step
      if (step.target.includes('dashboard')) {
        navigate('/dashboard')
      } else if (step.target.includes('settings')) {
        navigate('/settings')
      }
    }
  }
})

Build Output

This library is built to support multiple module systems:

  • dist/index.js - UMD bundle for browser <script> tags and CommonJS environments
  • dist/index.esm.js - ES Module bundle for modern bundlers (Webpack, Vite, Rollup) and import statements
  • dist/index.d.ts - TypeScript definitions

The ESM build allows for better tree-shaking and is preferred by modern development tools. Most bundlers will automatically choose the appropriate format based on your package.json configuration.

Development

# Clone the repository
git clone https://github.com/ervan0707/guida.js.git
cd guida.js

# Install dependencies
npm install

# Start development mode (builds library + runs example with hot reload)
npm run dev

# Build the library for production
npm run build

# Run only the example project
npm run example

The npm run dev command will:

  • Build the library in watch mode (automatically rebuilds on changes)
  • Start the example server with hot reload
  • Both processes run in parallel for seamless development

Testing

# Run tests in watch mode (recommended during development)
npm test

# Run tests once and exit
npm run test:run

# Run tests with coverage report
npm run test:coverage

# Open Vitest UI for interactive testing
npm run test:ui

The test suite includes unit tests, integration tests, and achieves high code coverage (90%+).

Contributing

Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

Lightweight onboarding library with spotlight highlighting and smooth animations

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •