owenmelbz/nova-radio-field
A Laravel Nova field that renders options as radio buttons instead of a dropdown, giving a clearer single-choice selection UI. Configure it with the same options array you'd use for Nova's built-in select fields, and it drops straight into resource forms with no extra setup.
Architecture fit
Laravel\Nova\Fields\Field subclass plus one compiled Vue component. No service provider, config publish, migrations, routes, middleware, or auth surface. Nova auto-discovers it.Field::dependsOn() (3.14+). What the package actually sells is the radio affordance plus a terser toggle API — not conditional visibility itself. That framing matters for build-vs-buy.Integration feasibility
Select for a Radio on a resource you own. Hours, not days, assuming compatibility passes.dist/js bundle is the fragile artifact. It can render blank or throw inside the form's shared Vue tree without producing a build error.Select and stored option keys remain valid, provided the option set is unchanged.Technical risk
1, 0) won't reliably match in ->toggle(). Requires string keys or a resolve cast.Key questions
Select + dependsOn() clear the bar at lower total cost?Stack fit
composer.json.nova-components/ as an owned component rather than consumed as an upstream dependency — the code is small enough (one PHP class, one Vue file) that owning the build is cheaper than owning the risk.Select with native dependsOn(). Treat that as the default and require justification to deviate.Migration path
Select would.Select; no cleanup required.Compatibility
composer.json constraints and the shipped dist/js bundle directly — the README will not tell you whether it works on Nova 4/5.laravel/nova; field renders inline; value persists on create and update; validation errors display correctly; ->toggle() hides and shows the target field; keyboard navigation works; no console errors; coexistence with a native dependsOn() field on the same resource.Sequencing
Select + dependsOn().nova-components/, remove the upstream requirement from composer.json, assign a named owner, record the build step.make() returning a pre-configured Radio) so toggle rules live in one place rather than drifting across resources.Maintenance
composer update cannot silently change the field's behavior.Support
->options(), ->toggle(), and inherited Nova field modifiers. There is nothing to learn beyond that.Scaling
->toggle() is ignored on index and detail — that is expected behavior, not a defect. Multi-step branching or cross-resource conditions must go elsewhere.Failure modes
Ramp-up
Radio.vue covers the entire surface.Recommendation
Adopt conditionally: run the half-day compatibility spike, pilot on one low-traffic resource, and proceed only with a named owner, a vendored build, and a fork obligation recorded against the next Nova upgrade. Time saved is a few engineering hours on a custom field; the cost accepted is permanent, low-grade ownership risk on a single-maintainer package. Where the radio affordance is not a genuine UX requirement, Select + dependsOn() is the lower total-cost answer and should be the default.
How can I help you explore Laravel packages today?