# 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 `` 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 `