@seatlayer/js 0.80.0 → 0.80.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +32 -71
- package/dist/index.d.cts +100 -18
- package/dist/index.d.ts +100 -18
- package/dist/index.js +31 -70
- package/package.json +2 -2
package/dist/index.d.cts
CHANGED
|
@@ -1349,6 +1349,48 @@ interface SeatPickerOptions {
|
|
|
1349
1349
|
onError?: (err: unknown) => void;
|
|
1350
1350
|
}
|
|
1351
1351
|
|
|
1352
|
+
/**
|
|
1353
|
+
* Two things a NATIVE shell drawing its own chrome over the map needs from the
|
|
1354
|
+
* embed, neither of which the web picker needs because it draws that chrome
|
|
1355
|
+
* itself inside the same document.
|
|
1356
|
+
*
|
|
1357
|
+
* 1. **Blocked regions.** On iOS 26 a tap on a native control laid over the
|
|
1358
|
+
* WebView reaches WKWebView as well — measured on a Flutter host: the shell
|
|
1359
|
+
* rejects the platform view's gesture 134 ms before the finger lifts and the
|
|
1360
|
+
* page still gets the touch, so a press on the `−` disc selected the seat
|
|
1361
|
+
* under it. The only guard that works is one standing BEFORE the finger
|
|
1362
|
+
* lands (`setInteractionEnabled(false)` issued on pointer-down loses the
|
|
1363
|
+
* race: ~180 ms of bridge round trip against a 24 ms tap). So the shell
|
|
1364
|
+
* tells the embed where its chrome is, once per layout, and every pointer
|
|
1365
|
+
* sequence that STARTS inside one of those rectangles is swallowed here in
|
|
1366
|
+
* the capture phase, before the gesture machine or the canvas can see it.
|
|
1367
|
+
*
|
|
1368
|
+
* 2. **Framing a seat above a sheet.** The web picker's phone confirm card is a
|
|
1369
|
+
* resting bottom sheet, and the tapped seat is lifted into the clear band
|
|
1370
|
+
* above it at unchanged zoom — a pan, never a zoom, and never for a buyer
|
|
1371
|
+
* who has since moved the map themselves. A native sheet wants the same,
|
|
1372
|
+
* and the only framing the bridge offered was a refit that changes zoom.
|
|
1373
|
+
* {@link seatFrameNudge} is that placement rule with the host's reported
|
|
1374
|
+
* insets standing in for the sheet.
|
|
1375
|
+
*
|
|
1376
|
+
* Both live here rather than in `SeatingChart`, which is at its size cap; the
|
|
1377
|
+
* chart delegates and stays a thin surface.
|
|
1378
|
+
*/
|
|
1379
|
+
/** A rectangle of native chrome over the map, in the map's own CSS px. */
|
|
1380
|
+
type BlockedRegion = {
|
|
1381
|
+
x: number;
|
|
1382
|
+
y: number;
|
|
1383
|
+
w: number;
|
|
1384
|
+
h: number;
|
|
1385
|
+
};
|
|
1386
|
+
/** Read-only view of what the embed is honouring, for tests and diagnostics. */
|
|
1387
|
+
type BlockedRegionList = ReadonlyArray<Readonly<BlockedRegion>>;
|
|
1388
|
+
/** What `frameSeat` answers: the pan it made, and the buyer's gesture count. */
|
|
1389
|
+
type SeatFrameResult = {
|
|
1390
|
+
dy: number;
|
|
1391
|
+
gestures: number;
|
|
1392
|
+
};
|
|
1393
|
+
|
|
1352
1394
|
/**
|
|
1353
1395
|
* Serializable state exposed to hosted native picker chrome. It deliberately
|
|
1354
1396
|
* contains buyer-display data only: never API keys, buyer-access bearers,
|
|
@@ -1816,6 +1858,20 @@ interface SeatingChartOptions {
|
|
|
1816
1858
|
* `null` clears it. Purely informational; nothing is ever prevented.
|
|
1817
1859
|
*/
|
|
1818
1860
|
onHint?: (message: string | null) => void;
|
|
1861
|
+
/**
|
|
1862
|
+
* The buyer tapped a seat that is ALREADY in the selection.
|
|
1863
|
+
*
|
|
1864
|
+
* The seat is still selected when this fires — this class deliberately does
|
|
1865
|
+
* NOT toggle it back out, because it draws no card to say so and a silent
|
|
1866
|
+
* drop is how a buyer loses a seat by checking which one they picked
|
|
1867
|
+
* (reproduced on device through the native bridge, 2026-09-04). The host
|
|
1868
|
+
* shows its own "Remove this seat?" and calls `deselectObjects([seat.id])`
|
|
1869
|
+
* if the buyer says yes; doing nothing keeps the seat.
|
|
1870
|
+
*
|
|
1871
|
+
* Grouped tables and server-held units never arrive here: they keep their own
|
|
1872
|
+
* paths (`onTableSelectionRequest`, the hold release).
|
|
1873
|
+
*/
|
|
1874
|
+
onSeatRetap?: (seat: PickerSeat) => void;
|
|
1819
1875
|
}
|
|
1820
1876
|
declare class SeatingChart {
|
|
1821
1877
|
private readonly opts;
|
|
@@ -1867,6 +1923,9 @@ declare class SeatingChart {
|
|
|
1867
1923
|
private readonly apiBase;
|
|
1868
1924
|
private readonly buyerAssetUrls;
|
|
1869
1925
|
private readonly immersive;
|
|
1926
|
+
/** Native chrome over the map — see ./seatingChartNativeChrome. Made on
|
|
1927
|
+
* first use: most hosts never report any. */
|
|
1928
|
+
private blockedRegions;
|
|
1870
1929
|
private realtime;
|
|
1871
1930
|
/** Labels whose hold request is in flight — see ControllerSinkOptions.ownLabels. */
|
|
1872
1931
|
private holdingLabels;
|
|
@@ -2069,6 +2128,44 @@ declare class SeatingChart {
|
|
|
2069
2128
|
setFloor(floorId: string): void;
|
|
2070
2129
|
/** How the stacked view marks each level: a `G/1/2` badge, or floor names. */
|
|
2071
2130
|
setFloorLabelStyle(style: FloorLabelStyle): void;
|
|
2131
|
+
/**
|
|
2132
|
+
* Does entering a section dim the rest of the venue?
|
|
2133
|
+
*
|
|
2134
|
+
* Unset, the map answers from its own stage width — no dim on a phone-sized
|
|
2135
|
+
* stage, where the focused section fills the viewport and the dim only
|
|
2136
|
+
* blackens the strip of edges around it. A native shell that wants the
|
|
2137
|
+
* desktop treatment (or wants it back after asking for it off) pins it here.
|
|
2138
|
+
*/
|
|
2139
|
+
setSectionFocusDim(enabled: boolean): void;
|
|
2140
|
+
/**
|
|
2141
|
+
* Paint `seatId` as the seat the buyer is being asked about — the thick
|
|
2142
|
+
* double ring, the halo, the neighbours paled — or clear it with `null`.
|
|
2143
|
+
*
|
|
2144
|
+
* Every selected seat is otherwise drawn alike, and on a native host the
|
|
2145
|
+
* card asking "this one?" is drawn by the shell, so without this the tapped
|
|
2146
|
+
* seat is one plain ring among the buyer's others (observed on device as a
|
|
2147
|
+
* faint grey ring, 2026-09-05). Paint only: it selects nothing and moves no
|
|
2148
|
+
* camera. A seat that is not selected clears the focus instead.
|
|
2149
|
+
*/
|
|
2150
|
+
setSelectionFocus(seatId: string | null): void;
|
|
2151
|
+
/**
|
|
2152
|
+
* Where the host's chrome lies OVER the map, in the map's CSS px. A pointer
|
|
2153
|
+
* sequence that starts inside one of these never reaches the map — the
|
|
2154
|
+
* guard an iOS host needs because its own controls let the tap through to
|
|
2155
|
+
* the WebView. The whole list is replaced on every call; `[]` clears.
|
|
2156
|
+
*/
|
|
2157
|
+
setBlockedRegions(rects: BlockedRegionList): void;
|
|
2158
|
+
getBlockedRegions(): BlockedRegionList;
|
|
2159
|
+
/**
|
|
2160
|
+
* Pan — never zoom — so `seatId` rests in the band the reported viewport
|
|
2161
|
+
* insets leave clear, the way the web sheet lifts a tapped seat above
|
|
2162
|
+
* itself. See {@link frameSeat} for the guards.
|
|
2163
|
+
*/
|
|
2164
|
+
frameSeat(seatId: string, opts?: {
|
|
2165
|
+
fraction?: number;
|
|
2166
|
+
animate?: boolean;
|
|
2167
|
+
gestures?: number;
|
|
2168
|
+
}): SeatFrameResult;
|
|
2072
2169
|
/** Toggle colorblind-safe rendering at runtime (see options.colorblindSafe). */
|
|
2073
2170
|
setColorblindSafe(on: boolean): void;
|
|
2074
2171
|
/** Switch the 2D canvas projection.
|
|
@@ -3281,7 +3378,6 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3281
3378
|
*/
|
|
3282
3379
|
private baReopen;
|
|
3283
3380
|
private bestAvailableConfirm;
|
|
3284
|
-
private releasingHold;
|
|
3285
3381
|
/** Event sales window is closed (read-only load state / live close). */
|
|
3286
3382
|
/** @internal */ salesClosed: boolean;
|
|
3287
3383
|
/** Every seated category's live availability is 0 (sold-out overlay is up). */
|
|
@@ -3373,7 +3469,6 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3373
3469
|
/** Host-level event chrome owns the duplicate identity outside full screen. */
|
|
3374
3470
|
private eventDetailsHidden;
|
|
3375
3471
|
/** True while the hold note reads "N more selected" — the tick must not overwrite it. */
|
|
3376
|
-
/** @internal */ holdCopyPending: boolean;
|
|
3377
3472
|
/** Wide-layout ticket panel collapsed (map owns the full width). */
|
|
3378
3473
|
private sideCollapsed;
|
|
3379
3474
|
private sideToggleEl;
|
|
@@ -3629,7 +3724,7 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3629
3724
|
/** @internal */ rememberedHoldId(): string | null;
|
|
3630
3725
|
/** @internal */ rememberHold(hold: HoldResult): void;
|
|
3631
3726
|
/** @internal */ forgetHold(): void;
|
|
3632
|
-
/** @internal */ resumeHoldFromServer(holdId: string
|
|
3727
|
+
/** @internal */ resumeHoldFromServer(holdId: string): Promise<HoldResult | null>;
|
|
3633
3728
|
private restoreRememberedHold;
|
|
3634
3729
|
/** Section-bearing objects on the active floor (single-floor → doc.objects). */
|
|
3635
3730
|
private activeFloorObjects;
|
|
@@ -3833,20 +3928,6 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3833
3928
|
* clear. Shares `priceBandKeys` with the band selector so the row-dim state
|
|
3834
3929
|
* has one source of truth (and each control resets the other). */
|
|
3835
3930
|
/** @internal */ focusCategory(key: string): void;
|
|
3836
|
-
/**
|
|
3837
|
-
* Live-activity strip: turn WS availability deltas into one quiet line of
|
|
3838
|
-
* social proof ("2 seats just taken in VIP · 118 left"). Diffs per-category
|
|
3839
|
-
* counts on every status change — no per-seat payload needed. Skips the very
|
|
3840
|
-
* first computation (initial load is not "activity").
|
|
3841
|
-
*/
|
|
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;
|
|
3850
3931
|
/** A live delta took one of OUR selected (not yet held) seats — evict + tell the buyer. */
|
|
3851
3932
|
private evictTakenSelections;
|
|
3852
3933
|
/** @internal */ syncTray(): void;
|
|
@@ -3874,12 +3955,13 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3874
3955
|
* "PIT · Adult ×2" means both of them, not one of two identical cards.
|
|
3875
3956
|
*/
|
|
3876
3957
|
private removeHeldLabels;
|
|
3877
|
-
private handleChangeSeats;
|
|
3878
3958
|
/** @internal */ handleCta(): Promise<void>;
|
|
3879
3959
|
/** @internal */ startHoldTimer(expiresAt: number): void;
|
|
3880
3960
|
/** @internal */ stopHoldTimer(): void;
|
|
3881
3961
|
/** Show/refresh (or hide) the "Need more time?" prompt with the live seconds left. */
|
|
3882
3962
|
/** @internal */ setExtendPrompt(show: boolean, ms: number): void;
|
|
3963
|
+
/** Re-ask whether the extend offer is due — for a layout flip, not a tick. */
|
|
3964
|
+
/** @internal */ refreshExtendPrompt(): void;
|
|
3883
3965
|
/** @internal */ handleExtend(): Promise<void>;
|
|
3884
3966
|
/**
|
|
3885
3967
|
* Fire the booked-confirmation state once the buyer's held seats settle to
|
package/dist/index.d.ts
CHANGED
|
@@ -1349,6 +1349,48 @@ interface SeatPickerOptions {
|
|
|
1349
1349
|
onError?: (err: unknown) => void;
|
|
1350
1350
|
}
|
|
1351
1351
|
|
|
1352
|
+
/**
|
|
1353
|
+
* Two things a NATIVE shell drawing its own chrome over the map needs from the
|
|
1354
|
+
* embed, neither of which the web picker needs because it draws that chrome
|
|
1355
|
+
* itself inside the same document.
|
|
1356
|
+
*
|
|
1357
|
+
* 1. **Blocked regions.** On iOS 26 a tap on a native control laid over the
|
|
1358
|
+
* WebView reaches WKWebView as well — measured on a Flutter host: the shell
|
|
1359
|
+
* rejects the platform view's gesture 134 ms before the finger lifts and the
|
|
1360
|
+
* page still gets the touch, so a press on the `−` disc selected the seat
|
|
1361
|
+
* under it. The only guard that works is one standing BEFORE the finger
|
|
1362
|
+
* lands (`setInteractionEnabled(false)` issued on pointer-down loses the
|
|
1363
|
+
* race: ~180 ms of bridge round trip against a 24 ms tap). So the shell
|
|
1364
|
+
* tells the embed where its chrome is, once per layout, and every pointer
|
|
1365
|
+
* sequence that STARTS inside one of those rectangles is swallowed here in
|
|
1366
|
+
* the capture phase, before the gesture machine or the canvas can see it.
|
|
1367
|
+
*
|
|
1368
|
+
* 2. **Framing a seat above a sheet.** The web picker's phone confirm card is a
|
|
1369
|
+
* resting bottom sheet, and the tapped seat is lifted into the clear band
|
|
1370
|
+
* above it at unchanged zoom — a pan, never a zoom, and never for a buyer
|
|
1371
|
+
* who has since moved the map themselves. A native sheet wants the same,
|
|
1372
|
+
* and the only framing the bridge offered was a refit that changes zoom.
|
|
1373
|
+
* {@link seatFrameNudge} is that placement rule with the host's reported
|
|
1374
|
+
* insets standing in for the sheet.
|
|
1375
|
+
*
|
|
1376
|
+
* Both live here rather than in `SeatingChart`, which is at its size cap; the
|
|
1377
|
+
* chart delegates and stays a thin surface.
|
|
1378
|
+
*/
|
|
1379
|
+
/** A rectangle of native chrome over the map, in the map's own CSS px. */
|
|
1380
|
+
type BlockedRegion = {
|
|
1381
|
+
x: number;
|
|
1382
|
+
y: number;
|
|
1383
|
+
w: number;
|
|
1384
|
+
h: number;
|
|
1385
|
+
};
|
|
1386
|
+
/** Read-only view of what the embed is honouring, for tests and diagnostics. */
|
|
1387
|
+
type BlockedRegionList = ReadonlyArray<Readonly<BlockedRegion>>;
|
|
1388
|
+
/** What `frameSeat` answers: the pan it made, and the buyer's gesture count. */
|
|
1389
|
+
type SeatFrameResult = {
|
|
1390
|
+
dy: number;
|
|
1391
|
+
gestures: number;
|
|
1392
|
+
};
|
|
1393
|
+
|
|
1352
1394
|
/**
|
|
1353
1395
|
* Serializable state exposed to hosted native picker chrome. It deliberately
|
|
1354
1396
|
* contains buyer-display data only: never API keys, buyer-access bearers,
|
|
@@ -1816,6 +1858,20 @@ interface SeatingChartOptions {
|
|
|
1816
1858
|
* `null` clears it. Purely informational; nothing is ever prevented.
|
|
1817
1859
|
*/
|
|
1818
1860
|
onHint?: (message: string | null) => void;
|
|
1861
|
+
/**
|
|
1862
|
+
* The buyer tapped a seat that is ALREADY in the selection.
|
|
1863
|
+
*
|
|
1864
|
+
* The seat is still selected when this fires — this class deliberately does
|
|
1865
|
+
* NOT toggle it back out, because it draws no card to say so and a silent
|
|
1866
|
+
* drop is how a buyer loses a seat by checking which one they picked
|
|
1867
|
+
* (reproduced on device through the native bridge, 2026-09-04). The host
|
|
1868
|
+
* shows its own "Remove this seat?" and calls `deselectObjects([seat.id])`
|
|
1869
|
+
* if the buyer says yes; doing nothing keeps the seat.
|
|
1870
|
+
*
|
|
1871
|
+
* Grouped tables and server-held units never arrive here: they keep their own
|
|
1872
|
+
* paths (`onTableSelectionRequest`, the hold release).
|
|
1873
|
+
*/
|
|
1874
|
+
onSeatRetap?: (seat: PickerSeat) => void;
|
|
1819
1875
|
}
|
|
1820
1876
|
declare class SeatingChart {
|
|
1821
1877
|
private readonly opts;
|
|
@@ -1867,6 +1923,9 @@ declare class SeatingChart {
|
|
|
1867
1923
|
private readonly apiBase;
|
|
1868
1924
|
private readonly buyerAssetUrls;
|
|
1869
1925
|
private readonly immersive;
|
|
1926
|
+
/** Native chrome over the map — see ./seatingChartNativeChrome. Made on
|
|
1927
|
+
* first use: most hosts never report any. */
|
|
1928
|
+
private blockedRegions;
|
|
1870
1929
|
private realtime;
|
|
1871
1930
|
/** Labels whose hold request is in flight — see ControllerSinkOptions.ownLabels. */
|
|
1872
1931
|
private holdingLabels;
|
|
@@ -2069,6 +2128,44 @@ declare class SeatingChart {
|
|
|
2069
2128
|
setFloor(floorId: string): void;
|
|
2070
2129
|
/** How the stacked view marks each level: a `G/1/2` badge, or floor names. */
|
|
2071
2130
|
setFloorLabelStyle(style: FloorLabelStyle): void;
|
|
2131
|
+
/**
|
|
2132
|
+
* Does entering a section dim the rest of the venue?
|
|
2133
|
+
*
|
|
2134
|
+
* Unset, the map answers from its own stage width — no dim on a phone-sized
|
|
2135
|
+
* stage, where the focused section fills the viewport and the dim only
|
|
2136
|
+
* blackens the strip of edges around it. A native shell that wants the
|
|
2137
|
+
* desktop treatment (or wants it back after asking for it off) pins it here.
|
|
2138
|
+
*/
|
|
2139
|
+
setSectionFocusDim(enabled: boolean): void;
|
|
2140
|
+
/**
|
|
2141
|
+
* Paint `seatId` as the seat the buyer is being asked about — the thick
|
|
2142
|
+
* double ring, the halo, the neighbours paled — or clear it with `null`.
|
|
2143
|
+
*
|
|
2144
|
+
* Every selected seat is otherwise drawn alike, and on a native host the
|
|
2145
|
+
* card asking "this one?" is drawn by the shell, so without this the tapped
|
|
2146
|
+
* seat is one plain ring among the buyer's others (observed on device as a
|
|
2147
|
+
* faint grey ring, 2026-09-05). Paint only: it selects nothing and moves no
|
|
2148
|
+
* camera. A seat that is not selected clears the focus instead.
|
|
2149
|
+
*/
|
|
2150
|
+
setSelectionFocus(seatId: string | null): void;
|
|
2151
|
+
/**
|
|
2152
|
+
* Where the host's chrome lies OVER the map, in the map's CSS px. A pointer
|
|
2153
|
+
* sequence that starts inside one of these never reaches the map — the
|
|
2154
|
+
* guard an iOS host needs because its own controls let the tap through to
|
|
2155
|
+
* the WebView. The whole list is replaced on every call; `[]` clears.
|
|
2156
|
+
*/
|
|
2157
|
+
setBlockedRegions(rects: BlockedRegionList): void;
|
|
2158
|
+
getBlockedRegions(): BlockedRegionList;
|
|
2159
|
+
/**
|
|
2160
|
+
* Pan — never zoom — so `seatId` rests in the band the reported viewport
|
|
2161
|
+
* insets leave clear, the way the web sheet lifts a tapped seat above
|
|
2162
|
+
* itself. See {@link frameSeat} for the guards.
|
|
2163
|
+
*/
|
|
2164
|
+
frameSeat(seatId: string, opts?: {
|
|
2165
|
+
fraction?: number;
|
|
2166
|
+
animate?: boolean;
|
|
2167
|
+
gestures?: number;
|
|
2168
|
+
}): SeatFrameResult;
|
|
2072
2169
|
/** Toggle colorblind-safe rendering at runtime (see options.colorblindSafe). */
|
|
2073
2170
|
setColorblindSafe(on: boolean): void;
|
|
2074
2171
|
/** Switch the 2D canvas projection.
|
|
@@ -3281,7 +3378,6 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3281
3378
|
*/
|
|
3282
3379
|
private baReopen;
|
|
3283
3380
|
private bestAvailableConfirm;
|
|
3284
|
-
private releasingHold;
|
|
3285
3381
|
/** Event sales window is closed (read-only load state / live close). */
|
|
3286
3382
|
/** @internal */ salesClosed: boolean;
|
|
3287
3383
|
/** Every seated category's live availability is 0 (sold-out overlay is up). */
|
|
@@ -3373,7 +3469,6 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3373
3469
|
/** Host-level event chrome owns the duplicate identity outside full screen. */
|
|
3374
3470
|
private eventDetailsHidden;
|
|
3375
3471
|
/** True while the hold note reads "N more selected" — the tick must not overwrite it. */
|
|
3376
|
-
/** @internal */ holdCopyPending: boolean;
|
|
3377
3472
|
/** Wide-layout ticket panel collapsed (map owns the full width). */
|
|
3378
3473
|
private sideCollapsed;
|
|
3379
3474
|
private sideToggleEl;
|
|
@@ -3629,7 +3724,7 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3629
3724
|
/** @internal */ rememberedHoldId(): string | null;
|
|
3630
3725
|
/** @internal */ rememberHold(hold: HoldResult): void;
|
|
3631
3726
|
/** @internal */ forgetHold(): void;
|
|
3632
|
-
/** @internal */ resumeHoldFromServer(holdId: string
|
|
3727
|
+
/** @internal */ resumeHoldFromServer(holdId: string): Promise<HoldResult | null>;
|
|
3633
3728
|
private restoreRememberedHold;
|
|
3634
3729
|
/** Section-bearing objects on the active floor (single-floor → doc.objects). */
|
|
3635
3730
|
private activeFloorObjects;
|
|
@@ -3833,20 +3928,6 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3833
3928
|
* clear. Shares `priceBandKeys` with the band selector so the row-dim state
|
|
3834
3929
|
* has one source of truth (and each control resets the other). */
|
|
3835
3930
|
/** @internal */ focusCategory(key: string): void;
|
|
3836
|
-
/**
|
|
3837
|
-
* Live-activity strip: turn WS availability deltas into one quiet line of
|
|
3838
|
-
* social proof ("2 seats just taken in VIP · 118 left"). Diffs per-category
|
|
3839
|
-
* counts on every status change — no per-seat payload needed. Skips the very
|
|
3840
|
-
* first computation (initial load is not "activity").
|
|
3841
|
-
*/
|
|
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;
|
|
3850
3931
|
/** A live delta took one of OUR selected (not yet held) seats — evict + tell the buyer. */
|
|
3851
3932
|
private evictTakenSelections;
|
|
3852
3933
|
/** @internal */ syncTray(): void;
|
|
@@ -3874,12 +3955,13 @@ declare class SeatPicker implements GaPromptPicker {
|
|
|
3874
3955
|
* "PIT · Adult ×2" means both of them, not one of two identical cards.
|
|
3875
3956
|
*/
|
|
3876
3957
|
private removeHeldLabels;
|
|
3877
|
-
private handleChangeSeats;
|
|
3878
3958
|
/** @internal */ handleCta(): Promise<void>;
|
|
3879
3959
|
/** @internal */ startHoldTimer(expiresAt: number): void;
|
|
3880
3960
|
/** @internal */ stopHoldTimer(): void;
|
|
3881
3961
|
/** Show/refresh (or hide) the "Need more time?" prompt with the live seconds left. */
|
|
3882
3962
|
/** @internal */ setExtendPrompt(show: boolean, ms: number): void;
|
|
3963
|
+
/** Re-ask whether the extend offer is due — for a layout flip, not a tick. */
|
|
3964
|
+
/** @internal */ refreshExtendPrompt(): void;
|
|
3883
3965
|
/** @internal */ handleExtend(): Promise<void>;
|
|
3884
3966
|
/**
|
|
3885
3967
|
* Fire the booked-confirmation state once the buyer's held seats settle to
|