options | UseGridFocusOptions | — | Configuration object for grid focus behavior. Required. |
options.columns | number | MaybeRefOrGetter<number> | — | Number of columns in the grid. Used for up/down navigation (moves by this many cells). Required. |
options.cellSelector | string | '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) => boolean | every matched cell is focusable | Predicate for whether a matched cell can receive focus. Omit to treat every matched cell as focusable. |
options.getFocusTarget | (cell: HTMLElement) => HTMLElement | null | the cell itself | Resolves 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.hasRovingTabIndex | boolean | MaybeRefOrGetter<boolean> | false | Owns 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. |