Compare commits

..

1 Commits

Author SHA1 Message Date
96f94fd571 docs: remove TDD focus, emphasize DRY and YAGNI 2026-08-11 22:38:39 -03:00
28 changed files with 115 additions and 152 deletions

13
package-lock.json generated
View File

@@ -1,5 +1,5 @@
{ {
"name": "daisyui", "name": "site-amare",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
@@ -7,7 +7,6 @@
"devDependencies": { "devDependencies": {
"@tailwindcss/vite": "^4.0.0", "@tailwindcss/vite": "^4.0.0",
"concurrently": "^9.0.1", "concurrently": "^9.0.1",
"daisyui": "^5.7.16",
"husky": "^9.1.7", "husky": "^9.1.7",
"laravel-vite-plugin": "^3.1", "laravel-vite-plugin": "^3.1",
"playwright": "^1.62.0", "playwright": "^1.62.0",
@@ -791,16 +790,6 @@
"url": "https://github.com/open-cli-tools/concurrently?sponsor=1" "url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
} }
}, },
"node_modules/daisyui": {
"version": "5.7.16",
"resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.7.16.tgz",
"integrity": "sha512-V9CJxvrWIXTDuP/0tpijjWaKaKJNYo2IrULJfTWs3/DjW9rPqswk1n8NCLQRLrTutmlG2Ech7nkJDpCnF+6Dzw==",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/saadeghi/daisyui?sponsor=1"
}
},
"node_modules/detect-libc": { "node_modules/detect-libc": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",

View File

@@ -10,7 +10,6 @@
"devDependencies": { "devDependencies": {
"@tailwindcss/vite": "^4.0.0", "@tailwindcss/vite": "^4.0.0",
"concurrently": "^9.0.1", "concurrently": "^9.0.1",
"daisyui": "^5.7.16",
"husky": "^9.1.7", "husky": "^9.1.7",
"laravel-vite-plugin": "^3.1", "laravel-vite-plugin": "^3.1",
"playwright": "^1.62.0", "playwright": "^1.62.0",

View File

@@ -1,46 +1,6 @@
@import 'tailwindcss'; @import 'tailwindcss';
@import './tokens.css'; @import './tokens.css';
@plugin "daisyui" {
themes: false;
}
@plugin "daisyui/theme" {
name: "amare";
default: true;
color-scheme: light;
--color-base-100: var(--amare-color-bg);
--color-base-200: var(--amare-color-bg-deep);
--color-base-300: var(--amare-color-bg-archive);
--color-base-content: var(--amare-color-text);
--color-primary: var(--amare-color-accent);
--color-primary-content: var(--amare-color-accent-text);
--color-secondary: var(--amare-color-sage);
--color-secondary-content: var(--amare-color-text);
--color-accent: var(--amare-color-accent-deep);
--color-accent-content: var(--amare-color-accent-text);
--color-neutral: var(--amare-color-muted);
--color-neutral-content: var(--amare-color-accent-text);
--color-info: #2563eb;
--color-info-content: #ffffff;
--color-success: var(--amare-color-success);
--color-success-content: var(--amare-color-accent-text);
--color-warning: var(--amare-color-warning);
--color-warning-content: var(--amare-color-accent-text);
--color-error: var(--amare-color-error);
--color-error-content: var(--amare-color-accent-text);
--radius-selector: 0;
--radius-field: 0;
--radius-box: 0;
--size-selector: 0.25rem;
--size-field: 0.25rem;
--border: 1px;
--depth: 0;
--noise: 0;
}
@source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php'; @source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php';
@source '../../storage/framework/views/*.php'; @source '../../storage/framework/views/*.php';
@source '../views/**/*.blade.php'; @source '../views/**/*.blade.php';
@@ -267,11 +227,3 @@
} }
} }
} }
/* daisyUI emits unlayered; match focus ring to the amare accent. */
.input:focus,
.select:focus,
.textarea:focus,
.checkbox:focus-visible {
--input-color: var(--amare-color-accent);
}

View File

@@ -32,7 +32,7 @@
</div> </div>
@if ($errors->any()) @if ($errors->any())
<div role="alert" class="alert alert-error border border-amare-error/40"> <div role="alert" class="border border-amare-error/40 bg-amare-error/5 px-6 py-5">
<p class="font-semibold text-amare-error">Não foi possível enviar.</p> <p class="font-semibold text-amare-error">Não foi possível enviar.</p>
<p class="mt-1 text-sm text-amare-muted">Revise os campos destacados abaixo e tente novamente.</p> <p class="mt-1 text-sm text-amare-muted">Revise os campos destacados abaixo e tente novamente.</p>
</div> </div>
@@ -50,7 +50,7 @@
autocomplete="name" autocomplete="name"
maxlength="120" maxlength="120"
placeholder="Seu nome" placeholder="Seu nome"
class="input w-full text-amare-text placeholder:text-amare-muted/60 @error('nome') input-error @enderror" class="w-full border-0 border-b border-amare-border bg-transparent py-3 text-amare-text transition-colors placeholder:text-amare-muted/60 focus:border-amare-accent focus:outline-none @error('nome') border-amare-error @enderror"
@error('nome') aria-invalid="true" aria-describedby="briefing-nome-error" @enderror @error('nome') aria-invalid="true" aria-describedby="briefing-nome-error" @enderror
> >
@error('nome') @error('nome')
@@ -69,7 +69,7 @@
autocomplete="email" autocomplete="email"
maxlength="254" maxlength="254"
placeholder="voce@email.com" placeholder="voce@email.com"
class="input w-full text-amare-text placeholder:text-amare-muted/60 @error('email') input-error @enderror" class="w-full border-0 border-b border-amare-border bg-transparent py-3 text-amare-text transition-colors placeholder:text-amare-muted/60 focus:border-amare-accent focus:outline-none @error('email') border-amare-error @enderror"
@error('email') aria-invalid="true" aria-describedby="briefing-email-error" @enderror @error('email') aria-invalid="true" aria-describedby="briefing-email-error" @enderror
> >
@error('email') @error('email')
@@ -88,7 +88,7 @@
autocomplete="tel" autocomplete="tel"
maxlength="40" maxlength="40"
placeholder="(11) 90000-0000" placeholder="(11) 90000-0000"
class="input w-full text-amare-text placeholder:text-amare-muted/60 @error('telefone') input-error @enderror" class="w-full border-0 border-b border-amare-border bg-transparent py-3 text-amare-text transition-colors placeholder:text-amare-muted/60 focus:border-amare-accent focus:outline-none @error('telefone') border-amare-error @enderror"
@error('telefone') aria-invalid="true" aria-describedby="briefing-telefone-error" @enderror @error('telefone') aria-invalid="true" aria-describedby="briefing-telefone-error" @enderror
> >
@error('telefone') @error('telefone')
@@ -102,7 +102,7 @@
id="briefing-tipo_evento" id="briefing-tipo_evento"
name="tipo_evento" name="tipo_evento"
required required
class="select w-full text-amare-text @error('tipo_evento') select-error @enderror" class="w-full border-0 border-b border-amare-border bg-transparent py-3 text-amare-text transition-colors focus:border-amare-accent focus:outline-none @error('tipo_evento') border-amare-error @enderror"
@error('tipo_evento') aria-invalid="true" aria-describedby="briefing-tipo_evento-error" @enderror @error('tipo_evento') aria-invalid="true" aria-describedby="briefing-tipo_evento-error" @enderror
> >
<option value="" selected disabled>Selecione...</option> <option value="" selected disabled>Selecione...</option>
@@ -125,7 +125,7 @@
value="{{ old('data_periodo') }}" value="{{ old('data_periodo') }}"
maxlength="80" maxlength="80"
placeholder="Ex.: novembro de 2027" placeholder="Ex.: novembro de 2027"
class="input w-full text-amare-text placeholder:text-amare-muted/60 @error('data_periodo') input-error @enderror" class="w-full border-0 border-b border-amare-border bg-transparent py-3 text-amare-text transition-colors placeholder:text-amare-muted/60 focus:border-amare-accent focus:outline-none @error('data_periodo') border-amare-error @enderror"
@error('data_periodo') aria-invalid="true" aria-describedby="briefing-data_periodo-error" @enderror @error('data_periodo') aria-invalid="true" aria-describedby="briefing-data_periodo-error" @enderror
> >
@error('data_periodo') @error('data_periodo')
@@ -143,7 +143,7 @@
required required
maxlength="80" maxlength="80"
placeholder="Ex.: São Paulo" placeholder="Ex.: São Paulo"
class="input w-full text-amare-text placeholder:text-amare-muted/60 @error('cidade') input-error @enderror" class="w-full border-0 border-b border-amare-border bg-transparent py-3 text-amare-text transition-colors placeholder:text-amare-muted/60 focus:border-amare-accent focus:outline-none @error('cidade') border-amare-error @enderror"
@error('cidade') aria-invalid="true" aria-describedby="briefing-cidade-error" @enderror @error('cidade') aria-invalid="true" aria-describedby="briefing-cidade-error" @enderror
> >
@error('cidade') @error('cidade')
@@ -163,7 +163,7 @@
inputmode="numeric" inputmode="numeric"
autocomplete="off" autocomplete="off"
placeholder="Ex.: 120" placeholder="Ex.: 120"
class="input w-full text-amare-text placeholder:text-amare-muted/60 @error('convidados') input-error @enderror" class="w-full border-0 border-b border-amare-border bg-transparent py-3 text-amare-text transition-colors placeholder:text-amare-muted/60 focus:border-amare-accent focus:outline-none @error('convidados') border-amare-error @enderror"
@error('convidados') aria-invalid="true" aria-describedby="briefing-convidados-error" @enderror @error('convidados') aria-invalid="true" aria-describedby="briefing-convidados-error" @enderror
> >
@error('convidados') @error('convidados')
@@ -180,7 +180,7 @@
value="{{ old('servico_interesse') }}" value="{{ old('servico_interesse') }}"
maxlength="120" maxlength="120"
placeholder="Ex.: planejamento completo" placeholder="Ex.: planejamento completo"
class="input w-full text-amare-text placeholder:text-amare-muted/60 @error('servico_interesse') input-error @enderror" class="w-full border-0 border-b border-amare-border bg-transparent py-3 text-amare-text transition-colors placeholder:text-amare-muted/60 focus:border-amare-accent focus:outline-none @error('servico_interesse') border-amare-error @enderror"
@error('servico_interesse') aria-invalid="true" aria-describedby="briefing-servico_interesse-error" @enderror @error('servico_interesse') aria-invalid="true" aria-describedby="briefing-servico_interesse-error" @enderror
> >
@error('servico_interesse') @error('servico_interesse')
@@ -198,7 +198,7 @@
rows="5" rows="5"
maxlength="3000" maxlength="3000"
placeholder="O que já está definido? Em que ponto você precisa de ajuda?" placeholder="O que já está definido? Em que ponto você precisa de ajuda?"
class="textarea w-full min-h-[110px] text-amare-text placeholder:text-amare-muted/60 @error('mensagem') textarea-error @enderror" class="w-full min-h-[110px] border-0 border-b border-amare-border bg-transparent py-3 text-amare-text transition-colors placeholder:text-amare-muted/60 focus:border-amare-accent focus:outline-none @error('mensagem') border-amare-error @enderror"
@error('mensagem') aria-invalid="true" aria-describedby="briefing-mensagem-error" @enderror @error('mensagem') aria-invalid="true" aria-describedby="briefing-mensagem-error" @enderror
>{{ old('mensagem') }}</textarea> >{{ old('mensagem') }}</textarea>
@error('mensagem') @error('mensagem')
@@ -215,7 +215,7 @@
value="1" value="1"
required required
@checked(old('privacidade')) @checked(old('privacidade'))
class="checkbox checkbox-primary mt-1 shrink-0" class="mt-1 h-5 w-5 shrink-0 accent-amare-accent"
@error('privacidade') aria-invalid="true" aria-describedby="briefing-privacidade-error" @enderror @error('privacidade') aria-invalid="true" aria-describedby="briefing-privacidade-error" @enderror
> >
<span class="text-sm text-amare-muted"> <span class="text-sm text-amare-muted">
@@ -233,7 +233,7 @@
<button <button
type="submit" type="submit"
data-submit-button data-submit-button
class="btn btn-primary text-xs font-bold uppercase tracking-[0.09em]" class="inline-flex min-h-[48px] items-center justify-center border border-transparent bg-amare-accent px-6 text-xs font-bold uppercase tracking-[0.09em] text-amare-accent-text transition-colors hover:bg-amare-accent-deep"
> >
Enviar briefing Enviar briefing
</button> </button>

View File

@@ -31,7 +31,7 @@
@endforeach @endforeach
</div> </div>
<a href="#contato" class="btn btn-primary mt-7 self-start text-xs font-bold uppercase tracking-[0.09em]" data-reveal data-reveal-from="up"> <a href="#contato" class="mt-7 inline-flex min-h-[48px] items-center justify-center self-start border border-transparent bg-amare-accent px-6 text-xs font-bold uppercase tracking-[0.09em] text-amare-accent-text transition-colors hover:bg-amare-accent-deep" data-reveal data-reveal-from="up">
Falar sobre um evento corporativo Falar sobre um evento corporativo
</a> </a>
</div> </div>

View File

@@ -18,7 +18,7 @@
<div> <div>
<a <a
href="{{ route('briefing') }}" href="{{ route('briefing') }}"
class="btn btn-primary text-sm font-semibold uppercase tracking-[0.12em]" class="inline-flex min-h-11 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 ?: 'Solicitar proposta' }} {{ $settings->hero_cta_label ?: 'Solicitar proposta' }}
</a> </a>

View File

@@ -2,29 +2,48 @@
'settings', 'settings',
]) ])
<x-public.photo-hero <section
@class(['home-chapter']) aria-labelledby="hero-heading"
class="home-chapter border-b border-amare-border bg-amare-bg"
data-chapter="hero" data-chapter="hero"
:image-path="$settings->hero_image_path" data-motion="page-open"
:image-alt="$settings->hero_image_alt ?: $settings->brand_name"
:eyebrow="$settings->hero_eyebrow"
:title="$settings->hero_title ?: 'Celebrações com propósito'"
:summary="$settings->hero_subtitle"
brand-mark
> >
<div class="flex flex-wrap items-center gap-4"> <div class="container-amare grid items-end gap-12 pb-12 pt-16 md:grid-cols-[1.1fr_0.9fr] md:gap-[clamp(3rem,6vw,7rem)] md:pb-[72px] md:pt-24">
<a href="{{ route('contact') }}" data-testid="home-primary-cta" class="btn btn-primary text-xs font-bold uppercase tracking-[0.09em]"> <div data-hero-content data-reveal-group class="flex flex-col gap-8">
{{ $settings->hero_cta_label ?: 'Solicitar proposta' }} <div data-motion-beat="eyebrow">
</a> <p class="text-xs font-bold uppercase tracking-[0.16em] text-amare-accent-deep">Assessoria &amp; produção de eventos &bull; São Paulo</p>
</div>
@if (filled($settings->hero_secondary_cta_label)) <h1 id="hero-heading" data-motion-beat="title" class="text-[clamp(3rem,8vw,5.75rem)] font-medium leading-[0.95] tracking-[-0.04em] text-amare-text">
<a href="{{ route('portfolio.index') }}" class="btn btn-ghost min-h-0 px-0 text-xs font-bold uppercase tracking-[0.09em] text-amare-accent hover:bg-transparent hover:text-amare-accent-deep"> Eventos com intenção, cuidado e presença.
<span class="border-b border-amare-accent pb-1">{{ $settings->hero_secondary_cta_label }}</span> </h1>
</a>
@endif <p class="max-w-[760px] text-[clamp(1.1875rem,2vw,1.5rem)] leading-[1.55] text-amare-text-muted">
Uma boutique de assessoria que une sensibilidade, organização e condução profissional para transformar cada projeto em uma experiência bem cuidada.
</p>
<div data-motion-beat="cta" class="flex flex-wrap items-center gap-4">
<a href="#sobre" data-testid="home-primary-cta" class="inline-flex min-h-[48px] items-center justify-center border border-transparent bg-amare-accent px-6 text-xs font-bold uppercase tracking-[0.09em] text-amare-accent-text transition-colors hover:bg-amare-accent-deep">
Conhecer a Amare
</a>
<a href="#contato" class="inline-flex min-h-[48px] items-center justify-center border border-amare-accent px-6 text-xs font-bold uppercase tracking-[0.09em] text-amare-accent-deep transition-colors hover:bg-amare-accent hover:text-amare-accent-text">
Enviar briefing
</a>
</div>
</div>
<div
data-split-hero
data-motion-beat="media"
class="min-h-[320px] overflow-hidden bg-amare-bg-deep md:min-h-[520px]"
>
@if (filled($settings->hero_image_path))
<x-media.image :path="$settings->hero_image_path" :alt="$settings->hero_image_alt ?: $settings->brand_name" loading="eager" fetchpriority="high" sizes="(max-width: 1023px) 100vw, 45vw" class="img-editorial h-full w-full object-cover" />
@else
<div data-tonal-hero class="flex h-full min-h-[320px] items-center justify-center bg-gradient-to-br from-amare-bg-deep to-amare-bg-archive md:min-h-[520px]">
<p class="text-xs font-semibold uppercase tracking-[0.16em] text-amare-muted">Fotografia hero</p>
</div>
@endif
</div>
</div> </div>
</section>
@if (filled($settings->hero_note))
<p class="mt-4 max-w-xl text-sm text-amare-text-muted">{{ $settings->hero_note }}</p>
@endif
</x-public.photo-hero>

View File

@@ -45,7 +45,7 @@
<a <a
href="{{ $waLink }}" href="{{ $waLink }}"
@if ($hasWhatsapp) target="_blank" rel="noopener noreferrer" @endif @if ($hasWhatsapp) target="_blank" rel="noopener noreferrer" @endif
class="btn btn-primary text-xs font-bold uppercase tracking-[0.09em]" class="inline-flex min-h-[48px] items-center justify-center border border-transparent bg-amare-accent px-6 text-xs font-bold uppercase tracking-[0.09em] text-amare-accent-text transition-colors hover:bg-amare-accent-deep"
> >
{{ $package->cta_label }} {{ $package->cta_label }}
</a> </a>

View File

@@ -34,7 +34,7 @@
@endforeach @endforeach
</ul> </ul>
<p> <p>
<a href="{{ route('about') }}" class="btn btn-ghost min-h-0 px-0 text-sm font-semibold text-amare-accent hover:bg-transparent hover:text-amare-accent-deep"> <a href="{{ route('about') }}" class="inline-flex min-h-11 items-center text-sm font-semibold text-amare-accent transition-colors hover:text-amare-accent-deep">
<span class="border-b border-amare-accent pb-1">Conhecer a Amare</span> <span class="border-b border-amare-accent pb-1">Conhecer a Amare</span>
</a> </a>
</p> </p>

View File

@@ -26,7 +26,7 @@
</ol> </ol>
<p> <p>
<a href="{{ route('services.index') }}" class="btn btn-ghost min-h-0 px-0 text-sm font-semibold text-amare-accent hover:bg-transparent hover:text-amare-accent-deep"> <a href="{{ route('services.index') }}" class="inline-flex min-h-11 items-center text-sm font-semibold text-amare-accent transition-colors hover:text-amare-accent-deep">
<span class="border-b border-amare-accent pb-1">Ver todos os serviços</span> <span class="border-b border-amare-accent pb-1">Ver todos os serviços</span>
</a> </a>
</p> </p>

View File

@@ -19,7 +19,7 @@
<p class="text-xs font-bold uppercase tracking-[0.16em] text-amare-accent-deep">Amare Casamentos</p> <p class="text-xs font-bold uppercase tracking-[0.16em] text-amare-accent-deep">Amare Casamentos</p>
<h3 class="text-[clamp(1.5625rem,2.7vw,2.125rem)] font-medium leading-tight text-amare-text">Planejamento e condução para viver o processo com mais leveza.</h3> <h3 class="text-[clamp(1.5625rem,2.7vw,2.125rem)] font-medium leading-tight text-amare-text">Planejamento e condução para viver o processo com mais leveza.</h3>
<p class="text-amare-text-muted">Do início da organização à reta final, modalidades pensadas para diferentes momentos do casal.</p> <p class="text-amare-text-muted">Do início da organização à reta final, modalidades pensadas para diferentes momentos do casal.</p>
<a href="#casamentos" class="btn btn-outline mt-2 self-start text-xs font-bold uppercase tracking-[0.09em]"> <a href="#casamentos" class="mt-2 inline-flex min-h-[48px] items-center justify-center self-start border border-amare-accent px-6 text-xs font-bold uppercase tracking-[0.09em] text-amare-accent-deep transition-colors hover:bg-amare-accent hover:text-amare-accent-text">
Conhecer casamentos Conhecer casamentos
</a> </a>
</div> </div>
@@ -31,7 +31,7 @@
<p class="text-xs font-bold uppercase tracking-[0.16em] text-amare-accent-deep">Amare Corporate</p> <p class="text-xs font-bold uppercase tracking-[0.16em] text-amare-accent-deep">Amare Corporate</p>
<h3 class="text-[clamp(1.5625rem,2.7vw,2.125rem)] font-medium leading-tight text-amare-text">Eventos empresariais com organização, intenção e execução segura.</h3> <h3 class="text-[clamp(1.5625rem,2.7vw,2.125rem)] font-medium leading-tight text-amare-text">Eventos empresariais com organização, intenção e execução segura.</h3>
<p class="text-amare-text-muted">Uma frente própria para projetos corporativos, com linguagem e necessidades diferentes das celebrações sociais.</p> <p class="text-amare-text-muted">Uma frente própria para projetos corporativos, com linguagem e necessidades diferentes das celebrações sociais.</p>
<a href="#corporate" class="btn btn-outline mt-2 self-start text-xs font-bold uppercase tracking-[0.09em]"> <a href="#corporate" class="mt-2 inline-flex min-h-[48px] items-center justify-center self-start border border-amare-accent px-6 text-xs font-bold uppercase tracking-[0.09em] text-amare-accent-deep transition-colors hover:bg-amare-accent hover:text-amare-accent-text">
Conhecer Corporate Conhecer Corporate
</a> </a>
</div> </div>

View File

@@ -10,7 +10,7 @@
@foreach ($packages as $package) @foreach ($packages as $package)
@php($digits = preg_replace('/\D/', '', (string) $settings->whatsapp_number)) @php($digits = preg_replace('/\D/', '', (string) $settings->whatsapp_number))
@php($href = strlen((string) $digits) >= 10 ? 'https://wa.me/'.$digits.'?text='.rawurlencode('Olá, gostaria de conversar sobre a modalidade '.$package->name.' para meu casamento.') : route('briefing', ['servico_interesse' => $package->name])) @php($href = strlen((string) $digits) >= 10 ? 'https://wa.me/'.$digits.'?text='.rawurlencode('Olá, gostaria de conversar sobre a modalidade '.$package->name.' para meu casamento.') : route('briefing', ['servico_interesse' => $package->name]))
<li class="space-y-5 border-t border-amare-border pt-4" data-reveal data-reveal-from="up"><p class="text-xs font-semibold uppercase tracking-[.14em] text-amare-accent">{{ $package->level }}</p><h3 class="text-3xl font-medium">{{ $package->name }}</h3><p class="text-amare-muted">{{ $package->summary }}</p><ul class="space-y-2 text-sm text-amare-text-muted">@foreach ($package->scope_items as $item)<li class="border-l border-amare-border pl-3">{{ $item }}</li>@endforeach</ul><a href="{{ $href }}" @if (str_starts_with($href, 'https://wa.me/')) target="_blank" rel="noopener" @endif class="btn btn-ghost min-h-0 px-0 text-sm font-semibold text-amare-accent hover:bg-transparent hover:text-amare-accent-deep"><span class="border-b border-amare-accent pb-1">{{ $package->cta_label }}</span></a></li> <li class="space-y-5 border-t border-amare-border pt-4" data-reveal data-reveal-from="up"><p class="text-xs font-semibold uppercase tracking-[.14em] text-amare-accent">{{ $package->level }}</p><h3 class="text-3xl font-medium">{{ $package->name }}</h3><p class="text-amare-muted">{{ $package->summary }}</p><ul class="space-y-2 text-sm text-amare-text-muted">@foreach ($package->scope_items as $item)<li class="border-l border-amare-border pl-3">{{ $item }}</li>@endforeach</ul><a href="{{ $href }}" @if (str_starts_with($href, 'https://wa.me/')) target="_blank" rel="noopener" @endif class="inline-flex min-h-11 items-center text-sm font-semibold text-amare-accent hover:text-amare-accent-deep"><span class="border-b border-amare-accent pb-1">{{ $package->cta_label }}</span></a></li>
@endforeach @endforeach
</ol> </ol>
@endif @endif

View File

@@ -20,7 +20,7 @@
<h1 class="text-4xl font-medium tracking-tight text-amare-text" data-motion-beat="title">Página não encontrada</h1> <h1 class="text-4xl font-medium tracking-tight text-amare-text" data-motion-beat="title">Página não encontrada</h1>
<p class="text-amare-muted" data-reveal data-reveal-from="up">O endereço que você tentou abrir não existe ou foi movido.</p> <p class="text-amare-muted" data-reveal data-reveal-from="up">O endereço que você tentou abrir não existe ou foi movido.</p>
<p data-reveal data-reveal-from="up"> <p data-reveal data-reveal-from="up">
<a href="{{ route('home') }}" class="btn btn-primary text-sm font-semibold uppercase tracking-[0.12em]"> <a href="{{ route('home') }}" class="inline-flex min-h-11 items-center bg-amare-accent px-5 py-3 text-sm font-semibold uppercase tracking-[0.12em] text-amare-accent-text transition-colors hover:bg-amare-accent-deep">
Voltar para a home Voltar para a home
</a> </a>
</p> </p>

View File

@@ -20,7 +20,7 @@
<h1 class="text-4xl font-medium tracking-tight text-amare-text" data-motion-beat="title">Sessão expirada</h1> <h1 class="text-4xl font-medium tracking-tight text-amare-text" data-motion-beat="title">Sessão expirada</h1>
<p class="text-amare-muted" data-reveal data-reveal-from="up">Sua sessão expirou. Volte e tente enviar novamente.</p> <p class="text-amare-muted" data-reveal data-reveal-from="up">Sua sessão expirou. Volte e tente enviar novamente.</p>
<p data-reveal data-reveal-from="up"> <p data-reveal data-reveal-from="up">
<a href="{{ route('home') }}" class="btn btn-primary text-sm font-semibold uppercase tracking-[0.12em]"> <a href="{{ route('home') }}" class="inline-flex min-h-11 items-center bg-amare-accent px-5 py-3 text-sm font-semibold uppercase tracking-[0.12em] text-amare-accent-text transition-colors hover:bg-amare-accent-deep">
Voltar para a home Voltar para a home
</a> </a>
</p> </p>

View File

@@ -20,7 +20,7 @@
<h1 class="text-4xl font-medium tracking-tight text-amare-text" data-motion-beat="title">Muitas solicitações</h1> <h1 class="text-4xl font-medium tracking-tight text-amare-text" data-motion-beat="title">Muitas solicitações</h1>
<p class="text-amare-muted" data-reveal data-reveal-from="up">Você enviou muitas solicitações em pouco tempo. Aguarde um instante e tente novamente.</p> <p class="text-amare-muted" data-reveal data-reveal-from="up">Você enviou muitas solicitações em pouco tempo. Aguarde um instante e tente novamente.</p>
<p data-reveal data-reveal-from="up"> <p data-reveal data-reveal-from="up">
<a href="{{ route('home') }}" class="btn btn-primary text-sm font-semibold uppercase tracking-[0.12em]"> <a href="{{ route('home') }}" class="inline-flex min-h-11 items-center bg-amare-accent px-5 py-3 text-sm font-semibold uppercase tracking-[0.12em] text-amare-accent-text transition-colors hover:bg-amare-accent-deep">
Voltar para a home Voltar para a home
</a> </a>
</p> </p>

View File

@@ -20,7 +20,7 @@
<h1 class="text-4xl font-medium tracking-tight text-amare-text" data-motion-beat="title">Algo deu errado</h1> <h1 class="text-4xl font-medium tracking-tight text-amare-text" data-motion-beat="title">Algo deu errado</h1>
<p class="text-amare-muted" data-reveal data-reveal-from="up">Não foi possível concluir o pedido agora. Tente novamente em instantes.</p> <p class="text-amare-muted" data-reveal data-reveal-from="up">Não foi possível concluir o pedido agora. Tente novamente em instantes.</p>
<p data-reveal data-reveal-from="up"> <p data-reveal data-reveal-from="up">
<a href="{{ route('home') }}" class="btn btn-primary text-sm font-semibold uppercase tracking-[0.12em]"> <a href="{{ route('home') }}" class="inline-flex min-h-11 items-center bg-amare-accent px-5 py-3 text-sm font-semibold uppercase tracking-[0.12em] text-amare-accent-text transition-colors hover:bg-amare-accent-deep">
Voltar para a home Voltar para a home
</a> </a>
</p> </p>

View File

@@ -20,7 +20,7 @@
<h1 class="text-4xl font-medium tracking-tight text-amare-text" data-motion-beat="title">Em manutenção</h1> <h1 class="text-4xl font-medium tracking-tight text-amare-text" data-motion-beat="title">Em manutenção</h1>
<p class="text-amare-muted" data-reveal data-reveal-from="up">Estamos realizando uma breve manutenção. Tente novamente em instantes.</p> <p class="text-amare-muted" data-reveal data-reveal-from="up">Estamos realizando uma breve manutenção. Tente novamente em instantes.</p>
<p data-reveal data-reveal-from="up"> <p data-reveal data-reveal-from="up">
<a href="{{ route('home') }}" class="btn btn-primary text-sm font-semibold uppercase tracking-[0.12em]"> <a href="{{ route('home') }}" class="inline-flex min-h-11 items-center bg-amare-accent px-5 py-3 text-sm font-semibold uppercase tracking-[0.12em] text-amare-accent-text transition-colors hover:bg-amare-accent-deep">
Voltar para a home Voltar para a home
</a> </a>
</p> </p>

View File

@@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}" data-theme="amare"> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
@@ -58,11 +58,11 @@
<header class="site-header sticky top-0 z-40 border-b border-amare-border bg-amare-bg/95 backdrop-blur-sm"> <header class="site-header sticky top-0 z-40 border-b border-amare-border bg-amare-bg/95 backdrop-blur-sm">
<div class="container-amare grid grid-cols-[auto_1fr_auto] items-center gap-4 py-4 md:grid-cols-[1fr_auto_1fr] md:h-[74px] md:py-0"> <div class="container-amare grid grid-cols-[auto_1fr_auto] items-center gap-4 py-4 md:grid-cols-[1fr_auto_1fr] md:h-[74px] md:py-0">
<nav id="main-nav" class="main-nav order-3 col-span-3 hidden flex-col gap-4 border-t border-amare-border pt-4 md:order-1 md:col-span-1 md:flex md:flex-row md:items-center md:gap-1 md:border-0 md:pt-0" aria-label="Principal" data-main-nav> <nav id="main-nav" class="main-nav order-3 col-span-3 hidden flex-col gap-4 border-t border-amare-border pt-4 md:order-1 md:col-span-1 md:flex md:flex-row md:items-center md:gap-1 md:border-0 md:pt-0" aria-label="Principal" data-main-nav>
<a href="{{ route('home') }}" class="btn btn-ghost min-h-0 px-0 py-3 text-[13px] font-semibold uppercase tracking-[0.08em] text-amare-muted hover:text-amare-accent md:px-3">Início</a> <a href="{{ route('home') }}" class="inline-flex items-center py-3 text-[13px] font-semibold uppercase tracking-[0.08em] text-amare-muted transition-colors hover:text-amare-accent md:px-3">Início</a>
<a href="{{ route('services.index') }}" class="btn btn-ghost min-h-0 px-0 py-3 text-[13px] font-semibold uppercase tracking-[0.08em] text-amare-muted hover:text-amare-accent md:px-3">Serviços</a> <a href="{{ route('services.index') }}" class="inline-flex items-center py-3 text-[13px] font-semibold uppercase tracking-[0.08em] text-amare-muted transition-colors hover:text-amare-accent md:px-3">Serviços</a>
<a href="{{ route('portfolio.index') }}" class="btn btn-ghost min-h-0 px-0 py-3 text-[13px] font-semibold uppercase tracking-[0.08em] text-amare-muted hover:text-amare-accent md:px-3">Portfólio</a> <a href="{{ route('portfolio.index') }}" class="inline-flex items-center py-3 text-[13px] font-semibold uppercase tracking-[0.08em] text-amare-muted transition-colors hover:text-amare-accent md:px-3">Portfólio</a>
<a href="{{ route('about') }}" class="btn btn-ghost min-h-0 px-0 py-3 text-[13px] font-semibold uppercase tracking-[0.08em] text-amare-muted hover:text-amare-accent md:px-3">Amare</a> <a href="{{ route('about') }}" class="inline-flex items-center py-3 text-[13px] font-semibold uppercase tracking-[0.08em] text-amare-muted transition-colors hover:text-amare-accent md:px-3">Amare</a>
<a href="{{ route('briefing') }}" class="btn btn-ghost min-h-0 px-0 py-3 text-[13px] font-semibold uppercase tracking-[0.08em] text-amare-muted hover:text-amare-accent md:hidden">Solicitar proposta</a> <a href="{{ route('briefing') }}" class="inline-flex items-center py-3 text-[13px] font-semibold uppercase tracking-[0.08em] text-amare-muted transition-colors hover:text-amare-accent md:hidden">Solicitar proposta</a>
</nav> </nav>
<a href="{{ route('home') }}" class="order-1 justify-self-start md:order-2 md:justify-self-center" aria-label="{{ $siteSettings->brand_name }} — página inicial"> <a href="{{ route('home') }}" class="order-1 justify-self-start md:order-2 md:justify-self-center" aria-label="{{ $siteSettings->brand_name }} — página inicial">
@@ -70,14 +70,13 @@
</a> </a>
<div class="order-2 flex items-center justify-end gap-3 md:order-3"> <div class="order-2 flex items-center justify-end gap-3 md:order-3">
<a href="{{ route('briefing') }}" class="btn btn-outline hidden min-h-0 px-6 text-xs font-bold uppercase tracking-[0.09em] md:inline-flex"> <a href="{{ route('briefing') }}" class="hidden items-center justify-center border border-amare-accent px-6 text-xs font-bold uppercase tracking-[0.09em] text-amare-accent-deep transition-colors hover:bg-amare-accent hover:text-amare-accent-text md:inline-flex min-h-[48px]">
Conte seu evento Conte seu evento
</a> </a>
</a>
<button <button
type="button" type="button"
class="menu-button btn btn-square btn-ghost border border-amare-border text-amare-text md:hidden" class="menu-button inline-flex h-11 w-11 items-center justify-center border border-amare-border text-amare-text md:hidden"
aria-label="Abrir menu" aria-label="Abrir menu"
aria-controls="main-nav" aria-controls="main-nav"
aria-expanded="false" aria-expanded="false"

View File

@@ -42,7 +42,7 @@
</p> </p>
@if (session('status') === 'briefing-sent') @if (session('status') === 'briefing-sent')
<div role="status" class="alert mt-8 border border-amare-border bg-amare-bg-deep"> <div role="status" class="mt-8 border border-amare-border bg-amare-bg-deep px-6 py-5">
<p class="font-semibold text-amare-text">Mensagem enviada.</p> <p class="font-semibold text-amare-text">Mensagem enviada.</p>
<p class="mt-1 text-amare-muted">Recebemos seu briefing e retornaremos em breve pelo canal informado.</p> <p class="mt-1 text-amare-muted">Recebemos seu briefing e retornaremos em breve pelo canal informado.</p>
</div> </div>
@@ -61,7 +61,7 @@
</div> </div>
@if ($errors->any()) @if ($errors->any())
<div role="alert" class="alert alert-error border border-amare-error/40"> <div role="alert" class="border border-amare-error/40 bg-amare-error/5 px-6 py-5">
<p class="font-semibold text-amare-error">Não foi possível enviar.</p> <p class="font-semibold text-amare-error">Não foi possível enviar.</p>
<p class="mt-1 text-sm text-amare-muted">Revise os campos destacados abaixo e tente novamente.</p> <p class="mt-1 text-sm text-amare-muted">Revise os campos destacados abaixo e tente novamente.</p>
</div> </div>
@@ -79,7 +79,7 @@
autocomplete="name" autocomplete="name"
maxlength="120" maxlength="120"
placeholder="Seu nome" placeholder="Seu nome"
class="input w-full text-amare-text placeholder:text-amare-muted/60 @error('nome') input-error @enderror" class="w-full border-0 border-b border-amare-border bg-transparent py-3 text-amare-text transition-colors placeholder:text-amare-muted/60 focus:border-amare-accent focus:outline-none @error('nome') border-amare-error @enderror"
@error('nome') aria-invalid="true" aria-describedby="nome-error" @enderror @error('nome') aria-invalid="true" aria-describedby="nome-error" @enderror
> >
@error('nome') @error('nome')
@@ -98,7 +98,7 @@
autocomplete="email" autocomplete="email"
maxlength="254" maxlength="254"
placeholder="voce@email.com" placeholder="voce@email.com"
class="input w-full text-amare-text placeholder:text-amare-muted/60 @error('email') input-error @enderror" class="w-full border-0 border-b border-amare-border bg-transparent py-3 text-amare-text transition-colors placeholder:text-amare-muted/60 focus:border-amare-accent focus:outline-none @error('email') border-amare-error @enderror"
@error('email') aria-invalid="true" aria-describedby="email-error" @enderror @error('email') aria-invalid="true" aria-describedby="email-error" @enderror
> >
@error('email') @error('email')
@@ -117,7 +117,7 @@
autocomplete="tel" autocomplete="tel"
maxlength="40" maxlength="40"
placeholder="(11) 90000-0000" placeholder="(11) 90000-0000"
class="input w-full text-amare-text placeholder:text-amare-muted/60 @error('telefone') input-error @enderror" class="w-full border-0 border-b border-amare-border bg-transparent py-3 text-amare-text transition-colors placeholder:text-amare-muted/60 focus:border-amare-accent focus:outline-none @error('telefone') border-amare-error @enderror"
@error('telefone') aria-invalid="true" aria-describedby="telefone-error" @enderror @error('telefone') aria-invalid="true" aria-describedby="telefone-error" @enderror
> >
@error('telefone') @error('telefone')
@@ -131,7 +131,7 @@
id="tipo_evento" id="tipo_evento"
name="tipo_evento" name="tipo_evento"
required required
class="select w-full text-amare-text @error('tipo_evento') select-error @enderror" class="w-full border-0 border-b border-amare-border bg-transparent py-3 text-amare-text transition-colors focus:border-amare-accent focus:outline-none @error('tipo_evento') border-amare-error @enderror"
@error('tipo_evento') aria-invalid="true" aria-describedby="tipo_evento-error" @enderror @error('tipo_evento') aria-invalid="true" aria-describedby="tipo_evento-error" @enderror
> >
<option value="" selected disabled>Selecione...</option> <option value="" selected disabled>Selecione...</option>
@@ -154,7 +154,7 @@
value="{{ old('data_periodo') }}" value="{{ old('data_periodo') }}"
maxlength="80" maxlength="80"
placeholder="Ex.: novembro de 2027" placeholder="Ex.: novembro de 2027"
class="input w-full text-amare-text placeholder:text-amare-muted/60 @error('data_periodo') input-error @enderror" class="w-full border-0 border-b border-amare-border bg-transparent py-3 text-amare-text transition-colors placeholder:text-amare-muted/60 focus:border-amare-accent focus:outline-none @error('data_periodo') border-amare-error @enderror"
@error('data_periodo') aria-invalid="true" aria-describedby="data_periodo-error" @enderror @error('data_periodo') aria-invalid="true" aria-describedby="data_periodo-error" @enderror
> >
@error('data_periodo') @error('data_periodo')
@@ -172,7 +172,7 @@
required required
maxlength="80" maxlength="80"
placeholder="Ex.: São Paulo" placeholder="Ex.: São Paulo"
class="input w-full text-amare-text placeholder:text-amare-muted/60 @error('cidade') input-error @enderror" class="w-full border-0 border-b border-amare-border bg-transparent py-3 text-amare-text transition-colors placeholder:text-amare-muted/60 focus:border-amare-accent focus:outline-none @error('cidade') border-amare-error @enderror"
@error('cidade') aria-invalid="true" aria-describedby="cidade-error" @enderror @error('cidade') aria-invalid="true" aria-describedby="cidade-error" @enderror
> >
@error('cidade') @error('cidade')
@@ -192,7 +192,7 @@
inputmode="numeric" inputmode="numeric"
autocomplete="off" autocomplete="off"
placeholder="Ex.: 120" placeholder="Ex.: 120"
class="input w-full text-amare-text placeholder:text-amare-muted/60 @error('convidados') input-error @enderror" class="w-full border-0 border-b border-amare-border bg-transparent py-3 text-amare-text transition-colors placeholder:text-amare-muted/60 focus:border-amare-accent focus:outline-none @error('convidados') border-amare-error @enderror"
@error('convidados') aria-invalid="true" aria-describedby="convidados-error" @enderror @error('convidados') aria-invalid="true" aria-describedby="convidados-error" @enderror
> >
@error('convidados') @error('convidados')
@@ -209,7 +209,7 @@
value="{{ old('servico_interesse', request('servico_interesse')) }}" value="{{ old('servico_interesse', request('servico_interesse')) }}"
maxlength="120" maxlength="120"
placeholder="Ex.: planejamento completo" placeholder="Ex.: planejamento completo"
class="input w-full text-amare-text placeholder:text-amare-muted/60 @error('servico_interesse') input-error @enderror" class="w-full border-0 border-b border-amare-border bg-transparent py-3 text-amare-text transition-colors placeholder:text-amare-muted/60 focus:border-amare-accent focus:outline-none @error('servico_interesse') border-amare-error @enderror"
@error('servico_interesse') aria-invalid="true" aria-describedby="servico_interesse-error" @enderror @error('servico_interesse') aria-invalid="true" aria-describedby="servico_interesse-error" @enderror
> >
@error('servico_interesse') @error('servico_interesse')
@@ -227,7 +227,7 @@
rows="6" rows="6"
maxlength="3000" maxlength="3000"
placeholder="Conte sobre o seu evento, expectativas e principais preocupações." placeholder="Conte sobre o seu evento, expectativas e principais preocupações."
class="textarea w-full text-amare-text placeholder:text-amare-muted/60 @error('mensagem') textarea-error @enderror" class="w-full border-0 border-b border-amare-border bg-transparent py-3 text-amare-text transition-colors placeholder:text-amare-muted/60 focus:border-amare-accent focus:outline-none @error('mensagem') border-amare-error @enderror"
@error('mensagem') aria-invalid="true" aria-describedby="mensagem-error" @enderror @error('mensagem') aria-invalid="true" aria-describedby="mensagem-error" @enderror
>{{ old('mensagem') }}</textarea> >{{ old('mensagem') }}</textarea>
@error('mensagem') @error('mensagem')
@@ -244,7 +244,7 @@
value="1" value="1"
required required
@checked(old('privacidade')) @checked(old('privacidade'))
class="checkbox checkbox-primary mt-1 shrink-0" class="mt-1 h-5 w-5 shrink-0 accent-amare-accent"
@error('privacidade') aria-invalid="true" aria-describedby="privacidade-error" @enderror @error('privacidade') aria-invalid="true" aria-describedby="privacidade-error" @enderror
> >
<span class="text-sm text-amare-muted"> <span class="text-sm text-amare-muted">
@@ -262,7 +262,7 @@
<button <button
type="submit" type="submit"
data-submit-button data-submit-button
class="btn btn-primary min-h-11 px-8 text-sm font-semibold uppercase tracking-[0.12em]" class="inline-flex min-h-[44px] items-center justify-center bg-amare-accent px-8 py-3 text-sm font-semibold uppercase tracking-[0.12em] text-amare-accent-text transition-colors hover:bg-amare-accent-deep"
> >
Enviar briefing Enviar briefing
</button> </button>

View File

@@ -33,7 +33,7 @@
</div> </div>
<div><label class="mb-2 block text-xs font-semibold uppercase tracking-[.14em]" for="mensagem">Mensagem *</label><textarea class="w-full border border-amare-border bg-transparent p-3 focus:border-amare-accent focus:outline-none" id="mensagem" name="mensagem" rows="6" required maxlength="3000">{{ old('mensagem') }}</textarea>@error('mensagem')<p class="mt-2 text-sm text-amare-error">{{ $message }}</p>@enderror</div> <div><label class="mb-2 block text-xs font-semibold uppercase tracking-[.14em]" for="mensagem">Mensagem *</label><textarea class="w-full border border-amare-border bg-transparent p-3 focus:border-amare-accent focus:outline-none" id="mensagem" name="mensagem" rows="6" required maxlength="3000">{{ old('mensagem') }}</textarea>@error('mensagem')<p class="mt-2 text-sm text-amare-error">{{ $message }}</p>@enderror</div>
<p class="max-w-2xl text-sm text-amare-muted">Ao enviar, você reconhece o uso destes dados exclusivamente para analisar uma possível parceria, conforme a <a class="text-amare-accent underline" href="{{ route('privacy') }}">política de privacidade</a>.</p> <p class="max-w-2xl text-sm text-amare-muted">Ao enviar, você reconhece o uso destes dados exclusivamente para analisar uma possível parceria, conforme a <a class="text-amare-accent underline" href="{{ route('privacy') }}">política de privacidade</a>.</p>
<button type="submit" data-submit-button class="btn btn-primary text-sm font-semibold uppercase tracking-[.12em]">Enviar apresentação</button> <button type="submit" data-submit-button class="inline-flex min-h-11 bg-amare-accent px-6 py-3 text-sm font-semibold uppercase tracking-[.12em] text-amare-accent-text hover:bg-amare-accent-deep">Enviar apresentação</button>
</form> </form>
@endif @endif
</div> </div>

View File

@@ -93,7 +93,8 @@ it('reaches the primary CTA by keyboard and activates it', function (): void {
$page->keys('[data-testid="home-primary-cta"]', 'Enter'); $page->keys('[data-testid="home-primary-cta"]', 'Enter');
$page->assertPathIs('/contato'); $hash = $page->script('() => window.location.hash');
expect($hash)->toBe('#sobre');
}); });
it('disables transitions when prefers-reduced-motion is reduce', function (): void { it('disables transitions when prefers-reduced-motion is reduce', function (): void {

View File

@@ -38,7 +38,7 @@ it('keeps the hero asymmetric on desktop and stacked through md and mobile', fun
startsBelowHeader: Math.abs((heroRect?.top ?? -1) - (headerRect?.bottom ?? -2)) <= 1, startsBelowHeader: Math.abs((heroRect?.top ?? -1) - (headerRect?.bottom ?? -2)) <= 1,
mediaBesideContent: (mediaRect?.left ?? 0) >= (contentRect?.right ?? Number.POSITIVE_INFINITY) - 1, mediaBesideContent: (mediaRect?.left ?? 0) >= (contentRect?.right ?? Number.POSITIVE_INFINITY) - 1,
mediaMinHeight: Math.round(mediaRect?.height ?? 0) >= 519, mediaMinHeight: Math.round(mediaRect?.height ?? 0) >= 519,
mediaTouchesViewportRight: (mediaRect?.right ?? 0) >= window.innerWidth - 4, mediaInsideContainer: (mediaRect?.right ?? 0) < window.innerWidth - 100,
horizontalOverflow: document.documentElement.scrollWidth > window.innerWidth, horizontalOverflow: document.documentElement.scrollWidth > window.innerWidth,
}; };
} }
@@ -49,7 +49,7 @@ it('keeps the hero asymmetric on desktop and stacked through md and mobile', fun
'startsBelowHeader' => true, 'startsBelowHeader' => true,
'mediaBesideContent' => true, 'mediaBesideContent' => true,
'mediaMinHeight' => true, 'mediaMinHeight' => true,
'mediaTouchesViewportRight' => true, 'mediaInsideContainer' => true,
'horizontalOverflow' => false, 'horizontalOverflow' => false,
]); ]);

View File

@@ -158,7 +158,7 @@ it('opens home motion, reveals once, and allows CTA during open', function (): v
$page->click('[data-testid="home-primary-cta"]'); $page->click('[data-testid="home-primary-cta"]');
$page->assertPathIs('/contato'); expect($page->script('() => window.location.hash'))->toBe('#sobre');
}); });
it('keeps content and navigation usable without javascript', function (): void { it('keeps content and navigation usable without javascript', function (): void {
@@ -171,7 +171,7 @@ it('keeps content and navigation usable without javascript', function (): void {
->assertVisible('[data-testid="home-primary-cta"]') ->assertVisible('[data-testid="home-primary-cta"]')
->click('[data-testid="home-primary-cta"]'); ->click('[data-testid="home-primary-cta"]');
$page->assertPathIs('/contato'); expect($page->script('() => window.location.hash'))->toBe('#sobre');
}); });
it('keeps targets final when intersection observer is unavailable', function (): void { it('keeps targets final when intersection observer is unavailable', function (): void {

View File

@@ -8,7 +8,7 @@ it('renders the public home page', function (): void {
$settings = SiteSetting::instance(); $settings = SiteSetting::instance();
$this->visit('/') $this->visit('/')
->assertSee($settings->hero_title) ->assertSee('Eventos com intenção, cuidado e presença.')
->assertSee($settings->brand_name); ->assertSee($settings->brand_name);
}); });

View File

@@ -20,7 +20,7 @@ class HomePageTest extends TestCase
$response $response
->assertOk() ->assertOk()
->assertSee('Celebrações com propósito') ->assertSee('Eventos com intenção, cuidado e presença.')
->assertSee($settings->brand_name); ->assertSee($settings->brand_name);
} }
} }

View File

@@ -105,18 +105,18 @@ class HomePageContentTest extends TestCase
'id="testimonials-heading"', 'id="testimonials-heading"',
'id="briefing-heading"', 'id="briefing-heading"',
], false) ], false)
->assertSee('Fotografia hero')
->assertSee('FOTO DE CASAMENTO 01') ->assertSee('FOTO DE CASAMENTO 01')
->assertSee('Nome e data reais — aguardando autorização') ->assertSee('Nome e data reais — aguardando autorização')
->assertSee('Conteúdo em construção') ->assertSee('Conteúdo em construção')
->assertSee('Fornecedores e parcerias — pós-MVP'); ->assertSee('Fornecedores e parcerias — pós-MVP');
} }
public function test_hero_falls_back_to_default_copy_when_fields_are_empty(): void public function test_hero_uses_fixed_editorial_copy_regardless_of_settings(): void
{ {
SiteSetting::instance()->update([ SiteSetting::instance()->update([
'hero_title' => '', 'hero_title' => '',
'hero_subtitle' => '', 'hero_subtitle' => '',
'hero_cta_label' => '',
'hero_image_path' => null, 'hero_image_path' => null,
]); ]);
@@ -124,8 +124,11 @@ class HomePageContentTest extends TestCase
$response $response
->assertOk() ->assertOk()
->assertSeeInOrder(['id="hero-heading"', 'Celebrações com propósito'], false) ->assertSee('Eventos com intenção, cuidado e presença.')
->assertSeeInOrder(['data-testid="home-primary-cta"', 'Solicitar proposta'], false); ->assertSee('Uma boutique de assessoria que une sensibilidade, organização e condução profissional para transformar cada projeto em uma experiência bem cuidada.')
->assertSee('Conhecer a Amare')
->assertSee('Enviar briefing')
->assertSeeInOrder(['href="#sobre"', 'data-testid="home-primary-cta"'], false);
} }
public function test_home_hero_uses_its_own_cms_image_instead_of_the_social_og_image(): void public function test_home_hero_uses_its_own_cms_image_instead_of_the_social_og_image(): void
@@ -157,11 +160,12 @@ class HomePageContentTest extends TestCase
$this->get(route('home')) $this->get(route('home'))
->assertOk() ->assertOk()
->assertSee('data-tonal-hero', false) ->assertSee('min-h-[320px]', false)
->assertSee('md:min-h-[520px]', false)
->assertSee('Fotografia hero')
->assertSee('id="hero-heading"', false) ->assertSee('id="hero-heading"', false)
->assertSee('data-testid="home-primary-cta"', false) ->assertSee('data-testid="home-primary-cta"', false)
->assertDontSee('data-photo-hero', false) ->assertSee('data-motion-beat="media"', false)
->assertDontSee('data-motion-beat="media"', false)
->assertDontSee('content/home/hero.jpg', false); ->assertDontSee('content/home/hero.jpg', false);
} }

View File

@@ -37,16 +37,15 @@ class ImmersivePhotoHeroTest extends TestCase
->assertOk() ->assertOk()
->assertSee('data-chapter="hero"', false) ->assertSee('data-chapter="hero"', false)
->assertSee('data-motion="page-open"', false) ->assertSee('data-motion="page-open"', false)
->assertSee('data-photo-hero', false) ->assertSee('md:min-h-[520px]', false)
->assertSee('min-h-[calc(100dvh-5rem)]', false)
->assertSee('data-hero-content', false) ->assertSee('data-hero-content', false)
->assertSee('data-split-hero', false) ->assertSee('data-split-hero', false)
->assertSee('data-motion-beat="media"', false) ->assertSee('data-motion-beat="media"', false)
->assertSee('lg:grid-cols-12', false) ->assertSee('md:grid-cols-[1.1fr_0.9fr]', false)
->assertSee('content/heroes/home.jpg', false) ->assertSee('content/heroes/home.jpg', false)
->assertSee('loading="eager"', false) ->assertSee('loading="eager"', false)
->assertSee('fetchpriority="high"', false) ->assertSee('fetchpriority="high"', false)
->assertSee('sizes="(max-width: 1023px) 100vw, 58vw"', false) ->assertSee('sizes="(max-width: 1023px) 100vw, 45vw"', false)
->assertDontSee('data-tonal-hero', false) ->assertDontSee('data-tonal-hero', false)
->assertSee('content="http://localhost/storage/content/og/social.jpg"', false); ->assertSee('content="http://localhost/storage/content/og/social.jpg"', false);
} }
@@ -76,8 +75,9 @@ class ImmersivePhotoHeroTest extends TestCase
->assertSee('data-motion="page-open"', false) ->assertSee('data-motion="page-open"', false)
->assertSee('id="hero-heading"', false) ->assertSee('id="hero-heading"', false)
->assertSee('data-testid="home-primary-cta"', false) ->assertSee('data-testid="home-primary-cta"', false)
->assertDontSee('data-photo-hero', false) ->assertSee('data-split-hero', false)
->assertDontSee('data-split-hero', false) ->assertSee('data-tonal-hero', false)
->assertSee('Fotografia hero')
->assertDontSee('content/heroes/home.jpg', false); ->assertDontSee('content/heroes/home.jpg', false);
} }
} }

View File

@@ -36,7 +36,7 @@ class MotionMarkupTest extends TestCase
$response $response
->assertOk() ->assertOk()
->assertSee('data-motion="page-open"', false) ->assertSee('data-motion="page-open"', false)
->assertSee('data-motion-beat="seal"', false) ->assertSee('data-motion-beat="eyebrow"', false)
->assertSee('data-motion-beat="title"', false) ->assertSee('data-motion-beat="title"', false)
->assertSee('data-motion-beat="media"', false) ->assertSee('data-motion-beat="media"', false)
->assertSee('data-motion-beat="cta"', false) ->assertSee('data-motion-beat="cta"', false)