Commit Graph

40 Commits

Author SHA1 Message Date
admin 6c943b14bd Design language 2026-05-13 00:34:34 +12:00
admin ac6179e776 SEO Tweaks 2026-05-12 00:45:02 +12:00
admin 955a563d14 Onboarding / Deployment Scripts / Marketing updates 2026-05-11 21:02:24 +12:00
admin a90dfb7c66 Content Rewrite 2026-05-07 21:47:42 +12:00
admin 0d86f450ec Revert "Merge branch 'main' of http://10.0.0.213:3001/admin/gw-svelte"
This reverts commit 4d70993817, reversing
changes made to 32ccd49d78.
2026-05-07 08:04:13 +12:00
admin 4d70993817 Merge branch 'main' of http://10.0.0.213:3001/admin/gw-svelte 2026-05-07 07:57:56 +12:00
admin 32ccd49d78 Remove CTA button from mobile 2026-05-07 07:57:52 +12:00
admin 7edd4c7f9d AboutUs rewrite 2026-05-06 23:55:31 +12:00
admin ad9df7578a 4.2.3 - CTA footer, How it works 2026-05-06 17:42:43 +12:00
admin 6d021e05ea Testimonials fixes 2026-05-06 16:47:15 +12:00
admin 2f4001b8af 4.2.2 - tracking across email, fixes to dark mode. 2026-05-06 15:50:01 +12:00
admin a7ce4c74b5 4.2.1 final fixes 2026-05-06 11:36:19 +12:00
admin b8b9d12a82 4.2.1 polish 2026-05-06 08:27:24 +12:00
admin 55217f59bd Merge branch 'ui-consistency'
Visual consistency pass: unified H1 token, shared .eyebrow utility,
card border-radius standardised to 28px, card hover transforms
unified to translateY(-6px) scale(1.012).
2026-05-06 07:25:09 +12:00
admin 251ec5737f Footer change 2026-05-05 22:48:18 +12:00
admin 71cdc809c6 Commit 2026-05-05 22:47:14 +12:00
admin a665368d02 UI: unify H1 size, eyebrow style, card radius and hover transform
Visual consistency pass so every page feels familiar.

H1 token (clamp(34px, 4vw, 56px) / line-height 1.05 / letter-spacing
-0.04em):
- typography.css: hero H1 was 50.2px fixed (with 40px/38px breakpoints).
- BookingPage: was clamp(32px, 4vw, 52px).
Service-, About-, Pricing-, Legal-page H1s already matched.

Shared .eyebrow utility (typography.css):
- 13px, green, uppercase, 700, 0.08em letter-spacing.
- Replaces the bespoke .service-eyebrow (14px) and .instagram-kicker
  (11px green pill).
- The yellow 28px .service-highlight-eyebrow now inherits the same
  utility — the eyebrow line is no longer competing with the H2
  underneath. Local rule kept only for the bottom-margin override.

Card border-radius unified to 28px:
- sections.css .service-card: 20px → 28px
- sections.css .value-card: 16px → 28px
- sections.css .testimonial-card: 20px → 28px
- TestimonialsSection .testimonial-stage: 24px → 28px
- AboutPage .about-section-gradient + .about-contact-card: 36px → 28px
- LegalPage .legal-card: 32px → 28px (mobile 24px → 28px)
- InstagramSection .instagram-panel: 24px → 28px
- PricingPage .meet-greet-prompt: 24px → 28px (mobile 20px → 28px)
Modal dialogs left at 24px (different visual class — overlay, not
inline content card).

Card hover transform unified to translateY(-6px) scale(1.012):
- sections.css .service-card: -6px / 1.01 → 1.012
- sections.css .value-card: -5px (no scale) → -6px / 1.012
- sections.css .testimonial-card: -4px (no scale) → -6px / 1.012
- ServiceLandingPage .service-plan-card / .service-benefit-card:
  -8px → -6px
- PricingPage .pricing-plan-card: -8px → -6px
- ServiceLandingPage .service-related-card already -6px / 1.012.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 21:23:41 +12:00
admin 0eed557f95 4.2.0 — deploy hardening and visual consistency pass
Make the production deploy foolproof against the shared nginx container's read-only bind mounts on the Digital Ocean droplet. The previous maintenance flow tried to docker-cp/docker-exec into /var/www/html and /etc/nginx/conf.d, both of which are mounted :ro on prod, and /var/www/html happens to point at the WordPress html dir — so writes either failed silently or risked scribbling into another site's tree. Maintenance assets and the engagement flag are now written directly to host paths (/docker/nginx/maintenance and /docker/nginx/conf.d/maintenance.flag) that nginx already sees through its existing bind mounts, so the script no longer depends on a writable container layer, survives container rebuilds, and works regardless of read_only settings. A pre-flight check verifies the maintenance bind mount is actually present on the nginx container and fails fast with a clear "run the one-time setup" message if it isn't, instead of silently serving stale content. The nginx config now serves maintenance.html and /m/ from a dedicated /var/www/maintenance root rather than sharing the WordPress html dir.

On the front end, hero images on Pack Walks, 1:1 Walks and Puppy Visits were rendering at whatever aspect ratio their source files happened to have, so one page felt tall, another wide, another oversized. They are now locked to a 4:3 frame with object-fit: cover, matching the About Us section images, which were given the same treatment. The About Us body grid was also alternating between 0.7fr/1.3fr and 1.3fr/0.7fr columns depending on whether a section was reversed, which made the copy width jump between sections; both layouts are now an even 50/50 split, with the existing order swap still handling the image-left vs image-right alternation.

The reveal-on-scroll action used to require 18% of an element to intersect before fading it in, with an additional -8% bottom margin, which meant the section directly below a service-page hero stayed invisible on initial load until the user scrolled — making the page look blank below the hero on navigation. The action now does a synchronous bounding-rect check on mount and reveals anything already in the viewport immediately, falling back to the IntersectionObserver for everything below the fold.

The "Explore our services" block on About Us was a bespoke icon-tile grid that did not match the homepage's "What we do" cards; it now reuses the shared ServicesSection component (with the heading exposed as a prop), so both pages produce identical card layout, descriptions, "from $" prices, and Learn more CTAs. The footer Explore column was missing the About Us link — added between Our Pricing and Contact Us so it propagates through the homepage content sync into PostgreSQL on the next deploy.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 20:54:56 +12:00
admin e2c5f38d55 Merge branch 'maintenance-page'
Adds dynamic maintenance page served by nginx during deploys, toggled
via a flag file by scripts/deploy-remote.sh. Includes brand-styled
maintenance.html with Goodwalk logo and contact fallback, plus an
env-template merger and a11y polish.
2026-05-05 14:10:51 +12:00
admin 8df0e2dfe9 Merge branch 'seo-fixes'
SEO improvements: AggregateOffer on Service schema, AggregateRating
+ Review on home, tighter Puppy Visits meta, removed dead /about-us
duplicate.
2026-05-05 14:10:43 +12:00
admin c2e6282efa Wire maintenance page into deploy script as a dynamic toggle
Replaces the earlier auto-fallback-on-upstream-error approach with an
explicit flag-file toggle controlled by the deploy script. The flag
is touched before stopping the app and removed on successful finish
(or via trap if the deploy aborts), so a failed deploy doesn't strand
the site in maintenance.

- nginx/goodwalk.co.nz.svelte.conf.example: error_page 503 routes to
  /maintenance.html (internal); /m/ serves static maintenance assets;
  the / and /api/submit blocks return 503 when /etc/nginx/conf.d/
  maintenance.flag exists.
- nginx/maintenance.html: brand-styled "Be right back" page — full
  Goodwalk green background, white card with yellow accent, real
  Goodwalk logo, contact details fallback, auto-reload after 60s.
- nginx/logo.png: maintenance-time logo (served from /m/logo.png).
- nginx/nginx.conf: reverted the earlier auto-fallback edits; this
  file is not deployed (the prod conf is goodwalk.co.nz.svelte.conf
  .example).
- scripts/deploy-remote.sh: copies maintenance.html + logo into the
  nginx container, reloads nginx so the new conf is live, touches
  the flag, then runs the rebuild, then clears the flag. Adds a
  trap-based clear_maintenance_flag fallback. Also adds a defensive
  env-file merger that appends new keys from deploy.env.template
  without clobbering live values, with a timestamped .env backup.

Plus a small a11y polish unrelated to maintenance:
- ServicesSection: "Learn more" links now include screen-reader-only
  "about <Service>" context.
- base.css: adds .visually-hidden utility class.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 14:10:16 +12:00
admin c95d2e8c25 SEO: pricing-rich service schema, AggregateRating, tighter meta
- Service pages now include AggregateOffer in JSON-LD (priceCurrency
  NZD, lowPrice/highPrice/offerCount derived from each service's
  pricing.plans). Unlocks price-rich SERP results.
- Homepage LocalBusiness schema now includes AggregateRating and
  per-testimonial Review entries (5 stars, n reviews). Eligible for
  star ratings in SERPs.
- Puppy Visits meta description rewritten — was 241 chars opening
  with "Puppy Visits Introducing Puppy Visits..." Now a tight 144
  chars with Auckland keyword.
- Removed the dead /about-us static-pages entry; the 301 redirect
  in [slug]/+page.server.ts already routes it to /about, so the
  duplicate metadata was unreachable. Pruned matching dead branches
  in [slug]/+page.svelte and RouteSkeleton.svelte for clarity.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 14:06:31 +12:00
admin 9d87d08547 Add maintenance page served by nginx during deploys
When the SvelteKit upstream is unreachable (container restart, deploy)
nginx now serves a static, brand-styled "Be right back" page instead
of the default 502/503. Auto-reloads after 60s so visitors don't sit
on it once the app is back.

- nginx/maintenance.html: self-contained, no external assets, inline
  paw SVG, brand colours, contact details fallback
- nginx/nginx.conf: proxy_intercept_errors + error_page 502/503/504
  on both location blocks; 2s proxy_connect_timeout so nginx fails
  over fast instead of holding the connection for 60s

Deploy note: the html file needs to live at /var/www/html/maintenance.html
inside the nginx container (already mounted from /docker/wordpress/goodwalk.co.nz/html).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 08:45:48 +12:00
admin 65bdc8dc20 - Add "Explore our other services" block to service landing pages
with colour-tinted cards + Our Pricing entry (grey "All services" pill)
- Wrap homepage Instagram CTA in <aside aria-label="...">
- Always emit og:image:width/height with 1200x630 fallback when
  image metadata is unknown
- Add aria-current="page" to active desktop, mega-menu, and mobile
  nav links (exact-path match only — not "Services" parent)
- Richer testimonial alt text derived from dog name in the detail
  field (e.g. "Archie, a happy Goodwalk dog walking client...")
- Tier sitemap.xml priorities: home 1.0, services 0.9, pricing 0.8,
  about/contact 0.7, legal 0.3 (yearly changefreq)
- Bump to 4.1.0
2026-05-05 08:12:36 +12:00
admin 04bca98ef8 instagram cta changes, mail fixes 2026-05-04 23:47:26 +12:00
admin d115a8db7c Homestays 301 fix 2026-05-04 20:36:10 +12:00
admin fa1bc1a615 General enquries feature 2026-05-04 20:32:24 +12:00
admin bf9331bb5b Add skeleton, updates to client email formatting 2026-05-04 16:30:05 +12:00
admin d1dd103a6e Ultrawide tweaks 2026-05-03 15:56:04 +12:00
admin 6cd50965e5 SEO tweaks, design tweaks 2026-05-03 11:49:59 +12:00
admin f27e0fed07 Testimonails and Introscript updates 2026-05-03 11:16:53 +12:00
admin 751c2d7e98 Minor improvements to owner mail template 2026-05-02 20:33:28 +12:00
admin 07c754da12 4.0.1 - fixes 2026-05-02 19:44:45 +12:00
admin b0bb692972 Deployment script updates 2026-05-02 12:39:55 +12:00
admin 3587ba7f26 Add honeypot, spam protection to contact form 2026-05-02 11:24:11 +12:00
admin cd8d581f7a Meet & Greet nudge 2026-05-02 09:43:32 +12:00
admin 8f31a3fea4 mail api improvements 2026-05-02 09:08:31 +12:00
admin 629f530099 add GA 2026-05-02 08:59:49 +12:00
admin 5f6b47d445 Cleanup pricing page tables, introstrip, css changes 2026-05-02 08:53:36 +12:00
ponzischeme89 b7ea05f150 Initial commit 2026-05-02 08:26:18 +12:00