feat: recreate public frontend with Heritage Editorial identity
Replace placeholder visual system with EB Garamond/olive tokens, brand assets, editorial home narrative, São Paulo settings, real testimonials, and regenerated visual baselines. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -2,16 +2,17 @@
|
||||
'settings',
|
||||
])
|
||||
|
||||
<section aria-labelledby="final-cta-heading" class="py-16">
|
||||
<div class="container-amare rounded-xl border border-amare-border bg-amare-bg-muted px-8 py-12 text-center">
|
||||
<h2 id="final-cta-heading" class="text-3xl font-semibold text-amare-text">Vamos planejar o seu evento?</h2>
|
||||
<p class="mx-auto mt-3 max-w-2xl text-amare-text-muted">
|
||||
Conte um pouco do que você imagina. A próxima conversa começa no briefing.
|
||||
<section aria-labelledby="final-cta-heading" class="border-t border-amare-border bg-amare-bg-deep py-20">
|
||||
<div class="container-amare space-y-6 text-center">
|
||||
<p class="text-xs font-semibold uppercase tracking-[0.14em] text-amare-accent">Próximo passo</p>
|
||||
<h2 id="final-cta-heading" class="text-3xl font-medium text-amare-text md:text-4xl">Todo grande encontro começa com uma boa conversa.</h2>
|
||||
<p class="mx-auto max-w-2xl text-amare-muted">
|
||||
Compartilhe as primeiras informações do seu evento. A Amare retorna para entender o contexto e orientar os próximos passos.
|
||||
</p>
|
||||
<div class="mt-8">
|
||||
<div>
|
||||
<a
|
||||
href="{{ route('contact') }}"
|
||||
class="inline-flex items-center rounded-md bg-amare-accent px-5 py-3 text-sm font-semibold text-amare-accent-text transition-colors duration-(--amare-duration-normal) ease-(--amare-ease-standard) hover:bg-amare-accent-hover"
|
||||
class="inline-flex items-center bg-amare-accent px-5 py-3 text-sm font-semibold uppercase tracking-[0.12em] text-amare-accent-text transition-colors duration-(--amare-duration-normal) ease-(--amare-ease-standard) hover:bg-amare-accent-deep"
|
||||
>
|
||||
{{ $settings->hero_cta_label }}
|
||||
</a>
|
||||
|
||||
@@ -2,14 +2,14 @@
|
||||
'settings',
|
||||
])
|
||||
|
||||
<section aria-labelledby="hero-heading" class="relative overflow-hidden border-b border-amare-border bg-amare-bg">
|
||||
<div class="container-amare grid gap-10 py-16 md:grid-cols-[minmax(0,1.1fr)_minmax(0,0.9fr)] md:items-center md:py-24">
|
||||
<div class="space-y-6">
|
||||
<section aria-labelledby="hero-heading" class="border-b border-amare-border bg-amare-bg">
|
||||
<div class="container-amare grid gap-12 py-20 md:grid-cols-[minmax(0,1.1fr)_minmax(0,0.9fr)] md:items-center md:py-28">
|
||||
<div class="space-y-8">
|
||||
@if (filled($settings->hero_eyebrow))
|
||||
<p class="text-sm font-medium uppercase tracking-[0.18em] text-amare-accent">{{ $settings->hero_eyebrow }}</p>
|
||||
@endif
|
||||
|
||||
<h1 id="hero-heading" class="max-w-3xl text-4xl font-semibold tracking-tight text-amare-text md:text-5xl">
|
||||
<h1 id="hero-heading" class="max-w-3xl text-4xl font-medium leading-none text-amare-text md:text-5xl">
|
||||
{{ $settings->hero_title }}
|
||||
</h1>
|
||||
|
||||
@@ -17,25 +17,38 @@
|
||||
<p class="max-w-2xl text-lg text-amare-text-muted">{{ $settings->hero_subtitle }}</p>
|
||||
@endif
|
||||
|
||||
<div>
|
||||
<div class="flex flex-wrap items-center gap-4">
|
||||
<a
|
||||
href="{{ route('contact') }}"
|
||||
data-testid="home-primary-cta"
|
||||
class="inline-flex items-center rounded-md bg-amare-accent px-5 py-3 text-sm font-semibold text-amare-accent-text transition-colors duration-(--amare-duration-normal) ease-(--amare-ease-standard) hover:bg-amare-accent-hover focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-3 focus-visible:outline-amare-accent"
|
||||
class="inline-flex items-center bg-amare-accent px-5 py-3 text-sm font-semibold text-amare-accent-text transition-colors duration-(--amare-duration-normal) ease-(--amare-ease-standard) hover:bg-amare-accent-hover"
|
||||
>
|
||||
{{ $settings->hero_cta_label }}
|
||||
</a>
|
||||
|
||||
@if (filled($settings->hero_secondary_cta_label))
|
||||
<a
|
||||
href="{{ route('portfolio.index') }}"
|
||||
class="inline-flex items-center border-b border-amare-accent pb-1 text-sm font-semibold text-amare-accent transition-colors hover:text-amare-accent-deep"
|
||||
>
|
||||
{{ $settings->hero_secondary_cta_label }}
|
||||
</a>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
@if (filled($settings->hero_note))
|
||||
<p class="max-w-xl text-sm text-amare-text-muted">{{ $settings->hero_note }}</p>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
@if (filled($settings->default_og_image_path))
|
||||
<div class="min-h-72 overflow-hidden rounded-xl bg-amare-bg-muted">
|
||||
<div class="min-h-72 bg-amare-bg-deep">
|
||||
<x-media.image
|
||||
:path="$settings->default_og_image_path"
|
||||
:alt="$settings->default_og_image_alt ?: $settings->brand_name"
|
||||
loading="eager"
|
||||
sizes="(max-width: 768px) 100vw, 40vw"
|
||||
class="h-full w-full object-cover"
|
||||
class="img-editorial h-full w-full object-cover"
|
||||
/>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
20
resources/views/components/home/manifesto.blade.php
Normal file
20
resources/views/components/home/manifesto.blade.php
Normal file
@@ -0,0 +1,20 @@
|
||||
@props([
|
||||
'settings',
|
||||
])
|
||||
|
||||
@php
|
||||
$title = $settings->manifesto_title ?: 'Sofisticação que também se traduz em organização.';
|
||||
$lead = $settings->manifesto_lead ?: 'Um evento memorável não nasce apenas de uma boa estética. Ele depende de decisões bem conduzidas, fornecedores alinhados e atenção constante ao que realmente importa.';
|
||||
$body = $settings->manifesto_body ?: 'A Amare combina sensibilidade e precisão para criar encontros coerentes com cada cliente, marca e ocasião — sem fórmulas prontas, excessos ou ruído.';
|
||||
@endphp
|
||||
|
||||
<section aria-labelledby="manifesto-heading" class="border-b border-amare-border bg-amare-bg-deep py-20">
|
||||
<div class="container-amare grid gap-8 md:grid-cols-[minmax(0,0.8fr)_minmax(0,1.2fr)]">
|
||||
<p class="text-sm font-medium uppercase tracking-[0.18em] text-amare-accent">Manifesto</p>
|
||||
<div class="space-y-6">
|
||||
<h2 id="manifesto-heading" class="max-w-3xl text-3xl font-medium leading-tight text-amare-text md:text-4xl">{{ $title }}</h2>
|
||||
<p class="max-w-2xl text-xl leading-relaxed text-amare-text">{{ $lead }}</p>
|
||||
<p class="max-w-2xl text-amare-text-muted">{{ $body }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -2,20 +2,29 @@
|
||||
'settings',
|
||||
])
|
||||
|
||||
<section aria-labelledby="method-heading" class="border-b border-amare-border bg-amare-bg-muted py-16">
|
||||
<div class="container-amare grid gap-8 md:grid-cols-[minmax(0,0.9fr)_minmax(0,1.1fr)] md:items-start">
|
||||
@php
|
||||
$steps = filled($settings->method_steps) ? $settings->method_steps : \App\Models\SiteSetting::defaultMethodSteps();
|
||||
$intro = $settings->method_intro ?: 'Clareza em cada etapa. Tranquilidade durante todo o processo.';
|
||||
@endphp
|
||||
|
||||
<section aria-labelledby="method-heading" class="border-b border-amare-border bg-amare-bg-archive py-20">
|
||||
<div class="container-amare grid gap-10 md:grid-cols-[minmax(0,0.8fr)_minmax(0,1.2fr)] md:items-start">
|
||||
<div class="space-y-3">
|
||||
<h2 id="method-heading" class="text-3xl font-semibold text-amare-text">Método de trabalho</h2>
|
||||
<p class="text-amare-text-muted">Do briefing ao dia do evento, com clareza e acompanhamento próximo.</p>
|
||||
<p class="text-sm font-medium uppercase tracking-[0.18em] text-amare-accent">Método</p>
|
||||
<h2 id="method-heading" class="text-3xl font-medium text-amare-text">Cuidado orientado por processo.</h2>
|
||||
<p class="text-amare-text-muted">{{ $intro }}</p>
|
||||
</div>
|
||||
|
||||
<div class="space-y-4 text-amare-text-muted">
|
||||
<p>{{ $settings->about_summary }}</p>
|
||||
<ol class="grid gap-3">
|
||||
<li>1. Escuta e briefing inicial</li>
|
||||
<li>2. Planejamento e curadoria</li>
|
||||
<li>3. Coordenação no dia do evento</li>
|
||||
<ol class="grid gap-5 border-t border-amare-border">
|
||||
@foreach ($steps as $index => $step)
|
||||
<li class="grid gap-2 border-b border-amare-border py-5 md:grid-cols-[4rem_minmax(0,1fr)]">
|
||||
<span class="text-sm text-amare-accent">{{ str_pad((string) ($index + 1), 2, '0', STR_PAD_LEFT) }}</span>
|
||||
<div class="space-y-2">
|
||||
<h3 class="text-2xl font-medium text-amare-text">{{ $step['title'] ?? '' }}</h3>
|
||||
<p class="text-amare-text-muted">{{ $step['body'] ?? '' }}</p>
|
||||
</div>
|
||||
</li>
|
||||
@endforeach
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
48
resources/views/components/home/portfolio.blade.php
Normal file
48
resources/views/components/home/portfolio.blade.php
Normal file
@@ -0,0 +1,48 @@
|
||||
@props([
|
||||
'cases',
|
||||
])
|
||||
|
||||
@if ($cases->isNotEmpty())
|
||||
<section aria-labelledby="portfolio-heading" class="border-b border-amare-accent-deep bg-amare-accent-deep py-20 text-amare-accent-text">
|
||||
<div class="container-amare space-y-10">
|
||||
<div class="grid gap-4 md:grid-cols-[minmax(0,0.8fr)_minmax(0,1.2fr)]">
|
||||
<p class="text-sm font-medium uppercase tracking-[0.18em] text-amare-accent-text/80">Portfólio</p>
|
||||
<div class="space-y-3">
|
||||
<h2 id="portfolio-heading" class="text-3xl font-medium md:text-4xl">Celebrações que ganham forma com intenção.</h2>
|
||||
<p class="max-w-2xl text-amare-accent-text/80">Recortes de eventos conduzidos com escuta, direção e presença em cada etapa.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid gap-10 md:grid-cols-2">
|
||||
@foreach ($cases as $case)
|
||||
<article class="space-y-4 border-t border-amare-accent-text/30 pt-4">
|
||||
@if (filled($case->cover_image_path))
|
||||
<x-media.image
|
||||
:path="$case->cover_image_path"
|
||||
:alt="$case->cover_image_alt ?: $case->title"
|
||||
sizes="(max-width: 768px) 100vw, 50vw"
|
||||
class="img-editorial aspect-[4/3] w-full object-cover"
|
||||
/>
|
||||
@endif
|
||||
<div class="space-y-2">
|
||||
<h3 class="text-2xl font-medium">{{ $case->title }}</h3>
|
||||
<p class="text-amare-accent-text/80">{{ $case->summary }}</p>
|
||||
<a href="{{ route('portfolio.show', $case->slug) }}" class="inline-flex border-b border-amare-accent-text pb-1 text-sm font-semibold transition-colors hover:text-amare-accent-text">
|
||||
Ver caso
|
||||
</a>
|
||||
</div>
|
||||
</article>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col gap-4 border-t border-amare-accent-text/30 pt-5 md:flex-row md:items-end md:justify-between">
|
||||
<p class="max-w-2xl text-sm text-amare-accent-text/75">
|
||||
Imagens demonstrativas enquanto o acervo autorizado da Amare está em organização.
|
||||
</p>
|
||||
<a href="{{ route('portfolio.index') }}" class="border-b border-amare-accent-text pb-1 text-sm font-semibold transition-colors hover:text-amare-accent-text">
|
||||
Conhecer o portfólio
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
30
resources/views/components/home/positioning.blade.php
Normal file
30
resources/views/components/home/positioning.blade.php
Normal file
@@ -0,0 +1,30 @@
|
||||
@props([
|
||||
'settings',
|
||||
])
|
||||
|
||||
@php
|
||||
$summary = $settings->about_summary ?: 'Assessoria para eventos em que cada escolha precisa fazer sentido para quem celebra e para quem recebe.';
|
||||
$principles = filled($settings->principles) ? $settings->principles : \App\Models\SiteSetting::defaultPrinciples();
|
||||
@endphp
|
||||
|
||||
<section aria-labelledby="positioning-heading" class="border-b border-amare-border py-20">
|
||||
<div class="container-amare grid gap-10 md:grid-cols-[minmax(0,0.8fr)_minmax(0,1.2fr)]">
|
||||
<div class="space-y-3">
|
||||
<p class="text-sm font-medium uppercase tracking-[0.18em] text-amare-accent">A Amare</p>
|
||||
<h2 id="positioning-heading" class="text-3xl font-medium text-amare-text">Presença que organiza o essencial.</h2>
|
||||
</div>
|
||||
<div class="space-y-8">
|
||||
<p class="max-w-2xl text-xl leading-relaxed text-amare-text">{{ $summary }}</p>
|
||||
<ul class="grid gap-3 border-t border-amare-border">
|
||||
@foreach ($principles as $principle)
|
||||
<li class="border-b border-amare-border py-3 text-amare-text-muted">{{ $principle }}</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
<p>
|
||||
<a href="{{ route('about') }}" class="border-b border-amare-accent pb-1 text-sm font-semibold text-amare-accent transition-colors hover:text-amare-accent-deep">
|
||||
Conhecer a Amare
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -3,24 +3,26 @@
|
||||
])
|
||||
|
||||
@if ($services->isNotEmpty())
|
||||
<section aria-labelledby="services-heading" class="border-b border-amare-border py-16">
|
||||
<div class="container-amare space-y-8">
|
||||
<section aria-labelledby="services-heading" class="border-b border-amare-border py-20">
|
||||
<div class="container-amare space-y-10">
|
||||
<div class="max-w-2xl space-y-3">
|
||||
<h2 id="services-heading" class="text-3xl font-semibold text-amare-text">Serviços</h2>
|
||||
<p class="text-amare-text-muted">Um resumo do que a assessoria pode conduzir com você.</p>
|
||||
<p class="text-sm font-medium uppercase tracking-[0.18em] text-amare-accent">Atuação</p>
|
||||
<h2 id="services-heading" class="text-3xl font-medium text-amare-text">Serviços</h2>
|
||||
<p class="text-amare-text-muted">Assessoria sob medida para decisões importantes e celebrações bem conduzidas.</p>
|
||||
</div>
|
||||
|
||||
<div class="grid gap-6 md:grid-cols-2 lg:grid-cols-3">
|
||||
@foreach ($services as $service)
|
||||
<article class="space-y-3 border-t border-amare-border pt-4">
|
||||
<h3 class="text-xl font-semibold text-amare-text">{{ $service->title }}</h3>
|
||||
<ol class="border-t border-amare-border">
|
||||
@foreach ($services as $index => $service)
|
||||
<li class="grid gap-3 border-b border-amare-border py-5 md:grid-cols-[4rem_minmax(0,0.8fr)_minmax(0,1.2fr)] md:gap-6">
|
||||
<span class="text-sm text-amare-accent">{{ str_pad((string) ($index + 1), 2, '0', STR_PAD_LEFT) }}</span>
|
||||
<h3 class="text-2xl font-medium text-amare-text">{{ $service->title }}</h3>
|
||||
<p class="text-amare-text-muted">{{ $service->summary }}</p>
|
||||
</article>
|
||||
</li>
|
||||
@endforeach
|
||||
</div>
|
||||
</ol>
|
||||
|
||||
<p>
|
||||
<a href="{{ url('/servicos') }}" class="text-sm font-semibold text-amare-accent transition-colors hover:text-amare-accent-hover">
|
||||
<a href="{{ route('services.index') }}" class="border-b border-amare-accent pb-1 text-sm font-semibold text-amare-accent transition-colors hover:text-amare-accent-deep">
|
||||
Ver todos os serviços
|
||||
</a>
|
||||
</p>
|
||||
|
||||
@@ -12,8 +12,16 @@
|
||||
|
||||
<div class="grid gap-6 md:grid-cols-2">
|
||||
@foreach ($testimonials as $testimonial)
|
||||
@php
|
||||
$paragraphs = preg_split('/\n\s*\n/', trim((string) $testimonial->quote)) ?: [];
|
||||
$paragraphs = array_values(array_filter(array_map('trim', $paragraphs), fn (string $p): bool => $p !== ''));
|
||||
@endphp
|
||||
<blockquote class="space-y-4 border-t border-amare-border pt-4">
|
||||
<p class="text-lg text-amare-text">“{{ $testimonial->quote }}”</p>
|
||||
<div class="space-y-3 text-lg text-amare-text">
|
||||
@foreach ($paragraphs as $index => $paragraph)
|
||||
<p>@if ($index === 0)“@endif{{ $paragraph }}@if ($index === count($paragraphs) - 1)”@endif</p>
|
||||
@endforeach
|
||||
</div>
|
||||
<footer class="text-sm text-amare-text-muted">
|
||||
<cite class="not-italic font-semibold text-amare-text">{{ $testimonial->author_name }}</cite>
|
||||
@if (filled($testimonial->context))
|
||||
|
||||
Reference in New Issue
Block a user