beauty-salon is a modern appointment booking website for a neighbourhood beauty salon. Its product intent is to let salon customers browse the salon's services and prices, check available appointment dates and time slots, select a service, and book an appointment by entering their name, phone number, and email — then see a booking confirmation. In parallel, salon staff must be able to review customer appointments and inspect each appointment's details (customer name, selected service, date, and time).
The audience is twofold:
The website must be simple, modern, mobile friendly, and easy to use, with a UI design that is modern, attractive, and innovative.
The current delivery is a first-party web application with a public customer-facing booking surface and a protected staff-facing appointment review surface, backed by a shared backend that persists services, availability, and appointment records.
Actors:
Accepted behavior: service and price browsing; availability browsing; service selection and booking with name/phone/email capture; booking confirmation; staff appointment list; staff appointment detail review.
Ownership: all customer and staff surfaces are first-party application pages. The application owns identity for staff access to shared durable appointment records; customers book anonymously without an account.
Narrow exclusions: no payment processing, no customer account creation or login, no appointment rescheduling or cancellation, no notifications/reminders, no staff editing of appointments, and no analytics or reporting beyond the appointment list and detail views. These are not part of the accepted current scope.
The product is a booking website, not a salon management system. Its delivery boundary is deliberately narrow: a customer can discover what the salon offers, see when it is free, commit to a slot with contact details, and receive a confirmation; staff can see what has been booked and read the details of each booking.
Access ownership follows the accepted journeys. The customer journey is anonymous and public — browsing services, availability, booking, and confirmation require no account, because the customer's commitment is captured through the name, phone number, and email they enter at booking time. The staff journey requires application-owned identity: staff must be provisioned or invited before first access and must authenticate when returning, because the appointment records are shared, durable, and must remain bound to the correct salon. The Login surface is the anonymous entry boundary that establishes staff access; the Appointments and Appointment Details surfaces are protected and are only reachable once staff identity is established.
Everything else in the current scope is first-party application UI. There are no provider-owned or external destinations in the accepted current scope, and no headless-only delivery. Future ideas (payments, reminders, rescheduling) are explicitly out of current scope and are not represented in any current page or acceptance criterion.
Not applicable — no reference directive in this project declares content_source, so no source content inventory is produced.
FR-1 — Browse services and prices (explicit) As a Customer, I should view the salon's services and prices so that I can decide what to book.
FR-2 — View available appointment dates and time slots (explicit) As a Customer, I should view available appointment dates and time slots so that I can pick a time that suits me.
FR-3 — Select a service and book an appointment (explicit) As a Customer, I should select a service and book an appointment so that I secure a slot at the salon.
FR-4 — Enter name, phone number, and email while booking (explicit) As a Customer, I should enter my name, phone number, and email while booking so that the salon can identify and contact me about my appointment.
FR-5 — View a booking confirmation after successfully booking (explicit) As a Customer, I should view a booking confirmation after successfully booking an appointment so that I have a record of what I booked.
FR-6 — View customer appointments (explicit) As Salon Staff, I should view customer appointments so that I know what the salon has booked.
FR-7 — See appointment details (explicit) As Salon Staff, I should see appointment details such as customer name, selected service, date, and time so that I can prepare for and run the appointment.
FR-8 — Staff provisioning and first access (required_inference) As Salon Staff, I should receive an invitation or provisioning before my first access so that I can reach the shared appointment records.
FR-9 — Staff returning authentication (required_inference) As Salon Staff, I should authenticate when returning to review appointments so that the shared appointment records remain bound to the correct salon.
FR-10 — Persisted booking and appointment records (required_inference) As a Customer and as Salon Staff, I should have booking data and appointment records persisted so that confirmation and staff review remain available.
FR-11 — Simple, modern, mobile-friendly, easy-to-use website (explicit) As a Customer and as Salon Staff, I should use a website that is simple, modern, mobile friendly, and easy to use so that booking and review are fast on any device.
FR-12 — Modern, attractive, innovative UI design (explicit) As a Customer and as Salon Staff, I should experience a modern, attractive, and innovative UI design so that the salon feels premium and current.
Product context. A salon client booking on her phone between other tasks. She arrives at the site without an account and expects to move from curiosity to a confirmed appointment quickly, without a signup wall.
Primary goal. To secure a salon appointment at a time that suits her, for a service she has chosen with full knowledge of its price.
Distinct accepted responsibilities. She browses the salon's services and prices; she views available appointment dates and time slots; she selects a service and books an appointment; she enters her name, phone number, and email while booking; and she views a booking confirmation after a successful booking. She is the sole initiator of the booking lifecycle and the sole recipient of its confirmation.
Relevant inputs or decisions. Which service to book; which date and time slot to take; her name, phone number, and email. Her key decision is the commitment to a specific slot, made against the visible price and availability.
Interactions with other accepted participants. She does not interact with Salon Staff directly. Her booking creates the durable appointment record that Salon Staff later review, so her submitted name, service, date, and time are the exact facts staff see.
Observable success. A receipt-style confirmation panel showing her booking reference and her name, service, date, and time.
Product context. A member of the salon team who needs to know what the salon has booked and to read the details of each appointment. Their working context is a dense, scannable list on a dark ground, not a marketing surface.
Primary goal. To see the salon's booked appointments and the details of each one clearly enough to prepare for and run the day.
Distinct accepted responsibilities. They view customer appointments as a list, and they see appointment details — customer name, selected service, date, and time. They are provisioned or invited before first access and authenticate when returning, because the appointment records are shared and durable.
Relevant inputs or decisions. Which appointment to open from the list. Their decision is which appointment to inspect next; they do not create, edit, or cancel appointments in the current scope.
Interactions with other accepted participants. They never interact with the Customer directly. They consume the record the Customer created, and the accuracy of that record depends entirely on the Customer's submitted name, phone number, email, service, date, and time.
Observable success. A ruled appointment list with a fixed left time column, and a detail view showing the customer name, selected service, date, and time as ruled label/value pairs.
Muse and headline. Tobias van Schneider — Editorial swagger for a beauty salon: oversized type, one hot accent, zero pastel clichés.
Mode. Light mode is the default for all customer surfaces. The staff surfaces (Appointments, Appointment Details) use the inverted dark treatment.
Colour tokens (light mode):
| Role | Hex | Usage |
|---|---|---|
| Background | #F4F1EC | Warm bone paper; carries roughly 60% of every screen |
| Surface | #FFFFFF | Cards, the booking form panel, the confirmation receipt — "paper on paper" |
| Text | #12100E | Body text |
| Primary | #12100E | Solid black buttons — never blue |
| Accent | #E0413A | Vermilion; at most twice per screen — active date/time slot, price figure, one hairline rule under a section title |
| Muted | #8A837A | Labels, captions, disabled slots |
Colour tokens (dark staff view):
| Role | Hex | Usage |
|---|---|---|
| Ground | #12100E | Staff view background |
| Text | #F4F1EC | Staff view text |
| Accent | #E0413A | Vermilion, unchanged |
| Panel | #1C1917 | Demoted white cards |
| Border | #2E2A26 | Hairline borders |
Typography:
-0.03em tracking, 0.92 line-height, always sentence case — never all-caps.+0.18em tracking.0.92 for display, 1.55 for body.Shape language. Sharp corners everywhere: 0px radius on buttons, cards, inputs, and images. Structure comes from 1px hairlines in #12100E at 20% opacity and from solid black rules running the full width of a section. The only softness is photographic. Buttons are rectangles with generous 18px/28px padding, no shadow, inverting to vermilion on hover/active. Inputs are underline-only fields with a 1px base rule that thickens to 2px black on focus and turns vermilion on a completed required field.
Spacing rhythm. Asymmetric 12-column editorial grid with a deliberately empty left margin: content starts at column 2 on desktop and column 1 on mobile, so headlines feel off-centre and intentional. Sections alternate full-bleed image band / narrow text column / full-bleed image band. Mobile collapses to a single column with display type scaling down but never centring.
Imagery style. Large-scale editorial photography, cropped hard and bled off the viewport edge — a close crop of a finished blow-dry, a hand holding scissors mid-cut, a nape and shoulder line. Images are desaturated to near-monochrome with a warm lift so vermilion is the only saturated colour on the page. Service thumbnails are square 1:1 crops at 240px, sharp-cornered, sitting flush against the ruled list. No stock-smiling-receptionist photos, no pink gradient blobs, no illustrated avatars.
Avoid. Pink, blush, lavender, or pastel gradient backgrounds; rose-gold metallic treatments; frosted-glass panels; soft drop shadows; 16–24px rounded cards; centred headline + subtext + blue button hero compositions; Inter, Roboto, Poppins, or Montserrat for headings; grids of identical hover-lift service cards with icon-in-a-circle; full-colour lifestyle photography with smiling models facing camera; blue or indigo anywhere in the interface, including focus rings and links; bouncy or springy micro-interactions on slot selection and form steps.
The editorial price sheet that becomes a booking.
The public entry is a full-height asymmetric split, not a centred SaaS hero. On desktop, the left 7 columns carry a 128px Playfair Display headline stacked over three lines — "Book the / version of you / you keep postponing." — with the first line indented one column for deliberate asymmetry, a 40ch intro paragraph beneath it, and a row holding a solid black "Book an appointment" button plus a hairline-underlined "See services & prices" link. The right 5 columns carry a single full-bleed monochrome salon photograph running edge-to-edge and off the top and right of the viewport, with a vermilion 6px vertical rule sitting in the gutter between type and image. A thin ticker line at the very bottom of the hero lists today's opening hours and the next available slot in 11px all-caps — real information, not decoration.
The signature move carries through the whole booking lifecycle: the services list is a ruled editorial price sheet rather than a grid of cards, with hairline-separated rows where hovering crossfades a square thumbnail in a fixed left slot instead of lifting the row. A sticky booking rail — a 1px-ruled bar docking to the bottom on mobile and the right edge on desktop — always shows the currently selected service, its price in vermilion, and the primary black CTA, so the choice is never lost while scrolling dates and times. Time slots are a hard-edged typographic grid of 0-radius rectangles in tabular numerals that fill solid black on select and vermilion on confirm, with unavailable slots struck through in warm grey rather than greyed out. The confirmation is a receipt: a white sharp-cornered panel on bone ground with a perforated hairline top edge, the booking reference in large Playfair Display, and the customer's name, service, date, and time stacked as ruled label/value pairs.
On mobile the image becomes a 40vh band beneath the headline, the headline drops to 56px and wraps to four lines, and the CTA row stacks full-width.
Interaction Model: Static Motion Tempo: restrained Hero Dimensionality: flat
Landing Hero Motion Brief
cubic-bezier(0.16,1,0.3,1), staggered 60ms per line; the photograph and the vermilion rule are already composed in the first frame. The outcome is a poster-like first frame that resolves into readable type without any element moving the layout.prefers-reduced-motion, all reveals become plain opacity fades at 0ms delay and the slot fill is instant.NFR-1 — Mobile-friendly and easy to use (explicit)
The website must be simple, modern, mobile friendly, and easy to use. Readable text and controls stay whole at every viewport — headlines, wordmarks, labels, numbers, card text, and controls stay entirely inside the viewport and their container at 375px, 768px, and 1280px, wrapping or scaling (for example font-size: clamp(...) with its mobile size) to fit, with no other element covering any part of them. Imagery, decoration, and motion may be cropped, bled off an edge, rotated, overlapped, or cut as the creative direction asks, as long as they cover no readable text or control. Rationale: explicit hard constraint in the authoritative user evidence.
NFR-2 — Modern, attractive, innovative UI design (explicit) The UI design must be modern, attractive, and innovative, expressed through the editorial direction in Section 6. Rationale: explicit hard constraint in the authoritative user evidence.
NFR-3 — Durable persistence (required_inference) Booking data and appointment records must be persisted so that confirmation and staff review remain available after the booking session ends. Rationale: required to make the accepted confirmation and staff review journeys executable.
NFR-4 — Protected staff access (required_inference) The Appointments and Appointment Details surfaces must only be reachable through an established staff session; the Login surface is anonymously reachable and protected state remains unavailable until identity is established. Rationale: required to keep shared durable appointment records bound to the correct salon.
NFR-5 — Reduced-motion support (explicit, from creative direction)
Under prefers-reduced-motion, all reveals become plain opacity fades at 0ms delay and the slot fill is instant. Rationale: accessibility requirement carried by the authoritative creative direction.
NFR-6 — No blue or indigo (explicit, from creative direction) Blue or indigo must not appear anywhere in the interface, including focus rings and links. Rationale: explicit constraint in the authoritative creative direction.
Assumptions
Constraints
Out of current scope: payment processing, customer accounts, appointment rescheduling or cancellation, notifications and reminders, staff editing of appointments, and analytics or reporting beyond the appointment list and detail views.
#E0413A, used at most twice per screen.
A neighbourhood salon for cut, colour and blow-dry. See the price sheet, pick a slot that fits around everything else, and hold it with your name and number.

A neighbourhood salon for cut, colour and blow-dry. See the price sheet, pick a slot that fits around everything else, and hold it with your name and number.
No comments yet. Be the first!