Codex Slash Menu
brainless/codex-slash-menuFreeComponent
Slash-command palette under the real CodexPrompt composer — type after / to filter, arrow keys to move.
Install it
npx shadcn@latest add https://brainless.swerdlow.dev/r/codex-slash-menu.jsonSource
1"use client";23import * as React from "react";4import { CodexPrompt } from "@/registry/brainless/codex/codex-prompt";5import { cn } from "@/lib/utils";67/**8 * CodexSlashMenu — Codex CLI's slash-command palette.9 *10 * Flat list under the `›` composer: padded command name + description.11 * Type after `/` to filter; arrow keys move the active row.12 */13export type CodexSlashCommand = { name: string; description: string };1415const DEFAULT: CodexSlashCommand[] = [16 { name: "/model", description: "choose what model and reasoning effort to use" },17 { name: "/permissions", description: "choose what Codex is allowed to do" },18 { name: "/diff", description: "show the unified diff for this session" },19 { name: "/review", description: "review a pull request or local changes" },20 { name: "/status", description: "show model, limits, and session info" },21 { name: "/compact", description: "summarize the conversation to save context" },22];2324const ACTIVE = "#ededed";25const INACTIVE = "#7a7a7a";26const NAME_COLS = 16;2728export function CodexSlashMenu({29 commands = DEFAULT,30 className,31}: {32 commands?: CodexSlashCommand[];33 className?: string;34}) {35 const [value, setValue] = React.useState("/");36 const [active, setActive] = React.useState(0);3738 const query = value.startsWith("/") ? value.slice(1) : value;39 const list = commands.filter((c) =>40 c.name.slice(1).toLowerCase().startsWith(query.toLowerCase()),41 );42 const clampedActive = list.length ? Math.min(active, list.length - 1) : 0;4344 function onKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {45 if (!list.length) return;46 if (e.key === "ArrowDown") {47 e.preventDefault();48 setActive((a) => (a + 1) % list.length);49 } else if (e.key === "ArrowUp") {50 e.preventDefault();51 setActive((a) => (a - 1 + list.length) % list.length);52 }53 }5455 return (56 <div className={cn("font-mono text-[13px] leading-[1.6]", className)}>57 <CodexPrompt58 value={value}59 onChange={(e) => {60 setValue(e.target.value);61 setActive(0);62 }}63 onKeyDown={onKeyDown}64 placeholder=""65 mode="default"66 />6768 <ul69 role="listbox"70 aria-label="Slash commands"71 aria-activedescendant={72 list.length ? `codex-slash-${clampedActive}` : undefined73 }74 className="mt-2 space-y-0.5 pl-[2ch]"75 >76 {list.map((c, i) => {77 const activeRow = i === clampedActive;78 return (79// … truncated
What it pulls in
Other registry items
Files it writes
More from brainless
All 40 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Claude Diffclaude-diff | brainless | Components | Free | no deps | |
| Claude Headerclaude-header | brainless | Components | Free | no deps | |
| Claude Messageclaude-message | brainless | Components | Free | no deps | |
| Claude Permissionclaude-permission | brainless | Components | Free | no deps | |
| Claude Promptclaude-prompt | brainless | Components | Free | no deps | |
| Claude Slash Menuclaude-slash-menu | brainless | Components | Free | no deps | |
| Claude Thinkingclaude-thinking | brainless | Components | Free | no deps | |
| Claude Todo Listclaude-todo-list | brainless | Components | Free | no deps |
