2023 Web Development GitHub ↗

Overview

HomeBound Aisha is a multi-page responsive website delivered as a real client project for a home-based cleaning and domestic service provider. The site presents the business professionally across four pages: a landing page with a hero section and service highlights, a dedicated services page with detailed listings and pricing tiers, an about page establishing trust through the owner's story and credentials, and a contact page with a validated enquiry form. The layout was engineered mobile-first, meaning base styles target small screens and progressive enhancements are layered on at wider breakpoints. The project earned 4 GitHub stars and demonstrated a complete client delivery workflow from brief to deployed product on GitHub Pages.

Architecture

graph TD subgraph Pages["Pages"] A["index.html
Hero + Service Highlights"] B["services.html
Full Service Listings"] C["about.html
Owner Story + Trust Signals"] D["contact.html
Enquiry Form"] end subgraph CSS["Stylesheets"] E["style.css
Variables · Layout · Components"] F["responsive.css
Media Queries · Breakpoints"] end subgraph JS["JavaScript"] G["main.js
Form Validation · Smooth Scroll · Mobile Menu"] end subgraph Shared["Shared Components (CSS classes)"] H["nav — .nav · .nav-links · .nav-mobile-toggle"] I["footer — .footer · .footer-links"] end A --> E B --> E C --> E D --> E E --> F A --> G D --> G A --> H B --> H C --> H D --> H A --> I B --> I C --> I D --> I style A fill:#1a1a2e,stroke:#00d4ff,color:#e0e0e0 style B fill:#1a1a2e,stroke:#00d4ff,color:#e0e0e0 style C fill:#1a1a2e,stroke:#00d4ff,color:#e0e0e0 style D fill:#1a1a2e,stroke:#00d4ff,color:#e0e0e0 style E fill:#181818,stroke:#1e1e1e,color:#888 style F fill:#181818,stroke:#1e1e1e,color:#888 style G fill:#181818,stroke:#1e1e1e,color:#888 style H fill:#181818,stroke:#1e1e1e,color:#888 style I fill:#181818,stroke:#1e1e1e,color:#888

Tech Stack

  • HTML5 — Semantic elements: nav, main, section, article, footer with ARIA labels throughout
  • CSS3 — Custom properties (variables), Flexbox for nav and card rows, CSS Grid for service and testimonial layouts
  • Responsive Design — Mobile-first base styles with @media (min-width) breakpoints at 480 px, 768 px, and 1024 px
  • Vanilla JavaScript — Contact form validation, smooth scroll via scrollIntoView, mobile navigation toggle
  • GitHub Pages — Static hosting with custom domain support

Build Process

1
Requirements & Design System

Gathered client brief: services offered, target audience (residential households), geographic focus, and preferred aesthetic. Defined a CSS variable design system — color palette (--color-primary, --color-accent, --color-bg), font stack, and spacing scale — so all four pages share a consistent visual identity.

/* style.css — design tokens */
:root {
  --color-primary: #2c6e49;
  --color-accent:  #80b918;
  --color-bg:      #fafafa;
  --color-text:    #1a1a1a;
  --font-body:     'Inter', sans-serif;
  --space-md:      1.5rem;
  --space-lg:      3rem;
}
2
Semantic HTML5 Markup

Each page was structured with proper landmark elements — <nav aria-label="Main navigation">, <main>, named <section aria-labelledby>, and <footer>. Service cards used <article> to give screen readers meaningful document structure. Heading hierarchy was enforced: one h1 per page, h2 for sections, h3 for cards.

3
Mobile-First CSS

Base styles target a single-column, small-screen layout. Progressive enhancements at each breakpoint add columns and larger spacing. BEM-style class names (.service-card, .service-card__title, .service-card--featured) eliminate specificity conflicts between base and responsive overrides.

/* responsive.css */
/* Base: single column */
.services-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }

@media (min-width: 480px) {
  .services-grid { grid-template-columns: repeat(2, 1fr); }
}

@media (min-width: 768px) {
  .services-grid { grid-template-columns: repeat(3, 1fr); gap: 1.5rem; }
}

@media (min-width: 1024px) {
  .services-grid { gap: 2rem; }
}
4
JavaScript Interactivity

Three behaviours were implemented in main.js: (1) Mobile menu toggle — adds/removes .is-open class on the nav drawer, trapping focus inside when open. (2) Smooth scroll — document.querySelectorAll('a[href^="#"]') with scrollIntoView({ behavior: 'smooth' }). (3) Contact form validation — checks required fields, validates email format with a regex, and shows inline error messages before allowing submission.

// main.js — form validation excerpt
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

form.addEventListener('submit', (e) => {
  e.preventDefault();
  let valid = true;
  if (!nameInput.value.trim()) { showError(nameInput, 'Name is required'); valid = false; }
  if (!emailRegex.test(emailInput.value)) { showError(emailInput, 'Valid email required'); valid = false; }
  if (valid) showSuccess('Message sent — we will be in touch!');
});
5
Cross-Browser Testing & Validation

Tested in Chrome, Firefox, Safari, and Edge. Ran HTML through the W3C Markup Validation Service and CSS through the W3C CSS Validator — resolved all errors and warnings. Verified mobile rendering on both Android and iOS using browser DevTools responsive simulation and physical device testing.

6
Deployment to GitHub Pages

Pushed to the main branch of the GitHub repository. Enabled GitHub Pages from repository settings, selecting main as the source branch. The site became live at the auto-generated github.io subdomain. Verified all relative asset paths resolved correctly in the deployed environment.

User Interaction Flow

flowchart LR A["User Loads Page"] --> B["HTML Parsed & Rendered"] B --> C["CSS Applied\nMobile-First Base Styles"] C --> D["JS Initialises\nMenu · Scroll · Form Listeners"] D --> E{"User Action"} E -->|"Navigates"| F["Smooth Scroll\nto Section"] E -->|"Opens Mobile Menu"| G["Nav Drawer Opens\nFocus Trapped"] E -->|"Submits Contact Form"| H["JS Validates Fields"] H -->|"Invalid"| I["Inline Error\nMessages Shown"] H -->|"Valid"| J["mailto: Opens\nor Success Message"] I --> H J --> K["User Sees\nConfirmation"] style A fill:#1a1a2e,stroke:#00d4ff,color:#e0e0e0 style B fill:#181818,stroke:#1e1e1e,color:#888 style C fill:#181818,stroke:#1e1e1e,color:#888 style D fill:#181818,stroke:#1e1e1e,color:#888 style E fill:#1a1a2e,stroke:#00d4ff,color:#e0e0e0 style F fill:#181818,stroke:#1e1e1e,color:#888 style G fill:#181818,stroke:#1e1e1e,color:#888 style H fill:#1a1a2e,stroke:#00d4ff,color:#e0e0e0 style I fill:#181818,stroke:#1e1e1e,color:#888 style J fill:#1a1a2e,stroke:#00ff88,color:#e0e0e0 style K fill:#1a1a2e,stroke:#00ff88,color:#e0e0e0

Challenges & Solutions

CSS Specificity Conflicts on Responsive Overrides. Adding media query overrides to flat class names caused specificity battles where mobile styles leaked into desktop layouts and vice versa. The solution was adopting BEM-style naming (.service-card, .service-card__title) and keeping all responsive rules in a separate responsive.css file, which enforced a clear override order and made the responsive layer easy to audit in isolation.

Contact Form Without a Backend. The client needed a working contact form but the site is hosted statically on GitHub Pages with no server. The solution combined a mailto: action attribute on the form (which opens the user's email client pre-populated) with JavaScript-driven client-side validation and a confirmation message. For a more robust no-backend solution, the form was architected to be easily swapped for a Formspree or Netlify Forms endpoint in future.

What I Learned

  • How to structure a genuine client project from brief through delivery, including managing scope and collecting feedback iteratively
  • Mobile-first CSS methodology and why starting from small screens produces cleaner, less overridden stylesheets than the reverse
  • The value of BEM naming conventions for preventing specificity conflicts in multi-file CSS projects
  • Implementing accessible navigation: ARIA labels, focus management in modal/drawer patterns, and keyboard navigation
  • The limitations of static hosting for form handling and the patterns available to work around them
  • W3C HTML and CSS validation as a quality gate before deployment
HTML5 CSS3 JavaScript Responsive Client Project GitHub Pages