Release NEXT
Release Notes - Seatmap Platform
Version {VERSION} - {DATE}
Release Focus: Booking-renderer correctness and animation-reliability fixes from the SEAT-1046 audit. This release hardens how the booking renderer derives numeric prices from price labels – so section and cart price callbacks carry accurate values, including decimals – and makes zoom, pinch, and section-view animations stay within the pan bounds and always resolve.
MetaTitle: Release {VERSION}: Booking Renderer Fixes - Seatmap.pro
MetaDescription: Seatmap {VERSION} hardens the booking renderer’s numeric price contract and makes zoom, pinch, and section-view animations stay within the pan bounds and always resolve.
Booking renderer
Accurate numeric prices in callbacks (SEAT-1056)
The booking renderer derives the numeric price it reports from a price’s display label. That derivation now:
- Preserves decimals. A price labelled
12.50is now reported as12.5instead of being truncated to12. This affectspriceon section-click and section-selection callbacks, andpriceon cart seats and general-admission entries (onSeatsSelect,getCart). - Continues to report
undefinedfor a non-numeric label (for exampleGold) and0for a0label, so a reportedpriceis always either a finite number orundefined.
Related correctness fixes in the same area:
- Cart price-id backfill now matches a cart price to its price entry numerically, so decimal and suffixed labels (for example
12.50,42 EUR) are matched correctly. - A general-admission entry whose stored price is not a finite number can once again be removed from the cart.
- Restoring a seat from a saved cart key now resolves a section by its name, so a section whose name happens to be numeric is no longer confused with a different section that has that numeric id.
- Loading a single section now trims the price list to that section, so seat and group price assignments from other sections are no longer carried into the isolated view.
Integrations that assumed integer-only prices, or that re-parsed the label themselves, should review these values.
Zoom and pinch settle within the pan limits (SEAT-1055)
Programmatic zoom-to-destination (including minimap clicks and 2D zoom-to-section) now commits the pan-limited position instead of the raw target, so a zoom into a point near the venue edge no longer rests past the bounds. A pinch-to-zoom that ends out of bounds now snaps back to the limit as well.
Section-view transitions no longer rely on a timing guess (SEAT-1055)
Entering and exiting a section view now waits for the zoom-to-fit animation to actually finish before rotating in, instead of guessing with a fixed timer. The rotate-in no longer starts early or late on slower devices. A section whose geometry produces an undefined rotation angle now logs a warning and resets cleanly instead of animating a NaN transform, and overlapping section rotations no longer corrupt each other’s state.
Zoom animations are robust and always resolve (SEAT-1055)
- A zero-duration zoom now commits in a single step with no blank or
NaNframe. - The pan-limit snapback runs even while a zoom animation is still in flight.
- Every transform animation now signals completion on every exit path – natural finish, cancel, or preemption – so an awaited zoom sequence interrupted by a gesture stops cleanly instead of leaving a pending promise or skipping its snapback.
Faster rendering and interaction for very large venues (SEAT-1078)
Data operations that previously re-scanned every seat or section now use internal indexes, so large maps (tens of thousands of seats, thousands of sections) load and respond faster. Seat filtering, locking, and state changes no longer rebuild the spatial hit-test index, minimap cart pins are drawn from the cart rather than by scanning all seats, and key-based seat lookups resolve in constant time per key.
The WebGL renderer also does less work per frame on large venues: row geometry is uploaded to the GPU only when it actually changes (not on every pan or animation frame), and the static background quad and per-seat selection/hover data are no longer re-sent each frame. The per-seat selection, hover, and loading overlay is now rebuilt only when the selection, hover, or a seat’s state actually changes (or a deselection animation reaches its end) instead of rescanning every seat on every pan and animation frame, and the “is any seat still loading” animation check runs in constant time. GPU shaders, textures, and buffers are also released more thoroughly on teardown – reducing memory use across repeated map loads. No renderer method signatures, configuration options, or callback values changed – this is an internal performance improvement only.
Affected products
booking-client– numeric price contract: decimals preserved and non-numeric labels reported asundefinedin section and cart price callbacks; numeric cart price-id backfill; removable non-finite-price general-admission entries; name-based section resolution when restoring cart seats; single-section loads trim the price list to the loaded section.booking-client– pan-limited commits for zoom-to-destination and pinch-end; awaitable zoom-to-fit with correct padding restore; zero-duration and interruption-safe transform animations; section-rotation frame handling, serialization, and finite-angle guard.booking-client– performance at scale: section-indexed seat lookups, spatial index no longer rebuilt on flag-only seat mutations, constant-time key-based seat resolution, and cart-scoped minimap pin drawing (behaviour-preserving).booking-client– WebGL memory and per-frame cost: row vertex buffer uploaded only on change, static background quad and always-zero seat flag buffers no longer re-sent per frame, price-color buffer updated in place, the per-seat selection/hover/loading overlay rebuilt only on change (or at a deselection-animation boundary) instead of a full per-frame seat scan, the “any seat loading” animation check reduced to constant time, and shaders/textures freed on teardown (no leak after destroy) – all behaviour-preserving.
Upgrade
npm install @seatmap.pro/renderer@{VERSION}
The booking renderer’s reported price values now preserve decimals (for example 12.5 instead of a truncated 12); a non-numeric label continues to report undefined. No renderer method signatures or configuration options changed in this release.