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 🙏

© 2026 – Pkg Stats / Ryan Hefner

dactylo

v0.3.0

Published

Typewriter effect in JS using CSS.

Downloads

428

Readme

dactylo

Typewriter effect in JS using CSS.

Dactylo v0.3.0

By Rémino Rem
https://remino.net/

Docs | Code Repo | npm Package



Installation

npm install dactylo

Back to top


Usage

Apply the effect automatically:

import 'dactylo/auto'

Or call it yourself:

import { dactylo } from 'dactylo'

dactylo(document.body)

Or configure the groups yourself:

dactylo({
    root: document.querySelector('main'),
    caret: '_',
    prompt: '>',
    startDelay: 600,
    groups: [
        {
            sels: 'h1, h2',
            duration: 600,
        },
        {
            sels: 'p, li',
            interval: 18,
            parallel: true,
        },
    ],
})

Back to top


Options

  • caret: character shown after the typed output. Default: _.
  • prompt: character shown before typing starts. Default: >.
  • root: parent node to search. Default: document.body.
  • showFinalCaret: keep the caret visible after the final typed character. Default: false.
  • startDelay: milliseconds to show the prompt before typing starts. Default: 600.
  • groups: selector groups to type. By default, headings run first in parallel, then body text runs in parallel, then links and controls run in parallel.

Each group accepts:

  • sels: selector string or array of selector strings.
  • notIn: parent selectors to exclude.
  • duration: total milliseconds for each element in the group. Default: 500.
  • interval: milliseconds per character. Overrides duration when set.
  • parallel: type all matching elements at once instead of in series.

Add data-dactylo-skip to any element that should not be processed.

Back to top


API

const controller = dactylo(document.body)

controller.state
controller.pause()
controller.play()
controller.playPause()
controller.end()
controller.stop()
controller.reset()

await controller.finished

The finished promise resolves after all groups complete. The pause() and play() methods control an active run, while playPause() toggles between them. The state property is playing, paused, stopped, or ended. The end() method skips to the completed state. The reset() method cancels the run and returns controlled elements to their starting state with no typed text visible. The stop() method pauses first, then resets. Calling play() after reset() or stop() starts the same target again.

Dactylo dispatches bubbling custom events on document.documentElement: dactylo:start, dactylo:play, dactylo:pause, dactylo:reset, dactylo:stop, and dactylo:end. Each event includes the controller and current state in event.detail.

Back to top


Development

npm install
npm run dev
npm run build

The library source lives in src/lib. The documentation site is built with Astro and lives in the rest of src.

Release automation is available through release-it. A release runs checks, builds, publishes the npm package, pushes the release commit and tag, creates a GitHub release, uploads dist/*, then publishes docs:

npm run release:dry-run
npm run release

If docs publishing fails after the package release, rerun it directly:

npm run docs:publish

Before running a real release, make sure RELEASE_IT_GITHUB_TOKEN is set and npm whoami --registry https://registry.npmjs.org/ passes. Release-it prompts for an npm OTP when npm requires one.


Contributing

  1. Fork the repository.
  2. Create a feature branch: git checkout -b feature/amazing-feature.
  3. Make your changes.
  4. Run npm run build.
  5. Commit, push, and open a pull request.

Issues and ideas are welcome.

Back to top


Licence

Licensed under the ISC licence. See LICENSE.md.

Back to top