Files
gw-svelte/src/lib/types.ts
T
2026-05-07 21:47:42 +12:00

259 lines
4.7 KiB
TypeScript

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 HeroContent {
title: string;
highlight: string;
mobileTitle?: string;
subtitle?: string;
primaryCta: CallToAction;
secondaryCta: CallToAction;
imageUrl: string;
imageAlt: string;
}
export interface IntroContent {
text: string;
reviewCta: CallToAction;
}
export interface PromiseContent {
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;
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;
}
export interface ServiceHighlightImage {
imageUrl: string;
imageAlt: string;
}
export interface ServicePageContent {
hero: {
eyebrow: string;
title: string;
paragraphs: string[];
imageUrl: string;
imageAlt: string;
};
highlight?: {
eyebrow: string;
title: string;
imageUrl: string;
imageAlt: string;
collageImages?: ServiceHighlightImage[];
};
pricing: {
title: string;
intro?: string;
plans: ServicePricingPlan[];
extras?: ServiceExtra[];
scarcityNote?: string;
};
benefits: {
title: string;
items: ServiceBenefit[];
};
testimonialsHeading: string;
booking: BookingContent;
}
export interface PricingPageSection {
title: string;
icon?: string;
blurb?: string;
detailCta?: CallToAction;
plans: ServicePricingPlan[];
}
export interface PricingPageContent {
title: string;
subtitle?: string;
sections: PricingPageSection[];
testimonialsHeading: string;
booking: BookingContent;
}
export interface AboutPageSection {
title: string;
body: string[];
imageUrl: string;
imageAlt: string;
reverse?: boolean;
accent?: 'plain' | 'gradient';
}
export interface AboutPageContent {
title: string;
sections: AboutPageSection[];
servicesTitle: string;
contact: {
title: string;
email: string;
phone: string;
cta: CallToAction;
};
}
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;
promise: PromiseContent;
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;
}