@seatlayer/js 0.81.0 → 0.83.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { PickerSeat, PickerGAArea, PickerMapTheme, PickerTransport, PickerSelectionValidator, RendererViewMode, PickerSelectionValidity, ChartTheme, AccessibilityType, FloorLabelStyle, LodRung, SectionSummary, PickerAccessNeed, SeatHoverDetails, AccessibleSectionStep, AvailabilityRefreshOutcome, PickerController, ExpandedSeat, TableSelectionDetails, SeatStatus } from '@seatlayer/core';
1
+ import { PickerSeat, PickerGAArea, PickerMapTheme, PickerTransport, PickerSelectionValidator, RendererViewMode, PickerSelectionValidity, ChartTheme, AccessibilityType, FloorLabelStyle, LodRung, SectionSummary, PickerAccessNeed, SeatHoverDetails, AccessibleSectionStep, AvailabilityRefreshOutcome, PickerController, ExpandedSeat, TableSelectionDetails } 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';
@@ -1526,6 +1526,15 @@ interface SeatingChartPickerState {
1526
1526
  rung: LodRung;
1527
1527
  /** True only when one semantic zoom-out step can reveal more of the venue. */
1528
1528
  canZoomOut: boolean;
1529
+ /**
1530
+ * Is the camera exactly at the whole-venue fit? Present only when the
1531
+ * renderer can answer; a host that reads `canZoomOut` alone re-creates the
1532
+ * dead "−" between the fit and the seats rung (web fix, 2026-09-05), so a
1533
+ * native host should dim its "−"/"fit" controls on THIS, when present.
1534
+ */
1535
+ atVenueFit?: boolean;
1536
+ /** False only at the zoom ceiling. Present only when the renderer can answer. */
1537
+ canZoomIn?: boolean;
1529
1538
  focusedSectionId: string | null;
1530
1539
  focusedSection: SectionSummary | null;
1531
1540
  viewMode: RendererViewMode;
@@ -2711,9 +2720,11 @@ declare class EmbeddedDesigner {
2711
2720
  /**
2712
2721
  * pickerLegend — the two places the picker explains its colours.
2713
2722
  *
2714
- * The price LIST (`.sl-price-row`) is the detail view: colour, name, how many
2715
- * are left, the offer name, the exact price or spread. It lives in the side
2716
- * panel on desktop and behind a disclosure inside the bottom sheet on a phone.
2723
+ * The price LIST (`.sl-price-row`) is the detail view: colour, name, the offer
2724
+ * name, the exact price or spread. (It no longer prints how many are left —
2725
+ * owner call 2026-09-05 — though it still reads the count to dim a sold-out
2726
+ * row.) It lives in the side panel on desktop and behind a disclosure inside
2727
+ * the bottom sheet on a phone.
2717
2728
  *
2718
2729
  * The price RAIL (`.sl-rc`) is the phone's always-visible legend: colour and
2719
2730
  * price, nothing else, pinned above the map. It exists because on a narrow
@@ -3301,6 +3312,7 @@ declare class SeatPicker implements GaPromptPicker {
3301
3312
  /** Feature 6 anchor regions — positioned flex containers over the map. */
3302
3313
  /** @internal */ regions: Record<string, HTMLElement>;
3303
3314
  private ro;
3315
+ private viewportResizeHandler;
3304
3316
  /** @internal */ holdTimer: ReturnType<typeof setInterval> | null;
3305
3317
  private toastTimer;
3306
3318
  /** The availability read every other caller joins. See refreshOfferAvailability. */
@@ -3442,6 +3454,7 @@ declare class SeatPicker implements GaPromptPicker {
3442
3454
  /** @internal */ view3dPassportEl: HTMLDivElement | null;
3443
3455
  /** @internal */ view3dPassportCleanup: (() => void) | null;
3444
3456
  private floorsEl;
3457
+ private arenaViewportInsets;
3445
3458
  private viewEl;
3446
3459
  private viewCleanup;
3447
3460
  /** Supersedes an older authored-view byte request when another seat is opened. */
@@ -3463,6 +3476,7 @@ declare class SeatPicker implements GaPromptPicker {
3463
3476
  /** @internal */ priceSelect: HTMLSelectElement | null;
3464
3477
  /** @internal */ minimap: PickerMinimap | null;
3465
3478
  private pickerLayoutSize;
3479
+ private fullscreenAffordanceSize;
3466
3480
  /** @internal */ priceBandKeys: Set<string> | null;
3467
3481
  /** @internal */ focusedCatKey: string | null;
3468
3482
  /** "Hide limited-view seats" — mirrored into 3D by `seatState3dFor`. */
@@ -3560,6 +3574,7 @@ declare class SeatPicker implements GaPromptPicker {
3560
3574
  * that is the only way back out.
3561
3575
  */
3562
3576
  private syncFullscreenAffordance;
3577
+ private fullscreenMeasurementChanged;
3563
3578
  private syncFullscreenButtons;
3564
3579
  /**
3565
3580
  * Native element-fullscreen was unavailable or rejected. When framed, a CSS
@@ -3594,6 +3609,24 @@ declare class SeatPicker implements GaPromptPicker {
3594
3609
  /** @internal */ webMcpHost(holds: boolean): WebMcpHost;
3595
3610
  /** Wire host chrome after the skeleton exists and before the renderer owns its map host. */
3596
3611
  private wireBuyerShell;
3612
+ /**
3613
+ * Open or collapse the phone sheet, and say so.
3614
+ *
3615
+ * The one place `data-sheet` is written together with the chevron's
3616
+ * `aria-expanded` and its label: the two used to drift, and a chevron that
3617
+ * says "Open ticket panel" over an open panel is worse than no label at all.
3618
+ *
3619
+ * @internal
3620
+ */
3621
+ setSheetOpen(open: boolean): void;
3622
+ /**
3623
+ * The empty phone cart's way in to the best-seats form.
3624
+ *
3625
+ * Still a FORM, not a verb: it reveals quantity/type/zone and picks nothing
3626
+ * for anyone. Opening the sheet is not the same as arriving at the card
3627
+ * either — on a short phone the tray can open scrolled past it.
3628
+ */
3629
+ private openBestSeatsForm;
3597
3630
  /**
3598
3631
  * Put the phone sheet back to its peek.
3599
3632
  *
@@ -3635,8 +3668,13 @@ declare class SeatPicker implements GaPromptPicker {
3635
3668
  setPanelCollapsed(collapsed: boolean): void;
3636
3669
  /** Idempotent DOM apply, also run on every layout flip (inert must lift on narrow). */
3637
3670
  private applyPanelCollapsed;
3638
- /** Build the ♿ menu (filter + limited view + palette) into the map's
3639
- * bottom-left corner. The menu owns its own state machine; see the module. */
3671
+ /**
3672
+ * Build the ♿ menu (filter + limited view + palette) as the TOP DISC of the
3673
+ * right-hand control column (owner call 2026-09-06). It used to stand alone
3674
+ * in the map's bottom-left corner, which is the minimap's corner, and read
3675
+ * as a stray control facing a stack of them. The menu owns its own state
3676
+ * machine and docks itself first in the column; see the module.
3677
+ */
3640
3678
  private buildAccessibilityMenu;
3641
3679
  /**
3642
3680
  * Jump to the seats rung when a dimming filter turns on — the dimming only
@@ -3806,21 +3844,25 @@ declare class SeatPicker implements GaPromptPicker {
3806
3844
  /** @internal */ applyPriceBand(keys: string[] | null): void;
3807
3845
  /** Build projection, rung and floor controls for arena-scale charts. */
3808
3846
  private buildArenaChrome;
3847
+ /** Keep the camera's fitted viewport clear of measured multi-floor chrome. */
3848
+ /** @internal */ syncArenaViewportInsets(): void;
3809
3849
  /** Reflect the engine's current LOD rung onto the pill group. */
3810
3850
  /** @internal */ syncRung(): void;
3811
3851
  /**
3812
- * The phone's ONE map control, and whether it still has anywhere to go.
3852
+ * The phone's back-out controls, and whether they still have anywhere to go.
3813
3853
  *
3814
- * On narrow the "fit to screen" disc is gone (CSS) and "−" is the whole
3815
- * back-out story: one tap to the section the buyer drilled into, one more to
3816
- * the whole venue. The ladder itself is `mapZoomOutStep`; this only dresses
3817
- * it, and only on narrow — the wide layout keeps its "+", "−" and ⛶ exactly
3818
- * as they were.
3854
+ * On narrow the corner carries "+", "−" and the fit disc (owner call
3855
+ * 2026-09-05). "−" is the ladder — one tap to the section the buyer drilled
3856
+ * into, one more to the whole venue — and the fit disc is that last step on
3857
+ * its own. The ladder itself is `mapZoomOutStep`; this only dresses it, and
3858
+ * only on narrow: wide keeps "+" and "−" undimmed and never shows the disc.
3819
3859
  *
3820
- * DIMMED, NOT GONE. The control used to appear only once the buyer was deep
3860
+ * DIMMED, NOT GONE. The controls used to appear only once the buyer was deep
3821
3861
  * enough to be lost, so the corner grew and shrank a button underneath their
3822
3862
  * thumb. A control that stays put and plainly cannot be pressed says "you
3823
- * are already looking at everything" without moving the target.
3863
+ * are already looking at everything" without moving the target — as long as
3864
+ * it dims only when that is TRUE, which is why the reading is the engine's
3865
+ * fit pose and not a guess from whether seats happen to be on screen.
3824
3866
  */
3825
3867
  private syncMapStepBack;
3826
3868
  /** @internal */ syncProjection(): void;
@@ -3989,8 +4031,6 @@ declare class SeatPicker implements GaPromptPicker {
3989
4031
  /** @internal */ scheduleFit(): void;
3990
4032
  private fitTranslatedRows;
3991
4033
  private emitSelectionValidity;
3992
- /** Paint the bottom-sheet's collapsed one-liner (pickerTray.ts builds it). */
3993
- /** @internal */ renderPeek(count: number, total: number, pendingCount: number, bump?: boolean): void;
3994
4034
  /**
3995
4035
  * Release one buyer-visible held LINE. That is one label for a seat, and every
3996
4036
  * unit label behind a grouped GA line — a buyer who presses × on
@@ -4026,6 +4066,29 @@ declare class SeatPicker implements GaPromptPicker {
4026
4066
  private showBooked;
4027
4067
  /** Take the confirmation down and give the map back. The booking stands. */
4028
4068
  private dismissBooked;
4069
+ /**
4070
+ * The seats are BOUGHT. Put the picker back to the state a buyer who has
4071
+ * just arrived would find.
4072
+ *
4073
+ * "Back to map" used to take down the overlay and nothing else, and what it
4074
+ * uncovered was the cart that had paid for the booking: the same tickets
4075
+ * still listed (with padlocks, because the labels now read `booked`), the
4076
+ * same total in the footer, and a CTA frozen on "Opening secure checkout…"
4077
+ * with its spinner — a control that could never finish, over a hold that no
4078
+ * longer existed. The seats still painted as the buyer's own selection, ✕ on
4079
+ * a row did nothing (there is no hold left to release from), and any seat
4080
+ * added next was totalled together with tickets that were already paid for.
4081
+ *
4082
+ * A settled hold is not a hold, so everything that was showing one goes: the
4083
+ * hold and its handoff, the session's remembered hold id, the timer, the
4084
+ * selection behind the cart (which is what repaints those seats as inert
4085
+ * `booked` rather than as picks), the GA quantities, and the CTA phase.
4086
+ * `showBooked` has already fired `onBooked` and stopped the timer — this is
4087
+ * about the surface it left standing, and it runs on the way OUT of the
4088
+ * overlay, so a host that navigates away on `onBooked` (DesiPass) never
4089
+ * reaches it.
4090
+ */
4091
+ private resetAfterBooking;
4029
4092
  /**
4030
4093
  * A Performance Group hold settled, told to us by the WRAPPER rather than by
4031
4094
  * a socket (§8: this surface has no realtime feed). `detectBooked` waits for
@@ -4105,18 +4168,10 @@ declare class SeatPicker implements GaPromptPicker {
4105
4168
  * group whose wrapper did not supply the nights.
4106
4169
  */
4107
4170
  private nightStripFor;
4108
- /**
4109
- * Why a tapped seat cannot be taken, or '' when it can.
4110
- *
4111
- * Only the PRESS path asks for this — a mouse already has the status tag and
4112
- * a card that follows the pointer, so a sentence under every hover would be
4113
- * noise. A partly-available group seat is excluded: its night strip already
4114
- * names the exact nights that block it, and "already booked" would flatly
4115
- * contradict the row underneath saying it is free on Friday.
4116
- */
4117
- private unavailableReason;
4118
4171
  private unpinTooltip;
4119
4172
  private handleMapPointerDown;
4173
+ /** Close every open ⓘ popover, except `keep`. */
4174
+ private closeInfoPops;
4120
4175
  private updateTooltip;
4121
4176
  /**
4122
4177
  * Push the wrapper's current seat marks at the renderer.
@@ -4305,8 +4360,6 @@ declare class SeatPicker implements GaPromptPicker {
4305
4360
  /** @internal */ seatViewFor3d(seatId: string): Promise<SeatView | null>;
4306
4361
  /** @internal */ onView3dSeatPick(seatId: string): void;
4307
4362
  /** @internal */ seatViewCaption(seatId: string): string;
4308
- /** @internal */ showUnavailable3dSeat(seat: ExpandedSeat, visualState: SeatState3D, status: Exclude<SeatStatus, 'free'>): void;
4309
- /** @internal */ dismissUnavailable3dSeat(): void;
4310
4363
  private saveView3dComparisonSeat;
4311
4364
  /** @internal */ clearView3dComparison(): void;
4312
4365
  /** @internal */ view3dComparisonSnapshot(seatId: string): {
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
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';
1
+ import { PickerSeat, PickerGAArea, PickerMapTheme, PickerTransport, PickerSelectionValidator, RendererViewMode, PickerSelectionValidity, ChartTheme, AccessibilityType, FloorLabelStyle, LodRung, SectionSummary, PickerAccessNeed, SeatHoverDetails, AccessibleSectionStep, AvailabilityRefreshOutcome, PickerController, ExpandedSeat, TableSelectionDetails } 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.js';
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.js';
@@ -1526,6 +1526,15 @@ interface SeatingChartPickerState {
1526
1526
  rung: LodRung;
1527
1527
  /** True only when one semantic zoom-out step can reveal more of the venue. */
1528
1528
  canZoomOut: boolean;
1529
+ /**
1530
+ * Is the camera exactly at the whole-venue fit? Present only when the
1531
+ * renderer can answer; a host that reads `canZoomOut` alone re-creates the
1532
+ * dead "−" between the fit and the seats rung (web fix, 2026-09-05), so a
1533
+ * native host should dim its "−"/"fit" controls on THIS, when present.
1534
+ */
1535
+ atVenueFit?: boolean;
1536
+ /** False only at the zoom ceiling. Present only when the renderer can answer. */
1537
+ canZoomIn?: boolean;
1529
1538
  focusedSectionId: string | null;
1530
1539
  focusedSection: SectionSummary | null;
1531
1540
  viewMode: RendererViewMode;
@@ -2711,9 +2720,11 @@ declare class EmbeddedDesigner {
2711
2720
  /**
2712
2721
  * pickerLegend — the two places the picker explains its colours.
2713
2722
  *
2714
- * The price LIST (`.sl-price-row`) is the detail view: colour, name, how many
2715
- * are left, the offer name, the exact price or spread. It lives in the side
2716
- * panel on desktop and behind a disclosure inside the bottom sheet on a phone.
2723
+ * The price LIST (`.sl-price-row`) is the detail view: colour, name, the offer
2724
+ * name, the exact price or spread. (It no longer prints how many are left —
2725
+ * owner call 2026-09-05 — though it still reads the count to dim a sold-out
2726
+ * row.) It lives in the side panel on desktop and behind a disclosure inside
2727
+ * the bottom sheet on a phone.
2717
2728
  *
2718
2729
  * The price RAIL (`.sl-rc`) is the phone's always-visible legend: colour and
2719
2730
  * price, nothing else, pinned above the map. It exists because on a narrow
@@ -3301,6 +3312,7 @@ declare class SeatPicker implements GaPromptPicker {
3301
3312
  /** Feature 6 anchor regions — positioned flex containers over the map. */
3302
3313
  /** @internal */ regions: Record<string, HTMLElement>;
3303
3314
  private ro;
3315
+ private viewportResizeHandler;
3304
3316
  /** @internal */ holdTimer: ReturnType<typeof setInterval> | null;
3305
3317
  private toastTimer;
3306
3318
  /** The availability read every other caller joins. See refreshOfferAvailability. */
@@ -3442,6 +3454,7 @@ declare class SeatPicker implements GaPromptPicker {
3442
3454
  /** @internal */ view3dPassportEl: HTMLDivElement | null;
3443
3455
  /** @internal */ view3dPassportCleanup: (() => void) | null;
3444
3456
  private floorsEl;
3457
+ private arenaViewportInsets;
3445
3458
  private viewEl;
3446
3459
  private viewCleanup;
3447
3460
  /** Supersedes an older authored-view byte request when another seat is opened. */
@@ -3463,6 +3476,7 @@ declare class SeatPicker implements GaPromptPicker {
3463
3476
  /** @internal */ priceSelect: HTMLSelectElement | null;
3464
3477
  /** @internal */ minimap: PickerMinimap | null;
3465
3478
  private pickerLayoutSize;
3479
+ private fullscreenAffordanceSize;
3466
3480
  /** @internal */ priceBandKeys: Set<string> | null;
3467
3481
  /** @internal */ focusedCatKey: string | null;
3468
3482
  /** "Hide limited-view seats" — mirrored into 3D by `seatState3dFor`. */
@@ -3560,6 +3574,7 @@ declare class SeatPicker implements GaPromptPicker {
3560
3574
  * that is the only way back out.
3561
3575
  */
3562
3576
  private syncFullscreenAffordance;
3577
+ private fullscreenMeasurementChanged;
3563
3578
  private syncFullscreenButtons;
3564
3579
  /**
3565
3580
  * Native element-fullscreen was unavailable or rejected. When framed, a CSS
@@ -3594,6 +3609,24 @@ declare class SeatPicker implements GaPromptPicker {
3594
3609
  /** @internal */ webMcpHost(holds: boolean): WebMcpHost;
3595
3610
  /** Wire host chrome after the skeleton exists and before the renderer owns its map host. */
3596
3611
  private wireBuyerShell;
3612
+ /**
3613
+ * Open or collapse the phone sheet, and say so.
3614
+ *
3615
+ * The one place `data-sheet` is written together with the chevron's
3616
+ * `aria-expanded` and its label: the two used to drift, and a chevron that
3617
+ * says "Open ticket panel" over an open panel is worse than no label at all.
3618
+ *
3619
+ * @internal
3620
+ */
3621
+ setSheetOpen(open: boolean): void;
3622
+ /**
3623
+ * The empty phone cart's way in to the best-seats form.
3624
+ *
3625
+ * Still a FORM, not a verb: it reveals quantity/type/zone and picks nothing
3626
+ * for anyone. Opening the sheet is not the same as arriving at the card
3627
+ * either — on a short phone the tray can open scrolled past it.
3628
+ */
3629
+ private openBestSeatsForm;
3597
3630
  /**
3598
3631
  * Put the phone sheet back to its peek.
3599
3632
  *
@@ -3635,8 +3668,13 @@ declare class SeatPicker implements GaPromptPicker {
3635
3668
  setPanelCollapsed(collapsed: boolean): void;
3636
3669
  /** Idempotent DOM apply, also run on every layout flip (inert must lift on narrow). */
3637
3670
  private applyPanelCollapsed;
3638
- /** Build the ♿ menu (filter + limited view + palette) into the map's
3639
- * bottom-left corner. The menu owns its own state machine; see the module. */
3671
+ /**
3672
+ * Build the ♿ menu (filter + limited view + palette) as the TOP DISC of the
3673
+ * right-hand control column (owner call 2026-09-06). It used to stand alone
3674
+ * in the map's bottom-left corner, which is the minimap's corner, and read
3675
+ * as a stray control facing a stack of them. The menu owns its own state
3676
+ * machine and docks itself first in the column; see the module.
3677
+ */
3640
3678
  private buildAccessibilityMenu;
3641
3679
  /**
3642
3680
  * Jump to the seats rung when a dimming filter turns on — the dimming only
@@ -3806,21 +3844,25 @@ declare class SeatPicker implements GaPromptPicker {
3806
3844
  /** @internal */ applyPriceBand(keys: string[] | null): void;
3807
3845
  /** Build projection, rung and floor controls for arena-scale charts. */
3808
3846
  private buildArenaChrome;
3847
+ /** Keep the camera's fitted viewport clear of measured multi-floor chrome. */
3848
+ /** @internal */ syncArenaViewportInsets(): void;
3809
3849
  /** Reflect the engine's current LOD rung onto the pill group. */
3810
3850
  /** @internal */ syncRung(): void;
3811
3851
  /**
3812
- * The phone's ONE map control, and whether it still has anywhere to go.
3852
+ * The phone's back-out controls, and whether they still have anywhere to go.
3813
3853
  *
3814
- * On narrow the "fit to screen" disc is gone (CSS) and "−" is the whole
3815
- * back-out story: one tap to the section the buyer drilled into, one more to
3816
- * the whole venue. The ladder itself is `mapZoomOutStep`; this only dresses
3817
- * it, and only on narrow — the wide layout keeps its "+", "−" and ⛶ exactly
3818
- * as they were.
3854
+ * On narrow the corner carries "+", "−" and the fit disc (owner call
3855
+ * 2026-09-05). "−" is the ladder — one tap to the section the buyer drilled
3856
+ * into, one more to the whole venue — and the fit disc is that last step on
3857
+ * its own. The ladder itself is `mapZoomOutStep`; this only dresses it, and
3858
+ * only on narrow: wide keeps "+" and "−" undimmed and never shows the disc.
3819
3859
  *
3820
- * DIMMED, NOT GONE. The control used to appear only once the buyer was deep
3860
+ * DIMMED, NOT GONE. The controls used to appear only once the buyer was deep
3821
3861
  * enough to be lost, so the corner grew and shrank a button underneath their
3822
3862
  * thumb. A control that stays put and plainly cannot be pressed says "you
3823
- * are already looking at everything" without moving the target.
3863
+ * are already looking at everything" without moving the target — as long as
3864
+ * it dims only when that is TRUE, which is why the reading is the engine's
3865
+ * fit pose and not a guess from whether seats happen to be on screen.
3824
3866
  */
3825
3867
  private syncMapStepBack;
3826
3868
  /** @internal */ syncProjection(): void;
@@ -3989,8 +4031,6 @@ declare class SeatPicker implements GaPromptPicker {
3989
4031
  /** @internal */ scheduleFit(): void;
3990
4032
  private fitTranslatedRows;
3991
4033
  private emitSelectionValidity;
3992
- /** Paint the bottom-sheet's collapsed one-liner (pickerTray.ts builds it). */
3993
- /** @internal */ renderPeek(count: number, total: number, pendingCount: number, bump?: boolean): void;
3994
4034
  /**
3995
4035
  * Release one buyer-visible held LINE. That is one label for a seat, and every
3996
4036
  * unit label behind a grouped GA line — a buyer who presses × on
@@ -4026,6 +4066,29 @@ declare class SeatPicker implements GaPromptPicker {
4026
4066
  private showBooked;
4027
4067
  /** Take the confirmation down and give the map back. The booking stands. */
4028
4068
  private dismissBooked;
4069
+ /**
4070
+ * The seats are BOUGHT. Put the picker back to the state a buyer who has
4071
+ * just arrived would find.
4072
+ *
4073
+ * "Back to map" used to take down the overlay and nothing else, and what it
4074
+ * uncovered was the cart that had paid for the booking: the same tickets
4075
+ * still listed (with padlocks, because the labels now read `booked`), the
4076
+ * same total in the footer, and a CTA frozen on "Opening secure checkout…"
4077
+ * with its spinner — a control that could never finish, over a hold that no
4078
+ * longer existed. The seats still painted as the buyer's own selection, ✕ on
4079
+ * a row did nothing (there is no hold left to release from), and any seat
4080
+ * added next was totalled together with tickets that were already paid for.
4081
+ *
4082
+ * A settled hold is not a hold, so everything that was showing one goes: the
4083
+ * hold and its handoff, the session's remembered hold id, the timer, the
4084
+ * selection behind the cart (which is what repaints those seats as inert
4085
+ * `booked` rather than as picks), the GA quantities, and the CTA phase.
4086
+ * `showBooked` has already fired `onBooked` and stopped the timer — this is
4087
+ * about the surface it left standing, and it runs on the way OUT of the
4088
+ * overlay, so a host that navigates away on `onBooked` (DesiPass) never
4089
+ * reaches it.
4090
+ */
4091
+ private resetAfterBooking;
4029
4092
  /**
4030
4093
  * A Performance Group hold settled, told to us by the WRAPPER rather than by
4031
4094
  * a socket (§8: this surface has no realtime feed). `detectBooked` waits for
@@ -4105,18 +4168,10 @@ declare class SeatPicker implements GaPromptPicker {
4105
4168
  * group whose wrapper did not supply the nights.
4106
4169
  */
4107
4170
  private nightStripFor;
4108
- /**
4109
- * Why a tapped seat cannot be taken, or '' when it can.
4110
- *
4111
- * Only the PRESS path asks for this — a mouse already has the status tag and
4112
- * a card that follows the pointer, so a sentence under every hover would be
4113
- * noise. A partly-available group seat is excluded: its night strip already
4114
- * names the exact nights that block it, and "already booked" would flatly
4115
- * contradict the row underneath saying it is free on Friday.
4116
- */
4117
- private unavailableReason;
4118
4171
  private unpinTooltip;
4119
4172
  private handleMapPointerDown;
4173
+ /** Close every open ⓘ popover, except `keep`. */
4174
+ private closeInfoPops;
4120
4175
  private updateTooltip;
4121
4176
  /**
4122
4177
  * Push the wrapper's current seat marks at the renderer.
@@ -4305,8 +4360,6 @@ declare class SeatPicker implements GaPromptPicker {
4305
4360
  /** @internal */ seatViewFor3d(seatId: string): Promise<SeatView | null>;
4306
4361
  /** @internal */ onView3dSeatPick(seatId: string): void;
4307
4362
  /** @internal */ seatViewCaption(seatId: string): string;
4308
- /** @internal */ showUnavailable3dSeat(seat: ExpandedSeat, visualState: SeatState3D, status: Exclude<SeatStatus, 'free'>): void;
4309
- /** @internal */ dismissUnavailable3dSeat(): void;
4310
4363
  private saveView3dComparisonSeat;
4311
4364
  /** @internal */ clearView3dComparison(): void;
4312
4365
  /** @internal */ view3dComparisonSnapshot(seatId: string): {