Reveal input based on a selection
const [contactMethod, setContactMethod] = useState("");
const [checkboxSelection, setCheckboxSelection] = useState<string[]>([]);<GoabxFormItem
label="How would you like to be contacted?"
helpText="Select one option"
>
<GoabxRadioGroup
name="contactMethod"
value={contactMethod}
onChange={(e) => setContactMethod(e.value)}
>
<GoabxRadioItem
value="email"
label="Email"
reveal={
<GoabxFormItem label="Email address">
<GoabxInput name="email" onChange={() => {}} value="" />
</GoabxFormItem>
}
/>
<GoabxRadioItem
value="phone"
label="Phone"
reveal={
<GoabxFormItem label="Phone number">
<GoabxInput name="phoneNumber" onChange={() => {}} value="" />
</GoabxFormItem>
}
/>
<GoabxRadioItem
value="text"
label="Text message"
reveal={
<GoabxFormItem label="Mobile phone number">
<GoabxInput name="mobilePhoneNumber" onChange={() => {}} value="" />
</GoabxFormItem>
}
/>
</GoabxRadioGroup>
</GoabxFormItem>
<GoabxFormItem label="How would you like to be contacted?" mt="xl">
<GoabCheckboxList
name="contactMethods"
value={checkboxSelection}
onChange={(e) => setCheckboxSelection(e.values || [])}
>
<GoabxCheckbox
name="email"
text="Email"
value="email"
reveal={
<GoabxFormItem label="Email address">
<GoabxInput name="email" onChange={() => {}} value="" />
</GoabxFormItem>
}
/>
<GoabxCheckbox
name="phone"
text="Phone"
value="phone"
reveal={
<GoabxFormItem label="Phone number">
<GoabxInput name="phoneNumber" onChange={() => {}} value="" />
</GoabxFormItem>
}
/>
<GoabxCheckbox
name="text"
text="Text message"
value="text"
reveal={
<GoabxFormItem label="Mobile phone number">
<GoabxInput name="mobilePhoneNumber" onChange={() => {}} value="" />
</GoabxFormItem>
}
/>
</GoabCheckboxList>
</GoabxFormItem>form: FormGroup;
constructor(private fb: FormBuilder) {
this.form = this.fb.group({
contactMethod: [""],
phoneNumber: [""],
emailAddress: [""],
emailContactMethod: [false],
phoneContactMethod: [false],
textContactMethod: [false],
});
}<goabx-form-item [formGroup]="form" label="How would you like to be contacted?" helpText="Select one option">
<goabx-radio-group name="contactMethod" formControlName="contactMethod">
<goabx-radio-item label="Email" value="email" [reveal]="emailReveal">
<ng-template #emailReveal>
<goabx-form-item label="Email address">
<goabx-input name="email" formControlName="emailAddress"></goabx-input>
</goabx-form-item>
</ng-template>
</goabx-radio-item>
<goabx-radio-item value="phone" label="Phone" [reveal]="phoneReveal">
<ng-template #phoneReveal>
<goabx-form-item label="Phone number">
<goabx-input name="phone" formControlName="phoneNumber"></goabx-input>
</goabx-form-item>
</ng-template>
</goabx-radio-item>
<goabx-radio-item value="text" label="Text message" [reveal]="textReveal">
<ng-template #textReveal>
<goabx-form-item label="Mobile phone number">
<goabx-input name="mobile" formControlName="phoneNumber"></goabx-input>
</goabx-form-item>
</ng-template>
</goabx-radio-item>
</goabx-radio-group>
</goabx-form-item>
<goabx-form-item [formGroup]="form" label="How would you like to be contacted?" mt="xl">
<goab-checkbox-list name="contactMethods" formControlName="contactMethods">
<goabx-checkbox name="email" text="Email" value="email" [reveal]="checkEmailReveal">
<ng-template #checkEmailReveal>
<goabx-form-item label="Email address">
<goabx-input name="email" formControlName="emailAddress"></goabx-input>
</goabx-form-item>
</ng-template>
</goabx-checkbox>
<goabx-checkbox name="phone" text="Phone" value="phone" [reveal]="checkPhoneReveal">
<ng-template #checkPhoneReveal>
<goabx-form-item label="Phone number">
<goabx-input name="phone" formControlName="phoneNumber"></goabx-input>
</goabx-form-item>
</ng-template>
</goabx-checkbox>
<goabx-checkbox name="text" text="Text message" value="text" [reveal]="checkTextReveal">
<ng-template #checkTextReveal>
<goabx-form-item label="Mobile phone number">
<goabx-input name="mobile" formControlName="phoneNumber"></goabx-input>
</goabx-form-item>
</ng-template>
</goabx-checkbox>
</goab-checkbox-list>
</goabx-form-item><goa-form-item version="2" label="How would you like to be contacted?" helptext="Select one option">
<goa-radio-group version="2" name="contactMethod" id="radio-contact">
<goa-radio-item value="email" label="Email">
<div slot="reveal">
<goa-form-item version="2" label="Email address">
<goa-input version="2" name="email"></goa-input>
</goa-form-item>
</div>
</goa-radio-item>
<goa-radio-item value="phone" label="Phone">
<div slot="reveal">
<goa-form-item version="2" label="Phone number">
<goa-input version="2" name="phone"></goa-input>
</goa-form-item>
</div>
</goa-radio-item>
<goa-radio-item value="text" label="Text message">
<div slot="reveal">
<goa-form-item version="2" label="Mobile phone number">
<goa-input version="2" name="mobile"></goa-input>
</goa-form-item>
</div>
</goa-radio-item>
</goa-radio-group>
</goa-form-item>
<goa-form-item version="2" label="How would you like to be contacted?" mt="xl">
<goa-checkbox-list name="contactMethods">
<goa-checkbox version="2" name="emailContact" text="Email">
<div slot="reveal">
<goa-form-item version="2" label="Email address">
<goa-input version="2" name="emailInput"></goa-input>
</goa-form-item>
</div>
</goa-checkbox>
<goa-checkbox version="2" name="phoneContact" text="Phone">
<div slot="reveal">
<goa-form-item version="2" label="Phone number">
<goa-input version="2" name="phoneInput"></goa-input>
</goa-form-item>
</div>
</goa-checkbox>
<goa-checkbox version="2" name="textContact" text="Text message">
<div slot="reveal">
<goa-form-item version="2" label="Mobile phone number">
<goa-input version="2" name="mobileInput"></goa-input>
</goa-form-item>
</div>
</goa-checkbox>
</goa-checkbox-list>
</goa-form-item>Progressively reveal additional form fields based on user selections, reducing visual complexity while gathering necessary information.
When to use
Use this pattern when:
- Additional information is only needed for certain options
- You want to reduce initial form complexity
- Follow-up questions depend on user choices
- Creating a more focused, less overwhelming form experience
Considerations
- The revealed input should appear directly below the triggering selection
- Use clear labels that explain what information is needed
- Ensure the reveal animation is smooth and noticeable
- Consider what happens to data if the user changes their selection
- Works with both radio groups (single selection) and checkboxes (multiple selections)