@seatlayer/js 0.48.2 → 0.50.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,6 @@
1
1
  import { PickerSeat, RendererViewMode, SeatHoverDetails, PickerTransport, PickerMapTheme } from '@seatlayer/core';
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-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';
2
+ export { ExpandedSeat, PickerMapTheme, RendererViewMode, SeatHoverDetails } from '@seatlayer/core';
3
+ export { AccessIntentForbidsDetails, AccessLinkRecord, AccessLinkReveal, AccessLinkState, AccessLinkStatus, AccessLinkStatusRecord, ArchiveBlockedDetails, AssignmentBuckets, AssignmentDropDetails, AssignmentResult, BucketRow, ChannelAccessIntent, ChannelAccessSummary, ChannelAllocationPage, ChannelAttribution, ChannelAuditEntry, ChannelAuditPage, ChannelCounts, ChannelListResult, ChannelPreviewProjection, ChannelRecord, ChannelReport, ChannelReportLinkRecord, ChannelReportLinkReveal, ChannelReportResult, ChannelReportRow, ChannelSeatStatus, ChannelState, ChannelsCapabilities, ChannelsClient, ChannelsMode, ChannelsModeHost, ChannelsRowView, ChannelsSeatView, ControlRoomActivityEntry, ControlRoomSectionMetric, ControlRoomSnapshot, EventScopedManageToken, IntentSwitchBlockedDetails, InventoryBooking, InventoryBookingActivity, InventoryBookingDetail, InventoryBookingObject, InventoryBookingState, InventoryBookingsPage, InventoryBookingsQuery, LogEntry, LogPage, ManageApi, ManageApiError, ReportByStatus, ReportCategoryMeta, ReportCategoryRow, ReportResult, SeatManager, SeatManagerActionResult, SeatManagerActivity, SeatManagerCapability, SeatManagerConnection, SeatManagerMode, SeatManagerOptions, SeatManagerTallies, SelectionSourceRow } from './manager.cjs';
5
4
 
6
5
  /**
7
6
  * Buyer access context — the browser half of the Sales Channels contract
@@ -854,9 +853,17 @@ interface EmbeddedDesignerOptions {
854
853
  designerUrl: string;
855
854
  /** CSS selector or element where the iframe is mounted. */
856
855
  container: string | HTMLElement;
857
- /** Verify the message belongs to the chart your backend opened. */
856
+ /**
857
+ * Verify the message belongs to the chart your backend opened. When set, the
858
+ * id is required on `ready` and every runtime lifecycle message. Only an error
859
+ * raised before the iframe resolves its session may omit it.
860
+ */
858
861
  expectedChartId?: string;
859
- /** Verify the message belongs to the workspace your backend opened. */
862
+ /**
863
+ * Verify the message belongs to the workspace your backend opened. Uses the
864
+ * same ready/runtime requirement and pre-session error exception as
865
+ * `expectedChartId`.
866
+ */
860
867
  expectedWorkspaceId?: string;
861
868
  title?: string;
862
869
  className?: string;
@@ -955,6 +962,8 @@ declare class EmbeddedDesigner {
955
962
  private timeoutTimer;
956
963
  /** Proactive session-renewal timer; armed from each `ready`, cleared on re-mount. */
957
964
  private renewTimer;
965
+ /** Last identity-checked session expiry, so a live policy change can re-arm. */
966
+ private sessionExpiresAt;
958
967
  /**
959
968
  * One automatic recovery relaunch is allowed per expiry. Reset ONLY when a fresh
960
969
  * `ready` arrives — deliberately not on re-mount — so a session that keeps failing
@@ -962,6 +971,12 @@ declare class EmbeddedDesigner {
962
971
  */
963
972
  private autoRecoverUsed;
964
973
  private phase;
974
+ /**
975
+ * Set only after an identity-checked `ready`. Unlike `phase`, this remains true
976
+ * if a later fatal error renders the error card, so no subsequent callback can
977
+ * shed the chart/workspace identity the live session already established.
978
+ */
979
+ private identityEstablished;
965
980
  private restoreContainerPosition;
966
981
  private pinned;
967
982
  private frameStyleBeforeFs;
@@ -984,6 +999,10 @@ declare class EmbeddedDesigner {
984
999
  /** Replace the iframe instead of assigning a new fragment to an existing one. */
985
1000
  setDesignerUrl(designerUrl: string): HTMLIFrameElement;
986
1001
  getIframe(): HTMLIFrameElement | null;
1002
+ /** Update iframe sizing without replacing the live Designer session. */
1003
+ setSizing(height: 'fill' | number | undefined, minHeight: number | undefined): void;
1004
+ /** Update renewal/expiry-recovery policy without replacing the iframe. */
1005
+ setRelaunchPolicy(onRequestRelaunch: (() => void) | undefined, autoRenewSession: boolean | undefined): void;
987
1006
  destroy(): void;
988
1007
  private loadingStateEnabled;
989
1008
  private autoResizeEnabled;
@@ -1200,6 +1219,22 @@ interface SeatPickerPricing {
1200
1219
  /** Custom money renderer (e.g. `(n) => n + '€'`). Defaults to Intl currency formatting. */
1201
1220
  formatter?: (amount: number, currency: string) => string;
1202
1221
  }
1222
+ /** Optional constraints for the server-authoritative best-available pick. */
1223
+ interface SeatPickerBestAvailableOptions {
1224
+ /** Prefer a contiguous premium block, falling back to the best overall block. */
1225
+ preferPremium?: boolean;
1226
+ /** Restrict the search to one configured chart zone. */
1227
+ zoneId?: string;
1228
+ }
1229
+ /** Buyer-facing surface shown by the full picker widget. */
1230
+ type SeatPickerBuyerView = 'map' | 'venue3d';
1231
+ /** Optional camera intent when switching the buyer-facing surface. */
1232
+ interface SeatPickerBuyerViewOptions {
1233
+ /** Enter (or remain in) 3D and fly the camera to this seat id. */
1234
+ flyToSeatId?: string;
1235
+ /** When already in 3D, return the camera to the venue overview. */
1236
+ resetView?: boolean;
1237
+ }
1203
1238
  /** Host theme overrides — any subset; unset keys fall back to the org's chart theme, then defaults. */
1204
1239
  interface SeatPickerTheme {
1205
1240
  /** Brand accent (CTA, active chips, hold pill). */
@@ -1311,21 +1346,19 @@ interface SeatPickerOptions {
1311
1346
  * stay strictly 2D. */
1312
1347
  enable3D?: boolean;
1313
1348
  /**
1314
- * Seat-count ceiling above which 3D is not offered. Default: the measured-good
1315
- * ceiling of 15,000 seats (14,142 renders at 58 fps), halved to 7,500 on a
1316
- * device that reports itself as small/low-core.
1349
+ * Seat-count ceiling above which 3D is not offered. Default: 60,000 seats on
1350
+ * desktop, reduced to 30,000 on a device that reports itself as small/low-core.
1317
1351
  *
1318
- * The 3D scene holds EVERY seat resident — there is no streaming rung yet so
1319
- * a 53,000-seat chart builds its scene in ~780 ms on a desktop and much worse
1320
- * on a phone. Offering 3D there is offering a stall. A host that knows its
1321
- * audience can raise this; the ceiling goes away when seat streaming lands. */
1352
+ * The 53,018-seat evidence is desktop-only; that scale remains unmeasured on
1353
+ * phones, which is why the small-device default stays conservative. The 3D
1354
+ * scene holds every seat resident until a streaming rung exists. */
1322
1355
  max3DSeats?: number;
1323
1356
  /**
1324
1357
  * Fires when the buyer enters/leaves 3D or targets a seat there. Hosts can
1325
1358
  * mirror this small, non-sensitive state into a shareable URL.
1326
1359
  */
1327
1360
  onBuyerViewChange?: (state: {
1328
- view: 'map' | 'venue3d';
1361
+ view: SeatPickerBuyerView;
1329
1362
  seatId?: string;
1330
1363
  }) => void;
1331
1364
  /**
@@ -1353,6 +1386,15 @@ interface SeatPickerOptions {
1353
1386
  * own event chrome arrives asynchronously.
1354
1387
  */
1355
1388
  hideEventDetails?: boolean;
1389
+ /**
1390
+ * Start the wide-layout ticket panel collapsed so the map owns the full
1391
+ * width (map-first hosts, small embeds). The buyer reopens it with the
1392
+ * "Tickets" pill beside Map|3D, and it opens itself the moment a seat lands
1393
+ * in the cart — a collapsed panel must never hide a checkout. Narrow
1394
+ * layouts ignore this (the bottom sheet is already the collapse). A mounted
1395
+ * host can drive it later through `setPanelCollapsed()`. Default false.
1396
+ */
1397
+ panelCollapsed?: boolean;
1356
1398
  /** Host theme overrides — see SeatPickerTheme. */
1357
1399
  theme?: SeatPickerTheme;
1358
1400
  /**
@@ -1574,6 +1616,8 @@ declare class SeatPicker {
1574
1616
  private motionTimers;
1575
1617
  private currency;
1576
1618
  private eventTimezone;
1619
+ /** The event's formatted date-time (event-zone), reused by the closed-state note. */
1620
+ private eventWhenText;
1577
1621
  private offerAvailability;
1578
1622
  private hold;
1579
1623
  /** Latest server expiry for the open hold (moves on extend). */
@@ -1633,6 +1677,16 @@ declare class SeatPicker {
1633
1677
  private view3dGen;
1634
1678
  /** Seat whose 2D confirm card launched "See it in 3D"; re-shown on return. */
1635
1679
  private view3dReturnSeat;
1680
+ /** Current premium 3D journey depth. `null` is the venue; a seat id is the
1681
+ * fixed seat-eye state. It lets Back unwind one step before leaving 3D. */
1682
+ private view3dTargetSeatId;
1683
+ /** Inspection-only comparison. These ids never represent cart selection. */
1684
+ private view3dCompareSeatIds;
1685
+ private view3dCompareChip;
1686
+ private view3dCompareEl;
1687
+ private view3dCompareCleanup;
1688
+ private view3dPassportEl;
1689
+ private view3dPassportCleanup;
1636
1690
  private floorsEl;
1637
1691
  private secCardEl;
1638
1692
  private viewEl;
@@ -1671,6 +1725,9 @@ declare class SeatPicker {
1671
1725
  private fsEscHandler;
1672
1726
  /** Host-level event chrome owns the duplicate identity outside full screen. */
1673
1727
  private eventDetailsHidden;
1728
+ /** Wide-layout ticket panel collapsed (map owns the full width). */
1729
+ private sideCollapsed;
1730
+ private sideToggleEl;
1674
1731
  /** True once we've asked the host page to pin us fullscreen (framed, no native). */
1675
1732
  private framedFs;
1676
1733
  /** Last height (px) posted to a host frame; dedupes redundant reports. */
@@ -1784,6 +1841,24 @@ declare class SeatPicker {
1784
1841
  * re-render the section card in the form the layout wants (docked card/pill
1785
1842
  * on wide, sheet strip on narrow). Runs on every layout flip + once post-render.
1786
1843
  */
1844
+ /**
1845
+ * The wide-layout panel toggle: a labelled pill in the top-right region
1846
+ * beside Map|3D. Collapsing gives the map the panel's 300px; the pill's own
1847
+ * label is the way back ("Tickets"), and syncTray reopens the panel when the
1848
+ * first seat lands so the checkout can never be hidden behind a collapse.
1849
+ */
1850
+ private buildPanelToggle;
1851
+ private syncPanelToggle;
1852
+ /**
1853
+ * Collapse or reopen the wide-layout ticket panel in place (host-drivable —
1854
+ * a map-first embed can mount collapsed via `panelCollapsed` and reopen on
1855
+ * its own cue). Inert while collapsed so a keyboard buyer cannot tab into a
1856
+ * zero-width panel; narrow layouts ignore the state entirely (the sheet is
1857
+ * already the collapse) but keep it for the next flip back to wide.
1858
+ */
1859
+ setPanelCollapsed(collapsed: boolean): void;
1860
+ /** Idempotent DOM apply, also run on every layout flip (inert must lift on narrow). */
1861
+ private applyPanelCollapsed;
1787
1862
  private dockLayoutChrome;
1788
1863
  /** The "Need more time?" prompt shown in the hold's final EXTEND_PROMPT_MS. */
1789
1864
  private buildExtendPrompt;
@@ -1795,7 +1870,7 @@ declare class SeatPicker {
1795
1870
  * host `messages` override (which makes `t()` return the override, not the key).
1796
1871
  */
1797
1872
  private tf;
1798
- /** Sold-out overlay — centered over the map, disabled waitlist stub (Gap 2). */
1873
+ /** Sold-out overlay — an informational state with no unavailable action. */
1799
1874
  private buildSoldoutOverlay;
1800
1875
  /**
1801
1876
  * Recompute the sold-out state on every price/availability sync. Sold-out ⇔
@@ -2128,7 +2203,7 @@ declare class SeatPicker {
2128
2203
  private perspectiveWarned;
2129
2204
  private normalizeInitialView;
2130
2205
  /** Current buyer view: the flat map, or the interactive 3D venue. */
2131
- getBuyerView(): 'map' | 'venue3d';
2206
+ getBuyerView(): SeatPickerBuyerView;
2132
2207
  /**
2133
2208
  * Switch between the flat seat **Map** and the interactive **3D venue** view —
2134
2209
  * the same control the buyer's on-widget `Map | 3D` toggle drives.
@@ -2151,10 +2226,7 @@ declare class SeatPicker {
2151
2226
  * // Public 3D tour entry — enter 3D and fly straight to the buyer's seat:
2152
2227
  * picker.setBuyerView('venue3d', { flyToSeatId: 'A-12' });
2153
2228
  */
2154
- setBuyerView(view: 'map' | 'venue3d', opts?: {
2155
- flyToSeatId?: string;
2156
- resetView?: boolean;
2157
- }): void;
2229
+ setBuyerView(view: SeatPickerBuyerView, opts?: SeatPickerBuyerViewOptions): void;
2158
2230
  /** SeatStatus → the view3d palette state. Selection is layered separately. */
2159
2231
  private seatState3dFor;
2160
2232
  /** Push the full live availability snapshot into the 3D handle (selection is
@@ -2170,6 +2242,25 @@ declare class SeatPicker {
2170
2242
  /** A 3D seat tap runs the SAME selection path as a 2D tap: toggle through the
2171
2243
  * controller, then raise the shared confirm card (bottom-sheeted in 3D). */
2172
2244
  private onView3dSeatPick;
2245
+ /** Explain a visible-but-unselectable 3D seat without entering the booking
2246
+ * flow. Category colour remains visible in the venue; this card names the
2247
+ * availability state explicitly so yellow never has to carry both meanings. */
2248
+ private showUnavailable3dSeat;
2249
+ private dismissUnavailable3dSeat;
2250
+ /** Comparison belongs to inspection, never selection. The confirm candidate
2251
+ * remains excluded from checkout until Select; saving it releases that
2252
+ * candidate before any comparison state is created. */
2253
+ private view3dCompareConfirmHtml;
2254
+ private seatConfidenceConfirmHtml;
2255
+ private saveView3dComparisonSeat;
2256
+ private clearView3dComparison;
2257
+ private syncView3dCompareChip;
2258
+ private view3dComparisonSnapshot;
2259
+ private openSeatConfidencePassport;
2260
+ private closeSeatConfidencePassport;
2261
+ private openView3dComparison;
2262
+ private closeView3dComparison;
2263
+ private selectComparedSeat;
2173
2264
  /**
2174
2265
  * The venue-navigation rail inside 3D: levels and areas.
2175
2266
  *
@@ -2193,10 +2284,7 @@ declare class SeatPicker {
2193
2284
  resumeHold(holdId: string): Promise<HoldResult | null>;
2194
2285
  /** Remove one server-held ticket while keeping the rest of the hold active. */
2195
2286
  removeHeldTicket(label: string): Promise<boolean>;
2196
- bestAvailable(qty: number, categoryKey?: string, opts?: {
2197
- preferPremium?: boolean;
2198
- zoneId?: string;
2199
- }): Promise<HoldResult | null>;
2287
+ bestAvailable(qty: number, categoryKey?: string, opts?: SeatPickerBestAvailableOptions): Promise<HoldResult | null>;
2200
2288
  release(): Promise<void>;
2201
2289
  /**
2202
2290
  * Realtime for an access-scoped picker.
@@ -2266,659 +2354,4 @@ interface AttachPickerFrameOptions {
2266
2354
  */
2267
2355
  declare function attachPickerFrame(iframe: HTMLIFrameElement, opts?: AttachPickerFrameOptions): () => void;
2268
2356
 
2269
- /**
2270
- * Channels mode — the sales-channel management surface inside the SeatManager
2271
- * cockpit. It ships in the SDK, so every embedding platform (and our own Control
2272
- * Room) gets the same organizer experience.
2273
- *
2274
- * Design contract: `SeatmapUX/05 Event Manager.dc.html` (all 8 desktop states +
2275
- * the mobile artboard). Behaviour: sales-channels-product-ux-spec §8 (states),
2276
- * §9 (language), §13 (a11y + compact detents). Motion: motion-system §2 tokens,
2277
- * mirrored here as `--slm-mo-*` so an embed is self-contained, and §3 cockpit
2278
- * choreography.
2279
- *
2280
- * Boundaries this module keeps:
2281
- *
2282
- * - **Capability gating is fail-closed.** Without `event:channels:view` the
2283
- * cockpit never renders the pill (SeatManager's job). Without
2284
- * `event:channels:manage` every mutation control is ABSENT — not disabled —
2285
- * so a read-only operator is never shown authority they do not have.
2286
- * - **Nothing here mutates physical inventory.** Assignment moves an
2287
- * allocation; held and booked units are never rewritten.
2288
- * - **Staging is local, truth is the server.** There is no dry-run endpoint,
2289
- * so the Review sheet previews the buckets client-side and then re-renders
2290
- * the AUTHORITATIVE bucket counts from the Apply response. A stale
2291
- * `assignmentVersion` mutates nothing: the selection survives and the only
2292
- * action offered is Refresh and review.
2293
- * - **Forward-compatible reads.** The `access` field and the buyer-preview
2294
- * projection land on the access-hardening branch. Both are feature-detected;
2295
- * absent, the access line reads "—" and the Preview segment says it needs a
2296
- * newer server. Neither ever blocks allocation work.
2297
- */
2298
-
2299
- /** The seat facts the overlay needs. Chart space, not screen space. */
2300
- interface ChannelsSeatView {
2301
- id: string;
2302
- label: string;
2303
- x: number;
2304
- y: number;
2305
- }
2306
- /** One row offered to the bulk assignment chooser. A physically segmented row
2307
- * (one label split across several row objects) shares one logical id, so the
2308
- * organizer picks "Row AA" once rather than three fragments of it. */
2309
- interface ChannelsRowView {
2310
- id: string;
2311
- label: string;
2312
- sectionId: string;
2313
- sectionLabel: string;
2314
- labels: string[];
2315
- }
2316
- /** The `ManageApi` subset Channels mode uses — structural so tests can pass a
2317
- * hand-rolled double without constructing a real client. */
2318
- interface ChannelsClient {
2319
- channels(key: string, opts?: {
2320
- includeArchived?: boolean;
2321
- }): Promise<ChannelListResult>;
2322
- channelAllocation(key: string, opts?: {
2323
- afterLabel?: string;
2324
- limit?: number;
2325
- }): Promise<ChannelAllocationPage>;
2326
- createChannel(key: string, input: {
2327
- name: string;
2328
- color?: string | null;
2329
- marker?: string | null;
2330
- externalRef?: string | null;
2331
- }): Promise<{
2332
- ok: true;
2333
- channel: ChannelRecord;
2334
- }>;
2335
- renameChannel(key: string, channelId: string, name: string): Promise<{
2336
- ok: true;
2337
- channel: ChannelRecord;
2338
- }>;
2339
- setChannelPaused(key: string, channelId: string, paused: boolean): Promise<{
2340
- ok: true;
2341
- channel: ChannelRecord;
2342
- }>;
2343
- archiveChannel(key: string, channelId: string, destination: string | null): Promise<{
2344
- ok: true;
2345
- channel: ChannelRecord;
2346
- assignmentVersion: number;
2347
- moved: number;
2348
- }>;
2349
- applyChannelAssignment(key: string, input: {
2350
- targetChannelId: string | null;
2351
- labels: string[];
2352
- assignmentVersion: number;
2353
- }): Promise<AssignmentResult>;
2354
- channelPreview(key: string, channelIds: string[], opts?: {
2355
- includePublic?: boolean;
2356
- }): Promise<ChannelPreviewProjection>;
2357
- /** Choose the channel's sale route. Authorization since 2026-08-06, so this is
2358
- * a precondition of every buyer-facing action, not a label. `opts` carries the
2359
- * acknowledgement that unblocks a switch with live buyer access. */
2360
- setChannelAccessIntent(key: string, channelId: string, accessIntent: ChannelAccessIntent, opts?: {
2361
- acknowledgeLiveAccess?: boolean;
2362
- reason?: string;
2363
- }): Promise<{
2364
- ok: true;
2365
- channel: ChannelRecord;
2366
- intentSwitch?: {
2367
- closedLinks: number;
2368
- keptSessions: number;
2369
- };
2370
- }>;
2371
- /** 201 with the ONE-TIME reveal. Every omitted field takes the server default
2372
- * (expiry = event start, 100 redemptions, 4 seats per buyer). */
2373
- createAccessLink(key: string, channelId: string, input: {
2374
- label?: string | null;
2375
- expiresAt?: number;
2376
- maxRedemptions?: number;
2377
- maxQuantity?: number;
2378
- includePublic?: boolean;
2379
- }): Promise<AccessLinkReveal>;
2380
- /** Status only. This response has no url and no capability, by contract. */
2381
- accessLinks(key: string, channelId: string): Promise<{
2382
- links: AccessLinkStatusRecord[];
2383
- }>;
2384
- /** `endActiveSessions` is required — the server 422s without it, deliberately. */
2385
- rotateAccessLink(key: string, channelId: string, linkId: string, endActiveSessions: boolean): Promise<AccessLinkReveal>;
2386
- revokeAccessLink(key: string, channelId: string, linkId: string, endActiveSessions?: boolean): Promise<{
2387
- ok: true;
2388
- link: unknown;
2389
- endedSessions: number;
2390
- }>;
2391
- }
2392
- interface ChannelsCapabilities {
2393
- view: boolean;
2394
- manage: boolean;
2395
- }
2396
- /** Everything Channels mode needs from the cockpit around it. */
2397
- interface ChannelsModeHost {
2398
- eventKey: string;
2399
- api: ChannelsClient;
2400
- /** The rail scroll container the mode paints into. */
2401
- rail: HTMLElement;
2402
- /** An absolutely-positioned layer over the map (overlay canvas, flags, bars). */
2403
- mapLayer: HTMLElement;
2404
- /** The widget root — dialogs mount here so they inherit the widget's tokens. */
2405
- root: HTMLElement;
2406
- seats(): ChannelsSeatView[];
2407
- statusOf(label: string): ChannelSeatStatus | undefined;
2408
- selectionLabels(): string[];
2409
- selectByLabels(labels: string[]): void;
2410
- clearSelection(): void;
2411
- selectSection(sectionId: string): void;
2412
- sections(): Array<{
2413
- id: string;
2414
- label: string;
2415
- }>;
2416
- /** Every selectable label inside one section, for the additive scope chooser. */
2417
- labelsInSection(sectionId: string): string[];
2418
- /** Logical rows across the whole chart, grouped by their section. */
2419
- rows(): ChannelsRowView[];
2420
- categories(): Array<{
2421
- key: string;
2422
- label: string;
2423
- color?: string;
2424
- }>;
2425
- labelsInCategory(key: string): string[];
2426
- sectionOfLabel(label: string): {
2427
- id: string;
2428
- label: string;
2429
- } | null;
2430
- /** Chart-space → container pixels. Null when there is no live renderer. */
2431
- worldToScreen(point: {
2432
- x: number;
2433
- y: number;
2434
- }): {
2435
- x: number;
2436
- y: number;
2437
- } | null;
2438
- /** Approximate on-screen seat size in CSS pixels, for the overlay marks. */
2439
- seatPixelSize(): number;
2440
- /** Whether the live renderer is currently showing individual seats. */
2441
- isSeatDetail(): boolean;
2442
- /** Return a sectional venue to its section-only overview. */
2443
- showSectionOverview(): void;
2444
- /** Focus one section using the renderer's real camera transition. */
2445
- focusSection(sectionId: string): void;
2446
- isCompact(): boolean;
2447
- /** Make the canvas non-interactive behind a full-detent sheet (§13). */
2448
- setMapInert(inert: boolean): void;
2449
- toast(message: string, kind: 'ok' | 'err'): void;
2450
- onError(err: unknown): void;
2451
- /** Fired whenever the staged mutation count changes, for host telemetry. */
2452
- onStagedChange?(staged: number): void;
2453
- }
2454
- /**
2455
- * Render bucket rows to markup. Deliberately generic over `BucketRow`, because
2456
- * three different refusals share this exact presentation: the local staged
2457
- * preview, the authoritative Apply response, and the chart-update
2458
- * `channel_assignment_would_drop` review (via `dropReviewRows`). One component,
2459
- * one visual language for "here is every affected unit, in exactly one line".
2460
- */
2461
- declare function bucketRowsHtml(rows: BucketRow[]): string;
2462
- declare class ChannelsMode {
2463
- private readonly host;
2464
- private caps;
2465
- private active;
2466
- private list;
2467
- private allocation;
2468
- private assignmentVersion;
2469
- private loadError;
2470
- private loading;
2471
- private view;
2472
- /** Pan is intentionally the initial desktop interaction. Assignment's
2473
- * marquee is powerful, but must never make an organizer lose map navigation. */
2474
- private mapIntent;
2475
- private focusedSectionId;
2476
- private showArchived;
2477
- private detailChannelId;
2478
- /**
2479
- * Whether the organizer has asked to assign seats.
2480
- *
2481
- * The list rail leads with the CHANNELS. The assignment tooling — destination
2482
- * picker plus five select-by routes — used to paint unconditionally above that
2483
- * list, so a first-time organizer met a workbench for a job they had not asked
2484
- * to do, with the thing they came for pushed below the fold. It is now
2485
- * disclosed on intent: the "Assign seats to a channel" action under the list,
2486
- * the map's own "Assign seats" segment, or simply having a selection. The
2487
- * selection rail always shows the tools, because there the intent is proven.
2488
- */
2489
- private assignOpen;
2490
- private targetChannelId;
2491
- private conflict;
2492
- private dialog;
2493
- private detent;
2494
- private seatListLimit;
2495
- /**
2496
- * Hosted-link STATUS for the channel whose detail panel is open. This is the
2497
- * listing projection — it carries no url and no capability, because no route
2498
- * returns one. `unsupported` is the honest answer for a worker that predates
2499
- * M8, exactly like the buyer-preview probe.
2500
- */
2501
- private links;
2502
- private linksChannelId;
2503
- private linksState;
2504
- /**
2505
- * Monotonic read generations — one for the channel list + allocation, one for
2506
- * the open channel's links. Reads are concurrent (a 10s poll versus a
2507
- * mutation's own reload), and the network does not promise to answer them in
2508
- * order. Only the NEWEST read of each kind may write to state; an older
2509
- * answer that arrives late is dropped, never painted.
2510
- */
2511
- private listSeq;
2512
- private linksSeq;
2513
- private previewAudience;
2514
- private previewIncludePublic;
2515
- private previewProjection;
2516
- /**
2517
- * The buyer-preview read, as one honest state rather than a boolean.
2518
- *
2519
- * `previewSupported: boolean | null` could say "this worker has no projection
2520
- * route", but it could not say "the read is in flight" or "the read failed" —
2521
- * both of those painted an audience picker with no result underneath, which
2522
- * reads as "this audience can buy nothing". Loading and error are now states
2523
- * of their own, and the error one offers a retry.
2524
- */
2525
- private previewState;
2526
- private pollTimer;
2527
- private layer;
2528
- private canvas;
2529
- /** undefined = not resolved yet, null = this environment has no 2d canvas. */
2530
- private ctx;
2531
- private bannerEl;
2532
- private stagedEl;
2533
- private liveEl;
2534
- private scrimEl;
2535
- private lastFocus;
2536
- private stagedDoneTimer;
2537
- private lastSelectionCount;
2538
- private lastCounts;
2539
- /** Rows are structural chart data — they do not move while the organizer is
2540
- * allocating. Deriving them walks every seat, so the view is cached for the
2541
- * lifetime of this mode entry and ordinary selection repaints stay O(1). */
2542
- private assignmentRowsCache;
2543
- /** The markup currently in the rail. An identical repaint is skipped, which is
2544
- * what keeps the organizer's scroll position (and open <select>) alive. */
2545
- private railHtml;
2546
- /**
2547
- * The `assignmentVersion` the allocation map was built from. Walking every
2548
- * allocation page is the expensive half of a refresh and the server already
2549
- * tells us, in the channels response, whether ANY seat moved. Unchanged
2550
- * version, unchanged allocation — so the walk is skipped entirely.
2551
- */
2552
- private allocationVersion;
2553
- private onVisibility;
2554
- constructor(host: ChannelsModeHost, capabilities: ChannelsCapabilities);
2555
- /** Called when the cockpit switches into Channels mode. */
2556
- enter(): void;
2557
- /** Called when the cockpit leaves Channels mode. Everything this mode painted
2558
- * over the map goes with it — no other tool ever inherits a channel overlay. */
2559
- leave(): void;
2560
- destroy(): void;
2561
- /** Capabilities can change when a token rotates. Re-render, fail-closed. */
2562
- setCapabilities(capabilities: ChannelsCapabilities): void;
2563
- isActive(): boolean;
2564
- /**
2565
- * Whether the map should accept bulk selection right now. Preview is a
2566
- * read-only simulation of somebody else's view, and a view-only token has no
2567
- * assignment to stage — in both cases the canvas must not offer selection at
2568
- * all rather than collect a selection nothing can act on.
2569
- */
2570
- canSelect(): boolean;
2571
- /** Bulk seat assignment is explicit. In Pan map, clicks can still inspect a
2572
- * single seat, while a primary-button drag always moves the camera. */
2573
- usesMarqueeSelection(): boolean;
2574
- /** The renderer calls this when the organizer opens a section from overview. */
2575
- handleSectionFocus(sectionId: string): void;
2576
- /**
2577
- * Organizer realtime integration point. M5 ships a per-scope socket for
2578
- * buyers; the organizer channel-count stream is a later milestone. When it
2579
- * arrives, call this from the cockpit's WS handler instead of waiting for the
2580
- * poll — everything downstream already reacts to a fresh list.
2581
- */
2582
- applyRealtimeHint(): void;
2583
- /** The cockpit's selection changed (marquee / click / section / category). */
2584
- handleSelectionChange(): void;
2585
- /** Camera moved or the container resized — the overlay is screen-space. */
2586
- handleViewChange(): void;
2587
- handleLayoutChange(): void;
2588
- private refresh;
2589
- /** Walk every allocation page. Bounded by the event's seat count, and the
2590
- * server caps each page, so an arena is a handful of round trips. */
2591
- private loadAllocation;
2592
- private channelById;
2593
- private nameOf;
2594
- private markerFor;
2595
- /** Channels an organizer may assign INTO: public sale plus every live channel. */
2596
- private assignableChannels;
2597
- private currentPlan;
2598
- private ensureLayer;
2599
- private announce;
2600
- /**
2601
- * Repaint the allocation (or preview) overlay in ONE canvas pass.
2602
- *
2603
- * Channel identity on the map is a fill in the administrative color PLUS the
2604
- * letter flags below — never color alone. In buyer preview the map instead
2605
- * uses two explicit, channel-neutral access states. Physical status keeps its
2606
- * own cue: only FREE units are repainted, so sold/held/blocked seats still
2607
- * read exactly as they do in every other tool.
2608
- */
2609
- private paintOverlay;
2610
- /** Draw an eligible seat's actual chart label without inventing a new buyer
2611
- * identifier. Long labels scale down and are omitted rather than overflowing
2612
- * into an adjacent seat. */
2613
- private paintPreviewSeatLabel;
2614
- /** A section overview is a navigation map. These transparent, keyboardable
2615
- * hit areas sit over the renderer's section shells so both mouse and keyboard
2616
- * always take the organizer into the real focused-section camera state. */
2617
- private paintSectionTargets;
2618
- /** Keep renderer section names legible over a dense, zoomed-out preview. */
2619
- private paintPreviewSectionLabels;
2620
- /** Letter flags at each channel's centroid — the non-color identity cue. */
2621
- private paintFlags;
2622
- private setStaged;
2623
- private paintStagedBar;
2624
- private setBanner;
2625
- private setView;
2626
- /** Set by the cockpit so a view switch can re-arm canvas selection. */
2627
- onInteractionChange?: () => void;
2628
- private loadPreview;
2629
- /**
2630
- * Replace the rail's markup — but only when it actually differs, and never at
2631
- * the cost of where the organizer had scrolled to.
2632
- *
2633
- * The rail repaints on a clock, on every selection change and after every
2634
- * mutation. Rewriting `innerHTML` each time resets `scrollTop`, which is
2635
- * exactly what "the rail gets stuck" was: scroll down to Create channel, the
2636
- * poll ticks, and the list snaps back to the top under the cursor. So skip the
2637
- * write when the markup is byte-identical, and restore the offset when it is
2638
- * not.
2639
- *
2640
- * Returns whether the DOM was rewritten. Callers must only re-wire listeners
2641
- * when it was — a skipped paint keeps the old nodes AND their listeners, so
2642
- * re-wiring would double every handler.
2643
- */
2644
- private setRailHtml;
2645
- paintRail(): void;
2646
- private viewSegmentHtml;
2647
- private mapNavigationHtml;
2648
- private countsHtml;
2649
- private channelRowHtml;
2650
- private listRailHtml;
2651
- /**
2652
- * The assignment entry point on the list rail.
2653
- *
2654
- * Collapsed it is ONE plain-language action, so the channels the organizer came
2655
- * for stay at the top of the panel. Opened it is the same tool set that has
2656
- * always worked, in the same order, plus the way back out — and opening it is
2657
- * also what the map's "Assign seats" segment does, so the two routes into the
2658
- * job cannot disagree about whether it is running.
2659
- */
2660
- private assignEntryHtml;
2661
- /**
2662
- * Destination-first assignment controls.
2663
- *
2664
- * These used to live only inside the selection rail, which meant every route
2665
- * into them was gated behind "select a seat on the map first" — the section,
2666
- * row and category choosers were invisible until the organizer had already
2667
- * done the work by hand. They are still reachable before a seat is selected,
2668
- * but they are no longer the first thing in the panel: on the list rail they
2669
- * are disclosed by `assignEntryHtml`, and there they carry a way back out
2670
- * (`collapsible`). In the selection rail there is nothing to disclose — a
2671
- * selection IS the intent — so they paint unconditionally and without Done.
2672
- */
2673
- private assignmentToolsHtml;
2674
- private selectionRailHtml;
2675
- private detailRailHtml;
2676
- /**
2677
- * "Distribute" — the ONE way this channel's seats reach a buyer.
2678
- *
2679
- * All four routes are here, and this is a real chooser again. It was cut down
2680
- * to two actions in 0.42.0 for a good reason: `access_intent` was stored,
2681
- * audited, and read by nothing, so "Keep as protected reserve" and "Sell
2682
- * through your own staff" were labels an organizer could set and then wait
2683
- * forever for something to happen. The server closed that hole on 2026-08-06 —
2684
- * each declaration now opens exactly one route and REFUSES the other three —
2685
- * so all four are honest choices and belong on the surface.
2686
- *
2687
- * None of the old copy came back with them. These sentences are written
2688
- * against the enforcement matrix (`accessIntentDescription`), which is why
2689
- * each one says what the route refuses as well as what it allows.
2690
- *
2691
- * The current route is stated, not merely styled: a chooser whose selection
2692
- * you have to infer from a border is not a chooser. Its card carries a
2693
- * "Current route" marker and drops its own select button, because pressing it
2694
- * would do nothing.
2695
- */
2696
- private distributeHtml;
2697
- /**
2698
- * Read the status projection for the open channel. Never paints — the caller
2699
- * decides when the rail repaints, so a poll-driven reload does not fight a
2700
- * user-driven one. A worker without M8 answers 404/405 and gets the honest
2701
- * "needs a newer server" line rather than an error toast.
2702
- */
2703
- private loadLinks;
2704
- /**
2705
- * The buyer-link status section of the detail panel.
2706
- *
2707
- * STATUS ONLY, by design (comp 06 `hosted`): label, state, expiry,
2708
- * redemptions, seats per buyer, live sessions. There is no Copy control here
2709
- * and no field to hang one on — the URL was shown once at creation and cannot
2710
- * be produced again. Rotation is the recovery path, and it says so.
2711
- *
2712
- * Creating a link is the Distribute card's action, not this section's, so a
2713
- * channel with no links renders nothing here rather than an empty heading and
2714
- * a second button saying the same thing.
2715
- */
2716
- private hostedLinksHtml;
2717
- private linkCardHtml;
2718
- private previewRailHtml;
2719
- private paintSelection;
2720
- private wireRail;
2721
- /** Open a channel's detail panel and start its buyer-link read. */
2722
- private openChannel;
2723
- private railAction;
2724
- /** Derived once per mode entry — see `assignmentRowsCache`. */
2725
- private assignmentRows;
2726
- private pickCategory;
2727
- /** A tiny modal chooser reusing the dialog primitive (focus trap + Escape). */
2728
- private promptChoice;
2729
- /**
2730
- * Add several whole sections, or several whole rows, in one operation.
2731
- *
2732
- * ADDITIVE by contract: the chooser starts from the labels already selected
2733
- * and only ever grows that set, so opening it never destroys a hard-won
2734
- * marquee or seat-list selection. The confirm button always states the net
2735
- * number of seats it will add, and refuses to exceed `MAX_ASSIGNMENT_UNITS`.
2736
- *
2737
- * Rows get the richer variant. A large venue has thousands of them, so they
2738
- * arrive collapsed under their section, with a section-level tri-state
2739
- * checkbox, a search across every row, and a render cap — the flat list used
2740
- * for sections would be an unusable wall of buttons.
2741
- */
2742
- private renderScopeDialog;
2743
- private openDialog;
2744
- private renderDialog;
2745
- /**
2746
- * `channel_intent_switch_blocked` — buyers are inside the route being left.
2747
- *
2748
- * The same review-then-acknowledge shape as the archive and chart-drop guards,
2749
- * because it is the same kind of decision: the server refuses once, names
2750
- * exactly what is at stake, and only a deliberate second press goes through.
2751
- * What acknowledging does is spelled out per consequence — links close now,
2752
- * checkouts already running survive and drain — rather than hidden behind a
2753
- * word like "force".
2754
- */
2755
- private renderIntentSwitchDialog;
2756
- /**
2757
- * The acknowledged retry. The declare and the create stay one gesture across
2758
- * the sheet: if this switch was the first half of a declare-then-create, the
2759
- * held form finishes on the far side of the acknowledgement.
2760
- */
2761
- private acknowledgeIntentSwitch;
2762
- /**
2763
- * Mount a modal: `aria-modal` dialog, programmatic name, focus moved inside,
2764
- * Tab trapped, Escape closes WITHOUT mutating, focus restored on close (§13).
2765
- */
2766
- private renderScrim;
2767
- private closeDialog;
2768
- private renderCreateDialog;
2769
- private createChannel;
2770
- private showDialogError;
2771
- private renderReviewDialog;
2772
- /**
2773
- * Apply. On success the sheet CLOSES and the staged bar confirms what moved,
2774
- * naming the destination and any skipped seats, with the AUTHORITATIVE server
2775
- * buckets still one Details press away. Leaving the modal up on success made
2776
- * the organizer dismiss a sheet to get back to a map they had just changed.
2777
- * On a stale version the server mutated nothing: keep the selection, shake
2778
- * the bar once, and offer exactly one action — Refresh and review.
2779
- */
2780
- private apply;
2781
- /**
2782
- * The success receipt, now that the review sheet closes on Apply. It names the
2783
- * destination and the seats that could not move, keeps the authoritative
2784
- * buckets reachable through Details, and stays up long enough to be read —
2785
- * 1.2s was tuned for a confirmation the organizer was already looking at.
2786
- */
2787
- private showApplied;
2788
- private shakeStaged;
2789
- /**
2790
- * The ⋯ menu.
2791
- *
2792
- * Opening a channel is the ROW's job now, so ⋯ carries what is left: the
2793
- * secondary and destructive lifecycle actions. It is rendered through the same
2794
- * scrim primitive as every other sheet, which is what gives it a focus trap,
2795
- * Escape, and a name — a bare absolutely-positioned popup would have had none
2796
- * of those. Archive keeps its own confirmation dialog; this menu never
2797
- * destroys anything by itself.
2798
- */
2799
- private renderMenuDialog;
2800
- private renderRenameDialog;
2801
- /**
2802
- * "Use a website or app" — declare the channel's route as `server`.
2803
- *
2804
- * This is no longer a flag the Embed page happens to read: since 2026-08-06 it
2805
- * is what AUTHORIZES `POST /v1/events/:key/buyer-access-sessions` to mint for
2806
- * this channel at all. Without it, an integration that is otherwise perfectly
2807
- * wired up gets a 409 on every buyer.
2808
- */
2809
- private chooseWebsiteIntegration;
2810
- /**
2811
- * Declare this channel's sale route.
2812
- *
2813
- * Reports through the toast lane the rest of the rail's direct actions use.
2814
- * The two enforcement refusals get real answers rather than a generic failure:
2815
- * `channel_intent_switch_blocked` opens the review sheet (there is a decision
2816
- * to make, and a sheet is where decisions live), and
2817
- * `channel_access_intent_forbids` — which the organizer can hit by racing
2818
- * their own second tab — says which route is in the way.
2819
- */
2820
- private setAccessIntent;
2821
- /** What just happened, including anything the switch took down with it — the
2822
- * server reports `intentSwitch` only when it actually disturbed something. */
2823
- private intentSavedCopy;
2824
- /** `channelId` is explicit because this is reachable from the ⋯ menu on a row
2825
- * that is NOT the open channel, as well as from the detail panel itself. */
2826
- private togglePause;
2827
- private renderArchiveDialog;
2828
- private archive;
2829
- /**
2830
- * The synchronized inventory list (§13): the keyboard and screen-reader
2831
- * equivalent of canvas click / marquee / brush, grouped by section with
2832
- * per-section select actions.
2833
- */
2834
- private renderSeatListDialog;
2835
- private reloadLinks;
2836
- /**
2837
- * The reload EVERY link mutation owes the panel.
2838
- *
2839
- * A create/rotate/revoke changes two things the detail panel renders: the
2840
- * channel's access line (the server sets `access.intent` on create, and clears
2841
- * it when the last live link goes) and the link status list. Both are re-read
2842
- * here and the rail repainted, so the panel the organizer is already looking
2843
- * at is current the moment the mutation lands — no reload, and no dependence
2844
- * on HOW the one-time reveal was dismissed (the button, Escape, or never).
2845
- */
2846
- private reloadAfterLinkChange;
2847
- private linkById;
2848
- /**
2849
- * Create. The three policy fields carry the owner's defaults and every one of
2850
- * them is editable; the PLATFORM bounds (60s–180d, 1–10 000, 1–100, 20 live
2851
- * links) are the server's to enforce and the server's to explain, so this form
2852
- * checks only that a number is a number and surfaces the server's sentence for
2853
- * everything else.
2854
- */
2855
- private renderLinkCreateDialog;
2856
- /**
2857
- * DECLARE, then create.
2858
- *
2859
- * `createAccessLink` used to set the channel's route to `hosted_link` as a
2860
- * side effect, which is exactly why the picker could never refuse anything.
2861
- * The server took that side effect away and now REQUIRES the declaration —
2862
- * and channels default to `none`, so a create that did not declare first
2863
- * would 409 on the organizer's very first "Create buyer link".
2864
- *
2865
- * So the route is declared here, immediately before the create. It stays ONE
2866
- * gesture: nothing is declared while the organizer is still filling the form
2867
- * in (cancelling changes nothing), and if the declaration is the part that is
2868
- * refused, the review sheet holds this form and finishes the job on the far
2869
- * side of the acknowledgement.
2870
- */
2871
- private createLink;
2872
- /**
2873
- * The create half, on its own.
2874
- *
2875
- * Separate from `createLink` because the acknowledge path has ALREADY declared
2876
- * the route — with the very acknowledgement the plain declaration was refused
2877
- * for. Sending it back through `ensureHostedLinkRoute` would re-derive the
2878
- * route from a channel list that has not necessarily caught up, and could
2879
- * refuse the organizer a second time for a decision they just made.
2880
- */
2881
- private mintLink;
2882
- /**
2883
- * Make sure the channel declares the buyer-link route before a link is minted.
2884
- *
2885
- * Returns false when the create must NOT proceed — either it was refused, or
2886
- * the decision has been handed to the switch-review sheet, which resumes it.
2887
- * A channel already on `hosted_link` costs no request at all, so creating a
2888
- * second link is the same single call it has always been.
2889
- */
2890
- private ensureHostedLinkRoute;
2891
- /**
2892
- * The ONE-TIME reveal.
2893
- *
2894
- * Three things make this unrecoverable rather than merely "not shown twice":
2895
- *
2896
- * 1. `url` is a local const. It is never assigned to a field on this class,
2897
- * never handed to the host, never put in a `DialogState`.
2898
- * 2. `this.dialog` is cleared FIRST, so `renderDialog()` — the only function
2899
- * that rebuilds a sheet — has nothing to rebuild this one from.
2900
- * 3. The string exists in exactly one DOM node inside the scrim. Dismissing
2901
- * the dialog removes the scrim, and the closure goes with it.
2902
- *
2903
- * The server holds only a hash, so even a compromised client cannot ask for it
2904
- * again. Rotation is the recovery path, and the copy says so.
2905
- */
2906
- private revealLink;
2907
- /**
2908
- * Rotate. The organizer must SAY what happens to the buyers already inside —
2909
- * the confirm stays disabled until one of the two choices is picked, because
2910
- * the gentle branch and the destructive branch are both real decisions and the
2911
- * server refuses (422 `end_active_sessions_required`) to guess either.
2912
- */
2913
- private renderLinkRotateDialog;
2914
- private rotateLink;
2915
- private renderLinkRevokeDialog;
2916
- private revokeLink;
2917
- private applySheetClasses;
2918
- private cycleDetent;
2919
- /** Back/Close from the full detent returns to the previous one and keeps the
2920
- * selection — losing a hard-won selection to a Back press is unforgivable. */
2921
- handleBack(): boolean;
2922
- }
2923
-
2924
- 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 };
2357
+ 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, type SaleState, SeatPicker, type SeatPickerBestAvailableOptions, type SeatPickerBuyerView, type SeatPickerBuyerViewOptions, type SeatPickerOptions, type SeatPickerPricing, type SeatPickerTheme, SeatingChart, type SeatingChartOptions, type SelectedObjectUnavailableEvent, type SelectedSeat, type StatusChange, type SubscribeTicket, type TicketOfferAvailability, type TicketOfferPrice, type TicketOfferSummary, attachPickerFrame, createBuyerAccessContext, createControllerSink, parseTicketOfferAvailability, ticketOfferPrices };