---
title: "Keyboard"
description: "Every keyboard interaction in the system, aggregated from the keyboard table on each component page."
url: "https://opsinjs.pensievelabs.org/reference/generated/keyboard"
source: "https://opsinjs.pensievelabs.org/reference/generated/keyboard.md"
section: "Reference"
kind: "reference"
reviewed: "2026-09-02"
reviewer: "engineering"
aliases: ["key bindings", "keyboard table", "shortcuts"]
---

> Elements written as `<PascalCase … />` below are opsinjs documentation
> components. Their attributes are the content: the values they render are
> generated from `tokens/*.json` and `registry/catalogue.ts` and are
> published separately at https://opsinjs.pensievelabs.org/r/index.json and under the Reference
> section.
> Nothing is missing from this page. The data simply does not live in
> the prose.

<PageTemplate kind="reference" />

## How this is generated [#how-this-is-generated]

**Source:** the `<KeyboardTable>` block on every component page, which is the same
block the component page renders rather than a separate list.
&#x2A;*Script:** `scripts/build-reference.mts`. &#x2A;*Command:** `pnpm run generate`.

Aggregating rather than re-authoring is the whole point. A separate global
keyboard list is a document that is correct on the day it is written and wrong
within two releases, because the person changing a component's focus order does
not know it exists. Here, a key that is not documented on its component page
cannot appear on this page, and a component page without a keyboard table fails
the build.

**Four columns.** *Component* and *part* say where you must be focused. *Key* is
written the way a keyboard prints it, so <Kbd>Enter</Kbd>, <Kbd>Esc</Kbd>,
<Kbd>Shift</Kbd> <Kbd>Tab</Kbd>. *Action* describes the outcome, not the
implementation. *Notes* carries the exceptions: what changes in a right-to-left
layout, what a screen reader's browse mode intercepts, what differs on iOS where
an external keyboard is attached.

**What is deliberately excluded.** Browser and operating-system defaults are not
listed, because <Kbd>Tab</Kbd> moving focus forward is not a feature of a
component.
The global focus contract, focus-visible behaviour and the skip-link rules live
in [Keyboard and focus](../../accessibility/keyboard-and-focus.mdx), which is
doctrine and belongs there rather than in a table.

This site's own shortcuts are not part of the system either; the search dialog
opens with <Kbd>Ctrl</Kbd> <Kbd>K</Kbd> and that is a property of the
documentation, not of opsinjs.

{/* opsinjs:generated:begin - everything below is replaced by scripts/build-reference.mts */}

<NoDataYet script="scripts/build-reference.mts" />

This script does not parse the `<KeyboardTable>` blocks yet, so nothing is aggregated here - not because no component documents its keys. Every component page carries its own table, and that is where the contract is readable today. The global contract every component must meet is in Accessibility under Keyboard and focus.

{/* opsinjs:generated:end */}
