Booking Client (Renderer) API Changes - v1.71.0

Release: v1.71.0 Package: @seatmap.pro/renderer Date: 2026-08-13

MetaTitle: Renderer API Changes 1.71.0 - Seatmap.pro

MetaDescription: Renderer 1.71.0 exposes section photos on ISection, ships a 43 percent smaller bundle, and keeps maps drawing when a background cannot load.


Summary

Backward Compatible: YES New Features: 1 Deprecations: 0 Bug Fixes: 3 Architecture Improvements: The renderer now sources prices from the split assignments and availability endpoints, falling back to the previous single endpoint when either call fails.

Migration Required: NO — the only API addition is an optional field on an existing interface. No method signature or configuration option changed.


New Features

Section photos (SEAT-1134)

Sections can carry photos attached in the editor. The renderer does not draw them: it hands them to the host page so each ticketing site can present the gallery in its own design.

import type { ISection, ISectionPhoto } from '@seatmap.pro/renderer';

const renderer = new SeatmapBookingRenderer({
  onSectionClick: (section: ISection) => {
    section.photos?.forEach((photo: ISectionPhoto) => {
      gallery.add(photo.thumbUrl ?? photo.url, photo.caption);
    });
  },
});

photos is delivered wherever an ISection is, which is onSectionClick, onSectorClick and onSectionsSelectionChange.

Photos are ordered as they were arranged in the editor. They belong to the venue schema rather than to an event, so a section shows the same photos across every event on that schema. A section with no photos leaves the field undefined, so existing integrations see no change in the payload.


Type Definitions

New exported types

/**
 * A photo attached to a section, shown by the host page.
 */
export interface ISectionPhoto {
  url: string;
  thumbUrl?: string;
  caption?: string;
}

url is the full-size image; thumbUrl is the optimized thumbnail variant, present for photos uploaded through the editor. Both are absolute URLs served from object storage.

Modified types

export interface ISection {
  // …existing fields unchanged…

  /**
   * Photos attached to the section, in the order set in the editor.
   */
  photos?: ISectionPhoto[];
}

Optional and additive: existing code compiles unchanged.


Bug Fixes

A background the GPU rejects no longer breaks the map (SEAT-1147)

When a venue background cannot be handed to the GPU — artwork the browser refuses to let WebGL read, or an image beyond the device’s texture limits — the renderer draws the seatmap without its background instead of failing partway through. Seats, rows, labels and selection stay interactive, and the map no longer reports a background as ready when the upload did not complete.

Queued drawing work is discarded once a map has been torn down or its GPU context has been lost, so a map closing mid-render no longer raises an error.

Most visible on older mobile Safari versions and in-app browsers, where the browser is most likely to reject the upload.

A background the browser will not let the renderer read (SEAT-1135)

Preparing the softened backdrop behind a seatmap requires reading the background image back off a canvas, which the browser refuses for artwork served from another origin without the headers that permit it. That refusal stopped the map from drawing. The renderer now keeps the background as it is and carries on. Backgrounds served from the same origin, or with those headers present, are softened exactly as before.

Sections with no seats no longer break the outline layer (SEAT-1157)

A section carrying no seats produced an outline rectangle with unusable geometry, and the result was reused for the rest of the session — so a section measured while its seats were absent stayed unmeasured even after they arrived. Such a section now produces no outline until it has seats to measure, and is measured correctly the first time they arrive. Sections with seats are unchanged.


Performance Changes

Smaller bundle (SEAT-1155)

Bundle Before After Change
Booking renderer, raw 1,503,522 B 897,767 B -40%
Booking renderer, compressed 417,874 B 238,522 B -43%

Neither the renderer API nor the embed snippet changes, so pages that load the renderer simply transfer less.

Price fetching split in two

The renderer now fetches price assignments and seat availability as two requests in parallel and composes the same price list from them, instead of one combined request. The composed result is identical to what the single call produced, so no host-page code changes.

Assignments are served with an ETag, so the browser’s own HTTP cache revalidates them and a repeat load is usually answered from cache after a bodiless 304. Availability is never cached and is read in full every time. The renderer reconciles the two so a price edit landing between the parallel requests cannot produce a mixed price list.

The pair is an internal contract between the renderer and the service, not an integration surface: the payloads are shaped for the renderer and change with it. Read prices directly through GET /api/public/v1.0/event/prices/, which is unchanged.

Fallback. If either call fails, the renderer falls back to event/prices/ and stays on it for the lifetime of that client instance; it does not retry the split path again.

Custom baseUrl. The v2 base is derived from the configured baseUrl by replacing /v1.0/ with /v2.0/. A baseUrl that does not contain /v1.0/ leaves the replacement a no-op, so the pair is requested against the v1 base, fails, and the client settles on the single endpoint. Behaviour stays correct either way; if you point the renderer at a rewritten or proxied path and want the split fetch, keep /v1.0/ in baseUrl and route /v2.0/ alongside it.


Installation

npm install @seatmap.pro/renderer@1.71.0