{{-- @intent Bloco `quick-links`: atalhos internos declarados na Home/Página (catálogo fechado). @description Lista semântica de navegação; rotas inexistentes são omitidas (degrada sem JS e sem quebrar a página). O destino é **nome de rota** (locale correto — ADR-012). --}} @use('Layout\Blocks\BlockRoute') @props([ 'props' => [], 'media' => [], 'blockId' => null, ]) @php $title = is_string($props['title'] ?? null) ? $props['title'] : null; $items = []; foreach (is_array($props['items'] ?? null) ? $props['items'] : [] as $item) { if (! is_array($item) || ! is_string($item['label'] ?? null) || ! is_string($item['route'] ?? null)) { continue; } // Rota inexistente, parametrizada ou de área restrita é **omitida** (nunca 500, nunca // link para o painel — mesma regra do schema, ADR-016/ADR-043). $url = BlockRoute::url($item['route']); if ($url === null) { continue; } $items[] = ['label' => $item['label'], 'url' => $url]; } $headingId = is_string($blockId) && $blockId !== '' ? preg_replace('/[^a-z0-9-]/', '', strtolower($blockId)).'-title' : null; @endphp @if ($title !== null && $items !== []) @endif