tests / feature (8.4) (push) Successful in 1m5s
tests / feature (8.5) (push) Successful in 1m4s
tests / lint (push) Successful in 59s
tests / browser (chrome, chromium) (push) Successful in 2m54s
tests / browser (firefox, firefox) (push) Successful in 3m3s
tests / browser (safari, webkit) (push) Successful in 4m13s
Outlined and filled text fields (input, password, auto-growing textarea, native select with the customizable select menu, file), checkbox with an indeterminate state, radio buttons, the M3 switch and form, ported from ReStride and extended. The first half of Phase 6. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V9NnLxnPp8vaaurb3Z1MFy
39 lines
1.9 KiB
PHP
39 lines
1.9 KiB
PHP
{{-- 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/field.css).
|
|
|
|
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`; every other attribute reaches the `<input>`. --}}
|
|
|
|
@props([
|
|
'label' => null,
|
|
'hint' => null,
|
|
'variant' => null,
|
|
])
|
|
|
|
@php
|
|
$model = $attributes->whereStartsWith('wire:model')->first();
|
|
$id = $attributes->get('id') ?? 'field-'.substr(md5('file|'.$model.'|'.$label), 0, 12);
|
|
$messages = $model !== null && isset($errors)
|
|
? array_values(array_unique(\Illuminate\Support\Arr::flatten([$errors->get($model), $errors->get($model.'.*')])))
|
|
: [];
|
|
@endphp
|
|
|
|
<x-field :$id :$label :$hint :$messages :$variant floated :class="$attributes->get('class')">
|
|
<input
|
|
{{ $attributes->except(['class', 'id', 'type']) }}
|
|
type="file"
|
|
id="{{ $id }}"
|
|
@if ($messages !== []) aria-invalid="true" @endif
|
|
@if ($messages !== [] || filled($hint)) aria-describedby="{{ $id }}-support" @endif
|
|
class="field-control"
|
|
/>
|
|
</x-field>
|