Skip to main content
FLEX Theme provides one keyboard configuration for the panel, Theme Settings and shortcut help. Controls respect text inputs, native modals, composition input and browser focus. Native action bindings take priority over additional commands. For the complete table interaction, including the difference between highlight, single-row selection and page selection, see Table shortcuts and selection. Recovery is configured separately in Recover recent changes.

Configure controls

mod means Command on macOS and Control on other platforms. Set a binding to null to disable it. PHP bindings are authoritative: their controls are locked in Theme Settings. Unlocked preferences can be recorded, cleared or reset there. Table bindings are row_next, row_previous, row_open, row_select, page_select, page_previous, page_next and filters. They use the current native table and its rendered page of records. They do not fetch a separate copy of all database records. Inputs and native popups keep their own keyboard behavior. Select page uses Command + A on macOS and Control + A on Windows/Linux. Pressing it again keeps the page selected. In text fields, the same keys retain native text selection. Use the table’s native deselection control to clear records. Each shortcut must be unique across the configured actions, including actions in different contexts. Equivalent Control/Command bindings are checked for both platforms. Conflicts are rejected in the recorder and when saving configuration. While recording, Backspace and Delete assign those keys; use the remove button to clear a binding. Escape cancels recording and Tab moves to the next control.

Contextual help

Table help contains table controls, applicable native actions and recovery. It omits page navigation sequences. Full workspace help includes the permitted navigation entries and custom commands. Both use the same keycaps and vector icons as Keyboard settings; Escape and focus restoration belong to the native modal. Navigation sequences are consecutive keys: press the configured prefix, then the letters assigned to a destination. They are not simultaneous key combinations. Typing, opening a modal, leaving the page or losing window focus cancels a pending sequence. Entries come from the current panel’s authorized native navigation.

Declare navigation on a Resource or Page

A destination can declare its own sequence. No extra registration, base class or trait is needed:
With the default prefix, these open with G → C and G → R → P. The property name $keyboardShortcut and public static method getKeyboardShortcut() are also supported. These describe consecutive navigation keys, not a global single-key command. To assign a simultaneous combination, use a custom command or a native Action binding below. Panel navigationSequences() overrides take precedence over class declarations. Within a class, getNavigationShortcut() takes precedence over $navigationShortcut, then getKeyboardShortcut(), then $keyboardShortcut. Inherited declarations work. Use null for automatic assignment or false to exclude a destination from keyboard navigation. Methods must be public/static; properties must be static. Sequences contain one to three letters or digits, case-insensitively. Duplicate explicit sequences produce an exception naming both destinations; automatically assigned entries avoid occupied sequences. Declarations are resolved on the server only for entries already present in the current authorized navigation. Hidden destinations are not added by declaring a shortcut. Help, navigation hints and SPA navigation use the same resolved catalog. When one sequence is a prefix of another, the short destination waits for the sequence timeout so the longer sequence remains reachable.

Native Action bindings

Keep native Filament actions and their authorization/confirmation behavior:
FLEX detects rendered native action bindings for shortcut help and lets Filament execute them. Native bindings take priority over workspace commands. FLEX validates its own configured commands and built-in bindings; it does not replace Filament’s own arbitration between multiple native actions using the same key.

Custom commands

A command can open an HTTP/application URL or dispatch a Livewire event:
The receiving server action must authorize the operation again. Visibility controls presentation; it does not grant permission to mutate data. Executable JavaScript strings are not needed to register a command.

Independent switches

  • tableNavigation(false) disables table enhancements.
  • navigationSequences(false) disables sequence navigation.
  • settings(false) hides the Keyboard settings tab.
  • FlexThemePlugin::shortcuts(false) disables the keyboard enhancement.
  • search(false) restores native search without disabling independent keyboard controls or recovery.

All built-in bindings

These are the package defaults, before saved preferences and PHP overrides. The editor stores one primary binding per action; bindings() can enforce up to four alternatives in PHP. Global search, sidebar, theme and undo combinations require a modifier or function key. Context-local table/navigation keys can be plain keys. Bindings accept letters, digits, the supported punctuation keys, F1–F24, arrows, Enter/Space/Backspace/Delete/Home/End/PageUp/PageDown and modifiers mod, ctrl, meta, alt, shift. Escape and Tab remain reserved for native interaction. Input strings are normalized; aliases such as cmd, command, control, return, esc and period map to their canonical names.

Record, clear and reset in the editor

Click a recorder in Theme Settings → Keyboard, then press the desired combination. The platform preview changes displayed keycaps, not the physical meaning of mod. A conflict is rejected both during recording/save and in PHP configuration. Backspace/Delete record those keys; use the explicit remove control to clear a binding. Escape cancels capture; Tab moves on. Save to persist changes panel-wide. Reset tab restores the unlocked shortcut draft to defaults; it does not save.

ShortcutConfiguration reference

Command::make($id) accepts stable lowercase IDs of 1–80 characters using letters, digits, underscore, dot and hyphen, starting with a letter. label()/group() accept strings or closures; visible() accepts a boolean or closure. keys() accepts up to four global combinations. url($url, newTab: true) supports HTTP(S) or absolute application paths; dispatch($event, $payload) supports a valid event name up to 100 characters and a JSON payload up to 4096 bytes. Each command needs a destination. Duplicate IDs and conflicting keys fail. Configure each panel with its own instance. Commands and navigation entries are resolved from that panel’s authorized configuration. No shortcut grants access to a resource, another panel or a tenant that the user cannot ordinarily access.