@seatlayer/js 0.55.0 → 0.57.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,6 +1,6 @@
1
- import { PickerSeat, RendererViewMode, SeatHoverDetails, PickerSelectionValidity, PickerTransport, PickerMapTheme } from '@seatlayer/core';
2
- export { ExpandedSeat, PickerMapTheme, PickerSelectionValidity, RendererViewMode, SeatHoverDetails } from '@seatlayer/core';
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-1b6xBWKM.cjs';
1
+ import { PickerSeat, PickerSelectionValidator, RendererViewMode, SeatHoverDetails, PickerSelectionValidity, PickerTransport, PickerMapTheme } from '@seatlayer/core';
2
+ export { ExpandedSeat, PickerMapTheme, PickerSelectionValidator, PickerSelectionValidity, PickerSelectionViolation, RendererViewMode, SeatHoverDetails } from '@seatlayer/core';
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-CFxx1jp3.cjs';
4
4
 
5
5
  /**
6
6
  * Buyer access context — the browser half of the Sales Channels contract
@@ -393,6 +393,8 @@ interface HoldLineItem {
393
393
  unitPrice: number;
394
394
  currency: string;
395
395
  quantity?: number;
396
+ /** Channel pricing revision captured when this line used an override. */
397
+ channelPricingVersion?: number | null;
396
398
  }
397
399
  declare class ApiError extends Error {
398
400
  status: number;
@@ -574,6 +576,8 @@ interface SeatingChartOptions {
574
576
  selectableObjects?: string[] | null;
575
577
  /** Require exactly this many seated/table guest units before the selection is valid. */
576
578
  numberOfPlacesToSelect?: number;
579
+ /** Optional local selection guards, enforced again before hold. */
580
+ selectionValidators?: PickerSelectionValidator[];
577
581
  /**
578
582
  * BCP 47 language for the widget UI — `'de'`, `'es-MX'`, etc. Falls back to
579
583
  * the browser language, then English. Built-in: en, es, de, fr. The German
@@ -611,11 +615,11 @@ interface SeatingChartOptions {
611
615
  */
612
616
  onSeatHover?: (details: SeatHoverDetails | null) => void;
613
617
  onSelectionChange?: (seats: SelectedSeat[]) => void;
614
- /** Exact-count state after each selection change. */
618
+ /** Selection-rule state after each selection change. */
615
619
  onSelectionValidityChange?: (state: PickerSelectionValidity) => void;
616
- /** The exact configured count has just been reached. */
620
+ /** The configured selection rules have just become valid. */
617
621
  onSelectionValid?: (seats: SelectedSeat[]) => void;
618
- /** The current selection does not match the configured exact count. */
622
+ /** The configured selection rules have just become invalid. */
619
623
  onSelectionInvalid?: (state: PickerSelectionValidity) => void;
620
624
  /** A manual or programmatic selection reached the active maximum. */
621
625
  onSelectionLimit?: (maxSelection: number) => void;
@@ -729,7 +733,7 @@ declare class SeatingChart {
729
733
  setSelectableObjects(objects: string[] | null): void;
730
734
  /** Change the selection cap without remounting. */
731
735
  setMaxSelection(maxSelection: number): void;
732
- /** Current exact-count validity, or null when no exact count was configured. */
736
+ /** Current selection-rule validity, or null when no rules were configured. */
733
737
  getSelectionValidity(): PickerSelectionValidity | null;
734
738
  /** Hold the current selection. Resolves the hold, or null on a 409 conflict. */
735
739
  hold(options?: {
@@ -971,10 +975,10 @@ declare function bindSeatingChartHandle(getInstance: () => SeatingChart | null):
971
975
  * two behaviours. React already treated them this way; Vue and Angular did not
972
976
  * expose them at all.
973
977
  */
974
- declare const SEATING_CHART_IDENTITY_PROPS: readonly ["event", "apiBase", "maxSelection", "numberOfPlacesToSelect", "publicKey", "locale", "currency", "colorblindSafe", "initialView", "errorDisplay"];
978
+ declare const SEATING_CHART_IDENTITY_PROPS: readonly ["event", "apiBase", "maxSelection", "numberOfPlacesToSelect", "selectionValidators", "publicKey", "locale", "currency", "colorblindSafe", "initialView", "errorDisplay"];
975
979
  type SeatingChartIdentityProp = (typeof SEATING_CHART_IDENTITY_PROPS)[number];
976
980
  /** Non-callback options a wrapper accepts as props/inputs and passes straight through. */
977
- declare const SEATING_CHART_VALUE_PROPS: readonly ["event", "apiBase", "maxSelection", "numberOfPlacesToSelect", "publicKey", "locale", "currency", "colorblindSafe", "initialView", "errorDisplay", "selectedObjects", "selectableObjects", "messages", "seatTooltip", "buyerAccessTokenProvider", "buyerAccessToken"];
981
+ declare const SEATING_CHART_VALUE_PROPS: readonly ["event", "apiBase", "maxSelection", "numberOfPlacesToSelect", "selectionValidators", "publicKey", "locale", "currency", "colorblindSafe", "initialView", "errorDisplay", "selectedObjects", "selectableObjects", "messages", "seatTooltip", "buyerAccessTokenProvider", "buyerAccessToken"];
978
982
  type SeatingChartValueProp = (typeof SEATING_CHART_VALUE_PROPS)[number];
979
983
  /** Every callback option a wrapper wires to its own event mechanism. */
980
984
  declare const SEATING_CHART_CALLBACK_PROPS: readonly ["onSelectionChange", "onSelectionValidityChange", "onSelectionValid", "onSelectionInvalid", "onSelectionLimit", "onHold", "onHoldRestored", "onHoldExpired", "onGAClick", "onError", "onDeckTap", "onHint", "onSeatHover", "onAccessExpired", "onAccessUnavailable", "onSelectedObjectUnavailable"];
@@ -1297,6 +1301,24 @@ interface TicketOfferPrice {
1297
1301
  startsAt?: number | null;
1298
1302
  endsAt?: number | null;
1299
1303
  }
1304
+ interface ChannelPriceOverride {
1305
+ categoryKey: string;
1306
+ tierId: string | null;
1307
+ price: number;
1308
+ }
1309
+ /** Pricing configuration projected only for the private channels in this grant. */
1310
+ interface BuyerChannelPricing {
1311
+ assignmentVersion: number;
1312
+ channels: Array<{
1313
+ channelId: string;
1314
+ pricingVersion: number;
1315
+ priceOverrides: ChannelPriceOverride[];
1316
+ }>;
1317
+ objects: Array<{
1318
+ label: string;
1319
+ channelId: string;
1320
+ }>;
1321
+ }
1300
1322
  interface TicketOfferAvailability {
1301
1323
  state: SaleState;
1302
1324
  /** Currently advertised offer price, in minor units. */
@@ -1309,6 +1331,7 @@ interface TicketOfferAvailability {
1309
1331
  upcoming: TicketOfferSummary | null;
1310
1332
  /** Server-resolved active offer prices by category, in major units. */
1311
1333
  prices: TicketOfferPrice[];
1334
+ channelPricing: BuyerChannelPricing | null;
1312
1335
  }
1313
1336
  /** Parse a public offer payload without repairing a half-understood price. */
1314
1337
  declare function parseTicketOfferAvailability(body: unknown): TicketOfferAvailability | null;
@@ -1492,6 +1515,9 @@ interface SeatPickerOptions {
1492
1515
  selectableObjects?: string[] | null;
1493
1516
  /** Require exactly this many total seated/table/GA guest units before checkout. */
1494
1517
  numberOfPlacesToSelect?: number;
1518
+ /** Optional sale guards evaluated after every change and enforced before a
1519
+ * hold: minimum quantity, consecutive seats, and/or no stranded singles. */
1520
+ selectionValidators?: PickerSelectionValidator[];
1495
1521
  /** BCP 47 language for the widget UI. Built-in: en, es, de, fr. */
1496
1522
  locale?: string;
1497
1523
  /** Per-key string overrides layered over the active locale. */
@@ -1717,11 +1743,11 @@ interface SeatPickerOptions {
1717
1743
  onBooked?: (handoff: CheckoutHandoff) => void;
1718
1744
  /** Selection changed (tap or best-available). */
1719
1745
  onSelectionChange?: (seats: PickerSeat[]) => void;
1720
- /** Exact-count state after each selection change. */
1746
+ /** Selection-rule state after each selection change. */
1721
1747
  onSelectionValidityChange?: (state: PickerSelectionValidity) => void;
1722
- /** The configured exact ticket count has just been reached. */
1748
+ /** The configured selection rules have just become valid. */
1723
1749
  onSelectionValid?: (seats: PickerSeat[]) => void;
1724
- /** The current selection does not match the configured exact ticket count. */
1750
+ /** The configured selection rules have just become invalid. */
1725
1751
  onSelectionInvalid?: (state: PickerSelectionValidity) => void;
1726
1752
  /** A selection attempt reached the active maximum. */
1727
1753
  onSelectionLimit?: (maxSelection: number) => void;
@@ -1797,7 +1823,7 @@ declare class SeatPicker {
1797
1823
  private maxTickets;
1798
1824
  /** Exact ticket count required before checkout; null keeps ordinary 1..max behavior. */
1799
1825
  private readonly exactTickets;
1800
- private lastExactSelectionValidity;
1826
+ private lastSelectionValidity;
1801
1827
  /** Original host pricing, kept separate from live server offer overrides. */
1802
1828
  private readonly hostPricing;
1803
1829
  private root;
@@ -1822,6 +1848,9 @@ declare class SeatPicker {
1822
1848
  /** The event's formatted date-time (event-zone), reused by the closed-state note. */
1823
1849
  private eventWhenText;
1824
1850
  private offerAvailability;
1851
+ /** Server-authoritative channel rules, projected only for this buyer scope. */
1852
+ private readonly channelByObject;
1853
+ private readonly pricesByChannel;
1825
1854
  private hold;
1826
1855
  /** Latest server expiry for the open hold (moves on extend). */
1827
1856
  private holdExpiresAt;
@@ -2144,7 +2173,7 @@ declare class SeatPicker {
2144
2173
  private activeFloorObjects;
2145
2174
  /** Attach the F3 overview minimap into the bottom-left chrome region. */
2146
2175
  private buildMinimap;
2147
- /** Effective display price of a category: host pricing override first tier → base. */
2176
+ /** Effective category summary price. Object-specific channel prices are added to the range below. */
2148
2177
  private catPrice;
2149
2178
  /** Complete buyer-visible price range, including every ticket tier and
2150
2179
  * tier-specific host override. */
@@ -2247,11 +2276,12 @@ declare class SeatPicker {
2247
2276
  */
2248
2277
  private refreshOfferAvailability;
2249
2278
  private offerPrice;
2279
+ private applyChannelPricing;
2250
2280
  /** The compact current/upcoming offer card above Ticket prices. */
2251
2281
  private syncOffer;
2252
2282
  /**
2253
- * The price the buyer will actually pay for a category (+tier): the host's
2254
- * `pricing` override when present, else the chart's stored price. Every
2283
+ * The price the buyer will actually pay for an object/category/tier: its
2284
+ * scoped channel override, then the host/server offer, then the chart. Every
2255
2285
  * price the widget DISPLAYS or hands off must flow through here — a map
2256
2286
  * that shows one price while checkout charges another destroys trust.
2257
2287
  */
@@ -2275,7 +2305,7 @@ declare class SeatPicker {
2275
2305
  /** A live delta took one of OUR selected (not yet held) seats — evict + tell the buyer. */
2276
2306
  private evictTakenSelections;
2277
2307
  private syncTray;
2278
- private emitExactSelectionValidity;
2308
+ private emitSelectionValidity;
2279
2309
  /** Paint the bottom-sheet's collapsed one-liner (pickerTray.ts builds it). */
2280
2310
  private renderPeek;
2281
2311
  private removeHeldLabel;
@@ -2360,7 +2390,7 @@ declare class SeatPicker {
2360
2390
  setSelectableObjects(objects: string[] | null): void;
2361
2391
  /** Change the order selection cap without remounting. */
2362
2392
  setMaxSelection(maxSelection: number): void;
2363
- /** Current exact-count validity, including held and pending GA tickets. */
2393
+ /** Current selection-rule validity, including held and pending GA tickets. */
2364
2394
  getSelectionValidity(): PickerSelectionValidity | null;
2365
2395
  /**
2366
2396
  * Re-ink the DRAWN MAP after mount, so the canvas can follow a page palette
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { PickerSeat, RendererViewMode, SeatHoverDetails, PickerSelectionValidity, PickerTransport, PickerMapTheme } from '@seatlayer/core';
2
- export { ExpandedSeat, PickerMapTheme, PickerSelectionValidity, RendererViewMode, SeatHoverDetails } from '@seatlayer/core';
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-1b6xBWKM.js';
1
+ import { PickerSeat, PickerSelectionValidator, RendererViewMode, SeatHoverDetails, PickerSelectionValidity, PickerTransport, PickerMapTheme } from '@seatlayer/core';
2
+ export { ExpandedSeat, PickerMapTheme, PickerSelectionValidator, PickerSelectionValidity, PickerSelectionViolation, RendererViewMode, SeatHoverDetails } from '@seatlayer/core';
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-CFxx1jp3.js';
4
4
 
5
5
  /**
6
6
  * Buyer access context — the browser half of the Sales Channels contract
@@ -393,6 +393,8 @@ interface HoldLineItem {
393
393
  unitPrice: number;
394
394
  currency: string;
395
395
  quantity?: number;
396
+ /** Channel pricing revision captured when this line used an override. */
397
+ channelPricingVersion?: number | null;
396
398
  }
397
399
  declare class ApiError extends Error {
398
400
  status: number;
@@ -574,6 +576,8 @@ interface SeatingChartOptions {
574
576
  selectableObjects?: string[] | null;
575
577
  /** Require exactly this many seated/table guest units before the selection is valid. */
576
578
  numberOfPlacesToSelect?: number;
579
+ /** Optional local selection guards, enforced again before hold. */
580
+ selectionValidators?: PickerSelectionValidator[];
577
581
  /**
578
582
  * BCP 47 language for the widget UI — `'de'`, `'es-MX'`, etc. Falls back to
579
583
  * the browser language, then English. Built-in: en, es, de, fr. The German
@@ -611,11 +615,11 @@ interface SeatingChartOptions {
611
615
  */
612
616
  onSeatHover?: (details: SeatHoverDetails | null) => void;
613
617
  onSelectionChange?: (seats: SelectedSeat[]) => void;
614
- /** Exact-count state after each selection change. */
618
+ /** Selection-rule state after each selection change. */
615
619
  onSelectionValidityChange?: (state: PickerSelectionValidity) => void;
616
- /** The exact configured count has just been reached. */
620
+ /** The configured selection rules have just become valid. */
617
621
  onSelectionValid?: (seats: SelectedSeat[]) => void;
618
- /** The current selection does not match the configured exact count. */
622
+ /** The configured selection rules have just become invalid. */
619
623
  onSelectionInvalid?: (state: PickerSelectionValidity) => void;
620
624
  /** A manual or programmatic selection reached the active maximum. */
621
625
  onSelectionLimit?: (maxSelection: number) => void;
@@ -729,7 +733,7 @@ declare class SeatingChart {
729
733
  setSelectableObjects(objects: string[] | null): void;
730
734
  /** Change the selection cap without remounting. */
731
735
  setMaxSelection(maxSelection: number): void;
732
- /** Current exact-count validity, or null when no exact count was configured. */
736
+ /** Current selection-rule validity, or null when no rules were configured. */
733
737
  getSelectionValidity(): PickerSelectionValidity | null;
734
738
  /** Hold the current selection. Resolves the hold, or null on a 409 conflict. */
735
739
  hold(options?: {
@@ -971,10 +975,10 @@ declare function bindSeatingChartHandle(getInstance: () => SeatingChart | null):
971
975
  * two behaviours. React already treated them this way; Vue and Angular did not
972
976
  * expose them at all.
973
977
  */
974
- declare const SEATING_CHART_IDENTITY_PROPS: readonly ["event", "apiBase", "maxSelection", "numberOfPlacesToSelect", "publicKey", "locale", "currency", "colorblindSafe", "initialView", "errorDisplay"];
978
+ declare const SEATING_CHART_IDENTITY_PROPS: readonly ["event", "apiBase", "maxSelection", "numberOfPlacesToSelect", "selectionValidators", "publicKey", "locale", "currency", "colorblindSafe", "initialView", "errorDisplay"];
975
979
  type SeatingChartIdentityProp = (typeof SEATING_CHART_IDENTITY_PROPS)[number];
976
980
  /** Non-callback options a wrapper accepts as props/inputs and passes straight through. */
977
- declare const SEATING_CHART_VALUE_PROPS: readonly ["event", "apiBase", "maxSelection", "numberOfPlacesToSelect", "publicKey", "locale", "currency", "colorblindSafe", "initialView", "errorDisplay", "selectedObjects", "selectableObjects", "messages", "seatTooltip", "buyerAccessTokenProvider", "buyerAccessToken"];
981
+ declare const SEATING_CHART_VALUE_PROPS: readonly ["event", "apiBase", "maxSelection", "numberOfPlacesToSelect", "selectionValidators", "publicKey", "locale", "currency", "colorblindSafe", "initialView", "errorDisplay", "selectedObjects", "selectableObjects", "messages", "seatTooltip", "buyerAccessTokenProvider", "buyerAccessToken"];
978
982
  type SeatingChartValueProp = (typeof SEATING_CHART_VALUE_PROPS)[number];
979
983
  /** Every callback option a wrapper wires to its own event mechanism. */
980
984
  declare const SEATING_CHART_CALLBACK_PROPS: readonly ["onSelectionChange", "onSelectionValidityChange", "onSelectionValid", "onSelectionInvalid", "onSelectionLimit", "onHold", "onHoldRestored", "onHoldExpired", "onGAClick", "onError", "onDeckTap", "onHint", "onSeatHover", "onAccessExpired", "onAccessUnavailable", "onSelectedObjectUnavailable"];
@@ -1297,6 +1301,24 @@ interface TicketOfferPrice {
1297
1301
  startsAt?: number | null;
1298
1302
  endsAt?: number | null;
1299
1303
  }
1304
+ interface ChannelPriceOverride {
1305
+ categoryKey: string;
1306
+ tierId: string | null;
1307
+ price: number;
1308
+ }
1309
+ /** Pricing configuration projected only for the private channels in this grant. */
1310
+ interface BuyerChannelPricing {
1311
+ assignmentVersion: number;
1312
+ channels: Array<{
1313
+ channelId: string;
1314
+ pricingVersion: number;
1315
+ priceOverrides: ChannelPriceOverride[];
1316
+ }>;
1317
+ objects: Array<{
1318
+ label: string;
1319
+ channelId: string;
1320
+ }>;
1321
+ }
1300
1322
  interface TicketOfferAvailability {
1301
1323
  state: SaleState;
1302
1324
  /** Currently advertised offer price, in minor units. */
@@ -1309,6 +1331,7 @@ interface TicketOfferAvailability {
1309
1331
  upcoming: TicketOfferSummary | null;
1310
1332
  /** Server-resolved active offer prices by category, in major units. */
1311
1333
  prices: TicketOfferPrice[];
1334
+ channelPricing: BuyerChannelPricing | null;
1312
1335
  }
1313
1336
  /** Parse a public offer payload without repairing a half-understood price. */
1314
1337
  declare function parseTicketOfferAvailability(body: unknown): TicketOfferAvailability | null;
@@ -1492,6 +1515,9 @@ interface SeatPickerOptions {
1492
1515
  selectableObjects?: string[] | null;
1493
1516
  /** Require exactly this many total seated/table/GA guest units before checkout. */
1494
1517
  numberOfPlacesToSelect?: number;
1518
+ /** Optional sale guards evaluated after every change and enforced before a
1519
+ * hold: minimum quantity, consecutive seats, and/or no stranded singles. */
1520
+ selectionValidators?: PickerSelectionValidator[];
1495
1521
  /** BCP 47 language for the widget UI. Built-in: en, es, de, fr. */
1496
1522
  locale?: string;
1497
1523
  /** Per-key string overrides layered over the active locale. */
@@ -1717,11 +1743,11 @@ interface SeatPickerOptions {
1717
1743
  onBooked?: (handoff: CheckoutHandoff) => void;
1718
1744
  /** Selection changed (tap or best-available). */
1719
1745
  onSelectionChange?: (seats: PickerSeat[]) => void;
1720
- /** Exact-count state after each selection change. */
1746
+ /** Selection-rule state after each selection change. */
1721
1747
  onSelectionValidityChange?: (state: PickerSelectionValidity) => void;
1722
- /** The configured exact ticket count has just been reached. */
1748
+ /** The configured selection rules have just become valid. */
1723
1749
  onSelectionValid?: (seats: PickerSeat[]) => void;
1724
- /** The current selection does not match the configured exact ticket count. */
1750
+ /** The configured selection rules have just become invalid. */
1725
1751
  onSelectionInvalid?: (state: PickerSelectionValidity) => void;
1726
1752
  /** A selection attempt reached the active maximum. */
1727
1753
  onSelectionLimit?: (maxSelection: number) => void;
@@ -1797,7 +1823,7 @@ declare class SeatPicker {
1797
1823
  private maxTickets;
1798
1824
  /** Exact ticket count required before checkout; null keeps ordinary 1..max behavior. */
1799
1825
  private readonly exactTickets;
1800
- private lastExactSelectionValidity;
1826
+ private lastSelectionValidity;
1801
1827
  /** Original host pricing, kept separate from live server offer overrides. */
1802
1828
  private readonly hostPricing;
1803
1829
  private root;
@@ -1822,6 +1848,9 @@ declare class SeatPicker {
1822
1848
  /** The event's formatted date-time (event-zone), reused by the closed-state note. */
1823
1849
  private eventWhenText;
1824
1850
  private offerAvailability;
1851
+ /** Server-authoritative channel rules, projected only for this buyer scope. */
1852
+ private readonly channelByObject;
1853
+ private readonly pricesByChannel;
1825
1854
  private hold;
1826
1855
  /** Latest server expiry for the open hold (moves on extend). */
1827
1856
  private holdExpiresAt;
@@ -2144,7 +2173,7 @@ declare class SeatPicker {
2144
2173
  private activeFloorObjects;
2145
2174
  /** Attach the F3 overview minimap into the bottom-left chrome region. */
2146
2175
  private buildMinimap;
2147
- /** Effective display price of a category: host pricing override first tier → base. */
2176
+ /** Effective category summary price. Object-specific channel prices are added to the range below. */
2148
2177
  private catPrice;
2149
2178
  /** Complete buyer-visible price range, including every ticket tier and
2150
2179
  * tier-specific host override. */
@@ -2247,11 +2276,12 @@ declare class SeatPicker {
2247
2276
  */
2248
2277
  private refreshOfferAvailability;
2249
2278
  private offerPrice;
2279
+ private applyChannelPricing;
2250
2280
  /** The compact current/upcoming offer card above Ticket prices. */
2251
2281
  private syncOffer;
2252
2282
  /**
2253
- * The price the buyer will actually pay for a category (+tier): the host's
2254
- * `pricing` override when present, else the chart's stored price. Every
2283
+ * The price the buyer will actually pay for an object/category/tier: its
2284
+ * scoped channel override, then the host/server offer, then the chart. Every
2255
2285
  * price the widget DISPLAYS or hands off must flow through here — a map
2256
2286
  * that shows one price while checkout charges another destroys trust.
2257
2287
  */
@@ -2275,7 +2305,7 @@ declare class SeatPicker {
2275
2305
  /** A live delta took one of OUR selected (not yet held) seats — evict + tell the buyer. */
2276
2306
  private evictTakenSelections;
2277
2307
  private syncTray;
2278
- private emitExactSelectionValidity;
2308
+ private emitSelectionValidity;
2279
2309
  /** Paint the bottom-sheet's collapsed one-liner (pickerTray.ts builds it). */
2280
2310
  private renderPeek;
2281
2311
  private removeHeldLabel;
@@ -2360,7 +2390,7 @@ declare class SeatPicker {
2360
2390
  setSelectableObjects(objects: string[] | null): void;
2361
2391
  /** Change the order selection cap without remounting. */
2362
2392
  setMaxSelection(maxSelection: number): void;
2363
- /** Current exact-count validity, including held and pending GA tickets. */
2393
+ /** Current selection-rule validity, including held and pending GA tickets. */
2364
2394
  getSelectionValidity(): PickerSelectionValidity | null;
2365
2395
  /**
2366
2396
  * Re-ink the DRAWN MAP after mount, so the canvas can follow a page palette