@seatlayer/js 0.47.1 → 0.48.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
1
  import { PickerSeat, RendererViewMode, SeatHoverDetails, PickerTransport, PickerMapTheme } from '@seatlayer/core';
2
2
  export { ExpandedSeat, SeatHoverDetails } from '@seatlayer/core';
3
- import { C as ChannelListResult, a as ChannelAllocationPage, b as ChannelRecord, A as AssignmentResult, c as ChannelPreviewProjection, d as ChannelAccessIntent, e as AccessLinkReveal, f as AccessLinkStatusRecord, g as ChannelSeatStatus, B as BucketRow } from './manager-CAIPkUYl.cjs';
4
- export { h as ACCESS_LINK_DEFAULTS, i as AccessIntentForbidsDetails, j as AccessLinkRecord, k as AccessLinkState, l as AccessLinkStatus, m as ArchiveBlockedDetails, n as AssignmentBuckets, o as AssignmentDropDetails, p as ChannelAccessSummary, q as ChannelAuditEntry, r as ChannelAuditPage, s as ChannelCounts, t as ChannelState, u as ControlRoomActivityEntry, v as ControlRoomSectionMetric, w as ControlRoomSnapshot, I as IntentSwitchBlockedDetails, L as LogEntry, x as LogPage, M as ManageApi, y as ManageApiError, P as PUBLIC_CHANNEL_ID, z as PUBLIC_CHANNEL_NAME, R as ReportByStatus, D as ReportCategoryMeta, E as ReportCategoryRow, F as ReportResult, S as SeatManager, G as SeatManagerActionResult, H as SeatManagerActivity, J as SeatManagerCapability, K as SeatManagerConnection, N as SeatManagerMode, O as SeatManagerOptions, Q as SeatManagerTallies, T as SelectionSourceRow, U as accessIntentDescription, V as accessIntentLabel, W as accessLine, X as accessLinkBadge, Y as accessLinkErrorCopy, Z as accessLinkIsLive, _ as accessLinkPolicyLines, $ as bucketRows, a0 as dropReviewRows, a1 as intentForbidsCopy, a2 as intentSwitchBlockedCopy, a3 as isPublicChannelId, a4 as markerLetter, a5 as markerOf, a6 as mutationCount, a7 as needsMoveConfirmation, a8 as planAssignment, a9 as retryAfterCopy, aa as selectionSources, ab as stateBadge, ac as suggestMarker } from './manager-CAIPkUYl.cjs';
3
+ import { C as ChannelListResult, a as ChannelAllocationPage, b as ChannelRecord, A as AssignmentResult, c as ChannelPreviewProjection, d as ChannelAccessIntent, e as AccessLinkReveal, f as AccessLinkStatusRecord, g as ChannelSeatStatus, B as BucketRow } from './manager-DEjbKiqJ.cjs';
4
+ export { h as ACCESS_LINK_DEFAULTS, i as AccessIntentForbidsDetails, j as AccessLinkRecord, k as AccessLinkState, l as AccessLinkStatus, m as ArchiveBlockedDetails, n as AssignmentBuckets, o as AssignmentDropDetails, p as ChannelAccessSummary, q as ChannelAttribution, r as ChannelAuditEntry, s as ChannelAuditPage, t as ChannelCounts, u as ChannelReport, v as ChannelReportLinkRecord, w as ChannelReportLinkReveal, x as ChannelReportResult, y as ChannelReportRow, z as ChannelState, D as ControlRoomActivityEntry, E as ControlRoomSectionMetric, F as ControlRoomSnapshot, I as IntentSwitchBlockedDetails, G as InventoryBooking, H as InventoryBookingActivity, J as InventoryBookingDetail, K as InventoryBookingObject, L as InventoryBookingState, M as InventoryBookingsPage, N as InventoryBookingsQuery, O as LogEntry, P as LogPage, Q as ManageApi, R as ManageApiError, S as PUBLIC_CHANNEL_ID, T as PUBLIC_CHANNEL_NAME, U as ReportByStatus, V as ReportCategoryMeta, W as ReportCategoryRow, X as ReportResult, Y as SeatManager, Z as SeatManagerActionResult, _ as SeatManagerActivity, $ as SeatManagerCapability, a0 as SeatManagerConnection, a1 as SeatManagerMode, a2 as SeatManagerOptions, a3 as SeatManagerTallies, a4 as SelectionSourceRow, a5 as accessIntentDescription, a6 as accessIntentLabel, a7 as accessLine, a8 as accessLinkBadge, a9 as accessLinkErrorCopy, aa as accessLinkIsLive, ab as accessLinkPolicyLines, ac as bucketRows, ad as dropReviewRows, ae as intentForbidsCopy, af as intentSwitchBlockedCopy, ag as isPublicChannelId, ah as markerLetter, ai as markerOf, aj as mutationCount, ak as needsMoveConfirmation, al as planAssignment, am as retryAfterCopy, an as selectionSources, ao as stateBadge, ap as suggestMarker } from './manager-DEjbKiqJ.cjs';
5
5
 
6
6
  /**
7
7
  * Buyer access context — the browser half of the Sales Channels contract
@@ -369,8 +369,10 @@ interface ControllerSinkOptions {
369
369
  declare function createControllerSink(controller: PickerControllerLike, options?: ControllerSinkOptions): RealtimeSink;
370
370
 
371
371
  /**
372
- * Minimal client for the public embed surface of workers/api (the `/pub/*`
373
- * routes). Deliberately self-contained it does NOT reuse src/lib/api.ts,
372
+ * Minimal client for the browser embed surface of workers/api (the `/pub/*`
373
+ * routes). Platform events bind this client to a buyer access context; Managed
374
+ * public/unlisted events may still use it anonymously. Deliberately
375
+ * self-contained — it does NOT reuse src/lib/api.ts,
374
376
  * which bakes in a build-time API base and dashboard session credentials. The
375
377
  * SDK runs cross-origin on a third-party ticketing page, so:
376
378
  * - apiBase is per-instance (constructor option), not a build constant;
@@ -1069,6 +1071,59 @@ declare class EmbeddedDesigner {
1069
1071
  private handleMessage;
1070
1072
  }
1071
1073
 
1074
+ /**
1075
+ * Buyer-safe ticket-offer availability shared by the canonical picker and the
1076
+ * hosted event-page templates.
1077
+ *
1078
+ * This module intentionally owns the wire parser. A hosted page, iframe, popup
1079
+ * and SDK mount must refuse or accept the same payload; duplicating this reader
1080
+ * is how one surface eventually prints a price another surface will not charge.
1081
+ */
1082
+ type SaleState = 'on-sale' | 'low' | 'sold-out' | 'presale' | 'closed';
1083
+ interface TicketOfferSummary {
1084
+ /** Legacy ordering fields kept for older page templates and payloads. */
1085
+ index: number;
1086
+ count: number;
1087
+ /** Units currently available at this offer price; null means unlimited. */
1088
+ remaining: number | null;
1089
+ /** Buyer-facing fields added by the offers UX. Absent on older workers. */
1090
+ id?: string;
1091
+ name?: string;
1092
+ categoryKey?: string | null;
1093
+ startsAt?: number | null;
1094
+ endsAt?: number | null;
1095
+ }
1096
+ interface TicketOfferPrice {
1097
+ categoryKey: string;
1098
+ /** Major units. What a hold on this category is charged right now. */
1099
+ price: number;
1100
+ /** Major units, or null. Printed only when genuinely higher. */
1101
+ previousPrice: number | null;
1102
+ /** Offer provenance for the price row. Absent on older workers. */
1103
+ offerId?: string;
1104
+ offerName?: string;
1105
+ remaining?: number | null;
1106
+ startsAt?: number | null;
1107
+ endsAt?: number | null;
1108
+ }
1109
+ interface TicketOfferAvailability {
1110
+ state: SaleState;
1111
+ /** Currently advertised offer price, in minor units. */
1112
+ fromPrice: number | null;
1113
+ previousPrice: number | null;
1114
+ currency: string | null;
1115
+ /** The highest-priority active buy offer, when one exists. */
1116
+ release: TicketOfferSummary | null;
1117
+ /** The next scheduled price offer. It does not close ordinary ticket sales. */
1118
+ upcoming: TicketOfferSummary | null;
1119
+ /** Server-resolved active offer prices by category, in major units. */
1120
+ prices: TicketOfferPrice[];
1121
+ }
1122
+ /** Parse a public offer payload without repairing a half-understood price. */
1123
+ declare function parseTicketOfferAvailability(body: unknown): TicketOfferAvailability | null;
1124
+ /** Translate the server-resolved category map into SeatPicker pricing. */
1125
+ declare function ticketOfferPrices(availability: TicketOfferAvailability | null): Record<string, number>;
1126
+
1072
1127
  /**
1073
1128
  * SeatPicker — the full buyer experience as a widget.
1074
1129
  *
@@ -1298,6 +1353,12 @@ interface SeatPickerOptions {
1298
1353
  * fall back to the chart price.
1299
1354
  */
1300
1355
  pricing?: SeatPickerPricing;
1356
+ /**
1357
+ * Fires when the server-resolved active offer changes. Hosted event pages use
1358
+ * this to keep their headline, sticky bar and the canonical picker on the
1359
+ * same live fact. The picker remains fully functional when it is omitted.
1360
+ */
1361
+ onOfferAvailabilityChange?: (availability: TicketOfferAvailability | null) => void;
1301
1362
  /** Hold TTL in ms passed to hold(); server clamps to its own limits. */
1302
1363
  holdTtlMs?: number;
1303
1364
  /**
@@ -1312,6 +1373,13 @@ interface SeatPickerOptions {
1312
1373
  * owns hold persistence and supplies initialHoldId itself.
1313
1374
  */
1314
1375
  restoreHold?: boolean;
1376
+ /**
1377
+ * Render the real chart and live seat statuses without allowing selection,
1378
+ * holds or checkout. This is for venue previews and pre-sale Website pages;
1379
+ * it is enforced by the widget even if the event later opens while mounted.
1380
+ * Default false.
1381
+ */
1382
+ readOnly?: boolean;
1315
1383
  /**
1316
1384
  * Confirm mode: tapping a seat shows a confirmation card with section, row,
1317
1385
  * seat, category, price and Select/Cancel before it enters the tray. Default
@@ -1463,6 +1531,8 @@ interface SeatPickerOptions {
1463
1531
  declare class SeatPicker {
1464
1532
  private readonly opts;
1465
1533
  private readonly api;
1534
+ /** Authenticated view media, cached only for this picker lifetime. */
1535
+ private readonly buyerAssetUrls;
1466
1536
  /** Our own public client, or null when the host injected a transport. */
1467
1537
  private readonly pubApi;
1468
1538
  /** Null for the ordinary public picker — the tokenless path is untouched. */
@@ -1472,6 +1542,8 @@ declare class SeatPicker {
1472
1542
  private readonly apiBase;
1473
1543
  private readonly controller;
1474
1544
  private readonly maxTickets;
1545
+ /** Original host pricing, kept separate from live server offer overrides. */
1546
+ private readonly hostPricing;
1475
1547
  private root;
1476
1548
  private mapHost;
1477
1549
  private rendered;
@@ -1482,9 +1554,16 @@ declare class SeatPicker {
1482
1554
  private ro;
1483
1555
  private holdTimer;
1484
1556
  private toastTimer;
1557
+ private offerRefreshTimer;
1558
+ /** Armed only when the offer schedule has a known future transition (or as a
1559
+ * bounded retry after a failed read) — never a fixed-cadence poll. */
1560
+ private offerBoundaryTimer;
1561
+ private offerVisibilityHandler;
1485
1562
  /** Short-lived UI motion timers; all are cancelled on destroy. */
1486
1563
  private motionTimers;
1487
1564
  private currency;
1565
+ private eventTimezone;
1566
+ private offerAvailability;
1488
1567
  private hold;
1489
1568
  /** Latest server expiry for the open hold (moves on extend). */
1490
1569
  private holdExpiresAt;
@@ -1547,6 +1626,8 @@ declare class SeatPicker {
1547
1626
  private secCardEl;
1548
1627
  private viewEl;
1549
1628
  private viewCleanup;
1629
+ /** Supersedes an older authored-view byte request when another seat is opened. */
1630
+ private seatViewGen;
1550
1631
  private allSeatsCache;
1551
1632
  private miniCanvas;
1552
1633
  private miniBase;
@@ -1855,6 +1936,28 @@ declare class SeatPicker {
1855
1936
  private openSeatView;
1856
1937
  private closeSeatView;
1857
1938
  private money;
1939
+ /**
1940
+ * Sleep until the offer schedule's next known transition, then re-read.
1941
+ *
1942
+ * A far-away boundary is capped: the wake re-reads, learns the (unchanged)
1943
+ * schedule, and re-arms — so a picker left open for days still tracks an
1944
+ * organizer's schedule edits at a cost of one request every few hours. No
1945
+ * future transition means no timer at all; an event with no releases does
1946
+ * zero background traffic. A wake in a hidden tab fetches nothing — the
1947
+ * visibilitychange handler owns catching that tab up.
1948
+ */
1949
+ private scheduleOfferBoundary;
1950
+ /** Debounce the no-store offer read behind a burst of seat-status frames. */
1951
+ private scheduleOfferRefresh;
1952
+ /**
1953
+ * Pull the server's resolved answer. A failed refresh keeps the last truthful
1954
+ * answer: flashing back to a chart price while checkout still charges an
1955
+ * offer is worse than a temporarily stale remaining count.
1956
+ */
1957
+ private refreshOfferAvailability;
1958
+ private offerPrice;
1959
+ /** The compact current/upcoming offer card above Ticket prices. */
1960
+ private syncOffer;
1858
1961
  /**
1859
1962
  * The price the buyer will actually pay for a category (+tier): the host's
1860
1963
  * `pricing` override when present, else the chart's stored price. Every
@@ -2799,4 +2902,4 @@ declare class ChannelsMode {
2799
2902
  handleBack(): boolean;
2800
2903
  }
2801
2904
 
2802
- export { AccessLinkReveal, AccessLinkStatusRecord, ApiError, AssignmentResult, type AttachPickerFrameOptions, type BestAvailableResult, BucketRow, BuyerAccessContext, type BuyerAccessExpiredEvent, type BuyerAccessRefreshReason, type BuyerAccessToken, type BuyerAccessTokenProvider, BuyerAccessUnavailableError, type BuyerAccessUnavailableEvent, type BuyerAccessUnavailableReason, BuyerRealtimeClient, type BuyerRealtimeOptions, ChannelAccessIntent, ChannelAllocationPage, ChannelListResult, ChannelPreviewProjection, ChannelRecord, ChannelSeatStatus, type ChannelsCapabilities, type ChannelsClient, ChannelsMode, type ChannelsModeHost, type ChannelsRowView, type ChannelsSeatView, type CheckoutHandoff, type CheckoutLineItem, type CheckoutSessionResult, EmbeddedDesigner, type EmbeddedDesignerEventType, type EmbeddedDesignerMessage, type EmbeddedDesignerOptions, type GAAreaAvailability, type HoldConflict, type HoldLineItem, type HoldResult, type OrderStatusResult, type PaymentOptionsReason, type PaymentOptionsResult, type PaymentProviderName, type Projection, type PubApiOptions, type RealtimeSink, type ResumedHoldResult, SeatPicker, type SeatPickerOptions, type SeatPickerTheme, SeatingChart, type SeatingChartOptions, type SelectedObjectUnavailableEvent, type SelectedSeat, type StatusChange, type SubscribeTicket, attachPickerFrame, bucketRowsHtml, createBuyerAccessContext, createControllerSink };
2905
+ export { AccessLinkReveal, AccessLinkStatusRecord, ApiError, AssignmentResult, type AttachPickerFrameOptions, type BestAvailableResult, BucketRow, BuyerAccessContext, type BuyerAccessExpiredEvent, type BuyerAccessRefreshReason, type BuyerAccessToken, type BuyerAccessTokenProvider, BuyerAccessUnavailableError, type BuyerAccessUnavailableEvent, type BuyerAccessUnavailableReason, BuyerRealtimeClient, type BuyerRealtimeOptions, ChannelAccessIntent, ChannelAllocationPage, ChannelListResult, ChannelPreviewProjection, ChannelRecord, ChannelSeatStatus, type ChannelsCapabilities, type ChannelsClient, ChannelsMode, type ChannelsModeHost, type ChannelsRowView, type ChannelsSeatView, type CheckoutHandoff, type CheckoutLineItem, type CheckoutSessionResult, EmbeddedDesigner, type EmbeddedDesignerEventType, type EmbeddedDesignerMessage, type EmbeddedDesignerOptions, type GAAreaAvailability, type HoldConflict, type HoldLineItem, type HoldResult, type OrderStatusResult, type PaymentOptionsReason, type PaymentOptionsResult, type PaymentProviderName, type Projection, type PubApiOptions, type RealtimeSink, type ResumedHoldResult, type SaleState, SeatPicker, type SeatPickerOptions, type SeatPickerTheme, SeatingChart, type SeatingChartOptions, type SelectedObjectUnavailableEvent, type SelectedSeat, type StatusChange, type SubscribeTicket, type TicketOfferAvailability, type TicketOfferPrice, type TicketOfferSummary, attachPickerFrame, bucketRowsHtml, createBuyerAccessContext, createControllerSink, parseTicketOfferAvailability, ticketOfferPrices };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { PickerSeat, RendererViewMode, SeatHoverDetails, PickerTransport, PickerMapTheme } from '@seatlayer/core';
2
2
  export { ExpandedSeat, SeatHoverDetails } from '@seatlayer/core';
3
- import { C as ChannelListResult, a as ChannelAllocationPage, b as ChannelRecord, A as AssignmentResult, c as ChannelPreviewProjection, d as ChannelAccessIntent, e as AccessLinkReveal, f as AccessLinkStatusRecord, g as ChannelSeatStatus, B as BucketRow } from './manager-CAIPkUYl.js';
4
- export { h as ACCESS_LINK_DEFAULTS, i as AccessIntentForbidsDetails, j as AccessLinkRecord, k as AccessLinkState, l as AccessLinkStatus, m as ArchiveBlockedDetails, n as AssignmentBuckets, o as AssignmentDropDetails, p as ChannelAccessSummary, q as ChannelAuditEntry, r as ChannelAuditPage, s as ChannelCounts, t as ChannelState, u as ControlRoomActivityEntry, v as ControlRoomSectionMetric, w as ControlRoomSnapshot, I as IntentSwitchBlockedDetails, L as LogEntry, x as LogPage, M as ManageApi, y as ManageApiError, P as PUBLIC_CHANNEL_ID, z as PUBLIC_CHANNEL_NAME, R as ReportByStatus, D as ReportCategoryMeta, E as ReportCategoryRow, F as ReportResult, S as SeatManager, G as SeatManagerActionResult, H as SeatManagerActivity, J as SeatManagerCapability, K as SeatManagerConnection, N as SeatManagerMode, O as SeatManagerOptions, Q as SeatManagerTallies, T as SelectionSourceRow, U as accessIntentDescription, V as accessIntentLabel, W as accessLine, X as accessLinkBadge, Y as accessLinkErrorCopy, Z as accessLinkIsLive, _ as accessLinkPolicyLines, $ as bucketRows, a0 as dropReviewRows, a1 as intentForbidsCopy, a2 as intentSwitchBlockedCopy, a3 as isPublicChannelId, a4 as markerLetter, a5 as markerOf, a6 as mutationCount, a7 as needsMoveConfirmation, a8 as planAssignment, a9 as retryAfterCopy, aa as selectionSources, ab as stateBadge, ac as suggestMarker } from './manager-CAIPkUYl.js';
3
+ import { C as ChannelListResult, a as ChannelAllocationPage, b as ChannelRecord, A as AssignmentResult, c as ChannelPreviewProjection, d as ChannelAccessIntent, e as AccessLinkReveal, f as AccessLinkStatusRecord, g as ChannelSeatStatus, B as BucketRow } from './manager-DEjbKiqJ.js';
4
+ export { h as ACCESS_LINK_DEFAULTS, i as AccessIntentForbidsDetails, j as AccessLinkRecord, k as AccessLinkState, l as AccessLinkStatus, m as ArchiveBlockedDetails, n as AssignmentBuckets, o as AssignmentDropDetails, p as ChannelAccessSummary, q as ChannelAttribution, r as ChannelAuditEntry, s as ChannelAuditPage, t as ChannelCounts, u as ChannelReport, v as ChannelReportLinkRecord, w as ChannelReportLinkReveal, x as ChannelReportResult, y as ChannelReportRow, z as ChannelState, D as ControlRoomActivityEntry, E as ControlRoomSectionMetric, F as ControlRoomSnapshot, I as IntentSwitchBlockedDetails, G as InventoryBooking, H as InventoryBookingActivity, J as InventoryBookingDetail, K as InventoryBookingObject, L as InventoryBookingState, M as InventoryBookingsPage, N as InventoryBookingsQuery, O as LogEntry, P as LogPage, Q as ManageApi, R as ManageApiError, S as PUBLIC_CHANNEL_ID, T as PUBLIC_CHANNEL_NAME, U as ReportByStatus, V as ReportCategoryMeta, W as ReportCategoryRow, X as ReportResult, Y as SeatManager, Z as SeatManagerActionResult, _ as SeatManagerActivity, $ as SeatManagerCapability, a0 as SeatManagerConnection, a1 as SeatManagerMode, a2 as SeatManagerOptions, a3 as SeatManagerTallies, a4 as SelectionSourceRow, a5 as accessIntentDescription, a6 as accessIntentLabel, a7 as accessLine, a8 as accessLinkBadge, a9 as accessLinkErrorCopy, aa as accessLinkIsLive, ab as accessLinkPolicyLines, ac as bucketRows, ad as dropReviewRows, ae as intentForbidsCopy, af as intentSwitchBlockedCopy, ag as isPublicChannelId, ah as markerLetter, ai as markerOf, aj as mutationCount, ak as needsMoveConfirmation, al as planAssignment, am as retryAfterCopy, an as selectionSources, ao as stateBadge, ap as suggestMarker } from './manager-DEjbKiqJ.js';
5
5
 
6
6
  /**
7
7
  * Buyer access context — the browser half of the Sales Channels contract
@@ -369,8 +369,10 @@ interface ControllerSinkOptions {
369
369
  declare function createControllerSink(controller: PickerControllerLike, options?: ControllerSinkOptions): RealtimeSink;
370
370
 
371
371
  /**
372
- * Minimal client for the public embed surface of workers/api (the `/pub/*`
373
- * routes). Deliberately self-contained it does NOT reuse src/lib/api.ts,
372
+ * Minimal client for the browser embed surface of workers/api (the `/pub/*`
373
+ * routes). Platform events bind this client to a buyer access context; Managed
374
+ * public/unlisted events may still use it anonymously. Deliberately
375
+ * self-contained — it does NOT reuse src/lib/api.ts,
374
376
  * which bakes in a build-time API base and dashboard session credentials. The
375
377
  * SDK runs cross-origin on a third-party ticketing page, so:
376
378
  * - apiBase is per-instance (constructor option), not a build constant;
@@ -1069,6 +1071,59 @@ declare class EmbeddedDesigner {
1069
1071
  private handleMessage;
1070
1072
  }
1071
1073
 
1074
+ /**
1075
+ * Buyer-safe ticket-offer availability shared by the canonical picker and the
1076
+ * hosted event-page templates.
1077
+ *
1078
+ * This module intentionally owns the wire parser. A hosted page, iframe, popup
1079
+ * and SDK mount must refuse or accept the same payload; duplicating this reader
1080
+ * is how one surface eventually prints a price another surface will not charge.
1081
+ */
1082
+ type SaleState = 'on-sale' | 'low' | 'sold-out' | 'presale' | 'closed';
1083
+ interface TicketOfferSummary {
1084
+ /** Legacy ordering fields kept for older page templates and payloads. */
1085
+ index: number;
1086
+ count: number;
1087
+ /** Units currently available at this offer price; null means unlimited. */
1088
+ remaining: number | null;
1089
+ /** Buyer-facing fields added by the offers UX. Absent on older workers. */
1090
+ id?: string;
1091
+ name?: string;
1092
+ categoryKey?: string | null;
1093
+ startsAt?: number | null;
1094
+ endsAt?: number | null;
1095
+ }
1096
+ interface TicketOfferPrice {
1097
+ categoryKey: string;
1098
+ /** Major units. What a hold on this category is charged right now. */
1099
+ price: number;
1100
+ /** Major units, or null. Printed only when genuinely higher. */
1101
+ previousPrice: number | null;
1102
+ /** Offer provenance for the price row. Absent on older workers. */
1103
+ offerId?: string;
1104
+ offerName?: string;
1105
+ remaining?: number | null;
1106
+ startsAt?: number | null;
1107
+ endsAt?: number | null;
1108
+ }
1109
+ interface TicketOfferAvailability {
1110
+ state: SaleState;
1111
+ /** Currently advertised offer price, in minor units. */
1112
+ fromPrice: number | null;
1113
+ previousPrice: number | null;
1114
+ currency: string | null;
1115
+ /** The highest-priority active buy offer, when one exists. */
1116
+ release: TicketOfferSummary | null;
1117
+ /** The next scheduled price offer. It does not close ordinary ticket sales. */
1118
+ upcoming: TicketOfferSummary | null;
1119
+ /** Server-resolved active offer prices by category, in major units. */
1120
+ prices: TicketOfferPrice[];
1121
+ }
1122
+ /** Parse a public offer payload without repairing a half-understood price. */
1123
+ declare function parseTicketOfferAvailability(body: unknown): TicketOfferAvailability | null;
1124
+ /** Translate the server-resolved category map into SeatPicker pricing. */
1125
+ declare function ticketOfferPrices(availability: TicketOfferAvailability | null): Record<string, number>;
1126
+
1072
1127
  /**
1073
1128
  * SeatPicker — the full buyer experience as a widget.
1074
1129
  *
@@ -1298,6 +1353,12 @@ interface SeatPickerOptions {
1298
1353
  * fall back to the chart price.
1299
1354
  */
1300
1355
  pricing?: SeatPickerPricing;
1356
+ /**
1357
+ * Fires when the server-resolved active offer changes. Hosted event pages use
1358
+ * this to keep their headline, sticky bar and the canonical picker on the
1359
+ * same live fact. The picker remains fully functional when it is omitted.
1360
+ */
1361
+ onOfferAvailabilityChange?: (availability: TicketOfferAvailability | null) => void;
1301
1362
  /** Hold TTL in ms passed to hold(); server clamps to its own limits. */
1302
1363
  holdTtlMs?: number;
1303
1364
  /**
@@ -1312,6 +1373,13 @@ interface SeatPickerOptions {
1312
1373
  * owns hold persistence and supplies initialHoldId itself.
1313
1374
  */
1314
1375
  restoreHold?: boolean;
1376
+ /**
1377
+ * Render the real chart and live seat statuses without allowing selection,
1378
+ * holds or checkout. This is for venue previews and pre-sale Website pages;
1379
+ * it is enforced by the widget even if the event later opens while mounted.
1380
+ * Default false.
1381
+ */
1382
+ readOnly?: boolean;
1315
1383
  /**
1316
1384
  * Confirm mode: tapping a seat shows a confirmation card with section, row,
1317
1385
  * seat, category, price and Select/Cancel before it enters the tray. Default
@@ -1463,6 +1531,8 @@ interface SeatPickerOptions {
1463
1531
  declare class SeatPicker {
1464
1532
  private readonly opts;
1465
1533
  private readonly api;
1534
+ /** Authenticated view media, cached only for this picker lifetime. */
1535
+ private readonly buyerAssetUrls;
1466
1536
  /** Our own public client, or null when the host injected a transport. */
1467
1537
  private readonly pubApi;
1468
1538
  /** Null for the ordinary public picker — the tokenless path is untouched. */
@@ -1472,6 +1542,8 @@ declare class SeatPicker {
1472
1542
  private readonly apiBase;
1473
1543
  private readonly controller;
1474
1544
  private readonly maxTickets;
1545
+ /** Original host pricing, kept separate from live server offer overrides. */
1546
+ private readonly hostPricing;
1475
1547
  private root;
1476
1548
  private mapHost;
1477
1549
  private rendered;
@@ -1482,9 +1554,16 @@ declare class SeatPicker {
1482
1554
  private ro;
1483
1555
  private holdTimer;
1484
1556
  private toastTimer;
1557
+ private offerRefreshTimer;
1558
+ /** Armed only when the offer schedule has a known future transition (or as a
1559
+ * bounded retry after a failed read) — never a fixed-cadence poll. */
1560
+ private offerBoundaryTimer;
1561
+ private offerVisibilityHandler;
1485
1562
  /** Short-lived UI motion timers; all are cancelled on destroy. */
1486
1563
  private motionTimers;
1487
1564
  private currency;
1565
+ private eventTimezone;
1566
+ private offerAvailability;
1488
1567
  private hold;
1489
1568
  /** Latest server expiry for the open hold (moves on extend). */
1490
1569
  private holdExpiresAt;
@@ -1547,6 +1626,8 @@ declare class SeatPicker {
1547
1626
  private secCardEl;
1548
1627
  private viewEl;
1549
1628
  private viewCleanup;
1629
+ /** Supersedes an older authored-view byte request when another seat is opened. */
1630
+ private seatViewGen;
1550
1631
  private allSeatsCache;
1551
1632
  private miniCanvas;
1552
1633
  private miniBase;
@@ -1855,6 +1936,28 @@ declare class SeatPicker {
1855
1936
  private openSeatView;
1856
1937
  private closeSeatView;
1857
1938
  private money;
1939
+ /**
1940
+ * Sleep until the offer schedule's next known transition, then re-read.
1941
+ *
1942
+ * A far-away boundary is capped: the wake re-reads, learns the (unchanged)
1943
+ * schedule, and re-arms — so a picker left open for days still tracks an
1944
+ * organizer's schedule edits at a cost of one request every few hours. No
1945
+ * future transition means no timer at all; an event with no releases does
1946
+ * zero background traffic. A wake in a hidden tab fetches nothing — the
1947
+ * visibilitychange handler owns catching that tab up.
1948
+ */
1949
+ private scheduleOfferBoundary;
1950
+ /** Debounce the no-store offer read behind a burst of seat-status frames. */
1951
+ private scheduleOfferRefresh;
1952
+ /**
1953
+ * Pull the server's resolved answer. A failed refresh keeps the last truthful
1954
+ * answer: flashing back to a chart price while checkout still charges an
1955
+ * offer is worse than a temporarily stale remaining count.
1956
+ */
1957
+ private refreshOfferAvailability;
1958
+ private offerPrice;
1959
+ /** The compact current/upcoming offer card above Ticket prices. */
1960
+ private syncOffer;
1858
1961
  /**
1859
1962
  * The price the buyer will actually pay for a category (+tier): the host's
1860
1963
  * `pricing` override when present, else the chart's stored price. Every
@@ -2799,4 +2902,4 @@ declare class ChannelsMode {
2799
2902
  handleBack(): boolean;
2800
2903
  }
2801
2904
 
2802
- export { AccessLinkReveal, AccessLinkStatusRecord, ApiError, AssignmentResult, type AttachPickerFrameOptions, type BestAvailableResult, BucketRow, BuyerAccessContext, type BuyerAccessExpiredEvent, type BuyerAccessRefreshReason, type BuyerAccessToken, type BuyerAccessTokenProvider, BuyerAccessUnavailableError, type BuyerAccessUnavailableEvent, type BuyerAccessUnavailableReason, BuyerRealtimeClient, type BuyerRealtimeOptions, ChannelAccessIntent, ChannelAllocationPage, ChannelListResult, ChannelPreviewProjection, ChannelRecord, ChannelSeatStatus, type ChannelsCapabilities, type ChannelsClient, ChannelsMode, type ChannelsModeHost, type ChannelsRowView, type ChannelsSeatView, type CheckoutHandoff, type CheckoutLineItem, type CheckoutSessionResult, EmbeddedDesigner, type EmbeddedDesignerEventType, type EmbeddedDesignerMessage, type EmbeddedDesignerOptions, type GAAreaAvailability, type HoldConflict, type HoldLineItem, type HoldResult, type OrderStatusResult, type PaymentOptionsReason, type PaymentOptionsResult, type PaymentProviderName, type Projection, type PubApiOptions, type RealtimeSink, type ResumedHoldResult, SeatPicker, type SeatPickerOptions, type SeatPickerTheme, SeatingChart, type SeatingChartOptions, type SelectedObjectUnavailableEvent, type SelectedSeat, type StatusChange, type SubscribeTicket, attachPickerFrame, bucketRowsHtml, createBuyerAccessContext, createControllerSink };
2905
+ export { AccessLinkReveal, AccessLinkStatusRecord, ApiError, AssignmentResult, type AttachPickerFrameOptions, type BestAvailableResult, BucketRow, BuyerAccessContext, type BuyerAccessExpiredEvent, type BuyerAccessRefreshReason, type BuyerAccessToken, type BuyerAccessTokenProvider, BuyerAccessUnavailableError, type BuyerAccessUnavailableEvent, type BuyerAccessUnavailableReason, BuyerRealtimeClient, type BuyerRealtimeOptions, ChannelAccessIntent, ChannelAllocationPage, ChannelListResult, ChannelPreviewProjection, ChannelRecord, ChannelSeatStatus, type ChannelsCapabilities, type ChannelsClient, ChannelsMode, type ChannelsModeHost, type ChannelsRowView, type ChannelsSeatView, type CheckoutHandoff, type CheckoutLineItem, type CheckoutSessionResult, EmbeddedDesigner, type EmbeddedDesignerEventType, type EmbeddedDesignerMessage, type EmbeddedDesignerOptions, type GAAreaAvailability, type HoldConflict, type HoldLineItem, type HoldResult, type OrderStatusResult, type PaymentOptionsReason, type PaymentOptionsResult, type PaymentProviderName, type Projection, type PubApiOptions, type RealtimeSink, type ResumedHoldResult, type SaleState, SeatPicker, type SeatPickerOptions, type SeatPickerTheme, SeatingChart, type SeatingChartOptions, type SelectedObjectUnavailableEvent, type SelectedSeat, type StatusChange, type SubscribeTicket, type TicketOfferAvailability, type TicketOfferPrice, type TicketOfferSummary, attachPickerFrame, bucketRowsHtml, createBuyerAccessContext, createControllerSink, parseTicketOfferAvailability, ticketOfferPrices };