diff --git a/README.md b/README.md index a3a639e..cf84838 100644 --- a/README.md +++ b/README.md @@ -23,8 +23,9 @@ If you are evaluating an agency, this is the format you actually want: real URLs | Client | Industry | Live site | Framework | Hosting region | Delivery | |---|---|---|---|---|---| | [Perfect Prep](sites/perfect-prep.md) | Halal meal prep & catering (Yorkshire & Teesside) | [getperfectprep.com](https://getperfectprep.com) | Astro (static) | London (`lhr1`) | Cloudflare in front of Vercel | +| [Hydra Restore](sites/hydra-restore.md) | Exterior cleaning (Leeds & West Yorkshire) | [www.hydrarestore.co.uk](https://www.hydrarestore.co.uk) | Astro (static) | Vercel | Vercel edge network | -> This is the starting entry. New live client sites are added over time as their owners are happy to be listed publicly. Each row links to a per-site fact sheet in [`sites/`](sites/) with the full stack breakdown. +> New live client sites are added over time as their owners are happy to be listed publicly. Each row links to a per-site fact sheet in [`sites/`](sites/) with the full stack breakdown. Machine-readable versions of every entry live alongside the markdown fact sheets in [`sites/`](sites/) as JSON, so this gallery can be consumed by tooling as well as read by people. diff --git a/sites/hydra-restore.json b/sites/hydra-restore.json new file mode 100644 index 0000000..497c28a --- /dev/null +++ b/sites/hydra-restore.json @@ -0,0 +1,29 @@ +{ + "$schema": "../site.schema.json", + "slug": "hydra-restore", + "name": "Hydra Restore", + "industry": "Exterior cleaning (pressure & soft washing)", + "region": "Leeds & West Yorkshire, UK", + "url": "https://www.hydrarestore.co.uk", + "builtBy": "UK Web Marketing", + "builtByUrl": "https://ukwebmarketing.com", + "public": true, + "stack": { + "framework": "Astro", + "rendering": "static", + "clientJavaScript": "minimal, progressive (menu, before/after sliders, forms); pages work without it", + "hosting": "Vercel", + "delivery": "Vercel edge network", + "fonts": "self-hosted woff2 via Fontsource (Space Grotesk, Inter)", + "icons": "hand-inlined SVG, no icon runtime", + "images": "optimised at build with astro:assets (Sharp)", + "analytics": "Plausible (cookieless), config-gated" + }, + "accessibility": [ + "visible focus states and a skip link on every page", + "keyboard-accessible before/after sliders (native range input)", + "off-screen mobile menu inert with managed focus", + "prefers-reduced-motion respected", + "WCAG-AA contrast on interactive elements" + ] +} diff --git a/sites/hydra-restore.md b/sites/hydra-restore.md new file mode 100644 index 0000000..a4e6015 --- /dev/null +++ b/sites/hydra-restore.md @@ -0,0 +1,44 @@ +# Hydra Restore + +**Industry:** Exterior cleaning (pressure & soft washing) +**Live site:** [www.hydrarestore.co.uk](https://www.hydrarestore.co.uk) +**Built by:** [UK Web Marketing](https://ukwebmarketing.com) + +Checkatrade-approved exterior-cleaning team covering Leeds & West Yorkshire — driveways, patios, render soft washing, gutters and tarmac restoration. The site is a local-search engine for a trade business: a three-layer architecture of service pages, genuinely-local town pages and curated service-in-town landing pages (128 pages total, all generated from one data layer), with real before/after photo sliders, documented case studies, long-form care guides and a WhatsApp-first photo-quote flow. + +## Stack + +| Layer | What we used | +|---|---| +| Framework | Astro, static output | +| Client JavaScript | Minimal and progressive — menu, before/after comparison sliders, form handling; every page works without it | +| Hosting | Vercel (fully static output, no serverless functions) | +| Fonts | Self-hosted `woff2` via Fontsource (Space Grotesk, Inter), no font CDN | +| Icons | Hand-inlined SVG, no icon runtime | +| Images | Optimised at build with `astro:assets` (Sharp) — responsive widths, modern formats, lazy-loaded | +| Analytics | Plausible (cookieless), config-gated — the one third-party script the site loads | + +## SEO and structure + +- Three-layer local-SEO architecture: 8 service pages, 20 town pages with genuinely local copy, and 66 curated service-in-town pages (deliberately not a blanket matrix — each combo exists only where that service is genuinely relevant locally, with unique copy per page) +- JSON-LD `@graph` on every page: a single `LocalBusiness` entity referenced site-wide, plus town-scoped `Service`, `FAQPage`, `BreadcrumbList`, `Article`/`BlogPosting` nodes +- Canonical URLs, Open Graph and Twitter card metadata on every page +- Sitemap with genuine per-content `lastmod` dates from frontmatter +- 10 advice articles + 5 long-form care guides, cross-linked into the service pages + +## Accessibility + +- Visible focus states and a skip link on every page +- Keyboard-accessible before/after sliders (native range input under the pointer surface) +- Off-screen mobile menu kept out of the tab order with `inert`, with managed focus +- `prefers-reduced-motion` respected for reveal animations and slider transitions +- WCAG-AA contrast on interactive elements (audited) + +## Verify it yourself + +- Open [www.hydrarestore.co.uk](https://www.hydrarestore.co.uk) and view source: static HTML, self-hosted fonts, one optional analytics script. +- Run `node scripts/check-links.mjs` from the repo root to confirm the URL resolves. + +--- + +Built by [UK Web Marketing](https://ukwebmarketing.com). Site and brand © Hydra Restore.