@seatlayer/js 0.92.5 → 0.94.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,7 +1,7 @@
1
- import { PickerSeat, PickerGAArea, PickerMapTheme, PickerTransport, PickerSelectionValidator, RendererViewMode, PickerSelectionValidity, ChartTheme, AccessibilityType, FloorLabelStyle, LodRung, SectionSummary, PickerAccessNeed, SeatHoverDetails, AccessibleSectionStep, AvailabilityRefreshOutcome, PickerController, ExpandedSeat, TableSelectionDetails, PickerSalesState } from '@seatlayer/core';
1
+ import { PickerSeat, PickerGAArea, PickerMapTheme, PickerTransport, PickerSelectionValidator, RendererViewMode, PickerSelectionValidity, ChartTheme, AccessibilityType, FloorLabelStyle, LodRung, SectionSummary, PickerAccessNeed, SeatHoverDetails, AccessibleSectionStep, AvailabilityRefreshOutcome, RendererMinimapSnapshot, ISeatmapRenderer, PickerController, ExpandedSeat, TableSelectionDetails, PickerSalesState } from '@seatlayer/core';
2
2
  export { ExpandedSeat, PickerMapTheme, PickerSelectionValidator, PickerSelectionValidity, PickerSelectionViolation, RendererViewMode, SeatHoverDetails } from '@seatlayer/core';
3
- import { T as ThemeMode } from './channelsMode-B41tbE29.cjs';
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-B41tbE29.cjs';
3
+ import { T as ThemeMode } from './channelsMode-DYwJ6sfR.cjs';
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-DYwJ6sfR.cjs';
5
5
  import * as _seatlayer_core_core_seatConfidence from '@seatlayer/core/core/seatConfidence';
6
6
  import { SeatConfidenceDisclosure } from '@seatlayer/core/core/seatConfidence';
7
7
  import { SeatViewStopName, Venue3DHandle, SeatState3D, SeatView } from '@seatlayer/core/view3d';
@@ -338,14 +338,26 @@ interface SubscribeTicket {
338
338
  protocols?: string[];
339
339
  }
340
340
  interface BuyerRealtimeOptions {
341
- /** The subscribe URL. Must never carry a credential — asserted below. */
342
- url: string;
341
+ /** The subscribe URL. Must never carry a credential — asserted below. A
342
+ * function is read on every connection attempt, so a reconnect can carry
343
+ * a rotated viewer id (see `onIdleExpired`). */
344
+ url: string | (() => string);
343
345
  sink: RealtimeSink;
344
346
  /** Mint a one-use ticket for THIS connection attempt. Returns null for the
345
347
  * anonymous public case (no ticket needed). Throwing stops the client. */
346
348
  mintTicket?: () => Promise<SubscribeTicket | null>;
347
349
  /** Typed terminal access states. A 4401 `access_expired` close reconnects. */
348
350
  onAccessUnavailable?: (event: BuyerAccessUnavailableEvent) => void;
351
+ /**
352
+ * The server's idle backstop closed the socket: 4401 `idle_expired`, sent
353
+ * once a public socket has stood for EVENT_SOCKET_IDLE_MINUTES. The client
354
+ * stops — the same socket would only be refused again — and the widget
355
+ * decides: raise its paused card, or, when the buyer is plainly still here
356
+ * (a live hold, recent input), `restart()` at once behind a rotated viewer
357
+ * id. Absent, the close is reported through `onAccessUnavailable` as the
358
+ * terminal revoked state, exactly as the runtimes before 0.94 read it.
359
+ */
360
+ onIdleExpired?: () => void;
349
361
  /** Test seam. Defaults to the global WebSocket. */
350
362
  socketFactory?: (url: string, protocols: string[]) => WebSocket;
351
363
  /** Test seam for the keepalive/backoff timers. */
@@ -407,6 +419,9 @@ declare class BuyerRealtimeClient {
407
419
  * Workflow step that has to replay deterministically.
408
420
  */
409
421
  private scheduleReconnect;
422
+ /** Socket reconnects this client has made in its lifetime — for the telemetry beacon. */
423
+ private reconnectCount;
424
+ get reconnects(): number;
410
425
  private clearPongTimer;
411
426
  private clearTimers;
412
427
  }
@@ -2709,7 +2724,7 @@ interface EmbeddedDesignerOptions {
2709
2724
  * theme's `iframe { height: … !important }` cannot override them.
2710
2725
  */
2711
2726
  height?: 'fill' | number;
2712
- /** Minimum height (px) that `'fill'` mode clamps to. Defaults to `480`. */
2727
+ /** Minimum height (px) that `'fill'` mode clamps to. Defaults to `0` so a small host is never overrun. */
2713
2728
  minHeight?: number;
2714
2729
  /**
2715
2730
  * Auto-grow the iframe to the height the Designer reports over the resize
@@ -3159,28 +3174,56 @@ interface PerformanceGroupPickerInternal {
3159
3174
  type ConfirmCardMode = 'add' | 'remove';
3160
3175
 
3161
3176
  /**
3162
- * pickerMinimap — the F3 venue-overview minimap: build, layout, static paint,
3163
- * viewport rectangle, and the pointer/keyboard interactions that pan or focus
3164
- * from it.
3165
- *
3166
- * Lifted out of SeatPicker.ts with the method bodies verbatim — statement for
3167
- * statement, including canvas call order, which matters here because a 2D
3168
- * context is a state machine and jsdom cannot exercise it. The ONLY edits are
3169
- * the indirections through {@link MinimapHost}: `this.controller` →
3170
- * `this.host.controller`, `this.cssVar` → `this.host.cssVar`, `this.tf` →
3171
- * the module-level `tfStatic` it always delegated to, and the widget root and
3172
- * focused-section label behind accessors (SeatPicker replaces both across a
3173
- * re-mount, so they must be read late, not captured).
3177
+ * MapCamera — what a map-chrome component (minimap, zoom pills, crumb) needs
3178
+ * from the surface that owns the renderer (plan item 7, slice A).
3174
3179
  *
3175
- * `build()` also takes its mount element as an argument rather than reading
3176
- * SeatPicker's region map. Everything else — the two-canvas base/blit split,
3177
- * the drag-capture bookkeeping, the click suppression after a drag — is
3178
- * unchanged.
3180
+ * Named so the chrome can be shared: the buyer picker's `PickerController`
3181
+ * satisfies it by type, and the control room's manager satisfies it over its
3182
+ * own renderer. Nothing here is picker-specific — it is the camera, the
3183
+ * floors, the focus, and the overview snapshot the renderer already keeps.
3179
3184
  */
3180
3185
 
3181
- /** What the minimap needs from the widget around it. */
3186
+ interface MapRect {
3187
+ x: number;
3188
+ y: number;
3189
+ width: number;
3190
+ height: number;
3191
+ }
3192
+ interface MapCamera {
3193
+ /** World-space rect currently visible + full chart bounds; null before a chart. */
3194
+ getViewport(): {
3195
+ visible: MapRect;
3196
+ bounds: MapRect;
3197
+ } | null;
3198
+ getMinimapSnapshot(): RendererMinimapSnapshot;
3199
+ /** Pan without changing zoom so `point` becomes the viewport centre. */
3200
+ panToWorld(point: {
3201
+ x: number;
3202
+ y: number;
3203
+ }): void;
3204
+ /** Leave section-focus dimming without changing the current zoom. */
3205
+ clearSectionFocus(): void;
3206
+ /** Glide in on a section (the host surfaces whatever it surfaces on a tap). */
3207
+ focusSection(id: string, anchor?: {
3208
+ x: number;
3209
+ y: number;
3210
+ }): void;
3211
+ /** The whole venue again: focus off, fit the chart. */
3212
+ overview(): void;
3213
+ getFloors(): {
3214
+ id: string;
3215
+ name: string;
3216
+ }[];
3217
+ getActiveFloorId(): string;
3218
+ isFloorOverview(): boolean;
3219
+ /** Optional: the renderer itself, for hosts that still reach past the camera. */
3220
+ getRenderer?(): ISeatmapRenderer | null;
3221
+ }
3222
+
3223
+ /** What the minimap needs from the surface around it. */
3182
3224
  interface MinimapHost {
3183
- readonly controller: PickerController;
3225
+ /** The camera it reads and moves — a picker controller or a manager's map. */
3226
+ readonly controller: MapCamera;
3184
3227
  /** The widget root — it carries `data-minimap-open`. A function, not a
3185
3228
  * field: SeatPicker rebuilds its root, and a captured one goes stale. */
3186
3229
  root(): HTMLElement | null;
@@ -3189,8 +3232,15 @@ interface MinimapHost {
3189
3232
  /** Label of the last surfaced section card. Backs the minimap caption when
3190
3233
  * the renderer snapshot reports no active section. */
3191
3234
  focusedSectionLabel(): string | undefined;
3235
+ /**
3236
+ * The display colour of a category, for the seat-dot thumbnail of a chart
3237
+ * with no sections. ASKED OF THE HOST so a colourblind-safe remap reaches
3238
+ * the map, the legend and this thumbnail from one place. Undefined = the
3239
+ * flat availability colour.
3240
+ */
3241
+ tint?(categoryKey: string): string | undefined;
3192
3242
  }
3193
- declare class PickerMinimap {
3243
+ declare class MapMinimap {
3194
3244
  private readonly host;
3195
3245
  private miniCanvas;
3196
3246
  private miniBase;
@@ -3519,6 +3569,8 @@ declare class SeatPicker implements GaPromptPicker {
3519
3569
  private readonly access;
3520
3570
  private realtime;
3521
3571
  private accessEl;
3572
+ /** The buyer's idle clock (0.94, #78; pickerIdle.ts). Null until mounted or when turned off. */
3573
+ private idleClock;
3522
3574
  /** @internal */ readonly apiBase: string;
3523
3575
  /** @internal */ controller: PickerController;
3524
3576
  /** @internal */ maxTickets: number;
@@ -3746,7 +3798,7 @@ declare class SeatPicker implements GaPromptPicker {
3746
3798
  /** The panel's price-band <select>, so the rail's reset chip can keep it in
3747
3799
  * step. Null when the chart has fewer than two bands and none was built. */
3748
3800
  /** @internal */ priceSelect: HTMLSelectElement | null;
3749
- /** @internal */ minimap: PickerMinimap | null;
3801
+ /** @internal */ minimap: MapMinimap | null;
3750
3802
  private pickerLayoutSize;
3751
3803
  private fullscreenAffordanceSize;
3752
3804
  /** @internal */ priceBandKeys: Set<string> | null;
@@ -4879,6 +4931,10 @@ declare class SeatPicker implements GaPromptPicker {
4879
4931
  */
4880
4932
  private recoverAccess;
4881
4933
  private dismissAccessPanel;
4934
+ /** The idle clock and the paused card — see pickerIdlePause.ts. */
4935
+ private get idlePauseHost();
4936
+ private startIdleClock;
4937
+ private resumeFromIdle;
4882
4938
  /**
4883
4939
  * The hold ran out under the buyer's feet — say so, and block.
4884
4940
  *
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { PickerSeat, PickerGAArea, PickerMapTheme, PickerTransport, PickerSelectionValidator, RendererViewMode, PickerSelectionValidity, ChartTheme, AccessibilityType, FloorLabelStyle, LodRung, SectionSummary, PickerAccessNeed, SeatHoverDetails, AccessibleSectionStep, AvailabilityRefreshOutcome, PickerController, ExpandedSeat, TableSelectionDetails, PickerSalesState } from '@seatlayer/core';
1
+ import { PickerSeat, PickerGAArea, PickerMapTheme, PickerTransport, PickerSelectionValidator, RendererViewMode, PickerSelectionValidity, ChartTheme, AccessibilityType, FloorLabelStyle, LodRung, SectionSummary, PickerAccessNeed, SeatHoverDetails, AccessibleSectionStep, AvailabilityRefreshOutcome, RendererMinimapSnapshot, ISeatmapRenderer, PickerController, ExpandedSeat, TableSelectionDetails, PickerSalesState } from '@seatlayer/core';
2
2
  export { ExpandedSeat, PickerMapTheme, PickerSelectionValidator, PickerSelectionValidity, PickerSelectionViolation, RendererViewMode, SeatHoverDetails } from '@seatlayer/core';
3
- import { T as ThemeMode } from './channelsMode-B41tbE29.js';
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-B41tbE29.js';
3
+ import { T as ThemeMode } from './channelsMode-DYwJ6sfR.js';
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-DYwJ6sfR.js';
5
5
  import * as _seatlayer_core_core_seatConfidence from '@seatlayer/core/core/seatConfidence';
6
6
  import { SeatConfidenceDisclosure } from '@seatlayer/core/core/seatConfidence';
7
7
  import { SeatViewStopName, Venue3DHandle, SeatState3D, SeatView } from '@seatlayer/core/view3d';
@@ -338,14 +338,26 @@ interface SubscribeTicket {
338
338
  protocols?: string[];
339
339
  }
340
340
  interface BuyerRealtimeOptions {
341
- /** The subscribe URL. Must never carry a credential — asserted below. */
342
- url: string;
341
+ /** The subscribe URL. Must never carry a credential — asserted below. A
342
+ * function is read on every connection attempt, so a reconnect can carry
343
+ * a rotated viewer id (see `onIdleExpired`). */
344
+ url: string | (() => string);
343
345
  sink: RealtimeSink;
344
346
  /** Mint a one-use ticket for THIS connection attempt. Returns null for the
345
347
  * anonymous public case (no ticket needed). Throwing stops the client. */
346
348
  mintTicket?: () => Promise<SubscribeTicket | null>;
347
349
  /** Typed terminal access states. A 4401 `access_expired` close reconnects. */
348
350
  onAccessUnavailable?: (event: BuyerAccessUnavailableEvent) => void;
351
+ /**
352
+ * The server's idle backstop closed the socket: 4401 `idle_expired`, sent
353
+ * once a public socket has stood for EVENT_SOCKET_IDLE_MINUTES. The client
354
+ * stops — the same socket would only be refused again — and the widget
355
+ * decides: raise its paused card, or, when the buyer is plainly still here
356
+ * (a live hold, recent input), `restart()` at once behind a rotated viewer
357
+ * id. Absent, the close is reported through `onAccessUnavailable` as the
358
+ * terminal revoked state, exactly as the runtimes before 0.94 read it.
359
+ */
360
+ onIdleExpired?: () => void;
349
361
  /** Test seam. Defaults to the global WebSocket. */
350
362
  socketFactory?: (url: string, protocols: string[]) => WebSocket;
351
363
  /** Test seam for the keepalive/backoff timers. */
@@ -407,6 +419,9 @@ declare class BuyerRealtimeClient {
407
419
  * Workflow step that has to replay deterministically.
408
420
  */
409
421
  private scheduleReconnect;
422
+ /** Socket reconnects this client has made in its lifetime — for the telemetry beacon. */
423
+ private reconnectCount;
424
+ get reconnects(): number;
410
425
  private clearPongTimer;
411
426
  private clearTimers;
412
427
  }
@@ -2709,7 +2724,7 @@ interface EmbeddedDesignerOptions {
2709
2724
  * theme's `iframe { height: … !important }` cannot override them.
2710
2725
  */
2711
2726
  height?: 'fill' | number;
2712
- /** Minimum height (px) that `'fill'` mode clamps to. Defaults to `480`. */
2727
+ /** Minimum height (px) that `'fill'` mode clamps to. Defaults to `0` so a small host is never overrun. */
2713
2728
  minHeight?: number;
2714
2729
  /**
2715
2730
  * Auto-grow the iframe to the height the Designer reports over the resize
@@ -3159,28 +3174,56 @@ interface PerformanceGroupPickerInternal {
3159
3174
  type ConfirmCardMode = 'add' | 'remove';
3160
3175
 
3161
3176
  /**
3162
- * pickerMinimap — the F3 venue-overview minimap: build, layout, static paint,
3163
- * viewport rectangle, and the pointer/keyboard interactions that pan or focus
3164
- * from it.
3165
- *
3166
- * Lifted out of SeatPicker.ts with the method bodies verbatim — statement for
3167
- * statement, including canvas call order, which matters here because a 2D
3168
- * context is a state machine and jsdom cannot exercise it. The ONLY edits are
3169
- * the indirections through {@link MinimapHost}: `this.controller` →
3170
- * `this.host.controller`, `this.cssVar` → `this.host.cssVar`, `this.tf` →
3171
- * the module-level `tfStatic` it always delegated to, and the widget root and
3172
- * focused-section label behind accessors (SeatPicker replaces both across a
3173
- * re-mount, so they must be read late, not captured).
3177
+ * MapCamera — what a map-chrome component (minimap, zoom pills, crumb) needs
3178
+ * from the surface that owns the renderer (plan item 7, slice A).
3174
3179
  *
3175
- * `build()` also takes its mount element as an argument rather than reading
3176
- * SeatPicker's region map. Everything else — the two-canvas base/blit split,
3177
- * the drag-capture bookkeeping, the click suppression after a drag — is
3178
- * unchanged.
3180
+ * Named so the chrome can be shared: the buyer picker's `PickerController`
3181
+ * satisfies it by type, and the control room's manager satisfies it over its
3182
+ * own renderer. Nothing here is picker-specific — it is the camera, the
3183
+ * floors, the focus, and the overview snapshot the renderer already keeps.
3179
3184
  */
3180
3185
 
3181
- /** What the minimap needs from the widget around it. */
3186
+ interface MapRect {
3187
+ x: number;
3188
+ y: number;
3189
+ width: number;
3190
+ height: number;
3191
+ }
3192
+ interface MapCamera {
3193
+ /** World-space rect currently visible + full chart bounds; null before a chart. */
3194
+ getViewport(): {
3195
+ visible: MapRect;
3196
+ bounds: MapRect;
3197
+ } | null;
3198
+ getMinimapSnapshot(): RendererMinimapSnapshot;
3199
+ /** Pan without changing zoom so `point` becomes the viewport centre. */
3200
+ panToWorld(point: {
3201
+ x: number;
3202
+ y: number;
3203
+ }): void;
3204
+ /** Leave section-focus dimming without changing the current zoom. */
3205
+ clearSectionFocus(): void;
3206
+ /** Glide in on a section (the host surfaces whatever it surfaces on a tap). */
3207
+ focusSection(id: string, anchor?: {
3208
+ x: number;
3209
+ y: number;
3210
+ }): void;
3211
+ /** The whole venue again: focus off, fit the chart. */
3212
+ overview(): void;
3213
+ getFloors(): {
3214
+ id: string;
3215
+ name: string;
3216
+ }[];
3217
+ getActiveFloorId(): string;
3218
+ isFloorOverview(): boolean;
3219
+ /** Optional: the renderer itself, for hosts that still reach past the camera. */
3220
+ getRenderer?(): ISeatmapRenderer | null;
3221
+ }
3222
+
3223
+ /** What the minimap needs from the surface around it. */
3182
3224
  interface MinimapHost {
3183
- readonly controller: PickerController;
3225
+ /** The camera it reads and moves — a picker controller or a manager's map. */
3226
+ readonly controller: MapCamera;
3184
3227
  /** The widget root — it carries `data-minimap-open`. A function, not a
3185
3228
  * field: SeatPicker rebuilds its root, and a captured one goes stale. */
3186
3229
  root(): HTMLElement | null;
@@ -3189,8 +3232,15 @@ interface MinimapHost {
3189
3232
  /** Label of the last surfaced section card. Backs the minimap caption when
3190
3233
  * the renderer snapshot reports no active section. */
3191
3234
  focusedSectionLabel(): string | undefined;
3235
+ /**
3236
+ * The display colour of a category, for the seat-dot thumbnail of a chart
3237
+ * with no sections. ASKED OF THE HOST so a colourblind-safe remap reaches
3238
+ * the map, the legend and this thumbnail from one place. Undefined = the
3239
+ * flat availability colour.
3240
+ */
3241
+ tint?(categoryKey: string): string | undefined;
3192
3242
  }
3193
- declare class PickerMinimap {
3243
+ declare class MapMinimap {
3194
3244
  private readonly host;
3195
3245
  private miniCanvas;
3196
3246
  private miniBase;
@@ -3519,6 +3569,8 @@ declare class SeatPicker implements GaPromptPicker {
3519
3569
  private readonly access;
3520
3570
  private realtime;
3521
3571
  private accessEl;
3572
+ /** The buyer's idle clock (0.94, #78; pickerIdle.ts). Null until mounted or when turned off. */
3573
+ private idleClock;
3522
3574
  /** @internal */ readonly apiBase: string;
3523
3575
  /** @internal */ controller: PickerController;
3524
3576
  /** @internal */ maxTickets: number;
@@ -3746,7 +3798,7 @@ declare class SeatPicker implements GaPromptPicker {
3746
3798
  /** The panel's price-band <select>, so the rail's reset chip can keep it in
3747
3799
  * step. Null when the chart has fewer than two bands and none was built. */
3748
3800
  /** @internal */ priceSelect: HTMLSelectElement | null;
3749
- /** @internal */ minimap: PickerMinimap | null;
3801
+ /** @internal */ minimap: MapMinimap | null;
3750
3802
  private pickerLayoutSize;
3751
3803
  private fullscreenAffordanceSize;
3752
3804
  /** @internal */ priceBandKeys: Set<string> | null;
@@ -4879,6 +4931,10 @@ declare class SeatPicker implements GaPromptPicker {
4879
4931
  */
4880
4932
  private recoverAccess;
4881
4933
  private dismissAccessPanel;
4934
+ /** The idle clock and the paused card — see pickerIdlePause.ts. */
4935
+ private get idlePauseHost();
4936
+ private startIdleClock;
4937
+ private resumeFromIdle;
4882
4938
  /**
4883
4939
  * The hold ran out under the buyer's feet — say so, and block.
4884
4940
  *