# keyrove > Framework-agnostic keyboard navigation for lists and grids, driven by data-* attributes. Any key can move focus, and native Tab navigation keeps working. Every page on this site is also available as markdown by appending `.md` to its URL — for example /docs/api renders the API reference, and /docs/api.md returns its source. ## Guide - [Introduction](https://keyrove.pages.dev/docs/introduction.md): What keyrove does, which keys it moves focus with, how it sits beside native Tab navigation, and what it deliberately leaves to you. - [Installation](https://keyrove.pages.dev/docs/installation.md): Installing the package, wiring the first keydown handler in any framework, and what the markup has to carry. - [API reference](https://keyrove.pages.dev/docs/api.md): Every export in the package — the handler, the helper, the key bindings, the attributes, and the types. - [About](https://keyrove.pages.dev/docs/about.md): What keyrove is, who maintains it, and which version of these docs you are reading. ## Examples - [Basic list](https://keyrove.pages.dev/docs/examples/basic.md): The default behaviour — arrows step one item, Home and End jump to the ends, PageUp and PageDown move in blocks, and Tab still does what Tab does. - [Grid](https://keyrove.pages.dev/docs/examples/grid.md): Declaring a column count switches Up and Down to whole-row moves and brings Left and Right into play. - [Roving tabindex](https://keyrove.pages.dev/docs/examples/roving-tabindex.md): Opt a group into being a single tab stop, so Tab moves past it rather than through it — and what happens if you do not. - [Skipped items](https://keyrove.pages.dev/docs/examples/skipped-items.md): Keeping headings, separators, and disabled entries in the DOM but out of the navigation order. - [Custom keys](https://keyrove.pages.dev/docs/examples/custom-keys.md): Arrows are the default, not the rule — rebinding the next and previous keys to any key combo. - [Nested roots](https://keyrove.pages.dev/docs/examples/nested-roots.md): A group inside a group — the nearest root wins, so an inner list navigates by its own keys while the list around it keeps its.