2026-09-08 20:41:49 +03:00
|
|
|
{{--
|
|
|
|
|
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')
|
|
|
|
|
<div class="bbk-checkout-page">
|
|
|
|
|
<h1 class="bbk-checkout-heading">{{ __('checkout.page.title') }}</h1>
|
|
|
|
|
|
|
|
|
|
<div class="bbk-checkout">
|
2026-09-09 13:51:00 +03:00
|
|
|
<div
|
|
|
|
|
class="bbk-checkout-main"
|
2026-09-09 19:16:20 +03:00
|
|
|
data-controller="bbk-checkout-form bbk-payment"
|
2026-09-09 13:51:00 +03:00
|
|
|
data-action="input->bbk-checkout-form#scheduleSave"
|
|
|
|
|
data-bbk-checkout-form-save-url-value="{{ route('checkout.address.save', app()->getLocale()) }}"
|
|
|
|
|
data-bbk-checkout-form-select-shipping-url-value="{{ route('checkout.shipping-option.select', app()->getLocale()) }}"
|
|
|
|
|
data-bbk-checkout-form-status-saving-value="{{ __('checkout.page.saving') }}"
|
|
|
|
|
data-bbk-checkout-form-status-saved-value="{{ __('checkout.page.saved') }}"
|
|
|
|
|
data-bbk-checkout-form-status-error-value="{{ __('checkout.page.save_error') }}"
|
2026-09-09 19:16:20 +03:00
|
|
|
data-bbk-payment-select-url-value="{{ route('checkout.payment-method.select', app()->getLocale()) }}"
|
|
|
|
|
data-bbk-payment-place-order-url-value="{{ route('checkout.place-order', app()->getLocale()) }}"
|
|
|
|
|
data-bbk-payment-order-status-url-value="{{ route('checkout.order-status', app()->getLocale()) }}"
|
|
|
|
|
data-bbk-payment-stripe-key-value="{{ config('services.stripe.public_key') }}"
|
|
|
|
|
data-bbk-payment-amount-value="{{ $cart?->total?->value ?? 0 }}"
|
|
|
|
|
data-bbk-payment-currency-value="{{ strtolower($cart?->total?->currency?->code ?? 'eur') }}"
|
|
|
|
|
data-bbk-payment-terms-required-value="{{ __('checkout.page.terms_required') }}"
|
|
|
|
|
data-bbk-payment-choose-method-value="{{ __('checkout.page.choose_payment_method') }}"
|
|
|
|
|
data-bbk-payment-generic-error-value="{{ __('checkout.page.payment_failed') }}"
|
|
|
|
|
data-bbk-payment-processing-slow-value="{{ __('checkout.page.payment_processing_slow') }}"
|
2026-09-09 13:51:00 +03:00
|
|
|
>
|
2026-09-08 20:41:49 +03:00
|
|
|
|
2026-09-24 19:08:13 +03:00
|
|
|
{{-- Contact. Logged in: the order email is the account's (forced
|
|
|
|
|
server-side in saveAddress()), so there's no field. Guests type
|
|
|
|
|
their email, plus a login link when config('checkout.login_route')
|
|
|
|
|
is set; the storefront's login page sends them back here and Lunar
|
|
|
|
|
merges the guest cart into the account. --}}
|
|
|
|
|
@php($loginRoute = config('checkout.login_route'))
|
2026-09-08 20:41:49 +03:00
|
|
|
<section class="bbk-checkout-section">
|
2026-09-24 19:08:13 +03:00
|
|
|
@auth
|
|
|
|
|
<p class="bbk-checkout-logged-in">
|
|
|
|
|
{{ __('checkout.page.logged_in_as') }} <strong>{{ auth()->user()->email }}</strong>
|
|
|
|
|
</p>
|
|
|
|
|
@else
|
|
|
|
|
@if ($loginRoute)
|
|
|
|
|
<p class="bbk-checkout-login-prompt">
|
|
|
|
|
{{ __('checkout.page.login_prompt') }}
|
|
|
|
|
<a href="{{ route($loginRoute, ['redirect' => route('checkout.show', app()->getLocale(), false)]) }}">{{ __('checkout.page.login_link') }}</a>
|
|
|
|
|
</p>
|
|
|
|
|
@endif
|
|
|
|
|
|
|
|
|
|
<x-checkout::field
|
|
|
|
|
name="contact_email"
|
|
|
|
|
label="{{ __('checkout.page.email_label') }}"
|
|
|
|
|
type="email"
|
|
|
|
|
:value="$shippingAddress?->contact_email ?? $billingAddress?->contact_email"
|
|
|
|
|
required
|
|
|
|
|
form="bbk-address-form"
|
|
|
|
|
/>
|
|
|
|
|
@endauth
|
|
|
|
|
|
|
|
|
|
{{-- Abandoned-cart-recovery opt-in. Optional, unticked, never
|
|
|
|
|
required — 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. Narrow scope by design (boboko-core's
|
|
|
|
|
setRecoveryConsent) — a general newsletter opt-in, if wanted,
|
|
|
|
|
is a separate checkbox. --}}
|
|
|
|
|
<label class="bbk-checkbox bbk-checkbox--stacked">
|
|
|
|
|
<input
|
|
|
|
|
type="checkbox"
|
|
|
|
|
name="recovery_consent"
|
|
|
|
|
value="1"
|
|
|
|
|
form="bbk-address-form"
|
|
|
|
|
{{ old('recovery_consent', data_get($cart, 'meta.recovery_consent')) ? 'checked' : '' }}
|
|
|
|
|
>
|
|
|
|
|
{{ __('checkout.page.recovery_consent') }}
|
|
|
|
|
</label>
|
2026-09-08 20:41:49 +03:00
|
|
|
</section>
|
|
|
|
|
|
2026-09-09 13:51:00 +03:00
|
|
|
{{-- Autosaves — no submit button. Any `change` inside .bbk-checkout-main
|
|
|
|
|
(this form, plus the contact email/consent which sit outside it but
|
|
|
|
|
link via form="bbk-address-form") is debounced and POSTed as the whole
|
|
|
|
|
form; the shipping-method radios are excluded in scheduleSave(). --}}
|
|
|
|
|
<form
|
|
|
|
|
id="bbk-address-form"
|
|
|
|
|
method="POST"
|
|
|
|
|
action="{{ route('checkout.address.save', app()->getLocale()) }}"
|
|
|
|
|
data-bbk-checkout-form-target="form"
|
|
|
|
|
>
|
2026-09-08 20:41:49 +03:00
|
|
|
@csrf
|
|
|
|
|
|
|
|
|
|
{{-- Billing --}}
|
|
|
|
|
<section class="bbk-checkout-section">
|
|
|
|
|
<h2 class="bbk-checkout-section-heading">{{ __('checkout.page.billing_heading') }}</h2>
|
|
|
|
|
|
|
|
|
|
<div class="bbk-field-row">
|
|
|
|
|
<x-checkout::field name="billing_first_name" label="{{ __('checkout.page.first_name') }}" :value="$billingAddress?->first_name" required />
|
|
|
|
|
<x-checkout::field name="billing_last_name" label="{{ __('checkout.page.last_name') }}" :value="$billingAddress?->last_name" required />
|
|
|
|
|
</div>
|
|
|
|
|
|
2026-09-24 19:08:13 +03:00
|
|
|
{{-- Company/ΑΦΜ only when an invoice is wanted. Revealed by CSS
|
|
|
|
|
(:has on the checkbox), saved/cleared by saveAddress(), and
|
|
|
|
|
required at place-order. --}}
|
|
|
|
|
<div class="bbk-invoice">
|
|
|
|
|
<label class="bbk-checkbox">
|
|
|
|
|
<input
|
|
|
|
|
type="checkbox"
|
|
|
|
|
name="wants_invoice"
|
|
|
|
|
value="1"
|
|
|
|
|
aria-controls="bbk-invoice-fields"
|
|
|
|
|
@checked($wantsInvoice)
|
|
|
|
|
>
|
|
|
|
|
{{ __('checkout.page.wants_invoice') }}
|
|
|
|
|
</label>
|
|
|
|
|
|
|
|
|
|
<div class="bbk-field-row bbk-invoice-fields" id="bbk-invoice-fields">
|
|
|
|
|
<x-checkout::field name="billing_company_name" label="{{ __('checkout.page.company_name') }}" :value="$billingAddress?->company_name" />
|
|
|
|
|
<x-checkout::field name="billing_tax_identifier" label="{{ __('checkout.page.tax_identifier') }}" :value="$billingAddress?->tax_identifier" />
|
|
|
|
|
</div>
|
2026-09-08 20:41:49 +03:00
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<x-checkout::field name="billing_line_one" label="{{ __('checkout.page.address_line_one') }}" :value="$billingAddress?->line_one" required />
|
|
|
|
|
|
|
|
|
|
<div class="bbk-field-row">
|
|
|
|
|
<x-checkout::field name="billing_city" label="{{ __('checkout.page.city') }}" :value="$billingAddress?->city" required />
|
|
|
|
|
<x-checkout::field name="billing_postcode" label="{{ __('checkout.page.postcode') }}" :value="$billingAddress?->postcode" required />
|
|
|
|
|
</div>
|
|
|
|
|
|
2026-09-09 13:51:00 +03:00
|
|
|
<x-checkout::region-country
|
|
|
|
|
prefix="billing"
|
|
|
|
|
:store-country="$storeCountry"
|
|
|
|
|
:regions="$regions"
|
|
|
|
|
:countries="$countries"
|
|
|
|
|
:address="$billingAddress"
|
|
|
|
|
/>
|
2026-09-08 20:41:49 +03:00
|
|
|
|
|
|
|
|
<x-checkout::field name="billing_contact_phone" label="{{ __('checkout.page.phone') }}" type="tel" :value="$billingAddress?->contact_phone" />
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
{{-- Shipping --}}
|
|
|
|
|
<section class="bbk-checkout-section">
|
|
|
|
|
<h2 class="bbk-checkout-section-heading">{{ __('checkout.page.shipping_heading') }}</h2>
|
|
|
|
|
|
|
|
|
|
<label class="bbk-checkbox">
|
|
|
|
|
<input
|
|
|
|
|
type="checkbox"
|
|
|
|
|
name="same_as_billing"
|
|
|
|
|
value="1"
|
|
|
|
|
data-bbk-checkout-form-target="sameAsBilling"
|
|
|
|
|
data-action="bbk-checkout-form#toggleSameAsBilling"
|
2026-09-09 13:51:00 +03:00
|
|
|
@checked($shipToBilling)
|
2026-09-08 20:41:49 +03:00
|
|
|
>
|
|
|
|
|
{{ __('checkout.page.same_as_billing') }}
|
|
|
|
|
</label>
|
|
|
|
|
|
|
|
|
|
<div class="bbk-checkout-shipping-fields" data-bbk-checkout-form-target="shippingFields">
|
|
|
|
|
<div class="bbk-field-row">
|
|
|
|
|
<x-checkout::field name="shipping_first_name" label="{{ __('checkout.page.first_name') }}" :value="$shippingAddress?->first_name" required />
|
|
|
|
|
<x-checkout::field name="shipping_last_name" label="{{ __('checkout.page.last_name') }}" :value="$shippingAddress?->last_name" required />
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<x-checkout::field name="shipping_line_one" label="{{ __('checkout.page.address_line_one') }}" :value="$shippingAddress?->line_one" required />
|
|
|
|
|
|
|
|
|
|
<div class="bbk-field-row">
|
|
|
|
|
<x-checkout::field name="shipping_city" label="{{ __('checkout.page.city') }}" :value="$shippingAddress?->city" required />
|
|
|
|
|
<x-checkout::field name="shipping_postcode" label="{{ __('checkout.page.postcode') }}" :value="$shippingAddress?->postcode" required />
|
|
|
|
|
</div>
|
|
|
|
|
|
2026-09-09 13:51:00 +03:00
|
|
|
<x-checkout::region-country
|
|
|
|
|
prefix="shipping"
|
|
|
|
|
:store-country="$storeCountry"
|
|
|
|
|
:regions="$regions"
|
|
|
|
|
:countries="$countries"
|
|
|
|
|
:address="$shippingAddress"
|
|
|
|
|
/>
|
2026-09-08 20:41:49 +03:00
|
|
|
|
|
|
|
|
<x-checkout::field name="shipping_contact_phone" label="{{ __('checkout.page.phone') }}" type="tel" :value="$shippingAddress?->contact_phone" />
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<x-checkout::textarea
|
|
|
|
|
name="shipping_delivery_instructions"
|
|
|
|
|
label="{{ __('checkout.page.delivery_instructions') }}"
|
|
|
|
|
:value="$shippingAddress?->delivery_instructions"
|
|
|
|
|
/>
|
|
|
|
|
</section>
|
|
|
|
|
</form>
|
|
|
|
|
|
2026-09-09 13:51:00 +03:00
|
|
|
<p
|
|
|
|
|
class="bbk-checkout-status"
|
|
|
|
|
data-bbk-checkout-form-target="status"
|
|
|
|
|
role="status"
|
|
|
|
|
aria-live="polite"
|
|
|
|
|
hidden
|
|
|
|
|
></p>
|
|
|
|
|
|
|
|
|
|
{{-- Shipping method — resolves from the saved shipping address;
|
|
|
|
|
re-rendered as a fragment by bbk-checkout-form after each
|
|
|
|
|
autosave / option change. --}}
|
2026-09-08 20:41:49 +03:00
|
|
|
<section class="bbk-checkout-section">
|
|
|
|
|
<h2 class="bbk-checkout-section-heading">{{ __('checkout.page.shipping_method_heading') }}</h2>
|
|
|
|
|
|
2026-09-09 13:51:00 +03:00
|
|
|
<div id="bbk-shipping-options" data-bbk-checkout-form-target="shippingOptions">
|
|
|
|
|
@include('checkout::partials.shipping-options', [
|
|
|
|
|
'shippingAddress' => $shippingAddress,
|
|
|
|
|
'shippingOptions' => $shippingOptions,
|
|
|
|
|
])
|
|
|
|
|
</div>
|
2026-09-08 20:41:49 +03:00
|
|
|
</section>
|
|
|
|
|
|
2026-09-09 19:16:20 +03:00
|
|
|
{{-- Payment --}}
|
|
|
|
|
<section class="bbk-checkout-section">
|
|
|
|
|
<h2 class="bbk-checkout-section-heading">{{ __('checkout.page.payment_heading') }}</h2>
|
|
|
|
|
|
|
|
|
|
<div id="bbk-payment-methods">
|
|
|
|
|
@include('checkout::partials.payment-methods', [
|
|
|
|
|
'paymentMethods' => $paymentMethods,
|
|
|
|
|
'cart' => $cart,
|
|
|
|
|
])
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{{-- Stripe Payment Element mounts here when a Stripe method is picked. --}}
|
|
|
|
|
<div class="bbk-payment-element" data-bbk-payment-target="element" hidden></div>
|
|
|
|
|
|
|
|
|
|
<label class="bbk-checkbox bbk-checkbox--stacked">
|
|
|
|
|
<input type="checkbox" data-bbk-payment-target="terms">
|
|
|
|
|
{!! __('checkout.page.terms_accept', [
|
|
|
|
|
'terms' => route('legal.terms', app()->getLocale()),
|
|
|
|
|
'privacy' => route('legal.privacy', app()->getLocale()),
|
|
|
|
|
]) !!}
|
|
|
|
|
</label>
|
|
|
|
|
|
|
|
|
|
<p class="bbk-checkout-withdrawal">
|
|
|
|
|
{!! __('checkout.page.withdrawal_notice', [
|
|
|
|
|
'link' => route('legal.shipping-returns', app()->getLocale()),
|
|
|
|
|
]) !!}
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p class="bbk-checkout-error" data-bbk-payment-target="error" role="alert" hidden></p>
|
|
|
|
|
|
|
|
|
|
<button
|
|
|
|
|
type="button"
|
|
|
|
|
class="bbk-checkout-continue"
|
|
|
|
|
data-bbk-payment-target="submit"
|
|
|
|
|
data-action="bbk-payment#placeOrder"
|
2026-09-17 21:52:27 +03:00
|
|
|
@disabled($lines->isEmpty())
|
2026-09-09 19:16:20 +03:00
|
|
|
>
|
|
|
|
|
{{ __('checkout.page.place_order') }}
|
|
|
|
|
</button>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
{{-- Fixed overlay while a payment is confirming (3-D Secure / webhook
|
|
|
|
|
poll). Inside .bbk-checkout-main so bbk-payment can target it. --}}
|
|
|
|
|
<div class="bbk-checkout-processing" data-bbk-payment-target="processing" hidden>
|
|
|
|
|
<span class="bbk-spinner" aria-hidden="true"></span>
|
|
|
|
|
<p data-bbk-payment-target="processingText">{{ __('checkout.page.payment_processing') }}</p>
|
|
|
|
|
</div>
|
2026-09-08 20:41:49 +03:00
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<aside class="bbk-checkout-aside">
|
|
|
|
|
<div class="bbk-checkout-summary" data-controller="bbk-cart">
|
|
|
|
|
<h2 class="bbk-checkout-summary-heading">{{ __('checkout.page.order_summary_heading') }}</h2>
|
2026-09-17 21:52:27 +03:00
|
|
|
@include('checkout::partials.cart-error')
|
2026-09-08 20:41:49 +03:00
|
|
|
<div data-bbk-cart-target="body" aria-live="polite">
|
|
|
|
|
@include('checkout::partials.cart-body')
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</aside>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
@endsection
|