{{-- Choosing a package. Choosing only — nothing is agreed to on this page. ## What was wrong with the last one Everything but the cards was pinned to the left half of the window: a 68-character title, an 80-character footnote, and a switch under them, on a 1240px shell. It read as a column that had lost its second half. And the terms sat at the TOP as a condition of looking at prices, which is the wrong order twice over — it is a condition of BUYING, and the buttons below it were dead until it was ticked, so the page arrived looking broken. The acceptance now lives one step later, on the checkout page, directly above the button that spends money. This page has no form on it at all. ## The shape A header band that uses the width — name and purpose left, the term switch right, where a control belongs. Then the cards. Then a closing band of three columns rather than a paragraph trailing off to the left. --}} @php use Illuminate\Support\Number; $eur = fn (int $cents, string $currency) => Number::currency($cents / 100, in: $currency, locale: app()->getLocale()); $bestFreeMonths = (int) collect($plans)->max('free_months'); @endphp
{{-- ── Header band ────────────────────────────────────────────────────── Title left, control right, one rule under both. The switch is a page control and not a card decoration, so it sits with the heading. --}}

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

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

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

@if ($plans !== [] && ! $contract)
{{-- One radius scale, nested: the shell is rounded-lg (16px) and the option inside it rounded (11px), which is the shell's radius less its own padding. A rounded-md option — Tailwind's untokenised 6px — read as a different component sitting inside this one. --}}
@foreach (['monthly', 'yearly'] as $option) @endforeach
@if ($bestFreeMonths > 0) {{ trans_choice('order.free_months_hint', $bestFreeMonths, ['count' => $bestFreeMonths]) }} @endif
@endif
@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 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">

{{ $plan['name'] }}

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

{{ $plan['audience'] }}

@endif {{-- The price of the term that is selected — the whole price, in the unit it is charged in. The yearly view used to show the monthly EQUIVALENT in the headline, so on a package with no free months the figure did not move at all when the switch was thrown, and the page looked like it had ignored the click. What a year works out to per month is worth knowing and is said underneath. --}}

{{ $eur($plan['gross'], $plan['currency']) }} {{ __('order.per_month') }}

{{ __('order.incl_vat', ['rate' => $vat]) }} · {{ __('order.net') }} {{ $eur($plan['net'], $plan['currency']) }}

{{ $eur($plan['yearly_gross'], $plan['currency']) }} {{ __('order.per_year') }}

{{ __('order.per_month_equivalent', ['amount' => $eur($plan['yearly_per_month'], $plan['currency'])]) }} · {{ __('order.incl_vat', ['rate' => $vat]) }} · {{ __('order.net') }} {{ $eur($plan['yearly_net'], $plan['currency']) }}

@if ($plan['free_months'] > 0)

{{ trans_choice('order.free_months_hint', $plan['free_months'], ['count' => $plan['free_months']]) }} · {{ __('order.instead_of', ['amount' => $eur($plan['twelve_months_gross'], $plan['currency'])]) }}

@endif
@if ($setup > 0)

{{ __('order.setup', ['amount' => $eur($setup, $plan['currency'])]) }}

@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 $label => $value)
{{ $label }}
{{ $value }}
@endforeach
{{-- A link, not a form: choosing a package is a navigation, and what follows is a page where the order is confirmed. The term travels in the address, so the checkout shows what was being looked at — and a reload of that page still shows it. --}} $plan['recommended'], 'border border-line-strong bg-surface text-ink hover:bg-surface-hover' => ! $plan['recommended'], ])> {{ __('order.choose') }}
@endforeach
{{-- ── The closing band ────────────────────────────────────────────── Three columns across the same width as the cards. It was one paragraph wrapped at 80 characters, which left two thirds of the page empty under a grid that used all of it. --}}
@foreach ([ ['icon' => 'refresh', 'title' => __('order.note_cancel_title'), 'body' => __('order.note_cancel_body')], ['icon' => 'lock', 'title' => __('order.note_payment_title'), 'body' => __('order.note_payment_body')], ['icon' => 'box', 'title' => __('order.note_migration_title'), 'body' => __('order.note_migration_body')], ] as $note)

{{ $note['title'] }}

{{ $note['body'] }}

@endforeach
@endif