@seatlayer/js 0.93.0 → 0.95.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.
@@ -644,6 +644,16 @@ interface EventCategoryAssignmentResult {
644
644
  categoryKey: string;
645
645
  revision: number;
646
646
  }
647
+ /** GET /category-assignments: what differs from the chart (list capped, count exact). */
648
+ interface EventCategoryDifferences {
649
+ chartAvailable: boolean;
650
+ differing: number;
651
+ units: Array<{
652
+ label: string;
653
+ categoryKey: string;
654
+ chartCategoryKey: string;
655
+ }>;
656
+ }
647
657
  type EventTableBookingMode = 'individual' | 'whole' | 'variable';
648
658
  interface EventTableBookingResult {
649
659
  ok: true;
@@ -901,6 +911,15 @@ declare class ManageApi {
901
911
  * snapshots retain their original configured value; future selection uses
902
912
  * the new category. Requires `event:categories:manage`. */
903
913
  setCategory(key: string, labels: string[], categoryKey: string): Promise<EventCategoryAssignmentResult>;
914
+ /**
915
+ * The inventory units this event sells under a different category than the
916
+ * chart currently does — what "Reset to chart defaults" would put back.
917
+ * Requires `event:view`.
918
+ */
919
+ categoryDifferences(key: string): Promise<EventCategoryDifferences>;
920
+ /** Put every unit (or only `labels`) back on the chart's category, in one
921
+ * write. Requires `event:categories:manage`. */
922
+ resetCategoriesToChart(key: string, labels?: string[]): Promise<EventCategoryAssignmentResult>;
904
923
  /** Change event-only table booking identity. The server refuses tables with
905
924
  * held/booked/blocked inventory or channel assignments that would be lost. */
906
925
  setTableBooking(key: string, tableIds: string[], mode: EventTableBookingMode, bounds?: {
@@ -1118,6 +1137,56 @@ declare class ManageApi {
1118
1137
  reportCsv(key: string): Promise<Blob>;
1119
1138
  }
1120
1139
 
1140
+ /**
1141
+ * blockPaint — the organizer's paint for a section block (plan item 7, slice C).
1142
+ *
1143
+ * What a block says to the organizer at the overview: its name, and an
1144
+ * availability tint — the share of seats still free, in three bands the
1145
+ * legend beside the map spells out — the way every ops board with sixty
1146
+ * blocks does it. Text on every block is noise at low zoom; a tint reads
1147
+ * at a glance; the exact figure belongs on the hover card and the crumb.
1148
+ * A closed or hidden section (the Sections tool's rules) wears the neutral
1149
+ * and its state word; sold out is its own word.
1150
+ *
1151
+ * Pure: the engine hands a reading, this answers a paint. SeatManager wires
1152
+ * it and re-asks on every tally or rule change.
1153
+ */
1154
+
1155
+ /**
1156
+ * What the map's colours mean: how full each place is, or its ticket type.
1157
+ * ONE setting drives the blocks, the seats and the minimap together, so a
1158
+ * colour never changes meaning as the organizer zooms. It is the View menu's
1159
+ * category-colours state, shown as a choice (`type` = category colours on).
1160
+ */
1161
+ type ColourBy = 'full' | 'type';
1162
+
1163
+ /**
1164
+ * The control room's View menu (plan item 5, slice D).
1165
+ *
1166
+ * Toggles that change how the map READS, never what it holds: seat labels,
1167
+ * row labels, channel colours, booking momentum — and category colours, which
1168
+ * the legend offers as "Colour by: How full · Ticket type".
1169
+ * The letters are the ones seats.io operators already know (S · R · G · H ·
1170
+ * M), ridden on Shift because the tool tabs own the bare letters (S is
1171
+ * Sections, G is Categories, M is Monitor).
1172
+ *
1173
+ * The set is remembered per browser: an operator who works with labels off
1174
+ * keeps them off tomorrow. Storage is a convenience, never a dependency —
1175
+ * a private window or a blocked store simply starts from the defaults.
1176
+ *
1177
+ * Pure where it can be: the model, the markup and the storage rules are
1178
+ * here and tested without a cockpit; SeatManager owns the state and the
1179
+ * renderer calls.
1180
+ */
1181
+
1182
+ interface MapView {
1183
+ seatLabels: boolean;
1184
+ rowLabels: boolean;
1185
+ categoryColours: boolean;
1186
+ channelColours: boolean;
1187
+ momentum: boolean;
1188
+ }
1189
+
1121
1190
  /**
1122
1191
  * managerTypes — the SeatManager cockpit's public contract (options, the
1123
1192
  * capability set, the tallies/activity/connection payloads a host subscribes to)
@@ -1180,7 +1249,7 @@ interface SeatManagerActivity {
1180
1249
  }
1181
1250
  /** Fired after a successful organizer action, for host toasts/telemetry. */
1182
1251
  interface SeatManagerActionResult {
1183
- action: 'block' | 'unblock' | 'unblockAll' | 'cancelBooking' | 'setHoldTtl' | 'setCategory' | 'setTableBooking';
1252
+ action: 'block' | 'unblock' | 'unblockAll' | 'cancelBooking' | 'setHoldTtl' | 'setCategory' | 'resetCategories' | 'setTableBooking';
1184
1253
  labels: string[];
1185
1254
  count: number;
1186
1255
  }
@@ -1199,6 +1268,13 @@ interface SeatManagerFilteredSection {
1199
1268
  seatCount: number;
1200
1269
  zone?: string;
1201
1270
  }
1271
+ /** A standing (GA) area as the host sees it. */
1272
+ interface SeatManagerArea {
1273
+ id: string;
1274
+ label: string;
1275
+ /** The buyer-facing name (`displayLabel`, else `label`). */
1276
+ name: string;
1277
+ }
1202
1278
  interface SeatManagerOptions {
1203
1279
  /** CSS selector or element to mount into. */
1204
1280
  container: string | HTMLElement;
@@ -1224,6 +1300,13 @@ interface SeatManagerOptions {
1224
1300
  * it is the fail-closed fallback for every refused mode.
1225
1301
  */
1226
1302
  tools?: SeatManagerMode[];
1303
+ /**
1304
+ * `minimal`: just the live map, its zoom buttons and Venue — no tool bar,
1305
+ * side rail, seat-search chip, block legend or mini-map. For a host that
1306
+ * brings its own search, totals and actions around the map (a box office).
1307
+ * Default `full`, the control room.
1308
+ */
1309
+ chrome?: 'full' | 'minimal';
1227
1310
  /** Public labels to preselect after live inventory has loaded in Select mode. */
1228
1311
  selectedObjects?: string[];
1229
1312
  /**
@@ -1269,6 +1352,12 @@ interface SeatManagerOptions {
1269
1352
  * the camera and the realtime socket.
1270
1353
  */
1271
1354
  themeMode?: ThemeMode;
1355
+ /**
1356
+ * What the map's colours mean when it opens: `full` (how full each block and
1357
+ * seat is) or `type` (ticket type, as buyers see it). Defaults to the
1358
+ * organizer's last choice, else `full`. The legend beside the map switches it.
1359
+ */
1360
+ colourBy?: 'full' | 'type';
1272
1361
  /**
1273
1362
  * Keep the canvas painting even when the tab is hidden/backgrounded (a war-room
1274
1363
  * board on a second monitor). Calls `forceDraw()` after each delta so Chrome's
@@ -1311,6 +1400,12 @@ interface SeatManagerOptions {
1311
1400
  onSelectionInvalid?: (state: SeatManagerSelectionValidity) => void;
1312
1401
  /** A Select-mode attempt reached the active exact/max cap. */
1313
1402
  onSelectionLimit?: (max: number) => void;
1403
+ /**
1404
+ * Select mode: a standing (GA) area was tapped. Areas are sold by quantity,
1405
+ * not selected, so the host decides what a tap means (a box office adds the
1406
+ * area to its sale). `id` is the chart object id the inventory uses.
1407
+ */
1408
+ onAreaClick?: (area: SeatManagerArea) => void;
1314
1409
  /** Filter Sections changed by map interaction or an imperative method. */
1315
1410
  onFilteredSectionChange?: (sections: SeatManagerFilteredSection[]) => void;
1316
1411
  /** A block/unblock/cancel action completed successfully. */
@@ -1330,8 +1425,15 @@ interface SeatManagerOptions {
1330
1425
  }
1331
1426
  /** Realtime link state, as reported to the embedding host. */
1332
1427
  interface SeatManagerConnection {
1333
- /** `live` while the socket is open; `reconnecting` from drop until reopen. */
1334
- status: 'live' | 'reconnecting';
1428
+ /**
1429
+ * `live` while the socket is open; `reconnecting` from drop until reopen;
1430
+ * `ended` once the manage session cannot be renewed — the host's
1431
+ * `onTokenRefresh` kept failing (three times running, or with a refusal),
1432
+ * or a 401 arrived with no refresher wired. Nothing polls in `ended`: the
1433
+ * cockpit shows its own "session ended" card with a Try again, and a host
1434
+ * that mints tokens can call `retrySession()` after signing the user in.
1435
+ */
1436
+ status: 'live' | 'reconnecting' | 'ended';
1335
1437
  /**
1336
1438
  * `Date.now()` of the last snapshot or delta accepted from the server, or
1337
1439
  * null before the first one. This is the honest "as of" for whatever the host
@@ -1380,6 +1482,8 @@ declare class SeatManager {
1380
1482
  private activityPanel;
1381
1483
  private navigation;
1382
1484
  private movingMap;
1485
+ /** How a drag on the map chooses seats in the bulk tools: a box, or a freehand lasso (item 5, slice C). */
1486
+ private marqueeShape;
1383
1487
  private socketSnapshotSeen;
1384
1488
  private monitorRefreshTimer;
1385
1489
  /** `'auto'` is kept as asked, not as resolved — see {@link getThemeMode}. */
@@ -1404,6 +1508,12 @@ declare class SeatManager {
1404
1508
  * Free under-reported by GA capacity and SOLD% could exceed 100%.
1405
1509
  */
1406
1510
  private gaUnitLabelSet;
1511
+ /**
1512
+ * A table sold as ONE unit ('3') is a label the server speaks and the map
1513
+ * cannot paint: what is drawn are its chairs. Status for the unit paints
1514
+ * every chair, so a sold whole table reads as sold, not as eight free seats.
1515
+ */
1516
+ private tableChairIds;
1407
1517
  private status;
1408
1518
  /** Live non-free counters, moved by each delta rather than re-walked. */
1409
1519
  private counts;
@@ -1434,6 +1544,12 @@ declare class SeatManager {
1434
1544
  private paintHandle;
1435
1545
  private trendWindowMinutes;
1436
1546
  private heatEnabled;
1547
+ /** The View menu (plan item 5, slice D): labels, colours, momentum — remembered per browser. */
1548
+ private mapView;
1549
+ /** The bar's Find box — its chooser reads every seat, not just the tool's selectable ones. */
1550
+ private barFind;
1551
+ /** The venue overview in the map's corner (plan item 7); null under the compact breakpoint. */
1552
+ private minimap;
1437
1553
  private followLive;
1438
1554
  private lastKpiValues;
1439
1555
  private activeKpiDeltas;
@@ -1459,6 +1575,10 @@ declare class SeatManager {
1459
1575
  private tokenExpiresAt;
1460
1576
  private tokenRefreshTimer;
1461
1577
  private tokenRefreshInFlight;
1578
+ /** Consecutive failed `onTokenRefresh` calls; three in a row end the session. */
1579
+ private tokenRefreshFailures;
1580
+ /** The manage session cannot be renewed: every poll and socket is down until `retrySession()`. */
1581
+ private sessionEnded;
1462
1582
  private sectionByObject;
1463
1583
  private sectionLabelById;
1464
1584
  private sectionsBase;
@@ -1489,6 +1609,16 @@ declare class SeatManager {
1489
1609
  * they do not for as long as a network fetch takes.
1490
1610
  */
1491
1611
  private channels;
1612
+ /**
1613
+ * The shared seat chooser for the tools that choose seats without a mode
1614
+ * object of their own (Block, Categories, Select) — plan item 5. Built per
1615
+ * rail paint, because what is selectable depends on the tool; its dialogs
1616
+ * mount through the manager's one modal primitive.
1617
+ */
1618
+ private chooser;
1619
+ private chooserDialog;
1620
+ /** GET /category-assignments for the Categories tool's Reset count; null until read. */
1621
+ private categoryDifferences;
1492
1622
  private channelCaps;
1493
1623
  private categoryCanManage;
1494
1624
  private tableCanManage;
@@ -1535,6 +1665,32 @@ declare class SeatManager {
1535
1665
  * has no channels", which is a lie about inventory.
1536
1666
  */
1537
1667
  private ensureChannels;
1668
+ /**
1669
+ * The adapter between the cockpit's internals and the shared seat chooser.
1670
+ * Every list the chooser offers is filtered to what THIS tool may select, so
1671
+ * a picker never adds a seat the tool would then refuse.
1672
+ */
1673
+ private buildChooserHost;
1674
+ /**
1675
+ * The bar's Find (plan item 5, slice D): one box for every tool. Its host
1676
+ * reads EVERY seat — an organizer looking for D-12 does not care whether
1677
+ * the current tool could select it — and Enter selects on the choosing
1678
+ * tools, frames on Inspect and Monitor. Highlight rides the renderer.
1679
+ */
1680
+ private wireBarFind;
1681
+ private isChoosingTool;
1682
+ /** Move the camera to these seats — Enter in the bar's Find on Inspect/Monitor. */
1683
+ private frameLabels;
1684
+ /** Find's highlight on the map: labels → ids; null clears. */
1685
+ private highlightLabels;
1686
+ /** A fresh chooser for the rail being painted (selectability is per tool). */
1687
+ private toolChooser;
1688
+ /**
1689
+ * The one line under every chooser: the count, what the tool says about the
1690
+ * selection, Select all and Clear. `data-ref` names are the tool's own so
1691
+ * its painters keep addressing them.
1692
+ */
1693
+ private toolSelectionBar;
1538
1694
  /** The adapter between the cockpit's internals and Channels mode. */
1539
1695
  private buildChannelsHost;
1540
1696
  /** Actual on-screen seat diameter, for the channel overlay's marks. The
@@ -1544,6 +1700,22 @@ declare class SeatManager {
1544
1700
  private seatPixelSize;
1545
1701
  /** Toggle the normalized sales-velocity outline overlay without changing seat colors. */
1546
1702
  setHeatOverlay(enabled: boolean): void;
1703
+ /**
1704
+ * The View menu (plan item 5, slice D): seat labels, row labels, category
1705
+ * colours, channel colours, booking momentum. Each is a toggle the map
1706
+ * applies at once; the whole set is remembered per browser so an operator
1707
+ * who works with labels off keeps them off tomorrow.
1708
+ */
1709
+ setMapView(patch: Partial<MapView>): void;
1710
+ /** What the map's colours mean now: how full, or ticket type (the legend's switch). */
1711
+ getColourBy(): ColourBy;
1712
+ setColourBy(mode: ColourBy): void;
1713
+ getMapView(): MapView;
1714
+ private toggleMapView;
1715
+ /** Channel colours are the Channels tool's overlay; outside it there is nothing to colour by. */
1716
+ private channelColoursAvailable;
1717
+ private applyMapView;
1718
+ private paintMapViewMenu;
1547
1719
  /** Toggle opt-in camera following for new buyer hold/book events. */
1548
1720
  setFollowLive(enabled: boolean): void;
1549
1721
  /** Update background-tab repaint policy without rebuilding the board. */
@@ -1609,6 +1781,18 @@ declare class SeatManager {
1609
1781
  setToken(token: EventScopedManageToken, expiresAt?: number): void;
1610
1782
  private scheduleTokenRefresh;
1611
1783
  private rotateToken;
1784
+ /**
1785
+ * The manage session cannot be renewed. Every timer, poll and socket
1786
+ * stops; the map stays painted as it was, under a card that says so and
1787
+ * offers one Try again. The host hears `status: 'ended'` once.
1788
+ */
1789
+ private endSession;
1790
+ /**
1791
+ * Ask the host for a token once more — after it signed the user back in —
1792
+ * and, if it answers, pick the live stream up where it stopped.
1793
+ */
1794
+ retrySession(): Promise<boolean>;
1795
+ private paintSessionEnded;
1612
1796
  /** Bulk block the given labels (or the current selection when omitted). */
1613
1797
  block(labels?: string[], opts?: {
1614
1798
  releaseAt?: number;
@@ -1632,6 +1816,14 @@ declare class SeatManager {
1632
1816
  selectSection(sectionId: string): ExpandedSeat[];
1633
1817
  /** Filter every section whose public label matches, then frame their union. */
1634
1818
  setFilteredSection(label: string): SeatManagerFilteredSection[];
1819
+ /**
1820
+ * Frame every section whose public label matches, in ANY mode: no filtering,
1821
+ * no dimming, the selection untouched. A host that picks seats (a box office
1822
+ * jumping to "Block 104", or to the section of a seat it just added) uses
1823
+ * this; `zoomToFit()` returns to the whole venue. An unknown label frames
1824
+ * nothing and returns [], because host labels can outlive a chart edit.
1825
+ */
1826
+ focusSection(label: string): SeatManagerFilteredSection[];
1635
1827
  /** Clear section filtering and restore the full event frame. */
1636
1828
  clearFilteredSection(): void;
1637
1829
  getFilteredSections(): SeatManagerFilteredSection[];
@@ -1676,11 +1868,63 @@ declare class SeatManager {
1676
1868
  }>;
1677
1869
  setHoldTtl(ms: number | null): Promise<void>;
1678
1870
  zoomToFit(): void;
1871
+ /**
1872
+ * "−" walks back one level — seats → the section → the venue — the way the
1873
+ * buyer picker's does; leaving a focused section also drops the focus. A
1874
+ * renderer without the level walk falls back to the factor step.
1875
+ */
1876
+ private zoomOutStep;
1877
+ /**
1878
+ * What the map chrome reads: the camera, the focus, the floor, and the
1879
+ * live counts the minimap snapshot carries (plan item 7). Painted on every
1880
+ * view change, so the crumb and the pills never lag the camera.
1881
+ */
1882
+ private paintMapChrome;
1883
+ /** Section id → the ticket type most of its seats carry, rebuilt with the sections. */
1884
+ private typeKeyBySection;
1885
+ private typeKeyBase;
1886
+ private sectionTypeKeys;
1887
+ /** A block's ticket-type colour, exactly as the map paints that type. */
1888
+ private sectionTypeTint;
1889
+ /** The ticket types this chart sells, named and coloured as the map shows them. */
1890
+ private legendTypes;
1891
+ /**
1892
+ * Re-ask the block paint and carry it to the minimap. The minimap paints
1893
+ * from the renderer's snapshot, which holds the paint each block is wearing,
1894
+ * so it only needs telling when that paint has moved.
1895
+ */
1896
+ private refreshBlockPaint;
1897
+ /** The renderer as a {@link MapCamera}, for the minimap and any other map chrome. */
1898
+ private mapCamera;
1899
+ /**
1900
+ * The venue overview in the map's corner. Not under the compact breakpoint
1901
+ * — the pills stay, the thumbnail goes — and rebuilt with the renderer so a
1902
+ * chart change never leaves a stale outline behind.
1903
+ */
1904
+ private syncMinimap;
1905
+ private cssVar;
1679
1906
  destroy(): void;
1680
1907
  private buildRenderer;
1908
+ /**
1909
+ * The organizer's facts on the map's hover card (plan item 5, slice D):
1910
+ * STATUS · CHANNEL · FOR SALE, in one glance. CHANNEL appears once the
1911
+ * Channels list has loaded — a guess would be worse than a missing cell.
1912
+ * FOR SALE is the buyer's truth: free, its section open and shown, and its
1913
+ * category sellable.
1914
+ */
1915
+ private hoverFactsFor;
1681
1916
  /** Block always uses a marquee. Channels only enables its marquee after the
1682
1917
  * organizer deliberately chooses Assign seats; Pan map keeps desktop drag
1683
1918
  * available for large charts. */
1919
+ /** A tap on a row label takes the row in every tool that chooses seats. */
1920
+ private rowLabelSelectable;
1921
+ /**
1922
+ * The two map intents a choosing tool offers beside the chooser's pickers:
1923
+ * drag a box, or draw a lasso. One is always on; the choice survives a
1924
+ * repaint and a tool switch (an operator who prefers the lasso keeps it).
1925
+ */
1926
+ private marqueeShapeChipsHtml;
1927
+ private wireMarqueeShapeChips;
1684
1928
  private isBulkSelectMode;
1685
1929
  /**
1686
1930
  * Block never touches held or booked inventory, so it cannot select it.
@@ -1705,6 +1949,8 @@ declare class SeatManager {
1705
1949
  private buildUnitUniverse;
1706
1950
  /** Every sellable unit the client knows: seats + GA capacity. */
1707
1951
  private unitTotal;
1952
+ /** What to paint for a label: its seat, or every chair of a table sold whole. */
1953
+ private paintIds;
1708
1954
  /** Every label the client models, whether or not it can be painted. */
1709
1955
  private knownLabels;
1710
1956
  private repaintAll;
@@ -1818,6 +2064,8 @@ declare class SeatManager {
1818
2064
  private sectionOptions;
1819
2065
  private filterableSections;
1820
2066
  private applyFilteredSectionCanvas;
2067
+ /** Frame the union of these sections' seats (or the first section's region). */
2068
+ private frameSections;
1821
2069
  private buildSectionOptions;
1822
2070
  /**
1823
2071
  * A tool is offered when the token's capability permits it AND the host has
@@ -1845,6 +2093,7 @@ declare class SeatManager {
1845
2093
  */
1846
2094
  private railHeader;
1847
2095
  private paintFollowLiveButton;
2096
+ /** Booking momentum lives in the View menu now; this keeps the item and the status line current. */
1848
2097
  private paintHeatButton;
1849
2098
  private paintMomentumHelp;
1850
2099
  private paintFullscreenButton;
@@ -1866,6 +2115,15 @@ declare class SeatManager {
1866
2115
  /** Seats in a chart category that the operator may act on in this mode. */
1867
2116
  private categorySeats;
1868
2117
  private renderCategoriesRail;
2118
+ /**
2119
+ * "Reset to chart defaults" says how many seats it would move BEFORE it is
2120
+ * pressed, and is disabled when the answer is none — a button that says
2121
+ * "reset" over a chart-identical event would be a lie.
2122
+ */
2123
+ private loadCategoryDifferences;
2124
+ private paintCategoryReset;
2125
+ /** One click, no confirm (owner, 2026-09-20): the button already says what it will move. */
2126
+ resetCategoriesToChart(): Promise<void>;
1869
2127
  private paintCategorySelection;
1870
2128
  private renderTablesRail;
1871
2129
  private renderInspectRail;
@@ -1898,13 +2156,11 @@ declare class SeatManager {
1898
2156
  private paintLegend;
1899
2157
  private paintFeed;
1900
2158
  private renderBlockRail;
1901
- private toggleCategory;
1902
2159
  /** A category/filter is a real toggle: add the missing seats, or remove the
1903
2160
  * whole group when every eligible seat in it is already selected. */
1904
2161
  private toggleLabels;
1905
2162
  private isBlockSelectable;
1906
2163
  private paintSelBar;
1907
- private paintCategoryControls;
1908
2164
  private filteredBlockedSeats;
1909
2165
  private paintBlockedInventory;
1910
2166
  private confirmUnblockAll;
@@ -2132,7 +2388,14 @@ declare class ChannelsMode {
2132
2388
  private conflict;
2133
2389
  private dialog;
2134
2390
  private detent;
2135
- private seatListLimit;
2391
+ /**
2392
+ * The shared seat chooser (plan item 5): the sections/rows dialog, the
2393
+ * category picker, the seat list and Find. Channels was the first caller —
2394
+ * those dialogs were written here and moved out unchanged — and paints its
2395
+ * dialogs through this mode's own scrim so every Channels sheet shares one
2396
+ * focus trap.
2397
+ */
2398
+ private readonly chooser;
2136
2399
  /**
2137
2400
  * Hosted-link STATUS for the channel whose detail panel is open. This is the
2138
2401
  * listing projection — it carries no url and no capability, because no route
@@ -2167,6 +2430,7 @@ declare class ChannelsMode {
2167
2430
  private pollTimer;
2168
2431
  private layer;
2169
2432
  private canvas;
2433
+ private overlayVisible;
2170
2434
  /** undefined = not resolved yet, null = this environment has no 2d canvas. */
2171
2435
  private ctx;
2172
2436
  private bannerEl;
@@ -2177,10 +2441,6 @@ declare class ChannelsMode {
2177
2441
  private stagedDoneTimer;
2178
2442
  private lastSelectionCount;
2179
2443
  private lastCounts;
2180
- /** Rows are structural chart data — they do not move while the organizer is
2181
- * allocating. Deriving them walks every seat, so the view is cached for the
2182
- * lifetime of this mode entry and ordinary selection repaints stay O(1). */
2183
- private assignmentRowsCache;
2184
2444
  /** The markup currently in the rail. An identical repaint is skipped, which is
2185
2445
  * what keeps the organizer's scroll position (and open <select>) alive. */
2186
2446
  private railHtml;
@@ -2232,6 +2492,12 @@ declare class ChannelsMode {
2232
2492
  private loadAllocation;
2233
2493
  private channelById;
2234
2494
  private nameOf;
2495
+ /**
2496
+ * The channel a seat is allocated to, by name, for the map's hover card —
2497
+ * null until the list has loaded (the card then shows no CHANNEL cell rather
2498
+ * than a wrong "Public sale"). Unallocated = the public sale channel.
2499
+ */
2500
+ channelNameForLabel(label: string): string | null;
2235
2501
  private markerFor;
2236
2502
  /** Channels an organizer may assign INTO: public sale plus every live channel. */
2237
2503
  private assignableChannels;
@@ -2245,6 +2511,13 @@ declare class ChannelsMode {
2245
2511
  * the guards, the memoised 2D context, and the command the section hit targets
2246
2512
  * fire back into the rail.
2247
2513
  */
2514
+ /**
2515
+ * The View menu's "Channel colours" (plan item 5, slice D): the letter
2516
+ * flags and section tints are this tool's overlay, and the menu can put
2517
+ * them away while the tool stays open. Hidden = the canvas is cleared and
2518
+ * the flags are gone; the staged bar, banner and live line stay.
2519
+ */
2520
+ setOverlayVisible(visible: boolean): void;
2248
2521
  private paintOverlay;
2249
2522
  private setStaged;
2250
2523
  private paintStagedBar;
@@ -2348,24 +2621,8 @@ declare class ChannelsMode {
2348
2621
  /** Open a channel's detail panel and start its buyer-link read. */
2349
2622
  private openChannel;
2350
2623
  private railAction;
2351
- /** Derived once per mode entry — see `assignmentRowsCache`. */
2352
- private assignmentRows;
2353
2624
  private pickCategory;
2354
- /** A tiny modal chooser reusing the dialog primitive (focus trap + Escape). */
2355
- private promptChoice;
2356
- /**
2357
- * Add several whole sections, or several whole rows, in one operation.
2358
- *
2359
- * ADDITIVE by contract: the chooser starts from the labels already selected
2360
- * and only ever grows that set, so opening it never destroys a hard-won
2361
- * marquee or seat-list selection. The confirm button always states the net
2362
- * number of seats it will add, and refuses to exceed `MAX_ASSIGNMENT_UNITS`.
2363
- *
2364
- * Rows get the richer variant. A large venue has thousands of them, so they
2365
- * arrive collapsed under their section, with a section-level tri-state
2366
- * checkbox, a search across every row, and a render cap — the flat list used
2367
- * for sections would be an unusable wall of buttons.
2368
- */
2625
+ /** The additive sections/rows chooser — shared (seatChooser.ts); the dialog state keeps it re-renderable. */
2369
2626
  private renderScopeDialog;
2370
2627
  private openDialog;
2371
2628
  private renderDialog;
@@ -2461,6 +2718,7 @@ declare class ChannelsMode {
2461
2718
  * equivalent of canvas click / marquee / brush, grouped by section with
2462
2719
  * per-section select actions.
2463
2720
  */
2721
+ /** The keyboard seat list — shared (seatChooser.ts), with the channel beside each seat. */
2464
2722
  private renderSeatListDialog;
2465
2723
  private reloadLinks;
2466
2724
  /**
@@ -2553,4 +2811,4 @@ declare class ChannelsMode {
2553
2811
  handleBack(): boolean;
2554
2812
  }
2555
2813
 
2556
- export { ManageApiError as $, type AccessIntentForbidsDetails as A, type BucketRow as B, type ChannelAccessIntent as C, type ChannelsClient as D, ChannelsMode as E, type ChannelsModeHost as F, type ChannelsRowView as G, type ChannelsSeatView as H, type ControlRoomActivityEntry as I, type ControlRoomSectionMetric as J, type ControlRoomSnapshot as K, type EventCategoryAssignmentResult as L, type EventScopedManageToken as M, type EventTableBookingMode as N, type EventTableBookingResult as O, type IntentSwitchBlockedDetails as P, type InventoryBooking as Q, type InventoryBookingActivity as R, type InventoryBookingDetail as S, type ThemeMode as T, type InventoryBookingObject as U, type InventoryBookingState as V, type InventoryBookingsPage as W, type InventoryBookingsQuery as X, type LogEntry as Y, type LogPage as Z, ManageApi as _, type AccessLinkRecord as a, type ReportByStatus as a0, type ReportCategoryMeta as a1, type ReportCategoryRow as a2, type ReportResult as a3, SeatManager as a4, type SeatManagerActionResult as a5, type SeatManagerActivity as a6, type SeatManagerCapability as a7, type SeatManagerConnection as a8, type SeatManagerFilteredSection as a9, selectionSources as aA, stateBadge as aB, suggestMarker as aC, type SeatManagerMode as aa, type SeatManagerOptions as ab, type SeatManagerSelectionValidity as ac, type SeatManagerTallies as ad, type SelectionSourceRow as ae, ACCESS_LINK_DEFAULTS as af, PUBLIC_CHANNEL_ID as ag, PUBLIC_CHANNEL_NAME as ah, accessIntentDescription as ai, accessIntentLabel as aj, accessLine as ak, accessLinkBadge as al, accessLinkErrorCopy as am, accessLinkIsLive as an, accessLinkPolicyLines as ao, bucketRows as ap, dropReviewRows as aq, intentForbidsCopy as ar, intentSwitchBlockedCopy as as, isPublicChannelId as at, markerLetter as au, markerOf as av, mutationCount as aw, needsMoveConfirmation as ax, planAssignment as ay, retryAfterCopy as az, type AccessLinkReveal as b, type AccessLinkState as c, type AccessLinkStatus as d, type AccessLinkStatusRecord as e, type ArchiveBlockedDetails as f, type AssignmentBuckets as g, type AssignmentDropDetails as h, type AssignmentResult as i, type ChannelAccessSummary as j, type ChannelAllocationPage as k, type ChannelAttribution as l, type ChannelAuditEntry as m, type ChannelAuditPage as n, type ChannelCounts as o, type ChannelListResult as p, type ChannelPreviewProjection as q, type ChannelRecord as r, type ChannelReport as s, type ChannelReportLinkRecord as t, type ChannelReportLinkReveal as u, type ChannelReportResult as v, type ChannelReportRow as w, type ChannelSeatStatus as x, type ChannelState as y, type ChannelsCapabilities as z };
2814
+ export { ManageApiError as $, type AccessIntentForbidsDetails as A, type BucketRow as B, type ChannelAccessIntent as C, type ChannelsClient as D, ChannelsMode as E, type ChannelsModeHost as F, type ChannelsRowView as G, type ChannelsSeatView as H, type ControlRoomActivityEntry as I, type ControlRoomSectionMetric as J, type ControlRoomSnapshot as K, type EventCategoryAssignmentResult as L, type EventScopedManageToken as M, type EventTableBookingMode as N, type EventTableBookingResult as O, type IntentSwitchBlockedDetails as P, type InventoryBooking as Q, type InventoryBookingActivity as R, type InventoryBookingDetail as S, type ThemeMode as T, type InventoryBookingObject as U, type InventoryBookingState as V, type InventoryBookingsPage as W, type InventoryBookingsQuery as X, type LogEntry as Y, type LogPage as Z, ManageApi as _, type AccessLinkRecord as a, type ReportByStatus as a0, type ReportCategoryMeta as a1, type ReportCategoryRow as a2, type ReportResult as a3, SeatManager as a4, type SeatManagerActionResult as a5, type SeatManagerActivity as a6, type SeatManagerArea as a7, type SeatManagerCapability as a8, type SeatManagerConnection as a9, retryAfterCopy as aA, selectionSources as aB, stateBadge as aC, suggestMarker as aD, type SeatManagerFilteredSection as aa, type SeatManagerMode as ab, type SeatManagerOptions as ac, type SeatManagerSelectionValidity as ad, type SeatManagerTallies as ae, type SelectionSourceRow as af, ACCESS_LINK_DEFAULTS as ag, PUBLIC_CHANNEL_ID as ah, PUBLIC_CHANNEL_NAME as ai, accessIntentDescription as aj, accessIntentLabel as ak, accessLine as al, accessLinkBadge as am, accessLinkErrorCopy as an, accessLinkIsLive as ao, accessLinkPolicyLines as ap, bucketRows as aq, dropReviewRows as ar, intentForbidsCopy as as, intentSwitchBlockedCopy as at, isPublicChannelId as au, markerLetter as av, markerOf as aw, mutationCount as ax, needsMoveConfirmation as ay, planAssignment as az, type AccessLinkReveal as b, type AccessLinkState as c, type AccessLinkStatus as d, type AccessLinkStatusRecord as e, type ArchiveBlockedDetails as f, type AssignmentBuckets as g, type AssignmentDropDetails as h, type AssignmentResult as i, type ChannelAccessSummary as j, type ChannelAllocationPage as k, type ChannelAttribution as l, type ChannelAuditEntry as m, type ChannelAuditPage as n, type ChannelCounts as o, type ChannelListResult as p, type ChannelPreviewProjection as q, type ChannelRecord as r, type ChannelReport as s, type ChannelReportLinkRecord as t, type ChannelReportLinkReveal as u, type ChannelReportResult as v, type ChannelReportRow as w, type ChannelSeatStatus as x, type ChannelState as y, type ChannelsCapabilities as z };
@@ -0,0 +1 @@
1
+ import{T as a,U as b,V as c}from"./chunk-DR5JXWLO.js";import"./chunk-RZ2VKZ44.js";import"./chunk-OSZ7DOEH.js";export{b as CHANNELS_CSS,c as ChannelsMode,a as bucketRowsHtml};