Design System | Mike Lister Photography

Complete design system and development guide for Mike Lister Photography website.

Design System

Complete guide for developing and maintaining the Mike Lister Photography website

Brand Guidelines Code Examples Development Guide

Table of Contents

1. Brand Identity

Business Positioning

Mike Lister Photography operates as three integrated services under one cohesive brand:

  • Weddings: Warm, personal, emotional storytelling
  • Commercial: Professional, business-focused, brand-enhancing
  • Drone: Technical, precision-focused, perspective-shifting

Core Brand Attributes

  • Warm & Inviting: Feels like working with a trusted friend
  • Deeply Personal: Focuses on emotional connection
  • Professional Excellence: Technical expertise without coldness

2. Tone & Voice

Communication Style

The tone should feel like a nurturing, caring companion on life's journey:

✅ DO:

"Let's capture the moments that tell your unique story"

"I'll be there to preserve every precious detail"

Use English UK Spelling and Grammar

❌ DON'T:

"We provide photography services"

"Contact us for a quote"

Avoid using "—" and too many emoji icons

Avoid overly perfect grammar - Real humans make occasional small errors

Don't use repetitive sentence structures

Avoid excessive adjectives - "Absolutely stunning, breathtakingly beautiful"

Don't use cliché marketing phrases

Deployment Notes

When ready to deploy, move the 'publish' tag forward
# Force move the local 'publish' tag to current HEAD
git tag -f publish

# Force push the updated tag to trigger the pipeline
git push -f origin publish

3. Color Palette

Primary Brand Colors

Memories
#40474F
Headers, main text
Off the Cuff
#CCE2DF
Backgrounds, accents
Cool as a Cucumber
#6AA6AF
Highlights, buttons
Pleased as Punch
#EED5C4
Accents, decorative
Feel at Home
#F2E8E2
Cards, backgrounds

Service-Specific Colors

Drone 1
#9EAE6A
Drone page headers
Drone 2
#d5ebd8
Drone backgrounds
Commercial 1
#757679
Commercial headers
Commercial 2
#D1D3D4
Commercial backgrounds

Button Examples

.bg-cool-as-a-cucumber
.border-cool-as-a-cucumber
.bg-pleased-as-punch
.bg-commercial-1

4. Typography

Font Families

<!-- In head section --> <link href="https://fonts.googleapis.com/css2?family=Zilla+Slab:wght@300;400;500;600;700&family=Libre+Franklin:wght@300;400;500;600;700&display=swap" rel="stylesheet">

Font Usage

Zilla Slab for Headings

Libre Franklin for body text and readability

"Zilla Slab italic for quotes"

Type Scale Examples

Heading 1 (36px-60px)

Heading 2 (30px-36px)

Heading 3 (24px-30px)

Heading 4 (20px-24px)

Body Large (18px) - Perfect for introductory paragraphs

Body Regular (16px) - Main content text

Body Small (14px) - Captions and footnotes

5. Component Examples

Service Card

💒

Wedding Photography

From your first look to the last dance, I capture every precious moment with care and attention.

"Every Moment, Every Detail, Forever Yours"

Learn More
<div class="group relative overflow-hidden rounded-2xl shadow-lg transition-all duration-500 hover:shadow-2xl hover:-translate-y-2"> <div class="absolute inset-0 bg-wedding-1 opacity-90 group-hover:opacity-100 transition-opacity duration-500"></div> <div class="relative p-8 h-full flex flex-col"> <div class="text-4xl mb-6 transform group-hover:scale-110 transition-transform duration-500">💒</div> <h3 class="font-zilla-slab text-2xl text-memories mb-4">Wedding Photography</h3> <p class="text-memories opacity-90 mb-6 flex-grow">...</p> <a href="#" class="inline-flex items-center justify-center bg-white text-memories px-6 py-3 rounded-full font-zilla-slab hover:bg-cool-as-a-cucumber hover:text-white transition-all duration-300"> Learn More </a> </div> </div>

6. Animation & Effects

Scale on Hover

hover:scale-105

Lift Effect

hover:-translate-y-1

Pulse Animation

animate-pulse
/* Growing underline effect */ .hover-underline { position: relative; } .hover-underline::after { content: ''; position: absolute; bottom: -2px; left: 0; width: 0; height: 2px; background: #6AA6AF; transition: width 0.3s ease; } .hover-underline:hover::after { width: 100%; } /* Blob animation */ @keyframes blob { 0%, 100% { transform: translate(0, 0) scale(1); } 33% { transform: translate(30px, -50px) scale(1.1); } 66% { transform: translate(-20px, 20px) scale(0.9); } } .animate-blob { animation: blob 7s infinite; }

7. Image Management

WebP Implementation

<picture> <source srcset="/assets/images/webp/weddings/example-image.webp" type="image/webp"> <source srcset="/assets/images/wedding/example-image.jpg" type="image/jpeg"> <img src="/assets/images/wedding/example-image.jpg" alt="Bride and groom at Plymouth waterfront wedding" class="rounded-lg shadow-lg" loading="lazy" width="800" height="600"> </picture>

Image Naming Convention

Service Format Example
Wedding wedding-{location}-{venue}-{sequence}.webp wedding-cornwall-trebah-garden-01.webp
Commercial commercial-{business}-{type}-{sequence}.webp commercial-plymouth-restaurant-interior-01.webp
Drone drone-{location}-{perspective}-{sequence}.webp drone-devon-coastal-aerial-01.webp

8. SEO & Accessibility

Structured Data

<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "LocalBusiness", "name": "Mike Lister Photography", "address": { "@type": "PostalAddress", "streetAddress": "9 Winsbury Court, Crownhill", "addressLocality": "Plymouth", "addressRegion": "Devon", "postalCode": "PL6 5JU", "addressCountry": "GB" }, "telephone": "07815141779", "openingHours": "Mo-Fr 09:00-17:30" } </script>

Accessibility Features

  • Skip to main content link
  • ARIA labels on interactive elements
  • Semantic HTML structure
  • Proper contrast ratios

9. Analytics Section Tracking

This document explains how analytics works on this site, why it's structured this way, and what needs to be added to pages for tracking to remain consistent over time.

The goal is to keep analytics simple, durable, and meaningful, focusing on story progression rather than raw numbers.

9.1 Core Principle

Analytics on this site is section‑first, not page‑first.

Instead of obsessing over individual pages, we track:

  • Which sections people actually reach
  • How far through the story they progress
  • Whether they reach contact and attempt to enquire

If a visitor moves through the sections in order, the page is doing its job.

9.2 Section IDs (This Is the Foundation)

Every meaningful part of a page must be wrapped in a <section> element with a standardised id.

<section id="portfolio">
  ...
</section>

Important rules

  • Section IDs can repeat across different pages — this is expected and correct
  • Analytics always records section ID together with page path and page type
  • IDs describe the role in the story, not the visual design

So #portfolio on the wedding page and #portfolio on the commercial page are treated as:
"Portfolio section on this page"

This allows comparison without confusion.

9.3 Canonical Section List

Use these IDs wherever possible. Consistency matters more than perfection.

Global (used across most pages)

  • hero
  • introduction
  • services
  • portfolio
  • pricing
  • trust-signals
  • testimonials
  • contact
  • footer

Optional / contextual

  • previous-clients
  • client-examples
  • business-values
  • business-narrative
  • portfolio-preview
  • cta

If a section exists but does not advance the story, it does not need tracking.

9.4 Page Front Matter (Required)

Each page must define its type in front matter so analytics can group behaviour correctly.

---
page_type: wedding
---

Valid values:

wedding commercial blog info

This allows analytics to answer questions like:
"Do wedding visitors behave differently to commercial visitors?"

9.5 What Gets Tracked Automatically

A. Section Viewed (Primary Signal)

An event is recorded once per session when a section enters view:

  • section_viewed
  • section ID
  • page path
  • page type
  • section order on the page

This is the main metric used to understand:

  • Drop‑off points
  • Story progression
  • Which sections are rarely seen

B. Portfolio Interaction

Tracked only when someone actively engages:

  • Image click
  • Gallery open

This answers:
"Do people just scroll past the work, or actually engage with it?"

C. CTA Clicks

Tracked for links that intentionally move someone forward.

  • Hero CTAs
  • Mid‑page CTAs
  • Pre‑contact CTAs

Each records:

  • Where it was clicked
  • What it points to

D. Contact

Only the essentials:

  • Contact section viewed
  • Form started
  • Form submitted

This keeps conversion tracking clean and reliable.

9.6 What Is Not Tracked (By Design)

To keep analytics readable months or years from now, we intentionally avoid:

Scroll percentages Mouse movement Field‑level form behaviour Excessive timing metrics Heatmaps

If a metric doesn't help decide:
• what to rewrite
• what to reorder
• what to remove
…it isn't tracked.

9.7 Why Repeating Section IDs Is OK

Using the same section ID on multiple pages is a feature, not a problem.

Analytics always evaluates:

Page + Section + Order

This allows questions like:

  • Do people reach portfolio more often on wedding pages than commercial pages?
  • Does pricing perform better before or after testimonials?

Without duplicating logic or dashboards.

9.8 Long‑Term Maintenance Checklist

When adding or editing pages:

1

Section ID present

Every story section has a standardised id

2

Page type set

Front matter includes page_type

3

Story progression

Sections follow logical narrative flow

4

Analytics loaded

analytics.html include present

If all four are true, analytics will continue to work without changes.

9.9 The One Thing to Remember

We measure story progression, not vanity metrics.

If analytics tells you how people move through the page and where they stop, it's doing its job.
Everything else is noise.

10. Blog Image Handling

10.1 Reference the Include File blog-image.html

Insert the following code when wanting an image on a blog post.</code>

include blog-image.html
file="image-name"
alt="Alt text"
layout="landscape" // Accepted values landscape | portrait
ext="png" // Default is jpg so not required unless file format is different
<picture class="blog-image landscape">
<source srcset="/assets/images/webp/blog/.webp" type="image/webp">
<img src="/assets/images/blog/.jpg"
alt=""
loading="lazy"
decoding="async">
</picture>

10.2 How To Use It In Blog Posts

Now your posts stay clean and simple.

Standard landscape image:

{% include blog-image.html 
   file="Tredudwell-Manor-Wedding-Cornwall-Wedding-Photography-Fowey-Wedding-Photography-01"
   alt="Tredudwell Manor wedding in Cornwall with documentary photography"
   title="Tredudwell Manor Wedding Cornwall"
   layout="landscape" %}

Portrait version:

{% include blog-image.html 
   file="Tredudwell-Manor-Wedding-Cornwall-Wedding-Photography-Fowey-Wedding-Photography-01"
   alt="Tredudwell Manor wedding in Cornwall with documentary photography"
   title="Tredudwell Manor Wedding Cornwall"
   layout="portrait" %}

If Your Image Isn't JPG:

{% include blog-image.html 
   file="Tredudwell-Manor-Wedding-Cornwall-Wedding-Photography-Fowey-Wedding-Photography-01"
   alt="Tredudwell Manor wedding in Cornwall with documentary photography"
   title="Tredudwell Manor Wedding Cornwall"
   layout="landscape"
   ext="png" %}

11. Advanced Features

11.1 Contact Form Example

11.2 Compact Contact Form Variations

Card Style Compact Form

Quick Inquiry

We'll respond within 2 hours

Minimal Compact Form

Get in Touch

Send us a quick message

By sending, you agree to our privacy policy

11.3 Interactive Button Effects

Enhanced Pulse Button

Send Button with Effects

Click the buttons above to see effects

CSS Code

<style> /* Enhanced pulse animation */ @keyframes enhanced-pulse { 0%, 100% { box-shadow: 0 10px 25px rgba(106, 166, 175, 0.3); } 50% { box-shadow: 0 10px 35px rgba(106, 166, 175, 0.6); } } .animate-pulse-enhanced { animation: enhanced-pulse 2s infinite; } /* Ripple effect on click */ .ripple { position: relative; overflow: hidden; } .ripple-effect { position: absolute; border-radius: 50%; background: rgba(255, 255, 255, 0.7); transform: scale(0); animation: ripple-animation 0.6s linear; pointer-events: none; } @keyframes ripple-animation { to { transform: scale(4); opacity: 0; } } /* Button hover effects */ .hover-lift { transition: transform 0.3s ease, box-shadow 0.3s ease; } .hover-lift:hover { transform: translateY(-3px); box-shadow: 0 15px 30px rgba(106, 166, 175, 0.4); } </style>

JavaScript for Interactive Effects

<script> // Ripple effect function function createRipple(event) { const button = event.currentTarget; const circle = document.createElement('span'); const diameter = Math.max(button.clientWidth, button.clientHeight); const radius = diameter / 2; circle.style.width = circle.style.height = `${diameter}px`; circle.style.left = `${event.clientX - button.getBoundingClientRect().left - radius}px`; circle.style.top = `${event.clientY - button.getBoundingClientRect().top - radius}px`; circle.classList.add('ripple-effect'); const ripple = button.getElementsByClassName('ripple-effect')[0]; if (ripple) { ripple.remove(); } button.appendChild(circle); } // Button event listeners document.querySelectorAll('.ripple').forEach(button => { button.addEventListener('click', createRipple); }); // Demo button interactions document.getElementById('demoPulseBtn').addEventListener('click', function() { document.getElementById('pulseBtnText').textContent = 'Ripple Effect Activated!'; document.getElementById('demoResult').textContent = 'Pulse button clicked - ripple effect visible'; this.classList.add('bg-memories'); this.classList.remove('animate-pulse-enhanced'); setTimeout(() => { document.getElementById('pulseBtnText').textContent = 'Click to See Ripple Effect'; this.classList.remove('bg-memories'); this.classList.add('animate-pulse-enhanced'); }, 2000); }); document.getElementById('demoSendBtn').addEventListener('click', function() { document.getElementById('sendBtnText').textContent = 'Sending...'; document.getElementById('demoResult').textContent = 'Send button clicked - simulating submission'; this.classList.add('from-memories', 'to-cool-as-a-cucumber'); setTimeout(() => { document.getElementById('sendBtnText').textContent = '✓ Message Sent!'; document.getElementById('demoResult').textContent = 'Message sent successfully!'; setTimeout(() => { document.getElementById('sendBtnText').textContent = 'Send Message'; this.classList.remove('from-memories', 'to-cool-as-a-cucumber'); }, 1500); }, 1000); }); </script>

12. File Structure

Core Directories

📁 _pages/
📄 index.md
📄 weddings.md
📄 commercial.md
📄 drone.md
📄 blog.md
📁 _includes/
📄 analytics.html
📄 blog-image.html
📄 footer.html
📄 header.html
📁 _layouts/
📄 default.html
📄 page.html
📄 post.html

Asset Structure

📁 assets/images/
📁 wedding/
📁 originals/
📁 thumbnails/
📁 commercial/
📁 drone/
📁 blog/
📁 webp/
📁 wedding/
📁 commercial/
📁 drone/
📁 blog/
📁 assets/css/
📄 styles.css

13. Development Guidelines

HTML

  • ✓ Use semantic HTML5 elements
  • ✓ Include ARIA labels where needed
  • ✓ Maintain heading hierarchy
  • ✓ Add skip-to-content link
  • ✓ Use proper lang attribute

CSS/Tailwind

  • ✓ Use Tailwind utility classes first
  • ✓ Follow mobile-first approach
  • ✓ Maintain color system
  • ✓ Ensure contrast ratios ≥ 4.5:1
  • ✓ Test responsive breakpoints

Jekyll

  • ✓ Use front matter defaults
  • ✓ Leverage includes for reusability
  • ✓ Use Liquid filters for images
  • ✓ Keep logic out of templates
  • ✓ Use permalinks consistently

Performance Checklist

Optimize images to WebP with fallbacks
Lazy load below-fold images
Minify CSS and JS in production
Aim for 90+ Lighthouse score

14. Quick Reference

Color Variables

.text-memories
.bg-cool-as-a-cucumber
.text-off-the-cuff
.bg-pleased-as-punch

Key Includes

Mike Lister Photography logo </picture>

Mike Lister Photography

Plymouth, Devon & Cornwall

Capturing the stories that matter most. Based in Plymouth and serving across Devon and Cornwall.

We are committed to providing Plymouth with professional, excellent photography services across the city and the South West.

Buy with Confidence - Trading Standards Approved

Plymouth's only registered photography business with Trading Standards

Privacy Policy | Terms & Conditions | Cookies Policy

Devon Wedding Photography | Cornwall Wedding Photography

Get in Touch

Mike Lister Photography Professional photography services in Plymouth, Devon and Cornwall 9 Winsbury Court, Crownhill Plymouth Devon PL6 5JU 07815141779 hello@mikelisterphotography.co.uk Plymouth, Devon, Cornwall Wedding Photography, Commercial Photography, Drone Photography

Location

9 Winsbury Court, Crownhill
Plymouth, Devon PL6 5JU

View on Map

Payment & Trust

Accepted Payment Methods:

Visa Visa Stripe Stripe Bank Transfer
BACS

✓ Fully Insured & DBS Checked
Professional indemnity and public liability insurance. Over 11 years of experience.

© 2026 Mike Lister Photography. All rights reserved.

Beautifully capturing your story across Plymouth, Devon and Cornwall.

Mike Lister Photography: Professional wedding, drone, and commercial photography in Plymouth, Devon & Cornwall. Specialising in natural, candid wedding photography across Cornwall and Devon. Aerial photography and videography for properties and events. Commercial photography services for businesses. Based at 9 Winsbury Court, Crownhill, Plymouth PL6 5JU. Contact: 07815 141 779 or hello@mikelisterphotography.co.uk

Design System • Mike Lister Photography • Last updated: February 26, 2026

This is a living document. Update as the site evolves.

LET'S CHAT

Ready to Start Your Story?

Whether you're planning a wedding, need professional business photography, or want breathtaking aerial shots - I'm here to help bring your vision to life.

Get in Touch

I typically respond within 2 hours during business hours

What are you interested in? *

The more details you share, the better I can understand how to help you.

Your privacy matters. I'll only use your details to respond to your enquiry. No spam, no sharing with third parties. By submitting, you agree to our privacy policy.

Based in Plymouth • Serving Devon & Cornwall • UK-based photographer

Call Me

07815 141 779

Mon-Fri, 9am-5:30pm

Email Me

hello@mikelisterphotography.co.uk

Response within 2 hours