bright-ticket is a single-page ticket booking application. A visitor arrives on one page, sees the available ticket options, picks a ticket, completes the booking inline on that same page, and receives a booking confirmation — all without leaving the page or navigating to another destination.
The product intent is deliberately narrow: one page, one scroll, one booking flow. The app exists so that a Ticket Buyer can go from "browsing" to "booked" in a single continuous surface. There is no account system, no multi-page checkout, no separate confirmation screen, and no modal wizard. The booking step unfolds inline beneath the chosen ticket card, and the confirmation replaces that panel in place.
The audience is a broad, young, going-out audience booking live-event tickets. The surface is art-directed like a poster — saturated colour fields, chunky type, sticker-like elements — because a ticket is an object of desire, not a form field. Trust still matters at the booking step, but the page sells the night, not the checkout.
bright-ticket is delivered as a React frontend backed by a shared FastAPI backend process and a MariaDB database. The frontend renders exactly one page — Ticket Booking — which anonymously presents the product, lists the available ticket options, hosts the inline booking form, and shows the confirmation. The backend exposes the ticket catalog and the booking-creation API; MariaDB persists the ticket options and the created bookings so that a booking reference is durable and can be looked up after creation.
The entire product is one page. There is no navigation, no route change, no modal maze, and no second screen. Everything a Ticket Buyer does — reading the page, choosing a ticket, entering their details, confirming, and seeing their confirmation — happens on the single Ticket Booking page.
Access is anonymous. The page is publicly reachable with no sign-in, no account creation, and no identity verification. A booking is a one-shot transaction: the buyer supplies their name and email at the booking step, the backend records the booking against a generated booking reference, and the confirmation is shown inline. There is no returning-user state, no booking history page, and no account to manage — the single-page constraint and the absence of any source-backed identity requirement mean no application-owned login lifecycle is introduced.
The backend and database are delivery infrastructure, not additional product surfaces. They exist so that ticket options are served from a durable catalog and so that a confirmed booking produces a durable, referenceable record. No admin surface, no ticket-management UI, and no reporting destination are in scope.
Removed from scope
The single page of the application. It is one continuous scroll with four vertical regions: the hero band, the diagonal section divider, the ticket options row, and the inline booking/confirmation panel.
Information and state
Primary actions
Supporting actions
Domain entities
id, name, price, description, accent (colour field for the card).id, booking_reference, ticket_option_id, ticket_name, quantity, buyer_name, buyer_email, total_price, created_at.Component responsibilities
States
FR-1 — Single-page delivery (explicit) As a Ticket Buyer, I should reach the entire ticket booking experience on one page, so that I never have to navigate away to complete a booking.
FR-2 — Anonymous access (required_inference) As a Ticket Buyer, I should use the page without signing in or creating an account, so that I can book immediately.
FR-3 — Available ticket options presented (required_inference) As a Ticket Buyer, I should see the available ticket options on the page, so that I can choose one.
FR-4 — Select a ticket (required_inference) As a Ticket Buyer, I should select a ticket card, so that the booking step opens for that ticket.
FR-5 — Complete the booking inline (explicit) As a Ticket Buyer, I should enter my name, email, and quantity and confirm the booking on the same page, so that I complete the booking without leaving the page.
buyer_name, buyer_email, quantity, and the selected ticket_option_id.FR-6 — Booking confirmation shown on the page (required_inference) As a Ticket Buyer, I should see a confirmation on the page after booking, so that I know my booking succeeded and have a reference.
FR-7 — Durable booking record (required_inference) As the system, I should persist each confirmed booking with its reference, so that the confirmation shown to the buyer corresponds to a durable record.
Product context. A member of a broad, young, going-out audience looking for live-event tickets. They arrive on the page with anticipation — the moment before the doors open — and expect the page to feel like a night out worth photographing, not a checkout form.
Primary goal. Book a ticket and walk away with a confirmed booking reference, without leaving the page.
Distinct accepted responsibilities.
Relevant inputs and decisions. Which ticket to pick; how many; the name and email to book under. The buyer decides when to commit by pressing the single pink confirm button.
Interactions with other participants. None — the Ticket Buyer is the only active human persona. The backend and database act on the buyer's behalf but are not human participants.
Observable success. A lime receipt block on the page showing the ticket name, quantity, and booking reference, with a "Book another ticket" control available.
Failure and recovery.
The creative direction is authoritative for this section. The muse is Jessica Walsh; the headline is "YOUR NIGHT, YOUR SEAT".
Colour tokens (light mode)
| Role | Hex | Usage |
|---|---|---|
| Background | #FFE9D6 | Warm peach-cream page field (~55%) |
| Surface | #FFF6EC | Light ticket cards and booking panel |
| Text | #1B0F2B | Deep aubergine-ink for all readable text (~12%) |
| Primary | #FF4D8D | Hot-pink hero band and primary CTA (~25%) |
| Accent | #C6FF3D | Acid lime for selected states, booking-step marker, sticker highlights (~8%) |
| Muted | #7A5C6E | Muted plum for secondary labels |
Lime is never placed behind body text — it is a sticker accent only.
Typography
clamp(52px, 11vw, 148px); hero subhead clamp(22px, 2.6vw, 34px); section header clamp(34px, 5vw, 64px); ticket name 24/22/20; price 40/32/28; body 17/16/16 with 1.55 line-height; micro-label 12px caps with 0.14em tracking.Shape language
Layout
Imagery
Accessibility
prefers-reduced-motion, all looping motion pauses and a static composed arrangement is shown.The public entry is the Ticket Booking page itself, and its signature is the full-bleed hot-pink hero band that fills the first screen edge to edge.
clamp(52px, 11vw, 148px) in ink #1B0F2B, stacked in three flush-left lines across roughly seven columns.The gesture continues down the page: the diagonal lime band cuts across between hero and ticket list, the ticket cards are chunky sticker-like objects with hard offset shadows and distinct colour fields, the booking panel unfolds inline beneath the chosen card, and the confirmation lands as a lime sticker-style receipt with a single bounce.
Interaction Model: Animated Motion Tempo: expressive Hero Dimensionality: layered_2d
Landing Hero Motion Brief
NFR-1 — Single-page constraint (explicit) The application must be delivered as exactly one page. No additional routes, modals, or wizards may be introduced.
NFR-2 — Anonymous access (required_inference) The page must be reachable without authentication. No login, sign-up, or identity verification may gate the booking flow.
NFR-3 — Responsive readability (explicit, from creative direction) Headlines, wordmarks, labels, numbers, cards' text, and controls must stay entirely inside the viewport and their container at 375px, 768px, and 1280px, wrapping or scaling to fit. No other element may cover any part of them.
NFR-4 — Reduced motion (explicit, from creative direction)
All looping motion must pause under prefers-reduced-motion, leaving a usable static arrangement. Scrollable rows must allow every item to be brought fully into view.
NFR-5 — Durable booking state (required_inference) Confirmed bookings must be persisted in MariaDB with a unique booking reference so that the confirmation shown to the buyer corresponds to a durable record.
NFR-6 — Error recovery (required_inference) Catalog and booking failures must surface inline errors with retry controls that preserve entered form values.
NFR-7 — Contrast (basic_default) Text must meet WCAG AA contrast against its background; lime must never be placed behind body text.
docker-compose.yml with the frontend, backend, and database services as provisioned. No additional services are required for the current scope.
LIVE EVENTS · ONE PAGE · INSTANT TICKET
Pick a ticket above and your details form opens right here.

LIVE EVENTS · ONE PAGE · INSTANT TICKET
Pick a ticket above and your details form opens right here.
No comments yet. Be the first!