@php($name = $field['name']) @php($type = $field['type']) @php($value = $block->get($name)) @php($required = $field['required'] ?? false) @php($prefix = 'data.' . $name) @php($fieldId = 'f_' . $name) @php($hasError = collect($errors->keys())->contains(fn ($k) => $k === $prefix || str_starts_with($k, $prefix . '.')) || ($type === 'image' && $errors->has('upload.' . $name)))
@if ($type === 'text') @error($prefix)

{{ $message }}

@enderror @elseif ($type === 'richtext') @include('admin.blocks._richeditor', ['name' => "data[{$name}]", 'value' => old('data.' . $name, $value)]) @error($prefix)

{{ $message }}

@enderror @elseif ($type === 'textarea') @error($prefix)

{{ $message }}

@enderror @elseif ($type === 'image') @php($current = old('data.' . $name, $value)) @php($usage = $field['usage'] ?? 'free') @php($dim = config('media.dimensions.' . $usage)) @php($maxKb = media_max_upload_kb()) @php($imgHint = 'Formats acceptés : JPG, PNG, WEBP · Taille max : ' . media_max_upload_label() . (! empty($dim['min_width']) ? ' · Minimum ' . $dim['min_width'] . ' px de large' : '') . (! empty($dim['recommended']) ? ' · Recommandé : ' . $dim['recommended'] : '')) @php($previewUrl = ! $current ? '' : (is_numeric($current) ? media_url($current) : asset(ltrim($current, '/')))) @if ($previewUrl) Aperçu @endif {{-- The current reference is locked (hidden input): a stray edit of a technical path would silently break the photo. Replacing an image is ALWAYS done by sending a new file below. --}} @if ($current)

Pour remplacer cette image, choisissez un fichier ci-dessous puis enregistrez.

@else

Aucune image pour l'instant — choisissez un fichier ci-dessous puis enregistrez.

@endif @error('upload.' . $name)

{{ $message }}

@enderror @error($prefix)

{{ $message }}

@enderror

{{ $imgHint }}

@elseif ($type === 'rows') @php($rows = $value ?: []) @php($rowLabel = $field['row_label'] ?? 'Élément') @if (empty($rows))

⚠️ Cette liste est vide : cette partie du bloc n'affichera rien sur le site. Si vous avez supprimé le bloc d'origine par erreur, restaurez une sauvegarde (menu « Sauvegardes »), ou contactez votre développeur pour initialiser la structure.

@endif @foreach ($rows as $i => $row) @php($rowHint = is_array($row) ? collect(['num', 'title', 'label', 'year', 'text'])->map(fn ($k) => $row[$k] ?? '')->first(fn ($v) => trim(strip_tags((string) $v)) !== '') : null)
{{ $rowLabel }} {{ $i + 1 }}@if ($rowHint) · {{ \Illuminate\Support\Str::limit(strip_tags((string) $rowHint), 40) }}@endif
@foreach ($field['fields'] as $sub) @php($subName = "data[{$name}][{$i}][{$sub['key']}]") @php($subId = "f_{$name}_{$i}_{$sub['key']}") @php($subValue = old("data.{$name}.{$i}.{$sub['key']}", is_array($row) ? ($row[$sub['key']] ?? '') : '')) @php($subKey = "data.{$name}.{$i}.{$sub['key']}")
@if (($sub['type'] ?? 'text') === 'richtext') @include('admin.blocks._richeditor', ['name' => $subName, 'value' => $subValue]) @elseif (($sub['type'] ?? 'text') === 'textarea') @elseif (($sub['type'] ?? 'text') === 'digits') @else @endif @error($subKey)

{{ $message }}

@enderror
@endforeach
@endforeach @if (!empty($rows))

Le nombre d'éléments est fixe (il fait partie du design) — vous modifiez les textes, jamais la structure.

@endif @elseif ($type === 'repeater') @php($itemKey = $field['item'] ?? 'html') @php($rows = old('data.' . $name, $value ?: [])) {{-- A brand-new block has no rows yet: render one empty editor so the field is actually usable (zero inputs = nothing to type into). --}} @php($rows = $rows ?: [[$itemKey => '']]) @foreach ($rows as $i => $row) @include('admin.blocks._richeditor', [ 'name' => "data[{$name}][{$i}][{$itemKey}]", 'value' => is_array($row) ? ($row[$itemKey] ?? '') : $row, ]) @error($prefix . '.' . $i . '.' . $itemKey)

{{ $message }}

@enderror @endforeach

Un paragraphe par zone de texte.

@elseif ($type === 'images') @php($usage = $field['usage'] ?? 'logo') @php($itemLabel = $field['item_label'] ?? 'Image') @php($maxKb = media_max_upload_kb()) @php($items = old('data.' . $name, $value ?: [])) @php($accept = 'image/jpeg,image/png,image/webp')
@foreach ($items as $i => $item) @php($src = is_array($item) ? ($item['src'] ?? '') : '') @php($alt = is_array($item) ? ($item['alt'] ?? '') : '') @php($previewUrl = ! $src ? '' : (is_numeric($src) ? media_url($src) : asset(ltrim($src, '/'))))
@error('upload.' . $name . '.' . $i)

{{ $message }}

@enderror
@endforeach
{{-- Cloned by admin-images.js for each new row. __INDEX__ is replaced with a fresh, collision-free key on insertion. --}}
@endif @if (!empty($field['help']) && $type !== 'image')

{{ $field['help'] }}

@endif