@extends('nexus.layouts.app') @section('page-title', 'Search Visibility') @section('sys-mode', 'SEO') @section('head') @endsection @section('content') @php $meta = $report['meta']; $cards = $report['cards']; // one directional movement list instead of two ragged columns $moves = array_merge($report['movers']['up'] ?? [], $report['movers']['down'] ?? []); $seen = []; $moves = array_values(array_filter($moves, function ($m) use (&$seen) { if (isset($seen[$m['query']])) { return false; } $seen[$m['query']] = true; return abs($m['move']) >= 0.5; })); usort($moves, fn ($a, $b) => abs($b['move']) <=> abs($a['move'])); $moves = array_slice($moves, 0, 8); // lower is better for average position, so invert its delta colour $deltaClass = function ($card) { $d = $card['delta']; $dir = $card['good'] === 'down' ? ($d['dir'] === 'up' ? 'down' : ($d['dir'] === 'down' ? 'up' : 'flat')) : $d['dir']; return $dir === 'up' ? 'chip-live' : ($dir === 'down' ? 'chip-error' : 'chip-pending'); }; $verdictChip = function ($pos) { if ($pos <= 3) { return 'chip-active'; } if ($pos <= 10) { return 'chip-completed'; } if ($pos <= 20) { return 'chip-warning'; } return 'chip-pending'; }; @endphp {{-- ═══════════════ HEADER ═══════════════ --}}
{{ $line }}
@emptyNo Search Console data has been synced yet.
@endforelse| Country | Visitors | Share | Shown | Spot |
|---|---|---|---|---|
|
@if($c['flag'])
|
{{ number_format($c['clicks']) }} | {{ $c['share'] }}% | {{ number_format($c['impressions']) }} | {{ $c['position'] }} |
No country data available | ||||
| Search Term | Visits | Shown | Spot | Where | |
|---|---|---|---|---|---|
| {{ str_pad($i + 1, 2, '0', STR_PAD_LEFT) }} | {{ $q['query'] }} | {{ number_format($q['clicks']) }} | {{ number_format($q['impressions']) }} | {{ $q['position'] }} | {{ $q['verdict'] }} |
No query data available | |||||
| Page | Visits | Shown | CTR | |
|---|---|---|---|---|
| {{ str_pad($i + 1, 2, '0', STR_PAD_LEFT) }} | {{ $p['path'] }} | {{ number_format($p['clicks']) }} | {{ number_format($p['impressions']) }} | {{ $p['ctr'] }}% |
No page data available | ||||
| Search Term | Movement | Spot |
|---|---|---|
| {{ $m['query'] }} | {{ $m['move'] > 0 ? '▲' : '▼' }} {{ number_format(abs($m['move']), 1) }} | {{ $m['from'] }} → {{ $m['to'] }} |
No movement data available | ||
| Page | Spot | Gets | Should | Lost |
|---|---|---|---|---|
| {{ $u['path'] }} | {{ $u['position'] }} | {{ $u['actual'] }}% | {{ $u['expected'] }}% | {{ $u['lost'] }} |
Every page earns roughly what its position deserves | ||||
| Post | Search Term Carrying It | Visitors | Shown | Click Rate | Spot | |
|---|---|---|---|---|---|---|
| {{ str_pad($i + 1, 2, '0', STR_PAD_LEFT) }} | {{ $b['slug'] }} @if($b['legacy']) OLD URL @endif | {{ $b['top_query'] }} | {{ number_format($b['clicks']) }} | {{ number_format($b['impressions']) }} | {{ $b['ctr'] }}% | {{ $b['position'] }} |
No blog posts picking up search traffic yet | ||||||
| Search Term | Page To Edit | Times Shown | Spot | To Page 1 | Closeness | |
|---|---|---|---|---|---|---|
| {{ str_pad($i + 1, 2, '0', STR_PAD_LEFT) }} | {{ $s['query'] }} | {{ $s['page'] }} | {{ number_format($s['impressions']) }} | {{ $s['position'] }} | {{ $s['gap'] > 0 ? $s['gap'] : '—' }} | |
Nothing currently sitting just outside page one | ||||||