Checkbox list
Introduction
Section titled “Introduction”CheckboxList dehydrates a list of selected option keys — permissions, feature flags, or tag-like sets that should stay visible as checkboxes rather than a multi select. Cast the model attribute to a list/JSON array. For mutually exclusive choices use Radio; for compact multi-pick UIs prefer Multi select.
Each variation below includes a short explanation, the fluent API to paste into your schema, and light/dark screenshots of the rendered control.
Basic checkbox list
Section titled “Basic checkbox list”Pass a value → label map to .options(). Selected keys are stored as a list in form state.
CheckboxList.make('features') .label('Features') .options({ 'api': 'API access', 'sso': 'SSO', 'webhooks': 'Webhooks', })

Option descriptions
Section titled “Option descriptions”.descriptions() adds helper copy under matching option keys. Use the same keys as .options() so each description aligns with its label.
CheckboxList.make('technologies') .label('Technologies') .options({ 'tailwind': 'Tailwind CSS', 'alpine': 'Alpine.js', 'laravel': 'Laravel', }) .descriptions({ 'tailwind': 'Utility-first CSS for rapid UI work.', 'alpine': 'Lightweight behavior in your markup.', 'laravel': 'The PHP framework for web artisans.', })

Multi-column layout
Section titled “Multi-column layout”.options_columns(n) lays options out in an n-column grid so dense permission lists stay scannable without a long vertical stack.
CheckboxList.make('technologies') .label('Technologies') .options({ 'tailwind': 'Tailwind CSS', 'alpine': 'Alpine.js', 'laravel': 'Laravel', 'livewire': 'Livewire', }) .options_columns(2)

Bulk toggle
Section titled “Bulk toggle”.bulk_toggleable() adds select-all / deselect-all controls above the list — essential when dozens of options would otherwise require tedious clicking.
CheckboxList.make('features') .label('Features') .options({ 'api': 'API access', 'sso': 'SSO', 'webhooks': 'Webhooks', 'audit': 'Audit log', }) .bulk_toggleable() .options_columns(2)

Disabling specific options
Section titled “Disabling specific options”.disable_option_when() receives each option value and returns True when that checkbox should be non-interactive — plan-gated features, deprecated flags, etc.
CheckboxList.make('technologies') .label('Technologies') .options({ 'tailwind': 'Tailwind CSS', 'alpine': 'Alpine.js', 'livewire': 'Livewire', }) .disable_option_when(lambda value, **_: value == 'livewire')

Closures work on .label(), .helper_text(), .placeholder(), .visible(), .disabled(), and .required() where applicable — see Form closures.