npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@adoratorio/hades

v1.0.15

Published

A smooth scrollbar based on Hermes, scroll down 'till hell

Downloads

158

Readme

Hades

A smooth scrollbar with different renderers like virtual or native, and including a modern renderer using scrollTo (Inspired from Lenis)

Installation

Hades is written in typescript and available as npm package with the alongside types definitions. So install as always

 npm install --save @adoratorio/hades

Usage

Then it can be required or imported as module

import Hades from '@adoratorio/hades';

From now on you can instanciate and register plugins to handle the rendering of the amount with different teqniques or to add functionalities. Plugins stucture is explained later.

For the plugins they can also be imported singularly as modules from the plguins folder and then registered using the registerPlugin method.

import { VirtualRender } from '@/adoratorio/hades/plugins';
hades.registerPlugin(new VirtualRender({ /* ... plugin options */ }));

Internally Hades is using other Adoratorio packages like Hermes for scroll event handling and normalization and Aion for requestAnimationFrame management so also those packages documentations are worth to check out.

Available options

Hades accepts in the constructor an option object with the following possible props.

| parameter | type | default | description | | :- | :-: | :-: | :- | | root | HTMLElement \| Window | document.body | The DOM element or window on which the event listeners for Hermes will be atached to | | easing | Object | { duration: 1000, mode: Hades.EASING.LINEAR } | An object with the duration and a function used to bend the progress over time to match a curve and create more natural scrolling inertia.The function is called with a single parameter being the time normalized in relation with the total duration (currentTime / totalDuration) so the value is going from 0 to 1. Eg. for a linear time function(t) { return t; }. It's always a advised to use a linear-in eased-out timing function to avoid weird visual artifacts when the scroll starts. Some enumerators are exposed, just for having a bunch of useful functions out of the box.If you wish BezierEasing from bezier-easing npm package can be used as easing function. | | autoplay | boolean | true | Autostart the rendering cycle or not. | | aion | Aion | null | null | The Aion instance to use within to perform animations and per-frame operations. If passed this instance will be used, instead a new one is created. | | touchMultiplier | number | 1.5 | A multiplier for calculating the delta of touches and the speed, passed to Hermes. Reasonable values are between 0.8 and 3 but it's just a suggestion. Higher values will increase the feeling of slippery touch effect. | | smoothDirectionChange | boolean | false | If true when the scroll direction change the easing setted is kept to help the transition between one direction and the other to feel more inertia. On really smooth easing and high durations this can feel a bit awkward. If false an immediate direction change is applied. | | scale | number | 1 | The multiplier used to scale the event delta for all the events | | threshold | Vec2 | { x: 0, y: 3 } | The minimum amount of unsigned delta that will trigger the scroll event | | invert | boolean | false | If true x and y delta values will be inverted so you can scroll horizontally by moving fingers vertically |

APIs

Public Methods

scrollTo()

Allow to update the internal amount to specific values immediately or during time

hades.scrollTo(position : Partial<Vec2>, duration : number, prevent : boolean = false)

Parameters

| parameter | required | description | |:---|:---:|:---| | position | Partial<Vec2> | The x and y value to scroll to | | duration | number | The total duration in ms used to reach the position values, 0 for immediate update | | prevent | boolean | If true plugins scrollTo to won't be called |

registerPlugin()

Register a plugin inside the current Hades instance. Return a string with the registration id, useful for unregister

hades.registerPlugin(plugin : HadesPlugin) : string

Parameters

| parameter | required | description | |:---|:---:|:---| | plugin | HadesPlugin | The instance of the plugin to register |

registerPlugins()

Register multiple plugins inside the current Hades instance. Return an array of strings with the registration ids in positional corrispondence with the provided plugins array

hades.registerPlugins(plugin : Array<HadesPlugin>) : Array<string>

Parameters

| parameter | required | description | |:---|:---:|:---| | plugin | HadesPlugin | The instance of the plugin to register |

unregisterPlugin()

Remove a plugin from the current Hades instance using the registration id of the plugin. Return true if the plugin was found and unregistered

hades.unregisterPlugin(id : string) : boolean

Parameters

| parameter | required | description | |:---|:---:|:---| | plugin | HadesPlugin | The instance of the plugin to register |

getPlugin()

Get instance of a registerd plugin using his name

hades.getPlugin(name : String) : HadesPlugin | undefined

Parameters

| parameter | required | description | |:---|:---:|:---| | name | string | The name of the plugin to retrive |

play()

Allow Hades to react to events and update the internal amounts correctly

hades.play()

pause()

Prenvent Hades to react to events until the play is called again (listeners won't be detached)

hades.pause()

destroy()

Unregister all the internal plugins and detach all the events, then remove all internal references to other tools

hades.destroy()

Instance Properties

The Hades instance exposes two main properties:

amount

• Type: interface Vec2 { x:number, y:number } With x and y props exposes the current scroll amount, updated frame-by-frame.

velocity

• Type: interface Vec2 { x:number, y:number } With x and y props exposes the current scroll speed, updated frame-by-frame.

Instance Getters

direction

• Type number Get the current direction of the scroll.

  • Page moving up is 1
  • Page moving down is -1.

Enumerators are also exposed with Hades.DIRECTION.UP, Hades.DIRECTION.DOWN and an inert enum is exposed Hades.DIRECTION.INITIAL.

root

• Type HTMLElement | Window Get the current root node on which the events are attached to

still

• Type boolean Indicates if the update is currently changing or if it's still

Instance Setters

easing

• Type object Set the easing object. The object contain two params:

  • the easing mode
  • the easing duration

Use the constructor param for the documentation reference of both params

touchMultiplier

• Type number Set the touch multiplier passed to Hermes instance.

smoothDirectionChange

• Type boolean Set whether to use smooth direction change or not.

invert

• Type boolean Set whether to invert the scrollin girections between x and y.

Plugins

Like we said Hades on its own now doesen't render any scroll. You need to use one of the default plugins to render the scroll or write one on your own.

A Plugin should implement the HadesPlugin interface thath is composed by the name of the plugin as a string and some methods thath you can hook into to create custom logic

register()

This hook is called when the plugin is register, as first param you will reiceve the Hades instance the plugin has been registered on

public register(context : Hades) : void

wheel()

This hooek is called whenever a scroll event is fired (can be any Hermes event like wheel or keydown) as firts param you'll reiceve the context (same as register) and as second the HermesEvent thath caused the call. For more info about HermesEvent refer to the Hermes documentation.

You can optionally return a boolean value. If true is returned then Hades will discard the event and the rest of the logic will be prevented.

public wheel(context : Hades, event : HermesEvent) : boolean

preScroll()

This hook is called if the scroll event is processed before any of the Hades logic is applied.

public preScroll(context : Hades, event : HermesEvent) : void

scroll()

This hook is called if the scroll event is processed after any of the Hades logic is applied. You can manipulate the final amount of the scroll to be passed to the next frame using the internalTemp : Vec2 property of the context

public scroll(context : Hades, event : HermesEvent) : void

preFrame()

This hook is called at the start of the frame before applying easing logic on scroll values

public preFrame(context : Hades) : void

render()

This hook is the core one and is called after all the easing have been applied and here the final values are available to be applied and rendered

public render(context : Hades) : void

destroy()

This hook is called when destroy is called the main instance of Hades and should be used to remove all listeners created and to clean up the plugin internal references.

public destroy(context : Hades) : void

scrollTo()

This hook is called when scrollTo is called on the main Hades instance and will reiceve the context as well as the position and the duration passed to the original metho call.

public scrollTo(context : Hades, position : Vec2, duration : number) : void