01 · The prototype
Can you build a seating chart with plain JavaScript?
Yes, for a prototype. Every available seat is a button with a stable ID and an aria-pressed state, a Set holds the current selection, and sold seats stay disabled. Select a few seats below, then read exactly what that demo does and does not prove.
What this proves
- Stable seat IDs
- Available and unavailable states
- Keyboard-operable selection
- A readable selected-seat summary
What it does not prove
- No atomic hold
- No other buyer
- No expiry or synchronization
- No trusted price or booking
That selected set is buyer intent, not inventory. Nothing here reserves a seat, so never label a locally selected seat as reserved. Everything above it is progressive enhancement: the markup ships as plain buttons, JavaScript upgrades them, and a reader without JavaScript still sees the seat labels, the sold states and the rest of this guide.
02 · React
How do you build a seating chart in React?
Keep the same contract: one button per seat, a stable id, aria-pressed for the selected state, and the selection in a Set. Hold that Set in useState and replace it on every toggle so React sees a new reference. Mutating the existing Set will not re-render.
This component is the React equivalent of the vanilla snippet: it renders seats and tracks intent, nothing more. It still has no inventory, no hold and no expiry, so two browsers can each “select” seat C-3.
Using Vue or Angular? Keep the same contract: hold the Set in a ref in Vue or a signal in Angular, and replace it on every toggle.
03 · Rendering
DOM, SVG, Canvas or WebGL for a seat map?
A renderer solves pixels, hit testing and navigation. It never decides who owns a seat when buyers compete. Choose by interaction cost and by how much accessibility work you are willing to rebuild. Whatever you pick, the accessible name, the focus order and the selected state have to survive it.
Pick a layer to see what lands in the page and what you still have to build.
Primary implementation references reviewed 10 Aug 2026: Konva’s React canvas reservation example, an open React/Konva seating editor, and the package documentation surfaced for react-seat-charts, seat-picker, and @seatsio/seatsio-react. Package status and APIs can change; confirm them at evaluation time.
04 · The production checklist
What does a seating chart need before you can sell from it?
The browser can ask for a seat. Only a server can decide who gets it. Six systems sit around the renderer. Miss one and the failure is not cosmetic: a seat sold twice, a hold that never releases, or an order your server cannot prove it was allowed to take.
Tick what your build already has
A renderer alone covers none of the six.
05 · Concurrency
How do I stop two buyers taking the same seat?
Not in the browser. A client may optimistically highlight a seat, but only the server can decide who gets it: selection asks for a hold, exactly one buyer gets the seat, and every other open map is told. Design the browser for the conflict response and not only the happy path: take the lost seat out of the map, keep the rest of the selection intact, and let the buyer carry on choosing.
- BrowserSeat selectedselection only
- Seat map serviceHold requestedone buyer gets the seat
- Every buyerHeld or takenall open maps update
- Your serverBooked or releasedconfirmed with your secret key and a booking reference
The diagram explains the contract, not a universal throughput claim. SeatLayer’s released evidence includes one scoped 30-way race for one contested seat: one hold succeeded and the other requests received conflicts.
06 · The decision
Should you build a seating chart or use a library?
Build the parts that differentiate your product. DIY is a fair choice when the scope stays narrow; evaluate a maintained seating layer when seating itself is becoming a programme. The honest test is whether the seat map is the thing your customers pay for, or the thing standing between them and what they pay for.
Keep building when…
- The map is static or rarely changes
- One user or an internal workflow
- No concurrent sale and no temporary hold
- Your team wants to own rendering and venue authoring
- Custom interaction is the differentiator
Evaluate an SDK when…
- Venue charts are reused across events
- Multiple buyers share live inventory
- You need atomic holds, expiry, booking and webhooks
- Buyer, organizer and staff surfaces all matter
- Framework, server, mobile and operational support are expected
If you evaluate one, the SeatLayer packages on npm are @seatlayer/js for plain JavaScript and TypeScript, plus @seatlayer/react, @seatlayer/vue and @seatlayer/angular.