Project Deep Dive

Fence For Hire

Fence For Hire is a full-stack business website built for a fence installation company. It showcases the company's services and products, handles customer inquiries through a validated contact form, and is built with a clean component-based architecture designed to be maintainable and easily extended.

ReactTypeScriptExpressPostgreSQLDrizzle ORMshadcn/uiTailwind CSS

Site Walkthrough

Responsive Layout & Navigation

Fence Product Pages

The Brief

A local fence installation company needed a professional web presence — something that looked credible, communicated their services clearly, and made it easy for potential customers to reach out. The site needed to work well on mobile (most local service searches happen on phones), handle multiple fence product categories, and not require a CMS or database to maintain.

What It Does

Fence For Hire is a multi-page marketing and lead-capture SPA. Visitors can browse the company's background, explore six distinct fence product categories with individual detail pages, view a catalog, read testimonials, learn about financing options, and submit a contact inquiry. The navigation is fully responsive across mobile, tablet, and desktop breakpoints, including a dropdown submenu for the Fence Options section.

Key Features

  • Six fence product pages — each category (wood, vinyl, chain link, aluminum, split rail, farm/ranch) has a dedicated page with product details and imagery
  • Responsive 3-breakpoint header — the navigation restructures at mobile, tablet, and desktop widths with a Fence Options dropdown that's accessible on all screen sizes
  • Contact and quote form — collects name, phone, email, service type, and message using React `useState`, with HTML5 `required` validation on all required fields
  • shadcn/ui component library — Radix UI primitives for accessible dialogs, dropdowns, and interactive elements, fully customized to the brand's Navy and Gold palette
  • TanStack Query — data fetching layer ready for future API integration without rewiring the component tree
  • Tech Stack

    Client — React SPA with wouter routing

    The frontend is a Vite-built React SPA using `wouter` for client-side routing (not React Router). wouter was chosen for its minimal footprint — the full router is a few hundred bytes and has no peer dependencies. The route tree covers Home, About, FenceOptions, Catalog, Testimonials, Financing, Contact, and the six individual fence type sub-pages, all loaded as a single bundle with no SSR overhead.

    Component Architecture

    Every section of the site is a discrete component with a clear responsibility:

  • Header — 3-breakpoint layout (mobile hamburger, tablet condensed, desktop full nav), Fence Options dropdown with wouter `Link` navigation
  • ContactSection — controlled form with `useState` per field, plain HTML5 constraint validation on submit, no external validation library
  • FenceTypeCard — reusable card layout shared across all six product pages
  • Layout shell — Header + Footer wrapper applied to every route
  • Brand Identity Constraints

    All design decisions were constrained by the company's established brand: Navy `#1e3a7a` as the primary color and Gold `#fbbf24` as the accent. shadcn/ui made this straightforward — every component is unstyled at the source level, so applying the brand palette was a matter of configuring the CSS variables rather than fighting a predefined theme.

    Backend Structure

    The repo includes a lightweight Express server and a `shared/schema.ts` file with Drizzle and Zod table definitions for future persistence. The current deployed version uses in-memory storage (a `MemStorage` class backed by a JavaScript `Map`) because the contact lead requirements were scoped to a first phase — the architecture is ready to swap to a real database without touching the client or shared schema.

    What I Learned

    Building within a client's brand constraints is a different muscle than building for yourself. Every color choice, spacing decision, and copy tone had to serve the company's existing identity rather than my own preferences. The three-breakpoint responsive header — particularly the Fence Options dropdown behavior across all three layouts — was the most time-consuming piece technically, and getting it right on mobile without JavaScript hacks required thinking carefully about CSS specificity and Radix's dropdown primitive behavior.