@seatlayer/js 0.78.0 → 0.79.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/chunk-XGKKO65I.js +1 -0
- package/dist/index.cjs +113 -47
- package/dist/index.d.cts +510 -166
- package/dist/index.d.ts +510 -166
- package/dist/index.js +112 -46
- package/dist/manager.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-ZE36NABM.js +0 -1
package/dist/index.d.cts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { PickerSeat, PickerGAArea, PickerMapTheme, PickerTransport, PickerSelectionValidator, RendererViewMode, PickerSelectionValidity, ChartTheme, AccessibilityType, FloorLabelStyle, LodRung, SectionSummary, PickerAccessNeed, SeatHoverDetails, AccessibleSectionStep, AvailabilityRefreshOutcome, PickerController, ExpandedSeat } from '@seatlayer/core';
|
|
1
|
+
import { PickerSeat, PickerGAArea, PickerMapTheme, PickerTransport, PickerSelectionValidator, RendererViewMode, PickerSelectionValidity, ChartTheme, AccessibilityType, FloorLabelStyle, LodRung, SectionSummary, PickerAccessNeed, SeatHoverDetails, AccessibleSectionStep, AvailabilityRefreshOutcome, PickerController, ExpandedSeat, TableSelectionDetails, SeatStatus } from '@seatlayer/core';
|
|
2
2
|
export { ExpandedSeat, PickerMapTheme, PickerSelectionValidator, PickerSelectionValidity, PickerSelectionViolation, RendererViewMode, SeatHoverDetails } from '@seatlayer/core';
|
|
3
3
|
import { T as ThemeMode } from './channelsMode-goczEzyt.cjs';
|
|
4
4
|
export { A as AccessIntentForbidsDetails, a as AccessLinkRecord, b as AccessLinkReveal, c as AccessLinkState, d as AccessLinkStatus, e as AccessLinkStatusRecord, f as ArchiveBlockedDetails, g as AssignmentBuckets, h as AssignmentDropDetails, i as AssignmentResult, B as BucketRow, C as ChannelAccessIntent, j as ChannelAccessSummary, k as ChannelAllocationPage, l as ChannelAttribution, m as ChannelAuditEntry, n as ChannelAuditPage, o as ChannelCounts, p as ChannelListResult, q as ChannelPreviewProjection, r as ChannelRecord, s as ChannelReport, t as ChannelReportLinkRecord, u as ChannelReportLinkReveal, v as ChannelReportResult, w as ChannelReportRow, x as ChannelSeatStatus, y as ChannelState, z as ChannelsCapabilities, D as ChannelsClient, E as ChannelsMode, F as ChannelsModeHost, G as ChannelsRowView, H as ChannelsSeatView, I as ControlRoomActivityEntry, J as ControlRoomSectionMetric, K as ControlRoomSnapshot, L as EventCategoryAssignmentResult, M as EventScopedManageToken, N as EventTableBookingMode, O as EventTableBookingResult, P as IntentSwitchBlockedDetails, Q as InventoryBooking, R as InventoryBookingActivity, S as InventoryBookingDetail, U as InventoryBookingObject, V as InventoryBookingState, W as InventoryBookingsPage, X as InventoryBookingsQuery, Y as LogEntry, Z as LogPage, _ as ManageApi, $ as ManageApiError, a0 as ReportByStatus, a1 as ReportCategoryMeta, a2 as ReportCategoryRow, a3 as ReportResult, a4 as SeatManager, a5 as SeatManagerActionResult, a6 as SeatManagerActivity, a7 as SeatManagerCapability, a8 as SeatManagerConnection, a9 as SeatManagerFilteredSection, aa as SeatManagerMode, ab as SeatManagerOptions, ac as SeatManagerSelectionValidity, ad as SeatManagerTallies, ae as SelectionSourceRow } from './channelsMode-goczEzyt.cjs';
|
|
5
5
|
import * as _seatlayer_core_core_seatConfidence from '@seatlayer/core/core/seatConfidence';
|
|
6
6
|
import { SeatConfidenceDisclosure } from '@seatlayer/core/core/seatConfidence';
|
|
7
|
-
import { Venue3DHandle } from '@seatlayer/core/view3d';
|
|
7
|
+
import { SeatViewStopName, Venue3DHandle, SeatState3D, SeatView } from '@seatlayer/core/view3d';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Buyer access context — the browser half of the Sales Channels contract
|
|
@@ -267,6 +267,19 @@ interface StatusChange {
|
|
|
267
267
|
label: string;
|
|
268
268
|
status: WireStatus;
|
|
269
269
|
}
|
|
270
|
+
/**
|
|
271
|
+
* What else the frame that carried a section change was carrying.
|
|
272
|
+
*
|
|
273
|
+
* The one thing a section listener needs to decide is whether it has to go and
|
|
274
|
+
* read the map. A connect snapshot names the hidden and closed sections AND
|
|
275
|
+
* every unit's status in the same frame; a standalone `type:'hidden'` frame
|
|
276
|
+
* names only the sections. Treating the two alike cost every fresh connection
|
|
277
|
+
* one redundant HTTP inventory read.
|
|
278
|
+
*/
|
|
279
|
+
interface SectionsMeta {
|
|
280
|
+
/** This frame also carried the seat statuses, so no read is owed. */
|
|
281
|
+
withInventory: boolean;
|
|
282
|
+
}
|
|
270
283
|
/** Where reconstructed inventory goes. Implemented over PickerController. */
|
|
271
284
|
interface RealtimeSink {
|
|
272
285
|
/** Apply a batch of label→status changes. Implementations must paint this as
|
|
@@ -290,8 +303,12 @@ interface RealtimeSink {
|
|
|
290
303
|
resync(opts?: {
|
|
291
304
|
reason?: 'connect' | 'frame';
|
|
292
305
|
}): void | Promise<void>;
|
|
293
|
-
/** Section availability changed (channel-agnostic; identical for every scope).
|
|
294
|
-
|
|
306
|
+
/** Section availability changed (channel-agnostic; identical for every scope).
|
|
307
|
+
*
|
|
308
|
+
* `withInventory` says whether the SAME frame also carried the seat
|
|
309
|
+
* statuses — which is the difference between "go and read the map" and
|
|
310
|
+
* "the map is right here". See {@link SectionsMeta}. */
|
|
311
|
+
onSections?(hidden: string[], closed: string[], meta?: SectionsMeta): void;
|
|
295
312
|
/** Scope-projected presence counters. */
|
|
296
313
|
onPresence?(counts: {
|
|
297
314
|
shoppingSessions: number;
|
|
@@ -439,7 +456,7 @@ interface ControllerSinkOptions {
|
|
|
439
456
|
*/
|
|
440
457
|
ownLabels?: () => Iterable<string>;
|
|
441
458
|
/** Section availability changed and the chart itself needs rebuilding. */
|
|
442
|
-
onSections?: (hidden: string[], closed: string[]) => void;
|
|
459
|
+
onSections?: (hidden: string[], closed: string[], meta?: SectionsMeta) => void;
|
|
443
460
|
onStatusChange?: () => void;
|
|
444
461
|
}
|
|
445
462
|
declare function createControllerSink(controller: PickerControllerLike, options?: ControllerSinkOptions): RealtimeSink;
|
|
@@ -2573,6 +2590,232 @@ declare class EmbeddedDesigner {
|
|
|
2573
2590
|
private handleMessage;
|
|
2574
2591
|
}
|
|
2575
2592
|
|
|
2593
|
+
/**
|
|
2594
|
+
* pickerLegend — the two places the picker explains its colours.
|
|
2595
|
+
*
|
|
2596
|
+
* The price LIST (`.sl-price-row`) is the detail view: colour, name, how many
|
|
2597
|
+
* are left, the offer name, the exact price or spread. It lives in the side
|
|
2598
|
+
* panel on desktop and behind a disclosure inside the bottom sheet on a phone.
|
|
2599
|
+
*
|
|
2600
|
+
* The price RAIL (`.sl-rc`) is the phone's always-visible legend: colour and
|
|
2601
|
+
* price, nothing else, pinned above the map. It exists because on a narrow
|
|
2602
|
+
* layout the list is two gates deep — open the sheet, then open the disclosure
|
|
2603
|
+
* — so a buyer looking at five coloured sections had nothing on screen telling
|
|
2604
|
+
* them what any of them cost.
|
|
2605
|
+
*
|
|
2606
|
+
* They are deliberately NOT the same rendering. A 34px chip cannot carry "N
|
|
2607
|
+
* left" or an offer name, and a rail that truncated its categories would be
|
|
2608
|
+
* worse than one that scrolls. What they must never do is disagree, so both are
|
|
2609
|
+
* painted from the same `sellable`/`left` pass in `syncPrices`, and both take
|
|
2610
|
+
* their dot colour from `colorOf` — which asks the RENDERER, not the document,
|
|
2611
|
+
* because colorblind-safe mode remaps hues inside the renderer and never
|
|
2612
|
+
* touches `doc.categories[].color`.
|
|
2613
|
+
*
|
|
2614
|
+
* Pure: these take values and return strings. Event wiring stays with the
|
|
2615
|
+
* widget, in the same style as pickerTray.ts.
|
|
2616
|
+
*/
|
|
2617
|
+
|
|
2618
|
+
/** The fields either legend needs off a category. */
|
|
2619
|
+
interface LegendCategory {
|
|
2620
|
+
key: string;
|
|
2621
|
+
label: string;
|
|
2622
|
+
color: string;
|
|
2623
|
+
price?: number;
|
|
2624
|
+
tiers?: {
|
|
2625
|
+
id?: string;
|
|
2626
|
+
price: number;
|
|
2627
|
+
}[];
|
|
2628
|
+
}
|
|
2629
|
+
/** An offer as the widget resolves it. `previousPrice` is nullable, not just
|
|
2630
|
+
* optional — older workers omit it and current ones send null when there is
|
|
2631
|
+
* no strike-through price. */
|
|
2632
|
+
interface LegendOffer {
|
|
2633
|
+
previousPrice?: number | null;
|
|
2634
|
+
price: number;
|
|
2635
|
+
offerName?: string;
|
|
2636
|
+
}
|
|
2637
|
+
/**
|
|
2638
|
+
* The half of a legend's inputs both views share. Held as one object so the
|
|
2639
|
+
* widget resolves them once and the two renderings cannot be handed different
|
|
2640
|
+
* answers to the same question.
|
|
2641
|
+
*/
|
|
2642
|
+
interface LegendDeps {
|
|
2643
|
+
/** On-screen colour — renderer first, document as fallback. */
|
|
2644
|
+
colorOf(category: LegendCategory): string;
|
|
2645
|
+
/** Min/max across tiers, or undefined when the chart carries no price. */
|
|
2646
|
+
rangeOf(category: LegendCategory): {
|
|
2647
|
+
min: number;
|
|
2648
|
+
max: number;
|
|
2649
|
+
} | undefined;
|
|
2650
|
+
/** Single price when there are no tiers. */
|
|
2651
|
+
priceOf(category: LegendCategory): number | undefined;
|
|
2652
|
+
offerOf(key: string): LegendOffer | null | undefined;
|
|
2653
|
+
money(amount: number): string;
|
|
2654
|
+
esc(value: string): string;
|
|
2655
|
+
}
|
|
2656
|
+
|
|
2657
|
+
type BuyerAssetLoader = (eventKey: string, asset: string) => Promise<Blob>;
|
|
2658
|
+
/**
|
|
2659
|
+
* One picker-lifetime cache. Reusing a blob URL avoids downloading an 8K
|
|
2660
|
+
* panorama again when a buyer opens the same row/venue view from another seat.
|
|
2661
|
+
*/
|
|
2662
|
+
declare class BuyerAssetObjectUrls {
|
|
2663
|
+
private readonly eventKey;
|
|
2664
|
+
private readonly load?;
|
|
2665
|
+
private readonly pending;
|
|
2666
|
+
private readonly created;
|
|
2667
|
+
private disposed;
|
|
2668
|
+
constructor(eventKey: string, load?: BuyerAssetLoader | undefined);
|
|
2669
|
+
/**
|
|
2670
|
+
* External organizer/CDN URLs pass through unchanged. SeatLayer event assets
|
|
2671
|
+
* never do: they require the transport, and a reference for another Event is
|
|
2672
|
+
* refused instead of being loaded anonymously.
|
|
2673
|
+
*/
|
|
2674
|
+
resolve(reference: string): Promise<string | null>;
|
|
2675
|
+
dispose(): void;
|
|
2676
|
+
}
|
|
2677
|
+
|
|
2678
|
+
/**
|
|
2679
|
+
* One performance of the group, already formatted by the wrapper.
|
|
2680
|
+
*
|
|
2681
|
+
* The wrapper owns the date formatting (it has the group's timezone and the
|
|
2682
|
+
* buyer's locale), so the picker never re-derives a date and the night strip in
|
|
2683
|
+
* the tooltip can never disagree with the dates list in the group chrome.
|
|
2684
|
+
*/
|
|
2685
|
+
interface PerformanceGroupNight {
|
|
2686
|
+
eventKey: string;
|
|
2687
|
+
name: string;
|
|
2688
|
+
/** Short, locale-aware date label for a pill — e.g. "Sat 23 Aug". */
|
|
2689
|
+
shortDate: string;
|
|
2690
|
+
}
|
|
2691
|
+
/**
|
|
2692
|
+
* A structural mirror of the engine's `SeatMark`.
|
|
2693
|
+
*
|
|
2694
|
+
* The engine type is not on the package barrel, and this seam must not force a
|
|
2695
|
+
* deep import into `@seatlayer/core/core/contracts/renderer` (which is not an
|
|
2696
|
+
* exported subpath). The shapes are identical, so `setSeatMarks` accepts this.
|
|
2697
|
+
*/
|
|
2698
|
+
interface PartialSeatMark {
|
|
2699
|
+
kind: 'partial';
|
|
2700
|
+
fraction?: number;
|
|
2701
|
+
data?: unknown;
|
|
2702
|
+
}
|
|
2703
|
+
interface PerformanceGroupPickerInternal {
|
|
2704
|
+
/** Distinguishes dynamic Performance Groups from fixed Season packages. */
|
|
2705
|
+
surface?: 'performance_group' | 'season';
|
|
2706
|
+
performanceCount: number;
|
|
2707
|
+
selectionMode?: 'same_seat' | 'per_performance';
|
|
2708
|
+
submissionState?: () => {
|
|
2709
|
+
complete: number;
|
|
2710
|
+
total: number;
|
|
2711
|
+
ready: boolean;
|
|
2712
|
+
};
|
|
2713
|
+
/**
|
|
2714
|
+
* Chronological performances. Present for both modes: the night strip needs
|
|
2715
|
+
* every night, in order, whichever mode the buyer is in.
|
|
2716
|
+
*/
|
|
2717
|
+
nights?: () => PerformanceGroupNight[];
|
|
2718
|
+
/**
|
|
2719
|
+
* PULL, not push. The widget asks for the current marks straight after it has
|
|
2720
|
+
* applied a status batch, so the two always land on the same tick and in the
|
|
2721
|
+
* only order that paints correctly (status first, mark second). A pushed mark
|
|
2722
|
+
* would race the availability read that produced it.
|
|
2723
|
+
*
|
|
2724
|
+
* Returns the full desired mark set PLUS an explicit `null` for every label
|
|
2725
|
+
* that has left `partial` since the last pull — `setSeatMarks` merges, so a
|
|
2726
|
+
* dropped label would otherwise keep its two-tone paint forever.
|
|
2727
|
+
*/
|
|
2728
|
+
seatMarks?: () => Record<string, PartialSeatMark | null>;
|
|
2729
|
+
/**
|
|
2730
|
+
* Which performance the tray's seat cards belong to, already formatted —
|
|
2731
|
+
* "Matinée · Sun, Aug 30", or just the date when the performance is unnamed.
|
|
2732
|
+
*
|
|
2733
|
+
* Per-performance mode shows ONE night's chart and therefore one night's
|
|
2734
|
+
* seats, and a card that says only "Section Arena B · Row A · Seat 3" under a
|
|
2735
|
+
* four-row "Your seats by night" list reads as if the other three nights were
|
|
2736
|
+
* dropped. Null in same-seat mode, where every card is every night and the
|
|
2737
|
+
* eyebrow would be noise.
|
|
2738
|
+
*/
|
|
2739
|
+
activePerformanceLabel?: () => string | null;
|
|
2740
|
+
/**
|
|
2741
|
+
* Exact dates represented by a same-seat card after a flexible group was
|
|
2742
|
+
* narrowed. Null for an all-dates package and outside Performance Groups.
|
|
2743
|
+
*/
|
|
2744
|
+
selectedPerformanceDates?: () => {
|
|
2745
|
+
summary: string;
|
|
2746
|
+
labels: string[];
|
|
2747
|
+
} | null;
|
|
2748
|
+
/**
|
|
2749
|
+
* Switch the map to one night. The wrapper routes this into the SAME path a
|
|
2750
|
+
* date tab takes, so the guards (a live hold, an undecided operation, the
|
|
2751
|
+
* night already being active) are enforced once, in one place.
|
|
2752
|
+
*/
|
|
2753
|
+
selectNight?: (eventKey: string) => void;
|
|
2754
|
+
/**
|
|
2755
|
+
* Per-night summary rows for the "Your seats" pane (per-performance only).
|
|
2756
|
+
* `active` marks the night the map is currently showing.
|
|
2757
|
+
*/
|
|
2758
|
+
nightSummary?: () => Array<{
|
|
2759
|
+
eventKey: string;
|
|
2760
|
+
name: string;
|
|
2761
|
+
labels: string[];
|
|
2762
|
+
active?: boolean;
|
|
2763
|
+
}>;
|
|
2764
|
+
/**
|
|
2765
|
+
* What the buyer has chosen across the WHOLE run.
|
|
2766
|
+
*
|
|
2767
|
+
* Every count the picker computes for itself — the tray header, the footer,
|
|
2768
|
+
* the booked overlay — is a count of the chart currently on screen, and for a
|
|
2769
|
+
* group that chart is one performance out of several. "1 selected" over a
|
|
2770
|
+
* four-night package is not a small imprecision; it is the wrong number, and
|
|
2771
|
+
* it is the number the buyer checks before paying. Only the wrapper knows the
|
|
2772
|
+
* other nights, so only the wrapper can answer this.
|
|
2773
|
+
*
|
|
2774
|
+
* `seats` is the run TOTAL (tickets), `perPerformance` is the per-night count
|
|
2775
|
+
* when every chosen night has the same one and null when they differ, and
|
|
2776
|
+
* `performancesChosen` is how many nights have any seat at all. Null (or
|
|
2777
|
+
* absent) outside a group, where the picker's own counts are correct.
|
|
2778
|
+
*/
|
|
2779
|
+
groupSelectionSummary?: () => {
|
|
2780
|
+
seats: number;
|
|
2781
|
+
performances: number;
|
|
2782
|
+
performancesChosen: number;
|
|
2783
|
+
perPerformance: number | null;
|
|
2784
|
+
} | null;
|
|
2785
|
+
/**
|
|
2786
|
+
* The quiet way out of same-seat selection, when the host opted in with
|
|
2787
|
+
* `allowSelectionModeSwitch`. Null (or absent) means the buyer is told to
|
|
2788
|
+
* pick a seat that is free every night instead — never a dead end.
|
|
2789
|
+
*/
|
|
2790
|
+
selectionModeSwitch?: {
|
|
2791
|
+
label: string;
|
|
2792
|
+
activate: () => void;
|
|
2793
|
+
} | null;
|
|
2794
|
+
/** Select one partly-available seat for exactly the dates where it is free. */
|
|
2795
|
+
partialSeatSelection?: {
|
|
2796
|
+
label: (availableCount: number) => string;
|
|
2797
|
+
/** Use the renderer's stable id so reselect targets the exact expanded seat. */
|
|
2798
|
+
activate: (seatId: string, availableEventKeys: string[]) => void;
|
|
2799
|
+
} | null;
|
|
2800
|
+
/** Group-only date controls inside the ordinary seat confirmation card. */
|
|
2801
|
+
confirmDateSelection?: {
|
|
2802
|
+
includedEventKeys: () => string[];
|
|
2803
|
+
availableEventKeys: (seatId: string) => string[];
|
|
2804
|
+
label: (selectedCount: number) => string;
|
|
2805
|
+
apply: (seatId: string, eventKeys: string[]) => Promise<boolean>;
|
|
2806
|
+
} | null;
|
|
2807
|
+
/**
|
|
2808
|
+
* Suppress every per-performance money surface (L7).
|
|
2809
|
+
*
|
|
2810
|
+
* A Performance Group is sold as ONE package: a per-performance subtotal, a
|
|
2811
|
+
* tier picker, or a chip amount is a number the buyer cannot act on and
|
|
2812
|
+
* cannot reconcile with what they will be charged. This used to be a
|
|
2813
|
+
* `display:none` sheet in the wrapper's stylesheet, which left the prices in
|
|
2814
|
+
* the DOM for screen readers, copy-paste and the accessibility tree.
|
|
2815
|
+
*/
|
|
2816
|
+
suppressPricing?: boolean;
|
|
2817
|
+
}
|
|
2818
|
+
|
|
2576
2819
|
/**
|
|
2577
2820
|
* pickerConfirmCard — the card that stands between a tapped seat and the cart.
|
|
2578
2821
|
*
|
|
@@ -2613,6 +2856,104 @@ declare class EmbeddedDesigner {
|
|
|
2613
2856
|
*/
|
|
2614
2857
|
type ConfirmCardMode = 'add' | 'remove';
|
|
2615
2858
|
|
|
2859
|
+
/**
|
|
2860
|
+
* pickerMinimap — the F3 venue-overview minimap: build, layout, static paint,
|
|
2861
|
+
* viewport rectangle, and the pointer/keyboard interactions that pan or focus
|
|
2862
|
+
* from it.
|
|
2863
|
+
*
|
|
2864
|
+
* Lifted out of SeatPicker.ts with the method bodies verbatim — statement for
|
|
2865
|
+
* statement, including canvas call order, which matters here because a 2D
|
|
2866
|
+
* context is a state machine and jsdom cannot exercise it. The ONLY edits are
|
|
2867
|
+
* the indirections through {@link MinimapHost}: `this.controller` →
|
|
2868
|
+
* `this.host.controller`, `this.cssVar` → `this.host.cssVar`, `this.tf` →
|
|
2869
|
+
* the module-level `tfStatic` it always delegated to, and the widget root and
|
|
2870
|
+
* focused-section label behind accessors (SeatPicker replaces both across a
|
|
2871
|
+
* re-mount, so they must be read late, not captured).
|
|
2872
|
+
*
|
|
2873
|
+
* `build()` also takes its mount element as an argument rather than reading
|
|
2874
|
+
* SeatPicker's region map. Everything else — the two-canvas base/blit split,
|
|
2875
|
+
* the drag-capture bookkeeping, the click suppression after a drag — is
|
|
2876
|
+
* unchanged.
|
|
2877
|
+
*/
|
|
2878
|
+
|
|
2879
|
+
/** What the minimap needs from the widget around it. */
|
|
2880
|
+
interface MinimapHost {
|
|
2881
|
+
readonly controller: PickerController;
|
|
2882
|
+
/** The widget root — it carries `data-minimap-open`. A function, not a
|
|
2883
|
+
* field: SeatPicker rebuilds its root, and a captured one goes stale. */
|
|
2884
|
+
root(): HTMLElement | null;
|
|
2885
|
+
/** Resolved `--sl-*` token value (canvas needs a real colour, not `var()`). */
|
|
2886
|
+
cssVar(name: string): string;
|
|
2887
|
+
/** Label of the last surfaced section card. Backs the minimap caption when
|
|
2888
|
+
* the renderer snapshot reports no active section. */
|
|
2889
|
+
focusedSectionLabel(): string | undefined;
|
|
2890
|
+
}
|
|
2891
|
+
declare class PickerMinimap {
|
|
2892
|
+
private readonly host;
|
|
2893
|
+
private miniCanvas;
|
|
2894
|
+
private miniBase;
|
|
2895
|
+
private miniWrap;
|
|
2896
|
+
private miniToggle;
|
|
2897
|
+
private miniLabel;
|
|
2898
|
+
private miniTf;
|
|
2899
|
+
private miniDrag;
|
|
2900
|
+
private miniSuppressClick;
|
|
2901
|
+
/** The buyer dismissed the overview by hand; zoom must not undo that. */
|
|
2902
|
+
private userClosed;
|
|
2903
|
+
constructor(host: MinimapHost);
|
|
2904
|
+
/**
|
|
2905
|
+
* Take the overview off the page entirely.
|
|
2906
|
+
*
|
|
2907
|
+
* The phone does not get a minimap at all any more, and a picker can cross
|
|
2908
|
+
* that breakpoint by rotating. Hiding it with CSS would leave a canvas the
|
|
2909
|
+
* widget keeps redrawing on every pan of a map it is not on screen for, plus
|
|
2910
|
+
* a toggle button in the tab order for a panel nobody can open. So the
|
|
2911
|
+
* instance leaves, and `SeatPicker.minimap` goes back to null.
|
|
2912
|
+
*/
|
|
2913
|
+
dispose(): void;
|
|
2914
|
+
/**
|
|
2915
|
+
* Build the overview minimap: a static venue thumbnail (section outlines, or
|
|
2916
|
+
* seat dots when the chart has no sections) with the live viewport rectangle
|
|
2917
|
+
* drawn on top. The rect tracks pan/zoom via the constructor's onViewChange.
|
|
2918
|
+
*/
|
|
2919
|
+
build(mount: HTMLElement): void;
|
|
2920
|
+
/**
|
|
2921
|
+
* Reveal or retire the overview from ZOOM rather than from a tap.
|
|
2922
|
+
*
|
|
2923
|
+
* A buyer deep in the seats has lost every label; a buyer at the overview is
|
|
2924
|
+
* looking at the venue already and does not need a second, smaller copy of
|
|
2925
|
+
* it. The toggle button stays exactly as it was — this only decides the
|
|
2926
|
+
* default, and an explicit close still wins until they zoom back out, which
|
|
2927
|
+
* is also where that decision is forgotten.
|
|
2928
|
+
*/
|
|
2929
|
+
setAutoOpen(deep: boolean): void;
|
|
2930
|
+
/**
|
|
2931
|
+
* `moveFocus` is false for the zoom-driven reveal. Following focus into a
|
|
2932
|
+
* panel is right when the buyer PRESSED something — they asked to be there.
|
|
2933
|
+
* It is wrong when the panel opened by itself: the buyer is mid-pinch on the
|
|
2934
|
+
* map, and taking the caret to a canvas they never asked for interrupts the
|
|
2935
|
+
* gesture and strands a keyboard user somewhere they did not navigate to.
|
|
2936
|
+
*/
|
|
2937
|
+
private setMinimapOpen;
|
|
2938
|
+
/** Re-fit the thumbnail whenever the active floor or complete overview
|
|
2939
|
+
* changes bounds. This is presentation-only; the source chart is untouched. */
|
|
2940
|
+
private layoutMinimap;
|
|
2941
|
+
private syncMinimapLabel;
|
|
2942
|
+
/** Repaint the static overview + rect (floor switch, live open/close). */
|
|
2943
|
+
refreshMinimap(): void;
|
|
2944
|
+
/** Paint the venue overview into the offscreen base canvas. */
|
|
2945
|
+
private drawMinimapStatic;
|
|
2946
|
+
/** Blit the base overview, then stroke the current viewport rectangle on top. */
|
|
2947
|
+
drawMinimapRect(): void;
|
|
2948
|
+
private minimapWorldPoint;
|
|
2949
|
+
private minimapPointerDown;
|
|
2950
|
+
private minimapPointerMove;
|
|
2951
|
+
private minimapPointerUp;
|
|
2952
|
+
private minimapKeydown;
|
|
2953
|
+
/** Minimap click → focus an available section, otherwise pan there. */
|
|
2954
|
+
private minimapJump;
|
|
2955
|
+
}
|
|
2956
|
+
|
|
2616
2957
|
/** What the saved-seat comparison chip needs from the widget around it. */
|
|
2617
2958
|
interface CompareChipHost {
|
|
2618
2959
|
/** The live 3D overlay the chip mounts into, or null when 3D is down. */
|
|
@@ -2641,6 +2982,12 @@ declare class View3dCompareChip {
|
|
|
2641
2982
|
mainButton(): HTMLElement | null;
|
|
2642
2983
|
}
|
|
2643
2984
|
|
|
2985
|
+
interface SeatViewChrome {
|
|
2986
|
+
/** Called with every stop change, and with null when the seat view ends. */
|
|
2987
|
+
onStopChange(stop: SeatViewStopName | null): void;
|
|
2988
|
+
dispose(): void;
|
|
2989
|
+
}
|
|
2990
|
+
|
|
2644
2991
|
/**
|
|
2645
2992
|
* The cart's arithmetic, in ONE place.
|
|
2646
2993
|
*
|
|
@@ -2783,14 +3130,14 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
2783
3130
|
readonly opts: SeatPickerOptions;
|
|
2784
3131
|
/** @internal */ readonly api: PickerTransport;
|
|
2785
3132
|
/** Authenticated view media, cached only for this picker lifetime. */
|
|
2786
|
-
|
|
3133
|
+
/** @internal */ readonly buyerAssetUrls: BuyerAssetObjectUrls;
|
|
2787
3134
|
/** Our own public client, or null when the host injected a transport. */
|
|
2788
3135
|
private readonly pubApi;
|
|
2789
3136
|
/** Null for the ordinary public picker — the tokenless path is untouched. */
|
|
2790
3137
|
private readonly access;
|
|
2791
3138
|
private realtime;
|
|
2792
3139
|
private accessEl;
|
|
2793
|
-
|
|
3140
|
+
/** @internal */ readonly apiBase: string;
|
|
2794
3141
|
/** @internal */ readonly controller: PickerController;
|
|
2795
3142
|
/** @internal */ maxTickets: number;
|
|
2796
3143
|
/** Exact ticket count required before checkout; null keeps ordinary 1..max behavior. */
|
|
@@ -2798,9 +3145,9 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
2798
3145
|
private lastSelectionValidity;
|
|
2799
3146
|
/** Original host pricing, kept separate from live server offer overrides. */
|
|
2800
3147
|
private readonly hostPricing;
|
|
2801
|
-
|
|
3148
|
+
/** @internal */ readonly performanceGroup: PerformanceGroupPickerInternal | null;
|
|
2802
3149
|
/** Structural (not CSS) removal of per-performance money — see pickerInternal. */
|
|
2803
|
-
|
|
3150
|
+
/** @internal */ readonly suppressPricing: boolean;
|
|
2804
3151
|
/** @internal */ root: HTMLDivElement | null;
|
|
2805
3152
|
private mapHost;
|
|
2806
3153
|
private rendered;
|
|
@@ -2814,9 +3161,9 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
2814
3161
|
private localeGeneration;
|
|
2815
3162
|
/** @internal */ els: Record<string, HTMLElement>;
|
|
2816
3163
|
/** Feature 6 anchor regions — positioned flex containers over the map. */
|
|
2817
|
-
|
|
3164
|
+
/** @internal */ regions: Record<string, HTMLElement>;
|
|
2818
3165
|
private ro;
|
|
2819
|
-
|
|
3166
|
+
/** @internal */ holdTimer: ReturnType<typeof setInterval> | null;
|
|
2820
3167
|
private toastTimer;
|
|
2821
3168
|
/** The availability read every other caller joins. See refreshOfferAvailability. */
|
|
2822
3169
|
private offerReadInFlight;
|
|
@@ -2839,11 +3186,11 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
2839
3186
|
/** @internal */ readonly pricesByChannel: Map<string, ChannelPriceOverride[]>;
|
|
2840
3187
|
/** @internal */ hold: HoldResult | null;
|
|
2841
3188
|
/** Latest server expiry for the open hold (moves on extend). */
|
|
2842
|
-
|
|
3189
|
+
/** @internal */ holdExpiresAt: number;
|
|
2843
3190
|
/** True once we handed off to checkout — arms booked-confirmation detection. */
|
|
2844
|
-
|
|
3191
|
+
/** @internal */ handedOff: boolean;
|
|
2845
3192
|
/** Guards single onBooked + single success overlay per hold. */
|
|
2846
|
-
|
|
3193
|
+
/** @internal */ bookedShown: boolean;
|
|
2847
3194
|
/**
|
|
2848
3195
|
* The last hold attempt lost its seats.
|
|
2849
3196
|
*
|
|
@@ -2870,8 +3217,12 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
2870
3217
|
private paymentOptions;
|
|
2871
3218
|
/** The mounted payment card, while one is up. */
|
|
2872
3219
|
private checkoutPanel;
|
|
2873
|
-
|
|
3220
|
+
/** @internal */ extendEl: HTMLDivElement | null;
|
|
2874
3221
|
private bookedEl;
|
|
3222
|
+
/** The blocking "your seats were released" dialog, while it is up. */
|
|
3223
|
+
private holdExpiredEl;
|
|
3224
|
+
/** What that hold actually held, captured before the state was cleared. */
|
|
3225
|
+
private holdExpiredUnits;
|
|
2875
3226
|
/** @internal Pending GA units per (area, tier) — see pickerGaPrompt.ts. */
|
|
2876
3227
|
gaQty: GaQtyMap;
|
|
2877
3228
|
/** @internal The open quantity prompt (popover or sheet), while one is up. */
|
|
@@ -2902,14 +3253,14 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
2902
3253
|
private seatsRevealed;
|
|
2903
3254
|
private seatsRevealedReport;
|
|
2904
3255
|
/** The seat the confirm card is about — the same facade as `confirmEl`. */
|
|
2905
|
-
|
|
2906
|
-
|
|
3256
|
+
/** @internal */ get confirmSeat(): ExpandedSeat | null;
|
|
3257
|
+
/** @internal */ set confirmSeat(seat: ExpandedSeat | null);
|
|
2907
3258
|
/** The confirm card owns its element and its candidate seat. */
|
|
2908
3259
|
private confirmCardCache;
|
|
2909
3260
|
private suppressConfirmationSeatId;
|
|
2910
3261
|
private tableDialogEl;
|
|
2911
|
-
|
|
2912
|
-
|
|
3262
|
+
/** @internal */ tableDialog: TableSelectionDetails | null;
|
|
3263
|
+
/** @internal */ tableDialogHeld: boolean;
|
|
2913
3264
|
private tableDialogReturnFocus;
|
|
2914
3265
|
/** @internal */ srEl: HTMLDivElement | null;
|
|
2915
3266
|
private baQty;
|
|
@@ -2938,24 +3289,24 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
2938
3289
|
private cbSafe;
|
|
2939
3290
|
private rungsEl;
|
|
2940
3291
|
private projectionEl;
|
|
2941
|
-
|
|
3292
|
+
/** @internal */ buyerView: 'map' | 'venue3d';
|
|
2942
3293
|
/** @internal */ view3dEl: HTMLDivElement | null;
|
|
2943
3294
|
/** @internal */ view3dHandle: Venue3DHandle | null;
|
|
2944
3295
|
/** Monotonic token so a stale async mount (buyer left before OGL finished
|
|
2945
3296
|
* loading) never installs its handle over a newer state. */
|
|
2946
|
-
|
|
3297
|
+
/** @internal */ view3dGen: number;
|
|
2947
3298
|
/** Seat whose 2D confirm card launched "See it in 3D"; re-shown on return. */
|
|
2948
|
-
|
|
3299
|
+
/** @internal */ view3dReturnSeat: ExpandedSeat | null;
|
|
2949
3300
|
/** Current premium 3D journey depth. `null` is the venue; a seat id is the
|
|
2950
3301
|
* fixed seat-eye state. It lets Back unwind one step before leaving 3D. */
|
|
2951
|
-
|
|
3302
|
+
/** @internal */ view3dTargetSeatId: string | null;
|
|
2952
3303
|
/** Inspection-only comparison. These ids never represent cart selection. */
|
|
2953
3304
|
/** @internal */ view3dCompareSeatIds: string[];
|
|
2954
3305
|
/** The saved-seat comparison chip — owned by pickerView3dNav.ts. */
|
|
2955
3306
|
/** @internal */ readonly view3dCompareChip: View3dCompareChip;
|
|
2956
3307
|
/** @internal */ view3dCompareEl: HTMLDivElement | null;
|
|
2957
3308
|
/** @internal */ view3dCompareCleanup: (() => void) | null;
|
|
2958
|
-
|
|
3309
|
+
/** @internal */ view3dSeatViewChrome: SeatViewChrome | null;
|
|
2959
3310
|
/** @internal */ view3dPassportEl: HTMLDivElement | null;
|
|
2960
3311
|
/** @internal */ view3dPassportCleanup: (() => void) | null;
|
|
2961
3312
|
private floorsEl;
|
|
@@ -2967,45 +3318,45 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
2967
3318
|
/** The 3D "Back to map"/"Back to venue" control while 3D is on. It lives in
|
|
2968
3319
|
* the top-left chrome region rather than in the 3D overlay, so it outlives
|
|
2969
3320
|
* the overlay's own teardown and must be removed explicitly. */
|
|
2970
|
-
|
|
3321
|
+
/** @internal */ view3dBack: HTMLButtonElement | null;
|
|
2971
3322
|
/** The levels/areas rail while 3D is on. Region chrome for the same reason
|
|
2972
3323
|
* the back control is (it shared twelve pixels with the ♿ menu), so like
|
|
2973
3324
|
* the back control it outlives the overlay and is removed by hand. */
|
|
2974
|
-
|
|
3325
|
+
/** @internal */ view3dNav: HTMLElement | null;
|
|
2975
3326
|
/** Which chips the price rail last drew, so a repaint that changes them can
|
|
2976
3327
|
* send the scroller back to the start without stealing a buyer's own scroll. */
|
|
2977
|
-
|
|
3328
|
+
/** @internal */ lastRailSignature: string;
|
|
2978
3329
|
/** The panel's price-band <select>, so the rail's reset chip can keep it in
|
|
2979
3330
|
* step. Null when the chart has fewer than two bands and none was built. */
|
|
2980
|
-
|
|
2981
|
-
|
|
3331
|
+
/** @internal */ priceSelect: HTMLSelectElement | null;
|
|
3332
|
+
/** @internal */ minimap: PickerMinimap | null;
|
|
2982
3333
|
private pickerLayoutSize;
|
|
2983
|
-
|
|
2984
|
-
|
|
3334
|
+
/** @internal */ priceBandKeys: Set<string> | null;
|
|
3335
|
+
/** @internal */ focusedCatKey: string | null;
|
|
2985
3336
|
/** "Hide limited-view seats" — mirrored into 3D by `seatState3dFor`. */
|
|
2986
|
-
|
|
2987
|
-
|
|
3337
|
+
/** @internal */ limitedViewFilter: boolean;
|
|
3338
|
+
/** @internal */ pricesExpanded: boolean;
|
|
2988
3339
|
/** The section card owns its element, collapse state and shown-at clock. */
|
|
2989
3340
|
private sectionCardCache;
|
|
2990
3341
|
/** Last surfaced section summary (re-rendered when the price band changes). */
|
|
2991
3342
|
/** The tapped section the card is holding. A facade over the card in both
|
|
2992
3343
|
* directions: reading it must not build chrome, and writing it must not
|
|
2993
3344
|
* repaint — see SectionCard.adopt. */
|
|
2994
|
-
|
|
2995
|
-
|
|
3345
|
+
/** @internal */ get lastSection(): SectionSummary | null;
|
|
3346
|
+
/** @internal */ set lastSection(summary: SectionSummary | null);
|
|
2996
3347
|
/** Previous tray ticket count — first 0→n transition auto-expands the mobile sheet. */
|
|
2997
|
-
|
|
3348
|
+
/** @internal */ lastTrayCount: number;
|
|
2998
3349
|
/** The opt-in language switcher, when `languages` named at least two. */
|
|
2999
3350
|
private langSel;
|
|
3000
3351
|
/** Previous computed total — drives a single explanatory value bump. */
|
|
3001
|
-
|
|
3352
|
+
/** @internal */ lastTrayTotal: number;
|
|
3002
3353
|
/** Stable item keys prevent tray chips re-animating on unrelated realtime syncs. */
|
|
3003
3354
|
private lastTrayKeys;
|
|
3004
3355
|
private bestAvailableBusy;
|
|
3005
3356
|
private releasingLabels;
|
|
3006
3357
|
/** Selected labels awaiting the hold response; their own realtime echo can arrive first. */
|
|
3007
3358
|
private holdingLabels;
|
|
3008
|
-
|
|
3359
|
+
/** @internal */ ctaPhase: 'idle' | 'holding' | 'checkout';
|
|
3009
3360
|
/** The ♿ control and its menu — one node, in the map's bottom-left corner. */
|
|
3010
3361
|
private a11yMenu;
|
|
3011
3362
|
private detachAttention;
|
|
@@ -3013,19 +3364,19 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3013
3364
|
* part is the engine's; see pickerHoldLapse.ts. */
|
|
3014
3365
|
private readonly lapse;
|
|
3015
3366
|
/** Rail scroll listener attached once; the rail repaints many times. */
|
|
3016
|
-
|
|
3017
|
-
|
|
3367
|
+
/** @internal */ railEdgesBound: boolean;
|
|
3368
|
+
/** @internal */ fsFallback: boolean;
|
|
3018
3369
|
private fsChangeHandler;
|
|
3019
3370
|
private fsEscHandler;
|
|
3020
3371
|
/** Host-level event chrome owns the duplicate identity outside full screen. */
|
|
3021
3372
|
private eventDetailsHidden;
|
|
3022
3373
|
/** True while the hold note reads "N more selected" — the tick must not overwrite it. */
|
|
3023
|
-
|
|
3374
|
+
/** @internal */ holdCopyPending: boolean;
|
|
3024
3375
|
/** Wide-layout ticket panel collapsed (map owns the full width). */
|
|
3025
3376
|
private sideCollapsed;
|
|
3026
3377
|
private sideToggleEl;
|
|
3027
3378
|
/** True once we've asked the host page to pin us fullscreen (framed, no native). */
|
|
3028
|
-
|
|
3379
|
+
/** @internal */ framedFs: boolean;
|
|
3029
3380
|
/** Last height (px) posted to a host frame; dedupes redundant reports. */
|
|
3030
3381
|
private lastPostedHeight;
|
|
3031
3382
|
/** See `./seatViewThumb`, which the native bridge answers from as well. */
|
|
@@ -3051,7 +3402,7 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3051
3402
|
/** Post `seatlayer:height` to the host when framed and the value changed. */
|
|
3052
3403
|
private reportFramedHeight;
|
|
3053
3404
|
/** Full screen via the native API, falling back to a fixed-position overlay (iOS Safari). */
|
|
3054
|
-
|
|
3405
|
+
/** @internal */ toggleFullscreen(): void;
|
|
3055
3406
|
/**
|
|
3056
3407
|
* Is the picker already as big as the screen it is on?
|
|
3057
3408
|
*
|
|
@@ -3220,7 +3571,9 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3220
3571
|
* falsely block standing room) — mirrors the public page. Clears live when WS
|
|
3221
3572
|
* frees a seat up.
|
|
3222
3573
|
*/
|
|
3223
|
-
|
|
3574
|
+
/** @internal */ syncSoldout(categories: Array<{
|
|
3575
|
+
key: string;
|
|
3576
|
+
}>, left: Record<string, number>): void;
|
|
3224
3577
|
/**
|
|
3225
3578
|
* Pure sold-out predicate: every SEATED category's free count is 0, there is at
|
|
3226
3579
|
* least one seated category, and there are no GA areas (GA capacity isn't
|
|
@@ -3256,44 +3609,25 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3256
3609
|
/** Restart one finite CSS animation without leaving a permanent state class. */
|
|
3257
3610
|
private animateOnce;
|
|
3258
3611
|
/** Selection feedback belongs on the selected seat, not across the whole map. */
|
|
3259
|
-
|
|
3612
|
+
/** @internal */ flashPickedSeat(id: string): void;
|
|
3260
3613
|
/** A completed hold gets one short map ripple per concrete seat. */
|
|
3261
3614
|
private flashHeldSeats;
|
|
3262
3615
|
/** Update only the action affordance; selection callbacks must not refire. */
|
|
3263
3616
|
/** @internal */ committedSelection(): PickerSeat[];
|
|
3264
|
-
|
|
3265
|
-
|
|
3617
|
+
/** @internal */ pendingSelectionCount(): number;
|
|
3618
|
+
/** @internal */ heldTicketCount(): number;
|
|
3266
3619
|
/** @internal */ totalTicketCount(): number;
|
|
3267
3620
|
/** Held tickets and standing quantities consume the same order-wide cap. */
|
|
3268
|
-
|
|
3269
|
-
|
|
3270
|
-
/**
|
|
3271
|
-
* Narrate the money path.
|
|
3272
|
-
*
|
|
3273
|
-
* THE PHASE BELONGS TO THE PROMISE, NOT TO A CLOCK. `checkout` used to clear
|
|
3274
|
-
* itself after a fixed 1,100ms whatever the unawaited hold or handoff was
|
|
3275
|
-
* doing — so the button re-armed while the request was still in flight, and a
|
|
3276
|
-
* buyer could press it again into a hold that had already failed. The phase
|
|
3277
|
-
* now ends where the work ends: `runCheckoutHandoff` returns it to idle when
|
|
3278
|
-
* the handoff settles, and `handleCta`'s catch returns it on failure.
|
|
3279
|
-
*/
|
|
3280
|
-
private setCtaPhase;
|
|
3281
|
-
/**
|
|
3282
|
-
* Hand the buyer to checkout and hold the "Opening secure checkout…" state
|
|
3283
|
-
* for exactly as long as that takes.
|
|
3284
|
-
*
|
|
3285
|
-
* The default `onCheckout` is usually synchronous and usually navigates; the
|
|
3286
|
-
* hosted path is a real promise. Awaiting both means the one visible signal
|
|
3287
|
-
* that money is moving cannot expire early, and cannot outlive the work
|
|
3288
|
-
* either.
|
|
3289
|
-
*/
|
|
3621
|
+
/** @internal */ updateSelectionCapacity(): void;
|
|
3622
|
+
/** @internal */ syncCta(count?: number, pending?: number): void;
|
|
3623
|
+
/** @internal */ setCtaPhase(phase: 'idle' | 'holding' | 'checkout'): void;
|
|
3290
3624
|
private runCheckoutHandoff;
|
|
3291
3625
|
/** Session-scoped capability key: isolated by API origin and event. */
|
|
3292
|
-
|
|
3293
|
-
|
|
3294
|
-
|
|
3295
|
-
|
|
3296
|
-
|
|
3626
|
+
/** @internal */ holdStorageKey(): string;
|
|
3627
|
+
/** @internal */ rememberedHoldId(): string | null;
|
|
3628
|
+
/** @internal */ rememberHold(hold: HoldResult): void;
|
|
3629
|
+
/** @internal */ forgetHold(): void;
|
|
3630
|
+
/** @internal */ resumeHoldFromServer(holdId: string, automatic: boolean): Promise<HoldResult | null>;
|
|
3297
3631
|
private restoreRememberedHold;
|
|
3298
3632
|
/** Section-bearing objects on the active floor (single-floor → doc.objects). */
|
|
3299
3633
|
private activeFloorObjects;
|
|
@@ -3330,15 +3664,15 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3330
3664
|
* this would be two ways for the map, the legend, the floors and the 3D
|
|
3331
3665
|
* snapshot to end up disagreeing about what is filtered.
|
|
3332
3666
|
*/
|
|
3333
|
-
|
|
3667
|
+
/** @internal */ applyPriceBand(keys: string[] | null): void;
|
|
3334
3668
|
/** Build projection, rung and floor controls for arena-scale charts. */
|
|
3335
3669
|
private buildArenaChrome;
|
|
3336
3670
|
/** Reflect the engine's current LOD rung onto the pill group. */
|
|
3337
|
-
|
|
3338
|
-
|
|
3671
|
+
/** @internal */ syncRung(): void;
|
|
3672
|
+
/** @internal */ syncProjection(): void;
|
|
3339
3673
|
/** Can this picker offer the 3D venue view? Requires the option (default on),
|
|
3340
3674
|
* WebGL2, a chart to render, and a chart small enough to render WELL. */
|
|
3341
|
-
|
|
3675
|
+
/** @internal */ canOffer3d(): boolean;
|
|
3342
3676
|
/**
|
|
3343
3677
|
* The seat ceiling for offering 3D. See `max3DSeats` — an explicit host value
|
|
3344
3678
|
* always wins; otherwise a small/low-core device gets half the desktop budget,
|
|
@@ -3346,12 +3680,12 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3346
3680
|
*/
|
|
3347
3681
|
private max3dSeats;
|
|
3348
3682
|
/** Reflect the active floor onto the switcher rail. */
|
|
3349
|
-
|
|
3683
|
+
/** @internal */ syncFloors(): void;
|
|
3350
3684
|
/** The tapped-section summary card in all three of its forms. Built lazily:
|
|
3351
3685
|
* it reads `els`/`root`, which are assigned after construction. */
|
|
3352
3686
|
private get sectionCard();
|
|
3353
3687
|
/** Show (or clear, on null) the tapped-section summary card. */
|
|
3354
|
-
|
|
3688
|
+
/** @internal */ showSectionCard(summary: SectionSummary | null): void;
|
|
3355
3689
|
private renderSectionCard;
|
|
3356
3690
|
private collapseSectionCard;
|
|
3357
3691
|
private sectionCardOnView;
|
|
@@ -3372,8 +3706,8 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3372
3706
|
*/
|
|
3373
3707
|
private markedSeatAnnouncement;
|
|
3374
3708
|
/** aria-live readout when keyboard focus lands on a seat. */
|
|
3375
|
-
|
|
3376
|
-
|
|
3709
|
+
/** @internal */ announceSeat(seat: ExpandedSeat | null): void;
|
|
3710
|
+
/** @internal */ showTableDialog(table: TableSelectionDetails, held: boolean, returnFocus?: HTMLElement | null): void;
|
|
3377
3711
|
private renderTableDialogState;
|
|
3378
3712
|
private confirmTableDialog;
|
|
3379
3713
|
private cancelTableDialog;
|
|
@@ -3389,7 +3723,7 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3389
3723
|
private get confirmCard();
|
|
3390
3724
|
/** @internal */ showConfirm(seat: ExpandedSeat, mode?: ConfirmCardMode): void;
|
|
3391
3725
|
private reanchorConfirm;
|
|
3392
|
-
|
|
3726
|
+
/** @internal */ dismissConfirm(): void;
|
|
3393
3727
|
/** @internal The card's own button calls the card; this is the seam the
|
|
3394
3728
|
* widget's tests press. */
|
|
3395
3729
|
/** @internal */ commitConfirm(): Promise<void>;
|
|
@@ -3399,7 +3733,7 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3399
3733
|
* call and replace both on the instance. */
|
|
3400
3734
|
private inviteCommit;
|
|
3401
3735
|
private addSeatLabel;
|
|
3402
|
-
|
|
3736
|
+
/** @internal */ seatViewEnabled(): boolean;
|
|
3403
3737
|
/** Every bookable seat (cached) — neighbor heads for the generated panorama. */
|
|
3404
3738
|
/** @internal */ allSeats(): ExpandedSeat[];
|
|
3405
3739
|
/**
|
|
@@ -3461,7 +3795,7 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3461
3795
|
private refreshOfferAvailability;
|
|
3462
3796
|
/** The read itself. Never rejects — see the catch. */
|
|
3463
3797
|
private readOfferAvailability;
|
|
3464
|
-
|
|
3798
|
+
/** @internal */ offerPrice(categoryKey: string | undefined): TicketOfferPrice | null;
|
|
3465
3799
|
private applyChannelPricing;
|
|
3466
3800
|
private syncOffer;
|
|
3467
3801
|
/**
|
|
@@ -3473,26 +3807,29 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3473
3807
|
/** @internal */ paidPrice(categoryKey: string | undefined, tierId: string | null | undefined, fallback: number, objectLabel?: string): number;
|
|
3474
3808
|
/** The half of a legend's inputs the rail and the price list share, resolved
|
|
3475
3809
|
* once so the two renderings cannot be given different answers. */
|
|
3476
|
-
|
|
3810
|
+
/** @internal */ legendDeps(): LegendDeps;
|
|
3477
3811
|
/** Paint the phone's always-visible legend; the chip HTML lives in
|
|
3478
3812
|
* pickerLegend.ts. A legend of ONE teaches nothing, so it stays away. */
|
|
3479
|
-
|
|
3480
|
-
|
|
3813
|
+
/** @internal */ syncPriceRail(categories: LegendCategory[], left: Record<string, number>, deps?: LegendDeps): void;
|
|
3814
|
+
/** @internal */ syncPrices(): void;
|
|
3481
3815
|
/** Tap a price row → filter + frame that category on the map; tap again to
|
|
3482
3816
|
* clear. Shares `priceBandKeys` with the band selector so the row-dim state
|
|
3483
3817
|
* has one source of truth (and each control resets the other). */
|
|
3484
|
-
|
|
3818
|
+
/** @internal */ focusCategory(key: string): void;
|
|
3485
3819
|
/**
|
|
3486
3820
|
* Live-activity strip: turn WS availability deltas into one quiet line of
|
|
3487
3821
|
* social proof ("2 seats just taken in VIP · 118 left"). Diffs per-category
|
|
3488
3822
|
* counts on every status change — no per-seat payload needed. Skips the very
|
|
3489
3823
|
* first computation (initial load is not "activity").
|
|
3490
3824
|
*/
|
|
3491
|
-
|
|
3492
|
-
|
|
3493
|
-
|
|
3494
|
-
|
|
3495
|
-
|
|
3825
|
+
/** @internal */ narrateAvailability(categories: Array<{
|
|
3826
|
+
key: string;
|
|
3827
|
+
label: string;
|
|
3828
|
+
}>, left: Record<string, number>): void;
|
|
3829
|
+
/** @internal */ lastCatAvail: Record<string, number> | null;
|
|
3830
|
+
/** @internal */ lastAvailFloorId: string;
|
|
3831
|
+
/** @internal */ availQuietUntil: number;
|
|
3832
|
+
/** @internal */ liveTimer: ReturnType<typeof setTimeout> | null;
|
|
3496
3833
|
/** A live delta took one of OUR selected (not yet held) seats — evict + tell the buyer. */
|
|
3497
3834
|
private evictTakenSelections;
|
|
3498
3835
|
/** @internal */ syncTray(): void;
|
|
@@ -3513,7 +3850,7 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3513
3850
|
private fitTranslatedRows;
|
|
3514
3851
|
private emitSelectionValidity;
|
|
3515
3852
|
/** Paint the bottom-sheet's collapsed one-liner (pickerTray.ts builds it). */
|
|
3516
|
-
|
|
3853
|
+
/** @internal */ renderPeek(count: number, total: number, pendingCount: number, bump?: boolean): void;
|
|
3517
3854
|
/**
|
|
3518
3855
|
* Release one buyer-visible held LINE. That is one label for a seat, and every
|
|
3519
3856
|
* unit label behind a grouped GA line — a buyer who presses × on
|
|
@@ -3522,11 +3859,11 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3522
3859
|
private removeHeldLabels;
|
|
3523
3860
|
private handleChangeSeats;
|
|
3524
3861
|
/** @internal */ handleCta(): Promise<void>;
|
|
3525
|
-
|
|
3526
|
-
|
|
3862
|
+
/** @internal */ startHoldTimer(expiresAt: number): void;
|
|
3863
|
+
/** @internal */ stopHoldTimer(): void;
|
|
3527
3864
|
/** Show/refresh (or hide) the "Need more time?" prompt with the live seconds left. */
|
|
3528
|
-
|
|
3529
|
-
|
|
3865
|
+
/** @internal */ setExtendPrompt(show: boolean, ms: number): void;
|
|
3866
|
+
/** @internal */ handleExtend(): Promise<void>;
|
|
3530
3867
|
/**
|
|
3531
3868
|
* Fire the booked-confirmation state once the buyer's held seats settle to
|
|
3532
3869
|
* booked. The controller clears its own hold the moment every held label reads
|
|
@@ -3565,7 +3902,7 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3565
3902
|
* The default branch is the literal call that stood here before hosted
|
|
3566
3903
|
* checkout existed, unchanged, so nothing about an existing integration moves.
|
|
3567
3904
|
*/
|
|
3568
|
-
|
|
3905
|
+
/** @internal */ checkoutHandoff(hold: HoldResult, seats: PickerSeat[]): Promise<void>;
|
|
3569
3906
|
/**
|
|
3570
3907
|
* Take the money ourselves, through the organizer's own gateway.
|
|
3571
3908
|
*
|
|
@@ -3591,8 +3928,8 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3591
3928
|
private openCheckoutPanel;
|
|
3592
3929
|
private closeCheckoutPanel;
|
|
3593
3930
|
/** Assemble the stable {@link CheckoutHandoff} from a hold's server line items. */
|
|
3594
|
-
|
|
3595
|
-
|
|
3931
|
+
/** @internal */ buildHandoff(hold: HoldResult): CheckoutHandoff;
|
|
3932
|
+
/** @internal */ emitHoldChange(): void;
|
|
3596
3933
|
/** @internal */ toast(msg: string, tone?: 'neutral' | 'success' | 'warning' | 'error', action?: {
|
|
3597
3934
|
label: string;
|
|
3598
3935
|
onClick: () => void;
|
|
@@ -3815,55 +4152,20 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3815
4152
|
* source compatibility but coerce to `flat` with a one-time deprecation warn. */
|
|
3816
4153
|
private perspectiveWarned;
|
|
3817
4154
|
private normalizeInitialView;
|
|
4155
|
+
private emitAnalytics;
|
|
4156
|
+
/** @internal */ emit3dAnalytics(event: string, props?: Record<string, unknown>): void;
|
|
3818
4157
|
/** Current buyer view: the flat map, or the interactive 3D venue. */
|
|
3819
4158
|
getBuyerView(): SeatPickerBuyerView;
|
|
3820
|
-
/**
|
|
3821
|
-
* Switch between the flat seat **Map** and the interactive **3D venue** view —
|
|
3822
|
-
* the same control the buyer's on-widget `Map | 3D` toggle drives.
|
|
3823
|
-
*
|
|
3824
|
-
* Entering `'venue3d'` with `opts.flyToSeatId` runs the cinematic tour: the
|
|
3825
|
-
* camera flies to the seat and holds in the live scene (a chip offers the
|
|
3826
|
-
* 360° view-from-seat). When the widget is **already** in the 3D
|
|
3827
|
-
* view, the camera simply flies to the requested seat — the GL scene is not
|
|
3828
|
-
* torn down or rebuilt, so there is no flash or re-entry.
|
|
3829
|
-
*
|
|
3830
|
-
* No-op when the view is unchanged and no `flyToSeatId` is given, or when 3D is
|
|
3831
|
-
* unavailable for this chart.
|
|
3832
|
-
*
|
|
3833
|
-
* @param view `'map'` for the flat picker, `'venue3d'` for the 3D venue.
|
|
3834
|
-
* @param opts.flyToSeatId When entering (or already in) `'venue3d'`, the seat
|
|
3835
|
-
* id to fly the camera to — cinematic → live seat view.
|
|
3836
|
-
* Ignored when `view` is `'map'`.
|
|
3837
|
-
*
|
|
3838
|
-
* @example
|
|
3839
|
-
* // Public 3D tour entry — enter 3D and fly straight to the buyer's seat:
|
|
3840
|
-
* picker.setBuyerView('venue3d', { flyToSeatId: 'A-12' });
|
|
3841
|
-
*/
|
|
4159
|
+
/** Switch the buyer between the map and the 3D venue. */
|
|
3842
4160
|
setBuyerView(view: SeatPickerBuyerView, opts?: SeatPickerBuyerViewOptions): void;
|
|
3843
|
-
/**
|
|
3844
|
-
|
|
3845
|
-
/** Push the full live availability snapshot into the 3D handle (selection is
|
|
3846
|
-
* preserved inside the module). Cheap enough per status delta. */
|
|
3847
|
-
private pushAvailabilityTo3d;
|
|
3848
|
-
/** Mirror the authoritative widget selection into the 3D handle. */
|
|
4161
|
+
/** @internal */ seatState3dFor(seat: ExpandedSeat): SeatState3D;
|
|
4162
|
+
/** @internal */ pushAvailabilityTo3d(): void;
|
|
3849
4163
|
/** @internal */ syncSelectionTo3d(): void;
|
|
3850
|
-
/**
|
|
3851
|
-
|
|
3852
|
-
|
|
3853
|
-
/**
|
|
3854
|
-
|
|
3855
|
-
/** @internal */ emit3dAnalytics(event: string, props?: Record<string, unknown>): void;
|
|
3856
|
-
/** A 3D seat tap runs the SAME selection path as a 2D tap: toggle through the
|
|
3857
|
-
* controller, then raise the shared confirm card (bottom-sheeted in 3D). */
|
|
3858
|
-
private onView3dSeatPick;
|
|
3859
|
-
/** The arrival caption for a seat-eye landing; assembled in pickerSeatViewChrome. */
|
|
3860
|
-
private seatViewCaption;
|
|
3861
|
-
/** Explain a 3D seat that INVENTORY refuses — never one the buyer's own
|
|
3862
|
-
* filters merely dimmed, which stays buyable exactly as it is in 2D. Category
|
|
3863
|
-
* colour remains visible in the venue; this card names the availability state
|
|
3864
|
-
* explicitly so yellow never has to carry both meanings. */
|
|
3865
|
-
private showUnavailable3dSeat;
|
|
3866
|
-
private dismissUnavailable3dSeat;
|
|
4164
|
+
/** @internal */ seatViewFor3d(seatId: string): Promise<SeatView | null>;
|
|
4165
|
+
/** @internal */ onView3dSeatPick(seatId: string): void;
|
|
4166
|
+
/** @internal */ seatViewCaption(seatId: string): string;
|
|
4167
|
+
/** @internal */ showUnavailable3dSeat(seat: ExpandedSeat, visualState: SeatState3D, status: Exclude<SeatStatus, 'free'>): void;
|
|
4168
|
+
/** @internal */ dismissUnavailable3dSeat(): void;
|
|
3867
4169
|
private saveView3dComparisonSeat;
|
|
3868
4170
|
/** @internal */ clearView3dComparison(): void;
|
|
3869
4171
|
/** @internal */ view3dComparisonSnapshot(seatId: string): {
|
|
@@ -3880,26 +4182,14 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3880
4182
|
accessibility: string;
|
|
3881
4183
|
confidence: _seatlayer_core_core_seatConfidence.SeatConfidenceDisclosure;
|
|
3882
4184
|
} | null;
|
|
4185
|
+
/** @internal */ enter3d(flySeatId?: string): Promise<void>;
|
|
4186
|
+
/** @internal */ publish3dTopInset(): void;
|
|
4187
|
+
/** @internal */ exit3d(): void;
|
|
3883
4188
|
/** The two dialogs INSIDE the 3D overlay — see pickerView3dModals.ts. */
|
|
3884
4189
|
private openSeatConfidencePassport;
|
|
3885
|
-
|
|
3886
|
-
|
|
3887
|
-
|
|
3888
|
-
private enter3d;
|
|
3889
|
-
/**
|
|
3890
|
-
* Publish how much room the picker's own top-left chrome takes, as
|
|
3891
|
-
* `--sl-3d-top-inset` on the widget root.
|
|
3892
|
-
*
|
|
3893
|
-
* The 3D layer draws its "Live seat-eye view · …" caption in the same twelve
|
|
3894
|
-
* pixels. That caption is engine surface with its position written inline, so
|
|
3895
|
-
* the widget cannot move it; publishing the measurement is the seam the
|
|
3896
|
-
* engine needs to read one day, and it costs nothing until it does. The
|
|
3897
|
-
* widget's own rules already use it, which is why it is measured rather than
|
|
3898
|
-
* assumed: the region wraps, and a chart with an accessibility flag beside
|
|
3899
|
-
* the back button is two rows tall.
|
|
3900
|
-
*/
|
|
3901
|
-
private publish3dTopInset;
|
|
3902
|
-
private exit3d;
|
|
4190
|
+
/** @internal */ closeSeatConfidencePassport(restoreFocus?: boolean): void;
|
|
4191
|
+
/** @internal */ openView3dComparison(): void;
|
|
4192
|
+
/** @internal */ closeView3dComparison(restoreFocus?: boolean): void;
|
|
3903
4193
|
/** Current active/restored hold reflected in the tray. */
|
|
3904
4194
|
getCurrentHold(): HoldResult | null;
|
|
3905
4195
|
/** Explicit host-driven hold restore (automatic session restore is on by default). */
|
|
@@ -3924,6 +4214,21 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3924
4214
|
* when a fresh bearer is held; the map and the realtime feed resume with it.
|
|
3925
4215
|
*/
|
|
3926
4216
|
refreshAccess(): Promise<boolean>;
|
|
4217
|
+
/**
|
|
4218
|
+
* Clear the decision surfaces before an interrupt covers them.
|
|
4219
|
+
*
|
|
4220
|
+
* A confirm card, a table dialog and a GA prompt are all mid-decision UI
|
|
4221
|
+
* about a specific seat, and every one of them is asking a question the
|
|
4222
|
+
* buyer can no longer answer once we are raising an interrupt: the hold's
|
|
4223
|
+
* seats went back on sale, or the session that could see them has ended.
|
|
4224
|
+
* Left up, they sit behind the veil still showing a candidate and an
|
|
4225
|
+
* Add button, so the interrupt is not the only surface and the widget looks
|
|
4226
|
+
* like it is asking two things at once (owner review at 390px).
|
|
4227
|
+
*
|
|
4228
|
+
* Focus is deliberately NOT restored by any of these: the interrupt takes it
|
|
4229
|
+
* a frame later, and handing it back to the map first would fight that.
|
|
4230
|
+
*/
|
|
4231
|
+
private clearDecisionSurfaces;
|
|
3927
4232
|
/**
|
|
3928
4233
|
* The buyer-facing access state. Plain language, no internal vocabulary, and
|
|
3929
4234
|
* never a channel name, id or count — the buyer is told what happened and
|
|
@@ -3934,7 +4239,45 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3934
4239
|
* inventory and never silently drops a buyer's cart (guide §9).
|
|
3935
4240
|
*/
|
|
3936
4241
|
private showAccessPanel;
|
|
4242
|
+
/**
|
|
4243
|
+
* What the recovery screen's button actually does.
|
|
4244
|
+
*
|
|
4245
|
+
* IN PLACE FIRST, ALWAYS. `refreshAccess` re-bootstraps the session, re-reads
|
|
4246
|
+
* the chart and restarts the socket without the map ever going away, and it
|
|
4247
|
+
* takes this screen down itself the moment the fresh session is live. That is
|
|
4248
|
+
* the whole of the happy path, and it is the one the buyer should get: a page
|
|
4249
|
+
* reload throws away the map, the scroll position and the zoom, and on a
|
|
4250
|
+
* hosted checkout it can cost them the query string that got them here.
|
|
4251
|
+
*
|
|
4252
|
+
* A RELOAD IS THE LAST RESORT, AND ONLY WHEN NOBODY ELSE IS LISTENING. If the
|
|
4253
|
+
* host passed `onAccessUnavailable` it has already been told and may be
|
|
4254
|
+
* running its own recovery — navigating its page out from under it would
|
|
4255
|
+
* destroy that. So the fallback fires only for an unattended embed, where
|
|
4256
|
+
* there is genuinely nothing else left to try.
|
|
4257
|
+
*/
|
|
4258
|
+
private recoverAccess;
|
|
3937
4259
|
private dismissAccessPanel;
|
|
4260
|
+
/**
|
|
4261
|
+
* The hold ran out under the buyer's feet — say so, and block.
|
|
4262
|
+
*
|
|
4263
|
+
* A toast was the wrong shape for this: it left a map still showing the
|
|
4264
|
+
* seats as theirs, a cart still totalling them and a CTA that could not
|
|
4265
|
+
* work, and it was gone in four seconds. Everything the buyer can see is
|
|
4266
|
+
* stale, so the picker stops until they have acknowledged it.
|
|
4267
|
+
*/
|
|
4268
|
+
private showHoldExpired;
|
|
4269
|
+
private dismissHoldExpired;
|
|
4270
|
+
/**
|
|
4271
|
+
* "Start again": put the picker back to the state it would have been in had
|
|
4272
|
+
* the buyer just arrived.
|
|
4273
|
+
*
|
|
4274
|
+
* The hold state itself was already cleared by `onHoldExpired` — what is
|
|
4275
|
+
* left is everything that was still SHOWING it. The selection goes (with any
|
|
4276
|
+
* confirm card or table dialog on top of it), the lapse note goes, the cart
|
|
4277
|
+
* and CTA are recomputed from the now-empty selection, and the map walks
|
|
4278
|
+
* back out to the venue so the buyer starts where they started.
|
|
4279
|
+
*/
|
|
4280
|
+
private restartAfterHoldExpiry;
|
|
3938
4281
|
destroy(): void;
|
|
3939
4282
|
}
|
|
3940
4283
|
|
|
@@ -4512,7 +4855,8 @@ declare class SeasonPicker {
|
|
|
4512
4855
|
* picker wire contract:
|
|
4513
4856
|
*
|
|
4514
4857
|
* • `{ type: 'seatlayer:height', px:number }` — grow the iframe to `px`.
|
|
4515
|
-
* • `{ type: 'seatlayer:fullscreen', on:boolean }`
|
|
4858
|
+
* • `{ type: 'seatlayer:fullscreen', on:boolean, background?:string }`
|
|
4859
|
+
* — pin/unpin over the host.
|
|
4516
4860
|
*
|
|
4517
4861
|
* A framed picker cannot escape its own iframe with CSS, so it delegates both
|
|
4518
4862
|
* concerns to the host. `attachPickerFrame` wires those two behaviours onto a
|