From 6a284caa444cfea30953cd65ff9de197c70edbeb Mon Sep 17 00:00:00 2001 From: boban Date: Tue, 23 Jun 2026 00:32:23 +0200 Subject: [PATCH] design(release): rebuild the Release page in the Tactical Terminal system MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the bland version + four plain buttons with a composed layout: a current- version hero (mono version, channel + source), tactile bump tiles showing the current → target transition with a Beta-tag badge (continue-beta highlighted accent), styled running/last-pushed states, and a vertical pipeline rail (Gitea → GitHub-privat → CI → Staging). Tokens-only, responsive 375/768/1280, German, no emoji; the R5 confirm flow + component contract are unchanged. Co-Authored-By: Claude Opus 4.8 --- lang/de/release.php | 40 +++- lang/en/release.php | 40 +++- .../views/livewire/release/index.blade.php | 185 ++++++++++++++---- 3 files changed, 209 insertions(+), 56 deletions(-) diff --git a/lang/de/release.php b/lang/de/release.php index c6993e4..5bad3e2 100644 --- a/lang/de/release.php +++ b/lang/de/release.php @@ -3,21 +3,45 @@ return [ 'title' => 'Release', 'nav' => 'Release', + 'eyebrow' => 'Release-Pipeline', 'heading' => 'Release-Steuerung', 'subtitle' => 'Beta auf Staging schneiden — nur auf der Dev-Instanz.', + 'dev_instance' => 'Dev-Instanz', + 'current' => 'Aktuelle Version', - 'continue_beta' => 'Nächste Beta (:v)', - 'bump_patch' => 'Patch-Beta (:v)', - 'bump_minor' => 'Minor-Beta (:v)', - 'bump_major' => 'Major-Beta (:v)', + 'channel' => 'Kanal', + 'source' => 'Quelle', + + // option tiles + 'choose' => 'Beta schneiden', + 'kind_continue' => 'Nächste Beta', + 'kind_patch' => 'Patch', + 'kind_minor' => 'Minor', + 'kind_major' => 'Major', + 'tile_beta' => 'Beta-Tag', 'hint' => 'Schneidet einen Beta-Tag und pusht ihn nach Gitea → Mirror → CI → Staging.', - 'confirm_title' => 'Beta schneiden?', - 'confirm_body' => 'Beta :target wird geschnitten und nach Gitea → Mirror → CI → Staging gepusht. Das stößt einen Deploy auf der Staging-Instanz an.', - 'confirm_action' => 'Schneiden & pushen', - 'staged_label' => 'Zuletzt geschnitten:', + + // running / result + 'running_title' => 'Release läuft', 'running' => 'Beta :target wird geschnitten und gepusht …', + 'in_progress' => 'läuft', 'staged' => 'Beta :tag gepusht → Mirror → CI → Staging.', + 'staged_label' => 'Zuletzt gepusht:', 'failed' => 'Release fehlgeschlagen: :reason', + + // pipeline rail + 'pipeline' => 'Pipeline', + 'pipe_sub_gitea' => 'Quelle · Tag wird hier erzeugt', + 'pipe_sub_mirror' => 'Automatischer Push-Mirror', + 'pipe_sub_ci' => 'Tests laufen', + 'pipe_sub_staging' => 'Beta wird ausgerollt', + + // confirm modal (R5) + 'confirm_title' => 'Beta auf Staging schneiden?', + 'confirm_body' => 'Schneidet eine Beta von :target, taggt sie und pusht nach Gitea → Mirror → CI → Staging. Der Tag ist unwiderruflich.', + 'confirm_action' => 'Beta schneiden', + + // errors 'invalid_target' => 'Ungültige Ziel-Version.', 'throttled' => 'Zu viele Versuche — in :seconds s erneut.', 'write_failed' => 'Anfrage konnte nicht geschrieben werden (Signal-Ordner nicht beschreibbar).', diff --git a/lang/en/release.php b/lang/en/release.php index 161d3a5..487792d 100644 --- a/lang/en/release.php +++ b/lang/en/release.php @@ -3,21 +3,45 @@ return [ 'title' => 'Release', 'nav' => 'Release', + 'eyebrow' => 'Release pipeline', 'heading' => 'Release control', 'subtitle' => 'Cut a staging beta — dev instance only.', + 'dev_instance' => 'Dev instance', + 'current' => 'Current version', - 'continue_beta' => 'Next beta (:v)', - 'bump_patch' => 'Patch beta (:v)', - 'bump_minor' => 'Minor beta (:v)', - 'bump_major' => 'Major beta (:v)', + 'channel' => 'Channel', + 'source' => 'Source', + + // option tiles + 'choose' => 'Cut a beta', + 'kind_continue' => 'Next beta', + 'kind_patch' => 'Patch', + 'kind_minor' => 'Minor', + 'kind_major' => 'Major', + 'tile_beta' => 'Beta tag', 'hint' => 'Cuts a beta tag and pushes it to Gitea → mirror → CI → staging.', - 'confirm_title' => 'Cut beta?', - 'confirm_body' => 'Beta :target will be cut and pushed to Gitea → mirror → CI → staging. This triggers a deploy on the staging instance.', - 'confirm_action' => 'Cut & push', - 'staged_label' => 'Last cut:', + + // running / result + 'running_title' => 'Release running', 'running' => 'Cutting and pushing beta :target …', + 'in_progress' => 'running', 'staged' => 'Beta :tag pushed → mirror → CI → staging.', + 'staged_label' => 'Last pushed:', 'failed' => 'Release failed: :reason', + + // pipeline rail + 'pipeline' => 'Pipeline', + 'pipe_sub_gitea' => 'Source · tag is cut here', + 'pipe_sub_mirror' => 'Automatic push mirror', + 'pipe_sub_ci' => 'Tests run', + 'pipe_sub_staging' => 'Beta is deployed', + + // confirm modal (R5) + 'confirm_title' => 'Cut a staging beta?', + 'confirm_body' => 'Cuts a beta of :target, tags it and pushes to Gitea → mirror → CI → staging. The tag is irreversible.', + 'confirm_action' => 'Cut beta', + + // errors 'invalid_target' => 'Invalid target version.', 'throttled' => 'Too many attempts — retry in :seconds s.', 'write_failed' => 'Could not write the request (signal directory not writable).', diff --git a/resources/views/livewire/release/index.blade.php b/resources/views/livewire/release/index.blade.php index 914e58a..fe0a4a2 100644 --- a/resources/views/livewire/release/index.blade.php +++ b/resources/views/livewire/release/index.blade.php @@ -1,45 +1,150 @@ -
-
-

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

-

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

+@php + $isBeta = str_contains($current, '-beta'); + + $tiles = []; + if (isset($targets['continueBeta'])) { + $tiles[] = ['target' => $targets['continueBeta'], 'label' => __('release.kind_continue'), 'icon' => 'rotate', 'primary' => true]; + } + $tiles[] = ['target' => $targets['patch'], 'label' => __('release.kind_patch'), 'icon' => 'tag', 'primary' => false]; + $tiles[] = ['target' => $targets['minor'], 'label' => __('release.kind_minor'), 'icon' => 'tag', 'primary' => false]; + $tiles[] = ['target' => $targets['major'], 'label' => __('release.kind_major'), 'icon' => 'git-branch', 'primary' => false]; + + $steps = [ + ['name' => 'Gitea', 'sub' => __('release.pipe_sub_gitea'), 'active' => $pendingId !== null], + ['name' => 'GitHub-privat', 'sub' => __('release.pipe_sub_mirror'), 'active' => false], + ['name' => 'CI', 'sub' => __('release.pipe_sub_ci'), 'active' => false], + ['name' => 'Staging', 'sub' => __('release.pipe_sub_staging'), 'active' => false], + ]; +@endphp + +
+ {{-- Header --}} +
+
+

{{ __('release.eyebrow') }}

+

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

+

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

+
+ {{ __('release.dev_instance') }}
- -
- {{ __('release.current') }} - {{ $current }} +
+ {{-- Left: current version + action --}} +
+ {{-- Current version hero --}} + +
+
+
+ +
+
+

{{ __('release.current') }}

+

{{ $current }}

+
+
+
+
+
{{ __('release.channel') }}
+
{{ $isBeta ? 'beta' : 'stable' }}
+
+
+
{{ __('release.source') }}
+
Gitea
+
+
+
+
+ + @if ($pendingId !== null) + {{-- Running --}} +
+
+ +
+
+

{{ __('release.running_title') }}

+

{{ __('release.running', ['target' => $pendingTarget]) }}

+
+ {{ __('release.in_progress') }} +
+ @else + @if ($lastTag !== null) + {{-- Last successful push --}} +
+ + {{ __('release.staged_label') }} + {{ $lastTag }} + → Mirror → CI → Staging +
+ @endif + + {{-- Option tiles --}} +
+

{{ __('release.choose') }}

+
+ @foreach ($tiles as $t) + + @endforeach +
+

{{ __('release.hint') }}

+
+ @endif
- @if ($lastTag !== null) -

- - {{ __('release.staged_label') }} {{ $lastTag }} -

- @endif - - @if ($pendingId !== null) -

- - {{ __('release.running', ['target' => $pendingTarget]) }} -

- @else -
- @if (isset($targets['continueBeta'])) - - {{ __('release.continue_beta', ['v' => $targets['continueBeta']]) }} - - @endif - - {{ __('release.bump_patch', ['v' => $targets['patch']]) }} - - - {{ __('release.bump_minor', ['v' => $targets['minor']]) }} - - - {{ __('release.bump_major', ['v' => $targets['major']]) }} - -
-

{{ __('release.hint') }}

- @endif - + {{-- Right: pipeline rail --}} + +
    + @foreach ($steps as $s) +
  1. +
    + $s['active'], + 'border-line bg-inset text-ink-3' => ! $s['active'], + ])>{{ $loop->iteration }} + @unless ($loop->last) + + @endunless +
    +
    ! $loop->last])> +

    {{ $s['name'] }}

    +

    {{ $s['sub'] }}

    +
    +
  2. + @endforeach +
+
+