Skip to content
Page

Command

Searchable command list. The header search uses it inside CommandDialog.

import {
Command,
CommandInput,
CommandList,
CommandEmpty,
CommandGroup,
CommandGroupHeading,
CommandItem,
CommandSeparator,
CommandDialog,
} from "@pelagornis/page/components";

The preview above renders this file. Copy it into src/components/ to start from it.

src/components/CommandExample.tsx
import {
Command,
CommandEmpty,
CommandGroup,
CommandGroupHeading,
CommandInput,
CommandItem,
CommandList,
CommandSeparator,
} from "@pelagornis/page/components";
export default function CommandDemo() {
return (
<Command label="Commands" className="w-full max-w-sm">
<CommandInput placeholder="Search commands…" />
<CommandList>
<CommandEmpty>No results found.</CommandEmpty>
<CommandGroup>
<CommandGroupHeading>File</CommandGroupHeading>
<CommandItem value="new" shortcut="⌘N">
New file
</CommandItem>
<CommandItem value="open">Open</CommandItem>
</CommandGroup>
<CommandSeparator />
<CommandGroup>
<CommandGroupHeading>Edit</CommandGroupHeading>
<CommandItem value="copy">Copy</CommandItem>
<CommandItem value="paste">Paste</CommandItem>
</CommandGroup>
</CommandList>
</Command>
);
}

Command is composed from parts that share React state. Children written in MDX are rendered as separate islands, so the parts can’t reach each other. Put the composition in a .tsx file, like the example above, and import that file instead.

src/content/docs/example.mdx
---
title: Example
---
import CommandExample from "../../components/CommandExample";
<CommandExample client:load />

client:load hydrates the island on page load. Use client:visible for content far down the page.

Markdoc tags render Astro components, and this one needs client state. Wrap the example in an .astro file that hydrates it, then register that file as a tag.

src/components/markdoc/CommandExample.astro
---
import CommandExample from "../CommandExample";
---
<CommandExample client:load />
markdoc.config.mjs
import { component, defineMarkdocConfig } from "@astrojs/markdoc/config";
import starlightMarkdoc from "@astrojs/starlight-markdoc";
import pageMarkdoc from "@pelagornis/page/markdoc";
export default defineMarkdocConfig({
extends: [starlightMarkdoc(), pageMarkdoc()],
tags: {
"command-example": {
render: component("./src/components/markdoc/CommandExample.astro"),
selfClosing: true,
},
},
});
src/content/docs/example.mdoc
{% command-example /%}

Parts of the component and the data-refineui role each one renders.

PartRole
rootcommand
emptycommand-empty
groupcommand-group
group_headingcommand-group-heading
indicatorcommand-indicator
inputcommand-input
itemcommand-item
listcommand-list
separatorcommand-separator
shortcutcommand-shortcut

States the component styles. Component states are exposed as data attributes.

KindStates
Pseudofocus-visible
data-statedisabled active default

Keys the component handles when it has focus.

KeyAction
ArrowDownnext-trigger
ArrowUpprevious-trigger
Homefirst-trigger
Endlast-trigger
Enteractivate