@seatlayer/js 0.59.0 → 0.61.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;
@@ -589,6 +660,16 @@ interface SeatingChartOptions {
589
660
  * without shipping a whole bundle, e.g. `{ 'map.fromPrice': 'ab {price}' }`.
590
661
  */
591
662
  messages?: Record<string, string>;
663
+ /**
664
+ * Show an in-chart language switcher offering exactly these languages.
665
+ *
666
+ * Opt-in and curated on purpose: the chart sits inside someone else's page,
667
+ * a multilingual host already has its own switcher, and two that can
668
+ * disagree is worse than either alone. A curated list also beats all 37 — a
669
+ * German venue wants de/en/pl in the menu, not Welsh. Fewer than two
670
+ * resolvable entries renders nothing.
671
+ */
672
+ languages?: string[];
592
673
  /** ISO 4217 currency for on-map prices (default USD). */
593
674
  currency?: string;
594
675
  /**
@@ -628,6 +709,13 @@ interface SeatingChartOptions {
628
709
  onHoldRestored?: (result: HoldResult) => void;
629
710
  onHoldExpired?: () => void;
630
711
  onGAClick?: (area: GAAreaAvailability) => void;
712
+ /**
713
+ * Mirror of {@link SeatPickerOptions.onGAPrompt}. The low-level chart draws no
714
+ * quantity UI of its own, so this fires purely as the "the buyer wants to pick
715
+ * a quantity here" signal, with the same pre-computed `min`/`max`/`tiers` the
716
+ * full widget would have used; the return value is accepted and ignored.
717
+ */
718
+ onGAPrompt?: (prompt: GAPromptRequest) => boolean | void;
631
719
  /**
632
720
  * The buyer access session lapsed. `refreshed` says whether the provider
633
721
  * already recovered it — false means private inventory is now unavailable and
@@ -683,6 +771,8 @@ declare class SeatingChart {
683
771
  readonly publicKey?: string;
684
772
  private mount;
685
773
  private hostEl;
774
+ /** The organizer's language for this event, learned when the chart resolves. */
775
+ private eventLocale;
686
776
  private rendered;
687
777
  private mode_;
688
778
  private tipEl;
@@ -716,6 +806,32 @@ declare class SeatingChart {
716
806
  * wrapper, which must be able to tell an integrator that the build they are
717
807
  * about to ship is pointed at a test event.
718
808
  */
809
+ /**
810
+ * The opt-in language switcher, offering exactly the languages the host
811
+ * named. Absent unless `languages` lists at least two — a menu with one
812
+ * entry is furniture, and an unrequested one duplicates the switcher a
813
+ * multilingual host site already has.
814
+ *
815
+ * Each language names itself (`LOCALE_NAMES`): a reader scanning for their
816
+ * own language finds "Deutsch", never "German". An English list is
817
+ * unreadable to exactly the people who need it.
818
+ */
819
+ private buildLanguageSwitcher;
820
+ /**
821
+ * Change the language of a LIVE chart, keeping the buyer's selection.
822
+ *
823
+ * `locale` is otherwise read once at render, which is fine for a page that
824
+ * knows its language up front and useless for one with a language switcher.
825
+ * The competing embed API can only `rerender()`, and that clears the
826
+ * selection — losing someone's seats because they changed language is not an
827
+ * acceptable trade, so this rebuilds the map through `refreshMapCopy()`,
828
+ * which restores the selection on the far side.
829
+ *
830
+ * Returns the locale that actually became active: an unsupported or
831
+ * not-yet-translated tag resolves to English rather than throwing, exactly as
832
+ * it does at first render.
833
+ */
834
+ setLocale(next: string | null | undefined): Promise<string>;
719
835
  getMode(): 'live' | 'test' | null;
720
836
  /** Current selection with prices resolved from the chart categories. */
721
837
  getSelection(): SelectedSeat[];
@@ -981,7 +1097,7 @@ type SeatingChartIdentityProp = (typeof SEATING_CHART_IDENTITY_PROPS)[number];
981
1097
  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
1098
  type SeatingChartValueProp = (typeof SEATING_CHART_VALUE_PROPS)[number];
983
1099
  /** 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"];
1100
+ 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
1101
  type SeatingChartCallbackProp = (typeof SEATING_CHART_CALLBACK_PROPS)[number];
986
1102
  /** The value half of the options, as a wrapper holds it. */
987
1103
  type SeatingChartValues = Pick<SeatingChartOptions, SeatingChartValueProp>;
@@ -1518,10 +1634,26 @@ interface SeatPickerOptions {
1518
1634
  /** Optional sale guards evaluated after every change and enforced before a
1519
1635
  * hold: minimum quantity, consecutive seats, and/or no stranded singles. */
1520
1636
  selectionValidators?: PickerSelectionValidator[];
1521
- /** BCP 47 language for the widget UI. Built-in: en, es, de, fr. */
1637
+ /**
1638
+ * BCP 47 language for the widget UI. 37 languages ship; omit this and each
1639
+ * buyer gets their own `navigator.languages`, falling back to English.
1640
+ * Read once at render — there is no way to change it on a live chart.
1641
+ */
1522
1642
  locale?: string;
1523
1643
  /** Per-key string overrides layered over the active locale. */
1524
1644
  messages?: Record<string, string>;
1645
+ /**
1646
+ * Show an in-picker language switcher offering exactly these languages.
1647
+ *
1648
+ * Opt-in and curated on purpose. Omit it and there is no control: the widget
1649
+ * sits inside someone else's page, and a multilingual host site already has
1650
+ * its own switcher — two that can disagree is worse than either alone. A
1651
+ * curated list also beats offering all 37: a German venue wants de/en/pl in
1652
+ * the menu, not Welsh.
1653
+ *
1654
+ * Switching keeps the buyer's selection; it does not re-render the chart.
1655
+ */
1656
+ languages?: string[];
1525
1657
  /** ISO 4217 currency fallback (the org/event currency on the chart wins). */
1526
1658
  currency?: string;
1527
1659
  /** Colorblind-safe rendering (Okabe-Ito palette, hollow booked seats). */
@@ -1783,6 +1915,22 @@ interface SeatPickerOptions {
1783
1915
  * widget has already dropped them from the tray.
1784
1916
  */
1785
1917
  onSelectedObjectUnavailable?: (event: SelectedObjectUnavailableEvent) => void;
1918
+ /**
1919
+ * A buyer tapped a general-admission area (on the map, or in the tray's
1920
+ * `Areas` list) and the widget is about to open its own quantity prompt.
1921
+ *
1922
+ * Return `true` to take the interaction over completely — the built-in
1923
+ * popover/sheet is suppressed, and the host drives the choice with whatever
1924
+ * UI it likes, landing the result through `prompt.confirm(quantity)` (a plain
1925
+ * number for a single-tier area, or `{ [tierId]: quantity }`) or dropping it
1926
+ * with `prompt.cancel()`. Return anything else (or nothing) and the built-in
1927
+ * prompt opens as usual, so this is also usable as a plain notification.
1928
+ *
1929
+ * `prompt.max` already folds in the area's live availability AND the
1930
+ * order-wide ticket cap minus everything chosen elsewhere; a `confirm` above
1931
+ * it is clamped rather than rejected.
1932
+ */
1933
+ onGAPrompt?: (prompt: GAPromptRequest) => boolean | void;
1786
1934
  onError?: (err: unknown) => void;
1787
1935
  }
1788
1936
 
@@ -1807,8 +1955,9 @@ interface SeatPickerOptions {
1807
1955
  * so plain host CSS can restyle too.
1808
1956
  */
1809
1957
 
1810
- declare class SeatPicker {
1811
- private readonly opts;
1958
+ declare class SeatPicker implements GaPromptPicker {
1959
+ /** @internal Read by pickerGaPrompt for the `onGAPrompt` host hook. */
1960
+ readonly opts: SeatPickerOptions;
1812
1961
  private readonly api;
1813
1962
  /** Authenticated view media, cached only for this picker lifetime. */
1814
1963
  private readonly buyerAssetUrls;
@@ -1820,17 +1969,17 @@ declare class SeatPicker {
1820
1969
  private accessEl;
1821
1970
  private readonly apiBase;
1822
1971
  private readonly controller;
1823
- private maxTickets;
1972
+ /** @internal */ maxTickets: number;
1824
1973
  /** Exact ticket count required before checkout; null keeps ordinary 1..max behavior. */
1825
1974
  private readonly exactTickets;
1826
1975
  private lastSelectionValidity;
1827
1976
  /** Original host pricing, kept separate from live server offer overrides. */
1828
1977
  private readonly hostPricing;
1829
- private root;
1978
+ /** @internal */ root: HTMLDivElement | null;
1830
1979
  private mapHost;
1831
1980
  private rendered;
1832
1981
  private destroyed;
1833
- private els;
1982
+ /** @internal */ els: Record<string, HTMLElement>;
1834
1983
  /** Feature 6 anchor regions — positioned flex containers over the map. */
1835
1984
  private regions;
1836
1985
  private ro;
@@ -1874,7 +2023,15 @@ declare class SeatPicker {
1874
2023
  private checkoutPanel;
1875
2024
  private extendEl;
1876
2025
  private bookedEl;
1877
- private gaQty;
2026
+ /** @internal Pending GA units per (area, tier) — see pickerGaPrompt.ts. */
2027
+ gaQty: GaQtyMap;
2028
+ /** @internal The open quantity prompt (popover or sheet), while one is up. */
2029
+ gaPromptEl: HTMLDivElement | null;
2030
+ /** @internal */ gaPromptReturnFocus: HTMLElement | null;
2031
+ /** @internal Whether the tray's collapsed `Areas` list is open. */
2032
+ gaAreasExpanded: boolean;
2033
+ /** Viewport point of the last map tap — anchors the GA popover. */
2034
+ private lastMapPoint;
1878
2035
  private tipEl;
1879
2036
  private tipPos;
1880
2037
  private confirmEl;
@@ -1883,7 +2040,7 @@ declare class SeatPicker {
1883
2040
  private tableDialog;
1884
2041
  private tableDialogHeld;
1885
2042
  private tableDialogReturnFocus;
1886
- private srEl;
2043
+ /** @internal */ srEl: HTMLDivElement | null;
1887
2044
  private baQty;
1888
2045
  private baCat;
1889
2046
  /** Optional navigation-zone scope for buyer best-available. */
@@ -1902,7 +2059,7 @@ declare class SeatPicker {
1902
2059
  private bestAvailableConfirm;
1903
2060
  private releasingHold;
1904
2061
  /** Event sales window is closed (read-only load state / live close). */
1905
- private salesClosed;
2062
+ /** @internal */ salesClosed: boolean;
1906
2063
  /** Every seated category's live availability is 0 (sold-out overlay is up). */
1907
2064
  private soldOut;
1908
2065
  private soldoutEl;
@@ -1951,6 +2108,8 @@ declare class SeatPicker {
1951
2108
  private secCardShownAt;
1952
2109
  /** Previous tray ticket count — first 0→n transition auto-expands the mobile sheet. */
1953
2110
  private lastTrayCount;
2111
+ /** The opt-in language switcher, when `languages` named at least two. */
2112
+ private langSel;
1954
2113
  /** Previous computed total — drives a single explanatory value bump. */
1955
2114
  private lastTrayTotal;
1956
2115
  /** Stable item keys prevent tray chips re-animating on unrelated realtime syncs. */
@@ -1961,6 +2120,8 @@ declare class SeatPicker {
1961
2120
  private holdingLabels;
1962
2121
  private ctaPhase;
1963
2122
  private a11yChipsEl;
2123
+ /** Rail scroll listener attached once; the rail repaints many times. */
2124
+ private railEdgesBound;
1964
2125
  private fsFallback;
1965
2126
  private fsChangeHandler;
1966
2127
  private fsEscHandler;
@@ -2099,7 +2260,9 @@ declare class SeatPicker {
2099
2260
  * unknown keys, so this collapses that to `fallback` — while still honoring a
2100
2261
  * host `messages` override (which makes `t()` return the override, not the key).
2101
2262
  */
2102
- private tf;
2263
+ /** @internal The host's GA prompt takeover, if it supplied one. */
2264
+ get onGAPromptHook(): SeatPickerOptions['onGAPrompt'];
2265
+ /** @internal */ tf(key: string, fallback: string): string;
2103
2266
  /** Sold-out overlay — an informational state with no unavailable action. */
2104
2267
  private buildSoldoutOverlay;
2105
2268
  /**
@@ -2140,7 +2303,7 @@ declare class SeatPicker {
2140
2303
  /** Read a resolved --sl-* token value (canvas needs a real color, not var()). */
2141
2304
  private cssVar;
2142
2305
  /** Motion is progressive enhancement; all state remains legible when reduced. */
2143
- private reducedMotion;
2306
+ /** @internal */ reducedMotion(): boolean;
2144
2307
  private scheduleMotion;
2145
2308
  /** Restart one finite CSS animation without leaving a permanent state class. */
2146
2309
  private animateOnce;
@@ -2151,14 +2314,10 @@ declare class SeatPicker {
2151
2314
  /** Update only the action affordance; selection callbacks must not refire. */
2152
2315
  private committedSelection;
2153
2316
  private pendingSelectionCount;
2154
- private heldGACounts;
2155
- private pendingGACount;
2156
2317
  private heldTicketCount;
2157
- private totalTicketCount;
2318
+ /** @internal */ totalTicketCount(): number;
2158
2319
  /** Held tickets and standing quantities consume the same order-wide cap. */
2159
2320
  private updateSelectionCapacity;
2160
- private canAddTicket;
2161
- private pendingGATotal;
2162
2321
  private syncCta;
2163
2322
  private setCtaPhase;
2164
2323
  /** Session-scoped capability key: isolated by API origin and event. */
@@ -2254,7 +2413,7 @@ declare class SeatPicker {
2254
2413
  */
2255
2414
  private openSeatView;
2256
2415
  private closeSeatView;
2257
- private money;
2416
+ /** @internal */ money(n: number): string;
2258
2417
  /**
2259
2418
  * Sleep until the offer schedule's next known transition, then re-read.
2260
2419
  *
@@ -2284,7 +2443,7 @@ declare class SeatPicker {
2284
2443
  * price the widget DISPLAYS or hands off must flow through here — a map
2285
2444
  * that shows one price while checkout charges another destroys trust.
2286
2445
  */
2287
- private paidPrice;
2446
+ /** @internal */ paidPrice(categoryKey: string | undefined, tierId: string | null | undefined, fallback: number, objectLabel?: string): number;
2288
2447
  /** The half of a legend's inputs the rail and the price list share, resolved
2289
2448
  * once so the two renderings cannot be given different answers. */
2290
2449
  private legendDeps;
@@ -2309,11 +2468,16 @@ declare class SeatPicker {
2309
2468
  private liveTimer;
2310
2469
  /** A live delta took one of OUR selected (not yet held) seats — evict + tell the buyer. */
2311
2470
  private evictTakenSelections;
2312
- private syncTray;
2471
+ /** @internal */ syncTray(): void;
2313
2472
  private emitSelectionValidity;
2314
2473
  /** Paint the bottom-sheet's collapsed one-liner (pickerTray.ts builds it). */
2315
2474
  private renderPeek;
2316
- private removeHeldLabel;
2475
+ /**
2476
+ * Release one buyer-visible held LINE. That is one label for a seat, and every
2477
+ * unit label behind a grouped GA line — a buyer who presses × on
2478
+ * "PIT · Adult ×2" means both of them, not one of two identical cards.
2479
+ */
2480
+ private removeHeldLabels;
2317
2481
  private handleChangeSeats;
2318
2482
  private handleCta;
2319
2483
  private startHoldTimer;
@@ -2366,7 +2530,10 @@ declare class SeatPicker {
2366
2530
  /** Assemble the stable {@link CheckoutHandoff} from a hold's server line items. */
2367
2531
  private buildHandoff;
2368
2532
  private emitHoldChange;
2369
- private toast;
2533
+ /** @internal */ toast(msg: string, tone?: 'neutral' | 'success' | 'warning' | 'error', action?: {
2534
+ label: string;
2535
+ onClick: () => void;
2536
+ }): void;
2370
2537
  private placeTooltip;
2371
2538
  /**
2372
2539
  * Row label without the redundant section prefix. Charts commonly name row
@@ -2413,6 +2580,12 @@ declare class SeatPicker {
2413
2580
  * colours have not changed; safe to call on every render.
2414
2581
  */
2415
2582
  setMapTheme(map: PickerMapTheme | null): void;
2583
+ /**
2584
+ * Chrome docked on the map follows the MAP's ground, not the picker's — see
2585
+ * resolveMapChromeTokens. The map ground resolves the way the renderer does:
2586
+ * host map override → chart theme → the picker's own background.
2587
+ */
2588
+ private applyMapChromeTokens;
2416
2589
  /**
2417
2590
  * Let a host suppress duplicate event identity after mount without remounting
2418
2591
  * the live picker (and therefore without disturbing a selection or hold).
@@ -2440,6 +2613,49 @@ declare class SeatPicker {
2440
2613
  * A no-op when the map is unchanged, so a host may call it on every poll.
2441
2614
  */
2442
2615
  setPricing(pricing: SeatPickerPricing | undefined): void;
2616
+ /**
2617
+ * The opt-in language switcher.
2618
+ *
2619
+ * Rendered only when `languages` resolves to at least two distinct locales.
2620
+ * Curated rather than all 37 on purpose — a German venue wants de/en/pl in
2621
+ * the menu, not Welsh — and absent by default, because a multilingual host
2622
+ * site already has its own switcher and two that can disagree is worse than
2623
+ * either alone.
2624
+ *
2625
+ * Each language names itself: a reader scanning for their own finds
2626
+ * "Deutsch", never "German". An English list is unreadable to exactly the
2627
+ * people who need it.
2628
+ */
2629
+ private buildLanguageSwitcher;
2630
+ /**
2631
+ * Change the language of a mounted picker, keeping the buyer's seats.
2632
+ *
2633
+ * `locale` is otherwise read once, before the chrome is built. That is fine
2634
+ * for a page that knows its language up front and useless for one with a
2635
+ * language switcher — and the competing embed API's only answer, `rerender()`,
2636
+ * clears the selection. Losing someone's held seats because they changed
2637
+ * language is not a trade worth making, so nothing here is destroyed and
2638
+ * rebuilt: the copy is re-applied in place.
2639
+ *
2640
+ * Three passes, because the picker's ~195 `tf()` sites fall into three kinds:
2641
+ *
2642
+ * 1. The skeleton's static labels and aria — set once inside one `innerHTML`
2643
+ * template. Re-applied from the `data-sl-*` markers on those nodes.
2644
+ * 2. The painters (tray, prices, CTA, offer, rails, rungs, floors) — these
2645
+ * already rebuild their HTML from `tf()` whenever state moves, so calling
2646
+ * them again is all it takes.
2647
+ * 3. Everything transient — toasts, dialogs, screen-reader announcements,
2648
+ * tooltips. Those read `tf()` at the moment they fire, so they are already
2649
+ * correct the next time they run and must NOT be forced now.
2650
+ *
2651
+ * The map is last and goes through the controller, because its labels are
2652
+ * baked into Konva `Text` at build time — a repaint would faithfully redraw
2653
+ * the old language.
2654
+ *
2655
+ * Returns the locale that actually became active; an unsupported or
2656
+ * untranslated tag resolves to English rather than throwing.
2657
+ */
2658
+ setLocale(next: string | null | undefined): Promise<string>;
2443
2659
  /** Current colorblind-safe render state, resolved from the stored buyer
2444
2660
  * preference at mount. Host chrome (e.g. the Designer preview) reads this to
2445
2661
  * surface the state rather than rendering colorblind colors silently. */
@@ -2591,4 +2807,4 @@ interface AttachPickerFrameOptions {
2591
2807
  */
2592
2808
  declare function attachPickerFrame(iframe: HTMLIFrameElement, opts?: AttachPickerFrameOptions): () => void;
2593
2809
 
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 };
2810
+ 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 };