{{-- The checkout page. Two columns: left is contact + billing + shipping + shipping method, right is the order summary (the same cart-body partial the drawer uses, minus its own "Checkout" CTA — see .bbk-checkout-summary in checkout.css). Stops short of payment for this slice — see CheckoutController's class docblock. $cart, $lines, $billingAddress, $shippingAddress, $shippingOptions, $countries come from CheckoutController::show(). --}} @extends('layouts.app') @section('title', __('checkout.page.title') . ' — ' . config('app.name')) @section('content')

{{ __('checkout.page.title') }}

{{-- Contact --}}
{{-- One combined marketing opt-in (offers + news + unfinished-order reminders). Optional, unticked, never required — all of it is direct marketing under ePrivacy (GR L. 3471/2006 art. 11), so it needs an explicit opt-in and checkout can't be gated on it. Persistence + prefill from the cart is Task 2 (back-end); data_get() here already reads it once that lands. --}}
{{-- Not wired yet — Modules\Core\Auth\Services\UserOtpService exists (email + one-time code, passwordless) but nothing in the storefront calls it yet. UI placeholder only; see project notes. --}}
@csrf {{-- Billing --}}

{{ __('checkout.page.billing_heading') }}

{{-- Shipping --}}

{{ __('checkout.page.shipping_heading') }}

{{-- Shipping method — only resolvable once a shipping address exists --}}

{{ __('checkout.page.shipping_method_heading') }}

@if ($shippingOptions->isEmpty())

{{ __('checkout.page.shipping_method_empty') }}

@else
@csrf
@foreach ($shippingOptions as $option) @endforeach
@error('shipping_option')

{{ $message }}

@enderror
@endif
{{-- TODO: payment — next slice. boboko-core's Offline driver is the only one fully wired end-to-end today; Stripe needs its client_secret / 3-D Secure continuation handled before it can drive a real form here. --}}
@endsection