@props([ 'id' => null, 'htmlId' => null, 'label' => null, 'helper' => null, 'required' => false, 'options' => [], // list of ['value' => ..., 'label' => ..., 'disabled' => bool] 'placeholder' => 'Select…', 'emptyText' => 'No options available.', 'live' => false, 'onChange' => null, // optional $wire method to call after a selection 'onChangeArgs' => null, // optional arguments followed by the selected value 'wire' => true, // false = purely client-side value (no Livewire binding) 'value' => null, // initial value when wire=false 'disabled' => false, 'tooltip' => true, 'portal' => false, 'preserveValue' => false, ]) @php $triggerId = ($htmlId ?? $id).'-trigger'; $panelId = ($htmlId ?? $id).'-panel'; @endphp
@if ($label) {{-- Keep helper outside the label so taps do not open the listbox trigger. Margin lives only on this wrapper (mb-0 on the label) so spacing matches plain text labels and is not doubled by .application-settings-form label rules. --}} {{-- Fixed h-4 matches the helper icon so side-by-side fields align with or without a helper. --}}
@if ($helper) @endif
@endif
whereStartsWith('x-model') }} {{ $attributes->whereStartsWith('x-effect') }} @if ($preserveValue) wire:ignore @endif @click.outside="open = false" @keydown.escape="open = false" @resize.window="open && positionPanel()"> @if ($portal) @else
{{ $emptyText }}
@endif