Organisms

Keyboard shortcuts

Dashboard-wide reference dialog listing keyboard shortcuts, grouped by Actions and Sections. Opens with ⌘K (or ? when not typing). Filterable via the search input at the top: rows update live as you type. Composes Dialog + cmdk + the Kbd atom.

Updated Aug 28, 2026 by Leonardo Posada

Live preview

The provider is already mounted at the app root, so ⌘K (or Ctrl+K on Windows / Linux) opens the dialog from anywhere in the kit. You can also open it via the useKeyboardShortcuts hook.

import { useKeyboardShortcuts } from "@/components/organisms/keyboard-shortcuts-dialog";

function OpenShortcutsButton() {
  const { setOpen } = useKeyboardShortcuts();
  return <Button variant="outline" onClick={() => setOpen(true)}>Show shortcuts</Button>;
}

Current shortcuts

v2 sequence-chord system (2026-08-28). Every Action is C/P/D then a letter; every Section is G then a letter. Zero browser collisions across Chrome / Firefox / Safari / Edge on Mac + Windows + Linux, and zero conflict with AltGr on Windows international keyboards. Data lives in src/lib/shortcuts.ts.

Actions
  • Create payment linkCthenL
  • Invite memberCthenI
  • Create routeCthenR
  • Create risk ruleCthenE
  • Add providerCthenP
  • New subscriptionCthenB
  • Create recipientCthenT
  • Add webhookCthenW
  • Create API keyCthenA
  • Publish routePthenR
  • Publish checkoutPthenK
  • Publish stylingPthenS
  • Duplicate route versionDthenR
  • Duplicate checkoutDthenK
Sections
  • Go to HomeGthenH
  • Go to InsightsGthenI
  • Go to OperationsGthenO
  • Go to Operations > PaymentsGthenOthenP
  • Go to Operations > TransactionsGthenOthenT
  • Go to Operations > Fraud screeningsGthenOthenF
  • Go to Operations > PayoutsGthenOthenY
  • Go to ReconciliationGthenR
  • Go to ConnectionsGthenC
  • Go to Connections > ProvidersGthenCthenP
  • Go to Connections > Certificates & DomainsGthenCthenD
  • Go to RoutingGthenT
  • Go to Routing > ExploreGthenTthenE
  • Go to Routing > Your routesGthenTthenY
  • Go to CheckoutGthenK
  • Go to Checkout > Payment method settingsGthenKthenP
  • Go to Checkout > StylingGthenKthenS
  • Go to Checkout > Custom checkoutsGthenKthenC
  • Go to InstallmentsGthenN
  • Go to Risk conditionsGthenS
  • Go to Risk conditions > OverviewGthenSthenO
  • Go to Risk conditions > RulesGthenSthenR
  • Go to Risk conditions > Protection presetsGthenSthenP
  • Go to Risk conditions > BlocklistsGthenSthenB
  • Go to Risk conditions > AllowlistsGthenSthenA
  • Go to Risk conditions > Held paymentsGthenSthenH
  • Go to MarketplaceGthenM
  • Go to Marketplace > RecipientsGthenMthenR
  • Go to Marketplace > TransfersGthenMthenT
  • Go to Banking connectivityGthenB
  • Go to Banking connectivity > EntitiesGthenBthenE
  • Go to Banking connectivity > TransfersGthenBthenT
  • Go to Alerts & disputesGthenA
  • Go to Alerts & disputes > DisputesGthenAthenD
  • Go to Alerts & disputes > AlertsGthenAthenA
  • Go to Alerts & disputes > OverviewGthenAthenO
  • Go to SubscriptionsGthenU
  • Go to Payment linksGthenL
  • Go to Payments ConciergeGthenY
  • Go to NOVAGthenV
  • Go to API ReferenceGthenF
  • Go to Audit logsGthenX
  • Go to Audit logs > DashboardGthenXthenD
  • Go to Audit logs > WebhooksGthenXthenW
  • Go to Audit logs > MonitorsGthenXthenM
  • Go to DevelopersGthenD
  • Go to Developers > HealthGthenDthenH
  • Go to Developers > AuthenticationGthenDthenA
  • Go to Developers > Webhook endpointsGthenDthenW
  • Go to Developers > API logsGthenDthenL
  • Go to Developers > PlaygroundGthenDthenP
  • Go to Your profileGthenP
  • Go to SecurityGthenE
  • Go to Settings,
  • Go to Teams and rolesGthenJ

Mount

Wrap the app tree with KeyboardShortcutsProvider. Global handler listens for ⌘K (or Ctrl+K on Windows / Linux) anywhere, and for ? (unshifted) when focus is NOT in an input / textarea / contenteditable — the same convention GitHub and Linear use. ⌘K was chosen over ⌘/ because on Mac international layouts (LATAM/ES) the browser intercepts ⌘/ before the handler ever sees it. The dialog trigger is the ONLY chord in the system that uses a modifier — every other shortcut in SHORTCUTS is a plain sequence (C/P/D/G then a letter).

Kit already ships mounted at the layout root — you get ⌘K and ? for free in any prototype.
// app/layout.tsx
import { CommandPaletteProvider } from "@/components/kit/command-palette";
import { KeyboardShortcutsProvider } from "@/components/organisms/keyboard-shortcuts-dialog";

<CommandPaletteProvider>
  <KeyboardShortcutsProvider>
    {children}
  </KeyboardShortcutsProvider>
</CommandPaletteProvider>

Data shape

Shortcuts live in src/lib/shortcuts.ts. Single chord = string[]. Multi-chord sequence (C then L) = string[][]. Modifier keys use SEMANTIC TOKENS (Mod / Alt / Shift / Ctrl / Enter / Esc / ArrowUp…) — the Kbd atom translates each token to the platform-correct glyph at render time (⌘ on Mac, Ctrl on Windows / Linux). Never put raw Mac glyphs (⌘ / ⌥ / ⇧) in this data. Labels are keys into t.shortcuts.items so both EN and ES render.

This registry is display-only for M1. The individual global handlers (that actually fire "Create payment link" when you press C then L, or navigate when you press G then H) will land in a follow-up once the shortcut set is finalized. Sequence chords require a small in-progress state (buffer the first key, time-out after ~1200ms) and a "not in input" guard, identical to how the KeyboardShortcutsProvider already handles the "?" trigger today.
// src/lib/shortcuts.ts
export const SHORTCUTS: ShortcutGroup[] = [
  {
    groupKey: "actions",
    items: [
      // Every action is a 2-key sequence, no modifier. Prefix carries the verb:
      //   C then X = Create X · P then X = Publish X · D then X = Duplicate X
      { labelKey: "createPaymentLink", keys: [["C"], ["L"]] }, // C then L
      { labelKey: "publishRoute",      keys: [["P"], ["R"]] }, // P then R
      { labelKey: "duplicateRoute",    keys: [["D"], ["R"]] }, // D then R
      // ...
    ],
  },
  {
    groupKey: "sections",
    items: [
      { labelKey: "goHome",             keys: [["G"], ["H"]] },         // G then H
      { labelKey: "goRiskConditions",   keys: [["G"], ["S"]] },         // G then S
      { labelKey: "goRiskRules",        keys: [["G"], ["S"], ["R"]] },  // G then S then R (child)
      { labelKey: "goSettings",         keys: ["Mod", ","] },           // ⌘, on Mac / Ctrl , on Win — the single sanctioned modifier chord
      // ...
    ],
  },
];

Import

Three named exports: the Provider (wraps the app + owns the global hotkey), the Dialog (rendered automatically inside the Provider), and the hook to open/close from any component.
import {
  KeyboardShortcutsProvider,
  KeyboardShortcutsDialog,
  useKeyboardShortcuts,
} from "@/components/organisms/keyboard-shortcuts-dialog";

Props

KeyboardShortcutsProvider

PropTypeDefaultDescription
childrenReactNode (required)The app subtree. The provider owns the open state and the global ⌘K + ? key handler.

useKeyboardShortcuts()

PropTypeDefaultDescription
openbooleanWhether the dialog is currently open.
setOpen(v: boolean) => voidOpen or close the dialog imperatively.
toggle() => voidFlip the open state.

Related

  • KbdThe single keyboard-key chip atom used by every row here.
  • DialogThe overlay surface: DialogHeader (title + auto X close) + DialogBody.
  • Commandcmdk primitive powers the search input, list, and arrow-key nav.
  • SidebarSibling shell organism that also owns global chrome and shortcuts.