@php $primary = $setting?->primary_color ?: '#124a61'; $accent = $setting?->accent_color ?: '#2e86ab'; $company = $setting?->company_name ?: __('Print Shop'); $logo = $setting?->logoSrc(); $money = fn ($n) => $currency . ' ' . number_format((float) $n, 2); $stepCount = count($stepLabels); // A counter shop with no price list has nothing to sell; a quote shop needs // no price list at all, so only block the counter lane on missing pricing. $blocked = ! $isQuoteLane && ! $hasPricing; @endphp
{{-- Header --}}
@if ($logo) {{ $company }} @else {{ \Illuminate\Support\Str::of($company)->substr(0, 1)->upper() }} @endif

{{ $company }}

@if ($step === 0)

{{ __('What can we do for you?') }}

@elseif ($service && $services->count() > 1) {{-- Always reachable, on every step. Burying this at the bottom of the form meant a customer who tapped the wrong tile had no obvious way out. --}} @else

{{ $service?->name ?: __('Quick print request') }}

@endif
{{-- ============================ STEP 0 · SERVICE PICKER ============================ --}} @if ($step === 0)
@foreach ($services as $option) @endforeach
@elseif ($blocked)
{{ __('Online print requests are not set up yet. Please see a member of staff at the counter.') }}
@else {{-- Progress --}}
@foreach ($stepLabels as $i => $label) @php $n = $i + 1; @endphp
{{ $label }}
@endforeach
{{-- ============================ FILES (counter) ============================ --}} @if ($stepKey === 'files')

{{ __('What do you need printed?') }}

{{ __('Upload your documents or photos. You can add several.') }}

@include('livewire.portal.partials.intake-uploader', ['retentionNote' => __('Your files are automatically deleted 24 hours after you submit.')]) {{-- ========================= QUESTIONS (quote lane) ========================= --}} @elseif ($stepKey === 'questions')

{{ __('Tell us about the job') }}

{{ __('Rough answers are fine, we will confirm everything in the quote.') }}

@foreach ($fields as $i => $field) @php $block = $field['block'] ?? 'text'; $label = $field['label'] ?? ($blocks[$block]['label'] ?? __('Detail')); $help = $field['help'] ?? ($blocks[$block]['help'] ?? null); $optional = ($field['required'] ?? true) === false; @endphp
@if ($block === 'dimensions')
@error('answers.'.$i.'.width_m')

{{ $message }}

@enderror
@error('answers.'.$i.'.height_m')

{{ $message }}

@enderror
@elseif ($block === 'quantity') @elseif ($block === 'choice') @elseif ($block === 'method')
@foreach (($blocks['method']['options'] ?? []) as $value => $text) @endforeach
@elseif ($block === 'multi_choice')
@foreach (($field['options'] ?? []) as $opt) @endforeach
@elseif ($block === 'long_text') @else @endif @if ($help)

{{ $help }}

@endif @error('answers.'.$i)

{{ $message }}

@enderror
@endforeach

{{ $service?->requires_files ? __('Attach your artwork') : __('Artwork or a reference photo (optional)') }}

@include('livewire.portal.partials.intake-uploader', ['retentionNote' => __('We keep your artwork while we work on your quote.')])
{{-- ============================== DETAILS (both) ============================== --}} @elseif ($stepKey === 'details')

{{ __('Your details') }}

{{ $isQuoteLane ? __('So we can send you the quote.') : __('So we know whose print this is.') }}

@error('customer_name')

{{ $message }}

@enderror
@error('contact_phone')

{{ $message }}

@enderror
@error('notes')

{{ $message }}

@enderror
{{-- Voice note --}}

{{ __('Add a voice note') }}

{{ __('Recording') }}

@error('audioUpload')

{{ $message }}

@enderror
{{-- ============================== OPTIONS (counter) ============================== --}} @elseif ($stepKey === 'options')

{{ __('Print options') }}

{{ __('The price updates as you choose.') }}

{{-- What we're printing. One tap, one price. --}}
@foreach ($items as $item) @endforeach
@error('counterItemId')

{{ $message }}

@enderror
{{-- Pages + copies --}}
@error('pages')

{{ $message }}

@enderror
@error('copies')

{{ $message }}

@enderror
{{-- Back-to-back --}} {{-- Live price --}}
{{ __('Estimated price') }} {{ $money($subtotal) }}
@if ($unitPrice > 0)

@php($shownPages = max(1, (int) $pages)) @php($shownCopies = max(1, (int) $copies)) {{ $money($unitPrice) }} × {{ $shownPages }} {{ trans_choice('{1}page|[2,*]pages', $shownPages) }} × {{ $shownCopies }} {{ trans_choice('{1}copy|[2,*]copies', $shownCopies) }}

@if ($bulkTier)

{{ __('Bulk price applied, :n pages or more.', ['n' => $bulkTier->min_qty]) }} @if ($bulkSaving > 0) {{ __('You save :amt', ['amt' => $money($bulkSaving)]) }} @endif

@elseif ($nextBreak)

{{ trans_choice( '{1} :count more page drops it to :price each.|[2,*] :count more pages drop it to :price each.', $nextBreak['more'], ['count' => $nextBreak['more'], 'price' => $money($nextBreak['price'])], ) }}

@endif @else

{{ __('Choose a size and paper type to see the price.') }}

@endif
{{-- The full ladder, so the price is never a surprise at the counter. --}} @if (! empty($bulkLadder))

{{ __('Bulk pricing') }}

  • {{ trans_choice('{1} Up to :count page|[2,*] Up to :count pages', max(1, $bulkLadder[0]['min_qty'] - 1), ['count' => $bulkLadder[0]['min_qty'] - 1]) }} {{ $money($baseUnitPrice) }}
  • @foreach ($bulkLadder as $step)
  • {{ __(':n pages or more', ['n' => $step['min_qty']]) }} {{ $money($step['price']) }}
  • @endforeach
@endif
{{-- ============================== PAYMENT (counter) ============================== --}} @elseif ($stepKey === 'payment')

{{ __('How will you pay?') }}

{{ __('Pay at the counter or send via EcoCash.') }}

{{-- Price summary --}}
{{ __('Print total') }} {{ $money($subtotal) }}
@if ($payment_method === 'ecocash' && $ecocashFee > 0)
{{ __('EcoCash fee') }} ({{ rtrim(rtrim(number_format($ecocashFeePercent, 2), '0'), '.') }}%) {{ $money($ecocashFee) }}
@endif
{{ __('You pay') }} {{ $money($total) }}
{{-- EcoCash details --}} @if ($payment_method === 'ecocash')

{{ __('Send EcoCash to') }}

@if ($setting?->print_ecocash_number)

{{ $setting->print_ecocash_number }}

@if ($setting?->print_ecocash_name)

{{ $setting->print_ecocash_name }}

@endif

{{ __('Send :amount, then upload your confirmation below.', ['amount' => $money($total)]) }}

@else

{{ __('Ask a staff member for the EcoCash number.') }}

@endif
@if ($pop)

{{ __('Proof attached') }}

@endif
@else

{{ __('Please pay :amount in cash when you collect your prints.', ['amount' => $money($total)]) }}

@endif {{-- ============================== CONFIRM (quote lane) ============================== --}} @elseif ($stepKey === 'confirm')

{{ __('Check and send') }}

{{ __('We will price it and come back to you.') }}

{{ __('Your request') }}

{{ $service?->name }}

@foreach ($answerSummary as $row)
{{ $row['label'] }}
{{ $row['value'] }}
@endforeach
{{ __('Attachments') }}
{{ count($fileMeta) ? trans_choice('{1}:count file|[2,*]:count files', count($fileMeta), ['count' => count($fileMeta)]) : __('None') }}
{{ __('Contact') }}
{{ $customer_name }} · {{ $contact_phone }}
@error('needed_by')

{{ $message }}

@enderror

{{ __('What happens next') }}

{{ __('No payment now. We will price this and send you a quote :when. Nothing is booked in until you accept it.', ['when' => $service?->leadTimeLabel() ?: __('shortly')]) }}

@endif {{-- Navigation --}}
{{-- Ghost, so the gradient Continue button is the only solid thing on screen and the eye goes forward, not back. --}} @if ($step > 1) @elseif ($services->count() > 1) @endif @if ($step < $stepCount) @else @endif
@endif {{-- Offered on the front door only — the service picker, or step 1 for a shop that offers one thing and so has no picker. Mid-form it would be an interruption; after they send it, the status page carries the same card with notifications attached. --}} @if ($step <= 1) @endif

{{ __('Powered by') }} {{ $company }}