{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "prompt",
  "title": "Prompt",
  "description": "A callable dialog that waits for text input.",
  "dependencies": [
    "react-call"
  ],
  "registryDependencies": [
    "dialog",
    "button",
    "input",
    "label"
  ],
  "files": [
    {
      "path": "ui/prompt.tsx",
      "content": "'use client'\n\n\nimport { useId, useState } from 'react'\nimport { createCallable } from 'react-call'\n\nimport { Button } from '@/components/ui/button'\nimport {\n  Dialog,\n  DialogContent,\n  DialogDescription,\n  DialogFooter,\n  DialogHeader,\n  DialogTitle,\n} from '@/components/ui/dialog'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\n\nexport interface PromptProps {\n  title: string\n  description?: string\n  label?: string\n  defaultValue?: string\n  placeholder?: string\n  confirmLabel?: string\n  cancelLabel?: string\n  required?: boolean\n}\n\nexport const Prompt = createCallable<PromptProps, string | null>(\n  ({\n    call,\n    title,\n    description,\n    label,\n    defaultValue = '',\n    placeholder,\n    confirmLabel = 'Confirm',\n    cancelLabel = 'Cancel',\n    required = true,\n  }) => {\n    const id = useId()\n    const [value, setValue] = useState(defaultValue)\n    const canSubmit = !required || value.trim().length > 0\n\n    return (\n      <Dialog open={!call.ended} onOpenChange={(open) => !open && call.end(null)}>\n        <DialogContent showCloseButton={false}>\n          <form\n            className=\"grid gap-6\"\n            onSubmit={(event) => {\n              event.preventDefault()\n              if (canSubmit) call.end(value)\n            }}\n          >\n            <DialogHeader>\n              <DialogTitle>{title}</DialogTitle>\n              {description && <DialogDescription>{description}</DialogDescription>}\n            </DialogHeader>\n            <div className=\"grid gap-2\">\n              {label && <Label htmlFor={id}>{label}</Label>}\n              <Input\n                id={id}\n                // biome-ignore lint/a11y/noAutofocus: focus the field the dialog exists for\n                autoFocus\n                placeholder={placeholder}\n                value={value}\n                onChange={(event) => setValue(event.target.value)}\n              />\n            </div>\n            <DialogFooter>\n              <Button type=\"button\" variant=\"outline\" onClick={() => call.end(null)}>\n                {cancelLabel}\n              </Button>\n              <Button type=\"submit\" disabled={!canSubmit}>\n                {confirmLabel}\n              </Button>\n            </DialogFooter>\n          </form>\n        </DialogContent>\n      </Dialog>\n    )\n  },\n  200,\n)\n",
      "type": "registry:ui"
    }
  ],
  "type": "registry:component"
}
