# L8 Water Hygiene — Site Upgrade Plan

## Executive Summary

Complete site rebuild from the ground up. The current site (15 pages, Divi 5.8.1, L8-Water child theme, live at l8waterhygiene.co.uk) will be replaced with a modern dark-themed design authored in Divi 5 on the build site (l8.kaburu.co.uk, DiviFlash 1.4.14), then deployed to production. The new design mockup (`/tmp/l8water-design-v3.html`) has been validated in real HTML/CSS/JS and partially translated to Divi 5 blocks (`/tmp/l8water-v3-divi.html`, 110 lines of block markup across 7 sections with wave dividers).

## 1. Design System

### 1.1 Color Palette

Token Hex Role
——-—–——
`–brand` `#7d78ba` Primary brand — buttons, accents, active states
`–brand-lt` `#a8a4d4` Lighter brand — badge text, icons, hover states
`–brand-dk` `#4e4a8a` Darker brand — gradients, hover backgrounds
`–deep` `#1a1a2e` Deepest background — body, hero, services
`–mid` `#24243e` Mid-tone background — stats bar, trust section
`–surface` `#2e2e50` Card surface — service cards
`–white` `#f5f4fc` Primary text — headings, body text (actually a warm off-white)
`–foam` `#dddaf5` Secondary text — subtitles, labels, muted copy
Footer bg `#111124` Footer — darkest surface
Button gradient `#7d78ba → #4e4a8a` Primary button gradient (135deg)
CTA band gradient `#4e4a8a → #7d78ba → #a8a4d4` Full CTA section gradient (120deg)

Design System Setup in Divi: Create global colors via `diviops_global_color_create` for all 8 tokens. This makes future site-wide color changes instant.

### 1.2 Typography

Role Font Family Weight Size (Desktop) Notes
————————–—————-——-
H1 hero Bebas Neue 400 `clamp(61px, 7.5vw, 112px)` Line-height 0.92, letter-spacing 0.04em
H2 section Bebas Neue 400 `clamp(42px, 4vw, 64px)` Line-height 1.0, letter-spacing 0.05em
H3 cards DM Sans 600 17px
Body DM Sans 300/400 15-17px Line-height 1.68-1.72
Nav links DM Sans 500 14px (~0.88rem) Uppercase, letter-spacing 0.04em
Section tags DM Sans 500 12px (~0.76rem) Uppercase, letter-spacing 0.2em
Stat numbers Bebas Neue 400 48px (3rem)
Stat labels DM Sans 500 12px Uppercase, letter-spacing 0.1em
Footer DM Sans 400 13px

Font loading: Google Fonts — Bebas Neue + DM Sans (300, 400, 500, 600, 700 + italic 300). Set up as global fonts via `diviops_global_font_create`.

### 1.3 Spacing & Layout

Context Value Notes
—————-——-
Section padding (desktop) 96px top/bottom, 60-80px sides Varies by section type
Section padding (tablet) 64px top/bottom, 24px sides
Section padding (phone) 48px top/bottom, 20px sides
Nav padding 16px vertical, 64px horizontal
Card padding 40px all sides
Card gap 2px (creates 2px borders between cards)
Content max-width 1300px (services), 1100px (trust)
Hero max-width 700px

### 1.4 Border Radius & Effects

- Border radius: 3px (buttons), 4px (badges), 2px (hero badge) - Button hover: translateY(-2px) + opacity/color transition 0.15s - Card hover: background shifts from `#2e2e50` to `#353560`, translateY(-3px), bottom border gradient slides in - Nav: backdrop-filter blur(10px), border-bottom 1px rgba(125,120,186,0.15)

### 1.5 Breakpoints

Desktop-first (Divi 5 standard — `max-width` queries):

Breakpoint Width Affects
———–——-———
Desktop >900px Full layout
Tablet ≤900px Nav collapses, cards go single column, stats 2×2
Phone <478px Tightest padding, stacked everything

CSS reference from mockup: ```css @media(max-width:900px) {

nav { padding: 1rem 1.5rem; }
nav ul { display: none; }
.hero-content { padding: 0 1.8rem; }
.stats { grid-template-columns: repeat(2,1fr); padding: 2rem 1.5rem; }
.services { padding: 4rem 1.5rem; }
.cards { grid-template-columns: 1fr; }
.trust { padding: 3rem 1.5rem; flex-direction: column; }
.cta-band { padding: 3.5rem 1.5rem; }
footer { padding: 2rem 1.5rem; flex-direction: column; align-items: flex-start; }

} ```

## 2. Page-by-Page Module Mapping

### 2.1 Home Page (the main rebuild)

The home page is the hero deliverable — everything else flows from it. The mockup has 7 distinct sections between nav and footer, plus the fixed nav itself.

#### Section 0: Fixed Navigation (Theme Builder)

Mockup Element Divi/DiviFlash Module Notes
————————————-——-
Fixed nav container Theme Builder — Global Header template `diviops_tb_template_create` with nav layout
Logo image `divi/image` Logo asset: 198×68px, white version for dark bg
Nav links (Services, Compliance, Risk Assessments, About) `divi/menu` or `difl/advanced-menu` Custom menu via WP Menu system
CTA button (Get a Quote) `divi/button` Background brand, white text, 3px radius

Critical: The fixed nav with `backdrop-filter: blur(10px)` and semi-transparent background requires Theme Builder. This is NOT doable with per-page sections — it must be a Global Header template assigned to “All Pages.”

#### Section 1: Hero

Mockup Element Divi/DiviFlash Module Notes
————————————-——-
Canvas wave animation background `divi/code` JS canvas for animated wave layers + bubbles. 3 wave layers, 55 bubbles, caustics. `requestAnimationFrame` loop.
Gradient overlay `module.decoration.background` gradient on section `linear-gradient(110deg, rgba(26,26,46,.88) 0%, rgba(26,26,46,.5) 55%, rgba(36,36,62,.15) 100%)`
Video-clipped heading text (“Pure Water. Total Compliance.”) `divi/code` + hidden video element Canvas renders video frames masked to letterforms. Requires JS: draw video → composite 'destination-in' → fill text mask. Fallback: gradient text if video unavailable.
Hero badge (Legionella & Water Hygiene Specialists) `divi/text` with inline CSS Border, background tint, dot animation
Subtitle paragraph `divi/text` DM Sans 300 weight, 500px max-width
Primary CTA (Request a Survey) `divi/button` Brand gradient, box-shadow
Secondary CTA (Our Services) `divi/button` Transparent bg, brand border
Scroll hint `divi/text` + `divi/code` for animated line Small text + CSS-animated vertical line
Ripple effects `divi/code` Append ripple divs on click/mousemove, CSS animation

HTML→Divi translation matrix for Hero: - `background: radial-gradient(…)` on canvas → Code module JS draws it - `linear-gradient` overlay → `module.decoration.background.desktop.value.gradient` - `clamp(3.8rem, 7.5vw, 7rem)` heading → `content.decoration.headingFont.h1.font.desktop.value.size` = “96px” + tablet “64px” + phone “42px” - Video text → NOT directly translatable. Requires Code module with canvas + hidden video element + JS. Fallback acceptable for launch: use static gradient text (no video), add video-clipped text post-launch. - `.btn-primary` gradient → `button.decoration.background.desktop.value.gradient` - `.hero-badge` with pseudo dot → text block with inline `<span>` for dot + CSS animation via Free-Form CSS

#### Section 2: Stats Bar

Mockup Element Divi/DiviFlash Module Notes
————————————-——-
Stats container (4 columns) `divi/row` with grid display, 4 × `divi/column` (1_4)
Stat number (1200+, 20+, 100%, 24/7) `divi/text` — Bebas Neue 48px gradient text Use span styling for gradient
Stat label `divi/text` — DM Sans 12px uppercase Part of same text block
Background `module.decoration.background` — `#24243e`

#### Section 3: Wave Divider (SVG)

Mockup Element Divi/DiviFlash Module Notes
————————————-——-
SVG wave divider `divi/code` with inline SVG `preserveAspectRatio=“none”`, 64px height. Proven in v3-divi build.

Three wave dividers in page: 1. Between stats and services: top=#24243e, bottom path fill=#1a1a2e 2. Between services and trust: top=#1a1a2e, bottom path fill=#24243e 3. Between trust and CTA: top=#24243e, bottom path fill=#4e4a8a

Each is a standalone `divi/section` with zero padding containing a `divi/code` module with the SVG.

#### Section 4: Services (6 Cards)

Mockup Element Divi/DiviFlash Module Notes
————————————-——-
Section tag (“What We Do”) `divi/text` Brand-lt color, uppercase, letter-spacing
H2 heading `divi/text` Bebas Neue, gradient on “Hygiene Services”
Card grid (3×2) 2 × `divi/row` with grid, each 3 × `divi/column` (1_3) Or single row with 6 columns and CSS grid wrap
Card background Column `module.decoration.background` = `#2e2e50`
Card icon (SVG) `divi/image` with inline SVG or `divi/blurb` with icon 6 custom SVG icons
Card heading (H3) `divi/text` DM Sans 600, 17px
Card body `divi/text` DM Sans 400, 14px, brand-foam color at 55% opacity
Card hover effects Free-Form CSS on column Bottom border gradient slide-in, background colour shift, translateY(-3px), glow circle scale

6 Service Cards: 1. Legionella Risk Assessments 2. Water Treatment Programmes 3. Monitoring & Sampling 4. Showerhead & TMV Cleaning 5. Written Schemes & Logbooks 6. Training & Awareness

#### Section 5: Trust / Compliance

Mockup Element Divi/DiviFlash Module Notes
————————————-——-
2-column layout `divi/row` → 2 × `divi/column` (1_2) Flexbox on desktop, stacked on mobile
Trust heading (H2) `divi/text` Bebas Neue, 45px
Trust paragraph `divi/text` DM Sans, 15px
Badge grid (2×2) `divi/text` with inline HTML grid Or 4 × `divi/blurb` in grid
Badge items Inline styled divs in text block Border, tinted bg, Bebas Neue title + DM Sans subtitle

4 Compliance Badges: 1. ACOP L8 — Compliant 2. HTM 04-01 — Healthcare 3. BS 8580 — Certified 4. ISO 9001 — Quality

#### Section 6: CTA Band

Mockup Element Divi/DiviFlash Module Notes
————————————-——-
Gradient section `module.decoration.background.desktop.value.gradient` 120deg, stops: 0% #4e4a8a, 60% #7d78ba, 100% #a8a4d4
Dot pattern overlay `module.decoration.background` with SVG data URI Or use Code module for the patterned overlay
H2 heading + subtitle `divi/text` Bebas Neue + DM Sans body font combo
White CTA button `divi/button` White bg, brand-dk text, 700 weight

#### Section 7: Footer

Mockup Element Divi/DiviFlash Module Notes
————————————-——-
Footer section Theme Builder — Global Footer template Or per-page section if TB not available yet
Logo `divi/image` White version, CSS filter for opacity
Copyright `divi/text` DM Sans, 13px, 30% white opacity
Legal links `divi/text` Privacy Policy, Terms, Contact

### 2.2 About Page

Map to new design system. Keep existing content, restyle: - Hero section with Bebas Neue heading on dark bg - Content in `divi/text` modules with DM Sans - Stats/certifications in branded badge grid - CTA band at bottom

### 2.3 Service Pages (6 pages)

Each follows the same template — restyle to new dark theme: 1. ACOP L8 Legionella Risk Assessment (page 154) 2. L8 and Water Hygiene Monitoring Program (page 170) 3. Water System Installation (page 176) 4. Chemical Dosing Systems with Chlorine Dioxide (page 182) 5. Cooling Towers and Boiler Systems (page 202) 6. Legionella Testing (page 10/36)

Template: - Hero: service name in Bebas Neue, subtitle - Content: DM Sans body, testimonials where applicable - Sidebar: related services (use `difl/iconlist` or native `divi/sidebar`) - CTA band at bottom - Each service page targets a unique primary keyword

### 2.4 Supporting Pages

Page Approach
—————-
FAQ (page 376) Restyle with `difl/faq` for richer accordion. Add FAQ schema via RankMath.
Blog (page 39) Stays as blog index. Restyle listing page with dark theme.
News (page 408) Stays as news index.
Other Services (page 593) Consolidate or keep as catch-all with card grid.
Privacy Policy (page 226) Restyle text block. No design flourish needed.
Terms of Use (page 227) Restyle text block.
Cookie Policy (page 9) Restyle text block.
Disclaimer (page 225) Restyle text block.

## 3. Technical Approach: What Translates & What Doesn't

### 3.1 What Translates Directly to Divi 5

HTML/CSS Feature Divi 5 Equivalent
—————–——————-
Solid background colours `module.decoration.background.desktop.value.color`
Linear/radial gradients `module.decoration.background.desktop.value.gradient`
font-family, font-size, font-weight, color `content.decoration.headingFont.h1.font.desktop.value` (or bodyFont)
letter-spacing, text-transform, line-height Same font path
padding, margin `module.decoration.spacing.desktop.value.padding` / `.margin`
max-width `module.decoration.sizing.desktop.value.maxWidth`
border-radius `module.decoration.border.desktop.value.radius`
Button styling (bg, color, radius) `button.decoration.background` / `.font` / `.border`
Grid layouts `module.decoration.layout.desktop.value.display: grid` + column type
Flex layouts `module.decoration.layout.desktop.value.display: flex`

### 3.2 What Needs Workarounds

HTML/CSS Feature Workaround
—————–————
Canvas animations (waves, bubbles, caustics) `divi/code` module with inline JS. Must be self-contained — no external scripts.
Video-clipped text heading `divi/code` module: create hidden `<video>` element, draw frames to canvas, composite with `globalCompositeOperation='destination-in'`, draw text mask. Fallback for launch: static gradient text. Add video text as enhancement.
Ripple effects on click/mousemove `divi/code` module: event listeners on hero section, create/remove ripple `<div>` elements with CSS animation.
Fixed nav with backdrop-filter blur Theme Builder Global Header template. Semi-transparent bg + `backdrop-filter: blur(10px)` via Free-Form CSS.
Card hover effects (pseudo-elements, transform) Free-Form CSS on column: `::after` for bottom border gradient, `::before` for glow circle, `:hover` for background shift + translateY.
Wave SVG dividers `divi/code` module with inline SVG. Already proven in `/tmp/l8water-v3-divi.html`.
Gradient text (brand-lt → brand-dk) Inline `<span>` with CSS: `background: linear-gradient(…); -webkit-background-clip: text; -webkit-text-fill-color: transparent`. Add inside `innerContent` HTML.
Scroll hint animation `divi/text` for “Scroll” label + `divi/code` with CSS for the animated vertical line. Or use `difl/lottie` for a Lottie scroll animation (cleaner, no custom JS).
Dot pattern overlay on CTA band SVG data URI as `module.decoration.background.desktop.value.image`. Or `divi/code` with inline SVG pattern.
Animated pulse dot in hero badge CSS `@keyframes pulse` via Free-Form CSS on the text module.

### 3.3 DiviFlash Modules Recommended

Purpose Module Why
—————–—–
FAQ page `difl/faq` Richer accordion than native, better schema support
Service icons `difl/svganimator` Animated SVG icons on service cards
Testimonials `difl/testimonialcarousel` Carousel for client testimonials
Before/After `difl/before-after-slider` Show treatment results (photos)
Typing text `difl/typing-text` Animated tagline in hero (alternative to video text)
Advanced menu `difl/advanced-menu` Better nav customization than native
Logo/badge grid `difl/contentcarousel` If trust badges need carousel on mobile
Scroll reveal `difl/scroll-text-reveal` Animate section headings on scroll

### 3.4 Build Protocol

1. Python script generation using `scripts/gen-divi-page.py` as template — uses `json.dumps()` to guarantee correct JSON 2. SCP to Hetzner → `wp post update <ID> /tmp/file.html –allow-root` 3. Flush cache → `wp cache flush` 4. Verify → `curl -sL https://l8.kaburu.co.uk/page | grep -o 'expected text'` 5. Visual QA → `python3 /home/kaburu/scripts/vision-check.py` with local minicpm-v:8b vision model

Critical: For pages with >7 blocks, write to file and push via WP-CLI (avoids MCP double-escaping of backslashes — Pitfall #10).

## 4. Responsive Plan

### 4.1 Breakpoint Strategy (Desktop-First)

Divi 5 uses `max-width` breakpoints. We set values at three levels:

Level Target When
——-——–——
Desktop All modules Default state
Tablet `module.*.tablet.value` ≤980px
Phone `module.*.phone.value` ≤478px

### 4.2 Per-Section Responsive Behavior

Section Desktop Tablet (≤900px) Phone (≤478px)
———————————–—————-
Nav Horizontal links + CTA Hamburger menu (mobile menu toggle) Hamburger menu
Hero 700px max-width content, canvas full-bleed 100% width content, reduced heading size (64px) 100% width, heading 42px, stacked buttons
Hero heading `clamp(61px, 7.5vw, 112px)` 64px 42px
Stats 4 columns 2×2 grid 2×2 grid, reduced padding
Services 3×2 card grid 2×3 or single column Single column
Trust Text left, badges right Text top, badges bottom Full stack
CTA Heading left, button right Centered, heading above button Centered, button full-width
Footer Logo left, links right Stacked: logo top, links bottom Stacked with left alignment

### 4.3 Font Scaling

Element Desktop (clamp) Tablet Phone
————————–——–——-
Hero h1 `clamp(61px, 7.5vw, 112px)` 64px 42px
Section h2 `clamp(42px, 4vw, 64px)` 42px 32px
Trust h2 45px 32px 28px
CTA h2 `clamp(35px, 3.5vw, 52px)` 36px 28px
Stat numbers 48px 48px 36px
Card h3 17px 17px 16px
Body 15-17px 15px 14px

### 4.4 Image/Asset Responsive Strategy

- Logo: Serve at 198×68px native, CSS `height: 44px; width: auto` on desktop, `height: 36px` on mobile - Hero background canvas: resize via JS `resize` event listener, match container dimensions - Service card SVGs: 44×44px viewBox, scale naturally - Trust badges: Fixed padding, allow text to wrap naturally - Wave dividers: `preserveAspectRatio=“none”` handles all widths automatically

## 5. SEO Strategy

### 5.1 Keyword Architecture

Primary keywords (targeted on dedicated service pages):

Page Primary Keyword Intent
———————-——–
Home legionella risk assessment uk Commercial
Legionella Risk Assessment acop l8 legionella risk assessment Commercial
Monitoring Program legionella monitoring programme Commercial
Water System Installation water system installation uk Commercial
Chemical Dosing chlorine dioxide water treatment Commercial
Cooling Towers cooling tower legionella testing Commercial
Legionella Testing legionella testing services Commercial
Training legionella awareness training Commercial

Secondary keywords (supporting content): - water hygiene services uk - legionella compliance - htm04-01 water safety - written scheme of control - tmv servicing - legionella sampling uk

### 5.2 On-Page SEO per Page

Home Page: - SEO Title: `L8 Water Hygiene | Legionella Risk Assessment & Water Safety UK` - Meta Description: `Expert ACOP L8 legionella risk assessments, water treatment programmes, and monitoring across the UK. 20+ years experience, 100% compliance record. Free consultation.` - Focus Keyword: `legionella risk assessment uk` - Schema: `LocalBusiness` + `Service`

Service Pages — each gets: - Unique focus keyword - SEO title with `| L8 Water Hygiene` suffix - Meta description 140-160 chars with service + location + call to action - `Service` schema via RankMath - Internal links from home page service cards → service pages - Internal links between related services

FAQ Page: - Schema: `FAQPage` via RankMath (rich results eligible) - Focus keyword: `legionella frequently asked questions` - Each FAQ item gets structured data

Blog: - `Article` schema on each post - Topic clusters: Legionella, water treatment, compliance, industry news - Internal linking from blog posts → service pages

### 5.3 Technical SEO

Item Action Tool
————–——
Sitemap Generate XML sitemap RankMath
Robots.txt Allow search bots, block AI training scrapers (GPTBot, CCBot), allow AI search bots (PerplexityBot) `rankmath-seo.py robots –ai-search-only`
Canonical URLs Set per-page RankMath REST API
OG/Twitter tags Set per-page (title, description, image) RankMath `updateMeta`
Schema markup `LocalBusiness` (home), `Service` (service pages), `FAQPage` (FAQ), `Article` (blog) RankMath `updateSchemas`
Internal linking Audit orphans RankMath `links/posts?is_orphan=orphan`
Markdown for bots Install on production site `wp plugin install markdown-for-agents-and-statistics –activate`
Core Web Vitals Target LCP <2.5s, CLS <0.1 LiteSpeed cache + FastPixel (deactivate during VB work)
SSL Cloudflare full (strict) Already configured
Redirects 301 for any URL changes RankMath or Cloudflare

### 5.4 Content Strategy

1. Service pages: Long-form (800-1500 words), structured with H2/H3 headings, bullet points for compliance details, internal links to related services 2. Blog: 2-4 posts/month covering Legionella guidance updates, case studies, industry news 3. FAQ: 15-20 questions covering common Legionella/water hygiene concerns. Each answer 100-200 words.

### 5.5 Tracking

- RankWatch: Add `l8waterhygiene.co.uk` as a project, track primary keywords - Matomo: Already tracking on stats.kaburu.co - Google Search Console: Integrated via RankMath Pro (install Pro on live site)

## 6. Build Sequence

### Phase 1: Foundation (Days 1-3)

Step Task Tool
——————
1.1 Create global colours (8 tokens) `diviops_global_color_create` × 8
1.2 Create global fonts (Bebas Neue + DM Sans families) `diviops_global_font_create` × 2
1.3 Set global typography defaults (body 15px, headings Bebas Neue) `diviops_schema_get_settings` + modify
1.4 Create Fluid Typography System `diviops_variable_create_fluid_system`
1.5 Set up nav menu in WordPress (Services, Compliance, Risk Assessments, About, Contact) `diviops_menu_*`
1.6 Install and activate RankMath Pro on build site Manual zip upload
1.7 Install markdown-for-agents-and-statistics WP-CLI

### Phase 2: Theme Builder (Days 3-5)

Step Task Tool
——————
2.1 Create Global Header template (fixed nav, logo, menu, CTA button) `diviops_tb_template_create`
2.2 Create Global Footer template (logo, copyright, legal links) `diviops_tb_template_create`
2.3 Assign header/footer to All Pages Template conditions
2.4 Test nav responsiveness (hamburger menu) Visual QA

### Phase 3: Home Page (Days 5-10)

Step Task Tool
——————
3.1 Generate home page blocks via Python script `scripts/gen-divi-page.py`
3.2 Build Section 1: Hero (canvas waves, video text fallback, badge, CTAs) Python → SCP → WP-CLI
3.3 Build Section 2: Stats Bar Python → SCP → WP-CLI
3.4 Build Section 3: Wave Divider 1 Python → SCP → WP-CLI
3.5 Build Section 4: Services (6 cards with SVGs) Python → SCP → WP-CLI
3.6 Build Section 5: Wave Divider 2 Python → SCP → WP-CLI
3.7 Build Section 6: Trust (badges grid) Python → SCP → WP-CLI
3.8 Build Section 7: Wave Divider 3 Python → SCP → WP-CLI
3.9 Build Section 8: CTA Band Python → SCP → WP-CLI
3.10 Build Section 9: Footer (if not using Theme Builder footer) Python → SCP → WP-CLI
3.11 Add Free-Form CSS for hover effects, animations Module-level CSS
3.12 Validate: `diviops_validate_blocks` MCP
3.13 Preview: `diviops_render_preview` MCP
3.14 Visual QA: `vision-check.py` full-page + scroll-review Local vision model
3.15 SEO setup for home page (meta, schema, OG) `rankmath-seo.py full-seo`
3.16 Publish `diviops_page_update_status`

### Phase 4: Service Pages (Days 10-16)

For each of the 6 service pages:

Step Task Tool
——————
4.x.1 Copy content from existing page `wp post get <ID>`
4.x.2 Build new page with dark theme blocks Python script
4.x.3 SEO setup (keyword, meta, schema) `rankmath-seo.py`
4.x.4 Visual QA `vision-check.py`
4.x.5 Internal link audit RankMath link checker

### Phase 5: Supporting Pages (Days 16-20)

Step Task
————
5.1 Restyle About page
5.2 Restyle FAQ page with `difl/faq` + FAQ schema
5.3 Restyle Blog index
5.4 Restyle News page
5.5 Restyle legal pages (Privacy, Terms, Cookies, Disclaimer)
5.6 Restyle Other Services or consolidate

### Phase 6: SEO & Polish (Days 20-24)

Step Task
————
6.1 Full site keyword research via RankMath + web search
6.2 Set all page meta (titles, descriptions, OG)
6.3 Set all schema markup
6.4 Internal link audit — fix orphans
6.5 Generate robots.txt (`–ai-search-only`)
6.6 Verify sitemap
6.7 Add to RankWatch tracking
6.8 Cross-browser visual QA (Chrome, Firefox, Safari)
6.9 Mobile responsive QA (all pages, all breakpoints)
6.10 PageSpeed audit — optimize assets

### Phase 7: Deploy to Production (Days 24-26)

Step Task
————
7.1 Full backup of live site (files + DB)
7.2 Clone build site DB to production (or selective content migration)
7.3 Copy theme files, plugins, uploads
7.4 Update URLs (l8.kaburu.co.uk → l8waterhygiene.co.uk)
7.5 Flush all caches
7.6 Verify all pages render on live domain
7.7 Set up 301 redirects for any URL changes
7.8 Submit new sitemap to Google Search Console
7.9 Monitor rankings for 48 hours post-launch

### Phase 8: Post-Launch (Days 26-30)

Step Task
————
8.1 Monitor Matomo analytics for traffic patterns
8.2 Check RankWatch rankings (daily)
8.3 Fix any visual issues caught post-launch
8.4 Enable video-clipped heading (enhancement — deferred from launch)
8.5 Add Lottie animation for scroll hint (replacement for CSS-only version)
8.6 Client review and sign-off

## 7. Timeline

Phase Duration Cumulative
——-———-————
1. Foundation 3 days Day 3
2. Theme Builder 2 days Day 5
3. Home Page 5 days Day 10
4. Service Pages (6) 6 days Day 16
5. Supporting Pages (8) 4 days Day 20
6. SEO & Polish 4 days Day 24
7. Deploy to Production 2 days Day 26
8. Post-Launch 4 days Day 30

Total estimated timeline: 30 working days (6 weeks).

### Milestones

Milestone Day Deliverable
———–—–————-
Design system live on build site Day 3 Global colours + fonts + fluid typography
Theme Builder templates working Day 5 Fixed nav + footer visible on all pages
Home page complete Day 10 Full home page with all sections, validated, SEO-ready
All service pages built Day 16 6 service pages with dark theme + SEO
All pages restyled Day 20 15-page site fully converted
SEO complete Day 24 All meta, schema, sitemap, robots.txt, internal links
LIVE Day 26 Production deployment + verification
Signed off Day 30 Client review, fixes, enhancements

## 8. Risk Register

Risk Probability Impact Mitigation
————————–————
Canvas animation performance on mobile Medium Medium Use `will-change: transform`, reduce bubble count on mobile via JS, test on real devices
Video-clipped heading CORS issues High Low Fallback to gradient text — video is an enhancement, not critical
Theme Builder nav conflicts with existing child theme Low High Test on build site first, clone theme if needed
WordPress 6.x breaking Divi 5.8.x Low High Pin versions, test updates on build site before production
SEO rankings drop during migration Medium High Preserve all URLs, set up 301s, monitor RankWatch daily post-launch
FastPixel causes VB 500s High Medium Deactivate FastPixel before any VB work, reactivate after
MCP double-escaping on large pages Medium Medium Use file → SCP → WP-CLI pipeline for pages with >7 blocks
Client content changes during build Low Low Freeze content on live site during Phase 4-5

## 9. Asset Checklist

Asset Status Notes
——-——–——-
Logo (198×68px) ✅ Exists At `https://kaburu.co/wp-content/uploads/2026/06/L8-Logo.png`
Logo (white version for dark bg) 🔧 Needed Invert + reduce opacity via CSS or create white version
Hero background video (l8-water-hero.mp4) 🔧 Needed For video-clipped heading enhancement
6 service card SVG icons 🔧 Needed Custom SVGs for each service
4 trust badge icons ⬜ Optional Text-based badges work without icons
Hero canvas JS ✅ Written In v3 design mockup (`/tmp/l8water-design-v3.html`)
Wave divider SVGs ✅ Written In v3-divi build (`/tmp/l8water-v3-divi.html`)
Favicon 🔧 Needed 32×32 + 180×180
OG image (1200×630) 🔧 Needed For social sharing previews

## 10. Key Files Reference

File Purpose
—————
`/tmp/l8water-design-v3.html` Original HTML/CSS/JS mockup — the design source of truth
`/tmp/l8water-content-fixed.html` Divi 5 block translation (62 blocks, no wave dividers)
`/tmp/l8water-v3-divi.html` Enhanced Divi 5 build with Code module wave dividers (110 lines)
`~/.hermes/skills/infrastructure/divi-5-builder/scripts/gen-divi-page.py` Page generator template (Python + json.dumps)
`~/.hermes/skills/infrastructure/divi-5-builder/scripts/rankmath-seo.py` SEO automation CLI
`~/.hermes/skills/infrastructure/divi-5-builder/references/l8water-deployment.md` Previous deployment notes
`~/.hermes/skills/infrastructure/divi-5-builder/references/diviflash-modules.md` 107-module DiviFlash inventory

*Plan prepared: 2026-07-05. Next action: Begin Phase 1 — Design System setup on l8.kaburu.co.uk.*

## Custom CSS (Hero Video Overlay)

Problem: Divi 5 API's `customCss` path doesn't output CSS. Inline `<style>` blocks in `divi/code` modules get stripped by Divi's CSS processor. Theme mods (`custom_css`) are ignored. The `background.gradient` API path renders behind the video, not on top.

Solution: CSS injected via `wp_head` hook in the theme's `functions.php` (2026-07-07).

File: `/home/l8.kaburu.co.uk/public_html/wp-content/themes/L8-Water/functions.php`

```php // Hero video overlay gradient — Gwen 2026-07-07 add_action('wp_head', function() {

if (is_front_page()) {
  echo '<style>.et_pb_section_0_tb_body::before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;z-index:1;pointer-events:none;background:linear-gradient(180deg,rgba(36,36,61,0.86) 0%,rgba(31,31,53,0.86) 50%,rgba(26,26,45,0.86) 100%)}</style>';
}

}); ```

Colors: `#24243d` → `#1f1f35` → `#1a1a2d` at 86% opacity. The `::before` pseudo-element with `position: absolute` and `z-index: 1` renders above the `<video>` element that Divi places at z-index 0.

Scope: Homepage only (`is_front_page()`). The section class `.et_pb_section_0_tb_body` is Divi's compiled class for the first section in the Theme Builder body layout.