{{-- One choice from a few, each with room for a line of explanation: M3's radio buttons. A `
` whose legend is the question, so a screen reader reads the group's name with each option, and native radios sharing a name, so the arrow keys move between them. `options` as `['id' => …, 'name' => …, 'hint' => …]` (`'disabled' => true` greys one out), `option-value`, `option-label` and `option-hint` to read other keys, `inline` to lay them in a row from `medium` (600px, M3's compact/medium boundary — compact always stacks), and `value` for the option chosen when the page loads (with `wire:model`, Livewire sets it). Errors are read from the bag under the `wire:model` name (resources/css/components/radio.css). M3 stacks radio buttons vertically and cautions against a row at any width, so `inline` is for a group of two or three short labels that would waste a column, not the shape to reach for. It also asks for five options or fewer and for one of them to be chosen when the page loads: give the group a `value` (or a bound property that already holds one). --}} @props([ 'label' => null, 'hint' => null, 'options' => [], 'optionValue' => 'id', 'optionLabel' => 'name', 'optionHint' => 'hint', 'inline' => false, 'value' => null, ]) @php $model = $attributes->whereStartsWith('wire:model')->first(); $name = $attributes->get('name') ?? $model ?? 'radio-'.substr(md5($label.'|'.json_encode($options)), 0, 12); $id = 'radio-'.substr(md5($name.'|'.$label), 0, 12); // A plain form's field is named, not bound: its errors are under its name (`files[]` → `files`, `a[b]` → `a.b`). $errorKey = $model ?? (filled($attributes->get('name')) ? str_replace(['[]', '[', ']'], ['', '.', ''], (string) $attributes->get('name')) : null); $messages = $errorKey !== null && isset($errors) ? \Illuminate\Support\Arr::flatten($errors->get($errorKey)) : []; @endphp
only(['class', 'style', 'wire:key']) }} @if ($messages !== [] || filled($hint)) aria-describedby="{{ $id }}-support" @endif > @if (filled($label)) {{ $label }} @endif
@foreach ($options as $option) @php($optionHintText = data_get($option, $optionHint)) @endforeach
@if ($messages !== []) @elseif (filled($hint))

{{ $hint }}

@endif