{{-- 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 only finishes once /version.json reports a version DIFFERENT from the pre-update one (or a down→up cycle for a same-version redeploy). The old container keeps answering /up 200 throughout the long build, so /up alone would redirect prematurely back into the rebuild — that was the 502. 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 JS — no external dependencies. Reads ?return= (redirect target) and ?from= (the pre-update version). Polls /version.json every 2000 ms and finishes only when the running version has moved past ?from= (or, for a same-version redeploy, after a down→up cycle), stable for 2 polls. Times out after 10 minutes and shows a manual-reload prompt. --}}