@use('Core\Localization\Locales')
@use('Layout\Blocks\BlockField')
{{--
Campo de um bloco do catálogo no editor da home (P5.S2.1 — emenda ADR-016).
- O rótulo e o vocabulário do campo vêm do **catálogo** (`layout::blocks.fields.*`): o mesmo
texto serve Home e Páginas sem duplicar tradução.
- `$oldValue` já vem resolvido pelo chamador (`old($errorKey, $value)`), então um erro de
validação não apaga o que o operador digitou.
- O erro é sempre server-side (`$errors`), mostrado junto do campo e referenciado por
`aria-describedby`; o resumo `role="alert"` é do formulário (`x-cms::form-errors`).
- Nada de HTML/Blade/CSS no dado: só controles nativos; texto rico é AST (ADR-028) e mídia é
**id** do catálogo (ADR-026).
- Campo **traduzível** (P5.S2.2) abre um grupo com um controle por locale (pt_BR/en/es/fr); o
nome vira `campo[locale]` e o mapa é validado pelo schema do tipo (texto/AST). O locale
default é o fallback do portal quando um idioma não for traduzido.
@var BlockField $field
@var string $name nome do input (ex.: `sections[0][props][title]`)
@var string $errorKey chave no error bag (ex.: `sections.0.props.title`)
@var string $id base dos ids do campo
@var mixed $oldValue valor corrente (old() já aplicado)
--}}
@php
$label = __('layout::blocks.fields.'.$field->name);
$error = $errors->first($errorKey);
$errorId = $id.'-error';
$helpId = $id.'-help';
$help = match ($field->type) {
'media' => __('home::cms.media_help'),
'ast' => __('home::cms.ast_help'),
'icon' => __('home::cms.icon_help'),
default => null,
};
$describedBy = implode(' ', array_filter([
$help !== null ? $helpId : null,
$error !== null ? $errorId : null,
]));
$ariaInvalid = $error !== null ? 'true' : null;
$scalarValue = is_scalar($oldValue) ? (string) $oldValue : '';
$astValue = is_array($oldValue)
? (string) json_encode($oldValue, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)
: $scalarValue;
$translations = $field->translatable ? $field->translations($oldValue) : [];
@endphp
@if ($field->translatable)