export interface LinkItem { label: string; href: string; external?: boolean; } export interface CallToAction { label: string; href: string; variant?: 'green' | 'yellow' | 'outline'; external?: boolean; } export interface SeoContent { title: string; description: string; } export interface MegaMenuService { icon: string; label: string; description?: string; href: string; } export interface NavigationContent { desktopLinks: LinkItem[]; mobileLinks: LinkItem[]; cta: CallToAction; instagram?: { href: string; external?: boolean }; megaMenuServices?: MegaMenuService[]; megaMenuFooter?: LinkItem; } export interface HeroChip { icon: string; label: string; } export interface HeroContent { title: string; highlight: string; mobileTitle?: string; kicker?: string; subtitle?: string; subtitleChips?: HeroChip[]; floatingPill?: string; primaryCta: CallToAction; secondaryCta: CallToAction; imageUrl: string; desktopImageUrl?: string; imageAlt: string; imageWidth?: number; imageHeight?: number; imageWebpUrl?: string; desktopImageWebpUrl?: string; seoHeading?: string; } export interface IntroContent { text: string; reviewCta: CallToAction; } export interface FounderStoryContent { title: string; subtitle: string; body: string[]; emphasis: string; cta: CallToAction; imageUrl: string; imageAlt: string; } export interface IconCard { icon: string; title: string; body: string; href?: string; order?: number; priceFrom?: string; } export interface TestimonialContent { quote: string; reviewer: string; detail: string; type: 'Google' | 'Client'; service?: string; showInSlider?: boolean; imageUrl?: string; } export interface ProcessStep { phase?: string; benefit?: string; title: string; body: string; icon?: string; } export interface HowItWorksContent { title: string; intro?: string; steps: ProcessStep[]; } export interface BookingContent { title: string; subtitle: string; generalSubtitle?: string; formAction: string; serviceOptions: string[]; ownerStepLabel?: string; dogStepLabel?: string; dogIntro?: string; generalIntro?: string; } export interface ServicePricingPlan { title: string; price: string; period: string; popular?: boolean; features: string[]; } export interface ServiceExtra { label: string; price: string; note?: string; } export interface ServiceBenefit { title: string; body: string; badge?: string; icon?: string; } export interface ServiceHighlightImage { imageUrl: string; imageAlt: string; } export interface ServiceHighlightPoint { title: string; body: string; } export interface ServiceDecisionBlock { title?: string; fitTitle?: string; fitItems: string[]; notFitTitle?: string; notFitItems: string[]; footnote?: string; } export interface ServiceTrait { icon: string; title: string; body: string; } export interface ServiceJoinStep { title: string; body: string; } export interface ServiceImageBand { imageUrl: string; imageAlt: string; caption: string; } export interface ServicePriceNote { icon: string; label: string; } export interface ServiceAreaStat { strong: string; label: string; } /** * v5 "clarity" content: the page-specific copy the shared ServiceClarityPage * needs so all three service pages run on one component. See docs/v5.md. */ /** * Optional "what it is" lede that opens a service page: a short, self-contained * definition of the service in Goodwalk's voice. Renders right after the hero. */ export interface ServiceDefinition { eyebrow?: string; heading: string; body: string; } export interface ServiceClarityContent { definition?: ServiceDefinition; diffEyebrow: string; diffHeading: string; traits: ServiceTrait[]; stepsEyebrow: string; stepsHeading: string; steps: ServiceJoinStep[]; imageBand?: ServiceImageBand; fitEyebrow?: string; pricingEyebrow?: string; pricingTagline?: string; priceNotes?: ServicePriceNote[]; faqEyebrow?: string; planLines?: Record; testimonialsHeading?: string; areaTitle?: string; areaLead?: string; areaStats?: ServiceAreaStat[]; } export interface ServicePageContent { hero: { eyebrow: string; title: string; subtitle?: string; paragraphs: string[]; introEyebrow?: string; introHeading?: string; detailHighlights?: { value: string; label: string; }[]; imageUrl: string; imageAlt: string; chips?: HeroChip[]; cta?: CallToAction; }; highlight?: { eyebrow: string; title: string; imageUrl: string; imageAlt: string; collageImages?: ServiceHighlightImage[]; points?: ServiceHighlightPoint[]; }; decision?: ServiceDecisionBlock; pricing: { title: string; intro?: string; plans: ServicePricingPlan[]; extras?: ServiceExtra[]; scarcityNote?: string; }; benefits: { title: string; intro?: string; items: ServiceBenefit[]; }; faq?: { title?: string; intro?: string; items: FaqItem[]; }; testimonialsHeading: string; booking: BookingContent; clarity?: ServiceClarityContent; lastUpdated?: string; } export interface PricingPageSectionMeta { label: string; value: string; } export interface PricingPageSection { title: string; icon?: string; blurb?: string; eyebrow?: string; lede?: string; outcome?: string; imageUrl?: string; imageAlt?: string; fit?: string[]; assurance?: string; meta?: PricingPageSectionMeta[]; detailCta?: CallToAction; plans: ServicePricingPlan[]; } export interface PricingPageComparison { title: string; intro?: string; paragraphs: string[]; } export interface PricingPageContent { title: string; eyebrow?: string; subtitle?: string; heroImageUrl: string; heroImageAlt: string; heroChips?: HeroChip[]; heroNote?: string; comparison?: PricingPageComparison; sections: PricingPageSection[]; testimonialsHeading: string; booking: BookingContent; } export interface AboutPageSection { title: string; eyebrow?: string; body: string[]; imageUrl: string; imageAlt: string; reverse?: boolean; accent?: 'plain' | 'gradient' | 'founder'; } export interface AboutPageContent { title: string; sections: AboutPageSection[]; servicesTitle?: string; faqTitle?: string; faqs?: FaqItem[]; contact: { title: string; email: string; phone: string; cta: CallToAction; }; } export interface LocationPark { name: string; description: string; leashNote?: string; image?: { src: string; alt: string; caption?: string; }; } export interface LocationSeoContent { title?: string; description?: string; image?: string; imageAlt?: string; serviceName?: string; serviceType?: string; breadcrumbLabel?: string; } export interface LocationPageContent { suburb: string; slug: string; intro: string; parks: LocationPark[]; seo?: LocationSeoContent; } export interface LegalPageBlock { type: 'paragraph' | 'list'; content: string | string[]; } export interface LegalPageSection { title: string; blocks: LegalPageBlock[]; } export interface LegalPageContent { title: string; sections: LegalPageSection[]; } export interface FaqItem { question: string; answer: string; } export interface InfoContent { title: string; intro: string; suburbs: string; nearbyText: string; nearbyCta: CallToAction; hoursLabel: string; hours: string; faqTitle: string; faqs: FaqItem[]; } export interface FooterContent { brandText: string; navigationLinks: LinkItem[]; contactLinks: LinkItem[]; copyright: string; email?: string; phone?: string; } export interface HomePageContent { seo: SeoContent; navigation: NavigationContent; hero: HeroContent; intro: IntroContent; founderStory: FounderStoryContent; services: IconCard[]; howItWorks: HowItWorksContent; values: IconCard[]; testimonials: TestimonialContent[]; booking: BookingContent; info: InfoContent; instagram: CallToAction & { title: string }; footer: FooterContent; } export interface SiteSharedContent { navigation: NavigationContent; services: IconCard[]; testimonials: TestimonialContent[]; booking: BookingContent; info: InfoContent; footer: FooterContent; }