diff --git a/app/Http/Controllers/ReleaseController.php b/app/Http/Controllers/ReleaseController.php index bce87b6..275a3af 100644 --- a/app/Http/Controllers/ReleaseController.php +++ b/app/Http/Controllers/ReleaseController.php @@ -26,6 +26,14 @@ final class ReleaseController extends Controller return view('downloads.index', compact('latest', 'releases', 'settings', 'products')); } + public function sonarDeskDetails() + { + $latest = SonarDeskRelease::published()->where('is_featured', true)->orderByDesc('published_at')->first() + ?? SonarDeskRelease::published()->where('channel', 'stable')->orderByDesc('published_at')->orderByDesc('id')->firstOrFail(); + $settings = $this->settings(); + return view('downloads.sonardesk', compact('latest', 'settings')); + } + public function latest(): BinaryFileResponse { $release = SonarDeskRelease::published()->where('channel', 'stable')->orderByDesc('published_at')->firstOrFail(); diff --git a/resources/views/downloads/index.blade.php b/resources/views/downloads/index.blade.php index 70b60b7..ca4aa38 100644 --- a/resources/views/downloads/index.blade.php +++ b/resources/views/downloads/index.blade.php @@ -1,17 +1,18 @@ -@extends('layouts.app', ['title' => 'Download SonarDesk — Native SonarQube monitoring for macOS', 'description' => 'Download the latest signed SonarDesk release for macOS, review release notes and system requirements.']) +@extends('layouts.app', ['title' => 'Downloads — SonarDesk and developer tools', 'description' => 'Browse SonarDesk and other macOS developer utilities. View release details or download installers.']) @section('fullbleed') -
{{ $settings['eyebrow'] }}

{{ $settings['title'] }}

{{ $settings['intro'] }}

@if($latest)
✓ Signed distribution✓ SHA-256 verified✓ Secure licence activation
@else
The next SonarDesk release is being prepared.Check back shortly or contact support.
@endif
SonarDesk
SonarDesk
Project healthAll systems monitored
NativeBuilt for macOS
-
Native macOSFast, focused desktop workflow
SonarQubeYour server remains the source of truth
SecurityTokens protected by macOS Keychain
UpdatesProfessional in-app release delivery
-
@if($latest)
Latest stable release

SonarDesk {{ $latest->version }}

Build {{ $latest->build_number }} · Released {{ $latest->published_at?->format('j F Y') }}

Download {{ $latest->version }}
{!! nl2br(e($latest->release_notes ?: 'This release contains the latest SonarDesk improvements and maintenance updates.')) !!}
SHA-256 checksum · Verify download{{ $latest->sha256 }}
@endif
-@if($products->isNotEmpty()) -
Software catalogue

More downloads

Additional tools and installers available from our team.

@foreach($products as $product) -
-
{{ $product->platform ?: 'Software' }}{{ $product->version ? 'v'.$product->version : 'Latest' }}
-

{{ $product->name }}

-

{{ \Illuminate\Support\Str::limit(trim(preg_replace('/\s+/', ' ', strip_tags(\Illuminate\Support\Str::markdown($product->description ?: 'Download the latest available package.', ['html_input' => 'strip', 'allow_unsafe_links' => false])))), 190) }}

- -
@endforeach
+
+
Software downloads

Downloads

Find the latest releases of SonarDesk and our developer tools. View details, check requirements or download directly.

+
Available software

Product catalogue

All downloads in one place.

+
+@if($latest) +
macOSv{{ $latest->version }}

SonarDesk

{{ \Illuminate\Support\Str::limit(trim(preg_replace('/\s+/', ' ', strip_tags(\Illuminate\Support\Str::markdown($latest->release_notes ?: $settings['intro'], ['html_input'=>'strip','allow_unsafe_links'=>false])))), 175) }}

@endif -
Release archive

Previous versions

Published SonarDesk builds remain available here for customers who need a previous release.

@forelse($releases as $release)
SonarDesk {{ $release->version }}Build {{ $release->build_number }} · {{ ucfirst($release->channel) }} · {{ $release->published_at?->format('j M Y') }}
{{ $release->formatted_size }}Download
@empty

No published releases are available yet.

@endforelse
{{ $releases->links() }}
-
Support

Installation or activation help?

{{ $settings['support_text'] }}

Contact SonarDesk support
+@foreach($products as $product) +
{{ $product->platform ?: 'Software' }}{{ $product->version ? 'v'.$product->version : 'Latest' }}

{{ $product->name }}

{{ \Illuminate\Support\Str::limit(trim(preg_replace('/\s+/', ' ', strip_tags(\Illuminate\Support\Str::markdown($product->description ?: 'Download the latest available package.', ['html_input'=>'strip','allow_unsafe_links'=>false])))), 175) }}

+@endforeach + +@if(!$latest && $products->isEmpty())

No published downloads are available yet.

@endif + +@if($releases->isNotEmpty())
SonarDesk archive

Previous SonarDesk versions

Older published installers, grouped separately from current products.

@foreach($releases as $release)
SonarDesk {{ $release->version }}Build {{ $release->build_number }} · {{ ucfirst($release->channel) }} · {{ $release->published_at?->format('j M Y') }}
{{ $release->formatted_size }}Download
@endforeach
{{ $releases->links() }}
@endif +
@endsection diff --git a/resources/views/downloads/sonardesk.blade.php b/resources/views/downloads/sonardesk.blade.php new file mode 100644 index 0000000..a454983 --- /dev/null +++ b/resources/views/downloads/sonardesk.blade.php @@ -0,0 +1,4 @@ +@extends('layouts.app', ['title' => 'SonarDesk — Details and download', 'description' => 'SonarDesk release notes, system requirements and macOS installer.']) +@section('fullbleed') +
← All downloads
macOSv{{ $latest->version }}

SonarDesk

{{ $settings['intro'] }}

Version {{ $latest->version }} · Build {{ $latest->build_number }} · {{ $latest->formatted_size }} · Released {{ $latest->published_at?->format('j F Y') }}

Download SonarDesk ↓

Release notes

{!! \Illuminate\Support\Str::markdown($latest->release_notes ?: 'Latest maintenance and improvements.', ['html_input'=>'strip','allow_unsafe_links'=>false]) !!}

System requirements

{{ $settings['requirements'] }}

@if($latest->minimum_macos)

Minimum macOS version: {{ $latest->minimum_macos }}

@endif

Installation

  1. Download the signed installer.
  2. Open the DMG and move SonarDesk to Applications.
  3. Launch SonarDesk and activate with your licence.
@if($latest->sha256)
SHA-256 checksum{{ $latest->sha256 }}
@endif
+@endsection diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 4efb8b8..8defb68 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -353,6 +353,23 @@ .download-page .product-detail-panel .distribution-product-description li {margin:6px 0;} @media(max-width:700px){.download-page .distribution-product-grid{grid-template-columns:1fr;}} + +/* Compact, unified software catalogue */ +.download-page.catalogue-page .catalogue-header {padding:64px 0 32px;background:#f5f7fb;} +.download-page.catalogue-page .catalogue-header h1 {font-size:clamp(36px,4vw,54px);letter-spacing:-.045em;color:#101828;margin:10px 0;} +.download-page.catalogue-page .catalogue-header p {font-size:18px;color:#667085;max-width:720px;} +.download-page.catalogue-page .distribution-catalogue {padding-top:28px;} +.download-page .distribution-product-card h3 a {color:inherit;text-decoration:none;} +.download-page .distribution-product-card h3 a:hover {color:#175cd3;} +.download-page.catalogue-page .distribution-product-card {padding:24px;} +.download-page.catalogue-page .distribution-product-card h3 {margin:14px 0 10px;font-size:28px;} +.download-page.catalogue-page .distribution-product-description {margin-bottom:18px;} +.download-page .detail-section {margin-top:36px;border-top:1px solid #eaecf0;padding-top:26px;} +.download-page .detail-section h2 {font-size:24px;font-weight:800;margin-bottom:14px;color:#101828;} +.download-page .detail-section ol {padding-left:24px;list-style:decimal;} +.download-page .detail-section li {margin:8px 0;} +.download-page .detail-meta {color:#667085;margin:12px 0 22px;} + @stack('head') diff --git a/routes/web.php b/routes/web.php index 7793c3c..9f8359f 100644 --- a/routes/web.php +++ b/routes/web.php @@ -25,6 +25,7 @@ Route::get('/robots.txt', [SeoController::class, 'robots'])->name('robots'); Route::get('/', fn () => view('portal.welcome', ['latestRelease' => \App\Models\SonarDeskRelease::published()->where('channel', 'stable')->latest('published_at')->first()]))->name('home'); Route::view('/features', 'features')->name('features'); Route::get('/release', [ReleaseController::class, 'index'])->name('release'); +Route::get('/downloads/sonardesk/details', [ReleaseController::class, 'sonarDeskDetails'])->name('download.sonardesk.details'); Route::get('/download', [ReleaseController::class, 'latest'])->name('download.latest'); Route::get('/downloads/products/{product}/details', [ReleaseController::class, 'productDetails'])->name('download.product.details'); Route::get('/downloads/products/{product}', [ReleaseController::class, 'productDownload'])->name('download.product');