@seatlayer/js 0.68.1 → 0.70.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,5 +1,7 @@
1
- import { PickerSeat, PickerGAArea, PickerSelectionValidator, PickerMapTheme, RendererViewMode, SeatHoverDetails, PickerSelectionValidity, SectionSummary, ChartTheme, LodRung, PickerTransport } from '@seatlayer/core';
1
+ import { PickerSeat, PickerGAArea, PickerSelectionValidator, PickerMapTheme, RendererViewMode, SeatHoverDetails, PickerSelectionValidity, SectionSummary, ChartTheme, LodRung, PickerTransport, PickerController, AccessibilityType, ExpandedSeat } from '@seatlayer/core';
2
2
  export { ExpandedSeat, PickerMapTheme, PickerSelectionValidator, PickerSelectionValidity, PickerSelectionViolation, RendererViewMode, SeatHoverDetails } from '@seatlayer/core';
3
+ import * as _seatlayer_core_core_seatConfidence from '@seatlayer/core/core/seatConfidence';
4
+ import { Venue3DHandle } from '@seatlayer/core/view3d';
3
5
  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
6
 
5
7
  /**
@@ -970,6 +972,7 @@ declare class SeatingChart {
970
972
  /** Null for the ordinary public chart — the tokenless path is untouched. */
971
973
  private readonly access;
972
974
  private readonly api;
975
+ private readonly apiBase;
973
976
  private readonly buyerAssetUrls;
974
977
  private readonly immersive;
975
978
  private realtime;
@@ -1786,6 +1789,20 @@ interface SeatPickerBuyerViewOptions {
1786
1789
  }
1787
1790
  /** Host theme overrides — any subset; unset keys fall back to the org's chart theme, then defaults. */
1788
1791
  interface SeatPickerTheme {
1792
+ /**
1793
+ * Light, dark, or follow the reader's own `prefers-color-scheme`.
1794
+ *
1795
+ * OPT-IN. Omit it and the widget renders exactly what it always did: the
1796
+ * chart's authored ground, the organizer's colours, your own overrides. Set
1797
+ * it and the built-in token set for that side takes the GROUND roles —
1798
+ * background, surface, ink, muted ink, hairlines, and the drawn map's own
1799
+ * canvas — while the organizer's accent, font, radius and logo, and every
1800
+ * colour you state explicitly below, stay exactly as they are.
1801
+ *
1802
+ * `'auto'` is re-read live: a buyer who flips their phone into dark mode
1803
+ * mid-purchase keeps their seats and their hold.
1804
+ */
1805
+ mode?: ThemeMode;
1789
1806
  /** Brand accent (CTA, active chips, hold pill). */
1790
1807
  accent?: string;
1791
1808
  /** Ink on the accent (button labels). */
@@ -1913,6 +1930,13 @@ interface SeatPickerOptions {
1913
1930
  currency?: string;
1914
1931
  /** Colorblind-safe rendering (Okabe-Ito palette, hollow booked seats). */
1915
1932
  colorblindSafe?: boolean;
1933
+ /**
1934
+ * How a big chart's seats arrive: 'progressive' (default) shows the venue's
1935
+ * sections as soon as the chart lands and fills the seats in a section at a
1936
+ * time, nearest the viewport first; 'plain' builds the whole scene in one
1937
+ * step. Small charts are built in one step either way.
1938
+ */
1939
+ loadingReveal?: 'progressive' | 'plain';
1916
1940
  /** Initial map projection. Buyers now toggle **Map (flat 2D) + 3D** only; the
1917
1941
  * legacy `perspective` (2.5D) value is still ACCEPTED for source compatibility
1918
1942
  * but is deprecated — it is coerced to `flat` with a one-time console warning.
@@ -1952,6 +1976,16 @@ interface SeatPickerOptions {
1952
1976
  * with `{ surface: 'buyer' }` merged into the props. A throwing sink never
1953
1977
  * breaks the widget. Route it to your product analytics (e.g. PostHog). */
1954
1978
  onAnalytics?: (event: string, props: Record<string, unknown>) => void;
1979
+ /**
1980
+ * Every seat of a progressively revealed chart is now built and painted.
1981
+ *
1982
+ * `render()` resolves with the section shells and the nearest seats — the
1983
+ * rest arrive in idle slices. A host that needs "the whole venue is on
1984
+ * screen" waits for this rather than for `render()`. Fires exactly once per
1985
+ * chart, and never for a chart small enough to build in one step (there is
1986
+ * nothing to wait for: `render()` already was that moment).
1987
+ */
1988
+ onSeatsRevealed?: () => void;
1955
1989
  /**
1956
1990
  * Optional organiser-defined campaign/referral label (max 120 characters).
1957
1991
  * On the public SeatLayer transport it is frozen onto the hold, then copied
@@ -2199,30 +2233,56 @@ interface SeatPickerOptions {
2199
2233
  }
2200
2234
 
2201
2235
  /**
2202
- * SeatPicker — the full buyer experience as a widget.
2236
+ * pickerTheme — the widget's colour math: parse a CSS colour a host or a chart
2237
+ * authored, judge its contrast, and resolve the `--sl-*` token set the
2238
+ * stylesheet reads.
2203
2239
  *
2204
- * Where `SeatingChart` is canvas-only, SeatPicker owns the complete chrome
2205
- * from the canonical UX contract: branded header,
2206
- * live price panel, selection tray with GA steppers, hold countdown, snipe
2207
- * toasts and expiry recovery — all on top of the shared PickerController, so
2208
- * every host gets the whole experience with one mount.
2209
- *
2210
- * Render contexts (owner requirement): the SAME widget adapts to a full-screen
2211
- * takeover, an inline <div> in a content page, or a popup — breakpoints key
2212
- * off the CONTAINER via ResizeObserver, never the viewport. `SeatPicker.open()`
2213
- * mounts a document-level modal (scrim, ESC, focus restore) in one call.
2240
+ * Parsing remains widget-owned because host tokens may use the widget's
2241
+ * tolerated CSS forms. Once parsed, luminance and RGB serialization delegate
2242
+ * to the shared core colour primitives so contrast math has one definition.
2243
+ */
2244
+
2245
+ /**
2246
+ * Light, dark, or follow the reader.
2214
2247
  *
2215
- * Theming (owner requirement): org account customization flows automatically
2216
- * the chart payload's ChartTheme (accent, accentInk, logoUrl, brand name,
2217
- * fontFamily, …) seeds the look; the host `theme` option overrides any subset;
2218
- * and every value lands as a `--sl-*` CSS custom property on the widget root
2219
- * so plain host CSS can restyle too.
2248
+ * `auto` is the viewer's own `prefers-color-scheme`, re-read live: a buyer who
2249
+ * flips their phone into dark mode mid-purchase should not have to reload a
2250
+ * page that is holding their seats.
2251
+ */
2252
+ type ThemeMode = 'light' | 'dark' | 'auto';
2253
+
2254
+ /** What the saved-seat comparison chip needs from the widget around it. */
2255
+ interface CompareChipHost {
2256
+ /** The live 3D overlay the chip mounts into, or null when 3D is down. */
2257
+ overlay(): HTMLElement | null;
2258
+ /** Seat ids currently saved for comparison (0, 1 or 2 of them). */
2259
+ savedSeatIds(): string[];
2260
+ /** Open the two-seat comparison surface. */
2261
+ openComparison(): void;
2262
+ /** Drop every saved seat and tear the comparison down. */
2263
+ clearComparison(): void;
2264
+ toast(msg: string, tone?: 'neutral' | 'success' | 'warning' | 'error'): void;
2265
+ }
2266
+ /**
2267
+ * The "N seats saved" chip pinned inside the 3D overlay. `sync()` is
2268
+ * idempotent: it builds the chip on first need, updates its label after, and
2269
+ * removes it once nothing is saved (or the overlay is gone).
2220
2270
  */
2271
+ declare class View3dCompareChip {
2272
+ private readonly host;
2273
+ private chip;
2274
+ constructor(host: CompareChipHost);
2275
+ sync(): void;
2276
+ /** Drop the chip element (3D teardown). Saved ids are the host's to clear. */
2277
+ remove(): void;
2278
+ /** The chip's primary button — a focus target when an overlay above it closes. */
2279
+ mainButton(): HTMLElement | null;
2280
+ }
2221
2281
 
2222
2282
  declare class SeatPicker implements GaPromptPicker {
2223
2283
  /** @internal Read by pickerGaPrompt for the `onGAPrompt` host hook. */
2224
2284
  readonly opts: SeatPickerOptions;
2225
- private readonly api;
2285
+ /** @internal */ readonly api: PickerTransport;
2226
2286
  /** Authenticated view media, cached only for this picker lifetime. */
2227
2287
  private readonly buyerAssetUrls;
2228
2288
  /** Our own public client, or null when the host injected a transport. */
@@ -2232,7 +2292,7 @@ declare class SeatPicker implements GaPromptPicker {
2232
2292
  private realtime;
2233
2293
  private accessEl;
2234
2294
  private readonly apiBase;
2235
- private readonly controller;
2295
+ /** @internal */ readonly controller: PickerController;
2236
2296
  /** @internal */ maxTickets: number;
2237
2297
  /** Exact ticket count required before checkout; null keeps ordinary 1..max behavior. */
2238
2298
  private readonly exactTickets;
@@ -2246,6 +2306,9 @@ declare class SeatPicker implements GaPromptPicker {
2246
2306
  private mapHost;
2247
2307
  private rendered;
2248
2308
  private destroyed;
2309
+ /** Bumped on every locale REQUEST, so a load that resolves late can tell it
2310
+ * is no longer the one asked for. See {@link applyActiveLocale}. */
2311
+ private localeGeneration;
2249
2312
  /** @internal */ els: Record<string, HTMLElement>;
2250
2313
  /** Feature 6 anchor regions — positioned flex containers over the map. */
2251
2314
  private regions;
@@ -2305,8 +2368,18 @@ declare class SeatPicker implements GaPromptPicker {
2305
2368
  private tipPinned;
2306
2369
  private tipMarkedHoverLabel;
2307
2370
  private lastPointerType;
2308
- private confirmEl;
2371
+ /** @internal */ confirmEl: HTMLDivElement | null;
2372
+ /** Light / dark / auto, or null when the widget is not managing a mode at
2373
+ * all — which is the default, and is byte-for-byte the old behaviour. */
2374
+ private themeMode;
2375
+ /** Live `prefers-color-scheme` subscription, held only while mode is auto. */
2376
+ private colorSchemeStop;
2377
+ /** The progressive reveal has finished for the chart currently mounted, and
2378
+ * the closure that says so once the render facts exist to say it with. */
2379
+ private seatsRevealed;
2380
+ private seatsRevealedReport;
2309
2381
  private confirmSeat;
2382
+ private suppressConfirmationSeatId;
2310
2383
  private tableDialogEl;
2311
2384
  private tableDialog;
2312
2385
  private tableDialogHeld;
@@ -2339,8 +2412,8 @@ declare class SeatPicker implements GaPromptPicker {
2339
2412
  private rungsEl;
2340
2413
  private projectionEl;
2341
2414
  private buyerView;
2342
- private view3dEl;
2343
- private view3dHandle;
2415
+ /** @internal */ view3dEl: HTMLDivElement | null;
2416
+ /** @internal */ view3dHandle: Venue3DHandle | null;
2344
2417
  /** Monotonic token so a stale async mount (buyer left before OGL finished
2345
2418
  * loading) never installs its handle over a newer state. */
2346
2419
  private view3dGen;
@@ -2350,15 +2423,15 @@ declare class SeatPicker implements GaPromptPicker {
2350
2423
  * fixed seat-eye state. It lets Back unwind one step before leaving 3D. */
2351
2424
  private view3dTargetSeatId;
2352
2425
  /** Inspection-only comparison. These ids never represent cart selection. */
2353
- private view3dCompareSeatIds;
2426
+ /** @internal */ view3dCompareSeatIds: string[];
2354
2427
  /** The saved-seat comparison chip — owned by pickerView3dNav.ts. */
2355
- private readonly view3dCompareChip;
2356
- private view3dCompareEl;
2357
- private view3dCompareCleanup;
2358
- private view3dPassportEl;
2359
- private view3dPassportCleanup;
2428
+ /** @internal */ readonly view3dCompareChip: View3dCompareChip;
2429
+ /** @internal */ view3dCompareEl: HTMLDivElement | null;
2430
+ /** @internal */ view3dCompareCleanup: (() => void) | null;
2431
+ private view3dSeatViewChrome;
2432
+ /** @internal */ view3dPassportEl: HTMLDivElement | null;
2433
+ /** @internal */ view3dPassportCleanup: (() => void) | null;
2360
2434
  private floorsEl;
2361
- private secCardEl;
2362
2435
  private viewEl;
2363
2436
  private viewCleanup;
2364
2437
  /** Supersedes an older authored-view byte request when another seat is opened. */
@@ -2371,12 +2444,14 @@ declare class SeatPicker implements GaPromptPicker {
2371
2444
  /** "Hide limited-view seats" — mirrored into 3D by `seatState3dFor`. */
2372
2445
  private limitedViewFilter;
2373
2446
  private pricesExpanded;
2447
+ /** The section card owns its element, collapse state and shown-at clock. */
2448
+ private sectionCardCache;
2374
2449
  /** Last surfaced section summary (re-rendered when the price band changes). */
2375
- private lastSection;
2376
- /** Section card collapsed to its slim pill (seat-picking has begun). */
2377
- private secCardCollapsed;
2378
- /** When the card was (re)shown — the focus glide's own view change must not collapse it. */
2379
- private secCardShownAt;
2450
+ /** The tapped section the card is holding. A facade over the card in both
2451
+ * directions: reading it must not build chrome, and writing it must not
2452
+ * repaint — see SectionCard.adopt. */
2453
+ private get lastSection();
2454
+ private set lastSection(value);
2380
2455
  /** Previous tray ticket count — first 0→n transition auto-expands the mobile sheet. */
2381
2456
  private lastTrayCount;
2382
2457
  /** The opt-in language switcher, when `languages` named at least two. */
@@ -2390,7 +2465,8 @@ declare class SeatPicker implements GaPromptPicker {
2390
2465
  /** Selected labels awaiting the hold response; their own realtime echo can arrive first. */
2391
2466
  private holdingLabels;
2392
2467
  private ctaPhase;
2393
- private a11yChipsEl;
2468
+ /** The ♿ control and its menu — one node, in the map's bottom-left corner. */
2469
+ private a11yMenu;
2394
2470
  /** Rail scroll listener attached once; the rail repaints many times. */
2395
2471
  private railEdgesBound;
2396
2472
  private fsFallback;
@@ -2420,6 +2496,16 @@ declare class SeatPicker implements GaPromptPicker {
2420
2496
  * (OV-52)
2421
2497
  */
2422
2498
  private confirmThumbHtml;
2499
+ /**
2500
+ * The reference the card's thumbnail would load, or null when there is none
2501
+ * the buyer-media policy will hand back.
2502
+ *
2503
+ * The same predicate `BuyerAssetObjectUrls.resolve` applies, asked BEFORE the
2504
+ * markup is built rather than after the fetch fails — which is the difference
2505
+ * between a card that never shows a frame and one that shows a frame and then
2506
+ * takes it away.
2507
+ */
2508
+ private deliverableViewReference;
2423
2509
  /** True when the picker is rendered inside an iframe (snippet embed at /e/:key). */
2424
2510
  private isFramed;
2425
2511
  /** Post a widget→host message only when the browser identifies its origin. */
@@ -2473,6 +2559,17 @@ declare class SeatPicker implements GaPromptPicker {
2473
2559
  render(): Promise<this>;
2474
2560
  /** Wire host chrome after the skeleton exists and before the renderer owns its map host. */
2475
2561
  private wireBuyerShell;
2562
+ /**
2563
+ * Put the phone sheet back to its peek.
2564
+ *
2565
+ * THE MAP IS THE PRODUCT, and a buyer who reaches past an open sheet to tap
2566
+ * the venue has already said which one they want to look at. Called from the
2567
+ * renderer's own tap callbacks — never from raw pointer events, so a pan or a
2568
+ * pinch that happens to end over a seat is not mistaken for a tap.
2569
+ *
2570
+ * @internal
2571
+ */
2572
+ collapseSheet(): void;
2476
2573
  /** Observe the host container rather than the viewport; embeds resize independently. */
2477
2574
  private observeLayout;
2478
2575
  /** Render the shared controller into the already-mounted canvas host. */
@@ -2503,6 +2600,18 @@ declare class SeatPicker implements GaPromptPicker {
2503
2600
  setPanelCollapsed(collapsed: boolean): void;
2504
2601
  /** Idempotent DOM apply, also run on every layout flip (inert must lift on narrow). */
2505
2602
  private applyPanelCollapsed;
2603
+ /** Build the ♿ menu (filter + limited view + palette) into the map's
2604
+ * bottom-left corner. The menu owns its own state machine; see the module. */
2605
+ private buildAccessibilityMenu;
2606
+ /**
2607
+ * Jump to the seats rung when a dimming filter turns on — the dimming only
2608
+ * renders at seat detail, so applying it zoomed out would silently change
2609
+ * seats the buyer cannot see.
2610
+ */
2611
+ private focusSeatsForFilter;
2612
+ /** Turn the buyer's accessibility filter on or off from host code. Mirrors
2613
+ * the bridge command and the menu, so the three never diverge. */
2614
+ setAccessibilityFilter(types: AccessibilityType[] | null): void;
2506
2615
  private dockLayoutChrome;
2507
2616
  /** The "Need more time?" prompt shown in the hold's final EXTEND_PROMPT_MS. */
2508
2617
  private buildExtendPrompt;
@@ -2608,8 +2717,15 @@ declare class SeatPicker implements GaPromptPicker {
2608
2717
  private max3dSeats;
2609
2718
  /** Reflect the active floor onto the switcher rail. */
2610
2719
  private syncFloors;
2720
+ /** The tapped-section summary card in all three of its forms. Built lazily:
2721
+ * it reads `els`/`root`, which are assigned after construction. */
2722
+ private get sectionCard();
2611
2723
  /** Show (or clear, on null) the tapped-section summary card. */
2612
2724
  private showSectionCard;
2725
+ private renderSectionCard;
2726
+ private collapseSectionCard;
2727
+ private sectionCardOnView;
2728
+ private fitSectionStripCount;
2613
2729
  /**
2614
2730
  * Open sections next to the focused one, in authored order.
2615
2731
  *
@@ -2619,23 +2735,6 @@ declare class SeatPicker implements GaPromptPicker {
2619
2735
  * are skipped because focusing one cannot produce a useful buyer card.
2620
2736
  */
2621
2737
  private sectionNeighbours;
2622
- private wireSectionNavigation;
2623
- /**
2624
- * Render the section card in the form the layout + state want: expanded card
2625
- * or slim pill in the top-center anchor region (wide), or a compact strip in
2626
- * the sheet head (narrow). Never floats over the seats at the tap point.
2627
- */
2628
- private renderSectionCard;
2629
- /** Collapse the expanded card to its slim pill (seat-picking started). */
2630
- private collapseSectionCard;
2631
- /**
2632
- * onViewChange hook for the card. The focus glide's own settle (within the
2633
- * grace window) enforces the ~25% coverage rule with the FINAL viewport; any
2634
- * later pan/zoom means seat-picking has begun → collapse to the pill.
2635
- */
2636
- private sectionCardOnView;
2637
- /** Fraction of the focused section's on-screen bbox covered by the card. */
2638
- private sectionCardCoverage;
2639
2738
  /**
2640
2739
  * The polite-live sentence for a partly-available seat, or '' for any other.
2641
2740
  *
@@ -2650,7 +2749,7 @@ declare class SeatPicker implements GaPromptPicker {
2650
2749
  private confirmTableDialog;
2651
2750
  private cancelTableDialog;
2652
2751
  private dismissTableDialog;
2653
- private showConfirm;
2752
+ /** @internal */ showConfirm(seat: ExpandedSeat): void;
2654
2753
  private reanchorConfirm;
2655
2754
  private dismissConfirm;
2656
2755
  private commitConfirm;
@@ -2658,7 +2757,7 @@ declare class SeatPicker implements GaPromptPicker {
2658
2757
  private closeConfirm;
2659
2758
  private seatViewEnabled;
2660
2759
  /** Every bookable seat (cached) — neighbor heads for the generated panorama. */
2661
- private allSeats;
2760
+ /** @internal */ allSeats(): ExpandedSeat[];
2662
2761
  /**
2663
2762
  * Open the drag-to-look-around 360° preview for a seat. Uses the organizer's
2664
2763
  * uploaded photo (seat.viewUrl) when present, else a panorama generated from
@@ -2802,6 +2901,8 @@ declare class SeatPicker implements GaPromptPicker {
2802
2901
  label: string;
2803
2902
  onClick: () => void;
2804
2903
  }): void;
2904
+ /** Loading silhouette → real venue. The sequence lives in pickerBootReveal. */
2905
+ private dismissSkeleton;
2805
2906
  private placeTooltip;
2806
2907
  /**
2807
2908
  * The Performance Group night strip for a two-tone seat.
@@ -2812,9 +2913,17 @@ declare class SeatPicker implements GaPromptPicker {
2812
2913
  * group whose wrapper did not supply the nights.
2813
2914
  */
2814
2915
  private nightStripFor;
2815
- /** Close a tapped-open card. Safe to call when nothing is pinned. */
2916
+ /**
2917
+ * Why a tapped seat cannot be taken, or '' when it can.
2918
+ *
2919
+ * Only the PRESS path asks for this — a mouse already has the status tag and
2920
+ * a card that follows the pointer, so a sentence under every hover would be
2921
+ * noise. A partly-available group seat is excluded: its night strip already
2922
+ * names the exact nights that block it, and "already booked" would flatly
2923
+ * contradict the row underneath saying it is free on Friday.
2924
+ */
2925
+ private unavailableReason;
2816
2926
  private unpinTooltip;
2817
- /** A press outside the card dismisses it; its own controls must reach click. */
2818
2927
  private handleMapPointerDown;
2819
2928
  private updateTooltip;
2820
2929
  /**
@@ -2830,6 +2939,7 @@ declare class SeatPicker implements GaPromptPicker {
2830
2939
  getSelection(): PickerSeat[];
2831
2940
  /** Select free objects by engine id or public label. */
2832
2941
  selectObjects(objects: string[]): PickerSeat[];
2942
+ selectObjectsWithoutConfirmation(objects: string[]): PickerSeat[];
2833
2943
  /** Deselect objects by engine id or public label. */
2834
2944
  deselectObjects(objects: string[]): void;
2835
2945
  /** Clear every unheld selection. */
@@ -2873,10 +2983,42 @@ declare class SeatPicker implements GaPromptPicker {
2873
2983
  * colours have not changed; safe to call on every render.
2874
2984
  */
2875
2985
  setMapTheme(map: PickerMapTheme | null): void;
2986
+ /**
2987
+ * Write the resolved `--sl-*` tokens onto the root, and stamp `data-theme`.
2988
+ *
2989
+ * `data-theme` is not read by the widget's own stylesheet — every rule spends
2990
+ * tokens. It is there for the HOST: a page wrapping the picker needs to know
2991
+ * which side the widget settled on to match its own chrome, and reading it
2992
+ * off an attribute is cheaper and more reliable than re-deriving the
2993
+ * luminance of a custom property. Absent when no mode is managed, so a host
2994
+ * can tell "dark" from "not asked".
2995
+ */
2996
+ private applyThemeTokens;
2997
+ /** Follow `prefers-color-scheme` only while the mode actually is `auto`. */
2998
+ private watchThemeMode;
2999
+ /**
3000
+ * Re-ink everything a mode owns, WITHOUT touching the buyer's selection.
3001
+ *
3002
+ * The canvas half goes through the controller's `setMapTheme`, which rebuilds
3003
+ * from the chart already in memory and restores the selection — so a reader
3004
+ * flipping their phone into dark mode mid-purchase keeps their seats, their
3005
+ * hold and their place on the map. No round trip is spent.
3006
+ */
3007
+ private repaintForThemeMode;
3008
+ /**
3009
+ * Switch the widget between light, dark and the reader's own preference
3010
+ * after mount. `null` hands the colours back to the chart and the host.
3011
+ *
3012
+ * Selection-safe by construction — see {@link repaintForThemeMode}.
3013
+ */
3014
+ setThemeMode(mode: ThemeMode | null): void;
3015
+ /** The mode the host asked for — `'auto'`, not what `auto` resolved to. */
3016
+ getThemeMode(): ThemeMode | null;
2876
3017
  /**
2877
3018
  * Chrome docked on the map follows the MAP's ground, not the picker's — see
2878
3019
  * resolveMapChromeTokens. The map ground resolves the way the renderer does:
2879
- * host map override → chart theme → the picker's own background.
3020
+ * host map override → the mode's ground → chart theme → the picker's own
3021
+ * background — the same ladder the canvas itself is painted from.
2880
3022
  */
2881
3023
  private applyMapChromeTokens;
2882
3024
  /**
@@ -2906,19 +3048,7 @@ declare class SeatPicker implements GaPromptPicker {
2906
3048
  * A no-op when the map is unchanged, so a host may call it on every poll.
2907
3049
  */
2908
3050
  setPricing(pricing: SeatPickerPricing | undefined): void;
2909
- /**
2910
- * The opt-in language switcher.
2911
- *
2912
- * Rendered only when `languages` resolves to at least two distinct locales.
2913
- * Curated rather than all 37 on purpose — a German venue wants de/en/pl in
2914
- * the menu, not Welsh — and absent by default, because a multilingual host
2915
- * site already has its own switcher and two that can disagree is worse than
2916
- * either alone.
2917
- *
2918
- * Each language names itself: a reader scanning for their own finds
2919
- * "Deutsch", never "German". An English list is unreadable to exactly the
2920
- * people who need it.
2921
- */
3051
+ /** The opt-in language switcher — see `pickerLocaleBoot.buildLanguageSwitcher`. */
2922
3052
  private buildLanguageSwitcher;
2923
3053
  /**
2924
3054
  * Change the language of a mounted picker, keeping the buyer's seats.
@@ -2930,25 +3060,29 @@ declare class SeatPicker implements GaPromptPicker {
2930
3060
  * language is not a trade worth making, so nothing here is destroyed and
2931
3061
  * rebuilt: the copy is re-applied in place.
2932
3062
  *
2933
- * Three passes, because the picker's ~195 `tf()` sites fall into three kinds:
2934
- *
2935
- * 1. The skeleton's static labels and aria — set once inside one `innerHTML`
2936
- * template. Re-applied from the `data-sl-*` markers on those nodes.
2937
- * 2. The painters (tray, prices, CTA, offer, rails, rungs, floors) — these
2938
- * already rebuild their HTML from `tf()` whenever state moves, so calling
2939
- * them again is all it takes.
2940
- * 3. Everything transient — toasts, dialogs, screen-reader announcements,
2941
- * tooltips. Those read `tf()` at the moment they fire, so they are already
2942
- * correct the next time they run and must NOT be forced now.
2943
- *
2944
- * The map is last and goes through the controller, because its labels are
2945
- * baked into Konva `Text` at build time — a repaint would faithfully redraw
2946
- * the old language.
3063
+ * `relanguagePicker` in pickerLocaleBoot.ts holds the three passes the copy
3064
+ * on screen needs and the order they have to run in.
2947
3065
  *
2948
3066
  * Returns the locale that actually became active; an unsupported or
2949
3067
  * untranslated tag resolves to English rather than throwing.
2950
3068
  */
2951
3069
  setLocale(next: string | null | undefined): Promise<string>;
3070
+ /**
3071
+ * Re-say everything already on screen in the now-active locale.
3072
+ *
3073
+ * Split out of {@link setLocale} because two paths reach it: an explicit
3074
+ * language change, and the boot dictionary landing after first paint (see
3075
+ * `pickerLocaleBoot.ts`). Both have exactly the same work to do, and the
3076
+ * second one is the reason `render()` no longer waits for a locale fetch.
3077
+ *
3078
+ * `generation` fences out a stale winner. Several locale loads can be in
3079
+ * flight at once — the boot fetch, the event's own language arriving with the
3080
+ * chart, a buyer using the language switcher — and they resolve in whatever
3081
+ * order the network chooses. Without the fence the LAST to arrive wins rather
3082
+ * than the last to be ASKED for, which is how a buyer who picks French ends
3083
+ * up reading the organizer's German.
3084
+ */
3085
+ private applyActiveLocale;
2952
3086
  /** Current colorblind-safe render state, resolved from the stored buyer
2953
3087
  * preference at mount. Host chrome (e.g. the Designer preview) reads this to
2954
3088
  * surface the state rather than rendering colorblind colors silently. */
@@ -2998,16 +3132,18 @@ declare class SeatPicker implements GaPromptPicker {
2998
3132
  * preserved inside the module). Cheap enough per status delta. */
2999
3133
  private pushAvailabilityTo3d;
3000
3134
  /** Mirror the authoritative widget selection into the 3D handle. */
3001
- private syncSelectionTo3d;
3135
+ /** @internal */ syncSelectionTo3d(): void;
3002
3136
  /** Build the view-from-seat panorama the cinematic dissolves into — reuses the
3003
3137
  * exact input path as the 2D `openSeatView` (organizer photo, else generated). */
3004
3138
  private seatViewFor3d;
3005
3139
  /** Route decoupled analytics into the host callback, tagged buyer. */
3006
3140
  private emitAnalytics;
3007
- private emit3dAnalytics;
3141
+ /** @internal */ emit3dAnalytics(event: string, props?: Record<string, unknown>): void;
3008
3142
  /** A 3D seat tap runs the SAME selection path as a 2D tap: toggle through the
3009
3143
  * controller, then raise the shared confirm card (bottom-sheeted in 3D). */
3010
3144
  private onView3dSeatPick;
3145
+ /** The arrival caption for a seat-eye landing; assembled in pickerSeatViewChrome. */
3146
+ private seatViewCaption;
3011
3147
  /** Explain a 3D seat that INVENTORY refuses — never one the buyer's own
3012
3148
  * filters merely dimmed, which stays buyable exactly as it is in 2D. Category
3013
3149
  * colour remains visible in the venue; this card names the availability state
@@ -3015,14 +3151,26 @@ declare class SeatPicker implements GaPromptPicker {
3015
3151
  private showUnavailable3dSeat;
3016
3152
  private dismissUnavailable3dSeat;
3017
3153
  private saveView3dComparisonSeat;
3018
- private clearView3dComparison;
3019
- private view3dComparisonSnapshot;
3154
+ /** @internal */ clearView3dComparison(): void;
3155
+ /** @internal */ view3dComparisonSnapshot(seatId: string): {
3156
+ seat: ExpandedSeat;
3157
+ label: string;
3158
+ section: string;
3159
+ row: string;
3160
+ category: string;
3161
+ price: string;
3162
+ availability: string;
3163
+ selectable: boolean;
3164
+ viewSource: string;
3165
+ limited: string;
3166
+ accessibility: string;
3167
+ confidence: _seatlayer_core_core_seatConfidence.SeatConfidenceDisclosure;
3168
+ } | null;
3169
+ /** The two dialogs INSIDE the 3D overlay — see pickerView3dModals.ts. */
3020
3170
  private openSeatConfidencePassport;
3021
- private reportSeatConfidenceView;
3022
3171
  private closeSeatConfidencePassport;
3023
3172
  private openView3dComparison;
3024
3173
  private closeView3dComparison;
3025
- private selectComparedSeat;
3026
3174
  private enter3d;
3027
3175
  private exit3d;
3028
3176
  /** Current active/restored hold reflected in the tray. */
@@ -3227,6 +3375,8 @@ interface PerformanceGroupPickerOptions {
3227
3375
  view: SeatPickerBuyerView;
3228
3376
  seatId?: string;
3229
3377
  }) => void;
3378
+ /** Receives the underlying chart journey with Performance Group identity attached. */
3379
+ onAnalytics?: (event: string, props: Record<string, unknown>) => void;
3230
3380
  hideBadge?: boolean;
3231
3381
  theme?: SeatPickerTheme;
3232
3382
  holdTtlMs?: number;
@@ -3292,6 +3442,9 @@ declare class PerformanceGroupPicker {
3292
3442
  private datesSummaryHost;
3293
3443
  private datesCardsHost;
3294
3444
  private resettingFlexibleSelection;
3445
+ private selectingPartialSeat;
3446
+ /** The free dates advertised by a two-tone seat before the chart is narrowed. */
3447
+ private readonly partialSeatDates;
3295
3448
  /** Labels pushed at the renderer on the last pull, so departures clear. */
3296
3449
  private markedLabels;
3297
3450
  private holdTicker;
@@ -3391,6 +3544,7 @@ declare class PerformanceGroupPicker {
3391
3544
  private syncIncludedDates;
3392
3545
  /** Turn one two-tone seat into a normal selection without changing charts. */
3393
3546
  private selectPartialSeat;
3547
+ private applySeatDates;
3394
3548
  /** One tick a second while a hold is live, so the countdown line is true. */
3395
3549
  private syncHoldTicker;
3396
3550
  /**
@@ -3611,4 +3765,4 @@ interface AttachPickerFrameOptions {
3611
3765
  */
3612
3766
  declare function attachPickerFrame(iframe: HTMLIFrameElement, opts?: AttachPickerFrameOptions): () => void;
3613
3767
 
3614
- 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 PerformanceGroupAvailability, type PerformanceGroupCheckoutHandoff, type PerformanceGroupDescriptor, PerformanceGroupDestroyedError, type PerformanceGroupHold, type PerformanceGroupHoldAllocation, type PerformanceGroupOperationEvent, type PerformanceGroupOperationState, PerformanceGroupPicker, type PerformanceGroupPickerOptions, type PerformanceGroupRecoveryState, type PerformanceGroupSeatAllocation, type PerformanceGroupSelectionMode, type PerformanceGroupStatusEvent, 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, SeasonApiError, type SeasonAvailability, type SeasonCheckoutHandoff, type SeasonDescriptor, type SeasonOperation, type SeasonOperationState, SeasonPicker, type SeasonPickerOptions, SeasonRecoveryTimeoutError, type SeasonRenewalIntent, type SeasonStatusEvent, 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, shortOperationReference, ticketOfferPrices };
3768
+ 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 PerformanceGroupAvailability, type PerformanceGroupCheckoutHandoff, type PerformanceGroupDescriptor, PerformanceGroupDestroyedError, type PerformanceGroupHold, type PerformanceGroupHoldAllocation, type PerformanceGroupOperationEvent, type PerformanceGroupOperationState, PerformanceGroupPicker, type PerformanceGroupPickerOptions, type PerformanceGroupRecoveryState, type PerformanceGroupSeatAllocation, type PerformanceGroupSelectionMode, type PerformanceGroupStatusEvent, 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, SeasonApiError, type SeasonAvailability, type SeasonCheckoutHandoff, type SeasonDescriptor, type SeasonOperation, type SeasonOperationState, SeasonPicker, type SeasonPickerOptions, SeasonRecoveryTimeoutError, type SeasonRenewalIntent, type SeasonStatusEvent, 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 ThemeMode, type TicketOfferAvailability, type TicketOfferPrice, type TicketOfferSummary, attachPickerFrame, bindSeatingChartHandle, buildSeatingChartOptions, createBuyerAccessContext, createControllerSink, parseTicketOfferAvailability, shortOperationReference, ticketOfferPrices };