field typesradio

Radio Group

Mutually exclusive choices with visible tiles—same option sourcing and nested-form recursion as Select.

Overview

The Radio Group surfaces every choice at once inside clickable tiles tied to a single shared radio cluster—ideal when respondents should compare labels side-by-side instead of opening a dropdown.

Under the hood it follows Select semantics: submissions store one string value, optionConfigs define labels/values/nestedForm, isDynamic pulls remote arrays, and dependent URLs honor dependsOn plus brace placeholders.

Properties

PropertyTypeDefaultDescription
idstringUnique field identifier.
typestring"radio"Discriminator.
labelstringHuman-readable label shown above the field or step heading.
requiredbooleanfalseWhen true, the form cannot submit without a value.
isHiddenbooleanfalseHides the field from respondents (may still store defaults).
isDisabledbooleanfalseRenders the field read-only.
instructionstringundefinedHelp text shown below the label (not the same as placeholder).
optionConfigsOptionConfig[]undefined{ label, value, nestedForm? } entries become mutually exclusive tiles.
optionConfigs[].nestedFormNestedFormundefinedRendered only for the active selection (same pattern as Select).
optionsstring[][]Plain-label shorthand when optionConfigs omitted.
isDynamicbooleanfalseFetch tiles via dataSource.
dataSource.urlstringHTTP endpoint with optional placeholders.
dataSource.method"GET" | "POST"GETHTTP verb.
dataSource.pathstring""Dot-path to option array inside JSON response.
dataSource.valueFieldstringStored value property per row.
dataSource.labelFieldstringDisplayed label property per row.
dataSource.headersobjectundefinedExtra headers.
dataSource.bodyobjectundefinedPOST body template.
dataSource.dependsOnstringundefinedParent field id controlling reload + substitution.
dataSource.parentValuePathstringundefinedPlaceholder token replaced inside url.
dataSource.parentValueParamstringundefinedPOST-only merge key for parent values.

Static options

{
  "id": "a55bdd9f-7f90-4f1c-9f33-555555555555",
  "type": "radio",
  "label": "Employment status",
  "required": true,
  "placeholder": "Choose one",
  "options": ["Full-time", "Part-time"],
  "optionConfigs": [
    { "label": "Employed full-time", "value": "full_time" },
    { "label": "Employed part-time", "value": "part_time" },
    { "label": "Self-employed", "value": "self" },
    { "label": "Student", "value": "student" }
  ]
}

Dynamic options

{
  "id": "b66bdd9f-7f90-4f1c-9f33-666666666666",
  "type": "radio",
  "label": "Quote author",
  "required": false,
  "options": ["Option 1", "Option 2"],
  "isDynamic": true,
  "dataSource": {
    "url": "https://dummyjson.com/quotes",
    "path": "quotes",
    "valueField": "id",
    "labelField": "author",
    "method": "GET"
  }
}

Dependent options

{
  "id": "c77bdd9f-7f90-4f1c-9f33-777777777777",
  "type": "radio",
  "label": "Quote detail",
  "required": false,
  "options": ["Option 1", "Option 2"],
  "isDynamic": true,
  "dataSource": {
    "url": "https://dummyjson.com/quotes/{id}",
    "path": "",
    "valueField": "id",
    "labelField": "author",
    "dependsOn": "b66bdd9f-7f90-4f1c-9f33-666666666666",
    "parentValuePath": "id"
  }
}

Nested option forms

Exactly like Select: only the tile matching the current value mounts its nestedForm.fields. Switching radios swaps which nested subtree is active.

Use Cases by Pattern

Static radios

  • Low cardinality choices where seeing every label beats opening a menu
  • Forms emphasizing fairness/comparison across visibly enumerated answers

Dynamic / dependent radios

  • Shipping-method tiles sourced from fulfillment APIs scoped by cart warehouse id
  • Tier pickers refreshed after an upstream eligibility lookup field changes

Nested radios

  • Insurance plans where each radio reveals plan-specific beneficiary fields
  • Branching onboarding lanes authored entirely inside optionConfigs recursion