Files
gw-svelte/src/lib/components/AboutPage.svelte
T

448 lines
11 KiB
Svelte
Raw Normal View History

2026-05-02 08:26:18 +12:00
<script lang="ts">
import { accordion } from '$lib/actions/accordion';
2026-05-02 08:26:18 +12:00
import { reveal } from '$lib/actions/reveal';
2026-05-13 20:44:01 +12:00
import CtaCard from '$lib/components/CtaCard.svelte';
2026-05-13 00:34:34 +12:00
import PageHeader from '$lib/components/PageHeader.svelte';
import { getEnhancedImage } from '$lib/enhanced-images';
import type { AboutPageContent } from '$lib/types';
2026-05-02 08:26:18 +12:00
export let pageContent: AboutPageContent;
$: standardSections = pageContent.sections.filter((s) => s.accent !== 'founder');
$: founderSection = pageContent.sections.find((s) => s.accent === 'founder') ?? null;
const founderHeadingLead = 'Meet Aless,';
const founderHeadingHighlight = 'the heart of Goodwalk';
2026-05-02 08:26:18 +12:00
</script>
<main class="about-page">
<!-- ── Hero ── -->
2026-05-13 00:34:34 +12:00
<PageHeader
variant="green"
eyebrow="About Goodwalk"
title={pageContent.title}
subtitle="Small dog specialists serving Auckland Central. A team your dog knows by name."
>
<div class="ph-chips">
<a
href="https://g.page/r/CUsvrWPhkYrAEB0/"
target="_blank"
rel="noopener"
class="ph-chip ph-chip--link"
>
<span class="about-chip-stars" aria-hidden="true">★★★★★</span>
30+ five-star Google reviews
</a>
<span class="ph-chip">Auckland Central</span>
<span class="ph-chip">Small dog specialists</span>
2026-05-02 08:26:18 +12:00
</div>
2026-05-13 00:34:34 +12:00
</PageHeader>
2026-05-02 08:26:18 +12:00
<!-- ── Standard sections (Who we are, Our impact) ── -->
{#each standardSections as section}
{@const enhanced = getEnhancedImage(section.imageUrl)}
<section
use:reveal
class="about-section reveal-block"
class:about-section-gradient={section.accent === 'gradient'}
>
2026-05-13 20:44:01 +12:00
<div class="page-inner about-section-grid" class:about-section-reverse={section.reverse}>
<div class="about-copy">
{#if section.eyebrow}
<span class="about-eyebrow">{section.eyebrow}</span>
{/if}
<h2>{section.title}</h2>
{#each section.body as paragraph}
<p>{paragraph}</p>
{/each}
2026-05-02 08:26:18 +12:00
</div>
<div class="about-media">
{#if enhanced}
<enhanced:img src={enhanced} alt={section.imageAlt} loading="lazy" decoding="async" />
{:else}
<img src={section.imageUrl} alt={section.imageAlt} loading="lazy" decoding="async" />
{/if}
2026-05-02 08:26:18 +12:00
</div>
</div>
</section>
{/each}
<!-- ── Founder section ── -->
{#if founderSection}
{@const founderEnhanced = getEnhancedImage(founderSection.imageUrl)}
<section use:reveal={{ delay: 50 }} class="about-founder reveal-block">
2026-05-13 20:44:01 +12:00
<div class="page-inner about-founder-grid">
<div class="about-founder-media">
{#if founderEnhanced}
<enhanced:img
src={founderEnhanced}
alt={founderSection.imageAlt}
loading="lazy"
decoding="async"
/>
{:else}
<img
src={founderSection.imageUrl}
alt={founderSection.imageAlt}
loading="lazy"
decoding="async"
/>
{/if}
</div>
<div class="about-founder-copy">
{#if founderSection.eyebrow}
<span class="about-eyebrow">{founderSection.eyebrow}</span>
{/if}
<h2 class="about-founder-heading">
<span class="about-founder-heading-desktop">
<span class="about-founder-title-main">{founderHeadingLead}</span>
<br />
<span class="about-founder-title-highlight">{founderHeadingHighlight}</span>
</span>
<span class="about-founder-heading-mobile">
<span class="about-founder-title-main">{founderHeadingLead}</span>
<span class="about-founder-title-highlight">{founderHeadingHighlight}</span>
</span>
</h2>
{#each founderSection.body as paragraph}
<p>{paragraph}</p>
{/each}
<a href="/contact-us" class="btn btn-green btn-mobile-center">Book a free Meet &amp; Greet</a>
</div>
</div>
</section>
{/if}
<!-- ── FAQs ── -->
{#if pageContent.faqs && pageContent.faqs.length}
<section use:reveal={{ delay: 30 }} class="about-faq reveal-block">
2026-05-13 20:44:01 +12:00
<div class="page-inner">
<div class="about-faq-header">
<span class="about-eyebrow">FAQ</span>
<h2>{pageContent.faqTitle ?? 'Common questions'}</h2>
</div>
<div use:accordion class="faq about-faq-list">
{#each pageContent.faqs as item}
<details>
<summary>{item.question}</summary>
<p>{item.answer}</p>
</details>
{/each}
</div>
</div>
</section>
{/if}
2026-05-02 08:26:18 +12:00
<!-- ── Contact CTA ── -->
<section use:reveal={{ delay: 50 }} class="about-contact reveal-block">
2026-05-13 20:44:01 +12:00
<div class="page-inner">
<CtaCard
title={pageContent.contact.title}
description="Questions, pricing, or your first Meet &amp; Greet start here and we'll reply within 24 hours."
ctaHref={pageContent.contact.cta.href}
ctaLabel={pageContent.contact.cta.label}
email={pageContent.contact.email}
phone={pageContent.contact.phone}
showIcons={true}
/>
2026-05-02 08:26:18 +12:00
</div>
</section>
2026-05-02 08:26:18 +12:00
</main>
<style>
.about-page {
background: var(--off-white);
2026-05-02 08:26:18 +12:00
}
2026-05-13 20:44:01 +12:00
/* ── Eyebrow ── */
.about-eyebrow {
display: inline-block;
margin-bottom: 14px;
padding: 7px 12px;
border-radius: 999px;
2026-05-13 20:44:01 +12:00
background: rgba(33, 48, 33, 0.08);
color: var(--gw-green);
box-shadow: inset 0 0 0 1px rgba(17, 20, 24, 0.05);
font-size: 12px;
font-weight: 800;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.about-chip-stars {
color: var(--yellow);
letter-spacing: 1px;
font-size: 13px;
}
/* ── Standard sections ── */
.about-section {
padding: 88px 0;
2026-05-02 08:26:18 +12:00
}
.about-section-gradient {
background: linear-gradient(180deg, #f5efe6 0%, #f9f6ef 100%);
2026-05-06 23:55:31 +12:00
}
.about-section-grid {
2026-05-02 08:26:18 +12:00
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
gap: 60px;
2026-05-02 08:26:18 +12:00
align-items: center;
}
.about-section-reverse .about-copy {
2026-05-02 08:26:18 +12:00
order: 2;
}
.about-section-reverse .about-media {
2026-05-02 08:26:18 +12:00
order: 1;
}
.about-copy h2 {
margin: 0 0 16px;
font-family: var(--font-head);
font-size: clamp(28px, 3vw, 40px);
font-weight: 800;
line-height: 1.08;
letter-spacing: -0.03em;
color: #0d1a0d;
2026-05-02 08:26:18 +12:00
}
.about-copy p {
margin: 12px 0 0;
2026-05-02 08:26:18 +12:00
color: #34363a;
font-size: 17px;
line-height: 1.75;
2026-05-02 08:26:18 +12:00
}
.about-media {
aspect-ratio: 4 / 3;
overflow: hidden;
border-radius: 28px;
box-shadow: 0 16px 48px rgba(17, 20, 24, 0.1);
}
.about-media img {
2026-05-02 08:26:18 +12:00
display: block;
width: 100%;
height: 100%;
object-fit: cover;
object-position: center top;
}
/* ── Founder section ── */
.about-founder {
padding: 88px 0;
background: #fff;
}
.about-founder-grid {
display: grid;
grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
gap: 64px;
align-items: center;
}
.about-founder-media img {
display: block;
width: 100%;
max-width: 400px;
height: auto;
border-radius: 28px;
2026-05-02 08:26:18 +12:00
object-fit: cover;
box-shadow: 0 24px 56px rgba(17, 20, 24, 0.12);
margin: 0 auto;
2026-05-02 08:26:18 +12:00
}
.about-founder-copy h2 {
margin: 0 0 16px;
font-family: var(--font-head);
font-size: clamp(30px, 3.5vw, 44px);
font-weight: 800;
line-height: 1.06;
letter-spacing: -0.03em;
text-wrap: balance;
color: #0d1a0d;
2026-05-02 08:26:18 +12:00
}
.about-founder-heading-desktop {
display: block;
}
.about-founder-heading-mobile {
display: none;
}
.about-founder-heading-mobile .about-founder-title-main,
.about-founder-heading-mobile .about-founder-title-highlight {
display: block;
2026-05-02 08:26:18 +12:00
}
.about-founder-title-main {
color: #0d1a0d;
}
.about-founder-title-highlight {
position: relative;
display: inline-block;
color: #0d1a0d;
}
.about-founder-title-highlight::after {
content: '';
position: absolute;
left: 0;
right: -6px;
bottom: -16px;
height: 24px;
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 34' fill='none'%3E%3Cpath d='M4 24C67 10 131 4 198 5c43 1 82 6 118 18' stroke='%23192419' stroke-width='8' stroke-linecap='round'/%3E%3C/svg%3E")
center/contain no-repeat;
transform-origin: left center;
animation: about-founder-underline-draw 0.9s cubic-bezier(0.22, 1, 0.36, 1) 0.2s both;
}
@keyframes about-founder-underline-draw {
0% {
opacity: 0;
transform: scaleX(0.2) translateY(6px) rotate(-1.5deg);
}
65% {
opacity: 1;
transform: scaleX(1.04) translateY(0) rotate(0deg);
}
100% {
opacity: 1;
transform: scaleX(1) translateY(0) rotate(0deg);
}
}
.about-founder-copy p {
margin: 14px 0 0;
color: #34363a;
font-size: 17px;
line-height: 1.75;
}
.about-founder-copy .btn {
display: flex;
width: fit-content;
margin: 28px auto 0;
}
/* ── FAQs ── */
.about-faq {
padding: 80px 0;
background: var(--off-white);
}
.about-faq-header {
text-align: center;
margin-bottom: 40px;
}
.about-faq-header h2 {
margin: 0;
font-family: var(--font-head);
font-size: clamp(28px, 3vw, 40px);
font-weight: 800;
line-height: 1.08;
letter-spacing: -0.03em;
color: #0d1a0d;
}
.about-faq-list {
max-width: 720px;
margin: 0 auto;
display: flex;
flex-direction: column;
gap: 10px;
}
/* ── Contact CTA ── */
2026-05-02 08:26:18 +12:00
.about-contact {
padding: 0 0 88px;
}
/* ── Tablet ── */
2026-05-02 08:26:18 +12:00
@media (max-width: 1024px) {
.about-section-grid,
.about-founder-grid {
2026-05-02 08:26:18 +12:00
grid-template-columns: 1fr;
gap: 36px;
2026-05-02 08:26:18 +12:00
}
.about-section-reverse .about-copy,
.about-section-reverse .about-media {
order: initial;
2026-05-06 23:55:31 +12:00
}
.about-founder-media img {
max-width: 420px;
2026-05-02 08:26:18 +12:00
}
}
/* ── Mobile ── */
2026-05-02 08:26:18 +12:00
@media (max-width: 768px) {
.about-section {
padding: 60px 0;
2026-05-06 23:55:31 +12:00
}
.about-section-grid {
gap: 28px;
2026-05-06 23:55:31 +12:00
}
.about-copy h2 {
font-size: 28px;
2026-05-06 23:55:31 +12:00
}
.about-copy p {
2026-05-02 08:26:18 +12:00
font-size: 16px;
line-height: 1.7;
}
.about-founder {
padding: 60px 0;
}
.about-founder-grid {
gap: 28px;
}
.about-founder-copy h2 {
font-size: 26px;
line-height: 1.02;
}
.about-founder-heading-desktop {
display: none;
}
.about-founder-heading-mobile {
display: block;
}
.about-founder-copy p {
font-size: 16px;
line-height: 1.7;
}
.about-faq {
padding: 60px 0;
}
.about-contact {
padding-bottom: 60px;
}
}
2026-05-02 08:26:18 +12:00
@media (prefers-reduced-motion: reduce) {
.about-founder-title-highlight::after {
animation: none;
2026-05-02 08:26:18 +12:00
}
}
</style>