3.0.5 • Published 7 months ago

@adoratorio/medusa v3.0.5

Weekly downloads
3
License
MIT
Repository
github
Last release
7 months ago

Medusa

A lightweight utility for managing multiple IntersectionObserver instances with TypeScript support.

Installation

npm install @adoratorio/medusa

Usage

import Medusa from '@adoratorio/medusa';

const medusa = new Medusa({ debug: true });

Configuration

MedusaOptions

ParameterTypeDefaultDescription
observersMedusaObserverConfig[][]Array of observer configurations
debugbooleanfalseEnable console debugging

Observer Configuration

interface MedusaObserverConfig {
  id: string;
  root?: Element | null;
  rootMargin?: string;
  threshold?: number | number[];
  nodes?: Element | Element[];
  mode?: MODE;
  emit?: boolean;
  callback?: MedusaCallback;
}

type MedusaCallback = (
  entry: IntersectionObserverEntry,
  observer: IntersectionObserver | null,
) => void;

Configuration Options

ParameterTypeDefaultDescription
idstringrequiredUnique observer identifier
rootElementnullViewport element for intersection checking
rootMarginstring'0px'Margin around root (CSS format)
thresholdnumber\|number[]0Intersection threshold(s)
modeMODEDEFAULTObserver behavior mode
emitbooleanfalseEmit custom events on intersection
callbackMedusaCallbackundefinedIntersection callback function

Available Modes

enum MODE {
  DEFAULT = 'DEFAULT',    // Trigger on every intersection
  ONCE = 'ONCE',          // Trigger only once
  BYPIXELS = 'BYPIXELS',  // Trigger per pixel in viewport
}

Methods

Adding Observers

// Add single observer
medusa.addObserver({
  id: 'myObserver',
  threshold: 0.5,
  callback: (entry, observer) => console.log('Intersecting:', entry.isIntersecting),
});

// Add multiple observers
medusa.addObserver([
  { id: 'observer1', mode: Medusa.MODE.ONCE },
  { id: 'observer2', mode: Medusa.MODE.BYPIXELS },
]);

Observing Elements

// Observe single element
const element = document.querySelector('.target');
medusa.observe('myObserver', element);

// Observe with custom callback
medusa.observe('myObserver', element, (entry, observer) => {
  console.log('Custom callback for this element');
});

// Observe multiple elements
const elements = document.querySelectorAll('.targets');
medusa.observe('myObserver', Array.from(elements));

Management Methods

// Get observer instance
const observer = medusa.getObserver('myObserver');

// Clear specific observer
medusa.clearObserver('myObserver');

// Clear all observers
medusa.clearAllObservers();

// Remove specific observer
medusa.removeObserver('myObserver');

// Remove all observers
medusa.removeAllObservers();

// Unobserve elements
medusa.unobserve('myObserver', element);

// Destroy instance
medusa.destroy();

Events

When emit: true is set, Medusa emits custom events on intersecting elements:

// Event name format: medusa-${observerId}
element.addEventListener('medusa-myObserver', (event: CustomEvent) => {
  const entry: IntersectionObserverEntry = event.detail;
  console.log('Intersection ratio:', entry.intersectionRatio);
});

Event Details

The event.detail contains the IntersectionObserverEntry:

{
  time: number;
  rootBounds: DOMRectReadOnly;
  boundingClientRect: DOMRectReadOnly;
  intersectionRect: DOMRectReadOnly;
  isIntersecting: boolean;
  intersectionRatio: number;
  target: Element;
}

TypeScript Support

Medusa is written in TypeScript and includes full type definitions:

import type {
  MedusaOptions,
  MedusaObserverConfig,
  MedusaCallback,
} from '@adoratorio/medusa';
3.0.4

7 months ago

3.0.3

7 months ago

3.0.2

7 months ago

3.0.1

7 months ago

3.0.5

7 months ago

3.0.0

8 months ago

2.1.0

3 years ago

2.0.1

4 years ago

2.0.0

4 years ago

1.0.3

4 years ago

1.0.2

5 years ago

1.0.1

5 years ago

1.0.0

5 years ago

0.1.6

6 years ago

0.1.5

6 years ago

0.1.4

6 years ago

0.1.3

6 years ago

0.1.2

6 years ago

0.1.1

6 years ago

0.1.0

6 years ago

0.0.9

6 years ago

0.0.8

6 years ago

0.0.7

7 years ago

0.0.6

7 years ago

0.0.5

7 years ago

0.0.4

7 years ago

0.0.3

7 years ago

0.0.2

7 years ago

0.0.1

7 years ago