react-chrono
Version:
A Modern Timeline component for React
73 lines • 2.44 kB
TypeScript
/**
* Configuration for roving tabindex pattern
*/
export interface UseRovingTabIndexOptions {
/** Array of items with IDs and optional disabled state */
items: {
id: string;
disabled?: boolean;
}[];
/** Direction of navigation: horizontal (arrow left/right), vertical (arrow up/down), or both */
orientation?: 'horizontal' | 'vertical' | 'both';
/** Whether to wrap focus from last item to first (and vice versa) */
loop?: boolean;
/** Initial active item ID */
initialActiveId?: string;
/** Callback when active item changes */
onActiveChange?: (id: string) => void;
/** Whether to focus active item on initial load (default: true) */
focusOnLoad?: boolean;
}
/**
* Return value from useRovingTabIndex
*/
export interface UseRovingTabIndexReturn {
/** Current active item ID */
activeId: string;
/** Get props for an item (tabIndex, onKeyDown, onFocus, ref) */
getItemProps: (id: string) => {
ref: React.RefObject<HTMLElement | null>;
tabIndex: 0 | -1;
onKeyDown: (e: React.KeyboardEvent<HTMLElement>) => void;
onFocus: () => void;
};
/** Manually set active item */
setActiveId: (id: string) => void;
}
/**
* useRovingTabIndex - Implements ARIA roving tabindex pattern
*
* This hook manages keyboard navigation for composite widgets like toolbars,
* menu bars, and list boxes. Only one item has tabIndex={0}, and arrow keys
* move focus between items. Other items have tabIndex={-1}.
*
* WCAG References:
* - 2.1.1 Keyboard (Level A)
* - 2.4.3 Focus Order (Level A)
* - ARIA APG Roving Tabindex Pattern
*
* @example
* ```typescript
* const { getItemProps, activeId } = useRovingTabIndex({
* items: [
* { id: 'first', disabled: false },
* { id: 'prev', disabled: disableLeft },
* { id: 'next', disabled: disableRight },
* { id: 'last', disabled: false },
* ],
* orientation: 'horizontal',
* loop: false,
* });
*
* return (
* <div role="toolbar">
* <button {...getItemProps('first')}>First</button>
* <button {...getItemProps('prev')}>Previous</button>
* <button {...getItemProps('next')}>Next</button>
* <button {...getItemProps('last')}>Last</button>
* </div>
* );
* ```
*/
export declare const useRovingTabIndex: (options: UseRovingTabIndexOptions) => UseRovingTabIndexReturn;
//# sourceMappingURL=useRovingTabIndex.d.ts.map