move into sonardesk
This commit is contained in:
+12
-2
@@ -3,6 +3,16 @@ use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
return new class extends Migration {
|
||||
public function up(): void { Schema::table('download_products',function(Blueprint $table){$table->longText('release_notes')->nullable();$table->text('minimum_system')->nullable();$table->integer('sort_order')->default(0);}); }
|
||||
public function down(): void {Schema::table('download_products',function(Blueprint $table){$table->dropColumn(['release_notes','minimum_system','sort_order']);});}
|
||||
public function up(): void {
|
||||
if (!Schema::hasTable('download_products')) return;
|
||||
foreach (['release_notes' => 'longText', 'minimum_system' => 'text', 'sort_order' => 'integer'] as $column => $type) {
|
||||
if (!Schema::hasColumn('download_products', $column)) {
|
||||
Schema::table('download_products', function (Blueprint $table) use ($column, $type) {
|
||||
$definition = $table->{$type}($column);
|
||||
if ($column === 'sort_order') $definition->default(0); else $definition->nullable();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
public function down(): void { /* Preserve existing download metadata. */ }
|
||||
};
|
||||
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
return new class extends Migration {
|
||||
public function up(): void {
|
||||
if (!Schema::hasTable('download_products')) return;
|
||||
foreach (['release_notes'=>'longText','minimum_system'=>'text','sort_order'=>'integer'] as $column=>$type) {
|
||||
if (!Schema::hasColumn('download_products',$column)) Schema::table('download_products',function(Blueprint $table) use ($column,$type) {
|
||||
$c=$table->{$type}($column); if ($column==='sort_order') $c->default(0); else $c->nullable();
|
||||
});
|
||||
}
|
||||
}
|
||||
public function down(): void { /* Keep uploaded download metadata intact. */ }
|
||||
};
|
||||
@@ -1,4 +1,6 @@
|
||||
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Product downloads · ABSDEV</title><link rel="stylesheet" href="{{ asset('css/sonardesk-absdev.css') }}"><link rel="stylesheet" href="{{ asset('css/sonardesk-downloads.css') }}"></head><body class="sd-site"><header class="sd-top"><a class="sd-brand" href="{{ url('/') }}">ABS<span>DEV</span></a><nav><a href="{{ url('/sonardesk') }}">SonarDesk</a><a href="{{ url('/sonardesk/features') }}">Features</a><a href="{{ url('/sonardesk/pricing') }}">Pricing</a><a class="selected" href="{{ route('sonardesk.downloads') }}">Downloads</a></nav></header><main class="sd-main"><section class="sd-intro"><span class="sd-kicker">ABSDEV SOFTWARE</span><h1>Downloads & releases</h1><p>Get the latest versions of SonarDesk, SonarDisk and additional tools. Choose the installer that matches your system.</p></section>
|
||||
@if($latest)<section class="sd-feature"><div><span class="sd-kicker">LATEST STABLE · SONARDESK</span><h2>SonarDesk <span>{{ $latest->version }}</span></h2><p>{{ \Illuminate\Support\Str::limit(strip_tags($latest->release_notes ?: 'Native SonarQube monitoring for macOS.'),180) }}</p><div class="sd-buttons"><a class="sd-btn" href="{{ route('sonardesk.releases.download',$latest) }}">Download for macOS ↓</a><a class="sd-btn ghost" href="{{ route('sonardesk.releases.show',$latest) }}">Release details →</a></div></div><div class="sd-feature-art"><span>Sonar<span class="sd-gold">Desk</span></span><small>Native code quality dashboard</small></div></section>@endif
|
||||
@if($products->isNotEmpty())<section class="sd-section"><div class="sd-section-title"><span class="sd-kicker">SOFTWARE LIBRARY</span><h2>Products & alternative downloads</h2><p>Installers are grouped by product, with each available platform and version listed together.</p></div>@foreach($products->groupBy('name') as $name => $files)<article class="sd-product"><div class="sd-product-head"><div><h3>{{ $name }}</h3><p>{{ $files->first()->description ?: 'Available downloads and supporting files.' }}</p></div><span class="sd-count">{{ $files->count() }} {{ $files->count() === 1 ? 'download' : 'downloads' }}</span></div><div class="sd-files">@foreach($files as $file)<div class="sd-file"><div><strong>{{ $file->version ? 'Version '.$file->version : ($file->original_filename ?: 'Download') }}</strong><small>{{ $file->platform ?: 'All platforms' }} @if($file->file_size) · {{ number_format($file->file_size / 1048576,1) }} MB @endif</small></div><div class="sd-file-actions"><a href="{{ route('sonardesk.products.show',$file) }}">Details</a><a class="sd-btn small" href="{{ route('sonardesk.products.download',$file) }}">Download ↓</a></div></div>@endforeach</div></article>@endforeach</section>@endif
|
||||
<section class="sd-section"><div class="sd-section-title"><span class="sd-kicker">RELEASE HISTORY</span><h2>SonarDesk versions</h2><p>Full release notes and system requirements are available on each release page.</p></div><div class="sd-history">@forelse($releases as $release)<div class="sd-file"><div><strong>SonarDesk {{ $release->version }}</strong><small>Build {{ $release->build_number }} · {{ ucfirst($release->channel) }}</small><p>{{ \Illuminate\Support\Str::limit(strip_tags($release->release_notes ?: 'Release information'),120) }}</p></div><div class="sd-file-actions"><a href="{{ route('sonardesk.releases.show',$release) }}">Release notes</a><a class="sd-btn small" href="{{ route('sonardesk.releases.download',$release) }}">Download ↓</a></div></div>@empty<p>No SonarDesk releases published yet.</p>@endforelse</div><div class="sd-pagination">{{ $releases->links() }}</div></section></main><footer class="sd-footer"><span>© {{ date('Y') }} ABSDEV</span><a href="{{ url('/') }}">ABSDEV homepage</a></footer></body></html>
|
||||
@extends('sonardesk.layout')
|
||||
@section('title','Software downloads and releases')
|
||||
@section('content')<div class="product-shell"><header class="page-heading"><span class="eyebrow">ABSDEV Software Library</span><h1>Downloads & releases.</h1><p>Find SonarDesk, SonarDisk and alternative installers, grouped by product. Release notes and system requirements are on the detail pages.</p></header>
|
||||
@if($latest)<section class="download-group"><span class="eyebrow">Latest stable · SonarDesk</span><div class="download-group-head"><div><h2>SonarDesk {{ $latest->version }}</h2><p>{{ \Illuminate\Support\Str::limit(strip_tags($latest->release_notes ?: 'Native SonarQube monitoring for macOS.'), 180) }}</p></div><span class="badge">Latest release</span></div><div class="actions"><a class="button" href="{{ route('sonardesk.releases.download',$latest) }}">Download installer ↓</a><a class="button outline" href="{{ route('sonardesk.releases.show',$latest) }}">Full release notes →</a></div></section>@endif
|
||||
@if($products->isNotEmpty())<section class="product-section" style="padding-top:40px"><div class="section-heading"><span class="eyebrow">Product catalogue</span><h2>Products & alternative downloads</h2><p>Each product lists its available versions and platforms together.</p></div>@foreach($products->groupBy('name') as $name=>$files)<article class="download-group"><div class="download-group-head"><div><h2>{{ $name }}</h2><p>{{ $files->first()->description ?: 'Installers and supporting downloads.' }}</p></div><span class="badge">{{ $files->count() }} {{ $files->count() === 1 ? 'file' : 'files' }}</span></div>@foreach($files as $file)<div class="download-row"><div><strong>{{ $file->version ? 'Version '.$file->version : ($file->original_filename ?: 'Download') }}</strong><small>{{ $file->platform ?: 'All platforms' }} @if($file->file_size) · {{ number_format($file->file_size/1048576,1) }} MB @endif</small><p>{{ \Illuminate\Support\Str::limit(strip_tags($file->release_notes ?: $file->description ?: ''),120) }}</p></div><div class="row-actions"><a class="text-link" href="{{ route('sonardesk.products.show',$file) }}">Details →</a><a class="button small" href="{{ route('sonardesk.products.download',$file) }}">Download ↓</a></div></div>@endforeach</article>@endforeach</section>@endif
|
||||
<section class="product-section" style="padding-top:20px"><div class="section-heading"><span class="eyebrow">Release archive</span><h2>SonarDesk release history</h2></div><div class="download-group">@forelse($releases as $release)<div class="download-row"><div><strong>SonarDesk {{ $release->version }}</strong><small>Build {{ $release->build_number }} · {{ ucfirst($release->channel) }}</small><p>{{ \Illuminate\Support\Str::limit(strip_tags($release->release_notes ?: 'Release information'),125) }}</p></div><div class="row-actions"><a class="text-link" href="{{ route('sonardesk.releases.show',$release) }}">Release notes →</a><a class="button small" href="{{ route('sonardesk.releases.download',$release) }}">Download ↓</a></div></div>@empty<p>No SonarDesk releases have been published yet.</p>@endforelse</div><div class="pagination">{{ $releases->links() }}</div></section></div>@endsection
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{ $product->name }} · ABSDEV</title><link rel="stylesheet" href="{{ asset('css/sonardesk-downloads.css') }}"></head><body class="sd-site"><header class="sd-top"><a class="sd-brand" href="{{ url('/') }}">ABS<span>DEV</span></a><nav><a href="{{ url('/sonardesk') }}">SonarDesk</a><a href="{{ route('sonardesk.downloads') }}">All downloads</a></nav></header><main class="sd-main sd-detail"><a class="sd-back" href="{{ route('sonardesk.downloads') }}">← All downloads</a><span class="sd-kicker">PRODUCT DOWNLOAD</span><h1>{{ $product->name }}</h1><p class="sd-lead">{{ $product->description }}</p><div class="sd-meta"><span>Version {{ $product->version ?: 'Unspecified' }}</span><span>{{ $product->platform ?: 'All platforms' }}</span></div><a class="sd-btn" href="{{ route('sonardesk.products.download',$product) }}">Download {{ $product->original_filename }} ↓</a>@if($product->release_notes)<section class="sd-detail-section"><h2>Release notes</h2><div class="sd-pre">{{ $product->release_notes }}</div></section>@endif@if($product->minimum_system)<section class="sd-detail-section"><h2>System requirements</h2><div class="sd-pre">{{ $product->minimum_system }}</div></section>@endif</main><footer class="sd-footer">© {{ date('Y') }} ABSDEV</footer></body></html>
|
||||
@extends('sonardesk.layout')
|
||||
@section('title',$product->name.' download')
|
||||
@section('content')<div class="product-shell"><header class="page-heading"><a class="text-link" href="{{ route('sonardesk.downloads') }}">← All downloads</a><p class="eyebrow">Product download</p><h1>{{ $product->name }}</h1><p>{{ $product->description }}</p></header><article class="detail-panel"><span class="badge">{{ $product->platform ?: 'All platforms' }}</span><p class="muted">Version {{ $product->version ?: 'Unspecified' }}</p><a class="button" href="{{ route('sonardesk.products.download',$product) }}">Download {{ $product->original_filename }} ↓</a>@if($product->release_notes)<h2>Full release notes</h2><div class="preformatted">{{ $product->release_notes }}</div>@endif@if($product->minimum_system)<h2>System requirements</h2><div class="preformatted">{{ $product->minimum_system }}</div>@endif</article></div>@endsection
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>SonarDesk {{ $release->version }} · ABSDEV</title><link rel="stylesheet" href="{{ asset('css/sonardesk-downloads.css') }}"></head><body class="sd-site"><header class="sd-top"><a class="sd-brand" href="{{ url('/') }}">ABS<span>DEV</span></a><nav><a href="{{ url('/sonardesk') }}">SonarDesk</a><a href="{{ route('sonardesk.downloads') }}">All downloads</a></nav></header><main class="sd-main sd-detail"><a class="sd-back" href="{{ route('sonardesk.downloads') }}">← All downloads</a><span class="sd-kicker">SONARDESK · {{ strtoupper($release->channel) }}</span><h1>SonarDesk {{ $release->version }}</h1><p class="sd-lead">Build {{ $release->build_number }}</p><a class="sd-btn" href="{{ route('sonardesk.releases.download',$release) }}">Download {{ $release->original_filename }} ↓</a><section class="sd-detail-section"><h2>Release notes</h2><div class="sd-pre">{{ $release->release_notes ?: 'No release notes provided.' }}</div></section><section class="sd-detail-section"><h2>System requirements</h2><p>macOS {{ $release->minimum_macos ?: 'See application documentation' }} or later.</p></section>@if($release->sha256)<section class="sd-detail-section"><h2>File verification</h2><p>SHA-256</p><code class="sd-hash">{{ $release->sha256 }}</code></section>@endif</main><footer class="sd-footer">© {{ date('Y') }} ABSDEV</footer></body></html>
|
||||
@extends('sonardesk.layout')
|
||||
@section('title','SonarDesk '.$release->version.' release notes')
|
||||
@section('content')<div class="product-shell"><header class="page-heading"><a class="text-link" href="{{ route('sonardesk.downloads') }}">← All downloads</a><p class="eyebrow">SonarDesk · {{ strtoupper($release->channel) }}</p><h1>SonarDesk {{ $release->version }}</h1><p>Build {{ $release->build_number }}</p></header><article class="detail-panel"><a class="button" href="{{ route('sonardesk.releases.download',$release) }}">Download {{ $release->original_filename }} ↓</a><h2>Full release notes</h2><div class="preformatted">{{ $release->release_notes ?: 'No release notes provided.' }}</div><h2>System requirements</h2><p>macOS {{ $release->minimum_macos ?: 'See application documentation' }} or later.</p>@if($release->sha256)<h2>File verification · SHA-256</h2><code class="hash">{{ $release->sha256 }}</code>@endif</article></div>@endsection
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,3 +1,3 @@
|
||||
@extends('sonardesk.layout')
|
||||
@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 & 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
|
||||
@section('content')<div class="product-shell"><header class="page-heading"><span class="eyebrow">Features</span><h1>A native workspace for SonarQube.</h1><p>Stay close to your projects, quality gates and issues without the browser overhead.</p></header><div class="cards"><article class="card"><h3>Quality gates</h3><p>Spot passing and failing projects immediately.</p></article><article class="card"><h3>Bugs & vulnerabilities</h3><p>Inspect reliability and security issues in context.</p></article><article class="card"><h3>Code smells</h3><p>Explore maintainability findings and issue details.</p></article><article class="card"><h3>Multiple projects</h3><p>Keep your project list organised and switch context quickly.</p></article><article class="card"><h3>Multiple servers</h3><p>Manage connections to your SonarQube environments.</p></article><article class="card"><h3>Export reports</h3><p>Produce project reports for sharing and AI-assisted analysis.</p></article></div><section class="product-section"><div class="callout"><div><h2>Download SonarDesk</h2><p>Find current installers and complete release notes.</p></div><a class="button" href="{{ route('sonardesk.downloads') }}">Downloads →</a></div></section></div>@endsection
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
@extends('sonardesk.layout')
|
||||
@section('title','SonarDesk — Native SonarQube monitoring for macOS')
|
||||
@section('title','SonarDesk — Native SonarQube dashboard for macOS')
|
||||
@section('content')
|
||||
<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 & 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>
|
||||
<section class="product-hero"><div class="product-shell hero-grid"><div><span class="eyebrow">Native macOS · SonarQube</span><h1>Code quality.<br><em>Without the clutter.</em></h1><p class="lead">A dedicated Mac dashboard for SonarQube. Track quality gates, bugs, vulnerabilities and code smells across projects without living in a browser.</p><div class="actions"><a class="button" href="{{ route('sonardesk.downloads') }}">Download SonarDesk ↓</a><a class="button secondary" href="{{ url('/sonardesk/features') }}">Explore features →</a></div><p style="color:#aab9cb;margin-top:18px">Built for macOS · Multiple SonarQube servers · Native workflow</p></div><div class="app-window" aria-label="Illustrative SonarDesk application dashboard"><div class="app-window-bar"><i></i><i></i><i></i></div><div class="app-window-body"><span class="eyebrow">Project overview</span><h3>Code health at a glance</h3><div class="app-stats"><div class="app-stat"><b style="color:#13865c">✓ Passed</b><span>Quality gate</span></div><div class="app-stat"><b>12</b><span>Issues to review</span></div><div class="app-stat"><b>3</b><span>Projects</span></div><div class="app-stat"><b>1</b><span>Security hotspots</span></div></div><p class="muted" style="font-size:12px">Illustrative preview, not live project data.</p></div></div></div></section>
|
||||
<section class="product-section"><div class="product-shell"><div class="section-heading"><span class="eyebrow">Everything in one workspace</span><h2>See the signals. Investigate the issues.</h2><p>Designed for developers who need actionable SonarQube information without switching tabs.</p></div><div class="cards"><article class="card"><span class="eyebrow">01 · Monitor</span><h3>Quality gates & metrics</h3><p>See gate status, bugs, vulnerabilities and maintainability at a glance.</p></article><article class="card"><span class="eyebrow">02 · Investigate</span><h3>Issue navigation</h3><p>Browse issues and move through details quickly, from one native workspace.</p></article><article class="card"><span class="eyebrow">03 · Organise</span><h3>Projects & servers</h3><p>Switch between projects and manage SonarQube server connections.</p></article><article class="card"><span class="eyebrow">04 · Share</span><h3>Project reports</h3><p>Export reports for review and AI-assisted analysis.</p></article><article class="card"><span class="eyebrow">05 · Native</span><h3>Made for your Mac</h3><p>A focused desktop application that respects macOS workflows.</p></article><article class="card"><span class="eyebrow">06 · Explore</span><h3>More than a status badge</h3><p>Drill into code smells, bugs and security findings by project.</p></article></div></div></section>
|
||||
<section class="product-section alt"><div class="product-shell"><div class="callout"><div><h2>Ready to see your code clearly?</h2><p>Browse the latest installers, release notes and available licence plans.</p></div><div class="actions"><a class="button" href="{{ route('sonardesk.downloads') }}">Get SonarDesk ↓</a><a class="button secondary" href="{{ url('/sonardesk/pricing') }}">View pricing →</a></div></div></div></section>
|
||||
@endsection
|
||||
|
||||
@@ -2,8 +2,16 @@
|
||||
$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="@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 & 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>
|
||||
<!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, native macOS SonarQube monitoring, releases and downloads from ABSDEV')">
|
||||
<link rel="stylesheet" href="{{ asset('css/sonardesk-product.css') }}"></head>
|
||||
<body class="product-site">
|
||||
<header class="product-header"><div class="product-shell header-inner">
|
||||
<a class="product-brand" href="{{ $base ?: '/' }}"><span class="brand-symbol">S</span><strong>Sonar<span>Desk</span></strong></a>
|
||||
<nav aria-label="Product navigation" class="product-nav"><a href="{{ $base ?: '/' }}">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>
|
||||
<a class="header-parent" href="{{ url('https://absdev.net') }}">ABSDEV ↗</a>
|
||||
</div></header>
|
||||
<main id="main">@yield('content')</main>
|
||||
<footer class="product-footer"><div class="product-shell footer-inner"><div><strong>SonarDesk</strong><p>Native SonarQube monitoring for macOS · An ABSDEV product.</p></div><div class="footer-links"><a href="{{ $base ?: '/' }}">Overview</a><a href="{{ route('sonardesk.downloads') }}">Downloads</a><a href="{{ route('sonardesk.buy') }}">Licensing</a><a href="{{ url('https://absdev.net') }}">ABSDEV</a></div></div></footer>
|
||||
</body></html>
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
@extends('sonardesk.layout')
|
||||
@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
|
||||
@section('content')<div class="product-shell"><header class="page-heading"><span class="eyebrow">Licensing</span><h1>Choose the right SonarDesk plan.</h1><p>Personal and Professional licensing for a native macOS SonarQube workflow.</p></header><div class="price-grid"><article class="price-card"><span class="eyebrow">Personal</span><h2>For individual developers</h2><div class="price-number">£4.99 <small>/ month</small></div><p class="muted">Or £39.99 per year</p><ul class="feature-list"><li>Native macOS dashboard</li><li>Project quality gates and issues</li><li>Organised SonarQube workflow</li></ul><a class="button" href="{{ route('sonardesk.buy') }}">Choose Personal →</a></article><article class="price-card featured"><span class="eyebrow">Professional</span><h2>For professional workflows</h2><div class="price-number">£8.99 <small>/ month</small></div><p class="muted">Or £79.99 per year</p><ul class="feature-list"><li>Professional SonarDesk licence</li><li>Multi-project workflows</li><li>Developer-focused issue exploration</li></ul><a class="button" href="{{ route('sonardesk.buy') }}">Choose Professional →</a></article></div><p class="muted" style="margin:24px 0 70px">Final billing options and terms are shown by the existing licensing checkout.</p></div>@endsection
|
||||
|
||||
Reference in New Issue
Block a user