CommandK
Command+K implementation for Phoenix LiveView.
Installation
Install by adding command_k to your list of dependencies in mix.exs:
def deps do
[
{:command_k, "~> 0.1.0"}
]
end
View additional documentation at https://hexdocs.pm/command_k.
Getting Started
CommandK includes an easy install task to bootstrap your app code:
$ mix command_k.init
* creating lib/my_app_web/commands.ex
* injecting lib/my_app_web/components/core_components.ex
This task will provide your app with a boilerplate command handler module
in my_app_web/commands.ex, and extend your existing core_components.ex file
to include a baseline command palette component implementation.
Once you have these, configure CommandK by specifying them in the live_view section
in your web module:
def live_view do
quote do
use Phoenix.LiveView,
layout: {MyAppWeb.Layouts, :app}
use CommandK,
handler: MyAppWeb.Commands,
component: &MyAppWeb.CoreComponents.command_k_palette/1
unquote(html_helpers())
end
end
Lastly, we need to make an adjustment to our client side code in assets/app.js in
order for our LiveView application to detect meta key presses (holding "command"):
let liveSocket = new LiveSocket("/live", Socket, {
params: {_csrf_token: csrfToken},
metadata: {
keydown: (e, el) => {
return {
key: e.key,
metaKey: e.metaKey,
repeat: e.repeat
}
}
}
})
You may refer to the documentation on Key Events for more information as to why we need to do this: https://hexdocs.pm/phoenix_live_view/bindings.html#key-events
Usage
To render a CommandK.LiveComponent, add the following to your app layout template:
<.live_component
id="command_k"
module={CommandK.LiveComponent}
command_k={@command_k}
command_k_context={@command_k_context}
show={@command_k_show}
on_cancel={CommandK.close()}
/>
The assigns @command_k, @command_k_show, and @command_k_context are automatically
injected by the library. This live component will render using the function component that was
previously specified in your web module.
Next, add the following phx- bindings to any element also in your app layout template:
<main
class="..."
phx-window-keydown={CommandK.command_k()}
phx-key="k"
>
...
</main>
You can tell CommandK to open the palette manually by calling CommandK.open():
<.button class="absolute right-4 bottom-4" phx-click={CommandK.open()}>
Command+K
</.button>
See the CommandK module for more information.
TODO: Add code documentation, expand on usage section here.