

<Demo name="questionnaire/demos/questionnaire" />

## Installation [#installation]

<CodeBlockTabs defaultValue="npm">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="npm">
      npm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="pnpm">
      pnpm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="yarn">
      yarn
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="bun">
      bun
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="npm">
    ```bash
    npx shadcn@latest add @dotui/questionnaire
    ```
  </CodeBlockTab>

  <CodeBlockTab value="pnpm">
    ```bash
    pnpm dlx shadcn@latest add @dotui/questionnaire
    ```
  </CodeBlockTab>

  <CodeBlockTab value="yarn">
    ```bash
    yarn dlx shadcn@latest add @dotui/questionnaire
    ```
  </CodeBlockTab>

  <CodeBlockTab value="bun">
    ```bash
    bun x shadcn@latest add @dotui/questionnaire
    ```
  </CodeBlockTab>
</CodeBlockTabs>

## Usage [#usage]

```tsx
import {
  Questionnaire,
  QuestionnaireActions,
  QuestionnaireChoice,
  QuestionnaireChoices,
  QuestionnaireItem,
  QuestionnaireNext,
  QuestionnairePrevious,
  QuestionnaireSubmit,
  QuestionnaireTitle,
} from "@/ui/questionnaire"
```

```tsx
<Questionnaire onSubmit={handleSubmit}>
  <QuestionnaireItem name="role" required>
    <QuestionnaireTitle>What best describes your role?</QuestionnaireTitle>
    <QuestionnaireChoices>
      <QuestionnaireChoice value="designer">Designer</QuestionnaireChoice>
      <QuestionnaireChoice value="engineer">Engineer</QuestionnaireChoice>
    </QuestionnaireChoices>
  </QuestionnaireItem>
  <QuestionnaireActions>
    <QuestionnairePrevious />
    <QuestionnaireNext />
    <QuestionnaireSubmit />
  </QuestionnaireActions>
</Questionnaire>
```

## Anatomy [#anatomy]

`Questionnaire` renders a form and shows one `QuestionnaireItem` at a time.
An item is single-answer by default and multi-answer with `multiple`; its
choices render as radios or checkboxes accordingly, with optional letter or
number `shortcuts`. Free-text questions use `QuestionnaireInput`, and
`QuestionnaireError` shows the active question's validation message.

The navigation renders itself: `QuestionnairePrevious` hides on the first
question, `QuestionnaireSkip` only appears on optional questions,
`QuestionnaireNext` advances, and `QuestionnaireSubmit` takes its place on
the last question. `QuestionnaireProgress` reads "1 of 4"-style progress.

## Examples [#examples]

<Examples className="md:grid-cols-2">
  <Example name="questionnaire/demos/with-input" title="With Input" />

  <Example name="questionnaire/demos/with-descriptions" title="With Descriptions" />
</Examples>

## API Reference [#api-reference]

### Questionnaire [#questionnaire]

<Reference name="questionnaire" />

### QuestionnaireProgress [#questionnaireprogress]

<Reference name="questionnaire-progress" />

### QuestionnaireItem [#questionnaireitem]

<Reference name="questionnaire-item" />

### QuestionnaireTitle [#questionnairetitle]

<Reference name="questionnaire-title" />

### QuestionnaireDescription [#questionnairedescription]

<Reference name="questionnaire-description" />

### QuestionnaireChoices [#questionnairechoices]

<Reference name="questionnaire-choices" />

### QuestionnaireChoice [#questionnairechoice]

<Reference name="questionnaire-choice" />

### QuestionnaireChoiceDescription [#questionnairechoicedescription]

<Reference name="questionnaire-choice-description" />

### QuestionnaireInput [#questionnaireinput]

<Reference name="questionnaire-input" />

### QuestionnaireError [#questionnaireerror]

<Reference name="questionnaire-error" />

### QuestionnaireActions [#questionnaireactions]

<Reference name="questionnaire-actions" />

### QuestionnairePrevious [#questionnaireprevious]

<Reference name="questionnaire-previous" />

### QuestionnaireSkip [#questionnaireskip]

<Reference name="questionnaire-skip" />

### QuestionnaireNext [#questionnairenext]

<Reference name="questionnaire-next" />

### QuestionnaireSubmit [#questionnairesubmit]

<Reference name="questionnaire-submit" />
