UNPKG

react-focus-flow

Version:

React components to define isolated focus flows

67 lines (46 loc) 2.12 kB
# React Focus Flow React components to define isolated focus flows. Especially useful for modals or any other scenario where you might not want global tabindex behavior. Basically local tabindex. ## Usage ```javascript import React from 'react'; import { FocusFlow, Focusable } from 'react-focus-flow'; const Other = () => ( <Focusable index={3}> <div tabindex="0">nested component at index 3</div> </Focusable> ) export default class SomeModal extends React.Component { render() { return ( <FocusFlow> <Focusable index={1}> <input placeholder="first" /> </Focusable> <Focusable autoFocus index={2}> <button>second</button> </Focusable <Other /> </FocusFlow> ); } } ``` Behaves pretty much like tabindex. - Works with nested components. A `<Focusable />` component will register itself with the nearest ancestor `<FocusFlow />` component - disabled elements will be skipped - Focus flow will dynamically update itself when a `<Focusable />` component mounts and unmounts - no need to rerender entire `<FocusFlow/ >` - When no element is in focus but the flow is still active, tab will bring focus to whatever the last focused element was before blur ## \<FocusFlow /\> Marks the root of a focus flow. When active, focus will be restricted to this subtree. ### Props **-active? = true** Indicates if the flow is active i.e., should tab order be confined to this FocusFlow. Easy way to switch behavior on/off. ## \<Focusable /\> Defines a focusable element in the flow. NOTE: this component does not wrap it's children in any extraneous elements - only what is passed as a child will render. ### Props **index** Required. Indicates the order in which this `<Focusable />` should be focused. Basically tabindex. **autoFocus** If you want an element to autofocus, mark the `<Focusable />` component, NOT the element itself. **children** Only one child is allowed. Does not have to be an element, can also be a component that defines custom focus behavior. Just provide a `focus` method on your component.