{{-- 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 // Real order of the host updater: git pull → docker build → stack up → migrate. $phases = [ ['key' => 'fetch', 'label' => __('update.phase_fetch')], ['key' => 'build', 'label' => __('update.phase_build')], ['key' => 'restart', 'label' => __('update.phase_restart')], ['key' => 'migrate', 'label' => __('update.phase_migrate')], ]; @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). Drives the phase checklist from the real /update-status.json feed (falling back to a time heuristic when absent) and finishes when that feed reports 'done', or when /version.json shows the running version moved past ?from= (or a down→up cycle), stable for 2 polls. Times out after 10 minutes and shows a manual-reload prompt. --}}