Service business website with booking requests
A prerendered website for an original fictional bicycle workshop: rate card with durations and prices, service detail, mechanics, location and hours, FAQ, sample-labelled reviews and a four-step booking REQUEST flow with availability, validation, conflict handling and an honest not-sent result.
Creator ($9 a month) includes up to 20 new premium families a billing month (5 in any 24 hours). Already a member? Open your library.
- Version
- 1.0.0
- Platforms
- Website
- Framework
- vite-react
- Archive
- 1.6 MB 94 files
Screens from the build
(open full size)
(open full size)
(open full size)
(open full size)
(open full size)
(open full size)What it does
- compare services by bike type with prices and durations
- read a service detail and start a request with it preselected
- request a booking: service → date & time from availability → details → review
- recover from validation errors, unavailable days/slots and a slot taken on re-check
- move back and forward (browser or Change links) without losing the draft
- see an honest result: request prepared, not sent, never 'confirmed'
- find the workshop: address, hours, directions, phone
Routes and screens
homeHero with technical drawing and sample next opening, contact strip, rate card, how booking works, mechanics, sample reviews, visit, FAQ, closing CTAservicesRate card filtered by bike type (URL state)service-detailService description, price/duration/suits spec, included and not included, mechanics, questions, request CTAteamMechanics and specialitiesvisitAddress, schematic map, hours with today highlighted, directions, accessibilityfaqGrouped native-disclosure FAQbook-serviceStep 1: bike type and servicebook-timeStep 2: day and time from availability; closed/full days and booked/too-late slots; conflict messagebook-detailsStep 3: contact details with validation and error summarybook-reviewStep 4: review with Change links and an explicit request/no-payment/not-connected explanationbook-sentResult: request prepared — not sent (template) or received — not yet confirmed (connected adapter)not-found404 page with a real 404 status in preview
States covered
- Loading
- Error
- Empty
- Validation
- Unavailable
- Conflict
- Redirect incomplete step
- Not connected integration
- Not found
- Reduced motion
Stack and versions
| vite | 8.3.1 |
|---|---|
| react | 19.3.0 |
| react-dom | 19.3.0 |
| react-router | 8.4.0 |
| typescript | 7.0.2 |
| vitest | 5.0.2 |
| @playwright/test | 1.56.1 |
| @axe-core/playwright | 4.13.0 |
| node | 22.22.2 (tested); >=20.19 required |
Commands:
| install | npm ci |
|---|---|
| dev | npm run dev |
| build | npm run build |
| preview | npm run preview |
| test | npm test |
| typecheck | npm run typecheck |
| e2e | npx playwright install chromium && npm run build && npm run e2e |
| perf | npm run build && npm run preview & npm run perf |
Tested
| Check | Platform | Tool | Result | Date |
|---|---|---|---|---|
| unit and component tests (34): availability, state machine, adapter, full flow, conflict, persistence, pages | Node | vitest 5.0.2 + Testing Library (jsdom) | Pass | 2026-09-26 |
| e2e: every route, keyboard-only booking, browser back/forward + reload, Change links, conflict, deep-link guard, prerender without JS, 404 status, screenshots (53 tests) | Website | Playwright 1.56.1, Chromium 141 | Pass | 2026-09-26 |
| axe WCAG 2.2 AA: 11 routes plus booking steps with errors and result, at 360 and 1280 px, zero violations | Website | @axe-core/playwright 4.13.0 | Pass | 2026-09-26 |
| lab LCP/CLS, throttled mobile profile, median of 3 (home and service detail) | Website | Playwright Chromium + CDP throttling (scripts/perf.mjs) | Pass | 2026-09-26 |
| fresh-copy reproduction from packaged zip in an empty temp dir (npm ci, npm run build, npm test) | Node | npm 10.9.7 / node 22.22.2 | Pass | 2026-09-26 |
| Safari/WebKit and Firefox rendering | Website | not run | PendingNot run yet | — |
1 check still pending. Pending means it hasn't been run yet, not that it passed.
Not included
- No booking system, calendar or diary: availability is deterministic SAMPLE data (src/booking/availability.ts); implement AvailabilitySource against your diary
- No submission backend: the template BookingAdapter re-checks the sample slot and returns 'not-connected' — nothing is sent; implement BookingAdapter to POST to your server
- No payments or deposits; the copy states pay on collection
- No email/SMS confirmations; the workshop confirms manually once connected
- Reviews are clearly labelled template samples; replace with real platform reviews (source, date, at least one below top score)
- No analytics, cookies or third-party requests; the booking draft lives in sessionStorage for the current tab only
- Prerendered HTML is generated at build time; hosts must serve dist/<path>/index.html and dist/404.html
Each boundary comes with instructions for adding it in docs/INTEGRATION-BOUNDARIES.md.
Known limitations
- Business, people, address, phone (UK drama range) and reviews are fictional samples
- Sample availability is generated from the date and does not reflect real bookings
- Booking steps render client-side (they depend on the tab's draft); they require JavaScript, and a phone number is offered instead
- Tested in Chromium only; WebKit/Firefox not yet verified
- Light theme only (no dark mode)
Licence
Use in unlimited end products incl. client/commercial; no resale/redistribution as a template, kit or dataset; no ML training. Survives cancellation for delivered versions.
Full terms: Motif template licence. Open-source parts keep their own licences (licenses.json, id lic-premium-service-booking-1-0-0).
Ask your agent
Use Motif to activate the premium-service-booking template and download it. Then adapt it for a neighbourhood bakery: replace the content and imagery, keep the design tokens and every state in docs/STATE-MATRIX.md, and run check_design_contract before you finish.Motif guides applied
web-site-type-local-business · web-ref-local-service-and-builder-sites · web-productized-service-business-structure · web-services-offer-list-section · web-hero-booking-and-quote-panels · web-archetype-travel-hospitality-and-booking · web-how-it-works-numbered-steps · web-inline-conversion-steps · web-form-labels-and-layout · web-inline-validation-and-error-recovery · web-faq-accordion-section-build · web-aggregate-rating-and-review-cards · web-anti-testimonial-card-row · web-anti-fake-urgency-and-dark-patterns · web-directory-and-location-grids · web-grid-line-and-dot-pattern-textures · web-flat-color-block-composition · web-cta-full-bleed-color-band · web-focus-indicators-and-keyboard · web-mobile-navigation · web-seo-semantic-structure-and-metadata · web-font-loading-without-shift · web-core-web-vitals-targets · web-semantic-color-tokens · web-contrast-wcag-and-apca · web-type-scale-and-measure · motion-reduced-motion-strategy
Archive
SHA-256 a9ca08a0c6216c9f21939eedca295f5ef1d9ef814c752b3b9da70b9f7a22c019