@seatlayer/js 0.59.0 → 0.60.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, PickerSelectionValidator, RendererViewMode, SeatHoverDetails, PickerSelectionValidity, PickerTransport, PickerMapTheme } from '@seatlayer/core';
1
+ import { PickerSeat, PickerGAArea, PickerSelectionValidator, RendererViewMode, SeatHoverDetails, PickerSelectionValidity, PickerTransport, PickerMapTheme } from '@seatlayer/core';
2
2
  export { ExpandedSeat, PickerMapTheme, PickerSelectionValidator, PickerSelectionValidity, PickerSelectionViolation, RendererViewMode, SeatHoverDetails } from '@seatlayer/core';
3
3
  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, T as InventoryBookingObject, U as InventoryBookingState, V as InventoryBookingsPage, W as InventoryBookingsQuery, X as LogEntry, Y as LogPage, Z as ManageApi, _ as ManageApiError, $ as ReportByStatus, a0 as ReportCategoryMeta, a1 as ReportCategoryRow, a2 as ReportResult, a3 as SeatManager, a4 as SeatManagerActionResult, a5 as SeatManagerActivity, a6 as SeatManagerCapability, a7 as SeatManagerConnection, a8 as SeatManagerFilteredSection, a9 as SeatManagerMode, aa as SeatManagerOptions, ab as SeatManagerSelectionValidity, ac as SeatManagerTallies, ad as SelectionSourceRow } from './channelsMode-2z9HBOAX.cjs';
4
4
 
@@ -506,6 +506,77 @@ interface PubApiOptions {
506
506
  onObjectUnavailable?: (event: SelectedObjectUnavailableEvent) => void;
507
507
  }
508
508
 
509
+ /**
510
+ * The general-admission quantity prompt, and the GA half of the tray.
511
+ *
512
+ * Before this module a buyer could tap a GA area on the map and nothing at all
513
+ * happened — `onGAClick` reached `PickerController` but the drop-in widget never
514
+ * wired it — while every area on the chart rendered a permanent stepper row in
515
+ * the tray whether or not the buyer wanted one. Twelve areas meant twelve
516
+ * steppers of clutter, and on a phone (where the tray is a collapsed sheet) the
517
+ * only control that existed was the one the buyer could not see.
518
+ *
519
+ * What replaces it is two taps: tap the area, the prompt opens with a quantity
520
+ * already seeded to 1 (never 0 — nobody opens a ticket picker to buy none), and
521
+ * the primary button reads what it will do, priced live: `Add 3 tickets · $45`.
522
+ * The map stays visible behind it — a popover anchored at the tap on a wide
523
+ * layout, a bottom sheet on a narrow one — because the buyer is choosing where
524
+ * to stand, and a centred modal hides exactly the thing being chosen.
525
+ *
526
+ * The tray keeps the stepper rows, but only for areas with a quantity: it is a
527
+ * cart, not a price list. Everything else collapses into one compact `Areas`
528
+ * list, which is the keyboard/screen-reader entry point into the same prompt.
529
+ *
530
+ * Split out of SeatPicker.ts rather than added to it: that file is pinned at its
531
+ * size in the app's file-size ratchet and may not grow.
532
+ */
533
+
534
+ /** One priced ticket type inside an area. `id` is null for an untiered area. */
535
+ interface GaPromptTier {
536
+ id: string | null;
537
+ label: string;
538
+ price: number;
539
+ }
540
+ /**
541
+ * What a host takes over when it returns `true` from `onGAPrompt`. `confirm`
542
+ * accepts a plain number for a single-tier area, or a per-tier record; both
543
+ * land in exactly the same place the built-in prompt's Add button does.
544
+ */
545
+ interface GAPromptRequest {
546
+ area: PickerGAArea;
547
+ /** Quantities already chosen here, per tier id (`''` for an untiered area). */
548
+ selected: Record<string, number>;
549
+ min: number;
550
+ /** min(units still free, order cap − tickets chosen elsewhere). */
551
+ max: number;
552
+ tiers: GaPromptTier[];
553
+ confirm(quantity: number | Record<string, number>): void;
554
+ cancel(): void;
555
+ }
556
+ /** Per (area, tier) pending quantities. A `null` tier key is an untiered area. */
557
+ type GaQtyMap = Map<string, Map<string | null, number>>;
558
+ /** The slice of SeatPicker this module drives. Everything else stays private. */
559
+ interface GaPromptPicker {
560
+ root: HTMLDivElement | null;
561
+ els: Record<string, HTMLElement>;
562
+ srEl: HTMLDivElement | null;
563
+ gaQty: GaQtyMap;
564
+ maxTickets: number;
565
+ salesClosed: boolean;
566
+ gaPromptEl: HTMLDivElement | null;
567
+ gaPromptReturnFocus: HTMLElement | null;
568
+ gaAreasExpanded: boolean;
569
+ money(amount: number): string;
570
+ paidPrice(categoryKey: string | undefined, tierId: string | null | undefined, fallback: number, objectLabel?: string): number;
571
+ tf(key: string, fallback: string): string;
572
+ toast(message: string, tone?: 'error' | 'success' | 'warning' | 'neutral'): void;
573
+ reducedMotion(): boolean;
574
+ syncTray(): void;
575
+ /** Tickets in the order right now, held + selected seats + every GA quantity. */
576
+ totalTicketCount(): number;
577
+ onGAPromptHook?: ((prompt: GAPromptRequest) => boolean | void) | undefined;
578
+ }
579
+
509
580
  /**
510
581
  * SeatingChart — the embeddable buyer picker.
511
582
  *
@@ -580,7 +651,7 @@ interface SeatingChartOptions {
580
651
  selectionValidators?: PickerSelectionValidator[];
581
652
  /**
582
653
  * BCP 47 language for the widget UI — `'de'`, `'es-MX'`, etc. Falls back to
583
- * the browser language, then English. Built-in: en, es, de, fr. The German
654
+ * the browser language, then English. 37 languages ship. The German
584
655
  * bundle (etc.) is fetched on demand so unused languages cost nothing.
585
656
  */
586
657
  locale?: string;
@@ -628,6 +699,13 @@ interface SeatingChartOptions {
628
699
  onHoldRestored?: (result: HoldResult) => void;
629
700
  onHoldExpired?: () => void;
630
701
  onGAClick?: (area: GAAreaAvailability) => void;
702
+ /**
703
+ * Mirror of {@link SeatPickerOptions.onGAPrompt}. The low-level chart draws no
704
+ * quantity UI of its own, so this fires purely as the "the buyer wants to pick
705
+ * a quantity here" signal, with the same pre-computed `min`/`max`/`tiers` the
706
+ * full widget would have used; the return value is accepted and ignored.
707
+ */
708
+ onGAPrompt?: (prompt: GAPromptRequest) => boolean | void;
631
709
  /**
632
710
  * The buyer access session lapsed. `refreshed` says whether the provider
633
711
  * already recovered it — false means private inventory is now unavailable and
@@ -981,7 +1059,7 @@ type SeatingChartIdentityProp = (typeof SEATING_CHART_IDENTITY_PROPS)[number];
981
1059
  declare const SEATING_CHART_VALUE_PROPS: readonly ["event", "apiBase", "maxSelection", "numberOfPlacesToSelect", "selectionValidators", "publicKey", "locale", "currency", "colorblindSafe", "initialView", "errorDisplay", "selectedObjects", "selectableObjects", "messages", "seatTooltip", "buyerAccessTokenProvider", "buyerAccessToken"];
982
1060
  type SeatingChartValueProp = (typeof SEATING_CHART_VALUE_PROPS)[number];
983
1061
  /** Every callback option a wrapper wires to its own event mechanism. */
984
- declare const SEATING_CHART_CALLBACK_PROPS: readonly ["onSelectionChange", "onSelectionValidityChange", "onSelectionValid", "onSelectionInvalid", "onSelectionLimit", "onHold", "onHoldRestored", "onHoldExpired", "onGAClick", "onError", "onDeckTap", "onHint", "onSeatHover", "onAccessExpired", "onAccessUnavailable", "onSelectedObjectUnavailable"];
1062
+ declare const SEATING_CHART_CALLBACK_PROPS: readonly ["onSelectionChange", "onSelectionValidityChange", "onSelectionValid", "onSelectionInvalid", "onSelectionLimit", "onHold", "onHoldRestored", "onHoldExpired", "onGAClick", "onGAPrompt", "onError", "onDeckTap", "onHint", "onSeatHover", "onAccessExpired", "onAccessUnavailable", "onSelectedObjectUnavailable"];
985
1063
  type SeatingChartCallbackProp = (typeof SEATING_CHART_CALLBACK_PROPS)[number];
986
1064
  /** The value half of the options, as a wrapper holds it. */
987
1065
  type SeatingChartValues = Pick<SeatingChartOptions, SeatingChartValueProp>;
@@ -1518,7 +1596,11 @@ interface SeatPickerOptions {
1518
1596
  /** Optional sale guards evaluated after every change and enforced before a
1519
1597
  * hold: minimum quantity, consecutive seats, and/or no stranded singles. */
1520
1598
  selectionValidators?: PickerSelectionValidator[];
1521
- /** BCP 47 language for the widget UI. Built-in: en, es, de, fr. */
1599
+ /**
1600
+ * BCP 47 language for the widget UI. 37 languages ship; omit this and each
1601
+ * buyer gets their own `navigator.languages`, falling back to English.
1602
+ * Read once at render — there is no way to change it on a live chart.
1603
+ */
1522
1604
  locale?: string;
1523
1605
  /** Per-key string overrides layered over the active locale. */
1524
1606
  messages?: Record<string, string>;
@@ -1783,6 +1865,22 @@ interface SeatPickerOptions {
1783
1865
  * widget has already dropped them from the tray.
1784
1866
  */
1785
1867
  onSelectedObjectUnavailable?: (event: SelectedObjectUnavailableEvent) => void;
1868
+ /**
1869
+ * A buyer tapped a general-admission area (on the map, or in the tray's
1870
+ * `Areas` list) and the widget is about to open its own quantity prompt.
1871
+ *
1872
+ * Return `true` to take the interaction over completely — the built-in
1873
+ * popover/sheet is suppressed, and the host drives the choice with whatever
1874
+ * UI it likes, landing the result through `prompt.confirm(quantity)` (a plain
1875
+ * number for a single-tier area, or `{ [tierId]: quantity }`) or dropping it
1876
+ * with `prompt.cancel()`. Return anything else (or nothing) and the built-in
1877
+ * prompt opens as usual, so this is also usable as a plain notification.
1878
+ *
1879
+ * `prompt.max` already folds in the area's live availability AND the
1880
+ * order-wide ticket cap minus everything chosen elsewhere; a `confirm` above
1881
+ * it is clamped rather than rejected.
1882
+ */
1883
+ onGAPrompt?: (prompt: GAPromptRequest) => boolean | void;
1786
1884
  onError?: (err: unknown) => void;
1787
1885
  }
1788
1886
 
@@ -1807,8 +1905,9 @@ interface SeatPickerOptions {
1807
1905
  * so plain host CSS can restyle too.
1808
1906
  */
1809
1907
 
1810
- declare class SeatPicker {
1811
- private readonly opts;
1908
+ declare class SeatPicker implements GaPromptPicker {
1909
+ /** @internal Read by pickerGaPrompt for the `onGAPrompt` host hook. */
1910
+ readonly opts: SeatPickerOptions;
1812
1911
  private readonly api;
1813
1912
  /** Authenticated view media, cached only for this picker lifetime. */
1814
1913
  private readonly buyerAssetUrls;
@@ -1820,17 +1919,17 @@ declare class SeatPicker {
1820
1919
  private accessEl;
1821
1920
  private readonly apiBase;
1822
1921
  private readonly controller;
1823
- private maxTickets;
1922
+ /** @internal */ maxTickets: number;
1824
1923
  /** Exact ticket count required before checkout; null keeps ordinary 1..max behavior. */
1825
1924
  private readonly exactTickets;
1826
1925
  private lastSelectionValidity;
1827
1926
  /** Original host pricing, kept separate from live server offer overrides. */
1828
1927
  private readonly hostPricing;
1829
- private root;
1928
+ /** @internal */ root: HTMLDivElement | null;
1830
1929
  private mapHost;
1831
1930
  private rendered;
1832
1931
  private destroyed;
1833
- private els;
1932
+ /** @internal */ els: Record<string, HTMLElement>;
1834
1933
  /** Feature 6 anchor regions — positioned flex containers over the map. */
1835
1934
  private regions;
1836
1935
  private ro;
@@ -1874,7 +1973,15 @@ declare class SeatPicker {
1874
1973
  private checkoutPanel;
1875
1974
  private extendEl;
1876
1975
  private bookedEl;
1877
- private gaQty;
1976
+ /** @internal Pending GA units per (area, tier) — see pickerGaPrompt.ts. */
1977
+ gaQty: GaQtyMap;
1978
+ /** @internal The open quantity prompt (popover or sheet), while one is up. */
1979
+ gaPromptEl: HTMLDivElement | null;
1980
+ /** @internal */ gaPromptReturnFocus: HTMLElement | null;
1981
+ /** @internal Whether the tray's collapsed `Areas` list is open. */
1982
+ gaAreasExpanded: boolean;
1983
+ /** Viewport point of the last map tap — anchors the GA popover. */
1984
+ private lastMapPoint;
1878
1985
  private tipEl;
1879
1986
  private tipPos;
1880
1987
  private confirmEl;
@@ -1883,7 +1990,7 @@ declare class SeatPicker {
1883
1990
  private tableDialog;
1884
1991
  private tableDialogHeld;
1885
1992
  private tableDialogReturnFocus;
1886
- private srEl;
1993
+ /** @internal */ srEl: HTMLDivElement | null;
1887
1994
  private baQty;
1888
1995
  private baCat;
1889
1996
  /** Optional navigation-zone scope for buyer best-available. */
@@ -1902,7 +2009,7 @@ declare class SeatPicker {
1902
2009
  private bestAvailableConfirm;
1903
2010
  private releasingHold;
1904
2011
  /** Event sales window is closed (read-only load state / live close). */
1905
- private salesClosed;
2012
+ /** @internal */ salesClosed: boolean;
1906
2013
  /** Every seated category's live availability is 0 (sold-out overlay is up). */
1907
2014
  private soldOut;
1908
2015
  private soldoutEl;
@@ -2099,7 +2206,9 @@ declare class SeatPicker {
2099
2206
  * unknown keys, so this collapses that to `fallback` — while still honoring a
2100
2207
  * host `messages` override (which makes `t()` return the override, not the key).
2101
2208
  */
2102
- private tf;
2209
+ /** @internal The host's GA prompt takeover, if it supplied one. */
2210
+ get onGAPromptHook(): SeatPickerOptions['onGAPrompt'];
2211
+ /** @internal */ tf(key: string, fallback: string): string;
2103
2212
  /** Sold-out overlay — an informational state with no unavailable action. */
2104
2213
  private buildSoldoutOverlay;
2105
2214
  /**
@@ -2140,7 +2249,7 @@ declare class SeatPicker {
2140
2249
  /** Read a resolved --sl-* token value (canvas needs a real color, not var()). */
2141
2250
  private cssVar;
2142
2251
  /** Motion is progressive enhancement; all state remains legible when reduced. */
2143
- private reducedMotion;
2252
+ /** @internal */ reducedMotion(): boolean;
2144
2253
  private scheduleMotion;
2145
2254
  /** Restart one finite CSS animation without leaving a permanent state class. */
2146
2255
  private animateOnce;
@@ -2151,14 +2260,10 @@ declare class SeatPicker {
2151
2260
  /** Update only the action affordance; selection callbacks must not refire. */
2152
2261
  private committedSelection;
2153
2262
  private pendingSelectionCount;
2154
- private heldGACounts;
2155
- private pendingGACount;
2156
2263
  private heldTicketCount;
2157
- private totalTicketCount;
2264
+ /** @internal */ totalTicketCount(): number;
2158
2265
  /** Held tickets and standing quantities consume the same order-wide cap. */
2159
2266
  private updateSelectionCapacity;
2160
- private canAddTicket;
2161
- private pendingGATotal;
2162
2267
  private syncCta;
2163
2268
  private setCtaPhase;
2164
2269
  /** Session-scoped capability key: isolated by API origin and event. */
@@ -2254,7 +2359,7 @@ declare class SeatPicker {
2254
2359
  */
2255
2360
  private openSeatView;
2256
2361
  private closeSeatView;
2257
- private money;
2362
+ /** @internal */ money(n: number): string;
2258
2363
  /**
2259
2364
  * Sleep until the offer schedule's next known transition, then re-read.
2260
2365
  *
@@ -2284,7 +2389,7 @@ declare class SeatPicker {
2284
2389
  * price the widget DISPLAYS or hands off must flow through here — a map
2285
2390
  * that shows one price while checkout charges another destroys trust.
2286
2391
  */
2287
- private paidPrice;
2392
+ /** @internal */ paidPrice(categoryKey: string | undefined, tierId: string | null | undefined, fallback: number, objectLabel?: string): number;
2288
2393
  /** The half of a legend's inputs the rail and the price list share, resolved
2289
2394
  * once so the two renderings cannot be given different answers. */
2290
2395
  private legendDeps;
@@ -2309,11 +2414,16 @@ declare class SeatPicker {
2309
2414
  private liveTimer;
2310
2415
  /** A live delta took one of OUR selected (not yet held) seats — evict + tell the buyer. */
2311
2416
  private evictTakenSelections;
2312
- private syncTray;
2417
+ /** @internal */ syncTray(): void;
2313
2418
  private emitSelectionValidity;
2314
2419
  /** Paint the bottom-sheet's collapsed one-liner (pickerTray.ts builds it). */
2315
2420
  private renderPeek;
2316
- private removeHeldLabel;
2421
+ /**
2422
+ * Release one buyer-visible held LINE. That is one label for a seat, and every
2423
+ * unit label behind a grouped GA line — a buyer who presses × on
2424
+ * "PIT · Adult ×2" means both of them, not one of two identical cards.
2425
+ */
2426
+ private removeHeldLabels;
2317
2427
  private handleChangeSeats;
2318
2428
  private handleCta;
2319
2429
  private startHoldTimer;
@@ -2366,7 +2476,10 @@ declare class SeatPicker {
2366
2476
  /** Assemble the stable {@link CheckoutHandoff} from a hold's server line items. */
2367
2477
  private buildHandoff;
2368
2478
  private emitHoldChange;
2369
- private toast;
2479
+ /** @internal */ toast(msg: string, tone?: 'neutral' | 'success' | 'warning' | 'error', action?: {
2480
+ label: string;
2481
+ onClick: () => void;
2482
+ }): void;
2370
2483
  private placeTooltip;
2371
2484
  /**
2372
2485
  * Row label without the redundant section prefix. Charts commonly name row
@@ -2591,4 +2704,4 @@ interface AttachPickerFrameOptions {
2591
2704
  */
2592
2705
  declare function attachPickerFrame(iframe: HTMLIFrameElement, opts?: AttachPickerFrameOptions): () => void;
2593
2706
 
2594
- export { ApiError, type AttachPickerFrameOptions, type BestAvailableResult, BuyerAccessContext, type BuyerAccessExpiredEvent, type BuyerAccessRefreshReason, type BuyerAccessToken, type BuyerAccessTokenProvider, BuyerAccessUnavailableError, type BuyerAccessUnavailableEvent, type BuyerAccessUnavailableReason, BuyerRealtimeClient, type BuyerRealtimeOptions, 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, SEATING_CHART_CALLBACK_PROPS, SEATING_CHART_HANDLE_METHODS, SEATING_CHART_IDENTITY_PROPS, SEATING_CHART_VALUE_PROPS, type SaleState, SeatPicker, type SeatPickerBestAvailableOptions, type SeatPickerBuyerView, type SeatPickerBuyerViewOptions, type SeatPickerOptions, type SeatPickerPricing, type SeatPickerTheme, SeatingChart, type SeatingChartCallbackProp, type SeatingChartCallbacks, type SeatingChartHandle, type SeatingChartHandleMethod, type SeatingChartIdentityProp, type SeatingChartOptions, type SeatingChartValueProp, type SeatingChartValues, type SelectedObjectUnavailableEvent, type SelectedSeat, type StatusChange, type SubscribeTicket, type TicketOfferAvailability, type TicketOfferPrice, type TicketOfferSummary, attachPickerFrame, bindSeatingChartHandle, buildSeatingChartOptions, createBuyerAccessContext, createControllerSink, parseTicketOfferAvailability, ticketOfferPrices };
2707
+ export { ApiError, type AttachPickerFrameOptions, type BestAvailableResult, BuyerAccessContext, type BuyerAccessExpiredEvent, type BuyerAccessRefreshReason, type BuyerAccessToken, type BuyerAccessTokenProvider, BuyerAccessUnavailableError, type BuyerAccessUnavailableEvent, type BuyerAccessUnavailableReason, BuyerRealtimeClient, type BuyerRealtimeOptions, type CheckoutHandoff, type CheckoutLineItem, type CheckoutSessionResult, EmbeddedDesigner, type EmbeddedDesignerEventType, type EmbeddedDesignerMessage, type EmbeddedDesignerOptions, type GAAreaAvailability, type GAPromptRequest, type GaPromptTier, type HoldConflict, type HoldLineItem, type HoldResult, type OrderStatusResult, type PaymentOptionsReason, type PaymentOptionsResult, type PaymentProviderName, type Projection, type PubApiOptions, type RealtimeSink, type ResumedHoldResult, SEATING_CHART_CALLBACK_PROPS, SEATING_CHART_HANDLE_METHODS, SEATING_CHART_IDENTITY_PROPS, SEATING_CHART_VALUE_PROPS, type SaleState, SeatPicker, type SeatPickerBestAvailableOptions, type SeatPickerBuyerView, type SeatPickerBuyerViewOptions, type SeatPickerOptions, type SeatPickerPricing, type SeatPickerTheme, SeatingChart, type SeatingChartCallbackProp, type SeatingChartCallbacks, type SeatingChartHandle, type SeatingChartHandleMethod, type SeatingChartIdentityProp, type SeatingChartOptions, type SeatingChartValueProp, type SeatingChartValues, type SelectedObjectUnavailableEvent, type SelectedSeat, type StatusChange, type SubscribeTicket, type TicketOfferAvailability, type TicketOfferPrice, type TicketOfferSummary, attachPickerFrame, bindSeatingChartHandle, buildSeatingChartOptions, createBuyerAccessContext, createControllerSink, parseTicketOfferAvailability, ticketOfferPrices };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { PickerSeat, PickerSelectionValidator, RendererViewMode, SeatHoverDetails, PickerSelectionValidity, PickerTransport, PickerMapTheme } from '@seatlayer/core';
1
+ import { PickerSeat, PickerGAArea, PickerSelectionValidator, RendererViewMode, SeatHoverDetails, PickerSelectionValidity, PickerTransport, PickerMapTheme } from '@seatlayer/core';
2
2
  export { ExpandedSeat, PickerMapTheme, PickerSelectionValidator, PickerSelectionValidity, PickerSelectionViolation, RendererViewMode, SeatHoverDetails } from '@seatlayer/core';
3
3
  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, T as InventoryBookingObject, U as InventoryBookingState, V as InventoryBookingsPage, W as InventoryBookingsQuery, X as LogEntry, Y as LogPage, Z as ManageApi, _ as ManageApiError, $ as ReportByStatus, a0 as ReportCategoryMeta, a1 as ReportCategoryRow, a2 as ReportResult, a3 as SeatManager, a4 as SeatManagerActionResult, a5 as SeatManagerActivity, a6 as SeatManagerCapability, a7 as SeatManagerConnection, a8 as SeatManagerFilteredSection, a9 as SeatManagerMode, aa as SeatManagerOptions, ab as SeatManagerSelectionValidity, ac as SeatManagerTallies, ad as SelectionSourceRow } from './channelsMode-2z9HBOAX.js';
4
4
 
@@ -506,6 +506,77 @@ interface PubApiOptions {
506
506
  onObjectUnavailable?: (event: SelectedObjectUnavailableEvent) => void;
507
507
  }
508
508
 
509
+ /**
510
+ * The general-admission quantity prompt, and the GA half of the tray.
511
+ *
512
+ * Before this module a buyer could tap a GA area on the map and nothing at all
513
+ * happened — `onGAClick` reached `PickerController` but the drop-in widget never
514
+ * wired it — while every area on the chart rendered a permanent stepper row in
515
+ * the tray whether or not the buyer wanted one. Twelve areas meant twelve
516
+ * steppers of clutter, and on a phone (where the tray is a collapsed sheet) the
517
+ * only control that existed was the one the buyer could not see.
518
+ *
519
+ * What replaces it is two taps: tap the area, the prompt opens with a quantity
520
+ * already seeded to 1 (never 0 — nobody opens a ticket picker to buy none), and
521
+ * the primary button reads what it will do, priced live: `Add 3 tickets · $45`.
522
+ * The map stays visible behind it — a popover anchored at the tap on a wide
523
+ * layout, a bottom sheet on a narrow one — because the buyer is choosing where
524
+ * to stand, and a centred modal hides exactly the thing being chosen.
525
+ *
526
+ * The tray keeps the stepper rows, but only for areas with a quantity: it is a
527
+ * cart, not a price list. Everything else collapses into one compact `Areas`
528
+ * list, which is the keyboard/screen-reader entry point into the same prompt.
529
+ *
530
+ * Split out of SeatPicker.ts rather than added to it: that file is pinned at its
531
+ * size in the app's file-size ratchet and may not grow.
532
+ */
533
+
534
+ /** One priced ticket type inside an area. `id` is null for an untiered area. */
535
+ interface GaPromptTier {
536
+ id: string | null;
537
+ label: string;
538
+ price: number;
539
+ }
540
+ /**
541
+ * What a host takes over when it returns `true` from `onGAPrompt`. `confirm`
542
+ * accepts a plain number for a single-tier area, or a per-tier record; both
543
+ * land in exactly the same place the built-in prompt's Add button does.
544
+ */
545
+ interface GAPromptRequest {
546
+ area: PickerGAArea;
547
+ /** Quantities already chosen here, per tier id (`''` for an untiered area). */
548
+ selected: Record<string, number>;
549
+ min: number;
550
+ /** min(units still free, order cap − tickets chosen elsewhere). */
551
+ max: number;
552
+ tiers: GaPromptTier[];
553
+ confirm(quantity: number | Record<string, number>): void;
554
+ cancel(): void;
555
+ }
556
+ /** Per (area, tier) pending quantities. A `null` tier key is an untiered area. */
557
+ type GaQtyMap = Map<string, Map<string | null, number>>;
558
+ /** The slice of SeatPicker this module drives. Everything else stays private. */
559
+ interface GaPromptPicker {
560
+ root: HTMLDivElement | null;
561
+ els: Record<string, HTMLElement>;
562
+ srEl: HTMLDivElement | null;
563
+ gaQty: GaQtyMap;
564
+ maxTickets: number;
565
+ salesClosed: boolean;
566
+ gaPromptEl: HTMLDivElement | null;
567
+ gaPromptReturnFocus: HTMLElement | null;
568
+ gaAreasExpanded: boolean;
569
+ money(amount: number): string;
570
+ paidPrice(categoryKey: string | undefined, tierId: string | null | undefined, fallback: number, objectLabel?: string): number;
571
+ tf(key: string, fallback: string): string;
572
+ toast(message: string, tone?: 'error' | 'success' | 'warning' | 'neutral'): void;
573
+ reducedMotion(): boolean;
574
+ syncTray(): void;
575
+ /** Tickets in the order right now, held + selected seats + every GA quantity. */
576
+ totalTicketCount(): number;
577
+ onGAPromptHook?: ((prompt: GAPromptRequest) => boolean | void) | undefined;
578
+ }
579
+
509
580
  /**
510
581
  * SeatingChart — the embeddable buyer picker.
511
582
  *
@@ -580,7 +651,7 @@ interface SeatingChartOptions {
580
651
  selectionValidators?: PickerSelectionValidator[];
581
652
  /**
582
653
  * BCP 47 language for the widget UI — `'de'`, `'es-MX'`, etc. Falls back to
583
- * the browser language, then English. Built-in: en, es, de, fr. The German
654
+ * the browser language, then English. 37 languages ship. The German
584
655
  * bundle (etc.) is fetched on demand so unused languages cost nothing.
585
656
  */
586
657
  locale?: string;
@@ -628,6 +699,13 @@ interface SeatingChartOptions {
628
699
  onHoldRestored?: (result: HoldResult) => void;
629
700
  onHoldExpired?: () => void;
630
701
  onGAClick?: (area: GAAreaAvailability) => void;
702
+ /**
703
+ * Mirror of {@link SeatPickerOptions.onGAPrompt}. The low-level chart draws no
704
+ * quantity UI of its own, so this fires purely as the "the buyer wants to pick
705
+ * a quantity here" signal, with the same pre-computed `min`/`max`/`tiers` the
706
+ * full widget would have used; the return value is accepted and ignored.
707
+ */
708
+ onGAPrompt?: (prompt: GAPromptRequest) => boolean | void;
631
709
  /**
632
710
  * The buyer access session lapsed. `refreshed` says whether the provider
633
711
  * already recovered it — false means private inventory is now unavailable and
@@ -981,7 +1059,7 @@ type SeatingChartIdentityProp = (typeof SEATING_CHART_IDENTITY_PROPS)[number];
981
1059
  declare const SEATING_CHART_VALUE_PROPS: readonly ["event", "apiBase", "maxSelection", "numberOfPlacesToSelect", "selectionValidators", "publicKey", "locale", "currency", "colorblindSafe", "initialView", "errorDisplay", "selectedObjects", "selectableObjects", "messages", "seatTooltip", "buyerAccessTokenProvider", "buyerAccessToken"];
982
1060
  type SeatingChartValueProp = (typeof SEATING_CHART_VALUE_PROPS)[number];
983
1061
  /** Every callback option a wrapper wires to its own event mechanism. */
984
- declare const SEATING_CHART_CALLBACK_PROPS: readonly ["onSelectionChange", "onSelectionValidityChange", "onSelectionValid", "onSelectionInvalid", "onSelectionLimit", "onHold", "onHoldRestored", "onHoldExpired", "onGAClick", "onError", "onDeckTap", "onHint", "onSeatHover", "onAccessExpired", "onAccessUnavailable", "onSelectedObjectUnavailable"];
1062
+ declare const SEATING_CHART_CALLBACK_PROPS: readonly ["onSelectionChange", "onSelectionValidityChange", "onSelectionValid", "onSelectionInvalid", "onSelectionLimit", "onHold", "onHoldRestored", "onHoldExpired", "onGAClick", "onGAPrompt", "onError", "onDeckTap", "onHint", "onSeatHover", "onAccessExpired", "onAccessUnavailable", "onSelectedObjectUnavailable"];
985
1063
  type SeatingChartCallbackProp = (typeof SEATING_CHART_CALLBACK_PROPS)[number];
986
1064
  /** The value half of the options, as a wrapper holds it. */
987
1065
  type SeatingChartValues = Pick<SeatingChartOptions, SeatingChartValueProp>;
@@ -1518,7 +1596,11 @@ interface SeatPickerOptions {
1518
1596
  /** Optional sale guards evaluated after every change and enforced before a
1519
1597
  * hold: minimum quantity, consecutive seats, and/or no stranded singles. */
1520
1598
  selectionValidators?: PickerSelectionValidator[];
1521
- /** BCP 47 language for the widget UI. Built-in: en, es, de, fr. */
1599
+ /**
1600
+ * BCP 47 language for the widget UI. 37 languages ship; omit this and each
1601
+ * buyer gets their own `navigator.languages`, falling back to English.
1602
+ * Read once at render — there is no way to change it on a live chart.
1603
+ */
1522
1604
  locale?: string;
1523
1605
  /** Per-key string overrides layered over the active locale. */
1524
1606
  messages?: Record<string, string>;
@@ -1783,6 +1865,22 @@ interface SeatPickerOptions {
1783
1865
  * widget has already dropped them from the tray.
1784
1866
  */
1785
1867
  onSelectedObjectUnavailable?: (event: SelectedObjectUnavailableEvent) => void;
1868
+ /**
1869
+ * A buyer tapped a general-admission area (on the map, or in the tray's
1870
+ * `Areas` list) and the widget is about to open its own quantity prompt.
1871
+ *
1872
+ * Return `true` to take the interaction over completely — the built-in
1873
+ * popover/sheet is suppressed, and the host drives the choice with whatever
1874
+ * UI it likes, landing the result through `prompt.confirm(quantity)` (a plain
1875
+ * number for a single-tier area, or `{ [tierId]: quantity }`) or dropping it
1876
+ * with `prompt.cancel()`. Return anything else (or nothing) and the built-in
1877
+ * prompt opens as usual, so this is also usable as a plain notification.
1878
+ *
1879
+ * `prompt.max` already folds in the area's live availability AND the
1880
+ * order-wide ticket cap minus everything chosen elsewhere; a `confirm` above
1881
+ * it is clamped rather than rejected.
1882
+ */
1883
+ onGAPrompt?: (prompt: GAPromptRequest) => boolean | void;
1786
1884
  onError?: (err: unknown) => void;
1787
1885
  }
1788
1886
 
@@ -1807,8 +1905,9 @@ interface SeatPickerOptions {
1807
1905
  * so plain host CSS can restyle too.
1808
1906
  */
1809
1907
 
1810
- declare class SeatPicker {
1811
- private readonly opts;
1908
+ declare class SeatPicker implements GaPromptPicker {
1909
+ /** @internal Read by pickerGaPrompt for the `onGAPrompt` host hook. */
1910
+ readonly opts: SeatPickerOptions;
1812
1911
  private readonly api;
1813
1912
  /** Authenticated view media, cached only for this picker lifetime. */
1814
1913
  private readonly buyerAssetUrls;
@@ -1820,17 +1919,17 @@ declare class SeatPicker {
1820
1919
  private accessEl;
1821
1920
  private readonly apiBase;
1822
1921
  private readonly controller;
1823
- private maxTickets;
1922
+ /** @internal */ maxTickets: number;
1824
1923
  /** Exact ticket count required before checkout; null keeps ordinary 1..max behavior. */
1825
1924
  private readonly exactTickets;
1826
1925
  private lastSelectionValidity;
1827
1926
  /** Original host pricing, kept separate from live server offer overrides. */
1828
1927
  private readonly hostPricing;
1829
- private root;
1928
+ /** @internal */ root: HTMLDivElement | null;
1830
1929
  private mapHost;
1831
1930
  private rendered;
1832
1931
  private destroyed;
1833
- private els;
1932
+ /** @internal */ els: Record<string, HTMLElement>;
1834
1933
  /** Feature 6 anchor regions — positioned flex containers over the map. */
1835
1934
  private regions;
1836
1935
  private ro;
@@ -1874,7 +1973,15 @@ declare class SeatPicker {
1874
1973
  private checkoutPanel;
1875
1974
  private extendEl;
1876
1975
  private bookedEl;
1877
- private gaQty;
1976
+ /** @internal Pending GA units per (area, tier) — see pickerGaPrompt.ts. */
1977
+ gaQty: GaQtyMap;
1978
+ /** @internal The open quantity prompt (popover or sheet), while one is up. */
1979
+ gaPromptEl: HTMLDivElement | null;
1980
+ /** @internal */ gaPromptReturnFocus: HTMLElement | null;
1981
+ /** @internal Whether the tray's collapsed `Areas` list is open. */
1982
+ gaAreasExpanded: boolean;
1983
+ /** Viewport point of the last map tap — anchors the GA popover. */
1984
+ private lastMapPoint;
1878
1985
  private tipEl;
1879
1986
  private tipPos;
1880
1987
  private confirmEl;
@@ -1883,7 +1990,7 @@ declare class SeatPicker {
1883
1990
  private tableDialog;
1884
1991
  private tableDialogHeld;
1885
1992
  private tableDialogReturnFocus;
1886
- private srEl;
1993
+ /** @internal */ srEl: HTMLDivElement | null;
1887
1994
  private baQty;
1888
1995
  private baCat;
1889
1996
  /** Optional navigation-zone scope for buyer best-available. */
@@ -1902,7 +2009,7 @@ declare class SeatPicker {
1902
2009
  private bestAvailableConfirm;
1903
2010
  private releasingHold;
1904
2011
  /** Event sales window is closed (read-only load state / live close). */
1905
- private salesClosed;
2012
+ /** @internal */ salesClosed: boolean;
1906
2013
  /** Every seated category's live availability is 0 (sold-out overlay is up). */
1907
2014
  private soldOut;
1908
2015
  private soldoutEl;
@@ -2099,7 +2206,9 @@ declare class SeatPicker {
2099
2206
  * unknown keys, so this collapses that to `fallback` — while still honoring a
2100
2207
  * host `messages` override (which makes `t()` return the override, not the key).
2101
2208
  */
2102
- private tf;
2209
+ /** @internal The host's GA prompt takeover, if it supplied one. */
2210
+ get onGAPromptHook(): SeatPickerOptions['onGAPrompt'];
2211
+ /** @internal */ tf(key: string, fallback: string): string;
2103
2212
  /** Sold-out overlay — an informational state with no unavailable action. */
2104
2213
  private buildSoldoutOverlay;
2105
2214
  /**
@@ -2140,7 +2249,7 @@ declare class SeatPicker {
2140
2249
  /** Read a resolved --sl-* token value (canvas needs a real color, not var()). */
2141
2250
  private cssVar;
2142
2251
  /** Motion is progressive enhancement; all state remains legible when reduced. */
2143
- private reducedMotion;
2252
+ /** @internal */ reducedMotion(): boolean;
2144
2253
  private scheduleMotion;
2145
2254
  /** Restart one finite CSS animation without leaving a permanent state class. */
2146
2255
  private animateOnce;
@@ -2151,14 +2260,10 @@ declare class SeatPicker {
2151
2260
  /** Update only the action affordance; selection callbacks must not refire. */
2152
2261
  private committedSelection;
2153
2262
  private pendingSelectionCount;
2154
- private heldGACounts;
2155
- private pendingGACount;
2156
2263
  private heldTicketCount;
2157
- private totalTicketCount;
2264
+ /** @internal */ totalTicketCount(): number;
2158
2265
  /** Held tickets and standing quantities consume the same order-wide cap. */
2159
2266
  private updateSelectionCapacity;
2160
- private canAddTicket;
2161
- private pendingGATotal;
2162
2267
  private syncCta;
2163
2268
  private setCtaPhase;
2164
2269
  /** Session-scoped capability key: isolated by API origin and event. */
@@ -2254,7 +2359,7 @@ declare class SeatPicker {
2254
2359
  */
2255
2360
  private openSeatView;
2256
2361
  private closeSeatView;
2257
- private money;
2362
+ /** @internal */ money(n: number): string;
2258
2363
  /**
2259
2364
  * Sleep until the offer schedule's next known transition, then re-read.
2260
2365
  *
@@ -2284,7 +2389,7 @@ declare class SeatPicker {
2284
2389
  * price the widget DISPLAYS or hands off must flow through here — a map
2285
2390
  * that shows one price while checkout charges another destroys trust.
2286
2391
  */
2287
- private paidPrice;
2392
+ /** @internal */ paidPrice(categoryKey: string | undefined, tierId: string | null | undefined, fallback: number, objectLabel?: string): number;
2288
2393
  /** The half of a legend's inputs the rail and the price list share, resolved
2289
2394
  * once so the two renderings cannot be given different answers. */
2290
2395
  private legendDeps;
@@ -2309,11 +2414,16 @@ declare class SeatPicker {
2309
2414
  private liveTimer;
2310
2415
  /** A live delta took one of OUR selected (not yet held) seats — evict + tell the buyer. */
2311
2416
  private evictTakenSelections;
2312
- private syncTray;
2417
+ /** @internal */ syncTray(): void;
2313
2418
  private emitSelectionValidity;
2314
2419
  /** Paint the bottom-sheet's collapsed one-liner (pickerTray.ts builds it). */
2315
2420
  private renderPeek;
2316
- private removeHeldLabel;
2421
+ /**
2422
+ * Release one buyer-visible held LINE. That is one label for a seat, and every
2423
+ * unit label behind a grouped GA line — a buyer who presses × on
2424
+ * "PIT · Adult ×2" means both of them, not one of two identical cards.
2425
+ */
2426
+ private removeHeldLabels;
2317
2427
  private handleChangeSeats;
2318
2428
  private handleCta;
2319
2429
  private startHoldTimer;
@@ -2366,7 +2476,10 @@ declare class SeatPicker {
2366
2476
  /** Assemble the stable {@link CheckoutHandoff} from a hold's server line items. */
2367
2477
  private buildHandoff;
2368
2478
  private emitHoldChange;
2369
- private toast;
2479
+ /** @internal */ toast(msg: string, tone?: 'neutral' | 'success' | 'warning' | 'error', action?: {
2480
+ label: string;
2481
+ onClick: () => void;
2482
+ }): void;
2370
2483
  private placeTooltip;
2371
2484
  /**
2372
2485
  * Row label without the redundant section prefix. Charts commonly name row
@@ -2591,4 +2704,4 @@ interface AttachPickerFrameOptions {
2591
2704
  */
2592
2705
  declare function attachPickerFrame(iframe: HTMLIFrameElement, opts?: AttachPickerFrameOptions): () => void;
2593
2706
 
2594
- export { ApiError, type AttachPickerFrameOptions, type BestAvailableResult, BuyerAccessContext, type BuyerAccessExpiredEvent, type BuyerAccessRefreshReason, type BuyerAccessToken, type BuyerAccessTokenProvider, BuyerAccessUnavailableError, type BuyerAccessUnavailableEvent, type BuyerAccessUnavailableReason, BuyerRealtimeClient, type BuyerRealtimeOptions, 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, SEATING_CHART_CALLBACK_PROPS, SEATING_CHART_HANDLE_METHODS, SEATING_CHART_IDENTITY_PROPS, SEATING_CHART_VALUE_PROPS, type SaleState, SeatPicker, type SeatPickerBestAvailableOptions, type SeatPickerBuyerView, type SeatPickerBuyerViewOptions, type SeatPickerOptions, type SeatPickerPricing, type SeatPickerTheme, SeatingChart, type SeatingChartCallbackProp, type SeatingChartCallbacks, type SeatingChartHandle, type SeatingChartHandleMethod, type SeatingChartIdentityProp, type SeatingChartOptions, type SeatingChartValueProp, type SeatingChartValues, type SelectedObjectUnavailableEvent, type SelectedSeat, type StatusChange, type SubscribeTicket, type TicketOfferAvailability, type TicketOfferPrice, type TicketOfferSummary, attachPickerFrame, bindSeatingChartHandle, buildSeatingChartOptions, createBuyerAccessContext, createControllerSink, parseTicketOfferAvailability, ticketOfferPrices };
2707
+ export { ApiError, type AttachPickerFrameOptions, type BestAvailableResult, BuyerAccessContext, type BuyerAccessExpiredEvent, type BuyerAccessRefreshReason, type BuyerAccessToken, type BuyerAccessTokenProvider, BuyerAccessUnavailableError, type BuyerAccessUnavailableEvent, type BuyerAccessUnavailableReason, BuyerRealtimeClient, type BuyerRealtimeOptions, type CheckoutHandoff, type CheckoutLineItem, type CheckoutSessionResult, EmbeddedDesigner, type EmbeddedDesignerEventType, type EmbeddedDesignerMessage, type EmbeddedDesignerOptions, type GAAreaAvailability, type GAPromptRequest, type GaPromptTier, type HoldConflict, type HoldLineItem, type HoldResult, type OrderStatusResult, type PaymentOptionsReason, type PaymentOptionsResult, type PaymentProviderName, type Projection, type PubApiOptions, type RealtimeSink, type ResumedHoldResult, SEATING_CHART_CALLBACK_PROPS, SEATING_CHART_HANDLE_METHODS, SEATING_CHART_IDENTITY_PROPS, SEATING_CHART_VALUE_PROPS, type SaleState, SeatPicker, type SeatPickerBestAvailableOptions, type SeatPickerBuyerView, type SeatPickerBuyerViewOptions, type SeatPickerOptions, type SeatPickerPricing, type SeatPickerTheme, SeatingChart, type SeatingChartCallbackProp, type SeatingChartCallbacks, type SeatingChartHandle, type SeatingChartHandleMethod, type SeatingChartIdentityProp, type SeatingChartOptions, type SeatingChartValueProp, type SeatingChartValues, type SelectedObjectUnavailableEvent, type SelectedSeat, type StatusChange, type SubscribeTicket, type TicketOfferAvailability, type TicketOfferPrice, type TicketOfferSummary, attachPickerFrame, bindSeatingChartHandle, buildSeatingChartOptions, createBuyerAccessContext, createControllerSink, parseTicketOfferAvailability, ticketOfferPrices };