move into sonardesk

This commit is contained in:
Mark Gregory
2026-10-12 16:06:40 +01:00
parent 7ed8c6ef58
commit 27af94d8ca
11 changed files with 48 additions and 94 deletions
@@ -1,15 +1,3 @@
@extends('licensing::customer.layout')
@section('title', 'SonarDesk · Purchase')
@section('content')
<section class="card">
<h1>SonarDesk</h1>
<p>Native SonarQube project monitoring for macOS.</p>
<p>Choose your licence on our secure checkout service. Your subscription and licence are processed by the existing SonarDesk licensing platform.</p>
@if($enabled)
<p><a href="{{ route('sonardesk.checkout') }}" style="display:inline-block;background:#163b70;color:#fff;padding:12px 20px;border-radius:8px;text-decoration:none">View plans &amp; buy</a></p>
@else
<p role="status">Online checkout is not yet enabled on this site. No payment will be taken here.</p>
@endif
<p><a href="{{ route('sonardesk.downloads') }}">Downloads &amp; release notes</a> · <a href="{{ route('account.sonardesk.index') }}">My licences</a></p>
</section>
@endsection
@extends('sonardesk.layout')
@section('title','SonarDesk — Purchase')
@section('content')<section class="sd-pagehead"><div class="sd-container"><span class="sd-eyebrow">SonarDesk licensing</span><h1>Get SonarDesk</h1><p>Choose your licence using the existing secure SonarDesk checkout service.</p></div></section><section class="sd-section"><div class="sd-container sd-detail"><div class="sd-card"><h2>Purchase a licence</h2><p>Your subscription, billing and licence are managed by the established SonarDesk service.</p>@if($enabled)<a class="sd-btn sd-btn-dark" href="{{ route('sonardesk.checkout') }}">View plans &amp; buy →</a>@else<p class="sd-note">Online checkout is not enabled on this site yet. No payment will be taken here.</p>@endif<div class="sd-card-actions"><a class="sd-textlink" href="{{ route('sonardesk.downloads') }}">Downloads &amp; release notes →</a><a class="sd-textlink" href="{{ route('account.sonardesk.index') }}">My licences →</a></div></div></div></section>@endsection
@@ -1,13 +1,7 @@
@extends('sonardesk.layout')
@section('title','Downloads & Release Notes')
@section('content')
<section class="sd-hero" style="padding-bottom:24px"><span class="sd-kicker">SonarDesk / Distribution</span><h1>Downloads <span style="color:var(--gold)">&amp; releases.</span></h1><p class="sd-lead">Installers and published release history, collected in one place. Review details before downloading.</p></section>
@if($latest)
<section class="sd-section"><div class="sd-section-head"><div><span class="sd-kicker">Latest stable release</span><h2>SonarDesk {{ $latest->version }}</h2><p>{{ \Illuminate\Support\Str::limit(trim(strip_tags($latest->release_notes ?? 'Native SonarQube monitoring for macOS.')), 210) }}</p></div><span class="sd-badge">Stable</span></div><div class="sd-actions"><a class="sd-button" href="{{ route('sonardesk.releases.download',$latest) }}">Download SonarDesk →</a><a class="sd-button secondary" href="{{ route('sonardesk.releases.show',$latest) }}">Release notes &amp; requirements</a></div></section>
@endif
<section class="sd-section"><div class="sd-section-head"><div><span class="sd-kicker">Product library</span><h2>Available downloads</h2><p>Published products grouped together, with concise descriptions and direct access to details.</p></div></div>
@if($products->isNotEmpty())<div class="sd-list">@foreach($products as $product)<article class="sd-row"><div><span class="sd-badge">{{ $product->platform ?: 'Software' }}</span><h3 style="margin-top:10px">{{ $product->name }} <span class="sd-meta">{{ $product->version }}</span></h3><p>{{ \Illuminate\Support\Str::limit(trim(strip_tags($product->description ?? '')), 160) }}</p></div><div class="sd-row-actions"><a class="sd-button secondary" href="{{ route('sonardesk.products.show',$product) }}">Details</a><a class="sd-button" href="{{ route('sonardesk.products.download',$product) }}">Download ↓</a></div></article>@endforeach</div>
@else<div class="sd-empty">No additional products have been published yet.</div>@endif
</section>
<section class="sd-section"><div class="sd-section-head"><div><span class="sd-kicker">Version history</span><h2>Release notes</h2><p>Browse changes and download previous published builds.</p></div></div><div class="sd-list">@forelse($releases as $release)<article class="sd-row"><div><h3>SonarDesk {{ $release->version }} <span class="sd-badge">{{ ucfirst($release->channel) }}</span></h3><p>{{ \Illuminate\Support\Str::limit(trim(strip_tags($release->release_notes ?? 'Release notes available on the details page.')), 160) }}</p><span class="sd-meta">{{ $release->published_at?->format('j M Y') }}</span></div><div class="sd-row-actions"><a class="sd-button secondary" href="{{ route('sonardesk.releases.show',$release) }}">Full notes</a><a class="sd-button" href="{{ route('sonardesk.releases.download',$release) }}">Download ↓</a></div></article>@empty<div class="sd-empty">No releases have been published yet.</div>@endforelse</div><div style="margin-top:24px">{{ $releases->links() }}</div></section>
@endsection
@section('content')<section class="sd-pagehead"><div class="sd-container"><span class="sd-eyebrow">Software distribution</span><h1>Downloads &amp; release notes</h1><p>All published applications in one place. Download current installers, view product details and read complete release notes.</p></div></section><section class="sd-section"><div class="sd-container"><span class="sd-eyebrow">Current downloads</span><h2>Available software</h2><div class="sd-grid">
@if($latest)<article class="sd-card"><span class="sd-eyebrow">SonarDesk · macOS</span><h3>SonarDesk</h3><p class="sd-meta">Version {{ $latest->version }} @if($latest->published_at) · {{ $latest->published_at->format('j M Y') }} @endif</p><p>{{ \Illuminate\Support\Str::limit(trim(preg_replace('/\s+/', ' ', strip_tags(\Illuminate\Support\Str::markdown($latest->release_notes ?: 'Native SonarQube project monitoring for macOS.', ['html_input'=>'strip','allow_unsafe_links'=>false])))), 155) }}</p><div class="sd-card-actions"><a class="sd-btn sd-btn-dark" href="{{ route('sonardesk.latest') }}">Download ↓</a><a class="sd-textlink" href="{{ route('sonardesk.releases.show',$latest) }}">Details &amp; notes →</a></div></article>@endif
@foreach($products as $product)<article class="sd-card"><span class="sd-eyebrow">{{ $product->platform ?: 'Software' }}</span><h3>{{ $product->name }}</h3><p class="sd-meta">{{ $product->version ? 'Version '.$product->version : 'Current release' }}</p><p>{{ \Illuminate\Support\Str::limit(trim(preg_replace('/\s+/', ' ', strip_tags(\Illuminate\Support\Str::markdown($product->description ?: 'Published software download.', ['html_input'=>'strip','allow_unsafe_links'=>false])))), 155) }}</p><div class="sd-card-actions"><a class="sd-btn sd-btn-dark" href="{{ route('sonardesk.products.download',$product) }}">Download ↓</a><a class="sd-textlink" href="{{ route('sonardesk.products.show',$product) }}">Product details →</a></div></article>@endforeach
</div>@if(!$latest && $products->isEmpty())<p class="sd-note">No published installers are available yet. Downloads appear automatically when a product or release is published in the distribution administration.</p>@endif</div></section>
<section class="sd-section sd-section-alt"><div class="sd-container"><span class="sd-eyebrow">Release archive</span><h2>SonarDesk release history</h2><p class="sd-intro">Read a summary here or open the full release page for notes, requirements and the installer.</p><div class="sd-list">@forelse($releases as $release)<article class="sd-row"><div><strong>SonarDesk {{ $release->version }}</strong><p>Build {{ $release->build_number }} · {{ ucfirst($release->channel) }} @if($release->published_at) · {{ $release->published_at->format('j M Y') }} @endif</p><p>{{ \Illuminate\Support\Str::limit(trim(preg_replace('/\s+/', ' ', strip_tags(\Illuminate\Support\Str::markdown($release->release_notes ?: 'Release information available on the details page.', ['html_input'=>'strip','allow_unsafe_links'=>false])))), 160) }}</p></div><div class="sd-row-actions"><a href="{{ route('sonardesk.releases.show',$release) }}">Release details →</a><a href="{{ route('sonardesk.releases.download',$release) }}">Download ↓</a></div></article>@empty<p>No published releases yet.</p>@endforelse</div><div class="sd-pagination">{{ $releases->links() }}</div></div></section>@endsection
@@ -1,3 +1,3 @@
@extends('sonardesk.layout')
@section('title', $product->name)
@section('content')<section class="sd-hero" style="padding-bottom:24px"><a class="sd-meta" href="{{ route('sonardesk.downloads') }}">← All downloads</a><p class="sd-kicker">Product details</p><h1>{{ $product->name }}</h1><p class="sd-lead">{{ $product->platform }} · Version {{ $product->version }}</p><div class="sd-actions"><a class="sd-button" href="{{ route('sonardesk.products.download',$product) }}">Download {{ $product->original_filename ?: 'file' }} ↓</a><a class="sd-button secondary" href="{{ route('sonardesk.downloads') }}">Other downloads</a></div></section><section class="sd-section"><div class="sd-grid two"><article class="sd-card"><h2>About this product</h2><div class="sd-text">{{ $product->description ?: 'No description provided.' }}</div></article><article class="sd-card"><h2>Download details</h2><p>Platform: {{ $product->platform ?: 'Not specified' }}</p><p>Version: {{ $product->version ?: 'Not specified' }}</p><p>File: {{ $product->original_filename ?: 'Download' }}</p>@if($product->file_size)<p>Size: {{ number_format($product->file_size / 1048576, 1) }} MB</p>@endif</article></div></section>@endsection
@section('title',$product->name.' — Download')
@section('content')<section class="sd-pagehead"><div class="sd-container"><a class="sd-back" href="{{ route('sonardesk.downloads') }}">← All downloads</a><p class="sd-eyebrow" style="margin-top:24px">{{ $product->platform ?: 'Software' }} · {{ $product->version ? 'Version '.$product->version : 'Current release' }}</p><h1>{{ $product->name }}</h1><p>Product information and installer download.</p><div class="sd-actions"><a class="sd-btn sd-btn-primary" href="{{ route('sonardesk.products.download',$product) }}">Download {{ $product->name }} ↓</a></div></div></section><section class="sd-section"><div class="sd-container sd-detail"><article class="sd-card"><h2>About {{ $product->name }}</h2><div class="sd-prose">{!! \Illuminate\Support\Str::markdown($product->description ?: 'Published software download.', ['html_input'=>'strip','allow_unsafe_links'=>false]) !!}</div><hr class="sd-divider"><h2>Download information</h2><p><strong>Platform:</strong> {{ $product->platform ?: 'See product documentation' }}</p>@if($product->version)<p><strong>Version:</strong> {{ $product->version }}</p>@endif @if($product->file_size)<p><strong>Size:</strong> {{ number_format($product->file_size / 1048576, 2) }} MB</p>@endif<a class="sd-btn sd-btn-dark" href="{{ route('sonardesk.products.download',$product) }}">Download installer ↓</a></article></div></section>@endsection
@@ -1,3 +1,3 @@
@extends('sonardesk.layout')
@section('title', 'SonarDesk '.$release->version.' Release Notes')
@section('content')<section class="sd-hero" style="padding-bottom:20px"><a class="sd-meta" href="{{ route('sonardesk.downloads') }}">← All downloads</a><p class="sd-kicker">{{ ucfirst($release->channel) }} release · {{ $release->published_at?->format('j M Y') }}</p><h1>SonarDesk <span style="color:var(--gold)">{{ $release->version }}</span></h1><p class="sd-lead">Build {{ $release->build_number ?: '—' }}</p><div class="sd-actions"><a class="sd-button" href="{{ route('sonardesk.releases.download',$release) }}">Download {{ $release->original_filename ?: 'SonarDesk' }} ↓</a><a class="sd-button secondary" href="{{ route('sonardesk.downloads') }}">Browse all releases</a></div></section><section class="sd-section"><div class="sd-grid two" style="grid-template-columns:minmax(0,1.5fr) minmax(280px,.7fr)"><article class="sd-card"><h2>Full release notes</h2><div class="sd-text">{{ $release->release_notes ?: 'No release notes provided.' }}</div></article><article class="sd-card"><h2>System requirements</h2><p>macOS {{ $release->minimum_macos ?: 'Version not specified' }}@if($release->minimum_macos) or later @endif</p><h3>File information</h3><p>{{ $release->original_filename ?: 'SonarDesk installer' }}</p>@if($release->file_size)<p>{{ number_format($release->file_size / 1048576, 1) }} MB</p>@endif @if($release->sha256)<p class="sd-meta">SHA-256</p><code style="font-size:12px;word-break:break-all">{{ $release->sha256 }}</code>@endif</article></div></section>@endsection
@section('title','SonarDesk '.$release->version.' — Release Notes')
@section('content')<section class="sd-pagehead"><div class="sd-container"><a class="sd-back" href="{{ route('sonardesk.downloads') }}">← All downloads</a><p class="sd-eyebrow" style="margin-top:24px">SonarDesk · {{ ucfirst($release->channel) }}</p><h1>SonarDesk {{ $release->version }}</h1><p>Build {{ $release->build_number }} @if($release->published_at) · Released {{ $release->published_at->format('j F Y') }} @endif</p><div class="sd-actions"><a class="sd-btn sd-btn-primary" href="{{ route('sonardesk.releases.download',$release) }}">Download SonarDesk ↓</a></div></div></section><section class="sd-section"><div class="sd-container sd-detail"><article class="sd-card"><h2>Release notes</h2><div class="sd-prose">{!! \Illuminate\Support\Str::markdown($release->release_notes ?: 'No release notes were provided for this version.', ['html_input'=>'strip','allow_unsafe_links'=>false]) !!}</div><hr class="sd-divider"><h2>System requirements</h2><p><strong>Platform:</strong> macOS</p><p><strong>Minimum version:</strong> {{ $release->minimum_macos ?: 'See application documentation' }}</p><hr class="sd-divider"><h2>Installation</h2><ol><li>Download the signed application installer.</li><li>Open the downloaded disk image and move SonarDesk into Applications.</li><li>Launch SonarDesk and configure your SonarQube connection.</li></ol>@if($release->file_size)<p class="sd-meta">Installer size: {{ number_format($release->file_size / 1048576, 2) }} MB</p>@endif @if($release->sha256)<details><summary>SHA-256 checksum</summary><p class="sd-checksum"><code>{{ $release->sha256 }}</code></p></details>@endif<div class="sd-actions"><a class="sd-btn sd-btn-dark" href="{{ route('sonardesk.releases.download',$release) }}">Download version {{ $release->version }} ↓</a></div></article></div></section>@endsection
File diff suppressed because one or more lines are too long
@@ -23,10 +23,10 @@
: 'Streamline operations, boost productivity, and improve customer satisfaction with one connected platform built for modern teams.',
])
@endif
<section class="abs-sonardesk-feature" style="background:linear-gradient(115deg,#0d1b30,#172b49);border-block:1px solid #3b4c68;padding:64px 0;color:#f4f6fb">
<div style="width:min(1440px,calc(100% - 48px));margin:auto;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:28px">
<div style="max-width:740px"><span style="color:#e6bd6b;font-weight:800;font-size:12px;letter-spacing:.16em">ABSDEV SOFTWARE</span><h2 style="font-size:clamp(36px,4vw,56px);margin:12px 0;line-height:1.1">Sonar<span style="color:#e6bd6b">Desk</span></h2><p style="color:#c2d0e2;font-size:18px;line-height:1.6">Native SonarQube monitoring for macOS. Keep quality gates, issues and project health in view, all from your desktop.</p></div>
<div style="display:flex;gap:12px;flex-wrap:wrap"><a href="{{ route('absdev.sonardesk.home') }}" style="background:#e6bd6b;color:#0d1b30;padding:13px 20px;border-radius:9px;font-weight:800">Explore SonarDesk →</a><a href="{{ route('sonardesk.downloads') }}" style="border:1px solid #8496af;color:#f4f6fb;padding:13px 20px;border-radius:9px;font-weight:750">Downloads</a></div>
<section style="padding:78px 0;background:linear-gradient(120deg,#0b1a30,#17375a);color:#f4f7fb">
<div class="wrap" style="display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:36px;align-items:center">
<div><span style="color:#e5b95b;font-size:12px;font-weight:800;letter-spacing:.17em">ABSDEV SOFTWARE</span><h2 style="font-size:clamp(36px,4vw,55px);line-height:1.12;margin:15px 0">Meet <span style="color:#e5b95b">SonarDesk</span></h2><p style="color:#c6d4e7;font-size:18px;max-width:650px">Native SonarQube monitoring for macOS. Quality gates, vulnerabilities, bugs and issue details — without the browser clutter.</p><div style="display:flex;gap:12px;flex-wrap:wrap;margin-top:26px"><a href="{{ url('/sonardesk') }}" style="padding:12px 20px;border-radius:8px;background:#e5b95b;color:#102540;font-weight:750">Explore SonarDesk →</a><a href="{{ route('sonardesk.downloads') }}" style="padding:12px 20px;border-radius:8px;border:1px solid #ffffff77;color:white;font-weight:750">Downloads ↓</a></div></div>
<div style="border:1px solid #ffffff28;border-radius:18px;background:#ffffff0c;padding:30px"><p style="color:#e5b95b;font-weight:750">SonarDesk for macOS</p><h3 style="font-size:25px;margin:10px 0">Know your code health.</h3><p style="color:#c6d4e7">One focused workspace for project quality, issues and server connections.</p><a href="{{ url('/sonardesk/features') }}" style="color:#e5b95b;font-weight:700">Explore features →</a></div>
</div>
</section>
@endsection
@@ -14,39 +14,19 @@
@if (filter_var($headerContent['show_navigation'] ?? true, FILTER_VALIDATE_BOOL))
<nav class="desktop-nav" aria-label="Primary navigation">
@foreach ($navigationLinks as $link)
@if (strtolower(trim($link['label'])) !== 'products' && strtolower(trim($link['label'])) !== 'sonardesk')
@if (!empty($link['children']))
<details class="abs-nav-group"><summary>{{ $link['label'] }}</summary><div class="abs-nav-panel">
@foreach ($link['children'] as $child)
<a href="{{ $child['url'] }}" @if($child['target'] ?? null) target="{{ $child['target'] }}" rel="noopener" @endif>{{ $child['label'] }}</a>
@endforeach
</div></details>
@else
<a href="{{ $link['url'] }}" @if($link['target'] ?? null) target="{{ $link['target'] }}" rel="noopener" @endif>{{ $link['label'] }}</a>
@endif
@endif
@continue(in_array(strtolower(trim($link['label'])), ['products','sonardesk'], true))
<a href="{{ $link['url'] }}" @if($link['target'] ?? null) target="{{ $link['target'] }}" rel="noopener" @endif>{{ $link['label'] }}</a>
@endforeach
<details class="abs-nav-group abs-products"><summary>Products <span aria-hidden="true">⌄</span></summary>
<div class="abs-nav-panel">
<a href="{{ route('absdev.sonardesk.home') }}"><strong>SonarDesk</strong><small>Native SonarQube dashboard for Mac</small></a>
<a href="{{ route('absdev.sonardesk.features') }}">Features</a>
<a href="{{ route('absdev.sonardesk.pricing') }}">Pricing</a>
<a href="{{ route('sonardesk.downloads') }}">Downloads &amp; releases</a>
</div>
</details>
<div class="abs-products-menu"><a href="{{ url('/sonardesk') }}" aria-haspopup="true">Products <span aria-hidden="true">⌄</span></a><div class="abs-products-dropdown"><a href="{{ url('/sonardesk') }}">SonarDesk overview</a><a href="{{ url('/sonardesk/features') }}">Features</a><a href="{{ url('/sonardesk/pricing') }}">Pricing</a><a href="{{ route('sonardesk.downloads') }}">Downloads &amp; release notes</a></div></div>
</nav>
@endif
<style>
.abs-nav-group{position:relative;display:flex;align-items:center}
.abs-nav-group summary{list-style:none;cursor:pointer;color:#ddd;font-size:14px;white-space:nowrap}
.abs-nav-group summary::-webkit-details-marker{display:none}
.abs-nav-group[open] summary,.abs-nav-group summary:hover{color:#e5b95b}
.abs-nav-panel{position:absolute;top:calc(100% + 20px);left:0;width:280px;z-index:100;background:#131d30;border:1px solid #35415a;border-radius:12px;box-shadow:0 22px 45px #0008;padding:9px;display:grid;gap:2px}
.abs-nav-panel a{display:block!important;padding:10px 12px!important;color:#eaf0f9!important;border-radius:7px;font-size:13px!important}
.abs-nav-panel a:hover{background:#253550;color:#e5b95b!important}
.abs-nav-panel small{display:block;color:#aab8ce;font-size:11px}
.abs-mobile-products{padding:12px 16px;border-top:1px solid #3a3a3a;display:grid;gap:10px}
.abs-mobile-products strong{color:#e5b95b}.abs-mobile-products a{padding:5px 0!important}
.saasland-theme .abs-products-menu{position:relative;display:flex;align-items:center;height:100%}
.saasland-theme .abs-products-menu>a{white-space:nowrap}
.saasland-theme .abs-products-dropdown{display:none;position:absolute;top:100%;right:0;min-width:235px;padding:10px;background:#142c48;border:1px solid #ffffff33;border-radius:12px;box-shadow:0 16px 36px #0005;z-index:100}
.saasland-theme .abs-products-menu:hover .abs-products-dropdown,.saasland-theme .abs-products-menu:focus-within .abs-products-dropdown{display:grid}
.saasland-theme .abs-products-dropdown a{padding:10px 12px;color:#f0f4fa;border-radius:6px;font-size:14px}
.saasland-theme .abs-products-dropdown a:hover{background:#ffffff16;color:#e5b95b}
</style>
<div class="nav-actions">
@@ -69,18 +49,12 @@
@if (filter_var($headerContent['show_mobile_menu'] ?? true, FILTER_VALIDATE_BOOL))
<div id="{{ $mobileMenuId }}" class="mobile-nav" data-saasland-mobile-nav hidden>
@foreach($navigationLinks as $link)
@if (!in_array(strtolower(trim($link['label'])), ['products', 'sonardesk'], true))
<a href="{{ $link['url'] }}" @if($link['target'] ?? null) target="{{ $link['target'] }}" rel="noopener" @endif>{{ $link['label'] }}</a>
@foreach(($link['children'] ?? []) as $child)
<a href="{{ $child['url'] }}" style="padding-left:28px">{{ $child['label'] }}</a>
@endforeach
@endif
@continue(in_array(strtolower(trim($link['label'])), ['products','sonardesk'], true))
<a href="{{ $link['url'] }}" @if($link['target'] ?? null) target="{{ $link['target'] }}" rel="noopener" @endif>{{ $link['label'] }}</a>
@endforeach
<div class="abs-mobile-products"><strong>Products · SonarDesk</strong>
<a href="{{ route('absdev.sonardesk.home') }}">Overview</a>
<a href="{{ route('absdev.sonardesk.features') }}">Features</a>
<a href="{{ route('absdev.sonardesk.pricing') }}">Pricing</a>
<a href="{{ route('sonardesk.downloads') }}">Downloads &amp; releases</a>
</div>
<a href="{{ url('/sonardesk') }}">Products · SonarDesk</a>
<a href="{{ url('/sonardesk/features') }}">SonarDesk features</a>
<a href="{{ url('/sonardesk/pricing') }}">SonarDesk pricing</a>
<a href="{{ route('sonardesk.downloads') }}">Downloads &amp; releases</a>
</div>
@endif
+2 -2
View File
@@ -1,3 +1,3 @@
@extends('sonardesk.layout')
@section('title','Features')
@section('content')<section class="sd-hero"><span class="sd-kicker">SonarDesk / Features</span><h1>Less switching.<br><span style="color:var(--gold)">More clarity.</span></h1><p class="sd-lead">Stay close to your SonarQube project health with a native macOS workspace.</p><div class="sd-actions"><a class="sd-button" href="{{ route('sonardesk.downloads') }}">Download SonarDesk →</a></div></section><section class="sd-section"><div class="sd-grid"><article class="sd-card"><h3>Quality gates</h3><p>Keep the current status of your projects visible.</p></article><article class="sd-card"><h3>Bugs &amp; vulnerabilities</h3><p>Explore issues and their details without losing context.</p></article><article class="sd-card"><h3>Code smells</h3><p>See maintainability concerns alongside your other quality metrics.</p></article><article class="sd-card"><h3>Multiple servers</h3><p>Connect to and switch between SonarQube servers.</p></article><article class="sd-card"><h3>Project organisation</h3><p>Arrange your project sidebar around your workflow.</p></article><article class="sd-card"><h3>Native macOS experience</h3><p>Designed for the desktop with light and dark appearance support.</p></article></div></section>@endsection
@section('title','SonarDesk Features')
@section('content')<section class="sd-pagehead"><div class="sd-container"><span class="sd-eyebrow">Built for developers</span><h1>Everything important. Nothing distracting.</h1><p>A native Mac workspace for SonarQube project monitoring and issue investigation.</p></div></section><section class="sd-section"><div class="sd-container"><div class="sd-grid"><article class="sd-card"><h3>Quality gate status</h3><p>Monitor project health and identify failing quality gates.</p></article><article class="sd-card"><h3>Bugs &amp; vulnerabilities</h3><p>Investigate reliability and security findings in context.</p></article><article class="sd-card"><h3>Code smells</h3><p>See maintainability issues without switching between browser tabs.</p></article><article class="sd-card"><h3>Project management</h3><p>Organise multiple projects and switch between them quickly.</p></article><article class="sd-card"><h3>Multiple SonarQube servers</h3><p>Manage connections and access projects across servers.</p></article><article class="sd-card"><h3>Export reports</h3><p>Generate project reports for review and further analysis.</p></article></div><div class="sd-actions"><a class="sd-btn sd-btn-dark" href="{{ route('sonardesk.downloads') }}">View downloads →</a><a class="sd-btn sd-btn-dark" href="{{ route('sonardesk.buy') }}">Licensing options →</a></div></div></section>@endsection
+4 -4
View File
@@ -1,7 +1,7 @@
@extends('sonardesk.layout')
@section('title','SonarDesk — SonarQube for Mac')
@section('title','SonarDesk — Native SonarQube monitoring for macOS')
@section('content')
<section class="sd-hero"><span class="sd-kicker">Native macOS · SonarQube</span><h1>Your code quality.<br><span style="color:var(--gold)">Clearly in view.</span></h1><p class="sd-lead">A dedicated Mac dashboard for SonarQube. Follow quality gates, inspect bugs and vulnerabilities, and move between projects without the clutter.</p><div class="sd-actions"><a class="sd-button" href="{{ route('sonardesk.downloads') }}">Browse downloads →</a><a class="sd-button secondary" href="{{ $sdBase }}/features">Explore features</a><a class="sd-button secondary" href="{{ $sdBase }}/pricing">See pricing</a></div><p class="sd-meta">Built for macOS · Connects to your SonarQube server</p></section>
<section class="sd-section"><div class="sd-section-head"><div><span class="sd-kicker">Everything in one place</span><h2>Quality signals, not noise.</h2></div></div><div class="sd-grid"><article class="sd-card"><span class="sd-badge">01 / Monitor</span><h3 style="margin-top:16px">Project health at a glance</h3><p>Track quality gates, bugs, vulnerabilities and code smells from a single dashboard.</p></article><article class="sd-card"><span class="sd-badge">02 / Investigate</span><h3 style="margin-top:16px">Go straight to the issue</h3><p>Inspect issue details, navigate results and focus on the work that needs attention.</p></article><article class="sd-card"><span class="sd-badge">03 / Organise</span><h3 style="margin-top:16px">Your projects, your workflow</h3><p>Manage multiple projects and servers in a native Mac interface.</p></article></div></section>
<section class="sd-section"><div class="sd-card" style="display:flex;justify-content:space-between;align-items:center;gap:25px;flex-wrap:wrap"><div><span class="sd-kicker">Download centre</span><h2>Ready to get started?</h2><p>Find published installers, release notes and product details.</p></div><div class="sd-actions"><a class="sd-button" href="{{ route('sonardesk.downloads') }}">View all downloads →</a><a class="sd-button secondary" href="{{ route('sonardesk.buy') }}">Plans &amp; licensing</a></div></div></section>
<section class="sd-hero"><div class="sd-container sd-hero-grid"><div><span class="sd-eyebrow">SonarDesk · Native macOS software</span><h1>Code quality.<br><em>Clearly in view.</em></h1><p>Bring SonarQube projects, quality gates, bugs, vulnerabilities and code smells together in a focused desktop experience. Spend less time navigating dashboards and more time shipping reliable code.</p><div class="sd-actions"><a class="sd-btn sd-btn-primary" href="{{ route('sonardesk.downloads') }}">Download SonarDesk ↓</a><a class="sd-btn sd-btn-ghost" href="{{ (in_array(request()->getHost(), ['sonardesk.absdev.net','sonardesk.co.uk','www.sonardesk.co.uk'],true) ? '' : '/sonardesk') }}/features">Explore features →</a></div></div><div class="sd-visual" aria-label="Illustration of SonarDesk project metrics"><div class="sd-visual-top"><i></i><i></i><i></i></div><div class="sd-visual-title">Project overview <span style="float:right;color:#a8e0b4">● Quality gate passed</span></div><div class="sd-metrics"><div class="sd-metric"><b>✓</b><span>Quality gate</span></div><div class="sd-metric"><b>12</b><span>Issues to review</span></div><div class="sd-metric"><b>3</b><span>Projects</span></div><div class="sd-metric"><b>1</b><span>Security hotspot</span></div></div><p style="font-size:12px;color:#a9bdd5;margin-bottom:0">Illustrative dashboard — not live project data</p></div></div></section>
<section class="sd-section"><div class="sd-container"><span class="sd-eyebrow">Why SonarDesk</span><h2>Your code health, at a glance.</h2><p class="sd-intro">A purpose-built native macOS companion for SonarQube, designed for developers who want useful signals without unnecessary complexity.</p><div class="sd-grid"><article class="sd-card"><span class="sd-eyebrow">01 / Monitor</span><h3>Quality gates</h3><p>See project status, bugs, vulnerabilities and code smells from one dashboard.</p></article><article class="sd-card"><span class="sd-eyebrow">02 / Investigate</span><h3>Issue exploration</h3><p>Review issues, navigate details and focus on the changes that matter.</p></article><article class="sd-card"><span class="sd-eyebrow">03 / Organise</span><h3>Multiple projects</h3><p>Keep projects and servers organised in a native Mac workspace.</p></article></div></div></section>
<section class="sd-section sd-section-alt"><div class="sd-container"><span class="sd-eyebrow">Get started</span><h2>Everything you need to get moving.</h2><div class="sd-grid"><article class="sd-card"><h3>Features</h3><p>Explore the native tools built around your SonarQube workflow.</p><a class="sd-textlink" href="{{ (in_array(request()->getHost(), ['sonardesk.absdev.net','sonardesk.co.uk','www.sonardesk.co.uk'],true) ? '' : '/sonardesk') }}/features">Explore features →</a></article><article class="sd-card"><h3>Simple pricing</h3><p>Choose Personal or Professional licensing for your needs.</p><a class="sd-textlink" href="{{ (in_array(request()->getHost(), ['sonardesk.absdev.net','sonardesk.co.uk','www.sonardesk.co.uk'],true) ? '' : '/sonardesk') }}/pricing">Compare plans →</a></article><article class="sd-card"><h3>Downloads &amp; updates</h3><p>Find published installers, release history and detailed release notes.</p><a class="sd-textlink" href="{{ route('sonardesk.downloads') }}">Browse downloads →</a></article></div></div></section>
@endsection
+7 -11
View File
@@ -1,13 +1,9 @@
@php
$dedicated = in_array(request()->getHost(), ['sonardesk.absdev.net', 'sonardesk.co.uk', 'www.sonardesk.co.uk'], true);
$sdBase = $dedicated ? '' : '/sonardesk';
$dedicated = in_array(request()->getHost(), ['sonardesk.absdev.net','sonardesk.co.uk','www.sonardesk.co.uk'], true);
$base = $dedicated ? '' : '/sonardesk';
@endphp
<!doctype html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>@yield('title', 'SonarDesk') · ABSDEV</title><meta name="description" content="SonarDesk — native SonarQube monitoring for macOS.">
<style>
:root{color-scheme:dark;--navy:#0b1629;--gold:#e6bd6b;--muted:#a9b8ce;--border:#293953;--text:#f1f5fc}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:radial-gradient(ellipse at 85% -10%,#1d385b 0,transparent 42%),#0b1629;color:var(--text);font:16px/1.65 system-ui,-apple-system,sans-serif}a{color:inherit;text-decoration:none}a:hover{color:var(--gold)}.sd-container{width:min(1440px,calc(100% - 64px));margin:auto}.sd-header{border-bottom:1px solid var(--border);background:#0a1525e8;position:sticky;top:0;z-index:30;backdrop-filter:blur(18px)}.sd-header-inner{min-height:76px;display:flex;align-items:center;justify-content:space-between;gap:26px}.sd-brand{font-size:26px;font-weight:850;letter-spacing:-1.3px;white-space:nowrap}.sd-brand span{color:var(--gold)}.sd-nav{display:flex;align-items:center;gap:clamp(12px,2vw,30px);flex-wrap:wrap}.sd-nav a{font-size:14px;color:#c6d3e6}.sd-nav a[aria-current=page],.sd-nav a:hover{color:var(--gold)}.sd-nav .sd-nav-cta{background:var(--gold);color:#101c30;padding:9px 16px;border-radius:8px;font-weight:750}.sd-main{min-height:65vh}.sd-hero{padding:94px 0 65px;max-width:920px}.sd-kicker{font-size:12px;letter-spacing:.18em;text-transform:uppercase;color:var(--gold);font-weight:800}.sd-hero h1{font-size:clamp(43px,5.5vw,78px);line-height:1.07;letter-spacing:-.055em;margin:14px 0 22px}.sd-lead{font-size:clamp(17px,2vw,22px);color:#b9c8dd;max-width:760px;line-height:1.65}.sd-actions{display:flex;gap:12px;flex-wrap:wrap;margin:28px 0}.sd-button{display:inline-flex;align-items:center;justify-content:center;gap:8px;background:var(--gold);color:#101c30;border:1px solid var(--gold);border-radius:9px;padding:12px 20px;font-weight:800;font-size:14px}.sd-button:hover{background:#f3d390;color:#101c30}.sd-button.secondary{background:transparent;color:#eef4ff;border-color:#425575}.sd-button.secondary:hover{border-color:var(--gold);color:var(--gold)}.sd-section{padding:34px 0 65px}.sd-section-head{display:flex;justify-content:space-between;align-items:end;gap:24px;flex-wrap:wrap;margin-bottom:24px}.sd-section h2{font-size:clamp(26px,3vw,38px);letter-spacing:-.035em;margin:0 0 8px}.sd-section p{color:#b3c2d8}.sd-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px}.sd-grid.two{grid-template-columns:repeat(2,minmax(0,1fr))}.sd-card{min-width:0;background:linear-gradient(150deg,#192941,#101d30);border:1px solid #30425d;border-radius:14px;padding:26px}.sd-card h2,.sd-card h3{margin:0 0 9px;line-height:1.3}.sd-card p{color:#b5c3d6;margin:8px 0 16px}.sd-card .sd-actions{margin-bottom:0}.sd-meta{color:#aabbd2;font-size:13px}.sd-badge{display:inline-block;background:#e6bd6b18;color:var(--gold);border:1px solid #e6bd6b60;border-radius:99px;padding:3px 11px;font-size:12px;font-weight:750}.sd-list{display:grid;gap:12px}.sd-row{display:flex;align-items:center;justify-content:space-between;gap:22px;background:#15243a;border:1px solid var(--border);border-radius:12px;padding:20px 24px}.sd-row h3{margin:0 0 4px}.sd-row p{margin:4px 0;color:#b2c1d6}.sd-row-actions{display:flex;gap:10px;flex-wrap:wrap;align-items:center;flex-shrink:0}.sd-text{white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.75;color:#c6d3e4}.sd-footer{margin-top:60px;border-top:1px solid var(--border);padding:32px 0;color:#98acc8}.sd-footer-inner{display:flex;justify-content:space-between;gap:20px;flex-wrap:wrap}.sd-footer a{margin-left:18px}.sd-price{font-size:32px;font-weight:850;color:#fff}.sd-muted{color:#aabbd2}.sd-empty{border:1px dashed #465a78;border-radius:12px;padding:28px;color:#b8c7db}.sd-checks{padding-left:20px;color:#c0cde0}.sd-checks li{margin:8px 0}code{overflow-wrap:anywhere}@media(max-width:900px){.sd-grid,.sd-grid.two{grid-template-columns:1fr 1fr}.sd-header-inner{align-items:flex-start;flex-direction:column;padding:16px 0}.sd-nav{gap:14px}.sd-hero{padding:65px 0 40px}}@media(max-width:650px){.sd-container{width:calc(100% - 36px)}.sd-grid,.sd-grid.two{grid-template-columns:1fr}.sd-row{align-items:stretch;flex-direction:column}.sd-row-actions{flex-shrink:1}.sd-header{position:static}.sd-nav a{font-size:13px}.sd-hero h1{font-size:43px}.sd-card{padding:21px}}
</style></head><body>
<header class="sd-header"><div class="sd-container sd-header-inner"><a class="sd-brand" href="{{ $sdBase ?: '/' }}">Sonar<span>Desk</span></a><nav class="sd-nav" aria-label="SonarDesk navigation"><a href="{{ $sdBase ?: '/' }}">Overview</a><a href="{{ $sdBase }}/features">Features</a><a href="{{ $sdBase }}/pricing">Pricing</a><a href="{{ route('sonardesk.downloads') }}">Downloads</a><a href="{{ route('account.sonardesk.index') }}">My licences</a><a href="{{ url('/') }}">ABSDEV</a><a class="sd-nav-cta" href="{{ route('sonardesk.buy') }}">Get SonarDesk</a></nav></div></header>
<main class="sd-container sd-main">@yield('content')</main>
<footer class="sd-footer"><div class="sd-container sd-footer-inner"><span>SonarDesk by ABSDEV · Native macOS software</span><div><a href="{{ route('sonardesk.downloads') }}">Downloads</a><a href="{{ route('sonardesk.buy') }}">Licensing</a><a href="{{ route('account.sonardesk.index') }}">Account</a></div></div></footer></body></html>
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>@yield('title','SonarDesk') | ABSDEV</title><meta name="description" content="@yield('description','SonarDesk and developer software from Abbey Software Development')">
<link rel="stylesheet" href="{{ asset('css/sonardesk-absdev.css') }}"></head>
<body><header class="sd-header"><div class="sd-container sd-header-row"><a class="sd-logo" href="{{ url('/') }}" aria-label="ABSDEV home"><span class="sd-mark">A</span> ABS<span>DEV</span></a><nav class="sd-mainnav" aria-label="Primary"><a href="{{ url('/') }}">ABSDEV Home</a><div class="sd-navgroup"><a href="{{ $base ?: '/' }}" class="sd-navparent">SonarDesk <span aria-hidden="true">⌄</span></a><div class="sd-subnav"><a href="{{ $base ?: '/' }}">Overview</a><a href="{{ $base }}/features">Features</a><a href="{{ $base }}/pricing">Pricing</a><a href="{{ route('sonardesk.downloads') }}">Downloads &amp; releases</a></div></div><a href="{{ route('sonardesk.downloads') }}">Downloads</a><a href="{{ route('account.sonardesk.index') }}">My licences</a></nav><details class="sd-mobile"><summary aria-label="Toggle navigation">Menu</summary><nav><a href="{{ url('/') }}">ABSDEV Home</a><a href="{{ $base ?: '/' }}">SonarDesk overview</a><a href="{{ $base }}/features">Features</a><a href="{{ $base }}/pricing">Pricing</a><a href="{{ route('sonardesk.downloads') }}">Downloads</a><a href="{{ route('account.sonardesk.index') }}">My licences</a></nav></details></div></header>
<main id="main">@yield('content')</main><footer class="sd-footer"><div class="sd-container sd-footer-row"><div><strong>ABS<span>DEV</span></strong><p>Independent software. Built for developers.</p></div><div><a href="{{ $base ?: '/' }}">SonarDesk</a><a href="{{ route('sonardesk.downloads') }}">Downloads</a><a href="{{ route('sonardesk.buy') }}">Licensing</a><a href="{{ url('/') }}">ABSDEV</a></div></div></footer></body></html>
+2 -2
View File
@@ -1,3 +1,3 @@
@extends('sonardesk.layout')
@section('title','Pricing')
@section('content')<section class="sd-hero"><span class="sd-kicker">SonarDesk / Licensing</span><h1>Simple plans.<br><span style="color:var(--gold)">Built for developers.</span></h1><p class="sd-lead">Choose the SonarDesk licence that fits your workflow. Checkout and subscription management remain with the existing SonarDesk licensing service.</p></section><section class="sd-section"><div class="sd-grid two"><article class="sd-card"><span class="sd-badge">Personal</span><h2 style="margin-top:18px">For individual developers</h2><p><span class="sd-price">£4.99</span> / month</p><p>Or £39.99 billed annually.</p><a class="sd-button" href="{{ route('sonardesk.buy') }}">View purchase options →</a></article><article class="sd-card"><span class="sd-badge">Professional</span><h2 style="margin-top:18px">For advanced workflows</h2><p><span class="sd-price">£8.99</span> / month</p><p>Or £79.99 billed annually.</p><a class="sd-button" href="{{ route('sonardesk.buy') }}">View purchase options →</a></article></div><p class="sd-muted" style="margin-top:22px">The purchase page shows whether checkout is currently enabled. No payment is taken directly on ABSDEV.</p></section>@endsection
@section('title','SonarDesk Pricing')
@section('content')<section class="sd-pagehead"><div class="sd-container"><span class="sd-eyebrow">Straightforward licensing</span><h1>Choose your SonarDesk plan.</h1><p>Simple subscriptions for native macOS SonarQube monitoring. Checkout is handled by the existing SonarDesk licensing service.</p></div></section><section class="sd-section"><div class="sd-container"><div class="sd-grid" style="grid-template-columns:repeat(auto-fit,minmax(270px,1fr))"><article class="sd-card"><span class="sd-eyebrow">Personal</span><h3>For individual developers</h3><div class="sd-price">£4.99 <small>/ month</small></div><p>Or £39.99 per year.</p><p>Native project monitoring and issue exploration for your development workflow.</p><a class="sd-btn sd-btn-dark" href="{{ route('sonardesk.buy') }}">View purchase options →</a></article><article class="sd-card"><span class="sd-eyebrow">Professional</span><h3>For professional workflows</h3><div class="sd-price">£8.99 <small>/ month</small></div><p>Or £79.99 per year.</p><p>Professional SonarDesk licensing for developers who work across more projects and environments.</p><a class="sd-btn sd-btn-dark" href="{{ route('sonardesk.buy') }}">View purchase options →</a></article></div><p class="sd-note" style="margin-top:26px">Prices shown are indicative of the existing SonarDesk plans; final terms and available billing options are confirmed by the checkout service.</p></div></section>@endsection