{{-- /contact (item 3) — página de contacto. Diseño portado de Apex (banner + 2 columnas info | form), backend de email portado de Protexiones. Adaptado al sistema de diseño OSCURO del sitio (tokens surface/fg/brand), no al white/gray de Apex. Hero por el patrón heroes (variante service). El JS del form vive en resources/js/contact-form.js (init en app.js, early-return si no hay #contactForm). --}} @extends('layouts.landing') @push('head') {{-- reCAPTCHA Enterprise: solo se carga si el flag está activo Y hay site key, así en dev sin credenciales la página no arrastra el script de Google. --}} @if (config('services.recaptcha.enabled') && config('services.recaptcha.site_key')) @endif @endpush @section('hero') @endsection @section('content')
{{-- flex-col-reverse en mobile: el FORM va primero; en lg+ pasa a grid de 2 columnas con la info a la izquierda. --}}
{{-- Columna izquierda: info real de la empresa (solo datos de config). --}}
{{ config('company.legal_name') }}

{{ config('company.legal_name') }}

{{ trim(config('company.address.street'), ', ') }}
{{ config('company.address.city') }}

{{ config('company.phone.label') }} {{ config('company.email') }}
{{ trim(config('company.address.street'), ', ') }}, {{ config('company.address.city') }}
{{-- TODO: horarios de atención no viven en config/company.php; si se quieren mostrar, agregarlos como fuente de datos (no hardcode). --}}

Prefer a full quote?

Book a free, no-obligation in-person estimate for your project.

Get a Free Estimate
{{-- Columna derecha: card con el formulario. --}}

We're here to help

Fill out the form and our team will reach out as soon as we're available.

{{-- action = route del POST; el JS (contact-form.js) lo lee de form.action y postea por fetch con X-CSRF-TOKEN desde el . novalidate: la validación la maneja el JS (y el servidor). --}}
@csrf
{{-- Estado del envío: verde (éxito) / rojo (error). Lo pinta el JS. --}}
@endsection