This document specifies the system requirements for barbershop-appointments, a website for a barbershop where customers can book appointments online. The product intent is a first-party web presence for the shop that lets a customer browse the shop, choose a service and an available time slot, and submit a booking online — without calling or visiting — and lets the barbershop owner review the appointments that were booked online so the chair schedule stays accurate.
The audience is twofold: customers of the barbershop (18–45, mostly mobile, choosing a barber by vibe and by the cut) who want to grab a slot before it goes, and the barber / shop owner who runs the shop and needs to know who is coming and when. The site is delivered as a custom web application with application-owned identity, a shared backend, and durable appointment records.
The current delivery is a single custom web application with a shared backend:
Actors are the two accepted human personas — Customer and Barber / Shop Owner — plus the application backend as a non-persona system actor that persists appointment records and enforces access to protected pages.
Narrow exclusions: this document does not add payment processing, customer messaging or notifications, staff/barber roster management, inventory or product sales, loyalty programs, or multi-location support. Nothing in the source authorizes those capabilities, and they are not inferred here.
The barbershop's website is the shop's own first-party surface. The public entry (Landing) is anonymously reachable and explains the shop and its online booking. Because a customer must privately own and resume their own booking state, and because a submitted booking is a commitment bound to the correct customer and must remain visible to the shop owner, the application owns identity: a customer establishes it once through self-service enrollment on Sign Up, and both customers and the barber / shop owner return through Login. Protected state — the booking flow, the confirmation, and the owner's appointment list — is unavailable until identity is established.
Current horizon: the Landing page, self-service enrollment, returning verification, the booking flow, the booking confirmation, and the owner's appointment review, all backed by durable appointment records. No future-horizon capabilities are specified in the source; none are added here.
Not applicable — no reference directive with content_source authority was supplied.
FR-1 — Barbershop website (explicit). As a visitor, I should reach a website for the barbershop so that I can learn about the shop and its services. Trigger: the visitor opens the site. Observable result: the Landing page presents the shop and its services. Access: anonymous. Failure / recovery: if the page fails to load, the visitor can reload. Continuation: the visitor can begin booking or go to Sign Up or Login.
FR-2 — Online appointment booking (explicit). As a Customer, I should book an appointment online through the website so that I secure a slot without calling or visiting. Trigger: the customer chooses to book. Input: a selected service and an available time slot. Observable result: the booking is submitted and accepted, and the appointment is recorded. Access: protected; the customer must be verified. Failure / recovery: if the chosen slot is no longer available or submission fails, the customer is told, the slot list refreshes, and the customer can choose another slot and resubmit. Continuation: the customer proceeds to Booking Confirmation.
FR-3 — Customer self-service enrollment (required_inference). As a Customer, I should establish my own identity before booking so that my booking is bound to me and I can return to it. Trigger: an unauthenticated customer begins booking. Input: enrollment details. Observable result: the customer's identity is established and protected booking state becomes reachable. Access: anonymous entry on Sign Up. Failure / recovery: invalid or incomplete input is reported per field and the form retains entered values; a failed enrollment request can be resubmitted. Continuation: the customer continues to Book Appointment.
FR-4 — Returning verification (required_inference). As a Customer or the Barber / Shop Owner, I should verify my identity on return so that I can reach my protected appointment state. Trigger: a returning customer or the owner opens Login. Input: credentials. Observable result: the customer reaches Book Appointment or Booking Confirmation; the owner reaches Appointments. Access: anonymous entry on Login; protected destinations remain unavailable until verification succeeds. Failure / recovery: incorrect credentials are reported without revealing which field was wrong, and the form can be resubmitted. Continuation: the actor proceeds to their protected destination.
FR-5 — Service and time-slot selection (required_inference). As a Customer, I should select a service and an available time slot so that I can submit a booking for the slot I want. Trigger: the verified customer is on Book Appointment. Input: a service chosen from the stacked service list and a time slot chosen from the available slots. Observable result: the running summary shows the selected service, time, and price. Access: protected, customer-only. Failure / recovery: if no slots are available for the chosen service, the customer is told and can choose another service. Continuation: the customer submits the booking.
FR-6 — Booking submission and acceptance (required_inference). As a Customer, I should submit my selected service and time slot so that my appointment is accepted and confirmed. Trigger: the customer submits the booking. Observable result: the appointment is accepted and recorded, and the customer is taken to Booking Confirmation showing the confirmed service, time, and price. Access: protected, customer-only. Failure / recovery: a slot taken between selection and submission is reported, the slot list refreshes, and the customer can pick another slot and resubmit; a failed submission is reported and the selection is retained. Continuation: the customer reviews the confirmation or starts another booking.
FR-7 — Durable appointment records (required_inference). As the system, I should persist submitted bookings so that they remain available for later review by the customer and the shop owner. Trigger: an accepted booking. Observable result: the appointment record persists with its customer, service, time slot, status, and price. Access: protected; readable by the owning customer and by the barber / shop owner. Failure / recovery: if persistence fails, the booking is not reported as accepted and the customer can resubmit. Continuation: the record appears on Booking Confirmation and on Appointments.
FR-8 — Owner appointment review (required_inference). As the Barber / Shop Owner, I should review the appointments booked online so that the chair schedule stays accurate. Trigger: the verified owner opens Appointments. Observable result: the list of booked appointments with customer, service, time, and status is shown. Access: protected, owner-only. Failure / recovery: if the list cannot be retrieved, the owner can retry. Continuation: the owner uses the list to know who is coming and when.
The creative direction is authoritative for this section. Muse: Jessica Walsh. Headline register: saturated swagger for the chair — a drop, not a form.
Color tokens (light mode):
| Role | Hex | Usage |
|---|---|---|
| Background | #FFE9D6 | Warm apricot-cream ground, ~55% of every screen |
| Surface | #FF3D7F | Hot pink primary action and section colour, large flat blocks, ~25% |
| Text | #141414 | Ink for all body copy and rules |
| Primary | #FF3D7F | Primary action colour |
| Accent | #C6F24E | Acid lime, single hot accent, ~10% — slot chips, confirmed state, selected time |
| Muted | #7A6A63 | Secondary labels, timestamps, disabled states |
No gradients on UI surfaces; gradients only inside staged prop imagery. Contrast: ink on apricot ≈ 14:1; ink on hot pink ≈ 5.4:1 (body copy on pink must be ink, never white at small sizes); ink on lime ≈ 15:1.
Typography:
-0.03em, sentence case, not all-caps. Hero at clamp(56px, 11vw, 168px) with line-height 0.88; section headings clamp(32px, 5vw, 72px). One word per headline may be flipped to Space Grotesk 700 italic in lime as an emphasis gesture.0.14em tracking, 12–13px.Shape language: Hard-edged colour fields with a small deliberate radius — panels and buttons 14px, slot chips 999px (pills), image frames 0px so photography reads as a printed poster crop. Thick 3px ink rules under section headers and around the booking summary. Sticker-like rotated badges (a lime "WALK-INS WELCOME" tag at -6°) sit on top of panels. No soft offset shadows — depth comes from flat colour overlap and a single hard 6px ink offset on primary buttons.
Layout: Poster grid, asymmetric and full-bleed. The landing page is three stacked colour fields: apricot hero, hot-pink service band, ink footer band. Content sits on a 12-column grid at 1280px with a 4-column gutter, collapsing to a single column at 375px with 20px side padding. The booking flow uses a two-panel split: left 5 columns is the running summary (service, time, price) pinned in ink on apricot; right 7 columns is the step content on hot pink. The service list is a stacked list of full-width rows with hairline ink rules — explicitly not a grid of cards. The owner appointment list is a table with colour-coded rows by status.
Imagery: Art-directed and staged, never stock: high-contrast flash-lit portraits of the shop's actual barbers and cuts shot against flat hot-pink or lime seamless; tight crops on clippers, straight razors, talc and tonic bottles arranged as surreal still lifes; one wide shot of the shop chairs in apricot light. Photography is cropped hard to the frame edge, printed-poster style, with occasional halftone treatment in ink. No generic "smiling man in barbershop" stock, no illustrated mascots, no 3D blobs.
Avoid: White or near-white page ground anywhere; blue, indigo or violet of any kind; gradient-blob heroes; Inter, Roboto, Poppins, Manrope, DM Sans or any neutral geometric sans for headings or body; a grid of identical rounded cards with soft shadows and hover-lift; white text on hot pink at body size; stock photography of smiling men in aprons; illustrated mascots or 3D blob characters; centred headline + subtext + single CTA hero composition; soft drop shadows for depth.
The public entry is a full-bleed apricot poster. A single flash-lit barber portrait is cropped hard at the right edge, bleeding off the viewport, occupying the right 45% and overlapping the type. The headline is set in Archivo Black at clamp(56px, 11vw, 168px), flush left, three stacked lines — BOOK / THE / CHAIR — with "THE" flipped to lime on a rotated lime block behind it, overlapping the line above and below. Beneath the headline sits a lime pill CTA BOOK A CUT with a hard 6px ink offset, and next to it a small ink-on-apricot line: Next free slot today · 4:30pm. A running marquee ticker in ink on a hot-pink band sits along the very bottom of the hero: SKIN FADES · HOT TOWEL SHAVES · BEARD TRIM · WALK-INS ·. No centred stack, no gradient, no blue button.
The concept recomposes only accepted content and controls: the shop identity, the service names, the booking call to action, and the next-available-slot indicator. It introduces no new behaviour, page, or destination.
Interaction Model: Animated Motion Tempo: expressive Hero Dimensionality: layered_2d
Landing Hero Motion Brief
cubic-bezier(0.16,1,0.3,1)), the three headline lines reveal word-by-word with a 40ms stagger, and the marquee ticker begins running service names and "WALK-INS WELCOME" along the bottom edge — the visitor's outcome is a composed poster frame with the booking call to action fully readable and ready.font-size: clamp(...) with its mobile size) to fit, and no other element may cover any part of them. Imagery, decoration and motion may be cropped, bled off an edge, rotated, overlapped or cut as the direction asks, as long as they cover no readable text or control. Moving and scrollable content (marquees, tickers, horizontally scrollable rows) may cross the viewport or container edge by design and is judged by whether it actually moves or scrolls and whether every item becomes fully readable as it passes. Under prefers-reduced-motion, a usable static arrangement must be provided — items wrap into rows or scroll horizontally so each item can be brought fully into view.prefers-reduced-motion, all wipes become instant, the ticker becomes a horizontally scrollable row of static items, and the stagger collapses to a single fade.No source-specified technology beyond the above was supplied; no additional services are introduced.
No completed page designs yet.
Completed design pages will appear here when they are ready to preview.
No completed page designs yet.
Completed design pages will appear here when they are ready to preview.
No comments yet. Be the first!