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 🙏

© 2025 – Pkg Stats / Ryan Hefner

@zaybu/focusly

v0.0.7

Published

Intuitive, elegant keyboard navigation for Angular — built with Signals for instant reactivity.

Readme

🎯 Focusly – Intuitive, Elegant Keyboard Navigation for Angular

Focusly is a lightweight Angular library that brings intuitive, keyboard-driven navigation to web applications.

It lets users move effortlessly between interactive elements—inputs, dropdowns, buttons, or any focusable control—using familiar keys like ↑ ↓ ← →, Home, End, and Page Up / Page Down.

Each Focusly Group acts as an independent navigation zone, so multiple grids or forms on the same page can be navigated separately and respond logically to user intent.

It provides an elegant way to define how users move between interactive controls — such as text boxes, dropdowns, or buttons — using keyboard shortcuts.
Focusly was designed to make keyboard navigation predictable, accessible, and fast, even in complex data entry UIs.


✨ Features

  • 🚀 Navigate grids, tables, or forms entirely via keyboard
  • 🎯 Scoped focus groups so each panel or table behaves independently on a single page
  • 🪄 Elegant and simple declarative API using Angular directives
  • 🧩 Works with any focusable element (<input>, <select>, <button>, etc.)
  • 🧠 Easily extendable to custom components
  • ♿ Built for accessibility and developer simplicity
  • ⚡ Built with Angular signals for instant reactivity — no manual change detection
  • ⚡ Works with provideZonelessChangeDetection() - ensures optimal performance in zone-less Angular apps
  • 🔄 Fully reactive and framework-native (no DOM listeners or external deps)
  • 🪶 Small, simple, and zero-dependency

🧠 Concept

Each focusable element declares:

  • A group – to separate independent navigation contexts (e.g., two tables)
  • A row and column – to describe its position within that group

Focusly tracks the user’s current focus position and responds to keyboard events to move to the appropriate neighbour.


📦 Installation

npm install @zaybu/focusly

📝 Example Usage

  <select
      focusly
      [focuslyGroup]="1"
      [focuslyRow]="2"
      [focuslyColumn]="3"
      >
      <option>Buy</option>
      <option>Sell</option>
  </select>

⚡ Keyboard Navigation in Action

Experience Focusly in motion — navigate complex Angular tables and forms using only your keyboard.
Use Alt + Arrow Keys to move focus, and Enter to trigger contextual actions.

🧩 Extensible by Design — Custom Component Integration

Unlike many keyboard-navigation libraries that hard-code focus behaviour in a central service, Focusly is built to be truly extensible. Each custom UI component can declare its own Focusly-aware directive, cleanly encapsulating how focus is set, managed, and released.

This means you can integrate complex third-party components (like Angular Material, PrimeNG, or NgZorro) without modifying Focusly’s core logic.

Focusly is built on a single, powerful base directive that provides all core keyboard-navigation behaviour—movement logic, focus tracking, directional traversal, and accessible focus management. Support for UI libraries such as NG-ZORRO, Angular Material, or any other component framework is achieved through lightweight extension directives that simply override a few optional hooks.

Unlike other keyboard-navigation solutions that tightly couple navigation logic to specific components—or require you to write large amounts of boilerplate—Focusly keeps the API clean and the implementation surface tiny. The benefits are substantial:

  • Consistent behaviour across all toolkits and components
  • No duplication of navigation logic
  • Simple, maintainable extensions for toolkit-specific behaviour
  • Small footprint, big flexibility—you can support new UI libraries in minutes

This design allows Focusly to be both highly opinionated in the places that matter (accessibility, deterministic movement, and predictable focus handling), and highly extensible wherever component libraries differ.

🚀 Quick Links

Try Focusly, explore the code, or join the discussion:

🚀 Live Demo (StackBlitz) https://stackblitz.com/edit/focusly-demo

📦 npm Package https://www.npmjs.com/package/@zaybu/focusly

💻 GitHub Repository https://github.com/mad-vx/focusly

🌐 GitHub Pages https://mad-vx.github.io/focusly/

💡 Comments, Suggestions & Questions (GitHub Discussions) https://github.com/mad-vx/focusly/discussions