{{-- Single root div required by Livewire (must have exactly one root element) --}} {{-- ─── AUTO-REFRESH WRAPPER (10s) ──────────────────────── --}}
{{-- ─── STAT PILLS ───────────────────────────────────── --}}
{{ $stats['present'] }} On-Site
{{ $stats['away'] }} Away
{{ $stats['sites'] }} Active Sites
Live · Refreshes every 10s
{{-- ─── LIVE MAP ──────────────────────────────────────── --}}
{{-- Map Header --}}

Live Site Presence Map

Site Geofence
Worker (Present)
Worker (Away)
{{-- Map Container + Alpine Component --}}
{{-- No-data overlay --}} @if(empty($mapSites))

No sites with coordinates configured

Add GPS coordinates to sites to see them on the map

@endif {{-- Pulse animation keyframe --}}
{{-- ─── PRESENCE TABLE ────────────────────────────────── --}}

Live Worker Presence

Auto-refresh every 10s
{{-- Active filter banner --}}
Filtering by site:
@if(empty($presenceRows))

No presence records yet

Workers will appear here once they check in

@else
@foreach($presenceRows as $p) @endforeach
Worker Site Status Method Last Seen Signal
{{ strtoupper(substr($p['worker'], 0, 1)) }}
{{ $p['worker'] }}
{{ $p['site'] }} @if($p['status'] === 'present') Present @else Away @endif @if($p['last_event'] === 'nfc') ⬡ NFC @elseif($p['last_event'] === 'ble') 〰 BLE @elseif($p['last_event'] === 'geofence') 📍 GEO @elseif($p['last_event'] === 'gps') 📍 GPS @else @endif {{ $p['last_seen_at'] ?? '—' }} @if($p['last_seen_ago'] !== null) @php $m = $p['last_seen_ago']; if ($m < 1) { echo 'just now'; } elseif ($m < 60) { echo $m . 'm ago'; } elseif ($m < 1440) { echo floor($m / 60) . 'h ago'; } else { echo floor($m / 1440) . 'd ago'; } @endphp @endif @if($p['rssi'] !== null) @php $rssiClass = $p['rssi'] >= -60 ? 'text-emerald-600 dark:text-emerald-400 bg-emerald-50 dark:bg-emerald-900/20' : ($p['rssi'] >= -80 ? 'text-amber-600 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20' : 'text-rose-600 dark:text-rose-400 bg-rose-50 dark:bg-rose-900/20'); @endphp {{ $p['rssi'] }} dBm @else @endif
@endif
{{-- end wire:poll --}}
{{-- end single root div --}}