diff --git a/docker/postgres/init/001-site-content.sql b/docker/postgres/init/001-site-content.sql index 755225f..526314f 100644 --- a/docker/postgres/init/001-site-content.sql +++ b/docker/postgres/init/001-site-content.sql @@ -34,7 +34,7 @@ values ( "highlight": "Your Dog''s Day!", "mobileTitle": "Unleashing Fun in\nYour Dog''s Day!", "primaryCta": { "label": "Learn more", "href": "#services", "variant": "yellow" }, - "secondaryCta": { "label": "Enroll today", "href": "#reservation", "variant": "outline" }, + "secondaryCta": { "label": "Enroll today", "href": "#newlead", "variant": "outline" }, "imageUrl": "/images/auckland-dog-walking-happy-dog-hero.png", "imageAlt": "Happy dog on a walk with Goodwalk" }, @@ -51,7 +51,7 @@ values ( "subtitle": "happy humans", "body": "Offering tailored pack walks for small and medium dogs, and one-on-one walks for large breeds. Our walkers give personalised attention to each dog, easing stress, anxiety and ensuring a quality experience. Our expertise in small-medium breeds ensures tailored care for their unique needs. Join our", "emphasis": "TINY GANG!", - "cta": { "label": "Book now", "href": "#reservation", "variant": "green" }, + "cta": { "label": "Book now", "href": "#newlead", "variant": "green" }, "imageUrl": "/images/auckland-dog-walking-happy-dogs-happy-humans.png", "imageAlt": "Woman cuddling a dog for Goodwalk Auckland dog walking services" }, @@ -144,7 +144,7 @@ values ( "intro": "We cover most of Auckland Central''s suburbs:", "suburbs": "Morningside, Kingsland, Ponsonby, Grey Lynn, Mt Albert, Mt Eden, Sandringham, Mt Roskill, Arch Hill, Freemans Bay, Herne Bay, Pt Chevalier, Avondale, Three Kings, Hillsborough, Eden Terrace, Balmoral.", "nearbyText": "Live in a nearby suburb?", - "nearbyCta": { "label": "Get in touch!", "href": "#reservation" }, + "nearbyCta": { "label": "Get in touch!", "href": "#newlead" }, "hoursLabel": "Opening Hours", "hours": "Monday to Friday, 8am - 4pm.", "faqTitle": "FAQ''s", diff --git a/src/lib/components/BookingSection.svelte b/src/lib/components/BookingSection.svelte index 733aa39..62d7eaf 100644 --- a/src/lib/components/BookingSection.svelte +++ b/src/lib/components/BookingSection.svelte @@ -1,6 +1,7 @@ -
+
{#if submitted} @@ -148,6 +182,14 @@ /> {/if} + {#if showErrorModal} + (showErrorModal = false)} + onRetry={() => (showErrorModal = false)} + /> + {/if} +

{headingParts.plain}{' '}{headingParts.highlight} @@ -228,6 +270,11 @@ placeholder="Email" class:input-invalid={errors.email} on:input={() => clearError('email')} + on:blur={() => { + if (!email.trim()) return; + const msg = validateEmail(email); + errors = { ...errors, email: msg }; + }} /> {#if errors.email}

@@ -377,13 +424,6 @@ {#if submitting}Sending…{:else}Send {/if}

- - {#if submitError} -

- - {submitError} -

- {/if} {/if}
@@ -403,13 +443,4 @@ opacity: 1; transform: translate3d(0, 0, 0); } - - .booking-submit-error { - margin: 16px 0 0; - display: flex; - align-items: center; - gap: 8px; - color: #c0392b; - font-size: 14px; - } diff --git a/src/lib/components/ErrorModal.svelte b/src/lib/components/ErrorModal.svelte new file mode 100644 index 0000000..b837c62 --- /dev/null +++ b/src/lib/components/ErrorModal.svelte @@ -0,0 +1,287 @@ + + + + + diff --git a/src/lib/components/PricingPage.svelte b/src/lib/components/PricingPage.svelte index 72fa42a..03d5de9 100644 --- a/src/lib/components/PricingPage.svelte +++ b/src/lib/components/PricingPage.svelte @@ -1,4 +1,5 @@
@@ -59,7 +161,7 @@ {/each} - Book Now + Book Now {/each} @@ -69,6 +171,26 @@ + + {#if showMeetGreetPrompt} + + {/if}
diff --git a/src/lib/components/ServiceLandingPage.svelte b/src/lib/components/ServiceLandingPage.svelte index 03dbdae..f90cc98 100644 --- a/src/lib/components/ServiceLandingPage.svelte +++ b/src/lib/components/ServiceLandingPage.svelte @@ -78,7 +78,7 @@ {/each} - Book Now + Book Now {/each} diff --git a/src/lib/components/TestimonialsSection.svelte b/src/lib/components/TestimonialsSection.svelte index c131e3f..8052261 100644 --- a/src/lib/components/TestimonialsSection.svelte +++ b/src/lib/components/TestimonialsSection.svelte @@ -7,7 +7,7 @@ export let testimonials: TestimonialContent[]; export let heading = 'Why people choose us!'; export let blurb = - 'Real dogs, real routines, real happy humans. Follow along on Instagram to see the Tiny Gang out on their daily adventures.'; + 'Real dogs, real routines, trusted by happy owners. Follow along on Instagram to see the Tiny Gang out on their daily adventures.'; export let instagramHref = 'https://www.instagram.com/goodwalk.nz/'; export let instagramLabel = '@goodwalk.nz'; diff --git a/src/lib/components/ValuesSection.svelte b/src/lib/components/ValuesSection.svelte index 328288a..5f74d18 100644 --- a/src/lib/components/ValuesSection.svelte +++ b/src/lib/components/ValuesSection.svelte @@ -3,6 +3,20 @@ import type { IconCard } from '$lib/types'; export let values: IconCard[]; + + $: orderedValues = values + .map((value, index) => ({ value, index })) + .sort((a, b) => { + const aOrder = a.value.order ?? Number.POSITIVE_INFINITY; + const bOrder = b.value.order ?? Number.POSITIVE_INFINITY; + + if (aOrder !== bOrder) { + return aOrder - bOrder; + } + + return a.index - b.index; + }) + .map(({ value }) => value);
@@ -10,7 +24,7 @@

Where dogs come first

- {#each values as value} + {#each orderedValues as value}

{value.title}

diff --git a/src/lib/content/homepage.ts b/src/lib/content/homepage.ts index 40601a4..4444ee0 100644 --- a/src/lib/content/homepage.ts +++ b/src/lib/content/homepage.ts @@ -34,7 +34,7 @@ export const homepageContent: HomePageContent = { highlight: "Your Dog's Day!", mobileTitle: "Unleashing Fun in\nYour Dog's Day!", primaryCta: { label: 'Learn more', href: '#services', variant: 'yellow' }, - secondaryCta: { label: 'Enroll today', href: '#reservation', variant: 'outline' }, + secondaryCta: { label: 'Enroll today', href: '#newlead', variant: 'outline' }, imageUrl: '/images/auckland-dog-walking-happy-dog-hero.png', imageAlt: 'Happy dog ready for a professional pack walk with Goodwalk Auckland dog walking service' }, @@ -52,7 +52,7 @@ export const homepageContent: HomePageContent = { body: 'Offering tailored pack walks for small and medium dogs, and one-on-one walks for large breeds. Our walkers give personalised attention to each dog, easing stress, anxiety and ensuring a quality experience. Our expertise in small-medium breeds ensures tailored care for their unique needs. Join our', emphasis: 'TINY GANG!', - cta: { label: 'Book now', href: '#reservation', variant: 'green' }, + cta: { label: 'Book now', href: '#newlead', variant: 'green' }, imageUrl: '/images/auckland-dog-walking-happy-dogs-happy-humans.png', imageAlt: 'Woman cuddling a dog for Goodwalk Auckland dog walking services' }, @@ -92,12 +92,14 @@ export const homepageContent: HomePageContent = { { icon: 'fas fa-users', title: 'Small Pack Sizes', + order: 2, body: 'With just 4-8 dogs per group, our walks are calm, controlled, and respectful of public spaces - ensuring every dog gets the attention and care they deserve.' }, { icon: 'fas fa-shield-heart', title: 'Safety', + order: 1, body: 'Our team is fully pet first aid certified and trained to handle any situation calmly and confidently. With proactive safety protocols and constant situational awareness, we create a secure environment for every walk.' }, @@ -157,7 +159,7 @@ export const homepageContent: HomePageContent = { suburbs: 'Morningside, Kingsland, Ponsonby, Grey Lynn, Mt Albert, Mt Eden, Sandringham, Mt Roskill, Arch Hill, Freemans Bay, Herne Bay, Pt Chevalier, Avondale, Three Kings, Hillsborough, Eden Terrace, Balmoral.', nearbyText: 'Live in a nearby suburb?', - nearbyCta: { label: 'Get in touch!', href: '#reservation' }, + nearbyCta: { label: 'Get in touch!', href: '#newlead' }, hoursLabel: 'Opening Hours', hours: 'Monday to Friday, 8am - 4pm.', faqTitle: "FAQ's", @@ -189,7 +191,7 @@ export const homepageContent: HomePageContent = { ] }, instagram: { - title: 'Follow us on Instagram', + title: 'Follow the Tiny Gang adventures on Instagram!', label: '@goodwalk.nz', href: 'https://www.instagram.com/goodwalk.nz/', variant: 'green', diff --git a/src/lib/styles/sections.css b/src/lib/styles/sections.css index ae2ffd2..24d5a13 100644 --- a/src/lib/styles/sections.css +++ b/src/lib/styles/sections.css @@ -56,7 +56,6 @@ section { gap: 18px; align-items: center; width: 100%; - max-width: 960px; margin: 0; padding: 18px 22px; border-radius: 26px; @@ -134,7 +133,7 @@ section { } #services, -#reservation { +#newlead { background: #fff; } diff --git a/src/lib/types.ts b/src/lib/types.ts index 43a3e78..ca8f48f 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -61,6 +61,7 @@ export interface IconCard { title: string; body: string; href?: string; + order?: number; } export interface TestimonialContent { diff --git a/src/routes/+error.svelte b/src/routes/+error.svelte new file mode 100644 index 0000000..5b9b1a2 --- /dev/null +++ b/src/routes/+error.svelte @@ -0,0 +1,213 @@ + + + + {status} · GoodWalk + + + +
+ + +
+
{status}
+

{heading}

+

{subtitle}

+ {#if errorMessage && errorMessage !== heading} +

{errorMessage}

+ {/if} + + +
+
+ +