@seatlayer/js 0.28.4 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { PickerSeat, SeatHoverDetails, PickerTransport, RendererViewMode, ChartDoc, AvailabilityRule, ChartTheme, ExpandedSeat } from '@seatlayer/core';
1
+ import { PickerSeat, RendererViewMode, SeatHoverDetails, PickerTransport, ChartDoc, AvailabilityRule, ChartTheme, ExpandedSeat } from '@seatlayer/core';
2
2
  export { ExpandedSeat, SeatHoverDetails } from '@seatlayer/core';
3
3
 
4
4
  /**
@@ -53,6 +53,7 @@ interface BestAvailableResult {
53
53
  labels: string[];
54
54
  seats?: PickerSeat[];
55
55
  items?: HoldResult['items'];
56
+ zoneId?: string;
56
57
  }
57
58
 
58
59
  /**
@@ -75,6 +76,9 @@ interface GAAreaAvailability {
75
76
  categoryKey: string;
76
77
  price: number;
77
78
  currency: string;
79
+ /** Buyer-facing copy authored separately from stable inventory identity. */
80
+ displayLabel?: string;
81
+ displayType?: string;
78
82
  tiers?: Array<{
79
83
  id: string;
80
84
  name: string;
@@ -111,6 +115,11 @@ interface SeatingChartOptions {
111
115
  * Toggleable later with setColorblindSafe().
112
116
  */
113
117
  colorblindSafe?: boolean;
118
+ /** Initial canvas projection.
119
+ * @deprecated `'isometric'` and `'perspective'` are retired in favour of the
120
+ * real 3D venue view (`setBuyerView('venue3d')`); they remain accepted for
121
+ * source compatibility and will be removed in the next major. Use `'flat'`. */
122
+ initialView?: RendererViewMode;
114
123
  /**
115
124
  * Built-in seat tooltip on mouse hover (seat · category · price · status).
116
125
  * Rendered inside the widget so every host gets it; default true. Turn off
@@ -259,6 +268,13 @@ declare class SeatingChart {
259
268
  setFloor(floorId: string): void;
260
269
  /** Toggle colorblind-safe rendering at runtime (see options.colorblindSafe). */
261
270
  setColorblindSafe(on: boolean): void;
271
+ /** Switch the 2D canvas projection.
272
+ * @deprecated `'isometric'` and `'perspective'` are retired in favour of the
273
+ * real 3D venue view (`setBuyerView('venue3d')`); accepted for source
274
+ * compatibility until the next major. */
275
+ setViewMode(mode: RendererViewMode): void;
276
+ /** Current canvas projection. */
277
+ getViewMode(): RendererViewMode;
262
278
  /** Zoom in one step (same increment as the wheel/pinch gesture). */
263
279
  zoomIn(): void;
264
280
  /** Zoom out one step. */
@@ -638,9 +654,26 @@ interface SeatPickerOptions {
638
654
  currency?: string;
639
655
  /** Colorblind-safe rendering (Okabe-Ito palette, hollow booked seats). */
640
656
  colorblindSafe?: boolean;
641
- /** Initial map projection. `perspective` is the exact-seat projected 2.5D
642
- * buyer view; all authoring and inventory identities remain unchanged. */
657
+ /** Initial map projection. Buyers now toggle **Map (flat 2D) + 3D** only; the
658
+ * legacy `perspective` (2.5D) value is still ACCEPTED for source compatibility
659
+ * but is deprecated — it is coerced to `flat` with a one-time console warning.
660
+ * The 3D venue view is entered from the Map/3D control, not this option. */
643
661
  initialView?: RendererViewMode;
662
+ /**
663
+ * Offer the interactive 3D venue view (Map | 3D toggle + a "See it in 3D"
664
+ * action on the seat-confirm card). Default true. The 3D button is shown only
665
+ * when this is not false AND the browser exposes WebGL2; there are ZERO GL
666
+ * bytes on the wire until the buyer actually opens 3D (the OGL chunk is
667
+ * dynamically imported on first use). Set false for embed hosts that must
668
+ * stay strictly 2D. */
669
+ enable3D?: boolean;
670
+ /**
671
+ * Optional analytics sink for the widget's own journey events. Currently emits
672
+ * the 3D venue-view journey (`3d_opened`, `3d_orbit_engaged`, `3d_seat_picked`,
673
+ * `3d_cinematic_played`/`_skipped`/`_cancelled`, `3d_panorama_opened`/`_closed`)
674
+ * with `{ surface: 'buyer' }` merged into the props. A throwing sink never
675
+ * breaks the widget. Route it to your product analytics (e.g. PostHog). */
676
+ onAnalytics?: (event: string, props: Record<string, unknown>) => void;
644
677
  /**
645
678
  * Hide the "Powered by SeatLayer" attribution badge in the side panel foot.
646
679
  * The chart theme's own `hideBadge` flag (paid orgs) also hides it — the badge
@@ -770,6 +803,14 @@ declare class SeatPicker {
770
803
  private cbSafe;
771
804
  private rungsEl;
772
805
  private projectionEl;
806
+ private buyerView;
807
+ private view3dEl;
808
+ private view3dHandle;
809
+ /** Monotonic token so a stale async mount (buyer left before OGL finished
810
+ * loading) never installs its handle over a newer state. */
811
+ private view3dGen;
812
+ /** Seat whose 2D confirm card launched "See it in 3D"; re-shown on return. */
813
+ private view3dReturnSeat;
773
814
  private floorsEl;
774
815
  private secCardEl;
775
816
  private viewEl;
@@ -819,6 +860,10 @@ declare class SeatPicker {
819
860
  * (OV-52)
820
861
  */
821
862
  private confirmThumbHtml;
863
+ /** "See it in 3D" (2D) / "View from this seat" (already in 3D) action for the
864
+ * confirm card. Only when 3D is available — the purchase-moment bridge into
865
+ * the cinematic that reaches buyers who never press the Map | 3D toggle. */
866
+ private see3dConfirmHtml;
822
867
  /** Minimal HTML/attribute escaper for buyer-authored commercial text (notes). */
823
868
  private escCx;
824
869
  /** Localized "Restricted view" / "Obstructed view" label for a seat's flags,
@@ -1001,6 +1046,9 @@ declare class SeatPicker {
1001
1046
  /** Reflect the engine's current LOD rung onto the pill group. */
1002
1047
  private syncRung;
1003
1048
  private syncProjection;
1049
+ /** Can this picker offer the 3D venue view? Requires the option (default on)
1050
+ * and WebGL2, and a chart to render. */
1051
+ private canOffer3d;
1004
1052
  /** Reflect the active floor onto the switcher rail. */
1005
1053
  private syncFloors;
1006
1054
  /** Show (or clear, on null) the tapped-section summary card. */
@@ -1118,10 +1166,62 @@ declare class SeatPicker {
1118
1166
  * cross-surface preference, and the in-widget button's pressed state together
1119
1167
  * so the two controls never diverge. */
1120
1168
  setColorblindSafe(on: boolean): void;
1121
- /** Switch the buyer canvas between flat, isometric and Perspective 2.5D. */
1169
+ /** Switch the underlying 2D renderer projection (flat / isometric). The buyer
1170
+ * UI no longer exposes `perspective`; it is coerced to `flat`. */
1122
1171
  setViewMode(mode: RendererViewMode): void;
1123
1172
  /** Current buyer canvas projection. */
1124
1173
  getViewMode(): RendererViewMode;
1174
+ /** `perspective` (2.5D) is retired from the buyer surface — accept it for
1175
+ * source compatibility but coerce to `flat` with a one-time deprecation warn. */
1176
+ private perspectiveWarned;
1177
+ private normalizeInitialView;
1178
+ /** Current buyer view: the flat map, or the interactive 3D venue. */
1179
+ getBuyerView(): 'map' | 'venue3d';
1180
+ /**
1181
+ * Switch between the flat seat **Map** and the interactive **3D venue** view —
1182
+ * the same control the buyer's on-widget `Map | 3D` toggle drives.
1183
+ *
1184
+ * Entering `'venue3d'` with `opts.flyToSeatId` runs the cinematic tour: the
1185
+ * camera flies to the seat and holds in the live scene (a chip offers the
1186
+ * 360° view-from-seat) —
1187
+ * the widget enters 3D and auto-flies the camera to that seat, dissolving into
1188
+ * its view-from-seat panorama (the same chain as tapping "See the view from
1189
+ * here" on a seat's confirm card). When the widget is **already** in the 3D
1190
+ * view, the camera simply flies to the requested seat — the GL scene is not
1191
+ * torn down or rebuilt, so there is no flash or re-entry.
1192
+ *
1193
+ * No-op when the view is unchanged and no `flyToSeatId` is given, or when 3D is
1194
+ * unavailable for this chart.
1195
+ *
1196
+ * @param view `'map'` for the flat picker, `'venue3d'` for the 3D venue.
1197
+ * @param opts.flyToSeatId When entering (or already in) `'venue3d'`, the seat
1198
+ * id to fly the camera to — cinematic → panorama.
1199
+ * Ignored when `view` is `'map'`.
1200
+ *
1201
+ * @example
1202
+ * // Public 3D tour entry — enter 3D and fly straight to the buyer's seat:
1203
+ * picker.setBuyerView('venue3d', { flyToSeatId: 'A-12' });
1204
+ */
1205
+ setBuyerView(view: 'map' | 'venue3d', opts?: {
1206
+ flyToSeatId?: string;
1207
+ }): void;
1208
+ /** SeatStatus → the view3d palette state. Selection is layered separately. */
1209
+ private seatState3dFor;
1210
+ /** Push the full live availability snapshot into the 3D handle (selection is
1211
+ * preserved inside the module). Cheap enough per status delta. */
1212
+ private pushAvailabilityTo3d;
1213
+ /** Mirror the authoritative widget selection into the 3D handle. */
1214
+ private syncSelectionTo3d;
1215
+ /** Build the view-from-seat panorama the cinematic dissolves into — reuses the
1216
+ * exact input path as the 2D `openSeatView` (organizer photo, else generated). */
1217
+ private seatViewFor3d;
1218
+ /** Route the module's decoupled analytics into the host callback, tagged buyer. */
1219
+ private emit3dAnalytics;
1220
+ /** A 3D seat tap runs the SAME selection path as a 2D tap: toggle through the
1221
+ * controller, then raise the shared confirm card (bottom-sheeted in 3D). */
1222
+ private onView3dSeatPick;
1223
+ private enter3d;
1224
+ private exit3d;
1125
1225
  /** Current active/restored hold reflected in the tray. */
1126
1226
  getCurrentHold(): HoldResult | null;
1127
1227
  /** Explicit host-driven hold restore (automatic session restore is on by default). */
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { PickerSeat, SeatHoverDetails, PickerTransport, RendererViewMode, ChartDoc, AvailabilityRule, ChartTheme, ExpandedSeat } from '@seatlayer/core';
1
+ import { PickerSeat, RendererViewMode, SeatHoverDetails, PickerTransport, ChartDoc, AvailabilityRule, ChartTheme, ExpandedSeat } from '@seatlayer/core';
2
2
  export { ExpandedSeat, SeatHoverDetails } from '@seatlayer/core';
3
3
 
4
4
  /**
@@ -53,6 +53,7 @@ interface BestAvailableResult {
53
53
  labels: string[];
54
54
  seats?: PickerSeat[];
55
55
  items?: HoldResult['items'];
56
+ zoneId?: string;
56
57
  }
57
58
 
58
59
  /**
@@ -75,6 +76,9 @@ interface GAAreaAvailability {
75
76
  categoryKey: string;
76
77
  price: number;
77
78
  currency: string;
79
+ /** Buyer-facing copy authored separately from stable inventory identity. */
80
+ displayLabel?: string;
81
+ displayType?: string;
78
82
  tiers?: Array<{
79
83
  id: string;
80
84
  name: string;
@@ -111,6 +115,11 @@ interface SeatingChartOptions {
111
115
  * Toggleable later with setColorblindSafe().
112
116
  */
113
117
  colorblindSafe?: boolean;
118
+ /** Initial canvas projection.
119
+ * @deprecated `'isometric'` and `'perspective'` are retired in favour of the
120
+ * real 3D venue view (`setBuyerView('venue3d')`); they remain accepted for
121
+ * source compatibility and will be removed in the next major. Use `'flat'`. */
122
+ initialView?: RendererViewMode;
114
123
  /**
115
124
  * Built-in seat tooltip on mouse hover (seat · category · price · status).
116
125
  * Rendered inside the widget so every host gets it; default true. Turn off
@@ -259,6 +268,13 @@ declare class SeatingChart {
259
268
  setFloor(floorId: string): void;
260
269
  /** Toggle colorblind-safe rendering at runtime (see options.colorblindSafe). */
261
270
  setColorblindSafe(on: boolean): void;
271
+ /** Switch the 2D canvas projection.
272
+ * @deprecated `'isometric'` and `'perspective'` are retired in favour of the
273
+ * real 3D venue view (`setBuyerView('venue3d')`); accepted for source
274
+ * compatibility until the next major. */
275
+ setViewMode(mode: RendererViewMode): void;
276
+ /** Current canvas projection. */
277
+ getViewMode(): RendererViewMode;
262
278
  /** Zoom in one step (same increment as the wheel/pinch gesture). */
263
279
  zoomIn(): void;
264
280
  /** Zoom out one step. */
@@ -638,9 +654,26 @@ interface SeatPickerOptions {
638
654
  currency?: string;
639
655
  /** Colorblind-safe rendering (Okabe-Ito palette, hollow booked seats). */
640
656
  colorblindSafe?: boolean;
641
- /** Initial map projection. `perspective` is the exact-seat projected 2.5D
642
- * buyer view; all authoring and inventory identities remain unchanged. */
657
+ /** Initial map projection. Buyers now toggle **Map (flat 2D) + 3D** only; the
658
+ * legacy `perspective` (2.5D) value is still ACCEPTED for source compatibility
659
+ * but is deprecated — it is coerced to `flat` with a one-time console warning.
660
+ * The 3D venue view is entered from the Map/3D control, not this option. */
643
661
  initialView?: RendererViewMode;
662
+ /**
663
+ * Offer the interactive 3D venue view (Map | 3D toggle + a "See it in 3D"
664
+ * action on the seat-confirm card). Default true. The 3D button is shown only
665
+ * when this is not false AND the browser exposes WebGL2; there are ZERO GL
666
+ * bytes on the wire until the buyer actually opens 3D (the OGL chunk is
667
+ * dynamically imported on first use). Set false for embed hosts that must
668
+ * stay strictly 2D. */
669
+ enable3D?: boolean;
670
+ /**
671
+ * Optional analytics sink for the widget's own journey events. Currently emits
672
+ * the 3D venue-view journey (`3d_opened`, `3d_orbit_engaged`, `3d_seat_picked`,
673
+ * `3d_cinematic_played`/`_skipped`/`_cancelled`, `3d_panorama_opened`/`_closed`)
674
+ * with `{ surface: 'buyer' }` merged into the props. A throwing sink never
675
+ * breaks the widget. Route it to your product analytics (e.g. PostHog). */
676
+ onAnalytics?: (event: string, props: Record<string, unknown>) => void;
644
677
  /**
645
678
  * Hide the "Powered by SeatLayer" attribution badge in the side panel foot.
646
679
  * The chart theme's own `hideBadge` flag (paid orgs) also hides it — the badge
@@ -770,6 +803,14 @@ declare class SeatPicker {
770
803
  private cbSafe;
771
804
  private rungsEl;
772
805
  private projectionEl;
806
+ private buyerView;
807
+ private view3dEl;
808
+ private view3dHandle;
809
+ /** Monotonic token so a stale async mount (buyer left before OGL finished
810
+ * loading) never installs its handle over a newer state. */
811
+ private view3dGen;
812
+ /** Seat whose 2D confirm card launched "See it in 3D"; re-shown on return. */
813
+ private view3dReturnSeat;
773
814
  private floorsEl;
774
815
  private secCardEl;
775
816
  private viewEl;
@@ -819,6 +860,10 @@ declare class SeatPicker {
819
860
  * (OV-52)
820
861
  */
821
862
  private confirmThumbHtml;
863
+ /** "See it in 3D" (2D) / "View from this seat" (already in 3D) action for the
864
+ * confirm card. Only when 3D is available — the purchase-moment bridge into
865
+ * the cinematic that reaches buyers who never press the Map | 3D toggle. */
866
+ private see3dConfirmHtml;
822
867
  /** Minimal HTML/attribute escaper for buyer-authored commercial text (notes). */
823
868
  private escCx;
824
869
  /** Localized "Restricted view" / "Obstructed view" label for a seat's flags,
@@ -1001,6 +1046,9 @@ declare class SeatPicker {
1001
1046
  /** Reflect the engine's current LOD rung onto the pill group. */
1002
1047
  private syncRung;
1003
1048
  private syncProjection;
1049
+ /** Can this picker offer the 3D venue view? Requires the option (default on)
1050
+ * and WebGL2, and a chart to render. */
1051
+ private canOffer3d;
1004
1052
  /** Reflect the active floor onto the switcher rail. */
1005
1053
  private syncFloors;
1006
1054
  /** Show (or clear, on null) the tapped-section summary card. */
@@ -1118,10 +1166,62 @@ declare class SeatPicker {
1118
1166
  * cross-surface preference, and the in-widget button's pressed state together
1119
1167
  * so the two controls never diverge. */
1120
1168
  setColorblindSafe(on: boolean): void;
1121
- /** Switch the buyer canvas between flat, isometric and Perspective 2.5D. */
1169
+ /** Switch the underlying 2D renderer projection (flat / isometric). The buyer
1170
+ * UI no longer exposes `perspective`; it is coerced to `flat`. */
1122
1171
  setViewMode(mode: RendererViewMode): void;
1123
1172
  /** Current buyer canvas projection. */
1124
1173
  getViewMode(): RendererViewMode;
1174
+ /** `perspective` (2.5D) is retired from the buyer surface — accept it for
1175
+ * source compatibility but coerce to `flat` with a one-time deprecation warn. */
1176
+ private perspectiveWarned;
1177
+ private normalizeInitialView;
1178
+ /** Current buyer view: the flat map, or the interactive 3D venue. */
1179
+ getBuyerView(): 'map' | 'venue3d';
1180
+ /**
1181
+ * Switch between the flat seat **Map** and the interactive **3D venue** view —
1182
+ * the same control the buyer's on-widget `Map | 3D` toggle drives.
1183
+ *
1184
+ * Entering `'venue3d'` with `opts.flyToSeatId` runs the cinematic tour: the
1185
+ * camera flies to the seat and holds in the live scene (a chip offers the
1186
+ * 360° view-from-seat) —
1187
+ * the widget enters 3D and auto-flies the camera to that seat, dissolving into
1188
+ * its view-from-seat panorama (the same chain as tapping "See the view from
1189
+ * here" on a seat's confirm card). When the widget is **already** in the 3D
1190
+ * view, the camera simply flies to the requested seat — the GL scene is not
1191
+ * torn down or rebuilt, so there is no flash or re-entry.
1192
+ *
1193
+ * No-op when the view is unchanged and no `flyToSeatId` is given, or when 3D is
1194
+ * unavailable for this chart.
1195
+ *
1196
+ * @param view `'map'` for the flat picker, `'venue3d'` for the 3D venue.
1197
+ * @param opts.flyToSeatId When entering (or already in) `'venue3d'`, the seat
1198
+ * id to fly the camera to — cinematic → panorama.
1199
+ * Ignored when `view` is `'map'`.
1200
+ *
1201
+ * @example
1202
+ * // Public 3D tour entry — enter 3D and fly straight to the buyer's seat:
1203
+ * picker.setBuyerView('venue3d', { flyToSeatId: 'A-12' });
1204
+ */
1205
+ setBuyerView(view: 'map' | 'venue3d', opts?: {
1206
+ flyToSeatId?: string;
1207
+ }): void;
1208
+ /** SeatStatus → the view3d palette state. Selection is layered separately. */
1209
+ private seatState3dFor;
1210
+ /** Push the full live availability snapshot into the 3D handle (selection is
1211
+ * preserved inside the module). Cheap enough per status delta. */
1212
+ private pushAvailabilityTo3d;
1213
+ /** Mirror the authoritative widget selection into the 3D handle. */
1214
+ private syncSelectionTo3d;
1215
+ /** Build the view-from-seat panorama the cinematic dissolves into — reuses the
1216
+ * exact input path as the 2D `openSeatView` (organizer photo, else generated). */
1217
+ private seatViewFor3d;
1218
+ /** Route the module's decoupled analytics into the host callback, tagged buyer. */
1219
+ private emit3dAnalytics;
1220
+ /** A 3D seat tap runs the SAME selection path as a 2D tap: toggle through the
1221
+ * controller, then raise the shared confirm card (bottom-sheeted in 3D). */
1222
+ private onView3dSeatPick;
1223
+ private enter3d;
1224
+ private exit3d;
1125
1225
  /** Current active/restored hold reflected in the tray. */
1126
1226
  getCurrentHold(): HoldResult | null;
1127
1227
  /** Explicit host-driven hold restore (automatic session restore is on by default). */