Booking Platform · Full-Stack Frontend

Beauty by Amy

A complete React rebuild of a 4-page college project into a production booking platform — 5-step wizard, admin dashboard with full CRUD, dark mode, and a Framer Motion-driven motion system.

  • Year: 2024
  • Duration: 8 weeks
  • Team: Solo · Design + Engineering
  • Role: Designer & Frontend Engineer · Solo
5-step
Booking Wizard
4 tabs
Admin Dashboard
2 themes
Light + Dark
WCAG AA
Accessibility

Overview

Beauty by Amy started as a four-page vanilla HTML/CSS school project for an independent nail technician. v2.0 is a full rebuild into a production-ready React app with a 5-step booking wizard, a password-gated admin dashboard, dark/light theming, and a comprehensive motion system. The same brand, but engineered for an actual business to run on.

The problem

The original site looked like what it was — a course assignment. Static pages, no booking, no way for Amy to manage her schedule, no mobile parity. Inquiries lived in DMs and texts. There was no system, just a pretty wrapper around manual coordination.

The goal

Ship a real product. Public site that earns trust on first impression, a booking flow Amy's clients can complete on a phone in under two minutes, and an admin layer Amy can actually run her appointments from — all in one codebase, fully responsive, fully accessible.

Hypothesis

A mobile-first booking wizard with progressive disclosure, an admin dashboard built from the same component library, and a token-driven design system will turn a static portfolio site into something Amy can use as her actual business backend — without needing a dedicated booking SaaS.

Research

Participants: Amy (the client) + informal usability checks on the booking flow with 5 friends/family in the target demographic

Methods

  • UX audit of the v1 college site
  • Competitor review of Fresha, GlossGenius, Square Appointments
  • Service-business booking pattern research
  • Mobile-first usability principles
  • Framer Motion animation pattern study

Key findings

  1. 01

    The v1 was a 4-page static site — no booking system at all, no admin, nothing persistent

  2. 02

    Successful booking products use 3–5 step wizards, not single-page mega-forms

  3. 03

    Service businesses need an admin dashboard, not just a public site — bookings have to land somewhere

  4. 04

    Motion design carries premium perception: page transitions, spring physics, staggered reveals

  5. 05

    Dark mode is now a baseline expectation for portfolio-grade work

What the research told me

1

Two products, one codebase

A booking platform is really two apps — a public-facing site and an admin app. Building them from the same component library and design tokens kept the brand consistent and the build small.

2

Persistence without a backend

localStorage handles bookings, clients, and availability. Lets the demo work without infrastructure, while the architecture stays ready to swap in a real API.

3

Motion is part of the brand

Framer Motion isn't decoration — staggered reveals, spring buttons, page transitions are what makes the experience feel premium instead of generic.

4

Tokens travel further than CSS

Encoding brand color and spacing into Tailwind tokens meant dark mode, hover states, focus rings, and the entire admin layer all stayed on-brand without me re-deciding anything.

Design

Iteration

v1

Vanilla HTML/CSS — 4 static pages

User insight

"The college version had no booking, no persistence, no admin. Beautiful as a layout exercise, useless as a product. Every interaction was a phone call."

Design change

Decision: throw out the implementation, keep the brand. Restart in React with a real architecture: routing, context, persistence, and an admin layer from day one.

v2

React rebuild — wizard, no motion

User insight

"Got the 5-step wizard working with bare components. Functionally complete but felt mechanical — every page change was a hard cut. The brand promise was "premium", the experience felt like a form."

Design change

Layered Framer Motion across the app: page transitions with custom easing, staggered scroll reveals, spring physics on buttons, animated success state. Same logic, completely different feel.

v3

Admin dashboard + dark mode

User insight

"Public site shipping was only half the product. Without an admin layer, Amy still had to track bookings in a notebook. And dark mode had become a baseline expectation for portfolio work."

Design change

Built the password-gated admin app at /admin: Overview stats, Appointments CRUD, auto-built Clients view, Availability calendar. Wired Tailwind dark mode via class strategy with system-preference detection. Shipped.

Design system

Colour palette

  • brand-600 / primary CTA
  • brand-500
  • brand-400 / hover
  • warm-50 / page bg
  • warm-100 / alt sections
  • warm-900 / primary text

Typography

Playfair Display (display headings) + DM Sans (UI + body) — editorial serif for brand moments, neutral sans for everything functional

Key components

  • Atoms: Button (spring), Input, Badge, Card, NavLink
  • Booking: ServiceCard, DatePicker, TimeSlotGrid, ProgressStepper, SuccessState
  • Admin: StatTile, AppointmentRow, ClientCard, BlockedDateCalendar, AuthGate
  • Motion: page transitions (400ms cubic-bezier 0.22,1,0.36,1), staggered reveals via useInView, spring buttons, animated check-draw
  • Theming: light + dark mode via Tailwind class strategy with system-preference detection

Outcome

Shipped a deployed, production-grade React booking platform: 4 public pages, a 5-step booking wizard, a 4-tab admin dashboard with full CRUD, complete dark mode, and a documented animation system. Built on React 18 + Vite + Tailwind + Framer Motion. The original 4-page college project rebuilt as something Amy could plausibly run a business on.

What I learned

  1. 01

    A real product is the public site plus the admin layer. Building them in the same codebase from the same tokens is what keeps a solo build maintainable.

  2. 02

    Motion is brand. Framer Motion across page transitions, scroll reveals, and button springs is what separates a "site" from a "premium experience."

  3. 03

    localStorage is a legitimate persistence layer for portfolio and demo work. The architecture decision is to keep the data layer abstracted so swapping to a real API later is a one-file change.

Next case study

relocateMe

SaaS Dashboard · Product Design