Giter VIP home page Giter VIP logo

focus-hunter's Introduction

Bundle Size Badge

Purpose

Focus trapping made easy for things like Dialogs.

Why?

Because focus trapping sucks. But its a necessary evil.

Demo

https://konnorrogers.github.io/focus-hunter

Prior Art

  • Focus Trap was attempted to be used, but was quite big (~5kb) and didn't handle multiple levels of shadow DOM. It is however a big inspiration for this library.

  • This solution has been largely extracted from Shoelace

Differences from Focus Trap

Focus Hunter doesn't aim to do everything. It tries its best to keep a small minimal API and get out of your way. This is reflected in bundle size.

focus-hunter is ~1.5kb minified + gzipped. focus-trap is ~5.5kb minified + gzipped.

Installation

npm install focus-hunter

Adding a trap

// Create a trap
const trap = new Trap({ rootElement: document.querySelector("my-trap") })

// Start the trap
trap.start()

// Stop the trap
trap.stop()

All Options

const trap = new Trap({
  rootElement,
  preventScroll, // Passed to `element.focus({ preventScroll })` for programmatically focused elements
})

Multiple Traps

Focus Trap is allowed to have multiple traps. It keeps track of the stacks using window.focusHunter.trapStack which is implemented via a Set.

There is also a stack of rootElements at window.focusHunter.rootElementStack

There 2 stacks are checked when you call trap.start() to ensure the rootElement isn't already being trapped and that the trap isn't already active.

window.focusHunter.trapStack // => Set
window.focusHunter.rootElementStack // => Set

A note on iframes

While the focus trap can get to an <iframe> it cannot find elements within a cross origin iframe so they are excluded from the focus trap.

Differences from Shoelace

This library is largely me experimenting with generators. Beyond internal implementation details, here are some differences:

- // Elements with aria-disabled are not tabbable
- if (el.hasAttribute('aria-disabled') && el.getAttribute('aria-disabled') !== 'false') {
-   return false;
- }

The above was removed from exports/tabbable.js because aria-disabled elements are tabbable.

+  // Anchor tags with no hrefs arent focusable.
+  // This is focusable: <a href="">Stuff</a>
+  // This is not: <a>Stuff</a>
+  if ("a" === tag && el.getAttribute("href") == null) return false

While not a big deal, anchor elements without an href attribute were getting tripped up. So we added a check to make sure it has an href.

+iframe, object, embed

The additional elements were found here: https://github.com/gdkraus/accessible-modal-dialog/blob/d2a9c13de65028cda917279246346a277509fda0/modal-window.js#L38

Structure

exports/ is publicly available files internal/ is...well...internal.

exports and internal shouldn't write their own .d.ts that are co-located.

types/ is where you place your handwritten .d.ts files.

focus-hunter's People

Contributors

konnorrogers avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.