{{-- Self-contained update-progress page. NO Livewire, NO Alpine, NO external JS. Loaded into the browser BEFORE the container teardown triggered by the update request. While the backend is down the page is already client-side; its inline JS polling loop tolerates 502s and detects recovery when /up returns 200. Modelled on errors/layout.blade.php (same token-only CSS, same wordmark). --}} {{ __('update.page_title') }} @include('partials.head-icons') @vite(['resources/css/app.css'])
{{-- Wordmark --}}
Clusev
{{-- Main card --}}
{{-- Spinner + heading --}}

{{ __('update.heading') }}

{{ __('update.subtitle') }}

{{-- Phase checklist --}}
    @php $phases = [ ['key' => 'fetch', 'label' => __('update.phase_fetch')], ['key' => 'build', 'label' => __('update.phase_build')], ['key' => 'migrate', 'label' => __('update.phase_migrate')], ['key' => 'restart', 'label' => __('update.phase_restart')], ]; @endphp @foreach ($phases as $i => $phase)
  1. {{-- Dot --}} {{-- Label --}} {{ $phase['label'] }} {{-- Check icon (hidden until complete) --}}
  2. @endforeach
{{-- Elapsed time --}}

{{ __('update.elapsed') }}: 0s

{{-- /card --}}
{{-- Inline CSS for the spinner animation (no Alpine/external deps) --}} {{-- Inline JS — no external dependencies. Reads ?return= for the redirect target. Polls /up every 2500 ms; requires 2 consecutive 200s before redirecting (flap guard). Times out after 10 minutes and shows a manual-reload prompt. --}}