PromptBox

AI prompt input with auto-growing textarea, context chips, suggestion pills, and Enter-to-submit. The primary interface between human intent and model output.

PromptBox — Live Demo
PromptBox — Submit Button Variants

Default (text)

Icon only

Icon + text

PromptBox — With Chips & Suggestions
Claude 3.5report.pdf

Import

tsx
import { PromptBox } from "@arc-lo/ui";

Basic usage

tsx
<PromptBox.Root onSubmit={(value) => sendToAI(value)}>
  <PromptBox.Input />
  <PromptBox.Footer>
    <PromptBox.SubmitButton />
  </PromptBox.Footer>
</PromptBox.Root>

With chips and suggestions

tsx
<PromptBox.Root onSubmit={handleSubmit} isSubmitting={loading}>
  <PromptBox.Chips>
    <PromptBox.Chip onRemove={() => removeModel()}>
      GPT-4
    </PromptBox.Chip>
    <PromptBox.Chip onRemove={() => removeFile()}>
      report.pdf
    </PromptBox.Chip>
  </PromptBox.Chips>
  <PromptBox.Input placeholder="Ask about your document..." />
  <PromptBox.Suggestions
    suggestions={[
      "Summarize the key findings",
      "What are the risks?",
      "Compare with last quarter",
    ]}
  />
  <PromptBox.Footer>
    <PromptBox.SubmitButton />
  </PromptBox.Footer>
</PromptBox.Root>

Controlled value

tsx
const [prompt, setPrompt] = useState("");

<PromptBox.Root
  value={prompt}
  onValueChange={setPrompt}
  onSubmit={handleSubmit}
>
  <PromptBox.Input />
  <PromptBox.Footer>
    <PromptBox.SubmitButton />
  </PromptBox.Footer>
</PromptBox.Root>

Parts

PartDescription
RootForm wrapper with context provider
InputAuto-growing textarea (1–8 rows)
ChipsContainer for context chips above input
ChipIndividual removable context chip
FooterBottom row for submit button and extras
SubmitButtonSubmit button (disabled when empty or submitting)
SuggestionsContextual suggestion pills

Props

Root
PropTypeDefaultDescription
valuestringControlled value
defaultValuestring""Uncontrolled default
onSubmit(value: string) => voidCalled on submit
onValueChange(value: string) => voidCalled on change
isSubmittingbooleanfalseShows loading state
disabledbooleanfalseDisables the entire box