Skip to content

useGridFocus

@astryxdesign/core v0.7.1 · useGridFocus

Parameters ​

NameTypeDefaultDescription
optionsUseGridFocusOptions—Configuration object for grid focus behavior. Required.
options.columnsnumber | MaybeRefOrGetter<number>—Number of columns in the grid. Used for up/down navigation (moves by this many cells). Required.
options.cellSelectorstring'button:not([disabled]), [tabindex]:not([tabindex="-1"])'Selector for cells within the grid. Should match ALL cell positions in DOM order (including disabled/empty) so grid geometry is preserved.
options.isCellFocusable(cell: HTMLElement) => booleanevery matched cell is focusablePredicate for whether a matched cell can receive focus. Omit to treat every matched cell as focusable.
options.getFocusTarget(cell: HTMLElement) => HTMLElement | nullthe cell itselfResolves the element to focus for a cell, e.g. a button inside a role="gridcell" wrapper.
options.onNavigateBefore(column: number, offset: number) => void—Callback when navigation would go before the first cell. Receives the current column index and the offset (1 for horizontal, columns for vertical).
options.onNavigateAfter(column: number, offset: number) => void—Callback when navigation would go after the last cell. Receives the current column index and the offset.
options.onPageUp() => void—Callback for Page Up (e.g., navigate to the previous month in calendars). Without it the key is left alone.
options.onPageDown() => void—Callback for Page Down (e.g., navigate to the next month in calendars). Without it the key is left alone.
options.hasRovingTabIndexboolean | MaybeRefOrGetter<boolean>falseOwns a single roving tab stop across the grid: one focusable cell (its resolved focus target) carries tabindex="0", the rest -1. Stamped and repaired after mount and moved with arrow navigation.

Returns ​

NameTypeDescription
gridRefRef<HTMLElement | null>Ref to attach to the grid container element.
handleKeyDown(event: KeyboardEvent) => voidKey down handler to attach to the grid container.
handleFocus(event: FocusEvent) => voidFocus handler for the grid container, bound to focusin. Keeps the roving tab stop in sync when hasRovingTabIndex is enabled; a no-op otherwise, so it is always safe to attach.
focusCell(index: number) => voidFocus a specific cell by index (clamped to the valid range). A cell that cannot take focus is left alone.
focusFirst() => voidFocus the first focusable cell in the grid.
focusLast() => voidFocus the last focusable cell in the grid.