command-pal
⌨ The hackable command palette for the web, inspired by Visual Studio Code.

Configure custom commands with custom keyboard shortcuts!
Demos
Benefit's of Command Palettes
- Ease of use
- Simply 1 keyboard shortcut to remember
- Fuzzy search allows you to find commands easily
- Speed
- Keyboard makes it fast to access any command/function
- Fuzzy search allows for quick ordering of commands
- Efficient to find a commands that you used once a long time ago
- Discoverability
- You can scroll down the entire list of commands
- Find commands by simply searching the Command palette
- Tips and functions can be given to you as you type
Features
- JS framework agnostic (can be attached to any site)
- Keyboard first control (shortcuts configurable)
- Custom commands
- Dynamically Add/Remove commands
- Nested commands
- Fuzzy text matching (fuse.js)
- Themeable (theme-light.css and theme-dark.css included)
- Mobile friendly (button in bottom-left)

Why?
Command Palettes have alwyas impressed me with how easy they are to use and develop for. I rarely see them on the web platform, so I thought I'd give it a shot.
Get Started
Install
Either install from npm
yarn add command-pal
Or use the script tag
<script src="https://cdn.jsdelivr.net/npm/command-pal"></script>
Usage - Simple
const c = new CommandPal({
hotkey: "ctrl+space",
commands: [
{
name: "Send Message",
shortcut: "ctrl+m",
handler: () => alert("Send Message"),
},
{
name: "Search Contacts",
handler: () => alert("Searching contacts..."),
},
{
name: "Goto Profile",
shortcut: "ctrl+4",
handler: () => window.location.hash = "profile",
},
],
});
c.start();
Usage - Advanced
const c = new CommandPal({
hotkey: "ctrl+space",
placeholder: "Custom placeholder text...",
commands: [
{
name: "Change Language",
children: [
{
name: "English",
handler: () => alert("Changing to English")
},
{
name: "Spanglish",
handler: () => alert("Changing to Spanglish")
}
]
},
{
name: "Goto About",
handler: () => window.location.hash = "about",
},
],
});
c.start();
API
CommandPal instance
const c = new CommandPal({
hotkey: "ctrl+space",
hotkeysGlobal: true,
id: "CommandPal",
placeholder: "Custom placeholder text...",
debugOuput: false,
hideButton: false,
commands: [
]
});
c.start()
c.destroy()
Subscribe to events
There's a few events that can be subscribed to during command-pal's execution.
c.subscribe("exec", (e) => { console.log("exec", { e }); });
c.subscribe("textChanged", (e) => { console.log("textChanged", { e }); });
c.subscribe("opened", (e) => { console.log("opened", { e }); });
c.subscribe("closed", (e) => { console.log("closed", { e }); });
Command Item
{
name: "Open Messages",
description: "View all messages in inbox",
shortcut: "ctrl+3",
handler: (e) => {
}
children: [...]
},
Command Item Child
Note: Child commands cannot have shortcuts.
{
name: "Open Messages",
description: "View all messages in inbox",
handler: (e) => {
}
},
Add/Remove Command's At Runtime
The command list is an observed array, which means you can modify it even after it's instantiated. The following snippet shows how commands can be dynamically added during runtime.
const commands = [
{
name: "Add Command to List",
handler: () => {
commands.push({
name: 'New Command',
handler: () => {
},
});
},
},
];
const c = new CommandPal({
hotkey: "ctrl+space",
commands: commands,
});
c.start();
Styling CommandPal instances
The styles used by command-pal are included in the package. However you can override the default CSS using the following.
#CommandPal .mobile-button { top: 30px; }
#CommandPal .modal-mask { background-color: rgb(0,128,200,0.75); }
#CommandPal [slot=items] { background-color: yellow;}
#CommandPal .item { color:black; }
You can also assign a custom id to the CommandPal instance.
c = CommandPal(..., id: 'mypal',)
Which allows you to style a specific instance.
#mypal .mobile-button { top: 30px; bottom: auto;}
Local Development
To develop on command-pal simply clone, install and run
npm run dev
Then the following link:
Prevent Blur
When the search input loses focus (receives a blur event), the palette
closes. This makes inspecting the palette using the browser's DevTools
difficult, as switching to DevTools causes the focus to be lost. It is
possible to stop the palette from closing when focus is lost.
window.commandPalIgnoreBlur = true;
window.commandPalIgnoreBlur = false;
Have a go, PR's and issues always welcome.
Prior Art
Many applications have implemented this before, here's a few. My favourite implementation is the VScode, which is the main influence for this project.
Editors
Misc