{{-- Buying a package. The first version put five cards in a four-column grid, so the fifth wrapped and sat alone; the consent box was at the BOTTOM, which left every button disabled on arrival — a page that looks broken before you have done anything wrong. And the prices ran across the card in one block, so nothing stood out to compare. Now: the consent comes first, because it is the condition for everything under it. Three columns, so five plans read as 3 + 2 rather than 4 + 1. Each card is one column of the same four rows — price, delivery, what you get, the button — so the eye can run down a row and compare like with like. --}}

{{ __('order.title') }}

{{ __('order.subtitle') }}

@if ($contract) {{-- Not an error and not a dead end: they have a contract, and the way to a bigger package is a plan change, which prorates and leaves their data where it is. A second checkout would build a second, empty cloud and bill for both. --}} {{ __('order.already_customer') }} {{ __('order.to_billing') }} @elseif ($plans === []) {{ __('order.no_catalogue') }} @else @error('plan'){{ $message }}@enderror
{{-- ── The consent, first ──────────────────────────────────────── It was at the bottom, and every buy button was disabled until it was ticked — so the page arrived looking broken. Read in the order it applies: this is the condition, the packages are the choice. The server rule is still the real gate (CheckoutController validates `accepted`), so with JavaScript off the field arrives empty and the checkout is refused with the sentence explaining why. Ticking a box in a browser was never the record: the record is the timestamp taken when the payment lands. --}} @error('immediate_start') {{ $message }} @enderror {{-- ── The packages ────────────────────────────────────────────── Three columns: five plans read as 3 + 2, and a fifth card alone on a row of four reads as a mistake. items-start, because the recommended one is allowed to be taller without dragging its neighbours' buttons down with it. --}}
@foreach ($plans as $i => $plan)
$plan['recommended'], 'border-line' => ! $plan['recommended'], ]) style="animation-delay: {{ 60 + $i * 40 }}ms"> {{-- Name, who it is for, and the one badge. --}}

{{ $plan['name'] }}

@if ($plan['recommended']) {{ __('order.recommended') }} @endif
@if ($plan['audience'])

{{ $plan['audience'] }}

@endif {{-- The price, gross and large. A customer quoted 58,80 € on the website must not meet 49 € on the page with the button on it; the net figure is underneath for the books. --}}

{{ Number::currency($plan['gross'] / 100, in: $plan['currency'], locale: app()->getLocale()) }} {{ __('order.per_month') }}

{{ __('order.incl_vat', ['rate' => $vat]) }} · {{ __('order.net') }} {{ Number::currency($plan['net'] / 100, in: $plan['currency'], locale: app()->getLocale()) }}

@if ($setup > 0)

{{ __('order.setup', ['amount' => Number::currency($setup / 100, in: $plan['currency'], locale: app()->getLocale())]) }}

@endif {{-- Read from the estate, not written down: where a host has room this rolls out on its own. --}}
@foreach ([ __('order.storage') => $plan['quota_gb'] >= 1000 ? ($plan['quota_gb'] / 1000).' TB' : $plan['quota_gb'].' GB', __('order.traffic') => $plan['traffic_gb'] >= 1000 ? ($plan['traffic_gb'] / 1000).' TB' : $plan['traffic_gb'].' GB', __('order.seats') => __('order.up_to', ['count' => $plan['seats']]), ] as $term => $value)
{{ $term }}
{{ $value }}
@endforeach
{{-- A plain form post, not a Livewire action: the response is a redirect to another domain, and Livewire's XHR-and-swap cannot leave the site. --}}
@csrf {{-- Enabled, with the reason it will not go through said next to it. A disabled button explains nothing; this one is refused by the server with a sentence, and the line below says so first. --}} {{ __('order.buy') }}

{{ __('order.consent_first') }}

@endforeach

{{ __('order.terms') }}

@endif