@seatlayer/js 0.18.1 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { PickerSeat, SeatHoverDetails, PickerTransport, ChartDoc, ChartTheme, ExpandedSeat } from '@seatlayer/core';
1
+ import { PickerSeat, SeatHoverDetails, PickerTransport, ChartDoc, AvailabilityRule, ChartTheme, ExpandedSeat } from '@seatlayer/core';
2
2
  export { ExpandedSeat, SeatHoverDetails } from '@seatlayer/core';
3
3
 
4
4
  /**
@@ -254,6 +254,12 @@ interface EmbeddedDesignerOptions {
254
254
  * Only used when `showLoadingState` is enabled.
255
255
  */
256
256
  loadingTimeoutMs?: number;
257
+ /**
258
+ * Auto-grow the iframe to the height the Designer reports over the resize
259
+ * protocol (`seatlayer.designer.resize`). Defaults to `true`. Set `false` when
260
+ * the host sizes the iframe itself (e.g. a fixed-height chrome).
261
+ */
262
+ autoResize?: boolean;
257
263
  /**
258
264
  * Called when the user presses "Try again" on the error card. Use it to mint a
259
265
  * fresh Designer session and call `setDesignerUrl()` with the new URL, which
@@ -276,6 +282,13 @@ declare class EmbeddedDesigner {
276
282
  private timeoutTimer;
277
283
  private phase;
278
284
  private restoreContainerPosition;
285
+ private pinned;
286
+ private frameStyleBeforeFs;
287
+ private docOverflowBeforeFs;
288
+ private bodyOverflowBeforeFs;
289
+ private fsKeyHandler;
290
+ /** Latest height (px string) the Designer reported; re-applied after unpin. */
291
+ private lastAutoHeight;
279
292
  constructor(options: EmbeddedDesignerOptions);
280
293
  mount(): HTMLIFrameElement;
281
294
  /** Replace the iframe instead of assigning a new fragment to an existing one. */
@@ -283,6 +296,15 @@ declare class EmbeddedDesigner {
283
296
  getIframe(): HTMLIFrameElement | null;
284
297
  destroy(): void;
285
298
  private loadingStateEnabled;
299
+ private autoResizeEnabled;
300
+ /**
301
+ * Pin the iframe over the host page as a viewport-filling overlay. We save the
302
+ * iframe's inline style and the document scroll state so `unpinFullscreen`
303
+ * restores everything exactly. Escape (host-side) also exits.
304
+ */
305
+ private pinFullscreen;
306
+ /** Undo `pinFullscreen`: restore the iframe style + scroll lock. Idempotent. */
307
+ private unpinFullscreen;
286
308
  private clearTimeoutTimer;
287
309
  private ensureContainerPositioned;
288
310
  private restoreContainerStyle;
@@ -564,14 +586,51 @@ declare class SeatPicker {
564
586
  private fsFallback;
565
587
  private fsChangeHandler;
566
588
  private fsEscHandler;
589
+ /** True once we've asked the host page to pin us fullscreen (framed, no native). */
590
+ private framedFs;
591
+ /** Last height (px) posted to a host frame; dedupes redundant reports. */
592
+ private lastPostedHeight;
567
593
  /**
568
594
  * Eager sightline preview for the confirm card: a cheap generated forward
569
595
  * view (or the organizer's real photo) plus a "Nm to stage · clear
570
596
  * sightline" line — the premium at-a-glance moment; click opens the 360.
571
597
  */
572
598
  private confirmThumbHtml;
599
+ /** True when the picker is rendered inside an iframe (snippet embed at /e/:key). */
600
+ private isFramed;
601
+ /**
602
+ * Post a widget→host message when framed. targetOrigin is '*' because the
603
+ * payload carries nothing sensitive (a height number / a fullscreen flag);
604
+ * hosts verify `event.origin` on their side (see `attachPickerFrame`).
605
+ */
606
+ private postToHost;
607
+ /**
608
+ * Height (px) to advertise to a host frame.
609
+ *
610
+ * The picker fills whatever box it's given: `.sl-picker` is `height:100%;
611
+ * overflow:hidden`, and the /e/:key shell mounts it `position:fixed; inset:0`.
612
+ * So it has no intrinsic *document* height to read — `scrollHeight` just
613
+ * collapses to the current viewport, which for a framed embed would echo the
614
+ * host's own iframe height straight back (a circular value). We therefore
615
+ * report a width-driven *desired* height: a pleasant landscape box on desktop,
616
+ * taller on narrow widths where the bottom sheet needs room, clamped to the
617
+ * widget's `min-height` of 420. Width is host-controlled and never moves in
618
+ * response to the height we report, so this cannot feedback-loop.
619
+ */
620
+ private measureFramedHeight;
621
+ /** Post `seatlayer:height` to the host when framed and the value changed. */
622
+ private reportFramedHeight;
573
623
  /** Full screen via the native API, falling back to a fixed-position overlay (iOS Safari). */
574
624
  private toggleFullscreen;
625
+ /**
626
+ * Native element-fullscreen was unavailable or rejected. When framed, a CSS
627
+ * `.sl-fs` overlay can't escape the iframe, so we ask the host page to pin us
628
+ * (`seatlayer:fullscreen`). Otherwise (iOS Safari, same document) fall back to
629
+ * the `.sl-fs` overlay as before.
630
+ */
631
+ private enterFsFallback;
632
+ /** Toggle host-driven (framed) fullscreen: post the flag + own the Esc key. */
633
+ private setFramedFs;
575
634
  private setFsFallback;
576
635
  private cbEl;
577
636
  private modalScrim;
@@ -805,6 +864,45 @@ declare class SeatPicker {
805
864
  destroy(): void;
806
865
  }
807
866
 
867
+ /**
868
+ * Host-side helper for embedding the SeatLayer picker as an iframe.
869
+ *
870
+ * The picker (the /e/:key page, mounted `position:fixed; inset:0`) reports its
871
+ * desired height and fullscreen intent to whatever page frames it, using the
872
+ * picker wire contract:
873
+ *
874
+ * • `{ type: 'seatlayer:height', px:number }` — grow the iframe to `px`.
875
+ * • `{ type: 'seatlayer:fullscreen', on:boolean }` — pin/unpin over the host.
876
+ *
877
+ * A framed picker cannot escape its own iframe with CSS, so it delegates both
878
+ * concerns to the host. `attachPickerFrame` wires those two behaviours onto a
879
+ * picker iframe and returns a detach function that tears everything back down.
880
+ */
881
+ interface AttachPickerFrameOptions {
882
+ /**
883
+ * Origin to accept messages from. Defaults to the origin parsed from
884
+ * `iframe.src`. Messages from any other origin (or any other window) are
885
+ * ignored — the picker posts with `targetOrigin:'*'`, so the host is the side
886
+ * that must verify `event.origin`.
887
+ */
888
+ origin?: string;
889
+ }
890
+ /**
891
+ * Attach the picker resize + fullscreen protocol to a picker iframe.
892
+ *
893
+ * ```ts
894
+ * const iframe = document.querySelector('iframe#seatlayer')!;
895
+ * const detach = attachPickerFrame(iframe);
896
+ * // …later, when removing the embed:
897
+ * detach();
898
+ * ```
899
+ *
900
+ * @param iframe The `<iframe>` element pointing at a SeatLayer picker embed.
901
+ * @param opts Optional `{ origin }` override for the accepted message origin.
902
+ * @returns A detach function: removes the listener and restores any pinned state.
903
+ */
904
+ declare function attachPickerFrame(iframe: HTMLIFrameElement, opts?: AttachPickerFrameOptions): () => void;
905
+
808
906
  /**
809
907
  * Organizer manage-surface client for workers/api (the `/v1/events/:key/*`
810
908
  * inventory routes + the public realtime channel). Companion to api.ts (the
@@ -1006,6 +1104,22 @@ declare class ManageApi {
1006
1104
  ok: true;
1007
1105
  holdTtlMs: number | null;
1008
1106
  }>;
1107
+ /** The organizer's current per section/zone availability windows (needs
1108
+ * `event:view`). Ids absent from `rules` are open / on sale. */
1109
+ availability(key: string): Promise<{
1110
+ rules: Record<string, AvailabilityRule>;
1111
+ }>;
1112
+ /** Replace the availability windows for a set of section/zone ids (needs
1113
+ * `event:block`). Ids absent from `rules` become open / on sale; a zone rule
1114
+ * cascades to its sections. The worker derives each id's seat labels, so
1115
+ * `labels` on the sent rules is best-effort. Resolves with the authoritative
1116
+ * effective `hidden` set (a due rule may fire at once) and the server-cleaned
1117
+ * `rules` map (fired timed/threshold windows dropped). */
1118
+ setAvailability(key: string, rules: Record<string, AvailabilityRule>): Promise<{
1119
+ ok: true;
1120
+ hidden: string[];
1121
+ rules: Record<string, AvailabilityRule>;
1122
+ }>;
1009
1123
  report(key: string): Promise<ReportResult>;
1010
1124
  controlRoom(key: string, windowMinutes?: number): Promise<ControlRoomSnapshot>;
1011
1125
  log(key: string, opts?: {
@@ -1039,7 +1153,7 @@ declare class ManageApi {
1039
1153
  * {@link ManageApi}. Box office + Sections + full Reports UI are M2/M3.
1040
1154
  */
1041
1155
 
1042
- type SeatManagerMode = 'view' | 'inspect' | 'block';
1156
+ type SeatManagerMode = 'view' | 'inspect' | 'block' | 'sections';
1043
1157
  /** DO seat status — 'blocked' has no engine analogue (→ 'not_for_sale'). */
1044
1158
  type DoStatus = 'free' | 'held' | 'booked' | 'blocked';
1045
1159
  /** Live KPI snapshot pushed to `onTallies` on every state change. */
@@ -1179,6 +1293,11 @@ declare class SeatManager {
1179
1293
  private tokenRefreshInFlight;
1180
1294
  private sectionByObject;
1181
1295
  private sectionLabelById;
1296
+ private sectionsBase;
1297
+ private availabilityRules;
1298
+ private effectiveHidden;
1299
+ private effectiveClosed;
1300
+ private availabilitySaving;
1182
1301
  private lastSyncedAt;
1183
1302
  private blockedQuery;
1184
1303
  private blockedSection;
@@ -1284,6 +1403,36 @@ declare class SeatManager {
1284
1403
  private paintMonitorInsights;
1285
1404
  private applyHeatOverlay;
1286
1405
  private renderInspectRail;
1406
+ /** Pull the organizer's availability rules (event:view). Called on load and on
1407
+ * every WS (re)connect, mirroring how the other panels re-hydrate. `closed` is
1408
+ * deterministic from the rules; `hidden` (which folds in already-due timed /
1409
+ * threshold windows) comes from the snapshot + WS effective set. */
1410
+ private refreshAvailability;
1411
+ /** Run a token-authed op; on a 401 re-mint via onTokenRefresh and retry once. */
1412
+ private withAuthRetry;
1413
+ private closedIdsFromRules;
1414
+ /** Adopt a new effective hidden/closed set (from a snapshot or WS broadcast) and
1415
+ * repaint the rail + canvas when it actually moves. */
1416
+ private updateEffectiveAvailability;
1417
+ /** Canvas read of the availability state: dim hidden sections to a whisper,
1418
+ * half-light closed sections, leave open sections normal. Only in Sections mode;
1419
+ * cleared in every other tool. */
1420
+ private applySectionCanvasTreatment;
1421
+ /** Zone-grouped render tree: each zone header then its sections (which follow the
1422
+ * zone window), then loose sections + the ungrouped bucket. Effective hidden /
1423
+ * closed come from the live sets, rules from the organizer map. */
1424
+ private buildSectionRows;
1425
+ private renderSectionsRail;
1426
+ private sectionRowHtml;
1427
+ private wireSectionRail;
1428
+ /** Change one row's availability mode. A zone rule subsumes its child section
1429
+ * rules, so those are dropped from the map (the zone window is the truth). */
1430
+ private setSectionMode;
1431
+ /** Edit a timed reveal time / threshold percent on an existing row rule. */
1432
+ private setSectionRulePatch;
1433
+ /** Optimistically adopt the new rules, then reconcile with the server-cleaned
1434
+ * map + effective hidden/closed sets. Rolls back the rules on failure. */
1435
+ private persistAvailability;
1287
1436
  private paintLegend;
1288
1437
  private paintFeed;
1289
1438
  private renderBlockRail;
@@ -1305,4 +1454,4 @@ declare class SeatManager {
1305
1454
  private fail;
1306
1455
  }
1307
1456
 
1308
- export { ApiError, type BestAvailableResult, type CheckoutHandoff, type CheckoutLineItem, type ControlRoomActivityEntry, type ControlRoomSectionMetric, type ControlRoomSnapshot, EmbeddedDesigner, type EmbeddedDesignerEventType, type EmbeddedDesignerMessage, type EmbeddedDesignerOptions, type GAAreaAvailability, type HoldConflict, type HoldLineItem, type HoldResult, type LogEntry, type LogPage, ManageApi, ManageApiError, type ReportByStatus, type ReportCategoryMeta, type ReportCategoryRow, type ReportResult, type ResumedHoldResult, SeatManager, type SeatManagerActionResult, type SeatManagerActivity, type SeatManagerMode, type SeatManagerOptions, type SeatManagerTallies, SeatPicker, type SeatPickerOptions, type SeatPickerTheme, SeatingChart, type SeatingChartOptions, type SelectedSeat };
1457
+ export { ApiError, type AttachPickerFrameOptions, type BestAvailableResult, type CheckoutHandoff, type CheckoutLineItem, type ControlRoomActivityEntry, type ControlRoomSectionMetric, type ControlRoomSnapshot, EmbeddedDesigner, type EmbeddedDesignerEventType, type EmbeddedDesignerMessage, type EmbeddedDesignerOptions, type GAAreaAvailability, type HoldConflict, type HoldLineItem, type HoldResult, type LogEntry, type LogPage, ManageApi, ManageApiError, type ReportByStatus, type ReportCategoryMeta, type ReportCategoryRow, type ReportResult, type ResumedHoldResult, SeatManager, type SeatManagerActionResult, type SeatManagerActivity, type SeatManagerMode, type SeatManagerOptions, type SeatManagerTallies, SeatPicker, type SeatPickerOptions, type SeatPickerTheme, SeatingChart, type SeatingChartOptions, type SelectedSeat, attachPickerFrame };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { PickerSeat, SeatHoverDetails, PickerTransport, ChartDoc, ChartTheme, ExpandedSeat } from '@seatlayer/core';
1
+ import { PickerSeat, SeatHoverDetails, PickerTransport, ChartDoc, AvailabilityRule, ChartTheme, ExpandedSeat } from '@seatlayer/core';
2
2
  export { ExpandedSeat, SeatHoverDetails } from '@seatlayer/core';
3
3
 
4
4
  /**
@@ -254,6 +254,12 @@ interface EmbeddedDesignerOptions {
254
254
  * Only used when `showLoadingState` is enabled.
255
255
  */
256
256
  loadingTimeoutMs?: number;
257
+ /**
258
+ * Auto-grow the iframe to the height the Designer reports over the resize
259
+ * protocol (`seatlayer.designer.resize`). Defaults to `true`. Set `false` when
260
+ * the host sizes the iframe itself (e.g. a fixed-height chrome).
261
+ */
262
+ autoResize?: boolean;
257
263
  /**
258
264
  * Called when the user presses "Try again" on the error card. Use it to mint a
259
265
  * fresh Designer session and call `setDesignerUrl()` with the new URL, which
@@ -276,6 +282,13 @@ declare class EmbeddedDesigner {
276
282
  private timeoutTimer;
277
283
  private phase;
278
284
  private restoreContainerPosition;
285
+ private pinned;
286
+ private frameStyleBeforeFs;
287
+ private docOverflowBeforeFs;
288
+ private bodyOverflowBeforeFs;
289
+ private fsKeyHandler;
290
+ /** Latest height (px string) the Designer reported; re-applied after unpin. */
291
+ private lastAutoHeight;
279
292
  constructor(options: EmbeddedDesignerOptions);
280
293
  mount(): HTMLIFrameElement;
281
294
  /** Replace the iframe instead of assigning a new fragment to an existing one. */
@@ -283,6 +296,15 @@ declare class EmbeddedDesigner {
283
296
  getIframe(): HTMLIFrameElement | null;
284
297
  destroy(): void;
285
298
  private loadingStateEnabled;
299
+ private autoResizeEnabled;
300
+ /**
301
+ * Pin the iframe over the host page as a viewport-filling overlay. We save the
302
+ * iframe's inline style and the document scroll state so `unpinFullscreen`
303
+ * restores everything exactly. Escape (host-side) also exits.
304
+ */
305
+ private pinFullscreen;
306
+ /** Undo `pinFullscreen`: restore the iframe style + scroll lock. Idempotent. */
307
+ private unpinFullscreen;
286
308
  private clearTimeoutTimer;
287
309
  private ensureContainerPositioned;
288
310
  private restoreContainerStyle;
@@ -564,14 +586,51 @@ declare class SeatPicker {
564
586
  private fsFallback;
565
587
  private fsChangeHandler;
566
588
  private fsEscHandler;
589
+ /** True once we've asked the host page to pin us fullscreen (framed, no native). */
590
+ private framedFs;
591
+ /** Last height (px) posted to a host frame; dedupes redundant reports. */
592
+ private lastPostedHeight;
567
593
  /**
568
594
  * Eager sightline preview for the confirm card: a cheap generated forward
569
595
  * view (or the organizer's real photo) plus a "Nm to stage · clear
570
596
  * sightline" line — the premium at-a-glance moment; click opens the 360.
571
597
  */
572
598
  private confirmThumbHtml;
599
+ /** True when the picker is rendered inside an iframe (snippet embed at /e/:key). */
600
+ private isFramed;
601
+ /**
602
+ * Post a widget→host message when framed. targetOrigin is '*' because the
603
+ * payload carries nothing sensitive (a height number / a fullscreen flag);
604
+ * hosts verify `event.origin` on their side (see `attachPickerFrame`).
605
+ */
606
+ private postToHost;
607
+ /**
608
+ * Height (px) to advertise to a host frame.
609
+ *
610
+ * The picker fills whatever box it's given: `.sl-picker` is `height:100%;
611
+ * overflow:hidden`, and the /e/:key shell mounts it `position:fixed; inset:0`.
612
+ * So it has no intrinsic *document* height to read — `scrollHeight` just
613
+ * collapses to the current viewport, which for a framed embed would echo the
614
+ * host's own iframe height straight back (a circular value). We therefore
615
+ * report a width-driven *desired* height: a pleasant landscape box on desktop,
616
+ * taller on narrow widths where the bottom sheet needs room, clamped to the
617
+ * widget's `min-height` of 420. Width is host-controlled and never moves in
618
+ * response to the height we report, so this cannot feedback-loop.
619
+ */
620
+ private measureFramedHeight;
621
+ /** Post `seatlayer:height` to the host when framed and the value changed. */
622
+ private reportFramedHeight;
573
623
  /** Full screen via the native API, falling back to a fixed-position overlay (iOS Safari). */
574
624
  private toggleFullscreen;
625
+ /**
626
+ * Native element-fullscreen was unavailable or rejected. When framed, a CSS
627
+ * `.sl-fs` overlay can't escape the iframe, so we ask the host page to pin us
628
+ * (`seatlayer:fullscreen`). Otherwise (iOS Safari, same document) fall back to
629
+ * the `.sl-fs` overlay as before.
630
+ */
631
+ private enterFsFallback;
632
+ /** Toggle host-driven (framed) fullscreen: post the flag + own the Esc key. */
633
+ private setFramedFs;
575
634
  private setFsFallback;
576
635
  private cbEl;
577
636
  private modalScrim;
@@ -805,6 +864,45 @@ declare class SeatPicker {
805
864
  destroy(): void;
806
865
  }
807
866
 
867
+ /**
868
+ * Host-side helper for embedding the SeatLayer picker as an iframe.
869
+ *
870
+ * The picker (the /e/:key page, mounted `position:fixed; inset:0`) reports its
871
+ * desired height and fullscreen intent to whatever page frames it, using the
872
+ * picker wire contract:
873
+ *
874
+ * • `{ type: 'seatlayer:height', px:number }` — grow the iframe to `px`.
875
+ * • `{ type: 'seatlayer:fullscreen', on:boolean }` — pin/unpin over the host.
876
+ *
877
+ * A framed picker cannot escape its own iframe with CSS, so it delegates both
878
+ * concerns to the host. `attachPickerFrame` wires those two behaviours onto a
879
+ * picker iframe and returns a detach function that tears everything back down.
880
+ */
881
+ interface AttachPickerFrameOptions {
882
+ /**
883
+ * Origin to accept messages from. Defaults to the origin parsed from
884
+ * `iframe.src`. Messages from any other origin (or any other window) are
885
+ * ignored — the picker posts with `targetOrigin:'*'`, so the host is the side
886
+ * that must verify `event.origin`.
887
+ */
888
+ origin?: string;
889
+ }
890
+ /**
891
+ * Attach the picker resize + fullscreen protocol to a picker iframe.
892
+ *
893
+ * ```ts
894
+ * const iframe = document.querySelector('iframe#seatlayer')!;
895
+ * const detach = attachPickerFrame(iframe);
896
+ * // …later, when removing the embed:
897
+ * detach();
898
+ * ```
899
+ *
900
+ * @param iframe The `<iframe>` element pointing at a SeatLayer picker embed.
901
+ * @param opts Optional `{ origin }` override for the accepted message origin.
902
+ * @returns A detach function: removes the listener and restores any pinned state.
903
+ */
904
+ declare function attachPickerFrame(iframe: HTMLIFrameElement, opts?: AttachPickerFrameOptions): () => void;
905
+
808
906
  /**
809
907
  * Organizer manage-surface client for workers/api (the `/v1/events/:key/*`
810
908
  * inventory routes + the public realtime channel). Companion to api.ts (the
@@ -1006,6 +1104,22 @@ declare class ManageApi {
1006
1104
  ok: true;
1007
1105
  holdTtlMs: number | null;
1008
1106
  }>;
1107
+ /** The organizer's current per section/zone availability windows (needs
1108
+ * `event:view`). Ids absent from `rules` are open / on sale. */
1109
+ availability(key: string): Promise<{
1110
+ rules: Record<string, AvailabilityRule>;
1111
+ }>;
1112
+ /** Replace the availability windows for a set of section/zone ids (needs
1113
+ * `event:block`). Ids absent from `rules` become open / on sale; a zone rule
1114
+ * cascades to its sections. The worker derives each id's seat labels, so
1115
+ * `labels` on the sent rules is best-effort. Resolves with the authoritative
1116
+ * effective `hidden` set (a due rule may fire at once) and the server-cleaned
1117
+ * `rules` map (fired timed/threshold windows dropped). */
1118
+ setAvailability(key: string, rules: Record<string, AvailabilityRule>): Promise<{
1119
+ ok: true;
1120
+ hidden: string[];
1121
+ rules: Record<string, AvailabilityRule>;
1122
+ }>;
1009
1123
  report(key: string): Promise<ReportResult>;
1010
1124
  controlRoom(key: string, windowMinutes?: number): Promise<ControlRoomSnapshot>;
1011
1125
  log(key: string, opts?: {
@@ -1039,7 +1153,7 @@ declare class ManageApi {
1039
1153
  * {@link ManageApi}. Box office + Sections + full Reports UI are M2/M3.
1040
1154
  */
1041
1155
 
1042
- type SeatManagerMode = 'view' | 'inspect' | 'block';
1156
+ type SeatManagerMode = 'view' | 'inspect' | 'block' | 'sections';
1043
1157
  /** DO seat status — 'blocked' has no engine analogue (→ 'not_for_sale'). */
1044
1158
  type DoStatus = 'free' | 'held' | 'booked' | 'blocked';
1045
1159
  /** Live KPI snapshot pushed to `onTallies` on every state change. */
@@ -1179,6 +1293,11 @@ declare class SeatManager {
1179
1293
  private tokenRefreshInFlight;
1180
1294
  private sectionByObject;
1181
1295
  private sectionLabelById;
1296
+ private sectionsBase;
1297
+ private availabilityRules;
1298
+ private effectiveHidden;
1299
+ private effectiveClosed;
1300
+ private availabilitySaving;
1182
1301
  private lastSyncedAt;
1183
1302
  private blockedQuery;
1184
1303
  private blockedSection;
@@ -1284,6 +1403,36 @@ declare class SeatManager {
1284
1403
  private paintMonitorInsights;
1285
1404
  private applyHeatOverlay;
1286
1405
  private renderInspectRail;
1406
+ /** Pull the organizer's availability rules (event:view). Called on load and on
1407
+ * every WS (re)connect, mirroring how the other panels re-hydrate. `closed` is
1408
+ * deterministic from the rules; `hidden` (which folds in already-due timed /
1409
+ * threshold windows) comes from the snapshot + WS effective set. */
1410
+ private refreshAvailability;
1411
+ /** Run a token-authed op; on a 401 re-mint via onTokenRefresh and retry once. */
1412
+ private withAuthRetry;
1413
+ private closedIdsFromRules;
1414
+ /** Adopt a new effective hidden/closed set (from a snapshot or WS broadcast) and
1415
+ * repaint the rail + canvas when it actually moves. */
1416
+ private updateEffectiveAvailability;
1417
+ /** Canvas read of the availability state: dim hidden sections to a whisper,
1418
+ * half-light closed sections, leave open sections normal. Only in Sections mode;
1419
+ * cleared in every other tool. */
1420
+ private applySectionCanvasTreatment;
1421
+ /** Zone-grouped render tree: each zone header then its sections (which follow the
1422
+ * zone window), then loose sections + the ungrouped bucket. Effective hidden /
1423
+ * closed come from the live sets, rules from the organizer map. */
1424
+ private buildSectionRows;
1425
+ private renderSectionsRail;
1426
+ private sectionRowHtml;
1427
+ private wireSectionRail;
1428
+ /** Change one row's availability mode. A zone rule subsumes its child section
1429
+ * rules, so those are dropped from the map (the zone window is the truth). */
1430
+ private setSectionMode;
1431
+ /** Edit a timed reveal time / threshold percent on an existing row rule. */
1432
+ private setSectionRulePatch;
1433
+ /** Optimistically adopt the new rules, then reconcile with the server-cleaned
1434
+ * map + effective hidden/closed sets. Rolls back the rules on failure. */
1435
+ private persistAvailability;
1287
1436
  private paintLegend;
1288
1437
  private paintFeed;
1289
1438
  private renderBlockRail;
@@ -1305,4 +1454,4 @@ declare class SeatManager {
1305
1454
  private fail;
1306
1455
  }
1307
1456
 
1308
- export { ApiError, type BestAvailableResult, type CheckoutHandoff, type CheckoutLineItem, type ControlRoomActivityEntry, type ControlRoomSectionMetric, type ControlRoomSnapshot, EmbeddedDesigner, type EmbeddedDesignerEventType, type EmbeddedDesignerMessage, type EmbeddedDesignerOptions, type GAAreaAvailability, type HoldConflict, type HoldLineItem, type HoldResult, type LogEntry, type LogPage, ManageApi, ManageApiError, type ReportByStatus, type ReportCategoryMeta, type ReportCategoryRow, type ReportResult, type ResumedHoldResult, SeatManager, type SeatManagerActionResult, type SeatManagerActivity, type SeatManagerMode, type SeatManagerOptions, type SeatManagerTallies, SeatPicker, type SeatPickerOptions, type SeatPickerTheme, SeatingChart, type SeatingChartOptions, type SelectedSeat };
1457
+ export { ApiError, type AttachPickerFrameOptions, type BestAvailableResult, type CheckoutHandoff, type CheckoutLineItem, type ControlRoomActivityEntry, type ControlRoomSectionMetric, type ControlRoomSnapshot, EmbeddedDesigner, type EmbeddedDesignerEventType, type EmbeddedDesignerMessage, type EmbeddedDesignerOptions, type GAAreaAvailability, type HoldConflict, type HoldLineItem, type HoldResult, type LogEntry, type LogPage, ManageApi, ManageApiError, type ReportByStatus, type ReportCategoryMeta, type ReportCategoryRow, type ReportResult, type ResumedHoldResult, SeatManager, type SeatManagerActionResult, type SeatManagerActivity, type SeatManagerMode, type SeatManagerOptions, type SeatManagerTallies, SeatPicker, type SeatPickerOptions, type SeatPickerTheme, SeatingChart, type SeatingChartOptions, type SelectedSeat, attachPickerFrame };