@seatlayer/js 0.94.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.
package/README.md CHANGED
@@ -302,6 +302,15 @@ source compatibility, but new code should use the manager subpath consistently.
302
302
  managed sales from trusted server code through the inventory booking API; the
303
303
  cockpit's public methods are limited to operations it can actually complete.
304
304
 
305
+ A host that sells from the map—a counter that brings its own search, totals and
306
+ payment—can mount just the map with `chrome: 'minimal'` (the live map, zoom and
307
+ Venue; no tool bar, side rail, legend or mini-map). In Select mode,
308
+ `onAreaClick({ id, label, name })` reports a tap on a standing area, which is
309
+ sold by quantity rather than selected, and `focusSection(label)` frames a
310
+ section without filtering, dimming or touching the selection (`zoomToFit()`
311
+ returns to the whole venue). A table sold as one unit paints all its chairs
312
+ with the table's status.
313
+
305
314
  Switching tools and rotating tokens happen in place: the renderer, camera,
306
315
  selection, WebSocket, and DOM are not remounted. Give the container a height;
307
316
  the cockpit responds to its container rather than the browser viewport.
@@ -1137,11 +1137,35 @@ declare class ManageApi {
1137
1137
  reportCsv(key: string): Promise<Blob>;
1138
1138
  }
1139
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
+
1140
1163
  /**
1141
1164
  * The control room's View menu (plan item 5, slice D).
1142
1165
  *
1143
- * Five toggles that change how the map READS, never what it holds: seat
1144
- * labels, row labels, category colours, channel colours, booking momentum.
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".
1145
1169
  * The letters are the ones seats.io operators already know (S · R · G · H ·
1146
1170
  * M), ridden on Shift because the tool tabs own the bare letters (S is
1147
1171
  * Sections, G is Categories, M is Monitor).
@@ -1244,6 +1268,13 @@ interface SeatManagerFilteredSection {
1244
1268
  seatCount: number;
1245
1269
  zone?: string;
1246
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
+ }
1247
1278
  interface SeatManagerOptions {
1248
1279
  /** CSS selector or element to mount into. */
1249
1280
  container: string | HTMLElement;
@@ -1269,6 +1300,13 @@ interface SeatManagerOptions {
1269
1300
  * it is the fail-closed fallback for every refused mode.
1270
1301
  */
1271
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';
1272
1310
  /** Public labels to preselect after live inventory has loaded in Select mode. */
1273
1311
  selectedObjects?: string[];
1274
1312
  /**
@@ -1314,6 +1352,12 @@ interface SeatManagerOptions {
1314
1352
  * the camera and the realtime socket.
1315
1353
  */
1316
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';
1317
1361
  /**
1318
1362
  * Keep the canvas painting even when the tab is hidden/backgrounded (a war-room
1319
1363
  * board on a second monitor). Calls `forceDraw()` after each delta so Chrome's
@@ -1356,6 +1400,12 @@ interface SeatManagerOptions {
1356
1400
  onSelectionInvalid?: (state: SeatManagerSelectionValidity) => void;
1357
1401
  /** A Select-mode attempt reached the active exact/max cap. */
1358
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;
1359
1409
  /** Filter Sections changed by map interaction or an imperative method. */
1360
1410
  onFilteredSectionChange?: (sections: SeatManagerFilteredSection[]) => void;
1361
1411
  /** A block/unblock/cancel action completed successfully. */
@@ -1458,6 +1508,12 @@ declare class SeatManager {
1458
1508
  * Free under-reported by GA capacity and SOLD% could exceed 100%.
1459
1509
  */
1460
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;
1461
1517
  private status;
1462
1518
  /** Live non-free counters, moved by each delta rather than re-walked. */
1463
1519
  private counts;
@@ -1651,6 +1707,9 @@ declare class SeatManager {
1651
1707
  * who works with labels off keeps them off tomorrow.
1652
1708
  */
1653
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;
1654
1713
  getMapView(): MapView;
1655
1714
  private toggleMapView;
1656
1715
  /** Channel colours are the Channels tool's overlay; outside it there is nothing to colour by. */
@@ -1757,6 +1816,14 @@ declare class SeatManager {
1757
1816
  selectSection(sectionId: string): ExpandedSeat[];
1758
1817
  /** Filter every section whose public label matches, then frame their union. */
1759
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[];
1760
1827
  /** Clear section filtering and restore the full event frame. */
1761
1828
  clearFilteredSection(): void;
1762
1829
  getFilteredSections(): SeatManagerFilteredSection[];
@@ -1813,6 +1880,20 @@ declare class SeatManager {
1813
1880
  * view change, so the crumb and the pills never lag the camera.
1814
1881
  */
1815
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;
1816
1897
  /** The renderer as a {@link MapCamera}, for the minimap and any other map chrome. */
1817
1898
  private mapCamera;
1818
1899
  /**
@@ -1868,6 +1949,8 @@ declare class SeatManager {
1868
1949
  private buildUnitUniverse;
1869
1950
  /** Every sellable unit the client knows: seats + GA capacity. */
1870
1951
  private unitTotal;
1952
+ /** What to paint for a label: its seat, or every chair of a table sold whole. */
1953
+ private paintIds;
1871
1954
  /** Every label the client models, whether or not it can be painted. */
1872
1955
  private knownLabels;
1873
1956
  private repaintAll;
@@ -1981,6 +2064,8 @@ declare class SeatManager {
1981
2064
  private sectionOptions;
1982
2065
  private filterableSections;
1983
2066
  private applyFilteredSectionCanvas;
2067
+ /** Frame the union of these sections' seats (or the first section's region). */
2068
+ private frameSections;
1984
2069
  private buildSectionOptions;
1985
2070
  /**
1986
2071
  * A tool is offered when the token's capability permits it AND the host has
@@ -2726,4 +2811,4 @@ declare class ChannelsMode {
2726
2811
  handleBack(): boolean;
2727
2812
  }
2728
2813
 
2729
- 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 };
@@ -1137,11 +1137,35 @@ declare class ManageApi {
1137
1137
  reportCsv(key: string): Promise<Blob>;
1138
1138
  }
1139
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
+
1140
1163
  /**
1141
1164
  * The control room's View menu (plan item 5, slice D).
1142
1165
  *
1143
- * Five toggles that change how the map READS, never what it holds: seat
1144
- * labels, row labels, category colours, channel colours, booking momentum.
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".
1145
1169
  * The letters are the ones seats.io operators already know (S · R · G · H ·
1146
1170
  * M), ridden on Shift because the tool tabs own the bare letters (S is
1147
1171
  * Sections, G is Categories, M is Monitor).
@@ -1244,6 +1268,13 @@ interface SeatManagerFilteredSection {
1244
1268
  seatCount: number;
1245
1269
  zone?: string;
1246
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
+ }
1247
1278
  interface SeatManagerOptions {
1248
1279
  /** CSS selector or element to mount into. */
1249
1280
  container: string | HTMLElement;
@@ -1269,6 +1300,13 @@ interface SeatManagerOptions {
1269
1300
  * it is the fail-closed fallback for every refused mode.
1270
1301
  */
1271
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';
1272
1310
  /** Public labels to preselect after live inventory has loaded in Select mode. */
1273
1311
  selectedObjects?: string[];
1274
1312
  /**
@@ -1314,6 +1352,12 @@ interface SeatManagerOptions {
1314
1352
  * the camera and the realtime socket.
1315
1353
  */
1316
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';
1317
1361
  /**
1318
1362
  * Keep the canvas painting even when the tab is hidden/backgrounded (a war-room
1319
1363
  * board on a second monitor). Calls `forceDraw()` after each delta so Chrome's
@@ -1356,6 +1400,12 @@ interface SeatManagerOptions {
1356
1400
  onSelectionInvalid?: (state: SeatManagerSelectionValidity) => void;
1357
1401
  /** A Select-mode attempt reached the active exact/max cap. */
1358
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;
1359
1409
  /** Filter Sections changed by map interaction or an imperative method. */
1360
1410
  onFilteredSectionChange?: (sections: SeatManagerFilteredSection[]) => void;
1361
1411
  /** A block/unblock/cancel action completed successfully. */
@@ -1458,6 +1508,12 @@ declare class SeatManager {
1458
1508
  * Free under-reported by GA capacity and SOLD% could exceed 100%.
1459
1509
  */
1460
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;
1461
1517
  private status;
1462
1518
  /** Live non-free counters, moved by each delta rather than re-walked. */
1463
1519
  private counts;
@@ -1651,6 +1707,9 @@ declare class SeatManager {
1651
1707
  * who works with labels off keeps them off tomorrow.
1652
1708
  */
1653
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;
1654
1713
  getMapView(): MapView;
1655
1714
  private toggleMapView;
1656
1715
  /** Channel colours are the Channels tool's overlay; outside it there is nothing to colour by. */
@@ -1757,6 +1816,14 @@ declare class SeatManager {
1757
1816
  selectSection(sectionId: string): ExpandedSeat[];
1758
1817
  /** Filter every section whose public label matches, then frame their union. */
1759
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[];
1760
1827
  /** Clear section filtering and restore the full event frame. */
1761
1828
  clearFilteredSection(): void;
1762
1829
  getFilteredSections(): SeatManagerFilteredSection[];
@@ -1813,6 +1880,20 @@ declare class SeatManager {
1813
1880
  * view change, so the crumb and the pills never lag the camera.
1814
1881
  */
1815
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;
1816
1897
  /** The renderer as a {@link MapCamera}, for the minimap and any other map chrome. */
1817
1898
  private mapCamera;
1818
1899
  /**
@@ -1868,6 +1949,8 @@ declare class SeatManager {
1868
1949
  private buildUnitUniverse;
1869
1950
  /** Every sellable unit the client knows: seats + GA capacity. */
1870
1951
  private unitTotal;
1952
+ /** What to paint for a label: its seat, or every chair of a table sold whole. */
1953
+ private paintIds;
1871
1954
  /** Every label the client models, whether or not it can be painted. */
1872
1955
  private knownLabels;
1873
1956
  private repaintAll;
@@ -1981,6 +2064,8 @@ declare class SeatManager {
1981
2064
  private sectionOptions;
1982
2065
  private filterableSections;
1983
2066
  private applyFilteredSectionCanvas;
2067
+ /** Frame the union of these sections' seats (or the first section's region). */
2068
+ private frameSections;
1984
2069
  private buildSectionOptions;
1985
2070
  /**
1986
2071
  * A tool is offered when the token's capability permits it AND the host has
@@ -2726,4 +2811,4 @@ declare class ChannelsMode {
2726
2811
  handleBack(): boolean;
2727
2812
  }
2728
2813
 
2729
- 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 };