A click-to-edit text field. Optimistic save, escape-to-cancel, validation, async submit, and multiline mode.
bunx --bun shadcn@latest add https://ui.ahmet.studio/r/inline-edit
import { InlineEdit } from "@/components/ui/inline-edit"; export function Demo() { const [title, setTitle] = React.useState("Untitled"); return ( <InlineEdit value={title} onChange={setTitle} onSubmit={async (v) => { await fetch("/api/title", { method: "POST", body: JSON.stringify({ title: v }), }); }} required textClassName="text-lg font-semibold" /> ); }
onSubmit for optimistic updates with disabled-state during the request.validate to show an error.multiline for a textarea (Cmd/Ctrl+Enter to save).renderDisplay to render markdown, badges, links, etc.| Prop | Type | Default |
|---|---|---|
value | string | Required |
onChange | (value: string) => void | Required |
onSubmit | (value: string) => void | Promise<void> | undefined |
validate | (value: string) => boolean | string | undefined |
placeholder | string | "Type something…" |
emptyText | string | "Click to edit" |
multiline | boolean | false |
required | boolean | false |
triggerOnBlur | "save" | "cancel" | "save" |
selectAllOnEdit | boolean | true |
showActions | boolean | true |
renderDisplay | (value: string) => ReactNode | undefined |