@section('title', 'Gerar CV') @push('head-scripts') @endpush {{-- ═══════════════════════════════════════════════════════════════════════ FORMULÁRIO HIDDEN — submetido via JS para o PdfController (POST) Garante que o browser faz download nativo do PDF sem reload Livewire ════════════════════════════════════════════════════════════════════════ --}}
{{-- ═══════════════════════════════════════════════ HERO + STEP INDICATOR ════════════════════════════════════════════════ --}}
Gerador de CV

Cria o teu
Curriculum Vitae

Segue os passos abaixo, preenche os teus dados e gera um PDF profissional em segundos.

{{-- Step indicator --}}
@php $stepLabels = ['Modelo','Pessoal','Experiência','Formação','Gerar']; @endphp @foreach ($stepLabels as $i => $label) {{-- Clickable se já visitado --}}
@if ($i < count($stepLabels) - 1)
@endif
@endforeach
{{-- ═══════════════════════════════════════════════ BODY ════════════════════════════════════════════════ --}}
{{-- Flash error --}} @if ($flashError)
⚠️ {{ $flashError }}
@endif {{-- Validation errors --}} @if ($errors->any())

Corrige os seguintes campos:

    @foreach ($errors->all() as $e)
  • {{ $e }}
  • @endforeach
@endif {{-- ═══════════════════════════════════ PASSO 0 — ESCOLHA DO MODELO ════════════════════════════════════ --}} @if ($step === 0)

Escolhe o teu modelo

Clica no modelo que melhor se adapta ao teu perfil.

@foreach ($templates as $key => $tpl) @php $delay = ['delay-100','delay-150','delay-200','delay-250','delay-300','delay-350']; $di = array_search($key, array_keys($templates)); @endphp
{{-- Mini preview de cada template --}} @include('livewire.site.partials.cv-template', ['template' => $key])
@if ($key === 'ats')
ATS ✓
@endif

{{ $tpl['label'] }}

{{ $tpl['desc'] }}

@endforeach
@endif {{-- ═══════════════════════════════════ PASSO 1 — DADOS PESSOAIS ════════════════════════════════════ --}} @if ($step === 1)

Dados Pessoais

@error('name')

{{ $message }}

@enderror
@error('jobTitle')

{{ $message }}

@enderror
@error('email')

{{ $message }}

@enderror

{{ strlen($summary) }}/1500

@include('livewire.site.partials.cv-sidebar')
@include('livewire.site.partials.cv-nav', ['prevLabel' => '← Modelo', 'nextLabel' => 'Experiência →']) @endif {{-- ═══════════════════════════════════ PASSO 2 — EXPERIÊNCIA ════════════════════════════════════ --}} @if ($step === 2)

Experiência Profissional

Adiciona as tuas experiências mais relevantes.

@forelse ($experiences as $i => $exp)
Experiência {{ $i + 1 }} @if (! empty($exp['company'])) — {{ $exp['company'] }} @endif @if (count($experiences) > 1) @endif
@empty
Nenhuma experiência adicionada.
@endforelse
@include('livewire.site.partials.cv-sidebar')
@include('livewire.site.partials.cv-nav', ['prevLabel' => '← Dados pessoais', 'nextLabel' => 'Formação →']) @endif {{-- ═══════════════════════════════════ PASSO 3 — FORMAÇÃO + SKILLS ════════════════════════════════════ --}} @if ($step === 3)
{{-- Formação --}}

Formação Académica

@forelse ($education as $i => $edu)
@if (count($education) > 1) @endif
@empty

Sem formação adicionada.

@endforelse
{{-- Competências --}}

Competências & Idiomas

@error('hardSkills')

{{ $message }}

@enderror
@error('softSkills')

{{ $message }}

@enderror
@error('languages')

{{ $message }}

@enderror
@include('livewire.site.partials.cv-sidebar')
@include('livewire.site.partials.cv-nav', ['prevLabel' => '← Experiência', 'nextLabel' => 'Rever & Gerar →']) @endif {{-- ═══════════════════════════════════ PASSO 4 — REVER & GERAR PDF ════════════════════════════════════ --}} @if ($step === 4)
{{-- Resumo completo --}}
{{-- Modelo --}}

Modelo escolhido

{{ $templates[$selectedTemplate]['icon'] ?? '📄' }}

{{ $templates[$selectedTemplate]['label'] }}

{{ $templates[$selectedTemplate]['desc'] }}

{{-- Dados pessoais --}}

Dados Pessoais

Nome: {{ $name ?: '—' }}
Cargo: {{ $jobTitle ?: '—' }}
Email: {{ $email ?: '—' }}
Telefone: {{ $phone ?: '—' }}
Local: {{ $location ?: '—' }}
LinkedIn: {{ $linkedin ?: '—' }}
@if ($summary)
Resumo:

{{ Str::limit($summary, 180) }}

@endif
{{-- Experiência --}}

Experiência

@forelse (collect($experiences)->filter(fn($e) => ! empty($e['company'])) as $exp)

{{ $exp['role'] }} em {{ $exp['company'] }}

{{ $exp['start'] ?? '' }} → {{ $exp['current'] ? 'Atual' : ($exp['end'] ?? '—') }}

@if ($exp['description'])

{{ Str::limit($exp['description'], 100) }}

@endif
@empty

Sem experiências.

@endforelse
{{-- Formação --}}

Formação & Competências

@forelse (collect($education)->filter(fn($e) => ! empty($e['institution'])) as $edu)

{{ $edu['degree'] }} — {{ $edu['institution'] }} ({{ $edu['start'] ?? '?' }}–{{ $edu['end'] ?? '?' }})

@empty

Sem formação.

@endforelse @if ($hardSkills || $softSkills || $languages)
@if ($hardSkills)

Técnicas: {{ $hardSkills }}

@endif @if ($softSkills)

Soft skills: {{ $softSkills }}

@endif @if ($languages)

Idiomas: {{ $languages }}

@endif @if ($certifications)

Certificações: {{ $certifications }}

@endif
@endif
{{-- Sidebar com botão gerar --}}
{{-- Completude --}}

Completude do CV

Preenchimento {{ $this->completeness }}%
@foreach ([ ['label' => 'Nome e cargo', 'done' => $name && $jobTitle], ['label' => 'Contacto', 'done' => $email], ['label' => 'Localização', 'done' => $location], ['label' => 'Resumo profissional', 'done' => $summary], ['label' => 'Experiência', 'done' => collect($experiences)->contains(fn($e) => ! empty($e['company']))], ['label' => 'Formação', 'done' => collect($education)->contains(fn($e) => ! empty($e['institution']))], ['label' => 'Competências', 'done' => $hardSkills], ['label' => 'Idiomas', 'done' => $languages], ] as $item)
{{ $item['label'] }} {{ $item['done'] ? '✓' : '○' }}
@endforeach
{{-- Gerar PDF --}}

Pronto para gerar!

O teu CV será gerado no modelo {{ $templates[$selectedTemplate]['label'] ?? '' }} e descarregado como PDF.

Formato A4 · PDF de alta qualidade

@endif
@push('body-scripts') @endpush