SeatMap
ImplementedVenue seating chart as a CSS-grid of seat buttons: sections → rows → seats, five seat statuses (available / held / sold / blocked / inaccessible) driving color PLUS non-color cues (dashed border = held, dotted = blocked, strikethrough = sold/inaccessible). Edit mode toggles a controlled selection through selectedSeats + onSeatSelect; view mode renders read-only. Pair with SeatMapLegend (tier legend) and SeatPicker (capped, checkout-oriented picker) — SeatPicker reuses this component's seat types.
components/organisms/SeatMap/SeatMap.tsxVenue seating chart — sections → rows → seats with five statuses (available / held / sold / blocked / inaccessible) carrying both color and non-color cues.
SeatMap
design-system
SeatMap preview and API reference.
Seat map
Orchestra
Props
SeatMap
eventIdstring—Event id — echoed to `data-event` for analytics/event delegation.
venueIdstring—Venue id — echoed to `data-venue`.
sectionsSeatSection[]—Sections → rows → seats to render (bounded 1–50 sections in practice).
mode"view" | "edit"—View renders read-only; edit makes eligible seats toggleable buttons.
selectedSeatsstring[][]Controlled selected seat ids (edit mode). Drives aria-pressed/selection ring.
onSeatSelect(seatIds: string[]) => void—Emits the next selected-id array when an eligible seat is toggled in edit mode. Sold/blocked seats and view mode never fire it.
onSeatUpdate(seatId: string, updates: Partial<Seat>) => Promise<void> | void—RESERVED for per-seat edit tools — accepted for forward-compatibility but NOT yet wired (edit mode only toggles selection today).
toolsSeatMapTool[]—RESERVED for the edit-tool palette (select | paint | block | label) — accepted for forward-compatibility but NOT yet wired.
locale"fr" | "en"'en'Localizes the built-in aria-label templates and status words (Row/Rang, Seat/Siège, disponible/retenu/vendu/bloqué…). title/description/emptyLabel stay caller-localized strings.
titlestring'Seat map'Section heading + root aria-label. Provide a localized string; built-in default is English.
descriptionstring—Optional supporting line under the heading.
emptyLabelstring'No sections configured'Empty-state copy when sections is empty. Provide a localized string.
classNamestring—Appended to the root section element.
idstring`seatmap-${useId()}`Root element id (autogenerated from useId when omitted).
<SeatMap />Accessibility
Type
1 ruleARIA
1 rulea11y
1 ruleUsage
Import
import { SeatMap } from "@epasslive/design-system"Example 1
<SeatMap eventId={e.id} venueId={e.venueId} sections={sections} mode="edit" selectedSeats={sel} onSeatSelect={setSel} />Example 2
<SeatMap eventId={e.id} venueId={e.venueId} sections={sections} mode="view" locale="fr" title="Plan de salle" emptyLabel="Aucune section configurée" />Anti-patterns
— Do not fetch data directly in organisms
— Avoid tight coupling to specific data sources
— Do not pass onSeatUpdate/tools expecting behavior — both are reserved and currently no-op