HomeBound Aisha
Responsive business website for a home-based service provider
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
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,footerwith 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
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;
}
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.
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; }
}
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!');
});
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.
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
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