License Key Required
No license key entered.
Enter or update your key with php artisan health:license <key>,
or purchase one at scriptgain.com.
Checkout
site.pay.checkout
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 every public page by the site layout.- Validation error bag. Always present. Pairs with @error('field').
- All site settings as an array, e.g. $site['site_name'].
- The school's short display name.
- The full legal name, e.g. "City Of Springfield".
- Main navigation items. Loop over it with @foreach.
- The small utility links in the top bar.
- The footer navigation links.
- The Quick Links grid items.
- The first few Quick Links, featured in the hero.
- The current emergency alert, or null when none is live.
- Up to eight departments listed in the footer.
- The configured page-width class, e.g. max-w-7xl. Use on your outer container.
- The current year, for the footer copyright line.
- URL of the uploaded site logo, or null.
- URL of the uploaded favicon, or null.
In This Template
- Amount Label.
- Bill.
- Client Secret.
- Connect Account Id.
- Is Test Mode.
- Payment.
- Publishable Key.
- Return Url.
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.public title="Payment Details">
@if ($isTestMode)
<x-site.test-mode-banner />
@endif
<x-site.page-hero title="Payment Details"
eyebrow="Online Payments"
icon="lock"
subtitle="Your card details go straight to our payment processor. They are never stored on this site."
:crumbs="[['label' => 'Pay Your Bill', 'href' => route('site.pay.index')], ['label' => 'Payment']]" />
<x-site.section :divider="false">
<div class="mx-auto max-w-xl">
{{-- What is being paid. Server-computed; the card form cannot change it. --}}
<div class="mb-6 overflow-hidden rounded-2xl bg-white ring-1 ring-slate-200 shadow-sm">
<div class="flex items-center justify-between gap-4 px-6 py-5">
<div class="min-w-0">
<p class="text-xs font-semibold uppercase tracking-wide text-slate-500">You Are Paying</p>
<p class="mt-1 font-medium text-slate-900">
@if ($bill)
{{ $bill->type?->label }}
<span class="block text-sm tabular text-slate-600">Bill {{ $bill->reference }}</span>
@else
{{ $payment->type?->label ?? 'Payment' }}
@if ($payment->notes)
<span class="block text-sm text-slate-600">{{ $payment->notes }}</span>
@endif
@endif
</p>
</div>
<span class="shrink-0 text-2xl font-semibold tabular text-brand-800">{{ $amountLabel }}</span>
</div>
</div>
@if ($isTestMode)
<div class="mb-6 rounded-xl bg-amber-50 px-4 py-3 text-sm text-amber-900 ring-1 ring-amber-200">
<p class="font-semibold">Test Mode</p>
<p class="mt-0.5">
Use Stripe's test card <span class="font-mono tabular">4242 4242 4242 4242</span>,
any future expiry date, and any three digit security code. No money will move.
</p>
</div>
@endif
<div id="payment-form"
data-publishable-key="{{ $publishableKey }}"
data-client-secret="{{ $clientSecret }}"
data-return-url="{{ $returnUrl }}"
data-connected-account="{{ $connectAccountId }}"
class="rounded-2xl bg-white p-6 sm:p-8 ring-1 ring-slate-200 shadow-sm">
<div id="payment-error" role="alert"
class="hidden mb-5 rounded-xl bg-rose-50 px-4 py-3 text-sm text-rose-800 ring-1 ring-rose-200">
<div class="flex items-start gap-2.5">
<x-icon name="warning" class="mt-0.5 w-4 h-4 shrink-0" aria-hidden="true" />
<span id="payment-error-text"></span>
</div>
</div>
<form novalidate>
<h2 class="text-base font-semibold text-slate-900">Card Details</h2>
{{-- Stripe Elements mounts here. The card fields live inside a
Stripe-hosted iframe, so card numbers never reach this
page or this server. --}}
<div id="payment-element" class="mt-4 min-h-[220px]"></div>
<button type="submit" id="payment-submit"
class="mt-6 inline-flex w-full items-center justify-center gap-2 rounded-lg bg-brand-700 px-5 py-3.5 text-base font-semibold text-white transition hover:bg-brand-800 disabled:opacity-60 disabled:pointer-events-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-2">
<svg id="payment-spinner" class="hidden h-5 w-5 animate-spin" viewBox="0 0 24 24" fill="none" aria-hidden="true">
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8v4a4 4 0 00-4 4H4z"></path>
</svg>
<span id="payment-submit-label">Pay {{ $amountLabel }}</span>
</button>
<p class="mt-4 flex items-start gap-2 text-xs leading-relaxed text-slate-500">
<x-icon name="lock" class="mt-0.5 w-3.5 h-3.5 shrink-0" aria-hidden="true" />
<span>
Payments are processed securely by Stripe. This site never sees or stores your full
card number. Do not refresh this page while your payment is processing.
</span>
</p>
</form>
</div>
<p class="mt-6 text-center text-sm text-slate-500">
Changed your mind?
<a href="{{ route('site.pay.index') }}" class="font-medium text-brand-700 hover:underline">Cancel this payment</a>.
Your card has not been charged yet.
</p>
</div>
{{-- Loaded here rather than pushed to a stack: the public layout has no
script stack, and adding one would mean editing a shared layout
this module does not own. Stripe.js must come from Stripe's own
domain; that is a PCI requirement, not a preference. --}}
<script src="https://js.stripe.com/v3/"></script>
<script src="{{ asset_v('js/payments.js') }}" defer></script>
</x-site.section>
</x-layouts.public>
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.