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