Files
amare/resources/views/layouts/public.blade.php
Manoel Freitas 3dc1f449ee feat: ship public site with SEO and visuals (#3)
* feat: ship public site with SEO and visuals

Publish CMS content on public routes with responsive media,
accessibility checks, and deterministic visual baselines.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: make browser visual CI deterministic for media

Mount host public storage into FrankenPHP so seeded fixtures are served,
and replace PNG-as-JPG fixtures with real JPEGs so Chromium can render them.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: serve public media on same-origin storage paths

Pest Browser hosts on 127.0.0.1:port while Storage::url used
http://localhost, so screenshots captured broken images. Use relative
/storage URLs for media and absolutize only OG tags via url().

Co-authored-by: Cursor <cursoragent@cursor.com>

* test: refresh visual baselines from CI Ubuntu screenshots

Media now loads on same-origin /storage paths, so baselines must
capture the rendered fixtures. Use full-page snapshots from the CI
runner to keep Pest's exact snapshot match stable across environments.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-29 10:12:24 -03:00

77 lines
3.6 KiB
PHP

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="color-scheme" content="light">
<title>{{ $pageMeta->title }}</title>
<x-seo.meta :page-meta="$pageMeta" />
<x-fonts />
@vite(['resources/css/app.css', 'resources/js/app.js'])
</head>
<body class="min-h-screen antialiased">
<a href="#conteudo" class="sr-only focus:not-sr-only focus:absolute focus:left-4 focus:top-4 focus:z-50 focus:rounded-md focus:bg-amare-accent focus:px-4 focus:py-2 focus:text-amare-accent-text">
Ir para o conteúdo
</a>
<header class="border-b border-amare-border bg-amare-bg">
<div class="container-amare flex items-center justify-between gap-6 py-4">
<a href="{{ url('/') }}" class="text-lg font-semibold text-amare-text transition-colors duration-(--amare-duration-normal) ease-(--amare-ease-standard) hover:text-amare-accent">
{{ $siteSettings->brand_name }}
</a>
<nav aria-label="Principal" class="flex flex-wrap items-center gap-4 text-sm text-amare-text-muted">
<a href="{{ route('home') }}" class="transition-colors hover:text-amare-accent">Início</a>
<a href="{{ route('services.index') }}" class="transition-colors hover:text-amare-accent">Serviços</a>
<a href="{{ route('portfolio.index') }}" class="transition-colors hover:text-amare-accent">Portfólio</a>
<a href="{{ route('about') }}" class="transition-colors hover:text-amare-accent">Sobre</a>
<a href="{{ route('contact') }}" class="transition-colors hover:text-amare-accent">Contato</a>
</nav>
</div>
</header>
<main id="conteudo" class="py-12">
@yield('content')
</main>
<footer class="border-t border-amare-border bg-amare-bg-muted">
<div class="container-amare flex flex-col gap-4 py-8 text-sm text-amare-text-muted md:flex-row md:items-start md:justify-between">
<div class="space-y-2">
<p class="font-medium text-amare-text">{{ $siteSettings->brand_name }}</p>
@if ($siteSettings->email)
<p>
<a href="mailto:{{ $siteSettings->email }}" class="transition-colors hover:text-amare-accent">{{ $siteSettings->email }}</a>
</p>
@endif
@if ($siteSettings->phone)
<p>{{ $siteSettings->phone }}</p>
@endif
@if ($siteSettings->city)
<p>{{ $siteSettings->city }}</p>
@endif
</div>
<div class="space-y-2">
<p class="font-medium text-amare-text">Links</p>
<p><a href="{{ route('privacy') }}" class="transition-colors hover:text-amare-accent">Política de privacidade</a></p>
@foreach ($siteSettings->social_links ?? [] as $network => $url)
@if (filled($url))
<p>
<a href="{{ $url }}" class="transition-colors hover:text-amare-accent" rel="noopener noreferrer" target="_blank">{{ ucfirst((string) $network) }}</a>
</p>
@endif
@endforeach
</div>
<p>&copy; {{ now()->year }} {{ $siteSettings->brand_name }}. Todos os direitos reservados.</p>
</div>
</footer>
@if ($siteSettings->analytics_enabled && filled($siteSettings->analytics_script))
{!! $siteSettings->analytics_script !!}
@endif
</body>
</html>