@seatlayer/js 0.78.0 → 0.80.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-TNTHWQQ2.js +1 -0
- package/dist/index.cjs +160 -63
- package/dist/index.d.cts +527 -166
- package/dist/index.d.ts +527 -166
- package/dist/index.js +159 -62
- package/dist/manager.cjs +8 -8
- 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,14 @@ 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;
|
|
3221
|
+
/** @internal */ extendDismissed: boolean;
|
|
3222
|
+
/** @internal */ extendUsed: boolean;
|
|
2874
3223
|
private bookedEl;
|
|
3224
|
+
/** The blocking "your seats were released" dialog, while it is up. */
|
|
3225
|
+
private holdExpiredEl;
|
|
3226
|
+
/** What that hold actually held, captured before the state was cleared. */
|
|
3227
|
+
private holdExpiredUnits;
|
|
2875
3228
|
/** @internal Pending GA units per (area, tier) — see pickerGaPrompt.ts. */
|
|
2876
3229
|
gaQty: GaQtyMap;
|
|
2877
3230
|
/** @internal The open quantity prompt (popover or sheet), while one is up. */
|
|
@@ -2902,14 +3255,14 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
2902
3255
|
private seatsRevealed;
|
|
2903
3256
|
private seatsRevealedReport;
|
|
2904
3257
|
/** The seat the confirm card is about — the same facade as `confirmEl`. */
|
|
2905
|
-
|
|
2906
|
-
|
|
3258
|
+
/** @internal */ get confirmSeat(): ExpandedSeat | null;
|
|
3259
|
+
/** @internal */ set confirmSeat(seat: ExpandedSeat | null);
|
|
2907
3260
|
/** The confirm card owns its element and its candidate seat. */
|
|
2908
3261
|
private confirmCardCache;
|
|
2909
3262
|
private suppressConfirmationSeatId;
|
|
2910
3263
|
private tableDialogEl;
|
|
2911
|
-
|
|
2912
|
-
|
|
3264
|
+
/** @internal */ tableDialog: TableSelectionDetails | null;
|
|
3265
|
+
/** @internal */ tableDialogHeld: boolean;
|
|
2913
3266
|
private tableDialogReturnFocus;
|
|
2914
3267
|
/** @internal */ srEl: HTMLDivElement | null;
|
|
2915
3268
|
private baQty;
|
|
@@ -2938,24 +3291,24 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
2938
3291
|
private cbSafe;
|
|
2939
3292
|
private rungsEl;
|
|
2940
3293
|
private projectionEl;
|
|
2941
|
-
|
|
3294
|
+
/** @internal */ buyerView: 'map' | 'venue3d';
|
|
2942
3295
|
/** @internal */ view3dEl: HTMLDivElement | null;
|
|
2943
3296
|
/** @internal */ view3dHandle: Venue3DHandle | null;
|
|
2944
3297
|
/** Monotonic token so a stale async mount (buyer left before OGL finished
|
|
2945
3298
|
* loading) never installs its handle over a newer state. */
|
|
2946
|
-
|
|
3299
|
+
/** @internal */ view3dGen: number;
|
|
2947
3300
|
/** Seat whose 2D confirm card launched "See it in 3D"; re-shown on return. */
|
|
2948
|
-
|
|
3301
|
+
/** @internal */ view3dReturnSeat: ExpandedSeat | null;
|
|
2949
3302
|
/** Current premium 3D journey depth. `null` is the venue; a seat id is the
|
|
2950
3303
|
* fixed seat-eye state. It lets Back unwind one step before leaving 3D. */
|
|
2951
|
-
|
|
3304
|
+
/** @internal */ view3dTargetSeatId: string | null;
|
|
2952
3305
|
/** Inspection-only comparison. These ids never represent cart selection. */
|
|
2953
3306
|
/** @internal */ view3dCompareSeatIds: string[];
|
|
2954
3307
|
/** The saved-seat comparison chip — owned by pickerView3dNav.ts. */
|
|
2955
3308
|
/** @internal */ readonly view3dCompareChip: View3dCompareChip;
|
|
2956
3309
|
/** @internal */ view3dCompareEl: HTMLDivElement | null;
|
|
2957
3310
|
/** @internal */ view3dCompareCleanup: (() => void) | null;
|
|
2958
|
-
|
|
3311
|
+
/** @internal */ view3dSeatViewChrome: SeatViewChrome | null;
|
|
2959
3312
|
/** @internal */ view3dPassportEl: HTMLDivElement | null;
|
|
2960
3313
|
/** @internal */ view3dPassportCleanup: (() => void) | null;
|
|
2961
3314
|
private floorsEl;
|
|
@@ -2967,45 +3320,45 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
2967
3320
|
/** The 3D "Back to map"/"Back to venue" control while 3D is on. It lives in
|
|
2968
3321
|
* the top-left chrome region rather than in the 3D overlay, so it outlives
|
|
2969
3322
|
* the overlay's own teardown and must be removed explicitly. */
|
|
2970
|
-
|
|
3323
|
+
/** @internal */ view3dBack: HTMLButtonElement | null;
|
|
2971
3324
|
/** The levels/areas rail while 3D is on. Region chrome for the same reason
|
|
2972
3325
|
* the back control is (it shared twelve pixels with the ♿ menu), so like
|
|
2973
3326
|
* the back control it outlives the overlay and is removed by hand. */
|
|
2974
|
-
|
|
3327
|
+
/** @internal */ view3dNav: HTMLElement | null;
|
|
2975
3328
|
/** Which chips the price rail last drew, so a repaint that changes them can
|
|
2976
3329
|
* send the scroller back to the start without stealing a buyer's own scroll. */
|
|
2977
|
-
|
|
3330
|
+
/** @internal */ lastRailSignature: string;
|
|
2978
3331
|
/** The panel's price-band <select>, so the rail's reset chip can keep it in
|
|
2979
3332
|
* step. Null when the chart has fewer than two bands and none was built. */
|
|
2980
|
-
|
|
2981
|
-
|
|
3333
|
+
/** @internal */ priceSelect: HTMLSelectElement | null;
|
|
3334
|
+
/** @internal */ minimap: PickerMinimap | null;
|
|
2982
3335
|
private pickerLayoutSize;
|
|
2983
|
-
|
|
2984
|
-
|
|
3336
|
+
/** @internal */ priceBandKeys: Set<string> | null;
|
|
3337
|
+
/** @internal */ focusedCatKey: string | null;
|
|
2985
3338
|
/** "Hide limited-view seats" — mirrored into 3D by `seatState3dFor`. */
|
|
2986
|
-
|
|
2987
|
-
|
|
3339
|
+
/** @internal */ limitedViewFilter: boolean;
|
|
3340
|
+
/** @internal */ pricesExpanded: boolean;
|
|
2988
3341
|
/** The section card owns its element, collapse state and shown-at clock. */
|
|
2989
3342
|
private sectionCardCache;
|
|
2990
3343
|
/** Last surfaced section summary (re-rendered when the price band changes). */
|
|
2991
3344
|
/** The tapped section the card is holding. A facade over the card in both
|
|
2992
3345
|
* directions: reading it must not build chrome, and writing it must not
|
|
2993
3346
|
* repaint — see SectionCard.adopt. */
|
|
2994
|
-
|
|
2995
|
-
|
|
3347
|
+
/** @internal */ get lastSection(): SectionSummary | null;
|
|
3348
|
+
/** @internal */ set lastSection(summary: SectionSummary | null);
|
|
2996
3349
|
/** Previous tray ticket count — first 0→n transition auto-expands the mobile sheet. */
|
|
2997
|
-
|
|
3350
|
+
/** @internal */ lastTrayCount: number;
|
|
2998
3351
|
/** The opt-in language switcher, when `languages` named at least two. */
|
|
2999
3352
|
private langSel;
|
|
3000
3353
|
/** Previous computed total — drives a single explanatory value bump. */
|
|
3001
|
-
|
|
3354
|
+
/** @internal */ lastTrayTotal: number;
|
|
3002
3355
|
/** Stable item keys prevent tray chips re-animating on unrelated realtime syncs. */
|
|
3003
3356
|
private lastTrayKeys;
|
|
3004
3357
|
private bestAvailableBusy;
|
|
3005
3358
|
private releasingLabels;
|
|
3006
3359
|
/** Selected labels awaiting the hold response; their own realtime echo can arrive first. */
|
|
3007
3360
|
private holdingLabels;
|
|
3008
|
-
|
|
3361
|
+
/** @internal */ ctaPhase: 'idle' | 'holding' | 'checkout';
|
|
3009
3362
|
/** The ♿ control and its menu — one node, in the map's bottom-left corner. */
|
|
3010
3363
|
private a11yMenu;
|
|
3011
3364
|
private detachAttention;
|
|
@@ -3013,19 +3366,19 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3013
3366
|
* part is the engine's; see pickerHoldLapse.ts. */
|
|
3014
3367
|
private readonly lapse;
|
|
3015
3368
|
/** Rail scroll listener attached once; the rail repaints many times. */
|
|
3016
|
-
|
|
3017
|
-
|
|
3369
|
+
/** @internal */ railEdgesBound: boolean;
|
|
3370
|
+
/** @internal */ fsFallback: boolean;
|
|
3018
3371
|
private fsChangeHandler;
|
|
3019
3372
|
private fsEscHandler;
|
|
3020
3373
|
/** Host-level event chrome owns the duplicate identity outside full screen. */
|
|
3021
3374
|
private eventDetailsHidden;
|
|
3022
3375
|
/** True while the hold note reads "N more selected" — the tick must not overwrite it. */
|
|
3023
|
-
|
|
3376
|
+
/** @internal */ holdCopyPending: boolean;
|
|
3024
3377
|
/** Wide-layout ticket panel collapsed (map owns the full width). */
|
|
3025
3378
|
private sideCollapsed;
|
|
3026
3379
|
private sideToggleEl;
|
|
3027
3380
|
/** True once we've asked the host page to pin us fullscreen (framed, no native). */
|
|
3028
|
-
|
|
3381
|
+
/** @internal */ framedFs: boolean;
|
|
3029
3382
|
/** Last height (px) posted to a host frame; dedupes redundant reports. */
|
|
3030
3383
|
private lastPostedHeight;
|
|
3031
3384
|
/** See `./seatViewThumb`, which the native bridge answers from as well. */
|
|
@@ -3051,7 +3404,7 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3051
3404
|
/** Post `seatlayer:height` to the host when framed and the value changed. */
|
|
3052
3405
|
private reportFramedHeight;
|
|
3053
3406
|
/** Full screen via the native API, falling back to a fixed-position overlay (iOS Safari). */
|
|
3054
|
-
|
|
3407
|
+
/** @internal */ toggleFullscreen(): void;
|
|
3055
3408
|
/**
|
|
3056
3409
|
* Is the picker already as big as the screen it is on?
|
|
3057
3410
|
*
|
|
@@ -3220,7 +3573,9 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3220
3573
|
* falsely block standing room) — mirrors the public page. Clears live when WS
|
|
3221
3574
|
* frees a seat up.
|
|
3222
3575
|
*/
|
|
3223
|
-
|
|
3576
|
+
/** @internal */ syncSoldout(categories: Array<{
|
|
3577
|
+
key: string;
|
|
3578
|
+
}>, left: Record<string, number>): void;
|
|
3224
3579
|
/**
|
|
3225
3580
|
* Pure sold-out predicate: every SEATED category's free count is 0, there is at
|
|
3226
3581
|
* least one seated category, and there are no GA areas (GA capacity isn't
|
|
@@ -3256,44 +3611,25 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3256
3611
|
/** Restart one finite CSS animation without leaving a permanent state class. */
|
|
3257
3612
|
private animateOnce;
|
|
3258
3613
|
/** Selection feedback belongs on the selected seat, not across the whole map. */
|
|
3259
|
-
|
|
3614
|
+
/** @internal */ flashPickedSeat(id: string): void;
|
|
3260
3615
|
/** A completed hold gets one short map ripple per concrete seat. */
|
|
3261
3616
|
private flashHeldSeats;
|
|
3262
3617
|
/** Update only the action affordance; selection callbacks must not refire. */
|
|
3263
3618
|
/** @internal */ committedSelection(): PickerSeat[];
|
|
3264
|
-
|
|
3265
|
-
|
|
3619
|
+
/** @internal */ pendingSelectionCount(): number;
|
|
3620
|
+
/** @internal */ heldTicketCount(): number;
|
|
3266
3621
|
/** @internal */ totalTicketCount(): number;
|
|
3267
3622
|
/** 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
|
-
*/
|
|
3623
|
+
/** @internal */ updateSelectionCapacity(): void;
|
|
3624
|
+
/** @internal */ syncCta(count?: number, pending?: number): void;
|
|
3625
|
+
/** @internal */ setCtaPhase(phase: 'idle' | 'holding' | 'checkout'): void;
|
|
3290
3626
|
private runCheckoutHandoff;
|
|
3291
3627
|
/** Session-scoped capability key: isolated by API origin and event. */
|
|
3292
|
-
|
|
3293
|
-
|
|
3294
|
-
|
|
3295
|
-
|
|
3296
|
-
|
|
3628
|
+
/** @internal */ holdStorageKey(): string;
|
|
3629
|
+
/** @internal */ rememberedHoldId(): string | null;
|
|
3630
|
+
/** @internal */ rememberHold(hold: HoldResult): void;
|
|
3631
|
+
/** @internal */ forgetHold(): void;
|
|
3632
|
+
/** @internal */ resumeHoldFromServer(holdId: string, automatic: boolean): Promise<HoldResult | null>;
|
|
3297
3633
|
private restoreRememberedHold;
|
|
3298
3634
|
/** Section-bearing objects on the active floor (single-floor → doc.objects). */
|
|
3299
3635
|
private activeFloorObjects;
|
|
@@ -3330,15 +3666,30 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3330
3666
|
* this would be two ways for the map, the legend, the floors and the 3D
|
|
3331
3667
|
* snapshot to end up disagreeing about what is filtered.
|
|
3332
3668
|
*/
|
|
3333
|
-
|
|
3669
|
+
/** @internal */ applyPriceBand(keys: string[] | null): void;
|
|
3334
3670
|
/** Build projection, rung and floor controls for arena-scale charts. */
|
|
3335
3671
|
private buildArenaChrome;
|
|
3336
3672
|
/** Reflect the engine's current LOD rung onto the pill group. */
|
|
3337
|
-
|
|
3338
|
-
|
|
3673
|
+
/** @internal */ syncRung(): void;
|
|
3674
|
+
/**
|
|
3675
|
+
* The phone's ONE map control, and whether it still has anywhere to go.
|
|
3676
|
+
*
|
|
3677
|
+
* On narrow the "fit to screen" disc is gone (CSS) and "−" is the whole
|
|
3678
|
+
* back-out story: one tap to the section the buyer drilled into, one more to
|
|
3679
|
+
* the whole venue. The ladder itself is `mapZoomOutStep`; this only dresses
|
|
3680
|
+
* it, and only on narrow — the wide layout keeps its "+", "−" and ⛶ exactly
|
|
3681
|
+
* as they were.
|
|
3682
|
+
*
|
|
3683
|
+
* DIMMED, NOT GONE. The control used to appear only once the buyer was deep
|
|
3684
|
+
* enough to be lost, so the corner grew and shrank a button underneath their
|
|
3685
|
+
* thumb. A control that stays put and plainly cannot be pressed says "you
|
|
3686
|
+
* are already looking at everything" without moving the target.
|
|
3687
|
+
*/
|
|
3688
|
+
private syncMapStepBack;
|
|
3689
|
+
/** @internal */ syncProjection(): void;
|
|
3339
3690
|
/** Can this picker offer the 3D venue view? Requires the option (default on),
|
|
3340
3691
|
* WebGL2, a chart to render, and a chart small enough to render WELL. */
|
|
3341
|
-
|
|
3692
|
+
/** @internal */ canOffer3d(): boolean;
|
|
3342
3693
|
/**
|
|
3343
3694
|
* The seat ceiling for offering 3D. See `max3DSeats` — an explicit host value
|
|
3344
3695
|
* always wins; otherwise a small/low-core device gets half the desktop budget,
|
|
@@ -3346,12 +3697,12 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3346
3697
|
*/
|
|
3347
3698
|
private max3dSeats;
|
|
3348
3699
|
/** Reflect the active floor onto the switcher rail. */
|
|
3349
|
-
|
|
3700
|
+
/** @internal */ syncFloors(): void;
|
|
3350
3701
|
/** The tapped-section summary card in all three of its forms. Built lazily:
|
|
3351
3702
|
* it reads `els`/`root`, which are assigned after construction. */
|
|
3352
3703
|
private get sectionCard();
|
|
3353
3704
|
/** Show (or clear, on null) the tapped-section summary card. */
|
|
3354
|
-
|
|
3705
|
+
/** @internal */ showSectionCard(summary: SectionSummary | null): void;
|
|
3355
3706
|
private renderSectionCard;
|
|
3356
3707
|
private collapseSectionCard;
|
|
3357
3708
|
private sectionCardOnView;
|
|
@@ -3372,8 +3723,8 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3372
3723
|
*/
|
|
3373
3724
|
private markedSeatAnnouncement;
|
|
3374
3725
|
/** aria-live readout when keyboard focus lands on a seat. */
|
|
3375
|
-
|
|
3376
|
-
|
|
3726
|
+
/** @internal */ announceSeat(seat: ExpandedSeat | null): void;
|
|
3727
|
+
/** @internal */ showTableDialog(table: TableSelectionDetails, held: boolean, returnFocus?: HTMLElement | null): void;
|
|
3377
3728
|
private renderTableDialogState;
|
|
3378
3729
|
private confirmTableDialog;
|
|
3379
3730
|
private cancelTableDialog;
|
|
@@ -3389,7 +3740,7 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3389
3740
|
private get confirmCard();
|
|
3390
3741
|
/** @internal */ showConfirm(seat: ExpandedSeat, mode?: ConfirmCardMode): void;
|
|
3391
3742
|
private reanchorConfirm;
|
|
3392
|
-
|
|
3743
|
+
/** @internal */ dismissConfirm(): void;
|
|
3393
3744
|
/** @internal The card's own button calls the card; this is the seam the
|
|
3394
3745
|
* widget's tests press. */
|
|
3395
3746
|
/** @internal */ commitConfirm(): Promise<void>;
|
|
@@ -3399,7 +3750,7 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3399
3750
|
* call and replace both on the instance. */
|
|
3400
3751
|
private inviteCommit;
|
|
3401
3752
|
private addSeatLabel;
|
|
3402
|
-
|
|
3753
|
+
/** @internal */ seatViewEnabled(): boolean;
|
|
3403
3754
|
/** Every bookable seat (cached) — neighbor heads for the generated panorama. */
|
|
3404
3755
|
/** @internal */ allSeats(): ExpandedSeat[];
|
|
3405
3756
|
/**
|
|
@@ -3461,7 +3812,7 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3461
3812
|
private refreshOfferAvailability;
|
|
3462
3813
|
/** The read itself. Never rejects — see the catch. */
|
|
3463
3814
|
private readOfferAvailability;
|
|
3464
|
-
|
|
3815
|
+
/** @internal */ offerPrice(categoryKey: string | undefined): TicketOfferPrice | null;
|
|
3465
3816
|
private applyChannelPricing;
|
|
3466
3817
|
private syncOffer;
|
|
3467
3818
|
/**
|
|
@@ -3473,26 +3824,29 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3473
3824
|
/** @internal */ paidPrice(categoryKey: string | undefined, tierId: string | null | undefined, fallback: number, objectLabel?: string): number;
|
|
3474
3825
|
/** The half of a legend's inputs the rail and the price list share, resolved
|
|
3475
3826
|
* once so the two renderings cannot be given different answers. */
|
|
3476
|
-
|
|
3827
|
+
/** @internal */ legendDeps(): LegendDeps;
|
|
3477
3828
|
/** Paint the phone's always-visible legend; the chip HTML lives in
|
|
3478
3829
|
* pickerLegend.ts. A legend of ONE teaches nothing, so it stays away. */
|
|
3479
|
-
|
|
3480
|
-
|
|
3830
|
+
/** @internal */ syncPriceRail(categories: LegendCategory[], left: Record<string, number>, deps?: LegendDeps): void;
|
|
3831
|
+
/** @internal */ syncPrices(): void;
|
|
3481
3832
|
/** Tap a price row → filter + frame that category on the map; tap again to
|
|
3482
3833
|
* clear. Shares `priceBandKeys` with the band selector so the row-dim state
|
|
3483
3834
|
* has one source of truth (and each control resets the other). */
|
|
3484
|
-
|
|
3835
|
+
/** @internal */ focusCategory(key: string): void;
|
|
3485
3836
|
/**
|
|
3486
3837
|
* Live-activity strip: turn WS availability deltas into one quiet line of
|
|
3487
3838
|
* social proof ("2 seats just taken in VIP · 118 left"). Diffs per-category
|
|
3488
3839
|
* counts on every status change — no per-seat payload needed. Skips the very
|
|
3489
3840
|
* first computation (initial load is not "activity").
|
|
3490
3841
|
*/
|
|
3491
|
-
|
|
3492
|
-
|
|
3493
|
-
|
|
3494
|
-
|
|
3495
|
-
|
|
3842
|
+
/** @internal */ narrateAvailability(categories: Array<{
|
|
3843
|
+
key: string;
|
|
3844
|
+
label: string;
|
|
3845
|
+
}>, left: Record<string, number>): void;
|
|
3846
|
+
/** @internal */ lastCatAvail: Record<string, number> | null;
|
|
3847
|
+
/** @internal */ lastAvailFloorId: string;
|
|
3848
|
+
/** @internal */ availQuietUntil: number;
|
|
3849
|
+
/** @internal */ liveTimer: ReturnType<typeof setTimeout> | null;
|
|
3496
3850
|
/** A live delta took one of OUR selected (not yet held) seats — evict + tell the buyer. */
|
|
3497
3851
|
private evictTakenSelections;
|
|
3498
3852
|
/** @internal */ syncTray(): void;
|
|
@@ -3513,7 +3867,7 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3513
3867
|
private fitTranslatedRows;
|
|
3514
3868
|
private emitSelectionValidity;
|
|
3515
3869
|
/** Paint the bottom-sheet's collapsed one-liner (pickerTray.ts builds it). */
|
|
3516
|
-
|
|
3870
|
+
/** @internal */ renderPeek(count: number, total: number, pendingCount: number, bump?: boolean): void;
|
|
3517
3871
|
/**
|
|
3518
3872
|
* Release one buyer-visible held LINE. That is one label for a seat, and every
|
|
3519
3873
|
* unit label behind a grouped GA line — a buyer who presses × on
|
|
@@ -3522,11 +3876,11 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3522
3876
|
private removeHeldLabels;
|
|
3523
3877
|
private handleChangeSeats;
|
|
3524
3878
|
/** @internal */ handleCta(): Promise<void>;
|
|
3525
|
-
|
|
3526
|
-
|
|
3879
|
+
/** @internal */ startHoldTimer(expiresAt: number): void;
|
|
3880
|
+
/** @internal */ stopHoldTimer(): void;
|
|
3527
3881
|
/** Show/refresh (or hide) the "Need more time?" prompt with the live seconds left. */
|
|
3528
|
-
|
|
3529
|
-
|
|
3882
|
+
/** @internal */ setExtendPrompt(show: boolean, ms: number): void;
|
|
3883
|
+
/** @internal */ handleExtend(): Promise<void>;
|
|
3530
3884
|
/**
|
|
3531
3885
|
* Fire the booked-confirmation state once the buyer's held seats settle to
|
|
3532
3886
|
* booked. The controller clears its own hold the moment every held label reads
|
|
@@ -3565,7 +3919,7 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3565
3919
|
* The default branch is the literal call that stood here before hosted
|
|
3566
3920
|
* checkout existed, unchanged, so nothing about an existing integration moves.
|
|
3567
3921
|
*/
|
|
3568
|
-
|
|
3922
|
+
/** @internal */ checkoutHandoff(hold: HoldResult, seats: PickerSeat[]): Promise<void>;
|
|
3569
3923
|
/**
|
|
3570
3924
|
* Take the money ourselves, through the organizer's own gateway.
|
|
3571
3925
|
*
|
|
@@ -3591,8 +3945,8 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3591
3945
|
private openCheckoutPanel;
|
|
3592
3946
|
private closeCheckoutPanel;
|
|
3593
3947
|
/** Assemble the stable {@link CheckoutHandoff} from a hold's server line items. */
|
|
3594
|
-
|
|
3595
|
-
|
|
3948
|
+
/** @internal */ buildHandoff(hold: HoldResult): CheckoutHandoff;
|
|
3949
|
+
/** @internal */ emitHoldChange(): void;
|
|
3596
3950
|
/** @internal */ toast(msg: string, tone?: 'neutral' | 'success' | 'warning' | 'error', action?: {
|
|
3597
3951
|
label: string;
|
|
3598
3952
|
onClick: () => void;
|
|
@@ -3815,55 +4169,20 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3815
4169
|
* source compatibility but coerce to `flat` with a one-time deprecation warn. */
|
|
3816
4170
|
private perspectiveWarned;
|
|
3817
4171
|
private normalizeInitialView;
|
|
4172
|
+
private emitAnalytics;
|
|
4173
|
+
/** @internal */ emit3dAnalytics(event: string, props?: Record<string, unknown>): void;
|
|
3818
4174
|
/** Current buyer view: the flat map, or the interactive 3D venue. */
|
|
3819
4175
|
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
|
-
*/
|
|
4176
|
+
/** Switch the buyer between the map and the 3D venue. */
|
|
3842
4177
|
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. */
|
|
4178
|
+
/** @internal */ seatState3dFor(seat: ExpandedSeat): SeatState3D;
|
|
4179
|
+
/** @internal */ pushAvailabilityTo3d(): void;
|
|
3849
4180
|
/** @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;
|
|
4181
|
+
/** @internal */ seatViewFor3d(seatId: string): Promise<SeatView | null>;
|
|
4182
|
+
/** @internal */ onView3dSeatPick(seatId: string): void;
|
|
4183
|
+
/** @internal */ seatViewCaption(seatId: string): string;
|
|
4184
|
+
/** @internal */ showUnavailable3dSeat(seat: ExpandedSeat, visualState: SeatState3D, status: Exclude<SeatStatus, 'free'>): void;
|
|
4185
|
+
/** @internal */ dismissUnavailable3dSeat(): void;
|
|
3867
4186
|
private saveView3dComparisonSeat;
|
|
3868
4187
|
/** @internal */ clearView3dComparison(): void;
|
|
3869
4188
|
/** @internal */ view3dComparisonSnapshot(seatId: string): {
|
|
@@ -3880,26 +4199,14 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3880
4199
|
accessibility: string;
|
|
3881
4200
|
confidence: _seatlayer_core_core_seatConfidence.SeatConfidenceDisclosure;
|
|
3882
4201
|
} | null;
|
|
4202
|
+
/** @internal */ enter3d(flySeatId?: string): Promise<void>;
|
|
4203
|
+
/** @internal */ publish3dTopInset(): void;
|
|
4204
|
+
/** @internal */ exit3d(): void;
|
|
3883
4205
|
/** The two dialogs INSIDE the 3D overlay — see pickerView3dModals.ts. */
|
|
3884
4206
|
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;
|
|
4207
|
+
/** @internal */ closeSeatConfidencePassport(restoreFocus?: boolean): void;
|
|
4208
|
+
/** @internal */ openView3dComparison(): void;
|
|
4209
|
+
/** @internal */ closeView3dComparison(restoreFocus?: boolean): void;
|
|
3903
4210
|
/** Current active/restored hold reflected in the tray. */
|
|
3904
4211
|
getCurrentHold(): HoldResult | null;
|
|
3905
4212
|
/** Explicit host-driven hold restore (automatic session restore is on by default). */
|
|
@@ -3924,6 +4231,21 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3924
4231
|
* when a fresh bearer is held; the map and the realtime feed resume with it.
|
|
3925
4232
|
*/
|
|
3926
4233
|
refreshAccess(): Promise<boolean>;
|
|
4234
|
+
/**
|
|
4235
|
+
* Clear the decision surfaces before an interrupt covers them.
|
|
4236
|
+
*
|
|
4237
|
+
* A confirm card, a table dialog and a GA prompt are all mid-decision UI
|
|
4238
|
+
* about a specific seat, and every one of them is asking a question the
|
|
4239
|
+
* buyer can no longer answer once we are raising an interrupt: the hold's
|
|
4240
|
+
* seats went back on sale, or the session that could see them has ended.
|
|
4241
|
+
* Left up, they sit behind the veil still showing a candidate and an
|
|
4242
|
+
* Add button, so the interrupt is not the only surface and the widget looks
|
|
4243
|
+
* like it is asking two things at once (owner review at 390px).
|
|
4244
|
+
*
|
|
4245
|
+
* Focus is deliberately NOT restored by any of these: the interrupt takes it
|
|
4246
|
+
* a frame later, and handing it back to the map first would fight that.
|
|
4247
|
+
*/
|
|
4248
|
+
private clearDecisionSurfaces;
|
|
3927
4249
|
/**
|
|
3928
4250
|
* The buyer-facing access state. Plain language, no internal vocabulary, and
|
|
3929
4251
|
* never a channel name, id or count — the buyer is told what happened and
|
|
@@ -3934,7 +4256,45 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3934
4256
|
* inventory and never silently drops a buyer's cart (guide §9).
|
|
3935
4257
|
*/
|
|
3936
4258
|
private showAccessPanel;
|
|
4259
|
+
/**
|
|
4260
|
+
* What the recovery screen's button actually does.
|
|
4261
|
+
*
|
|
4262
|
+
* IN PLACE FIRST, ALWAYS. `refreshAccess` re-bootstraps the session, re-reads
|
|
4263
|
+
* the chart and restarts the socket without the map ever going away, and it
|
|
4264
|
+
* takes this screen down itself the moment the fresh session is live. That is
|
|
4265
|
+
* the whole of the happy path, and it is the one the buyer should get: a page
|
|
4266
|
+
* reload throws away the map, the scroll position and the zoom, and on a
|
|
4267
|
+
* hosted checkout it can cost them the query string that got them here.
|
|
4268
|
+
*
|
|
4269
|
+
* A RELOAD IS THE LAST RESORT, AND ONLY WHEN NOBODY ELSE IS LISTENING. If the
|
|
4270
|
+
* host passed `onAccessUnavailable` it has already been told and may be
|
|
4271
|
+
* running its own recovery — navigating its page out from under it would
|
|
4272
|
+
* destroy that. So the fallback fires only for an unattended embed, where
|
|
4273
|
+
* there is genuinely nothing else left to try.
|
|
4274
|
+
*/
|
|
4275
|
+
private recoverAccess;
|
|
3937
4276
|
private dismissAccessPanel;
|
|
4277
|
+
/**
|
|
4278
|
+
* The hold ran out under the buyer's feet — say so, and block.
|
|
4279
|
+
*
|
|
4280
|
+
* A toast was the wrong shape for this: it left a map still showing the
|
|
4281
|
+
* seats as theirs, a cart still totalling them and a CTA that could not
|
|
4282
|
+
* work, and it was gone in four seconds. Everything the buyer can see is
|
|
4283
|
+
* stale, so the picker stops until they have acknowledged it.
|
|
4284
|
+
*/
|
|
4285
|
+
private showHoldExpired;
|
|
4286
|
+
private dismissHoldExpired;
|
|
4287
|
+
/**
|
|
4288
|
+
* "Start again": put the picker back to the state it would have been in had
|
|
4289
|
+
* the buyer just arrived.
|
|
4290
|
+
*
|
|
4291
|
+
* The hold state itself was already cleared by `onHoldExpired` — what is
|
|
4292
|
+
* left is everything that was still SHOWING it. The selection goes (with any
|
|
4293
|
+
* confirm card or table dialog on top of it), the lapse note goes, the cart
|
|
4294
|
+
* and CTA are recomputed from the now-empty selection, and the map walks
|
|
4295
|
+
* back out to the venue so the buyer starts where they started.
|
|
4296
|
+
*/
|
|
4297
|
+
private restartAfterHoldExpiry;
|
|
3938
4298
|
destroy(): void;
|
|
3939
4299
|
}
|
|
3940
4300
|
|
|
@@ -4512,7 +4872,8 @@ declare class SeasonPicker {
|
|
|
4512
4872
|
* picker wire contract:
|
|
4513
4873
|
*
|
|
4514
4874
|
* • `{ type: 'seatlayer:height', px:number }` — grow the iframe to `px`.
|
|
4515
|
-
* • `{ type: 'seatlayer:fullscreen', on:boolean }`
|
|
4875
|
+
* • `{ type: 'seatlayer:fullscreen', on:boolean, background?:string }`
|
|
4876
|
+
* — pin/unpin over the host.
|
|
4516
4877
|
*
|
|
4517
4878
|
* A framed picker cannot escape its own iframe with CSS, so it delegates both
|
|
4518
4879
|
* concerns to the host. `attachPickerFrame` wires those two behaviours onto a
|