Components

Questionnaire

Questions, answers and navigation

Import
import { Questionnaire, QuestionnaireItem, QuestionnaireChoice } from "@nyte-ai/ui/questionnaire";

A form that shows one question at a time. Your app handles persistence and submission.

Usage

  • Place parts with xstyle. The component owns colors, typography, spacing and selection indicators. Navigation uses Nyte button styles unless render replaces them.
  • Give each item a unique name.
  • Pass items to server-render the initial order and state. Control the step with item and onItemChange.
  • Read answers from FormData in the root's onSubmit.

Anatomy

PartElementParent
QuestionnaireformYour container
QuestionnaireProgressdivRoot
QuestionnaireItemfieldsetRoot
QuestionnaireTitlelegendItem
QuestionnaireDescriptionpItem
QuestionnaireChoicesdivItem
QuestionnaireChoicelabel with input, label and shortcut spansItem or Choices
QuestionnaireChoiceDescriptionspanChoice
QuestionnaireInputinputItem
QuestionnaireErrorpItem
QuestionnaireActionsdivRoot
QuestionnairePreviousbuttonActions
QuestionnaireSkipbuttonActions
QuestionnaireNextbuttonActions
QuestionnaireSubmitbuttonActions

Examples

<Questionnaire items={[{ name: "timing", choices: [{ value: "now" }] }]}>
  <QuestionnaireItem name="timing" aria-label="When?">
    <QuestionnaireChoice value="now">Now</QuestionnaireChoice>
  </QuestionnaireItem>
</Questionnaire>

Props

Parts take native props and refs and set a matching data-slot.

PartPropTypeDefault
Rootitem, defaultItemstringFirst enabled item
RootonItemChange(item: string) => voidNone
RootitemsReadonly item definitions with name, optional choices, disabled, requiredRegistered items
Rootshortcuts"letters" | "numbers"Off
RootnoValidatebooleantrue
ItemnamestringRequired
Itemmultiple, required, invalid, disabledbooleanfalse
ItemonStatusChange(status: "unanswered" | "answered" | "skipped") => voidNone
ChoicevaluestringRequired
Choicechecked, defaultChecked, disabledbooleanUncontrolled; default checked and disabled are false
ChoiceonChangeNative input change handlerNone
Inputtype"date" | "datetime-local" | "email" | "month" | "number" | "password" | "search" | "tel" | "text" | "time" | "url" | "week""text"
Navigationvariant"default" | "outline" | "secondary" | "ghost" | "destructive" | "link" | nullPrevious and Skip "outline"; Next and Submit "default"
Navigationsize"default" | "xs" | "sm" | "lg" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | null"default"

Input takes its item's name, so it has no name or form prop. Choice visually hides its native input and shortcut, and draws a radio or checkbox indicator according to the item's multiple prop. Put supporting text in QuestionnaireChoiceDescription.

Progress, Title, Description, Choices, Choice, Input, Error and navigation accept render. Callbacks receive HTML props and the headless part state. className and style take plain values, not state callbacks.

Without children, navigation shows "Previous", "Skip", "Next" or "Submit", Progress shows "Question N of M" and Error shows validation text for an invalid item. Submit is type="submit" and the others are type="button".

The headless questionnaire reference covers item definitions, validation and navigation visibility.

Accessibility

The item's aria-describedby includes Description and, when invalid, Error. Inactive items and unavailable actions are hidden and inert. Progress is a polite live progressbar. Up and Down move between answers, Left and Right between steps. Ctrl+Enter and Cmd+Enter advance or submit. Letter and number shortcuts require shortcuts.