License Key Required
No license key entered.
Enter or update your key with php artisan health:license <key>,
or purchase one at scriptgain.com.
Updates
settings.updates
Compiled PHP
What Blade turns your template into. This is what the syntax check parses.
Loading…
Available Variables And Components
A guide to what this template can use, derived from the shipped source. Click any item to insert it at your cursor. It is a helpful reference, not a runtime guarantee.
Always Available
Shared with the admin panel by the staff layout.- Validation error bag. Always present. Pairs with @error('field').
- The admin sidebar navigation structure.
- Sub-items of the currently open nav group.
- Breadcrumb trail for the current page.
- Signed-in staffer's initials, for the avatar.
- Signed-in staffer's name.
- Signed-in staffer's email address.
- The staffer's role, e.g. "Administrator".
- True when the signed-in staffer is an administrator.
- Number of open service requests, for the badge.
- Number of unread form submissions, for the badge.
- The configured admin-shell width class.
- URL of the uploaded site logo, or null.
- URL of the uploaded favicon, or null.
In This Template
- El.
- Status.
Drop any of these in. Click to insert the opening tag at your cursor.
General
Admin Panel
Layouts
Records
Site (Public)
Common Blade
- Print a value, safely escaped. The default choice.
- Print raw HTML. Only for content you trust.
- Show something conditionally.
- Loop over a collection.
- Loop, with a fallback when the collection is empty.
- Show a validation message for a field.
- A small block of PHP. Never on line 1. Keep logic out of templates.
- A comment that never reaches the browser.
Civic Helpers
- Build a URL to a named route, e.g. a department page.
- Link to a single news post.
- Turn a stored upload path into a public URL.
- A cache-busted URL for a bundled asset.
- Read a config value, e.g. the site width class.
- Build an absolute URL to a path.
No History Yet
Every save, revert, and reset of this template is recorded here, with a one-click way back to any of them.
The Template That Shipped With The Product
Read only. This is what Reset To Default puts back.
<x-layouts.app title="Software Updates">
<x-page-header title="Software Updates" icon="refresh" subtitle="Keep this install on the latest signed release." />
@if (session('status'))
<div class="mb-5 rounded-lg bg-brand-50 px-4 py-3 text-sm text-brand-800 ring-1 ring-brand-200">{{ session('status') }}</div>
@endif
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
<div class="min-w-0 lg:col-span-2 space-y-6">
<x-card title="Version" subtitle="Your installed build versus the latest release published for your license.">
<div class="flex flex-wrap items-center gap-x-10 gap-y-4">
<div>
<p class="text-xs font-medium uppercase tracking-wide text-slate-500">Installed</p>
<p class="mt-1 text-2xl font-semibold text-slate-900 tabular">{{ $status['current'] }}</p>
</div>
<div>
<p class="text-xs font-medium uppercase tracking-wide text-slate-500">Latest</p>
<p class="mt-1 text-2xl font-semibold text-slate-900 tabular">{{ $status['latest'] ?: '–' }}</p>
</div>
<div>
@if ($status['available'])
<x-badge color="warn" dot>Update Available</x-badge>
@else
<x-badge color="success" dot>Up To Date</x-badge>
@endif
</div>
</div>
<div class="mt-6 flex flex-wrap items-center gap-3 border-t border-slate-100 pt-5">
<form method="POST" action="{{ route('settings.updates.check') }}">
@csrf
<x-button type="submit" variant="secondary" size="sm" icon="refresh">Check For Updates</x-button>
</form>
@if ($status['available'])
<form method="POST" action="{{ route('settings.updates.apply') }}"
x-data x-on:submit="$el.querySelector('button').disabled = true">
@csrf
<x-button type="submit" size="sm" icon="download">Update To {{ $status['latest'] }}</x-button>
</form>
@endif
@if ($status['checked_at'])
<span class="text-xs text-slate-400">Last checked {{ \Illuminate\Support\Carbon::parse($status['checked_at'])->diffForHumans() }}</span>
@endif
</div>
@if ($status['last_result'])
<p class="mt-4 text-sm {{ str_starts_with($status['last_result'], 'error') ? 'text-rose-600' : 'text-slate-500' }}">{{ $status['last_result'] }}</p>
@endif
</x-card>
<x-card title="Automatic Updates" subtitle="When on, this install applies new signed releases on its own overnight.">
<form method="POST" action="{{ route('settings.updates.auto') }}" x-data x-on:change="$el.submit()">
@csrf
<style>
.up-sw{position:relative;display:inline-flex;height:1.5rem;width:2.75rem;flex:0 0 auto;align-items:center;border-radius:9999px;background:#cbd5e1;transition:background .15s;}
.up-sw input{position:absolute;opacity:0;width:0;height:0;margin:0;}
.up-sw i{position:absolute;left:.25rem;height:1rem;width:1rem;border-radius:9999px;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.25);transition:transform .15s;}
.up-sw input:checked ~ i{transform:translateX(1.25rem);}
.up-sw:has(input:checked){background:var(--color-brand-600,#4f46e5);}
</style>
{{-- Native checkbox so toggling fires a real change event and the form saves. --}}
<label class="flex items-start gap-3 cursor-pointer select-none">
<span class="up-sw"><input type="checkbox" name="auto" value="1" @checked($status['auto'])><i></i></span>
<span class="text-sm">
<span class="font-medium text-slate-900">Install Updates Automatically</span>
<span class="block text-slate-500">The install checks every few minutes for a newer signed release and applies it soon after it's published. A backup of the current build is kept before each update.</span>
</span>
</label>
</form>
</x-card>
</div>
<div class="space-y-6">
<x-card title="How Updates Work" flush>
<div class="p-5 space-y-3 text-sm text-slate-600">
<p>Update availability comes from your <strong>signed license response</strong>, so the version and download are verified against the vendor key.</p>
<p>Each release tarball is checksum-verified before it is applied, and the previous build is archived under <code class="text-xs">storage/app/private/updates</code> in case a rollback is needed.</p>
<p>Backups keep running throughout; only new code, migrations, and caches are touched.</p>
</div>
</x-card>
</div>
</div>
</x-layouts.app>
Blade In One Screen
The directives you will use most.
- Print a value, escaped. Safe by default.
- Print raw HTML. Only for content you trust.
- Show something conditionally.
- Loop over a collection.
- Use a shared component. Every component in Shared Components is available.
- A comment that never reaches the browser.
{{ $variable }}
{!! $html !!}
@if / @else / @endif
@foreach / @endforeach
<x-card>
{{-- comment --}}
House Rules
Follow these and your edits will survive updates.
-
Never start line 1 with
@php. Blade mis-parses it and the page fails. The editor refuses to save it. - Keep logic out of templates. If you need a calculation, it belongs in a composer or component class, not here.
- The shipped file is never modified. Reset To Default always gets you back.
- Every save is versioned. You can revert to any earlier version in one click.
- Press Tab inside the editor to indent rather than jump to the next field.