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

keynav

v0.4.0

Published

Keyboard navigation for websites and web-applications to speed up the professionals work-flow.

Downloads

2

Readme

Keyboard navigation

Keyboard navigation for websites and web-applications to speed up the professionals work-flow.

Installing

Install with nodejs:

npm i keynav

Getting Started

Import:

import { keynav as keynav, Scope as Scope } from 'keynav';

Require:

const { keynav: keynav, Scope: Scope } = require('keynav');

Basic example:

// 'm' super-key and query selector to look for focusable elements in the menu
let menu = new Scope('m', '#menu');
keynav.addScope(menu);

The module is designed to extend the browsers existing tab and shift+tab focus navigation. You can quickly move the focus to an element by pressing a super-key (i.e: 'm' for menu) and a target-key (i.e: 'r' for 'Reports' menu item) so no need to tab over all the intermediate elements.

In order to search focusable elements you need to add scopes. A scope is basically a css selector to search in the focusabe dom nodes when pressing the super-key:

let menu = new Scope('m', '#menu');
keynav.addScope(menu);
let content = new Scope('c', '#content');
keynav.addScope(content);

The 'document' string is not a valid css selector however you can set this exceptional argument for the scope:

...
new Scope('f', 'document');
...

By default the module tries to find out the target-key (i.e: 'r' for 'Reports' menu item) but you can also set a static value in the data-keynav-key attribute:

<div data-keynav-key="r"></div>

or you can overwrite the callback:

...
myScope.fnGetTargetKey = (element) => {
    return myCustomTargetChar;
};
...

By default the module tries to find out which elements are focusable inside a scope but you can overwrite it:

...
myScope.clearTargetSelectors();
myScope.addTargetSelector('.menuItem');
myScope.addTargetSelector('input[type="text"]');
myScope.removeTargetSelector('input[type="text"]');
...

The default timeout while the modul is expecting the target-key (i.e: 'r' for 'Reports' menu item) after pressing the super-key (i.e: 'm' for menu) is 2000 milliseconds but you can overwrite it:

...
keynav.listeningTimeMS = 5000;
...

By default the module is not accepting keypresses when the focus is on an element which does, but you can overwrite it:

keynav.clearNotReceivingSelectors();
keynav.addNotReceivingSelector('input');
keynav.addNotReceivingSelector('[contenteditable="true"]');
keynav.removeNotReceivingSelector('[contenteditable="true"]');

The module works fine when you remove an element from the document which has scopes with matching selectors however you can remove a scope directly:

keynav.removeScope('f');

By default the module sorts focusable elements by tabindex but you can overwrite it:

...
myScope.fnSortPossibleTargetElements = (a,b) => {
    // your logic
};
...