{{-- A file picker, in the text field's chrome (resources/views/components/field.blade.php). M3 has no file field, and building one would redo what the browser's input already does — the picker, a file dropped on it, the keyboard, what a screen reader announces, the `change` a Livewire upload listens for. So the input stays native, its label always floats (the button stands where a resting label would), and only its `::file-selector-button` is restyled: a tonal pill, so it reads as the thing to press (resources/css/components/file.css, on the field's chrome; the field's root carries `data-md-file`). The browser's own line beside the button ("No file chosen", "3 files") is drawn transparent: it cannot be truncated or wrapped, and the caller shows what was chosen anyway, as previews. A screen reader still hears it. The errors are the model's and, for a `multiple` input, each file's (`photos.*`): a file refused for its size belongs under this field as much as the batch's own count does. `label`, `hint`, `variant`; `full` takes the 40rem bound off a field its container already bounds. Every other attribute reaches the ``. --}} @props([ 'label' => null, 'hint' => null, 'variant' => null, 'full' => false, ]) @php $model = $attributes->whereStartsWith('wire:model')->first(); $id = $attributes->get('id') ?? 'field-'.substr(md5('file|'.$model.'|'.$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) ? array_values(array_unique(\Illuminate\Support\Arr::flatten([$errors->get($errorKey), $errors->get($errorKey.'.*')]))) : []; @endphp except(['class', 'style', 'id', 'type']) }} type="file" id="{{ $id }}" @if ($messages !== []) aria-invalid="true" @endif @if ($messages !== [] || filled($hint)) aria-describedby="{{ $id }}-support" @endif data-md-field-control />